Skip to main content

strat9_kernel/acpi/
fadt.rs

1//! Definitions for FADT, the Fixed ACPI Description Table.
2//! Inspired by Theseus OS.
3
4use super::sdt::{GenericAddressStructure, Sdt};
5use zerocopy::FromBytes;
6
7pub const FADT_SIGNATURE: &[u8; 4] = b"FACP";
8
9#[repr(C, packed)]
10#[derive(Clone, Copy, Debug, FromBytes)]
11pub struct Fadt {
12    pub header: Sdt,
13    pub firmware_ctrl: u32,
14    /// 32-bit physical address of the DSDT.
15    pub dsdt: u32,
16    _reserved: u8,
17    pub preferred_power_managament: u8,
18    pub sci_interrupt: u16,
19    pub smi_command_port: u32,
20    pub acpi_enable: u8,
21    pub acpi_disable: u8,
22    pub s4_bios_req: u8,
23    pub pstate_control: u8,
24    pub pm1a_event_block: u32,
25    pub pm1b_event_block: u32,
26    pub pm1a_control_block: u32,
27    pub pm1b_control_block: u32,
28    pub pm2_control_block: u32,
29    pub pm_timer_block: u32,
30    pub gpe0_block: u32,
31    pub gpe1_block: u32,
32    pub pm1_event_length: u8,
33    pub pm1_control_length: u8,
34    pub pm2_control_length: u8,
35    pub pm_timer_length: u8,
36    pub gpe0_length: u8,
37    pub gpe1_length: u8,
38    pub gpe1_base: u8,
39    pub c_state_control: u8,
40    pub worst_c2_latency: u16,
41    pub worst_c3_latency: u16,
42    pub flush_size: u16,
43    pub flush_stride: u16,
44    pub duty_offset: u8,
45    pub duty_width: u8,
46    pub day_alarm: u8,
47    pub month_alarm: u8,
48    pub century: u8,
49    pub iapc_boot_architecture_flags: u16,
50    _reserved2: u8,
51    pub flags: u32,
52    pub reset_reg: GenericAddressStructure,
53    pub reset_value: u8,
54    _reserved3: [u8; 3],
55    /// 64-bit physical address of the FACS.
56    pub x_firmware_control: u64,
57    /// 64-bit physical address of the DSDT.
58    pub x_dsdt: u64,
59    pub x_pm1a_event_block: GenericAddressStructure,
60    pub x_pm1b_event_block: GenericAddressStructure,
61    pub x_pm1a_control_block: GenericAddressStructure,
62    pub x_pm1b_control_block: GenericAddressStructure,
63    pub x_pm2_control_block: GenericAddressStructure,
64    pub x_pm_timer_block: GenericAddressStructure,
65    pub x_gpe0_block: GenericAddressStructure,
66    pub x_gpe1_block: GenericAddressStructure,
67}
68
69impl Fadt {
70    /// Finds the FADT in the given `AcpiTables` and returns a reference to it.
71    pub fn get() -> Option<&'static Fadt> {
72        unsafe { super::find_table(FADT_SIGNATURE).map(|ptr| &*(ptr as *const Fadt)) }
73    }
74}