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