Home | History | Annotate | Line # | Download | only in common
dmtbdump1.c revision 1.1.1.8
      1 /******************************************************************************
      2  *
      3  * Module Name: dmtbdump1 - Dump ACPI data 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 
     49 /* This module used for application-level code only */
     50 
     51 #define _COMPONENT          ACPI_CA_DISASSEMBLER
     52         ACPI_MODULE_NAME    ("dmtbdump1")
     53 
     54 
     55 /*******************************************************************************
     56  *
     57  * FUNCTION:    AcpiDmDumpAest
     58  *
     59  * PARAMETERS:  Table               - A AEST table
     60  *
     61  * RETURN:      None
     62  *
     63  * DESCRIPTION: Format the contents of a AEST table
     64  *
     65  * NOTE: Assumes the following table structure:
     66  *      For all AEST Error Nodes:
     67  *          1) An AEST Error Node, followed immediately by:
     68  *          2) Any node-specific data
     69  *          3) An Interface Structure (one)
     70  *          4) A list (array) of Interrupt Structures
     71  *
     72  * AEST - ARM Error Source table. Conforms to:
     73  * ACPI for the Armv8 RAS Extensions 1.1 Platform Design Document Sep 2020
     74  *
     75  ******************************************************************************/
     76 
     77 void
     78 AcpiDmDumpAest (
     79     ACPI_TABLE_HEADER       *Table)
     80 {
     81     ACPI_STATUS             Status;
     82     UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
     83     ACPI_AEST_HEADER        *Subtable;
     84     ACPI_AEST_HEADER        *NodeHeader;
     85     ACPI_AEST_PROCESSOR     *ProcessorSubtable;
     86     ACPI_DMTABLE_INFO       *InfoTable;
     87     ACPI_SIZE               Length;
     88     UINT8                   Type;
     89 
     90 
     91     /* Very small, generic main table. AEST consists of mostly subtables */
     92 
     93     while (Offset < Table->Length)
     94     {
     95         NodeHeader = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
     96 
     97         /* Dump the common error node (subtable) header */
     98 
     99         Status = AcpiDmDumpTable (Table->Length, Offset, NodeHeader,
    100             NodeHeader->Length, AcpiDmTableInfoAestHdr);
    101         if (ACPI_FAILURE (Status))
    102         {
    103             return;
    104         }
    105 
    106         Type = NodeHeader->Type;
    107 
    108         /* Setup the node-specific subtable based on the header Type field */
    109 
    110         switch (Type)
    111         {
    112         case ACPI_AEST_PROCESSOR_ERROR_NODE:
    113             InfoTable = AcpiDmTableInfoAestProcError;
    114             Length = sizeof (ACPI_AEST_PROCESSOR);
    115             break;
    116 
    117         case ACPI_AEST_MEMORY_ERROR_NODE:
    118             InfoTable = AcpiDmTableInfoAestMemError;
    119             Length = sizeof (ACPI_AEST_MEMORY);
    120             break;
    121 
    122         case ACPI_AEST_SMMU_ERROR_NODE:
    123             InfoTable = AcpiDmTableInfoAestSmmuError;
    124             Length = sizeof (ACPI_AEST_SMMU);
    125             break;
    126 
    127         case ACPI_AEST_VENDOR_ERROR_NODE:
    128             InfoTable = AcpiDmTableInfoAestVendorError;
    129             Length = sizeof (ACPI_AEST_VENDOR);
    130             break;
    131 
    132         case ACPI_AEST_GIC_ERROR_NODE:
    133             InfoTable = AcpiDmTableInfoAestGicError;
    134             Length = sizeof (ACPI_AEST_GIC);
    135             break;
    136 
    137         /* Error case below */
    138         default:
    139 
    140             AcpiOsPrintf ("\n**** Unknown AEST Error Subtable type 0x%X\n",
    141                 Type);
    142             return;
    143         }
    144 
    145         /* Point past the common header (to the node-specific data) */
    146 
    147         Offset += sizeof (ACPI_AEST_HEADER);
    148         Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
    149         AcpiOsPrintf ("\n");
    150 
    151         /* Dump the node-specific subtable */
    152 
    153         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length,
    154             InfoTable);
    155         if (ACPI_FAILURE (Status))
    156         {
    157             return;
    158         }
    159         AcpiOsPrintf ("\n");
    160 
    161         if (Type == ACPI_AEST_PROCESSOR_ERROR_NODE)
    162         {
    163             /*
    164              * Special handling for PROCESSOR_ERROR_NODE subtables
    165              * (to handle the Resource Substructure via the ResourceType
    166              * field).
    167              */
    168 
    169             /* Point past the node-specific data */
    170 
    171             Offset += Length;
    172             ProcessorSubtable = ACPI_CAST_PTR (ACPI_AEST_PROCESSOR, Subtable);
    173 
    174             switch (ProcessorSubtable->ResourceType)
    175             {
    176             /* Setup the Resource Substructure subtable */
    177 
    178             case ACPI_AEST_CACHE_RESOURCE:
    179                 InfoTable = AcpiDmTableInfoAestCacheRsrc;
    180                 Length = sizeof (ACPI_AEST_PROCESSOR_CACHE);
    181                 break;
    182 
    183             case ACPI_AEST_TLB_RESOURCE:
    184                 InfoTable = AcpiDmTableInfoAestTlbRsrc;
    185                 Length = sizeof (ACPI_AEST_PROCESSOR_TLB);
    186                 break;
    187 
    188             case ACPI_AEST_GENERIC_RESOURCE:
    189                 InfoTable = AcpiDmTableInfoAestGenRsrc;
    190                 Length = sizeof (ACPI_AEST_PROCESSOR_GENERIC);
    191                 break;
    192 
    193             /* Error case below */
    194             default:
    195                 AcpiOsPrintf ("\n**** Unknown AEST Processor Resource type 0x%X\n",
    196                     ProcessorSubtable->ResourceType);
    197                 return;
    198             }
    199 
    200             ProcessorSubtable = ACPI_ADD_PTR (ACPI_AEST_PROCESSOR, Table,
    201                 Offset);
    202 
    203             /* Dump the resource substructure subtable */
    204 
    205             Status = AcpiDmDumpTable (Table->Length, Offset, ProcessorSubtable,
    206                 Length, InfoTable);
    207             if (ACPI_FAILURE (Status))
    208             {
    209                 return;
    210             }
    211 
    212             AcpiOsPrintf ("\n");
    213         }
    214 
    215         /* Point past the resource substructure or the node-specific data */
    216 
    217         Offset += Length;
    218 
    219         /* Dump the interface structure, required to be present */
    220 
    221         Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
    222         if (Subtable->Type >= ACPI_AEST_XFACE_RESERVED)
    223         {
    224             AcpiOsPrintf ("\n**** Unknown AEST Node Interface type 0x%X\n",
    225                 Subtable->Type);
    226             return;
    227         }
    228 
    229         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
    230             sizeof (ACPI_AEST_NODE_INTERFACE), AcpiDmTableInfoAestXface);
    231         if (ACPI_FAILURE (Status))
    232         {
    233             return;
    234         }
    235 
    236         /* Point past the interface structure */
    237 
    238         AcpiOsPrintf ("\n");
    239         Offset += sizeof (ACPI_AEST_NODE_INTERFACE);
    240 
    241         /* Dump the entire interrupt structure array, if present */
    242 
    243         if (NodeHeader->NodeInterruptOffset)
    244         {
    245             Length = NodeHeader->NodeInterruptCount;
    246             Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
    247 
    248             while (Length)
    249             {
    250                 /* Dump the interrupt structure */
    251 
    252                 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
    253                     sizeof (ACPI_AEST_NODE_INTERRUPT),
    254                     AcpiDmTableInfoAestXrupt);
    255                 if (ACPI_FAILURE (Status))
    256                 {
    257                     return;
    258                 }
    259 
    260                 /* Point to the next interrupt structure */
    261 
    262                 Offset += sizeof (ACPI_AEST_NODE_INTERRUPT);
    263                 Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
    264                 Length--;
    265                 AcpiOsPrintf ("\n");
    266             }
    267         }
    268     }
    269 }
    270 
    271 /*******************************************************************************
    272  *
    273  * FUNCTION:    AcpiDmDumpApmt
    274  *
    275  * PARAMETERS:  Table               - A APMT table
    276  *
    277  * RETURN:      None
    278  *
    279  * DESCRIPTION: Format the contents of a APMT. This table type consists
    280  *              of an open-ended number of subtables.
    281  *
    282  *
    283  * APMT - ARM Performance Monitoring Unit table. Conforms to:
    284  * ARM Performance Monitoring Unit Architecture 1.0 Platform Design Document
    285  * ARM DEN0117 v1.0 November 25, 2021
    286  *
    287  ******************************************************************************/
    288 
    289 void
    290 AcpiDmDumpApmt (
    291     ACPI_TABLE_HEADER       *Table)
    292 {
    293     ACPI_STATUS              Status;
    294     ACPI_APMT_NODE           *Subtable;
    295     UINT32                   Length = Table->Length;
    296     UINT32                   Offset = sizeof (ACPI_TABLE_APMT);
    297     UINT32                   NodeNum = 0;
    298 
    299     /* There is no main table (other than the standard ACPI header) */
    300 
    301     /* Subtables */
    302 
    303     Subtable = ACPI_ADD_PTR (ACPI_APMT_NODE, Table, Offset);
    304     while (Offset < Table->Length)
    305     {
    306         AcpiOsPrintf ("\n");
    307 
    308         if (Subtable->Type >= ACPI_APMT_NODE_TYPE_COUNT)
    309         {
    310             AcpiOsPrintf ("\n**** Unknown APMT subtable type 0x%X\n",
    311                 Subtable->Type);
    312             return;
    313         }
    314 
    315         AcpiOsPrintf ("/* APMT Node-%u */\n", NodeNum++);
    316 
    317         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    318             Subtable->Length, AcpiDmTableInfoApmtNode);
    319         if (ACPI_FAILURE (Status))
    320         {
    321             return;
    322         }
    323 
    324         /* Point to next subtable */
    325 
    326         Offset += Subtable->Length;
    327         Subtable = ACPI_ADD_PTR (ACPI_APMT_NODE, Subtable,
    328             Subtable->Length);
    329         AcpiOsPrintf ("\n");
    330     }
    331 }
    332 
    333 
    334 /*******************************************************************************
    335  *
    336  * FUNCTION:    AcpiDmDumpAsf
    337  *
    338  * PARAMETERS:  Table               - A ASF table
    339  *
    340  * RETURN:      None
    341  *
    342  * DESCRIPTION: Format the contents of a ASF table
    343  *
    344  ******************************************************************************/
    345 
    346 void
    347 AcpiDmDumpAsf (
    348     ACPI_TABLE_HEADER       *Table)
    349 {
    350     ACPI_STATUS             Status;
    351     UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
    352     ACPI_ASF_INFO           *Subtable;
    353     ACPI_DMTABLE_INFO       *InfoTable;
    354     ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
    355     UINT8                   *DataTable = NULL;
    356     UINT32                  DataCount = 0;
    357     UINT32                  DataLength = 0;
    358     UINT32                  DataOffset = 0;
    359     UINT32                  i;
    360     UINT8                   Type;
    361 
    362 
    363     /* No main table, only subtables */
    364 
    365     Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
    366     while (Offset < Table->Length)
    367     {
    368         /* Common subtable header */
    369 
    370         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
    371             Subtable->Header.Length, AcpiDmTableInfoAsfHdr);
    372         if (ACPI_FAILURE (Status))
    373         {
    374             return;
    375         }
    376 
    377         /* The actual type is the lower 7 bits of Type */
    378 
    379         Type = (UINT8) (Subtable->Header.Type & 0x7F);
    380 
    381         switch (Type)
    382         {
    383         case ACPI_ASF_TYPE_INFO:
    384 
    385             InfoTable = AcpiDmTableInfoAsf0;
    386             break;
    387 
    388         case ACPI_ASF_TYPE_ALERT:
    389 
    390             InfoTable = AcpiDmTableInfoAsf1;
    391             DataInfoTable = AcpiDmTableInfoAsf1a;
    392             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ALERT));
    393             DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->Alerts;
    394             DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->DataLength;
    395             DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
    396             break;
    397 
    398         case ACPI_ASF_TYPE_CONTROL:
    399 
    400             InfoTable = AcpiDmTableInfoAsf2;
    401             DataInfoTable = AcpiDmTableInfoAsf2a;
    402             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_REMOTE));
    403             DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->Controls;
    404             DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->DataLength;
    405             DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
    406             break;
    407 
    408         case ACPI_ASF_TYPE_BOOT:
    409 
    410             InfoTable = AcpiDmTableInfoAsf3;
    411             break;
    412 
    413         case ACPI_ASF_TYPE_ADDRESS:
    414 
    415             InfoTable = AcpiDmTableInfoAsf4;
    416             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ADDRESS));
    417             DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, Subtable)->Devices;
    418             DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
    419             break;
    420 
    421         default:
    422 
    423             AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n",
    424                 Subtable->Header.Type);
    425             return;
    426         }
    427 
    428         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
    429             Subtable->Header.Length, InfoTable);
    430         if (ACPI_FAILURE (Status))
    431         {
    432             return;
    433         }
    434 
    435         /* Dump variable-length extra data */
    436 
    437         switch (Type)
    438         {
    439         case ACPI_ASF_TYPE_ALERT:
    440         case ACPI_ASF_TYPE_CONTROL:
    441 
    442             for (i = 0; i < DataCount; i++)
    443             {
    444                 AcpiOsPrintf ("\n");
    445                 Status = AcpiDmDumpTable (Table->Length, DataOffset,
    446                     DataTable, DataLength, DataInfoTable);
    447                 if (ACPI_FAILURE (Status))
    448                 {
    449                     return;
    450                 }
    451 
    452                 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
    453                 DataOffset += DataLength;
    454             }
    455             break;
    456 
    457         case ACPI_ASF_TYPE_ADDRESS:
    458 
    459             for (i = 0; i < DataLength; i++)
    460             {
    461                 if (!(i % 16))
    462                 {
    463                     AcpiDmLineHeader (DataOffset, 1, "Addresses");
    464                 }
    465 
    466                 AcpiOsPrintf ("%2.2X ", *DataTable);
    467                 DataTable++;
    468                 DataOffset++;
    469 
    470                 if (DataOffset > Table->Length)
    471                 {
    472                     AcpiOsPrintf (
    473                         "**** ACPI table terminates in the middle of a "
    474                         "data structure! (ASF! table)\n");
    475                     return;
    476                 }
    477             }
    478 
    479             AcpiOsPrintf ("\n");
    480             break;
    481 
    482         default:
    483 
    484             break;
    485         }
    486 
    487         AcpiOsPrintf ("\n");
    488 
    489         /* Point to next subtable */
    490 
    491         if (!Subtable->Header.Length)
    492         {
    493             AcpiOsPrintf ("Invalid zero subtable header length\n");
    494             return;
    495         }
    496 
    497         Offset += Subtable->Header.Length;
    498         Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Subtable,
    499             Subtable->Header.Length);
    500     }
    501 }
    502 
    503 /*******************************************************************************
    504  *
    505  * FUNCTION:    AcpiDmDumpCedt
    506  *
    507  * PARAMETERS:  Table               - A CEDT table
    508  *
    509  * RETURN:      None
    510  *
    511  * DESCRIPTION: Format the contents of a CEDT. This table type consists
    512  *              of an open-ended number of subtables.
    513  *
    514  ******************************************************************************/
    515 
    516 void
    517 AcpiDmDumpCedt (
    518     ACPI_TABLE_HEADER       *Table)
    519 {
    520     ACPI_STATUS             Status;
    521     ACPI_CEDT_HEADER        *Subtable;
    522     UINT32                  Length = Table->Length;
    523     UINT32                  Offset = sizeof (ACPI_TABLE_CEDT);
    524 
    525 
    526     /* There is no main table (other than the standard ACPI header) */
    527 
    528     Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Table, Offset);
    529     while (Offset < Table->Length)
    530     {
    531         /* Common subtable header */
    532 
    533         AcpiOsPrintf ("\n");
    534         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    535             Subtable->Length, AcpiDmTableInfoCedtHdr);
    536         if (ACPI_FAILURE (Status))
    537         {
    538             return;
    539         }
    540 
    541         switch (Subtable->Type)
    542         {
    543         case ACPI_CEDT_TYPE_CHBS:
    544             Status = AcpiDmDumpTable (Length, Offset, Subtable,
    545                 Subtable->Length, AcpiDmTableInfoCedt0);
    546             if (ACPI_FAILURE (Status)) {
    547                 return;
    548             }
    549             break;
    550 
    551         case ACPI_CEDT_TYPE_CFMWS: {
    552             ACPI_CEDT_CFMWS *ptr = (ACPI_CEDT_CFMWS *) Subtable;
    553             unsigned int i, max = 0x01 << (ptr->InterleaveWays);
    554 
    555             /* print out table with first "Interleave target" */
    556 
    557             Status = AcpiDmDumpTable (Length, Offset, Subtable,
    558                 Subtable->Length, AcpiDmTableInfoCedt1);
    559             if (ACPI_FAILURE (Status)) {
    560                 return;
    561             }
    562 
    563             /* Now, print out any interleave targets beyond the first. */
    564 
    565             for (i = 1; i < max; i++) {
    566                 unsigned int loc_offset = Offset + (i * 4) + ACPI_OFFSET(ACPI_CEDT_CFMWS, InterleaveTargets);
    567                 unsigned int *trg = &(ptr->InterleaveTargets[i]);
    568                 Status = AcpiDmDumpTable (Length, loc_offset, trg,
    569                         Subtable->Length, AcpiDmTableInfoCedt1_te);
    570                 if (ACPI_FAILURE (Status)) {
    571                     return;
    572                 }
    573             }
    574             break;
    575         }
    576 
    577         default:
    578             AcpiOsPrintf ("\n**** Unknown CEDT subtable type 0x%X\n\n",
    579                 Subtable->Type);
    580 
    581             /* Attempt to continue */
    582             if (!Subtable->Length)
    583             {
    584                 AcpiOsPrintf ("Invalid zero length subtable\n");
    585                 return;
    586             }
    587         }
    588 
    589         /* Point to next subtable */
    590         Offset += Subtable->Length;
    591         Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Subtable,
    592             Subtable->Length);
    593     }
    594 }
    595 
    596 /*******************************************************************************
    597  *
    598  * FUNCTION:    AcpiDmDumpCpep
    599  *
    600  * PARAMETERS:  Table               - A CPEP table
    601  *
    602  * RETURN:      None
    603  *
    604  * DESCRIPTION: Format the contents of a CPEP. This table type consists
    605  *              of an open-ended number of subtables.
    606  *
    607  ******************************************************************************/
    608 
    609 void
    610 AcpiDmDumpCpep (
    611     ACPI_TABLE_HEADER       *Table)
    612 {
    613     ACPI_STATUS             Status;
    614     ACPI_CPEP_POLLING       *Subtable;
    615     UINT32                  Length = Table->Length;
    616     UINT32                  Offset = sizeof (ACPI_TABLE_CPEP);
    617 
    618 
    619     /* Main table */
    620 
    621     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
    622     if (ACPI_FAILURE (Status))
    623     {
    624         return;
    625     }
    626 
    627     /* Subtables */
    628 
    629     Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
    630     while (Offset < Table->Length)
    631     {
    632         AcpiOsPrintf ("\n");
    633         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    634             Subtable->Header.Length, AcpiDmTableInfoCpep0);
    635         if (ACPI_FAILURE (Status))
    636         {
    637             return;
    638         }
    639 
    640         /* Point to next subtable */
    641 
    642         Offset += Subtable->Header.Length;
    643         Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Subtable,
    644             Subtable->Header.Length);
    645     }
    646 }
    647 
    648 
    649 /*******************************************************************************
    650  *
    651  * FUNCTION:    AcpiDmDumpCsrt
    652  *
    653  * PARAMETERS:  Table               - A CSRT table
    654  *
    655  * RETURN:      None
    656  *
    657  * DESCRIPTION: Format the contents of a CSRT. This table type consists
    658  *              of an open-ended number of subtables.
    659  *
    660  ******************************************************************************/
    661 
    662 void
    663 AcpiDmDumpCsrt (
    664     ACPI_TABLE_HEADER       *Table)
    665 {
    666     ACPI_STATUS             Status;
    667     ACPI_CSRT_GROUP         *Subtable;
    668     ACPI_CSRT_SHARED_INFO   *SharedInfoTable;
    669     ACPI_CSRT_DESCRIPTOR    *SubSubtable;
    670     UINT32                  Length = Table->Length;
    671     UINT32                  Offset = sizeof (ACPI_TABLE_CSRT);
    672     UINT32                  SubOffset;
    673     UINT32                  SubSubOffset;
    674     UINT32                  InfoLength;
    675 
    676 
    677     /* The main table only contains the ACPI header, thus already handled */
    678 
    679     /* Subtables (Resource Groups) */
    680 
    681     Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
    682     while (Offset < Table->Length)
    683     {
    684         /* Resource group subtable */
    685 
    686         AcpiOsPrintf ("\n");
    687         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    688             Subtable->Length, AcpiDmTableInfoCsrt0);
    689         if (ACPI_FAILURE (Status))
    690         {
    691             return;
    692         }
    693 
    694         /* Shared info subtable (One per resource group) */
    695 
    696         SubOffset = sizeof (ACPI_CSRT_GROUP);
    697         SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,
    698             Offset + SubOffset);
    699 
    700         AcpiOsPrintf ("\n");
    701         Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
    702             sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
    703         if (ACPI_FAILURE (Status))
    704         {
    705             return;
    706         }
    707 
    708         SubOffset += Subtable->SharedInfoLength;
    709 
    710         /* Sub-Subtables (Resource Descriptors) */
    711 
    712         SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
    713             Offset + SubOffset);
    714 
    715         while ((SubOffset < Subtable->Length) &&
    716               ((Offset + SubOffset) < Table->Length))
    717         {
    718             AcpiOsPrintf ("\n");
    719             Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable,
    720                 SubSubtable->Length, AcpiDmTableInfoCsrt2);
    721             if (ACPI_FAILURE (Status))
    722             {
    723                 return;
    724             }
    725 
    726             SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
    727 
    728             /* Resource-specific info buffer */
    729 
    730             InfoLength = SubSubtable->Length - SubSubOffset;
    731             if (InfoLength)
    732             {
    733                 Status = AcpiDmDumpTable (Length,
    734                     Offset + SubOffset + SubSubOffset, Table,
    735                     InfoLength, AcpiDmTableInfoCsrt2a);
    736                 if (ACPI_FAILURE (Status))
    737                 {
    738                     return;
    739                 }
    740             }
    741 
    742             /* Point to next sub-subtable */
    743 
    744             SubOffset += SubSubtable->Length;
    745             SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable,
    746                 SubSubtable->Length);
    747         }
    748 
    749         /* Point to next subtable */
    750 
    751         Offset += Subtable->Length;
    752         Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable,
    753             Subtable->Length);
    754     }
    755 }
    756 
    757 
    758 /*******************************************************************************
    759  *
    760  * FUNCTION:    AcpiDmDumpDbg2
    761  *
    762  * PARAMETERS:  Table               - A DBG2 table
    763  *
    764  * RETURN:      None
    765  *
    766  * DESCRIPTION: Format the contents of a DBG2. This table type consists
    767  *              of an open-ended number of subtables.
    768  *
    769  ******************************************************************************/
    770 
    771 void
    772 AcpiDmDumpDbg2 (
    773     ACPI_TABLE_HEADER       *Table)
    774 {
    775     ACPI_STATUS             Status;
    776     ACPI_DBG2_DEVICE        *Subtable;
    777     UINT32                  Length = Table->Length;
    778     UINT32                  Offset = sizeof (ACPI_TABLE_DBG2);
    779     UINT32                  i;
    780     UINT32                  ArrayOffset;
    781     UINT32                  AbsoluteOffset;
    782     UINT8                   *Array;
    783 
    784 
    785     /* Main table */
    786 
    787     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
    788     if (ACPI_FAILURE (Status))
    789     {
    790         return;
    791     }
    792 
    793     /* Subtables */
    794 
    795     Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
    796     while (Offset < Table->Length)
    797     {
    798         AcpiOsPrintf ("\n");
    799         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    800             Subtable->Length, AcpiDmTableInfoDbg2Device);
    801         if (ACPI_FAILURE (Status))
    802         {
    803             return;
    804         }
    805 
    806         /* Dump the BaseAddress array */
    807 
    808         for (i = 0; i < Subtable->RegisterCount; i++)
    809         {
    810             ArrayOffset = Subtable->BaseAddressOffset +
    811                 (sizeof (ACPI_GENERIC_ADDRESS) * i);
    812             AbsoluteOffset = Offset + ArrayOffset;
    813             Array = (UINT8 *) Subtable + ArrayOffset;
    814 
    815             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
    816                 Subtable->Length, AcpiDmTableInfoDbg2Addr);
    817             if (ACPI_FAILURE (Status))
    818             {
    819                 return;
    820             }
    821         }
    822 
    823         /* Dump the AddressSize array */
    824 
    825         for (i = 0; i < Subtable->RegisterCount; i++)
    826         {
    827             ArrayOffset = Subtable->AddressSizeOffset +
    828                 (sizeof (UINT32) * i);
    829             AbsoluteOffset = Offset + ArrayOffset;
    830             Array = (UINT8 *) Subtable + ArrayOffset;
    831 
    832             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
    833                 Subtable->Length, AcpiDmTableInfoDbg2Size);
    834             if (ACPI_FAILURE (Status))
    835             {
    836                 return;
    837             }
    838         }
    839 
    840         /* Dump the Namestring (required) */
    841 
    842         AcpiOsPrintf ("\n");
    843         ArrayOffset = Subtable->NamepathOffset;
    844         AbsoluteOffset = Offset + ArrayOffset;
    845         Array = (UINT8 *) Subtable + ArrayOffset;
    846 
    847         Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
    848             Subtable->Length, AcpiDmTableInfoDbg2Name);
    849         if (ACPI_FAILURE (Status))
    850         {
    851             return;
    852         }
    853 
    854         /* Dump the OemData (optional) */
    855 
    856         if (Subtable->OemDataOffset)
    857         {
    858             Status = AcpiDmDumpTable (Length, Offset + Subtable->OemDataOffset,
    859                 Table, Subtable->OemDataLength,
    860                 AcpiDmTableInfoDbg2OemData);
    861             if (ACPI_FAILURE (Status))
    862             {
    863                 return;
    864             }
    865         }
    866 
    867         /* Point to next subtable */
    868 
    869         Offset += Subtable->Length;
    870         Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable,
    871             Subtable->Length);
    872     }
    873 }
    874 
    875 
    876 /*******************************************************************************
    877  *
    878  * FUNCTION:    AcpiDmDumpDmar
    879  *
    880  * PARAMETERS:  Table               - A DMAR table
    881  *
    882  * RETURN:      None
    883  *
    884  * DESCRIPTION: Format the contents of a DMAR. This table type consists
    885  *              of an open-ended number of subtables.
    886  *
    887  ******************************************************************************/
    888 
    889 void
    890 AcpiDmDumpDmar (
    891     ACPI_TABLE_HEADER       *Table)
    892 {
    893     ACPI_STATUS             Status;
    894     ACPI_DMAR_HEADER        *Subtable;
    895     UINT32                  Length = Table->Length;
    896     UINT32                  Offset = sizeof (ACPI_TABLE_DMAR);
    897     ACPI_DMTABLE_INFO       *InfoTable;
    898     ACPI_DMAR_DEVICE_SCOPE  *ScopeTable;
    899     UINT32                  ScopeOffset;
    900     UINT8                   *PciPath;
    901     UINT32                  PathOffset;
    902 
    903 
    904     /* Main table */
    905 
    906     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
    907     if (ACPI_FAILURE (Status))
    908     {
    909         return;
    910     }
    911 
    912     /* Subtables */
    913 
    914     Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
    915     while (Offset < Table->Length)
    916     {
    917         /* Common subtable header */
    918 
    919         AcpiOsPrintf ("\n");
    920         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    921             Subtable->Length, AcpiDmTableInfoDmarHdr);
    922         if (ACPI_FAILURE (Status))
    923         {
    924             return;
    925         }
    926 
    927         AcpiOsPrintf ("\n");
    928 
    929         switch (Subtable->Type)
    930         {
    931         case ACPI_DMAR_TYPE_HARDWARE_UNIT:
    932 
    933             InfoTable = AcpiDmTableInfoDmar0;
    934             ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
    935             break;
    936 
    937         case ACPI_DMAR_TYPE_RESERVED_MEMORY:
    938 
    939             InfoTable = AcpiDmTableInfoDmar1;
    940             ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
    941             break;
    942 
    943         case ACPI_DMAR_TYPE_ROOT_ATS:
    944 
    945             InfoTable = AcpiDmTableInfoDmar2;
    946             ScopeOffset = sizeof (ACPI_DMAR_ATSR);
    947             break;
    948 
    949         case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
    950 
    951             InfoTable = AcpiDmTableInfoDmar3;
    952             ScopeOffset = sizeof (ACPI_DMAR_RHSA);
    953             break;
    954 
    955         case ACPI_DMAR_TYPE_NAMESPACE:
    956 
    957             InfoTable = AcpiDmTableInfoDmar4;
    958             ScopeOffset = sizeof (ACPI_DMAR_ANDD);
    959             break;
    960 
    961         case ACPI_DMAR_TYPE_SATC:
    962 
    963             InfoTable = AcpiDmTableInfoDmar5;
    964             ScopeOffset = sizeof (ACPI_DMAR_SATC);
    965             break;
    966 
    967         default:
    968 
    969             AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",
    970                 Subtable->Type);
    971             return;
    972         }
    973 
    974         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    975             Subtable->Length, InfoTable);
    976         if (ACPI_FAILURE (Status))
    977         {
    978             return;
    979         }
    980 
    981         /*
    982          * Dump the optional device scope entries
    983          */
    984         if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
    985             (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE))
    986         {
    987             /* These types do not support device scopes */
    988 
    989             goto NextSubtable;
    990         }
    991 
    992         ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset);
    993         while (ScopeOffset < Subtable->Length)
    994         {
    995             AcpiOsPrintf ("\n");
    996             Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
    997                 ScopeTable->Length, AcpiDmTableInfoDmarScope);
    998             if (ACPI_FAILURE (Status))
    999             {
   1000                 return;
   1001             }
   1002             AcpiOsPrintf ("\n");
   1003 
   1004             /* Dump the PCI Path entries for this device scope */
   1005 
   1006             PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
   1007 
   1008             PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
   1009                 sizeof (ACPI_DMAR_DEVICE_SCOPE));
   1010 
   1011             while (PathOffset < ScopeTable->Length)
   1012             {
   1013                 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2,
   1014                     "PCI Path");
   1015                 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
   1016 
   1017                 /* Point to next PCI Path entry */
   1018 
   1019                 PathOffset += 2;
   1020                 PciPath += 2;
   1021                 AcpiOsPrintf ("\n");
   1022             }
   1023 
   1024             /* Point to next device scope entry */
   1025 
   1026             ScopeOffset += ScopeTable->Length;
   1027             ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
   1028                 ScopeTable, ScopeTable->Length);
   1029         }
   1030 
   1031 NextSubtable:
   1032         /* Point to next subtable */
   1033 
   1034         Offset += Subtable->Length;
   1035         Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable,
   1036             Subtable->Length);
   1037     }
   1038 }
   1039 
   1040 
   1041 /*******************************************************************************
   1042  *
   1043  * FUNCTION:    AcpiDmDumpDrtm
   1044  *
   1045  * PARAMETERS:  Table               - A DRTM table
   1046  *
   1047  * RETURN:      None
   1048  *
   1049  * DESCRIPTION: Format the contents of a DRTM.
   1050  *
   1051  ******************************************************************************/
   1052 
   1053 void
   1054 AcpiDmDumpDrtm (
   1055     ACPI_TABLE_HEADER       *Table)
   1056 {
   1057     ACPI_STATUS             Status;
   1058     UINT32                  Offset;
   1059     ACPI_DRTM_VTABLE_LIST   *DrtmVtl;
   1060     ACPI_DRTM_RESOURCE_LIST *DrtmRl;
   1061     ACPI_DRTM_DPS_ID        *DrtmDps;
   1062     UINT32                  Count;
   1063 
   1064 
   1065     /* Main table */
   1066 
   1067     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
   1068         AcpiDmTableInfoDrtm);
   1069     if (ACPI_FAILURE (Status))
   1070     {
   1071         return;
   1072     }
   1073 
   1074     Offset = sizeof (ACPI_TABLE_DRTM);
   1075 
   1076     /* Sub-tables */
   1077 
   1078     /* Dump ValidatedTable length */
   1079 
   1080     DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
   1081     AcpiOsPrintf ("\n");
   1082     Status = AcpiDmDumpTable (Table->Length, Offset,
   1083         DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
   1084         AcpiDmTableInfoDrtm0);
   1085     if (ACPI_FAILURE (Status))
   1086     {
   1087             return;
   1088     }
   1089 
   1090     Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);
   1091 
   1092     /* Dump Validated table addresses */
   1093 
   1094     Count = 0;
   1095     while ((Offset < Table->Length) &&
   1096             (DrtmVtl->ValidatedTableCount > Count))
   1097     {
   1098         Status = AcpiDmDumpTable (Table->Length, Offset,
   1099             ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
   1100             AcpiDmTableInfoDrtm0a);
   1101         if (ACPI_FAILURE (Status))
   1102         {
   1103             return;
   1104         }
   1105 
   1106         Offset += sizeof (UINT64);
   1107         Count++;
   1108     }
   1109 
   1110     /* Dump ResourceList length */
   1111 
   1112     DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
   1113     AcpiOsPrintf ("\n");
   1114     Status = AcpiDmDumpTable (Table->Length, Offset,
   1115         DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
   1116         AcpiDmTableInfoDrtm1);
   1117     if (ACPI_FAILURE (Status))
   1118     {
   1119         return;
   1120     }
   1121 
   1122     Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);
   1123 
   1124     /* Dump the Resource List */
   1125 
   1126     Count = 0;
   1127     while ((Offset < Table->Length) &&
   1128            (DrtmRl->ResourceCount > Count))
   1129     {
   1130         Status = AcpiDmDumpTable (Table->Length, Offset,
   1131             ACPI_ADD_PTR (void, Table, Offset),
   1132             sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a);
   1133         if (ACPI_FAILURE (Status))
   1134         {
   1135             return;
   1136         }
   1137 
   1138         Offset += sizeof (ACPI_DRTM_RESOURCE);
   1139         Count++;
   1140     }
   1141 
   1142     /* Dump DPS */
   1143 
   1144     DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
   1145     AcpiOsPrintf ("\n");
   1146     (void) AcpiDmDumpTable (Table->Length, Offset,
   1147         DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2);
   1148 }
   1149 
   1150 
   1151 /*******************************************************************************
   1152  *
   1153  * FUNCTION:    AcpiDmDumpEinj
   1154  *
   1155  * PARAMETERS:  Table               - A EINJ table
   1156  *
   1157  * RETURN:      None
   1158  *
   1159  * DESCRIPTION: Format the contents of a EINJ. This table type consists
   1160  *              of an open-ended number of subtables.
   1161  *
   1162  ******************************************************************************/
   1163 
   1164 void
   1165 AcpiDmDumpEinj (
   1166     ACPI_TABLE_HEADER       *Table)
   1167 {
   1168     ACPI_STATUS             Status;
   1169     ACPI_WHEA_HEADER        *Subtable;
   1170     UINT32                  Length = Table->Length;
   1171     UINT32                  Offset = sizeof (ACPI_TABLE_EINJ);
   1172 
   1173 
   1174     /* Main table */
   1175 
   1176     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
   1177     if (ACPI_FAILURE (Status))
   1178     {
   1179         return;
   1180     }
   1181 
   1182     /* Subtables */
   1183 
   1184     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
   1185     while (Offset < Table->Length)
   1186     {
   1187         AcpiOsPrintf ("\n");
   1188         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1189             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
   1190         if (ACPI_FAILURE (Status))
   1191         {
   1192             return;
   1193         }
   1194 
   1195         /* Point to next subtable (each subtable is of fixed length) */
   1196 
   1197         Offset += sizeof (ACPI_WHEA_HEADER);
   1198         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
   1199             sizeof (ACPI_WHEA_HEADER));
   1200     }
   1201 }
   1202 
   1203 
   1204 /*******************************************************************************
   1205  *
   1206  * FUNCTION:    AcpiDmDumpErst
   1207  *
   1208  * PARAMETERS:  Table               - A ERST table
   1209  *
   1210  * RETURN:      None
   1211  *
   1212  * DESCRIPTION: Format the contents of a ERST. This table type consists
   1213  *              of an open-ended number of subtables.
   1214  *
   1215  ******************************************************************************/
   1216 
   1217 void
   1218 AcpiDmDumpErst (
   1219     ACPI_TABLE_HEADER       *Table)
   1220 {
   1221     ACPI_STATUS             Status;
   1222     ACPI_WHEA_HEADER        *Subtable;
   1223     UINT32                  Length = Table->Length;
   1224     UINT32                  Offset = sizeof (ACPI_TABLE_ERST);
   1225 
   1226 
   1227     /* Main table */
   1228 
   1229     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
   1230     if (ACPI_FAILURE (Status))
   1231     {
   1232         return;
   1233     }
   1234 
   1235     /* Subtables */
   1236 
   1237     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
   1238     while (Offset < Table->Length)
   1239     {
   1240         AcpiOsPrintf ("\n");
   1241         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1242             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
   1243         if (ACPI_FAILURE (Status))
   1244         {
   1245             return;
   1246         }
   1247 
   1248         /* Point to next subtable (each subtable is of fixed length) */
   1249 
   1250         Offset += sizeof (ACPI_WHEA_HEADER);
   1251         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
   1252             sizeof (ACPI_WHEA_HEADER));
   1253     }
   1254 }
   1255 
   1256 
   1257 /*******************************************************************************
   1258  *
   1259  * FUNCTION:    AcpiDmDumpFpdt
   1260  *
   1261  * PARAMETERS:  Table               - A FPDT table
   1262  *
   1263  * RETURN:      None
   1264  *
   1265  * DESCRIPTION: Format the contents of a FPDT. This table type consists
   1266  *              of an open-ended number of subtables.
   1267  *
   1268  ******************************************************************************/
   1269 
   1270 void
   1271 AcpiDmDumpFpdt (
   1272     ACPI_TABLE_HEADER       *Table)
   1273 {
   1274     ACPI_STATUS             Status;
   1275     ACPI_FPDT_HEADER        *Subtable;
   1276     UINT32                  Length = Table->Length;
   1277     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
   1278     ACPI_DMTABLE_INFO       *InfoTable;
   1279 
   1280 
   1281     /* There is no main table (other than the standard ACPI header) */
   1282 
   1283     /* Subtables */
   1284 
   1285     Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
   1286     while (Offset < Table->Length)
   1287     {
   1288         /* Common subtable header */
   1289 
   1290         AcpiOsPrintf ("\n");
   1291         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1292             Subtable->Length, AcpiDmTableInfoFpdtHdr);
   1293         if (ACPI_FAILURE (Status))
   1294         {
   1295             return;
   1296         }
   1297 
   1298         switch (Subtable->Type)
   1299         {
   1300         case ACPI_FPDT_TYPE_BOOT:
   1301 
   1302             InfoTable = AcpiDmTableInfoFpdt0;
   1303             break;
   1304 
   1305         case ACPI_FPDT_TYPE_S3PERF:
   1306 
   1307             InfoTable = AcpiDmTableInfoFpdt1;
   1308             break;
   1309 
   1310         default:
   1311 
   1312             AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",
   1313                 Subtable->Type);
   1314 
   1315             /* Attempt to continue */
   1316 
   1317             if (!Subtable->Length)
   1318             {
   1319                 AcpiOsPrintf ("Invalid zero length subtable\n");
   1320                 return;
   1321             }
   1322             goto NextSubtable;
   1323         }
   1324 
   1325         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1326             Subtable->Length, InfoTable);
   1327         if (ACPI_FAILURE (Status))
   1328         {
   1329             return;
   1330         }
   1331 
   1332 NextSubtable:
   1333         /* Point to next subtable */
   1334 
   1335         Offset += Subtable->Length;
   1336         Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable,
   1337             Subtable->Length);
   1338     }
   1339 }
   1340 
   1341 
   1342 /*******************************************************************************
   1343  *
   1344  * FUNCTION:    AcpiDmDumpGtdt
   1345  *
   1346  * PARAMETERS:  Table               - A GTDT table
   1347  *
   1348  * RETURN:      None
   1349  *
   1350  * DESCRIPTION: Format the contents of a GTDT. This table type consists
   1351  *              of an open-ended number of subtables.
   1352  *
   1353  ******************************************************************************/
   1354 
   1355 void
   1356 AcpiDmDumpGtdt (
   1357     ACPI_TABLE_HEADER       *Table)
   1358 {
   1359     ACPI_STATUS             Status;
   1360     ACPI_GTDT_HEADER        *Subtable;
   1361     UINT32                  Length = Table->Length;
   1362     UINT32                  Offset = sizeof (ACPI_TABLE_GTDT);
   1363     ACPI_DMTABLE_INFO       *InfoTable;
   1364     UINT32                  SubtableLength;
   1365     UINT32                  GtCount;
   1366     ACPI_GTDT_TIMER_ENTRY   *GtxTable;
   1367 
   1368 
   1369     /* Main table */
   1370 
   1371     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
   1372     if (ACPI_FAILURE (Status))
   1373     {
   1374         return;
   1375     }
   1376 
   1377     /* Rev 3 fields */
   1378 
   1379     Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
   1380 
   1381     if (Table->Revision > 2)
   1382     {
   1383         SubtableLength = sizeof (ACPI_GTDT_EL2);
   1384         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1385             SubtableLength, AcpiDmTableInfoGtdtEl2);
   1386         if (ACPI_FAILURE (Status))
   1387         {
   1388             return;
   1389         }
   1390         Offset += SubtableLength;
   1391     }
   1392 
   1393     Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
   1394 
   1395     /* Subtables */
   1396 
   1397     while (Offset < Table->Length)
   1398     {
   1399         /* Common subtable header */
   1400 
   1401         AcpiOsPrintf ("\n");
   1402         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1403             Subtable->Length, AcpiDmTableInfoGtdtHdr);
   1404         if (ACPI_FAILURE (Status))
   1405         {
   1406             return;
   1407         }
   1408 
   1409         GtCount = 0;
   1410         switch (Subtable->Type)
   1411         {
   1412         case ACPI_GTDT_TYPE_TIMER_BLOCK:
   1413 
   1414             SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
   1415             GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
   1416                 Subtable))->TimerCount;
   1417 
   1418             InfoTable = AcpiDmTableInfoGtdt0;
   1419             break;
   1420 
   1421         case ACPI_GTDT_TYPE_WATCHDOG:
   1422 
   1423             SubtableLength = sizeof (ACPI_GTDT_WATCHDOG);
   1424 
   1425             InfoTable = AcpiDmTableInfoGtdt1;
   1426             break;
   1427 
   1428         default:
   1429 
   1430             /* Cannot continue on unknown type - no length */
   1431 
   1432             AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n",
   1433                 Subtable->Type);
   1434             return;
   1435         }
   1436 
   1437         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1438             Subtable->Length, InfoTable);
   1439         if (ACPI_FAILURE (Status))
   1440         {
   1441             return;
   1442         }
   1443 
   1444         /* Point to end of current subtable (each subtable above is of fixed length) */
   1445 
   1446         Offset += SubtableLength;
   1447 
   1448         /* If there are any Gt Timer Blocks from above, dump them now */
   1449 
   1450         if (GtCount)
   1451         {
   1452             GtxTable = ACPI_ADD_PTR (
   1453                 ACPI_GTDT_TIMER_ENTRY, Subtable, SubtableLength);
   1454             SubtableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
   1455 
   1456             while (GtCount)
   1457             {
   1458                 AcpiOsPrintf ("\n");
   1459                 Status = AcpiDmDumpTable (Length, Offset, GtxTable,
   1460                     sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
   1461                 if (ACPI_FAILURE (Status))
   1462                 {
   1463                     return;
   1464                 }
   1465                 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
   1466                 GtxTable++;
   1467                 GtCount--;
   1468             }
   1469         }
   1470 
   1471         /* Point to next subtable */
   1472 
   1473         Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Subtable, SubtableLength);
   1474     }
   1475 }
   1476 
   1477 
   1478 /*******************************************************************************
   1479  *
   1480  * FUNCTION:    AcpiDmDumpHest
   1481  *
   1482  * PARAMETERS:  Table               - A HEST table
   1483  *
   1484  * RETURN:      None
   1485  *
   1486  * DESCRIPTION: Format the contents of a HEST. This table type consists
   1487  *              of an open-ended number of subtables.
   1488  *
   1489  ******************************************************************************/
   1490 
   1491 void
   1492 AcpiDmDumpHest (
   1493     ACPI_TABLE_HEADER       *Table)
   1494 {
   1495     ACPI_STATUS             Status;
   1496     ACPI_HEST_HEADER        *Subtable;
   1497     UINT32                  Length = Table->Length;
   1498     UINT32                  Offset = sizeof (ACPI_TABLE_HEST);
   1499     ACPI_DMTABLE_INFO       *InfoTable;
   1500     UINT32                  SubtableLength;
   1501     UINT32                  BankCount;
   1502     ACPI_HEST_IA_ERROR_BANK *BankTable;
   1503 
   1504 
   1505     /* Main table */
   1506 
   1507     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
   1508     if (ACPI_FAILURE (Status))
   1509     {
   1510         return;
   1511     }
   1512 
   1513     /* Subtables */
   1514 
   1515     Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
   1516     while (Offset < Table->Length)
   1517     {
   1518         BankCount = 0;
   1519         switch (Subtable->Type)
   1520         {
   1521         case ACPI_HEST_TYPE_IA32_CHECK:
   1522 
   1523             InfoTable = AcpiDmTableInfoHest0;
   1524             SubtableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
   1525             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
   1526                 Subtable))->NumHardwareBanks;
   1527             break;
   1528 
   1529         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
   1530 
   1531             InfoTable = AcpiDmTableInfoHest1;
   1532             SubtableLength = sizeof (ACPI_HEST_IA_CORRECTED);
   1533             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
   1534                 Subtable))->NumHardwareBanks;
   1535             break;
   1536 
   1537         case ACPI_HEST_TYPE_IA32_NMI:
   1538 
   1539             InfoTable = AcpiDmTableInfoHest2;
   1540             SubtableLength = sizeof (ACPI_HEST_IA_NMI);
   1541             break;
   1542 
   1543         case ACPI_HEST_TYPE_AER_ROOT_PORT:
   1544 
   1545             InfoTable = AcpiDmTableInfoHest6;
   1546             SubtableLength = sizeof (ACPI_HEST_AER_ROOT);
   1547             break;
   1548 
   1549         case ACPI_HEST_TYPE_AER_ENDPOINT:
   1550 
   1551             InfoTable = AcpiDmTableInfoHest7;
   1552             SubtableLength = sizeof (ACPI_HEST_AER);
   1553             break;
   1554 
   1555         case ACPI_HEST_TYPE_AER_BRIDGE:
   1556 
   1557             InfoTable = AcpiDmTableInfoHest8;
   1558             SubtableLength = sizeof (ACPI_HEST_AER_BRIDGE);
   1559             break;
   1560 
   1561         case ACPI_HEST_TYPE_GENERIC_ERROR:
   1562 
   1563             InfoTable = AcpiDmTableInfoHest9;
   1564             SubtableLength = sizeof (ACPI_HEST_GENERIC);
   1565             break;
   1566 
   1567         case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
   1568 
   1569             InfoTable = AcpiDmTableInfoHest10;
   1570             SubtableLength = sizeof (ACPI_HEST_GENERIC_V2);
   1571             break;
   1572 
   1573         case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
   1574 
   1575             InfoTable = AcpiDmTableInfoHest11;
   1576             SubtableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);
   1577             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
   1578                 Subtable))->NumHardwareBanks;
   1579             break;
   1580 
   1581         default:
   1582 
   1583             /* Cannot continue on unknown type - no length */
   1584 
   1585             AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n",
   1586                 Subtable->Type);
   1587             return;
   1588         }
   1589 
   1590         AcpiOsPrintf ("\n");
   1591         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1592             SubtableLength, InfoTable);
   1593         if (ACPI_FAILURE (Status))
   1594         {
   1595             return;
   1596         }
   1597 
   1598         /* Point to end of current subtable (each subtable above is of fixed length) */
   1599 
   1600         Offset += SubtableLength;
   1601 
   1602         /* If there are any (fixed-length) Error Banks from above, dump them now */
   1603 
   1604         if (BankCount)
   1605         {
   1606             BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, Subtable,
   1607                 SubtableLength);
   1608             SubtableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
   1609 
   1610             while (BankCount)
   1611             {
   1612                 AcpiOsPrintf ("\n");
   1613                 Status = AcpiDmDumpTable (Length, Offset, BankTable,
   1614                     sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
   1615                 if (ACPI_FAILURE (Status))
   1616                 {
   1617                     return;
   1618                 }
   1619 
   1620                 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
   1621                 BankTable++;
   1622                 BankCount--;
   1623             }
   1624         }
   1625 
   1626         /* Point to next subtable */
   1627 
   1628         Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Subtable, SubtableLength);
   1629     }
   1630 }
   1631 
   1632 
   1633 /*******************************************************************************
   1634  *
   1635  * FUNCTION:    AcpiDmDumpHmat
   1636  *
   1637  * PARAMETERS:  Table               - A HMAT table
   1638  *
   1639  * RETURN:      None
   1640  *
   1641  * DESCRIPTION: Format the contents of a HMAT.
   1642  *
   1643  ******************************************************************************/
   1644 
   1645 void
   1646 AcpiDmDumpHmat (
   1647     ACPI_TABLE_HEADER       *Table)
   1648 {
   1649     ACPI_STATUS             Status;
   1650     ACPI_HMAT_STRUCTURE     *HmatStruct;
   1651     ACPI_HMAT_LOCALITY      *HmatLocality;
   1652     ACPI_HMAT_CACHE         *HmatCache;
   1653     UINT32                  Offset;
   1654     UINT32                  SubtableOffset;
   1655     UINT32                  Length;
   1656     ACPI_DMTABLE_INFO       *InfoTable;
   1657     UINT32                  i, j;
   1658 
   1659 
   1660     /* Main table */
   1661 
   1662     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat);
   1663     if (ACPI_FAILURE (Status))
   1664     {
   1665         return;
   1666     }
   1667     Offset = sizeof (ACPI_TABLE_HMAT);
   1668 
   1669     while (Offset < Table->Length)
   1670     {
   1671         AcpiOsPrintf ("\n");
   1672 
   1673         /* Dump HMAT structure header */
   1674 
   1675         HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset);
   1676         if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE))
   1677         {
   1678             AcpiOsPrintf ("Invalid HMAT structure length\n");
   1679             return;
   1680         }
   1681         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
   1682             HmatStruct->Length, AcpiDmTableInfoHmatHdr);
   1683         if (ACPI_FAILURE (Status))
   1684         {
   1685             return;
   1686         }
   1687 
   1688         switch (HmatStruct->Type)
   1689         {
   1690         case ACPI_HMAT_TYPE_ADDRESS_RANGE:
   1691 
   1692             InfoTable = AcpiDmTableInfoHmat0;
   1693             Length = sizeof (ACPI_HMAT_PROXIMITY_DOMAIN);
   1694             break;
   1695 
   1696         case ACPI_HMAT_TYPE_LOCALITY:
   1697 
   1698             InfoTable = AcpiDmTableInfoHmat1;
   1699             Length = sizeof (ACPI_HMAT_LOCALITY);
   1700             break;
   1701 
   1702         case ACPI_HMAT_TYPE_CACHE:
   1703 
   1704             InfoTable = AcpiDmTableInfoHmat2;
   1705             Length = sizeof (ACPI_HMAT_CACHE);
   1706             break;
   1707 
   1708         default:
   1709 
   1710             AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n",
   1711                 HmatStruct->Type);
   1712 
   1713             /* Attempt to continue */
   1714 
   1715             goto NextSubtable;
   1716         }
   1717 
   1718         /* Dump HMAT structure body */
   1719 
   1720         if (HmatStruct->Length < Length)
   1721         {
   1722             AcpiOsPrintf ("Invalid HMAT structure length\n");
   1723             return;
   1724         }
   1725         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
   1726             HmatStruct->Length, InfoTable);
   1727         if (ACPI_FAILURE (Status))
   1728         {
   1729             return;
   1730         }
   1731 
   1732         /* Dump HMAT structure additionals */
   1733 
   1734         switch (HmatStruct->Type)
   1735         {
   1736         case ACPI_HMAT_TYPE_LOCALITY:
   1737 
   1738             HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct);
   1739             SubtableOffset = sizeof (ACPI_HMAT_LOCALITY);
   1740 
   1741             /* Dump initiator proximity domains */
   1742 
   1743             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   1744                 (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4))
   1745             {
   1746                 AcpiOsPrintf ("Invalid initiator proximity domain number\n");
   1747                 return;
   1748             }
   1749             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
   1750             {
   1751                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   1752                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   1753                     4, AcpiDmTableInfoHmat1a);
   1754                 if (ACPI_FAILURE (Status))
   1755                 {
   1756                     return;
   1757                 }
   1758 
   1759                 SubtableOffset += 4;
   1760             }
   1761 
   1762             /* Dump target proximity domains */
   1763 
   1764             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   1765                 (UINT32)(HmatLocality->NumberOfTargetPDs * 4))
   1766             {
   1767                 AcpiOsPrintf ("Invalid target proximity domain number\n");
   1768                 return;
   1769             }
   1770             for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++)
   1771             {
   1772                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   1773                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   1774                     4, AcpiDmTableInfoHmat1b);
   1775                 if (ACPI_FAILURE (Status))
   1776                 {
   1777                     return;
   1778                 }
   1779 
   1780                 SubtableOffset += 4;
   1781             }
   1782 
   1783             /* Dump latency/bandwidth entris */
   1784 
   1785             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   1786                 (UINT32)(HmatLocality->NumberOfInitiatorPDs *
   1787                          HmatLocality->NumberOfTargetPDs * 2))
   1788             {
   1789                 AcpiOsPrintf ("Invalid latency/bandwidth entry number\n");
   1790                 return;
   1791             }
   1792             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
   1793             {
   1794                 for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++)
   1795                 {
   1796                     Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   1797                         ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   1798                         2, AcpiDmTableInfoHmat1c);
   1799                     if (ACPI_FAILURE(Status))
   1800                     {
   1801                         return;
   1802                     }
   1803 
   1804                     SubtableOffset += 2;
   1805                 }
   1806             }
   1807             break;
   1808 
   1809         case ACPI_HMAT_TYPE_CACHE:
   1810 
   1811             HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct);
   1812             SubtableOffset = sizeof (ACPI_HMAT_CACHE);
   1813 
   1814             /* Dump SMBIOS handles */
   1815 
   1816             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   1817                 (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2))
   1818             {
   1819                 AcpiOsPrintf ("Invalid SMBIOS handle number\n");
   1820                 return;
   1821             }
   1822             for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++)
   1823             {
   1824                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   1825                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   1826                     2, AcpiDmTableInfoHmat2a);
   1827                 if (ACPI_FAILURE (Status))
   1828                 {
   1829                     return;
   1830                 }
   1831 
   1832                 SubtableOffset += 2;
   1833             }
   1834             break;
   1835 
   1836         default:
   1837 
   1838             break;
   1839         }
   1840 
   1841 NextSubtable:
   1842         /* Point to next HMAT structure subtable */
   1843 
   1844         Offset += (HmatStruct->Length);
   1845     }
   1846 }
   1847