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