2#ifndef PEDIGREE_PCI_AER_H
3#define PEDIGREE_PCI_AER_H
5#include "pedigree/kernel/processor/types.h"
8constexpr uint16_t CapabilityId = 0x0001;
11 uint32_t uncorrectable = 0;
12 uint32_t uncorrectableMask = 0;
13 uint32_t severity = 0;
14 uint32_t correctable = 0;
15 uint32_t correctableMask = 0;
16 uint32_t capabilities = 0;
18 uint32_t fatal()
const {
19 return uncorrectable & ~uncorrectableMask & severity;
21 uint32_t nonfatal()
const {
22 return uncorrectable & ~uncorrectableMask & ~severity;
24 uint32_t maskedUncorrectable()
const {
25 return uncorrectable & uncorrectableMask;
27 uint32_t activeCorrectable()
const {
28 return correctable & ~correctableMask;
32template <
class Config>
33bool read(Config& config, uint16_t offset, uint16_t next,
Status& result) {
34 constexpr uint16_t RequiredBytes = 0x1c;
35 if (offset < 0x100 || (offset & 3U) || offset > 0x1000 - RequiredBytes ||
37 ((next >= offset && next < offset + RequiredBytes) || next > 0xffc || (next & 3U)))) {
41 if (!config.read32(offset + 0x04, status.uncorrectable) ||
42 !config.read32(offset + 0x08, status.uncorrectableMask) ||
43 !config.read32(offset + 0x0c, status.severity) ||
44 !config.read32(offset + 0x10, status.correctable) ||
45 !config.read32(offset + 0x14, status.correctableMask) ||
46 !config.read32(offset + 0x18, status.capabilities)) {