1 /*
2  * Copyright (C) 2018-2022 Intel Corporation.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef ACPI_H
8 #define ACPI_H
9 
10 #include <board_info.h>
11 
12 #define ACPI_RSDP_CHECKSUM_LENGTH   20U
13 #define ACPI_RSDP_XCHECKSUM_LENGTH  36U
14 
15 #define ACPI_NAME_SIZE              4U
16 #define ACPI_OEM_ID_SIZE            6U
17 #define ACPI_OEM_TABLE_ID_SIZE      8U
18 
19 #define ACPI_MADT_TYPE_LOCAL_APIC   0U
20 #define ACPI_MADT_TYPE_IOAPIC       1U
21 #define ACPI_MADT_ENABLED           1U
22 #define ACPI_MADT_TYPE_LOCAL_APIC_NMI 4U
23 
24 #define ACPI_DMAR_TYPE_HARDWARE_UNIT           0U
25 #define ACPI_DMAR_TYPE_RESERVED_MEMORY           1U
26 #define ACPI_DMAR_TYPE_ROOT_ATS           2U
27 #define ACPI_DMAR_TYPE_HARDWARE_AFFINITY           3U
28 #define ACPI_DMAR_TYPE_NAMESPACE           4U
29 #define ACPI_DMAR_TYPE_RESERVED           5U
30 
31 /* FACP field offsets */
32 #define OFFSET_FACS_ADDR        36U
33 #define OFFSET_RESET_REGISTER   116U
34 #define OFFSET_RESET_VALUE      128U
35 #define OFFSET_FACS_X_ADDR      132U
36 #define OFFSET_PM1A_EVT         148U
37 #define OFFSET_PM1A_CNT         172U
38 
39 /* FACS field offsets */
40 #define OFFSET_FACS_SIGNATURE    0U
41 #define OFFSET_FACS_LENGTH       4U
42 #define OFFSET_WAKE_VECTOR_32    12U
43 #define OFFSET_WAKE_VECTOR_64    24U
44 
45 /* MCFG field offsets */
46 #define OFFSET_MCFG_LENGTH       4U
47 #define OFFSET_MCFG_ENTRY0       44U
48 #define OFFSET_MCFG_ENTRY0_BASE  44U
49 #define OFFSET_MCFG_ENTRY1       60U
50 
51 #define ACPI_SIG_FADT            "FACP" /* Fixed ACPI Description Table */
52 #define ACPI_SIG_FACS             0x53434146U /* "FACS" */
53 #define ACPI_SIG_RSDP            "RSD PTR " /* Root System Description Ptr */
54 #define ACPI_SIG_XSDT            "XSDT"      /* Extended  System Description Table */
55 #define ACPI_SIG_MADT            "APIC" /* Multiple APIC Description Table */
56 #define ACPI_SIG_DMAR            "DMAR"
57 #define ACPI_SIG_MCFG            "MCFG" /* Memory Mapped Configuration table */
58 #define ACPI_SIG_DSDT            "DSDT" /* Differentiated System Description Table */
59 #define ACPI_SIG_TPM2            "TPM2" /* Trusted Platform Module hardware interface table */
60 #define ACPI_SIG_RTCT            "PTCT" /* Platform Tuning Configuration Table (Real-Time Configuration Table) */
61 #define ACPI_SIG_RTCT_V2         "RTCT" /* Platform Tuning Configuration Table (Real-Time Configuration Table) V2 */
62 #define ACPI_SIG_HPET            "HPET" /* High Precision Event Timer table */
63 
64 struct packed_gas {
65 	uint8_t 	space_id;
66 	uint8_t 	bit_width;
67 	uint8_t 	bit_offset;
68 	uint8_t 	access_size;
69 	uint64_t	address;
70 } __packed;
71 
72 struct acpi_table_header {
73 	/* ASCII table signature */
74 	char                    signature[4];
75 	/* Length of table in bytes, including this header */
76 	uint32_t                length;
77 	/* ACPI Specification minor version number */
78 	uint8_t                 revision;
79 	/* To make sum of entire table == 0 */
80 	uint8_t                 checksum;
81 	/* ASCII OEM identification */
82 	char                    oem_id[6];
83 	/* ASCII OEM table identification */
84 	char                    oem_table_id[8];
85 	/* OEM revision number */
86 	uint32_t                oem_revision;
87 	/* ASCII ASL compiler vendor ID */
88 	char                    asl_compiler_id[4];
89 	/* ASL compiler version */
90 	uint32_t                asl_compiler_revision;
91 } __packed;
92 
93 struct acpi_table_rsdp {
94 	/* ACPI signature, contains "RSD PTR " */
95 	char                    signature[8];
96 	/* ACPI 1.0 checksum */
97 	uint8_t                 checksum;
98 	/* OEM identification */
99 	char                    oem_id[ACPI_OEM_ID_SIZE];
100 	/* Must be (0) for ACPI 1.0 or (2) for ACPI 2.0+ */
101 	uint8_t                 revision;
102 	/* 32-bit physical address of the RSDT */
103 	uint32_t                rsdt_physical_address;
104 	/* Table length in bytes, including header (ACPI 2.0+) */
105 	uint32_t                length;
106 	/* 64-bit physical address of the XSDT (ACPI 2.0+) */
107 	uint64_t                xsdt_physical_address;
108 	/* Checksum of entire table (ACPI 2.0+) */
109 	uint8_t                 extended_checksum;
110 	/* Reserved, must be zero */
111 	uint8_t                 reserved[3];
112 } __packed;
113 
114 struct acpi_table_rsdt {
115 	/* Common ACPI table header */
116 	struct acpi_table_header   header;
117 	/* Array of pointers to ACPI tables */
118 	uint32_t                   table_offset_entry[1];
119 } __packed;
120 
121 struct acpi_table_xsdt {
122 	/* Common ACPI table header */
123 	struct acpi_table_header    header;
124 	/* Array of pointers to ACPI tables */
125 	uint64_t                    table_offset_entry[1];
126 } __packed;
127 
128 struct acpi_table_fadt {
129 	struct acpi_table_header header;/* Common ACPI table header */
130 	uint32_t facs;			/* 32-bit physical address of FACS */
131 	uint32_t dsdt;			/* 32-bit physical address of DSDT */
132 	uint8_t unused0[12];		/* ACRN doesn't use these fields */
133 	uint32_t pm1a_event_block;	/* 32-bit port address of Power Mgt 1a Event Reg Blk */
134 	uint32_t pm1b_event_block;	/* 32-bit port address of Power Mgt 1b Event Reg Blk */
135 	uint32_t pm1a_control_block;	/* 32-bit port address of Power Mgt 1a Control Reg Blk */
136 	uint32_t pm1b_control_block;	/* 32-bit port address of Power Mgt 1b Control Reg Blk */
137 	uint8_t unused1[16];		/* ACRN doesn't use these fields */
138 	uint8_t pm1_event_length;	/* Byte Length of ports at pm1x_event_block */
139 	uint8_t pm1_control_length;	/* Byte Length of ports at pm1x_control_block */
140 	uint8_t unused2[22];		/* ACRN doesn't use these fields */
141 	uint32_t flags;			/* Miscellaneous flag bits (see below for individual flags) */
142 	uint8_t unused3[128];		/* ACRN doesn't use these fields */
143 } __packed;
144 
145 struct acpi_table_mcfg {
146 	struct acpi_table_header header;	/* Common ACPI table header */
147 	uint8_t reserved[8];
148 } __packed;
149 
150 struct acpi_mcfg_allocation {
151 	uint64_t address;		/* Base address, processor-relative */
152 	uint16_t pci_segment;		/* PCI segment group number */
153 	uint8_t start_bus_number;	/* Starting PCI Bus number */
154 	uint8_t end_bus_number;		/* Final PCI Bus number */
155 	uint32_t reserved;
156 } __packed;
157 
158 struct acpi_table_madt {
159 	/* Common ACPI table header */
160 	struct acpi_table_header     header;
161 	/* Physical address of local APIC */
162 	uint32_t                     address;
163 	uint32_t                     flags;
164 } __packed;
165 
166 struct acpi_subtable_header {
167 	uint8_t                   type;
168 	uint8_t                   length;
169 } __packed;
170 
171 struct acpi_madt_local_apic {
172 	struct acpi_subtable_header    header;
173 	/* ACPI processor id */
174 	uint8_t                        processor_id;
175 	/* Processor's local APIC id */
176 	uint8_t                        id;
177 	uint32_t                       lapic_flags;
178 } __packed;
179 
180 struct acpi_madt_local_apic_nmi {
181 	struct acpi_subtable_header    header;
182 	uint8_t                   processor_id;
183 	uint16_t                  flags;
184 	uint8_t                   lint;
185 } __packed;
186 
187 struct acpi_madt_ioapic {
188 	struct acpi_subtable_header    header;
189 	/* IOAPIC id */
190 	uint8_t   id;
191 	uint8_t   rsvd;
192 	uint32_t  addr;
193 	uint32_t  gsi_base;
194 } __packed;
195 
196 struct acpi_table_dmar {
197 	/* Common ACPI table header */
198 	struct acpi_table_header  header;
199 	/* Host address Width */
200 	uint8_t                   width;
201 	uint8_t                   flags;
202 	uint8_t                   reserved[10];
203 } __packed;
204 
205 /* DMAR subtable header */
206 struct acpi_dmar_header {
207 	uint16_t                  type;
208 	uint16_t                  length;
209 } __packed;
210 
211 struct acpi_dmar_hardware_unit {
212 	struct acpi_dmar_header   header;
213 	uint8_t                   flags;
214 	uint8_t                   reserved;
215 	uint16_t                  segment;
216 	/* register base address */
217 	uint64_t                  address;
218 } __packed;
219 
220 struct acpi_dmar_pci_path {
221 	uint8_t                   device;
222 	uint8_t                   function;
223 } __packed;
224 
225 struct acpi_dmar_device_scope {
226 	uint8_t                   entry_type;
227 	uint8_t                   length;
228 	uint16_t                  reserved;
229 	uint8_t                   enumeration_id;
230 	uint8_t                   bus;
231 } __packed;
232 
233 struct acpi_table_tpm2 {
234 	struct acpi_table_header header;
235 	uint16_t platform_class;
236 	uint16_t reserved;
237 	uint64_t control_address;
238 	uint32_t start_method;
239 #ifdef CONFIG_SECURITY_VM_FIXUP
240 	uint8_t start_method_spec_para[12];
241 	uint32_t laml;
242 	uint64_t lasa;
243 #endif
244 } __packed;
245 
246 struct acpi_table_hpet {
247 	struct acpi_table_header header;
248 	uint32_t id;
249 	struct packed_gas address;
250 	uint8_t sequence;
251 	uint16_t minimum_tick;
252 	uint8_t flags;
253 } __packed;
254 
255 void init_acpi(void);
256 void *get_acpi_tbl(const char *signature);
257 
258 struct ioapic_info;
259 uint16_t parse_madt(uint32_t lapic_id_array[MAX_PCPU_NUM]);
260 uint8_t parse_madt_ioapic(struct ioapic_info *ioapic_id_array);
261 void *parse_hpet(void);
262 
263 #ifdef CONFIG_ACPI_PARSE_ENABLED
264 int32_t acpi_fixup(void);
265 #endif
266 
267 #endif /* !ACPI_H */
268