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