#ifndef ACPI_H_ #define ACPI_H_ #include #define BIOS_START 0x000E0000 #define BIOS_END 0x000FFFFF #define RSDP_SIG "RSD PTR " #define RSDP_SIG_LEN 8 #define RSDP_SIZE 20 #define ACPI_VER_1 0 #define ACPI_VER_OTHER 2 struct rsdp { char Signature[RSDP_SIG_LEN]; uint8_t Checksum; char OEMID[6]; uint8_t Revision; uint32_t RsdtAddress; } __attribute__ ((packed)); struct ACPISDTHeader { char Signature[4]; uint32_t Length; uint8_t Revision; uint8_t Checksum; char OEMID[6]; char OEMTableID[8]; uint32_t OEMRevision; uint32_t CreatorID; uint32_t CreatorRevision; }; struct rsdt { struct ACPISDTHeader h; uint32_t other_sdt[]; }; struct mcfg_entry { uint64_t base_addr; uint16_t pci_seg_num; uint8_t pci_bus_start; uint8_t pci_bus_end; uint32_t reserved; }; struct mcfg { struct ACPISDTHeader h; uint64_t reserved; struct mcfg_entry entries[]; }; struct GenericAddressStructure { uint8_t AddressSpace; uint8_t BitWidth; uint8_t BitOffset; uint8_t AccessSize; uint64_t Address; }; struct fadt { struct ACPISDTHeader h; uint32_t FirmwareCtrl; uint32_t Dsdt; // field used in ACPI 1.0; no longer in use, for compatibility only uint8_t Reserved; uint8_t PreferredPowerManagementProfile; uint16_t SCI_Interrupt; uint32_t SMI_CommandPort; uint8_t AcpiEnable; uint8_t AcpiDisable; uint8_t S4BIOS_REQ; uint8_t PSTATE_Control; uint32_t PM1aEventBlock; uint32_t PM1bEventBlock; uint32_t PM1aControlBlock; uint32_t PM1bControlBlock; uint32_t PM2ControlBlock; uint32_t PMTimerBlock; uint32_t GPE0Block; uint32_t GPE1Block; uint8_t PM1EventLength; uint8_t PM1ControlLength; uint8_t PM2ControlLength; uint8_t PMTimerLength; uint8_t GPE0Length; uint8_t GPE1Length; uint8_t GPE1Base; uint8_t CStateControl; uint16_t WorstC2Latency; uint16_t WorstC3Latency; uint16_t FlushSize; uint16_t FlushStride; uint8_t DutyOffset; uint8_t DutyWidth; uint8_t DayAlarm; uint8_t MonthAlarm; uint8_t Century; // reserved in ACPI 1.0; used since ACPI 2.0+ uint16_t BootArchitectureFlags; uint8_t Reserved2; uint32_t Flags; // 12 byte structure; see below for details struct GenericAddressStructure ResetReg; uint8_t ResetValue; uint8_t Reserved3[3]; // 64bit pointers - Available on ACPI 2.0+ uint64_t X_FirmwareControl; uint64_t X_Dsdt; struct GenericAddressStructure X_PM1aEventBlock; struct GenericAddressStructure X_PM1bEventBlock; struct GenericAddressStructure X_PM1aControlBlock; struct GenericAddressStructure X_PM1bControlBlock; struct GenericAddressStructure X_PM2ControlBlock; struct GenericAddressStructure X_PMTimerBlock; struct GenericAddressStructure X_GPE0Block; struct GenericAddressStructure X_GPE1Block; }; struct rsdp *acpi_locate_rsdp(); int acpi_validate_rsdp_checksum(struct rsdp *s); int acpi_validate_sdt_checksum(struct ACPISDTHeader *s); struct ACPISDTHeader *acpi_find_table(struct rsdt *root, const char *signature); void *acpi_locate_sdt(struct rsdt *rsdt, const char sig[4]); #endif