20#ifndef KERNEL_MACHINE_X86_COMMON_ACPI_H
21#define KERNEL_MACHINE_X86_COMMON_ACPI_H
26#include "pedigree/kernel/compiler.h"
27#include "pedigree/kernel/processor/MemoryRegion.h"
28#include "pedigree/kernel/processor/types.h"
29#include "pedigree/kernel/utilities/Vector.h"
30#include "pedigree/kernel/utilities/new"
32#include "../../core/processor/x86_common/Multiprocessor.h"
34#include "AcpiPciRouting.h"
45 inline static Acpi& instance() {
53 bool supportsPowerOff() const;
54 struct PowerManagement {
55 bool (*prepare)(
bool powerOff);
56 const char* (*powerOff)();
60 EXPORTED_PUBLIC
void setPowerManagement(
const PowerManagement* provider);
61 bool prepareShutdown(
bool powerOff);
62 const char* powerOff();
65 uint8_t getRtcCenturyIndex()
const {
66 return m_bValid ? m_pFacp->cmosCenturyIndex : 0;
69 bool getPmTimerPort(uint16_t& port, uint32_t& mask)
const;
71 bool pciConfigurationAddress(uint8_t bus, uint64_t& address)
const;
72 bool pciBusRange(uint8_t& first, uint8_t& last)
const;
76 EXPORTED_PUBLIC
void setPciInterruptRouter(PciInterruptRouter router);
77 bool hasPciInterruptRouter()
const;
78 bool isaIrqsForGsi(uint32_t gsi, uint16_t& irqs)
const;
81 return m_bValid && m_DmarPresent ? &m_DmarInfo :
nullptr;
85 inline bool validApicInfo()
const {
86 return m_bValidApicInfo;
88 inline uint64_t getLocalApicAddress()
const {
89 return m_LocalApicAddress;
95 inline bool validProcessorInfo()
const {
96 return m_bValidProcessorInfo;
111 Acpi& operator=(const Acpi&);
121 uint32_t rsdtAddress;
125 uint64_t xsdtAddress;
126 uint8_t extendedChecksum;
130 struct SystemDescriptionTableHeader {
137 uint32_t oemRevision;
139 uint32_t creatorRevision;
142 struct PciConfigurationRange {
150 struct FixedACPIDescriptionTable {
151 SystemDescriptionTableHeader header;
153 uint32_t firmwareControl;
155 uint8_t interruptModel;
157 uint16_t sciInterrupt;
158 uint32_t smiCommandPort;
159 uint8_t acpiEnableCommand;
160 uint8_t acpiDisableCommand;
161 uint8_t s4BiosCommand;
163 uint32_t pm1aEventBlock;
164 uint32_t pm1bEventBlock;
165 uint32_t pm1aControlBlock;
166 uint32_t pm1bControlBlock;
167 uint32_t pm2ControlBlock;
168 uint32_t pmTimerBlock;
171 uint8_t pm1EventLength;
172 uint8_t pm1ControlLength;
173 uint8_t pm2ControlLength;
174 uint8_t pmTimerLength;
175 uint8_t gpe0BlockLength;
176 uint8_t gpe1BlockLength;
179 uint16_t pmLevel2Latency;
180 uint16_t pmLevel3Latency;
182 uint16_t flushStride;
185 uint8_t cmosDayAlarmIndex;
186 uint8_t cmosMonthAlarmIndex;
187 uint8_t cmosCenturyIndex;
188 uint8_t reserved3[3];
192 struct ProcessorLocalApic {
202 uint32_t globalSystemInterruptBase;
205 struct InterruptSourceOverride {
208 uint32_t globalSystemInterrupt;
222 RsdtPointer* m_pRsdtPointer;
224 SystemDescriptionTableHeader* m_pRsdt;
225 FixedACPIDescriptionTable* m_pFacp;
226 Vector<PciConfigurationRange> m_PciConfigurationRanges;
227 AcpiDmar::Info m_DmarInfo;
229 bool m_PciInterruptRoutesPresent = false;
230 PciInterruptRouter m_PciInterruptRouter =
nullptr;
231 uint32_t m_IsaGsis[16] = {};
232 uint16_t m_IsaOverrides = 0;
233 bool m_IsaRoutingValid =
true;
235 bool m_DmarPresent =
false;
236 bool m_DmarSeen =
false;
237 bool m_PowerOffValid =
false;
238 const PowerManagement* m_PowerManagement =
nullptr;
239 uint8_t m_SleepTypeA = 0;
240 uint8_t m_SleepTypeB = 0;
241 uint16_t m_ResetPort = 0;
242 uint8_t m_ResetValue = 0;
245 SystemDescriptionTableHeader* m_pApic;
247 bool m_bValidApicInfo;
249 uint64_t m_LocalApicAddress;
252 bool m_bValidProcessorInfo;
256 static EXPORTED_PUBLIC Acpi m_Instance;
Special memory entity in the kernel's virtual address space.
A vector / dynamic array.
#define INITIALISATION_ONLY