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