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