1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef QEMU_ACPI_DEFS_H
16#define QEMU_ACPI_DEFS_H
17
18enum {
19 ACPI_FADT_F_WBINVD,
20 ACPI_FADT_F_WBINVD_FLUSH,
21 ACPI_FADT_F_PROC_C1,
22 ACPI_FADT_F_P_LVL2_UP,
23 ACPI_FADT_F_PWR_BUTTON,
24 ACPI_FADT_F_SLP_BUTTON,
25 ACPI_FADT_F_FIX_RTC,
26 ACPI_FADT_F_RTC_S4,
27 ACPI_FADT_F_TMR_VAL_EXT,
28 ACPI_FADT_F_DCK_CAP,
29 ACPI_FADT_F_RESET_REG_SUP,
30 ACPI_FADT_F_SEALED_CASE,
31 ACPI_FADT_F_HEADLESS,
32 ACPI_FADT_F_CPU_SW_SLP,
33 ACPI_FADT_F_PCI_EXP_WAK,
34 ACPI_FADT_F_USE_PLATFORM_CLOCK,
35 ACPI_FADT_F_S4_RTC_STS_VALID,
36 ACPI_FADT_F_REMOTE_POWER_ON_CAPABLE,
37 ACPI_FADT_F_FORCE_APIC_CLUSTER_MODEL,
38 ACPI_FADT_F_FORCE_APIC_PHYSICAL_DESTINATION_MODE,
39 ACPI_FADT_F_HW_REDUCED_ACPI,
40 ACPI_FADT_F_LOW_POWER_S0_IDLE_CAPABLE,
41};
42
43
44
45
46struct Acpi20GenericAddress {
47 uint8_t address_space_id;
48 uint8_t register_bit_width;
49 uint8_t register_bit_offset;
50 uint8_t reserved;
51 uint64_t address;
52} QEMU_PACKED;
53typedef struct Acpi20GenericAddress Acpi20GenericAddress;
54
55struct AcpiRsdpDescriptor {
56 uint64_t signature;
57 uint8_t checksum;
58 uint8_t oem_id [6];
59 uint8_t revision;
60 uint32_t rsdt_physical_address;
61 uint32_t length;
62 uint64_t xsdt_physical_address;
63 uint8_t extended_checksum;
64 uint8_t reserved [3];
65} QEMU_PACKED;
66typedef struct AcpiRsdpDescriptor AcpiRsdpDescriptor;
67
68
69
70
71
72#define ACPI_TABLE_HEADER_DEF \
73 uint32_t signature; \
74 uint32_t length; \
75 uint8_t revision; \
76 uint8_t checksum; \
77 uint8_t oem_id [6]; \
78 uint8_t oem_table_id [8]; \
79 uint32_t oem_revision; \
80 uint8_t asl_compiler_id [4]; \
81 uint32_t asl_compiler_revision;
82
83
84struct AcpiTableHeader
85{
86 ACPI_TABLE_HEADER_DEF
87} QEMU_PACKED;
88typedef struct AcpiTableHeader AcpiTableHeader;
89
90
91
92
93#define ACPI_FADT_COMMON_DEF \
94 ACPI_TABLE_HEADER_DEF \
95 uint32_t firmware_ctrl; \
96 uint32_t dsdt; \
97 uint8_t model; \
98 uint8_t reserved1; \
99 uint16_t sci_int; \
100 uint32_t smi_cmd; \
101 uint8_t acpi_enable; \
102 uint8_t acpi_disable; \
103 \
104 uint8_t S4bios_req; \
105 uint8_t reserved2; \
106 \
107 uint32_t pm1a_evt_blk; \
108 \
109 uint32_t pm1b_evt_blk; \
110 uint32_t pm1a_cnt_blk; \
111 uint32_t pm1b_cnt_blk; \
112 uint32_t pm2_cnt_blk; \
113 uint32_t pm_tmr_blk; \
114 \
115 uint32_t gpe0_blk; \
116 \
117 uint32_t gpe1_blk; \
118 uint8_t pm1_evt_len; \
119 uint8_t pm1_cnt_len; \
120 uint8_t pm2_cnt_len; \
121 uint8_t pm_tmr_len; \
122 uint8_t gpe0_blk_len; \
123 uint8_t gpe1_blk_len; \
124 uint8_t gpe1_base; \
125 uint8_t reserved3; \
126 uint16_t plvl2_lat; \
127 uint16_t plvl3_lat; \
128 uint16_t flush_size; \
129 uint16_t flush_stride; \
130 uint8_t duty_offset; \
131 uint8_t duty_width; \
132 uint8_t day_alrm; \
133 uint8_t mon_alrm; \
134 uint8_t century;
135
136struct AcpiFadtDescriptorRev1
137{
138 ACPI_FADT_COMMON_DEF
139 uint8_t reserved4;
140 uint8_t reserved4a;
141 uint8_t reserved4b;
142 uint32_t flags;
143} QEMU_PACKED;
144typedef struct AcpiFadtDescriptorRev1 AcpiFadtDescriptorRev1;
145
146struct AcpiGenericAddress {
147 uint8_t space_id;
148 uint8_t bit_width;
149 uint8_t bit_offset;
150 uint8_t access_width;
151 uint64_t address;
152} QEMU_PACKED;
153
154struct AcpiFadtDescriptorRev5_1 {
155 ACPI_FADT_COMMON_DEF
156
157 uint16_t boot_flags;
158 uint8_t reserved;
159
160 uint32_t flags;
161
162 struct AcpiGenericAddress reset_register;
163
164 uint8_t reset_value;
165
166 uint16_t arm_boot_flags;
167 uint8_t minor_revision;
168 uint64_t Xfacs;
169 uint64_t Xdsdt;
170
171 struct AcpiGenericAddress xpm1a_event_block;
172
173 struct AcpiGenericAddress xpm1b_event_block;
174
175 struct AcpiGenericAddress xpm1a_control_block;
176
177 struct AcpiGenericAddress xpm1b_control_block;
178
179 struct AcpiGenericAddress xpm2_control_block;
180
181 struct AcpiGenericAddress xpm_timer_block;
182
183 struct AcpiGenericAddress xgpe0_block;
184
185 struct AcpiGenericAddress xgpe1_block;
186
187 struct AcpiGenericAddress sleep_control;
188
189 struct AcpiGenericAddress sleep_status;
190} QEMU_PACKED;
191
192typedef struct AcpiFadtDescriptorRev5_1 AcpiFadtDescriptorRev5_1;
193
194enum {
195 ACPI_FADT_ARM_USE_PSCI_G_0_2 = 0,
196 ACPI_FADT_ARM_PSCI_USE_HVC = 1,
197};
198
199
200
201
202
203
204
205struct AcpiSerialPortConsoleRedirection {
206 ACPI_TABLE_HEADER_DEF
207 uint8_t interface_type;
208 uint8_t reserved1[3];
209 struct AcpiGenericAddress base_address;
210 uint8_t interrupt_types;
211 uint8_t irq;
212 uint32_t gsi;
213 uint8_t baud;
214 uint8_t parity;
215 uint8_t stopbits;
216 uint8_t flowctrl;
217 uint8_t term_type;
218 uint8_t reserved2;
219 uint16_t pci_device_id;
220 uint16_t pci_vendor_id;
221 uint8_t pci_bus;
222 uint8_t pci_slot;
223 uint8_t pci_func;
224 uint32_t pci_flags;
225 uint8_t pci_seg;
226 uint32_t reserved3;
227} QEMU_PACKED;
228typedef struct AcpiSerialPortConsoleRedirection
229 AcpiSerialPortConsoleRedirection;
230
231
232
233
234struct AcpiRsdtDescriptorRev1
235{
236 ACPI_TABLE_HEADER_DEF
237 uint32_t table_offset_entry[0];
238
239} QEMU_PACKED;
240typedef struct AcpiRsdtDescriptorRev1 AcpiRsdtDescriptorRev1;
241
242
243
244
245struct AcpiFacsDescriptorRev1
246{
247 uint32_t signature;
248 uint32_t length;
249 uint32_t hardware_signature;
250 uint32_t firmware_waking_vector;
251 uint32_t global_lock;
252 uint32_t flags;
253 uint8_t resverved3 [40];
254} QEMU_PACKED;
255typedef struct AcpiFacsDescriptorRev1 AcpiFacsDescriptorRev1;
256
257
258
259
260
261
262
263
264
265
266
267#define ACPI_DUAL_PIC 0
268#define ACPI_MULTIPLE_APIC 1
269
270
271
272struct AcpiMultipleApicTable
273{
274 ACPI_TABLE_HEADER_DEF
275 uint32_t local_apic_address;
276 uint32_t flags;
277} QEMU_PACKED;
278typedef struct AcpiMultipleApicTable AcpiMultipleApicTable;
279
280
281
282#define ACPI_APIC_PROCESSOR 0
283#define ACPI_APIC_IO 1
284#define ACPI_APIC_XRUPT_OVERRIDE 2
285#define ACPI_APIC_NMI 3
286#define ACPI_APIC_LOCAL_NMI 4
287#define ACPI_APIC_ADDRESS_OVERRIDE 5
288#define ACPI_APIC_IO_SAPIC 6
289#define ACPI_APIC_LOCAL_SAPIC 7
290#define ACPI_APIC_XRUPT_SOURCE 8
291#define ACPI_APIC_LOCAL_X2APIC 9
292#define ACPI_APIC_LOCAL_X2APIC_NMI 10
293#define ACPI_APIC_GENERIC_INTERRUPT 11
294#define ACPI_APIC_GENERIC_DISTRIBUTOR 12
295#define ACPI_APIC_GENERIC_MSI_FRAME 13
296#define ACPI_APIC_GENERIC_REDISTRIBUTOR 14
297#define ACPI_APIC_RESERVED 15
298
299
300
301
302#define ACPI_SUB_HEADER_DEF \
303 uint8_t type; \
304 uint8_t length;
305
306
307
308struct AcpiMadtProcessorApic
309{
310 ACPI_SUB_HEADER_DEF
311 uint8_t processor_id;
312 uint8_t local_apic_id;
313 uint32_t flags;
314} QEMU_PACKED;
315typedef struct AcpiMadtProcessorApic AcpiMadtProcessorApic;
316
317struct AcpiMadtIoApic
318{
319 ACPI_SUB_HEADER_DEF
320 uint8_t io_apic_id;
321 uint8_t reserved;
322 uint32_t address;
323 uint32_t interrupt;
324
325} QEMU_PACKED;
326typedef struct AcpiMadtIoApic AcpiMadtIoApic;
327
328struct AcpiMadtIntsrcovr {
329 ACPI_SUB_HEADER_DEF
330 uint8_t bus;
331 uint8_t source;
332 uint32_t gsi;
333 uint16_t flags;
334} QEMU_PACKED;
335typedef struct AcpiMadtIntsrcovr AcpiMadtIntsrcovr;
336
337struct AcpiMadtLocalNmi {
338 ACPI_SUB_HEADER_DEF
339 uint8_t processor_id;
340 uint16_t flags;
341 uint8_t lint;
342} QEMU_PACKED;
343typedef struct AcpiMadtLocalNmi AcpiMadtLocalNmi;
344
345struct AcpiMadtGenericInterrupt {
346 ACPI_SUB_HEADER_DEF
347 uint16_t reserved;
348 uint32_t cpu_interface_number;
349 uint32_t uid;
350 uint32_t flags;
351 uint32_t parking_version;
352 uint32_t performance_interrupt;
353 uint64_t parked_address;
354 uint64_t base_address;
355 uint64_t gicv_base_address;
356 uint64_t gich_base_address;
357 uint32_t vgic_interrupt;
358 uint64_t gicr_base_address;
359 uint64_t arm_mpidr;
360} QEMU_PACKED;
361
362typedef struct AcpiMadtGenericInterrupt AcpiMadtGenericInterrupt;
363
364struct AcpiMadtGenericDistributor {
365 ACPI_SUB_HEADER_DEF
366 uint16_t reserved;
367 uint32_t gic_id;
368 uint64_t base_address;
369 uint32_t global_irq_base;
370 uint32_t reserved2;
371} QEMU_PACKED;
372
373typedef struct AcpiMadtGenericDistributor AcpiMadtGenericDistributor;
374
375struct AcpiMadtGenericMsiFrame {
376 ACPI_SUB_HEADER_DEF
377 uint16_t reserved;
378 uint32_t gic_msi_frame_id;
379 uint64_t base_address;
380 uint32_t flags;
381 uint16_t spi_count;
382 uint16_t spi_base;
383} QEMU_PACKED;
384
385typedef struct AcpiMadtGenericMsiFrame AcpiMadtGenericMsiFrame;
386
387struct AcpiMadtGenericRedistributor {
388 ACPI_SUB_HEADER_DEF
389 uint16_t reserved;
390 uint64_t base_address;
391 uint32_t range_length;
392} QEMU_PACKED;
393
394typedef struct AcpiMadtGenericRedistributor AcpiMadtGenericRedistributor;
395
396
397
398
399
400#define ACPI_GTDT_INTERRUPT_MODE (1 << 0)
401#define ACPI_GTDT_INTERRUPT_POLARITY (1 << 1)
402#define ACPI_GTDT_ALWAYS_ON (1 << 2)
403
404
405
406#define ACPI_LEVEL_SENSITIVE ((uint8_t) 0x00)
407#define ACPI_EDGE_SENSITIVE ((uint8_t) 0x01)
408
409
410
411#define ACPI_ACTIVE_HIGH ((uint8_t) 0x00)
412#define ACPI_ACTIVE_LOW ((uint8_t) 0x01)
413#define ACPI_ACTIVE_BOTH ((uint8_t) 0x02)
414
415struct AcpiGenericTimerTable {
416 ACPI_TABLE_HEADER_DEF
417 uint64_t counter_block_addresss;
418 uint32_t reserved;
419 uint32_t secure_el1_interrupt;
420 uint32_t secure_el1_flags;
421 uint32_t non_secure_el1_interrupt;
422 uint32_t non_secure_el1_flags;
423 uint32_t virtual_timer_interrupt;
424 uint32_t virtual_timer_flags;
425 uint32_t non_secure_el2_interrupt;
426 uint32_t non_secure_el2_flags;
427 uint64_t counter_read_block_address;
428 uint32_t platform_timer_count;
429 uint32_t platform_timer_offset;
430} QEMU_PACKED;
431typedef struct AcpiGenericTimerTable AcpiGenericTimerTable;
432
433
434
435
436struct Acpi20Hpet {
437 ACPI_TABLE_HEADER_DEF
438 uint32_t timer_block_id;
439 Acpi20GenericAddress addr;
440 uint8_t hpet_number;
441 uint16_t min_tick;
442 uint8_t page_protect;
443} QEMU_PACKED;
444typedef struct Acpi20Hpet Acpi20Hpet;
445
446
447
448
449
450struct AcpiSystemResourceAffinityTable
451{
452 ACPI_TABLE_HEADER_DEF
453 uint32_t reserved1;
454 uint32_t reserved2[2];
455} QEMU_PACKED;
456typedef struct AcpiSystemResourceAffinityTable AcpiSystemResourceAffinityTable;
457
458#define ACPI_SRAT_PROCESSOR 0
459#define ACPI_SRAT_MEMORY 1
460
461struct AcpiSratProcessorAffinity
462{
463 ACPI_SUB_HEADER_DEF
464 uint8_t proximity_lo;
465 uint8_t local_apic_id;
466 uint32_t flags;
467 uint8_t local_sapic_eid;
468 uint8_t proximity_hi[3];
469 uint32_t reserved;
470} QEMU_PACKED;
471typedef struct AcpiSratProcessorAffinity AcpiSratProcessorAffinity;
472
473struct AcpiSratMemoryAffinity
474{
475 ACPI_SUB_HEADER_DEF
476 uint8_t proximity[4];
477 uint16_t reserved1;
478 uint64_t base_addr;
479 uint64_t range_length;
480 uint32_t reserved2;
481 uint32_t flags;
482 uint32_t reserved3[2];
483} QEMU_PACKED;
484typedef struct AcpiSratMemoryAffinity AcpiSratMemoryAffinity;
485
486
487
488struct AcpiMcfgAllocation {
489 uint64_t address;
490 uint16_t pci_segment;
491 uint8_t start_bus_number;
492 uint8_t end_bus_number;
493 uint32_t reserved;
494} QEMU_PACKED;
495typedef struct AcpiMcfgAllocation AcpiMcfgAllocation;
496
497struct AcpiTableMcfg {
498 ACPI_TABLE_HEADER_DEF;
499 uint8_t reserved[8];
500 AcpiMcfgAllocation allocation[0];
501} QEMU_PACKED;
502typedef struct AcpiTableMcfg AcpiTableMcfg;
503
504
505
506
507
508
509
510struct Acpi20Tcpa {
511 ACPI_TABLE_HEADER_DEF
512 uint16_t platform_class;
513 uint32_t log_area_minimum_length;
514 uint64_t log_area_start_address;
515} QEMU_PACKED;
516typedef struct Acpi20Tcpa Acpi20Tcpa;
517
518
519
520
521
522
523
524struct Acpi20TPM2 {
525 ACPI_TABLE_HEADER_DEF
526 uint16_t platform_class;
527 uint16_t reserved;
528 uint64_t control_area_address;
529 uint32_t start_method;
530} QEMU_PACKED;
531typedef struct Acpi20TPM2 Acpi20TPM2;
532
533
534struct AcpiTableDmar {
535 ACPI_TABLE_HEADER_DEF
536 uint8_t host_address_width;
537 uint8_t flags;
538 uint8_t reserved[10];
539} QEMU_PACKED;
540typedef struct AcpiTableDmar AcpiTableDmar;
541
542
543#define ACPI_DMAR_INTR_REMAP 1
544#define ACPI_DMAR_X2APIC_OPT_OUT (1 << 1)
545
546
547enum {
548 ACPI_DMAR_TYPE_HARDWARE_UNIT = 0,
549 ACPI_DMAR_TYPE_RESERVED_MEMORY = 1,
550 ACPI_DMAR_TYPE_ATSR = 2,
551 ACPI_DMAR_TYPE_HARDWARE_AFFINITY = 3,
552 ACPI_DMAR_TYPE_ANDD = 4,
553 ACPI_DMAR_TYPE_RESERVED = 5
554};
555
556
557
558
559
560struct AcpiDmarHardwareUnit {
561 uint16_t type;
562 uint16_t length;
563 uint8_t flags;
564 uint8_t reserved;
565 uint16_t pci_segment;
566 uint64_t address;
567} QEMU_PACKED;
568typedef struct AcpiDmarHardwareUnit AcpiDmarHardwareUnit;
569
570
571#define ACPI_DMAR_INCLUDE_PCI_ALL 1
572
573#endif
574