xref: /openbmc/qemu/include/hw/acpi/acpi-defs.h (revision 165cdaf857dc850f676fff0b5b873a51865baa9c)
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 2 of the License, or
5  * (at your option) any later version.
6 
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11 
12  * You should have received a copy of the GNU General Public License along
13  * with this program; if not, see <http://www.gnu.org/licenses/>.
14  */
15 #ifndef QEMU_ACPI_DEFS_H
16 #define QEMU_ACPI_DEFS_H
17 
18 enum {
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  * ACPI 2.0 Generic Address Space definition.
45  */
46 struct 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;
53 typedef struct Acpi20GenericAddress Acpi20GenericAddress;
54 
55 struct AcpiRsdpDescriptor {        /* Root System Descriptor Pointer */
56     uint64_t signature;              /* ACPI signature, contains "RSD PTR " */
57     uint8_t  checksum;               /* To make sum of struct == 0 */
58     uint8_t  oem_id [6];             /* OEM identification */
59     uint8_t  revision;               /* Must be 0 for 1.0, 2 for 2.0 */
60     uint32_t rsdt_physical_address;  /* 32-bit physical address of RSDT */
61     uint32_t length;                 /* XSDT Length in bytes including hdr */
62     uint64_t xsdt_physical_address;  /* 64-bit physical address of XSDT */
63     uint8_t  extended_checksum;      /* Checksum of entire table */
64     uint8_t  reserved [3];           /* Reserved field must be 0 */
65 } QEMU_PACKED;
66 typedef struct AcpiRsdpDescriptor AcpiRsdpDescriptor;
67 
68 /* Table structure from Linux kernel (the ACPI tables are under the
69    BSD license) */
70 
71 
72 #define ACPI_TABLE_HEADER_DEF   /* ACPI common table header */ \
73     uint32_t signature;          /* ACPI signature (4 ASCII characters) */ \
74     uint32_t length;                 /* Length of table, in bytes, including header */ \
75     uint8_t  revision;               /* ACPI Specification minor version # */ \
76     uint8_t  checksum;               /* To make sum of entire table == 0 */ \
77     uint8_t  oem_id [6];             /* OEM identification */ \
78     uint8_t  oem_table_id [8];       /* OEM table identification */ \
79     uint32_t oem_revision;           /* OEM revision number */ \
80     uint8_t  asl_compiler_id [4];    /* ASL compiler vendor ID */ \
81     uint32_t asl_compiler_revision;  /* ASL compiler revision number */
82 
83 
84 struct AcpiTableHeader         /* ACPI common table header */
85 {
86     ACPI_TABLE_HEADER_DEF
87 } QEMU_PACKED;
88 typedef struct AcpiTableHeader AcpiTableHeader;
89 
90 /*
91  * ACPI 1.0 Fixed ACPI Description Table (FADT)
92  */
93 struct AcpiFadtDescriptorRev1
94 {
95     ACPI_TABLE_HEADER_DEF     /* ACPI common table header */
96     uint32_t firmware_ctrl;          /* Physical address of FACS */
97     uint32_t dsdt;                   /* Physical address of DSDT */
98     uint8_t  model;                  /* System Interrupt Model */
99     uint8_t  reserved1;              /* Reserved */
100     uint16_t sci_int;                /* System vector of SCI interrupt */
101     uint32_t smi_cmd;                /* Port address of SMI command port */
102     uint8_t  acpi_enable;            /* Value to write to smi_cmd to enable ACPI */
103     uint8_t  acpi_disable;           /* Value to write to smi_cmd to disable ACPI */
104     uint8_t  S4bios_req;             /* Value to write to SMI CMD to enter S4BIOS state */
105     uint8_t  reserved2;              /* Reserved - must be zero */
106     uint32_t pm1a_evt_blk;           /* Port address of Power Mgt 1a acpi_event Reg Blk */
107     uint32_t pm1b_evt_blk;           /* Port address of Power Mgt 1b acpi_event Reg Blk */
108     uint32_t pm1a_cnt_blk;           /* Port address of Power Mgt 1a Control Reg Blk */
109     uint32_t pm1b_cnt_blk;           /* Port address of Power Mgt 1b Control Reg Blk */
110     uint32_t pm2_cnt_blk;            /* Port address of Power Mgt 2 Control Reg Blk */
111     uint32_t pm_tmr_blk;             /* Port address of Power Mgt Timer Ctrl Reg Blk */
112     uint32_t gpe0_blk;               /* Port addr of General Purpose acpi_event 0 Reg Blk */
113     uint32_t gpe1_blk;               /* Port addr of General Purpose acpi_event 1 Reg Blk */
114     uint8_t  pm1_evt_len;            /* Byte length of ports at pm1_x_evt_blk */
115     uint8_t  pm1_cnt_len;            /* Byte length of ports at pm1_x_cnt_blk */
116     uint8_t  pm2_cnt_len;            /* Byte Length of ports at pm2_cnt_blk */
117     uint8_t  pm_tmr_len;             /* Byte Length of ports at pm_tm_blk */
118     uint8_t  gpe0_blk_len;           /* Byte Length of ports at gpe0_blk */
119     uint8_t  gpe1_blk_len;           /* Byte Length of ports at gpe1_blk */
120     uint8_t  gpe1_base;              /* Offset in gpe model where gpe1 events start */
121     uint8_t  reserved3;              /* Reserved */
122     uint16_t plvl2_lat;              /* Worst case HW latency to enter/exit C2 state */
123     uint16_t plvl3_lat;              /* Worst case HW latency to enter/exit C3 state */
124     uint16_t flush_size;             /* Size of area read to flush caches */
125     uint16_t flush_stride;           /* Stride used in flushing caches */
126     uint8_t  duty_offset;            /* Bit location of duty cycle field in p_cnt reg */
127     uint8_t  duty_width;             /* Bit width of duty cycle field in p_cnt reg */
128     uint8_t  day_alrm;               /* Index to day-of-month alarm in RTC CMOS RAM */
129     uint8_t  mon_alrm;               /* Index to month-of-year alarm in RTC CMOS RAM */
130     uint8_t  century;                /* Index to century in RTC CMOS RAM */
131     uint8_t  reserved4;              /* Reserved */
132     uint8_t  reserved4a;             /* Reserved */
133     uint8_t  reserved4b;             /* Reserved */
134     uint32_t flags;
135 } QEMU_PACKED;
136 typedef struct AcpiFadtDescriptorRev1 AcpiFadtDescriptorRev1;
137 
138 /*
139  * ACPI 1.0 Root System Description Table (RSDT)
140  */
141 struct AcpiRsdtDescriptorRev1
142 {
143     ACPI_TABLE_HEADER_DEF       /* ACPI common table header */
144     uint32_t table_offset_entry[0];  /* Array of pointers to other */
145     /* ACPI tables */
146 } QEMU_PACKED;
147 typedef struct AcpiRsdtDescriptorRev1 AcpiRsdtDescriptorRev1;
148 
149 /*
150  * ACPI 1.0 Firmware ACPI Control Structure (FACS)
151  */
152 struct AcpiFacsDescriptorRev1
153 {
154     uint32_t signature;           /* ACPI Signature */
155     uint32_t length;                 /* Length of structure, in bytes */
156     uint32_t hardware_signature;     /* Hardware configuration signature */
157     uint32_t firmware_waking_vector; /* ACPI OS waking vector */
158     uint32_t global_lock;            /* Global Lock */
159     uint32_t flags;
160     uint8_t  resverved3 [40];        /* Reserved - must be zero */
161 } QEMU_PACKED;
162 typedef struct AcpiFacsDescriptorRev1 AcpiFacsDescriptorRev1;
163 
164 /*
165  * Differentiated System Description Table (DSDT)
166  */
167 
168 /*
169  * MADT values and structures
170  */
171 
172 /* Values for MADT PCATCompat */
173 
174 #define ACPI_DUAL_PIC                0
175 #define ACPI_MULTIPLE_APIC           1
176 
177 /* Master MADT */
178 
179 struct AcpiMultipleApicTable
180 {
181     ACPI_TABLE_HEADER_DEF     /* ACPI common table header */
182     uint32_t local_apic_address;     /* Physical address of local APIC */
183     uint32_t flags;
184 } QEMU_PACKED;
185 typedef struct AcpiMultipleApicTable AcpiMultipleApicTable;
186 
187 /* Values for Type in APIC sub-headers */
188 
189 #define ACPI_APIC_PROCESSOR          0
190 #define ACPI_APIC_IO                 1
191 #define ACPI_APIC_XRUPT_OVERRIDE     2
192 #define ACPI_APIC_NMI                3
193 #define ACPI_APIC_LOCAL_NMI          4
194 #define ACPI_APIC_ADDRESS_OVERRIDE   5
195 #define ACPI_APIC_IO_SAPIC           6
196 #define ACPI_APIC_LOCAL_SAPIC        7
197 #define ACPI_APIC_XRUPT_SOURCE       8
198 #define ACPI_APIC_RESERVED           9           /* 9 and greater are reserved */
199 
200 /*
201  * MADT sub-structures (Follow MULTIPLE_APIC_DESCRIPTION_TABLE)
202  */
203 #define ACPI_SUB_HEADER_DEF   /* Common ACPI sub-structure header */\
204     uint8_t  type;                               \
205     uint8_t  length;
206 
207 /* Sub-structures for MADT */
208 
209 struct AcpiMadtProcessorApic
210 {
211     ACPI_SUB_HEADER_DEF
212     uint8_t  processor_id;           /* ACPI processor id */
213     uint8_t  local_apic_id;          /* Processor's local APIC id */
214     uint32_t flags;
215 } QEMU_PACKED;
216 typedef struct AcpiMadtProcessorApic AcpiMadtProcessorApic;
217 
218 struct AcpiMadtIoApic
219 {
220     ACPI_SUB_HEADER_DEF
221     uint8_t  io_apic_id;             /* I/O APIC ID */
222     uint8_t  reserved;               /* Reserved - must be zero */
223     uint32_t address;                /* APIC physical address */
224     uint32_t interrupt;              /* Global system interrupt where INTI
225                                  * lines start */
226 } QEMU_PACKED;
227 typedef struct AcpiMadtIoApic AcpiMadtIoApic;
228 
229 struct AcpiMadtIntsrcovr {
230     ACPI_SUB_HEADER_DEF
231     uint8_t  bus;
232     uint8_t  source;
233     uint32_t gsi;
234     uint16_t flags;
235 } QEMU_PACKED;
236 typedef struct AcpiMadtIntsrcovr AcpiMadtIntsrcovr;
237 
238 struct AcpiMadtLocalNmi {
239     ACPI_SUB_HEADER_DEF
240     uint8_t  processor_id;           /* ACPI processor id */
241     uint16_t flags;                  /* MPS INTI flags */
242     uint8_t  lint;                   /* Local APIC LINT# */
243 } QEMU_PACKED;
244 typedef struct AcpiMadtLocalNmi AcpiMadtLocalNmi;
245 
246 /*
247  * HPET Description Table
248  */
249 struct Acpi20Hpet {
250     ACPI_TABLE_HEADER_DEF                    /* ACPI common table header */
251     uint32_t           timer_block_id;
252     Acpi20GenericAddress addr;
253     uint8_t            hpet_number;
254     uint16_t           min_tick;
255     uint8_t            page_protect;
256 } QEMU_PACKED;
257 typedef struct Acpi20Hpet Acpi20Hpet;
258 
259 /*
260  * SRAT (NUMA topology description) table
261  */
262 
263 struct AcpiSystemResourceAffinityTable
264 {
265     ACPI_TABLE_HEADER_DEF
266     uint32_t    reserved1;
267     uint32_t    reserved2[2];
268 } QEMU_PACKED;
269 typedef struct AcpiSystemResourceAffinityTable AcpiSystemResourceAffinityTable;
270 
271 #define ACPI_SRAT_PROCESSOR          0
272 #define ACPI_SRAT_MEMORY             1
273 
274 struct AcpiSratProcessorAffinity
275 {
276     ACPI_SUB_HEADER_DEF
277     uint8_t     proximity_lo;
278     uint8_t     local_apic_id;
279     uint32_t    flags;
280     uint8_t     local_sapic_eid;
281     uint8_t     proximity_hi[3];
282     uint32_t    reserved;
283 } QEMU_PACKED;
284 typedef struct AcpiSratProcessorAffinity AcpiSratProcessorAffinity;
285 
286 struct AcpiSratMemoryAffinity
287 {
288     ACPI_SUB_HEADER_DEF
289     uint8_t     proximity[4];
290     uint16_t    reserved1;
291     uint64_t    base_addr;
292     uint64_t    range_length;
293     uint32_t    reserved2;
294     uint32_t    flags;
295     uint32_t    reserved3[2];
296 } QEMU_PACKED;
297 typedef struct AcpiSratMemoryAffinity AcpiSratMemoryAffinity;
298 
299 /* PCI fw r3.0 MCFG table. */
300 /* Subtable */
301 struct AcpiMcfgAllocation {
302     uint64_t address;                /* Base address, processor-relative */
303     uint16_t pci_segment;            /* PCI segment group number */
304     uint8_t start_bus_number;       /* Starting PCI Bus number */
305     uint8_t end_bus_number;         /* Final PCI Bus number */
306     uint32_t reserved;
307 } QEMU_PACKED;
308 typedef struct AcpiMcfgAllocation AcpiMcfgAllocation;
309 
310 struct AcpiTableMcfg {
311     ACPI_TABLE_HEADER_DEF;
312     uint8_t reserved[8];
313     AcpiMcfgAllocation allocation[0];
314 } QEMU_PACKED;
315 typedef struct AcpiTableMcfg AcpiTableMcfg;
316 
317 /*
318  * TCPA Description Table
319  */
320 struct Acpi20Tcpa {
321     ACPI_TABLE_HEADER_DEF                    /* ACPI common table header */
322     uint16_t platform_class;
323     uint32_t log_area_minimum_length;
324     uint64_t log_area_start_address;
325 } QEMU_PACKED;
326 typedef struct Acpi20Tcpa Acpi20Tcpa;
327 
328 /* DMAR - DMA Remapping table r2.2 */
329 struct AcpiTableDmar {
330     ACPI_TABLE_HEADER_DEF
331     uint8_t host_address_width; /* Maximum DMA physical addressability */
332     uint8_t flags;
333     uint8_t reserved[10];
334 } QEMU_PACKED;
335 typedef struct AcpiTableDmar AcpiTableDmar;
336 
337 /* Masks for Flags field above */
338 #define ACPI_DMAR_INTR_REMAP        1
339 #define ACPI_DMAR_X2APIC_OPT_OUT    (1 << 1)
340 
341 /* Values for sub-structure type for DMAR */
342 enum {
343     ACPI_DMAR_TYPE_HARDWARE_UNIT = 0,       /* DRHD */
344     ACPI_DMAR_TYPE_RESERVED_MEMORY = 1,     /* RMRR */
345     ACPI_DMAR_TYPE_ATSR = 2,                /* ATSR */
346     ACPI_DMAR_TYPE_HARDWARE_AFFINITY = 3,   /* RHSR */
347     ACPI_DMAR_TYPE_ANDD = 4,                /* ANDD */
348     ACPI_DMAR_TYPE_RESERVED = 5             /* Reserved for furture use */
349 };
350 
351 /*
352  * Sub-structures for DMAR
353  */
354 /* Type 0: Hardware Unit Definition */
355 struct AcpiDmarHardwareUnit {
356     uint16_t type;
357     uint16_t length;
358     uint8_t flags;
359     uint8_t reserved;
360     uint16_t pci_segment;   /* The PCI Segment associated with this unit */
361     uint64_t address;   /* Base address of remapping hardware register-set */
362 } QEMU_PACKED;
363 typedef struct AcpiDmarHardwareUnit AcpiDmarHardwareUnit;
364 
365 /* Masks for Flags field above */
366 #define ACPI_DMAR_INCLUDE_PCI_ALL   1
367 
368 #endif
369