Home | History | Annotate | Line # | Download | only in common
dmtbdump2.c revision 1.1.1.11
      1 /******************************************************************************
      2  *
      3  * Module Name: dmtbdump2 - Dump ACPI data tables that contain no AML code
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2021, Intel Corp.
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions, and the following disclaimer,
     16  *    without modification.
     17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  *    including a substantially similar Disclaimer requirement for further
     21  *    binary redistribution.
     22  * 3. Neither the names of the above-listed copyright holders nor the names
     23  *    of any contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * Alternatively, this software may be distributed under the terms of the
     27  * GNU General Public License ("GPL") version 2 as published by the Free
     28  * Software Foundation.
     29  *
     30  * NO WARRANTY
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  * POSSIBILITY OF SUCH DAMAGES.
     42  */
     43 
     44 #include "acpi.h"
     45 #include "accommon.h"
     46 #include "acdisasm.h"
     47 #include "actables.h"
     48 #include "aslcompiler.h"
     49 
     50 /* This module used for application-level code only */
     51 
     52 #define _COMPONENT          ACPI_CA_DISASSEMBLER
     53         ACPI_MODULE_NAME    ("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     /* Both IORT Rev E and E.a have known issues and are not supported */
     99 
    100     if (Revision == 1 || Revision == 2)
    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     while (Offset < Table->Length)
    783     {
    784         /* Common subtable header */
    785 
    786         AcpiOsPrintf ("\n");
    787         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    788             Subtable->Length, AcpiDmTableInfoMadtHdr);
    789         if (ACPI_FAILURE (Status))
    790         {
    791             return;
    792         }
    793 
    794         switch (Subtable->Type)
    795         {
    796         case ACPI_MADT_TYPE_LOCAL_APIC:
    797 
    798             InfoTable = AcpiDmTableInfoMadt0;
    799             break;
    800 
    801         case ACPI_MADT_TYPE_IO_APIC:
    802 
    803             InfoTable = AcpiDmTableInfoMadt1;
    804             break;
    805 
    806         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
    807 
    808             InfoTable = AcpiDmTableInfoMadt2;
    809             break;
    810 
    811         case ACPI_MADT_TYPE_NMI_SOURCE:
    812 
    813             InfoTable = AcpiDmTableInfoMadt3;
    814             break;
    815 
    816         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
    817 
    818             InfoTable = AcpiDmTableInfoMadt4;
    819             break;
    820 
    821         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
    822 
    823             InfoTable = AcpiDmTableInfoMadt5;
    824             break;
    825 
    826         case ACPI_MADT_TYPE_IO_SAPIC:
    827 
    828             InfoTable = AcpiDmTableInfoMadt6;
    829             break;
    830 
    831         case ACPI_MADT_TYPE_LOCAL_SAPIC:
    832 
    833             InfoTable = AcpiDmTableInfoMadt7;
    834             break;
    835 
    836         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
    837 
    838             InfoTable = AcpiDmTableInfoMadt8;
    839             break;
    840 
    841         case ACPI_MADT_TYPE_LOCAL_X2APIC:
    842 
    843             InfoTable = AcpiDmTableInfoMadt9;
    844             break;
    845 
    846         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
    847 
    848             InfoTable = AcpiDmTableInfoMadt10;
    849             break;
    850 
    851         case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
    852 
    853             InfoTable = AcpiDmTableInfoMadt11;
    854             break;
    855 
    856         case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
    857 
    858             InfoTable = AcpiDmTableInfoMadt12;
    859             break;
    860 
    861         case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
    862 
    863             InfoTable = AcpiDmTableInfoMadt13;
    864             break;
    865 
    866         case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
    867 
    868             InfoTable = AcpiDmTableInfoMadt14;
    869             break;
    870 
    871         case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
    872 
    873             InfoTable = AcpiDmTableInfoMadt15;
    874             break;
    875 
    876         case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
    877 
    878             InfoTable = AcpiDmTableInfoMadt16;
    879             break;
    880 
    881         default:
    882 
    883             AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",
    884                 Subtable->Type);
    885 
    886             /* Attempt to continue */
    887 
    888             if (!Subtable->Length)
    889             {
    890                 AcpiOsPrintf ("Invalid zero length subtable\n");
    891                 return;
    892             }
    893 
    894             goto NextSubtable;
    895         }
    896 
    897         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    898             Subtable->Length, InfoTable);
    899         if (ACPI_FAILURE (Status))
    900         {
    901             return;
    902         }
    903 
    904 NextSubtable:
    905         /* Point to next subtable */
    906 
    907         Offset += Subtable->Length;
    908         Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable,
    909             Subtable->Length);
    910     }
    911 }
    912 
    913 
    914 /*******************************************************************************
    915  *
    916  * FUNCTION:    AcpiDmDumpMcfg
    917  *
    918  * PARAMETERS:  Table               - A MCFG Table
    919  *
    920  * RETURN:      None
    921  *
    922  * DESCRIPTION: Format the contents of a MCFG table
    923  *
    924  ******************************************************************************/
    925 
    926 void
    927 AcpiDmDumpMcfg (
    928     ACPI_TABLE_HEADER       *Table)
    929 {
    930     ACPI_STATUS             Status;
    931     UINT32                  Offset = sizeof (ACPI_TABLE_MCFG);
    932     ACPI_MCFG_ALLOCATION    *Subtable;
    933 
    934 
    935     /* Main table */
    936 
    937     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
    938     if (ACPI_FAILURE (Status))
    939     {
    940         return;
    941     }
    942 
    943     /* Subtables */
    944 
    945     Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
    946     while (Offset < Table->Length)
    947     {
    948         if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
    949         {
    950             AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
    951                 (UINT32) sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
    952             return;
    953         }
    954 
    955         AcpiOsPrintf ("\n");
    956         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
    957             sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
    958         if (ACPI_FAILURE (Status))
    959         {
    960             return;
    961         }
    962 
    963         /* Point to next subtable (each subtable is of fixed length) */
    964 
    965         Offset += sizeof (ACPI_MCFG_ALLOCATION);
    966         Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Subtable,
    967             sizeof (ACPI_MCFG_ALLOCATION));
    968     }
    969 }
    970 
    971 
    972 /*******************************************************************************
    973  *
    974  * FUNCTION:    AcpiDmDumpMpst
    975  *
    976  * PARAMETERS:  Table               - A MPST Table
    977  *
    978  * RETURN:      None
    979  *
    980  * DESCRIPTION: Format the contents of a MPST table
    981  *
    982  ******************************************************************************/
    983 
    984 void
    985 AcpiDmDumpMpst (
    986     ACPI_TABLE_HEADER       *Table)
    987 {
    988     ACPI_STATUS             Status;
    989     UINT32                  Offset = sizeof (ACPI_TABLE_MPST);
    990     ACPI_MPST_POWER_NODE    *Subtable0;
    991     ACPI_MPST_POWER_STATE   *Subtable0A;
    992     ACPI_MPST_COMPONENT     *Subtable0B;
    993     ACPI_MPST_DATA_HDR      *Subtable1;
    994     ACPI_MPST_POWER_DATA    *Subtable2;
    995     UINT16                  SubtableCount;
    996     UINT32                  PowerStateCount;
    997     UINT32                  ComponentCount;
    998 
    999 
   1000     /* Main table */
   1001 
   1002     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
   1003     if (ACPI_FAILURE (Status))
   1004     {
   1005         return;
   1006     }
   1007 
   1008     /* Subtable: Memory Power Node(s) */
   1009 
   1010     SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
   1011     Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
   1012 
   1013     while ((Offset < Table->Length) && SubtableCount)
   1014     {
   1015         AcpiOsPrintf ("\n");
   1016         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0,
   1017             sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
   1018         if (ACPI_FAILURE (Status))
   1019         {
   1020             return;
   1021         }
   1022 
   1023         /* Extract the sub-subtable counts */
   1024 
   1025         PowerStateCount = Subtable0->NumPowerStates;
   1026         ComponentCount = Subtable0->NumPhysicalComponents;
   1027         Offset += sizeof (ACPI_MPST_POWER_NODE);
   1028 
   1029         /* Sub-subtables - Memory Power State Structure(s) */
   1030 
   1031         Subtable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, Subtable0,
   1032             sizeof (ACPI_MPST_POWER_NODE));
   1033 
   1034         while (PowerStateCount)
   1035         {
   1036             AcpiOsPrintf ("\n");
   1037             Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A,
   1038                 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
   1039             if (ACPI_FAILURE (Status))
   1040             {
   1041                 return;
   1042             }
   1043 
   1044             Subtable0A++;
   1045             PowerStateCount--;
   1046             Offset += sizeof (ACPI_MPST_POWER_STATE);
   1047        }
   1048 
   1049         /* Sub-subtables - Physical Component ID Structure(s) */
   1050 
   1051         Subtable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, Subtable0A);
   1052 
   1053         if (ComponentCount)
   1054         {
   1055             AcpiOsPrintf ("\n");
   1056         }
   1057 
   1058         while (ComponentCount)
   1059         {
   1060             Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B,
   1061                 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
   1062             if (ACPI_FAILURE (Status))
   1063             {
   1064                 return;
   1065             }
   1066 
   1067             Subtable0B++;
   1068             ComponentCount--;
   1069             Offset += sizeof (ACPI_MPST_COMPONENT);
   1070         }
   1071 
   1072         /* Point to next Memory Power Node subtable */
   1073 
   1074         SubtableCount--;
   1075         Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Subtable0,
   1076             sizeof (ACPI_MPST_POWER_NODE) +
   1077             (sizeof (ACPI_MPST_POWER_STATE) * Subtable0->NumPowerStates) +
   1078             (sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents));
   1079     }
   1080 
   1081     /* Subtable: Count of Memory Power State Characteristic structures */
   1082 
   1083     AcpiOsPrintf ("\n");
   1084     Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0);
   1085     Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1,
   1086         sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
   1087     if (ACPI_FAILURE (Status))
   1088     {
   1089         return;
   1090     }
   1091 
   1092     SubtableCount = Subtable1->CharacteristicsCount;
   1093     Offset += sizeof (ACPI_MPST_DATA_HDR);
   1094 
   1095     /* Subtable: Memory Power State Characteristics structure(s) */
   1096 
   1097     Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1,
   1098         sizeof (ACPI_MPST_DATA_HDR));
   1099 
   1100     while ((Offset < Table->Length) && SubtableCount)
   1101     {
   1102         AcpiOsPrintf ("\n");
   1103         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2,
   1104             sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
   1105         if (ACPI_FAILURE (Status))
   1106         {
   1107             return;
   1108         }
   1109 
   1110         Subtable2++;
   1111         SubtableCount--;
   1112         Offset += sizeof (ACPI_MPST_POWER_DATA);
   1113     }
   1114 }
   1115 
   1116 
   1117 /*******************************************************************************
   1118  *
   1119  * FUNCTION:    AcpiDmDumpMsct
   1120  *
   1121  * PARAMETERS:  Table               - A MSCT table
   1122  *
   1123  * RETURN:      None
   1124  *
   1125  * DESCRIPTION: Format the contents of a MSCT
   1126  *
   1127  ******************************************************************************/
   1128 
   1129 void
   1130 AcpiDmDumpMsct (
   1131     ACPI_TABLE_HEADER       *Table)
   1132 {
   1133     ACPI_STATUS             Status;
   1134     UINT32                  Offset = sizeof (ACPI_TABLE_MSCT);
   1135     ACPI_MSCT_PROXIMITY     *Subtable;
   1136 
   1137 
   1138     /* Main table */
   1139 
   1140     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
   1141     if (ACPI_FAILURE (Status))
   1142     {
   1143         return;
   1144     }
   1145 
   1146     /* Subtables */
   1147 
   1148     Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
   1149     while (Offset < Table->Length)
   1150     {
   1151         /* Common subtable header */
   1152 
   1153         AcpiOsPrintf ("\n");
   1154         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1155             sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
   1156         if (ACPI_FAILURE (Status))
   1157         {
   1158             return;
   1159         }
   1160 
   1161         /* Point to next subtable */
   1162 
   1163         Offset += sizeof (ACPI_MSCT_PROXIMITY);
   1164         Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Subtable,
   1165             sizeof (ACPI_MSCT_PROXIMITY));
   1166     }
   1167 }
   1168 
   1169 
   1170 /*******************************************************************************
   1171  *
   1172  * FUNCTION:    AcpiDmDumpNfit
   1173  *
   1174  * PARAMETERS:  Table               - A NFIT table
   1175  *
   1176  * RETURN:      None
   1177  *
   1178  * DESCRIPTION: Format the contents of an NFIT.
   1179  *
   1180  ******************************************************************************/
   1181 
   1182 void
   1183 AcpiDmDumpNfit (
   1184     ACPI_TABLE_HEADER       *Table)
   1185 {
   1186     ACPI_STATUS             Status;
   1187     UINT32                  Offset = sizeof (ACPI_TABLE_NFIT);
   1188     UINT32                  FieldOffset = 0;
   1189     UINT32                  Length;
   1190     ACPI_NFIT_HEADER        *Subtable;
   1191     ACPI_DMTABLE_INFO       *InfoTable;
   1192     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
   1193     ACPI_NFIT_SMBIOS        *SmbiosInfo = NULL;
   1194     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
   1195     UINT32                  i;
   1196 
   1197 
   1198     /* Main table */
   1199 
   1200     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
   1201     if (ACPI_FAILURE (Status))
   1202     {
   1203         return;
   1204     }
   1205 
   1206     /* Subtables */
   1207 
   1208     Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
   1209     while (Offset < Table->Length)
   1210     {
   1211         /* NFIT subtable header */
   1212 
   1213         AcpiOsPrintf ("\n");
   1214         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1215             Subtable->Length, AcpiDmTableInfoNfitHdr);
   1216         if (ACPI_FAILURE (Status))
   1217         {
   1218             return;
   1219         }
   1220 
   1221         switch (Subtable->Type)
   1222         {
   1223         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
   1224 
   1225             InfoTable = AcpiDmTableInfoNfit0;
   1226             break;
   1227 
   1228         case ACPI_NFIT_TYPE_MEMORY_MAP:
   1229 
   1230             InfoTable = AcpiDmTableInfoNfit1;
   1231             break;
   1232 
   1233         case ACPI_NFIT_TYPE_INTERLEAVE:
   1234 
   1235             /* Has a variable number of 32-bit values at the end */
   1236 
   1237             InfoTable = AcpiDmTableInfoNfit2;
   1238             FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);
   1239             break;
   1240 
   1241         case ACPI_NFIT_TYPE_SMBIOS:
   1242 
   1243             SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, Subtable);
   1244             InfoTable = AcpiDmTableInfoNfit3;
   1245             break;
   1246 
   1247         case ACPI_NFIT_TYPE_CONTROL_REGION:
   1248 
   1249             InfoTable = AcpiDmTableInfoNfit4;
   1250             break;
   1251 
   1252         case ACPI_NFIT_TYPE_DATA_REGION:
   1253 
   1254             InfoTable = AcpiDmTableInfoNfit5;
   1255             break;
   1256 
   1257         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
   1258 
   1259             /* Has a variable number of 64-bit addresses at the end */
   1260 
   1261             InfoTable = AcpiDmTableInfoNfit6;
   1262             FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64);
   1263             break;
   1264 
   1265         case ACPI_NFIT_TYPE_CAPABILITIES:    /* ACPI 6.0A */
   1266 
   1267             InfoTable = AcpiDmTableInfoNfit7;
   1268             break;
   1269 
   1270         default:
   1271             AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
   1272                 Subtable->Type);
   1273 
   1274             /* Attempt to continue */
   1275 
   1276             if (!Subtable->Length)
   1277             {
   1278                 AcpiOsPrintf ("Invalid zero length subtable\n");
   1279                 return;
   1280             }
   1281             goto NextSubtable;
   1282         }
   1283 
   1284         AcpiOsPrintf ("\n");
   1285         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1286             Subtable->Length, InfoTable);
   1287         if (ACPI_FAILURE (Status))
   1288         {
   1289             return;
   1290         }
   1291 
   1292         /* Per-subtable variable-length fields */
   1293 
   1294         switch (Subtable->Type)
   1295         {
   1296         case ACPI_NFIT_TYPE_INTERLEAVE:
   1297 
   1298             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable);
   1299             for (i = 0; i < Interleave->LineCount; i++)
   1300             {
   1301                 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
   1302                     &Interleave->LineOffset[i],
   1303                     sizeof (UINT32), AcpiDmTableInfoNfit2a);
   1304                 if (ACPI_FAILURE (Status))
   1305                 {
   1306                     return;
   1307                 }
   1308 
   1309                 FieldOffset += sizeof (UINT32);
   1310             }
   1311             break;
   1312 
   1313         case ACPI_NFIT_TYPE_SMBIOS:
   1314 
   1315             Length = Subtable->Length -
   1316                 sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
   1317 
   1318             if (Length)
   1319             {
   1320                 Status = AcpiDmDumpTable (Table->Length,
   1321                     sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
   1322                     SmbiosInfo,
   1323                     Length, AcpiDmTableInfoNfit3a);
   1324                 if (ACPI_FAILURE (Status))
   1325                 {
   1326                     return;
   1327                 }
   1328             }
   1329 
   1330             break;
   1331 
   1332         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
   1333 
   1334             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable);
   1335             for (i = 0; i < Hint->HintCount; i++)
   1336             {
   1337                 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
   1338                     &Hint->HintAddress[i],
   1339                     sizeof (UINT64), AcpiDmTableInfoNfit6a);
   1340                 if (ACPI_FAILURE (Status))
   1341                 {
   1342                     return;
   1343                 }
   1344 
   1345                 FieldOffset += sizeof (UINT64);
   1346             }
   1347             break;
   1348 
   1349         default:
   1350             break;
   1351         }
   1352 
   1353 NextSubtable:
   1354         /* Point to next subtable */
   1355 
   1356         Offset += Subtable->Length;
   1357         Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length);
   1358     }
   1359 }
   1360 
   1361 
   1362 /*******************************************************************************
   1363  *
   1364  * FUNCTION:    AcpiDmDumpNhlt
   1365  *
   1366  * PARAMETERS:  Table               - A NHLT table
   1367  *
   1368  * RETURN:      None
   1369  *
   1370  * DESCRIPTION: Format the contents of an NHLT.
   1371  *
   1372  ******************************************************************************/
   1373 
   1374 void
   1375 AcpiDmDumpNhlt (
   1376     ACPI_TABLE_HEADER       *Table)
   1377 {
   1378     ACPI_STATUS             Status;
   1379     UINT32                  Offset;
   1380     UINT32                  TableLength = Table->Length;
   1381     UINT32                  EndpointCount;
   1382     UINT8                   FormatsCount;
   1383     ACPI_NHLT_ENDPOINT      *Subtable;
   1384     ACPI_NHLT_FORMAT_CONFIG *FormatSubtable;
   1385     ACPI_TABLE_NHLT         *InfoTable;
   1386     UINT32                  CapabilitiesSize;
   1387     UINT32                  i;
   1388     UINT32                  j;
   1389     UINT32                  EndpointEndOffset;
   1390     UINT8                   ConfigType = 0;
   1391     UINT8                   ArrayType;
   1392     UINT8                   MicrophoneCount;
   1393     ACPI_NHLT_VENDOR_MIC_COUNT          *MicCount;
   1394     ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A  *DevSpecific;
   1395     ACPI_NHLT_FORMATS_CONFIG            *FormatsConfig;
   1396     ACPI_NHLT_LINUX_SPECIFIC_COUNT      *Count;
   1397     ACPI_NHLT_LINUX_SPECIFIC_DATA       *LinuxData;
   1398     ACPI_NHLT_LINUX_SPECIFIC_DATA_B     *LinuxDataB;
   1399 
   1400 
   1401     /* Main table */
   1402 
   1403     AcpiOsPrintf ("    /* Main table */\n");
   1404 
   1405     Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoNhlt);
   1406     if (ACPI_FAILURE (Status))
   1407     {
   1408         return;
   1409     }
   1410 
   1411     /* Get the Endpoint Descriptor Count */
   1412 
   1413     InfoTable = ACPI_ADD_PTR (ACPI_TABLE_NHLT, Table, 0);
   1414     EndpointCount = InfoTable->EndpointCount;
   1415 
   1416     /* Subtables */
   1417 
   1418     Offset = sizeof (ACPI_TABLE_NHLT);
   1419 
   1420     while (Offset < TableLength)
   1421     {
   1422         /* A variable number of Endpoint Descriptors - process each */
   1423 
   1424         for (i = 0; i < EndpointCount; i++)
   1425         {
   1426             /* Do the Endpoint Descriptor table */
   1427 
   1428             Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
   1429 
   1430             /* Check for endpoint descriptor length beyond end-of-table */
   1431 
   1432             if (Subtable->DescriptorLength > TableLength)
   1433             {
   1434                 Offset += 1;
   1435                 AcpiOsPrintf ("\n    /* Endpoint Descriptor Length larger than"
   1436                     " table size: %X, table %X, adjusting table offset (+1) */\n",
   1437                     Subtable->DescriptorLength, TableLength);
   1438 
   1439                 Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
   1440             }
   1441 
   1442             AcpiOsPrintf ("\n    /* Endpoint Descriptor #%u */\n", i+1);
   1443             Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
   1444                 Subtable->DescriptorLength, AcpiDmTableInfoNhlt0);
   1445             if (ACPI_FAILURE (Status))
   1446             {
   1447                 return;
   1448             }
   1449 
   1450             EndpointEndOffset = Subtable->DescriptorLength + Offset;
   1451 
   1452             /* Check for endpoint descriptor beyond end-of-table */
   1453 
   1454             if (Subtable->DescriptorLength > TableLength)
   1455             {
   1456                 AcpiOsPrintf ("\n    /* Endpoint Descriptor Length larger than table size: %X, table %X */\n",
   1457                     Subtable->DescriptorLength, TableLength);
   1458             }
   1459 
   1460             Offset += sizeof (ACPI_NHLT_ENDPOINT);
   1461             Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
   1462 
   1463             /* Do the Device Specific table */
   1464 
   1465             AcpiOsPrintf ("\n    /* Endpoint Device_Specific_Config table */\n");
   1466             DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable);
   1467             CapabilitiesSize = DevSpecific->CapabilitiesSize;
   1468             Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1469                 sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b);
   1470             if (ACPI_FAILURE (Status))
   1471             {
   1472                 return;
   1473             }
   1474 
   1475             ArrayType = 0;
   1476 
   1477             /* Different subtables based upon capabilities_size */
   1478 
   1479             switch (CapabilitiesSize)
   1480             {
   1481             case 0:
   1482                 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B);
   1483                 break;
   1484 
   1485             case 1:
   1486                 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1487                     sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C), AcpiDmTableInfoNhlt5c);
   1488                 if (ACPI_FAILURE (Status))
   1489                 {
   1490                     return;
   1491                 }
   1492                 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C);
   1493                 break;
   1494 
   1495             case 2:
   1496                 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1497                     sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt5);
   1498                 if (ACPI_FAILURE (Status))
   1499                 {
   1500                     return;
   1501                 }
   1502                 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG);
   1503                 break;
   1504 
   1505             case 3:
   1506             default:
   1507                 /* Extract the ConfigType and ArrayType */
   1508 
   1509                 ConfigType = DevSpecific->ConfigType;
   1510                 ArrayType = DevSpecific->ArrayType;
   1511 
   1512                 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1513                     sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A), AcpiDmTableInfoNhlt5a);
   1514                 if (ACPI_FAILURE (Status))
   1515                 {
   1516                     return;
   1517                 }
   1518 
   1519                 /* Capabilities Size == 3 */
   1520                 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A);
   1521                 break;
   1522 
   1523             case 7:
   1524                 ConfigType = DevSpecific->ConfigType;
   1525                 Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
   1526                 DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable);
   1527 
   1528                 AcpiOsPrintf ("\n    /* Render Feedback Device-Specific table */\n");
   1529                 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1530                     sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt5);
   1531                 if (ACPI_FAILURE (Status))
   1532                 {
   1533                     return;
   1534                 }
   1535 
   1536                 /* Capabilities Size = 7 */
   1537                 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG);
   1538 
   1539                 if (ConfigType == ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK)
   1540                 {
   1541                     Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
   1542                     DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable);
   1543 
   1544                     Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1545                         sizeof (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt6b);
   1546                     if (ACPI_FAILURE (Status))
   1547                     {
   1548                         return;
   1549                     }
   1550                     Offset += sizeof (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG);
   1551                 }
   1552                 break;
   1553            }
   1554 
   1555             /* Check for a vendor-defined mic array */
   1556 
   1557             if (ConfigType == ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY)
   1558             {
   1559                 if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_MASK) == ACPI_NHLT_VENDOR_DEFINED)
   1560                 {
   1561                     /* Vendor-defined microphone array; get the microphone count first */
   1562 
   1563                     AcpiOsPrintf ("\n    /* Vendor-defined microphone count */\n");
   1564                     MicCount = ACPI_ADD_PTR (ACPI_NHLT_VENDOR_MIC_COUNT, Table, Offset);
   1565                     MicrophoneCount = MicCount->MicrophoneCount;
   1566 
   1567                     Status = AcpiDmDumpTable (TableLength, Offset, MicCount,
   1568                         sizeof (ACPI_NHLT_VENDOR_MIC_COUNT), AcpiDmTableInfoNhlt6a);
   1569                     Offset += sizeof (ACPI_NHLT_VENDOR_MIC_COUNT);
   1570                     if (ACPI_FAILURE (Status))
   1571                     {
   1572                         return;
   1573                     }
   1574 
   1575                     /* Get the vendor microphone config structure(s) */
   1576 
   1577                     for (j = 0; j < MicrophoneCount; j++)
   1578                     {
   1579                         AcpiOsPrintf ("\n    /* Vendor-defined microphone array #%u*/\n", j+1);
   1580                         DevSpecific = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Table, Offset);
   1581 
   1582                         Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1583                             sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG), AcpiDmTableInfoNhlt6);
   1584                         if (ACPI_FAILURE (Status))
   1585                         {
   1586                             return;
   1587                         }
   1588 
   1589                         Offset += sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG);
   1590                     }
   1591 
   1592                     /* Check for Microphone SNR and sensitivity extension */
   1593 
   1594                     if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_EXT_MASK) == ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT)
   1595                     {
   1596                         AcpiOsPrintf ("\n    /* Microphone SNR and sensitivity array */\n");
   1597                         DevSpecific = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Table, Offset);
   1598 
   1599                         Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1600                             sizeof (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION), AcpiDmTableInfoNhlt9);
   1601                         if (ACPI_FAILURE (Status))
   1602                         {
   1603                             return;
   1604                         }
   1605 
   1606                         Offset += sizeof (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION);
   1607                     }
   1608                 }
   1609             }
   1610 
   1611             /* Do the Formats_Config table - starts with the FormatsCount field */
   1612 
   1613             FormatsConfig = ACPI_ADD_PTR (ACPI_NHLT_FORMATS_CONFIG, Table, Offset);
   1614             FormatsCount = FormatsConfig->FormatsCount;
   1615 
   1616             AcpiOsPrintf ("\n    /* Formats_Config table */\n");
   1617 
   1618             /* Dump the FormatsCount value */
   1619 
   1620             if (FormatsCount > 0)
   1621             {
   1622                 Status = AcpiDmDumpTable (TableLength, Offset, FormatsConfig,
   1623                     sizeof (ACPI_NHLT_FORMATS_CONFIG), AcpiDmTableInfoNhlt4);
   1624                 if (ACPI_FAILURE (Status))
   1625                 {
   1626                     return;
   1627                 }
   1628             }
   1629             Offset += sizeof (ACPI_NHLT_FORMATS_CONFIG);
   1630 
   1631             /* A variable number of Format_Config Descriptors - process each */
   1632 
   1633             for (j = 0; j < FormatsCount; j++)
   1634             {
   1635                 FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset);
   1636                 CapabilitiesSize = FormatSubtable->CapabilitySize;
   1637 
   1638                 /* Do the Wave_extensible struct */
   1639 
   1640                 AcpiOsPrintf ("\n    /* Wave_Format_Extensible table #%u */\n", j+1);
   1641                 Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable,
   1642                     sizeof (ACPI_NHLT_FORMAT_CONFIG), AcpiDmTableInfoNhlt3);
   1643                 if (ACPI_FAILURE (Status))
   1644                 {
   1645                     return;
   1646                 }
   1647 
   1648                 Offset += sizeof (ACPI_NHLT_FORMAT_CONFIG);
   1649 
   1650                 if (CapabilitiesSize > 0)
   1651                 {
   1652                     FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset);
   1653                     /* Do the Capabilities array (of bytes) */
   1654 
   1655                     AcpiOsPrintf ("\n    /* Specific_Config table #%u */\n", j+1);
   1656                     FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset);
   1657                     Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable,
   1658                         CapabilitiesSize, AcpiDmTableInfoNhlt3a);
   1659                     if (ACPI_FAILURE (Status))
   1660                     {
   1661                         return;
   1662                     }
   1663 
   1664                     Offset += CapabilitiesSize; // + sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B);
   1665                 }
   1666 
   1667             } /* for (j = 0; j < FormatsCount; j++) */
   1668 
   1669             /*
   1670              * If we are not done with the current Endpoint yet, then there must be
   1671              * some Linux-specific structure(s) yet to be processed. First, get
   1672              * the count of such structure(s).
   1673              */
   1674             if (Offset < EndpointEndOffset)
   1675             {
   1676                 AcpiOsPrintf ("\n    /* Linux-specific structures (not part of NHLT spec) */\n");
   1677                 Count = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_COUNT, Table, Offset);
   1678                 Status = AcpiDmDumpTable (TableLength, Offset, Count,
   1679                     sizeof (ACPI_NHLT_LINUX_SPECIFIC_COUNT), AcpiDmTableInfoNhlt7);
   1680                 if (ACPI_FAILURE (Status))
   1681                 {
   1682                     return;
   1683                 }
   1684                 Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_COUNT);
   1685 
   1686                 if (Count->StructureCount > 1)
   1687                 {
   1688                     /*
   1689                      * We currently cannot disassemble more than one
   1690                      * Linux-Specific section, because we have no way of
   1691                      * knowing whether the "Specific Data" part is present.
   1692                      */
   1693                     Count->StructureCount = 1;
   1694                     fprintf (stderr, "%s %s\n", "Feature not supported:",
   1695                         "Cannot disassemble more than one Linux-Specific structure");
   1696                     return;
   1697                 }
   1698 
   1699                 /* Variable number of linux-specific structures */
   1700 
   1701                 for (j = 0; j < Count->StructureCount; j++)
   1702                 {
   1703                     LinuxData = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA, Table, Offset);
   1704                     AcpiOsPrintf ("\n    /* Linux-specific structure #%u (not part of NHLT spec) */\n", j+1);
   1705 
   1706                     /*
   1707                      * Dump the following Linux-specific fields:
   1708                      *  1) Device ID
   1709                      *  2) Device Instance ID
   1710                      *  3) Device Port ID
   1711                      */
   1712                     Status = AcpiDmDumpTable (TableLength, Offset, LinuxData,
   1713                         sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA), AcpiDmTableInfoNhlt7a);
   1714                     if (ACPI_FAILURE (Status))
   1715                     {
   1716                         return;
   1717                     }
   1718 
   1719                     Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA);
   1720 
   1721                     /*
   1722                      * Check that the current offset is not beyond the end of
   1723                      * this endpoint descriptor. If it is not, we assume that
   1724                      * the "Specific Data" field is present and valid. Note:
   1725                      * This does not seem to be documented anywhere.
   1726                      */
   1727                     if (Offset < EndpointEndOffset)
   1728                     {
   1729                         /* Dump the linux-specific "Specific Data" field */
   1730 
   1731                         LinuxDataB = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA_B, Table, Offset);
   1732                         Status = AcpiDmDumpTable (TableLength, Offset, LinuxDataB,
   1733                             sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA_B), AcpiDmTableInfoNhlt7b);
   1734                         if (ACPI_FAILURE (Status))
   1735                         {
   1736                             return;
   1737                         }
   1738 
   1739                         Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA_B);
   1740                     }
   1741                 }
   1742 
   1743                 /* Should be at the end of the Endpoint structure. */
   1744             }
   1745 
   1746         } /* for (i = 0; i < EndpointCount; i++) */
   1747 
   1748 
   1749         /*
   1750          * Done with all of the Endpoint Descriptors, Emit the table terminator
   1751          * (if such a legacy structure is present -- not in NHLT specification)
   1752          */
   1753         if (Offset == TableLength - sizeof (ACPI_NHLT_TABLE_TERMINATOR))
   1754         {
   1755             LinuxData = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA, Table, Offset);
   1756             AcpiOsPrintf ("\n    /* Table terminator structure (not part of NHLT spec) */\n");
   1757 
   1758             Status = AcpiDmDumpTable (TableLength, Offset, LinuxData,
   1759                 sizeof (ACPI_NHLT_TABLE_TERMINATOR), AcpiDmTableInfoNhlt8);
   1760             if (ACPI_FAILURE (Status))
   1761             {
   1762                 return;
   1763             }
   1764         }
   1765 
   1766         return;
   1767     }
   1768 }
   1769 
   1770 
   1771 /*******************************************************************************
   1772  *
   1773  * FUNCTION:    AcpiDmDumpPcct
   1774  *
   1775  * PARAMETERS:  Table               - A PCCT table
   1776  *
   1777  * RETURN:      None
   1778  *
   1779  * DESCRIPTION: Format the contents of a PCCT. This table type consists
   1780  *              of an open-ended number of subtables.
   1781  *
   1782  ******************************************************************************/
   1783 
   1784 void
   1785 AcpiDmDumpPcct (
   1786     ACPI_TABLE_HEADER       *Table)
   1787 {
   1788     ACPI_STATUS             Status;
   1789     ACPI_PCCT_SUBSPACE      *Subtable;
   1790     ACPI_DMTABLE_INFO       *InfoTable;
   1791     UINT32                  Length = Table->Length;
   1792     UINT32                  Offset = sizeof (ACPI_TABLE_PCCT);
   1793 
   1794 
   1795     /* Main table */
   1796 
   1797     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
   1798     if (ACPI_FAILURE (Status))
   1799     {
   1800         return;
   1801     }
   1802 
   1803     /* Subtables */
   1804 
   1805     Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
   1806     while (Offset < Table->Length)
   1807     {
   1808         /* Common subtable header */
   1809 
   1810         AcpiOsPrintf ("\n");
   1811         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1812             Subtable->Header.Length, AcpiDmTableInfoPcctHdr);
   1813         if (ACPI_FAILURE (Status))
   1814         {
   1815             return;
   1816         }
   1817 
   1818         switch (Subtable->Header.Type)
   1819         {
   1820         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
   1821 
   1822             InfoTable = AcpiDmTableInfoPcct0;
   1823             break;
   1824 
   1825         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
   1826 
   1827             InfoTable = AcpiDmTableInfoPcct1;
   1828             break;
   1829 
   1830         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
   1831 
   1832             InfoTable = AcpiDmTableInfoPcct2;
   1833             break;
   1834 
   1835         case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
   1836 
   1837             InfoTable = AcpiDmTableInfoPcct3;
   1838             break;
   1839 
   1840         case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
   1841 
   1842             InfoTable = AcpiDmTableInfoPcct4;
   1843             break;
   1844 
   1845         case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
   1846 
   1847             InfoTable = AcpiDmTableInfoPcct5;
   1848             break;
   1849 
   1850         default:
   1851 
   1852             AcpiOsPrintf (
   1853                 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
   1854                 Subtable->Header.Type);
   1855             return;
   1856         }
   1857 
   1858         AcpiOsPrintf ("\n");
   1859         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1860             Subtable->Header.Length, InfoTable);
   1861         if (ACPI_FAILURE (Status))
   1862         {
   1863             return;
   1864         }
   1865 
   1866         /* Point to next subtable */
   1867 
   1868         Offset += Subtable->Header.Length;
   1869         Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Subtable,
   1870             Subtable->Header.Length);
   1871     }
   1872 }
   1873 
   1874 
   1875 /*******************************************************************************
   1876  *
   1877  * FUNCTION:    AcpiDmDumpPdtt
   1878  *
   1879  * PARAMETERS:  Table               - A PDTT table
   1880  *
   1881  * RETURN:      None
   1882  *
   1883  * DESCRIPTION: Format the contents of a Pdtt. This is a variable-length
   1884  *              table that contains an open-ended number of IDs
   1885  *              at the end of the table.
   1886  *
   1887  ******************************************************************************/
   1888 
   1889 void
   1890 AcpiDmDumpPdtt (
   1891     ACPI_TABLE_HEADER       *Table)
   1892 {
   1893     ACPI_STATUS             Status;
   1894     ACPI_PDTT_CHANNEL       *Subtable;
   1895     UINT32                  Length = Table->Length;
   1896     UINT32                  Offset = sizeof (ACPI_TABLE_PDTT);
   1897 
   1898 
   1899     /* Main table */
   1900 
   1901     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt);
   1902     if (ACPI_FAILURE (Status))
   1903     {
   1904         return;
   1905     }
   1906 
   1907     /* Subtables. Currently there is only one type, but can be multiples */
   1908 
   1909     Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset);
   1910     while (Offset < Table->Length)
   1911     {
   1912         AcpiOsPrintf ("\n");
   1913         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1914             sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0);
   1915         if (ACPI_FAILURE (Status))
   1916         {
   1917             return;
   1918         }
   1919 
   1920         /* Point to next subtable */
   1921 
   1922         Offset += sizeof (ACPI_PDTT_CHANNEL);
   1923         Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Subtable,
   1924             sizeof (ACPI_PDTT_CHANNEL));
   1925     }
   1926 }
   1927 
   1928 
   1929 /*******************************************************************************
   1930  *
   1931  * FUNCTION:    AcpiDmDumpPhat
   1932  *
   1933  * PARAMETERS:  Table               - A PHAT table
   1934  *
   1935  * RETURN:      None
   1936  *
   1937  * DESCRIPTION: Format the contents of a PHAT.
   1938  *
   1939  ******************************************************************************/
   1940 
   1941 void
   1942 AcpiDmDumpPhat (
   1943     ACPI_TABLE_HEADER       *Table)
   1944 {
   1945     ACPI_STATUS             Status;
   1946     ACPI_DMTABLE_INFO       *InfoTable;
   1947     ACPI_PHAT_HEADER        *Subtable;
   1948     ACPI_PHAT_VERSION_DATA  *VersionData;
   1949     UINT32                  RecordCount;
   1950     UINT32                  Length = Table->Length;
   1951     UINT32                  Offset = sizeof (ACPI_TABLE_PHAT);
   1952     UINT32                  SubtableLength;
   1953     UINT32                  PathLength;
   1954     UINT32                  VendorLength;
   1955 
   1956 
   1957     Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT));
   1958 
   1959     while (Offset < Table->Length)
   1960     {
   1961         /* Common subtable header */
   1962 
   1963         AcpiOsPrintf ("\n");
   1964         Status = AcpiDmDumpTable (Length, 0, Subtable,
   1965             sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr);
   1966         if (ACPI_FAILURE (Status))
   1967         {
   1968             return;
   1969         }
   1970 
   1971         switch (Subtable->Type)
   1972         {
   1973         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
   1974 
   1975             InfoTable = AcpiDmTableInfoPhat0;
   1976             SubtableLength = sizeof (ACPI_PHAT_VERSION_DATA);
   1977             break;
   1978 
   1979         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
   1980 
   1981             InfoTable = AcpiDmTableInfoPhat1;
   1982             SubtableLength = sizeof (ACPI_PHAT_HEALTH_DATA);
   1983             break;
   1984 
   1985         default:
   1986 
   1987             AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",
   1988                 Subtable->Type);
   1989 
   1990             return;
   1991         }
   1992 
   1993         Status = AcpiDmDumpTable (Length, 0, Subtable,
   1994             SubtableLength, InfoTable);
   1995         if (ACPI_FAILURE (Status))
   1996         {
   1997             return;
   1998         }
   1999 
   2000         switch (Subtable->Type)
   2001         {
   2002         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
   2003 
   2004             VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable);
   2005             RecordCount = VersionData->ElementCount;
   2006             while (RecordCount)
   2007             {
   2008                 Status = AcpiDmDumpTable (Length, Offset,
   2009                     ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_VERSION_DATA)),
   2010                     sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a);
   2011                 if (ACPI_FAILURE (Status))
   2012                 {
   2013                     return;
   2014                 }
   2015 
   2016                 RecordCount--;
   2017             }
   2018 
   2019             break;
   2020 
   2021         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
   2022 
   2023             /* account for the null terminator */
   2024 
   2025             PathLength = strlen (ACPI_ADD_PTR (char, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA))) + 1;
   2026             Status = AcpiDmDumpTable (Length, Offset,
   2027                 ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)),
   2028                 PathLength, AcpiDmTableInfoPhat1a);
   2029             if (ACPI_FAILURE (Status))
   2030             {
   2031                 return;
   2032             }
   2033 
   2034             /* Get vendor data - data length is the remaining subtable length */
   2035 
   2036             VendorLength =
   2037                 Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength;
   2038             Status = AcpiDmDumpTable (Length, 0,
   2039                 ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength),
   2040                 VendorLength, AcpiDmTableInfoPhat1b);
   2041             if (ACPI_FAILURE (Status))
   2042             {
   2043                 return;
   2044             }
   2045             break;
   2046 
   2047         default:
   2048 
   2049             AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",
   2050                 Subtable->Type);
   2051             return;
   2052         }
   2053 
   2054         /* Next subtable */
   2055 
   2056         Offset += Subtable->Length;
   2057         Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable,
   2058             Subtable->Length);
   2059     }
   2060 }
   2061 
   2062 
   2063 /*******************************************************************************
   2064  *
   2065  * FUNCTION:    AcpiDmDumpPmtt
   2066  *
   2067  * PARAMETERS:  Table               - A PMTT table
   2068  *
   2069  * RETURN:      None
   2070  *
   2071  * DESCRIPTION: Format the contents of a PMTT. This table type consists
   2072  *              of an open-ended number of subtables.
   2073  *
   2074  ******************************************************************************/
   2075 
   2076 void
   2077 AcpiDmDumpPmtt (
   2078     ACPI_TABLE_HEADER       *Table)
   2079 {
   2080     ACPI_STATUS             Status;
   2081     ACPI_PMTT_HEADER        *Subtable;
   2082     UINT32                  Length = Table->Length;
   2083     UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
   2084 
   2085 
   2086     /* Main table */
   2087 
   2088     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
   2089     if (ACPI_FAILURE (Status))
   2090     {
   2091         return;
   2092     }
   2093 
   2094     /* Subtables */
   2095 
   2096     Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
   2097     while (Offset < Table->Length)
   2098     {
   2099         /* Each of the types below contain the common subtable header */
   2100 
   2101         AcpiOsPrintf ("\n");
   2102         switch (Subtable->Type)
   2103         {
   2104         case ACPI_PMTT_TYPE_SOCKET:
   2105 
   2106             Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2107                 Subtable->Length, AcpiDmTableInfoPmtt0);
   2108             if (ACPI_FAILURE (Status))
   2109             {
   2110                 return;
   2111             }
   2112             break;
   2113 
   2114         case ACPI_PMTT_TYPE_CONTROLLER:
   2115             Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2116                 Subtable->Length, AcpiDmTableInfoPmtt1);
   2117             if (ACPI_FAILURE (Status))
   2118             {
   2119                 return;
   2120             }
   2121             break;
   2122 
   2123        case ACPI_PMTT_TYPE_DIMM:
   2124             Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2125                 Subtable->Length, AcpiDmTableInfoPmtt2);
   2126             if (ACPI_FAILURE (Status))
   2127             {
   2128                 return;
   2129             }
   2130             break;
   2131 
   2132         case ACPI_PMTT_TYPE_VENDOR:
   2133             Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2134                 Subtable->Length, AcpiDmTableInfoPmttVendor);
   2135             if (ACPI_FAILURE (Status))
   2136             {
   2137                 return;
   2138             }
   2139             break;
   2140 
   2141         default:
   2142             AcpiOsPrintf (
   2143                 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
   2144                 Subtable->Type);
   2145             return;
   2146         }
   2147 
   2148         /* Point to next subtable */
   2149 
   2150         Offset += Subtable->Length;
   2151         Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
   2152             Subtable, Subtable->Length);
   2153     }
   2154 }
   2155 
   2156 
   2157 /*******************************************************************************
   2158  *
   2159  * FUNCTION:    AcpiDmDumpPptt
   2160  *
   2161  * PARAMETERS:  Table               - A PMTT table
   2162  *
   2163  * RETURN:      None
   2164  *
   2165  * DESCRIPTION: Format the contents of a PPTT. This table type consists
   2166  *              of an open-ended number of subtables.
   2167  *
   2168  ******************************************************************************/
   2169 
   2170 void
   2171 AcpiDmDumpPptt (
   2172     ACPI_TABLE_HEADER       *Table)
   2173 {
   2174     ACPI_STATUS             Status;
   2175     ACPI_SUBTABLE_HEADER    *Subtable;
   2176     ACPI_PPTT_PROCESSOR     *PpttProcessor;
   2177     UINT8                   Length;
   2178     UINT8                   SubtableOffset;
   2179     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
   2180     ACPI_DMTABLE_INFO       *InfoTable;
   2181     UINT32                  i;
   2182 
   2183 
   2184     /* There is no main table (other than the standard ACPI header) */
   2185 
   2186     /* Subtables */
   2187 
   2188     Offset = sizeof (ACPI_TABLE_HEADER);
   2189     while (Offset < Table->Length)
   2190     {
   2191         AcpiOsPrintf ("\n");
   2192 
   2193         /* Common subtable header */
   2194 
   2195         Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
   2196         if (Subtable->Length < sizeof (ACPI_SUBTABLE_HEADER))
   2197         {
   2198             AcpiOsPrintf ("Invalid subtable length\n");
   2199             return;
   2200         }
   2201         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   2202             Subtable->Length, AcpiDmTableInfoPpttHdr);
   2203         if (ACPI_FAILURE (Status))
   2204         {
   2205             return;
   2206         }
   2207 
   2208         switch (Subtable->Type)
   2209         {
   2210         case ACPI_PPTT_TYPE_PROCESSOR:
   2211 
   2212             InfoTable = AcpiDmTableInfoPptt0;
   2213             Length = sizeof (ACPI_PPTT_PROCESSOR);
   2214             break;
   2215 
   2216         case ACPI_PPTT_TYPE_CACHE:
   2217 
   2218             InfoTable = AcpiDmTableInfoPptt1;
   2219             Length = sizeof (ACPI_PPTT_CACHE);
   2220             break;
   2221 
   2222         case ACPI_PPTT_TYPE_ID:
   2223 
   2224             InfoTable = AcpiDmTableInfoPptt2;
   2225             Length = sizeof (ACPI_PPTT_ID);
   2226             break;
   2227 
   2228         default:
   2229 
   2230             AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n",
   2231                 Subtable->Type);
   2232 
   2233             /* Attempt to continue */
   2234 
   2235             goto NextSubtable;
   2236         }
   2237 
   2238         if (Subtable->Length < Length)
   2239         {
   2240             AcpiOsPrintf ("Invalid subtable length\n");
   2241             return;
   2242         }
   2243         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   2244             Subtable->Length, InfoTable);
   2245         if (ACPI_FAILURE (Status))
   2246         {
   2247             return;
   2248         }
   2249         SubtableOffset = Length;
   2250 
   2251         switch (Subtable->Type)
   2252         {
   2253         case ACPI_PPTT_TYPE_PROCESSOR:
   2254 
   2255             PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, Subtable);
   2256 
   2257             /* Dump SMBIOS handles */
   2258 
   2259             if ((UINT8)(Subtable->Length - SubtableOffset) <
   2260                 (UINT8)(PpttProcessor->NumberOfPrivResources * 4))
   2261             {
   2262                 AcpiOsPrintf ("Invalid private resource number\n");
   2263                 return;
   2264             }
   2265             for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++)
   2266             {
   2267                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2268                     ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
   2269                     4, AcpiDmTableInfoPptt0a);
   2270                 if (ACPI_FAILURE (Status))
   2271                 {
   2272                     return;
   2273                 }
   2274 
   2275                 SubtableOffset += 4;
   2276             }
   2277             break;
   2278 
   2279         case ACPI_PPTT_TYPE_CACHE:
   2280 
   2281             if (Table->Revision < 3)
   2282             {
   2283                 break;
   2284             }
   2285             Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2286                 ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
   2287                 sizeof (ACPI_PPTT_CACHE_V1), AcpiDmTableInfoPptt1a);
   2288             if (ACPI_FAILURE (Status))
   2289             {
   2290                 return;
   2291             }
   2292             break;
   2293 
   2294         default:
   2295 
   2296             break;
   2297         }
   2298 
   2299 NextSubtable:
   2300         /* Point to next subtable */
   2301 
   2302         Offset += Subtable->Length;
   2303     }
   2304 }
   2305 
   2306 
   2307 /*******************************************************************************
   2308  *
   2309  * FUNCTION:    AcpiDmDumpPrmt
   2310  *
   2311  * PARAMETERS:  Table               - A PRMT table
   2312  *
   2313  * RETURN:      None
   2314  *
   2315  * DESCRIPTION: Format the contents of a PRMT. This table type consists
   2316  *              of an open-ended number of subtables.
   2317  *
   2318  ******************************************************************************/
   2319 
   2320 void
   2321 AcpiDmDumpPrmt (
   2322     ACPI_TABLE_HEADER       *Table)
   2323 {
   2324     UINT32                  CurrentOffset = sizeof (ACPI_TABLE_HEADER);
   2325     ACPI_TABLE_PRMT_HEADER  *PrmtHeader;
   2326     ACPI_PRMT_MODULE_INFO   *PrmtModuleInfo;
   2327     ACPI_PRMT_HANDLER_INFO  *PrmtHandlerInfo;
   2328     ACPI_STATUS             Status;
   2329     UINT32                  i, j;
   2330 
   2331 
   2332     /* Main table header */
   2333 
   2334     PrmtHeader = ACPI_ADD_PTR (ACPI_TABLE_PRMT_HEADER, Table, CurrentOffset);
   2335     Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHeader,
   2336         sizeof (ACPI_TABLE_PRMT_HEADER), AcpiDmTableInfoPrmtHdr);
   2337     if (ACPI_FAILURE (Status))
   2338     {
   2339         AcpiOsPrintf ("Invalid PRMT header\n");
   2340         return;
   2341     }
   2342 
   2343     CurrentOffset += sizeof (ACPI_TABLE_PRMT_HEADER);
   2344 
   2345     /* PRM Module Information Structure array */
   2346 
   2347     for (i = 0; i < PrmtHeader->ModuleInfoCount; ++i)
   2348     {
   2349         PrmtModuleInfo = ACPI_ADD_PTR (ACPI_PRMT_MODULE_INFO, Table, CurrentOffset);
   2350         Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtModuleInfo,
   2351             sizeof (ACPI_PRMT_MODULE_INFO), AcpiDmTableInfoPrmtModule);
   2352 
   2353         CurrentOffset += sizeof (ACPI_PRMT_MODULE_INFO);
   2354 
   2355         /* PRM handler information structure array */
   2356 
   2357         for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; ++j)
   2358         {
   2359             PrmtHandlerInfo = ACPI_ADD_PTR (ACPI_PRMT_HANDLER_INFO, Table, CurrentOffset);
   2360             Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHandlerInfo,
   2361                 sizeof (ACPI_PRMT_HANDLER_INFO), AcpiDmTableInfoPrmtHandler);
   2362 
   2363             CurrentOffset += sizeof (ACPI_PRMT_HANDLER_INFO);
   2364         }
   2365     }
   2366 }
   2367 
   2368 
   2369 /*******************************************************************************
   2370  *
   2371  * FUNCTION:    AcpiDmDumpRgrt
   2372  *
   2373  * PARAMETERS:  Table               - A RGRT table
   2374  *
   2375  * RETURN:      None
   2376  *
   2377  * DESCRIPTION: Format the contents of a RGRT
   2378  *
   2379  ******************************************************************************/
   2380 
   2381 void
   2382 AcpiDmDumpRgrt (
   2383     ACPI_TABLE_HEADER       *Table)
   2384 {
   2385     ACPI_STATUS             Status;
   2386     ACPI_TABLE_RGRT         *Subtable = ACPI_CAST_PTR (ACPI_TABLE_RGRT, Table);
   2387     UINT32                  Offset = sizeof (ACPI_TABLE_RGRT);
   2388 
   2389 
   2390     /* Main table */
   2391 
   2392     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoRgrt);
   2393     if (ACPI_FAILURE (Status))
   2394     {
   2395         return;
   2396     }
   2397 
   2398     /* Dump the binary image as a subtable */
   2399 
   2400     Status = AcpiDmDumpTable (Table->Length, Offset, &Subtable->Image,
   2401         Table->Length - Offset, AcpiDmTableInfoRgrt0);
   2402     if (ACPI_FAILURE (Status))
   2403     {
   2404         return;
   2405     }
   2406 }
   2407 
   2408 
   2409 /*******************************************************************************
   2410  *
   2411  * FUNCTION:    AcpiDmDumpS3pt
   2412  *
   2413  * PARAMETERS:  Table               - A S3PT table
   2414  *
   2415  * RETURN:      Length of the table
   2416  *
   2417  * DESCRIPTION: Format the contents of a S3PT
   2418  *
   2419  ******************************************************************************/
   2420 
   2421 UINT32
   2422 AcpiDmDumpS3pt (
   2423     ACPI_TABLE_HEADER       *Tables)
   2424 {
   2425     ACPI_STATUS             Status;
   2426     UINT32                  Offset = sizeof (ACPI_TABLE_S3PT);
   2427     ACPI_FPDT_HEADER        *Subtable;
   2428     ACPI_DMTABLE_INFO       *InfoTable;
   2429     ACPI_TABLE_S3PT         *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
   2430 
   2431 
   2432     /* Main table */
   2433 
   2434     Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
   2435     if (ACPI_FAILURE (Status))
   2436     {
   2437         return 0;
   2438     }
   2439 
   2440     Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);
   2441     while (Offset < S3ptTable->Length)
   2442     {
   2443         /* Common subtable header */
   2444 
   2445         AcpiOsPrintf ("\n");
   2446         Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
   2447             Subtable->Length, AcpiDmTableInfoS3ptHdr);
   2448         if (ACPI_FAILURE (Status))
   2449         {
   2450             return 0;
   2451         }
   2452 
   2453         switch (Subtable->Type)
   2454         {
   2455         case ACPI_S3PT_TYPE_RESUME:
   2456 
   2457             InfoTable = AcpiDmTableInfoS3pt0;
   2458             break;
   2459 
   2460         case ACPI_S3PT_TYPE_SUSPEND:
   2461 
   2462             InfoTable = AcpiDmTableInfoS3pt1;
   2463             break;
   2464 
   2465         default:
   2466 
   2467             AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n",
   2468                 Subtable->Type);
   2469 
   2470             /* Attempt to continue */
   2471 
   2472             if (!Subtable->Length)
   2473             {
   2474                 AcpiOsPrintf ("Invalid zero length subtable\n");
   2475                 return 0;
   2476             }
   2477             goto NextSubtable;
   2478         }
   2479 
   2480         AcpiOsPrintf ("\n");
   2481         Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
   2482             Subtable->Length, InfoTable);
   2483         if (ACPI_FAILURE (Status))
   2484         {
   2485             return 0;
   2486         }
   2487 
   2488 NextSubtable:
   2489         /* Point to next subtable */
   2490 
   2491         Offset += Subtable->Length;
   2492         Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length);
   2493     }
   2494 
   2495     return (S3ptTable->Length);
   2496 }
   2497 
   2498 
   2499 /*******************************************************************************
   2500  *
   2501  * FUNCTION:    AcpiDmDumpSdev
   2502  *
   2503  * PARAMETERS:  Table               - A SDEV table
   2504  *
   2505  * RETURN:      None
   2506  *
   2507  * DESCRIPTION: Format the contents of a SDEV. This is a variable-length
   2508  *              table that contains variable strings and vendor data.
   2509  *
   2510  ******************************************************************************/
   2511 
   2512 void
   2513 AcpiDmDumpSdev (
   2514     ACPI_TABLE_HEADER       *Table)
   2515 {
   2516     ACPI_STATUS                 Status;
   2517     ACPI_SDEV_HEADER            *Subtable;
   2518     ACPI_SDEV_PCIE              *Pcie;
   2519     ACPI_SDEV_NAMESPACE         *Namesp;
   2520     ACPI_DMTABLE_INFO           *InfoTable;
   2521     ACPI_DMTABLE_INFO           *SecureComponentInfoTable;
   2522     UINT32                      Length = Table->Length;
   2523     UINT32                      Offset = sizeof (ACPI_TABLE_SDEV);
   2524     UINT16                      PathOffset;
   2525     UINT16                      PathLength;
   2526     UINT16                      VendorDataOffset;
   2527     UINT16                      VendorDataLength;
   2528     ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
   2529     UINT32                      CurrentOffset = 0;
   2530 
   2531 
   2532     /* Main table */
   2533 
   2534     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev);
   2535     if (ACPI_FAILURE (Status))
   2536     {
   2537         return;
   2538     }
   2539 
   2540     /* Subtables */
   2541 
   2542     Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset);
   2543     while (Offset < Table->Length)
   2544     {
   2545         /* Common subtable header */
   2546 
   2547         AcpiOsPrintf ("\n");
   2548         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   2549             Subtable->Length, AcpiDmTableInfoSdevHdr);
   2550         if (ACPI_FAILURE (Status))
   2551         {
   2552             return;
   2553         }
   2554 
   2555         switch (Subtable->Type)
   2556         {
   2557         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
   2558 
   2559             InfoTable = AcpiDmTableInfoSdev0;
   2560             break;
   2561 
   2562         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
   2563 
   2564             InfoTable = AcpiDmTableInfoSdev1;
   2565             break;
   2566 
   2567         default:
   2568             goto NextSubtable;
   2569         }
   2570 
   2571         AcpiOsPrintf ("\n");
   2572         Status = AcpiDmDumpTable (Table->Length, 0, Subtable,
   2573             Subtable->Length, InfoTable);
   2574         if (ACPI_FAILURE (Status))
   2575         {
   2576             return;
   2577         }
   2578 
   2579         switch (Subtable->Type)
   2580         {
   2581         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
   2582 
   2583             CurrentOffset = sizeof (ACPI_SDEV_NAMESPACE);
   2584             if (Subtable->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
   2585             {
   2586                 SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
   2587                     ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)));
   2588 
   2589                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
   2590                     ACPI_ADD_PTR(UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)),
   2591                     sizeof (ACPI_SDEV_SECURE_COMPONENT), AcpiDmTableInfoSdev0b);
   2592                 if (ACPI_FAILURE (Status))
   2593                 {
   2594                     return;
   2595                 }
   2596                 CurrentOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
   2597 
   2598                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
   2599                     ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
   2600                     sizeof (ACPI_SDEV_HEADER), AcpiDmTableInfoSdevSecCompHdr);
   2601                 if (ACPI_FAILURE (Status))
   2602                 {
   2603                     return;
   2604                 }
   2605                 CurrentOffset += sizeof (ACPI_SDEV_HEADER);
   2606 
   2607                 switch (Subtable->Type)
   2608                 {
   2609                 case ACPI_SDEV_TYPE_ID_COMPONENT:
   2610 
   2611                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
   2612                     break;
   2613 
   2614                 case ACPI_SDEV_TYPE_MEM_COMPONENT:
   2615 
   2616                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
   2617                     break;
   2618 
   2619                 default:
   2620                     goto NextSubtable;
   2621                 }
   2622 
   2623                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
   2624                     ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
   2625                     SecureComponent->SecureComponentLength, SecureComponentInfoTable);
   2626                 CurrentOffset += SecureComponent->SecureComponentLength;
   2627             }
   2628 
   2629             /* Dump the PCIe device ID(s) */
   2630 
   2631             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);
   2632             PathOffset = Namesp->DeviceIdOffset;
   2633             PathLength = Namesp->DeviceIdLength;
   2634 
   2635             if (PathLength)
   2636             {
   2637                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
   2638                     ACPI_ADD_PTR (UINT8, Namesp, PathOffset),
   2639                     PathLength, AcpiDmTableInfoSdev0a);
   2640                 if (ACPI_FAILURE (Status))
   2641                 {
   2642                     return;
   2643                 }
   2644                 CurrentOffset += PathLength;
   2645             }
   2646 
   2647             /* Dump the vendor-specific data */
   2648 
   2649             VendorDataLength =
   2650                 Namesp->VendorDataLength;
   2651             VendorDataOffset =
   2652                 Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
   2653 
   2654             if (VendorDataLength)
   2655             {
   2656                 Status = AcpiDmDumpTable (Table->Length, 0,
   2657                     ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset),
   2658                     VendorDataLength, AcpiDmTableInfoSdev1b);
   2659                 if (ACPI_FAILURE (Status))
   2660                 {
   2661                     return;
   2662                 }
   2663             }
   2664             break;
   2665 
   2666         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
   2667 
   2668             /* PCI path substructures */
   2669 
   2670             Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable);
   2671             PathOffset = Pcie->PathOffset;
   2672             PathLength = Pcie->PathLength;
   2673 
   2674             while (PathLength)
   2675             {
   2676                 Status = AcpiDmDumpTable (Table->Length,
   2677                     PathOffset + Offset,
   2678                     ACPI_ADD_PTR (UINT8, Pcie, PathOffset),
   2679                     sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a);
   2680                 if (ACPI_FAILURE (Status))
   2681                 {
   2682                     return;
   2683                 }
   2684 
   2685                 PathOffset += sizeof (ACPI_SDEV_PCIE_PATH);
   2686                 PathLength -= sizeof (ACPI_SDEV_PCIE_PATH);
   2687             }
   2688 
   2689             /* VendorData */
   2690 
   2691             VendorDataLength = Pcie->VendorDataLength;
   2692             VendorDataOffset = Pcie->PathOffset + Pcie->PathLength;
   2693 
   2694             if (VendorDataLength)
   2695             {
   2696                 Status = AcpiDmDumpTable (Table->Length, 0,
   2697                     ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset),
   2698                     VendorDataLength, AcpiDmTableInfoSdev1b);
   2699                 if (ACPI_FAILURE (Status))
   2700                 {
   2701                     return;
   2702                 }
   2703             }
   2704             break;
   2705 
   2706         default:
   2707             goto NextSubtable;
   2708         }
   2709 
   2710 NextSubtable:
   2711         /* Point to next subtable */
   2712 
   2713         Offset += Subtable->Length;
   2714         Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable,
   2715             Subtable->Length);
   2716     }
   2717 }
   2718