Home | History | Annotate | Line # | Download | only in common
      1 /******************************************************************************
      2  *
      3  * Module Name: dmtbdump2 - Dump ACPI data tables that contain no AML code
      4  *
      5  *****************************************************************************/
      6 
      7 /******************************************************************************
      8  *
      9  * 1. Copyright Notice
     10  *
     11  * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
     12  * All rights reserved.
     13  *
     14  * 2. License
     15  *
     16  * 2.1. This is your license from Intel Corp. under its intellectual property
     17  * rights. You may have additional license terms from the party that provided
     18  * you this software, covering your right to use that party's intellectual
     19  * property rights.
     20  *
     21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
     22  * copy of the source code appearing in this file ("Covered Code") an
     23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
     24  * base code distributed originally by Intel ("Original Intel Code") to copy,
     25  * make derivatives, distribute, use and display any portion of the Covered
     26  * Code in any form, with the right to sublicense such rights; and
     27  *
     28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
     29  * license (with the right to sublicense), under only those claims of Intel
     30  * patents that are infringed by the Original Intel Code, to make, use, sell,
     31  * offer to sell, and import the Covered Code and derivative works thereof
     32  * solely to the minimum extent necessary to exercise the above copyright
     33  * license, and in no event shall the patent license extend to any additions
     34  * to or modifications of the Original Intel Code. No other license or right
     35  * is granted directly or by implication, estoppel or otherwise;
     36  *
     37  * The above copyright and patent license is granted only if the following
     38  * conditions are met:
     39  *
     40  * 3. Conditions
     41  *
     42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
     43  * Redistribution of source code of any substantial portion of the Covered
     44  * Code or modification with rights to further distribute source must include
     45  * the above Copyright Notice, the above License, this list of Conditions,
     46  * and the following Disclaimer and Export Compliance provision. In addition,
     47  * Licensee must cause all Covered Code to which Licensee contributes to
     48  * contain a file documenting the changes Licensee made to create that Covered
     49  * Code and the date of any change. Licensee must include in that file the
     50  * documentation of any changes made by any predecessor Licensee. Licensee
     51  * must include a prominent statement that the modification is derived,
     52  * directly or indirectly, from Original Intel Code.
     53  *
     54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
     55  * Redistribution of source code of any substantial portion of the Covered
     56  * Code or modification without rights to further distribute source must
     57  * include the following Disclaimer and Export Compliance provision in the
     58  * documentation and/or other materials provided with distribution. In
     59  * addition, Licensee may not authorize further sublicense of source of any
     60  * portion of the Covered Code, and must include terms to the effect that the
     61  * license from Licensee to its licensee is limited to the intellectual
     62  * property embodied in the software Licensee provides to its licensee, and
     63  * not to intellectual property embodied in modifications its licensee may
     64  * make.
     65  *
     66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
     67  * substantial portion of the Covered Code or modification must reproduce the
     68  * above Copyright Notice, and the following Disclaimer and Export Compliance
     69  * provision in the documentation and/or other materials provided with the
     70  * distribution.
     71  *
     72  * 3.4. Intel retains all right, title, and interest in and to the Original
     73  * Intel Code.
     74  *
     75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
     76  * Intel shall be used in advertising or otherwise to promote the sale, use or
     77  * other dealings in products derived from or relating to the Covered Code
     78  * without prior written authorization from Intel.
     79  *
     80  * 4. Disclaimer and Export Compliance
     81  *
     82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
     83  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
     84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
     85  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
     86  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
     87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
     88  * PARTICULAR PURPOSE.
     89  *
     90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
     91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
     92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
     93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
     94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
     95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
     96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
     97  * LIMITED REMEDY.
     98  *
     99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
    100  * software or system incorporating such software without first obtaining any
    101  * required license or other approval from the U. S. Department of Commerce or
    102  * any other agency or department of the United States Government. In the
    103  * event Licensee exports any such software from the United States or
    104  * re-exports any such software from a foreign destination, Licensee shall
    105  * ensure that the distribution and export/re-export of the software is in
    106  * compliance with all laws, regulations, orders, or other restrictions of the
    107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
    108  * any of its subsidiaries will export/re-export any technical data, process,
    109  * software, or service, directly or indirectly, to any country for which the
    110  * United States government or any agency thereof requires an export license,
    111  * other governmental approval, or letter of assurance, without first obtaining
    112  * such license, approval or letter.
    113  *
    114  *****************************************************************************
    115  *
    116  * Alternatively, you may choose to be licensed under the terms of the
    117  * following license:
    118  *
    119  * Redistribution and use in source and binary forms, with or without
    120  * modification, are permitted provided that the following conditions
    121  * are met:
    122  * 1. Redistributions of source code must retain the above copyright
    123  *    notice, this list of conditions, and the following disclaimer,
    124  *    without modification.
    125  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
    126  *    substantially similar to the "NO WARRANTY" disclaimer below
    127  *    ("Disclaimer") and any redistribution must be conditioned upon
    128  *    including a substantially similar Disclaimer requirement for further
    129  *    binary redistribution.
    130  * 3. Neither the names of the above-listed copyright holders nor the names
    131  *    of any contributors may be used to endorse or promote products derived
    132  *    from this software without specific prior written permission.
    133  *
    134  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    135  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    136  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    137  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    138  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    139  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    140  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    141  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    142  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    143  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    144  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    145  *
    146  * Alternatively, you may choose to be licensed under the terms of the
    147  * GNU General Public License ("GPL") version 2 as published by the Free
    148  * Software Foundation.
    149  *
    150  *****************************************************************************/
    151 
    152 #include <wchar.h>
    153 #include "acpi.h"
    154 #include "accommon.h"
    155 #include "acdisasm.h"
    156 #include "actables.h"
    157 #include "aslcompiler.h"
    158 
    159 /* This module used for application-level code only */
    160 
    161 #define _COMPONENT          ACPI_CA_DISASSEMBLER
    162         ACPI_MODULE_NAME    ("dmtbdump2")
    163 
    164 
    165 /*******************************************************************************
    166  *
    167  * FUNCTION:    AcpiDmDumpIort
    168  *
    169  * PARAMETERS:  Table               - A IORT table
    170  *
    171  * RETURN:      None
    172  *
    173  * DESCRIPTION: Format the contents of a IORT
    174  *
    175  ******************************************************************************/
    176 
    177 void
    178 AcpiDmDumpIort (
    179     ACPI_TABLE_HEADER       *Table)
    180 {
    181     ACPI_STATUS             Status;
    182     ACPI_TABLE_IORT         *Iort;
    183     ACPI_IORT_NODE          *IortNode;
    184     ACPI_IORT_ITS_GROUP     *IortItsGroup = NULL;
    185     ACPI_IORT_SMMU          *IortSmmu = NULL;
    186     ACPI_IORT_RMR           *IortRmr = NULL;
    187     UINT32                  Offset;
    188     UINT32                  NodeOffset;
    189     UINT32                  Length;
    190     ACPI_DMTABLE_INFO       *InfoTable;
    191     char                    *String;
    192     UINT32                  i;
    193     UINT32                  MappingByteLength;
    194     UINT8                   Revision;
    195 
    196 
    197     /* Main table */
    198 
    199     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort);
    200     if (ACPI_FAILURE (Status))
    201     {
    202         return;
    203     }
    204 
    205     Revision = Table->Revision;
    206 
    207     /* IORT Revisions E, E.a and E.c have known issues and are not supported */
    208 
    209     if (Revision == 1 || Revision == 2 || Revision == 4)
    210     {
    211         AcpiOsPrintf ("\n**** Unsupported IORT revision 0x%X\n",
    212                       Revision);
    213         return;
    214     }
    215 
    216     Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);
    217     Offset = sizeof (ACPI_TABLE_IORT);
    218 
    219     /* Dump the OptionalPadding (optional) */
    220 
    221     if (Iort->NodeOffset > Offset)
    222     {
    223         Status = AcpiDmDumpTable (Table->Length, Offset, Table,
    224             Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad);
    225         if (ACPI_FAILURE (Status))
    226         {
    227             return;
    228         }
    229     }
    230 
    231     Offset = Iort->NodeOffset;
    232     while (Offset < Table->Length)
    233     {
    234         /* Common subtable header */
    235 
    236         IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
    237         AcpiOsPrintf ("\n");
    238         Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
    239 
    240         if (Revision == 0)
    241         {
    242             Status = AcpiDmDumpTable (Table->Length, Offset,
    243                 IortNode, Length, AcpiDmTableInfoIortHdr);
    244         }
    245         else if (Revision >= 3)
    246         {
    247             Status = AcpiDmDumpTable (Table->Length, Offset,
    248                 IortNode, Length, AcpiDmTableInfoIortHdr3);
    249         }
    250 
    251         if (ACPI_FAILURE (Status))
    252         {
    253             return;
    254         }
    255 
    256         NodeOffset = Length;
    257 
    258         switch (IortNode->Type)
    259         {
    260         case ACPI_IORT_NODE_ITS_GROUP:
    261 
    262             InfoTable = AcpiDmTableInfoIort0;
    263             Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers);
    264             IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset);
    265             break;
    266 
    267         case ACPI_IORT_NODE_NAMED_COMPONENT:
    268 
    269             InfoTable = AcpiDmTableInfoIort1;
    270             Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName);
    271             String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length);
    272             Length += strlen (String) + 1;
    273             break;
    274 
    275         case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
    276 
    277             InfoTable = AcpiDmTableInfoIort2;
    278             Length = IortNode->Length - NodeOffset;
    279             break;
    280 
    281         case ACPI_IORT_NODE_SMMU:
    282 
    283             InfoTable = AcpiDmTableInfoIort3;
    284             Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts);
    285             IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset);
    286             break;
    287 
    288         case ACPI_IORT_NODE_SMMU_V3:
    289 
    290             InfoTable = AcpiDmTableInfoIort4;
    291             Length = IortNode->Length - NodeOffset;
    292             break;
    293 
    294         case ACPI_IORT_NODE_PMCG:
    295 
    296             InfoTable = AcpiDmTableInfoIort5;
    297             Length = IortNode->Length - NodeOffset;
    298             break;
    299 
    300         case ACPI_IORT_NODE_RMR:
    301 
    302             InfoTable = AcpiDmTableInfoIort6;
    303             Length = IortNode->Length - NodeOffset;
    304             IortRmr = ACPI_ADD_PTR (ACPI_IORT_RMR, IortNode, NodeOffset);
    305             break;
    306 
    307         default:
    308 
    309             AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",
    310                 IortNode->Type);
    311 
    312             /* Attempt to continue */
    313 
    314             if (!IortNode->Length)
    315             {
    316                 AcpiOsPrintf ("Invalid zero length IORT node\n");
    317                 return;
    318             }
    319             goto NextSubtable;
    320         }
    321 
    322         /* Dump the node subtable header */
    323 
    324         AcpiOsPrintf ("\n");
    325         Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    326             ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
    327             Length, InfoTable);
    328         if (ACPI_FAILURE (Status))
    329         {
    330             return;
    331         }
    332 
    333         NodeOffset += Length;
    334 
    335         /* Dump the node specific data */
    336 
    337         switch (IortNode->Type)
    338         {
    339         case ACPI_IORT_NODE_ITS_GROUP:
    340 
    341             /* Validate IortItsGroup to avoid compiler warnings */
    342 
    343             if (IortItsGroup)
    344             {
    345                 for (i = 0; i < IortItsGroup->ItsCount; i++)
    346                 {
    347                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    348                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
    349                         4, AcpiDmTableInfoIort0a);
    350                     if (ACPI_FAILURE (Status))
    351                     {
    352                         return;
    353                     }
    354 
    355                     NodeOffset += 4;
    356                 }
    357             }
    358             break;
    359 
    360         case ACPI_IORT_NODE_NAMED_COMPONENT:
    361 
    362             /* Dump the Padding (optional) */
    363 
    364             if (IortNode->Length > NodeOffset)
    365             {
    366                 MappingByteLength =
    367                     IortNode->MappingCount * sizeof (ACPI_IORT_ID_MAPPING);
    368                 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    369                     Table, IortNode->Length - NodeOffset - MappingByteLength,
    370                     AcpiDmTableInfoIort1a);
    371                 if (ACPI_FAILURE (Status))
    372                 {
    373                     return;
    374                 }
    375             }
    376             break;
    377 
    378         case ACPI_IORT_NODE_SMMU:
    379 
    380             AcpiOsPrintf ("\n");
    381 
    382             /* Validate IortSmmu to avoid compiler warnings */
    383 
    384             if (IortSmmu)
    385             {
    386                 Length = 2 * sizeof (UINT64);
    387                 NodeOffset = IortSmmu->GlobalInterruptOffset;
    388                 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    389                     ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
    390                     Length, AcpiDmTableInfoIort3a);
    391                 if (ACPI_FAILURE (Status))
    392                 {
    393                     return;
    394                 }
    395 
    396                 NodeOffset = IortSmmu->ContextInterruptOffset;
    397                 for (i = 0; i < IortSmmu->ContextInterruptCount; i++)
    398                 {
    399                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    400                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
    401                         8, AcpiDmTableInfoIort3b);
    402                     if (ACPI_FAILURE (Status))
    403                     {
    404                         return;
    405                     }
    406 
    407                     NodeOffset += 8;
    408                 }
    409 
    410                 NodeOffset = IortSmmu->PmuInterruptOffset;
    411                 for (i = 0; i < IortSmmu->PmuInterruptCount; i++)
    412                 {
    413                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    414                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
    415                         8, AcpiDmTableInfoIort3c);
    416                     if (ACPI_FAILURE (Status))
    417                     {
    418                         return;
    419                     }
    420 
    421                     NodeOffset += 8;
    422                 }
    423             }
    424             break;
    425 
    426         case ACPI_IORT_NODE_RMR:
    427 
    428             /* Validate IortRmr to avoid compiler warnings */
    429             if (IortRmr)
    430             {
    431                 NodeOffset = IortRmr->RmrOffset;
    432                 Length = sizeof (ACPI_IORT_RMR_DESC);
    433                 for (i = 0; i < IortRmr->RmrCount; i++)
    434                 {
    435                     AcpiOsPrintf ("\n");
    436                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    437                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
    438                         Length, AcpiDmTableInfoIort6a);
    439                     if (ACPI_FAILURE (Status))
    440                     {
    441                         return;
    442                     }
    443 
    444                     NodeOffset += Length;
    445                 }
    446             }
    447             break;
    448 
    449         default:
    450 
    451             break;
    452         }
    453 
    454         /* Dump the ID mappings */
    455 
    456         NodeOffset = IortNode->MappingOffset;
    457         for (i = 0; i < IortNode->MappingCount; i++)
    458         {
    459             AcpiOsPrintf ("\n");
    460             Length = sizeof (ACPI_IORT_ID_MAPPING);
    461             Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    462                 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
    463                 Length, AcpiDmTableInfoIortMap);
    464             if (ACPI_FAILURE (Status))
    465             {
    466                 return;
    467             }
    468 
    469             NodeOffset += Length;
    470         }
    471 
    472 NextSubtable:
    473         /* Point to next node subtable */
    474 
    475         Offset += IortNode->Length;
    476     }
    477 }
    478 
    479 
    480 /*******************************************************************************
    481  *
    482  * FUNCTION:    AcpiDmDumpIvrs
    483  *
    484  * PARAMETERS:  Table               - A IVRS table
    485  *
    486  * RETURN:      None
    487  *
    488  * DESCRIPTION: Format the contents of a IVRS. Notes:
    489  *              The IVRS is essentially a flat table, with the following
    490  *              structure:
    491  *              <Main ACPI Table Header>
    492  *              <Main subtable - virtualization info>
    493  *              <IVHD>
    494  *                  <Device Entries>
    495  *              ...
    496  *              <IVHD>
    497  *                  <Device Entries>
    498  *              <IVMD>
    499  *              ...
    500  *
    501  ******************************************************************************/
    502 
    503 void
    504 AcpiDmDumpIvrs (
    505     ACPI_TABLE_HEADER       *Table)
    506 {
    507     ACPI_STATUS             Status;
    508     UINT32                  Offset = sizeof (ACPI_TABLE_IVRS);
    509     UINT32                  EntryOffset;
    510     UINT32                  EntryLength;
    511     UINT32                  EntryType;
    512     ACPI_IVRS_DEVICE_HID    *HidSubtable;
    513     ACPI_IVRS_DE_HEADER     *DeviceEntry;
    514     ACPI_IVRS_HEADER        *Subtable;
    515     ACPI_DMTABLE_INFO       *InfoTable;
    516 
    517 
    518     /* Main table */
    519 
    520     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
    521     if (ACPI_FAILURE (Status))
    522     {
    523         return;
    524     }
    525 
    526     /* Subtables */
    527 
    528     Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
    529 
    530     while (Offset < Table->Length)
    531     {
    532         switch (Subtable->Type)
    533         {
    534         /* Type 10h, IVHD (I/O Virtualization Hardware Definition) */
    535 
    536         case ACPI_IVRS_TYPE_HARDWARE1:
    537 
    538             AcpiOsPrintf ("\n");
    539             InfoTable = AcpiDmTableInfoIvrsHware1;
    540             break;
    541 
    542         /* Types 11h, 40h, IVHD (I/O Virtualization Hardware Definition) */
    543 
    544         case ACPI_IVRS_TYPE_HARDWARE2:
    545         case ACPI_IVRS_TYPE_HARDWARE3:
    546 
    547             AcpiOsPrintf ("\n");
    548             InfoTable = AcpiDmTableInfoIvrsHware23;
    549             break;
    550 
    551         /* Types 20h-22h, IVMD (I/O Virtualization Memory Definition Block) */
    552 
    553         case ACPI_IVRS_TYPE_MEMORY1:
    554         case ACPI_IVRS_TYPE_MEMORY2:
    555         case ACPI_IVRS_TYPE_MEMORY3:
    556 
    557             AcpiOsPrintf ("\n");
    558             InfoTable = AcpiDmTableInfoIvrsMemory;
    559             break;
    560 
    561         default:
    562 
    563             AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n",
    564                 Subtable->Type);
    565 
    566             /* Attempt to continue */
    567 
    568             if (!Subtable->Length)
    569             {
    570                 AcpiOsPrintf ("Invalid zero length subtable\n");
    571                 return;
    572             }
    573             goto NextSubtable;
    574         }
    575 
    576         /* Dump the subtable */
    577 
    578         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
    579             Subtable->Length, InfoTable);
    580         if (ACPI_FAILURE (Status))
    581         {
    582             return;
    583         }
    584 
    585         /* The hardware subtables (IVHD) can contain multiple device entries */
    586 
    587         if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1 ||
    588             Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2 ||
    589             Subtable->Type == ACPI_IVRS_TYPE_HARDWARE3)
    590         {
    591             if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1)
    592             {
    593                 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE1);
    594                 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
    595                     sizeof (ACPI_IVRS_HARDWARE1));
    596             }
    597             else
    598             {
    599                 /* ACPI_IVRS_TYPE_HARDWARE2, HARDWARE3 subtable types */
    600 
    601                 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE2);
    602                 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
    603                     sizeof (ACPI_IVRS_HARDWARE2));
    604             }
    605 
    606             /* Process all of the Device Entries */
    607 
    608             while (EntryOffset < (Offset + Subtable->Length))
    609             {
    610                 AcpiOsPrintf ("\n");
    611 
    612                 /*
    613                  * Upper 2 bits of Type encode the length of the device entry
    614                  *
    615                  * 00 = 4 byte
    616                  * 01 = 8 byte
    617                  * 1x = variable length
    618                  */
    619                 EntryType = DeviceEntry->Type;
    620                 EntryLength = EntryType >> 6 == 1 ? 8 : 4;
    621 
    622                 switch (EntryType)
    623                 {
    624                 /* 4-byte device entries */
    625 
    626                 case ACPI_IVRS_TYPE_PAD4:
    627                 case ACPI_IVRS_TYPE_ALL:
    628                 case ACPI_IVRS_TYPE_SELECT:
    629                 case ACPI_IVRS_TYPE_START:
    630                 case ACPI_IVRS_TYPE_END:
    631 
    632                     InfoTable = AcpiDmTableInfoIvrs4;
    633                     break;
    634 
    635                 /* 8-byte entries, type A */
    636 
    637                 case ACPI_IVRS_TYPE_ALIAS_SELECT:
    638                 case ACPI_IVRS_TYPE_ALIAS_START:
    639 
    640                     InfoTable = AcpiDmTableInfoIvrs8a;
    641                     break;
    642 
    643                 /* 8-byte entries, type B */
    644 
    645                 case ACPI_IVRS_TYPE_PAD8:
    646                 case ACPI_IVRS_TYPE_EXT_SELECT:
    647                 case ACPI_IVRS_TYPE_EXT_START:
    648 
    649                     InfoTable = AcpiDmTableInfoIvrs8b;
    650                     break;
    651 
    652                 /* 8-byte entries, type C */
    653 
    654                 case ACPI_IVRS_TYPE_SPECIAL:
    655 
    656                     InfoTable = AcpiDmTableInfoIvrs8c;
    657                     break;
    658 
    659                 /* Variable-length entries */
    660 
    661                 case ACPI_IVRS_TYPE_HID:
    662 
    663                     EntryLength = 4;
    664                     InfoTable = AcpiDmTableInfoIvrsHid;
    665                     break;
    666 
    667                 default:
    668                     InfoTable = AcpiDmTableInfoIvrs4;
    669                     AcpiOsPrintf (
    670                         "\n**** Unknown IVRS device entry type/length: "
    671                         "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
    672                         EntryType, EntryLength, EntryOffset);
    673                     break;
    674                 }
    675 
    676                 /* Dump the Device Entry */
    677 
    678                 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
    679                     DeviceEntry, EntryLength, InfoTable);
    680                 if (ACPI_FAILURE (Status))
    681                 {
    682                     return;
    683                 }
    684 
    685                 HidSubtable = ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, DeviceEntry);
    686                 EntryOffset += EntryLength;
    687                 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, HidSubtable,
    688                     EntryLength);
    689 
    690                 if (EntryType == ACPI_IVRS_TYPE_HID)
    691                 {
    692                     /*
    693                      * Determine if the HID is an integer or a string.
    694                      * An integer is defined to be 32 bits, with the upper 32 bits
    695                      * set to zero. (from the ACPI Spec): "The HID can be a 32-bit
    696                      * integer or a character string. If an integer, the lower
    697                      * 4 bytes of the field contain the integer and the upper
    698                      * 4 bytes are padded with 0".
    699                      */
    700                     if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiHid))
    701                     {
    702                         Status = AcpiDmDumpTable (Table->Length, EntryOffset,
    703                             &HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidInteger);
    704                     }
    705                     else
    706                     {
    707                         Status = AcpiDmDumpTable (Table->Length, EntryOffset,
    708                             &HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidString);
    709                     }
    710                     if (ACPI_FAILURE (Status))
    711                     {
    712                         return;
    713                     }
    714 
    715                     EntryOffset += 8;
    716 
    717                     /*
    718                      * Determine if the CID is an integer or a string. The format
    719                      * of the CID is the same as the HID above. From ACPI Spec:
    720                      * "If present, CID must be a single Compatible Device ID
    721                      * following the same format as the HID field."
    722                      */
    723                     if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiCid))
    724                     {
    725                         Status = AcpiDmDumpTable (Table->Length, EntryOffset,
    726                             &HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidInteger);
    727                     }
    728                     else
    729                     {
    730                         Status = AcpiDmDumpTable (Table->Length, EntryOffset,
    731                             &HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidString);
    732                     }
    733                     if (ACPI_FAILURE (Status))
    734                     {
    735                         return;
    736                     }
    737 
    738                     EntryOffset += 8;
    739                     EntryLength = HidSubtable->UidLength;
    740 
    741                     if (EntryLength > ACPI_IVRS_UID_NOT_PRESENT)
    742                     {
    743                         /* Dump the UID based upon the UidType field (String or Integer) */
    744 
    745                         if (HidSubtable->UidType == ACPI_IVRS_UID_IS_STRING)
    746                         {
    747                             Status = AcpiDmDumpTable (Table->Length, EntryOffset,
    748                                 &HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidString);
    749                             if (ACPI_FAILURE (Status))
    750                             {
    751                                 return;
    752                             }
    753                         }
    754                         else /* ACPI_IVRS_UID_IS_INTEGER */
    755                         {
    756                             Status = AcpiDmDumpTable (Table->Length, EntryOffset,
    757                                 &HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidInteger);
    758                             if (ACPI_FAILURE (Status))
    759                             {
    760                                 return;
    761                             }
    762                         }
    763                     }
    764 
    765                     EntryOffset += EntryLength+2;
    766                     DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER,
    767                         Table, EntryOffset);
    768                 }
    769             }
    770         }
    771 
    772 NextSubtable:
    773         /* Point to next subtable */
    774 
    775         Offset += Subtable->Length;
    776         Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, Subtable->Length);
    777     }
    778 }
    779 
    780 
    781 /*******************************************************************************
    782  *
    783  * FUNCTION:    AcpiDmDumpLpit
    784  *
    785  * PARAMETERS:  Table               - A LPIT table
    786  *
    787  * RETURN:      None
    788  *
    789  * DESCRIPTION: Format the contents of a LPIT. This table type consists
    790  *              of an open-ended number of subtables. Note: There are no
    791  *              entries in the main table. An LPIT consists of the table
    792  *              header and then subtables only.
    793  *
    794  ******************************************************************************/
    795 
    796 void
    797 AcpiDmDumpLpit (
    798     ACPI_TABLE_HEADER       *Table)
    799 {
    800     ACPI_STATUS             Status;
    801     ACPI_LPIT_HEADER        *Subtable;
    802     UINT32                  Length = Table->Length;
    803     UINT32                  Offset = sizeof (ACPI_TABLE_LPIT);
    804     ACPI_DMTABLE_INFO       *InfoTable;
    805     UINT32                  SubtableLength;
    806 
    807 
    808     /* Subtables */
    809 
    810     Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
    811     while (Offset < Table->Length)
    812     {
    813         /* Common subtable header */
    814 
    815         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    816             sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);
    817         if (ACPI_FAILURE (Status))
    818         {
    819             return;
    820         }
    821 
    822         switch (Subtable->Type)
    823         {
    824         case ACPI_LPIT_TYPE_NATIVE_CSTATE:
    825 
    826             InfoTable = AcpiDmTableInfoLpit0;
    827             SubtableLength = sizeof (ACPI_LPIT_NATIVE);
    828             break;
    829 
    830         default:
    831 
    832             /* Cannot continue on unknown type - no length */
    833 
    834             AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n",
    835                 Subtable->Type);
    836             return;
    837         }
    838 
    839         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    840             SubtableLength, InfoTable);
    841         if (ACPI_FAILURE (Status))
    842         {
    843             return;
    844         }
    845 
    846         AcpiOsPrintf ("\n");
    847 
    848         /* Point to next subtable */
    849 
    850         Offset += SubtableLength;
    851         Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Subtable, SubtableLength);
    852     }
    853 }
    854 
    855 
    856 /*******************************************************************************
    857  *
    858  * FUNCTION:    AcpiDmDumpMadt
    859  *
    860  * PARAMETERS:  Table               - A MADT table
    861  *
    862  * RETURN:      None
    863  *
    864  * DESCRIPTION: Format the contents of a MADT. This table type consists
    865  *              of an open-ended number of subtables.
    866  *
    867  ******************************************************************************/
    868 
    869 void
    870 AcpiDmDumpMadt (
    871     ACPI_TABLE_HEADER       *Table)
    872 {
    873     ACPI_STATUS             Status;
    874     ACPI_SUBTABLE_HEADER    *Subtable;
    875     UINT32                  Length = Table->Length;
    876     UINT32                  Offset = sizeof (ACPI_TABLE_MADT);
    877     ACPI_DMTABLE_INFO       *InfoTable;
    878     UINT8                   Revision;
    879 
    880 
    881     /* Main table */
    882 
    883     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
    884     if (ACPI_FAILURE (Status))
    885     {
    886         return;
    887     }
    888 
    889     Revision = Table->Revision;
    890 
    891     /* Subtables */
    892 
    893     Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
    894     DbgPrint (ASL_PARSE_OUTPUT, "//0B) Offset %X, from table start: 0x%8.8X%8.8X\n",
    895         Offset, ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)));
    896     while (Offset < Table->Length)
    897     {
    898         /* Common subtable header */
    899 
    900         AcpiOsPrintf ("\n");
    901         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    902             Subtable->Length, AcpiDmTableInfoMadtHdr);
    903         if (ACPI_FAILURE (Status))
    904         {
    905             return;
    906         }
    907 
    908         DbgPrint (ASL_PARSE_OUTPUT, "subtableType: %X\n", Subtable->Type);
    909         switch (Subtable->Type)
    910         {
    911         case ACPI_MADT_TYPE_LOCAL_APIC:
    912 
    913             InfoTable = AcpiDmTableInfoMadt0;
    914             break;
    915 
    916         case ACPI_MADT_TYPE_IO_APIC:
    917 
    918             InfoTable = AcpiDmTableInfoMadt1;
    919             break;
    920 
    921         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
    922 
    923             InfoTable = AcpiDmTableInfoMadt2;
    924             break;
    925 
    926         case ACPI_MADT_TYPE_NMI_SOURCE:
    927 
    928             InfoTable = AcpiDmTableInfoMadt3;
    929             break;
    930 
    931         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
    932 
    933             InfoTable = AcpiDmTableInfoMadt4;
    934             break;
    935 
    936         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
    937 
    938             InfoTable = AcpiDmTableInfoMadt5;
    939             break;
    940 
    941         case ACPI_MADT_TYPE_IO_SAPIC:
    942 
    943             InfoTable = AcpiDmTableInfoMadt6;
    944             break;
    945 
    946         case ACPI_MADT_TYPE_LOCAL_SAPIC:
    947 
    948             InfoTable = AcpiDmTableInfoMadt7;
    949             break;
    950 
    951         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
    952 
    953             InfoTable = AcpiDmTableInfoMadt8;
    954             break;
    955 
    956         case ACPI_MADT_TYPE_LOCAL_X2APIC:
    957 
    958             InfoTable = AcpiDmTableInfoMadt9;
    959             break;
    960 
    961         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
    962 
    963             InfoTable = AcpiDmTableInfoMadt10;
    964             break;
    965 
    966         case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
    967 
    968 	    if (Revision > 6)
    969                     InfoTable = AcpiDmTableInfoMadt11b;
    970 	    else if (Revision == 6)
    971                     InfoTable = AcpiDmTableInfoMadt11a;
    972 	    else
    973                     InfoTable = AcpiDmTableInfoMadt11;
    974             break;
    975 
    976         case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
    977 
    978             InfoTable = AcpiDmTableInfoMadt12;
    979             break;
    980 
    981         case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
    982 
    983             InfoTable = AcpiDmTableInfoMadt13;
    984             break;
    985 
    986         case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
    987 
    988             InfoTable = Revision > 6 ? AcpiDmTableInfoMadt14a :
    989 				AcpiDmTableInfoMadt14;
    990             break;
    991 
    992         case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
    993 
    994             InfoTable = Revision > 6 ? AcpiDmTableInfoMadt15a :
    995 				AcpiDmTableInfoMadt15;
    996             break;
    997 
    998         case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
    999 
   1000             InfoTable = AcpiDmTableInfoMadt16;
   1001             break;
   1002 
   1003         case ACPI_MADT_TYPE_CORE_PIC:
   1004 
   1005             InfoTable = AcpiDmTableInfoMadt17;
   1006             break;
   1007 
   1008         case ACPI_MADT_TYPE_LIO_PIC:
   1009 
   1010             InfoTable = AcpiDmTableInfoMadt18;
   1011             break;
   1012 
   1013         case ACPI_MADT_TYPE_HT_PIC:
   1014 
   1015             InfoTable = AcpiDmTableInfoMadt19;
   1016             break;
   1017 
   1018         case ACPI_MADT_TYPE_EIO_PIC:
   1019 
   1020             InfoTable = AcpiDmTableInfoMadt20;
   1021             break;
   1022 
   1023         case ACPI_MADT_TYPE_MSI_PIC:
   1024 
   1025             InfoTable = AcpiDmTableInfoMadt21;
   1026             break;
   1027 
   1028         case ACPI_MADT_TYPE_BIO_PIC:
   1029 
   1030             InfoTable = AcpiDmTableInfoMadt22;
   1031             break;
   1032 
   1033         case ACPI_MADT_TYPE_LPC_PIC:
   1034 
   1035             InfoTable = AcpiDmTableInfoMadt23;
   1036             break;
   1037 
   1038         case ACPI_MADT_TYPE_RINTC:
   1039 
   1040             InfoTable = AcpiDmTableInfoMadt24;
   1041             break;
   1042 
   1043         case ACPI_MADT_TYPE_IMSIC:
   1044 
   1045             InfoTable = AcpiDmTableInfoMadt25;
   1046             break;
   1047 
   1048         case ACPI_MADT_TYPE_APLIC:
   1049 
   1050             InfoTable = AcpiDmTableInfoMadt26;
   1051             break;
   1052 
   1053         case ACPI_MADT_TYPE_PLIC:
   1054 
   1055             InfoTable = AcpiDmTableInfoMadt27;
   1056             break;
   1057 
   1058         default:
   1059 
   1060             if ((Subtable->Type >= ACPI_MADT_TYPE_RESERVED) &&
   1061                 (Subtable->Type < ACPI_MADT_TYPE_OEM_RESERVED))
   1062             {
   1063                 AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",
   1064                     Subtable->Type);
   1065                 goto NextSubtable;
   1066             }
   1067             else if (Subtable->Type >= ACPI_MADT_TYPE_OEM_RESERVED)
   1068             {
   1069                 DbgPrint (ASL_PARSE_OUTPUT, "//[Found an OEM structure, type = %0x]\n",
   1070                     Subtable->Type);
   1071                 Offset += sizeof (ACPI_SUBTABLE_HEADER);
   1072                 DbgPrint (ASL_PARSE_OUTPUT, "//[0) Subtable->Length = %X, Subtable = %p, Offset = %X]\n",
   1073                     Subtable->Length, Subtable, Offset);
   1074                 DbgPrint (ASL_PARSE_OUTPUT, "//[0A) Offset from table start: 0x%8.8X%8.8X]\n",
   1075                     ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)));
   1076             }
   1077 
   1078             /* Attempt to continue */
   1079 
   1080             if (!Subtable->Length)
   1081             {
   1082                 AcpiOsPrintf ("Invalid zero length subtable\n");
   1083                 return;
   1084             }
   1085 
   1086             /* Dump the OEM data */
   1087 
   1088             Status = AcpiDmDumpTable (Length, Offset, ACPI_CAST_PTR (UINT8, Table) + Offset,
   1089                 Subtable->Length - sizeof (ACPI_SUBTABLE_HEADER), AcpiDmTableInfoMadt128);
   1090             if (ACPI_FAILURE (Status))
   1091             {
   1092                 return;
   1093             }
   1094 
   1095             DbgPrint (ASL_PARSE_OUTPUT, "//[1) Subtable->Length = %X, Offset = %X]\n",
   1096                 Subtable->Length, Offset);
   1097             Offset -= sizeof (ACPI_SUBTABLE_HEADER);
   1098 
   1099             goto NextSubtable;
   1100         }
   1101 
   1102         DbgPrint (ASL_PARSE_OUTPUT, "//[2) Subtable->Length = %X, Offset = %X]\n",
   1103             Subtable->Length, Offset);
   1104         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1105             Subtable->Length, InfoTable);
   1106         if (ACPI_FAILURE (Status))
   1107         {
   1108             return;
   1109         }
   1110 
   1111 NextSubtable:
   1112         /* Point to next subtable */
   1113 
   1114         DbgPrint (ASL_PARSE_OUTPUT, "//[3) Subtable->Length = %X, Offset = %X]\n",
   1115             Subtable->Length, Offset);
   1116         DbgPrint (ASL_PARSE_OUTPUT, "//[4) Offset from table start: 0x%8.8X%8.8X (%p) %p]\n",
   1117             ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (UINT8, Subtable) - ACPI_CAST_PTR (UINT8, Table)), Subtable, Table);
   1118         if (Offset > Table->Length)
   1119         {
   1120             return;
   1121         }
   1122 
   1123         Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable,
   1124             Subtable->Length);
   1125 
   1126         Offset = ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table);
   1127         if (Offset >= Table->Length)
   1128         {
   1129             return;
   1130         }
   1131 
   1132         DbgPrint (ASL_PARSE_OUTPUT, "//[5) Next Subtable %p, length %X]\n",
   1133             Subtable, Subtable->Length);
   1134         DbgPrint (ASL_PARSE_OUTPUT, "//[5B) Offset from table start: 0x%8.8X%8.8X (%p)]\n",
   1135             ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)), Subtable);
   1136     }
   1137 }
   1138 
   1139 
   1140 /*******************************************************************************
   1141  *
   1142  * FUNCTION:    AcpiDmDumpMcfg
   1143  *
   1144  * PARAMETERS:  Table               - A MCFG Table
   1145  *
   1146  * RETURN:      None
   1147  *
   1148  * DESCRIPTION: Format the contents of a MCFG table
   1149  *
   1150  ******************************************************************************/
   1151 
   1152 void
   1153 AcpiDmDumpMcfg (
   1154     ACPI_TABLE_HEADER       *Table)
   1155 {
   1156     ACPI_STATUS             Status;
   1157     UINT32                  Offset = sizeof (ACPI_TABLE_MCFG);
   1158     ACPI_MCFG_ALLOCATION    *Subtable;
   1159 
   1160 
   1161     /* Main table */
   1162 
   1163     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
   1164     if (ACPI_FAILURE (Status))
   1165     {
   1166         return;
   1167     }
   1168 
   1169     /* Subtables */
   1170 
   1171     Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
   1172     while (Offset < Table->Length)
   1173     {
   1174         if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
   1175         {
   1176             AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
   1177                 (UINT32) sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
   1178             return;
   1179         }
   1180 
   1181         AcpiOsPrintf ("\n");
   1182         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1183             sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
   1184         if (ACPI_FAILURE (Status))
   1185         {
   1186             return;
   1187         }
   1188 
   1189         /* Point to next subtable (each subtable is of fixed length) */
   1190 
   1191         Offset += sizeof (ACPI_MCFG_ALLOCATION);
   1192         Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Subtable,
   1193             sizeof (ACPI_MCFG_ALLOCATION));
   1194     }
   1195 }
   1196 
   1197 /*******************************************************************************
   1198  *
   1199  * FUNCTION:    AcpiDmDumpMpam
   1200  *
   1201  * PARAMETERS:  Table               - A MPAM table
   1202  *
   1203  * RETURN:      None
   1204  *
   1205  * DESCRIPTION: Format the contents of a MPAM table
   1206  *
   1207  ******************************************************************************/
   1208 
   1209 void
   1210 AcpiDmDumpMpam (
   1211     ACPI_TABLE_HEADER          *Table)
   1212 {
   1213     ACPI_STATUS                Status;
   1214     ACPI_MPAM_MSC_NODE         *MpamMscNode;
   1215     ACPI_MPAM_RESOURCE_NODE    *MpamResourceNode;
   1216     ACPI_MPAM_FUNC_DEPS	       *MpamFunctionalDependency;
   1217     ACPI_DMTABLE_INFO          *InfoTable;
   1218     UINT32                     Offset = sizeof(ACPI_TABLE_HEADER);
   1219     UINT32		       TempOffset;
   1220     UINT32                     MpamResourceNodeLength = 0;
   1221 
   1222     while (Offset < Table->Length)
   1223     {
   1224         MpamMscNode = ACPI_ADD_PTR (ACPI_MPAM_MSC_NODE, Table, Offset);
   1225 
   1226         /* Subtable: MSC */
   1227         Status = AcpiDmDumpTable (Table->Length, Offset, MpamMscNode,
   1228             MpamMscNode->Length, AcpiDmTableInfoMpam0);
   1229         if (ACPI_FAILURE (Status))
   1230         {
   1231             return;
   1232         }
   1233 
   1234         /* Offset the start of the array of resources */
   1235         Offset += sizeof(ACPI_MPAM_MSC_NODE);
   1236 
   1237         /* Subtable: MSC RIS(es) */
   1238         for (UINT32 ResourceIdx = 0; ResourceIdx < MpamMscNode->NumResourceNodes; ResourceIdx++)
   1239         {
   1240 	    AcpiOsPrintf ("\n");
   1241             MpamResourceNode = ACPI_ADD_PTR (ACPI_MPAM_RESOURCE_NODE, Table, Offset);
   1242 
   1243             MpamResourceNodeLength = sizeof(ACPI_MPAM_RESOURCE_NODE) +
   1244                 MpamResourceNode->NumFunctionalDeps * sizeof(ACPI_MPAM_FUNC_DEPS);
   1245 	    TempOffset = Offset;
   1246             Offset += MpamResourceNodeLength;
   1247 
   1248             /* Subtable: MSC RIS */
   1249 	    Status = AcpiDmDumpTable (Table->Length, TempOffset, MpamResourceNode,
   1250 		sizeof(ACPI_MPAM_RESOURCE_NODE), AcpiDmTableInfoMpam1);
   1251             if (ACPI_FAILURE (Status))
   1252             {
   1253                 return;
   1254             }
   1255 
   1256             switch (MpamResourceNode->LocatorType)
   1257             {
   1258                 case ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE:
   1259                     InfoTable = AcpiDmTableInfoMpam1A;
   1260                     break;
   1261                 case ACPI_MPAM_LOCATION_TYPE_MEMORY:
   1262                     InfoTable = AcpiDmTableInfoMpam1B;
   1263                     break;
   1264                 case ACPI_MPAM_LOCATION_TYPE_SMMU:
   1265                     InfoTable = AcpiDmTableInfoMpam1C;
   1266                     break;
   1267                 case ACPI_MPAM_LOCATION_TYPE_MEMORY_CACHE:
   1268                     InfoTable = AcpiDmTableInfoMpam1D;
   1269                     break;
   1270                 case ACPI_MPAM_LOCATION_TYPE_ACPI_DEVICE:
   1271                     InfoTable = AcpiDmTableInfoMpam1E;
   1272                     break;
   1273                 case ACPI_MPAM_LOCATION_TYPE_INTERCONNECT:
   1274                     InfoTable = AcpiDmTableInfoMpam1F;
   1275                     break;
   1276                 case ACPI_MPAM_LOCATION_TYPE_UNKNOWN:
   1277                     InfoTable = AcpiDmTableInfoMpam1G;
   1278                 default:
   1279                     AcpiOsPrintf ("\n**** Unknown MPAM locator type 0x%X\n",
   1280                         MpamResourceNode->LocatorType);
   1281                     return;
   1282             }
   1283 
   1284             /* Subtable: MSC Resource Locator(s) */
   1285 	    TempOffset += ACPI_OFFSET(ACPI_MPAM_RESOURCE_NODE, Locator);
   1286 	    Status = AcpiDmDumpTable (Table->Length, TempOffset, &MpamResourceNode->Locator,
   1287 		sizeof(ACPI_MPAM_RESOURCE_LOCATOR), InfoTable);
   1288             if (ACPI_FAILURE (Status))
   1289             {
   1290                 return;
   1291             }
   1292 
   1293             /* Get the number of functional dependencies of an RIS */
   1294 	    TempOffset += sizeof(ACPI_MPAM_RESOURCE_LOCATOR);
   1295             Status = AcpiDmDumpTable (Table->Length, TempOffset, &MpamResourceNode->NumFunctionalDeps,
   1296 		sizeof(UINT32), AcpiDmTableInfoMpam1Deps);
   1297             if (ACPI_FAILURE (Status))
   1298             {
   1299                 return;
   1300             }
   1301 
   1302 	    TempOffset += sizeof(UINT32);
   1303 	    MpamFunctionalDependency = ACPI_ADD_PTR (ACPI_MPAM_FUNC_DEPS, MpamResourceNode,
   1304 		sizeof(ACPI_MPAM_RESOURCE_NODE));
   1305             /* Subtable: MSC functional dependencies */
   1306             for (UINT32 funcDep = 0; funcDep < MpamResourceNode->NumFunctionalDeps; funcDep++)
   1307             {
   1308 		AcpiOsPrintf ("\n");
   1309                 Status = AcpiDmDumpTable (sizeof(ACPI_MPAM_FUNC_DEPS), 0,
   1310                     &MpamResourceNode->NumFunctionalDeps, 0, AcpiDmTableInfoMpam2);
   1311 		Status = AcpiDmDumpTable (Table->Length, TempOffset, MpamFunctionalDependency,
   1312 		    sizeof(ACPI_MPAM_FUNC_DEPS), AcpiDmTableInfoMpam2);
   1313                 if (ACPI_FAILURE (Status))
   1314                 {
   1315                     return;
   1316                 }
   1317 		TempOffset += sizeof(ACPI_MPAM_FUNC_DEPS);
   1318 		MpamFunctionalDependency++;
   1319             }
   1320 
   1321             AcpiOsPrintf ("\n\n");
   1322         }
   1323 
   1324     }
   1325 
   1326     return;
   1327 }
   1328 
   1329 /*******************************************************************************
   1330  *
   1331  * FUNCTION:    AcpiDmDumpMpst
   1332  *
   1333  * PARAMETERS:  Table               - A MPST Table
   1334  *
   1335  * RETURN:      None
   1336  *
   1337  * DESCRIPTION: Format the contents of a MPST table
   1338  *
   1339  ******************************************************************************/
   1340 
   1341 void
   1342 AcpiDmDumpMpst (
   1343     ACPI_TABLE_HEADER       *Table)
   1344 {
   1345     ACPI_STATUS             Status;
   1346     UINT32                  Offset = sizeof (ACPI_TABLE_MPST);
   1347     ACPI_MPST_POWER_NODE    *Subtable0;
   1348     ACPI_MPST_POWER_STATE   *Subtable0A;
   1349     ACPI_MPST_COMPONENT     *Subtable0B;
   1350     ACPI_MPST_DATA_HDR      *Subtable1;
   1351     ACPI_MPST_POWER_DATA    *Subtable2;
   1352     UINT16                  SubtableCount;
   1353     UINT32                  PowerStateCount;
   1354     UINT32                  ComponentCount;
   1355 
   1356 
   1357     /* Main table */
   1358 
   1359     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
   1360     if (ACPI_FAILURE (Status))
   1361     {
   1362         return;
   1363     }
   1364 
   1365     /* Subtable: Memory Power Node(s) */
   1366 
   1367     SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
   1368     Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
   1369 
   1370     while ((Offset < Table->Length) && SubtableCount)
   1371     {
   1372         AcpiOsPrintf ("\n");
   1373         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0,
   1374             sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
   1375         if (ACPI_FAILURE (Status))
   1376         {
   1377             return;
   1378         }
   1379 
   1380         /* Extract the sub-subtable counts */
   1381 
   1382         PowerStateCount = Subtable0->NumPowerStates;
   1383         ComponentCount = Subtable0->NumPhysicalComponents;
   1384         Offset += sizeof (ACPI_MPST_POWER_NODE);
   1385 
   1386         /* Sub-subtables - Memory Power State Structure(s) */
   1387 
   1388         Subtable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, Subtable0,
   1389             sizeof (ACPI_MPST_POWER_NODE));
   1390 
   1391         while (PowerStateCount)
   1392         {
   1393             AcpiOsPrintf ("\n");
   1394             Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A,
   1395                 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
   1396             if (ACPI_FAILURE (Status))
   1397             {
   1398                 return;
   1399             }
   1400 
   1401             Subtable0A++;
   1402             PowerStateCount--;
   1403             Offset += sizeof (ACPI_MPST_POWER_STATE);
   1404        }
   1405 
   1406         /* Sub-subtables - Physical Component ID Structure(s) */
   1407 
   1408         Subtable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, Subtable0A);
   1409 
   1410         if (ComponentCount)
   1411         {
   1412             AcpiOsPrintf ("\n");
   1413         }
   1414 
   1415         while (ComponentCount)
   1416         {
   1417             Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B,
   1418                 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
   1419             if (ACPI_FAILURE (Status))
   1420             {
   1421                 return;
   1422             }
   1423 
   1424             Subtable0B++;
   1425             ComponentCount--;
   1426             Offset += sizeof (ACPI_MPST_COMPONENT);
   1427         }
   1428 
   1429         /* Point to next Memory Power Node subtable */
   1430 
   1431         SubtableCount--;
   1432         Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Subtable0,
   1433             sizeof (ACPI_MPST_POWER_NODE) +
   1434             (sizeof (ACPI_MPST_POWER_STATE) * Subtable0->NumPowerStates) +
   1435             (sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents));
   1436     }
   1437 
   1438     /* Subtable: Count of Memory Power State Characteristic structures */
   1439 
   1440     AcpiOsPrintf ("\n");
   1441     Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0);
   1442     Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1,
   1443         sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
   1444     if (ACPI_FAILURE (Status))
   1445     {
   1446         return;
   1447     }
   1448 
   1449     SubtableCount = Subtable1->CharacteristicsCount;
   1450     Offset += sizeof (ACPI_MPST_DATA_HDR);
   1451 
   1452     /* Subtable: Memory Power State Characteristics structure(s) */
   1453 
   1454     Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1,
   1455         sizeof (ACPI_MPST_DATA_HDR));
   1456 
   1457     while ((Offset < Table->Length) && SubtableCount)
   1458     {
   1459         AcpiOsPrintf ("\n");
   1460         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2,
   1461             sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
   1462         if (ACPI_FAILURE (Status))
   1463         {
   1464             return;
   1465         }
   1466 
   1467         Subtable2++;
   1468         SubtableCount--;
   1469         Offset += sizeof (ACPI_MPST_POWER_DATA);
   1470     }
   1471 }
   1472 
   1473 
   1474 /*******************************************************************************
   1475  *
   1476  * FUNCTION:    AcpiDmDumpMrrm
   1477  *
   1478  * PARAMETERS:  Table               - A MRRM table
   1479  *
   1480  * RETURN:      None
   1481  *
   1482  * DESCRIPTION: Format the contents of a MRRM
   1483  *
   1484  ******************************************************************************/
   1485 
   1486 void
   1487 AcpiDmDumpMrrm (
   1488     ACPI_TABLE_HEADER       *Table)
   1489 {
   1490     ACPI_STATUS                      Status;
   1491     ACPI_MRRM_MEM_RANGE_ENTRY        *Subtable;
   1492     UINT16                           Offset = sizeof (ACPI_TABLE_MRRM);
   1493 
   1494     /* Main table */
   1495 
   1496     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMrrm);
   1497     if (ACPI_FAILURE (Status))
   1498     {
   1499         return;
   1500     }
   1501 
   1502     /* Subtables (all are same type) */
   1503 
   1504     Subtable = ACPI_ADD_PTR (ACPI_MRRM_MEM_RANGE_ENTRY, Table, Offset);
   1505     while (Offset < Table->Length)
   1506     {
   1507         AcpiOsPrintf ("\n");
   1508         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1509             Subtable->Header.Length, AcpiDmTableInfoMrrm0);
   1510         if (ACPI_FAILURE (Status))
   1511         {
   1512             return;
   1513         }
   1514 
   1515         Offset += Subtable->Header.Length;
   1516         Subtable = ACPI_ADD_PTR (ACPI_MRRM_MEM_RANGE_ENTRY, Subtable,
   1517            Subtable->Header.Length);
   1518     }
   1519 }
   1520 
   1521 
   1522 /*******************************************************************************
   1523  *
   1524  * FUNCTION:    AcpiDmDumpMsct
   1525  *
   1526  * PARAMETERS:  Table               - A MSCT table
   1527  *
   1528  * RETURN:      None
   1529  *
   1530  * DESCRIPTION: Format the contents of a MSCT
   1531  *
   1532  ******************************************************************************/
   1533 
   1534 void
   1535 AcpiDmDumpMsct (
   1536     ACPI_TABLE_HEADER       *Table)
   1537 {
   1538     ACPI_STATUS             Status;
   1539     UINT32                  Offset = sizeof (ACPI_TABLE_MSCT);
   1540     ACPI_MSCT_PROXIMITY     *Subtable;
   1541 
   1542 
   1543     /* Main table */
   1544 
   1545     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
   1546     if (ACPI_FAILURE (Status))
   1547     {
   1548         return;
   1549     }
   1550 
   1551     /* Subtables */
   1552 
   1553     Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
   1554     while (Offset < Table->Length)
   1555     {
   1556         /* Common subtable header */
   1557 
   1558         AcpiOsPrintf ("\n");
   1559         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1560             sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
   1561         if (ACPI_FAILURE (Status))
   1562         {
   1563             return;
   1564         }
   1565 
   1566         /* Point to next subtable */
   1567 
   1568         Offset += sizeof (ACPI_MSCT_PROXIMITY);
   1569         Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Subtable,
   1570             sizeof (ACPI_MSCT_PROXIMITY));
   1571     }
   1572 }
   1573 
   1574 
   1575 /*******************************************************************************
   1576  *
   1577  * FUNCTION:    AcpiDmDumpNfit
   1578  *
   1579  * PARAMETERS:  Table               - A NFIT table
   1580  *
   1581  * RETURN:      None
   1582  *
   1583  * DESCRIPTION: Format the contents of an NFIT.
   1584  *
   1585  ******************************************************************************/
   1586 
   1587 void
   1588 AcpiDmDumpNfit (
   1589     ACPI_TABLE_HEADER       *Table)
   1590 {
   1591     ACPI_STATUS             Status;
   1592     UINT32                  Offset = sizeof (ACPI_TABLE_NFIT);
   1593     UINT32                  FieldOffset = 0;
   1594     UINT32                  Length;
   1595     ACPI_NFIT_HEADER        *Subtable;
   1596     ACPI_DMTABLE_INFO       *InfoTable;
   1597     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
   1598     ACPI_NFIT_SMBIOS        *SmbiosInfo = NULL;
   1599     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
   1600     UINT32                  i;
   1601 
   1602 
   1603     /* Main table */
   1604 
   1605     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
   1606     if (ACPI_FAILURE (Status))
   1607     {
   1608         return;
   1609     }
   1610 
   1611     /* Subtables */
   1612 
   1613     Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
   1614     while (Offset < Table->Length)
   1615     {
   1616         /* NFIT subtable header */
   1617 
   1618         AcpiOsPrintf ("\n");
   1619         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1620             Subtable->Length, AcpiDmTableInfoNfitHdr);
   1621         if (ACPI_FAILURE (Status))
   1622         {
   1623             return;
   1624         }
   1625 
   1626         switch (Subtable->Type)
   1627         {
   1628         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
   1629 
   1630             InfoTable = AcpiDmTableInfoNfit0;
   1631             break;
   1632 
   1633         case ACPI_NFIT_TYPE_MEMORY_MAP:
   1634 
   1635             InfoTable = AcpiDmTableInfoNfit1;
   1636             break;
   1637 
   1638         case ACPI_NFIT_TYPE_INTERLEAVE:
   1639 
   1640             /* Has a variable number of 32-bit values at the end */
   1641 
   1642             InfoTable = AcpiDmTableInfoNfit2;
   1643             FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);
   1644             break;
   1645 
   1646         case ACPI_NFIT_TYPE_SMBIOS:
   1647 
   1648             SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, Subtable);
   1649             InfoTable = AcpiDmTableInfoNfit3;
   1650             break;
   1651 
   1652         case ACPI_NFIT_TYPE_CONTROL_REGION:
   1653 
   1654             InfoTable = AcpiDmTableInfoNfit4;
   1655             break;
   1656 
   1657         case ACPI_NFIT_TYPE_DATA_REGION:
   1658 
   1659             InfoTable = AcpiDmTableInfoNfit5;
   1660             break;
   1661 
   1662         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
   1663 
   1664             /* Has a variable number of 64-bit addresses at the end */
   1665 
   1666             InfoTable = AcpiDmTableInfoNfit6;
   1667             FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS);
   1668             break;
   1669 
   1670         case ACPI_NFIT_TYPE_CAPABILITIES:    /* ACPI 6.0A */
   1671 
   1672             InfoTable = AcpiDmTableInfoNfit7;
   1673             break;
   1674 
   1675         default:
   1676             AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
   1677                 Subtable->Type);
   1678 
   1679             /* Attempt to continue */
   1680 
   1681             if (!Subtable->Length)
   1682             {
   1683                 AcpiOsPrintf ("Invalid zero length subtable\n");
   1684                 return;
   1685             }
   1686             goto NextSubtable;
   1687         }
   1688 
   1689         AcpiOsPrintf ("\n");
   1690         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1691             Subtable->Length, InfoTable);
   1692         if (ACPI_FAILURE (Status))
   1693         {
   1694             return;
   1695         }
   1696 
   1697         /* Per-subtable variable-length fields */
   1698 
   1699         switch (Subtable->Type)
   1700         {
   1701         case ACPI_NFIT_TYPE_INTERLEAVE:
   1702 
   1703             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable);
   1704             for (i = 0; i < Interleave->LineCount; i++)
   1705             {
   1706                 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
   1707                     &Interleave->LineOffset[i],
   1708                     sizeof (UINT32), AcpiDmTableInfoNfit2a);
   1709                 if (ACPI_FAILURE (Status))
   1710                 {
   1711                     return;
   1712                 }
   1713 
   1714                 FieldOffset += sizeof (UINT32);
   1715             }
   1716             break;
   1717 
   1718         case ACPI_NFIT_TYPE_SMBIOS:
   1719 
   1720             Length = Subtable->Length -
   1721                 sizeof (ACPI_NFIT_SMBIOS);
   1722 
   1723             if (Length)
   1724             {
   1725                 Status = AcpiDmDumpTable (Table->Length,
   1726                     sizeof (ACPI_NFIT_SMBIOS),
   1727                     SmbiosInfo,
   1728                     Length, AcpiDmTableInfoNfit3a);
   1729                 if (ACPI_FAILURE (Status))
   1730                 {
   1731                     return;
   1732                 }
   1733             }
   1734 
   1735             break;
   1736 
   1737         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
   1738 
   1739             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable);
   1740             for (i = 0; i < Hint->HintCount; i++)
   1741             {
   1742                 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
   1743                     &Hint->HintAddress[i],
   1744                     sizeof (UINT64), AcpiDmTableInfoNfit6a);
   1745                 if (ACPI_FAILURE (Status))
   1746                 {
   1747                     return;
   1748                 }
   1749 
   1750                 FieldOffset += sizeof (UINT64);
   1751             }
   1752             break;
   1753 
   1754         default:
   1755             break;
   1756         }
   1757 
   1758 NextSubtable:
   1759         /* Point to next subtable */
   1760 
   1761         Offset += Subtable->Length;
   1762         Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length);
   1763     }
   1764 }
   1765 
   1766 
   1767 /*******************************************************************************
   1768  *
   1769  * FUNCTION:    AcpiDmDumpPcct
   1770  *
   1771  * PARAMETERS:  Table               - A PCCT table
   1772  *
   1773  * RETURN:      None
   1774  *
   1775  * DESCRIPTION: Format the contents of a PCCT. This table type consists
   1776  *              of an open-ended number of subtables.
   1777  *
   1778  ******************************************************************************/
   1779 
   1780 void
   1781 AcpiDmDumpPcct (
   1782     ACPI_TABLE_HEADER       *Table)
   1783 {
   1784     ACPI_STATUS             Status;
   1785     ACPI_PCCT_SUBSPACE      *Subtable;
   1786     ACPI_DMTABLE_INFO       *InfoTable;
   1787     UINT32                  Length = Table->Length;
   1788     UINT32                  Offset = sizeof (ACPI_TABLE_PCCT);
   1789 
   1790 
   1791     /* Main table */
   1792 
   1793     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
   1794     if (ACPI_FAILURE (Status))
   1795     {
   1796         return;
   1797     }
   1798 
   1799     /* Subtables */
   1800 
   1801     Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
   1802     while (Offset < Table->Length)
   1803     {
   1804         /* Common subtable header */
   1805 
   1806         AcpiOsPrintf ("\n");
   1807         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1808             Subtable->Header.Length, AcpiDmTableInfoPcctHdr);
   1809         if (ACPI_FAILURE (Status))
   1810         {
   1811             return;
   1812         }
   1813 
   1814         switch (Subtable->Header.Type)
   1815         {
   1816         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
   1817 
   1818             InfoTable = AcpiDmTableInfoPcct0;
   1819             break;
   1820 
   1821         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
   1822 
   1823             InfoTable = AcpiDmTableInfoPcct1;
   1824             break;
   1825 
   1826         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
   1827 
   1828             InfoTable = AcpiDmTableInfoPcct2;
   1829             break;
   1830 
   1831         case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
   1832 
   1833             InfoTable = AcpiDmTableInfoPcct3;
   1834             break;
   1835 
   1836         case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
   1837 
   1838             InfoTable = AcpiDmTableInfoPcct4;
   1839             break;
   1840 
   1841         case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
   1842 
   1843             InfoTable = AcpiDmTableInfoPcct5;
   1844             break;
   1845 
   1846         default:
   1847 
   1848             AcpiOsPrintf (
   1849                 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
   1850                 Subtable->Header.Type);
   1851             return;
   1852         }
   1853 
   1854         AcpiOsPrintf ("\n");
   1855         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1856             Subtable->Header.Length, InfoTable);
   1857         if (ACPI_FAILURE (Status))
   1858         {
   1859             return;
   1860         }
   1861 
   1862         /* Point to next subtable */
   1863 
   1864         Offset += Subtable->Header.Length;
   1865         Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Subtable,
   1866             Subtable->Header.Length);
   1867     }
   1868 }
   1869 
   1870 
   1871 /*******************************************************************************
   1872  *
   1873  * FUNCTION:    AcpiDmDumpPdtt
   1874  *
   1875  * PARAMETERS:  Table               - A PDTT table
   1876  *
   1877  * RETURN:      None
   1878  *
   1879  * DESCRIPTION: Format the contents of a Pdtt. This is a variable-length
   1880  *              table that contains an open-ended number of IDs
   1881  *              at the end of the table.
   1882  *
   1883  ******************************************************************************/
   1884 
   1885 void
   1886 AcpiDmDumpPdtt (
   1887     ACPI_TABLE_HEADER       *Table)
   1888 {
   1889     ACPI_STATUS             Status;
   1890     ACPI_PDTT_CHANNEL       *Subtable;
   1891     UINT32                  Length = Table->Length;
   1892     UINT32                  Offset = sizeof (ACPI_TABLE_PDTT);
   1893 
   1894 
   1895     /* Main table */
   1896 
   1897     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt);
   1898     if (ACPI_FAILURE (Status))
   1899     {
   1900         return;
   1901     }
   1902 
   1903     /* Subtables. Currently there is only one type, but can be multiples */
   1904 
   1905     Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset);
   1906     while (Offset < Table->Length)
   1907     {
   1908         AcpiOsPrintf ("\n");
   1909         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1910             sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0);
   1911         if (ACPI_FAILURE (Status))
   1912         {
   1913             return;
   1914         }
   1915 
   1916         /* Point to next subtable */
   1917 
   1918         Offset += sizeof (ACPI_PDTT_CHANNEL);
   1919         Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Subtable,
   1920             sizeof (ACPI_PDTT_CHANNEL));
   1921     }
   1922 }
   1923 
   1924 
   1925 /*******************************************************************************
   1926  *
   1927  * FUNCTION:    AcpiDmDumpPhat
   1928  *
   1929  * PARAMETERS:  Table               - A PHAT table
   1930  *
   1931  * RETURN:      None
   1932  *
   1933  * DESCRIPTION: Format the contents of a PHAT.
   1934  *
   1935  ******************************************************************************/
   1936 
   1937 void
   1938 AcpiDmDumpPhat (
   1939     ACPI_TABLE_HEADER       *Table)
   1940 {
   1941     ACPI_STATUS             Status;
   1942     ACPI_DMTABLE_INFO       *InfoTable;
   1943     ACPI_PHAT_HEADER        *Subtable;
   1944     ACPI_PHAT_VERSION_DATA  *VersionData;
   1945     ACPI_PHAT_HEALTH_DATA   *HealthData;
   1946     UINT32                  RecordCount;
   1947     UINT32                  Length = Table->Length;
   1948     UINT32                  Offset = sizeof (ACPI_TABLE_PHAT);
   1949     UINT32                  OriginalOffset;
   1950     UINT32                  SubtableLength;
   1951     UINT32                  PathLength;
   1952     UINT32                  VendorLength;
   1953     UINT16                  RecordType;
   1954 
   1955 
   1956     Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT));
   1957 
   1958     while (Offset < Table->Length)
   1959     {
   1960         /* Common subtable header */
   1961 
   1962         AcpiOsPrintf ("\n");
   1963         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1964             sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr);
   1965         if (ACPI_FAILURE (Status))
   1966         {
   1967             return;
   1968         }
   1969 
   1970         DbgPrint (ASL_DEBUG_OUTPUT, "\n/* %u, Subtable->Type %X */\n",
   1971             __LINE__, Subtable->Type);
   1972 
   1973         switch (Subtable->Type)
   1974         {
   1975         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
   1976 
   1977             InfoTable = AcpiDmTableInfoPhat0;
   1978             SubtableLength = sizeof (ACPI_PHAT_VERSION_DATA);
   1979             break;
   1980 
   1981         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
   1982 
   1983             InfoTable = AcpiDmTableInfoPhat1;
   1984             SubtableLength = sizeof (ACPI_PHAT_HEALTH_DATA);
   1985             break;
   1986 
   1987         default:
   1988 
   1989             DbgPrint (ASL_DEBUG_OUTPUT, "\n**** Unknown PHAT subtable type 0x%X\n\n",
   1990                 Subtable->Type);
   1991 
   1992             return;
   1993         }
   1994 
   1995         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1996             SubtableLength, InfoTable);
   1997         if (ACPI_FAILURE (Status))
   1998         {
   1999             return;
   2000         }
   2001 
   2002         Offset += SubtableLength;
   2003 
   2004         OriginalOffset = Offset;
   2005         switch (Subtable->Type)
   2006         {
   2007         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
   2008 
   2009             VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable);
   2010             RecordCount = VersionData->ElementCount;
   2011             RecordType = *ACPI_CAST_PTR (UINT8, Subtable);
   2012 
   2013             /*
   2014              * Skip past a zero-valued block (not part of the ACPI PHAT specification).
   2015              * First, check for a zero length record and a zero element count
   2016              */
   2017             if (!VersionData->Header.Length && !VersionData->ElementCount)
   2018             {
   2019                 while (RecordType == 0)
   2020                 {
   2021                     Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset);
   2022                     RecordType = *ACPI_CAST_PTR (UINT8, Subtable);
   2023                     RecordCount = VersionData->ElementCount;
   2024                     Offset += 1;
   2025                 }
   2026 
   2027                 Offset -= 1;
   2028                 AcpiOsPrintf ("\n/* Warning: Block of zeros found above starting at Offset %X Length %X */\n"
   2029                     "/* (not compliant to PHAT specification -- ignoring block) */\n",
   2030                     OriginalOffset - 12, Offset - OriginalOffset + 12);
   2031             }
   2032 
   2033             DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, RecordCount: %X, Offset %X, SubtableLength %X */\n",
   2034                 __LINE__, RecordCount, Offset, SubtableLength);
   2035 
   2036             /* Emit each of the version elements */
   2037 
   2038             while (RecordCount && VersionData->Header.Length)
   2039             {
   2040                 AcpiOsPrintf ("\n/* Version Element #%Xh Offset %Xh */\n\n",
   2041                     VersionData->ElementCount - RecordCount + 1, Offset);
   2042 
   2043                 Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset);
   2044                 Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2045                     sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a);
   2046                 if (ACPI_FAILURE (Status))
   2047                 {
   2048                     return;
   2049                 }
   2050 
   2051                 Offset += sizeof (ACPI_PHAT_VERSION_ELEMENT);
   2052                 RecordCount--;
   2053             }
   2054 
   2055             break;
   2056 
   2057         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
   2058 
   2059             HealthData = ACPI_CAST_PTR (ACPI_PHAT_HEALTH_DATA, Subtable);
   2060             PathLength = Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA);
   2061             VendorLength = 0;
   2062 
   2063             /* An offset of 0 should be ignored */
   2064             if (HealthData->DeviceSpecificOffset != 0)
   2065             {
   2066                 if (HealthData->DeviceSpecificOffset > Subtable->Length)
   2067                 {
   2068                     AcpiOsPrintf ("\n/* Warning: Oversized device-specific data offset %X */\n"
   2069                         "/* (maximum is %X -- ignoring device-specific data) */\n",
   2070                         HealthData->DeviceSpecificOffset, Subtable->Length);
   2071                 }
   2072                 else if (HealthData->DeviceSpecificOffset < sizeof (ACPI_PHAT_HEALTH_DATA))
   2073                 {
   2074                     AcpiOsPrintf ("\n/* Warning: Undersized device-specific data offset %X */\n"
   2075                         "/* (minimum is %X -- ignoring device-specific data) */\n",
   2076                         HealthData->DeviceSpecificOffset, (UINT8) sizeof (ACPI_PHAT_HEALTH_DATA));
   2077                 }
   2078                 else
   2079                 {
   2080                     PathLength = HealthData->DeviceSpecificOffset - sizeof (ACPI_PHAT_HEALTH_DATA);
   2081                     VendorLength = Subtable->Length - HealthData->DeviceSpecificOffset;
   2082                 }
   2083             }
   2084 
   2085             DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, PathLength %X, Offset %X */\n",
   2086                 __LINE__, PathLength, Offset);
   2087 
   2088             if (PathLength)
   2089             {
   2090                 Status = AcpiDmDumpTable (Length, Offset,
   2091                     ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)),
   2092                     PathLength, AcpiDmTableInfoPhat1a);
   2093                 if (ACPI_FAILURE (Status))
   2094                 {
   2095                     return;
   2096                 }
   2097 
   2098                 Offset += PathLength;
   2099             }
   2100 
   2101             DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, VendorLength %X, Offset %X */\n",
   2102                 __LINE__, VendorLength, Offset);
   2103 
   2104             if (VendorLength)
   2105             {
   2106                 Status = AcpiDmDumpTable (Length, Offset,
   2107                     ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, HealthData->DeviceSpecificOffset),
   2108                     VendorLength, AcpiDmTableInfoPhat1b);
   2109                 if (ACPI_FAILURE (Status))
   2110                 {
   2111                     return;
   2112                 }
   2113 
   2114                 Offset += VendorLength;
   2115             }
   2116 
   2117             break;
   2118 
   2119         default:
   2120 
   2121             AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",
   2122                 Subtable->Type);
   2123             return;
   2124         }
   2125 
   2126         /* Next subtable */
   2127 
   2128         DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, Bottom of main loop: Offset %X, "
   2129             "Subtable->Length %X, Table->Length %X */\n",
   2130             __LINE__, Offset, Subtable->Length, Table->Length);
   2131 
   2132         Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table,
   2133             Offset);
   2134     }
   2135 }
   2136 
   2137 
   2138 /*******************************************************************************
   2139  *
   2140  * FUNCTION:    AcpiDmDumpPmtt
   2141  *
   2142  * PARAMETERS:  Table               - A PMTT table
   2143  *
   2144  * RETURN:      None
   2145  *
   2146  * DESCRIPTION: Format the contents of a PMTT. This table type consists
   2147  *              of an open-ended number of subtables.
   2148  *
   2149  ******************************************************************************/
   2150 
   2151 void
   2152 AcpiDmDumpPmtt (
   2153     ACPI_TABLE_HEADER       *Table)
   2154 {
   2155     ACPI_STATUS             Status;
   2156     ACPI_PMTT_HEADER        *Subtable;
   2157     UINT32                  Length = Table->Length;
   2158     UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
   2159 
   2160 
   2161     /* Main table */
   2162 
   2163     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
   2164     if (ACPI_FAILURE (Status))
   2165     {
   2166         return;
   2167     }
   2168 
   2169     /* Subtables */
   2170 
   2171     Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
   2172     while (Offset < Table->Length)
   2173     {
   2174         /* Each of the types below contain the common subtable header */
   2175 
   2176         AcpiOsPrintf ("\n");
   2177         switch (Subtable->Type)
   2178         {
   2179         case ACPI_PMTT_TYPE_SOCKET:
   2180 
   2181             Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2182                 Subtable->Length, AcpiDmTableInfoPmtt0);
   2183             if (ACPI_FAILURE (Status))
   2184             {
   2185                 return;
   2186             }
   2187             break;
   2188 
   2189         case ACPI_PMTT_TYPE_CONTROLLER:
   2190             Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2191                 Subtable->Length, AcpiDmTableInfoPmtt1);
   2192             if (ACPI_FAILURE (Status))
   2193             {
   2194                 return;
   2195             }
   2196             break;
   2197 
   2198        case ACPI_PMTT_TYPE_DIMM:
   2199             Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2200                 Subtable->Length, AcpiDmTableInfoPmtt2);
   2201             if (ACPI_FAILURE (Status))
   2202             {
   2203                 return;
   2204             }
   2205             break;
   2206 
   2207         case ACPI_PMTT_TYPE_VENDOR:
   2208             Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2209                 Subtable->Length, AcpiDmTableInfoPmttVendor);
   2210             if (ACPI_FAILURE (Status))
   2211             {
   2212                 return;
   2213             }
   2214             break;
   2215 
   2216         default:
   2217             AcpiOsPrintf (
   2218                 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
   2219                 Subtable->Type);
   2220             return;
   2221         }
   2222 
   2223         /* Point to next subtable */
   2224 
   2225         Offset += Subtable->Length;
   2226         Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
   2227             Subtable, Subtable->Length);
   2228     }
   2229 }
   2230 
   2231 
   2232 /*******************************************************************************
   2233  *
   2234  * FUNCTION:    AcpiDmDumpPptt
   2235  *
   2236  * PARAMETERS:  Table               - A PMTT table
   2237  *
   2238  * RETURN:      None
   2239  *
   2240  * DESCRIPTION: Format the contents of a PPTT. This table type consists
   2241  *              of an open-ended number of subtables.
   2242  *
   2243  ******************************************************************************/
   2244 
   2245 void
   2246 AcpiDmDumpPptt (
   2247     ACPI_TABLE_HEADER       *Table)
   2248 {
   2249     ACPI_STATUS             Status;
   2250     ACPI_SUBTABLE_HEADER    *Subtable;
   2251     ACPI_PPTT_PROCESSOR     *PpttProcessor;
   2252     UINT8                   Length;
   2253     UINT8                   SubtableOffset;
   2254     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
   2255     ACPI_DMTABLE_INFO       *InfoTable;
   2256     UINT32                  i;
   2257 
   2258 
   2259     /* There is no main table (other than the standard ACPI header) */
   2260 
   2261     /* Subtables */
   2262 
   2263     Offset = sizeof (ACPI_TABLE_HEADER);
   2264     while (Offset < Table->Length)
   2265     {
   2266         AcpiOsPrintf ("\n");
   2267 
   2268         /* Common subtable header */
   2269 
   2270         Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
   2271         if (Subtable->Length < sizeof (ACPI_SUBTABLE_HEADER))
   2272         {
   2273             AcpiOsPrintf ("Invalid subtable length\n");
   2274             return;
   2275         }
   2276         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   2277             Subtable->Length, AcpiDmTableInfoPpttHdr);
   2278         if (ACPI_FAILURE (Status))
   2279         {
   2280             return;
   2281         }
   2282 
   2283         switch (Subtable->Type)
   2284         {
   2285         case ACPI_PPTT_TYPE_PROCESSOR:
   2286 
   2287             InfoTable = AcpiDmTableInfoPptt0;
   2288             Length = sizeof (ACPI_PPTT_PROCESSOR);
   2289             break;
   2290 
   2291         case ACPI_PPTT_TYPE_CACHE:
   2292 
   2293             InfoTable = AcpiDmTableInfoPptt1;
   2294             Length = sizeof (ACPI_PPTT_CACHE);
   2295             break;
   2296 
   2297         case ACPI_PPTT_TYPE_ID:
   2298 
   2299             InfoTable = AcpiDmTableInfoPptt2;
   2300             Length = sizeof (ACPI_PPTT_ID);
   2301             break;
   2302 
   2303         default:
   2304 
   2305             AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n",
   2306                 Subtable->Type);
   2307 
   2308             /* Attempt to continue */
   2309 
   2310             goto NextSubtable;
   2311         }
   2312 
   2313         if (Subtable->Length < Length)
   2314         {
   2315             AcpiOsPrintf ("Invalid subtable length\n");
   2316             return;
   2317         }
   2318         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   2319             Subtable->Length, InfoTable);
   2320         if (ACPI_FAILURE (Status))
   2321         {
   2322             return;
   2323         }
   2324         SubtableOffset = Length;
   2325 
   2326         switch (Subtable->Type)
   2327         {
   2328         case ACPI_PPTT_TYPE_PROCESSOR:
   2329 
   2330             PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, Subtable);
   2331 
   2332             /* Dump SMBIOS handles */
   2333 
   2334             if ((UINT8)(Subtable->Length - SubtableOffset) <
   2335                 (UINT8)(PpttProcessor->NumberOfPrivResources * 4))
   2336             {
   2337                 AcpiOsPrintf ("Invalid private resource number\n");
   2338                 return;
   2339             }
   2340             for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++)
   2341             {
   2342                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2343                     ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
   2344                     4, AcpiDmTableInfoPptt0a);
   2345                 if (ACPI_FAILURE (Status))
   2346                 {
   2347                     return;
   2348                 }
   2349 
   2350                 SubtableOffset += 4;
   2351             }
   2352             break;
   2353 
   2354         case ACPI_PPTT_TYPE_CACHE:
   2355 
   2356             if (Table->Revision < 3)
   2357             {
   2358                 break;
   2359             }
   2360             Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2361                 ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
   2362                 sizeof (ACPI_PPTT_CACHE_V1), AcpiDmTableInfoPptt1a);
   2363             if (ACPI_FAILURE (Status))
   2364             {
   2365                 return;
   2366             }
   2367             break;
   2368 
   2369         default:
   2370 
   2371             break;
   2372         }
   2373 
   2374 NextSubtable:
   2375         /* Point to next subtable */
   2376 
   2377         Offset += Subtable->Length;
   2378     }
   2379 }
   2380 
   2381 
   2382 /*******************************************************************************
   2383  *
   2384  * FUNCTION:    AcpiDmDumpPrmt
   2385  *
   2386  * PARAMETERS:  Table               - A PRMT table
   2387  *
   2388  * RETURN:      None
   2389  *
   2390  * DESCRIPTION: Format the contents of a PRMT. This table type consists
   2391  *              of an open-ended number of subtables.
   2392  *
   2393  ******************************************************************************/
   2394 
   2395 void
   2396 AcpiDmDumpPrmt (
   2397     ACPI_TABLE_HEADER       *Table)
   2398 {
   2399     UINT32                  CurrentOffset = sizeof (ACPI_TABLE_HEADER);
   2400     ACPI_TABLE_PRMT_HEADER  *PrmtHeader;
   2401     ACPI_PRMT_MODULE_INFO   *PrmtModuleInfo;
   2402     ACPI_PRMT_HANDLER_INFO  *PrmtHandlerInfo;
   2403     ACPI_STATUS             Status;
   2404     UINT32                  i, j;
   2405 
   2406 
   2407     /* Main table header */
   2408 
   2409     PrmtHeader = ACPI_ADD_PTR (ACPI_TABLE_PRMT_HEADER, Table, CurrentOffset);
   2410     Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHeader,
   2411         sizeof (ACPI_TABLE_PRMT_HEADER), AcpiDmTableInfoPrmtHdr);
   2412     if (ACPI_FAILURE (Status))
   2413     {
   2414         AcpiOsPrintf ("Invalid PRMT header\n");
   2415         return;
   2416     }
   2417 
   2418     CurrentOffset += sizeof (ACPI_TABLE_PRMT_HEADER);
   2419 
   2420     /* PRM Module Information Structure array */
   2421 
   2422     for (i = 0; i < PrmtHeader->ModuleInfoCount; ++i)
   2423     {
   2424         PrmtModuleInfo = ACPI_ADD_PTR (ACPI_PRMT_MODULE_INFO, Table, CurrentOffset);
   2425         Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtModuleInfo,
   2426             sizeof (ACPI_PRMT_MODULE_INFO), AcpiDmTableInfoPrmtModule);
   2427 
   2428         CurrentOffset += sizeof (ACPI_PRMT_MODULE_INFO);
   2429 
   2430         /* PRM handler information structure array */
   2431 
   2432         for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; ++j)
   2433         {
   2434             PrmtHandlerInfo = ACPI_ADD_PTR (ACPI_PRMT_HANDLER_INFO, Table, CurrentOffset);
   2435             Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHandlerInfo,
   2436                 sizeof (ACPI_PRMT_HANDLER_INFO), AcpiDmTableInfoPrmtHandler);
   2437 
   2438             CurrentOffset += sizeof (ACPI_PRMT_HANDLER_INFO);
   2439         }
   2440     }
   2441 }
   2442 
   2443 
   2444 /*******************************************************************************
   2445  *
   2446  * FUNCTION:    AcpiDmDumpRas2
   2447  *
   2448  * PARAMETERS:  Table               - A RAS2 table
   2449  *
   2450  * RETURN:      None
   2451  *
   2452  * DESCRIPTION: Format the contents of a Ras2. This is a variable-length
   2453  *              table that contains an open-ended number of the RAS2 PCC
   2454  *              descriptors at the end of the table.
   2455  *
   2456  ******************************************************************************/
   2457 
   2458 void
   2459 AcpiDmDumpRas2 (
   2460     ACPI_TABLE_HEADER       *Table)
   2461 {
   2462     ACPI_STATUS             Status;
   2463     ACPI_RAS2_PCC_DESC      *Subtable;
   2464     UINT32                  Length = Table->Length;
   2465     UINT32                  Offset = sizeof (ACPI_TABLE_RAS2);
   2466 
   2467 
   2468     /* Main table */
   2469 
   2470     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRas2);
   2471     if (ACPI_FAILURE (Status))
   2472     {
   2473         return;
   2474     }
   2475 
   2476     /* Subtables - RAS2 PCC descriptor list */
   2477 
   2478     Subtable = ACPI_ADD_PTR (ACPI_RAS2_PCC_DESC, Table, Offset);
   2479     while (Offset < Table->Length)
   2480     {
   2481         AcpiOsPrintf ("\n");
   2482         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2483             sizeof (ACPI_RAS2_PCC_DESC), AcpiDmTableInfoRas2PccDesc);
   2484         if (ACPI_FAILURE (Status))
   2485         {
   2486             return;
   2487         }
   2488 
   2489         /* Point to next subtable */
   2490 
   2491         Offset += sizeof (ACPI_RAS2_PCC_DESC);
   2492         Subtable = ACPI_ADD_PTR (ACPI_RAS2_PCC_DESC, Subtable,
   2493             sizeof (ACPI_RAS2_PCC_DESC));
   2494     }
   2495 }
   2496 
   2497 
   2498 /*******************************************************************************
   2499  *
   2500  * FUNCTION:    AcpiDmDumpRgrt
   2501  *
   2502  * PARAMETERS:  Table               - A RGRT table
   2503  *
   2504  * RETURN:      None
   2505  *
   2506  * DESCRIPTION: Format the contents of a RGRT
   2507  *
   2508  ******************************************************************************/
   2509 
   2510 void
   2511 AcpiDmDumpRgrt (
   2512     ACPI_TABLE_HEADER       *Table)
   2513 {
   2514     ACPI_STATUS             Status;
   2515     ACPI_TABLE_RGRT         *Subtable = ACPI_CAST_PTR (ACPI_TABLE_RGRT, Table);
   2516     UINT32                  Offset = sizeof (ACPI_TABLE_RGRT);
   2517 
   2518 
   2519     /* Main table */
   2520 
   2521     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoRgrt);
   2522     if (ACPI_FAILURE (Status))
   2523     {
   2524         return;
   2525     }
   2526 
   2527     /* Dump the binary image as a subtable */
   2528 
   2529     Status = AcpiDmDumpTable (Table->Length, Offset, &Subtable->Image,
   2530         Table->Length - Offset, AcpiDmTableInfoRgrt0);
   2531     if (ACPI_FAILURE (Status))
   2532     {
   2533         return;
   2534     }
   2535 }
   2536 
   2537 
   2538 /*******************************************************************************
   2539  *
   2540  * FUNCTION:    AcpiDmDumpRhct
   2541  *
   2542  * PARAMETERS:  Table               - A RHCT table
   2543  *
   2544  * RETURN:      None
   2545  *
   2546  * DESCRIPTION: Format the contents of a RHCT.
   2547  *
   2548  ******************************************************************************/
   2549 
   2550 void
   2551 AcpiDmDumpRhct (
   2552     ACPI_TABLE_HEADER       *Table)
   2553 {
   2554     ACPI_STATUS             Status;
   2555     ACPI_RHCT_NODE_HEADER   *Subtable;
   2556     ACPI_RHCT_HART_INFO     *RhctHartInfo;
   2557     ACPI_RHCT_ISA_STRING    *RhctIsaString;
   2558     ACPI_RHCT_CMO_NODE      *RhctCmoNode;
   2559     ACPI_RHCT_MMU_NODE      *RhctMmuNode;
   2560     UINT32                  Length = Table->Length;
   2561     UINT8                   SubtableOffset, IsaPadOffset;
   2562     UINT32                  Offset = sizeof (ACPI_TABLE_RHCT);
   2563     UINT32                  i;
   2564 
   2565     /* Main table */
   2566 
   2567     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRhct);
   2568     if (ACPI_FAILURE (Status))
   2569     {
   2570         return;
   2571     }
   2572 
   2573     /* Subtables */
   2574 
   2575     while (Offset < Table->Length)
   2576     {
   2577         AcpiOsPrintf ("\n");
   2578 
   2579         /* Common subtable header */
   2580 
   2581         Subtable = ACPI_ADD_PTR (ACPI_RHCT_NODE_HEADER, Table, Offset);
   2582         if (Subtable->Length < sizeof (ACPI_RHCT_NODE_HEADER))
   2583         {
   2584             AcpiOsPrintf ("Invalid subtable length\n");
   2585             return;
   2586         }
   2587         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   2588             Subtable->Length, AcpiDmTableInfoRhctNodeHdr);
   2589         if (ACPI_FAILURE (Status))
   2590         {
   2591             return;
   2592         }
   2593 
   2594         Length = sizeof (ACPI_RHCT_NODE_HEADER);
   2595 
   2596         if (Subtable->Length < Length)
   2597         {
   2598             AcpiOsPrintf ("Invalid subtable length\n");
   2599             return;
   2600         }
   2601         SubtableOffset = (UINT8) Length;
   2602 
   2603         switch (Subtable->Type)
   2604         {
   2605         case ACPI_RHCT_NODE_TYPE_HART_INFO:
   2606             Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2607                     ACPI_ADD_PTR (ACPI_RHCT_HART_INFO, Subtable, SubtableOffset),
   2608                     sizeof (ACPI_RHCT_HART_INFO), AcpiDmTableInfoRhctHartInfo1);
   2609 
   2610             RhctHartInfo = ACPI_ADD_PTR (ACPI_RHCT_HART_INFO, Subtable, SubtableOffset);
   2611 
   2612             if ((UINT16)(Subtable->Length - SubtableOffset) <
   2613                 (UINT16)(RhctHartInfo->NumOffsets * 4))
   2614             {
   2615                 AcpiOsPrintf ("Invalid number of offsets\n");
   2616                 return;
   2617             }
   2618             SubtableOffset += sizeof (ACPI_RHCT_HART_INFO);
   2619             for (i = 0; i < RhctHartInfo->NumOffsets; i++)
   2620             {
   2621                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2622                     ACPI_ADD_PTR (UINT32, Subtable, SubtableOffset),
   2623                     4, AcpiDmTableInfoRhctHartInfo2);
   2624                 if (ACPI_FAILURE (Status))
   2625                 {
   2626                     return;
   2627                 }
   2628 
   2629                 SubtableOffset += 4;
   2630             }
   2631             break;
   2632 
   2633         case ACPI_RHCT_NODE_TYPE_ISA_STRING:
   2634             RhctIsaString = ACPI_ADD_PTR (ACPI_RHCT_ISA_STRING, Subtable, SubtableOffset);
   2635             IsaPadOffset = (UINT8) (SubtableOffset + 2 + RhctIsaString->IsaLength);
   2636             Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2637                     RhctIsaString, RhctIsaString->IsaLength, AcpiDmTableInfoRhctIsa1);
   2638             if (Subtable->Length > IsaPadOffset)
   2639             {
   2640                 Status = AcpiDmDumpTable (Table->Length, Offset + IsaPadOffset,
   2641                          ACPI_ADD_PTR (UINT8, Subtable, IsaPadOffset),
   2642                          (Subtable->Length - IsaPadOffset), AcpiDmTableInfoRhctIsaPad);
   2643             }
   2644 
   2645             break;
   2646 
   2647         case ACPI_RHCT_NODE_TYPE_CMO:
   2648             RhctCmoNode = ACPI_ADD_PTR (ACPI_RHCT_CMO_NODE, Subtable, SubtableOffset);
   2649             Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2650                                       RhctCmoNode, 4, AcpiDmTableInfoRhctCmo1);
   2651             break;
   2652 
   2653         case ACPI_RHCT_NODE_TYPE_MMU:
   2654             RhctMmuNode = ACPI_ADD_PTR (ACPI_RHCT_MMU_NODE, Subtable, SubtableOffset);
   2655             Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2656                                       RhctMmuNode, 2, AcpiDmTableInfoRhctMmu1);
   2657             break;
   2658 
   2659         default:
   2660             break;
   2661         }
   2662 
   2663         /* Point to next subtable */
   2664 
   2665         Offset += Subtable->Length;
   2666     }
   2667 }
   2668 
   2669 /*******************************************************************************
   2670  *
   2671  * FUNCTION:    AcpiDmDumpRimt
   2672  *
   2673  * PARAMETERS:  Table               - A RIMT table
   2674  *
   2675  * RETURN:      None
   2676  *
   2677  * DESCRIPTION: Format the contents of a RIMT.
   2678  *
   2679  ******************************************************************************/
   2680 
   2681 void
   2682 AcpiDmDumpRimt (
   2683     ACPI_TABLE_HEADER       *Table)
   2684 {
   2685     ACPI_RIMT_PLATFORM_DEVICE  *PlatNode;
   2686     ACPI_RIMT_PCIE_RC          *PcieNode;
   2687     ACPI_RIMT_NODE             *Subtable;
   2688     ACPI_STATUS                Status;
   2689     UINT32                     Length = Table->Length;
   2690     UINT16                     SubtableOffset;
   2691     UINT32                     NodeOffset;
   2692     UINT16                     i;
   2693     UINT32                     Offset = sizeof (ACPI_TABLE_RIMT);
   2694 
   2695     /* Main table */
   2696 
   2697     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRimt);
   2698     if (ACPI_FAILURE (Status))
   2699     {
   2700         return;
   2701     }
   2702 
   2703     /* Subtables */
   2704 
   2705     while (Offset < Table->Length)
   2706     {
   2707         AcpiOsPrintf ("\n");
   2708 
   2709         /* Common subtable header */
   2710 
   2711         Subtable = ACPI_ADD_PTR (ACPI_RIMT_NODE, Table, Offset);
   2712         if (Subtable->Length < sizeof (ACPI_RIMT_NODE))
   2713         {
   2714             AcpiOsPrintf ("Invalid subtable length\n");
   2715             return;
   2716         }
   2717         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   2718             Subtable->Length, AcpiDmTableInfoRimtNodeHdr);
   2719         if (ACPI_FAILURE (Status))
   2720         {
   2721             return;
   2722         }
   2723 
   2724         Length = sizeof (ACPI_RIMT_NODE);
   2725 
   2726         if (Subtable->Length < Length)
   2727         {
   2728             AcpiOsPrintf ("Invalid subtable length\n");
   2729             return;
   2730         }
   2731         SubtableOffset = (UINT16) Length;
   2732 
   2733         switch (Subtable->Type)
   2734         {
   2735         case ACPI_RIMT_NODE_TYPE_IOMMU:
   2736             Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2737                     ACPI_ADD_PTR (ACPI_RIMT_IOMMU, Subtable, SubtableOffset),
   2738                     sizeof (ACPI_RIMT_IOMMU), AcpiDmTableInfoRimtIommu);
   2739 
   2740             break;
   2741 
   2742         case ACPI_RIMT_NODE_TYPE_PCIE_ROOT_COMPLEX:
   2743             Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2744                     ACPI_ADD_PTR (ACPI_RIMT_PCIE_RC, Subtable, SubtableOffset),
   2745                     sizeof (ACPI_RIMT_PCIE_RC), AcpiDmTableInfoRimtPcieRc);
   2746 
   2747             PcieNode = ACPI_ADD_PTR (ACPI_RIMT_PCIE_RC, Subtable, SubtableOffset);
   2748 
   2749             /* Dump the ID mappings */
   2750             NodeOffset = PcieNode->IdMappingOffset;
   2751             for (i = 0; i < PcieNode->NumIdMappings; i++)
   2752             {
   2753                 AcpiOsPrintf ("\n");
   2754                 Length = sizeof (ACPI_RIMT_ID_MAPPING);
   2755                 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
   2756                     ACPI_ADD_PTR (ACPI_RIMT_ID_MAPPING, Subtable, NodeOffset),
   2757                     Length, AcpiDmTableInfoRimtIdMapping);
   2758                 if (ACPI_FAILURE (Status))
   2759                 {
   2760                     return;
   2761                 }
   2762 
   2763                 NodeOffset += Length;
   2764             }
   2765             break;
   2766 
   2767         case ACPI_RIMT_NODE_TYPE_PLAT_DEVICE:
   2768             Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2769                     ACPI_ADD_PTR (ACPI_RIMT_PLATFORM_DEVICE, Subtable, SubtableOffset),
   2770                     sizeof (ACPI_RIMT_PLATFORM_DEVICE), AcpiDmTableInfoRimtPlatDev);
   2771             PlatNode = ACPI_ADD_PTR (ACPI_RIMT_PLATFORM_DEVICE, Subtable, SubtableOffset);
   2772 
   2773             /* Dump the ID mappings */
   2774             NodeOffset = PlatNode->IdMappingOffset;
   2775             for (i = 0; i < PlatNode->NumIdMappings; i++)
   2776             {
   2777                 AcpiOsPrintf ("\n");
   2778                 Length = sizeof (ACPI_RIMT_ID_MAPPING);
   2779                 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
   2780                     ACPI_ADD_PTR (ACPI_RIMT_ID_MAPPING, Subtable, NodeOffset),
   2781                     Length, AcpiDmTableInfoRimtIdMapping);
   2782                 if (ACPI_FAILURE (Status))
   2783                 {
   2784                     return;
   2785                 }
   2786 
   2787                 NodeOffset += Length;
   2788             }
   2789             break;
   2790 
   2791         default:
   2792             break;
   2793         }
   2794 
   2795         /* Point to next subtable */
   2796 
   2797         Offset += Subtable->Length;
   2798     }
   2799 }
   2800 
   2801 
   2802 /*******************************************************************************
   2803  *
   2804  * FUNCTION:    AcpiDmDumpS3pt
   2805  *
   2806  * PARAMETERS:  Table               - A S3PT table
   2807  *
   2808  * RETURN:      Length of the table
   2809  *
   2810  * DESCRIPTION: Format the contents of a S3PT
   2811  *
   2812  ******************************************************************************/
   2813 
   2814 UINT32
   2815 AcpiDmDumpS3pt (
   2816     ACPI_TABLE_HEADER       *Tables)
   2817 {
   2818     ACPI_STATUS             Status;
   2819     UINT32                  Offset = sizeof (ACPI_TABLE_S3PT);
   2820     ACPI_FPDT_HEADER        *Subtable;
   2821     ACPI_DMTABLE_INFO       *InfoTable;
   2822     ACPI_TABLE_S3PT         *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
   2823 
   2824 
   2825     /* Main table */
   2826 
   2827     Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
   2828     if (ACPI_FAILURE (Status))
   2829     {
   2830         return 0;
   2831     }
   2832 
   2833     Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);
   2834     while (Offset < S3ptTable->Length)
   2835     {
   2836         /* Common subtable header */
   2837 
   2838         AcpiOsPrintf ("\n");
   2839         Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
   2840             Subtable->Length, AcpiDmTableInfoS3ptHdr);
   2841         if (ACPI_FAILURE (Status))
   2842         {
   2843             return 0;
   2844         }
   2845 
   2846         switch (Subtable->Type)
   2847         {
   2848         case ACPI_S3PT_TYPE_RESUME:
   2849 
   2850             InfoTable = AcpiDmTableInfoS3pt0;
   2851             break;
   2852 
   2853         case ACPI_S3PT_TYPE_SUSPEND:
   2854 
   2855             InfoTable = AcpiDmTableInfoS3pt1;
   2856             break;
   2857 
   2858         default:
   2859 
   2860             AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n",
   2861                 Subtable->Type);
   2862 
   2863             /* Attempt to continue */
   2864 
   2865             if (!Subtable->Length)
   2866             {
   2867                 AcpiOsPrintf ("Invalid zero length subtable\n");
   2868                 return 0;
   2869             }
   2870             goto NextSubtable;
   2871         }
   2872 
   2873         AcpiOsPrintf ("\n");
   2874         Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
   2875             Subtable->Length, InfoTable);
   2876         if (ACPI_FAILURE (Status))
   2877         {
   2878             return 0;
   2879         }
   2880 
   2881 NextSubtable:
   2882         /* Point to next subtable */
   2883 
   2884         Offset += Subtable->Length;
   2885         Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length);
   2886     }
   2887 
   2888     return (S3ptTable->Length);
   2889 }
   2890 
   2891 
   2892 /*******************************************************************************
   2893  *
   2894  * FUNCTION:    AcpiDmDumpSdev
   2895  *
   2896  * PARAMETERS:  Table               - A SDEV table
   2897  *
   2898  * RETURN:      None
   2899  *
   2900  * DESCRIPTION: Format the contents of a SDEV. This is a variable-length
   2901  *              table that contains variable strings and vendor data.
   2902  *
   2903  ******************************************************************************/
   2904 
   2905 void
   2906 AcpiDmDumpSdev (
   2907     ACPI_TABLE_HEADER       *Table)
   2908 {
   2909     ACPI_STATUS                 Status;
   2910     ACPI_SDEV_HEADER            *Subtable;
   2911     ACPI_SDEV_PCIE              *Pcie;
   2912     ACPI_SDEV_NAMESPACE         *Namesp;
   2913     ACPI_DMTABLE_INFO           *InfoTable;
   2914     ACPI_DMTABLE_INFO           *SecureComponentInfoTable;
   2915     UINT32                      Length = Table->Length;
   2916     UINT32                      Offset = sizeof (ACPI_TABLE_SDEV);
   2917     UINT16                      PathOffset;
   2918     UINT16                      PathLength;
   2919     UINT16                      VendorDataOffset;
   2920     UINT16                      VendorDataLength;
   2921     ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
   2922     UINT32                      CurrentOffset = 0;
   2923 
   2924 
   2925     /* Main table */
   2926 
   2927     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev);
   2928     if (ACPI_FAILURE (Status))
   2929     {
   2930         return;
   2931     }
   2932 
   2933     /* Subtables */
   2934 
   2935     Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset);
   2936     while (Offset < Table->Length)
   2937     {
   2938         /* Common subtable header */
   2939 
   2940         AcpiOsPrintf ("\n");
   2941         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   2942             Subtable->Length, AcpiDmTableInfoSdevHdr);
   2943         if (ACPI_FAILURE (Status))
   2944         {
   2945             return;
   2946         }
   2947 
   2948         switch (Subtable->Type)
   2949         {
   2950         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
   2951 
   2952             InfoTable = AcpiDmTableInfoSdev0;
   2953             break;
   2954 
   2955         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
   2956 
   2957             InfoTable = AcpiDmTableInfoSdev1;
   2958             break;
   2959 
   2960         default:
   2961             goto NextSubtable;
   2962         }
   2963 
   2964         AcpiOsPrintf ("\n");
   2965         Status = AcpiDmDumpTable (Table->Length, 0, Subtable,
   2966             Subtable->Length, InfoTable);
   2967         if (ACPI_FAILURE (Status))
   2968         {
   2969             return;
   2970         }
   2971 
   2972         switch (Subtable->Type)
   2973         {
   2974         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
   2975 
   2976             CurrentOffset = sizeof (ACPI_SDEV_NAMESPACE);
   2977             if (Subtable->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
   2978             {
   2979                 SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
   2980                     ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)));
   2981 
   2982                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
   2983                     ACPI_ADD_PTR(UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)),
   2984                     sizeof (ACPI_SDEV_SECURE_COMPONENT), AcpiDmTableInfoSdev0b);
   2985                 if (ACPI_FAILURE (Status))
   2986                 {
   2987                     return;
   2988                 }
   2989                 CurrentOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
   2990 
   2991                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
   2992                     ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
   2993                     sizeof (ACPI_SDEV_HEADER), AcpiDmTableInfoSdevSecCompHdr);
   2994                 if (ACPI_FAILURE (Status))
   2995                 {
   2996                     return;
   2997                 }
   2998                 CurrentOffset += sizeof (ACPI_SDEV_HEADER);
   2999 
   3000                 switch (Subtable->Type)
   3001                 {
   3002                 case ACPI_SDEV_TYPE_ID_COMPONENT:
   3003 
   3004                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
   3005                     break;
   3006 
   3007                 case ACPI_SDEV_TYPE_MEM_COMPONENT:
   3008 
   3009                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
   3010                     break;
   3011 
   3012                 default:
   3013                     goto NextSubtable;
   3014                 }
   3015 
   3016                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
   3017                     ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
   3018                     SecureComponent->SecureComponentLength, SecureComponentInfoTable);
   3019                 CurrentOffset += SecureComponent->SecureComponentLength;
   3020             }
   3021 
   3022             /* Dump the PCIe device ID(s) */
   3023 
   3024             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);
   3025             PathOffset = Namesp->DeviceIdOffset;
   3026             PathLength = Namesp->DeviceIdLength;
   3027 
   3028             if (PathLength)
   3029             {
   3030                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
   3031                     ACPI_ADD_PTR (UINT8, Namesp, PathOffset),
   3032                     PathLength, AcpiDmTableInfoSdev0a);
   3033                 if (ACPI_FAILURE (Status))
   3034                 {
   3035                     return;
   3036                 }
   3037                 CurrentOffset += PathLength;
   3038             }
   3039 
   3040             /* Dump the vendor-specific data */
   3041 
   3042             VendorDataLength =
   3043                 Namesp->VendorDataLength;
   3044             VendorDataOffset =
   3045                 Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
   3046 
   3047             if (VendorDataLength)
   3048             {
   3049                 Status = AcpiDmDumpTable (Table->Length, 0,
   3050                     ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset),
   3051                     VendorDataLength, AcpiDmTableInfoSdev1b);
   3052                 if (ACPI_FAILURE (Status))
   3053                 {
   3054                     return;
   3055                 }
   3056             }
   3057             break;
   3058 
   3059         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
   3060 
   3061             /* PCI path substructures */
   3062 
   3063             Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable);
   3064             PathOffset = Pcie->PathOffset;
   3065             PathLength = Pcie->PathLength;
   3066 
   3067             while (PathLength)
   3068             {
   3069                 Status = AcpiDmDumpTable (Table->Length,
   3070                     PathOffset + Offset,
   3071                     ACPI_ADD_PTR (UINT8, Pcie, PathOffset),
   3072                     sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a);
   3073                 if (ACPI_FAILURE (Status))
   3074                 {
   3075                     return;
   3076                 }
   3077 
   3078                 PathOffset += sizeof (ACPI_SDEV_PCIE_PATH);
   3079                 PathLength -= sizeof (ACPI_SDEV_PCIE_PATH);
   3080             }
   3081 
   3082             /* VendorData */
   3083 
   3084             VendorDataLength = Pcie->VendorDataLength;
   3085             VendorDataOffset = Pcie->PathOffset + Pcie->PathLength;
   3086 
   3087             if (VendorDataLength)
   3088             {
   3089                 Status = AcpiDmDumpTable (Table->Length, 0,
   3090                     ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset),
   3091                     VendorDataLength, AcpiDmTableInfoSdev1b);
   3092                 if (ACPI_FAILURE (Status))
   3093                 {
   3094                     return;
   3095                 }
   3096             }
   3097             break;
   3098 
   3099         default:
   3100             goto NextSubtable;
   3101         }
   3102 
   3103 NextSubtable:
   3104         /* Point to next subtable */
   3105 
   3106         Offset += Subtable->Length;
   3107         Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable,
   3108             Subtable->Length);
   3109     }
   3110 }
   3111