acpi.c revision 1.29.2.4 1 1.29.2.4 pgoyette /* $NetBSD: acpi.c,v 1.29.2.4 2019/01/18 08:51:02 pgoyette Exp $ */
2 1.1 christos
3 1.1 christos /*-
4 1.1 christos * Copyright (c) 1998 Doug Rabson
5 1.1 christos * Copyright (c) 2000 Mitsuru IWASAKI <iwasaki (at) FreeBSD.org>
6 1.1 christos * All rights reserved.
7 1.1 christos *
8 1.1 christos * Redistribution and use in source and binary forms, with or without
9 1.1 christos * modification, are permitted provided that the following conditions
10 1.1 christos * are met:
11 1.1 christos * 1. Redistributions of source code must retain the above copyright
12 1.1 christos * notice, this list of conditions and the following disclaimer.
13 1.1 christos * 2. Redistributions in binary form must reproduce the above copyright
14 1.1 christos * notice, this list of conditions and the following disclaimer in the
15 1.1 christos * documentation and/or other materials provided with the distribution.
16 1.1 christos *
17 1.1 christos * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 1.1 christos * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 1.1 christos * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 1.1 christos * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 1.1 christos * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 1.1 christos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 1.1 christos * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 1.1 christos * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 1.1 christos * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 1.1 christos * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 1.1 christos * SUCH DAMAGE.
28 1.1 christos *
29 1.16 msaitoh * $FreeBSD: head/usr.sbin/acpi/acpidump/acpi.c 321299 2017-07-20 17:36:17Z emaste $
30 1.1 christos */
31 1.1 christos
32 1.5 cegger #include <sys/cdefs.h>
33 1.29.2.4 pgoyette __RCSID("$NetBSD: acpi.c,v 1.29.2.4 2019/01/18 08:51:02 pgoyette Exp $");
34 1.5 cegger
35 1.5 cegger #include <sys/param.h>
36 1.5 cegger #include <sys/endian.h>
37 1.5 cegger #include <sys/stat.h>
38 1.5 cegger #include <sys/wait.h>
39 1.5 cegger #include <assert.h>
40 1.5 cegger #include <err.h>
41 1.5 cegger #include <fcntl.h>
42 1.5 cegger #include <paths.h>
43 1.29.2.2 pgoyette #include <stdbool.h>
44 1.5 cegger #include <stdio.h>
45 1.5 cegger #include <stdint.h>
46 1.5 cegger #include <stdlib.h>
47 1.5 cegger #include <string.h>
48 1.5 cegger #include <unistd.h>
49 1.5 cegger #include <stddef.h>
50 1.19 msaitoh #include <uuid.h>
51 1.5 cegger
52 1.5 cegger #include "acpidump.h"
53 1.5 cegger
54 1.5 cegger #define BEGIN_COMMENT "/*\n"
55 1.5 cegger #define END_COMMENT " */\n"
56 1.5 cegger
57 1.29.2.2 pgoyette /* Commonly used helper functions */
58 1.5 cegger static void acpi_print_string(char *s, size_t length);
59 1.29.2.2 pgoyette static void acpi_print_tabs(unsigned int n);
60 1.29.2.2 pgoyette static void acpi_dump_bytes(uint8_t *p, uint32_t len, unsigned int ntabs);
61 1.29.2.2 pgoyette static void acpi_dump_table(ACPI_TABLE_HEADER *sdp);
62 1.5 cegger static void acpi_print_gas(ACPI_GENERIC_ADDRESS *gas);
63 1.5 cegger static void acpi_print_pci(uint16_t vendorid, uint16_t deviceid,
64 1.5 cegger uint8_t seg, uint8_t bus, uint8_t device, uint8_t func);
65 1.22 msaitoh static void acpi_print_pci_sbdf(uint8_t seg, uint8_t bus, uint8_t device,
66 1.5 cegger uint8_t func);
67 1.5 cegger #ifdef notyet
68 1.5 cegger static void acpi_print_hest_generic_status(ACPI_HEST_GENERIC_STATUS *);
69 1.5 cegger static void acpi_print_hest_generic_data(ACPI_HEST_GENERIC_DATA *);
70 1.5 cegger #endif
71 1.5 cegger static void acpi_print_whea(ACPI_WHEA_HEADER *whea,
72 1.5 cegger void (*print_action)(ACPI_WHEA_HEADER *),
73 1.5 cegger void (*print_ins)(ACPI_WHEA_HEADER *),
74 1.5 cegger void (*print_flags)(ACPI_WHEA_HEADER *));
75 1.18 msaitoh static uint64_t acpi_select_address(uint32_t, uint64_t);
76 1.29.2.2 pgoyette
77 1.29.2.2 pgoyette /* Handlers for each table */
78 1.5 cegger static void acpi_handle_fadt(ACPI_TABLE_HEADER *fadt);
79 1.5 cegger static void acpi_print_cpu(u_char cpu_id);
80 1.5 cegger static void acpi_print_cpu_uid(uint32_t uid, char *uid_string);
81 1.5 cegger static void acpi_print_local_apic(uint32_t apic_id, uint32_t flags);
82 1.5 cegger static void acpi_print_io_apic(uint32_t apic_id, uint32_t int_base,
83 1.5 cegger uint64_t apic_addr);
84 1.5 cegger static void acpi_print_mps_flags(uint16_t flags);
85 1.5 cegger static void acpi_print_intr(uint32_t intr, uint16_t mps_flags);
86 1.5 cegger static void acpi_print_local_nmi(u_int lint, uint16_t mps_flags);
87 1.5 cegger static void acpi_print_madt(ACPI_SUBTABLE_HEADER *mp);
88 1.5 cegger static void acpi_handle_bert(ACPI_TABLE_HEADER *sdp);
89 1.29.2.2 pgoyette static void acpi_handle_bgrt(ACPI_TABLE_HEADER *sdp);
90 1.5 cegger static void acpi_handle_boot(ACPI_TABLE_HEADER *sdp);
91 1.5 cegger static void acpi_handle_cpep(ACPI_TABLE_HEADER *sdp);
92 1.29.2.2 pgoyette static void acpi_handle_csrt(ACPI_TABLE_HEADER *sdp);
93 1.5 cegger static void acpi_handle_dbgp(ACPI_TABLE_HEADER *sdp);
94 1.22 msaitoh static void acpi_handle_dbg2(ACPI_TABLE_HEADER *sdp);
95 1.5 cegger static void acpi_handle_einj(ACPI_TABLE_HEADER *sdp);
96 1.5 cegger static void acpi_handle_erst(ACPI_TABLE_HEADER *sdp);
97 1.29.2.1 pgoyette static void acpi_handle_gtdt(ACPI_TABLE_HEADER *sdp);
98 1.5 cegger static void acpi_handle_hest(ACPI_TABLE_HEADER *sdp);
99 1.29.2.3 pgoyette static void acpi_handle_iort(ACPI_TABLE_HEADER *sdp);
100 1.29.2.1 pgoyette static void acpi_handle_lpit(ACPI_TABLE_HEADER *sdp);
101 1.5 cegger static void acpi_handle_madt(ACPI_TABLE_HEADER *sdp);
102 1.5 cegger static void acpi_handle_msct(ACPI_TABLE_HEADER *sdp);
103 1.5 cegger static void acpi_handle_ecdt(ACPI_TABLE_HEADER *sdp);
104 1.5 cegger static void acpi_handle_hpet(ACPI_TABLE_HEADER *sdp);
105 1.5 cegger static void acpi_handle_mcfg(ACPI_TABLE_HEADER *sdp);
106 1.29.2.1 pgoyette static void acpi_handle_pptt(ACPI_TABLE_HEADER *sdp);
107 1.5 cegger static void acpi_handle_sbst(ACPI_TABLE_HEADER *sdp);
108 1.5 cegger static void acpi_handle_slit(ACPI_TABLE_HEADER *sdp);
109 1.5 cegger static void acpi_handle_spcr(ACPI_TABLE_HEADER *sdp);
110 1.22 msaitoh static void acpi_handle_spmi(ACPI_TABLE_HEADER *sdp);
111 1.27 msaitoh static void acpi_print_srat_cpu(uint8_t type, uint32_t apic_id,
112 1.5 cegger uint32_t proximity_domain,
113 1.27 msaitoh uint32_t flags, uint32_t clockdomain, uint8_t sapic_eid);
114 1.5 cegger static void acpi_print_srat_memory(ACPI_SRAT_MEM_AFFINITY *mp);
115 1.5 cegger static void acpi_print_srat(ACPI_SUBTABLE_HEADER *srat);
116 1.5 cegger static void acpi_handle_srat(ACPI_TABLE_HEADER *sdp);
117 1.5 cegger static void acpi_handle_tcpa(ACPI_TABLE_HEADER *sdp);
118 1.19 msaitoh static void acpi_print_nfit(ACPI_NFIT_HEADER *nfit);
119 1.19 msaitoh static void acpi_handle_nfit(ACPI_TABLE_HEADER *sdp);
120 1.22 msaitoh static void acpi_handle_uefi(ACPI_TABLE_HEADER *sdp);
121 1.5 cegger static void acpi_handle_waet(ACPI_TABLE_HEADER *sdp);
122 1.5 cegger static void acpi_handle_wdat(ACPI_TABLE_HEADER *sdp);
123 1.22 msaitoh static void acpi_handle_wddt(ACPI_TABLE_HEADER *sdp);
124 1.5 cegger static void acpi_handle_wdrt(ACPI_TABLE_HEADER *sdp);
125 1.5 cegger static void acpi_print_sdt(ACPI_TABLE_HEADER *sdp);
126 1.5 cegger static void acpi_print_fadt(ACPI_TABLE_HEADER *sdp);
127 1.5 cegger static void acpi_print_facs(ACPI_TABLE_FACS *facs);
128 1.5 cegger static void acpi_print_dsdt(ACPI_TABLE_HEADER *dsdp);
129 1.5 cegger static ACPI_TABLE_HEADER *acpi_map_sdt(vm_offset_t pa);
130 1.5 cegger static void acpi_print_rsd_ptr(ACPI_TABLE_RSDP *rp);
131 1.5 cegger static void acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp);
132 1.5 cegger static void acpi_walk_subtables(ACPI_TABLE_HEADER *table, void *first,
133 1.5 cegger void (*action)(ACPI_SUBTABLE_HEADER *));
134 1.19 msaitoh static void acpi_walk_nfit(ACPI_TABLE_HEADER *table, void *first,
135 1.19 msaitoh void (*action)(ACPI_NFIT_HEADER *));
136 1.5 cegger
137 1.5 cegger /* Size of an address. 32-bit for ACPI 1.0, 64-bit for ACPI 2.0 and up. */
138 1.5 cegger static int addr_size;
139 1.5 cegger
140 1.16 msaitoh /* Strings used in the TCPA table */
141 1.16 msaitoh static const char *tcpa_event_type_strings[] = {
142 1.16 msaitoh "PREBOOT Certificate",
143 1.16 msaitoh "POST Code",
144 1.16 msaitoh "Unused",
145 1.16 msaitoh "No Action",
146 1.16 msaitoh "Separator",
147 1.16 msaitoh "Action",
148 1.16 msaitoh "Event Tag",
149 1.16 msaitoh "S-CRTM Contents",
150 1.16 msaitoh "S-CRTM Version",
151 1.16 msaitoh "CPU Microcode",
152 1.16 msaitoh "Platform Config Flags",
153 1.16 msaitoh "Table of Devices",
154 1.16 msaitoh "Compact Hash",
155 1.16 msaitoh "IPL",
156 1.16 msaitoh "IPL Partition Data",
157 1.16 msaitoh "Non-Host Code",
158 1.16 msaitoh "Non-Host Config",
159 1.16 msaitoh "Non-Host Info"
160 1.16 msaitoh };
161 1.16 msaitoh
162 1.16 msaitoh static const char *TCPA_pcclient_strings[] = {
163 1.16 msaitoh "<undefined>",
164 1.16 msaitoh "SMBIOS",
165 1.16 msaitoh "BIS Certificate",
166 1.16 msaitoh "POST BIOS ROM Strings",
167 1.16 msaitoh "ESCD",
168 1.16 msaitoh "CMOS",
169 1.16 msaitoh "NVRAM",
170 1.16 msaitoh "Option ROM Execute",
171 1.16 msaitoh "Option ROM Configurateion",
172 1.16 msaitoh "<undefined>",
173 1.16 msaitoh "Option ROM Microcode Update ",
174 1.16 msaitoh "S-CRTM Version String",
175 1.16 msaitoh "S-CRTM Contents",
176 1.16 msaitoh "POST Contents",
177 1.16 msaitoh "Table of Devices",
178 1.16 msaitoh };
179 1.16 msaitoh
180 1.16 msaitoh #define PRINTFLAG_END() printflag_end()
181 1.16 msaitoh
182 1.16 msaitoh static char pf_sep = '{';
183 1.16 msaitoh
184 1.16 msaitoh static void
185 1.16 msaitoh printflag_end(void)
186 1.16 msaitoh {
187 1.16 msaitoh
188 1.21 msaitoh if (pf_sep == ',') {
189 1.16 msaitoh printf("}");
190 1.21 msaitoh } else if (pf_sep == '{') {
191 1.21 msaitoh printf("{}");
192 1.16 msaitoh }
193 1.21 msaitoh pf_sep = '{';
194 1.16 msaitoh printf("\n");
195 1.16 msaitoh }
196 1.16 msaitoh
197 1.16 msaitoh static void
198 1.16 msaitoh printflag(uint64_t var, uint64_t mask, const char *name)
199 1.16 msaitoh {
200 1.16 msaitoh
201 1.16 msaitoh if (var & mask) {
202 1.16 msaitoh printf("%c%s", pf_sep, name);
203 1.16 msaitoh pf_sep = ',';
204 1.16 msaitoh }
205 1.16 msaitoh }
206 1.16 msaitoh
207 1.5 cegger static void
208 1.5 cegger acpi_print_string(char *s, size_t length)
209 1.5 cegger {
210 1.5 cegger int c;
211 1.5 cegger
212 1.5 cegger /* Trim trailing spaces and NULLs */
213 1.5 cegger while (length > 0 && (s[length - 1] == ' ' || s[length - 1] == '\0'))
214 1.5 cegger length--;
215 1.5 cegger
216 1.5 cegger while (length--) {
217 1.5 cegger c = *s++;
218 1.29.2.4 pgoyette if (c == '\0')
219 1.29.2.4 pgoyette return;
220 1.5 cegger putchar(c);
221 1.5 cegger }
222 1.5 cegger }
223 1.5 cegger
224 1.5 cegger static void
225 1.5 cegger acpi_print_gas(ACPI_GENERIC_ADDRESS *gas)
226 1.5 cegger {
227 1.27 msaitoh switch (gas->SpaceId) {
228 1.26 msaitoh case ACPI_ADR_SPACE_SYSTEM_MEMORY:
229 1.16 msaitoh if (gas->BitWidth <= 32)
230 1.16 msaitoh printf("0x%08x:%u[%u] (Memory)",
231 1.16 msaitoh (u_int)gas->Address, gas->BitOffset,
232 1.16 msaitoh gas->BitWidth);
233 1.16 msaitoh else
234 1.16 msaitoh printf("0x%016jx:%u[%u] (Memory)",
235 1.16 msaitoh (uintmax_t)gas->Address, gas->BitOffset,
236 1.16 msaitoh gas->BitWidth);
237 1.5 cegger break;
238 1.26 msaitoh case ACPI_ADR_SPACE_SYSTEM_IO:
239 1.16 msaitoh printf("0x%02x:%u[%u] (IO)", (u_int)gas->Address,
240 1.16 msaitoh gas->BitOffset, gas->BitWidth);
241 1.5 cegger break;
242 1.26 msaitoh case ACPI_ADR_SPACE_PCI_CONFIG:
243 1.5 cegger printf("%x:%x+0x%x (PCI)", (uint16_t)(gas->Address >> 32),
244 1.5 cegger (uint16_t)((gas->Address >> 16) & 0xffff),
245 1.5 cegger (uint16_t)gas->Address);
246 1.5 cegger break;
247 1.5 cegger /* XXX How to handle these below? */
248 1.26 msaitoh case ACPI_ADR_SPACE_EC:
249 1.5 cegger printf("0x%x:%u[%u] (EC)", (uint16_t)gas->Address,
250 1.5 cegger gas->BitOffset, gas->BitWidth);
251 1.5 cegger break;
252 1.26 msaitoh case ACPI_ADR_SPACE_SMBUS:
253 1.5 cegger printf("0x%x:%u[%u] (SMBus)", (uint16_t)gas->Address,
254 1.5 cegger gas->BitOffset, gas->BitWidth);
255 1.5 cegger break;
256 1.26 msaitoh case ACPI_ADR_SPACE_CMOS:
257 1.26 msaitoh case ACPI_ADR_SPACE_PCI_BAR_TARGET:
258 1.26 msaitoh case ACPI_ADR_SPACE_IPMI:
259 1.26 msaitoh case ACPI_ADR_SPACE_GPIO:
260 1.26 msaitoh case ACPI_ADR_SPACE_GSBUS:
261 1.26 msaitoh case ACPI_ADR_SPACE_PLATFORM_COMM:
262 1.26 msaitoh case ACPI_ADR_SPACE_FIXED_HARDWARE:
263 1.5 cegger default:
264 1.24 msaitoh printf("0x%016jx (SpaceID=%hhu)", (uintmax_t)gas->Address,
265 1.24 msaitoh gas->SpaceId);
266 1.5 cegger break;
267 1.5 cegger }
268 1.5 cegger }
269 1.5 cegger
270 1.5 cegger static void
271 1.5 cegger acpi_print_pci(uint16_t vendorid, uint16_t deviceid,
272 1.5 cegger uint8_t seg, uint8_t bus, uint8_t device, uint8_t func)
273 1.5 cegger {
274 1.5 cegger if (vendorid == 0xffff && deviceid == 0xffff) {
275 1.5 cegger printf("\tPCI Device=NONE\n");
276 1.5 cegger return;
277 1.5 cegger }
278 1.5 cegger
279 1.5 cegger printf("\tPCI device={\n");
280 1.5 cegger printf("\t\tVendor=0x%x\n", vendorid);
281 1.5 cegger printf("\t\tDevice=0x%x\n", deviceid);
282 1.5 cegger printf("\n");
283 1.5 cegger printf("\t\tSegment Group=%d\n", seg);
284 1.5 cegger printf("\t\tBus=%d\n", bus);
285 1.5 cegger printf("\t\tDevice=%d\n", device);
286 1.5 cegger printf("\t\tFunction=%d\n", func);
287 1.5 cegger printf("\t}\n");
288 1.5 cegger }
289 1.5 cegger
290 1.5 cegger static void
291 1.22 msaitoh acpi_print_pci_sbdf(uint8_t seg, uint8_t bus, uint8_t device, uint8_t func)
292 1.5 cegger {
293 1.5 cegger if (bus == 0xff && device == 0xff && func == 0xff) {
294 1.5 cegger printf("\tPCI Device=NONE\n");
295 1.5 cegger return;
296 1.5 cegger }
297 1.5 cegger
298 1.5 cegger printf("\tPCI device={\n");
299 1.5 cegger printf("\t\tSegment Group=%d\n", seg);
300 1.5 cegger printf("\t\tBus=%d\n", bus);
301 1.5 cegger printf("\t\tDevice=%d\n", device);
302 1.5 cegger printf("\t\tFunction=%d\n", func);
303 1.5 cegger printf("\t}\n");
304 1.5 cegger }
305 1.5 cegger
306 1.5 cegger #ifdef notyet
307 1.5 cegger static void
308 1.5 cegger acpi_print_hest_errorseverity(uint32_t error)
309 1.5 cegger {
310 1.5 cegger printf("\tError Severity={ ");
311 1.5 cegger switch (error) {
312 1.5 cegger case 0:
313 1.5 cegger printf("Recoverable");
314 1.5 cegger break;
315 1.5 cegger case 1:
316 1.5 cegger printf("Fatal");
317 1.5 cegger break;
318 1.5 cegger case 2:
319 1.5 cegger printf("Corrected");
320 1.5 cegger break;
321 1.5 cegger case 3:
322 1.5 cegger printf("None");
323 1.5 cegger break;
324 1.5 cegger default:
325 1.5 cegger printf("%d (reserved)", error);
326 1.5 cegger break;
327 1.5 cegger }
328 1.5 cegger printf("}\n");
329 1.5 cegger }
330 1.5 cegger #endif
331 1.5 cegger
332 1.5 cegger static void
333 1.5 cegger acpi_print_hest_errorbank(ACPI_HEST_IA_ERROR_BANK *bank)
334 1.5 cegger {
335 1.5 cegger printf("\n");
336 1.5 cegger printf("\tBank Number=%d\n", bank->BankNumber);
337 1.25 msaitoh printf("\tClear Status On Init={%s}\n",
338 1.5 cegger bank->ClearStatusOnInit ? "NO" : "YES");
339 1.5 cegger printf("\tStatus Data Format={ ");
340 1.5 cegger switch (bank->StatusFormat) {
341 1.5 cegger case 0:
342 1.5 cegger printf("IA32 MCA");
343 1.5 cegger break;
344 1.5 cegger case 1:
345 1.5 cegger printf("EMT64 MCA");
346 1.5 cegger break;
347 1.5 cegger case 2:
348 1.5 cegger printf("AMD64 MCA");
349 1.5 cegger break;
350 1.5 cegger }
351 1.5 cegger printf(" }\n");
352 1.5 cegger
353 1.5 cegger if (bank->ControlRegister)
354 1.5 cegger printf("\tControl Register=0x%x\n", bank->ControlRegister);
355 1.5 cegger printf("\tControl Init Data=0x%"PRIx64"\n", bank->ControlData);
356 1.5 cegger printf("\tStatus MSR=0x%x\n", bank->StatusRegister);
357 1.5 cegger printf("\tAddress MSR=0x%x\n", bank->AddressRegister);
358 1.5 cegger printf("\tMisc MSR=0x%x\n", bank->MiscRegister);
359 1.5 cegger }
360 1.5 cegger
361 1.5 cegger static void
362 1.5 cegger acpi_print_hest_header(ACPI_HEST_HEADER *hest)
363 1.5 cegger {
364 1.25 msaitoh printf("\tType={");
365 1.5 cegger switch (hest->Type) {
366 1.5 cegger case ACPI_HEST_TYPE_IA32_CHECK:
367 1.5 cegger printf("IA32 Machine Check Exception");
368 1.5 cegger break;
369 1.5 cegger case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
370 1.25 msaitoh printf("IA32 Corrected Machine Check");
371 1.5 cegger break;
372 1.5 cegger case ACPI_HEST_TYPE_IA32_NMI:
373 1.25 msaitoh printf("IA32 Non-Maskable Interrupt");
374 1.5 cegger break;
375 1.5 cegger case ACPI_HEST_TYPE_NOT_USED3:
376 1.5 cegger case ACPI_HEST_TYPE_NOT_USED4:
377 1.5 cegger case ACPI_HEST_TYPE_NOT_USED5:
378 1.25 msaitoh printf("unused type: %d", hest->Type);
379 1.5 cegger break;
380 1.5 cegger case ACPI_HEST_TYPE_AER_ROOT_PORT:
381 1.25 msaitoh printf("PCI Express Root Port AER");
382 1.5 cegger break;
383 1.5 cegger case ACPI_HEST_TYPE_AER_ENDPOINT:
384 1.25 msaitoh printf("PCI Express Endpoint AER");
385 1.5 cegger break;
386 1.5 cegger case ACPI_HEST_TYPE_AER_BRIDGE:
387 1.25 msaitoh printf("PCI Express/PCI-X Bridge AER");
388 1.5 cegger break;
389 1.5 cegger case ACPI_HEST_TYPE_GENERIC_ERROR:
390 1.25 msaitoh printf("Generic Hardware Error Source");
391 1.5 cegger break;
392 1.19 msaitoh case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
393 1.25 msaitoh printf("Generic Hardware Error Source version 2");
394 1.19 msaitoh break;
395 1.5 cegger case ACPI_HEST_TYPE_RESERVED:
396 1.5 cegger default:
397 1.25 msaitoh printf("Reserved (%d)", hest->Type);
398 1.5 cegger break;
399 1.5 cegger }
400 1.25 msaitoh printf("}\n");
401 1.5 cegger printf("\tSourceId=%d\n", hest->SourceId);
402 1.5 cegger }
403 1.5 cegger
404 1.5 cegger static void
405 1.5 cegger acpi_print_hest_aer_common(ACPI_HEST_AER_COMMON *data)
406 1.5 cegger {
407 1.29 msaitoh
408 1.29 msaitoh #define PRINTFLAG(var, flag) printflag((var), ACPI_HEST_## flag, #flag)
409 1.29 msaitoh
410 1.29 msaitoh printf("\tFlags=");
411 1.29 msaitoh PRINTFLAG(data->Flags, FIRMWARE_FIRST);
412 1.29 msaitoh PRINTFLAG(data->Flags, GLOBAL);
413 1.29 msaitoh PRINTFLAG(data->Flags, GHES_ASSIST);
414 1.29 msaitoh PRINTFLAG_END();
415 1.29 msaitoh
416 1.29 msaitoh #undef PRINTFLAG
417 1.29 msaitoh
418 1.5 cegger printf("\tEnabled={ %s ", data->Flags ? "YES" : "NO");
419 1.5 cegger if (data->Flags & ACPI_HEST_FIRMWARE_FIRST)
420 1.5 cegger printf("(ignored) ");
421 1.5 cegger printf("}\n");
422 1.5 cegger printf("\tNumber of Record to pre-allocate=%d\n",
423 1.5 cegger data->RecordsToPreallocate);
424 1.5 cegger printf("\tMax. Sections per Record=%d\n", data->MaxSectionsPerRecord);
425 1.5 cegger if (!(data->Flags & ACPI_HEST_GLOBAL))
426 1.22 msaitoh acpi_print_pci_sbdf(0, data->Bus, data->Device, data->Function);
427 1.5 cegger printf("\tDevice Control=0x%x\n", data->DeviceControl);
428 1.5 cegger printf("\tUncorrectable Error Mask Register=0x%x\n",
429 1.5 cegger data->UncorrectableMask);
430 1.5 cegger printf("\tUncorrectable Error Severity Register=0x%x\n",
431 1.5 cegger data->UncorrectableSeverity);
432 1.5 cegger printf("\tCorrectable Error Mask Register=0x%x\n",
433 1.5 cegger data->CorrectableMask);
434 1.5 cegger printf("\tAdvanced Capabilities Register=0x%x\n",
435 1.5 cegger data->AdvancedCapabilities);
436 1.5 cegger }
437 1.5 cegger
438 1.5 cegger static void
439 1.5 cegger acpi_print_hest_notify(ACPI_HEST_NOTIFY *notify)
440 1.5 cegger {
441 1.5 cegger printf("\tHW Error Notification={\n");
442 1.25 msaitoh printf("\t\tType={");
443 1.5 cegger switch (notify->Type) {
444 1.5 cegger case ACPI_HEST_NOTIFY_POLLED:
445 1.5 cegger printf("POLLED");
446 1.5 cegger break;
447 1.5 cegger case ACPI_HEST_NOTIFY_EXTERNAL:
448 1.5 cegger printf("EXTERN");
449 1.5 cegger break;
450 1.5 cegger case ACPI_HEST_NOTIFY_LOCAL:
451 1.5 cegger printf("LOCAL");
452 1.5 cegger break;
453 1.5 cegger case ACPI_HEST_NOTIFY_SCI:
454 1.5 cegger printf("SCI");
455 1.5 cegger break;
456 1.5 cegger case ACPI_HEST_NOTIFY_NMI:
457 1.5 cegger printf("NMI");
458 1.5 cegger break;
459 1.19 msaitoh case ACPI_HEST_NOTIFY_CMCI:
460 1.19 msaitoh printf("CMCI");
461 1.19 msaitoh break;
462 1.19 msaitoh case ACPI_HEST_NOTIFY_MCE:
463 1.19 msaitoh printf("MCE");
464 1.19 msaitoh break;
465 1.19 msaitoh case ACPI_HEST_NOTIFY_GPIO:
466 1.19 msaitoh printf("GPIO-Signal");
467 1.19 msaitoh break;
468 1.19 msaitoh case ACPI_HEST_NOTIFY_SEA:
469 1.19 msaitoh printf("ARMv8 SEA");
470 1.19 msaitoh break;
471 1.19 msaitoh case ACPI_HEST_NOTIFY_SEI:
472 1.19 msaitoh printf("ARMv8 SEI");
473 1.19 msaitoh break;
474 1.19 msaitoh case ACPI_HEST_NOTIFY_GSIV:
475 1.19 msaitoh printf("External Interrupt - GSIV");
476 1.19 msaitoh break;
477 1.5 cegger case ACPI_HEST_NOTIFY_RESERVED:
478 1.5 cegger printf("RESERVED");
479 1.5 cegger break;
480 1.5 cegger default:
481 1.25 msaitoh printf("%d (reserved)", notify->Type);
482 1.5 cegger break;
483 1.5 cegger }
484 1.25 msaitoh printf("}\n");
485 1.5 cegger
486 1.5 cegger printf("\t\tLength=%d\n", notify->Length);
487 1.24 msaitoh
488 1.24 msaitoh #define PRINTFLAG(var, flag) printflag((var), ACPI_HEST_## flag, #flag)
489 1.24 msaitoh
490 1.24 msaitoh printf("\t\tConfig Write Enable=");
491 1.24 msaitoh PRINTFLAG(notify->ConfigWriteEnable, TYPE);
492 1.24 msaitoh PRINTFLAG(notify->ConfigWriteEnable, POLL_INTERVAL);
493 1.24 msaitoh PRINTFLAG(notify->ConfigWriteEnable, POLL_THRESHOLD_VALUE);
494 1.24 msaitoh PRINTFLAG(notify->ConfigWriteEnable, POLL_THRESHOLD_WINDOW);
495 1.24 msaitoh PRINTFLAG(notify->ConfigWriteEnable, ERR_THRESHOLD_VALUE);
496 1.24 msaitoh PRINTFLAG(notify->ConfigWriteEnable, ERR_THRESHOLD_WINDOW);
497 1.24 msaitoh PRINTFLAG_END();
498 1.24 msaitoh
499 1.24 msaitoh #undef PRINTFLAG
500 1.5 cegger
501 1.5 cegger printf("\t\tPoll Interval=%d msec\n", notify->PollInterval);
502 1.5 cegger printf("\t\tInterrupt Vector=%d\n", notify->Vector);
503 1.5 cegger printf("\t\tSwitch To Polling Threshold Value=%d\n",
504 1.5 cegger notify->PollingThresholdValue);
505 1.5 cegger printf("\t\tSwitch To Polling Threshold Window=%d msec\n",
506 1.5 cegger notify->PollingThresholdWindow);
507 1.5 cegger printf("\t\tError Threshold Value=%d\n",
508 1.5 cegger notify->ErrorThresholdValue);
509 1.5 cegger printf("\t\tError Threshold Window=%d msec\n",
510 1.5 cegger notify->ErrorThresholdWindow);
511 1.5 cegger printf("\t}\n");
512 1.5 cegger }
513 1.5 cegger
514 1.5 cegger #ifdef notyet
515 1.5 cegger static void
516 1.5 cegger acpi_print_hest_generic_status(ACPI_HEST_GENERIC_STATUS *data)
517 1.5 cegger {
518 1.5 cegger uint32_t i, pos, entries;
519 1.5 cegger ACPI_HEST_GENERIC_DATA *gen;
520 1.5 cegger
521 1.5 cegger entries = data->BlockStatus & ACPI_HEST_ERROR_ENTRY_COUNT;
522 1.5 cegger
523 1.5 cegger printf("\tGeneric Error Status={\n");
524 1.5 cegger printf("\t\tBlock Status={ ");
525 1.5 cegger if (data->BlockStatus & ACPI_HEST_UNCORRECTABLE)
526 1.5 cegger printf("UNCORRECTABLE");
527 1.5 cegger if (data->BlockStatus & ACPI_HEST_CORRECTABLE)
528 1.5 cegger printf("CORRECTABLE");
529 1.5 cegger if (data->BlockStatus & ACPI_HEST_MULTIPLE_UNCORRECTABLE)
530 1.5 cegger printf("MULTIPLE UNCORRECTABLE");
531 1.5 cegger if (data->BlockStatus & ACPI_HEST_MULTIPLE_CORRECTABLE)
532 1.5 cegger printf("MULTIPLE CORRECTABLE");
533 1.5 cegger printf(" }\n");
534 1.5 cegger printf("\t\tEntry Count=%d\n", entries);
535 1.5 cegger printf("\t\tRaw Data Offset=%d\n", data->RawDataOffset);
536 1.5 cegger printf("\t\tRaw Data Length=%d\n", data->RawDataLength);
537 1.5 cegger printf("\t\tData Length=%d\n", data->DataLength);
538 1.5 cegger printf("\t");
539 1.5 cegger acpi_print_hest_errorseverity(data->ErrorSeverity);
540 1.5 cegger printf("\t}\n");
541 1.5 cegger
542 1.5 cegger pos = sizeof(ACPI_HEST_GENERIC_STATUS);
543 1.5 cegger for (i = 0; i < entries; i++) {
544 1.5 cegger gen = (ACPI_HEST_GENERIC_DATA *)((char *)data + pos);
545 1.5 cegger acpi_print_hest_generic_data(gen);
546 1.5 cegger pos += sizeof(ACPI_HEST_GENERIC_DATA);
547 1.5 cegger }
548 1.5 cegger }
549 1.5 cegger #endif
550 1.5 cegger
551 1.5 cegger #ifdef notyet
552 1.5 cegger static void
553 1.5 cegger acpi_print_hest_generic_data(ACPI_HEST_GENERIC_DATA *data)
554 1.5 cegger {
555 1.5 cegger printf("\tGeneric Error Data={\n");
556 1.5 cegger printf("\t\tSectionType=");
557 1.5 cegger acpi_print_string((char *)data->SectionType, sizeof(data->SectionType));
558 1.5 cegger printf("\n\t");
559 1.5 cegger acpi_print_hest_errorseverity(data->ErrorSeverity);
560 1.5 cegger printf("\t\tRevision=0x%x\n", data->Revision);
561 1.5 cegger printf("\t\tValidation Bits=0x%x\n", data->ValidationBits);
562 1.5 cegger printf("\t\tFlags=0x%x\n", data->Flags);
563 1.5 cegger printf("\t\tData Length=%d\n", data->ErrorDataLength);
564 1.5 cegger printf("\t\tField Replication Unit Id=");
565 1.5 cegger acpi_print_string((char *)data->FruId, sizeof(data->FruId));
566 1.5 cegger printf("\n");
567 1.5 cegger printf("\t\tField Replication Unit=");
568 1.5 cegger acpi_print_string((char *)data->FruText, sizeof(data->FruText));
569 1.5 cegger printf("\n");
570 1.5 cegger printf("\t}\n");
571 1.5 cegger }
572 1.5 cegger #endif
573 1.5 cegger
574 1.5 cegger static void
575 1.5 cegger acpi_print_whea(ACPI_WHEA_HEADER *whea,
576 1.5 cegger void (*print_action)(ACPI_WHEA_HEADER *),
577 1.5 cegger void (*print_ins)(ACPI_WHEA_HEADER *),
578 1.5 cegger void (*print_flags)(ACPI_WHEA_HEADER *))
579 1.5 cegger {
580 1.5 cegger printf("\n");
581 1.5 cegger
582 1.5 cegger print_action(whea);
583 1.5 cegger print_ins(whea);
584 1.5 cegger if (print_flags)
585 1.5 cegger print_flags(whea);
586 1.5 cegger printf("\tRegisterRegion=");
587 1.5 cegger acpi_print_gas(&whea->RegisterRegion);
588 1.5 cegger printf("\n");
589 1.5 cegger printf("\tMASK=0x%08"PRIx64"\n", whea->Mask);
590 1.5 cegger }
591 1.5 cegger
592 1.5 cegger static void
593 1.5 cegger acpi_print_hest_ia32_check(ACPI_HEST_IA_MACHINE_CHECK *data)
594 1.5 cegger {
595 1.5 cegger uint32_t i, pos;
596 1.5 cegger ACPI_HEST_IA_ERROR_BANK *bank;
597 1.5 cegger
598 1.5 cegger acpi_print_hest_header(&data->Header);
599 1.5 cegger printf("\tFlags={ ");
600 1.5 cegger if (data->Flags & ACPI_HEST_FIRMWARE_FIRST)
601 1.5 cegger printf("FIRMWARE_FIRST");
602 1.5 cegger printf(" }\n");
603 1.5 cegger printf("\tEnabled={ %s }\n", data->Enabled ? "YES" : "NO");
604 1.5 cegger printf("\tNumber of Record to pre-allocate=%d\n",
605 1.5 cegger data->RecordsToPreallocate);
606 1.5 cegger printf("\tMax Sections per Record=%d\n",
607 1.5 cegger data->MaxSectionsPerRecord);
608 1.5 cegger printf("\tGlobal Capability Init Data=0x%"PRIx64"\n",
609 1.5 cegger data->GlobalCapabilityData);
610 1.5 cegger printf("\tGlobal Control Init Data=0x%"PRIx64"\n",
611 1.5 cegger data->GlobalControlData);
612 1.5 cegger printf("\tNumber of Hardware Error Reporting Banks=%d\n",
613 1.5 cegger data->NumHardwareBanks);
614 1.5 cegger
615 1.5 cegger pos = sizeof(ACPI_HEST_IA_MACHINE_CHECK);
616 1.5 cegger for (i = 0; i < data->NumHardwareBanks; i++) {
617 1.5 cegger bank = (ACPI_HEST_IA_ERROR_BANK *)((char *)data + pos);
618 1.5 cegger acpi_print_hest_errorbank(bank);
619 1.5 cegger pos += sizeof(ACPI_HEST_IA_ERROR_BANK);
620 1.5 cegger }
621 1.5 cegger }
622 1.5 cegger
623 1.5 cegger static void
624 1.5 cegger acpi_print_hest_ia32_correctedcheck(ACPI_HEST_IA_CORRECTED *data)
625 1.5 cegger {
626 1.5 cegger uint32_t i, pos;
627 1.5 cegger ACPI_HEST_IA_ERROR_BANK *bank;
628 1.5 cegger
629 1.5 cegger acpi_print_hest_header(&data->Header);
630 1.5 cegger printf("\tFlags={ ");
631 1.5 cegger if (data->Flags & ACPI_HEST_FIRMWARE_FIRST)
632 1.5 cegger printf("FIRMWARE_FIRST");
633 1.5 cegger printf(" }\n");
634 1.5 cegger printf("\tEnabled={ %s }\n", data->Enabled ? "YES" : "NO");
635 1.5 cegger printf("\tNumber of Record to pre-allocate=%d\n",
636 1.5 cegger data->RecordsToPreallocate);
637 1.5 cegger printf("\tMax Sections per Record=%d\n",
638 1.5 cegger data->MaxSectionsPerRecord);
639 1.5 cegger acpi_print_hest_notify(&data->Notify);
640 1.5 cegger
641 1.5 cegger printf("\tNumber of Hardware Error Reporting Banks=%d\n",
642 1.5 cegger data->NumHardwareBanks);
643 1.5 cegger
644 1.5 cegger pos = sizeof(ACPI_HEST_IA_MACHINE_CHECK);
645 1.5 cegger for (i = 0; i < data->NumHardwareBanks; i++) {
646 1.5 cegger bank = (ACPI_HEST_IA_ERROR_BANK *)((char *)data + pos);
647 1.5 cegger acpi_print_hest_errorbank(bank);
648 1.5 cegger pos += sizeof(ACPI_HEST_IA_ERROR_BANK);
649 1.5 cegger }
650 1.5 cegger }
651 1.5 cegger
652 1.5 cegger static void
653 1.5 cegger acpi_print_hest_ia32_nmi(ACPI_HEST_IA_NMI *data)
654 1.5 cegger {
655 1.5 cegger acpi_print_hest_header(&data->Header);
656 1.5 cegger printf("\tNumber of Record to pre-allocate=%d\n",
657 1.5 cegger data->RecordsToPreallocate);
658 1.5 cegger printf("\tMax Sections per Record=%d\n",
659 1.5 cegger data->MaxSectionsPerRecord);
660 1.5 cegger printf("\tMax Raw Data Length=%d\n",
661 1.5 cegger data->MaxRawDataLength);
662 1.5 cegger }
663 1.5 cegger
664 1.5 cegger static void
665 1.5 cegger acpi_print_hest_aer_root(ACPI_HEST_AER_ROOT *data)
666 1.5 cegger {
667 1.5 cegger acpi_print_hest_header(&data->Header);
668 1.5 cegger acpi_print_hest_aer_common(&data->Aer);
669 1.5 cegger printf("Root Error Command Register=0x%x\n", data->RootErrorCommand);
670 1.5 cegger }
671 1.5 cegger
672 1.5 cegger static void
673 1.5 cegger acpi_print_hest_aer_endpoint(ACPI_HEST_AER *data)
674 1.5 cegger {
675 1.5 cegger acpi_print_hest_header(&data->Header);
676 1.5 cegger acpi_print_hest_aer_common(&data->Aer);
677 1.5 cegger }
678 1.5 cegger
679 1.5 cegger static void
680 1.5 cegger acpi_print_hest_aer_bridge(ACPI_HEST_AER_BRIDGE *data)
681 1.5 cegger {
682 1.5 cegger acpi_print_hest_header(&data->Header);
683 1.5 cegger acpi_print_hest_aer_common(&data->Aer);
684 1.5 cegger
685 1.5 cegger printf("\tSecondary Uncorrectable Error Mask Register=0x%x\n",
686 1.5 cegger data->UncorrectableMask2);
687 1.5 cegger printf("\tSecondary Uncorrectable Error Severity Register=0x%x\n",
688 1.5 cegger data->UncorrectableSeverity2);
689 1.5 cegger printf("\tSecondory Advanced Capabilities Register=0x%x\n",
690 1.5 cegger data->AdvancedCapabilities2);
691 1.5 cegger }
692 1.5 cegger
693 1.5 cegger static void
694 1.5 cegger acpi_print_hest_generic(ACPI_HEST_GENERIC *data)
695 1.5 cegger {
696 1.5 cegger acpi_print_hest_header(&data->Header);
697 1.5 cegger if (data->RelatedSourceId != 0xffff)
698 1.5 cegger printf("\tReleated SourceId=%d\n", data->RelatedSourceId);
699 1.25 msaitoh printf("\tEnabled={%s}\n", data->Enabled ? "YES" : "NO");
700 1.24 msaitoh printf("\tNumber of Records to pre-allocate=%u\n",
701 1.5 cegger data->RecordsToPreallocate);
702 1.24 msaitoh printf("\tMax Sections per Record=%u\n", data->MaxSectionsPerRecord);
703 1.24 msaitoh printf("\tMax Raw Data Length=%u\n", data->MaxRawDataLength);
704 1.5 cegger printf("\tError Status Address=");
705 1.5 cegger acpi_print_gas(&data->ErrorStatusAddress);
706 1.25 msaitoh printf("\n");
707 1.5 cegger acpi_print_hest_notify(&data->Notify);
708 1.24 msaitoh printf("\tError Block Length=%u\n", data->ErrorBlockLength);
709 1.5 cegger }
710 1.5 cegger
711 1.5 cegger static void
712 1.19 msaitoh acpi_print_hest_generic_v2(ACPI_HEST_GENERIC_V2 *data)
713 1.19 msaitoh {
714 1.19 msaitoh
715 1.19 msaitoh /* The first 64 bytes are the same as ACPI_HEST_GENERIC */
716 1.19 msaitoh acpi_print_hest_generic((ACPI_HEST_GENERIC *)data);
717 1.19 msaitoh
718 1.19 msaitoh printf("\tError Status Address");
719 1.19 msaitoh acpi_print_gas(&data->ReadAckRegister);
720 1.19 msaitoh printf("\tRead Ack Preserve=0x%016jx\n",
721 1.19 msaitoh (uintmax_t)data->ReadAckPreserve);
722 1.19 msaitoh printf("\tRead Ack Write=0x%016jx\n",
723 1.19 msaitoh (uintmax_t)data->ReadAckWrite);
724 1.19 msaitoh }
725 1.19 msaitoh
726 1.19 msaitoh static void
727 1.5 cegger acpi_handle_hest(ACPI_TABLE_HEADER *sdp)
728 1.5 cegger {
729 1.5 cegger ACPI_TABLE_HEST *hest;
730 1.5 cegger ACPI_HEST_HEADER *subhest;
731 1.5 cegger uint32_t i, pos;
732 1.5 cegger
733 1.5 cegger printf(BEGIN_COMMENT);
734 1.5 cegger acpi_print_sdt(sdp);
735 1.5 cegger hest = (ACPI_TABLE_HEST *)sdp;
736 1.5 cegger
737 1.5 cegger printf("\tError Source Count=%d\n", hest->ErrorSourceCount);
738 1.5 cegger pos = sizeof(ACPI_TABLE_HEST);
739 1.5 cegger for (i = 0; i < hest->ErrorSourceCount; i++) {
740 1.5 cegger subhest = (ACPI_HEST_HEADER *)((char *)hest + pos);
741 1.5 cegger printf("\n");
742 1.5 cegger
743 1.5 cegger switch (subhest->Type) {
744 1.5 cegger case ACPI_HEST_TYPE_IA32_CHECK:
745 1.24 msaitoh acpi_print_hest_ia32_check(
746 1.24 msaitoh (ACPI_HEST_IA_MACHINE_CHECK *)subhest);
747 1.5 cegger pos += sizeof(ACPI_HEST_IA_MACHINE_CHECK);
748 1.5 cegger break;
749 1.5 cegger
750 1.5 cegger case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
751 1.24 msaitoh acpi_print_hest_ia32_correctedcheck(
752 1.24 msaitoh (ACPI_HEST_IA_CORRECTED *)subhest);
753 1.5 cegger pos += sizeof(ACPI_HEST_IA_CORRECTED);
754 1.5 cegger break;
755 1.5 cegger
756 1.5 cegger case ACPI_HEST_TYPE_IA32_NMI:
757 1.24 msaitoh acpi_print_hest_ia32_nmi(
758 1.24 msaitoh (ACPI_HEST_IA_NMI *)subhest);
759 1.5 cegger pos += sizeof(ACPI_HEST_IA_NMI);
760 1.5 cegger break;
761 1.5 cegger
762 1.5 cegger case ACPI_HEST_TYPE_NOT_USED3:
763 1.5 cegger case ACPI_HEST_TYPE_NOT_USED4:
764 1.5 cegger case ACPI_HEST_TYPE_NOT_USED5:
765 1.5 cegger pos += sizeof(ACPI_HEST_HEADER);
766 1.5 cegger break;
767 1.5 cegger
768 1.5 cegger case ACPI_HEST_TYPE_AER_ROOT_PORT:
769 1.24 msaitoh acpi_print_hest_aer_root((ACPI_HEST_AER_ROOT *)subhest);
770 1.5 cegger pos += sizeof(ACPI_HEST_AER_ROOT);
771 1.5 cegger break;
772 1.5 cegger
773 1.5 cegger case ACPI_HEST_TYPE_AER_ENDPOINT:
774 1.24 msaitoh acpi_print_hest_aer_endpoint((ACPI_HEST_AER *)subhest);
775 1.24 msaitoh pos += sizeof(ACPI_HEST_AER);
776 1.5 cegger break;
777 1.5 cegger
778 1.5 cegger case ACPI_HEST_TYPE_AER_BRIDGE:
779 1.24 msaitoh acpi_print_hest_aer_bridge((ACPI_HEST_AER_BRIDGE *)subhest);
780 1.5 cegger pos += sizeof(ACPI_HEST_AER_BRIDGE);
781 1.5 cegger break;
782 1.5 cegger
783 1.5 cegger case ACPI_HEST_TYPE_GENERIC_ERROR:
784 1.24 msaitoh acpi_print_hest_generic((ACPI_HEST_GENERIC *)subhest);
785 1.5 cegger pos += sizeof(ACPI_HEST_GENERIC);
786 1.5 cegger break;
787 1.5 cegger
788 1.19 msaitoh case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
789 1.24 msaitoh acpi_print_hest_generic_v2(
790 1.24 msaitoh (ACPI_HEST_GENERIC_V2 *)subhest);
791 1.19 msaitoh pos += sizeof(ACPI_HEST_GENERIC_V2);
792 1.19 msaitoh break;
793 1.19 msaitoh
794 1.5 cegger case ACPI_HEST_TYPE_RESERVED:
795 1.5 cegger default:
796 1.5 cegger pos += sizeof(ACPI_HEST_HEADER);
797 1.5 cegger break;
798 1.5 cegger }
799 1.5 cegger }
800 1.5 cegger
801 1.5 cegger printf(END_COMMENT);
802 1.5 cegger }
803 1.5 cegger
804 1.18 msaitoh static uint64_t
805 1.18 msaitoh acpi_select_address(uint32_t addr32, uint64_t addr64)
806 1.18 msaitoh {
807 1.18 msaitoh
808 1.18 msaitoh if (addr64 == 0)
809 1.18 msaitoh return addr32;
810 1.18 msaitoh
811 1.18 msaitoh if ((addr32 != 0) && ((addr64 & 0xfffffff) != addr32)) {
812 1.18 msaitoh /*
813 1.18 msaitoh * A few systems (e.g., IBM T23) have an RSDP that claims
814 1.18 msaitoh * revision 2 but the 64 bit addresses are invalid. If
815 1.18 msaitoh * revision 2 and the 32 bit address is non-zero but the
816 1.18 msaitoh * 32 and 64 bit versions don't match, prefer the 32 bit
817 1.18 msaitoh * version for all subsequent tables.
818 1.18 msaitoh */
819 1.18 msaitoh return addr32;
820 1.18 msaitoh }
821 1.18 msaitoh
822 1.18 msaitoh return addr64;
823 1.18 msaitoh }
824 1.18 msaitoh
825 1.5 cegger static void
826 1.5 cegger acpi_handle_fadt(ACPI_TABLE_HEADER *sdp)
827 1.5 cegger {
828 1.5 cegger ACPI_TABLE_HEADER *dsdp;
829 1.5 cegger ACPI_TABLE_FACS *facs;
830 1.5 cegger ACPI_TABLE_FADT *fadt;
831 1.5 cegger
832 1.5 cegger fadt = (ACPI_TABLE_FADT *)sdp;
833 1.5 cegger acpi_print_fadt(sdp);
834 1.5 cegger
835 1.29.2.1 pgoyette if (acpi_select_address(fadt->Facs, fadt->XFacs) == 0) {
836 1.29.2.1 pgoyette if ((fadt->Flags & ACPI_FADT_HW_REDUCED) == 0)
837 1.29.2.1 pgoyette errx(EXIT_FAILURE, "Missing FACS and HW_REDUCED_ACPI flag not set in FADT");
838 1.29.2.1 pgoyette } else {
839 1.29.2.1 pgoyette facs = (ACPI_TABLE_FACS *)acpi_map_sdt(
840 1.29.2.1 pgoyette acpi_select_address(fadt->Facs, fadt->XFacs));
841 1.29.2.1 pgoyette if (memcmp(facs->Signature, ACPI_SIG_FACS, 4) != 0 || facs->Length < 64)
842 1.29.2.1 pgoyette errx(EXIT_FAILURE, "FACS is corrupt");
843 1.29.2.1 pgoyette acpi_print_facs(facs);
844 1.29.2.1 pgoyette }
845 1.5 cegger
846 1.18 msaitoh dsdp = (ACPI_TABLE_HEADER *)acpi_map_sdt(
847 1.18 msaitoh acpi_select_address(fadt->Dsdt, fadt->XDsdt));
848 1.17 msaitoh if (memcmp(dsdp->Signature, ACPI_SIG_DSDT, 4) != 0)
849 1.17 msaitoh errx(EXIT_FAILURE, "DSDT signature mismatch");
850 1.5 cegger if (acpi_checksum(dsdp, dsdp->Length))
851 1.5 cegger errx(EXIT_FAILURE, "DSDT is corrupt");
852 1.5 cegger acpi_print_dsdt(dsdp);
853 1.5 cegger }
854 1.5 cegger
855 1.5 cegger static void
856 1.5 cegger acpi_walk_subtables(ACPI_TABLE_HEADER *table, void *first,
857 1.5 cegger void (*action)(ACPI_SUBTABLE_HEADER *))
858 1.5 cegger {
859 1.5 cegger ACPI_SUBTABLE_HEADER *subtable;
860 1.5 cegger char *end;
861 1.5 cegger
862 1.5 cegger subtable = first;
863 1.5 cegger end = (char *)table + table->Length;
864 1.5 cegger while ((char *)subtable < end) {
865 1.5 cegger printf("\n");
866 1.16 msaitoh if (subtable->Length < sizeof(ACPI_SUBTABLE_HEADER)) {
867 1.16 msaitoh warnx("invalid subtable length %u", subtable->Length);
868 1.16 msaitoh return;
869 1.16 msaitoh }
870 1.5 cegger action(subtable);
871 1.5 cegger subtable = (ACPI_SUBTABLE_HEADER *)((char *)subtable +
872 1.5 cegger subtable->Length);
873 1.5 cegger }
874 1.5 cegger }
875 1.5 cegger
876 1.5 cegger static void
877 1.19 msaitoh acpi_walk_nfit(ACPI_TABLE_HEADER *table, void *first,
878 1.19 msaitoh void (*action)(ACPI_NFIT_HEADER *))
879 1.19 msaitoh {
880 1.19 msaitoh ACPI_NFIT_HEADER *subtable;
881 1.19 msaitoh char *end;
882 1.19 msaitoh
883 1.19 msaitoh subtable = first;
884 1.19 msaitoh end = (char *)table + table->Length;
885 1.19 msaitoh while ((char *)subtable < end) {
886 1.19 msaitoh printf("\n");
887 1.19 msaitoh if (subtable->Length < sizeof(ACPI_NFIT_HEADER)) {
888 1.19 msaitoh warnx("invalid subtable length %u", subtable->Length);
889 1.19 msaitoh return;
890 1.19 msaitoh }
891 1.19 msaitoh action(subtable);
892 1.19 msaitoh subtable = (ACPI_NFIT_HEADER *)((char *)subtable +
893 1.19 msaitoh subtable->Length);
894 1.19 msaitoh }
895 1.19 msaitoh }
896 1.19 msaitoh
897 1.19 msaitoh static void
898 1.5 cegger acpi_print_cpu(u_char cpu_id)
899 1.5 cegger {
900 1.5 cegger
901 1.5 cegger printf("\tACPI CPU=");
902 1.5 cegger if (cpu_id == 0xff)
903 1.5 cegger printf("ALL\n");
904 1.5 cegger else
905 1.5 cegger printf("%d\n", (u_int)cpu_id);
906 1.5 cegger }
907 1.5 cegger
908 1.5 cegger static void
909 1.5 cegger acpi_print_cpu_uid(uint32_t uid, char *uid_string)
910 1.5 cegger {
911 1.5 cegger
912 1.5 cegger printf("\tUID=%d", uid);
913 1.5 cegger if (uid_string != NULL)
914 1.5 cegger printf(" (%s)", uid_string);
915 1.5 cegger printf("\n");
916 1.5 cegger }
917 1.5 cegger
918 1.5 cegger static void
919 1.5 cegger acpi_print_local_apic(uint32_t apic_id, uint32_t flags)
920 1.5 cegger {
921 1.5 cegger
922 1.5 cegger printf("\tFlags={");
923 1.5 cegger if (flags & ACPI_MADT_ENABLED)
924 1.5 cegger printf("ENABLED");
925 1.5 cegger else
926 1.5 cegger printf("DISABLED");
927 1.5 cegger printf("}\n");
928 1.5 cegger printf("\tAPIC ID=%d\n", apic_id);
929 1.5 cegger }
930 1.5 cegger
931 1.5 cegger static void
932 1.5 cegger acpi_print_io_apic(uint32_t apic_id, uint32_t int_base, uint64_t apic_addr)
933 1.5 cegger {
934 1.5 cegger
935 1.5 cegger printf("\tAPIC ID=%d\n", apic_id);
936 1.5 cegger printf("\tINT BASE=%d\n", int_base);
937 1.5 cegger printf("\tADDR=0x%016jx\n", (uintmax_t)apic_addr);
938 1.5 cegger }
939 1.5 cegger
940 1.5 cegger static void
941 1.5 cegger acpi_print_mps_flags(uint16_t flags)
942 1.5 cegger {
943 1.5 cegger
944 1.5 cegger printf("\tFlags={Polarity=");
945 1.5 cegger switch (flags & ACPI_MADT_POLARITY_MASK) {
946 1.5 cegger case ACPI_MADT_POLARITY_CONFORMS:
947 1.5 cegger printf("conforming");
948 1.5 cegger break;
949 1.5 cegger case ACPI_MADT_POLARITY_ACTIVE_HIGH:
950 1.5 cegger printf("active-hi");
951 1.5 cegger break;
952 1.5 cegger case ACPI_MADT_POLARITY_ACTIVE_LOW:
953 1.5 cegger printf("active-lo");
954 1.5 cegger break;
955 1.5 cegger default:
956 1.5 cegger printf("0x%x", flags & ACPI_MADT_POLARITY_MASK);
957 1.5 cegger break;
958 1.5 cegger }
959 1.5 cegger printf(", Trigger=");
960 1.5 cegger switch (flags & ACPI_MADT_TRIGGER_MASK) {
961 1.5 cegger case ACPI_MADT_TRIGGER_CONFORMS:
962 1.5 cegger printf("conforming");
963 1.5 cegger break;
964 1.5 cegger case ACPI_MADT_TRIGGER_EDGE:
965 1.5 cegger printf("edge");
966 1.5 cegger break;
967 1.5 cegger case ACPI_MADT_TRIGGER_LEVEL:
968 1.5 cegger printf("level");
969 1.5 cegger break;
970 1.5 cegger default:
971 1.5 cegger printf("0x%x", (flags & ACPI_MADT_TRIGGER_MASK) >> 2);
972 1.5 cegger }
973 1.5 cegger printf("}\n");
974 1.5 cegger }
975 1.5 cegger
976 1.5 cegger static void
977 1.16 msaitoh acpi_print_gicc_flags(uint32_t flags)
978 1.16 msaitoh {
979 1.16 msaitoh
980 1.16 msaitoh printf("\tFlags={Performance intr=");
981 1.16 msaitoh if (flags & ACPI_MADT_PERFORMANCE_IRQ_MODE)
982 1.16 msaitoh printf("edge");
983 1.16 msaitoh else
984 1.16 msaitoh printf("level");
985 1.16 msaitoh printf(", VGIC intr=");
986 1.16 msaitoh if (flags & ACPI_MADT_VGIC_IRQ_MODE)
987 1.16 msaitoh printf("edge");
988 1.16 msaitoh else
989 1.16 msaitoh printf("level");
990 1.16 msaitoh printf("}\n");
991 1.16 msaitoh }
992 1.16 msaitoh
993 1.16 msaitoh static void
994 1.5 cegger acpi_print_intr(uint32_t intr, uint16_t mps_flags)
995 1.5 cegger {
996 1.5 cegger
997 1.5 cegger printf("\tINTR=%d\n", intr);
998 1.5 cegger acpi_print_mps_flags(mps_flags);
999 1.5 cegger }
1000 1.5 cegger
1001 1.5 cegger static void
1002 1.5 cegger acpi_print_local_nmi(u_int lint, uint16_t mps_flags)
1003 1.5 cegger {
1004 1.5 cegger
1005 1.5 cegger printf("\tLINT Pin=%d\n", lint);
1006 1.5 cegger acpi_print_mps_flags(mps_flags);
1007 1.5 cegger }
1008 1.5 cegger
1009 1.16 msaitoh static const char *apic_types[] = {
1010 1.16 msaitoh [ACPI_MADT_TYPE_LOCAL_APIC] = "Local APIC",
1011 1.16 msaitoh [ACPI_MADT_TYPE_IO_APIC] = "IO APIC",
1012 1.16 msaitoh [ACPI_MADT_TYPE_INTERRUPT_OVERRIDE] = "INT Override",
1013 1.16 msaitoh [ACPI_MADT_TYPE_NMI_SOURCE] = "NMI",
1014 1.16 msaitoh [ACPI_MADT_TYPE_LOCAL_APIC_NMI] = "Local APIC NMI",
1015 1.16 msaitoh [ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE] = "Local APIC Override",
1016 1.16 msaitoh [ACPI_MADT_TYPE_IO_SAPIC] = "IO SAPIC",
1017 1.16 msaitoh [ACPI_MADT_TYPE_LOCAL_SAPIC] = "Local SAPIC",
1018 1.16 msaitoh [ACPI_MADT_TYPE_INTERRUPT_SOURCE] = "Platform Interrupt",
1019 1.16 msaitoh [ACPI_MADT_TYPE_LOCAL_X2APIC] = "Local X2APIC",
1020 1.16 msaitoh [ACPI_MADT_TYPE_LOCAL_X2APIC_NMI] = "Local X2APIC NMI",
1021 1.16 msaitoh [ACPI_MADT_TYPE_GENERIC_INTERRUPT] = "GIC CPU Interface Structure",
1022 1.16 msaitoh [ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR] = "GIC Distributor Structure",
1023 1.16 msaitoh [ACPI_MADT_TYPE_GENERIC_MSI_FRAME] = "GICv2m MSI Frame",
1024 1.16 msaitoh [ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR] = "GIC Redistributor Structure",
1025 1.16 msaitoh [ACPI_MADT_TYPE_GENERIC_TRANSLATOR] = "GIC ITS Structure"
1026 1.16 msaitoh };
1027 1.16 msaitoh
1028 1.16 msaitoh static const char *platform_int_types[] = { "0 (unknown)", "PMI", "INIT",
1029 1.16 msaitoh "Corrected Platform Error" };
1030 1.5 cegger
1031 1.5 cegger static void
1032 1.19 msaitoh acpi_print_gicm_flags(ACPI_MADT_GENERIC_MSI_FRAME *gicm)
1033 1.19 msaitoh {
1034 1.19 msaitoh uint32_t flags = gicm->Flags;
1035 1.19 msaitoh
1036 1.25 msaitoh printf("\tFLAGS={");
1037 1.19 msaitoh if (flags & ACPI_MADT_OVERRIDE_SPI_VALUES)
1038 1.19 msaitoh printf("SPI Count/Base Select");
1039 1.19 msaitoh printf("}\n");
1040 1.19 msaitoh }
1041 1.19 msaitoh
1042 1.19 msaitoh static void
1043 1.5 cegger acpi_print_madt(ACPI_SUBTABLE_HEADER *mp)
1044 1.5 cegger {
1045 1.5 cegger ACPI_MADT_LOCAL_APIC *lapic;
1046 1.5 cegger ACPI_MADT_IO_APIC *ioapic;
1047 1.5 cegger ACPI_MADT_INTERRUPT_OVERRIDE *over;
1048 1.5 cegger ACPI_MADT_NMI_SOURCE *nmi;
1049 1.5 cegger ACPI_MADT_LOCAL_APIC_NMI *lapic_nmi;
1050 1.5 cegger ACPI_MADT_LOCAL_APIC_OVERRIDE *lapic_over;
1051 1.5 cegger ACPI_MADT_IO_SAPIC *iosapic;
1052 1.5 cegger ACPI_MADT_LOCAL_SAPIC *lsapic;
1053 1.5 cegger ACPI_MADT_INTERRUPT_SOURCE *isrc;
1054 1.5 cegger ACPI_MADT_LOCAL_X2APIC *x2apic;
1055 1.5 cegger ACPI_MADT_LOCAL_X2APIC_NMI *x2apic_nmi;
1056 1.16 msaitoh ACPI_MADT_GENERIC_INTERRUPT *gicc;
1057 1.16 msaitoh ACPI_MADT_GENERIC_DISTRIBUTOR *gicd;
1058 1.19 msaitoh ACPI_MADT_GENERIC_MSI_FRAME *gicm;
1059 1.16 msaitoh ACPI_MADT_GENERIC_REDISTRIBUTOR *gicr;
1060 1.16 msaitoh ACPI_MADT_GENERIC_TRANSLATOR *gict;
1061 1.5 cegger
1062 1.16 msaitoh if (mp->Type < __arraycount(apic_types))
1063 1.5 cegger printf("\tType=%s\n", apic_types[mp->Type]);
1064 1.5 cegger else
1065 1.5 cegger printf("\tType=%d (unknown)\n", mp->Type);
1066 1.5 cegger switch (mp->Type) {
1067 1.5 cegger case ACPI_MADT_TYPE_LOCAL_APIC:
1068 1.5 cegger lapic = (ACPI_MADT_LOCAL_APIC *)mp;
1069 1.5 cegger acpi_print_cpu(lapic->ProcessorId);
1070 1.5 cegger acpi_print_local_apic(lapic->Id, lapic->LapicFlags);
1071 1.5 cegger break;
1072 1.5 cegger case ACPI_MADT_TYPE_IO_APIC:
1073 1.5 cegger ioapic = (ACPI_MADT_IO_APIC *)mp;
1074 1.5 cegger acpi_print_io_apic(ioapic->Id, ioapic->GlobalIrqBase,
1075 1.5 cegger ioapic->Address);
1076 1.5 cegger break;
1077 1.5 cegger case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
1078 1.5 cegger over = (ACPI_MADT_INTERRUPT_OVERRIDE *)mp;
1079 1.5 cegger printf("\tBUS=%d\n", (u_int)over->Bus);
1080 1.5 cegger printf("\tIRQ=%d\n", (u_int)over->SourceIrq);
1081 1.5 cegger acpi_print_intr(over->GlobalIrq, over->IntiFlags);
1082 1.5 cegger break;
1083 1.5 cegger case ACPI_MADT_TYPE_NMI_SOURCE:
1084 1.5 cegger nmi = (ACPI_MADT_NMI_SOURCE *)mp;
1085 1.5 cegger acpi_print_intr(nmi->GlobalIrq, nmi->IntiFlags);
1086 1.5 cegger break;
1087 1.5 cegger case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
1088 1.5 cegger lapic_nmi = (ACPI_MADT_LOCAL_APIC_NMI *)mp;
1089 1.5 cegger acpi_print_cpu(lapic_nmi->ProcessorId);
1090 1.5 cegger acpi_print_local_nmi(lapic_nmi->Lint, lapic_nmi->IntiFlags);
1091 1.5 cegger break;
1092 1.5 cegger case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
1093 1.5 cegger lapic_over = (ACPI_MADT_LOCAL_APIC_OVERRIDE *)mp;
1094 1.5 cegger printf("\tLocal APIC ADDR=0x%016jx\n",
1095 1.5 cegger (uintmax_t)lapic_over->Address);
1096 1.5 cegger break;
1097 1.5 cegger case ACPI_MADT_TYPE_IO_SAPIC:
1098 1.5 cegger iosapic = (ACPI_MADT_IO_SAPIC *)mp;
1099 1.5 cegger acpi_print_io_apic(iosapic->Id, iosapic->GlobalIrqBase,
1100 1.5 cegger iosapic->Address);
1101 1.5 cegger break;
1102 1.5 cegger case ACPI_MADT_TYPE_LOCAL_SAPIC:
1103 1.5 cegger lsapic = (ACPI_MADT_LOCAL_SAPIC *)mp;
1104 1.5 cegger acpi_print_cpu(lsapic->ProcessorId);
1105 1.5 cegger acpi_print_local_apic(lsapic->Id, lsapic->LapicFlags);
1106 1.5 cegger printf("\tAPIC EID=%d\n", (u_int)lsapic->Eid);
1107 1.5 cegger if (mp->Length > offsetof(ACPI_MADT_LOCAL_SAPIC, Uid))
1108 1.5 cegger acpi_print_cpu_uid(lsapic->Uid, lsapic->UidString);
1109 1.5 cegger break;
1110 1.5 cegger case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
1111 1.5 cegger isrc = (ACPI_MADT_INTERRUPT_SOURCE *)mp;
1112 1.16 msaitoh if (isrc->Type < __arraycount(platform_int_types))
1113 1.5 cegger printf("\tType=%s\n", platform_int_types[isrc->Type]);
1114 1.5 cegger else
1115 1.5 cegger printf("\tType=%d (unknown)\n", isrc->Type);
1116 1.5 cegger printf("\tAPIC ID=%d\n", (u_int)isrc->Id);
1117 1.5 cegger printf("\tAPIC EID=%d\n", (u_int)isrc->Eid);
1118 1.5 cegger printf("\tSAPIC Vector=%d\n", (u_int)isrc->IoSapicVector);
1119 1.5 cegger acpi_print_intr(isrc->GlobalIrq, isrc->IntiFlags);
1120 1.5 cegger break;
1121 1.5 cegger case ACPI_MADT_TYPE_LOCAL_X2APIC:
1122 1.5 cegger x2apic = (ACPI_MADT_LOCAL_X2APIC *)mp;
1123 1.5 cegger acpi_print_cpu_uid(x2apic->Uid, NULL);
1124 1.5 cegger acpi_print_local_apic(x2apic->LocalApicId, x2apic->LapicFlags);
1125 1.5 cegger break;
1126 1.5 cegger case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
1127 1.5 cegger x2apic_nmi = (ACPI_MADT_LOCAL_X2APIC_NMI *)mp;
1128 1.5 cegger acpi_print_cpu_uid(x2apic_nmi->Uid, NULL);
1129 1.5 cegger acpi_print_local_nmi(x2apic_nmi->Lint, x2apic_nmi->IntiFlags);
1130 1.5 cegger break;
1131 1.16 msaitoh case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
1132 1.16 msaitoh gicc = (ACPI_MADT_GENERIC_INTERRUPT *)mp;
1133 1.16 msaitoh acpi_print_cpu_uid(gicc->Uid, NULL);
1134 1.16 msaitoh printf("\tCPU INTERFACE=%x\n", gicc->CpuInterfaceNumber);
1135 1.16 msaitoh acpi_print_gicc_flags(gicc->Flags);
1136 1.16 msaitoh printf("\tParking Protocol Version=%x\n", gicc->ParkingVersion);
1137 1.16 msaitoh printf("\tPERF INTR=%d\n", gicc->PerformanceInterrupt);
1138 1.16 msaitoh printf("\tParked ADDR=%016jx\n",
1139 1.16 msaitoh (uintmax_t)gicc->ParkedAddress);
1140 1.16 msaitoh printf("\tBase ADDR=%016jx\n", (uintmax_t)gicc->BaseAddress);
1141 1.16 msaitoh printf("\tGICV=%016jx\n", (uintmax_t)gicc->GicvBaseAddress);
1142 1.16 msaitoh printf("\tGICH=%016jx\n", (uintmax_t)gicc->GichBaseAddress);
1143 1.16 msaitoh printf("\tVGIC INTR=%d\n", gicc->VgicInterrupt);
1144 1.16 msaitoh printf("\tGICR ADDR=%016jx\n",
1145 1.16 msaitoh (uintmax_t)gicc->GicrBaseAddress);
1146 1.16 msaitoh printf("\tMPIDR=%jx\n", (uintmax_t)gicc->ArmMpidr);
1147 1.16 msaitoh printf("\tEfficency Class=%d\n", (u_int)gicc->EfficiencyClass);
1148 1.16 msaitoh break;
1149 1.16 msaitoh case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
1150 1.16 msaitoh gicd = (ACPI_MADT_GENERIC_DISTRIBUTOR *)mp;
1151 1.16 msaitoh printf("\tGIC ID=%d\n", (u_int)gicd->GicId);
1152 1.16 msaitoh printf("\tBase ADDR=%016jx\n", (uintmax_t)gicd->BaseAddress);
1153 1.16 msaitoh printf("\tVector Base=%d\n", gicd->GlobalIrqBase);
1154 1.16 msaitoh printf("\tGIC VERSION=%d\n", (u_int)gicd->Version);
1155 1.16 msaitoh break;
1156 1.19 msaitoh case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
1157 1.19 msaitoh gicm = (ACPI_MADT_GENERIC_MSI_FRAME*)mp;
1158 1.19 msaitoh printf("\tBase ADDR=%016jx\n", (uintmax_t)gicm->BaseAddress);
1159 1.19 msaitoh acpi_print_gicm_flags(gicm);
1160 1.19 msaitoh printf("\tSPI Count=%u\n", gicm->SpiCount);
1161 1.19 msaitoh printf("\tSPI Base=%u\n", gicm->SpiBase);
1162 1.19 msaitoh break;
1163 1.16 msaitoh case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
1164 1.16 msaitoh gicr = (ACPI_MADT_GENERIC_REDISTRIBUTOR *)mp;
1165 1.16 msaitoh printf("\tBase ADDR=%016jx\n", (uintmax_t)gicr->BaseAddress);
1166 1.16 msaitoh printf("\tLength=%08x\n", gicr->Length);
1167 1.16 msaitoh break;
1168 1.16 msaitoh case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
1169 1.16 msaitoh gict = (ACPI_MADT_GENERIC_TRANSLATOR *)mp;
1170 1.16 msaitoh printf("\tGIC ITS ID=%d\n", gict->TranslationId);
1171 1.16 msaitoh printf("\tBase ADDR=%016jx\n", (uintmax_t)gict->BaseAddress);
1172 1.16 msaitoh break;
1173 1.5 cegger }
1174 1.5 cegger }
1175 1.5 cegger
1176 1.5 cegger #ifdef notyet
1177 1.5 cegger static void
1178 1.5 cegger acpi_print_bert_region(ACPI_BERT_REGION *region)
1179 1.5 cegger {
1180 1.5 cegger uint32_t i, pos, entries;
1181 1.5 cegger ACPI_HEST_GENERIC_DATA *data;
1182 1.5 cegger
1183 1.5 cegger printf("\n");
1184 1.5 cegger printf("\tBlockStatus={ ");
1185 1.5 cegger
1186 1.5 cegger if (region->BlockStatus & ACPI_BERT_UNCORRECTABLE)
1187 1.5 cegger printf("Uncorrectable");
1188 1.5 cegger if (region->BlockStatus & ACPI_BERT_CORRECTABLE)
1189 1.5 cegger printf("Correctable");
1190 1.5 cegger if (region->BlockStatus & ACPI_BERT_MULTIPLE_UNCORRECTABLE)
1191 1.5 cegger printf("Multiple Uncorrectable");
1192 1.5 cegger if (region->BlockStatus & ACPI_BERT_MULTIPLE_CORRECTABLE)
1193 1.5 cegger printf("Multiple Correctable");
1194 1.5 cegger entries = region->BlockStatus & ACPI_BERT_ERROR_ENTRY_COUNT;
1195 1.5 cegger printf(", Error Entry Count=%d", entries);
1196 1.5 cegger printf("}\n");
1197 1.5 cegger
1198 1.5 cegger printf("\tRaw Data Offset=0x%x\n", region->RawDataOffset);
1199 1.5 cegger printf("\tRaw Data Length=0x%x\n", region->RawDataLength);
1200 1.5 cegger printf("\tData Length=0x%x\n", region->DataLength);
1201 1.5 cegger
1202 1.5 cegger acpi_print_hest_errorseverity(region->ErrorSeverity);
1203 1.5 cegger
1204 1.5 cegger pos = sizeof(ACPI_BERT_REGION);
1205 1.5 cegger for (i = 0; i < entries; i++) {
1206 1.5 cegger data = (ACPI_HEST_GENERIC_DATA *)((char *)region + pos);
1207 1.5 cegger acpi_print_hest_generic_data(data);
1208 1.5 cegger pos += sizeof(ACPI_HEST_GENERIC_DATA);
1209 1.5 cegger }
1210 1.5 cegger }
1211 1.5 cegger #endif
1212 1.5 cegger
1213 1.5 cegger static void
1214 1.5 cegger acpi_handle_bert(ACPI_TABLE_HEADER *sdp)
1215 1.5 cegger {
1216 1.5 cegger ACPI_TABLE_BERT *bert;
1217 1.5 cegger
1218 1.5 cegger printf(BEGIN_COMMENT);
1219 1.5 cegger acpi_print_sdt(sdp);
1220 1.5 cegger bert = (ACPI_TABLE_BERT *)sdp;
1221 1.5 cegger
1222 1.5 cegger printf("\tLength of Boot Error Region=%d bytes\n", bert->RegionLength);
1223 1.5 cegger printf("\tPhysical Address of Region=0x%"PRIx64"\n", bert->Address);
1224 1.5 cegger
1225 1.5 cegger printf(END_COMMENT);
1226 1.5 cegger }
1227 1.5 cegger
1228 1.5 cegger static void
1229 1.29.2.2 pgoyette acpi_handle_bgrt(ACPI_TABLE_HEADER *sdp)
1230 1.29.2.2 pgoyette {
1231 1.29.2.2 pgoyette ACPI_TABLE_BGRT *bgrt;
1232 1.29.2.2 pgoyette unsigned int degree;
1233 1.29.2.2 pgoyette
1234 1.29.2.2 pgoyette printf(BEGIN_COMMENT);
1235 1.29.2.2 pgoyette acpi_print_sdt(sdp);
1236 1.29.2.2 pgoyette bgrt = (ACPI_TABLE_BGRT *)sdp;
1237 1.29.2.2 pgoyette
1238 1.29.2.2 pgoyette printf("\tVersion=%hu\n", bgrt->Version);
1239 1.29.2.2 pgoyette degree = ((unsigned int)(bgrt->Status & ACPI_BGRT_ORIENTATION_OFFSET)
1240 1.29.2.2 pgoyette >> 1) * 90;
1241 1.29.2.2 pgoyette printf("\tDegree=%u\n", degree);
1242 1.29.2.2 pgoyette printf("\tDisplayed=%u\n", bgrt->Status & ACPI_BGRT_DISPLAYED);
1243 1.29.2.2 pgoyette printf("\tImage Type=");
1244 1.29.2.2 pgoyette switch (bgrt->ImageType) {
1245 1.29.2.2 pgoyette case 0:
1246 1.29.2.2 pgoyette printf("Bitmap\n");
1247 1.29.2.2 pgoyette break;
1248 1.29.2.2 pgoyette default:
1249 1.29.2.2 pgoyette printf("reserved (0x%hhx)\n", bgrt->ImageType);
1250 1.29.2.2 pgoyette break;
1251 1.29.2.2 pgoyette }
1252 1.29.2.2 pgoyette printf("\tImage Address=0x%"PRIx64"\n", bgrt->ImageAddress);
1253 1.29.2.2 pgoyette printf("\tImage Offset X=0x%08x\n", bgrt->ImageOffsetX);
1254 1.29.2.2 pgoyette printf("\tImage Offset Y=0x%08x\n", bgrt->ImageOffsetY);
1255 1.29.2.2 pgoyette
1256 1.29.2.2 pgoyette printf(END_COMMENT);
1257 1.29.2.2 pgoyette }
1258 1.29.2.2 pgoyette
1259 1.29.2.2 pgoyette static void
1260 1.5 cegger acpi_handle_boot(ACPI_TABLE_HEADER *sdp)
1261 1.5 cegger {
1262 1.5 cegger ACPI_TABLE_BOOT *boot;
1263 1.5 cegger
1264 1.5 cegger printf(BEGIN_COMMENT);
1265 1.5 cegger acpi_print_sdt(sdp);
1266 1.5 cegger boot = (ACPI_TABLE_BOOT *)sdp;
1267 1.5 cegger printf("\tCMOS Index=0x%02x\n", boot->CmosIndex);
1268 1.5 cegger printf(END_COMMENT);
1269 1.5 cegger }
1270 1.5 cegger
1271 1.5 cegger static void
1272 1.5 cegger acpi_handle_cpep(ACPI_TABLE_HEADER *sdp)
1273 1.5 cegger {
1274 1.5 cegger ACPI_TABLE_CPEP *cpep;
1275 1.5 cegger ACPI_CPEP_POLLING *poll;
1276 1.5 cegger uint32_t cpep_pos;
1277 1.5 cegger
1278 1.5 cegger printf(BEGIN_COMMENT);
1279 1.5 cegger acpi_print_sdt(sdp);
1280 1.5 cegger cpep = (ACPI_TABLE_CPEP *)sdp;
1281 1.5 cegger
1282 1.5 cegger cpep_pos = sizeof(ACPI_TABLE_CPEP);
1283 1.5 cegger while (cpep_pos < sdp->Length) {
1284 1.5 cegger poll = (ACPI_CPEP_POLLING *)((char *)cpep + cpep_pos);
1285 1.5 cegger acpi_print_cpu(poll->Id);
1286 1.5 cegger printf("\tACPI CPU EId=%d\n", poll->Eid);
1287 1.5 cegger printf("\tPoll Interval=%d msec\n", poll->Interval);
1288 1.5 cegger cpep_pos += sizeof(ACPI_CPEP_POLLING);
1289 1.5 cegger }
1290 1.5 cegger printf(END_COMMENT);
1291 1.5 cegger }
1292 1.5 cegger
1293 1.5 cegger static void
1294 1.29.2.2 pgoyette acpi_print_csrt_resource_group(ACPI_CSRT_GROUP *grp)
1295 1.29.2.2 pgoyette {
1296 1.29.2.2 pgoyette ACPI_CSRT_DESCRIPTOR *desc;
1297 1.29.2.2 pgoyette
1298 1.29.2.2 pgoyette printf("\tLength=%u\n", grp->Length);
1299 1.29.2.2 pgoyette printf("\tVendorId=");
1300 1.29.2.2 pgoyette acpi_print_string((char *)&grp->VendorId, 4);
1301 1.29.2.2 pgoyette printf("\n");
1302 1.29.2.2 pgoyette if (grp->SubvendorId != 0) {
1303 1.29.2.2 pgoyette printf("\tSubvendorId=");
1304 1.29.2.2 pgoyette acpi_print_string((char *)&grp->SubvendorId, 4);
1305 1.29.2.2 pgoyette printf("\n");
1306 1.29.2.2 pgoyette }
1307 1.29.2.2 pgoyette printf("\tDeviceId=0x%08x\n", grp->DeviceId);
1308 1.29.2.2 pgoyette if (grp->SubdeviceId != 0)
1309 1.29.2.2 pgoyette printf("\tSubdeviceId=0x%08x\n", grp->SubdeviceId);
1310 1.29.2.2 pgoyette printf("\tRevision=%hu\n", grp->Revision);
1311 1.29.2.2 pgoyette printf("\tSharedInfoLength=%u\n", grp->SharedInfoLength);
1312 1.29.2.2 pgoyette
1313 1.29.2.2 pgoyette /* Next is Shared Info */
1314 1.29.2.2 pgoyette if (grp->SharedInfoLength != 0) {
1315 1.29.2.2 pgoyette printf("\tShared Info ");
1316 1.29.2.2 pgoyette acpi_dump_bytes((uint8_t *)(grp + 1),
1317 1.29.2.2 pgoyette grp->SharedInfoLength, 1);
1318 1.29.2.2 pgoyette }
1319 1.29.2.2 pgoyette
1320 1.29.2.2 pgoyette /* And then, Resource Descriptors */
1321 1.29.2.2 pgoyette desc = (ACPI_CSRT_DESCRIPTOR *)
1322 1.29.2.2 pgoyette ((vaddr_t)(grp + 1) + grp->SharedInfoLength);
1323 1.29.2.2 pgoyette while (desc < (ACPI_CSRT_DESCRIPTOR *)((vaddr_t)grp + grp->Length)) {
1324 1.29.2.2 pgoyette bool unknownsubytpe = false;
1325 1.29.2.2 pgoyette printf("\n\tLength=%u\n", desc->Length);
1326 1.29.2.2 pgoyette printf("\tResource Type=");
1327 1.29.2.2 pgoyette switch (desc->Type) {
1328 1.29.2.2 pgoyette case ACPI_CSRT_TYPE_INTERRUPT:
1329 1.29.2.2 pgoyette printf("Interrupt");
1330 1.29.2.2 pgoyette switch (desc->Subtype) {
1331 1.29.2.2 pgoyette case ACPI_CSRT_XRUPT_LINE:
1332 1.29.2.2 pgoyette printf("(Interrupt line)\n");
1333 1.29.2.2 pgoyette break;
1334 1.29.2.2 pgoyette case ACPI_CSRT_XRUPT_CONTROLLER:
1335 1.29.2.2 pgoyette printf("(Interrupt controller)\n");
1336 1.29.2.2 pgoyette break;
1337 1.29.2.2 pgoyette default:
1338 1.29.2.2 pgoyette unknownsubytpe = true;
1339 1.29.2.2 pgoyette break;
1340 1.29.2.2 pgoyette }
1341 1.29.2.2 pgoyette break;
1342 1.29.2.2 pgoyette case ACPI_CSRT_TYPE_TIMER:
1343 1.29.2.2 pgoyette printf("Timer");
1344 1.29.2.2 pgoyette switch (desc->Subtype) {
1345 1.29.2.2 pgoyette case ACPI_CSRT_TIMER:
1346 1.29.2.2 pgoyette printf("\n");
1347 1.29.2.2 pgoyette break;
1348 1.29.2.2 pgoyette default:
1349 1.29.2.2 pgoyette unknownsubytpe = true;
1350 1.29.2.2 pgoyette break;
1351 1.29.2.2 pgoyette }
1352 1.29.2.2 pgoyette break;
1353 1.29.2.2 pgoyette case ACPI_CSRT_TYPE_DMA:
1354 1.29.2.2 pgoyette printf("DMA");
1355 1.29.2.2 pgoyette switch (desc->Subtype) {
1356 1.29.2.2 pgoyette case ACPI_CSRT_DMA_CHANNEL:
1357 1.29.2.2 pgoyette printf("(DMA channel)\n");
1358 1.29.2.2 pgoyette break;
1359 1.29.2.2 pgoyette case ACPI_CSRT_DMA_CONTROLLER:
1360 1.29.2.2 pgoyette printf("(DMA controller)\n");
1361 1.29.2.2 pgoyette break;
1362 1.29.2.2 pgoyette default:
1363 1.29.2.2 pgoyette unknownsubytpe = true;
1364 1.29.2.2 pgoyette break;
1365 1.29.2.2 pgoyette }
1366 1.29.2.2 pgoyette break;
1367 1.29.2.2 pgoyette case 0x0004: /* XXX Platform Security */
1368 1.29.2.2 pgoyette printf("Platform Security");
1369 1.29.2.2 pgoyette switch (desc->Subtype) {
1370 1.29.2.2 pgoyette case 0x0001:
1371 1.29.2.2 pgoyette printf("\n");
1372 1.29.2.2 pgoyette /* Platform Security */
1373 1.29.2.2 pgoyette break;
1374 1.29.2.2 pgoyette default:
1375 1.29.2.2 pgoyette unknownsubytpe = true;
1376 1.29.2.2 pgoyette break;
1377 1.29.2.2 pgoyette }
1378 1.29.2.2 pgoyette break;
1379 1.29.2.2 pgoyette default:
1380 1.29.2.2 pgoyette printf("Unknown (%hx)\n", desc->Type);
1381 1.29.2.2 pgoyette break;
1382 1.29.2.2 pgoyette }
1383 1.29.2.2 pgoyette if (unknownsubytpe)
1384 1.29.2.2 pgoyette printf("(unknown subtype(%hx))\n", desc->Subtype);
1385 1.29.2.2 pgoyette
1386 1.29.2.2 pgoyette printf("\tUID=0x%08x\n", desc->Uid);
1387 1.29.2.2 pgoyette printf("\tVendor defined info ");
1388 1.29.2.2 pgoyette acpi_dump_bytes((uint8_t *)(desc + 1),
1389 1.29.2.2 pgoyette desc->Length - sizeof(ACPI_CSRT_DESCRIPTOR), 1);
1390 1.29.2.2 pgoyette
1391 1.29.2.2 pgoyette /* Next */
1392 1.29.2.2 pgoyette desc = (ACPI_CSRT_DESCRIPTOR *)((vaddr_t)desc + desc->Length);
1393 1.29.2.2 pgoyette }
1394 1.29.2.2 pgoyette }
1395 1.29.2.2 pgoyette
1396 1.29.2.2 pgoyette static void
1397 1.29.2.2 pgoyette acpi_handle_csrt(ACPI_TABLE_HEADER *sdp)
1398 1.29.2.2 pgoyette {
1399 1.29.2.2 pgoyette ACPI_CSRT_GROUP *grp;
1400 1.29.2.2 pgoyette uint totallen = sdp->Length;
1401 1.29.2.2 pgoyette
1402 1.29.2.2 pgoyette printf(BEGIN_COMMENT);
1403 1.29.2.2 pgoyette acpi_print_sdt(sdp);
1404 1.29.2.2 pgoyette grp = (ACPI_CSRT_GROUP *)(sdp + 1);
1405 1.29.2.2 pgoyette
1406 1.29.2.2 pgoyette while (grp < (ACPI_CSRT_GROUP *)((vaddr_t)sdp + totallen)) {
1407 1.29.2.2 pgoyette printf("\n");
1408 1.29.2.2 pgoyette acpi_print_csrt_resource_group(grp);
1409 1.29.2.2 pgoyette
1410 1.29.2.2 pgoyette /* Next */
1411 1.29.2.2 pgoyette grp = (ACPI_CSRT_GROUP *)((vaddr_t)grp + grp->Length);
1412 1.29.2.2 pgoyette }
1413 1.29.2.2 pgoyette
1414 1.29.2.2 pgoyette printf(END_COMMENT);
1415 1.29.2.2 pgoyette }
1416 1.29.2.2 pgoyette
1417 1.29.2.2 pgoyette static void
1418 1.5 cegger acpi_handle_dbgp(ACPI_TABLE_HEADER *sdp)
1419 1.5 cegger {
1420 1.5 cegger ACPI_TABLE_DBGP *dbgp;
1421 1.5 cegger
1422 1.5 cegger printf(BEGIN_COMMENT);
1423 1.5 cegger acpi_print_sdt(sdp);
1424 1.5 cegger dbgp = (ACPI_TABLE_DBGP *)sdp;
1425 1.5 cegger printf("\tType={");
1426 1.5 cegger switch (dbgp->Type) {
1427 1.5 cegger case 0:
1428 1.5 cegger printf("full 16550");
1429 1.5 cegger break;
1430 1.5 cegger case 1:
1431 1.5 cegger printf("subset of 16550");
1432 1.5 cegger break;
1433 1.5 cegger }
1434 1.5 cegger printf("}\n");
1435 1.28 msaitoh printf("\tDebugPort=");
1436 1.5 cegger acpi_print_gas(&dbgp->DebugPort);
1437 1.28 msaitoh printf("\n");
1438 1.5 cegger printf(END_COMMENT);
1439 1.5 cegger }
1440 1.5 cegger
1441 1.29.2.1 pgoyette /* This function is used by DBG2 and SPCR. */
1442 1.29.2.1 pgoyette static void
1443 1.29.2.1 pgoyette acpi_print_dbg2_serial_subtype(uint16_t subtype)
1444 1.29.2.1 pgoyette {
1445 1.29.2.1 pgoyette
1446 1.29.2.1 pgoyette switch (subtype) {
1447 1.29.2.1 pgoyette case ACPI_DBG2_16550_COMPATIBLE:
1448 1.29.2.1 pgoyette printf("Fully 16550 compatible\n");
1449 1.29.2.1 pgoyette break;
1450 1.29.2.1 pgoyette case ACPI_DBG2_16550_SUBSET:
1451 1.29.2.1 pgoyette printf("16550 subset with DBGP Rev. 1\n");
1452 1.29.2.1 pgoyette break;
1453 1.29.2.1 pgoyette case ACPI_DBG2_ARM_PL011:
1454 1.29.2.1 pgoyette printf("ARM PL011\n");
1455 1.29.2.1 pgoyette break;
1456 1.29.2.1 pgoyette case ACPI_DBG2_ARM_SBSA_32BIT:
1457 1.29.2.1 pgoyette printf("ARM SBSA 32bit only\n");
1458 1.29.2.1 pgoyette break;
1459 1.29.2.1 pgoyette case ACPI_DBG2_ARM_SBSA_GENERIC:
1460 1.29.2.1 pgoyette printf("ARM SBSA Generic\n");
1461 1.29.2.1 pgoyette break;
1462 1.29.2.1 pgoyette case ACPI_DBG2_ARM_DCC:
1463 1.29.2.1 pgoyette printf("ARM DCC\n");
1464 1.29.2.1 pgoyette break;
1465 1.29.2.1 pgoyette case ACPI_DBG2_BCM2835:
1466 1.29.2.1 pgoyette printf("BCM2835\n");
1467 1.29.2.1 pgoyette break;
1468 1.29.2.1 pgoyette default:
1469 1.29.2.1 pgoyette printf("reserved (%04hx)\n", subtype);
1470 1.29.2.1 pgoyette break;
1471 1.29.2.1 pgoyette }
1472 1.29.2.1 pgoyette }
1473 1.29.2.1 pgoyette
1474 1.5 cegger static void
1475 1.22 msaitoh acpi_print_dbg2_device(ACPI_DBG2_DEVICE *dev)
1476 1.22 msaitoh {
1477 1.22 msaitoh
1478 1.22 msaitoh printf("\t\tRevision=%u\n", dev->Revision);
1479 1.22 msaitoh printf("\t\tLength=%u\n", dev->Length);
1480 1.22 msaitoh printf("\t\tRegisterCount=%u\n", dev->RegisterCount);
1481 1.22 msaitoh
1482 1.22 msaitoh printf("\t\tNamepath=");
1483 1.22 msaitoh acpi_print_string((char *)((vaddr_t)dev + dev->NamepathOffset),
1484 1.22 msaitoh dev->NamepathLength);
1485 1.22 msaitoh printf("\n");
1486 1.22 msaitoh
1487 1.22 msaitoh if (dev->OemDataLength) {
1488 1.22 msaitoh printf("\t\tOemDataLength=%u\n", dev->OemDataLength);
1489 1.22 msaitoh printf("\t\tOemDataOffset=%u\n", dev->OemDataOffset);
1490 1.22 msaitoh /* XXX need dump */
1491 1.22 msaitoh }
1492 1.22 msaitoh
1493 1.22 msaitoh printf("\t\tPortType=");
1494 1.22 msaitoh switch (dev->PortType) {
1495 1.22 msaitoh case ACPI_DBG2_SERIAL_PORT:
1496 1.22 msaitoh printf("Serial\n" "\t\tPortSubtype=");
1497 1.29.2.1 pgoyette acpi_print_dbg2_serial_subtype(dev->PortSubtype);
1498 1.22 msaitoh break;
1499 1.22 msaitoh case ACPI_DBG2_1394_PORT:
1500 1.22 msaitoh printf("IEEE1394\n" "\t\tPortSubtype=");
1501 1.22 msaitoh if (dev->PortSubtype == ACPI_DBG2_1394_STANDARD)
1502 1.22 msaitoh printf("Standard\n");
1503 1.22 msaitoh else
1504 1.22 msaitoh printf("reserved (%04hx)\n", dev->PortSubtype);
1505 1.22 msaitoh break;
1506 1.22 msaitoh case ACPI_DBG2_USB_PORT:
1507 1.22 msaitoh printf("USB\n" "\t\tPortSubtype=");
1508 1.22 msaitoh switch (dev->PortSubtype) {
1509 1.22 msaitoh case ACPI_DBG2_USB_XHCI:
1510 1.22 msaitoh printf("XHCIn");
1511 1.22 msaitoh break;
1512 1.22 msaitoh case ACPI_DBG2_USB_EHCI:
1513 1.22 msaitoh printf("EHCI\n");
1514 1.22 msaitoh break;
1515 1.22 msaitoh default:
1516 1.22 msaitoh printf("reserved (%04hx)\n", dev->PortSubtype);
1517 1.22 msaitoh break;
1518 1.22 msaitoh }
1519 1.22 msaitoh break;
1520 1.22 msaitoh case ACPI_DBG2_NET_PORT:
1521 1.22 msaitoh printf("Net\n" "\t\tPciVendorID=%04x\n", dev->PortSubtype);
1522 1.22 msaitoh break;
1523 1.22 msaitoh default:
1524 1.22 msaitoh printf("reserved (%04hx)\n", dev->PortType);
1525 1.22 msaitoh printf("\t\tPortSubtype=reserved (%04hx)\n", dev->PortSubtype);
1526 1.22 msaitoh break;
1527 1.22 msaitoh }
1528 1.22 msaitoh
1529 1.22 msaitoh printf("\t\tBaseAddressOffset=0x%04x\n", dev->BaseAddressOffset);
1530 1.22 msaitoh printf("\t\tAddressSizeOffset=0x%04x\n", dev->AddressSizeOffset);
1531 1.22 msaitoh }
1532 1.22 msaitoh
1533 1.22 msaitoh static void
1534 1.22 msaitoh acpi_handle_dbg2(ACPI_TABLE_HEADER *sdp)
1535 1.22 msaitoh {
1536 1.22 msaitoh ACPI_TABLE_DBG2 *dbg2;
1537 1.22 msaitoh ACPI_DBG2_DEVICE *device;
1538 1.22 msaitoh unsigned int i;
1539 1.22 msaitoh
1540 1.22 msaitoh printf(BEGIN_COMMENT);
1541 1.22 msaitoh acpi_print_sdt(sdp);
1542 1.22 msaitoh dbg2 = (ACPI_TABLE_DBG2 *)sdp;
1543 1.22 msaitoh
1544 1.22 msaitoh printf("\tCount=%u\n", dbg2->InfoCount);
1545 1.22 msaitoh device = (ACPI_DBG2_DEVICE *)((vaddr_t)sdp + dbg2->InfoOffset);
1546 1.22 msaitoh for (i = 0; i < dbg2->InfoCount; i++) {
1547 1.22 msaitoh printf("\tDevice %u={\n", i);
1548 1.22 msaitoh acpi_print_dbg2_device(device);
1549 1.22 msaitoh printf("\t}\n");
1550 1.22 msaitoh device++;
1551 1.22 msaitoh }
1552 1.22 msaitoh
1553 1.22 msaitoh printf(END_COMMENT);
1554 1.22 msaitoh }
1555 1.22 msaitoh
1556 1.22 msaitoh static void
1557 1.5 cegger acpi_print_einj_action(ACPI_WHEA_HEADER *whea)
1558 1.5 cegger {
1559 1.5 cegger printf("\tACTION={");
1560 1.5 cegger switch (whea->Action) {
1561 1.5 cegger case ACPI_EINJ_BEGIN_OPERATION:
1562 1.5 cegger printf("Begin Operation");
1563 1.5 cegger break;
1564 1.5 cegger case ACPI_EINJ_GET_TRIGGER_TABLE:
1565 1.5 cegger printf("Get Trigger Table");
1566 1.5 cegger break;
1567 1.5 cegger case ACPI_EINJ_SET_ERROR_TYPE:
1568 1.5 cegger printf("Set Error Type");
1569 1.5 cegger break;
1570 1.5 cegger case ACPI_EINJ_GET_ERROR_TYPE:
1571 1.5 cegger printf("Get Error Type");
1572 1.5 cegger break;
1573 1.5 cegger case ACPI_EINJ_END_OPERATION:
1574 1.5 cegger printf("End Operation");
1575 1.5 cegger break;
1576 1.5 cegger case ACPI_EINJ_EXECUTE_OPERATION:
1577 1.5 cegger printf("Execute Operation");
1578 1.5 cegger break;
1579 1.5 cegger case ACPI_EINJ_CHECK_BUSY_STATUS:
1580 1.5 cegger printf("Check Busy Status");
1581 1.5 cegger break;
1582 1.5 cegger case ACPI_EINJ_GET_COMMAND_STATUS:
1583 1.5 cegger printf("Get Command Status");
1584 1.5 cegger break;
1585 1.19 msaitoh case ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS:
1586 1.19 msaitoh printf("Set Error Type With Address");
1587 1.19 msaitoh break;
1588 1.19 msaitoh case ACPI_EINJ_GET_EXECUTE_TIMINGS:
1589 1.19 msaitoh printf("Get Execute Operation Timings");
1590 1.19 msaitoh break;
1591 1.5 cegger case ACPI_EINJ_ACTION_RESERVED:
1592 1.5 cegger printf("Preserved");
1593 1.5 cegger break;
1594 1.5 cegger case ACPI_EINJ_TRIGGER_ERROR:
1595 1.5 cegger printf("Trigger Error");
1596 1.5 cegger break;
1597 1.5 cegger default:
1598 1.5 cegger printf("%d", whea->Action);
1599 1.5 cegger break;
1600 1.5 cegger }
1601 1.5 cegger printf("}\n");
1602 1.5 cegger }
1603 1.5 cegger
1604 1.5 cegger static void
1605 1.5 cegger acpi_print_einj_instruction(ACPI_WHEA_HEADER *whea)
1606 1.5 cegger {
1607 1.5 cegger uint32_t ins = whea->Instruction;
1608 1.5 cegger
1609 1.5 cegger printf("\tINSTRUCTION={");
1610 1.5 cegger switch (ins) {
1611 1.5 cegger case ACPI_EINJ_READ_REGISTER:
1612 1.5 cegger printf("Read Register");
1613 1.5 cegger break;
1614 1.5 cegger case ACPI_EINJ_READ_REGISTER_VALUE:
1615 1.5 cegger printf("Read Register Value");
1616 1.5 cegger break;
1617 1.5 cegger case ACPI_EINJ_WRITE_REGISTER:
1618 1.5 cegger printf("Write Register");
1619 1.5 cegger break;
1620 1.5 cegger case ACPI_EINJ_WRITE_REGISTER_VALUE:
1621 1.5 cegger printf("Write Register Value");
1622 1.5 cegger break;
1623 1.5 cegger case ACPI_EINJ_NOOP:
1624 1.5 cegger printf("Noop");
1625 1.5 cegger break;
1626 1.5 cegger case ACPI_EINJ_INSTRUCTION_RESERVED:
1627 1.5 cegger printf("Reserved");
1628 1.5 cegger break;
1629 1.5 cegger default:
1630 1.5 cegger printf("%d", ins);
1631 1.5 cegger break;
1632 1.5 cegger }
1633 1.5 cegger printf("}\n");
1634 1.5 cegger }
1635 1.5 cegger
1636 1.5 cegger static void
1637 1.5 cegger acpi_print_einj_flags(ACPI_WHEA_HEADER *whea)
1638 1.5 cegger {
1639 1.5 cegger uint32_t flags = whea->Flags;
1640 1.5 cegger
1641 1.25 msaitoh printf("\tFLAGS={");
1642 1.5 cegger if (flags & ACPI_EINJ_PRESERVE)
1643 1.5 cegger printf("PRESERVED");
1644 1.5 cegger printf("}\n");
1645 1.5 cegger }
1646 1.5 cegger
1647 1.5 cegger static void
1648 1.5 cegger acpi_handle_einj(ACPI_TABLE_HEADER *sdp)
1649 1.5 cegger {
1650 1.5 cegger ACPI_TABLE_EINJ *einj;
1651 1.5 cegger ACPI_EINJ_ENTRY *einj_entry;
1652 1.5 cegger uint32_t einj_pos;
1653 1.5 cegger u_int i;
1654 1.5 cegger
1655 1.5 cegger printf(BEGIN_COMMENT);
1656 1.5 cegger acpi_print_sdt(sdp);
1657 1.5 cegger einj = (ACPI_TABLE_EINJ *)sdp;
1658 1.5 cegger
1659 1.5 cegger printf("\tHeader Length=%d\n", einj->HeaderLength);
1660 1.5 cegger printf("\tFlags=0x%x\n", einj->Flags);
1661 1.5 cegger printf("\tEntries=%d\n", einj->Entries);
1662 1.5 cegger
1663 1.5 cegger einj_pos = sizeof(ACPI_TABLE_EINJ);
1664 1.5 cegger for (i = 0; i < einj->Entries; i++) {
1665 1.5 cegger einj_entry = (ACPI_EINJ_ENTRY *)((char *)einj + einj_pos);
1666 1.5 cegger acpi_print_whea(&einj_entry->WheaHeader,
1667 1.5 cegger acpi_print_einj_action, acpi_print_einj_instruction,
1668 1.5 cegger acpi_print_einj_flags);
1669 1.5 cegger einj_pos += sizeof(ACPI_EINJ_ENTRY);
1670 1.5 cegger }
1671 1.5 cegger printf(END_COMMENT);
1672 1.5 cegger }
1673 1.5 cegger
1674 1.5 cegger static void
1675 1.5 cegger acpi_print_erst_action(ACPI_WHEA_HEADER *whea)
1676 1.5 cegger {
1677 1.5 cegger printf("\tACTION={");
1678 1.5 cegger switch (whea->Action) {
1679 1.5 cegger case ACPI_ERST_BEGIN_WRITE:
1680 1.5 cegger printf("Begin Write");
1681 1.5 cegger break;
1682 1.5 cegger case ACPI_ERST_BEGIN_READ:
1683 1.5 cegger printf("Begin Read");
1684 1.5 cegger break;
1685 1.5 cegger case ACPI_ERST_BEGIN_CLEAR:
1686 1.5 cegger printf("Begin Clear");
1687 1.5 cegger break;
1688 1.5 cegger case ACPI_ERST_END:
1689 1.5 cegger printf("End");
1690 1.5 cegger break;
1691 1.5 cegger case ACPI_ERST_SET_RECORD_OFFSET:
1692 1.5 cegger printf("Set Record Offset");
1693 1.5 cegger break;
1694 1.5 cegger case ACPI_ERST_EXECUTE_OPERATION:
1695 1.5 cegger printf("Execute Operation");
1696 1.5 cegger break;
1697 1.5 cegger case ACPI_ERST_CHECK_BUSY_STATUS:
1698 1.5 cegger printf("Check Busy Status");
1699 1.5 cegger break;
1700 1.5 cegger case ACPI_ERST_GET_COMMAND_STATUS:
1701 1.5 cegger printf("Get Command Status");
1702 1.5 cegger break;
1703 1.5 cegger case ACPI_ERST_GET_RECORD_ID:
1704 1.5 cegger printf("Get Record ID");
1705 1.5 cegger break;
1706 1.5 cegger case ACPI_ERST_SET_RECORD_ID:
1707 1.5 cegger printf("Set Record ID");
1708 1.5 cegger break;
1709 1.5 cegger case ACPI_ERST_GET_RECORD_COUNT:
1710 1.5 cegger printf("Get Record Count");
1711 1.5 cegger break;
1712 1.5 cegger case ACPI_ERST_BEGIN_DUMMY_WRIITE:
1713 1.5 cegger printf("Begin Dummy Write");
1714 1.5 cegger break;
1715 1.5 cegger case ACPI_ERST_NOT_USED:
1716 1.5 cegger printf("Unused");
1717 1.5 cegger break;
1718 1.5 cegger case ACPI_ERST_GET_ERROR_RANGE:
1719 1.5 cegger printf("Get Error Range");
1720 1.5 cegger break;
1721 1.5 cegger case ACPI_ERST_GET_ERROR_LENGTH:
1722 1.5 cegger printf("Get Error Length");
1723 1.5 cegger break;
1724 1.5 cegger case ACPI_ERST_GET_ERROR_ATTRIBUTES:
1725 1.5 cegger printf("Get Error Attributes");
1726 1.5 cegger break;
1727 1.19 msaitoh case ACPI_ERST_EXECUTE_TIMINGS:
1728 1.19 msaitoh printf("Execute Operation Timings");
1729 1.19 msaitoh break;
1730 1.5 cegger case ACPI_ERST_ACTION_RESERVED:
1731 1.5 cegger printf("Reserved");
1732 1.5 cegger break;
1733 1.5 cegger default:
1734 1.5 cegger printf("%d", whea->Action);
1735 1.5 cegger break;
1736 1.5 cegger }
1737 1.5 cegger printf("}\n");
1738 1.5 cegger }
1739 1.5 cegger
1740 1.5 cegger static void
1741 1.5 cegger acpi_print_erst_instruction(ACPI_WHEA_HEADER *whea)
1742 1.5 cegger {
1743 1.5 cegger printf("\tINSTRUCTION={");
1744 1.5 cegger switch (whea->Instruction) {
1745 1.5 cegger case ACPI_ERST_READ_REGISTER:
1746 1.5 cegger printf("Read Register");
1747 1.5 cegger break;
1748 1.5 cegger case ACPI_ERST_READ_REGISTER_VALUE:
1749 1.5 cegger printf("Read Register Value");
1750 1.5 cegger break;
1751 1.5 cegger case ACPI_ERST_WRITE_REGISTER:
1752 1.5 cegger printf("Write Register");
1753 1.5 cegger break;
1754 1.5 cegger case ACPI_ERST_WRITE_REGISTER_VALUE:
1755 1.5 cegger printf("Write Register Value");
1756 1.5 cegger break;
1757 1.5 cegger case ACPI_ERST_NOOP:
1758 1.5 cegger printf("Noop");
1759 1.5 cegger break;
1760 1.5 cegger case ACPI_ERST_LOAD_VAR1:
1761 1.5 cegger printf("Load Var1");
1762 1.5 cegger break;
1763 1.5 cegger case ACPI_ERST_LOAD_VAR2:
1764 1.5 cegger printf("Load Var2");
1765 1.5 cegger break;
1766 1.5 cegger case ACPI_ERST_STORE_VAR1:
1767 1.5 cegger printf("Store Var1");
1768 1.5 cegger break;
1769 1.5 cegger case ACPI_ERST_ADD:
1770 1.5 cegger printf("Add");
1771 1.5 cegger break;
1772 1.5 cegger case ACPI_ERST_SUBTRACT:
1773 1.5 cegger printf("Subtract");
1774 1.5 cegger break;
1775 1.5 cegger case ACPI_ERST_ADD_VALUE:
1776 1.5 cegger printf("Add Value");
1777 1.5 cegger break;
1778 1.5 cegger case ACPI_ERST_SUBTRACT_VALUE:
1779 1.5 cegger printf("Subtract Value");
1780 1.5 cegger break;
1781 1.5 cegger case ACPI_ERST_STALL:
1782 1.5 cegger printf("Stall");
1783 1.5 cegger break;
1784 1.5 cegger case ACPI_ERST_STALL_WHILE_TRUE:
1785 1.5 cegger printf("Stall While True");
1786 1.5 cegger break;
1787 1.5 cegger case ACPI_ERST_SKIP_NEXT_IF_TRUE:
1788 1.5 cegger printf("Skip Next If True");
1789 1.5 cegger break;
1790 1.5 cegger case ACPI_ERST_GOTO:
1791 1.5 cegger printf("Goto");
1792 1.5 cegger break;
1793 1.5 cegger case ACPI_ERST_SET_SRC_ADDRESS_BASE:
1794 1.5 cegger printf("Set Src Address Base");
1795 1.5 cegger break;
1796 1.5 cegger case ACPI_ERST_SET_DST_ADDRESS_BASE:
1797 1.5 cegger printf("Set Dst Address Base");
1798 1.5 cegger break;
1799 1.5 cegger case ACPI_ERST_MOVE_DATA:
1800 1.5 cegger printf("Move Data");
1801 1.5 cegger break;
1802 1.5 cegger case ACPI_ERST_INSTRUCTION_RESERVED:
1803 1.5 cegger printf("Reserved");
1804 1.5 cegger break;
1805 1.5 cegger default:
1806 1.5 cegger printf("%d (reserved)", whea->Instruction);
1807 1.5 cegger break;
1808 1.5 cegger }
1809 1.5 cegger printf("}\n");
1810 1.5 cegger }
1811 1.5 cegger
1812 1.5 cegger static void
1813 1.5 cegger acpi_print_erst_flags(ACPI_WHEA_HEADER *whea)
1814 1.5 cegger {
1815 1.5 cegger uint32_t flags = whea->Flags;
1816 1.5 cegger
1817 1.25 msaitoh printf("\tFLAGS={");
1818 1.5 cegger if (flags & ACPI_ERST_PRESERVE)
1819 1.5 cegger printf("PRESERVED");
1820 1.5 cegger printf("}\n");
1821 1.5 cegger }
1822 1.5 cegger
1823 1.5 cegger static void
1824 1.5 cegger acpi_handle_erst(ACPI_TABLE_HEADER *sdp)
1825 1.5 cegger {
1826 1.5 cegger ACPI_TABLE_ERST *erst;
1827 1.5 cegger ACPI_ERST_ENTRY *erst_entry;
1828 1.5 cegger uint32_t erst_pos;
1829 1.5 cegger u_int i;
1830 1.5 cegger
1831 1.5 cegger printf(BEGIN_COMMENT);
1832 1.5 cegger acpi_print_sdt(sdp);
1833 1.5 cegger erst = (ACPI_TABLE_ERST *)sdp;
1834 1.5 cegger
1835 1.5 cegger printf("\tHeader Length=%d\n", erst->HeaderLength);
1836 1.5 cegger printf("\tEntries=%d\n", erst->Entries);
1837 1.5 cegger
1838 1.5 cegger erst_pos = sizeof(ACPI_TABLE_ERST);
1839 1.5 cegger for (i = 0; i < erst->Entries; i++) {
1840 1.5 cegger erst_entry = (ACPI_ERST_ENTRY *)((char *)erst + erst_pos);
1841 1.5 cegger acpi_print_whea(&erst_entry->WheaHeader,
1842 1.5 cegger acpi_print_erst_action, acpi_print_erst_instruction,
1843 1.5 cegger acpi_print_erst_flags);
1844 1.5 cegger erst_pos += sizeof(ACPI_ERST_ENTRY);
1845 1.5 cegger }
1846 1.5 cegger printf(END_COMMENT);
1847 1.5 cegger }
1848 1.5 cegger
1849 1.5 cegger static void
1850 1.29.2.1 pgoyette acpi_print_gtd_timer(const char *name, uint32_t interrupt, uint32_t flags)
1851 1.29.2.1 pgoyette {
1852 1.29.2.1 pgoyette
1853 1.29.2.1 pgoyette printf("\t%s Timer GSIV=%d\n", name, interrupt);
1854 1.29.2.1 pgoyette printf("\t%s Flags={Mode=", name);
1855 1.29.2.1 pgoyette if (flags & ACPI_GTDT_INTERRUPT_MODE)
1856 1.29.2.1 pgoyette printf("edge");
1857 1.29.2.1 pgoyette else
1858 1.29.2.1 pgoyette printf("level");
1859 1.29.2.1 pgoyette printf(", Polarity=");
1860 1.29.2.1 pgoyette if (flags & ACPI_GTDT_INTERRUPT_POLARITY)
1861 1.29.2.1 pgoyette printf("active-lo");
1862 1.29.2.1 pgoyette else
1863 1.29.2.1 pgoyette printf("active-hi");
1864 1.29.2.1 pgoyette if (flags & ACPI_GTDT_ALWAYS_ON)
1865 1.29.2.1 pgoyette printf(", always-on");
1866 1.29.2.1 pgoyette printf("}\n");
1867 1.29.2.1 pgoyette }
1868 1.29.2.1 pgoyette
1869 1.29.2.1 pgoyette static void
1870 1.29.2.1 pgoyette acpi_print_gtd_block_timer_flags(const char *name, uint32_t interrupt,
1871 1.29.2.1 pgoyette uint32_t flags)
1872 1.29.2.1 pgoyette {
1873 1.29.2.1 pgoyette
1874 1.29.2.1 pgoyette printf("\t\t%s Timer GSIV=%d\n", name, interrupt);
1875 1.29.2.1 pgoyette printf("\t\t%s Timer Flags={Mode=", name);
1876 1.29.2.1 pgoyette if (flags & ACPI_GTDT_GT_IRQ_MODE)
1877 1.29.2.1 pgoyette printf("Secure");
1878 1.29.2.1 pgoyette else
1879 1.29.2.1 pgoyette printf("Non-Secure");
1880 1.29.2.1 pgoyette printf(", Polarity=");
1881 1.29.2.1 pgoyette if (flags & ACPI_GTDT_GT_IRQ_POLARITY)
1882 1.29.2.1 pgoyette printf("active-lo");
1883 1.29.2.1 pgoyette else
1884 1.29.2.1 pgoyette printf("active-hi");
1885 1.29.2.1 pgoyette printf("}\n");
1886 1.29.2.1 pgoyette }
1887 1.29.2.1 pgoyette
1888 1.29.2.1 pgoyette static void
1889 1.29.2.1 pgoyette acpi_print_gtblock(ACPI_GTDT_TIMER_BLOCK *gtblock)
1890 1.29.2.1 pgoyette {
1891 1.29.2.1 pgoyette ACPI_GTDT_TIMER_ENTRY *entry;
1892 1.29.2.1 pgoyette unsigned int i;
1893 1.29.2.1 pgoyette
1894 1.29.2.1 pgoyette printf("\tType=GT Block\n");
1895 1.29.2.1 pgoyette printf("\tLength=%d\n", gtblock->Header.Length);
1896 1.29.2.1 pgoyette /* XXX might not 8byte aligned */
1897 1.29.2.1 pgoyette printf("\tBlockAddress=%016jx\n",
1898 1.29.2.1 pgoyette (uintmax_t)gtblock->BlockAddress);
1899 1.29.2.1 pgoyette
1900 1.29.2.1 pgoyette printf("\tGT Block Timer Count=%d\n", gtblock->TimerCount);
1901 1.29.2.1 pgoyette entry = (ACPI_GTDT_TIMER_ENTRY *)((vaddr_t)gtblock
1902 1.29.2.1 pgoyette + gtblock->TimerOffset);
1903 1.29.2.1 pgoyette for (i = 0; i < gtblock->TimerCount; i++) {
1904 1.29.2.1 pgoyette printf("\n");
1905 1.29.2.1 pgoyette if (entry >= (ACPI_GTDT_TIMER_ENTRY *)((vaddr_t)gtblock
1906 1.29.2.1 pgoyette + gtblock->Header.Length)) {
1907 1.29.2.1 pgoyette printf("\\ttWrong Timer entry\n");
1908 1.29.2.1 pgoyette break;
1909 1.29.2.1 pgoyette }
1910 1.29.2.1 pgoyette printf("\t\tFrame Number=%d\n", entry->FrameNumber);
1911 1.29.2.1 pgoyette /* XXX might not 8byte aligned */
1912 1.29.2.1 pgoyette printf("\t\tBaseAddress=%016jx\n",
1913 1.29.2.1 pgoyette (uintmax_t)entry->BaseAddress);
1914 1.29.2.1 pgoyette /* XXX might not 8byte aligned */
1915 1.29.2.1 pgoyette printf("\t\tEl0BaseAddress=%016jx\n",
1916 1.29.2.1 pgoyette (uintmax_t)entry->El0BaseAddress);
1917 1.29.2.1 pgoyette
1918 1.29.2.1 pgoyette acpi_print_gtd_block_timer_flags("Physical",
1919 1.29.2.1 pgoyette entry->TimerInterrupt, entry->TimerFlags);
1920 1.29.2.1 pgoyette acpi_print_gtd_block_timer_flags("Virtual",
1921 1.29.2.1 pgoyette entry->VirtualTimerInterrupt, entry->VirtualTimerFlags);
1922 1.29.2.1 pgoyette
1923 1.29.2.1 pgoyette printf("\t\tCommon Flags={Mode=");
1924 1.29.2.1 pgoyette if (entry->CommonFlags & ACPI_GTDT_GT_IS_SECURE_TIMER)
1925 1.29.2.1 pgoyette printf("Secure");
1926 1.29.2.1 pgoyette else
1927 1.29.2.1 pgoyette printf("Non-Secure");
1928 1.29.2.1 pgoyette if (entry->CommonFlags & ACPI_GTDT_GT_ALWAYS_ON)
1929 1.29.2.1 pgoyette printf(", always-on");
1930 1.29.2.1 pgoyette printf("}\n");
1931 1.29.2.1 pgoyette
1932 1.29.2.1 pgoyette entry++;
1933 1.29.2.1 pgoyette }
1934 1.29.2.1 pgoyette }
1935 1.29.2.1 pgoyette
1936 1.29.2.1 pgoyette static void
1937 1.29.2.1 pgoyette acpi_print_sbsa_watchdog(ACPI_GTDT_WATCHDOG *wdog)
1938 1.29.2.1 pgoyette {
1939 1.29.2.1 pgoyette
1940 1.29.2.1 pgoyette printf("\tType=Watchdog GT\n");
1941 1.29.2.1 pgoyette printf("\tLength=%d\n", wdog->Header.Length);
1942 1.29.2.1 pgoyette /* XXX might not 8byte aligned */
1943 1.29.2.1 pgoyette printf("\tRefreshFrameAddress=%016jx\n",
1944 1.29.2.1 pgoyette (uintmax_t)wdog->RefreshFrameAddress);
1945 1.29.2.1 pgoyette /* XXX might not 8byte aligned */
1946 1.29.2.1 pgoyette printf("\tControlFrameAddress=%016jx\n",
1947 1.29.2.1 pgoyette (uintmax_t)wdog->ControlFrameAddress);
1948 1.29.2.1 pgoyette printf("\tGSIV=%d\n", wdog->TimerInterrupt);
1949 1.29.2.1 pgoyette
1950 1.29.2.1 pgoyette printf("\tFlags={Mode=");
1951 1.29.2.1 pgoyette if (wdog->TimerFlags & ACPI_GTDT_WATCHDOG_IRQ_MODE)
1952 1.29.2.1 pgoyette printf("edge");
1953 1.29.2.1 pgoyette else
1954 1.29.2.1 pgoyette printf("level");
1955 1.29.2.1 pgoyette printf(", Polarity=");
1956 1.29.2.1 pgoyette if (wdog->TimerFlags & ACPI_GTDT_WATCHDOG_IRQ_POLARITY)
1957 1.29.2.1 pgoyette printf("active-lo");
1958 1.29.2.1 pgoyette else
1959 1.29.2.1 pgoyette printf("active-hi");
1960 1.29.2.1 pgoyette if (wdog->TimerFlags & ACPI_GTDT_WATCHDOG_SECURE)
1961 1.29.2.1 pgoyette printf(", Secure");
1962 1.29.2.1 pgoyette else
1963 1.29.2.1 pgoyette printf(", Non-Secure");
1964 1.29.2.1 pgoyette printf("}\n");
1965 1.29.2.1 pgoyette }
1966 1.29.2.1 pgoyette
1967 1.29.2.1 pgoyette static void
1968 1.29.2.1 pgoyette acpi_handle_gtdt(ACPI_TABLE_HEADER *sdp)
1969 1.29.2.1 pgoyette {
1970 1.29.2.1 pgoyette ACPI_TABLE_GTDT *gtdt;
1971 1.29.2.1 pgoyette ACPI_GTDT_HEADER *hdr;
1972 1.29.2.1 pgoyette u_int i;
1973 1.29.2.1 pgoyette
1974 1.29.2.1 pgoyette printf(BEGIN_COMMENT);
1975 1.29.2.1 pgoyette acpi_print_sdt(sdp);
1976 1.29.2.1 pgoyette gtdt = (ACPI_TABLE_GTDT *)sdp;
1977 1.29.2.1 pgoyette
1978 1.29.2.1 pgoyette printf("\tCounterBlockAddresss=%016jx\n",
1979 1.29.2.1 pgoyette (uintmax_t)gtdt->CounterBlockAddresss); /* XXX not 8byte aligned */
1980 1.29.2.1 pgoyette printf("\tCounterReadBlockAddress=%016jx\n",
1981 1.29.2.1 pgoyette (uintmax_t)gtdt->CounterReadBlockAddress);
1982 1.29.2.1 pgoyette
1983 1.29.2.1 pgoyette #define PRINTTIMER(gtdt, name) acpi_print_gtd_timer( \
1984 1.29.2.1 pgoyette #name, (gtdt)-> name## Interrupt, \
1985 1.29.2.1 pgoyette (gtdt)-> name ## Flags)
1986 1.29.2.1 pgoyette
1987 1.29.2.1 pgoyette PRINTTIMER(gtdt, SecureEl1);
1988 1.29.2.1 pgoyette PRINTTIMER(gtdt, NonSecureEl1);
1989 1.29.2.1 pgoyette PRINTTIMER(gtdt, VirtualTimer);
1990 1.29.2.1 pgoyette PRINTTIMER(gtdt, NonSecureEl2);
1991 1.29.2.1 pgoyette
1992 1.29.2.1 pgoyette #undef PRINTTIMER
1993 1.29.2.1 pgoyette
1994 1.29.2.1 pgoyette printf("\tPlatform Timer Count=%d\n", gtdt->PlatformTimerCount);
1995 1.29.2.1 pgoyette
1996 1.29.2.1 pgoyette hdr = (ACPI_GTDT_HEADER *)((vaddr_t)sdp + gtdt->PlatformTimerOffset);
1997 1.29.2.1 pgoyette for (i = 0; i < gtdt->PlatformTimerCount; i++) {
1998 1.29.2.1 pgoyette printf("\n");
1999 1.29.2.1 pgoyette if (hdr >= (ACPI_GTDT_HEADER *)((vaddr_t)sdp + sdp->Length)) {
2000 1.29.2.1 pgoyette printf("\tWrong GTDT header"
2001 1.29.2.1 pgoyette "(type = %hhu, length = %hu)\n",
2002 1.29.2.1 pgoyette hdr->Type, hdr->Length);
2003 1.29.2.1 pgoyette break;
2004 1.29.2.1 pgoyette }
2005 1.29.2.1 pgoyette
2006 1.29.2.1 pgoyette switch (hdr->Type) {
2007 1.29.2.1 pgoyette case ACPI_GTDT_TYPE_TIMER_BLOCK:
2008 1.29.2.1 pgoyette acpi_print_gtblock((ACPI_GTDT_TIMER_BLOCK *)hdr);
2009 1.29.2.1 pgoyette break;
2010 1.29.2.1 pgoyette case ACPI_GTDT_TYPE_WATCHDOG:
2011 1.29.2.1 pgoyette acpi_print_sbsa_watchdog((ACPI_GTDT_WATCHDOG *)hdr);
2012 1.29.2.1 pgoyette break;
2013 1.29.2.1 pgoyette default:
2014 1.29.2.1 pgoyette printf("\tUnknown Platform Timer Type"
2015 1.29.2.1 pgoyette "(type = %hhu, length = %hu)\n",
2016 1.29.2.1 pgoyette hdr->Type, hdr->Length);
2017 1.29.2.1 pgoyette break;
2018 1.29.2.1 pgoyette }
2019 1.29.2.1 pgoyette /* Next */
2020 1.29.2.1 pgoyette hdr = (ACPI_GTDT_HEADER *)((vaddr_t)hdr + hdr->Length);
2021 1.29.2.1 pgoyette }
2022 1.29.2.1 pgoyette printf(END_COMMENT);
2023 1.29.2.1 pgoyette }
2024 1.29.2.1 pgoyette
2025 1.29.2.1 pgoyette static void
2026 1.5 cegger acpi_handle_madt(ACPI_TABLE_HEADER *sdp)
2027 1.5 cegger {
2028 1.5 cegger ACPI_TABLE_MADT *madt;
2029 1.5 cegger
2030 1.5 cegger printf(BEGIN_COMMENT);
2031 1.5 cegger acpi_print_sdt(sdp);
2032 1.5 cegger madt = (ACPI_TABLE_MADT *)sdp;
2033 1.5 cegger printf("\tLocal APIC ADDR=0x%08x\n", madt->Address);
2034 1.5 cegger printf("\tFlags={");
2035 1.5 cegger if (madt->Flags & ACPI_MADT_PCAT_COMPAT)
2036 1.5 cegger printf("PC-AT");
2037 1.5 cegger printf("}\n");
2038 1.5 cegger acpi_walk_subtables(sdp, (madt + 1), acpi_print_madt);
2039 1.5 cegger printf(END_COMMENT);
2040 1.5 cegger }
2041 1.5 cegger
2042 1.5 cegger static void
2043 1.5 cegger acpi_handle_hpet(ACPI_TABLE_HEADER *sdp)
2044 1.5 cegger {
2045 1.5 cegger ACPI_TABLE_HPET *hpet;
2046 1.5 cegger
2047 1.5 cegger printf(BEGIN_COMMENT);
2048 1.5 cegger acpi_print_sdt(sdp);
2049 1.5 cegger hpet = (ACPI_TABLE_HPET *)sdp;
2050 1.5 cegger printf("\tHPET Number=%d\n", hpet->Sequence);
2051 1.5 cegger printf("\tADDR=");
2052 1.5 cegger acpi_print_gas(&hpet->Address);
2053 1.5 cegger printf("\tHW Rev=0x%x\n", hpet->Id & ACPI_HPET_ID_HARDWARE_REV_ID);
2054 1.5 cegger printf("\tComparators=%d\n", (hpet->Id & ACPI_HPET_ID_COMPARATORS) >>
2055 1.5 cegger 8);
2056 1.5 cegger printf("\tCounter Size=%d\n", hpet->Id & ACPI_HPET_ID_COUNT_SIZE_CAP ?
2057 1.5 cegger 1 : 0);
2058 1.5 cegger printf("\tLegacy IRQ routing capable={");
2059 1.5 cegger if (hpet->Id & ACPI_HPET_ID_LEGACY_CAPABLE)
2060 1.5 cegger printf("TRUE}\n");
2061 1.5 cegger else
2062 1.5 cegger printf("FALSE}\n");
2063 1.5 cegger printf("\tPCI Vendor ID=0x%04x\n", hpet->Id >> 16);
2064 1.5 cegger printf("\tMinimal Tick=%d\n", hpet->MinimumTick);
2065 1.16 msaitoh printf("\tFlags=0x%02x\n", hpet->Flags);
2066 1.5 cegger printf(END_COMMENT);
2067 1.5 cegger }
2068 1.5 cegger
2069 1.29.2.3 pgoyette /*
2070 1.29.2.3 pgoyette * IORT
2071 1.29.2.3 pgoyette * I/O Remapping Table
2072 1.29.2.3 pgoyette */
2073 1.29.2.3 pgoyette
2074 1.29.2.3 pgoyette static void acpi_print_iort_its_group(ACPI_IORT_NODE *);
2075 1.29.2.3 pgoyette static void acpi_print_iort_named_component(ACPI_IORT_NODE *);
2076 1.29.2.3 pgoyette static void acpi_print_iort_root_complex(ACPI_IORT_NODE *);
2077 1.29.2.3 pgoyette static void acpi_print_iort_smmuv1v2(ACPI_IORT_NODE *);
2078 1.29.2.3 pgoyette static void acpi_print_iort_smmuv3(ACPI_IORT_NODE *);
2079 1.29.2.3 pgoyette
2080 1.29.2.3 pgoyette struct iort_node_list {
2081 1.29.2.3 pgoyette uint8_t Type;
2082 1.29.2.3 pgoyette const char *gname;
2083 1.29.2.3 pgoyette void (*func)(ACPI_IORT_NODE *);
2084 1.29.2.3 pgoyette } iort_node_list [] = {
2085 1.29.2.3 pgoyette #define NDMAC(name) ACPI_IORT_NODE_## name
2086 1.29.2.3 pgoyette #define PRFN(name) acpi_print_iort_## name
2087 1.29.2.3 pgoyette { NDMAC(ITS_GROUP), "ITS group", PRFN(its_group)},
2088 1.29.2.3 pgoyette { NDMAC(NAMED_COMPONENT), "Named component", PRFN(named_component)},
2089 1.29.2.3 pgoyette { NDMAC(PCI_ROOT_COMPLEX), "Root complex", PRFN(root_complex)},
2090 1.29.2.3 pgoyette { NDMAC(SMMU), "SMMUv1 or v2", PRFN(smmuv1v2)},
2091 1.29.2.3 pgoyette { NDMAC(SMMU_V3), "SMMUv3", PRFN(smmuv3)},
2092 1.29.2.3 pgoyette { 255, NULL, NULL},
2093 1.29.2.3 pgoyette #undef NDMAC
2094 1.29.2.3 pgoyette #undef PRFN
2095 1.29.2.3 pgoyette };
2096 1.29.2.3 pgoyette
2097 1.29.2.3 pgoyette static void
2098 1.29.2.3 pgoyette acpi_print_iort_memory_access(ACPI_IORT_MEMORY_ACCESS *memacc)
2099 1.29.2.3 pgoyette {
2100 1.29.2.3 pgoyette
2101 1.29.2.3 pgoyette printf("\tMemory Access={\n");
2102 1.29.2.3 pgoyette printf("\t\tCacheCoherency=");
2103 1.29.2.3 pgoyette switch (memacc->CacheCoherency) {
2104 1.29.2.3 pgoyette case ACPI_IORT_NODE_COHERENT:
2105 1.29.2.3 pgoyette printf("Fully coherent\n");
2106 1.29.2.3 pgoyette break;
2107 1.29.2.3 pgoyette case ACPI_IORT_NODE_NOT_COHERENT:
2108 1.29.2.3 pgoyette printf("Not coherent\n");
2109 1.29.2.3 pgoyette break;
2110 1.29.2.3 pgoyette default:
2111 1.29.2.3 pgoyette printf("resrved (%u)\n", memacc->CacheCoherency);
2112 1.29.2.3 pgoyette break;
2113 1.29.2.3 pgoyette }
2114 1.29.2.3 pgoyette printf("\t\tAllocation Hints=");
2115 1.29.2.3 pgoyette #define PRINTFLAG(var, flag) printflag((var), ACPI_IORT_HT_## flag, #flag)
2116 1.29.2.3 pgoyette PRINTFLAG(memacc->Hints, TRANSIENT);
2117 1.29.2.3 pgoyette PRINTFLAG(memacc->Hints, WRITE);
2118 1.29.2.3 pgoyette PRINTFLAG(memacc->Hints, READ);
2119 1.29.2.3 pgoyette PRINTFLAG(memacc->Hints, OVERRIDE);
2120 1.29.2.3 pgoyette PRINTFLAG_END();
2121 1.29.2.3 pgoyette #undef PRINTFLAG
2122 1.29.2.3 pgoyette printf("\t\tMemory Access Flags=");
2123 1.29.2.3 pgoyette #define PRINTFLAG(var, flag) printflag((var), ACPI_IORT_MF_## flag, #flag)
2124 1.29.2.3 pgoyette PRINTFLAG(memacc->MemoryFlags, COHERENCY);
2125 1.29.2.3 pgoyette PRINTFLAG(memacc->MemoryFlags, ATTRIBUTES);
2126 1.29.2.3 pgoyette PRINTFLAG_END();
2127 1.29.2.3 pgoyette #undef PRINTFLAG
2128 1.29.2.3 pgoyette printf("\t}\n");
2129 1.29.2.3 pgoyette }
2130 1.29.2.3 pgoyette
2131 1.29.2.3 pgoyette static void
2132 1.29.2.3 pgoyette acpi_print_iort_its_group(ACPI_IORT_NODE *node)
2133 1.29.2.3 pgoyette {
2134 1.29.2.3 pgoyette ACPI_IORT_ITS_GROUP *itsg = (ACPI_IORT_ITS_GROUP *)node->NodeData;
2135 1.29.2.3 pgoyette uint32_t *idp;
2136 1.29.2.3 pgoyette unsigned int i;
2137 1.29.2.3 pgoyette
2138 1.29.2.3 pgoyette idp = itsg->Identifiers;
2139 1.29.2.3 pgoyette for (i = 0; i < itsg->ItsCount; i++)
2140 1.29.2.3 pgoyette printf("\tGIC ITS ID=%d\n", idp[i]);
2141 1.29.2.3 pgoyette }
2142 1.29.2.3 pgoyette
2143 1.29.2.3 pgoyette static void
2144 1.29.2.3 pgoyette acpi_print_iort_named_component(ACPI_IORT_NODE *node)
2145 1.29.2.3 pgoyette {
2146 1.29.2.3 pgoyette ACPI_IORT_NAMED_COMPONENT *ncomp
2147 1.29.2.3 pgoyette = (ACPI_IORT_NAMED_COMPONENT *)node->NodeData;
2148 1.29.2.3 pgoyette
2149 1.29.2.3 pgoyette #define PRINTFLAG(var, flag) printflag((var), ACPI_IORT_NC_## flag, #flag)
2150 1.29.2.3 pgoyette printf("\tNode Flags={PASID_BITS=%u",
2151 1.29.2.3 pgoyette (ncomp->NodeFlags & ACPI_IORT_NC_PASID_BITS) >> 1);
2152 1.29.2.3 pgoyette pf_sep = ',';
2153 1.29.2.3 pgoyette PRINTFLAG(ncomp->NodeFlags, STALL_SUPPORTED);
2154 1.29.2.3 pgoyette PRINTFLAG_END();
2155 1.29.2.3 pgoyette #undef PRINTFLAG
2156 1.29.2.3 pgoyette acpi_print_iort_memory_access(
2157 1.29.2.3 pgoyette (ACPI_IORT_MEMORY_ACCESS *)&ncomp->MemoryProperties);
2158 1.29.2.3 pgoyette printf("\tMemory address size=%hhu\n", ncomp->MemoryAddressLimit);
2159 1.29.2.3 pgoyette printf("\tDevice object Name=%s\n", ncomp->DeviceName);
2160 1.29.2.3 pgoyette }
2161 1.29.2.3 pgoyette
2162 1.29.2.3 pgoyette static void
2163 1.29.2.3 pgoyette acpi_print_iort_root_complex(ACPI_IORT_NODE *node)
2164 1.29.2.3 pgoyette {
2165 1.29.2.3 pgoyette ACPI_IORT_ROOT_COMPLEX *rcmp
2166 1.29.2.3 pgoyette = (ACPI_IORT_ROOT_COMPLEX *)node->NodeData;
2167 1.29.2.3 pgoyette
2168 1.29.2.3 pgoyette acpi_print_iort_memory_access(
2169 1.29.2.3 pgoyette (ACPI_IORT_MEMORY_ACCESS *)&rcmp->MemoryProperties);
2170 1.29.2.3 pgoyette printf("\tATS Attribute=%s\n",
2171 1.29.2.3 pgoyette (rcmp->AtsAttribute & ACPI_IORT_ATS_SUPPORTED)
2172 1.29.2.3 pgoyette ? "supported" : "not supported");
2173 1.29.2.3 pgoyette printf("\tPCI Segment=%u\n", rcmp->PciSegmentNumber);
2174 1.29.2.3 pgoyette printf("\tMemory address size limit=%hhu\n", rcmp->MemoryAddressLimit);
2175 1.29.2.3 pgoyette }
2176 1.29.2.3 pgoyette
2177 1.29.2.3 pgoyette static void
2178 1.29.2.3 pgoyette acpi_print_iort_smmuv1v2_intflags(uint32_t flags)
2179 1.29.2.3 pgoyette {
2180 1.29.2.3 pgoyette
2181 1.29.2.3 pgoyette printf("{Mode=");
2182 1.29.2.3 pgoyette if (flags & 0x01)
2183 1.29.2.3 pgoyette printf("edge");
2184 1.29.2.3 pgoyette else
2185 1.29.2.3 pgoyette printf("level");
2186 1.29.2.3 pgoyette printf("}\n");
2187 1.29.2.3 pgoyette }
2188 1.29.2.3 pgoyette
2189 1.29.2.3 pgoyette static void
2190 1.29.2.3 pgoyette acpi_print_iort_smmuv1v2(ACPI_IORT_NODE *node)
2191 1.29.2.3 pgoyette {
2192 1.29.2.3 pgoyette ACPI_IORT_SMMU *smmu = (ACPI_IORT_SMMU *)node->NodeData;
2193 1.29.2.3 pgoyette ACPI_IORT_SMMU_GSI *gsi;
2194 1.29.2.3 pgoyette uint64_t *iarray;
2195 1.29.2.3 pgoyette unsigned int i;
2196 1.29.2.3 pgoyette
2197 1.29.2.3 pgoyette printf("\tBase Address=%016jx\n", (uintmax_t)smmu->BaseAddress);
2198 1.29.2.3 pgoyette printf("\tSpan=%016jx\n", (uintmax_t)smmu->Span);
2199 1.29.2.3 pgoyette printf("\tModel=");
2200 1.29.2.3 pgoyette switch (smmu->Model) {
2201 1.29.2.3 pgoyette case ACPI_IORT_SMMU_V1:
2202 1.29.2.3 pgoyette printf("Generic SMMUv1\n");
2203 1.29.2.3 pgoyette break;
2204 1.29.2.3 pgoyette case ACPI_IORT_SMMU_V2:
2205 1.29.2.3 pgoyette printf("Generic SMMUv2\n");
2206 1.29.2.3 pgoyette break;
2207 1.29.2.3 pgoyette case ACPI_IORT_SMMU_CORELINK_MMU400:
2208 1.29.2.3 pgoyette printf("Arm Corelink MMU-400\n");
2209 1.29.2.3 pgoyette break;
2210 1.29.2.3 pgoyette case ACPI_IORT_SMMU_CORELINK_MMU500:
2211 1.29.2.3 pgoyette printf("Arm Corelink MMU-500\n");
2212 1.29.2.3 pgoyette break;
2213 1.29.2.3 pgoyette case ACPI_IORT_SMMU_CORELINK_MMU401:
2214 1.29.2.3 pgoyette printf("Arm Corelink MMU-401\n");
2215 1.29.2.3 pgoyette break;
2216 1.29.2.3 pgoyette case ACPI_IORT_SMMU_CAVIUM_THUNDERX:
2217 1.29.2.3 pgoyette printf("Cavium ThunderX SMMUv2\n");
2218 1.29.2.3 pgoyette break;
2219 1.29.2.3 pgoyette default:
2220 1.29.2.3 pgoyette printf("reserved (%u)\n", smmu->Model);
2221 1.29.2.3 pgoyette break;
2222 1.29.2.3 pgoyette }
2223 1.29.2.3 pgoyette #define PRINTFLAG(var, flag) printflag((var), ACPI_IORT_SMMU_## flag, #flag)
2224 1.29.2.3 pgoyette printf("\tFlags=");
2225 1.29.2.3 pgoyette PRINTFLAG(smmu->Flags, DVM_SUPPORTED);
2226 1.29.2.3 pgoyette PRINTFLAG(smmu->Flags, COHERENT_WALK);
2227 1.29.2.3 pgoyette PRINTFLAG_END();
2228 1.29.2.3 pgoyette #undef PRINTFLAG
2229 1.29.2.3 pgoyette
2230 1.29.2.3 pgoyette gsi = (ACPI_IORT_SMMU_GSI *)((vaddr_t)node
2231 1.29.2.3 pgoyette + smmu->GlobalInterruptOffset);
2232 1.29.2.3 pgoyette printf("\tNSgIrpt=%u\n", gsi->NSgIrpt);
2233 1.29.2.3 pgoyette printf("\tNSgIrptFlags=");
2234 1.29.2.3 pgoyette acpi_print_iort_smmuv1v2_intflags(gsi->NSgIrptFlags);
2235 1.29.2.3 pgoyette printf("\tNSgCfgIrpt=%u\n", gsi->NSgCfgIrpt);
2236 1.29.2.3 pgoyette printf("\tNSgCfgIrptFlags=");
2237 1.29.2.3 pgoyette acpi_print_iort_smmuv1v2_intflags(gsi->NSgCfgIrptFlags);
2238 1.29.2.3 pgoyette
2239 1.29.2.3 pgoyette if (smmu->ContextInterruptCount != 0) {
2240 1.29.2.3 pgoyette iarray = (uint64_t *)((vaddr_t)node
2241 1.29.2.3 pgoyette + smmu->ContextInterruptOffset);
2242 1.29.2.3 pgoyette printf("\tContext Interrupts={\n");
2243 1.29.2.3 pgoyette for (i = 0; i < smmu->ContextInterruptCount; i++) {
2244 1.29.2.3 pgoyette printf("\t\tGSIV=%u\n",
2245 1.29.2.3 pgoyette (uint32_t)(iarray[i] & 0xffffffff));
2246 1.29.2.3 pgoyette printf("\t\tFlags=%u\n", (uint32_t)(iarray[i] >> 32));
2247 1.29.2.3 pgoyette }
2248 1.29.2.3 pgoyette }
2249 1.29.2.3 pgoyette if (smmu->PmuInterruptCount != 0) {
2250 1.29.2.3 pgoyette iarray = (uint64_t *)((vaddr_t)node
2251 1.29.2.3 pgoyette + smmu->PmuInterruptOffset);
2252 1.29.2.3 pgoyette printf("\tPmu Interrupts={\n");
2253 1.29.2.3 pgoyette for (i = 0; i < smmu->PmuInterruptCount; i++) {
2254 1.29.2.3 pgoyette printf("\t\tGSIV=%u\n",
2255 1.29.2.3 pgoyette (uint32_t)(iarray[i] & 0xffffffff));
2256 1.29.2.3 pgoyette printf("\t\tFlags=%u\n", (uint32_t)(iarray[i] >> 32));
2257 1.29.2.3 pgoyette }
2258 1.29.2.3 pgoyette }
2259 1.29.2.3 pgoyette }
2260 1.29.2.3 pgoyette
2261 1.29.2.3 pgoyette static void
2262 1.29.2.3 pgoyette acpi_print_iort_smmuv3(ACPI_IORT_NODE *node)
2263 1.29.2.3 pgoyette {
2264 1.29.2.3 pgoyette ACPI_IORT_SMMU_V3 *smmu = (ACPI_IORT_SMMU_V3 *)node->NodeData;
2265 1.29.2.3 pgoyette uint8_t httuo;
2266 1.29.2.3 pgoyette
2267 1.29.2.3 pgoyette printf("\tBase Address=%016jx\n", (uintmax_t)smmu->BaseAddress);
2268 1.29.2.3 pgoyette #define PRINTFLAG(var, flag) printflag((var), ACPI_IORT_SMMU_V3_## flag, \
2269 1.29.2.3 pgoyette #flag)
2270 1.29.2.3 pgoyette httuo = __SHIFTOUT(smmu->Flags, ACPI_IORT_SMMU_V3_HTTU_OVERRIDE);
2271 1.29.2.3 pgoyette printf("\tFlags={HTTU Override=%hhx", httuo);
2272 1.29.2.3 pgoyette pf_sep = ',';
2273 1.29.2.3 pgoyette PRINTFLAG(smmu->Flags, HTTU_OVERRIDE);
2274 1.29.2.3 pgoyette PRINTFLAG(smmu->Flags, COHACC_OVERRIDE);
2275 1.29.2.3 pgoyette PRINTFLAG(smmu->Flags, PXM_VALID);
2276 1.29.2.3 pgoyette PRINTFLAG_END();
2277 1.29.2.3 pgoyette #undef PRINTFLAG
2278 1.29.2.3 pgoyette printf("\tVATOS Address=%016jx\n", (uintmax_t)smmu->VatosAddress);
2279 1.29.2.3 pgoyette printf("\tModel=");
2280 1.29.2.3 pgoyette switch (smmu->Model) {
2281 1.29.2.3 pgoyette case ACPI_IORT_SMMU_V3_GENERIC:
2282 1.29.2.3 pgoyette printf("Generic SMMUv3\n");
2283 1.29.2.3 pgoyette break;
2284 1.29.2.3 pgoyette case ACPI_IORT_SMMU_V3_HISILICON_HI161X:
2285 1.29.2.3 pgoyette printf("HiSilicon Hi161x SMMU-v3\n");
2286 1.29.2.3 pgoyette break;
2287 1.29.2.3 pgoyette case ACPI_IORT_SMMU_V3_CAVIUM_CN99XX:
2288 1.29.2.3 pgoyette printf("Cavium CN99xx SMMU-v3\n");
2289 1.29.2.3 pgoyette break;
2290 1.29.2.3 pgoyette default:
2291 1.29.2.3 pgoyette printf("reserved (%u)\n", smmu->Model);
2292 1.29.2.3 pgoyette break;
2293 1.29.2.3 pgoyette }
2294 1.29.2.3 pgoyette
2295 1.29.2.3 pgoyette printf("\tEvent GSIV=%u\n", smmu->EventGsiv);
2296 1.29.2.3 pgoyette printf("\tPRI GSIV=%u\n", smmu->PriGsiv);
2297 1.29.2.3 pgoyette printf("\tGERR GSIV=%u\n", smmu->GerrGsiv);
2298 1.29.2.3 pgoyette printf("\tSync GSIV=%u\n", smmu->SyncGsiv);
2299 1.29.2.3 pgoyette printf("\tProximity domain=%u\n", smmu->Pxm);
2300 1.29.2.3 pgoyette
2301 1.29.2.3 pgoyette /* XXX should we print the refered contents? */
2302 1.29.2.3 pgoyette printf("\tDevice ID mapping index=%u\n", smmu->IdMappingIndex);
2303 1.29.2.3 pgoyette }
2304 1.29.2.3 pgoyette
2305 1.29.2.3 pgoyette static void
2306 1.29.2.3 pgoyette acpi_print_iort_node(ACPI_IORT_NODE *node)
2307 1.29.2.3 pgoyette {
2308 1.29.2.3 pgoyette ACPI_IORT_ID_MAPPING *mapping;
2309 1.29.2.3 pgoyette uint32_t offset;
2310 1.29.2.3 pgoyette int datasize;
2311 1.29.2.3 pgoyette bool dodump = false;
2312 1.29.2.3 pgoyette struct iort_node_list *list;
2313 1.29.2.3 pgoyette unsigned int i;
2314 1.29.2.3 pgoyette
2315 1.29.2.3 pgoyette printf("\tLength=%hu\n", node->Length);
2316 1.29.2.3 pgoyette printf("\tRevision=%hhu\n", node->Revision);
2317 1.29.2.3 pgoyette printf("\tType=");
2318 1.29.2.3 pgoyette
2319 1.29.2.3 pgoyette datasize = node->MappingOffset - offsetof(ACPI_IORT_NODE, NodeData);
2320 1.29.2.3 pgoyette if (datasize != 0)
2321 1.29.2.3 pgoyette dodump = true;
2322 1.29.2.3 pgoyette
2323 1.29.2.3 pgoyette for (list = iort_node_list; list->gname != NULL; list++) {
2324 1.29.2.3 pgoyette if (node->Type == list->Type) {
2325 1.29.2.3 pgoyette printf("%s\n", list->gname);
2326 1.29.2.3 pgoyette if (dodump)
2327 1.29.2.3 pgoyette (*list->func)(node);
2328 1.29.2.3 pgoyette break;
2329 1.29.2.3 pgoyette }
2330 1.29.2.3 pgoyette }
2331 1.29.2.3 pgoyette if (list->gname == NULL)
2332 1.29.2.3 pgoyette printf("reserved (0x%hhx)\n", node->Type);
2333 1.29.2.3 pgoyette
2334 1.29.2.3 pgoyette printf("\tMappingCount=%u\n", node->MappingCount);
2335 1.29.2.3 pgoyette if (node->MappingCount == 0)
2336 1.29.2.3 pgoyette return;
2337 1.29.2.3 pgoyette
2338 1.29.2.3 pgoyette offset = node->MappingOffset;
2339 1.29.2.3 pgoyette printf("\tMapping offset=%u\n", offset);
2340 1.29.2.3 pgoyette for (i = 0; i < node->MappingCount; i++) {
2341 1.29.2.3 pgoyette mapping = (ACPI_IORT_ID_MAPPING *)((vaddr_t)node + offset);
2342 1.29.2.3 pgoyette printf("\tMapping={\n");
2343 1.29.2.3 pgoyette printf("\t\tInput base=%u\n", mapping->InputBase);
2344 1.29.2.3 pgoyette printf("\t\tCount=%u\n", mapping->IdCount);
2345 1.29.2.3 pgoyette printf("\t\tOutput base=%u\n", mapping->OutputBase);
2346 1.29.2.3 pgoyette printf("\t\tOutput reference offset=%u\n",
2347 1.29.2.3 pgoyette mapping->OutputReference);
2348 1.29.2.3 pgoyette #define PRINTFLAG(var, flag) printflag((var), ACPI_IORT_ID_## flag, #flag)
2349 1.29.2.3 pgoyette printf("\t\tFlags=");
2350 1.29.2.3 pgoyette PRINTFLAG(mapping->Flags, SINGLE_MAPPING);
2351 1.29.2.3 pgoyette PRINTFLAG_END();
2352 1.29.2.3 pgoyette #undef PRINTFLAG
2353 1.29.2.3 pgoyette printf("\t}\n");
2354 1.29.2.3 pgoyette offset += sizeof(ACPI_IORT_ID_MAPPING);
2355 1.29.2.3 pgoyette }
2356 1.29.2.3 pgoyette }
2357 1.29.2.3 pgoyette
2358 1.29.2.3 pgoyette static void
2359 1.29.2.3 pgoyette acpi_handle_iort(ACPI_TABLE_HEADER *sdp)
2360 1.29.2.3 pgoyette {
2361 1.29.2.3 pgoyette ACPI_TABLE_IORT *iort;
2362 1.29.2.3 pgoyette ACPI_IORT_NODE *node;
2363 1.29.2.3 pgoyette unsigned int i;
2364 1.29.2.3 pgoyette
2365 1.29.2.3 pgoyette printf(BEGIN_COMMENT);
2366 1.29.2.3 pgoyette acpi_print_sdt(sdp);
2367 1.29.2.3 pgoyette iort = (ACPI_TABLE_IORT *)sdp;
2368 1.29.2.3 pgoyette printf("\tIORT Nodes=%u\n", iort->NodeCount);
2369 1.29.2.3 pgoyette printf("\tNode offset=%u\n", iort->NodeOffset);
2370 1.29.2.3 pgoyette
2371 1.29.2.3 pgoyette node = (ACPI_IORT_NODE *)((vaddr_t)iort + iort->NodeOffset);
2372 1.29.2.3 pgoyette for (i = 0; i < iort->NodeCount; i++) {
2373 1.29.2.3 pgoyette printf("\n");
2374 1.29.2.3 pgoyette acpi_print_iort_node(node);
2375 1.29.2.3 pgoyette
2376 1.29.2.3 pgoyette /* Next */
2377 1.29.2.3 pgoyette node = (ACPI_IORT_NODE *)((vaddr_t)node + node->Length);
2378 1.29.2.3 pgoyette }
2379 1.29.2.3 pgoyette
2380 1.29.2.3 pgoyette printf(END_COMMENT);
2381 1.29.2.3 pgoyette }
2382 1.29.2.3 pgoyette
2383 1.5 cegger static void
2384 1.29.2.1 pgoyette acpi_print_native_lpit(ACPI_LPIT_NATIVE *nl)
2385 1.29.2.1 pgoyette {
2386 1.29.2.1 pgoyette printf("\tEntryTrigger=");
2387 1.29.2.1 pgoyette acpi_print_gas(&nl->EntryTrigger);
2388 1.29.2.1 pgoyette printf("\tResidency=%u\n", nl->Residency);
2389 1.29.2.1 pgoyette printf("\tLatency=%u\n", nl->Latency);
2390 1.29.2.1 pgoyette if (nl->Header.Flags & ACPI_LPIT_NO_COUNTER)
2391 1.29.2.1 pgoyette printf("\tResidencyCounter=Not Present");
2392 1.29.2.1 pgoyette else {
2393 1.29.2.1 pgoyette printf("\tResidencyCounter=");
2394 1.29.2.1 pgoyette acpi_print_gas(&nl->ResidencyCounter);
2395 1.29.2.1 pgoyette }
2396 1.29.2.1 pgoyette if (nl->CounterFrequency)
2397 1.29.2.1 pgoyette printf("\tCounterFrequency=%ju\n", nl->CounterFrequency);
2398 1.29.2.1 pgoyette else
2399 1.29.2.1 pgoyette printf("\tCounterFrequency=TSC\n");
2400 1.29.2.1 pgoyette }
2401 1.29.2.1 pgoyette
2402 1.29.2.1 pgoyette static void
2403 1.29.2.1 pgoyette acpi_print_lpit(ACPI_LPIT_HEADER *lpit)
2404 1.29.2.1 pgoyette {
2405 1.29.2.1 pgoyette if (lpit->Type == ACPI_LPIT_TYPE_NATIVE_CSTATE)
2406 1.29.2.1 pgoyette printf("\tType=ACPI_LPIT_TYPE_NATIVE_CSTATE\n");
2407 1.29.2.1 pgoyette else
2408 1.29.2.1 pgoyette warnx("unknown LPIT type %u", lpit->Type);
2409 1.29.2.1 pgoyette
2410 1.29.2.1 pgoyette printf("\tLength=%u\n", lpit->Length);
2411 1.29.2.1 pgoyette printf("\tUniqueId=0x%04x\n", lpit->UniqueId);
2412 1.29.2.1 pgoyette #define PRINTFLAG(var, flag) printflag((var), ACPI_LPIT_## flag, #flag)
2413 1.29.2.1 pgoyette printf("\tFlags=");
2414 1.29.2.1 pgoyette PRINTFLAG(lpit->Flags, STATE_DISABLED);
2415 1.29.2.1 pgoyette PRINTFLAG_END();
2416 1.29.2.1 pgoyette #undef PRINTFLAG
2417 1.29.2.1 pgoyette
2418 1.29.2.1 pgoyette if (lpit->Type == ACPI_LPIT_TYPE_NATIVE_CSTATE)
2419 1.29.2.1 pgoyette return acpi_print_native_lpit((ACPI_LPIT_NATIVE *)lpit);
2420 1.29.2.1 pgoyette }
2421 1.29.2.1 pgoyette
2422 1.29.2.1 pgoyette static void
2423 1.29.2.1 pgoyette acpi_walk_lpit(ACPI_TABLE_HEADER *table, void *first,
2424 1.29.2.1 pgoyette void (*action)(ACPI_LPIT_HEADER *))
2425 1.29.2.1 pgoyette {
2426 1.29.2.1 pgoyette ACPI_LPIT_HEADER *subtable;
2427 1.29.2.1 pgoyette char *end;
2428 1.29.2.1 pgoyette
2429 1.29.2.1 pgoyette subtable = first;
2430 1.29.2.1 pgoyette end = (char *)table + table->Length;
2431 1.29.2.1 pgoyette while ((char *)subtable < end) {
2432 1.29.2.1 pgoyette printf("\n");
2433 1.29.2.1 pgoyette if (subtable->Length < sizeof(ACPI_LPIT_HEADER)) {
2434 1.29.2.1 pgoyette warnx("invalid subtable length %u", subtable->Length);
2435 1.29.2.1 pgoyette return;
2436 1.29.2.1 pgoyette }
2437 1.29.2.1 pgoyette action(subtable);
2438 1.29.2.1 pgoyette subtable = (ACPI_LPIT_HEADER *)((char *)subtable +
2439 1.29.2.1 pgoyette subtable->Length);
2440 1.29.2.1 pgoyette }
2441 1.29.2.1 pgoyette }
2442 1.29.2.1 pgoyette
2443 1.29.2.1 pgoyette static void
2444 1.29.2.1 pgoyette acpi_handle_lpit(ACPI_TABLE_HEADER *sdp)
2445 1.29.2.1 pgoyette {
2446 1.29.2.1 pgoyette ACPI_TABLE_LPIT *lpit;
2447 1.29.2.1 pgoyette
2448 1.29.2.1 pgoyette printf(BEGIN_COMMENT);
2449 1.29.2.1 pgoyette acpi_print_sdt(sdp);
2450 1.29.2.1 pgoyette lpit = (ACPI_TABLE_LPIT *)sdp;
2451 1.29.2.1 pgoyette acpi_walk_lpit(sdp, (lpit + 1), acpi_print_lpit);
2452 1.29.2.1 pgoyette
2453 1.29.2.1 pgoyette printf(END_COMMENT);
2454 1.29.2.1 pgoyette }
2455 1.29.2.1 pgoyette
2456 1.29.2.1 pgoyette static void
2457 1.5 cegger acpi_handle_msct(ACPI_TABLE_HEADER *sdp)
2458 1.5 cegger {
2459 1.5 cegger ACPI_TABLE_MSCT *msct;
2460 1.5 cegger ACPI_MSCT_PROXIMITY *msctentry;
2461 1.5 cegger uint32_t pos;
2462 1.5 cegger
2463 1.5 cegger printf(BEGIN_COMMENT);
2464 1.5 cegger acpi_print_sdt(sdp);
2465 1.5 cegger msct = (ACPI_TABLE_MSCT *)sdp;
2466 1.5 cegger
2467 1.5 cegger printf("\tProximity Offset=0x%x\n", msct->ProximityOffset);
2468 1.5 cegger printf("\tMax Proximity Domains=%d\n", msct->MaxProximityDomains);
2469 1.5 cegger printf("\tMax Clock Domains=%d\n", msct->MaxClockDomains);
2470 1.5 cegger printf("\tMax Physical Address=0x%"PRIx64"\n", msct->MaxAddress);
2471 1.5 cegger
2472 1.5 cegger pos = msct->ProximityOffset;
2473 1.5 cegger while (pos < msct->Header.Length) {
2474 1.5 cegger msctentry = (ACPI_MSCT_PROXIMITY *)((char *)msct + pos);
2475 1.5 cegger pos += msctentry->Length;
2476 1.5 cegger
2477 1.5 cegger printf("\n");
2478 1.5 cegger printf("\tRevision=%d\n", msctentry->Revision);
2479 1.5 cegger printf("\tLength=%d\n", msctentry->Length);
2480 1.5 cegger printf("\tRange Start=%d\n", msctentry->RangeStart);
2481 1.5 cegger printf("\tRange End=%d\n", msctentry->RangeEnd);
2482 1.5 cegger printf("\tProcessor Capacity=%d\n",
2483 1.5 cegger msctentry->ProcessorCapacity);
2484 1.5 cegger printf("\tMemory Capacity=0x%"PRIx64" byte\n",
2485 1.5 cegger msctentry->MemoryCapacity);
2486 1.5 cegger }
2487 1.1 christos
2488 1.5 cegger printf(END_COMMENT);
2489 1.5 cegger }
2490 1.1 christos
2491 1.5 cegger static void
2492 1.5 cegger acpi_handle_ecdt(ACPI_TABLE_HEADER *sdp)
2493 1.5 cegger {
2494 1.5 cegger ACPI_TABLE_ECDT *ecdt;
2495 1.1 christos
2496 1.5 cegger printf(BEGIN_COMMENT);
2497 1.5 cegger acpi_print_sdt(sdp);
2498 1.5 cegger ecdt = (ACPI_TABLE_ECDT *)sdp;
2499 1.5 cegger printf("\tEC_CONTROL=");
2500 1.5 cegger acpi_print_gas(&ecdt->Control);
2501 1.5 cegger printf("\n\tEC_DATA=");
2502 1.5 cegger acpi_print_gas(&ecdt->Data);
2503 1.5 cegger printf("\n\tUID=%#x, ", ecdt->Uid);
2504 1.5 cegger printf("GPE_BIT=%#x\n", ecdt->Gpe);
2505 1.5 cegger printf("\tEC_ID=%s\n", ecdt->Id);
2506 1.5 cegger printf(END_COMMENT);
2507 1.5 cegger }
2508 1.1 christos
2509 1.5 cegger static void
2510 1.5 cegger acpi_handle_mcfg(ACPI_TABLE_HEADER *sdp)
2511 1.5 cegger {
2512 1.5 cegger ACPI_TABLE_MCFG *mcfg;
2513 1.5 cegger ACPI_MCFG_ALLOCATION *alloc;
2514 1.5 cegger u_int i, entries;
2515 1.1 christos
2516 1.5 cegger printf(BEGIN_COMMENT);
2517 1.5 cegger acpi_print_sdt(sdp);
2518 1.5 cegger mcfg = (ACPI_TABLE_MCFG *)sdp;
2519 1.5 cegger entries = (sdp->Length - sizeof(ACPI_TABLE_MCFG)) /
2520 1.5 cegger sizeof(ACPI_MCFG_ALLOCATION);
2521 1.5 cegger alloc = (ACPI_MCFG_ALLOCATION *)(mcfg + 1);
2522 1.5 cegger for (i = 0; i < entries; i++, alloc++) {
2523 1.5 cegger printf("\n");
2524 1.16 msaitoh printf("\tBase Address=0x%016jx\n", (uintmax_t)alloc->Address);
2525 1.5 cegger printf("\tSegment Group=0x%04x\n", alloc->PciSegment);
2526 1.5 cegger printf("\tStart Bus=%d\n", alloc->StartBusNumber);
2527 1.5 cegger printf("\tEnd Bus=%d\n", alloc->EndBusNumber);
2528 1.5 cegger }
2529 1.5 cegger printf(END_COMMENT);
2530 1.5 cegger }
2531 1.1 christos
2532 1.1 christos static void
2533 1.29.2.1 pgoyette acpi_print_pptt_processor(ACPI_PPTT_PROCESSOR *processor)
2534 1.29.2.1 pgoyette {
2535 1.29.2.1 pgoyette uint32_t *private;
2536 1.29.2.1 pgoyette unsigned int i;
2537 1.29.2.1 pgoyette
2538 1.29.2.1 pgoyette printf("\tType=processor\n");
2539 1.29.2.1 pgoyette printf("\tLength=%d\n", processor->Header.Length);
2540 1.29.2.1 pgoyette #define PRINTFLAG(var, flag) printflag((var), ACPI_PPTT_## flag, #flag)
2541 1.29.2.1 pgoyette
2542 1.29.2.1 pgoyette printf("\tFlags=");
2543 1.29.2.1 pgoyette PRINTFLAG(processor->Flags, PHYSICAL_PACKAGE);
2544 1.29.2.1 pgoyette PRINTFLAG(processor->Flags, ACPI_PROCESSOR_ID_VALID);
2545 1.29.2.1 pgoyette PRINTFLAG_END();
2546 1.29.2.1 pgoyette
2547 1.29.2.1 pgoyette #undef PRINTFLAG
2548 1.29.2.1 pgoyette printf("\tParent=%08x\n", processor->Parent);
2549 1.29.2.1 pgoyette printf("\tACPI Processor ID=0x%08x\n", processor->AcpiProcessorId);
2550 1.29.2.1 pgoyette printf("\tprivate resources=%d\n", processor->NumberOfPrivResources);
2551 1.29.2.1 pgoyette
2552 1.29.2.1 pgoyette private = (uint32_t *)(processor + 1);
2553 1.29.2.1 pgoyette for (i = 0; i < processor->NumberOfPrivResources; i++)
2554 1.29.2.1 pgoyette printf("\tprivate resources%d=%08x\n", i, private[i]);
2555 1.29.2.1 pgoyette }
2556 1.29.2.1 pgoyette
2557 1.29.2.1 pgoyette static void
2558 1.29.2.1 pgoyette acpi_print_pptt_cache(ACPI_PPTT_CACHE *cache)
2559 1.29.2.1 pgoyette {
2560 1.29.2.1 pgoyette
2561 1.29.2.1 pgoyette printf("\tType=cache\n");
2562 1.29.2.1 pgoyette printf("\tLength=%d\n", cache->Header.Length);
2563 1.29.2.1 pgoyette
2564 1.29.2.1 pgoyette #define PRINTFLAG(var, flag) printflag((var), ACPI_PPTT_## flag, #flag)
2565 1.29.2.1 pgoyette printf("\tFlags=");
2566 1.29.2.1 pgoyette PRINTFLAG(cache->Flags, SIZE_PROPERTY_VALID);
2567 1.29.2.1 pgoyette PRINTFLAG(cache->Flags, NUMBER_OF_SETS_VALID);
2568 1.29.2.1 pgoyette PRINTFLAG(cache->Flags, ASSOCIATIVITY_VALID);
2569 1.29.2.1 pgoyette PRINTFLAG(cache->Flags, ALLOCATION_TYPE_VALID);
2570 1.29.2.1 pgoyette PRINTFLAG(cache->Flags, CACHE_TYPE_VALID);
2571 1.29.2.1 pgoyette PRINTFLAG(cache->Flags, WRITE_POLICY_VALID);
2572 1.29.2.1 pgoyette PRINTFLAG(cache->Flags, LINE_SIZE_VALID);
2573 1.29.2.1 pgoyette PRINTFLAG_END();
2574 1.29.2.1 pgoyette #undef PRINTFLAG
2575 1.29.2.1 pgoyette
2576 1.29.2.1 pgoyette printf("\tNextLevel=0x%08x\n", cache->NextLevelOfCache);
2577 1.29.2.1 pgoyette if (cache->Flags & ACPI_PPTT_SIZE_PROPERTY_VALID)
2578 1.29.2.1 pgoyette printf("\tSize=%d\n", cache->Size);
2579 1.29.2.1 pgoyette if (cache->Flags & ACPI_PPTT_NUMBER_OF_SETS_VALID)
2580 1.29.2.1 pgoyette printf("\tSets=%d\n", cache->NumberOfSets);
2581 1.29.2.1 pgoyette if (cache->Flags & ACPI_PPTT_ASSOCIATIVITY_VALID)
2582 1.29.2.1 pgoyette printf("\tAssociativity=%d\n", cache->Associativity);
2583 1.29.2.1 pgoyette if (cache->Flags & ACPI_PPTT_ALLOCATION_TYPE_VALID) {
2584 1.29.2.1 pgoyette printf("\tAllocation type=");
2585 1.29.2.1 pgoyette switch (cache->Attributes & ACPI_PPTT_MASK_ALLOCATION_TYPE) {
2586 1.29.2.1 pgoyette case ACPI_PPTT_CACHE_READ_ALLOCATE:
2587 1.29.2.1 pgoyette printf("Read allocate\n");
2588 1.29.2.1 pgoyette break;
2589 1.29.2.1 pgoyette case ACPI_PPTT_CACHE_WRITE_ALLOCATE:
2590 1.29.2.1 pgoyette printf("Write allocate\n");
2591 1.29.2.1 pgoyette break;
2592 1.29.2.1 pgoyette case ACPI_PPTT_CACHE_RW_ALLOCATE:
2593 1.29.2.1 pgoyette case ACPI_PPTT_CACHE_RW_ALLOCATE_ALT:
2594 1.29.2.1 pgoyette printf("Read and Write allocate\n");
2595 1.29.2.1 pgoyette break;
2596 1.29.2.1 pgoyette }
2597 1.29.2.1 pgoyette }
2598 1.29.2.1 pgoyette if (cache->Flags & ACPI_PPTT_CACHE_TYPE_VALID) {
2599 1.29.2.1 pgoyette printf("\tCache type=");
2600 1.29.2.1 pgoyette switch (cache->Attributes & ACPI_PPTT_MASK_CACHE_TYPE) {
2601 1.29.2.1 pgoyette case ACPI_PPTT_CACHE_TYPE_DATA:
2602 1.29.2.1 pgoyette printf("Data\n");
2603 1.29.2.1 pgoyette break;
2604 1.29.2.1 pgoyette case ACPI_PPTT_CACHE_TYPE_INSTR:
2605 1.29.2.1 pgoyette printf("Instruction\n");
2606 1.29.2.1 pgoyette break;
2607 1.29.2.1 pgoyette case ACPI_PPTT_CACHE_TYPE_UNIFIED:
2608 1.29.2.1 pgoyette case ACPI_PPTT_CACHE_TYPE_UNIFIED_ALT:
2609 1.29.2.1 pgoyette printf("Unified\n");
2610 1.29.2.1 pgoyette break;
2611 1.29.2.1 pgoyette }
2612 1.29.2.1 pgoyette }
2613 1.29.2.1 pgoyette if (cache->Flags & ACPI_PPTT_WRITE_POLICY_VALID)
2614 1.29.2.1 pgoyette printf("\tWrite Policy=Write %s \n",
2615 1.29.2.1 pgoyette (cache->Attributes & ACPI_PPTT_MASK_WRITE_POLICY) ?
2616 1.29.2.1 pgoyette "through" : "back");
2617 1.29.2.1 pgoyette
2618 1.29.2.1 pgoyette if (cache->Flags & ACPI_PPTT_LINE_SIZE_VALID)
2619 1.29.2.1 pgoyette printf("\tLine size=%d\n", cache->LineSize);
2620 1.29.2.1 pgoyette }
2621 1.29.2.1 pgoyette
2622 1.29.2.1 pgoyette static void
2623 1.29.2.1 pgoyette acpi_print_pptt_id(ACPI_PPTT_ID *id)
2624 1.29.2.1 pgoyette {
2625 1.29.2.1 pgoyette
2626 1.29.2.1 pgoyette printf("\tType=id\n");
2627 1.29.2.1 pgoyette printf("\tLength=%d\n", id->Header.Length);
2628 1.29.2.1 pgoyette
2629 1.29.2.1 pgoyette printf("\tVENDOR_ID=");
2630 1.29.2.1 pgoyette acpi_print_string((char *)&id->VendorId, 4);
2631 1.29.2.1 pgoyette printf("\n");
2632 1.29.2.1 pgoyette
2633 1.29.2.1 pgoyette printf("\tLEVEL_1_ID=%016" PRIx64 "\n", id->Level1Id);
2634 1.29.2.1 pgoyette printf("\tLEVEL_2_ID=%016" PRIx64 "\n", id->Level2Id);
2635 1.29.2.1 pgoyette printf("\tMajor=%hu", id->MajorRev);
2636 1.29.2.1 pgoyette printf("\tMinor=%hu", id->MinorRev);
2637 1.29.2.1 pgoyette printf("\tSpin=%hu", id->SpinRev);
2638 1.29.2.1 pgoyette }
2639 1.29.2.1 pgoyette
2640 1.29.2.1 pgoyette static void
2641 1.29.2.1 pgoyette acpi_print_pptt(ACPI_SUBTABLE_HEADER *hdr)
2642 1.29.2.1 pgoyette {
2643 1.29.2.1 pgoyette switch (hdr->Type) {
2644 1.29.2.1 pgoyette case ACPI_PPTT_TYPE_PROCESSOR:
2645 1.29.2.1 pgoyette acpi_print_pptt_processor((ACPI_PPTT_PROCESSOR *)hdr);
2646 1.29.2.1 pgoyette break;
2647 1.29.2.1 pgoyette case ACPI_PPTT_TYPE_CACHE:
2648 1.29.2.1 pgoyette acpi_print_pptt_cache((ACPI_PPTT_CACHE *)hdr);
2649 1.29.2.1 pgoyette break;
2650 1.29.2.1 pgoyette case ACPI_PPTT_TYPE_ID:
2651 1.29.2.1 pgoyette acpi_print_pptt_id((ACPI_PPTT_ID *)hdr);
2652 1.29.2.1 pgoyette break;
2653 1.29.2.1 pgoyette default:
2654 1.29.2.1 pgoyette printf("\tUnknown structure"
2655 1.29.2.1 pgoyette "(type = %hhu, length = %hhu)\n",
2656 1.29.2.1 pgoyette hdr->Type, hdr->Length);
2657 1.29.2.1 pgoyette break;
2658 1.29.2.1 pgoyette }
2659 1.29.2.1 pgoyette }
2660 1.29.2.1 pgoyette
2661 1.29.2.1 pgoyette static void
2662 1.29.2.1 pgoyette acpi_handle_pptt(ACPI_TABLE_HEADER *sdp)
2663 1.29.2.1 pgoyette {
2664 1.29.2.1 pgoyette ACPI_TABLE_PPTT *pptt;
2665 1.29.2.1 pgoyette
2666 1.29.2.1 pgoyette printf(BEGIN_COMMENT);
2667 1.29.2.1 pgoyette acpi_print_sdt(sdp);
2668 1.29.2.1 pgoyette
2669 1.29.2.1 pgoyette pptt = (ACPI_TABLE_PPTT *)sdp;
2670 1.29.2.1 pgoyette acpi_walk_subtables(sdp, (pptt + 1), acpi_print_pptt);
2671 1.29.2.1 pgoyette
2672 1.29.2.1 pgoyette printf(END_COMMENT);
2673 1.29.2.1 pgoyette }
2674 1.29.2.1 pgoyette
2675 1.29.2.1 pgoyette static void
2676 1.5 cegger acpi_handle_sbst(ACPI_TABLE_HEADER *sdp)
2677 1.1 christos {
2678 1.5 cegger ACPI_TABLE_SBST *sbst;
2679 1.5 cegger
2680 1.5 cegger printf(BEGIN_COMMENT);
2681 1.5 cegger acpi_print_sdt(sdp);
2682 1.5 cegger sbst = (ACPI_TABLE_SBST *)sdp;
2683 1.5 cegger
2684 1.5 cegger printf("\tWarning Level=%d mWh\n", sbst->WarningLevel);
2685 1.5 cegger printf("\tLow Level=%d mWh\n", sbst->LowLevel);
2686 1.5 cegger printf("\tCritical Level=%d mWh\n", sbst->CriticalLevel);
2687 1.1 christos
2688 1.5 cegger printf(END_COMMENT);
2689 1.1 christos }
2690 1.1 christos
2691 1.1 christos static void
2692 1.5 cegger acpi_handle_slit(ACPI_TABLE_HEADER *sdp)
2693 1.1 christos {
2694 1.5 cegger ACPI_TABLE_SLIT *slit;
2695 1.5 cegger u_int idx;
2696 1.5 cegger uint64_t cnt;
2697 1.5 cegger
2698 1.5 cegger printf(BEGIN_COMMENT);
2699 1.5 cegger acpi_print_sdt(sdp);
2700 1.5 cegger slit = (ACPI_TABLE_SLIT *)sdp;
2701 1.1 christos
2702 1.5 cegger cnt = slit->LocalityCount * slit->LocalityCount;
2703 1.16 msaitoh printf("\tLocalityCount=%ju\n", (uintmax_t)slit->LocalityCount);
2704 1.5 cegger printf("\tEntry=\n\t");
2705 1.5 cegger for (idx = 0; idx < cnt; idx++) {
2706 1.5 cegger printf("%u ", slit->Entry[idx]);
2707 1.5 cegger if ((idx % slit->LocalityCount) == (slit->LocalityCount - 1)) {
2708 1.5 cegger printf("\n");
2709 1.5 cegger if (idx < cnt - 1)
2710 1.5 cegger printf("\t");
2711 1.5 cegger }
2712 1.5 cegger }
2713 1.1 christos
2714 1.5 cegger printf(END_COMMENT);
2715 1.1 christos }
2716 1.1 christos
2717 1.1 christos static void
2718 1.5 cegger acpi_handle_spcr(ACPI_TABLE_HEADER *sdp)
2719 1.1 christos {
2720 1.5 cegger ACPI_TABLE_SPCR *spcr;
2721 1.5 cegger
2722 1.5 cegger printf(BEGIN_COMMENT);
2723 1.5 cegger acpi_print_sdt(sdp);
2724 1.5 cegger spcr = (ACPI_TABLE_SPCR *)sdp;
2725 1.5 cegger
2726 1.29.2.1 pgoyette printf("\n\tInterface Type=");
2727 1.29.2.1 pgoyette switch (sdp->Revision) {
2728 1.29.2.1 pgoyette case 1:
2729 1.29.2.1 pgoyette printf("full 16550%s\n",
2730 1.29.2.1 pgoyette (spcr->InterfaceType == 1) ?
2731 1.29.2.1 pgoyette "(must also accept writing FCR register)" : "");
2732 1.29.2.1 pgoyette break;
2733 1.29.2.1 pgoyette case 2:
2734 1.29.2.1 pgoyette acpi_print_dbg2_serial_subtype(spcr->InterfaceType);
2735 1.29.2.1 pgoyette break;
2736 1.29.2.1 pgoyette default:
2737 1.29.2.1 pgoyette printf("unknown Revision\n");
2738 1.29.2.1 pgoyette break;
2739 1.29.2.1 pgoyette }
2740 1.29.2.1 pgoyette
2741 1.5 cegger printf("\tSerial Port=");
2742 1.5 cegger acpi_print_gas(&spcr->SerialPort);
2743 1.5 cegger printf("\n\tInterrupt Type={");
2744 1.5 cegger if (spcr->InterruptType & 0x1) {
2745 1.5 cegger printf("\n\t\tdual-8259 IRQ=");
2746 1.5 cegger switch (spcr->PcInterrupt) {
2747 1.5 cegger case 2 ... 7:
2748 1.5 cegger case 9 ... 12:
2749 1.5 cegger case 14 ... 15:
2750 1.5 cegger printf("%d", spcr->PcInterrupt);
2751 1.5 cegger break;
2752 1.5 cegger default:
2753 1.5 cegger printf("%d (invalid entry)", spcr->PcInterrupt);
2754 1.5 cegger break;
2755 1.5 cegger }
2756 1.5 cegger }
2757 1.5 cegger if (spcr->InterruptType & 0x2) {
2758 1.5 cegger printf("\n\t\tIO APIC={ GSI=%d }", spcr->Interrupt);
2759 1.5 cegger }
2760 1.5 cegger if (spcr->InterruptType & 0x4) {
2761 1.5 cegger printf("\n\t\tIO SAPIC={ GSI=%d }", spcr->Interrupt);
2762 1.5 cegger }
2763 1.29.2.1 pgoyette if (spcr->InterruptType & 0x8) {
2764 1.29.2.1 pgoyette printf("\n\t\tARMH GIC={ GSI=%d }", spcr->Interrupt);
2765 1.29.2.1 pgoyette }
2766 1.5 cegger printf("\n\t}\n");
2767 1.5 cegger
2768 1.5 cegger printf("\tBaud Rate=");
2769 1.5 cegger switch (spcr->BaudRate) {
2770 1.5 cegger case 3:
2771 1.5 cegger printf("9600");
2772 1.5 cegger break;
2773 1.5 cegger case 4:
2774 1.5 cegger printf("19200");
2775 1.5 cegger break;
2776 1.5 cegger case 6:
2777 1.5 cegger printf("57600");
2778 1.5 cegger break;
2779 1.5 cegger case 7:
2780 1.5 cegger printf("115200");
2781 1.5 cegger break;
2782 1.5 cegger default:
2783 1.5 cegger printf("unknown speed index %d", spcr->BaudRate);
2784 1.5 cegger break;
2785 1.5 cegger }
2786 1.5 cegger printf("\n\tParity={");
2787 1.5 cegger switch (spcr->Parity) {
2788 1.5 cegger case 0:
2789 1.5 cegger printf("OFF");
2790 1.5 cegger break;
2791 1.5 cegger default:
2792 1.5 cegger printf("ON");
2793 1.5 cegger break;
2794 1.5 cegger }
2795 1.5 cegger printf("}\n");
2796 1.5 cegger
2797 1.5 cegger printf("\tStop Bits={");
2798 1.5 cegger switch (spcr->StopBits) {
2799 1.5 cegger case 1:
2800 1.5 cegger printf("ON");
2801 1.5 cegger break;
2802 1.5 cegger default:
2803 1.5 cegger printf("OFF");
2804 1.5 cegger break;
2805 1.5 cegger }
2806 1.5 cegger printf("}\n");
2807 1.1 christos
2808 1.5 cegger printf("\tFlow Control={");
2809 1.5 cegger if (spcr->FlowControl & 0x1)
2810 1.5 cegger printf("DCD, ");
2811 1.5 cegger if (spcr->FlowControl & 0x2)
2812 1.5 cegger printf("RTS/CTS hardware, ");
2813 1.5 cegger if (spcr->FlowControl & 0x4)
2814 1.5 cegger printf("XON/XOFF software");
2815 1.5 cegger printf("}\n");
2816 1.1 christos
2817 1.5 cegger printf("\tTerminal=");
2818 1.5 cegger switch (spcr->TerminalType) {
2819 1.5 cegger case 0:
2820 1.5 cegger printf("VT100");
2821 1.5 cegger break;
2822 1.5 cegger case 1:
2823 1.5 cegger printf("VT100+");
2824 1.5 cegger break;
2825 1.5 cegger case 2:
2826 1.5 cegger printf("VT-UTF8");
2827 1.5 cegger break;
2828 1.5 cegger case 3:
2829 1.5 cegger printf("ANSI");
2830 1.5 cegger break;
2831 1.5 cegger default:
2832 1.5 cegger printf("unknown type %d", spcr->TerminalType);
2833 1.5 cegger break;
2834 1.1 christos }
2835 1.5 cegger printf("\n");
2836 1.5 cegger
2837 1.5 cegger acpi_print_pci(spcr->PciVendorId, spcr->PciDeviceId,
2838 1.5 cegger spcr->PciSegment, spcr->PciBus, spcr->PciDevice, spcr->PciFunction);
2839 1.5 cegger
2840 1.5 cegger printf("\tPCI Flags={");
2841 1.5 cegger if (spcr->PciFlags & ACPI_SPCR_DO_NOT_DISABLE)
2842 1.5 cegger printf("DONOT_DISABLE");
2843 1.5 cegger printf("}\n");
2844 1.5 cegger
2845 1.5 cegger printf(END_COMMENT);
2846 1.5 cegger }
2847 1.5 cegger
2848 1.5 cegger static void
2849 1.22 msaitoh acpi_handle_spmi(ACPI_TABLE_HEADER *sdp)
2850 1.22 msaitoh {
2851 1.22 msaitoh ACPI_TABLE_SPMI *spmi;
2852 1.22 msaitoh
2853 1.22 msaitoh printf(BEGIN_COMMENT);
2854 1.22 msaitoh acpi_print_sdt(sdp);
2855 1.22 msaitoh spmi = (ACPI_TABLE_SPMI *)sdp;
2856 1.22 msaitoh
2857 1.22 msaitoh printf("\tInterface Type=");
2858 1.22 msaitoh switch (spmi->InterfaceType) {
2859 1.22 msaitoh case ACPI_SPMI_KEYBOARD:
2860 1.22 msaitoh printf("Keyboard Controller Stype (KCS)");
2861 1.22 msaitoh break;
2862 1.22 msaitoh case ACPI_SPMI_SMI:
2863 1.22 msaitoh printf("Server Management Interface Chip (SMIC)");
2864 1.22 msaitoh break;
2865 1.22 msaitoh case ACPI_SPMI_BLOCK_TRANSFER:
2866 1.22 msaitoh printf("Block Transfer (BT)");
2867 1.22 msaitoh break;
2868 1.22 msaitoh case ACPI_SPMI_SMBUS:
2869 1.22 msaitoh printf("SMBus System Interface (SSIF)");
2870 1.22 msaitoh break;
2871 1.22 msaitoh default:
2872 1.22 msaitoh printf("Reserved(%d)", spmi->InterfaceType);
2873 1.22 msaitoh break;
2874 1.22 msaitoh }
2875 1.29.2.1 pgoyette printf("\n\tSpecRevision=%d.%d", spmi->SpecRevision >> 8,
2876 1.22 msaitoh spmi->SpecRevision & 0xff);
2877 1.22 msaitoh
2878 1.22 msaitoh printf("\n\tInterrupt Type={");
2879 1.22 msaitoh if (spmi->InterruptType & 0x1) {
2880 1.22 msaitoh printf("\n\t\tSCI triggered GPE=%d", spmi->GpeNumber);
2881 1.22 msaitoh }
2882 1.22 msaitoh if (spmi->InterruptType & 0x2) {
2883 1.22 msaitoh printf("\n\t\tIO APIC/SAPIC={ GSI=%d }", spmi->Interrupt);
2884 1.22 msaitoh }
2885 1.22 msaitoh printf("\n\t}\n");
2886 1.22 msaitoh
2887 1.22 msaitoh printf("\tBase Address=");
2888 1.22 msaitoh acpi_print_gas(&spmi->IpmiRegister);
2889 1.22 msaitoh printf("\n");
2890 1.22 msaitoh
2891 1.22 msaitoh if ((spmi->PciDeviceFlag & 0x01) != 0)
2892 1.22 msaitoh acpi_print_pci_sbdf(spmi->PciSegment, spmi->PciBus,
2893 1.22 msaitoh spmi->PciDevice, spmi->PciFunction);
2894 1.22 msaitoh
2895 1.22 msaitoh printf(END_COMMENT);
2896 1.22 msaitoh }
2897 1.22 msaitoh
2898 1.22 msaitoh static void
2899 1.27 msaitoh acpi_print_srat_cpu(uint8_t type, uint32_t apic_id, uint32_t proximity_domain,
2900 1.27 msaitoh uint32_t flags, uint32_t clockdomain, uint8_t sapic_eid)
2901 1.5 cegger {
2902 1.5 cegger
2903 1.5 cegger printf("\tFlags={");
2904 1.5 cegger if (flags & ACPI_SRAT_CPU_ENABLED)
2905 1.5 cegger printf("ENABLED");
2906 1.5 cegger else
2907 1.5 cegger printf("DISABLED");
2908 1.5 cegger printf("}\n");
2909 1.27 msaitoh printf("\t%s ID=%d\n",
2910 1.27 msaitoh (type == ACPI_SRAT_TYPE_GIC_ITS_AFFINITY) ? "ITS" : "APIC",
2911 1.27 msaitoh apic_id);
2912 1.27 msaitoh if (type == ACPI_SRAT_TYPE_CPU_AFFINITY)
2913 1.27 msaitoh printf("\tSAPIC EID=%d\n", sapic_eid);
2914 1.5 cegger printf("\tProximity Domain=%d\n", proximity_domain);
2915 1.27 msaitoh if (type != ACPI_SRAT_TYPE_GIC_ITS_AFFINITY)
2916 1.27 msaitoh printf("\tClock Domain=%d\n", clockdomain);
2917 1.5 cegger }
2918 1.5 cegger
2919 1.5 cegger static void
2920 1.5 cegger acpi_print_srat_memory(ACPI_SRAT_MEM_AFFINITY *mp)
2921 1.5 cegger {
2922 1.5 cegger
2923 1.5 cegger printf("\tFlags={");
2924 1.5 cegger if (mp->Flags & ACPI_SRAT_MEM_ENABLED)
2925 1.5 cegger printf("ENABLED");
2926 1.5 cegger else
2927 1.5 cegger printf("DISABLED");
2928 1.5 cegger if (mp->Flags & ACPI_SRAT_MEM_HOT_PLUGGABLE)
2929 1.5 cegger printf(",HOT_PLUGGABLE");
2930 1.5 cegger if (mp->Flags & ACPI_SRAT_MEM_NON_VOLATILE)
2931 1.5 cegger printf(",NON_VOLATILE");
2932 1.5 cegger printf("}\n");
2933 1.5 cegger printf("\tBase Address=0x%016jx\n", (uintmax_t)mp->BaseAddress);
2934 1.5 cegger printf("\tLength=0x%016jx\n", (uintmax_t)mp->Length);
2935 1.5 cegger printf("\tProximity Domain=%d\n", mp->ProximityDomain);
2936 1.1 christos }
2937 1.1 christos
2938 1.16 msaitoh static const char *srat_types[] = {
2939 1.16 msaitoh [ACPI_SRAT_TYPE_CPU_AFFINITY] = "CPU",
2940 1.16 msaitoh [ACPI_SRAT_TYPE_MEMORY_AFFINITY] = "Memory",
2941 1.16 msaitoh [ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY] = "X2APIC",
2942 1.16 msaitoh [ACPI_SRAT_TYPE_GICC_AFFINITY] = "GICC",
2943 1.27 msaitoh [ACPI_SRAT_TYPE_GIC_ITS_AFFINITY] = "GIC ITS",
2944 1.16 msaitoh };
2945 1.5 cegger
2946 1.1 christos static void
2947 1.5 cegger acpi_print_srat(ACPI_SUBTABLE_HEADER *srat)
2948 1.1 christos {
2949 1.5 cegger ACPI_SRAT_CPU_AFFINITY *cpu;
2950 1.5 cegger ACPI_SRAT_X2APIC_CPU_AFFINITY *x2apic;
2951 1.27 msaitoh ACPI_SRAT_GICC_AFFINITY *gicc;
2952 1.27 msaitoh ACPI_SRAT_GIC_ITS_AFFINITY *gici;
2953 1.5 cegger
2954 1.16 msaitoh if (srat->Type < __arraycount(srat_types))
2955 1.5 cegger printf("\tType=%s\n", srat_types[srat->Type]);
2956 1.5 cegger else
2957 1.5 cegger printf("\tType=%d (unknown)\n", srat->Type);
2958 1.5 cegger switch (srat->Type) {
2959 1.5 cegger case ACPI_SRAT_TYPE_CPU_AFFINITY:
2960 1.5 cegger cpu = (ACPI_SRAT_CPU_AFFINITY *)srat;
2961 1.27 msaitoh acpi_print_srat_cpu(srat->Type, cpu->ApicId,
2962 1.5 cegger cpu->ProximityDomainHi[2] << 24 |
2963 1.5 cegger cpu->ProximityDomainHi[1] << 16 |
2964 1.5 cegger cpu->ProximityDomainHi[0] << 0 |
2965 1.5 cegger cpu->ProximityDomainLo,
2966 1.27 msaitoh cpu->Flags, cpu->ClockDomain, cpu->LocalSapicEid);
2967 1.5 cegger break;
2968 1.5 cegger case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
2969 1.5 cegger acpi_print_srat_memory((ACPI_SRAT_MEM_AFFINITY *)srat);
2970 1.5 cegger break;
2971 1.5 cegger case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
2972 1.5 cegger x2apic = (ACPI_SRAT_X2APIC_CPU_AFFINITY *)srat;
2973 1.27 msaitoh acpi_print_srat_cpu(srat->Type, x2apic->ApicId,
2974 1.27 msaitoh x2apic->ProximityDomain,
2975 1.27 msaitoh x2apic->Flags, x2apic->ClockDomain, 0 /* dummy */);
2976 1.5 cegger break;
2977 1.16 msaitoh case ACPI_SRAT_TYPE_GICC_AFFINITY:
2978 1.27 msaitoh gicc = (ACPI_SRAT_GICC_AFFINITY *)srat;
2979 1.27 msaitoh acpi_print_srat_cpu(srat->Type, gicc->AcpiProcessorUid,
2980 1.27 msaitoh gicc->ProximityDomain,
2981 1.27 msaitoh gicc->Flags, gicc->ClockDomain, 0 /* dummy */);
2982 1.27 msaitoh break;
2983 1.27 msaitoh case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
2984 1.27 msaitoh gici = (ACPI_SRAT_GIC_ITS_AFFINITY *)srat;
2985 1.27 msaitoh acpi_print_srat_cpu(srat->Type, gici->ItsId,
2986 1.27 msaitoh gici->ProximityDomain,
2987 1.27 msaitoh 0 /* dummy */, 0 /* dummy */, 0 /* dummy */);
2988 1.16 msaitoh break;
2989 1.5 cegger }
2990 1.5 cegger }
2991 1.1 christos
2992 1.5 cegger static void
2993 1.5 cegger acpi_handle_srat(ACPI_TABLE_HEADER *sdp)
2994 1.5 cegger {
2995 1.5 cegger ACPI_TABLE_SRAT *srat;
2996 1.1 christos
2997 1.5 cegger printf(BEGIN_COMMENT);
2998 1.5 cegger acpi_print_sdt(sdp);
2999 1.5 cegger srat = (ACPI_TABLE_SRAT *)sdp;
3000 1.5 cegger printf("\tTable Revision=%d\n", srat->TableRevision);
3001 1.5 cegger acpi_walk_subtables(sdp, (srat + 1), acpi_print_srat);
3002 1.5 cegger printf(END_COMMENT);
3003 1.1 christos }
3004 1.1 christos
3005 1.19 msaitoh static const char *nfit_types[] = {
3006 1.19 msaitoh [ACPI_NFIT_TYPE_SYSTEM_ADDRESS] = "System Address",
3007 1.19 msaitoh [ACPI_NFIT_TYPE_MEMORY_MAP] = "Memory Map",
3008 1.19 msaitoh [ACPI_NFIT_TYPE_INTERLEAVE] = "Interleave",
3009 1.19 msaitoh [ACPI_NFIT_TYPE_SMBIOS] = "SMBIOS",
3010 1.19 msaitoh [ACPI_NFIT_TYPE_CONTROL_REGION] = "Control Region",
3011 1.19 msaitoh [ACPI_NFIT_TYPE_DATA_REGION] = "Data Region",
3012 1.19 msaitoh [ACPI_NFIT_TYPE_FLUSH_ADDRESS] = "Flush Address"
3013 1.19 msaitoh };
3014 1.19 msaitoh
3015 1.19 msaitoh
3016 1.19 msaitoh static void
3017 1.19 msaitoh acpi_print_nfit(ACPI_NFIT_HEADER *nfit)
3018 1.19 msaitoh {
3019 1.19 msaitoh char *uuidstr;
3020 1.19 msaitoh uint32_t status;
3021 1.19 msaitoh
3022 1.19 msaitoh ACPI_NFIT_SYSTEM_ADDRESS *sysaddr;
3023 1.19 msaitoh ACPI_NFIT_MEMORY_MAP *mmap;
3024 1.19 msaitoh ACPI_NFIT_INTERLEAVE *ileave;
3025 1.19 msaitoh ACPI_NFIT_SMBIOS *smbios __unused;
3026 1.19 msaitoh ACPI_NFIT_CONTROL_REGION *ctlreg;
3027 1.19 msaitoh ACPI_NFIT_DATA_REGION *datareg;
3028 1.19 msaitoh ACPI_NFIT_FLUSH_ADDRESS *fladdr;
3029 1.19 msaitoh
3030 1.19 msaitoh if (nfit->Type < __arraycount(nfit_types))
3031 1.19 msaitoh printf("\tType=%s\n", nfit_types[nfit->Type]);
3032 1.19 msaitoh else
3033 1.19 msaitoh printf("\tType=%u (unknown)\n", nfit->Type);
3034 1.19 msaitoh switch (nfit->Type) {
3035 1.19 msaitoh case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
3036 1.19 msaitoh sysaddr = (ACPI_NFIT_SYSTEM_ADDRESS *)nfit;
3037 1.19 msaitoh printf("\tRangeIndex=%u\n", (u_int)sysaddr->RangeIndex);
3038 1.19 msaitoh printf("\tProximityDomain=%u\n",
3039 1.19 msaitoh (u_int)sysaddr->ProximityDomain);
3040 1.19 msaitoh uuid_to_string((uuid_t *)(sysaddr->RangeGuid),
3041 1.19 msaitoh &uuidstr, &status);
3042 1.19 msaitoh if (status != uuid_s_ok)
3043 1.19 msaitoh errx(1, "uuid_to_string: status=%u", status);
3044 1.19 msaitoh printf("\tRangeGuid=%s\n", uuidstr);
3045 1.19 msaitoh free(uuidstr);
3046 1.19 msaitoh printf("\tAddress=0x%016jx\n", (uintmax_t)sysaddr->Address);
3047 1.19 msaitoh printf("\tLength=0x%016jx\n", (uintmax_t)sysaddr->Length);
3048 1.19 msaitoh printf("\tMemoryMapping=0x%016jx\n",
3049 1.19 msaitoh (uintmax_t)sysaddr->MemoryMapping);
3050 1.19 msaitoh
3051 1.19 msaitoh #define PRINTFLAG(var, flag) printflag((var), ACPI_NFIT_## flag, #flag)
3052 1.19 msaitoh
3053 1.19 msaitoh printf("\tFlags=");
3054 1.19 msaitoh PRINTFLAG(sysaddr->Flags, ADD_ONLINE_ONLY);
3055 1.19 msaitoh PRINTFLAG(sysaddr->Flags, PROXIMITY_VALID);
3056 1.19 msaitoh PRINTFLAG_END();
3057 1.19 msaitoh
3058 1.19 msaitoh #undef PRINTFLAG
3059 1.19 msaitoh
3060 1.19 msaitoh break;
3061 1.19 msaitoh case ACPI_NFIT_TYPE_MEMORY_MAP:
3062 1.19 msaitoh mmap = (ACPI_NFIT_MEMORY_MAP *)nfit;
3063 1.19 msaitoh printf("\tDeviceHandle=%u\n", (u_int)mmap->DeviceHandle);
3064 1.19 msaitoh printf("\tPhysicalId=%u\n", (u_int)mmap->PhysicalId);
3065 1.19 msaitoh printf("\tRegionId=%u\n", (u_int)mmap->RegionId);
3066 1.19 msaitoh printf("\tRangeIndex=%u\n", (u_int)mmap->RangeIndex);
3067 1.19 msaitoh printf("\tRegionIndex=%u\n", (u_int)mmap->RegionIndex);
3068 1.19 msaitoh printf("\tRegionSize=0x%016jx\n", (uintmax_t)mmap->RegionSize);
3069 1.19 msaitoh printf("\tRegionOffset=0x%016jx\n",
3070 1.19 msaitoh (uintmax_t)mmap->RegionOffset);
3071 1.19 msaitoh printf("\tAddress=0x%016jx\n", (uintmax_t)mmap->Address);
3072 1.19 msaitoh printf("\tInterleaveIndex=%u\n", (u_int)mmap->InterleaveIndex);
3073 1.19 msaitoh printf("\tInterleaveWays=%u\n", (u_int)mmap->InterleaveWays);
3074 1.19 msaitoh
3075 1.19 msaitoh #define PRINTFLAG(var, flag) printflag((var), ACPI_NFIT_MEM_## flag, #flag)
3076 1.19 msaitoh
3077 1.19 msaitoh printf("\tFlags=");
3078 1.19 msaitoh PRINTFLAG(mmap->Flags, SAVE_FAILED);
3079 1.19 msaitoh PRINTFLAG(mmap->Flags, RESTORE_FAILED);
3080 1.19 msaitoh PRINTFLAG(mmap->Flags, FLUSH_FAILED);
3081 1.19 msaitoh PRINTFLAG(mmap->Flags, NOT_ARMED);
3082 1.19 msaitoh PRINTFLAG(mmap->Flags, HEALTH_OBSERVED);
3083 1.19 msaitoh PRINTFLAG(mmap->Flags, HEALTH_ENABLED);
3084 1.19 msaitoh PRINTFLAG(mmap->Flags, MAP_FAILED);
3085 1.19 msaitoh PRINTFLAG_END();
3086 1.19 msaitoh
3087 1.19 msaitoh #undef PRINTFLAG
3088 1.19 msaitoh
3089 1.19 msaitoh break;
3090 1.19 msaitoh case ACPI_NFIT_TYPE_INTERLEAVE:
3091 1.19 msaitoh ileave = (ACPI_NFIT_INTERLEAVE *)nfit;
3092 1.19 msaitoh printf("\tInterleaveIndex=%u\n",
3093 1.19 msaitoh (u_int)ileave->InterleaveIndex);
3094 1.19 msaitoh printf("\tLineCount=%u\n", (u_int)ileave->LineCount);
3095 1.19 msaitoh printf("\tLineSize=%u\n", (u_int)ileave->LineSize);
3096 1.19 msaitoh /* XXX ileave->LineOffset[i] output is not supported */
3097 1.19 msaitoh break;
3098 1.19 msaitoh case ACPI_NFIT_TYPE_SMBIOS:
3099 1.19 msaitoh smbios = (ACPI_NFIT_SMBIOS *)nfit;
3100 1.19 msaitoh /* XXX smbios->Data[x] output is not supported */
3101 1.19 msaitoh break;
3102 1.19 msaitoh case ACPI_NFIT_TYPE_CONTROL_REGION:
3103 1.19 msaitoh ctlreg = (ACPI_NFIT_CONTROL_REGION *)nfit;
3104 1.19 msaitoh printf("\tRegionIndex=%u\n", (u_int)ctlreg->RegionIndex);
3105 1.19 msaitoh printf("\tVendorId=0x%04x\n", (u_int)ctlreg->VendorId);
3106 1.19 msaitoh printf("\tDeviceId=0x%04x\n", (u_int)ctlreg->DeviceId);
3107 1.19 msaitoh printf("\tRevisionId=%u\n", (u_int)ctlreg->RevisionId);
3108 1.19 msaitoh printf("\tSubsystemVendorId=0x%04x\n",
3109 1.19 msaitoh (u_int)ctlreg->SubsystemVendorId);
3110 1.19 msaitoh printf("\tSubsystemDeviceId=0x%04x\n",
3111 1.19 msaitoh (u_int)ctlreg->SubsystemDeviceId);
3112 1.19 msaitoh printf("\tSubsystemRevisionId=%u\n",
3113 1.19 msaitoh (u_int)ctlreg->SubsystemRevisionId);
3114 1.20 msaitoh printf("\tValidFields=%02x\n", (u_int)ctlreg->ValidFields);
3115 1.19 msaitoh printf("\tManufacturingLocation=%u\n",
3116 1.19 msaitoh (u_int)ctlreg->ManufacturingLocation);
3117 1.19 msaitoh printf("\tManufacturingDate=%u\n",
3118 1.19 msaitoh (u_int)ctlreg->ManufacturingDate);
3119 1.19 msaitoh printf("\tSerialNumber=%u\n",
3120 1.19 msaitoh (u_int)ctlreg->SerialNumber);
3121 1.19 msaitoh printf("\tCode=0x%04x\n", (u_int)ctlreg->Code);
3122 1.19 msaitoh printf("\tWindows=%u\n", (u_int)ctlreg->Windows);
3123 1.19 msaitoh printf("\tWindowSize=0x%016jx\n",
3124 1.19 msaitoh (uintmax_t)ctlreg->WindowSize);
3125 1.19 msaitoh printf("\tCommandOffset=0x%016jx\n",
3126 1.19 msaitoh (uintmax_t)ctlreg->CommandOffset);
3127 1.19 msaitoh printf("\tCommandSize=0x%016jx\n",
3128 1.19 msaitoh (uintmax_t)ctlreg->CommandSize);
3129 1.19 msaitoh printf("\tStatusOffset=0x%016jx\n",
3130 1.19 msaitoh (uintmax_t)ctlreg->StatusOffset);
3131 1.19 msaitoh printf("\tStatusSize=0x%016jx\n",
3132 1.19 msaitoh (uintmax_t)ctlreg->StatusSize);
3133 1.19 msaitoh
3134 1.19 msaitoh #define PRINTFLAG(var, flag) printflag((var), ACPI_NFIT_## flag, #flag)
3135 1.19 msaitoh
3136 1.19 msaitoh printf("\tFlags=");
3137 1.20 msaitoh PRINTFLAG(ctlreg->Flags, CONTROL_BUFFERED);
3138 1.19 msaitoh PRINTFLAG_END();
3139 1.19 msaitoh
3140 1.19 msaitoh #undef PRINTFLAG
3141 1.19 msaitoh
3142 1.19 msaitoh break;
3143 1.19 msaitoh case ACPI_NFIT_TYPE_DATA_REGION:
3144 1.19 msaitoh datareg = (ACPI_NFIT_DATA_REGION *)nfit;
3145 1.19 msaitoh printf("\tRegionIndex=%u\n", (u_int)datareg->RegionIndex);
3146 1.19 msaitoh printf("\tWindows=%u\n", (u_int)datareg->Windows);
3147 1.19 msaitoh printf("\tOffset=0x%016jx\n", (uintmax_t)datareg->Offset);
3148 1.19 msaitoh printf("\tSize=0x%016jx\n", (uintmax_t)datareg->Size);
3149 1.19 msaitoh printf("\tCapacity=0x%016jx\n", (uintmax_t)datareg->Capacity);
3150 1.19 msaitoh printf("\tStartAddress=0x%016jx\n",
3151 1.19 msaitoh (uintmax_t)datareg->StartAddress);
3152 1.19 msaitoh break;
3153 1.19 msaitoh case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
3154 1.19 msaitoh fladdr = (ACPI_NFIT_FLUSH_ADDRESS *)nfit;
3155 1.19 msaitoh printf("\tDeviceHandle=%u\n", (u_int)fladdr->DeviceHandle);
3156 1.19 msaitoh printf("\tHintCount=%u\n", (u_int)fladdr->HintCount);
3157 1.19 msaitoh /* XXX fladdr->HintAddress[i] output is not supported */
3158 1.19 msaitoh break;
3159 1.19 msaitoh }
3160 1.19 msaitoh }
3161 1.19 msaitoh
3162 1.19 msaitoh static void
3163 1.19 msaitoh acpi_handle_nfit(ACPI_TABLE_HEADER *sdp)
3164 1.19 msaitoh {
3165 1.19 msaitoh ACPI_TABLE_NFIT *nfit;
3166 1.19 msaitoh
3167 1.19 msaitoh printf(BEGIN_COMMENT);
3168 1.19 msaitoh acpi_print_sdt(sdp);
3169 1.19 msaitoh nfit = (ACPI_TABLE_NFIT *)sdp;
3170 1.19 msaitoh acpi_walk_nfit(sdp, (nfit + 1), acpi_print_nfit);
3171 1.19 msaitoh printf(END_COMMENT);
3172 1.19 msaitoh }
3173 1.19 msaitoh
3174 1.16 msaitoh static char *
3175 1.16 msaitoh acpi_tcpa_evname(struct TCPAevent *event)
3176 1.16 msaitoh {
3177 1.16 msaitoh struct TCPApc_event *pc_event;
3178 1.16 msaitoh char *eventname = NULL;
3179 1.16 msaitoh
3180 1.16 msaitoh pc_event = (struct TCPApc_event *)(event + 1);
3181 1.16 msaitoh
3182 1.27 msaitoh switch (event->event_type) {
3183 1.16 msaitoh case PREBOOT:
3184 1.16 msaitoh case POST_CODE:
3185 1.16 msaitoh case UNUSED:
3186 1.16 msaitoh case NO_ACTION:
3187 1.16 msaitoh case SEPARATOR:
3188 1.16 msaitoh case SCRTM_CONTENTS:
3189 1.16 msaitoh case SCRTM_VERSION:
3190 1.16 msaitoh case CPU_MICROCODE:
3191 1.16 msaitoh case PLATFORM_CONFIG_FLAGS:
3192 1.16 msaitoh case TABLE_OF_DEVICES:
3193 1.16 msaitoh case COMPACT_HASH:
3194 1.16 msaitoh case IPL:
3195 1.16 msaitoh case IPL_PARTITION_DATA:
3196 1.16 msaitoh case NONHOST_CODE:
3197 1.16 msaitoh case NONHOST_CONFIG:
3198 1.16 msaitoh case NONHOST_INFO:
3199 1.16 msaitoh asprintf(&eventname, "%s",
3200 1.16 msaitoh tcpa_event_type_strings[event->event_type]);
3201 1.16 msaitoh break;
3202 1.16 msaitoh
3203 1.16 msaitoh case ACTION:
3204 1.16 msaitoh eventname = calloc(event->event_size + 1, sizeof(char));
3205 1.16 msaitoh memcpy(eventname, pc_event, event->event_size);
3206 1.16 msaitoh break;
3207 1.16 msaitoh
3208 1.16 msaitoh case EVENT_TAG:
3209 1.16 msaitoh switch (pc_event->event_id) {
3210 1.16 msaitoh case SMBIOS:
3211 1.16 msaitoh case BIS_CERT:
3212 1.16 msaitoh case CMOS:
3213 1.16 msaitoh case NVRAM:
3214 1.16 msaitoh case OPTION_ROM_EXEC:
3215 1.16 msaitoh case OPTION_ROM_CONFIG:
3216 1.16 msaitoh case S_CRTM_VERSION:
3217 1.16 msaitoh case POST_BIOS_ROM:
3218 1.16 msaitoh case ESCD:
3219 1.16 msaitoh case OPTION_ROM_MICROCODE:
3220 1.16 msaitoh case S_CRTM_CONTENTS:
3221 1.16 msaitoh case POST_CONTENTS:
3222 1.16 msaitoh asprintf(&eventname, "%s",
3223 1.16 msaitoh TCPA_pcclient_strings[pc_event->event_id]);
3224 1.16 msaitoh break;
3225 1.16 msaitoh
3226 1.16 msaitoh default:
3227 1.16 msaitoh asprintf(&eventname, "<unknown tag 0x%02x>",
3228 1.16 msaitoh pc_event->event_id);
3229 1.16 msaitoh break;
3230 1.16 msaitoh }
3231 1.16 msaitoh break;
3232 1.16 msaitoh
3233 1.16 msaitoh default:
3234 1.16 msaitoh asprintf(&eventname, "<unknown 0x%02x>", event->event_type);
3235 1.16 msaitoh break;
3236 1.16 msaitoh }
3237 1.16 msaitoh
3238 1.16 msaitoh return eventname;
3239 1.16 msaitoh }
3240 1.16 msaitoh
3241 1.16 msaitoh static void
3242 1.16 msaitoh acpi_print_tcpa(struct TCPAevent *event)
3243 1.16 msaitoh {
3244 1.16 msaitoh int i;
3245 1.16 msaitoh char *eventname;
3246 1.16 msaitoh
3247 1.16 msaitoh eventname = acpi_tcpa_evname(event);
3248 1.16 msaitoh
3249 1.16 msaitoh printf("\t%d", event->pcr_index);
3250 1.16 msaitoh printf(" 0x");
3251 1.16 msaitoh for (i = 0; i < 20; i++)
3252 1.16 msaitoh printf("%02x", event->pcr_value[i]);
3253 1.16 msaitoh printf(" [%s]\n", eventname ? eventname : "<unknown>");
3254 1.16 msaitoh
3255 1.16 msaitoh free(eventname);
3256 1.16 msaitoh }
3257 1.16 msaitoh
3258 1.1 christos static void
3259 1.5 cegger acpi_handle_tcpa(ACPI_TABLE_HEADER *sdp)
3260 1.1 christos {
3261 1.16 msaitoh struct TCPAbody *tcpa;
3262 1.16 msaitoh struct TCPAevent *event;
3263 1.16 msaitoh uintmax_t len, paddr;
3264 1.16 msaitoh unsigned char *vaddr = NULL;
3265 1.16 msaitoh unsigned char *vend = NULL;
3266 1.5 cegger
3267 1.5 cegger printf(BEGIN_COMMENT);
3268 1.5 cegger acpi_print_sdt(sdp);
3269 1.16 msaitoh tcpa = (struct TCPAbody *) sdp;
3270 1.16 msaitoh
3271 1.16 msaitoh switch (tcpa->platform_class) {
3272 1.16 msaitoh case ACPI_TCPA_BIOS_CLIENT:
3273 1.16 msaitoh len = tcpa->client.log_max_len;
3274 1.16 msaitoh paddr = tcpa->client.log_start_addr;
3275 1.13 christos break;
3276 1.13 christos
3277 1.16 msaitoh case ACPI_TCPA_BIOS_SERVER:
3278 1.16 msaitoh len = tcpa->server.log_max_len;
3279 1.16 msaitoh paddr = tcpa->server.log_start_addr;
3280 1.13 christos break;
3281 1.13 christos
3282 1.13 christos default:
3283 1.16 msaitoh printf("XXX");
3284 1.16 msaitoh printf(END_COMMENT);
3285 1.16 msaitoh return;
3286 1.16 msaitoh }
3287 1.16 msaitoh printf("\tClass %u Base Address 0x%jx Length %ju\n\n",
3288 1.16 msaitoh tcpa->platform_class, paddr, len);
3289 1.16 msaitoh
3290 1.16 msaitoh if (len == 0) {
3291 1.16 msaitoh printf("\tEmpty TCPA table\n");
3292 1.16 msaitoh printf(END_COMMENT);
3293 1.16 msaitoh return;
3294 1.16 msaitoh }
3295 1.27 msaitoh if (sdp->Revision == 1) {
3296 1.16 msaitoh printf("\tOLD TCPA spec log found. Dumping not supported.\n");
3297 1.16 msaitoh printf(END_COMMENT);
3298 1.16 msaitoh return;
3299 1.16 msaitoh }
3300 1.16 msaitoh
3301 1.16 msaitoh vaddr = (unsigned char *)acpi_map_physical(paddr, len);
3302 1.16 msaitoh vend = vaddr + len;
3303 1.16 msaitoh
3304 1.16 msaitoh while (vaddr != NULL) {
3305 1.16 msaitoh if ((vaddr + sizeof(struct TCPAevent) >= vend)||
3306 1.16 msaitoh (vaddr + sizeof(struct TCPAevent) < vaddr))
3307 1.16 msaitoh break;
3308 1.16 msaitoh event = (struct TCPAevent *)(void *)vaddr;
3309 1.16 msaitoh if (vaddr + event->event_size >= vend)
3310 1.16 msaitoh break;
3311 1.16 msaitoh if (vaddr + event->event_size < vaddr)
3312 1.16 msaitoh break;
3313 1.16 msaitoh if (event->event_type == 0 && event->event_size == 0)
3314 1.16 msaitoh break;
3315 1.16 msaitoh #if 0
3316 1.16 msaitoh {
3317 1.16 msaitoh unsigned int i, j, k;
3318 1.16 msaitoh
3319 1.16 msaitoh printf("\n\tsize %d\n\t\t%p ", event->event_size, vaddr);
3320 1.16 msaitoh for (j = 0, i = 0; i <
3321 1.16 msaitoh sizeof(struct TCPAevent) + event->event_size; i++) {
3322 1.16 msaitoh printf("%02x ", vaddr[i]);
3323 1.16 msaitoh if ((i+1) % 8 == 0) {
3324 1.16 msaitoh for (k = 0; k < 8; k++)
3325 1.16 msaitoh printf("%c", isprint(vaddr[j+k]) ?
3326 1.16 msaitoh vaddr[j+k] : '.');
3327 1.16 msaitoh printf("\n\t\t%p ", &vaddr[i + 1]);
3328 1.16 msaitoh j = i + 1;
3329 1.16 msaitoh }
3330 1.16 msaitoh }
3331 1.16 msaitoh printf("\n"); }
3332 1.16 msaitoh #endif
3333 1.16 msaitoh acpi_print_tcpa(event);
3334 1.16 msaitoh
3335 1.16 msaitoh vaddr += sizeof(struct TCPAevent) + event->event_size;
3336 1.16 msaitoh }
3337 1.16 msaitoh
3338 1.16 msaitoh printf(END_COMMENT);
3339 1.16 msaitoh }
3340 1.16 msaitoh
3341 1.16 msaitoh static const char *
3342 1.16 msaitoh devscope_type2str(int type)
3343 1.16 msaitoh {
3344 1.16 msaitoh static char typebuf[16];
3345 1.16 msaitoh
3346 1.16 msaitoh switch (type) {
3347 1.16 msaitoh case 1:
3348 1.16 msaitoh return ("PCI Endpoint Device");
3349 1.16 msaitoh case 2:
3350 1.16 msaitoh return ("PCI Sub-Hierarchy");
3351 1.16 msaitoh case 3:
3352 1.16 msaitoh return ("IOAPIC");
3353 1.16 msaitoh case 4:
3354 1.16 msaitoh return ("HPET");
3355 1.29.2.1 pgoyette case 5:
3356 1.29.2.1 pgoyette return ("ACPI Name space");
3357 1.16 msaitoh default:
3358 1.16 msaitoh snprintf(typebuf, sizeof(typebuf), "%d", type);
3359 1.16 msaitoh return (typebuf);
3360 1.16 msaitoh }
3361 1.16 msaitoh }
3362 1.16 msaitoh
3363 1.16 msaitoh static int
3364 1.16 msaitoh acpi_handle_dmar_devscope(void *addr, int remaining)
3365 1.16 msaitoh {
3366 1.16 msaitoh char sep;
3367 1.16 msaitoh int pathlen;
3368 1.16 msaitoh ACPI_DMAR_PCI_PATH *path, *pathend;
3369 1.16 msaitoh ACPI_DMAR_DEVICE_SCOPE *devscope = addr;
3370 1.16 msaitoh
3371 1.16 msaitoh if (remaining < (int)sizeof(ACPI_DMAR_DEVICE_SCOPE))
3372 1.16 msaitoh return (-1);
3373 1.16 msaitoh
3374 1.16 msaitoh if (remaining < devscope->Length)
3375 1.16 msaitoh return (-1);
3376 1.16 msaitoh
3377 1.16 msaitoh printf("\n");
3378 1.16 msaitoh printf("\t\tType=%s\n", devscope_type2str(devscope->EntryType));
3379 1.16 msaitoh printf("\t\tLength=%d\n", devscope->Length);
3380 1.16 msaitoh printf("\t\tEnumerationId=%d\n", devscope->EnumerationId);
3381 1.16 msaitoh printf("\t\tStartBusNumber=%d\n", devscope->Bus);
3382 1.16 msaitoh
3383 1.16 msaitoh path = (ACPI_DMAR_PCI_PATH *)(devscope + 1);
3384 1.16 msaitoh pathlen = devscope->Length - sizeof(ACPI_DMAR_DEVICE_SCOPE);
3385 1.16 msaitoh pathend = path + pathlen / sizeof(ACPI_DMAR_PCI_PATH);
3386 1.16 msaitoh if (path < pathend) {
3387 1.16 msaitoh sep = '{';
3388 1.16 msaitoh printf("\t\tPath=");
3389 1.16 msaitoh do {
3390 1.16 msaitoh printf("%c%d:%d", sep, path->Device, path->Function);
3391 1.16 msaitoh sep=',';
3392 1.16 msaitoh path++;
3393 1.16 msaitoh } while (path < pathend);
3394 1.16 msaitoh printf("}\n");
3395 1.16 msaitoh }
3396 1.16 msaitoh
3397 1.16 msaitoh return (devscope->Length);
3398 1.16 msaitoh }
3399 1.16 msaitoh
3400 1.16 msaitoh static void
3401 1.16 msaitoh acpi_handle_dmar_drhd(ACPI_DMAR_HARDWARE_UNIT *drhd)
3402 1.16 msaitoh {
3403 1.16 msaitoh char *cp;
3404 1.16 msaitoh int remaining, consumed;
3405 1.16 msaitoh
3406 1.16 msaitoh printf("\n");
3407 1.16 msaitoh printf("\tType=DRHD\n");
3408 1.16 msaitoh printf("\tLength=%d\n", drhd->Header.Length);
3409 1.16 msaitoh
3410 1.16 msaitoh #define PRINTFLAG(var, flag) printflag((var), ACPI_DMAR_## flag, #flag)
3411 1.16 msaitoh
3412 1.16 msaitoh printf("\tFlags=");
3413 1.16 msaitoh PRINTFLAG(drhd->Flags, INCLUDE_ALL);
3414 1.16 msaitoh PRINTFLAG_END();
3415 1.16 msaitoh
3416 1.16 msaitoh #undef PRINTFLAG
3417 1.16 msaitoh
3418 1.16 msaitoh printf("\tSegment=%d\n", drhd->Segment);
3419 1.16 msaitoh printf("\tAddress=0x%016jx\n", (uintmax_t)drhd->Address);
3420 1.16 msaitoh
3421 1.16 msaitoh remaining = drhd->Header.Length - sizeof(ACPI_DMAR_HARDWARE_UNIT);
3422 1.16 msaitoh if (remaining > 0)
3423 1.16 msaitoh printf("\tDevice Scope:");
3424 1.16 msaitoh while (remaining > 0) {
3425 1.16 msaitoh cp = (char *)drhd + drhd->Header.Length - remaining;
3426 1.16 msaitoh consumed = acpi_handle_dmar_devscope(cp, remaining);
3427 1.16 msaitoh if (consumed <= 0)
3428 1.16 msaitoh break;
3429 1.16 msaitoh else
3430 1.16 msaitoh remaining -= consumed;
3431 1.16 msaitoh }
3432 1.16 msaitoh }
3433 1.16 msaitoh
3434 1.16 msaitoh static void
3435 1.16 msaitoh acpi_handle_dmar_rmrr(ACPI_DMAR_RESERVED_MEMORY *rmrr)
3436 1.16 msaitoh {
3437 1.16 msaitoh char *cp;
3438 1.16 msaitoh int remaining, consumed;
3439 1.16 msaitoh
3440 1.16 msaitoh printf("\n");
3441 1.16 msaitoh printf("\tType=RMRR\n");
3442 1.16 msaitoh printf("\tLength=%d\n", rmrr->Header.Length);
3443 1.16 msaitoh printf("\tSegment=%d\n", rmrr->Segment);
3444 1.16 msaitoh printf("\tBaseAddress=0x%016jx\n", (uintmax_t)rmrr->BaseAddress);
3445 1.16 msaitoh printf("\tLimitAddress=0x%016jx\n", (uintmax_t)rmrr->EndAddress);
3446 1.16 msaitoh
3447 1.16 msaitoh remaining = rmrr->Header.Length - sizeof(ACPI_DMAR_RESERVED_MEMORY);
3448 1.16 msaitoh if (remaining > 0)
3449 1.16 msaitoh printf("\tDevice Scope:");
3450 1.16 msaitoh while (remaining > 0) {
3451 1.16 msaitoh cp = (char *)rmrr + rmrr->Header.Length - remaining;
3452 1.16 msaitoh consumed = acpi_handle_dmar_devscope(cp, remaining);
3453 1.16 msaitoh if (consumed <= 0)
3454 1.16 msaitoh break;
3455 1.16 msaitoh else
3456 1.16 msaitoh remaining -= consumed;
3457 1.16 msaitoh }
3458 1.16 msaitoh }
3459 1.16 msaitoh
3460 1.16 msaitoh static void
3461 1.16 msaitoh acpi_handle_dmar_atsr(ACPI_DMAR_ATSR *atsr)
3462 1.16 msaitoh {
3463 1.16 msaitoh char *cp;
3464 1.16 msaitoh int remaining, consumed;
3465 1.16 msaitoh
3466 1.16 msaitoh printf("\n");
3467 1.16 msaitoh printf("\tType=ATSR\n");
3468 1.16 msaitoh printf("\tLength=%d\n", atsr->Header.Length);
3469 1.16 msaitoh
3470 1.16 msaitoh #define PRINTFLAG(var, flag) printflag((var), ACPI_DMAR_## flag, #flag)
3471 1.16 msaitoh
3472 1.16 msaitoh printf("\tFlags=");
3473 1.16 msaitoh PRINTFLAG(atsr->Flags, ALL_PORTS);
3474 1.16 msaitoh PRINTFLAG_END();
3475 1.16 msaitoh
3476 1.16 msaitoh #undef PRINTFLAG
3477 1.16 msaitoh
3478 1.16 msaitoh printf("\tSegment=%d\n", atsr->Segment);
3479 1.16 msaitoh
3480 1.16 msaitoh remaining = atsr->Header.Length - sizeof(ACPI_DMAR_ATSR);
3481 1.16 msaitoh if (remaining > 0)
3482 1.16 msaitoh printf("\tDevice Scope:");
3483 1.16 msaitoh while (remaining > 0) {
3484 1.16 msaitoh cp = (char *)atsr + atsr->Header.Length - remaining;
3485 1.16 msaitoh consumed = acpi_handle_dmar_devscope(cp, remaining);
3486 1.16 msaitoh if (consumed <= 0)
3487 1.16 msaitoh break;
3488 1.16 msaitoh else
3489 1.16 msaitoh remaining -= consumed;
3490 1.16 msaitoh }
3491 1.16 msaitoh }
3492 1.16 msaitoh
3493 1.16 msaitoh static void
3494 1.16 msaitoh acpi_handle_dmar_rhsa(ACPI_DMAR_RHSA *rhsa)
3495 1.16 msaitoh {
3496 1.16 msaitoh
3497 1.16 msaitoh printf("\n");
3498 1.16 msaitoh printf("\tType=RHSA\n");
3499 1.16 msaitoh printf("\tLength=%d\n", rhsa->Header.Length);
3500 1.16 msaitoh printf("\tBaseAddress=0x%016jx\n", (uintmax_t)rhsa->BaseAddress);
3501 1.16 msaitoh printf("\tProximityDomain=0x%08x\n", rhsa->ProximityDomain);
3502 1.16 msaitoh }
3503 1.16 msaitoh
3504 1.29.2.1 pgoyette static void
3505 1.29.2.1 pgoyette acpi_handle_dmar_andd(ACPI_DMAR_ANDD *andd)
3506 1.29.2.1 pgoyette {
3507 1.29.2.1 pgoyette
3508 1.29.2.1 pgoyette printf("\n");
3509 1.29.2.1 pgoyette printf("\tType=ANDD\n");
3510 1.29.2.1 pgoyette printf("\tLength=%d\n", andd->Header.Length);
3511 1.29.2.1 pgoyette printf("\tDeviceNumber=%d\n", andd->DeviceNumber);
3512 1.29.2.1 pgoyette printf("\tDeviceName=0x%s\n", andd->DeviceName);
3513 1.29.2.1 pgoyette }
3514 1.29.2.1 pgoyette
3515 1.16 msaitoh static int
3516 1.16 msaitoh acpi_handle_dmar_remapping_structure(void *addr, int remaining)
3517 1.16 msaitoh {
3518 1.16 msaitoh ACPI_DMAR_HEADER *hdr = addr;
3519 1.16 msaitoh
3520 1.16 msaitoh if (remaining < (int)sizeof(ACPI_DMAR_HEADER))
3521 1.16 msaitoh return (-1);
3522 1.16 msaitoh
3523 1.16 msaitoh if (remaining < hdr->Length)
3524 1.16 msaitoh return (-1);
3525 1.16 msaitoh
3526 1.16 msaitoh switch (hdr->Type) {
3527 1.16 msaitoh case ACPI_DMAR_TYPE_HARDWARE_UNIT:
3528 1.16 msaitoh acpi_handle_dmar_drhd(addr);
3529 1.16 msaitoh break;
3530 1.16 msaitoh case ACPI_DMAR_TYPE_RESERVED_MEMORY:
3531 1.16 msaitoh acpi_handle_dmar_rmrr(addr);
3532 1.16 msaitoh break;
3533 1.16 msaitoh case ACPI_DMAR_TYPE_ROOT_ATS:
3534 1.16 msaitoh acpi_handle_dmar_atsr(addr);
3535 1.16 msaitoh break;
3536 1.16 msaitoh case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
3537 1.16 msaitoh acpi_handle_dmar_rhsa(addr);
3538 1.16 msaitoh break;
3539 1.29.2.1 pgoyette case ACPI_DMAR_TYPE_NAMESPACE:
3540 1.29.2.1 pgoyette acpi_handle_dmar_andd(addr);
3541 1.29.2.1 pgoyette break;
3542 1.16 msaitoh default:
3543 1.16 msaitoh printf("\n");
3544 1.16 msaitoh printf("\tType=%d\n", hdr->Type);
3545 1.16 msaitoh printf("\tLength=%d\n", hdr->Length);
3546 1.13 christos break;
3547 1.13 christos }
3548 1.16 msaitoh return (hdr->Length);
3549 1.16 msaitoh }
3550 1.16 msaitoh
3551 1.16 msaitoh #ifndef ACPI_DMAR_X2APIC_OPT_OUT
3552 1.16 msaitoh #define ACPI_DMAR_X2APIC_OPT_OUT (0x2)
3553 1.16 msaitoh #endif
3554 1.16 msaitoh
3555 1.16 msaitoh static void
3556 1.16 msaitoh acpi_handle_dmar(ACPI_TABLE_HEADER *sdp)
3557 1.16 msaitoh {
3558 1.16 msaitoh char *cp;
3559 1.16 msaitoh int remaining, consumed;
3560 1.16 msaitoh ACPI_TABLE_DMAR *dmar;
3561 1.16 msaitoh
3562 1.16 msaitoh printf(BEGIN_COMMENT);
3563 1.16 msaitoh acpi_print_sdt(sdp);
3564 1.16 msaitoh dmar = (ACPI_TABLE_DMAR *)sdp;
3565 1.16 msaitoh printf("\tHost Address Width=%d\n", dmar->Width + 1);
3566 1.16 msaitoh
3567 1.16 msaitoh #define PRINTFLAG(var, flag) printflag((var), ACPI_DMAR_## flag, #flag)
3568 1.16 msaitoh
3569 1.16 msaitoh printf("\tFlags=");
3570 1.16 msaitoh PRINTFLAG(dmar->Flags, INTR_REMAP);
3571 1.16 msaitoh PRINTFLAG(dmar->Flags, X2APIC_OPT_OUT);
3572 1.29.2.1 pgoyette PRINTFLAG(dmar->Flags, X2APIC_MODE);
3573 1.16 msaitoh PRINTFLAG_END();
3574 1.16 msaitoh
3575 1.16 msaitoh #undef PRINTFLAG
3576 1.16 msaitoh
3577 1.16 msaitoh remaining = sdp->Length - sizeof(ACPI_TABLE_DMAR);
3578 1.16 msaitoh while (remaining > 0) {
3579 1.16 msaitoh cp = (char *)sdp + sdp->Length - remaining;
3580 1.16 msaitoh consumed = acpi_handle_dmar_remapping_structure(cp, remaining);
3581 1.16 msaitoh if (consumed <= 0)
3582 1.16 msaitoh break;
3583 1.16 msaitoh else
3584 1.16 msaitoh remaining -= consumed;
3585 1.16 msaitoh }
3586 1.1 christos
3587 1.12 christos printf(END_COMMENT);
3588 1.1 christos }
3589 1.1 christos
3590 1.1 christos static void
3591 1.22 msaitoh acpi_handle_uefi(ACPI_TABLE_HEADER *sdp)
3592 1.22 msaitoh {
3593 1.22 msaitoh ACPI_TABLE_UEFI *uefi;
3594 1.22 msaitoh char *uuidstr;
3595 1.22 msaitoh uint32_t status;
3596 1.22 msaitoh
3597 1.22 msaitoh printf(BEGIN_COMMENT);
3598 1.22 msaitoh acpi_print_sdt(sdp);
3599 1.22 msaitoh uefi = (ACPI_TABLE_UEFI *)sdp;
3600 1.22 msaitoh
3601 1.22 msaitoh uuid_to_string((uuid_t *)(uefi->Identifier),
3602 1.22 msaitoh &uuidstr, &status);
3603 1.22 msaitoh if (status != uuid_s_ok)
3604 1.22 msaitoh errx(1, "uuid_to_string: status=%u", status);
3605 1.22 msaitoh printf("\tUUID=%s\n", uuidstr);
3606 1.22 msaitoh free(uuidstr);
3607 1.22 msaitoh
3608 1.22 msaitoh printf("\tDataOffset=%04hx\n", uefi->DataOffset);
3609 1.22 msaitoh /* XXX need write */
3610 1.22 msaitoh
3611 1.22 msaitoh printf(END_COMMENT);
3612 1.22 msaitoh }
3613 1.22 msaitoh
3614 1.22 msaitoh static void
3615 1.5 cegger acpi_handle_waet(ACPI_TABLE_HEADER *sdp)
3616 1.1 christos {
3617 1.5 cegger ACPI_TABLE_WAET *waet;
3618 1.5 cegger
3619 1.5 cegger printf(BEGIN_COMMENT);
3620 1.5 cegger acpi_print_sdt(sdp);
3621 1.5 cegger waet = (ACPI_TABLE_WAET *)sdp;
3622 1.1 christos
3623 1.5 cegger printf("\tRTC Timer={");
3624 1.5 cegger if (waet->Flags & ACPI_WAET_RTC_NO_ACK)
3625 1.5 cegger printf("No ACK required");
3626 1.5 cegger else
3627 1.5 cegger printf("default behaviour");
3628 1.5 cegger printf("}\n");
3629 1.5 cegger printf("\t ACPI PM Timer={");
3630 1.5 cegger if (waet->Flags & ACPI_WAET_TIMER_ONE_READ)
3631 1.5 cegger printf("One Read sufficient");
3632 1.5 cegger else
3633 1.5 cegger printf("default behaviour");
3634 1.5 cegger printf("}\n");
3635 1.3 joerg
3636 1.5 cegger printf(END_COMMENT);
3637 1.1 christos }
3638 1.1 christos
3639 1.5 cegger static void
3640 1.5 cegger acpi_print_wdat_action(ACPI_WHEA_HEADER *whea)
3641 1.5 cegger {
3642 1.5 cegger printf("\tACTION={");
3643 1.5 cegger switch (whea->Action) {
3644 1.5 cegger case ACPI_WDAT_RESET:
3645 1.5 cegger printf("RESET");
3646 1.5 cegger break;
3647 1.5 cegger case ACPI_WDAT_GET_CURRENT_COUNTDOWN:
3648 1.5 cegger printf("GET_CURRENT_COUNTDOWN");
3649 1.5 cegger break;
3650 1.5 cegger case ACPI_WDAT_GET_COUNTDOWN:
3651 1.5 cegger printf("GET_COUNTDOWN");
3652 1.5 cegger break;
3653 1.5 cegger case ACPI_WDAT_SET_COUNTDOWN:
3654 1.5 cegger printf("SET_COUNTDOWN");
3655 1.5 cegger break;
3656 1.5 cegger case ACPI_WDAT_GET_RUNNING_STATE:
3657 1.5 cegger printf("GET_RUNNING_STATE");
3658 1.5 cegger break;
3659 1.5 cegger case ACPI_WDAT_SET_RUNNING_STATE:
3660 1.5 cegger printf("SET_RUNNING_STATE");
3661 1.5 cegger break;
3662 1.5 cegger case ACPI_WDAT_GET_STOPPED_STATE:
3663 1.5 cegger printf("GET_STOPPED_STATE");
3664 1.5 cegger break;
3665 1.5 cegger case ACPI_WDAT_SET_STOPPED_STATE:
3666 1.5 cegger printf("SET_STOPPED_STATE");
3667 1.5 cegger break;
3668 1.5 cegger case ACPI_WDAT_GET_REBOOT:
3669 1.5 cegger printf("GET_REBOOT");
3670 1.5 cegger break;
3671 1.5 cegger case ACPI_WDAT_SET_REBOOT:
3672 1.5 cegger printf("SET_REBOOT");
3673 1.5 cegger break;
3674 1.5 cegger case ACPI_WDAT_GET_SHUTDOWN:
3675 1.5 cegger printf("GET_SHUTDOWN");
3676 1.5 cegger break;
3677 1.5 cegger case ACPI_WDAT_SET_SHUTDOWN:
3678 1.5 cegger printf("SET_SHUTDOWN");
3679 1.5 cegger break;
3680 1.5 cegger case ACPI_WDAT_GET_STATUS:
3681 1.5 cegger printf("GET_STATUS");
3682 1.5 cegger break;
3683 1.5 cegger case ACPI_WDAT_SET_STATUS:
3684 1.5 cegger printf("SET_STATUS");
3685 1.5 cegger break;
3686 1.5 cegger case ACPI_WDAT_ACTION_RESERVED:
3687 1.5 cegger printf("ACTION_RESERVED");
3688 1.5 cegger break;
3689 1.5 cegger default:
3690 1.5 cegger printf("%d", whea->Action);
3691 1.5 cegger break;
3692 1.5 cegger }
3693 1.5 cegger printf("}\n");
3694 1.5 cegger }
3695 1.1 christos
3696 1.5 cegger static void
3697 1.5 cegger acpi_print_wdat_instruction(ACPI_WHEA_HEADER *whea)
3698 1.1 christos {
3699 1.5 cegger uint32_t ins;
3700 1.5 cegger
3701 1.5 cegger ins = whea->Instruction & ~ACPI_WDAT_PRESERVE_REGISTER;
3702 1.5 cegger
3703 1.5 cegger printf("\tINSTRUCTION={");
3704 1.5 cegger switch (ins) {
3705 1.5 cegger case ACPI_WDAT_READ_VALUE:
3706 1.5 cegger printf("READ_VALUE");
3707 1.5 cegger break;
3708 1.5 cegger case ACPI_WDAT_READ_COUNTDOWN:
3709 1.5 cegger printf("READ_COUNTDOWN");
3710 1.5 cegger break;
3711 1.5 cegger case ACPI_WDAT_WRITE_VALUE:
3712 1.5 cegger printf("WRITE_VALUE");
3713 1.5 cegger break;
3714 1.5 cegger case ACPI_WDAT_WRITE_COUNTDOWN:
3715 1.5 cegger printf("WRITE_COUNTDOWN");
3716 1.5 cegger break;
3717 1.5 cegger case ACPI_WDAT_INSTRUCTION_RESERVED:
3718 1.5 cegger printf("INSTRUCTION_RESERVED");
3719 1.5 cegger break;
3720 1.5 cegger default:
3721 1.5 cegger printf("%d", ins);
3722 1.5 cegger break;
3723 1.5 cegger }
3724 1.5 cegger
3725 1.5 cegger if (whea->Instruction & ACPI_WDAT_PRESERVE_REGISTER)
3726 1.25 msaitoh printf(", Preserve Register");
3727 1.5 cegger
3728 1.5 cegger printf("}\n");
3729 1.5 cegger }
3730 1.1 christos
3731 1.5 cegger static void
3732 1.5 cegger acpi_handle_wdat(ACPI_TABLE_HEADER *sdp)
3733 1.5 cegger {
3734 1.5 cegger ACPI_TABLE_WDAT *wdat;
3735 1.5 cegger ACPI_WHEA_HEADER *whea;
3736 1.23 msaitoh ACPI_WDAT_ENTRY *wdat_pos;
3737 1.5 cegger u_int i;
3738 1.1 christos
3739 1.5 cegger printf(BEGIN_COMMENT);
3740 1.5 cegger acpi_print_sdt(sdp);
3741 1.5 cegger wdat = (ACPI_TABLE_WDAT *)sdp;
3742 1.1 christos
3743 1.5 cegger printf("\tHeader Length=%d\n", wdat->HeaderLength);
3744 1.1 christos
3745 1.22 msaitoh acpi_print_pci_sbdf(wdat->PciSegment, wdat->PciBus, wdat->PciDevice,
3746 1.5 cegger wdat->PciFunction);
3747 1.5 cegger printf("\n\tTimer Counter Period=%d msec\n", wdat->TimerPeriod);
3748 1.5 cegger printf("\tTimer Maximum Counter Value=%d\n", wdat->MaxCount);
3749 1.27 msaitoh printf("\tTimer Minimum Counter Value=%d\n", wdat->MinCount);
3750 1.5 cegger
3751 1.5 cegger printf("\tFlags={");
3752 1.5 cegger if (wdat->Flags & ACPI_WDAT_ENABLED)
3753 1.5 cegger printf("ENABLED");
3754 1.5 cegger if (wdat->Flags & ACPI_WDAT_STOPPED)
3755 1.5 cegger printf(", STOPPED");
3756 1.5 cegger printf("}\n");
3757 1.1 christos
3758 1.23 msaitoh wdat_pos = (ACPI_WDAT_ENTRY *)((char *)wdat + sizeof(ACPI_TABLE_WDAT));
3759 1.1 christos
3760 1.5 cegger for (i = 0; i < wdat->Entries; i++) {
3761 1.5 cegger whea = (ACPI_WHEA_HEADER *)wdat_pos;
3762 1.5 cegger acpi_print_whea(whea,
3763 1.5 cegger acpi_print_wdat_action, acpi_print_wdat_instruction,
3764 1.5 cegger NULL);
3765 1.23 msaitoh wdat_pos++;
3766 1.5 cegger }
3767 1.5 cegger printf(END_COMMENT);
3768 1.1 christos }
3769 1.5 cegger
3770 1.5 cegger static void
3771 1.22 msaitoh acpi_handle_wddt(ACPI_TABLE_HEADER *sdp)
3772 1.22 msaitoh {
3773 1.22 msaitoh ACPI_TABLE_WDDT *wddt;
3774 1.22 msaitoh
3775 1.22 msaitoh printf(BEGIN_COMMENT);
3776 1.22 msaitoh acpi_print_sdt(sdp);
3777 1.22 msaitoh wddt = (ACPI_TABLE_WDDT *)sdp;
3778 1.22 msaitoh
3779 1.22 msaitoh printf("\tSpecVersion=%04hx\n", wddt->SpecVersion);
3780 1.22 msaitoh printf("\tTableVersion=%04hx\n", wddt->TableVersion);
3781 1.22 msaitoh printf("\tPciVendorID=%04hx\n", wddt->PciVendorId);
3782 1.22 msaitoh printf("\tAddress=");
3783 1.22 msaitoh acpi_print_gas(&wddt->Address);
3784 1.22 msaitoh printf("\n\tTimer Maximum Counter Value=%d\n", wddt->MaxCount);
3785 1.27 msaitoh printf("\tTimer Minimum Counter Value=%d\n", wddt->MinCount);
3786 1.22 msaitoh printf("\tTimer Counter Period=%d\n", wddt->Period);
3787 1.22 msaitoh
3788 1.22 msaitoh #define PRINTFLAG(var, flag) printflag((var), ACPI_WDDT_## flag, #flag)
3789 1.22 msaitoh
3790 1.22 msaitoh printf("\tStatus=");
3791 1.22 msaitoh PRINTFLAG(wddt->Status, AVAILABLE);
3792 1.22 msaitoh PRINTFLAG(wddt->Status, ACTIVE);
3793 1.22 msaitoh PRINTFLAG(wddt->Status, TCO_OS_OWNED);
3794 1.22 msaitoh PRINTFLAG(wddt->Status, USER_RESET);
3795 1.22 msaitoh PRINTFLAG(wddt->Status, WDT_RESET);
3796 1.22 msaitoh PRINTFLAG(wddt->Status, POWER_FAIL);
3797 1.22 msaitoh PRINTFLAG(wddt->Status, UNKNOWN_RESET);
3798 1.22 msaitoh PRINTFLAG_END();
3799 1.22 msaitoh
3800 1.22 msaitoh printf("\tCapability=");
3801 1.22 msaitoh PRINTFLAG(wddt->Capability, AUTO_RESET);
3802 1.22 msaitoh PRINTFLAG(wddt->Capability, ALERT_SUPPORT);
3803 1.22 msaitoh PRINTFLAG_END();
3804 1.22 msaitoh
3805 1.22 msaitoh #undef PRINTFLAG
3806 1.22 msaitoh
3807 1.22 msaitoh printf(END_COMMENT);
3808 1.22 msaitoh }
3809 1.22 msaitoh
3810 1.22 msaitoh static void
3811 1.5 cegger acpi_handle_wdrt(ACPI_TABLE_HEADER *sdp)
3812 1.1 christos {
3813 1.5 cegger ACPI_TABLE_WDRT *wdrt;
3814 1.1 christos
3815 1.1 christos printf(BEGIN_COMMENT);
3816 1.5 cegger acpi_print_sdt(sdp);
3817 1.5 cegger wdrt = (ACPI_TABLE_WDRT *)sdp;
3818 1.5 cegger
3819 1.5 cegger printf("\tControl Register=");
3820 1.5 cegger acpi_print_gas(&wdrt->ControlRegister);
3821 1.5 cegger printf("\tCount Register=");
3822 1.5 cegger acpi_print_gas(&wdrt->CountRegister);
3823 1.5 cegger acpi_print_pci(wdrt->PciVendorId, wdrt->PciDeviceId,
3824 1.5 cegger wdrt->PciSegment, wdrt->PciBus, wdrt->PciDevice, wdrt->PciFunction);
3825 1.5 cegger
3826 1.5 cegger /* Value must be >= 511 and < 65535 */
3827 1.5 cegger printf("\tMaxCount=%d", wdrt->MaxCount);
3828 1.5 cegger if (wdrt->MaxCount < 511)
3829 1.5 cegger printf(" (Out of Range. Valid range: 511 <= maxcount < 65535)");
3830 1.5 cegger printf("\n");
3831 1.5 cegger
3832 1.5 cegger printf("\tUnit={");
3833 1.5 cegger switch (wdrt->Units) {
3834 1.5 cegger case 0:
3835 1.5 cegger printf("1 seconds/count");
3836 1.5 cegger break;
3837 1.5 cegger case 1:
3838 1.5 cegger printf("100 milliseconds/count");
3839 1.5 cegger break;
3840 1.5 cegger case 2:
3841 1.5 cegger printf("10 milliseconds/count");
3842 1.5 cegger break;
3843 1.5 cegger default:
3844 1.5 cegger printf("%d", wdrt->Units);
3845 1.5 cegger break;
3846 1.5 cegger }
3847 1.5 cegger printf("}\n");
3848 1.5 cegger
3849 1.5 cegger printf(END_COMMENT);
3850 1.5 cegger }
3851 1.5 cegger
3852 1.5 cegger static void
3853 1.5 cegger acpi_print_sdt(ACPI_TABLE_HEADER *sdp)
3854 1.5 cegger {
3855 1.5 cegger printf(" ");
3856 1.5 cegger acpi_print_string(sdp->Signature, ACPI_NAME_SIZE);
3857 1.8 jmcneill printf(": Length=%d, Revision=%d, Checksum=%d",
3858 1.5 cegger sdp->Length, sdp->Revision, sdp->Checksum);
3859 1.8 jmcneill if (acpi_checksum(sdp, sdp->Length))
3860 1.8 jmcneill printf(" (Incorrect)");
3861 1.8 jmcneill printf(",\n\tOEMID=");
3862 1.5 cegger acpi_print_string(sdp->OemId, ACPI_OEM_ID_SIZE);
3863 1.1 christos printf(", OEM Table ID=");
3864 1.5 cegger acpi_print_string(sdp->OemTableId, ACPI_OEM_TABLE_ID_SIZE);
3865 1.5 cegger printf(", OEM Revision=0x%x,\n", sdp->OemRevision);
3866 1.1 christos printf("\tCreator ID=");
3867 1.5 cegger acpi_print_string(sdp->AslCompilerId, ACPI_NAME_SIZE);
3868 1.5 cegger printf(", Creator Revision=0x%x\n", sdp->AslCompilerRevision);
3869 1.1 christos }
3870 1.1 christos
3871 1.29.2.2 pgoyette void
3872 1.29.2.2 pgoyette acpi_print_tabs(unsigned int n)
3873 1.29.2.2 pgoyette {
3874 1.29.2.2 pgoyette
3875 1.29.2.2 pgoyette while (n-- > 0)
3876 1.29.2.2 pgoyette printf("\t");
3877 1.29.2.2 pgoyette }
3878 1.29.2.2 pgoyette
3879 1.5 cegger static void
3880 1.29.2.2 pgoyette acpi_dump_bytes(uint8_t *p, uint32_t len, unsigned int ntabs)
3881 1.7 jmcneill {
3882 1.7 jmcneill unsigned int i;
3883 1.7 jmcneill
3884 1.29.2.2 pgoyette acpi_print_tabs(ntabs);
3885 1.29.2.2 pgoyette printf("Data={");
3886 1.29.2.2 pgoyette for (i = 0; i < len; i++) {
3887 1.7 jmcneill if (cflag) {
3888 1.29.2.2 pgoyette if (i % 64 == 0) {
3889 1.29.2.2 pgoyette printf("\n");
3890 1.29.2.2 pgoyette acpi_print_tabs(ntabs);
3891 1.29.2.2 pgoyette printf(" ");
3892 1.29.2.2 pgoyette }else if (i % 16 == 0)
3893 1.7 jmcneill printf(" ");
3894 1.7 jmcneill printf("%c", (p[i] >= ' ' && p[i] <= '~') ? p[i] : '.');
3895 1.7 jmcneill } else {
3896 1.29.2.2 pgoyette if (i % 16 == 0) {
3897 1.29.2.2 pgoyette printf("\n");
3898 1.29.2.2 pgoyette acpi_print_tabs(ntabs + 1);
3899 1.29.2.2 pgoyette } else if (i % 8 == 0)
3900 1.7 jmcneill printf(" ");
3901 1.7 jmcneill printf(" %02x", p[i]);
3902 1.7 jmcneill }
3903 1.7 jmcneill }
3904 1.29.2.2 pgoyette printf("\n");
3905 1.29.2.2 pgoyette acpi_print_tabs(ntabs);
3906 1.29.2.2 pgoyette printf("}\n");
3907 1.29.2.2 pgoyette }
3908 1.29.2.2 pgoyette
3909 1.29.2.2 pgoyette /* Dump data which has ACPI_TABLE_HEADER */
3910 1.29.2.2 pgoyette static void
3911 1.29.2.2 pgoyette acpi_dump_table(ACPI_TABLE_HEADER *sdp)
3912 1.29.2.2 pgoyette {
3913 1.29.2.2 pgoyette
3914 1.29.2.2 pgoyette acpi_dump_bytes((uint8_t *)sdp, sdp->Length, 1);
3915 1.7 jmcneill }
3916 1.7 jmcneill
3917 1.7 jmcneill static void
3918 1.5 cegger acpi_print_rsdt(ACPI_TABLE_HEADER *rsdp)
3919 1.1 christos {
3920 1.5 cegger ACPI_TABLE_RSDT *rsdt;
3921 1.5 cegger ACPI_TABLE_XSDT *xsdt;
3922 1.1 christos int i, entries;
3923 1.1 christos
3924 1.5 cegger rsdt = (ACPI_TABLE_RSDT *)rsdp;
3925 1.5 cegger xsdt = (ACPI_TABLE_XSDT *)rsdp;
3926 1.5 cegger printf(BEGIN_COMMENT);
3927 1.1 christos acpi_print_sdt(rsdp);
3928 1.5 cegger entries = (rsdp->Length - sizeof(ACPI_TABLE_HEADER)) / addr_size;
3929 1.1 christos printf("\tEntries={ ");
3930 1.1 christos for (i = 0; i < entries; i++) {
3931 1.1 christos if (i > 0)
3932 1.1 christos printf(", ");
3933 1.16 msaitoh if (addr_size == 4)
3934 1.16 msaitoh printf("0x%08x", le32toh(rsdt->TableOffsetEntry[i]));
3935 1.16 msaitoh else
3936 1.16 msaitoh printf("0x%016jx",
3937 1.16 msaitoh (uintmax_t)le64toh(xsdt->TableOffsetEntry[i]));
3938 1.1 christos }
3939 1.1 christos printf(" }\n");
3940 1.1 christos printf(END_COMMENT);
3941 1.1 christos }
3942 1.1 christos
3943 1.5 cegger static const char *acpi_pm_profiles[] = {
3944 1.5 cegger "Unspecified", "Desktop", "Mobile", "Workstation",
3945 1.21 msaitoh "Enterprise Server", "SOHO Server", "Appliance PC",
3946 1.21 msaitoh "Performance Server", "Tablet"
3947 1.5 cegger };
3948 1.5 cegger
3949 1.5 cegger static void
3950 1.5 cegger acpi_print_fadt(ACPI_TABLE_HEADER *sdp)
3951 1.1 christos {
3952 1.5 cegger ACPI_TABLE_FADT *fadt;
3953 1.5 cegger const char *pm;
3954 1.1 christos
3955 1.5 cegger fadt = (ACPI_TABLE_FADT *)sdp;
3956 1.1 christos printf(BEGIN_COMMENT);
3957 1.5 cegger acpi_print_sdt(sdp);
3958 1.5 cegger printf(" \tFACS=0x%x, DSDT=0x%x\n", fadt->Facs,
3959 1.5 cegger fadt->Dsdt);
3960 1.21 msaitoh /* XXX ACPI 2.0 eliminated this */
3961 1.5 cegger printf("\tINT_MODEL=%s\n", fadt->Model ? "APIC" : "PIC");
3962 1.5 cegger if (fadt->PreferredProfile >= sizeof(acpi_pm_profiles) / sizeof(char *))
3963 1.5 cegger pm = "Reserved";
3964 1.5 cegger else
3965 1.5 cegger pm = acpi_pm_profiles[fadt->PreferredProfile];
3966 1.5 cegger printf("\tPreferred_PM_Profile=%s (%d)\n", pm, fadt->PreferredProfile);
3967 1.5 cegger printf("\tSCI_INT=%d\n", fadt->SciInterrupt);
3968 1.5 cegger printf("\tSMI_CMD=0x%x, ", fadt->SmiCommand);
3969 1.5 cegger printf("ACPI_ENABLE=0x%x, ", fadt->AcpiEnable);
3970 1.5 cegger printf("ACPI_DISABLE=0x%x, ", fadt->AcpiDisable);
3971 1.5 cegger printf("S4BIOS_REQ=0x%x\n", fadt->S4BiosRequest);
3972 1.5 cegger printf("\tPSTATE_CNT=0x%x\n", fadt->PstateControl);
3973 1.5 cegger printf("\tPM1a_EVT_BLK=0x%x-0x%x\n",
3974 1.5 cegger fadt->Pm1aEventBlock,
3975 1.5 cegger fadt->Pm1aEventBlock + fadt->Pm1EventLength - 1);
3976 1.5 cegger if (fadt->Pm1bEventBlock != 0)
3977 1.1 christos printf("\tPM1b_EVT_BLK=0x%x-0x%x\n",
3978 1.5 cegger fadt->Pm1bEventBlock,
3979 1.5 cegger fadt->Pm1bEventBlock + fadt->Pm1EventLength - 1);
3980 1.5 cegger printf("\tPM1a_CNT_BLK=0x%x-0x%x\n",
3981 1.5 cegger fadt->Pm1aControlBlock,
3982 1.5 cegger fadt->Pm1aControlBlock + fadt->Pm1ControlLength - 1);
3983 1.5 cegger if (fadt->Pm1bControlBlock != 0)
3984 1.1 christos printf("\tPM1b_CNT_BLK=0x%x-0x%x\n",
3985 1.5 cegger fadt->Pm1bControlBlock,
3986 1.5 cegger fadt->Pm1bControlBlock + fadt->Pm1ControlLength - 1);
3987 1.5 cegger if (fadt->Pm2ControlBlock != 0)
3988 1.1 christos printf("\tPM2_CNT_BLK=0x%x-0x%x\n",
3989 1.5 cegger fadt->Pm2ControlBlock,
3990 1.5 cegger fadt->Pm2ControlBlock + fadt->Pm2ControlLength - 1);
3991 1.29.2.1 pgoyette if (fadt->PmTimerBlock != 0)
3992 1.29.2.1 pgoyette printf("\tPM_TMR_BLK=0x%x-0x%x\n",
3993 1.29.2.1 pgoyette fadt->PmTimerBlock,
3994 1.29.2.1 pgoyette fadt->PmTimerBlock + fadt->PmTimerLength - 1);
3995 1.5 cegger if (fadt->Gpe0Block != 0)
3996 1.5 cegger printf("\tGPE0_BLK=0x%x-0x%x\n",
3997 1.5 cegger fadt->Gpe0Block,
3998 1.5 cegger fadt->Gpe0Block + fadt->Gpe0BlockLength - 1);
3999 1.5 cegger if (fadt->Gpe1Block != 0)
4000 1.5 cegger printf("\tGPE1_BLK=0x%x-0x%x, GPE1_BASE=%d\n",
4001 1.5 cegger fadt->Gpe1Block,
4002 1.5 cegger fadt->Gpe1Block + fadt->Gpe1BlockLength - 1,
4003 1.5 cegger fadt->Gpe1Base);
4004 1.5 cegger if (fadt->CstControl != 0)
4005 1.5 cegger printf("\tCST_CNT=0x%x\n", fadt->CstControl);
4006 1.5 cegger printf("\tP_LVL2_LAT=%d us, P_LVL3_LAT=%d us\n",
4007 1.5 cegger fadt->C2Latency, fadt->C3Latency);
4008 1.1 christos printf("\tFLUSH_SIZE=%d, FLUSH_STRIDE=%d\n",
4009 1.5 cegger fadt->FlushSize, fadt->FlushStride);
4010 1.1 christos printf("\tDUTY_OFFSET=%d, DUTY_WIDTH=%d\n",
4011 1.5 cegger fadt->DutyOffset, fadt->DutyWidth);
4012 1.1 christos printf("\tDAY_ALRM=%d, MON_ALRM=%d, CENTURY=%d\n",
4013 1.5 cegger fadt->DayAlarm, fadt->MonthAlarm, fadt->Century);
4014 1.1 christos
4015 1.16 msaitoh #define PRINTFLAG(var, flag) printflag((var), ACPI_FADT_## flag, #flag)
4016 1.1 christos
4017 1.5 cegger printf("\tIAPC_BOOT_ARCH=");
4018 1.5 cegger PRINTFLAG(fadt->BootFlags, LEGACY_DEVICES);
4019 1.5 cegger PRINTFLAG(fadt->BootFlags, 8042);
4020 1.5 cegger PRINTFLAG(fadt->BootFlags, NO_VGA);
4021 1.5 cegger PRINTFLAG(fadt->BootFlags, NO_MSI);
4022 1.5 cegger PRINTFLAG(fadt->BootFlags, NO_ASPM);
4023 1.16 msaitoh PRINTFLAG(fadt->BootFlags, NO_CMOS_RTC);
4024 1.16 msaitoh PRINTFLAG_END();
4025 1.5 cegger
4026 1.5 cegger printf("\tFlags=");
4027 1.5 cegger PRINTFLAG(fadt->Flags, WBINVD);
4028 1.5 cegger PRINTFLAG(fadt->Flags, WBINVD_FLUSH);
4029 1.5 cegger PRINTFLAG(fadt->Flags, C1_SUPPORTED);
4030 1.5 cegger PRINTFLAG(fadt->Flags, C2_MP_SUPPORTED);
4031 1.5 cegger PRINTFLAG(fadt->Flags, POWER_BUTTON);
4032 1.5 cegger PRINTFLAG(fadt->Flags, SLEEP_BUTTON);
4033 1.5 cegger PRINTFLAG(fadt->Flags, FIXED_RTC);
4034 1.5 cegger PRINTFLAG(fadt->Flags, S4_RTC_WAKE);
4035 1.5 cegger PRINTFLAG(fadt->Flags, 32BIT_TIMER);
4036 1.5 cegger PRINTFLAG(fadt->Flags, DOCKING_SUPPORTED);
4037 1.5 cegger PRINTFLAG(fadt->Flags, RESET_REGISTER);
4038 1.5 cegger PRINTFLAG(fadt->Flags, SEALED_CASE);
4039 1.5 cegger PRINTFLAG(fadt->Flags, HEADLESS);
4040 1.5 cegger PRINTFLAG(fadt->Flags, SLEEP_TYPE);
4041 1.5 cegger PRINTFLAG(fadt->Flags, PCI_EXPRESS_WAKE);
4042 1.5 cegger PRINTFLAG(fadt->Flags, PLATFORM_CLOCK);
4043 1.5 cegger PRINTFLAG(fadt->Flags, S4_RTC_VALID);
4044 1.5 cegger PRINTFLAG(fadt->Flags, REMOTE_POWER_ON);
4045 1.5 cegger PRINTFLAG(fadt->Flags, APIC_CLUSTER);
4046 1.5 cegger PRINTFLAG(fadt->Flags, APIC_PHYSICAL);
4047 1.16 msaitoh PRINTFLAG(fadt->Flags, HW_REDUCED);
4048 1.16 msaitoh PRINTFLAG(fadt->Flags, LOW_POWER_S0);
4049 1.16 msaitoh PRINTFLAG_END();
4050 1.1 christos
4051 1.21 msaitoh if (sdp->Length < ACPI_FADT_V2_SIZE)
4052 1.21 msaitoh goto out;
4053 1.1 christos
4054 1.5 cegger if (fadt->Flags & ACPI_FADT_RESET_REGISTER) {
4055 1.5 cegger printf("\tRESET_REG=");
4056 1.5 cegger acpi_print_gas(&fadt->ResetRegister);
4057 1.5 cegger printf(", RESET_VALUE=%#x\n", fadt->ResetValue);
4058 1.5 cegger }
4059 1.21 msaitoh
4060 1.21 msaitoh printf("\tArmBootFlags=");
4061 1.21 msaitoh PRINTFLAG(fadt->ArmBootFlags, PSCI_COMPLIANT);
4062 1.21 msaitoh PRINTFLAG(fadt->ArmBootFlags, PSCI_USE_HVC);
4063 1.21 msaitoh PRINTFLAG_END();
4064 1.21 msaitoh
4065 1.21 msaitoh #undef PRINTFLAG
4066 1.21 msaitoh
4067 1.21 msaitoh printf("\tMinorRevision=%u\n", fadt->MinorRevision);
4068 1.21 msaitoh
4069 1.21 msaitoh if (sdp->Length < ACPI_FADT_V3_SIZE)
4070 1.21 msaitoh goto out;
4071 1.21 msaitoh
4072 1.21 msaitoh printf("\tX_FACS=0x%016jx, ", (uintmax_t)fadt->XFacs);
4073 1.21 msaitoh printf("X_DSDT=0x%016jx\n", (uintmax_t)fadt->XDsdt);
4074 1.21 msaitoh printf("\tX_PM1a_EVT_BLK=");
4075 1.21 msaitoh acpi_print_gas(&fadt->XPm1aEventBlock);
4076 1.21 msaitoh if (fadt->XPm1bEventBlock.Address != 0) {
4077 1.21 msaitoh printf("\n\tX_PM1b_EVT_BLK=");
4078 1.21 msaitoh acpi_print_gas(&fadt->XPm1bEventBlock);
4079 1.21 msaitoh }
4080 1.21 msaitoh printf("\n\tX_PM1a_CNT_BLK=");
4081 1.21 msaitoh acpi_print_gas(&fadt->XPm1aControlBlock);
4082 1.21 msaitoh if (fadt->XPm1bControlBlock.Address != 0) {
4083 1.21 msaitoh printf("\n\tX_PM1b_CNT_BLK=");
4084 1.21 msaitoh acpi_print_gas(&fadt->XPm1bControlBlock);
4085 1.21 msaitoh }
4086 1.21 msaitoh if (fadt->XPm2ControlBlock.Address != 0) {
4087 1.21 msaitoh printf("\n\tX_PM2_CNT_BLK=");
4088 1.21 msaitoh acpi_print_gas(&fadt->XPm2ControlBlock);
4089 1.21 msaitoh }
4090 1.29.2.1 pgoyette if (fadt->XPmTimerBlock.Address != 0) {
4091 1.29.2.1 pgoyette printf("\n\tX_PM_TMR_BLK=");
4092 1.29.2.1 pgoyette acpi_print_gas(&fadt->XPmTimerBlock);
4093 1.29.2.1 pgoyette }
4094 1.21 msaitoh if (fadt->XGpe0Block.Address != 0) {
4095 1.21 msaitoh printf("\n\tX_GPE0_BLK=");
4096 1.21 msaitoh acpi_print_gas(&fadt->XGpe0Block);
4097 1.21 msaitoh }
4098 1.21 msaitoh if (fadt->XGpe1Block.Address != 0) {
4099 1.21 msaitoh printf("\n\tX_GPE1_BLK=");
4100 1.21 msaitoh acpi_print_gas(&fadt->XGpe1Block);
4101 1.21 msaitoh }
4102 1.21 msaitoh printf("\n");
4103 1.21 msaitoh
4104 1.21 msaitoh if (sdp->Length < ACPI_FADT_V5_SIZE)
4105 1.21 msaitoh goto out;
4106 1.21 msaitoh
4107 1.21 msaitoh if (fadt->SleepControl.Address != 0) {
4108 1.21 msaitoh printf("\tSleepControl=");
4109 1.21 msaitoh acpi_print_gas(&fadt->SleepControl);
4110 1.21 msaitoh printf("\n");
4111 1.21 msaitoh }
4112 1.21 msaitoh if (fadt->SleepStatus.Address != 0) {
4113 1.21 msaitoh printf("\n\tSleepStatus=");
4114 1.21 msaitoh acpi_print_gas(&fadt->SleepStatus);
4115 1.5 cegger printf("\n");
4116 1.5 cegger }
4117 1.5 cegger
4118 1.21 msaitoh if (sdp->Length < ACPI_FADT_V6_SIZE)
4119 1.21 msaitoh goto out;
4120 1.21 msaitoh
4121 1.21 msaitoh printf("\tHypervisorId=0x%016"PRIx64"\n", fadt->HypervisorId);
4122 1.21 msaitoh
4123 1.21 msaitoh out:
4124 1.1 christos printf(END_COMMENT);
4125 1.1 christos }
4126 1.1 christos
4127 1.5 cegger static void
4128 1.5 cegger acpi_print_facs(ACPI_TABLE_FACS *facs)
4129 1.1 christos {
4130 1.5 cegger printf(BEGIN_COMMENT);
4131 1.5 cegger printf(" FACS:\tLength=%u, ", facs->Length);
4132 1.5 cegger printf("HwSig=0x%08x, ", facs->HardwareSignature);
4133 1.5 cegger printf("Firm_Wake_Vec=0x%08x\n", facs->FirmwareWakingVector);
4134 1.5 cegger
4135 1.21 msaitoh #define PRINTFLAG(var, flag) printflag((var), ACPI_GLOCK_## flag, #flag)
4136 1.21 msaitoh
4137 1.5 cegger printf("\tGlobal_Lock=");
4138 1.21 msaitoh PRINTFLAG(facs->GlobalLock, PENDING);
4139 1.21 msaitoh PRINTFLAG(facs->GlobalLock, OWNED);
4140 1.21 msaitoh PRINTFLAG_END();
4141 1.21 msaitoh
4142 1.21 msaitoh #undef PRINTFLAG
4143 1.21 msaitoh
4144 1.21 msaitoh #define PRINTFLAG(var, flag) printflag((var), ACPI_FACS_## flag, #flag)
4145 1.5 cegger
4146 1.5 cegger printf("\tFlags=");
4147 1.21 msaitoh PRINTFLAG(facs->Flags, S4_BIOS_PRESENT);
4148 1.21 msaitoh PRINTFLAG(facs->Flags, 64BIT_WAKE);
4149 1.21 msaitoh PRINTFLAG_END();
4150 1.21 msaitoh
4151 1.21 msaitoh #undef PRINTFLAG
4152 1.5 cegger
4153 1.16 msaitoh if (facs->XFirmwareWakingVector != 0)
4154 1.16 msaitoh printf("\tX_Firm_Wake_Vec=%016jx\n",
4155 1.16 msaitoh (uintmax_t)facs->XFirmwareWakingVector);
4156 1.5 cegger printf("\tVersion=%u\n", facs->Version);
4157 1.5 cegger
4158 1.21 msaitoh printf("\tOspmFlags={");
4159 1.21 msaitoh if (facs->OspmFlags & ACPI_FACS_64BIT_ENVIRONMENT)
4160 1.21 msaitoh printf("64BIT_WAKE");
4161 1.21 msaitoh printf("}\n");
4162 1.21 msaitoh
4163 1.5 cegger printf(END_COMMENT);
4164 1.5 cegger }
4165 1.1 christos
4166 1.5 cegger static void
4167 1.5 cegger acpi_print_dsdt(ACPI_TABLE_HEADER *dsdp)
4168 1.5 cegger {
4169 1.5 cegger printf(BEGIN_COMMENT);
4170 1.1 christos acpi_print_sdt(dsdp);
4171 1.5 cegger printf(END_COMMENT);
4172 1.1 christos }
4173 1.1 christos
4174 1.1 christos int
4175 1.1 christos acpi_checksum(void *p, size_t length)
4176 1.1 christos {
4177 1.5 cegger uint8_t *bp;
4178 1.5 cegger uint8_t sum;
4179 1.1 christos
4180 1.1 christos bp = p;
4181 1.1 christos sum = 0;
4182 1.1 christos while (length--)
4183 1.1 christos sum += *bp++;
4184 1.1 christos
4185 1.1 christos return (sum);
4186 1.1 christos }
4187 1.1 christos
4188 1.5 cegger static ACPI_TABLE_HEADER *
4189 1.1 christos acpi_map_sdt(vm_offset_t pa)
4190 1.1 christos {
4191 1.5 cegger ACPI_TABLE_HEADER *sp;
4192 1.1 christos
4193 1.5 cegger sp = acpi_map_physical(pa, sizeof(ACPI_TABLE_HEADER));
4194 1.5 cegger sp = acpi_map_physical(pa, sp->Length);
4195 1.1 christos return (sp);
4196 1.1 christos }
4197 1.1 christos
4198 1.5 cegger static void
4199 1.5 cegger acpi_print_rsd_ptr(ACPI_TABLE_RSDP *rp)
4200 1.1 christos {
4201 1.1 christos printf(BEGIN_COMMENT);
4202 1.5 cegger printf(" RSD PTR: OEM=");
4203 1.5 cegger acpi_print_string(rp->OemId, ACPI_OEM_ID_SIZE);
4204 1.5 cegger printf(", ACPI_Rev=%s (%d)\n", rp->Revision < 2 ? "1.0x" : "2.0x",
4205 1.5 cegger rp->Revision);
4206 1.5 cegger if (rp->Revision < 2) {
4207 1.5 cegger printf("\tRSDT=0x%08x, cksum=%u\n", rp->RsdtPhysicalAddress,
4208 1.5 cegger rp->Checksum);
4209 1.5 cegger } else {
4210 1.16 msaitoh printf("\tXSDT=0x%016jx, length=%u, cksum=%u\n",
4211 1.16 msaitoh (uintmax_t)rp->XsdtPhysicalAddress, rp->Length,
4212 1.5 cegger rp->ExtendedChecksum);
4213 1.5 cegger }
4214 1.1 christos printf(END_COMMENT);
4215 1.1 christos }
4216 1.1 christos
4217 1.5 cegger static void
4218 1.5 cegger acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp)
4219 1.1 christos {
4220 1.5 cegger ACPI_TABLE_HEADER *sdp;
4221 1.5 cegger ACPI_TABLE_RSDT *rsdt;
4222 1.5 cegger ACPI_TABLE_XSDT *xsdt;
4223 1.15 christos vm_offset_t addr = 0;
4224 1.5 cegger int entries, i;
4225 1.1 christos
4226 1.1 christos acpi_print_rsdt(rsdp);
4227 1.5 cegger rsdt = (ACPI_TABLE_RSDT *)rsdp;
4228 1.5 cegger xsdt = (ACPI_TABLE_XSDT *)rsdp;
4229 1.5 cegger entries = (rsdp->Length - sizeof(ACPI_TABLE_HEADER)) / addr_size;
4230 1.1 christos for (i = 0; i < entries; i++) {
4231 1.16 msaitoh if (addr_size == 4)
4232 1.5 cegger addr = le32toh(rsdt->TableOffsetEntry[i]);
4233 1.16 msaitoh else
4234 1.5 cegger addr = le64toh(xsdt->TableOffsetEntry[i]);
4235 1.16 msaitoh if (addr == 0)
4236 1.16 msaitoh continue;
4237 1.5 cegger sdp = (ACPI_TABLE_HEADER *)acpi_map_sdt(addr);
4238 1.5 cegger if (acpi_checksum(sdp, sdp->Length)) {
4239 1.5 cegger warnx("RSDT entry %d (sig %.4s) is corrupt", i,
4240 1.5 cegger sdp->Signature);
4241 1.8 jmcneill if (sflag)
4242 1.8 jmcneill continue;
4243 1.4 drochner }
4244 1.5 cegger if (!memcmp(sdp->Signature, ACPI_SIG_FADT, 4))
4245 1.5 cegger acpi_handle_fadt(sdp);
4246 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_BERT, 4))
4247 1.5 cegger acpi_handle_bert(sdp);
4248 1.29.2.2 pgoyette else if (!memcmp(sdp->Signature, ACPI_SIG_BGRT, 4))
4249 1.29.2.2 pgoyette acpi_handle_bgrt(sdp);
4250 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_BOOT, 4))
4251 1.5 cegger acpi_handle_boot(sdp);
4252 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_CPEP, 4))
4253 1.5 cegger acpi_handle_cpep(sdp);
4254 1.29.2.2 pgoyette else if (!memcmp(sdp->Signature, ACPI_SIG_CSRT, 4))
4255 1.29.2.2 pgoyette acpi_handle_csrt(sdp);
4256 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_DBGP, 4))
4257 1.5 cegger acpi_handle_dbgp(sdp);
4258 1.22 msaitoh else if (!memcmp(sdp->Signature, ACPI_SIG_DBG2, 4))
4259 1.22 msaitoh acpi_handle_dbg2(sdp);
4260 1.16 msaitoh else if (!memcmp(sdp->Signature, ACPI_SIG_DMAR, 4))
4261 1.16 msaitoh acpi_handle_dmar(sdp);
4262 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_EINJ, 4))
4263 1.5 cegger acpi_handle_einj(sdp);
4264 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_ERST, 4))
4265 1.5 cegger acpi_handle_erst(sdp);
4266 1.29.2.1 pgoyette else if (!memcmp(sdp->Signature, ACPI_SIG_GTDT, 4))
4267 1.29.2.1 pgoyette acpi_handle_gtdt(sdp);
4268 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_MADT, 4))
4269 1.5 cegger acpi_handle_madt(sdp);
4270 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_MSCT, 4))
4271 1.5 cegger acpi_handle_msct(sdp);
4272 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_HEST, 4))
4273 1.5 cegger acpi_handle_hest(sdp);
4274 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_HPET, 4))
4275 1.5 cegger acpi_handle_hpet(sdp);
4276 1.29.2.3 pgoyette else if (!memcmp(sdp->Signature, ACPI_SIG_IORT, 4))
4277 1.29.2.3 pgoyette acpi_handle_iort(sdp);
4278 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_ECDT, 4))
4279 1.5 cegger acpi_handle_ecdt(sdp);
4280 1.29.2.1 pgoyette else if (!memcmp(sdp->Signature, ACPI_SIG_LPIT, 4))
4281 1.29.2.1 pgoyette acpi_handle_lpit(sdp);
4282 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_MCFG, 4))
4283 1.5 cegger acpi_handle_mcfg(sdp);
4284 1.29.2.1 pgoyette else if (!memcmp(sdp->Signature, ACPI_SIG_PPTT, 4))
4285 1.29.2.1 pgoyette acpi_handle_pptt(sdp);
4286 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_SBST, 4))
4287 1.5 cegger acpi_handle_sbst(sdp);
4288 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_SLIT, 4))
4289 1.5 cegger acpi_handle_slit(sdp);
4290 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_SPCR, 4))
4291 1.5 cegger acpi_handle_spcr(sdp);
4292 1.22 msaitoh else if (!memcmp(sdp->Signature, ACPI_SIG_SPMI, 4))
4293 1.22 msaitoh acpi_handle_spmi(sdp);
4294 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_SRAT, 4))
4295 1.5 cegger acpi_handle_srat(sdp);
4296 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_TCPA, 4))
4297 1.5 cegger acpi_handle_tcpa(sdp);
4298 1.19 msaitoh else if (!memcmp(sdp->Signature, ACPI_SIG_NFIT, 4))
4299 1.19 msaitoh acpi_handle_nfit(sdp);
4300 1.22 msaitoh else if (!memcmp(sdp->Signature, ACPI_SIG_UEFI, 4))
4301 1.22 msaitoh acpi_handle_uefi(sdp);
4302 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_WAET, 4))
4303 1.5 cegger acpi_handle_waet(sdp);
4304 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_WDAT, 4))
4305 1.5 cegger acpi_handle_wdat(sdp);
4306 1.22 msaitoh else if (!memcmp(sdp->Signature, ACPI_SIG_WDDT, 4))
4307 1.22 msaitoh acpi_handle_wddt(sdp);
4308 1.5 cegger else if (!memcmp(sdp->Signature, ACPI_SIG_WDRT, 4))
4309 1.5 cegger acpi_handle_wdrt(sdp);
4310 1.5 cegger else {
4311 1.5 cegger printf(BEGIN_COMMENT);
4312 1.1 christos acpi_print_sdt(sdp);
4313 1.29.2.2 pgoyette printf("\n");
4314 1.29.2.2 pgoyette acpi_dump_table(sdp);
4315 1.5 cegger printf(END_COMMENT);
4316 1.1 christos }
4317 1.1 christos }
4318 1.1 christos }
4319 1.1 christos
4320 1.5 cegger ACPI_TABLE_HEADER *
4321 1.5 cegger sdt_load_devmem(void)
4322 1.5 cegger {
4323 1.5 cegger ACPI_TABLE_RSDP *rp;
4324 1.5 cegger ACPI_TABLE_HEADER *rsdp;
4325 1.1 christos
4326 1.5 cegger rp = acpi_find_rsd_ptr();
4327 1.5 cegger if (!rp)
4328 1.5 cegger errx(EXIT_FAILURE, "Can't find ACPI information");
4329 1.5 cegger
4330 1.5 cegger if (tflag)
4331 1.5 cegger acpi_print_rsd_ptr(rp);
4332 1.5 cegger if (rp->Revision < 2) {
4333 1.5 cegger rsdp = (ACPI_TABLE_HEADER *)acpi_map_sdt(rp->RsdtPhysicalAddress);
4334 1.5 cegger if (memcmp(rsdp->Signature, "RSDT", 4) != 0 ||
4335 1.5 cegger acpi_checksum(rsdp, rsdp->Length) != 0)
4336 1.5 cegger errx(EXIT_FAILURE, "RSDT is corrupted");
4337 1.5 cegger addr_size = sizeof(uint32_t);
4338 1.5 cegger } else {
4339 1.5 cegger rsdp = (ACPI_TABLE_HEADER *)acpi_map_sdt(rp->XsdtPhysicalAddress);
4340 1.5 cegger if (memcmp(rsdp->Signature, "XSDT", 4) != 0 ||
4341 1.5 cegger acpi_checksum(rsdp, rsdp->Length) != 0)
4342 1.5 cegger errx(EXIT_FAILURE, "XSDT is corrupted");
4343 1.5 cegger addr_size = sizeof(uint64_t);
4344 1.5 cegger }
4345 1.5 cegger return (rsdp);
4346 1.1 christos }
4347 1.1 christos
4348 1.5 cegger /* Write the DSDT to a file, concatenating any SSDTs (if present). */
4349 1.5 cegger static int
4350 1.5 cegger write_dsdt(int fd, ACPI_TABLE_HEADER *rsdt, ACPI_TABLE_HEADER *dsdt)
4351 1.5 cegger {
4352 1.5 cegger ACPI_TABLE_HEADER sdt;
4353 1.5 cegger ACPI_TABLE_HEADER *ssdt;
4354 1.5 cegger uint8_t sum;
4355 1.5 cegger
4356 1.5 cegger /* Create a new checksum to account for the DSDT and any SSDTs. */
4357 1.5 cegger sdt = *dsdt;
4358 1.5 cegger if (rsdt != NULL) {
4359 1.5 cegger sdt.Checksum = 0;
4360 1.5 cegger sum = acpi_checksum(dsdt + 1, dsdt->Length -
4361 1.5 cegger sizeof(ACPI_TABLE_HEADER));
4362 1.5 cegger ssdt = sdt_from_rsdt(rsdt, ACPI_SIG_SSDT, NULL);
4363 1.5 cegger while (ssdt != NULL) {
4364 1.5 cegger sdt.Length += ssdt->Length - sizeof(ACPI_TABLE_HEADER);
4365 1.5 cegger sum += acpi_checksum(ssdt + 1,
4366 1.5 cegger ssdt->Length - sizeof(ACPI_TABLE_HEADER));
4367 1.5 cegger ssdt = sdt_from_rsdt(rsdt, ACPI_SIG_SSDT, ssdt);
4368 1.5 cegger }
4369 1.5 cegger sum += acpi_checksum(&sdt, sizeof(ACPI_TABLE_HEADER));
4370 1.5 cegger sdt.Checksum -= sum;
4371 1.5 cegger }
4372 1.5 cegger
4373 1.5 cegger /* Write out the DSDT header and body. */
4374 1.5 cegger write(fd, &sdt, sizeof(ACPI_TABLE_HEADER));
4375 1.5 cegger write(fd, dsdt + 1, dsdt->Length - sizeof(ACPI_TABLE_HEADER));
4376 1.5 cegger
4377 1.5 cegger /* Write out any SSDTs (if present.) */
4378 1.5 cegger if (rsdt != NULL) {
4379 1.5 cegger ssdt = sdt_from_rsdt(rsdt, "SSDT", NULL);
4380 1.5 cegger while (ssdt != NULL) {
4381 1.5 cegger write(fd, ssdt + 1, ssdt->Length -
4382 1.5 cegger sizeof(ACPI_TABLE_HEADER));
4383 1.5 cegger ssdt = sdt_from_rsdt(rsdt, "SSDT", ssdt);
4384 1.5 cegger }
4385 1.5 cegger }
4386 1.1 christos return (0);
4387 1.1 christos }
4388 1.1 christos
4389 1.5 cegger void
4390 1.5 cegger dsdt_save_file(char *outfile, ACPI_TABLE_HEADER *rsdt, ACPI_TABLE_HEADER *dsdp)
4391 1.1 christos {
4392 1.5 cegger int fd;
4393 1.5 cegger mode_t mode;
4394 1.5 cegger
4395 1.5 cegger assert(outfile != NULL);
4396 1.5 cegger mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
4397 1.5 cegger fd = open(outfile, O_WRONLY | O_CREAT | O_TRUNC, mode);
4398 1.5 cegger if (fd == -1) {
4399 1.5 cegger perror("dsdt_save_file");
4400 1.5 cegger return;
4401 1.5 cegger }
4402 1.5 cegger write_dsdt(fd, rsdt, dsdp);
4403 1.5 cegger close(fd);
4404 1.1 christos }
4405 1.1 christos
4406 1.5 cegger void
4407 1.5 cegger aml_disassemble(ACPI_TABLE_HEADER *rsdt, ACPI_TABLE_HEADER *dsdp)
4408 1.1 christos {
4409 1.16 msaitoh char buf[MAXPATHLEN], tmpstr[MAXPATHLEN], wrkdir[MAXPATHLEN];
4410 1.16 msaitoh const char *iname = "/acpdump.din";
4411 1.16 msaitoh const char *oname = "/acpdump.dsl";
4412 1.5 cegger const char *tmpdir;
4413 1.5 cegger FILE *fp;
4414 1.5 cegger size_t len;
4415 1.16 msaitoh int fd, status;
4416 1.16 msaitoh pid_t pid;
4417 1.5 cegger
4418 1.5 cegger if (rsdt == NULL)
4419 1.5 cegger errx(EXIT_FAILURE, "aml_disassemble: invalid rsdt");
4420 1.5 cegger if (dsdp == NULL)
4421 1.5 cegger errx(EXIT_FAILURE, "aml_disassemble: invalid dsdp");
4422 1.5 cegger
4423 1.5 cegger tmpdir = getenv("TMPDIR");
4424 1.5 cegger if (tmpdir == NULL)
4425 1.5 cegger tmpdir = _PATH_TMP;
4426 1.16 msaitoh if (realpath(tmpdir, buf) == NULL) {
4427 1.16 msaitoh perror("realpath tmp dir");
4428 1.5 cegger return;
4429 1.5 cegger }
4430 1.16 msaitoh len = sizeof(wrkdir) - strlen(iname);
4431 1.16 msaitoh if ((size_t)snprintf(wrkdir, len, "%s/acpidump.XXXXXX", buf) > len-1 ) {
4432 1.16 msaitoh fprintf(stderr, "$TMPDIR too long\n");
4433 1.16 msaitoh return;
4434 1.16 msaitoh }
4435 1.16 msaitoh if (mkdtemp(wrkdir) == NULL) {
4436 1.16 msaitoh perror("mkdtemp tmp working dir");
4437 1.16 msaitoh return;
4438 1.16 msaitoh }
4439 1.16 msaitoh len = (size_t)snprintf(tmpstr, sizeof(tmpstr), "%s%s", wrkdir, iname);
4440 1.16 msaitoh assert(len <= sizeof(tmpstr) - 1);
4441 1.16 msaitoh fd = open(tmpstr, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
4442 1.5 cegger if (fd < 0) {
4443 1.5 cegger perror("iasl tmp file");
4444 1.5 cegger return;
4445 1.5 cegger }
4446 1.5 cegger write_dsdt(fd, rsdt, dsdp);
4447 1.5 cegger close(fd);
4448 1.5 cegger
4449 1.5 cegger /* Run iasl -d on the temp file */
4450 1.16 msaitoh if ((pid = fork()) == 0) {
4451 1.5 cegger close(STDOUT_FILENO);
4452 1.5 cegger if (vflag == 0)
4453 1.5 cegger close(STDERR_FILENO);
4454 1.5 cegger execl("/usr/bin/iasl", "iasl", "-d", tmpstr, NULL);
4455 1.5 cegger err(EXIT_FAILURE, "exec");
4456 1.5 cegger }
4457 1.16 msaitoh if (pid > 0)
4458 1.16 msaitoh wait(&status);
4459 1.16 msaitoh if (unlink(tmpstr) < 0) {
4460 1.16 msaitoh perror("unlink");
4461 1.16 msaitoh goto out;
4462 1.16 msaitoh }
4463 1.16 msaitoh if (pid < 0) {
4464 1.16 msaitoh perror("fork");
4465 1.16 msaitoh goto out;
4466 1.16 msaitoh }
4467 1.16 msaitoh if (status != 0) {
4468 1.16 msaitoh fprintf(stderr, "iast exit status = %d\n", status);
4469 1.16 msaitoh }
4470 1.1 christos
4471 1.5 cegger /* Dump iasl's output to stdout */
4472 1.16 msaitoh len = (size_t)snprintf(tmpstr, sizeof(tmpstr), "%s%s", wrkdir, oname);
4473 1.16 msaitoh assert(len <= sizeof(tmpstr) - 1);
4474 1.5 cegger fp = fopen(tmpstr, "r");
4475 1.16 msaitoh if (unlink(tmpstr) < 0) {
4476 1.16 msaitoh perror("unlink");
4477 1.16 msaitoh goto out;
4478 1.16 msaitoh }
4479 1.5 cegger if (fp == NULL) {
4480 1.5 cegger perror("iasl tmp file (read)");
4481 1.16 msaitoh goto out;
4482 1.5 cegger }
4483 1.5 cegger while ((len = fread(buf, 1, sizeof(buf), fp)) > 0)
4484 1.5 cegger fwrite(buf, 1, len, stdout);
4485 1.5 cegger fclose(fp);
4486 1.16 msaitoh
4487 1.16 msaitoh out:
4488 1.16 msaitoh if (rmdir(wrkdir) < 0)
4489 1.16 msaitoh perror("rmdir");
4490 1.1 christos }
4491 1.1 christos
4492 1.5 cegger void
4493 1.5 cegger sdt_print_all(ACPI_TABLE_HEADER *rsdp)
4494 1.1 christos {
4495 1.5 cegger acpi_handle_rsdt(rsdp);
4496 1.1 christos }
4497 1.1 christos
4498 1.5 cegger /* Fetch a table matching the given signature via the RSDT. */
4499 1.5 cegger ACPI_TABLE_HEADER *
4500 1.5 cegger sdt_from_rsdt(ACPI_TABLE_HEADER *rsdp, const char *sig, ACPI_TABLE_HEADER *last)
4501 1.1 christos {
4502 1.5 cegger ACPI_TABLE_HEADER *sdt;
4503 1.5 cegger ACPI_TABLE_RSDT *rsdt;
4504 1.5 cegger ACPI_TABLE_XSDT *xsdt;
4505 1.15 christos vm_offset_t addr = 0;
4506 1.5 cegger int entries, i;
4507 1.1 christos
4508 1.5 cegger rsdt = (ACPI_TABLE_RSDT *)rsdp;
4509 1.5 cegger xsdt = (ACPI_TABLE_XSDT *)rsdp;
4510 1.5 cegger entries = (rsdp->Length - sizeof(ACPI_TABLE_HEADER)) / addr_size;
4511 1.5 cegger for (i = 0; i < entries; i++) {
4512 1.16 msaitoh if (addr_size == 4)
4513 1.5 cegger addr = le32toh(rsdt->TableOffsetEntry[i]);
4514 1.16 msaitoh else
4515 1.5 cegger addr = le64toh(xsdt->TableOffsetEntry[i]);
4516 1.16 msaitoh if (addr == 0)
4517 1.16 msaitoh continue;
4518 1.5 cegger sdt = (ACPI_TABLE_HEADER *)acpi_map_sdt(addr);
4519 1.5 cegger if (last != NULL) {
4520 1.5 cegger if (sdt == last)
4521 1.5 cegger last = NULL;
4522 1.5 cegger continue;
4523 1.5 cegger }
4524 1.5 cegger if (memcmp(sdt->Signature, sig, strlen(sig)))
4525 1.5 cegger continue;
4526 1.5 cegger if (acpi_checksum(sdt, sdt->Length))
4527 1.5 cegger errx(EXIT_FAILURE, "RSDT entry %d is corrupt", i);
4528 1.5 cegger return (sdt);
4529 1.5 cegger }
4530 1.1 christos
4531 1.5 cegger return (NULL);
4532 1.1 christos }
4533 1.1 christos
4534 1.5 cegger ACPI_TABLE_HEADER *
4535 1.5 cegger dsdt_from_fadt(ACPI_TABLE_FADT *fadt)
4536 1.1 christos {
4537 1.5 cegger ACPI_TABLE_HEADER *sdt;
4538 1.1 christos
4539 1.5 cegger /* Use the DSDT address if it is version 1, otherwise use XDSDT. */
4540 1.18 msaitoh sdt = (ACPI_TABLE_HEADER *)acpi_map_sdt(
4541 1.18 msaitoh acpi_select_address(fadt->Dsdt, fadt->XDsdt));
4542 1.5 cegger if (acpi_checksum(sdt, sdt->Length))
4543 1.10 christos errx(EXIT_FAILURE, "DSDT is corrupt");
4544 1.5 cegger return (sdt);
4545 1.1 christos }
4546