summaryrefslogtreecommitdiff
path: root/Kernel/ACPI/Definitions.h
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel/ACPI/Definitions.h')
-rw-r--r--Kernel/ACPI/Definitions.h262
1 files changed, 262 insertions, 0 deletions
diff --git a/Kernel/ACPI/Definitions.h b/Kernel/ACPI/Definitions.h
new file mode 100644
index 0000000000..483ea7d8d2
--- /dev/null
+++ b/Kernel/ACPI/Definitions.h
@@ -0,0 +1,262 @@
+#pragma once
+
+#include <AK/RefCounted.h>
+#include <AK/Types.h>
+#include <AK/Vector.h>
+
+namespace ACPI_RAW {
+
+struct RSDPDescriptor {
+ char sig[8];
+ u8 checksum;
+ char oem_id[6];
+ u8 revision;
+ u32 rsdt_ptr;
+} __attribute__((__packed__));
+
+struct RSDPDescriptor20 {
+ RSDPDescriptor base;
+ u32 length;
+ u64 xsdt_ptr;
+ u8 ext_checksum;
+ u8 reserved[3];
+} __attribute__((__packed__));
+
+struct SDTHeader {
+ char sig[4];
+ u32 length;
+ u8 revision;
+ u8 checksum;
+ char oem_id[6];
+ char oem_table_id[8];
+ u32 oem_revision;
+ u32 creator_id;
+ u32 creator_revision;
+} __attribute__((__packed__));
+
+struct RSDT {
+ SDTHeader h;
+ u32 table_ptrs[1];
+} __attribute__((__packed__));
+
+struct XSDT {
+ SDTHeader h;
+ u64 table_ptrs[1];
+} __attribute__((__packed__));
+
+struct GenericAddressStructure {
+ u8 address_space;
+ u8 bit_width;
+ u8 bit_offset;
+ u8 access_size;
+ u64 address;
+} __attribute__((__packed__));
+
+struct FADT {
+ SDTHeader h;
+ u32 firmware_ctrl;
+ u32 dsdt_ptr;
+ u8 reserved;
+ u8 preferred_pm_profile;
+ u16 sci_int;
+ u32 smi_cmd;
+ u8 acpi_enable_value;
+ u8 acpi_disable_value;
+ u8 s4bios_req;
+ u8 pstate_cnt;
+ u32 PM1a_EVT_BLK;
+ u32 PM1b_EVT_BLK;
+ u32 PM1a_CNT_BLK;
+ u32 PM1b_CNT_BLK;
+ u32 PM2_CNT_BLK;
+ u32 PM_TMR_BLK;
+ u32 GPE0_BLK;
+ u32 GPE1_BLK;
+ u8 PM1_EVT_LEN;
+ u8 PM1_CNT_LEN;
+ u8 PM2_CNT_LEN;
+ u8 PM_TMR_LEN;
+ u8 GPE0_BLK_LEN;
+ u8 GPE1_BLK_LEN;
+ u8 GPE1_BASE;
+ u8 cst_cnt;
+ u16 P_LVL2_LAT;
+ u16 P_LVL3_LAT;
+ u16 flush_size;
+ u16 flush_stride;
+ u8 duty_offset;
+ u8 duty_width;
+ u8 day_alrm;
+ u8 mon_alrm;
+ u8 century;
+ u16 ia_pc_boot_arch_flags;
+ u8 reserved2;
+ u32 flags;
+ GenericAddressStructure reset_reg;
+ u8 reset_value;
+ u16 arm_boot_arch;
+ u8 fadt_minor_version;
+ u64 x_firmware_ctrl;
+ u64 x_dsdt;
+ GenericAddressStructure x_pm1a_evt_blk;
+ GenericAddressStructure x_pm1b_evt_blk;
+ GenericAddressStructure x_pm1a_cnt_blk;
+ GenericAddressStructure x_pm1b_cnt_blk;
+ GenericAddressStructure x_pm2_cnt_blk;
+ GenericAddressStructure x_pm_tmr_blk;
+ GenericAddressStructure x_gpe0_blk;
+ GenericAddressStructure x_gpe1_blk;
+ GenericAddressStructure sleep_control;
+ GenericAddressStructure sleep_status;
+ u64 hypervisor_vendor_identity;
+
+} __attribute__((__packed__));
+
+struct MADT : public SDTHeader {
+};
+
+struct DSDT : public SDTHeader {
+};
+
+struct PCI_MMIO_Descriptor {
+ u64 base_addr;
+ u16 seg_group_number;
+ u8 start_pci_bus;
+ u8 end_pci_bus;
+ u32 reserved;
+} __attribute__((__packed__));
+
+struct MCFG {
+ SDTHeader header;
+ u64 reserved;
+ PCI_MMIO_Descriptor descriptors[];
+} __attribute__((__packed__));
+}
+
+class ACPIStaticParser;
+
+namespace ACPI {
+
+class SDT : public RefCounted<SDT> {
+};
+
+struct GenericAddressStructure {
+ u8 address_space;
+ u8 bit_width;
+ u8 bit_offset;
+ u8 access_size;
+ u64 address;
+ GenericAddressStructure& operator=(const GenericAddressStructure& other)
+ {
+ this->address_space = other.address_space;
+ this->bit_width = other.bit_width;
+ this->bit_offset = other.bit_offset;
+ this->access_size = other.access_size;
+ this->address = (u32)other.address;
+ return *this;
+ }
+ GenericAddressStructure& operator=(const ACPI_RAW::GenericAddressStructure& other)
+ {
+ this->address_space = other.address_space;
+ this->bit_width = other.bit_width;
+ this->bit_offset = other.bit_offset;
+ this->access_size = other.access_size;
+ this->address = (u32)other.address;
+ return *this;
+ }
+};
+
+class FixedACPIData;
+}
+
+class ACPI::FixedACPIData : public ACPI::SDT {
+ friend ACPIStaticParser;
+
+public:
+ explicit FixedACPIData(ACPI_RAW::FADT&);
+ ACPI_RAW::SDTHeader* get_dsdt();
+
+private:
+ u8 m_revision;
+ u32 m_dsdt_ptr;
+ u64 m_x_dsdt_ptr;
+ u8 m_preferred_pm_profile;
+ u16 m_sci_int;
+ u32 m_smi_cmd;
+ u8 m_acpi_enable_value;
+ u8 m_acpi_disable_value;
+ u8 m_s4bios_req;
+ u8 m_pstate_cnt;
+ u32 m_PM1a_EVT_BLK;
+ u32 m_PM1b_EVT_BLK;
+ u32 m_PM1a_CNT_BLK;
+ u32 m_PM1b_CNT_BLK;
+ u32 m_PM2_CNT_BLK;
+ u32 m_PM_TMR_BLK;
+ u32 m_GPE0_BLK;
+ u32 m_GPE1_BLK;
+ u8 m_PM1_EVT_LEN;
+ u8 m_PM1_CNT_LEN;
+ u8 m_PM2_CNT_LEN;
+ u8 m_PM_TMR_LEN;
+ u8 m_GPE0_BLK_LEN;
+ u8 m_GPE1_BLK_LEN;
+ u8 m_GPE1_BASE;
+ u8 m_cst_cnt;
+ u16 m_P_LVL2_LAT;
+ u16 m_P_LVL3_LAT;
+ u16 m_flush_size;
+ u16 m_flush_stride;
+ u8 m_duty_offset;
+ u8 m_duty_width;
+ u8 m_day_alrm;
+ u8 m_mon_alrm;
+ u8 m_century;
+ u16 m_ia_pc_boot_arch_flags;
+ u32 m_flags;
+ ACPI::GenericAddressStructure m_reset_reg;
+ u8 m_reset_value;
+ ACPI::GenericAddressStructure m_x_pm1a_evt_blk;
+ ACPI::GenericAddressStructure m_x_pm1b_evt_blk;
+ ACPI::GenericAddressStructure m_x_pm1a_cnt_blk;
+ ACPI::GenericAddressStructure m_x_pm1b_cnt_blk;
+ ACPI::GenericAddressStructure m_x_pm2_cnt_blk;
+ ACPI::GenericAddressStructure m_x_pm_tmr_blk;
+ ACPI::GenericAddressStructure m_x_gpe0_blk;
+ ACPI::GenericAddressStructure m_x_gpe1_blk;
+ ACPI::GenericAddressStructure m_sleep_control;
+ ACPI::GenericAddressStructure m_sleep_status;
+ u64 m_hypervisor_vendor_identity;
+};
+
+namespace ACPI {
+
+class MainSystemDescriptionTable : public SDT {
+public:
+ explicit MainSystemDescriptionTable(Vector<ACPI_RAW::SDTHeader*>&& sdt_pointers);
+ Vector<ACPI_RAW::SDTHeader*>& get_sdt_pointers();
+
+private:
+ Vector<ACPI_RAW::SDTHeader*> m_sdt_pointers;
+};
+
+class MCFG : public SDT {
+public:
+ MCFG(ACPI_RAW::MCFG&);
+};
+
+class FACS : public SDT {
+
+public:
+private:
+ u32 hardware_sig;
+ u32 waking_vector;
+ u32 global_lock;
+ u32 flags;
+ u64 x_waking_vector;
+ u32 ospm_flags;
+};
+
+class MADT : public SDT {
+};
+}