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