1 /* SPDX-License-Identifier: LGPL-2.1-only */ 2 /* 3 * Copyright (c) 2004, Intel Corporation. 4 */ 5 #ifndef _ACPI_2_0_H_ 6 #define _ACPI_2_0_H_ 7 8 #include <stdint.h> 9 #include <xen/xen.h> 10 #include <xen/hvm/ioreq.h> 11 12 #define ASCII32(a,b,c,d) \ 13 (((a) << 0) | ((b) << 8) | ((c) << 16) | ((d) << 24)) 14 #define ASCII64(a,b,c,d,e,f,g,h) \ 15 (((uint64_t)ASCII32(a,b,c,d)) | (((uint64_t)ASCII32(e,f,g,h)) << 32)) 16 17 #pragma pack (1) 18 19 /* 20 * Common ACPI header. 21 */ 22 struct acpi_header { 23 uint32_t signature; 24 uint32_t length; 25 uint8_t revision; 26 uint8_t checksum; 27 char oem_id[6]; 28 char oem_table_id[8]; 29 uint32_t oem_revision; 30 uint32_t creator_id; 31 uint32_t creator_revision; 32 }; 33 34 #define ACPI_OEM_ID "Xen" 35 #define ACPI_OEM_TABLE_ID "HVM" 36 #define ACPI_OEM_REVISION 0 37 38 #define ACPI_CREATOR_ID ASCII32('H','V','M','L') /* HVMLoader */ 39 #define ACPI_CREATOR_REVISION 0 40 41 /* 42 * ACPI 2.0 Generic Address Space definition. 43 */ 44 struct acpi_20_generic_address { 45 uint8_t address_space_id; 46 uint8_t register_bit_width; 47 uint8_t register_bit_offset; 48 uint8_t reserved; 49 uint64_t address; 50 }; 51 52 /* 53 * Generic Address Space Address IDs. 54 */ 55 #define ACPI_SYSTEM_MEMORY 0 56 #define ACPI_SYSTEM_IO 1 57 #define ACPI_PCI_CONFIGURATION_SPACE 2 58 #define ACPI_EMBEDDED_CONTROLLER 3 59 #define ACPI_SMBUS 4 60 #define ACPI_FUNCTIONAL_FIXED_HARDWARE 0x7F 61 62 /* 63 * Root System Description Pointer Structure in ACPI 1.0. 64 */ 65 struct acpi_10_rsdp { 66 uint64_t signature; 67 uint8_t checksum; 68 char oem_id[6]; 69 uint8_t reserved; 70 uint32_t rsdt_address; 71 }; 72 73 /* 74 * Root System Description Pointer Structure. 75 */ 76 struct acpi_20_rsdp { 77 uint64_t signature; 78 uint8_t checksum; 79 char oem_id[6]; 80 uint8_t revision; 81 uint32_t rsdt_address; 82 uint32_t length; 83 uint64_t xsdt_address; 84 uint8_t extended_checksum; 85 uint8_t reserved[3]; 86 }; 87 88 /* 89 * Root System Description Table (RSDT). 90 */ 91 struct acpi_20_rsdt { 92 struct acpi_header header; 93 uint32_t entry[1]; 94 }; 95 96 /* 97 * Extended System Description Table (XSDT). 98 */ 99 struct acpi_20_xsdt { 100 struct acpi_header header; 101 uint64_t entry[1]; 102 }; 103 104 /* 105 * TCG Hardware Interface Table (TCPA) 106 */ 107 struct acpi_20_tcpa { 108 struct acpi_header header; 109 uint16_t platform_class; 110 uint32_t laml; 111 uint64_t lasa; 112 }; 113 #define ACPI_2_0_TCPA_LAML_SIZE (64*1024) 114 115 /* 116 * TPM2 117 */ 118 struct acpi_20_tpm2 { 119 struct acpi_header header; 120 uint16_t platform_class; 121 uint16_t reserved; 122 uint64_t control_area_address; 123 uint32_t start_method; 124 uint8_t start_method_params[12]; 125 uint32_t log_area_minimum_length; 126 uint64_t log_area_start_address; 127 }; 128 #define TPM2_ACPI_CLASS_CLIENT 0 129 #define TPM2_START_METHOD_CRB 7 130 131 /* 132 * TPM register I/O Mapped region, location of which defined in the 133 * TCG PC Client Platform TPM Profile Specification for TPM 2.0. 134 * See table 9 - Only Locality 0 is used here. This is emulated by QEMU. 135 * Definition of Register space is found in table 12. 136 */ 137 #define TPM_REGISTER_BASE 0xFED40000 138 #define TPM_CRB_CTRL_REQ (TPM_REGISTER_BASE + 0x40) 139 #define TPM_CRB_INTF_ID (TPM_REGISTER_BASE + 0x30) 140 141 #define TPM_LOG_AREA_ADDRESS 0xFED50000 142 143 #define TPM_LOG_AREA_MINIMUM_SIZE (64 << 10) 144 #define TPM_LOG_SIZE (64 << 10) 145 146 /* 147 * Fixed ACPI Description Table Structure (FADT) in ACPI 1.0. 148 */ 149 struct acpi_10_fadt { 150 struct acpi_header header; 151 uint32_t firmware_ctrl; 152 uint32_t dsdt; 153 uint8_t reserved0; 154 uint8_t preferred_pm_profile; 155 uint16_t sci_int; 156 uint32_t smi_cmd; 157 uint8_t acpi_enable; 158 uint8_t acpi_disable; 159 uint8_t s4bios_req; 160 uint8_t pstate_cnt; 161 uint32_t pm1a_evt_blk; 162 uint32_t pm1b_evt_blk; 163 uint32_t pm1a_cnt_blk; 164 uint32_t pm1b_cnt_blk; 165 uint32_t pm2_cnt_blk; 166 uint32_t pm_tmr_blk; 167 uint32_t gpe0_blk; 168 uint32_t gpe1_blk; 169 uint8_t pm1_evt_len; 170 uint8_t pm1_cnt_len; 171 uint8_t pm2_cnt_len; 172 uint8_t pm_tmr_len; 173 uint8_t gpe0_blk_len; 174 uint8_t gpe1_blk_len; 175 uint8_t gpe1_base; 176 uint8_t cst_cnt; 177 uint16_t p_lvl2_lat; 178 uint16_t p_lvl3_lat; 179 uint16_t flush_size; 180 uint16_t flush_stride; 181 uint8_t duty_offset; 182 uint8_t duty_width; 183 uint8_t day_alrm; 184 uint8_t mon_alrm; 185 uint8_t century; 186 uint16_t iapc_boot_arch; 187 uint8_t reserved1; 188 uint32_t flags; 189 }; 190 191 /* 192 * Fixed ACPI Description Table Structure (FADT). 193 */ 194 struct acpi_fadt { 195 struct acpi_header header; 196 uint32_t firmware_ctrl; 197 uint32_t dsdt; 198 uint8_t reserved0; 199 uint8_t preferred_pm_profile; 200 uint16_t sci_int; 201 uint32_t smi_cmd; 202 uint8_t acpi_enable; 203 uint8_t acpi_disable; 204 uint8_t s4bios_req; 205 uint8_t pstate_cnt; 206 uint32_t pm1a_evt_blk; 207 uint32_t pm1b_evt_blk; 208 uint32_t pm1a_cnt_blk; 209 uint32_t pm1b_cnt_blk; 210 uint32_t pm2_cnt_blk; 211 uint32_t pm_tmr_blk; 212 uint32_t gpe0_blk; 213 uint32_t gpe1_blk; 214 uint8_t pm1_evt_len; 215 uint8_t pm1_cnt_len; 216 uint8_t pm2_cnt_len; 217 uint8_t pm_tmr_len; 218 uint8_t gpe0_blk_len; 219 uint8_t gpe1_blk_len; 220 uint8_t gpe1_base; 221 uint8_t cst_cnt; 222 uint16_t p_lvl2_lat; 223 uint16_t p_lvl3_lat; 224 uint16_t flush_size; 225 uint16_t flush_stride; 226 uint8_t duty_offset; 227 uint8_t duty_width; 228 uint8_t day_alrm; 229 uint8_t mon_alrm; 230 uint8_t century; 231 uint16_t iapc_boot_arch; 232 uint8_t reserved1; 233 uint32_t flags; 234 struct acpi_20_generic_address reset_reg; 235 uint8_t reset_value; 236 uint8_t reserved2[3]; 237 uint64_t x_firmware_ctrl; 238 uint64_t x_dsdt; 239 struct acpi_20_generic_address x_pm1a_evt_blk; 240 struct acpi_20_generic_address x_pm1b_evt_blk; 241 struct acpi_20_generic_address x_pm1a_cnt_blk; 242 struct acpi_20_generic_address x_pm1b_cnt_blk; 243 struct acpi_20_generic_address x_pm2_cnt_blk; 244 struct acpi_20_generic_address x_pm_tmr_blk; 245 struct acpi_20_generic_address x_gpe0_blk; 246 struct acpi_20_generic_address x_gpe1_blk; 247 /* Only available starting from FADT revision 5. */ 248 struct acpi_20_generic_address sleep_control; 249 struct acpi_20_generic_address sleep_status; 250 }; 251 252 /* 253 * FADT Boot Architecture Flags. 254 */ 255 #define ACPI_FADT_LEGACY_DEVICES (1 << 0) 256 #define ACPI_FADT_8042 (1 << 1) 257 #define ACPI_FADT_NO_VGA (1 << 2) 258 #define ACPI_FADT_NO_CMOS_RTC (1 << 5) 259 260 /* 261 * FADT Fixed Feature Flags. 262 */ 263 #define ACPI_WBINVD (1 << 0) 264 #define ACPI_WBINVD_FLUSH (1 << 1) 265 #define ACPI_PROC_C1 (1 << 2) 266 #define ACPI_P_LVL2_UP (1 << 3) 267 #define ACPI_PWR_BUTTON (1 << 4) 268 #define ACPI_SLP_BUTTON (1 << 5) 269 #define ACPI_FIX_RTC (1 << 6) 270 #define ACPI_RTC_S4 (1 << 7) 271 #define ACPI_TMR_VAL_EXT (1 << 8) 272 #define ACPI_DCK_CAP (1 << 9) 273 #define ACPI_RESET_REG_SUP (1 << 10) 274 #define ACPI_SEALED_CASE (1 << 11) 275 #define ACPI_HEADLESS (1 << 12) 276 #define ACPI_CPU_SW_SLP (1 << 13) 277 #define ACPI_USE_PLATFORM_CLOCK (1 << 15) 278 279 /* PM1 Control Register Bits */ 280 #define ACPI_PM1C_SCI_EN (1 << 0) 281 282 /* 283 * Firmware ACPI Control Structure (FACS). 284 */ 285 struct acpi_20_facs { 286 uint32_t signature; 287 uint32_t length; 288 uint32_t hardware_signature; 289 uint32_t firmware_waking_vector; 290 uint32_t global_lock; 291 uint32_t flags; 292 uint64_t x_firmware_waking_vector; 293 uint8_t version; 294 uint8_t reserved[31]; 295 }; 296 297 #define ACPI_2_0_FACS_VERSION 0x01 298 299 /* 300 * Multiple APIC Description Table header definition (MADT). 301 */ 302 struct acpi_20_madt { 303 struct acpi_header header; 304 uint32_t lapic_addr; 305 uint32_t flags; 306 }; 307 308 309 /* 310 * HPET Description Table 311 */ 312 struct acpi_20_hpet { 313 struct acpi_header header; 314 uint32_t timer_block_id; 315 struct acpi_20_generic_address addr; 316 uint8_t hpet_number; 317 uint16_t min_tick; 318 uint8_t page_protect; 319 }; 320 #define ACPI_HPET_ADDRESS 0xFED00000UL 321 322 /* 323 * WAET Description Table 324 */ 325 struct acpi_20_waet { 326 struct acpi_header header; 327 uint32_t flags; 328 }; 329 330 /* 331 * Multiple APIC Flags. 332 */ 333 #define ACPI_PCAT_COMPAT (1 << 0) 334 335 /* 336 * Multiple APIC Description Table APIC structure types. 337 */ 338 #define ACPI_PROCESSOR_LOCAL_APIC 0x00 339 #define ACPI_IO_APIC 0x01 340 #define ACPI_INTERRUPT_SOURCE_OVERRIDE 0x02 341 #define ACPI_NON_MASKABLE_INTERRUPT_SOURCE 0x03 342 #define ACPI_LOCAL_APIC_NMI 0x04 343 #define ACPI_LOCAL_APIC_ADDRESS_OVERRIDE 0x05 344 #define ACPI_IO_SAPIC 0x06 345 #define ACPI_PROCESSOR_LOCAL_SAPIC 0x07 346 #define ACPI_PLATFORM_INTERRUPT_SOURCES 0x08 347 348 /* 349 * APIC Structure Definitions. 350 */ 351 352 /* 353 * Processor Local APIC Structure Definition. 354 */ 355 struct acpi_20_madt_lapic { 356 uint8_t type; 357 uint8_t length; 358 uint8_t acpi_processor_id; 359 uint8_t apic_id; 360 uint32_t flags; 361 }; 362 363 /* 364 * Local APIC Flags. All other bits are reserved and must be 0. 365 */ 366 #define ACPI_LOCAL_APIC_ENABLED (1 << 0) 367 368 /* 369 * IO APIC Structure. 370 */ 371 struct acpi_20_madt_ioapic { 372 uint8_t type; 373 uint8_t length; 374 uint8_t ioapic_id; 375 uint8_t reserved; 376 uint32_t ioapic_addr; 377 uint32_t gsi_base; 378 }; 379 380 struct acpi_20_madt_intsrcovr { 381 uint8_t type; 382 uint8_t length; 383 uint8_t bus; 384 uint8_t source; 385 uint32_t gsi; 386 uint16_t flags; 387 }; 388 389 /* 390 * System Resource Affinity Table header definition (SRAT) 391 */ 392 struct acpi_20_srat { 393 struct acpi_header header; 394 uint32_t table_revision; 395 uint32_t reserved2[2]; 396 }; 397 398 #define ACPI_SRAT_TABLE_REVISION 1 399 400 /* 401 * System Resource Affinity Table structure types. 402 */ 403 #define ACPI_PROCESSOR_AFFINITY 0x0 404 #define ACPI_MEMORY_AFFINITY 0x1 405 struct acpi_20_srat_processor { 406 uint8_t type; 407 uint8_t length; 408 uint8_t domain; 409 uint8_t apic_id; 410 uint32_t flags; 411 uint8_t sapic_id; 412 uint8_t domain_hi[3]; 413 uint32_t reserved; 414 }; 415 416 /* 417 * Local APIC Affinity Flags. All other bits are reserved and must be 0. 418 */ 419 #define ACPI_LOCAL_APIC_AFFIN_ENABLED (1 << 0) 420 421 struct acpi_20_srat_memory { 422 uint8_t type; 423 uint8_t length; 424 uint32_t domain; 425 uint16_t reserved; 426 uint64_t base_address; 427 uint64_t mem_length; 428 uint32_t reserved2; 429 uint32_t flags; 430 uint64_t reserved3; 431 }; 432 433 /* 434 * Memory Affinity Flags. All other bits are reserved and must be 0. 435 */ 436 #define ACPI_MEM_AFFIN_ENABLED (1 << 0) 437 #define ACPI_MEM_AFFIN_HOTPLUGGABLE (1 << 1) 438 #define ACPI_MEM_AFFIN_NONVOLATILE (1 << 2) 439 440 struct acpi_20_slit { 441 struct acpi_header header; 442 uint64_t localities; 443 uint8_t entry[0]; 444 }; 445 446 /* 447 * Table Signatures. 448 */ 449 #define ACPI_2_0_RSDP_SIGNATURE ASCII64('R','S','D',' ','P','T','R',' ') 450 #define ACPI_2_0_FACS_SIGNATURE ASCII32('F','A','C','S') 451 #define ACPI_FADT_SIGNATURE ASCII32('F','A','C','P') 452 #define ACPI_2_0_MADT_SIGNATURE ASCII32('A','P','I','C') 453 #define ACPI_2_0_RSDT_SIGNATURE ASCII32('R','S','D','T') 454 #define ACPI_2_0_XSDT_SIGNATURE ASCII32('X','S','D','T') 455 #define ACPI_2_0_TCPA_SIGNATURE ASCII32('T','C','P','A') 456 #define ACPI_2_0_TPM2_SIGNATURE ASCII32('T','P','M','2') 457 #define ACPI_2_0_HPET_SIGNATURE ASCII32('H','P','E','T') 458 #define ACPI_2_0_WAET_SIGNATURE ASCII32('W','A','E','T') 459 #define ACPI_2_0_SRAT_SIGNATURE ASCII32('S','R','A','T') 460 #define ACPI_2_0_SLIT_SIGNATURE ASCII32('S','L','I','T') 461 462 /* 463 * Table revision numbers. 464 */ 465 #define ACPI_2_0_RSDP_REVISION 0x02 466 #define ACPI_2_0_MADT_REVISION 0x02 467 #define ACPI_2_0_RSDT_REVISION 0x01 468 #define ACPI_2_0_XSDT_REVISION 0x01 469 #define ACPI_2_0_TCPA_REVISION 0x02 470 #define ACPI_2_0_TPM2_REVISION 0x04 471 #define ACPI_2_0_HPET_REVISION 0x01 472 #define ACPI_2_0_WAET_REVISION 0x01 473 #define ACPI_1_0_FADT_REVISION 0x01 474 #define ACPI_2_0_SRAT_REVISION 0x01 475 #define ACPI_2_0_SLIT_REVISION 0x01 476 477 #pragma pack () 478 479 #endif /* _ACPI_2_0_H_ */ 480 481 /* 482 * Local variables: 483 * mode: C 484 * c-file-style: "BSD" 485 * c-basic-offset: 4 486 * tab-width: 4 487 * indent-tabs-mode: nil 488 * End: 489 */ 490