The Pedigree Project 0.1
PciAer.h
1/* Copyright (c) 2026, Pedigree Developers. SPDX-License-Identifier: ISC */
2#ifndef PEDIGREE_PCI_AER_H
3#define PEDIGREE_PCI_AER_H
4
5#include "pedigree/kernel/processor/types.h"
6
7namespace PciAer {
8constexpr uint16_t CapabilityId = 0x0001;
9
10struct Status {
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;
17
18 uint32_t fatal() const {
19 return uncorrectable & ~uncorrectableMask & severity;
20 }
21 uint32_t nonfatal() const {
22 return uncorrectable & ~uncorrectableMask & ~severity;
23 }
24 uint32_t maskedUncorrectable() const {
25 return uncorrectable & uncorrectableMask;
26 }
27 uint32_t activeCorrectable() const {
28 return correctable & ~correctableMask;
29 }
30};
31
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 ||
36 (next &&
37 ((next >= offset && next < offset + RequiredBytes) || next > 0xffc || (next & 3U)))) {
38 return false;
39 }
40 Status status;
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)) {
47 return false;
48 }
49 result = status;
50 return true;
51}
52} // namespace PciAer
53
54#endif