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