#ifndef _ACPI_ACPI_H #define _ACPI_ACPI_H #include #include struct acpi_header { byte_t signature[4]; uint32_t length; uint8_t revision; uint8_t checksum; byte_t oem[6]; byte_t oemtable[8]; uint32_t oem_revision; uint32_t creator; uint32_t creator_revision; } packed; struct acpi_rsdp { byte_t signature[8]; uint8_t checksum; byte_t oem[6]; uint8_t revision; uint32_t rsdt_addr; } packed; struct acpi_rsdt { struct acpi_header h; uint32_t ptrs[]; }; /* Address space */ enum { ACPI_GAS_SYSMEMORY = 0, ACPI_GAS_SYSIO = 1, ACPI_GAS_PCI_CONFIG = 2, ACPI_GAS_MBED_CTL = 3, ACPI_GAS_SYSMGMT_BUS = 4, ACPI_GAS_CMOS = 5, ACPI_GAS_PCI_BAR_TGT = 6, ACPI_GAS_IPMI = 7, ACPI_GAS_GPIO = 8, ACPI_GAS_SERIAL_BUS = 9, ACPI_GAS_PLAT_COM_CHL = 10, }; /* Access size */ enum { ACPI_GAS_UNDEFINED = 0, ACPI_GAS_BYTE = 1, ACPI_GAS_WORD = 2, ACPI_GAS_DWORD = 3, ACPI_GAS_QWORD = 4, }; struct acpi_gas { uint8_t addr_space; uint8_t bit_width; uint8_t bit_offset; uint8_t access_size; uint64_t addr; } packed; struct acpi_fadt { struct acpi_header h; uint32_t firmware_ctl; uint32_t dsdt; uint8_t reserved; uint8_t preferred_power_mgmt_profile; uint16_t sci_interrupt; uint32_t smi_cmd_port; uint8_t acpi_enable; uint8_t acpi_disable; uint8_t s4bios_req; uint8_t pstate_ctl; uint32_t pm1a_evt_blk; uint32_t pm1b_evt_blk; uint32_t pm1a_ctl_blk; uint32_t pm1b_ctl_blk; uint32_t pm2_ctl_blk; uint32_t pm_timer_blk; uint32_t gpe0_blk; uint32_t gpe1_blk; uint8_t pm1_evt_length; uint8_t pm1_ctl_length; uint8_t pm2_ctl_length; uint8_t pm_timer_length; uint8_t gpe0_length; uint8_t gpe1_length; uint8_t gpe1_base; uint8_t cstate_ctl; uint16_t worst_c2_latency; uint16_t worst_c3_latency; uint16_t flush_size; uint16_t flush_stride; uint8_t duty_offset; uint8_t duty_width; uint8_t day_alarm; uint8_t month_alarm; uint8_t century; uint16_t boot_arch_flags; uint8_t reserved2; uint32_t flags; struct acpi_gas reset_reg; uint8_t reset_value; uint8_t reserved3[3]; uint64_t x_firmware_ctl; uint64_t x_dsdt; struct acpi_gas x_pm1a_evt_blk; struct acpi_gas x_pm1b_evt_blk; struct acpi_gas x_pm1a_ctl_blk; struct acpi_gas x_pm1b_ctl_blk; struct acpi_gas x_pm2_ctl_blk; struct acpi_gas x_pm_timer_blk; struct acpi_gas x_gpe0_blk; struct acpi_gas x_gpe1_blk; } packed; struct acpi_madt { struct acpi_header h; uint32_t lapic_addr; uint32_t flags; } packed; enum { ACPI_LAPIC = 0, ACPI_IOAPIC = 1, ACPI_INTR_OVERRIDE = 2, }; struct acpi_apic_header { uint8_t type; uint8_t length; } packed; struct acpi_lapic { struct acpi_apic_header h; uint8_t acpi_cpu_id; uint8_t apic_id; uint32_t flags; } packed; struct acpi_ioapic { struct acpi_apic_header h; uint8_t ioapic_id; uint8_t reserved; uint32_t ioapic_addr; uint32_t global_intr_base; }; struct acpi_intr_override { struct acpi_apic_header h; uint8_t bus; uint8_t source; uint32_t interrupt; uint16_t flags; }; #define ACPI_MAP_START 0xC5000000 void acpi_init(void); #endif // _ACPI_ACPI_H