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