1 #ifndef _ACPI_H_ 2 #define _ACPI_H_ 3 4 #include "libcflat.h" 5 6 /* 7 * All tables and structures must be byte-packed to match the ACPI 8 * specification, since the tables are provided by the system firmware. 9 */ 10 #pragma pack(1) 11 12 #define ACPI_SIGNATURE(c1, c2, c3, c4) \ 13 ((c1) | ((c2) << 8) | ((c3) << 16) | ((c4) << 24)) 14 15 #define RSDP_SIGNATURE ACPI_SIGNATURE('R','S','D','P') 16 #define RSDT_SIGNATURE ACPI_SIGNATURE('R','S','D','T') 17 #define XSDT_SIGNATURE ACPI_SIGNATURE('X','S','D','T') 18 #define FACP_SIGNATURE ACPI_SIGNATURE('F','A','C','P') 19 #define FACS_SIGNATURE ACPI_SIGNATURE('F','A','C','S') 20 #define MADT_SIGNATURE ACPI_SIGNATURE('A','P','I','C') 21 #define SPCR_SIGNATURE ACPI_SIGNATURE('S','P','C','R') 22 #define GTDT_SIGNATURE ACPI_SIGNATURE('G','T','D','T') 23 24 #define ACPI_SIGNATURE_8BYTE(c1, c2, c3, c4, c5, c6, c7, c8) \ 25 (((uint64_t)(ACPI_SIGNATURE(c1, c2, c3, c4))) | \ 26 ((uint64_t)(ACPI_SIGNATURE(c5, c6, c7, c8)) << 32)) 27 28 #define RSDP_SIGNATURE_8BYTE (ACPI_SIGNATURE_8BYTE('R', 'S', 'D', ' ', 'P', 'T', 'R', ' ')) 29 30 struct acpi_table_rsdp { /* Root System Descriptor Pointer */ 31 u64 signature; /* ACPI signature, contains "RSD PTR " */ 32 u8 checksum; /* To make sum of struct == 0 */ 33 u8 oem_id[6]; /* OEM identification */ 34 u8 revision; /* Must be 0 for 1.0, 2 for 2.0 */ 35 u32 rsdt_physical_address; /* 32-bit physical address of RSDT */ 36 u32 length; /* XSDT Length in bytes including hdr */ 37 u64 xsdt_physical_address; /* 64-bit physical address of XSDT */ 38 u8 extended_checksum; /* Checksum of entire table */ 39 u8 reserved[3]; /* Reserved field must be 0 */ 40 }; 41 42 #define ACPI_TABLE_HEADER_DEF /* ACPI common table header */ \ 43 u32 signature; /* ACPI signature (4 ASCII characters) */ \ 44 u32 length; /* Length of table, in bytes, including header */ \ 45 u8 revision; /* ACPI Specification minor version # */ \ 46 u8 checksum; /* To make sum of entire table == 0 */ \ 47 u8 oem_id[6]; /* OEM identification */ \ 48 u8 oem_table_id[8]; /* OEM table identification */ \ 49 u32 oem_revision; /* OEM revision number */ \ 50 u8 asl_compiler_id[4]; /* ASL compiler vendor ID */ \ 51 u32 asl_compiler_revision; /* ASL compiler revision number */ 52 53 struct acpi_table { 54 ACPI_TABLE_HEADER_DEF 55 char data[]; 56 }; 57 58 struct acpi_table_rsdt_rev1 { 59 ACPI_TABLE_HEADER_DEF 60 u32 table_offset_entry[]; 61 }; 62 63 struct acpi_table_xsdt { 64 ACPI_TABLE_HEADER_DEF 65 u64 table_offset_entry[]; 66 }; 67 68 struct acpi_generic_address { 69 u8 space_id; /* Address space where struct or register exists */ 70 u8 bit_width; /* Size in bits of given register */ 71 u8 bit_offset; /* Bit offset within the register */ 72 u8 access_width; /* Minimum Access size (ACPI 3.0) */ 73 u64 address; /* 64-bit address of struct or register */ 74 }; 75 76 struct acpi_table_fadt { 77 ACPI_TABLE_HEADER_DEF /* ACPI common table header */ 78 u32 firmware_ctrl; /* Physical address of FACS */ 79 u32 dsdt; /* Physical address of DSDT */ 80 u8 model; /* System Interrupt Model */ 81 u8 reserved1; /* Reserved */ 82 u16 sci_int; /* System vector of SCI interrupt */ 83 u32 smi_cmd; /* Port address of SMI command port */ 84 u8 acpi_enable; /* Value to write to smi_cmd to enable ACPI */ 85 u8 acpi_disable; /* Value to write to smi_cmd to disable ACPI */ 86 u8 S4bios_req; /* Value to write to SMI CMD to enter S4BIOS state */ 87 u8 reserved2; /* Reserved - must be zero */ 88 u32 pm1a_evt_blk; /* Port address of Power Mgt 1a acpi_event Reg Blk */ 89 u32 pm1b_evt_blk; /* Port address of Power Mgt 1b acpi_event Reg Blk */ 90 u32 pm1a_cnt_blk; /* Port address of Power Mgt 1a Control Reg Blk */ 91 u32 pm1b_cnt_blk; /* Port address of Power Mgt 1b Control Reg Blk */ 92 u32 pm2_cnt_blk; /* Port address of Power Mgt 2 Control Reg Blk */ 93 u32 pm_tmr_blk; /* Port address of Power Mgt Timer Ctrl Reg Blk */ 94 u32 gpe0_blk; /* Port addr of General Purpose acpi_event 0 Reg Blk */ 95 u32 gpe1_blk; /* Port addr of General Purpose acpi_event 1 Reg Blk */ 96 u8 pm1_evt_len; /* Byte length of ports at pm1_x_evt_blk */ 97 u8 pm1_cnt_len; /* Byte length of ports at pm1_x_cnt_blk */ 98 u8 pm2_cnt_len; /* Byte Length of ports at pm2_cnt_blk */ 99 u8 pm_tmr_len; /* Byte Length of ports at pm_tm_blk */ 100 u8 gpe0_blk_len; /* Byte Length of ports at gpe0_blk */ 101 u8 gpe1_blk_len; /* Byte Length of ports at gpe1_blk */ 102 u8 gpe1_base; /* Offset in gpe model where gpe1 events start */ 103 u8 reserved3; /* Reserved */ 104 u16 plvl2_lat; /* Worst case HW latency to enter/exit C2 state */ 105 u16 plvl3_lat; /* Worst case HW latency to enter/exit C3 state */ 106 u16 flush_size; /* Size of area read to flush caches */ 107 u16 flush_stride; /* Stride used in flushing caches */ 108 u8 duty_offset; /* Bit location of duty cycle field in p_cnt reg */ 109 u8 duty_width; /* Bit width of duty cycle field in p_cnt reg */ 110 u8 day_alrm; /* Index to day-of-month alarm in RTC CMOS RAM */ 111 u8 mon_alrm; /* Index to month-of-year alarm in RTC CMOS RAM */ 112 u8 century; /* Index to century in RTC CMOS RAM */ 113 u16 boot_flags; /* IA-PC Boot Architecture Flags (see below for individual flags) */ 114 u8 reserved; /* Reserved, must be zero */ 115 u32 flags; /* Miscellaneous flag bits (see below for individual flags) */ 116 struct acpi_generic_address reset_register; /* 64-bit address of the Reset register */ 117 u8 reset_value; /* Value to write to the reset_register port to reset the system */ 118 u16 arm_boot_flags; /* ARM-Specific Boot Flags (see below for individual flags) (ACPI 5.1) */ 119 u8 minor_revision; /* FADT Minor Revision (ACPI 5.1) */ 120 u64 Xfacs; /* 64-bit physical address of FACS */ 121 u64 Xdsdt; /* 64-bit physical address of DSDT */ 122 struct acpi_generic_address xpm1a_event_block; /* 64-bit Extended Power Mgt 1a Event Reg Blk address */ 123 struct acpi_generic_address xpm1b_event_block; /* 64-bit Extended Power Mgt 1b Event Reg Blk address */ 124 struct acpi_generic_address xpm1a_control_block; /* 64-bit Extended Power Mgt 1a Control Reg Blk address */ 125 struct acpi_generic_address xpm1b_control_block; /* 64-bit Extended Power Mgt 1b Control Reg Blk address */ 126 struct acpi_generic_address xpm2_control_block; /* 64-bit Extended Power Mgt 2 Control Reg Blk address */ 127 struct acpi_generic_address xpm_timer_block; /* 64-bit Extended Power Mgt Timer Ctrl Reg Blk address */ 128 struct acpi_generic_address xgpe0_block; /* 64-bit Extended General Purpose Event 0 Reg Blk address */ 129 struct acpi_generic_address xgpe1_block; /* 64-bit Extended General Purpose Event 1 Reg Blk address */ 130 struct acpi_generic_address sleep_control; /* 64-bit Sleep Control register (ACPI 5.0) */ 131 struct acpi_generic_address sleep_status; /* 64-bit Sleep Status register (ACPI 5.0) */ 132 u64 hypervisor_id; /* Hypervisor Vendor ID (ACPI 6.0) */ 133 }; 134 135 /* Masks for FADT ARM Boot Architecture Flags (arm_boot_flags) ACPI 5.1 */ 136 137 #define ACPI_FADT_PSCI_COMPLIANT (1) /* 00: [V5+] PSCI 0.2+ is implemented */ 138 #define ACPI_FADT_PSCI_USE_HVC (1<<1) /* 01: [V5+] HVC must be used instead of SMC as the PSCI conduit */ 139 140 struct acpi_table_facs_rev1 { 141 u32 signature; /* ACPI Signature */ 142 u32 length; /* Length of structure, in bytes */ 143 u32 hardware_signature; /* Hardware configuration signature */ 144 u32 firmware_waking_vector; /* ACPI OS waking vector */ 145 u32 global_lock; /* Global Lock */ 146 u32 S4bios_f:1; /* Indicates if S4BIOS support is present */ 147 u32 reserved1:31; /* Must be 0 */ 148 u8 reserved3[40]; /* Reserved - must be zero */ 149 }; 150 151 struct acpi_table_madt { 152 ACPI_TABLE_HEADER_DEF /* ACPI common table header */ 153 u32 address; /* Physical address of local APIC */ 154 u32 flags; 155 }; 156 157 struct acpi_subtable_header { 158 u8 type; 159 u8 length; 160 }; 161 162 typedef int (*acpi_table_handler)(struct acpi_subtable_header *header); 163 164 /* 11: Generic interrupt - GICC (ACPI 5.0 + ACPI 6.0 + ACPI 6.3 changes) */ 165 166 struct acpi_madt_generic_interrupt { 167 u8 type; 168 u8 length; 169 u16 reserved; /* reserved - must be zero */ 170 u32 cpu_interface_number; 171 u32 uid; 172 u32 flags; 173 u32 parking_version; 174 u32 performance_interrupt; 175 u64 parked_address; 176 u64 base_address; 177 u64 gicv_base_address; 178 u64 gich_base_address; 179 u32 vgic_interrupt; 180 u64 gicr_base_address; 181 u64 arm_mpidr; 182 u8 efficiency_class; 183 u8 reserved2[1]; 184 u16 spe_interrupt; /* ACPI 6.3 */ 185 }; 186 187 /* 12: Generic Distributor (ACPI 5.0 + ACPI 6.0 changes) */ 188 189 struct acpi_madt_generic_distributor { 190 struct acpi_subtable_header header; 191 u16 reserved; /* reserved - must be zero */ 192 u32 gic_id; 193 u64 base_address; 194 u32 global_irq_base; 195 u8 version; 196 u8 reserved2[3]; /* reserved - must be zero */ 197 }; 198 199 /* Values for Version field above */ 200 201 enum acpi_madt_gic_version { 202 ACPI_MADT_GIC_VERSION_NONE = 0, 203 ACPI_MADT_GIC_VERSION_V1 = 1, 204 ACPI_MADT_GIC_VERSION_V2 = 2, 205 ACPI_MADT_GIC_VERSION_V3 = 3, 206 ACPI_MADT_GIC_VERSION_V4 = 4, 207 ACPI_MADT_GIC_VERSION_RESERVED = 5 /* 5 and greater are reserved */ 208 }; 209 210 /* 14: Generic Redistributor (ACPI 5.1) */ 211 212 struct acpi_madt_generic_redistributor { 213 struct acpi_subtable_header header; 214 u16 reserved; /* reserved - must be zero */ 215 u64 base_address; 216 u32 length; 217 }; 218 219 /* 15: Generic Translator (ACPI 6.0) */ 220 221 struct acpi_madt_generic_translator { 222 struct acpi_subtable_header header; 223 u16 reserved; /* reserved - must be zero */ 224 u32 translation_id; 225 u64 base_address; 226 u32 reserved2; 227 }; 228 229 /* Values for MADT subtable type in struct acpi_subtable_header */ 230 231 enum acpi_madt_type { 232 ACPI_MADT_TYPE_LOCAL_APIC = 0, 233 ACPI_MADT_TYPE_IO_APIC = 1, 234 ACPI_MADT_TYPE_INTERRUPT_OVERRIDE = 2, 235 ACPI_MADT_TYPE_NMI_SOURCE = 3, 236 ACPI_MADT_TYPE_LOCAL_APIC_NMI = 4, 237 ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE = 5, 238 ACPI_MADT_TYPE_IO_SAPIC = 6, 239 ACPI_MADT_TYPE_LOCAL_SAPIC = 7, 240 ACPI_MADT_TYPE_INTERRUPT_SOURCE = 8, 241 ACPI_MADT_TYPE_LOCAL_X2APIC = 9, 242 ACPI_MADT_TYPE_LOCAL_X2APIC_NMI = 10, 243 ACPI_MADT_TYPE_GENERIC_INTERRUPT = 11, 244 ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR = 12, 245 ACPI_MADT_TYPE_GENERIC_MSI_FRAME = 13, 246 ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR = 14, 247 ACPI_MADT_TYPE_GENERIC_TRANSLATOR = 15, 248 ACPI_MADT_TYPE_RESERVED = 16 /* 16 and greater are reserved */ 249 }; 250 251 /* MADT Local APIC flags */ 252 #define ACPI_MADT_ENABLED (1) /* 00: Processor is usable if set */ 253 254 struct spcr_descriptor { 255 ACPI_TABLE_HEADER_DEF /* ACPI common table header */ 256 u8 interface_type; /* 0=full 16550, 1=subset of 16550 */ 257 u8 reserved[3]; 258 struct acpi_generic_address serial_port; 259 u8 interrupt_type; 260 u8 pc_interrupt; 261 u32 interrupt; 262 u8 baud_rate; 263 u8 parity; 264 u8 stop_bits; 265 u8 flow_control; 266 u8 terminal_type; 267 u8 reserved1; 268 u16 pci_device_id; 269 u16 pci_vendor_id; 270 u8 pci_bus; 271 u8 pci_device; 272 u8 pci_function; 273 u32 pci_flags; 274 u8 pci_segment; 275 u32 reserved2; 276 }; 277 278 struct acpi_table_gtdt { 279 ACPI_TABLE_HEADER_DEF /* ACPI common table header */ 280 u64 counter_block_addresss; 281 u32 reserved; 282 u32 secure_el1_interrupt; 283 u32 secure_el1_flags; 284 u32 non_secure_el1_interrupt; 285 u32 non_secure_el1_flags; 286 u32 virtual_timer_interrupt; 287 u32 virtual_timer_flags; 288 u32 non_secure_el2_interrupt; 289 u32 non_secure_el2_flags; 290 u64 counter_read_block_address; 291 u32 platform_timer_count; 292 u32 platform_timer_offset; 293 }; 294 295 /* Reset to default packing */ 296 #pragma pack() 297 298 void set_efi_rsdp(struct acpi_table_rsdp *rsdp); 299 void *find_acpi_table_addr(u32 sig); 300 int acpi_table_parse_madt(enum acpi_madt_type mtype, acpi_table_handler handler); 301 302 #endif 303