1 /****************************************************************************** 2 * 3 * Module Name: dmtable - Support for ACPI tables that contain no AML code 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2022, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #include "acpi.h" 45 #include "accommon.h" 46 #include "acdisasm.h" 47 #include "actables.h" 48 #include "aslcompiler.h" 49 50 /* This module used for application-level code only */ 51 52 #define _COMPONENT ACPI_CA_DISASSEMBLER 53 ACPI_MODULE_NAME ("dmtable") 54 55 const AH_TABLE * 56 AcpiAhGetTableInfo ( 57 char *Signature); 58 59 60 /* Common format strings for commented values */ 61 62 #define UINT8_FORMAT "%2.2X [%s]\n" 63 #define UINT8_FORMAT_NO_NEWLINE "%2.2X [%s]" 64 #define UINT16_FORMAT "%4.4X [%s]\n" 65 #define UINT32_FORMAT "%8.8X [%s]\n" 66 #define STRING_FORMAT "[%s]\n" 67 68 /* These tables map a subtable type to a description string */ 69 70 static const char *AcpiDmAestResourceNames[] = 71 { 72 "Cache Resource", 73 "TLB Resource", 74 "Generic Resource", 75 "Unknown Resource Type" /* Reserved */ 76 }; 77 78 static const char *AcpiDmAestSubnames[] = 79 { 80 "Processor Error Node", 81 "Memory Error Node", 82 "SMMU Error Node", 83 "Vendor-defined Error Node", 84 "GIC Error Node", 85 "Unknown Subtable Type" /* Reserved */ 86 }; 87 88 static const char *AcpiDmAestCacheNames[] = 89 { 90 "Data Cache", 91 "Instruction Cache", 92 "Unified Cache", 93 "Unknown Cache Type" /* Reserved */ 94 }; 95 96 static const char *AcpiDmAestGicNames[] = 97 { 98 "GIC CPU", 99 "GIC Distributor", 100 "GIC Redistributor", 101 "GIC ITS", 102 "Unknown GIC Interface Type" /* Reserved */ 103 }; 104 105 static const char *AcpiDmAestXfaceNames[] = 106 { 107 "System Register Interface", 108 "Memory Mapped Interface", 109 "Unknown Interface Type" /* Reserved */ 110 }; 111 112 static const char *AcpiDmAestXruptNames[] = 113 { 114 "Fault Handling Interrupt", 115 "Error Recovery Interrupt", 116 "Unknown Interrupt Type" /* Reserved */ 117 }; 118 119 static const char *AcpiDmAsfSubnames[] = 120 { 121 "ASF Information", 122 "ASF Alerts", 123 "ASF Remote Control", 124 "ASF RMCP Boot Options", 125 "ASF Address", 126 "Unknown Subtable Type" /* Reserved */ 127 }; 128 129 static const char *AcpiDmCdatSubnames[] = 130 { 131 "Device Scoped Memory Affinity Structure (DSMAS)", 132 "Device scoped Latency and Bandwidth Information Structure (DSLBIS)", 133 "Device Scoped Memory Side Cache Information Structure (DSMSCIS)", 134 "Device Scoped Initiator Structure (DSIS)", 135 "Device Scoped EFI Memory Type Structure (DSEMTS)", 136 "Switch Scoped Latency and Bandwidth Information Structure (SSLBIS)", 137 "Unknown Subtable Type" /* Reserved */ 138 }; 139 140 static const char *AcpiDmCedtSubnames[] = 141 { 142 "CXL Host Bridge Structure", 143 "CXL Fixed Memory Window Structure", 144 "Unknown Subtable Type" /* Reserved */ 145 }; 146 147 static const char *AcpiDmDmarSubnames[] = 148 { 149 "Hardware Unit Definition", 150 "Reserved Memory Region", 151 "Root Port ATS Capability", 152 "Remapping Hardware Static Affinity", 153 "ACPI Namespace Device Declaration", 154 "SoC Integrated Address Translation Cache", 155 "Unknown Subtable Type" /* Reserved */ 156 }; 157 158 static const char *AcpiDmDmarScope[] = 159 { 160 "Reserved value", 161 "PCI Endpoint Device", 162 "PCI Bridge Device", 163 "IOAPIC Device", 164 "Message-capable HPET Device", 165 "Namespace Device", 166 "Unknown Scope Type" /* Reserved */ 167 }; 168 169 static const char *AcpiDmEinjActions[] = 170 { 171 "Begin Operation", 172 "Get Trigger Table", 173 "Set Error Type", 174 "Get Error Type", 175 "End Operation", 176 "Execute Operation", 177 "Check Busy Status", 178 "Get Command Status", 179 "Set Error Type With Address", 180 "Get Execute Timings", 181 "Unknown Action" 182 }; 183 184 static const char *AcpiDmEinjInstructions[] = 185 { 186 "Read Register", 187 "Read Register Value", 188 "Write Register", 189 "Write Register Value", 190 "Noop", 191 "Flush Cacheline", 192 "Unknown Instruction" 193 }; 194 195 static const char *AcpiDmErstActions[] = 196 { 197 "Begin Write Operation", 198 "Begin Read Operation", 199 "Begin Clear Operation", 200 "End Operation", 201 "Set Record Offset", 202 "Execute Operation", 203 "Check Busy Status", 204 "Get Command Status", 205 "Get Record Identifier", 206 "Set Record Identifier", 207 "Get Record Count", 208 "Begin Dummy Write", 209 "Unused/Unknown Action", 210 "Get Error Address Range", 211 "Get Error Address Length", 212 "Get Error Attributes", 213 "Execute Timings", 214 "Unknown Action" 215 }; 216 217 static const char *AcpiDmErstInstructions[] = 218 { 219 "Read Register", 220 "Read Register Value", 221 "Write Register", 222 "Write Register Value", 223 "Noop", 224 "Load Var1", 225 "Load Var2", 226 "Store Var1", 227 "Add", 228 "Subtract", 229 "Add Value", 230 "Subtract Value", 231 "Stall", 232 "Stall While True", 233 "Skip Next If True", 234 "GoTo", 235 "Set Source Address", 236 "Set Destination Address", 237 "Move Data", 238 "Unknown Instruction" 239 }; 240 241 static const char *AcpiDmGtdtSubnames[] = 242 { 243 "Generic Timer Block", 244 "Generic Watchdog Timer", 245 "Unknown Subtable Type" /* Reserved */ 246 }; 247 248 static const char *AcpiDmHestSubnames[] = 249 { 250 "IA-32 Machine Check Exception", 251 "IA-32 Corrected Machine Check", 252 "IA-32 Non-Maskable Interrupt", 253 "Unknown Subtable Type", /* 3 - Reserved */ 254 "Unknown Subtable Type", /* 4 - Reserved */ 255 "Unknown Subtable Type", /* 5 - Reserved */ 256 "PCI Express Root Port AER", 257 "PCI Express AER (AER Endpoint)", 258 "PCI Express/PCI-X Bridge AER", 259 "Generic Hardware Error Source", 260 "Generic Hardware Error Source V2", 261 "IA-32 Deferred Machine Check", 262 "Unknown Subtable Type" /* Reserved */ 263 }; 264 265 static const char *AcpiDmHestNotifySubnames[] = 266 { 267 "Polled", 268 "External Interrupt", 269 "Local Interrupt", 270 "SCI", 271 "NMI", 272 "CMCI", /* ACPI 5.0 */ 273 "MCE", /* ACPI 5.0 */ 274 "GPIO", /* ACPI 6.0 */ 275 "SEA", /* ACPI 6.1 */ 276 "SEI", /* ACPI 6.1 */ 277 "GSIV", /* ACPI 6.1 */ 278 "Software Delegated Exception", /* ACPI 6.2 */ 279 "Unknown Notify Type" /* Reserved */ 280 }; 281 282 static const char *AcpiDmHmatSubnames[] = 283 { 284 "Memory Proximity Domain Attributes", 285 "System Locality Latency and Bandwidth Information", 286 "Memory Side Cache Information", 287 "Unknown Structure Type" /* Reserved */ 288 }; 289 290 static const char *AcpiDmMadtSubnames[] = 291 { 292 "Processor Local APIC", /* ACPI_MADT_TYPE_LOCAL_APIC */ 293 "I/O APIC", /* ACPI_MADT_TYPE_IO_APIC */ 294 "Interrupt Source Override", /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */ 295 "NMI Source", /* ACPI_MADT_TYPE_NMI_SOURCE */ 296 "Local APIC NMI", /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */ 297 "Local APIC Address Override", /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */ 298 "I/O SAPIC", /* ACPI_MADT_TYPE_IO_SAPIC */ 299 "Local SAPIC", /* ACPI_MADT_TYPE_LOCAL_SAPIC */ 300 "Platform Interrupt Sources", /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */ 301 "Processor Local x2APIC", /* ACPI_MADT_TYPE_LOCAL_X2APIC */ 302 "Local x2APIC NMI", /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */ 303 "Generic Interrupt Controller", /* ACPI_MADT_GENERIC_INTERRUPT */ 304 "Generic Interrupt Distributor", /* ACPI_MADT_GENERIC_DISTRIBUTOR */ 305 "Generic MSI Frame", /* ACPI_MADT_GENERIC_MSI_FRAME */ 306 "Generic Interrupt Redistributor", /* ACPI_MADT_GENERIC_REDISTRIBUTOR */ 307 "Generic Interrupt Translator", /* ACPI_MADT_GENERIC_TRANSLATOR */ 308 "Mutiprocessor Wakeup", /* ACPI_MADT_TYPE_MULTIPROC_WAKEUP */ 309 "CPU Core Interrupt Controller", /* ACPI_MADT_TYPE_CORE_PIC */ 310 "Legacy I/O Interrupt Controller", /* ACPI_MADT_TYPE_LIO_PIC */ 311 "HT Interrupt Controller", /* ACPI_MADT_TYPE_HT_PIC */ 312 "Extend I/O Interrupt Controller", /* ACPI_MADT_TYPE_EIO_PIC */ 313 "MSI Interrupt Controller", /* ACPI_MADT_TYPE_MSI_PIC */ 314 "Bridge I/O Interrupt Controller", /* ACPI_MADT_TYPE_BIO_PIC */ 315 "LPC Interrupt Controller", /* ACPI_MADT_TYPE_LPC_PIC */ 316 "Unknown Subtable Type", /* Reserved */ 317 "Types 80-FF are used for OEM data" /* Reserved for OEM data */ 318 }; 319 320 static const char *AcpiDmNfitSubnames[] = 321 { 322 "System Physical Address Range", /* ACPI_NFIT_TYPE_SYSTEM_ADDRESS */ 323 "Memory Range Map", /* ACPI_NFIT_TYPE_MEMORY_MAP */ 324 "Interleave Info", /* ACPI_NFIT_TYPE_INTERLEAVE */ 325 "SMBIOS Information", /* ACPI_NFIT_TYPE_SMBIOS */ 326 "NVDIMM Control Region", /* ACPI_NFIT_TYPE_CONTROL_REGION */ 327 "NVDIMM Block Data Window Region", /* ACPI_NFIT_TYPE_DATA_REGION */ 328 "Flush Hint Address", /* ACPI_NFIT_TYPE_FLUSH_ADDRESS */ 329 "Platform Capabilities", /* ACPI_NFIT_TYPE_CAPABILITIES */ 330 "Unknown Subtable Type" /* Reserved */ 331 }; 332 333 static const char *AcpiDmNhltLinkTypeNames[] = 334 { 335 "Reserved for HD-Audio", /* ACPI_NHLT_RESERVED_HD_AUDIO */ 336 "Reserved for DSP", /* ACPI_NHLT_RESERVED_DSP */ 337 "Type PDM", /* ACPI_NHLT_PDM */ 338 "Type SSP", /* ACPI_NHLT_SSP */ 339 "Reserved for SlimBus", /* ACPI_NHLT_RESERVED_SLIMBUS */ 340 "Reserved for SoundWire", /* ACPI_NHLT_RESERVED_SOUNDWIRE */ 341 "Unknown Link Type" /* Reserved */ 342 }; 343 344 static const char *AcpiDmNhltDirectionNames[] = 345 { 346 "Render", /* ACPI_NHLT_DIR_RENDER */ 347 "Capture", /* ACPI_NHLT_DIR_CAPTURE */ 348 "Render with Loopback", /* ACPI_NHLT_DIR_RENDER_LOOPBACK */ 349 "Feedback for Render", /* ACPI_NHLT_DIR_RENDER_FEEDBACK */ 350 "Unknown Direction" /* Reserved */ 351 }; 352 353 static const char *AcpiDmNhltMicTypeNames[] = 354 { 355 "Omnidirectional", /* ACPI_NHLT_MIC_OMNIDIRECTIONAL */ 356 "Subcardioid", /* ACPI_NHLT_MIC_SUBCARDIOID */ 357 "Cardioid", /* ACPI_NHLT_MIC_CARDIOID */ 358 "SuperCardioid", /* ACPI_NHLT_MIC_SUPER_CARDIOID */ 359 "HyperCardioid", /* ACPI_NHLT_MIC_HYPER_CARDIOID */ 360 "8 Shaped", /* ACPI_NHLT_MIC_8_SHAPED */ 361 "Reserved Mic Type", /* Reserved */ 362 "Vendor Defined", /* ACPI_NHLT_MIC_VENDOR_DEFINED */ 363 "Unknown Mic Type" /* ACPI_NHLT_MIC_RESERVED */ 364 }; 365 366 static const char *AcpiDmNhltMicPositionNames[] = 367 { 368 "Top", /* ACPI_NHLT_MIC_POSITION_TOP */ 369 "Bottom", /* ACPI_NHLT_MIC_POSITION_BOTTOM */ 370 "Left", /* ACPI_NHLT_MIC_POSITION_LEFT */ 371 "Right", /* ACPI_NHLT_MIC_POSITION_RIGHT */ 372 "Front", /* ACPI_NHLT_MIC_POSITION_FRONT */ 373 "Back", /* ACPI_NHLT_MIC_POSITION_BACK */ 374 "Unknown Mic Position" /* 6 and above are reserved */ 375 }; 376 377 static const char *AcpiDmNhltMicArrayTypeNames[] = 378 { 379 "Unknown Array Type", /* ACPI_NHLT_ARRAY_TYPE_RESERVED */ 380 "Small Linear 2-element", /* ACPI_NHLT_SMALL_LINEAR_2ELEMENT */ 381 "Big Linear 2-element", /* ACPI_NHLT_BIG_LINEAR_2ELEMENT */ 382 "Linear 4-element 1st Geometry", /* ACPI_NHLT_FIRST_GEOMETRY_LINEAR_4ELEMENT */ 383 "Planar L-shaped 4-element", /* ACPI_NHLT_PLANAR_LSHAPED_4ELEMENT */ 384 "Linear 4-element 2nd Geometry", /* ACPI_NHLT_SECOND_GEOMETRY_LINEAR_4ELEMENT */ 385 "Vendor Defined" /* ACPI_NHLT_VENDOR_DEFINED */ 386 }; 387 388 static const char *AcpiDmNhltConfigTypeNames[] = 389 { 390 "Generic Type", /* ACPI_NHLT_CONFIG_TYPE_GENERIC */ 391 "Microphone Array", /* ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY */ 392 "Reserved", /* ACPI_NHLT_CONFIG_TYPE_RESERVED */ 393 "Render Feedback", /* ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK */ 394 "Unknown Config Type" /* ACPI_NHLT_CONFIG_TYPE_RESERVED */ 395 }; 396 397 static const char *AcpiDmPcctSubnames[] = 398 { 399 "Generic Communications Subspace", /* ACPI_PCCT_TYPE_GENERIC_SUBSPACE */ 400 "HW-Reduced Comm Subspace", /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE */ 401 "HW-Reduced Comm Subspace Type2", /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 */ 402 "Extended PCC Master Subspace", /* ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE */ 403 "Extended PCC Slave Subspace", /* ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE */ 404 "HW Registers based Comm Subspace", /* ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE */ 405 "Unknown Subtable Type" /* Reserved */ 406 }; 407 408 static const char *AcpiDmPhatSubnames[] = 409 { 410 "Firmware Version Data", /* ACPI_PHAT_TYPE_FW_VERSION_DATA */ 411 "Firmware Health Data", /* ACPI_PHAT_TYPE_FW_HEALTH_DATA */ 412 "Unknown Subtable Type" /* Reserved */ 413 }; 414 415 static const char *AcpiDmPmttSubnames[] = 416 { 417 "Socket", /* ACPI_PMTT_TYPE_SOCKET */ 418 "Memory Controller", /* ACPI_PMTT_TYPE_CONTROLLER */ 419 "Physical Component (DIMM)", /* ACPI_PMTT_TYPE_DIMM */ 420 "Unknown Subtable Type", /* Reserved */ 421 "Vendor Specific" /* ACPI_PMTT_TYPE_VENDOR */ 422 }; 423 424 static const char *AcpiDmPpttSubnames[] = 425 { 426 "Processor Hierarchy Node", /* ACPI_PPTT_TYPE_PROCESSOR */ 427 "Cache Type", /* ACPI_PPTT_TYPE_CACHE */ 428 "ID", /* ACPI_PPTT_TYPE_ID */ 429 "Unknown Subtable Type" /* Reserved */ 430 }; 431 432 static const char *AcpiDmRgrtSubnames[] = 433 { 434 "Unknown/Reserved Image Type", /* ACPI_RGRT_TYPE_RESERVED0 */ 435 "Type PNG" /* ACPI_RGRT_IMAGE_TYPE_PNG */ 436 }; 437 438 static const char *AcpiDmSdevSubnames[] = 439 { 440 "Namespace Device", /* ACPI_SDEV_TYPE_NAMESPACE_DEVICE */ 441 "PCIe Endpoint Device", /* ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE */ 442 "Unknown Subtable Type" /* Reserved */ 443 }; 444 445 static const char *AcpiDmSratSubnames[] = 446 { 447 "Processor Local APIC/SAPIC Affinity", 448 "Memory Affinity", 449 "Processor Local x2APIC Affinity", 450 "GICC Affinity", 451 "GIC ITS Affinity", /* Acpi 6.2 */ 452 "Generic Initiator Affinity", /* Acpi 6.3 */ 453 "Generic Port Affinity", /* Acpi 6.4 */ 454 "Unknown Subtable Type" /* Reserved */ 455 }; 456 457 static const char *AcpiDmTpm2Subnames[] = 458 { 459 "Illegal Start Method value", 460 "Reserved", 461 "ACPI Start Method", 462 "Reserved", 463 "Reserved", 464 "Reserved", 465 "Memory Mapped I/O", 466 "Command Response Buffer", 467 "Command Response Buffer with ACPI Start Method", 468 "Reserved", 469 "Reserved", 470 "Command Response Buffer with ARM SMC", 471 "Unknown Subtable Type" /* Reserved */ 472 }; 473 474 static const char *AcpiDmIvrsSubnames[] = 475 { 476 "Hardware Definition Block (IVHD)", 477 "Hardware Definition Block - Mixed Format (IVHD)", 478 "Memory Definition Block (IVMD)", 479 "Unknown/Reserved Subtable Type" /* Reserved */ 480 }; 481 482 static const char *AcpiDmIvrsDevEntryNames[] = 483 { 484 "Unknown/Reserved Device Entry Type", /* 0- Reserved */ 485 "Device Entry: Select All Devices", /* 1 */ 486 "Device Entry: Select One Device", /* 2 */ 487 "Device Entry: Start of Range", /* 3 */ 488 "Device Entry: End of Range", /* 4 */ 489 "Device Entry: Alias Select", /* 66 */ 490 "Device Entry: Alias Start of Range", /* 67 */ 491 "Unknown/Reserved Device Entry Type", /* 68- Reserved */ 492 "Unknown/Reserved Device Entry Type", /* 69- Reserved */ 493 "Device Entry: Extended Select", /* 70 */ 494 "Device Entry: Extended Start of Range", /* 71 */ 495 "Device Entry: Special Device", /* 72 */ 496 "Device Entry: ACPI HID Named Device", /* 240 */ 497 "Unknown/Reserved Device Entry Type" /* Reserved */ 498 }; 499 500 static const char *AcpiDmLpitSubnames[] = 501 { 502 "Native C-state Idle Structure", 503 "Unknown Subtable Type" /* Reserved */ 504 }; 505 506 static const char *AcpiDmViotSubnames[] = 507 { 508 "Unknown Subtable Type", /* 0 -Reserved */ 509 "PCI Range", 510 "MMIO Endpoint", 511 "VirtIO-PCI IOMMU", 512 "VirtIO-MMIO IOMMU", 513 "Unknown Subtable Type" /* Reserved */ 514 }; 515 516 #define ACPI_FADT_PM_RESERVED 9 517 518 static const char *AcpiDmFadtProfiles[] = 519 { 520 "Unspecified", 521 "Desktop", 522 "Mobile", 523 "Workstation", 524 "Enterprise Server", 525 "SOHO Server", 526 "Appliance PC", 527 "Performance Server", 528 "Tablet", 529 "Unknown Profile Type" 530 }; 531 532 #define ACPI_GAS_WIDTH_RESERVED 5 533 534 static const char *AcpiDmGasAccessWidth[] = 535 { 536 "Undefined/Legacy", 537 "Byte Access:8", 538 "Word Access:16", 539 "DWord Access:32", 540 "QWord Access:64", 541 "Unknown Width Encoding" 542 }; 543 544 545 /******************************************************************************* 546 * 547 * ACPI Table Data, indexed by signature. 548 * 549 * Each entry contains: Signature, Table Info, Handler, DtHandler, 550 * Template, Description 551 * 552 * Simple tables have only a TableInfo structure, complex tables have a 553 * handler. This table must be NULL terminated. RSDP and FACS are 554 * special-cased elsewhere. 555 * 556 * Note: Any tables added here should be duplicated within 557 * AcpiGbl_SupportedTables in the file common/ahtable.c 558 * 559 ******************************************************************************/ 560 561 const ACPI_DMTABLE_DATA AcpiDmTableData[] = 562 { 563 {ACPI_SIG_AEST, NULL, AcpiDmDumpAest, DtCompileAest, TemplateAest}, 564 {ACPI_SIG_AGDI, AcpiDmTableInfoAgdi, NULL, NULL, TemplateAgdi}, 565 {ACPI_SIG_APMT, NULL, AcpiDmDumpApmt, DtCompileApmt, TemplateApmt}, 566 {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf}, 567 {ACPI_SIG_BDAT, AcpiDmTableInfoBdat, NULL, NULL, TemplateBdat}, 568 {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert}, 569 {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt, NULL, NULL, TemplateBgrt}, 570 {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, NULL, TemplateBoot}, 571 {ACPI_SIG_CCEL, AcpiDmTableInfoCcel, NULL, NULL, TemplateCcel}, 572 {ACPI_SIG_CDAT, NULL, AcpiDmDumpCdat, NULL, TemplateCdat}, 573 {ACPI_SIG_CEDT, NULL, AcpiDmDumpCedt, DtCompileCedt, TemplateCedt}, 574 {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, DtCompileCpep, TemplateCpep}, 575 {ACPI_SIG_CSRT, NULL, AcpiDmDumpCsrt, DtCompileCsrt, TemplateCsrt}, 576 {ACPI_SIG_DBG2, AcpiDmTableInfoDbg2, AcpiDmDumpDbg2, DtCompileDbg2, TemplateDbg2}, 577 {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp, NULL, NULL, TemplateDbgp}, 578 {ACPI_SIG_DMAR, NULL, AcpiDmDumpDmar, DtCompileDmar, TemplateDmar}, 579 {ACPI_SIG_DRTM, NULL, AcpiDmDumpDrtm, DtCompileDrtm, TemplateDrtm}, 580 {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt, NULL, NULL, TemplateEcdt}, 581 {ACPI_SIG_EINJ, NULL, AcpiDmDumpEinj, DtCompileEinj, TemplateEinj}, 582 {ACPI_SIG_ERST, NULL, AcpiDmDumpErst, DtCompileErst, TemplateErst}, 583 {ACPI_SIG_FADT, NULL, AcpiDmDumpFadt, DtCompileFadt, TemplateFadt}, 584 {ACPI_SIG_FPDT, NULL, AcpiDmDumpFpdt, DtCompileFpdt, TemplateFpdt}, 585 {ACPI_SIG_GTDT, NULL, AcpiDmDumpGtdt, DtCompileGtdt, TemplateGtdt}, 586 {ACPI_SIG_HEST, NULL, AcpiDmDumpHest, DtCompileHest, TemplateHest}, 587 {ACPI_SIG_HMAT, NULL, AcpiDmDumpHmat, DtCompileHmat, TemplateHmat}, 588 {ACPI_SIG_HPET, AcpiDmTableInfoHpet, NULL, NULL, TemplateHpet}, 589 {ACPI_SIG_IORT, NULL, AcpiDmDumpIort, DtCompileIort, TemplateIort}, 590 {ACPI_SIG_IVRS, NULL, AcpiDmDumpIvrs, DtCompileIvrs, TemplateIvrs}, 591 {ACPI_SIG_LPIT, NULL, AcpiDmDumpLpit, DtCompileLpit, TemplateLpit}, 592 {ACPI_SIG_MADT, NULL, AcpiDmDumpMadt, DtCompileMadt, TemplateMadt}, 593 {ACPI_SIG_MCFG, NULL, AcpiDmDumpMcfg, DtCompileMcfg, TemplateMcfg}, 594 {ACPI_SIG_MCHI, AcpiDmTableInfoMchi, NULL, NULL, TemplateMchi}, 595 {ACPI_SIG_MPST, AcpiDmTableInfoMpst, AcpiDmDumpMpst, DtCompileMpst, TemplateMpst}, 596 {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct}, 597 {ACPI_SIG_MSDM, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateMsdm}, 598 {ACPI_SIG_NFIT, AcpiDmTableInfoNfit, AcpiDmDumpNfit, DtCompileNfit, TemplateNfit}, 599 {ACPI_SIG_NHLT, AcpiDmTableInfoNhlt, AcpiDmDumpNhlt, DtCompileNhlt, TemplateNhlt}, 600 {ACPI_SIG_PCCT, AcpiDmTableInfoPcct, AcpiDmDumpPcct, DtCompilePcct, TemplatePcct}, 601 {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt, AcpiDmDumpPdtt, DtCompilePdtt, TemplatePdtt}, 602 {ACPI_SIG_PHAT, NULL, AcpiDmDumpPhat, DtCompilePhat, TemplatePhat}, 603 {ACPI_SIG_PMTT, NULL, AcpiDmDumpPmtt, DtCompilePmtt, TemplatePmtt}, 604 {ACPI_SIG_PPTT, NULL, AcpiDmDumpPptt, DtCompilePptt, TemplatePptt}, 605 {ACPI_SIG_PRMT, NULL, AcpiDmDumpPrmt, DtCompilePrmt, TemplatePrmt}, 606 {ACPI_SIG_RASF, AcpiDmTableInfoRasf, NULL, NULL, TemplateRasf}, 607 {ACPI_SIG_RGRT, NULL, AcpiDmDumpRgrt, DtCompileRgrt, TemplateRgrt}, 608 {ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, DtCompileRsdt, TemplateRsdt}, 609 {ACPI_SIG_S3PT, NULL, NULL, NULL, TemplateS3pt}, 610 {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, NULL, TemplateSbst}, 611 {ACPI_SIG_SDEI, AcpiDmTableInfoSdei, NULL, NULL, TemplateSdei}, 612 {ACPI_SIG_SDEV, AcpiDmTableInfoSdev, AcpiDmDumpSdev, DtCompileSdev, TemplateSdev}, 613 {ACPI_SIG_SLIC, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateSlic}, 614 {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, DtCompileSlit, TemplateSlit}, 615 {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, NULL, TemplateSpcr}, 616 {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, NULL, TemplateSpmi}, 617 {ACPI_SIG_SRAT, NULL, AcpiDmDumpSrat, DtCompileSrat, TemplateSrat}, 618 {ACPI_SIG_STAO, NULL, AcpiDmDumpStao, DtCompileStao, TemplateStao}, 619 {ACPI_SIG_SVKL, AcpiDmTableInfoSvkl, AcpiDmDumpSvkl, DtCompileSvkl, TemplateSvkl}, 620 {ACPI_SIG_TCPA, NULL, AcpiDmDumpTcpa, DtCompileTcpa, TemplateTcpa}, 621 {ACPI_SIG_TDEL, AcpiDmTableInfoTdel, NULL, NULL, TemplateTdel}, 622 {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2, AcpiDmDumpTpm2, DtCompileTpm2, TemplateTpm2}, 623 {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi}, 624 {ACPI_SIG_VIOT, AcpiDmTableInfoViot, AcpiDmDumpViot, DtCompileViot, TemplateViot}, 625 {ACPI_SIG_WAET, AcpiDmTableInfoWaet, NULL, NULL, TemplateWaet}, 626 {ACPI_SIG_WDAT, NULL, AcpiDmDumpWdat, DtCompileWdat, TemplateWdat}, 627 {ACPI_SIG_WDDT, AcpiDmTableInfoWddt, NULL, NULL, TemplateWddt}, 628 {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt, NULL, NULL, TemplateWdrt}, 629 {ACPI_SIG_WPBT, NULL, AcpiDmDumpWpbt, DtCompileWpbt, TemplateWpbt}, 630 {ACPI_SIG_WSMT, AcpiDmTableInfoWsmt, NULL, NULL, TemplateWsmt}, 631 {ACPI_SIG_XENV, AcpiDmTableInfoXenv, NULL, NULL, TemplateXenv}, 632 {ACPI_SIG_XSDT, NULL, AcpiDmDumpXsdt, DtCompileXsdt, TemplateXsdt}, 633 {NULL, NULL, NULL, NULL, NULL} 634 }; 635 636 637 /******************************************************************************* 638 * 639 * FUNCTION: AcpiDmGetTableData 640 * 641 * PARAMETERS: Signature - ACPI signature (4 chars) to match 642 * 643 * RETURN: Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found. 644 * 645 * DESCRIPTION: Find a match in the global table of supported ACPI tables 646 * 647 ******************************************************************************/ 648 649 const ACPI_DMTABLE_DATA * 650 AcpiDmGetTableData ( 651 char *Signature) 652 { 653 const ACPI_DMTABLE_DATA *Info; 654 655 656 for (Info = AcpiDmTableData; Info->Signature; Info++) 657 { 658 if (ACPI_COMPARE_NAMESEG (Signature, Info->Signature)) 659 { 660 return (Info); 661 } 662 } 663 664 return (NULL); 665 } 666 667 668 /******************************************************************************* 669 * 670 * FUNCTION: AcpiDmDumpDataTable 671 * 672 * PARAMETERS: Table - An ACPI table 673 * 674 * RETURN: None. 675 * 676 * DESCRIPTION: Format the contents of an ACPI data table (any table other 677 * than an SSDT or DSDT that does not contain executable AML code) 678 * 679 ******************************************************************************/ 680 681 void 682 AcpiDmDumpDataTable ( 683 ACPI_TABLE_HEADER *Table) 684 { 685 ACPI_STATUS Status; 686 const ACPI_DMTABLE_DATA *TableData; 687 UINT32 Length; 688 689 690 /* Ignore tables that contain AML */ 691 692 if (AcpiUtIsAmlTable (Table)) 693 { 694 if (AslGbl_VerboseTemplates) 695 { 696 /* Dump the raw table data */ 697 698 Length = Table->Length; 699 700 AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n", 701 ACPI_RAW_TABLE_DATA_HEADER, Length, Length); 702 AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table), 703 Length, DB_BYTE_DISPLAY, 0); 704 AcpiOsPrintf (" */\n"); 705 } 706 return; 707 } 708 709 /* 710 * Handle tables that don't use the common ACPI table header structure. 711 * Currently, these are the FACS, RSDP, S3PT and CDAT. 712 */ 713 if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS)) 714 { 715 Length = Table->Length; 716 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs); 717 if (ACPI_FAILURE (Status)) 718 { 719 return; 720 } 721 } 722 else if (ACPI_VALIDATE_RSDP_SIG (ACPI_CAST_PTR (ACPI_TABLE_RSDP, 723 Table)->Signature)) 724 { 725 Length = AcpiDmDumpRsdp (Table); 726 } 727 else if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_S3PT)) 728 { 729 Length = AcpiDmDumpS3pt (Table); 730 } 731 else if (!AcpiUtValidNameseg (Table->Signature)) 732 { 733 /* 734 * For CDAT we are assuming that there should be at least one non-ASCII 735 * byte in the (normally) 4-character Signature field (at least the 736 * high-order byte should be zero). 737 */ 738 if (AcpiGbl_CDAT) 739 { 740 /* 741 * Invalid signature and <-ds CDAT> was specified on the command line. 742 * Therefore, we have a CDAT table. 743 */ 744 AcpiDmDumpCdat (Table); 745 } 746 else 747 { 748 fprintf (stderr, "Table has an invalid signature\n"); 749 } 750 751 return; 752 } 753 else 754 { 755 /* 756 * All other tables must use the common ACPI table header, dump it now 757 */ 758 Length = Table->Length; 759 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader); 760 if (ACPI_FAILURE (Status)) 761 { 762 return; 763 } 764 AcpiOsPrintf ("\n"); 765 766 /* Match signature and dispatch appropriately */ 767 768 TableData = AcpiDmGetTableData (Table->Signature); 769 if (!TableData) 770 { 771 if (!strncmp (Table->Signature, "OEM", 3)) 772 { 773 AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n", 774 Table->Signature); 775 } 776 else 777 { 778 AcpiOsPrintf ("\n**** Unknown ACPI table signature [%4.4s]\n\n", 779 Table->Signature); 780 781 fprintf (stderr, "Unknown ACPI table signature [%4.4s], ", 782 Table->Signature); 783 784 if (!AcpiGbl_ForceAmlDisassembly) 785 { 786 fprintf (stderr, "decoding ACPI table header only\n"); 787 } 788 else 789 { 790 fprintf (stderr, "assuming table contains valid AML code\n"); 791 } 792 } 793 } 794 else if (TableData->TableHandler) 795 { 796 /* Complex table, has a handler */ 797 798 TableData->TableHandler (Table); 799 } 800 else if (TableData->TableInfo) 801 { 802 /* Simple table, just walk the info table */ 803 804 Status = AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo); 805 if (ACPI_FAILURE (Status)) 806 { 807 return; 808 } 809 } 810 } 811 812 if (!AslGbl_DoTemplates || AslGbl_VerboseTemplates) 813 { 814 /* Dump the raw table data */ 815 816 AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n", 817 ACPI_RAW_TABLE_DATA_HEADER, Length, Length); 818 AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table), 819 Length, DB_BYTE_DISPLAY, 0); 820 } 821 } 822 823 824 /******************************************************************************* 825 * 826 * FUNCTION: AcpiDmLineHeader 827 * 828 * PARAMETERS: Offset - Current byte offset, from table start 829 * ByteLength - Length of the field in bytes, 0 for flags 830 * Name - Name of this field 831 * 832 * RETURN: None 833 * 834 * DESCRIPTION: Utility routines for formatting output lines. Displays the 835 * current table offset in hex and decimal, the field length, 836 * and the field name. 837 * 838 ******************************************************************************/ 839 840 void 841 AcpiDmLineHeader ( 842 UINT32 Offset, 843 UINT32 ByteLength, 844 char *Name) 845 { 846 847 /* Allow a null name for fields that span multiple lines (large buffers) */ 848 849 if (!Name) 850 { 851 Name = ""; 852 } 853 854 if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */ 855 { 856 if (ByteLength) 857 { 858 AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name); 859 } 860 else 861 { 862 if (*Name) 863 { 864 AcpiOsPrintf ("%41s : ", Name); 865 } 866 else 867 { 868 AcpiOsPrintf ("%41s ", Name); 869 } 870 } 871 } 872 else /* Normal disassembler or verbose template */ 873 { 874 if (ByteLength) 875 { 876 AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %27s : ", 877 Offset, Offset, ByteLength, Name); 878 } 879 else 880 { 881 if (*Name) 882 { 883 AcpiOsPrintf ("%44s : ", Name); 884 } 885 else 886 { 887 AcpiOsPrintf ("%44s ", Name); 888 } 889 } 890 } 891 } 892 893 void 894 AcpiDmLineHeader2 ( 895 UINT32 Offset, 896 UINT32 ByteLength, 897 char *Name, 898 UINT32 Value) 899 { 900 901 if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */ 902 { 903 if (ByteLength) 904 { 905 AcpiOsPrintf ("[%.4d] %30s %3d : ", 906 ByteLength, Name, Value); 907 } 908 else 909 { 910 AcpiOsPrintf ("%36s % 3d : ", 911 Name, Value); 912 } 913 } 914 else /* Normal disassembler or verbose template */ 915 { 916 if (ByteLength) 917 { 918 AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %24s %3d : ", 919 Offset, Offset, ByteLength, Name, Value); 920 } 921 else 922 { 923 AcpiOsPrintf ("[%3.3Xh %4.4u ] %24s %3d : ", 924 Offset, Offset, Name, Value); 925 } 926 } 927 } 928 929 930 /******************************************************************************* 931 * 932 * FUNCTION: AcpiDmDumpTable 933 * 934 * PARAMETERS: TableLength - Length of the entire ACPI table 935 * TableOffset - Starting offset within the table for this 936 * sub-descriptor (0 if main table) 937 * Table - The ACPI table 938 * SubtableLength - Length of this sub-descriptor 939 * Info - Info table for this ACPI table 940 * 941 * RETURN: Status 942 * 943 * DESCRIPTION: Display ACPI table contents by walking the Info table. 944 * 945 * Note: This function must remain in sync with DtGetFieldLength. 946 * 947 ******************************************************************************/ 948 949 ACPI_STATUS 950 AcpiDmDumpTable ( 951 UINT32 TableLength, 952 UINT32 TableOffset, 953 void *Table, 954 UINT32 SubtableLength, 955 ACPI_DMTABLE_INFO *Info) 956 { 957 UINT8 *Target; 958 UINT32 CurrentOffset; 959 UINT32 ByteLength; 960 UINT8 Temp8; 961 UINT16 Temp16; 962 UINT32 Temp32; 963 UINT64 Value; 964 const AH_TABLE *TableData; 965 const char *Name; 966 BOOLEAN LastOutputBlankLine = FALSE; 967 ACPI_STATUS Status; 968 char RepairedName[8]; 969 970 971 if (!Info) 972 { 973 AcpiOsPrintf ("Display not implemented\n"); 974 return (AE_NOT_IMPLEMENTED); 975 } 976 977 /* Walk entire Info table; Null name terminates */ 978 979 for (; Info->Name; Info++) 980 { 981 /* 982 * Target points to the field within the ACPI Table. CurrentOffset is 983 * the offset of the field from the start of the main table. 984 */ 985 Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset); 986 CurrentOffset = TableOffset + Info->Offset; 987 988 /* Check for beyond subtable end or (worse) beyond EOT */ 989 990 if (SubtableLength && (Info->Offset > SubtableLength)) 991 { 992 AcpiOsPrintf ( 993 "/**** ACPI subtable terminates early (Len %u) - " 994 "may be older version (dump table) */\n", SubtableLength); 995 996 /* Move on to next subtable */ 997 998 return (AE_OK); 999 } 1000 1001 if (CurrentOffset >= TableLength) 1002 { 1003 AcpiOsPrintf ( 1004 "/**** ACPI table terminates " 1005 "in the middle of a data structure! (dump table) \n" 1006 "CurrentOffset: %X, TableLength: %X ***/", CurrentOffset, TableLength); 1007 return (AE_BAD_DATA); 1008 } 1009 1010 /* Generate the byte length for this field */ 1011 1012 switch (Info->Opcode) 1013 { 1014 case ACPI_DMT_UINT8: 1015 case ACPI_DMT_CHKSUM: 1016 case ACPI_DMT_SPACEID: 1017 case ACPI_DMT_ACCWIDTH: 1018 case ACPI_DMT_CEDT: 1019 case ACPI_DMT_IVRS: 1020 case ACPI_DMT_IVRS_DE: 1021 case ACPI_DMT_GTDT: 1022 case ACPI_DMT_MADT: 1023 case ACPI_DMT_NHLT1: 1024 case ACPI_DMT_NHLT1a: 1025 case ACPI_DMT_NHLT1b: 1026 case ACPI_DMT_NHLT1c: 1027 case ACPI_DMT_NHLT1d: 1028 case ACPI_DMT_NHLT1f: 1029 case ACPI_DMT_PCCT: 1030 case ACPI_DMT_PMTT: 1031 case ACPI_DMT_PPTT: 1032 case ACPI_DMT_RGRT: 1033 case ACPI_DMT_SDEV: 1034 case ACPI_DMT_SRAT: 1035 case ACPI_DMT_AEST: 1036 case ACPI_DMT_AEST_RES: 1037 case ACPI_DMT_AEST_XFACE: 1038 case ACPI_DMT_AEST_XRUPT: 1039 case ACPI_DMT_ASF: 1040 case ACPI_DMT_CDAT: 1041 case ACPI_DMT_HESTNTYP: 1042 case ACPI_DMT_FADTPM: 1043 case ACPI_DMT_EINJACT: 1044 case ACPI_DMT_EINJINST: 1045 case ACPI_DMT_ERSTACT: 1046 case ACPI_DMT_ERSTINST: 1047 case ACPI_DMT_DMAR_SCOPE: 1048 case ACPI_DMT_VIOT: 1049 1050 ByteLength = 1; 1051 break; 1052 1053 case ACPI_DMT_UINT16: 1054 case ACPI_DMT_DMAR: 1055 case ACPI_DMT_HEST: 1056 case ACPI_DMT_HMAT: 1057 case ACPI_DMT_NFIT: 1058 case ACPI_DMT_NHLT1e: 1059 case ACPI_DMT_PHAT: 1060 1061 ByteLength = 2; 1062 break; 1063 1064 case ACPI_DMT_UINT24: 1065 1066 ByteLength = 3; 1067 break; 1068 1069 case ACPI_DMT_UINT32: 1070 case ACPI_DMT_AEST_CACHE: 1071 case ACPI_DMT_AEST_GIC: 1072 case ACPI_DMT_NAME4: 1073 case ACPI_DMT_SIG: 1074 case ACPI_DMT_LPIT: 1075 case ACPI_DMT_TPM2: 1076 1077 ByteLength = 4; 1078 break; 1079 1080 case ACPI_DMT_UINT40: 1081 1082 ByteLength = 5; 1083 break; 1084 1085 case ACPI_DMT_UINT48: 1086 case ACPI_DMT_NAME6: 1087 1088 ByteLength = 6; 1089 break; 1090 1091 case ACPI_DMT_UINT56: 1092 case ACPI_DMT_BUF7: 1093 1094 ByteLength = 7; 1095 break; 1096 1097 case ACPI_DMT_UINT64: 1098 case ACPI_DMT_NAME8: 1099 1100 ByteLength = 8; 1101 break; 1102 1103 case ACPI_DMT_BUF10: 1104 1105 ByteLength = 10; 1106 break; 1107 1108 case ACPI_DMT_BUF12: 1109 1110 ByteLength = 12; 1111 break; 1112 1113 case ACPI_DMT_BUF16: 1114 case ACPI_DMT_UUID: 1115 1116 ByteLength = 16; 1117 break; 1118 1119 case ACPI_DMT_BUF18: 1120 1121 ByteLength = 18; 1122 break; 1123 1124 case ACPI_DMT_BUF128: 1125 1126 ByteLength = 128; 1127 break; 1128 1129 case ACPI_DMT_WPBT_UNICODE: 1130 1131 ByteLength = SubtableLength; 1132 CurrentOffset = sizeof (ACPI_TABLE_WPBT); 1133 break; 1134 1135 case ACPI_DMT_UNICODE: 1136 case ACPI_DMT_BUFFER: 1137 case ACPI_DMT_RAW_BUFFER: 1138 1139 ByteLength = SubtableLength; 1140 break; 1141 1142 case ACPI_DMT_PMTT_VENDOR: 1143 /* 1144 * Calculate the length of the vendor data for the PMTT table: 1145 * Length = (Current Subtable ptr + Subtable length) - 1146 * Start of the vendor data (Target) 1147 */ 1148 ByteLength = ((ACPI_CAST_PTR (char, Table) + 1149 (ACPI_CAST_PTR (ACPI_PMTT_HEADER, Table)->Length)) - 1150 ACPI_CAST_PTR (char, Target)); 1151 break; 1152 1153 case ACPI_DMT_STRING: 1154 1155 ByteLength = strlen (ACPI_CAST_PTR (char, Target)) + 1; 1156 break; 1157 1158 case ACPI_DMT_IVRS_UNTERMINATED_STRING: 1159 1160 ByteLength = ((ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, Target) -1)->UidLength); 1161 break; 1162 1163 case ACPI_DMT_GAS: 1164 1165 if (!LastOutputBlankLine) 1166 { 1167 AcpiOsPrintf ("\n"); 1168 LastOutputBlankLine = TRUE; 1169 } 1170 1171 ByteLength = sizeof (ACPI_GENERIC_ADDRESS); 1172 break; 1173 1174 case ACPI_DMT_HESTNTFY: 1175 1176 if (!LastOutputBlankLine) 1177 { 1178 AcpiOsPrintf ("\n"); 1179 LastOutputBlankLine = TRUE; 1180 } 1181 1182 ByteLength = sizeof (ACPI_HEST_NOTIFY); 1183 break; 1184 1185 case ACPI_DMT_IORTMEM: 1186 1187 if (!LastOutputBlankLine) 1188 { 1189 LastOutputBlankLine = FALSE; 1190 } 1191 1192 ByteLength = sizeof (ACPI_IORT_MEMORY_ACCESS); 1193 break; 1194 1195 default: 1196 1197 ByteLength = 0; 1198 break; 1199 } 1200 1201 /* Check if we are beyond a subtable, or (worse) beyond EOT */ 1202 1203 if (CurrentOffset + ByteLength > TableLength) 1204 { 1205 if (SubtableLength) 1206 { 1207 AcpiOsPrintf ( 1208 "/**** ACPI subtable terminates early - " 1209 "may be older version (dump table) */\n"); 1210 1211 /* Move on to next subtable */ 1212 1213 return (AE_OK); 1214 } 1215 1216 AcpiOsPrintf ( 1217 "/**** ACPI table terminates " 1218 "in the middle of a data structure! */\n"); 1219 return (AE_BAD_DATA); 1220 } 1221 1222 if (Info->Opcode == ACPI_DMT_EXTRA_TEXT) 1223 { 1224 AcpiOsPrintf ("%s", Info->Name); 1225 continue; 1226 } 1227 1228 /* Start a new line and decode the opcode */ 1229 1230 AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name); 1231 1232 switch (Info->Opcode) 1233 { 1234 /* Single-bit Flag fields. Note: Opcode is the bit position */ 1235 1236 case ACPI_DMT_FLAG0: 1237 case ACPI_DMT_FLAG1: 1238 case ACPI_DMT_FLAG2: 1239 case ACPI_DMT_FLAG3: 1240 case ACPI_DMT_FLAG4: 1241 case ACPI_DMT_FLAG5: 1242 case ACPI_DMT_FLAG6: 1243 case ACPI_DMT_FLAG7: 1244 1245 AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01); 1246 break; 1247 1248 /* 2-bit Flag fields */ 1249 1250 case ACPI_DMT_FLAGS0: 1251 1252 AcpiOsPrintf ("%1.1X\n", *Target & 0x03); 1253 break; 1254 1255 case ACPI_DMT_FLAGS1: 1256 1257 AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03); 1258 break; 1259 1260 case ACPI_DMT_FLAGS2: 1261 1262 AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03); 1263 break; 1264 1265 case ACPI_DMT_FLAGS8_2: 1266 1267 AcpiOsPrintf ("%2.2X\n", (*Target >> 2) & 0xFF); 1268 break; 1269 1270 case ACPI_DMT_FLAGS4: 1271 1272 AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03); 1273 break; 1274 1275 case ACPI_DMT_FLAGS4_0: 1276 1277 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target) & 0x0F); 1278 break; 1279 1280 case ACPI_DMT_FLAGS4_4: 1281 1282 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 4) & 0x0F); 1283 break; 1284 1285 case ACPI_DMT_FLAGS4_8: 1286 1287 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 8) & 0x0F); 1288 break; 1289 1290 case ACPI_DMT_FLAGS4_12: 1291 1292 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 12) & 0x0F); 1293 break; 1294 1295 case ACPI_DMT_FLAGS16_16: 1296 1297 AcpiOsPrintf ("%4.4X\n", (*(UINT32 *)Target >> 16) & 0xFFFF); 1298 break; 1299 1300 /* Integer Data Types */ 1301 1302 case ACPI_DMT_UINT8: 1303 case ACPI_DMT_UINT16: 1304 case ACPI_DMT_UINT24: 1305 case ACPI_DMT_UINT32: 1306 case ACPI_DMT_UINT40: 1307 case ACPI_DMT_UINT48: 1308 case ACPI_DMT_UINT56: 1309 case ACPI_DMT_UINT64: 1310 /* 1311 * Dump bytes - high byte first, low byte last. 1312 * Note: All ACPI tables are little-endian. 1313 */ 1314 Value = 0; 1315 for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--) 1316 { 1317 AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]); 1318 Value |= Target[Temp8 - 1]; 1319 Value <<= 8; 1320 } 1321 1322 if (!Value && (Info->Flags & DT_DESCRIBES_OPTIONAL)) 1323 { 1324 AcpiOsPrintf (" [Optional field not present]"); 1325 } 1326 1327 AcpiOsPrintf ("\n"); 1328 break; 1329 1330 case ACPI_DMT_BUF7: 1331 case ACPI_DMT_BUF10: 1332 case ACPI_DMT_BUF12: 1333 case ACPI_DMT_BUF16: 1334 case ACPI_DMT_BUF18: 1335 case ACPI_DMT_BUF128: 1336 /* 1337 * Buffer: Size depends on the opcode and was set above. 1338 * Each hex byte is separated with a space. 1339 * Multiple lines are separated by line continuation char. 1340 */ 1341 for (Temp16 = 0; Temp16 < ByteLength; Temp16++) 1342 { 1343 AcpiOsPrintf ("%2.2X", Target[Temp16]); 1344 if ((UINT32) (Temp16 + 1) < ByteLength) 1345 { 1346 if ((Temp16 > 0) && (!((Temp16+1) % 16))) 1347 { 1348 AcpiOsPrintf (" \\\n"); /* Line continuation */ 1349 AcpiDmLineHeader (0, 0, NULL); 1350 } 1351 else 1352 { 1353 AcpiOsPrintf (" "); 1354 } 1355 } 1356 } 1357 1358 AcpiOsPrintf ("\n"); 1359 break; 1360 1361 case ACPI_DMT_UUID: 1362 1363 /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */ 1364 1365 (void) AcpiUtConvertUuidToString ((char *) Target, AslGbl_MsgBuffer); 1366 1367 AcpiOsPrintf ("%s\n", AslGbl_MsgBuffer); 1368 break; 1369 1370 case ACPI_DMT_STRING: 1371 1372 AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target)); 1373 break; 1374 1375 case ACPI_DMT_IVRS_UNTERMINATED_STRING: 1376 1377 AcpiOsPrintf ("\"%.*s\"\n", ByteLength, ACPI_CAST_PTR (char, Target)); 1378 break; 1379 1380 /* Fixed length ASCII name fields */ 1381 1382 case ACPI_DMT_SIG: 1383 1384 AcpiUtCheckAndRepairAscii (Target, RepairedName, 4); 1385 AcpiOsPrintf ("\"%.4s\" ", RepairedName); 1386 1387 TableData = AcpiAhGetTableInfo (ACPI_CAST_PTR (char, Target)); 1388 if (TableData) 1389 { 1390 AcpiOsPrintf (STRING_FORMAT, TableData->Description); 1391 } 1392 else 1393 { 1394 AcpiOsPrintf ("\n"); 1395 } 1396 break; 1397 1398 case ACPI_DMT_NAME4: 1399 1400 AcpiUtCheckAndRepairAscii (Target, RepairedName, 4); 1401 AcpiOsPrintf ("\"%.4s\"\n", RepairedName); 1402 break; 1403 1404 case ACPI_DMT_NAME6: 1405 1406 AcpiUtCheckAndRepairAscii (Target, RepairedName, 6); 1407 AcpiOsPrintf ("\"%.6s\"\n", RepairedName); 1408 break; 1409 1410 case ACPI_DMT_NAME8: 1411 1412 AcpiUtCheckAndRepairAscii (Target, RepairedName, 8); 1413 AcpiOsPrintf ("\"%.8s\"\n", RepairedName); 1414 break; 1415 1416 /* Special Data Types */ 1417 1418 case ACPI_DMT_CHKSUM: 1419 1420 /* Checksum, display and validate */ 1421 1422 AcpiOsPrintf ("%2.2X", *Target); 1423 Temp8 = AcpiUtGenerateChecksum (Table, 1424 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, 1425 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum); 1426 1427 if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum) 1428 { 1429 AcpiOsPrintf ( 1430 " /* Incorrect checksum, should be %2.2X */", Temp8); 1431 } 1432 1433 AcpiOsPrintf ("\n"); 1434 break; 1435 1436 case ACPI_DMT_SPACEID: 1437 1438 /* Address Space ID */ 1439 1440 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target)); 1441 break; 1442 1443 case ACPI_DMT_ACCWIDTH: 1444 1445 /* Encoded Access Width */ 1446 1447 Temp8 = *Target; 1448 if (Temp8 > ACPI_GAS_WIDTH_RESERVED) 1449 { 1450 Temp8 = ACPI_GAS_WIDTH_RESERVED; 1451 } 1452 1453 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmGasAccessWidth[Temp8]); 1454 break; 1455 1456 case ACPI_DMT_GAS: 1457 1458 /* Generic Address Structure */ 1459 1460 AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure"); 1461 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target, 1462 sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas); 1463 if (ACPI_FAILURE (Status)) 1464 { 1465 return (Status); 1466 } 1467 1468 AcpiOsPrintf ("\n"); 1469 LastOutputBlankLine = TRUE; 1470 break; 1471 1472 case ACPI_DMT_AEST: 1473 1474 /* AEST subtable types */ 1475 1476 Temp8 = *Target; 1477 if (Temp8 > ACPI_AEST_NODE_TYPE_RESERVED) 1478 { 1479 Temp8 = ACPI_AEST_NODE_TYPE_RESERVED; 1480 } 1481 1482 AcpiOsPrintf (UINT8_FORMAT, *Target, 1483 AcpiDmAestSubnames[Temp8]); 1484 break; 1485 1486 case ACPI_DMT_AEST_CACHE: 1487 1488 /* AEST cache resource subtable */ 1489 1490 Temp32 = *Target; 1491 if (Temp32 > ACPI_AEST_CACHE_RESERVED) 1492 { 1493 Temp32 = ACPI_AEST_CACHE_RESERVED; 1494 } 1495 1496 AcpiOsPrintf (UINT32_FORMAT, *Target, 1497 AcpiDmAestCacheNames[Temp32]); 1498 break; 1499 1500 case ACPI_DMT_AEST_GIC: 1501 1502 /* AEST GIC error subtable */ 1503 1504 Temp32 = *Target; 1505 if (Temp32 > ACPI_AEST_GIC_RESERVED) 1506 { 1507 Temp32 = ACPI_AEST_GIC_RESERVED; 1508 } 1509 1510 AcpiOsPrintf (UINT32_FORMAT, *Target, 1511 AcpiDmAestGicNames[Temp32]); 1512 break; 1513 1514 case ACPI_DMT_AEST_RES: 1515 1516 /* AEST resource type subtable */ 1517 1518 Temp8 = *Target; 1519 if (Temp8 > ACPI_AEST_RESOURCE_RESERVED) 1520 { 1521 Temp8 = ACPI_AEST_RESOURCE_RESERVED; 1522 } 1523 1524 AcpiOsPrintf (UINT8_FORMAT, *Target, 1525 AcpiDmAestResourceNames[Temp8]); 1526 break; 1527 1528 case ACPI_DMT_AEST_XFACE: 1529 1530 /* AEST interface structure types */ 1531 1532 Temp8 = *Target; 1533 if (Temp8 > ACPI_AEST_XFACE_RESERVED) 1534 { 1535 Temp8 = ACPI_AEST_XFACE_RESERVED; 1536 } 1537 1538 AcpiOsPrintf (UINT8_FORMAT, *Target, 1539 AcpiDmAestXfaceNames[Temp8]); 1540 break; 1541 1542 case ACPI_DMT_AEST_XRUPT: 1543 1544 /* AEST interrupt structure types */ 1545 1546 Temp8 = *Target; 1547 if (Temp8 > ACPI_AEST_XRUPT_RESERVED) 1548 { 1549 Temp8 = ACPI_AEST_XRUPT_RESERVED; 1550 } 1551 1552 AcpiOsPrintf (UINT8_FORMAT, *Target, 1553 AcpiDmAestXruptNames[Temp8]); 1554 break; 1555 1556 case ACPI_DMT_ASF: 1557 1558 /* ASF subtable types */ 1559 1560 Temp16 = (UINT16) ((*Target) & 0x7F); /* Top bit can be zero or one */ 1561 if (Temp16 > ACPI_ASF_TYPE_RESERVED) 1562 { 1563 Temp16 = ACPI_ASF_TYPE_RESERVED; 1564 } 1565 1566 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]); 1567 break; 1568 1569 case ACPI_DMT_CDAT: 1570 1571 /* CDAT subtable types */ 1572 1573 Temp8 = *Target; 1574 if (Temp8 > ACPI_CDAT_TYPE_RESERVED) 1575 { 1576 Temp8 = ACPI_CDAT_TYPE_RESERVED; 1577 } 1578 1579 AcpiOsPrintf (UINT8_FORMAT, *Target, 1580 AcpiDmCdatSubnames[Temp8]); 1581 break; 1582 1583 case ACPI_DMT_CEDT: 1584 1585 /* CEDT subtable types */ 1586 1587 Temp8 = *Target; 1588 if (Temp8 > ACPI_CEDT_TYPE_RESERVED) 1589 { 1590 Temp8 = ACPI_CEDT_TYPE_RESERVED; 1591 } 1592 1593 AcpiOsPrintf (UINT8_FORMAT, *Target, 1594 AcpiDmCedtSubnames[Temp8]); 1595 break; 1596 1597 case ACPI_DMT_DMAR: 1598 1599 /* DMAR subtable types */ 1600 1601 Temp16 = ACPI_GET16 (Target); 1602 if (Temp16 > ACPI_DMAR_TYPE_RESERVED) 1603 { 1604 Temp16 = ACPI_DMAR_TYPE_RESERVED; 1605 } 1606 1607 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), 1608 AcpiDmDmarSubnames[Temp16]); 1609 break; 1610 1611 case ACPI_DMT_DMAR_SCOPE: 1612 1613 /* DMAR device scope types */ 1614 1615 Temp8 = *Target; 1616 if (Temp8 > ACPI_DMAR_SCOPE_TYPE_RESERVED) 1617 { 1618 Temp8 = ACPI_DMAR_SCOPE_TYPE_RESERVED; 1619 } 1620 1621 AcpiOsPrintf (UINT8_FORMAT, *Target, 1622 AcpiDmDmarScope[Temp8]); 1623 break; 1624 1625 case ACPI_DMT_EINJACT: 1626 1627 /* EINJ Action types */ 1628 1629 Temp8 = *Target; 1630 if (Temp8 > ACPI_EINJ_ACTION_RESERVED) 1631 { 1632 Temp8 = ACPI_EINJ_ACTION_RESERVED; 1633 } 1634 1635 AcpiOsPrintf (UINT8_FORMAT, *Target, 1636 AcpiDmEinjActions[Temp8]); 1637 break; 1638 1639 case ACPI_DMT_EINJINST: 1640 1641 /* EINJ Instruction types */ 1642 1643 Temp8 = *Target; 1644 if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED) 1645 { 1646 Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED; 1647 } 1648 1649 AcpiOsPrintf (UINT8_FORMAT, *Target, 1650 AcpiDmEinjInstructions[Temp8]); 1651 break; 1652 1653 case ACPI_DMT_ERSTACT: 1654 1655 /* ERST Action types */ 1656 1657 Temp8 = *Target; 1658 if (Temp8 > ACPI_ERST_ACTION_RESERVED) 1659 { 1660 Temp8 = ACPI_ERST_ACTION_RESERVED; 1661 } 1662 1663 AcpiOsPrintf (UINT8_FORMAT, *Target, 1664 AcpiDmErstActions[Temp8]); 1665 break; 1666 1667 case ACPI_DMT_ERSTINST: 1668 1669 /* ERST Instruction types */ 1670 1671 Temp8 = *Target; 1672 if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED) 1673 { 1674 Temp8 = ACPI_ERST_INSTRUCTION_RESERVED; 1675 } 1676 1677 AcpiOsPrintf (UINT8_FORMAT, *Target, 1678 AcpiDmErstInstructions[Temp8]); 1679 break; 1680 1681 case ACPI_DMT_GTDT: 1682 1683 /* GTDT subtable types */ 1684 1685 Temp8 = *Target; 1686 if (Temp8 > ACPI_GTDT_TYPE_RESERVED) 1687 { 1688 Temp8 = ACPI_GTDT_TYPE_RESERVED; 1689 } 1690 1691 AcpiOsPrintf (UINT8_FORMAT, *Target, 1692 AcpiDmGtdtSubnames[Temp8]); 1693 break; 1694 1695 case ACPI_DMT_HEST: 1696 1697 /* HEST subtable types */ 1698 1699 Temp16 = ACPI_GET16 (Target); 1700 if (Temp16 > ACPI_HEST_TYPE_RESERVED) 1701 { 1702 Temp16 = ACPI_HEST_TYPE_RESERVED; 1703 } 1704 1705 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), 1706 AcpiDmHestSubnames[Temp16]); 1707 break; 1708 1709 case ACPI_DMT_HESTNTFY: 1710 1711 AcpiOsPrintf (STRING_FORMAT, 1712 "Hardware Error Notification Structure"); 1713 1714 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target, 1715 sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify); 1716 if (ACPI_FAILURE (Status)) 1717 { 1718 return (Status); 1719 } 1720 1721 AcpiOsPrintf ("\n"); 1722 LastOutputBlankLine = TRUE; 1723 break; 1724 1725 case ACPI_DMT_HESTNTYP: 1726 1727 /* HEST Notify types */ 1728 1729 Temp8 = *Target; 1730 if (Temp8 > ACPI_HEST_NOTIFY_RESERVED) 1731 { 1732 Temp8 = ACPI_HEST_NOTIFY_RESERVED; 1733 } 1734 1735 AcpiOsPrintf (UINT8_FORMAT, *Target, 1736 AcpiDmHestNotifySubnames[Temp8]); 1737 break; 1738 1739 case ACPI_DMT_HMAT: 1740 1741 /* HMAT subtable types */ 1742 1743 Temp16 = *Target; 1744 if (Temp16 > ACPI_HMAT_TYPE_RESERVED) 1745 { 1746 Temp16 = ACPI_HMAT_TYPE_RESERVED; 1747 } 1748 1749 AcpiOsPrintf (UINT16_FORMAT, *Target, 1750 AcpiDmHmatSubnames[Temp16]); 1751 break; 1752 1753 case ACPI_DMT_IORTMEM: 1754 1755 AcpiOsPrintf (STRING_FORMAT, 1756 "IORT Memory Access Properties"); 1757 1758 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target, 1759 sizeof (ACPI_IORT_MEMORY_ACCESS), AcpiDmTableInfoIortAcc); 1760 if (ACPI_FAILURE (Status)) 1761 { 1762 return (Status); 1763 } 1764 1765 LastOutputBlankLine = TRUE; 1766 break; 1767 1768 case ACPI_DMT_MADT: 1769 1770 /* MADT subtable types */ 1771 1772 Temp8 = *Target; 1773 if ((Temp8 >= ACPI_MADT_TYPE_RESERVED) && (Temp8 < ACPI_MADT_TYPE_OEM_RESERVED)) 1774 { 1775 Temp8 = ACPI_MADT_TYPE_RESERVED; 1776 } 1777 else if (Temp8 >= ACPI_MADT_TYPE_OEM_RESERVED) 1778 { 1779 Temp8 = ACPI_MADT_TYPE_RESERVED + 1; 1780 } 1781 AcpiOsPrintf (UINT8_FORMAT, *Target, 1782 AcpiDmMadtSubnames[Temp8]); 1783 break; 1784 1785 case ACPI_DMT_NFIT: 1786 1787 /* NFIT subtable types */ 1788 1789 Temp16 = ACPI_GET16 (Target); 1790 if (Temp16 > ACPI_NFIT_TYPE_RESERVED) 1791 { 1792 Temp16 = ACPI_NFIT_TYPE_RESERVED; 1793 } 1794 1795 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), 1796 AcpiDmNfitSubnames[Temp16]); 1797 break; 1798 1799 case ACPI_DMT_NHLT1: 1800 1801 /* NHLT link types */ 1802 1803 Temp8 = *Target; 1804 if (Temp8 > ACPI_NHLT_TYPE_RESERVED) 1805 { 1806 Temp8 = ACPI_NHLT_TYPE_RESERVED; 1807 } 1808 1809 AcpiOsPrintf (UINT8_FORMAT, *Target, 1810 AcpiDmNhltLinkTypeNames[Temp8]); 1811 break; 1812 1813 case ACPI_DMT_NHLT1a: 1814 1815 /* NHLT direction */ 1816 1817 Temp8 = *Target; 1818 if (Temp8 > ACPI_NHLT_DIR_RESERVED) 1819 { 1820 Temp8 = ACPI_NHLT_DIR_RESERVED; 1821 } 1822 1823 AcpiOsPrintf (UINT8_FORMAT, *Target, 1824 AcpiDmNhltDirectionNames[Temp8]); 1825 break; 1826 1827 case ACPI_DMT_NHLT1b: 1828 1829 /* NHLT microphone type */ 1830 1831 Temp8 = *Target; 1832 if (Temp8 > ACPI_NHLT_MIC_RESERVED) 1833 { 1834 Temp8 = ACPI_NHLT_MIC_RESERVED; 1835 } 1836 1837 AcpiOsPrintf (UINT8_FORMAT, *Target, 1838 AcpiDmNhltMicTypeNames[Temp8]); 1839 break; 1840 1841 case ACPI_DMT_NHLT1c: 1842 1843 /* NHLT microphone position */ 1844 1845 Temp8 = *Target; 1846 if (Temp8 > ACPI_NHLT_MIC_POSITION_RESERVED) 1847 { 1848 Temp8 = ACPI_NHLT_MIC_POSITION_RESERVED; 1849 } 1850 1851 AcpiOsPrintf (UINT8_FORMAT, *Target, 1852 AcpiDmNhltMicPositionNames[Temp8]); 1853 break; 1854 1855 case ACPI_DMT_NHLT1d: 1856 1857 /* NHLT microphone array type */ 1858 1859 Temp8 = *Target & ACPI_NHLT_ARRAY_TYPE_MASK; 1860 if (Temp8 < ACPI_NHLT_ARRAY_TYPE_RESERVED) 1861 { 1862 Temp8 = ACPI_NHLT_ARRAY_TYPE_RESERVED; 1863 } 1864 1865 AcpiOsPrintf (UINT8_FORMAT_NO_NEWLINE, *Target, 1866 AcpiDmNhltMicArrayTypeNames[Temp8 - ACPI_NHLT_ARRAY_TYPE_RESERVED]); 1867 1868 Temp8 = *Target; 1869 if (Temp8 & ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT) 1870 { 1871 AcpiOsPrintf (" [%s]", "SNR and Sensitivity"); 1872 } 1873 1874 AcpiOsPrintf ("\n"); 1875 break; 1876 1877 case ACPI_DMT_NHLT1e: 1878 1879 /* NHLT Endpoint Device ID */ 1880 1881 Temp16 = ACPI_GET16 (Target); 1882 if (Temp16 == 0xAE20) 1883 { 1884 Name = "PDM DMIC"; 1885 } 1886 else if (Temp16 == 0xAE30) 1887 { 1888 Name = "BT Sideband"; 1889 } 1890 else if (Temp16 == 0xAE34) 1891 { 1892 Name = "I2S/TDM Codecs"; 1893 } 1894 else 1895 { 1896 Name = "Unknown Device ID"; 1897 } 1898 1899 AcpiOsPrintf (UINT16_FORMAT, Temp16, Name); 1900 break; 1901 1902 case ACPI_DMT_NHLT1f: 1903 1904 /* NHLT ConfigType field */ 1905 1906 Temp8 = *Target; 1907 if (Temp8 > ACPI_NHLT_CONFIG_TYPE_RESERVED) 1908 { 1909 Temp8 = ACPI_NHLT_CONFIG_TYPE_RESERVED; 1910 } 1911 1912 AcpiOsPrintf (UINT8_FORMAT, *Target, 1913 AcpiDmNhltConfigTypeNames[Temp8]); 1914 break; 1915 1916 case ACPI_DMT_PCCT: 1917 1918 /* PCCT subtable types */ 1919 1920 Temp8 = *Target; 1921 if (Temp8 > ACPI_PCCT_TYPE_RESERVED) 1922 { 1923 Temp8 = ACPI_PCCT_TYPE_RESERVED; 1924 } 1925 1926 AcpiOsPrintf (UINT8_FORMAT, *Target, 1927 AcpiDmPcctSubnames[Temp8]); 1928 break; 1929 1930 case ACPI_DMT_PHAT: 1931 1932 /* PHAT subtable types */ 1933 1934 Temp16 = ACPI_GET16 (Target); 1935 if (Temp16 > ACPI_PHAT_TYPE_RESERVED) 1936 { 1937 Temp16 = ACPI_PHAT_TYPE_RESERVED; 1938 } 1939 1940 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), 1941 AcpiDmPhatSubnames[Temp16]); 1942 break; 1943 1944 case ACPI_DMT_PMTT: 1945 1946 /* PMTT subtable types */ 1947 1948 Temp8 = *Target; 1949 if (Temp8 == ACPI_PMTT_TYPE_VENDOR) 1950 { 1951 Temp8 = ACPI_PMTT_TYPE_RESERVED + 1; 1952 } 1953 else if (Temp8 > ACPI_PMTT_TYPE_RESERVED) 1954 { 1955 Temp8 = ACPI_PMTT_TYPE_RESERVED; 1956 } 1957 AcpiOsPrintf (UINT8_FORMAT, *Target, 1958 AcpiDmPmttSubnames[Temp8]); 1959 break; 1960 1961 case ACPI_DMT_PPTT: 1962 1963 /* PPTT subtable types */ 1964 1965 Temp8 = *Target; 1966 if (Temp8 > ACPI_PPTT_TYPE_RESERVED) 1967 { 1968 Temp8 = ACPI_PPTT_TYPE_RESERVED; 1969 } 1970 1971 AcpiOsPrintf (UINT8_FORMAT, *Target, 1972 AcpiDmPpttSubnames[Temp8]); 1973 break; 1974 1975 case ACPI_DMT_UNICODE: 1976 case ACPI_DMT_WPBT_UNICODE: 1977 1978 if (ByteLength == 0) 1979 { 1980 AcpiOsPrintf ("/* Zero-length Data */\n"); 1981 break; 1982 } 1983 1984 AcpiDmDumpUnicode (Table, 0, ByteLength); 1985 break; 1986 1987 case ACPI_DMT_RAW_BUFFER: 1988 case ACPI_DMT_BUFFER: 1989 case ACPI_DMT_PMTT_VENDOR: 1990 1991 if (ByteLength == 0) 1992 { 1993 AcpiOsPrintf ("/* Zero-length Data */\n"); 1994 break; 1995 } 1996 1997 AcpiDmDumpBuffer (Target, 0, ByteLength, CurrentOffset, NULL); 1998 break; 1999 2000 case ACPI_DMT_RGRT: 2001 2002 /* RGRT subtable types */ 2003 2004 Temp8 = *Target; 2005 if (Temp8 >= ACPI_RGRT_TYPE_RESERVED) 2006 { 2007 Temp8 = ACPI_RGRT_TYPE_RESERVED0; 2008 } 2009 2010 AcpiOsPrintf (UINT8_FORMAT, *Target, 2011 AcpiDmRgrtSubnames[Temp8]); 2012 break; 2013 2014 case ACPI_DMT_SDEV: 2015 2016 /* SDEV subtable types */ 2017 2018 Temp8 = *Target; 2019 if (Temp8 > ACPI_SDEV_TYPE_RESERVED) 2020 { 2021 Temp8 = ACPI_SDEV_TYPE_RESERVED; 2022 } 2023 2024 AcpiOsPrintf (UINT8_FORMAT, *Target, 2025 AcpiDmSdevSubnames[Temp8]); 2026 break; 2027 2028 case ACPI_DMT_SRAT: 2029 2030 /* SRAT subtable types */ 2031 2032 Temp8 = *Target; 2033 if (Temp8 > ACPI_SRAT_TYPE_RESERVED) 2034 { 2035 Temp8 = ACPI_SRAT_TYPE_RESERVED; 2036 } 2037 2038 AcpiOsPrintf (UINT8_FORMAT, *Target, 2039 AcpiDmSratSubnames[Temp8]); 2040 break; 2041 2042 case ACPI_DMT_TPM2: 2043 2044 /* TPM2 Start Method types */ 2045 2046 Temp8 = *Target; 2047 if (Temp8 > ACPI_TPM2_RESERVED) 2048 { 2049 Temp8 = ACPI_TPM2_RESERVED; 2050 } 2051 2052 AcpiOsPrintf (UINT8_FORMAT, *Target, 2053 AcpiDmTpm2Subnames[Temp8]); 2054 break; 2055 2056 2057 case ACPI_DMT_FADTPM: 2058 2059 /* FADT Preferred PM Profile names */ 2060 2061 Temp8 = *Target; 2062 if (Temp8 > ACPI_FADT_PM_RESERVED) 2063 { 2064 Temp8 = ACPI_FADT_PM_RESERVED; 2065 } 2066 2067 AcpiOsPrintf (UINT8_FORMAT, *Target, 2068 AcpiDmFadtProfiles[Temp8]); 2069 break; 2070 2071 case ACPI_DMT_IVRS: 2072 2073 /* IVRS subtable types */ 2074 2075 Temp8 = *Target; 2076 switch (Temp8) 2077 { 2078 case ACPI_IVRS_TYPE_HARDWARE1: 2079 case ACPI_IVRS_TYPE_HARDWARE2: 2080 2081 Name = AcpiDmIvrsSubnames[0]; 2082 break; 2083 2084 case ACPI_IVRS_TYPE_HARDWARE3: 2085 2086 Name = AcpiDmIvrsSubnames[1]; 2087 break; 2088 2089 case ACPI_IVRS_TYPE_MEMORY1: 2090 case ACPI_IVRS_TYPE_MEMORY2: 2091 case ACPI_IVRS_TYPE_MEMORY3: 2092 2093 Name = AcpiDmIvrsSubnames[2]; 2094 break; 2095 2096 default: 2097 2098 Name = AcpiDmIvrsSubnames[3]; 2099 break; 2100 } 2101 2102 AcpiOsPrintf (UINT8_FORMAT, *Target, Name); 2103 break; 2104 2105 case ACPI_DMT_IVRS_DE: 2106 2107 /* IVRS device entry types */ 2108 2109 Temp8 = *Target; 2110 switch (Temp8) 2111 { 2112 case ACPI_IVRS_TYPE_ALL: 2113 case ACPI_IVRS_TYPE_SELECT: 2114 case ACPI_IVRS_TYPE_START: 2115 case ACPI_IVRS_TYPE_END: 2116 2117 Name = AcpiDmIvrsDevEntryNames[Temp8]; 2118 break; 2119 2120 case ACPI_IVRS_TYPE_ALIAS_SELECT: 2121 case ACPI_IVRS_TYPE_ALIAS_START: 2122 case ACPI_IVRS_TYPE_EXT_SELECT: 2123 case ACPI_IVRS_TYPE_EXT_START: 2124 case ACPI_IVRS_TYPE_SPECIAL: 2125 2126 Name = AcpiDmIvrsDevEntryNames[Temp8 - 61]; 2127 break; 2128 2129 case ACPI_IVRS_TYPE_HID: 2130 2131 Name = AcpiDmIvrsDevEntryNames[Temp8 - 228]; 2132 break; 2133 2134 default: 2135 Name = AcpiDmIvrsDevEntryNames[0]; /* Unknown/Reserved */ 2136 break; 2137 } 2138 2139 AcpiOsPrintf (UINT8_FORMAT, *Target, Name); 2140 break; 2141 2142 case ACPI_DMT_LPIT: 2143 2144 /* LPIT subtable types */ 2145 2146 Temp32 = ACPI_GET32 (Target); 2147 if (Temp32 > ACPI_LPIT_TYPE_RESERVED) 2148 { 2149 Temp32 = ACPI_LPIT_TYPE_RESERVED; 2150 } 2151 2152 AcpiOsPrintf (UINT32_FORMAT, ACPI_GET32 (Target), 2153 AcpiDmLpitSubnames[Temp32]); 2154 break; 2155 2156 case ACPI_DMT_VIOT: 2157 2158 /* VIOT subtable types */ 2159 2160 Temp8 = *Target; 2161 if (Temp8 > ACPI_VIOT_RESERVED) 2162 { 2163 Temp8 = ACPI_VIOT_RESERVED; 2164 } 2165 2166 AcpiOsPrintf (UINT8_FORMAT, *Target, 2167 AcpiDmViotSubnames[Temp8]); 2168 break; 2169 2170 case ACPI_DMT_EXIT: 2171 2172 return (AE_OK); 2173 2174 default: 2175 2176 ACPI_ERROR ((AE_INFO, 2177 "**** Invalid table opcode [0x%X] ****\n", Info->Opcode)); 2178 return (AE_SUPPORT); 2179 } 2180 } 2181 2182 if (TableOffset && !SubtableLength) 2183 { 2184 /* 2185 * If this table is not the main table, the subtable must have a 2186 * valid length 2187 */ 2188 AcpiOsPrintf ("Invalid zero length subtable\n"); 2189 return (AE_BAD_DATA); 2190 } 2191 2192 return (AE_OK); 2193 } 2194