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