Home | History | Annotate | Line # | Download | only in common
dmtable.c revision 1.1.1.24
      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 
     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           *AcpiDmAsptSubnames[] =
    130 {
    131     "ASPT Global Registers",
    132     "ASPT SEV Mailbox Registers",
    133     "ASPT ACPI Mailbox Registers",
    134     "Unknown Subtable Type"         /* Reserved */
    135 };
    136 
    137 static 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 
    148 static const char           *AcpiDmCedtSubnames[] =
    149 {
    150     "CXL Host Bridge Structure",
    151     "CXL Fixed Memory Window Structure",
    152     "Unknown Subtable Type"         /* Reserved */
    153 };
    154 
    155 static 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 
    166 static 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 
    177 static 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 
    192 static 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 
    203 static 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 
    225 static 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 
    249 static const char           *AcpiDmGtdtSubnames[] =
    250 {
    251     "Generic Timer Block",
    252     "Generic Watchdog Timer",
    253     "Unknown Subtable Type"         /* Reserved */
    254 };
    255 
    256 static 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 
    273 static 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 
    290 static 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 
    298 static 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 
    332 static 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 
    343 static 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 
    356 static 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 
    367 static 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 
    376 static 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 
    389 static 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 
    400 static 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 
    411 static 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 
    420 static 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 
    431 static 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 
    438 static 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 
    447 static 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 
    455 static const char           *AcpiDmRgrtSubnames[] =
    456 {
    457     "Unknown/Reserved Image Type",  /* ACPI_RGRT_TYPE_RESERVED0 */
    458     "Type PNG"                      /* ACPI_RGRT_IMAGE_TYPE_PNG */
    459 };
    460 
    461 static 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 
    468 static 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 
    480 static 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 
    497 static 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 
    505 static 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 
    523 static const char           *AcpiDmLpitSubnames[] =
    524 {
    525     "Native C-state Idle Structure",
    526     "Unknown Subtable Type"         /* Reserved */
    527 };
    528 
    529 static 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 
    541 static 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 
    557 static 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 
    567 static 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 
    592 const 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 
    683 const ACPI_DMTABLE_DATA *
    684 AcpiDmGetTableData (
    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 
    715 void
    716 AcpiDmDumpDataTable (
    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 
    874 void
    875 AcpiDmLineHeader (
    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 
    927 void
    928 AcpiDmLineHeader2 (
    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 
    983 ACPI_STATUS
    984 AcpiDmDumpTable (
    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