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