Path: blob/main/sys/contrib/dev/acpica/common/dmtbdump2.c
48375 views
/******************************************************************************1*2* Module Name: dmtbdump2 - Dump ACPI data tables that contain no AML code3*4*****************************************************************************/56/******************************************************************************7*8* 1. Copyright Notice9*10* Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.11* All rights reserved.12*13* 2. License14*15* 2.1. This is your license from Intel Corp. under its intellectual property16* rights. You may have additional license terms from the party that provided17* you this software, covering your right to use that party's intellectual18* property rights.19*20* 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a21* copy of the source code appearing in this file ("Covered Code") an22* irrevocable, perpetual, worldwide license under Intel's copyrights in the23* base code distributed originally by Intel ("Original Intel Code") to copy,24* make derivatives, distribute, use and display any portion of the Covered25* Code in any form, with the right to sublicense such rights; and26*27* 2.3. Intel grants Licensee a non-exclusive and non-transferable patent28* license (with the right to sublicense), under only those claims of Intel29* patents that are infringed by the Original Intel Code, to make, use, sell,30* offer to sell, and import the Covered Code and derivative works thereof31* solely to the minimum extent necessary to exercise the above copyright32* license, and in no event shall the patent license extend to any additions33* to or modifications of the Original Intel Code. No other license or right34* is granted directly or by implication, estoppel or otherwise;35*36* The above copyright and patent license is granted only if the following37* conditions are met:38*39* 3. Conditions40*41* 3.1. Redistribution of Source with Rights to Further Distribute Source.42* Redistribution of source code of any substantial portion of the Covered43* Code or modification with rights to further distribute source must include44* the above Copyright Notice, the above License, this list of Conditions,45* and the following Disclaimer and Export Compliance provision. In addition,46* Licensee must cause all Covered Code to which Licensee contributes to47* contain a file documenting the changes Licensee made to create that Covered48* Code and the date of any change. Licensee must include in that file the49* documentation of any changes made by any predecessor Licensee. Licensee50* must include a prominent statement that the modification is derived,51* directly or indirectly, from Original Intel Code.52*53* 3.2. Redistribution of Source with no Rights to Further Distribute Source.54* Redistribution of source code of any substantial portion of the Covered55* Code or modification without rights to further distribute source must56* include the following Disclaimer and Export Compliance provision in the57* documentation and/or other materials provided with distribution. In58* addition, Licensee may not authorize further sublicense of source of any59* portion of the Covered Code, and must include terms to the effect that the60* license from Licensee to its licensee is limited to the intellectual61* property embodied in the software Licensee provides to its licensee, and62* not to intellectual property embodied in modifications its licensee may63* make.64*65* 3.3. Redistribution of Executable. Redistribution in executable form of any66* substantial portion of the Covered Code or modification must reproduce the67* above Copyright Notice, and the following Disclaimer and Export Compliance68* provision in the documentation and/or other materials provided with the69* distribution.70*71* 3.4. Intel retains all right, title, and interest in and to the Original72* Intel Code.73*74* 3.5. Neither the name Intel nor any other trademark owned or controlled by75* Intel shall be used in advertising or otherwise to promote the sale, use or76* other dealings in products derived from or relating to the Covered Code77* without prior written authorization from Intel.78*79* 4. Disclaimer and Export Compliance80*81* 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED82* HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE83* IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,84* INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY85* UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY86* IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A87* PARTICULAR PURPOSE.88*89* 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES90* OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR91* COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,92* SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY93* CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL94* HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS95* SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY96* LIMITED REMEDY.97*98* 4.3. Licensee shall not export, either directly or indirectly, any of this99* software or system incorporating such software without first obtaining any100* required license or other approval from the U. S. Department of Commerce or101* any other agency or department of the United States Government. In the102* event Licensee exports any such software from the United States or103* re-exports any such software from a foreign destination, Licensee shall104* ensure that the distribution and export/re-export of the software is in105* compliance with all laws, regulations, orders, or other restrictions of the106* U.S. Export Administration Regulations. Licensee agrees that neither it nor107* any of its subsidiaries will export/re-export any technical data, process,108* software, or service, directly or indirectly, to any country for which the109* United States government or any agency thereof requires an export license,110* other governmental approval, or letter of assurance, without first obtaining111* such license, approval or letter.112*113*****************************************************************************114*115* Alternatively, you may choose to be licensed under the terms of the116* following license:117*118* Redistribution and use in source and binary forms, with or without119* modification, are permitted provided that the following conditions120* are met:121* 1. Redistributions of source code must retain the above copyright122* notice, this list of conditions, and the following disclaimer,123* without modification.124* 2. Redistributions in binary form must reproduce at minimum a disclaimer125* substantially similar to the "NO WARRANTY" disclaimer below126* ("Disclaimer") and any redistribution must be conditioned upon127* including a substantially similar Disclaimer requirement for further128* binary redistribution.129* 3. Neither the names of the above-listed copyright holders nor the names130* of any contributors may be used to endorse or promote products derived131* from this software without specific prior written permission.132*133* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS134* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT135* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR136* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT137* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,138* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT139* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,140* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY141* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT142* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE143* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.144*145* Alternatively, you may choose to be licensed under the terms of the146* GNU General Public License ("GPL") version 2 as published by the Free147* Software Foundation.148*149*****************************************************************************/150151#include <wchar.h>152#include <contrib/dev/acpica/include/acpi.h>153#include <contrib/dev/acpica/include/accommon.h>154#include <contrib/dev/acpica/include/acdisasm.h>155#include <contrib/dev/acpica/include/actables.h>156#include <contrib/dev/acpica/compiler/aslcompiler.h>157158/* This module used for application-level code only */159160#define _COMPONENT ACPI_CA_DISASSEMBLER161ACPI_MODULE_NAME ("dmtbdump2")162163164/*******************************************************************************165*166* FUNCTION: AcpiDmDumpIort167*168* PARAMETERS: Table - A IORT table169*170* RETURN: None171*172* DESCRIPTION: Format the contents of a IORT173*174******************************************************************************/175176void177AcpiDmDumpIort (178ACPI_TABLE_HEADER *Table)179{180ACPI_STATUS Status;181ACPI_TABLE_IORT *Iort;182ACPI_IORT_NODE *IortNode;183ACPI_IORT_ITS_GROUP *IortItsGroup = NULL;184ACPI_IORT_SMMU *IortSmmu = NULL;185ACPI_IORT_RMR *IortRmr = NULL;186UINT32 Offset;187UINT32 NodeOffset;188UINT32 Length;189ACPI_DMTABLE_INFO *InfoTable;190char *String;191UINT32 i;192UINT32 MappingByteLength;193UINT8 Revision;194195196/* Main table */197198Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort);199if (ACPI_FAILURE (Status))200{201return;202}203204Revision = Table->Revision;205206/* IORT Revisions E, E.a and E.c have known issues and are not supported */207208if (Revision == 1 || Revision == 2 || Revision == 4)209{210AcpiOsPrintf ("\n**** Unsupported IORT revision 0x%X\n",211Revision);212return;213}214215Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);216Offset = sizeof (ACPI_TABLE_IORT);217218/* Dump the OptionalPadding (optional) */219220if (Iort->NodeOffset > Offset)221{222Status = AcpiDmDumpTable (Table->Length, Offset, Table,223Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad);224if (ACPI_FAILURE (Status))225{226return;227}228}229230Offset = Iort->NodeOffset;231while (Offset < Table->Length)232{233/* Common subtable header */234235IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);236AcpiOsPrintf ("\n");237Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);238239if (Revision == 0)240{241Status = AcpiDmDumpTable (Table->Length, Offset,242IortNode, Length, AcpiDmTableInfoIortHdr);243}244else if (Revision >= 3)245{246Status = AcpiDmDumpTable (Table->Length, Offset,247IortNode, Length, AcpiDmTableInfoIortHdr3);248}249250if (ACPI_FAILURE (Status))251{252return;253}254255NodeOffset = Length;256257switch (IortNode->Type)258{259case ACPI_IORT_NODE_ITS_GROUP:260261InfoTable = AcpiDmTableInfoIort0;262Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers);263IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset);264break;265266case ACPI_IORT_NODE_NAMED_COMPONENT:267268InfoTable = AcpiDmTableInfoIort1;269Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName);270String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length);271Length += strlen (String) + 1;272break;273274case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:275276InfoTable = AcpiDmTableInfoIort2;277Length = IortNode->Length - NodeOffset;278break;279280case ACPI_IORT_NODE_SMMU:281282InfoTable = AcpiDmTableInfoIort3;283Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts);284IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset);285break;286287case ACPI_IORT_NODE_SMMU_V3:288289InfoTable = AcpiDmTableInfoIort4;290Length = IortNode->Length - NodeOffset;291break;292293case ACPI_IORT_NODE_PMCG:294295InfoTable = AcpiDmTableInfoIort5;296Length = IortNode->Length - NodeOffset;297break;298299case ACPI_IORT_NODE_RMR:300301InfoTable = AcpiDmTableInfoIort6;302Length = IortNode->Length - NodeOffset;303IortRmr = ACPI_ADD_PTR (ACPI_IORT_RMR, IortNode, NodeOffset);304break;305306default:307308AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",309IortNode->Type);310311/* Attempt to continue */312313if (!IortNode->Length)314{315AcpiOsPrintf ("Invalid zero length IORT node\n");316return;317}318goto NextSubtable;319}320321/* Dump the node subtable header */322323AcpiOsPrintf ("\n");324Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,325ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),326Length, InfoTable);327if (ACPI_FAILURE (Status))328{329return;330}331332NodeOffset += Length;333334/* Dump the node specific data */335336switch (IortNode->Type)337{338case ACPI_IORT_NODE_ITS_GROUP:339340/* Validate IortItsGroup to avoid compiler warnings */341342if (IortItsGroup)343{344for (i = 0; i < IortItsGroup->ItsCount; i++)345{346Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,347ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),3484, AcpiDmTableInfoIort0a);349if (ACPI_FAILURE (Status))350{351return;352}353354NodeOffset += 4;355}356}357break;358359case ACPI_IORT_NODE_NAMED_COMPONENT:360361/* Dump the Padding (optional) */362363if (IortNode->Length > NodeOffset)364{365MappingByteLength =366IortNode->MappingCount * sizeof (ACPI_IORT_ID_MAPPING);367Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,368Table, IortNode->Length - NodeOffset - MappingByteLength,369AcpiDmTableInfoIort1a);370if (ACPI_FAILURE (Status))371{372return;373}374}375break;376377case ACPI_IORT_NODE_SMMU:378379AcpiOsPrintf ("\n");380381/* Validate IortSmmu to avoid compiler warnings */382383if (IortSmmu)384{385Length = 2 * sizeof (UINT64);386NodeOffset = IortSmmu->GlobalInterruptOffset;387Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,388ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),389Length, AcpiDmTableInfoIort3a);390if (ACPI_FAILURE (Status))391{392return;393}394395NodeOffset = IortSmmu->ContextInterruptOffset;396for (i = 0; i < IortSmmu->ContextInterruptCount; i++)397{398Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,399ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),4008, AcpiDmTableInfoIort3b);401if (ACPI_FAILURE (Status))402{403return;404}405406NodeOffset += 8;407}408409NodeOffset = IortSmmu->PmuInterruptOffset;410for (i = 0; i < IortSmmu->PmuInterruptCount; i++)411{412Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,413ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),4148, AcpiDmTableInfoIort3c);415if (ACPI_FAILURE (Status))416{417return;418}419420NodeOffset += 8;421}422}423break;424425case ACPI_IORT_NODE_RMR:426427/* Validate IortRmr to avoid compiler warnings */428if (IortRmr)429{430NodeOffset = IortRmr->RmrOffset;431Length = sizeof (ACPI_IORT_RMR_DESC);432for (i = 0; i < IortRmr->RmrCount; i++)433{434AcpiOsPrintf ("\n");435Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,436ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),437Length, AcpiDmTableInfoIort6a);438if (ACPI_FAILURE (Status))439{440return;441}442443NodeOffset += Length;444}445}446break;447448default:449450break;451}452453/* Dump the ID mappings */454455NodeOffset = IortNode->MappingOffset;456for (i = 0; i < IortNode->MappingCount; i++)457{458AcpiOsPrintf ("\n");459Length = sizeof (ACPI_IORT_ID_MAPPING);460Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,461ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),462Length, AcpiDmTableInfoIortMap);463if (ACPI_FAILURE (Status))464{465return;466}467468NodeOffset += Length;469}470471NextSubtable:472/* Point to next node subtable */473474Offset += IortNode->Length;475}476}477478479/*******************************************************************************480*481* FUNCTION: AcpiDmDumpIvrs482*483* PARAMETERS: Table - A IVRS table484*485* RETURN: None486*487* DESCRIPTION: Format the contents of a IVRS. Notes:488* The IVRS is essentially a flat table, with the following489* structure:490* <Main ACPI Table Header>491* <Main subtable - virtualization info>492* <IVHD>493* <Device Entries>494* ...495* <IVHD>496* <Device Entries>497* <IVMD>498* ...499*500******************************************************************************/501502void503AcpiDmDumpIvrs (504ACPI_TABLE_HEADER *Table)505{506ACPI_STATUS Status;507UINT32 Offset = sizeof (ACPI_TABLE_IVRS);508UINT32 EntryOffset;509UINT32 EntryLength;510UINT32 EntryType;511ACPI_IVRS_DEVICE_HID *HidSubtable;512ACPI_IVRS_DE_HEADER *DeviceEntry;513ACPI_IVRS_HEADER *Subtable;514ACPI_DMTABLE_INFO *InfoTable;515516517/* Main table */518519Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);520if (ACPI_FAILURE (Status))521{522return;523}524525/* Subtables */526527Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);528529while (Offset < Table->Length)530{531switch (Subtable->Type)532{533/* Type 10h, IVHD (I/O Virtualization Hardware Definition) */534535case ACPI_IVRS_TYPE_HARDWARE1:536537AcpiOsPrintf ("\n");538InfoTable = AcpiDmTableInfoIvrsHware1;539break;540541/* Types 11h, 40h, IVHD (I/O Virtualization Hardware Definition) */542543case ACPI_IVRS_TYPE_HARDWARE2:544case ACPI_IVRS_TYPE_HARDWARE3:545546AcpiOsPrintf ("\n");547InfoTable = AcpiDmTableInfoIvrsHware23;548break;549550/* Types 20h-22h, IVMD (I/O Virtualization Memory Definition Block) */551552case ACPI_IVRS_TYPE_MEMORY1:553case ACPI_IVRS_TYPE_MEMORY2:554case ACPI_IVRS_TYPE_MEMORY3:555556AcpiOsPrintf ("\n");557InfoTable = AcpiDmTableInfoIvrsMemory;558break;559560default:561562AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n",563Subtable->Type);564565/* Attempt to continue */566567if (!Subtable->Length)568{569AcpiOsPrintf ("Invalid zero length subtable\n");570return;571}572goto NextSubtable;573}574575/* Dump the subtable */576577Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,578Subtable->Length, InfoTable);579if (ACPI_FAILURE (Status))580{581return;582}583584/* The hardware subtables (IVHD) can contain multiple device entries */585586if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1 ||587Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2 ||588Subtable->Type == ACPI_IVRS_TYPE_HARDWARE3)589{590if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1)591{592EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE1);593DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,594sizeof (ACPI_IVRS_HARDWARE1));595}596else597{598/* ACPI_IVRS_TYPE_HARDWARE2, HARDWARE3 subtable types */599600EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE2);601DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,602sizeof (ACPI_IVRS_HARDWARE2));603}604605/* Process all of the Device Entries */606607while (EntryOffset < (Offset + Subtable->Length))608{609AcpiOsPrintf ("\n");610611/*612* Upper 2 bits of Type encode the length of the device entry613*614* 00 = 4 byte615* 01 = 8 byte616* 1x = variable length617*/618EntryType = DeviceEntry->Type;619EntryLength = EntryType >> 6 == 1 ? 8 : 4;620621switch (EntryType)622{623/* 4-byte device entries */624625case ACPI_IVRS_TYPE_PAD4:626case ACPI_IVRS_TYPE_ALL:627case ACPI_IVRS_TYPE_SELECT:628case ACPI_IVRS_TYPE_START:629case ACPI_IVRS_TYPE_END:630631InfoTable = AcpiDmTableInfoIvrs4;632break;633634/* 8-byte entries, type A */635636case ACPI_IVRS_TYPE_ALIAS_SELECT:637case ACPI_IVRS_TYPE_ALIAS_START:638639InfoTable = AcpiDmTableInfoIvrs8a;640break;641642/* 8-byte entries, type B */643644case ACPI_IVRS_TYPE_PAD8:645case ACPI_IVRS_TYPE_EXT_SELECT:646case ACPI_IVRS_TYPE_EXT_START:647648InfoTable = AcpiDmTableInfoIvrs8b;649break;650651/* 8-byte entries, type C */652653case ACPI_IVRS_TYPE_SPECIAL:654655InfoTable = AcpiDmTableInfoIvrs8c;656break;657658/* Variable-length entries */659660case ACPI_IVRS_TYPE_HID:661662EntryLength = 4;663InfoTable = AcpiDmTableInfoIvrsHid;664break;665666default:667InfoTable = AcpiDmTableInfoIvrs4;668AcpiOsPrintf (669"\n**** Unknown IVRS device entry type/length: "670"0x%.2X/0x%X at offset 0x%.4X: (header below)\n",671EntryType, EntryLength, EntryOffset);672break;673}674675/* Dump the Device Entry */676677Status = AcpiDmDumpTable (Table->Length, EntryOffset,678DeviceEntry, EntryLength, InfoTable);679if (ACPI_FAILURE (Status))680{681return;682}683684HidSubtable = ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, DeviceEntry);685EntryOffset += EntryLength;686DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, HidSubtable,687EntryLength);688689if (EntryType == ACPI_IVRS_TYPE_HID)690{691/*692* Determine if the HID is an integer or a string.693* An integer is defined to be 32 bits, with the upper 32 bits694* set to zero. (from the ACPI Spec): "The HID can be a 32-bit695* integer or a character string. If an integer, the lower696* 4 bytes of the field contain the integer and the upper697* 4 bytes are padded with 0".698*/699if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiHid))700{701Status = AcpiDmDumpTable (Table->Length, EntryOffset,702&HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidInteger);703}704else705{706Status = AcpiDmDumpTable (Table->Length, EntryOffset,707&HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidString);708}709if (ACPI_FAILURE (Status))710{711return;712}713714EntryOffset += 8;715716/*717* Determine if the CID is an integer or a string. The format718* of the CID is the same as the HID above. From ACPI Spec:719* "If present, CID must be a single Compatible Device ID720* following the same format as the HID field."721*/722if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiCid))723{724Status = AcpiDmDumpTable (Table->Length, EntryOffset,725&HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidInteger);726}727else728{729Status = AcpiDmDumpTable (Table->Length, EntryOffset,730&HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidString);731}732if (ACPI_FAILURE (Status))733{734return;735}736737EntryOffset += 8;738EntryLength = HidSubtable->UidLength;739740if (EntryLength > ACPI_IVRS_UID_NOT_PRESENT)741{742/* Dump the UID based upon the UidType field (String or Integer) */743744if (HidSubtable->UidType == ACPI_IVRS_UID_IS_STRING)745{746Status = AcpiDmDumpTable (Table->Length, EntryOffset,747&HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidString);748if (ACPI_FAILURE (Status))749{750return;751}752}753else /* ACPI_IVRS_UID_IS_INTEGER */754{755Status = AcpiDmDumpTable (Table->Length, EntryOffset,756&HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidInteger);757if (ACPI_FAILURE (Status))758{759return;760}761}762}763764EntryOffset += EntryLength+2;765DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER,766Table, EntryOffset);767}768}769}770771NextSubtable:772/* Point to next subtable */773774Offset += Subtable->Length;775Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, Subtable->Length);776}777}778779780/*******************************************************************************781*782* FUNCTION: AcpiDmDumpLpit783*784* PARAMETERS: Table - A LPIT table785*786* RETURN: None787*788* DESCRIPTION: Format the contents of a LPIT. This table type consists789* of an open-ended number of subtables. Note: There are no790* entries in the main table. An LPIT consists of the table791* header and then subtables only.792*793******************************************************************************/794795void796AcpiDmDumpLpit (797ACPI_TABLE_HEADER *Table)798{799ACPI_STATUS Status;800ACPI_LPIT_HEADER *Subtable;801UINT32 Length = Table->Length;802UINT32 Offset = sizeof (ACPI_TABLE_LPIT);803ACPI_DMTABLE_INFO *InfoTable;804UINT32 SubtableLength;805806807/* Subtables */808809Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);810while (Offset < Table->Length)811{812/* Common subtable header */813814Status = AcpiDmDumpTable (Length, Offset, Subtable,815sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);816if (ACPI_FAILURE (Status))817{818return;819}820821switch (Subtable->Type)822{823case ACPI_LPIT_TYPE_NATIVE_CSTATE:824825InfoTable = AcpiDmTableInfoLpit0;826SubtableLength = sizeof (ACPI_LPIT_NATIVE);827break;828829default:830831/* Cannot continue on unknown type - no length */832833AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n",834Subtable->Type);835return;836}837838Status = AcpiDmDumpTable (Length, Offset, Subtable,839SubtableLength, InfoTable);840if (ACPI_FAILURE (Status))841{842return;843}844845AcpiOsPrintf ("\n");846847/* Point to next subtable */848849Offset += SubtableLength;850Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Subtable, SubtableLength);851}852}853854855/*******************************************************************************856*857* FUNCTION: AcpiDmDumpMadt858*859* PARAMETERS: Table - A MADT table860*861* RETURN: None862*863* DESCRIPTION: Format the contents of a MADT. This table type consists864* of an open-ended number of subtables.865*866******************************************************************************/867868void869AcpiDmDumpMadt (870ACPI_TABLE_HEADER *Table)871{872ACPI_STATUS Status;873ACPI_SUBTABLE_HEADER *Subtable;874UINT32 Length = Table->Length;875UINT32 Offset = sizeof (ACPI_TABLE_MADT);876ACPI_DMTABLE_INFO *InfoTable;877UINT8 Revision;878879880/* Main table */881882Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);883if (ACPI_FAILURE (Status))884{885return;886}887888Revision = Table->Revision;889890/* Subtables */891892Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);893DbgPrint (ASL_PARSE_OUTPUT, "//0B) Offset %X, from table start: 0x%8.8X%8.8X\n",894Offset, ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)));895while (Offset < Table->Length)896{897/* Common subtable header */898899AcpiOsPrintf ("\n");900Status = AcpiDmDumpTable (Length, Offset, Subtable,901Subtable->Length, AcpiDmTableInfoMadtHdr);902if (ACPI_FAILURE (Status))903{904return;905}906907DbgPrint (ASL_PARSE_OUTPUT, "subtableType: %X\n", Subtable->Type);908switch (Subtable->Type)909{910case ACPI_MADT_TYPE_LOCAL_APIC:911912InfoTable = AcpiDmTableInfoMadt0;913break;914915case ACPI_MADT_TYPE_IO_APIC:916917InfoTable = AcpiDmTableInfoMadt1;918break;919920case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:921922InfoTable = AcpiDmTableInfoMadt2;923break;924925case ACPI_MADT_TYPE_NMI_SOURCE:926927InfoTable = AcpiDmTableInfoMadt3;928break;929930case ACPI_MADT_TYPE_LOCAL_APIC_NMI:931932InfoTable = AcpiDmTableInfoMadt4;933break;934935case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:936937InfoTable = AcpiDmTableInfoMadt5;938break;939940case ACPI_MADT_TYPE_IO_SAPIC:941942InfoTable = AcpiDmTableInfoMadt6;943break;944945case ACPI_MADT_TYPE_LOCAL_SAPIC:946947InfoTable = AcpiDmTableInfoMadt7;948break;949950case ACPI_MADT_TYPE_INTERRUPT_SOURCE:951952InfoTable = AcpiDmTableInfoMadt8;953break;954955case ACPI_MADT_TYPE_LOCAL_X2APIC:956957InfoTable = AcpiDmTableInfoMadt9;958break;959960case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:961962InfoTable = AcpiDmTableInfoMadt10;963break;964965case ACPI_MADT_TYPE_GENERIC_INTERRUPT:966967if (Revision > 6)968InfoTable = AcpiDmTableInfoMadt11b;969else if (Revision == 6)970InfoTable = AcpiDmTableInfoMadt11a;971else972InfoTable = AcpiDmTableInfoMadt11;973break;974975case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:976977InfoTable = AcpiDmTableInfoMadt12;978break;979980case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:981982InfoTable = AcpiDmTableInfoMadt13;983break;984985case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:986987InfoTable = Revision > 6 ? AcpiDmTableInfoMadt14a :988AcpiDmTableInfoMadt14;989break;990991case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:992993InfoTable = Revision > 6 ? AcpiDmTableInfoMadt15a :994AcpiDmTableInfoMadt15;995break;996997case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:998999InfoTable = AcpiDmTableInfoMadt16;1000break;10011002case ACPI_MADT_TYPE_CORE_PIC:10031004InfoTable = AcpiDmTableInfoMadt17;1005break;10061007case ACPI_MADT_TYPE_LIO_PIC:10081009InfoTable = AcpiDmTableInfoMadt18;1010break;10111012case ACPI_MADT_TYPE_HT_PIC:10131014InfoTable = AcpiDmTableInfoMadt19;1015break;10161017case ACPI_MADT_TYPE_EIO_PIC:10181019InfoTable = AcpiDmTableInfoMadt20;1020break;10211022case ACPI_MADT_TYPE_MSI_PIC:10231024InfoTable = AcpiDmTableInfoMadt21;1025break;10261027case ACPI_MADT_TYPE_BIO_PIC:10281029InfoTable = AcpiDmTableInfoMadt22;1030break;10311032case ACPI_MADT_TYPE_LPC_PIC:10331034InfoTable = AcpiDmTableInfoMadt23;1035break;10361037case ACPI_MADT_TYPE_RINTC:10381039InfoTable = AcpiDmTableInfoMadt24;1040break;10411042case ACPI_MADT_TYPE_IMSIC:10431044InfoTable = AcpiDmTableInfoMadt25;1045break;10461047case ACPI_MADT_TYPE_APLIC:10481049InfoTable = AcpiDmTableInfoMadt26;1050break;10511052case ACPI_MADT_TYPE_PLIC:10531054InfoTable = AcpiDmTableInfoMadt27;1055break;10561057default:10581059if ((Subtable->Type >= ACPI_MADT_TYPE_RESERVED) &&1060(Subtable->Type < ACPI_MADT_TYPE_OEM_RESERVED))1061{1062AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",1063Subtable->Type);1064goto NextSubtable;1065}1066else if (Subtable->Type >= ACPI_MADT_TYPE_OEM_RESERVED)1067{1068DbgPrint (ASL_PARSE_OUTPUT, "//[Found an OEM structure, type = %0x]\n",1069Subtable->Type);1070Offset += sizeof (ACPI_SUBTABLE_HEADER);1071DbgPrint (ASL_PARSE_OUTPUT, "//[0) Subtable->Length = %X, Subtable = %p, Offset = %X]\n",1072Subtable->Length, Subtable, Offset);1073DbgPrint (ASL_PARSE_OUTPUT, "//[0A) Offset from table start: 0x%8.8X%8.8X]\n",1074ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)));1075}10761077/* Attempt to continue */10781079if (!Subtable->Length)1080{1081AcpiOsPrintf ("Invalid zero length subtable\n");1082return;1083}10841085/* Dump the OEM data */10861087Status = AcpiDmDumpTable (Length, Offset, ACPI_CAST_PTR (UINT8, Table) + Offset,1088Subtable->Length - sizeof (ACPI_SUBTABLE_HEADER), AcpiDmTableInfoMadt128);1089if (ACPI_FAILURE (Status))1090{1091return;1092}10931094DbgPrint (ASL_PARSE_OUTPUT, "//[1) Subtable->Length = %X, Offset = %X]\n",1095Subtable->Length, Offset);1096Offset -= sizeof (ACPI_SUBTABLE_HEADER);10971098goto NextSubtable;1099}11001101DbgPrint (ASL_PARSE_OUTPUT, "//[2) Subtable->Length = %X, Offset = %X]\n",1102Subtable->Length, Offset);1103Status = AcpiDmDumpTable (Length, Offset, Subtable,1104Subtable->Length, InfoTable);1105if (ACPI_FAILURE (Status))1106{1107return;1108}11091110NextSubtable:1111/* Point to next subtable */11121113DbgPrint (ASL_PARSE_OUTPUT, "//[3) Subtable->Length = %X, Offset = %X]\n",1114Subtable->Length, Offset);1115DbgPrint (ASL_PARSE_OUTPUT, "//[4) Offset from table start: 0x%8.8X%8.8X (%p) %p]\n",1116ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (UINT8, Subtable) - ACPI_CAST_PTR (UINT8, Table)), Subtable, Table);1117if (Offset > Table->Length)1118{1119return;1120}11211122Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable,1123Subtable->Length);11241125Offset = ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table);1126if (Offset >= Table->Length)1127{1128return;1129}11301131DbgPrint (ASL_PARSE_OUTPUT, "//[5) Next Subtable %p, length %X]\n",1132Subtable, Subtable->Length);1133DbgPrint (ASL_PARSE_OUTPUT, "//[5B) Offset from table start: 0x%8.8X%8.8X (%p)]\n",1134ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)), Subtable);1135}1136}113711381139/*******************************************************************************1140*1141* FUNCTION: AcpiDmDumpMcfg1142*1143* PARAMETERS: Table - A MCFG Table1144*1145* RETURN: None1146*1147* DESCRIPTION: Format the contents of a MCFG table1148*1149******************************************************************************/11501151void1152AcpiDmDumpMcfg (1153ACPI_TABLE_HEADER *Table)1154{1155ACPI_STATUS Status;1156UINT32 Offset = sizeof (ACPI_TABLE_MCFG);1157ACPI_MCFG_ALLOCATION *Subtable;115811591160/* Main table */11611162Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);1163if (ACPI_FAILURE (Status))1164{1165return;1166}11671168/* Subtables */11691170Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);1171while (Offset < Table->Length)1172{1173if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)1174{1175AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",1176(UINT32) sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));1177return;1178}11791180AcpiOsPrintf ("\n");1181Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,1182sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);1183if (ACPI_FAILURE (Status))1184{1185return;1186}11871188/* Point to next subtable (each subtable is of fixed length) */11891190Offset += sizeof (ACPI_MCFG_ALLOCATION);1191Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Subtable,1192sizeof (ACPI_MCFG_ALLOCATION));1193}1194}11951196/*******************************************************************************1197*1198* FUNCTION: AcpiDmDumpMpam1199*1200* PARAMETERS: Table - A MPAM table1201*1202* RETURN: None1203*1204* DESCRIPTION: Format the contents of a MPAM table1205*1206******************************************************************************/12071208void1209AcpiDmDumpMpam (1210ACPI_TABLE_HEADER *Table)1211{1212ACPI_STATUS Status;1213ACPI_MPAM_MSC_NODE *MpamMscNode;1214ACPI_MPAM_RESOURCE_NODE *MpamResourceNode;1215ACPI_MPAM_FUNC_DEPS *MpamFunctionalDependency;1216ACPI_DMTABLE_INFO *InfoTable;1217UINT32 Offset = sizeof(ACPI_TABLE_HEADER);1218UINT32 TempOffset;1219UINT32 MpamResourceNodeLength = 0;12201221while (Offset < Table->Length)1222{1223MpamMscNode = ACPI_ADD_PTR (ACPI_MPAM_MSC_NODE, Table, Offset);12241225/* Subtable: MSC */1226Status = AcpiDmDumpTable (Table->Length, Offset, MpamMscNode,1227MpamMscNode->Length, AcpiDmTableInfoMpam0);1228if (ACPI_FAILURE (Status))1229{1230return;1231}12321233/* Offset the start of the array of resources */1234Offset += sizeof(ACPI_MPAM_MSC_NODE);12351236/* Subtable: MSC RIS(es) */1237for (UINT32 ResourceIdx = 0; ResourceIdx < MpamMscNode->NumResourceNodes; ResourceIdx++)1238{1239AcpiOsPrintf ("\n");1240MpamResourceNode = ACPI_ADD_PTR (ACPI_MPAM_RESOURCE_NODE, Table, Offset);12411242MpamResourceNodeLength = sizeof(ACPI_MPAM_RESOURCE_NODE) +1243MpamResourceNode->NumFunctionalDeps * sizeof(ACPI_MPAM_FUNC_DEPS);1244TempOffset = Offset;1245Offset += MpamResourceNodeLength;12461247/* Subtable: MSC RIS */1248Status = AcpiDmDumpTable (Table->Length, TempOffset, MpamResourceNode,1249sizeof(ACPI_MPAM_RESOURCE_NODE), AcpiDmTableInfoMpam1);1250if (ACPI_FAILURE (Status))1251{1252return;1253}12541255switch (MpamResourceNode->LocatorType)1256{1257case ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE:1258InfoTable = AcpiDmTableInfoMpam1A;1259break;1260case ACPI_MPAM_LOCATION_TYPE_MEMORY:1261InfoTable = AcpiDmTableInfoMpam1B;1262break;1263case ACPI_MPAM_LOCATION_TYPE_SMMU:1264InfoTable = AcpiDmTableInfoMpam1C;1265break;1266case ACPI_MPAM_LOCATION_TYPE_MEMORY_CACHE:1267InfoTable = AcpiDmTableInfoMpam1D;1268break;1269case ACPI_MPAM_LOCATION_TYPE_ACPI_DEVICE:1270InfoTable = AcpiDmTableInfoMpam1E;1271break;1272case ACPI_MPAM_LOCATION_TYPE_INTERCONNECT:1273InfoTable = AcpiDmTableInfoMpam1F;1274break;1275case ACPI_MPAM_LOCATION_TYPE_UNKNOWN:1276InfoTable = AcpiDmTableInfoMpam1G;1277default:1278AcpiOsPrintf ("\n**** Unknown MPAM locator type 0x%X\n",1279MpamResourceNode->LocatorType);1280return;1281}12821283/* Subtable: MSC Resource Locator(s) */1284TempOffset += ACPI_OFFSET(ACPI_MPAM_RESOURCE_NODE, Locator);1285Status = AcpiDmDumpTable (Table->Length, TempOffset, &MpamResourceNode->Locator,1286sizeof(ACPI_MPAM_RESOURCE_LOCATOR), InfoTable);1287if (ACPI_FAILURE (Status))1288{1289return;1290}12911292/* Get the number of functional dependencies of an RIS */1293TempOffset += sizeof(ACPI_MPAM_RESOURCE_LOCATOR);1294Status = AcpiDmDumpTable (Table->Length, TempOffset, &MpamResourceNode->NumFunctionalDeps,1295sizeof(UINT32), AcpiDmTableInfoMpam1Deps);1296if (ACPI_FAILURE (Status))1297{1298return;1299}13001301TempOffset += sizeof(UINT32);1302MpamFunctionalDependency = ACPI_ADD_PTR (ACPI_MPAM_FUNC_DEPS, MpamResourceNode,1303sizeof(ACPI_MPAM_RESOURCE_NODE));1304/* Subtable: MSC functional dependencies */1305for (UINT32 funcDep = 0; funcDep < MpamResourceNode->NumFunctionalDeps; funcDep++)1306{1307AcpiOsPrintf ("\n");1308Status = AcpiDmDumpTable (sizeof(ACPI_MPAM_FUNC_DEPS), 0,1309&MpamResourceNode->NumFunctionalDeps, 0, AcpiDmTableInfoMpam2);1310Status = AcpiDmDumpTable (Table->Length, TempOffset, MpamFunctionalDependency,1311sizeof(ACPI_MPAM_FUNC_DEPS), AcpiDmTableInfoMpam2);1312if (ACPI_FAILURE (Status))1313{1314return;1315}1316TempOffset += sizeof(ACPI_MPAM_FUNC_DEPS);1317MpamFunctionalDependency++;1318}13191320AcpiOsPrintf ("\n\n");1321}13221323}13241325return;1326}13271328/*******************************************************************************1329*1330* FUNCTION: AcpiDmDumpMpst1331*1332* PARAMETERS: Table - A MPST Table1333*1334* RETURN: None1335*1336* DESCRIPTION: Format the contents of a MPST table1337*1338******************************************************************************/13391340void1341AcpiDmDumpMpst (1342ACPI_TABLE_HEADER *Table)1343{1344ACPI_STATUS Status;1345UINT32 Offset = sizeof (ACPI_TABLE_MPST);1346ACPI_MPST_POWER_NODE *Subtable0;1347ACPI_MPST_POWER_STATE *Subtable0A;1348ACPI_MPST_COMPONENT *Subtable0B;1349ACPI_MPST_DATA_HDR *Subtable1;1350ACPI_MPST_POWER_DATA *Subtable2;1351UINT16 SubtableCount;1352UINT32 PowerStateCount;1353UINT32 ComponentCount;135413551356/* Main table */13571358Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);1359if (ACPI_FAILURE (Status))1360{1361return;1362}13631364/* Subtable: Memory Power Node(s) */13651366SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;1367Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);13681369while ((Offset < Table->Length) && SubtableCount)1370{1371AcpiOsPrintf ("\n");1372Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0,1373sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);1374if (ACPI_FAILURE (Status))1375{1376return;1377}13781379/* Extract the sub-subtable counts */13801381PowerStateCount = Subtable0->NumPowerStates;1382ComponentCount = Subtable0->NumPhysicalComponents;1383Offset += sizeof (ACPI_MPST_POWER_NODE);13841385/* Sub-subtables - Memory Power State Structure(s) */13861387Subtable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, Subtable0,1388sizeof (ACPI_MPST_POWER_NODE));13891390while (PowerStateCount)1391{1392AcpiOsPrintf ("\n");1393Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A,1394sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);1395if (ACPI_FAILURE (Status))1396{1397return;1398}13991400Subtable0A++;1401PowerStateCount--;1402Offset += sizeof (ACPI_MPST_POWER_STATE);1403}14041405/* Sub-subtables - Physical Component ID Structure(s) */14061407Subtable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, Subtable0A);14081409if (ComponentCount)1410{1411AcpiOsPrintf ("\n");1412}14131414while (ComponentCount)1415{1416Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B,1417sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);1418if (ACPI_FAILURE (Status))1419{1420return;1421}14221423Subtable0B++;1424ComponentCount--;1425Offset += sizeof (ACPI_MPST_COMPONENT);1426}14271428/* Point to next Memory Power Node subtable */14291430SubtableCount--;1431Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Subtable0,1432sizeof (ACPI_MPST_POWER_NODE) +1433(sizeof (ACPI_MPST_POWER_STATE) * Subtable0->NumPowerStates) +1434(sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents));1435}14361437/* Subtable: Count of Memory Power State Characteristic structures */14381439AcpiOsPrintf ("\n");1440Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0);1441Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1,1442sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);1443if (ACPI_FAILURE (Status))1444{1445return;1446}14471448SubtableCount = Subtable1->CharacteristicsCount;1449Offset += sizeof (ACPI_MPST_DATA_HDR);14501451/* Subtable: Memory Power State Characteristics structure(s) */14521453Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1,1454sizeof (ACPI_MPST_DATA_HDR));14551456while ((Offset < Table->Length) && SubtableCount)1457{1458AcpiOsPrintf ("\n");1459Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2,1460sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);1461if (ACPI_FAILURE (Status))1462{1463return;1464}14651466Subtable2++;1467SubtableCount--;1468Offset += sizeof (ACPI_MPST_POWER_DATA);1469}1470}147114721473/*******************************************************************************1474*1475* FUNCTION: AcpiDmDumpMrrm1476*1477* PARAMETERS: Table - A MRRM table1478*1479* RETURN: None1480*1481* DESCRIPTION: Format the contents of a MRRM1482*1483******************************************************************************/14841485void1486AcpiDmDumpMrrm (1487ACPI_TABLE_HEADER *Table)1488{1489ACPI_STATUS Status;1490ACPI_MRRM_MEM_RANGE_ENTRY *Subtable;1491UINT16 Offset = sizeof (ACPI_TABLE_MRRM);14921493/* Main table */14941495Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMrrm);1496if (ACPI_FAILURE (Status))1497{1498return;1499}15001501/* Subtables (all are same type) */15021503Subtable = ACPI_ADD_PTR (ACPI_MRRM_MEM_RANGE_ENTRY, Table, Offset);1504while (Offset < Table->Length)1505{1506AcpiOsPrintf ("\n");1507Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,1508Subtable->Header.Length, AcpiDmTableInfoMrrm0);1509if (ACPI_FAILURE (Status))1510{1511return;1512}15131514Offset += Subtable->Header.Length;1515Subtable = ACPI_ADD_PTR (ACPI_MRRM_MEM_RANGE_ENTRY, Subtable,1516Subtable->Header.Length);1517}1518}151915201521/*******************************************************************************1522*1523* FUNCTION: AcpiDmDumpMsct1524*1525* PARAMETERS: Table - A MSCT table1526*1527* RETURN: None1528*1529* DESCRIPTION: Format the contents of a MSCT1530*1531******************************************************************************/15321533void1534AcpiDmDumpMsct (1535ACPI_TABLE_HEADER *Table)1536{1537ACPI_STATUS Status;1538UINT32 Offset = sizeof (ACPI_TABLE_MSCT);1539ACPI_MSCT_PROXIMITY *Subtable;154015411542/* Main table */15431544Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);1545if (ACPI_FAILURE (Status))1546{1547return;1548}15491550/* Subtables */15511552Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);1553while (Offset < Table->Length)1554{1555/* Common subtable header */15561557AcpiOsPrintf ("\n");1558Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,1559sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);1560if (ACPI_FAILURE (Status))1561{1562return;1563}15641565/* Point to next subtable */15661567Offset += sizeof (ACPI_MSCT_PROXIMITY);1568Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Subtable,1569sizeof (ACPI_MSCT_PROXIMITY));1570}1571}157215731574/*******************************************************************************1575*1576* FUNCTION: AcpiDmDumpNfit1577*1578* PARAMETERS: Table - A NFIT table1579*1580* RETURN: None1581*1582* DESCRIPTION: Format the contents of an NFIT.1583*1584******************************************************************************/15851586void1587AcpiDmDumpNfit (1588ACPI_TABLE_HEADER *Table)1589{1590ACPI_STATUS Status;1591UINT32 Offset = sizeof (ACPI_TABLE_NFIT);1592UINT32 FieldOffset = 0;1593UINT32 Length;1594ACPI_NFIT_HEADER *Subtable;1595ACPI_DMTABLE_INFO *InfoTable;1596ACPI_NFIT_INTERLEAVE *Interleave = NULL;1597ACPI_NFIT_SMBIOS *SmbiosInfo = NULL;1598ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;1599UINT32 i;160016011602/* Main table */16031604Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);1605if (ACPI_FAILURE (Status))1606{1607return;1608}16091610/* Subtables */16111612Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);1613while (Offset < Table->Length)1614{1615/* NFIT subtable header */16161617AcpiOsPrintf ("\n");1618Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,1619Subtable->Length, AcpiDmTableInfoNfitHdr);1620if (ACPI_FAILURE (Status))1621{1622return;1623}16241625switch (Subtable->Type)1626{1627case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:16281629InfoTable = AcpiDmTableInfoNfit0;1630break;16311632case ACPI_NFIT_TYPE_MEMORY_MAP:16331634InfoTable = AcpiDmTableInfoNfit1;1635break;16361637case ACPI_NFIT_TYPE_INTERLEAVE:16381639/* Has a variable number of 32-bit values at the end */16401641InfoTable = AcpiDmTableInfoNfit2;1642FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);1643break;16441645case ACPI_NFIT_TYPE_SMBIOS:16461647SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, Subtable);1648InfoTable = AcpiDmTableInfoNfit3;1649break;16501651case ACPI_NFIT_TYPE_CONTROL_REGION:16521653InfoTable = AcpiDmTableInfoNfit4;1654break;16551656case ACPI_NFIT_TYPE_DATA_REGION:16571658InfoTable = AcpiDmTableInfoNfit5;1659break;16601661case ACPI_NFIT_TYPE_FLUSH_ADDRESS:16621663/* Has a variable number of 64-bit addresses at the end */16641665InfoTable = AcpiDmTableInfoNfit6;1666FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS);1667break;16681669case ACPI_NFIT_TYPE_CAPABILITIES: /* ACPI 6.0A */16701671InfoTable = AcpiDmTableInfoNfit7;1672break;16731674default:1675AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",1676Subtable->Type);16771678/* Attempt to continue */16791680if (!Subtable->Length)1681{1682AcpiOsPrintf ("Invalid zero length subtable\n");1683return;1684}1685goto NextSubtable;1686}16871688AcpiOsPrintf ("\n");1689Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,1690Subtable->Length, InfoTable);1691if (ACPI_FAILURE (Status))1692{1693return;1694}16951696/* Per-subtable variable-length fields */16971698switch (Subtable->Type)1699{1700case ACPI_NFIT_TYPE_INTERLEAVE:17011702Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable);1703for (i = 0; i < Interleave->LineCount; i++)1704{1705Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,1706&Interleave->LineOffset[i],1707sizeof (UINT32), AcpiDmTableInfoNfit2a);1708if (ACPI_FAILURE (Status))1709{1710return;1711}17121713FieldOffset += sizeof (UINT32);1714}1715break;17161717case ACPI_NFIT_TYPE_SMBIOS:17181719Length = Subtable->Length -1720sizeof (ACPI_NFIT_SMBIOS);17211722if (Length)1723{1724Status = AcpiDmDumpTable (Table->Length,1725sizeof (ACPI_NFIT_SMBIOS),1726SmbiosInfo,1727Length, AcpiDmTableInfoNfit3a);1728if (ACPI_FAILURE (Status))1729{1730return;1731}1732}17331734break;17351736case ACPI_NFIT_TYPE_FLUSH_ADDRESS:17371738Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable);1739for (i = 0; i < Hint->HintCount; i++)1740{1741Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,1742&Hint->HintAddress[i],1743sizeof (UINT64), AcpiDmTableInfoNfit6a);1744if (ACPI_FAILURE (Status))1745{1746return;1747}17481749FieldOffset += sizeof (UINT64);1750}1751break;17521753default:1754break;1755}17561757NextSubtable:1758/* Point to next subtable */17591760Offset += Subtable->Length;1761Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length);1762}1763}176417651766/*******************************************************************************1767*1768* FUNCTION: AcpiDmDumpPcct1769*1770* PARAMETERS: Table - A PCCT table1771*1772* RETURN: None1773*1774* DESCRIPTION: Format the contents of a PCCT. This table type consists1775* of an open-ended number of subtables.1776*1777******************************************************************************/17781779void1780AcpiDmDumpPcct (1781ACPI_TABLE_HEADER *Table)1782{1783ACPI_STATUS Status;1784ACPI_PCCT_SUBSPACE *Subtable;1785ACPI_DMTABLE_INFO *InfoTable;1786UINT32 Length = Table->Length;1787UINT32 Offset = sizeof (ACPI_TABLE_PCCT);178817891790/* Main table */17911792Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);1793if (ACPI_FAILURE (Status))1794{1795return;1796}17971798/* Subtables */17991800Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);1801while (Offset < Table->Length)1802{1803/* Common subtable header */18041805AcpiOsPrintf ("\n");1806Status = AcpiDmDumpTable (Length, Offset, Subtable,1807Subtable->Header.Length, AcpiDmTableInfoPcctHdr);1808if (ACPI_FAILURE (Status))1809{1810return;1811}18121813switch (Subtable->Header.Type)1814{1815case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:18161817InfoTable = AcpiDmTableInfoPcct0;1818break;18191820case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:18211822InfoTable = AcpiDmTableInfoPcct1;1823break;18241825case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:18261827InfoTable = AcpiDmTableInfoPcct2;1828break;18291830case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:18311832InfoTable = AcpiDmTableInfoPcct3;1833break;18341835case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:18361837InfoTable = AcpiDmTableInfoPcct4;1838break;18391840case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:18411842InfoTable = AcpiDmTableInfoPcct5;1843break;18441845default:18461847AcpiOsPrintf (1848"\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",1849Subtable->Header.Type);1850return;1851}18521853AcpiOsPrintf ("\n");1854Status = AcpiDmDumpTable (Length, Offset, Subtable,1855Subtable->Header.Length, InfoTable);1856if (ACPI_FAILURE (Status))1857{1858return;1859}18601861/* Point to next subtable */18621863Offset += Subtable->Header.Length;1864Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Subtable,1865Subtable->Header.Length);1866}1867}186818691870/*******************************************************************************1871*1872* FUNCTION: AcpiDmDumpPdtt1873*1874* PARAMETERS: Table - A PDTT table1875*1876* RETURN: None1877*1878* DESCRIPTION: Format the contents of a Pdtt. This is a variable-length1879* table that contains an open-ended number of IDs1880* at the end of the table.1881*1882******************************************************************************/18831884void1885AcpiDmDumpPdtt (1886ACPI_TABLE_HEADER *Table)1887{1888ACPI_STATUS Status;1889ACPI_PDTT_CHANNEL *Subtable;1890UINT32 Length = Table->Length;1891UINT32 Offset = sizeof (ACPI_TABLE_PDTT);189218931894/* Main table */18951896Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt);1897if (ACPI_FAILURE (Status))1898{1899return;1900}19011902/* Subtables. Currently there is only one type, but can be multiples */19031904Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset);1905while (Offset < Table->Length)1906{1907AcpiOsPrintf ("\n");1908Status = AcpiDmDumpTable (Length, Offset, Subtable,1909sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0);1910if (ACPI_FAILURE (Status))1911{1912return;1913}19141915/* Point to next subtable */19161917Offset += sizeof (ACPI_PDTT_CHANNEL);1918Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Subtable,1919sizeof (ACPI_PDTT_CHANNEL));1920}1921}192219231924/*******************************************************************************1925*1926* FUNCTION: AcpiDmDumpPhat1927*1928* PARAMETERS: Table - A PHAT table1929*1930* RETURN: None1931*1932* DESCRIPTION: Format the contents of a PHAT.1933*1934******************************************************************************/19351936void1937AcpiDmDumpPhat (1938ACPI_TABLE_HEADER *Table)1939{1940ACPI_STATUS Status;1941ACPI_DMTABLE_INFO *InfoTable;1942ACPI_PHAT_HEADER *Subtable;1943ACPI_PHAT_VERSION_DATA *VersionData;1944ACPI_PHAT_HEALTH_DATA *HealthData;1945UINT32 RecordCount;1946UINT32 Length = Table->Length;1947UINT32 Offset = sizeof (ACPI_TABLE_PHAT);1948UINT32 OriginalOffset;1949UINT32 SubtableLength;1950UINT32 PathLength;1951UINT32 VendorLength;1952UINT16 RecordType;195319541955Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT));19561957while (Offset < Table->Length)1958{1959/* Common subtable header */19601961AcpiOsPrintf ("\n");1962Status = AcpiDmDumpTable (Length, Offset, Subtable,1963sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr);1964if (ACPI_FAILURE (Status))1965{1966return;1967}19681969DbgPrint (ASL_DEBUG_OUTPUT, "\n/* %u, Subtable->Type %X */\n",1970__LINE__, Subtable->Type);19711972switch (Subtable->Type)1973{1974case ACPI_PHAT_TYPE_FW_VERSION_DATA:19751976InfoTable = AcpiDmTableInfoPhat0;1977SubtableLength = sizeof (ACPI_PHAT_VERSION_DATA);1978break;19791980case ACPI_PHAT_TYPE_FW_HEALTH_DATA:19811982InfoTable = AcpiDmTableInfoPhat1;1983SubtableLength = sizeof (ACPI_PHAT_HEALTH_DATA);1984break;19851986default:19871988DbgPrint (ASL_DEBUG_OUTPUT, "\n**** Unknown PHAT subtable type 0x%X\n\n",1989Subtable->Type);19901991return;1992}19931994Status = AcpiDmDumpTable (Length, Offset, Subtable,1995SubtableLength, InfoTable);1996if (ACPI_FAILURE (Status))1997{1998return;1999}20002001Offset += SubtableLength;20022003OriginalOffset = Offset;2004switch (Subtable->Type)2005{2006case ACPI_PHAT_TYPE_FW_VERSION_DATA:20072008VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable);2009RecordCount = VersionData->ElementCount;2010RecordType = *ACPI_CAST_PTR (UINT8, Subtable);20112012/*2013* Skip past a zero-valued block (not part of the ACPI PHAT specification).2014* First, check for a zero length record and a zero element count2015*/2016if (!VersionData->Header.Length && !VersionData->ElementCount)2017{2018while (RecordType == 0)2019{2020Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset);2021RecordType = *ACPI_CAST_PTR (UINT8, Subtable);2022RecordCount = VersionData->ElementCount;2023Offset += 1;2024}20252026Offset -= 1;2027AcpiOsPrintf ("\n/* Warning: Block of zeros found above starting at Offset %X Length %X */\n"2028"/* (not compliant to PHAT specification -- ignoring block) */\n",2029OriginalOffset - 12, Offset - OriginalOffset + 12);2030}20312032DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, RecordCount: %X, Offset %X, SubtableLength %X */\n",2033__LINE__, RecordCount, Offset, SubtableLength);20342035/* Emit each of the version elements */20362037while (RecordCount && VersionData->Header.Length)2038{2039AcpiOsPrintf ("\n/* Version Element #%Xh Offset %Xh */\n\n",2040VersionData->ElementCount - RecordCount + 1, Offset);20412042Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset);2043Status = AcpiDmDumpTable (Length, Offset, Subtable,2044sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a);2045if (ACPI_FAILURE (Status))2046{2047return;2048}20492050Offset += sizeof (ACPI_PHAT_VERSION_ELEMENT);2051RecordCount--;2052}20532054break;20552056case ACPI_PHAT_TYPE_FW_HEALTH_DATA:20572058HealthData = ACPI_CAST_PTR (ACPI_PHAT_HEALTH_DATA, Subtable);2059PathLength = Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA);2060VendorLength = 0;20612062/* An offset of 0 should be ignored */2063if (HealthData->DeviceSpecificOffset != 0)2064{2065if (HealthData->DeviceSpecificOffset > Subtable->Length)2066{2067AcpiOsPrintf ("\n/* Warning: Oversized device-specific data offset %X */\n"2068"/* (maximum is %X -- ignoring device-specific data) */\n",2069HealthData->DeviceSpecificOffset, Subtable->Length);2070}2071else if (HealthData->DeviceSpecificOffset < sizeof (ACPI_PHAT_HEALTH_DATA))2072{2073AcpiOsPrintf ("\n/* Warning: Undersized device-specific data offset %X */\n"2074"/* (minimum is %X -- ignoring device-specific data) */\n",2075HealthData->DeviceSpecificOffset, (UINT8) sizeof (ACPI_PHAT_HEALTH_DATA));2076}2077else2078{2079PathLength = HealthData->DeviceSpecificOffset - sizeof (ACPI_PHAT_HEALTH_DATA);2080VendorLength = Subtable->Length - HealthData->DeviceSpecificOffset;2081}2082}20832084DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, PathLength %X, Offset %X */\n",2085__LINE__, PathLength, Offset);20862087if (PathLength)2088{2089Status = AcpiDmDumpTable (Length, Offset,2090ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)),2091PathLength, AcpiDmTableInfoPhat1a);2092if (ACPI_FAILURE (Status))2093{2094return;2095}20962097Offset += PathLength;2098}20992100DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, VendorLength %X, Offset %X */\n",2101__LINE__, VendorLength, Offset);21022103if (VendorLength)2104{2105Status = AcpiDmDumpTable (Length, Offset,2106ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, HealthData->DeviceSpecificOffset),2107VendorLength, AcpiDmTableInfoPhat1b);2108if (ACPI_FAILURE (Status))2109{2110return;2111}21122113Offset += VendorLength;2114}21152116break;21172118default:21192120AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",2121Subtable->Type);2122return;2123}21242125/* Next subtable */21262127DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, Bottom of main loop: Offset %X, "2128"Subtable->Length %X, Table->Length %X */\n",2129__LINE__, Offset, Subtable->Length, Table->Length);21302131Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table,2132Offset);2133}2134}213521362137/*******************************************************************************2138*2139* FUNCTION: AcpiDmDumpPmtt2140*2141* PARAMETERS: Table - A PMTT table2142*2143* RETURN: None2144*2145* DESCRIPTION: Format the contents of a PMTT. This table type consists2146* of an open-ended number of subtables.2147*2148******************************************************************************/21492150void2151AcpiDmDumpPmtt (2152ACPI_TABLE_HEADER *Table)2153{2154ACPI_STATUS Status;2155ACPI_PMTT_HEADER *Subtable;2156UINT32 Length = Table->Length;2157UINT32 Offset = sizeof (ACPI_TABLE_PMTT);215821592160/* Main table */21612162Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);2163if (ACPI_FAILURE (Status))2164{2165return;2166}21672168/* Subtables */21692170Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);2171while (Offset < Table->Length)2172{2173/* Each of the types below contain the common subtable header */21742175AcpiOsPrintf ("\n");2176switch (Subtable->Type)2177{2178case ACPI_PMTT_TYPE_SOCKET:21792180Status = AcpiDmDumpTable (Length, Offset, Subtable,2181Subtable->Length, AcpiDmTableInfoPmtt0);2182if (ACPI_FAILURE (Status))2183{2184return;2185}2186break;21872188case ACPI_PMTT_TYPE_CONTROLLER:2189Status = AcpiDmDumpTable (Length, Offset, Subtable,2190Subtable->Length, AcpiDmTableInfoPmtt1);2191if (ACPI_FAILURE (Status))2192{2193return;2194}2195break;21962197case ACPI_PMTT_TYPE_DIMM:2198Status = AcpiDmDumpTable (Length, Offset, Subtable,2199Subtable->Length, AcpiDmTableInfoPmtt2);2200if (ACPI_FAILURE (Status))2201{2202return;2203}2204break;22052206case ACPI_PMTT_TYPE_VENDOR:2207Status = AcpiDmDumpTable (Length, Offset, Subtable,2208Subtable->Length, AcpiDmTableInfoPmttVendor);2209if (ACPI_FAILURE (Status))2210{2211return;2212}2213break;22142215default:2216AcpiOsPrintf (2217"\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",2218Subtable->Type);2219return;2220}22212222/* Point to next subtable */22232224Offset += Subtable->Length;2225Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,2226Subtable, Subtable->Length);2227}2228}222922302231/*******************************************************************************2232*2233* FUNCTION: AcpiDmDumpPptt2234*2235* PARAMETERS: Table - A PMTT table2236*2237* RETURN: None2238*2239* DESCRIPTION: Format the contents of a PPTT. This table type consists2240* of an open-ended number of subtables.2241*2242******************************************************************************/22432244void2245AcpiDmDumpPptt (2246ACPI_TABLE_HEADER *Table)2247{2248ACPI_STATUS Status;2249ACPI_SUBTABLE_HEADER *Subtable;2250ACPI_PPTT_PROCESSOR *PpttProcessor;2251UINT8 Length;2252UINT8 SubtableOffset;2253UINT32 Offset = sizeof (ACPI_TABLE_FPDT);2254ACPI_DMTABLE_INFO *InfoTable;2255UINT32 i;225622572258/* There is no main table (other than the standard ACPI header) */22592260/* Subtables */22612262Offset = sizeof (ACPI_TABLE_HEADER);2263while (Offset < Table->Length)2264{2265AcpiOsPrintf ("\n");22662267/* Common subtable header */22682269Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);2270if (Subtable->Length < sizeof (ACPI_SUBTABLE_HEADER))2271{2272AcpiOsPrintf ("Invalid subtable length\n");2273return;2274}2275Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,2276Subtable->Length, AcpiDmTableInfoPpttHdr);2277if (ACPI_FAILURE (Status))2278{2279return;2280}22812282switch (Subtable->Type)2283{2284case ACPI_PPTT_TYPE_PROCESSOR:22852286InfoTable = AcpiDmTableInfoPptt0;2287Length = sizeof (ACPI_PPTT_PROCESSOR);2288break;22892290case ACPI_PPTT_TYPE_CACHE:22912292InfoTable = AcpiDmTableInfoPptt1;2293Length = sizeof (ACPI_PPTT_CACHE);2294break;22952296case ACPI_PPTT_TYPE_ID:22972298InfoTable = AcpiDmTableInfoPptt2;2299Length = sizeof (ACPI_PPTT_ID);2300break;23012302default:23032304AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n",2305Subtable->Type);23062307/* Attempt to continue */23082309goto NextSubtable;2310}23112312if (Subtable->Length < Length)2313{2314AcpiOsPrintf ("Invalid subtable length\n");2315return;2316}2317Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,2318Subtable->Length, InfoTable);2319if (ACPI_FAILURE (Status))2320{2321return;2322}2323SubtableOffset = Length;23242325switch (Subtable->Type)2326{2327case ACPI_PPTT_TYPE_PROCESSOR:23282329PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, Subtable);23302331/* Dump SMBIOS handles */23322333if ((UINT8)(Subtable->Length - SubtableOffset) <2334(UINT8)(PpttProcessor->NumberOfPrivResources * 4))2335{2336AcpiOsPrintf ("Invalid private resource number\n");2337return;2338}2339for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++)2340{2341Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2342ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),23434, AcpiDmTableInfoPptt0a);2344if (ACPI_FAILURE (Status))2345{2346return;2347}23482349SubtableOffset += 4;2350}2351break;23522353case ACPI_PPTT_TYPE_CACHE:23542355if (Table->Revision < 3)2356{2357break;2358}2359Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2360ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),2361sizeof (ACPI_PPTT_CACHE_V1), AcpiDmTableInfoPptt1a);2362if (ACPI_FAILURE (Status))2363{2364return;2365}2366break;23672368default:23692370break;2371}23722373NextSubtable:2374/* Point to next subtable */23752376Offset += Subtable->Length;2377}2378}237923802381/*******************************************************************************2382*2383* FUNCTION: AcpiDmDumpPrmt2384*2385* PARAMETERS: Table - A PRMT table2386*2387* RETURN: None2388*2389* DESCRIPTION: Format the contents of a PRMT. This table type consists2390* of an open-ended number of subtables.2391*2392******************************************************************************/23932394void2395AcpiDmDumpPrmt (2396ACPI_TABLE_HEADER *Table)2397{2398UINT32 CurrentOffset = sizeof (ACPI_TABLE_HEADER);2399ACPI_TABLE_PRMT_HEADER *PrmtHeader;2400ACPI_PRMT_MODULE_INFO *PrmtModuleInfo;2401ACPI_PRMT_HANDLER_INFO *PrmtHandlerInfo;2402ACPI_STATUS Status;2403UINT32 i, j;240424052406/* Main table header */24072408PrmtHeader = ACPI_ADD_PTR (ACPI_TABLE_PRMT_HEADER, Table, CurrentOffset);2409Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHeader,2410sizeof (ACPI_TABLE_PRMT_HEADER), AcpiDmTableInfoPrmtHdr);2411if (ACPI_FAILURE (Status))2412{2413AcpiOsPrintf ("Invalid PRMT header\n");2414return;2415}24162417CurrentOffset += sizeof (ACPI_TABLE_PRMT_HEADER);24182419/* PRM Module Information Structure array */24202421for (i = 0; i < PrmtHeader->ModuleInfoCount; ++i)2422{2423PrmtModuleInfo = ACPI_ADD_PTR (ACPI_PRMT_MODULE_INFO, Table, CurrentOffset);2424Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtModuleInfo,2425sizeof (ACPI_PRMT_MODULE_INFO), AcpiDmTableInfoPrmtModule);24262427CurrentOffset += sizeof (ACPI_PRMT_MODULE_INFO);24282429/* PRM handler information structure array */24302431for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; ++j)2432{2433PrmtHandlerInfo = ACPI_ADD_PTR (ACPI_PRMT_HANDLER_INFO, Table, CurrentOffset);2434Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHandlerInfo,2435sizeof (ACPI_PRMT_HANDLER_INFO), AcpiDmTableInfoPrmtHandler);24362437CurrentOffset += sizeof (ACPI_PRMT_HANDLER_INFO);2438}2439}2440}244124422443/*******************************************************************************2444*2445* FUNCTION: AcpiDmDumpRas22446*2447* PARAMETERS: Table - A RAS2 table2448*2449* RETURN: None2450*2451* DESCRIPTION: Format the contents of a Ras2. This is a variable-length2452* table that contains an open-ended number of the RAS2 PCC2453* descriptors at the end of the table.2454*2455******************************************************************************/24562457void2458AcpiDmDumpRas2 (2459ACPI_TABLE_HEADER *Table)2460{2461ACPI_STATUS Status;2462ACPI_RAS2_PCC_DESC *Subtable;2463UINT32 Length = Table->Length;2464UINT32 Offset = sizeof (ACPI_TABLE_RAS2);246524662467/* Main table */24682469Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRas2);2470if (ACPI_FAILURE (Status))2471{2472return;2473}24742475/* Subtables - RAS2 PCC descriptor list */24762477Subtable = ACPI_ADD_PTR (ACPI_RAS2_PCC_DESC, Table, Offset);2478while (Offset < Table->Length)2479{2480AcpiOsPrintf ("\n");2481Status = AcpiDmDumpTable (Length, Offset, Subtable,2482sizeof (ACPI_RAS2_PCC_DESC), AcpiDmTableInfoRas2PccDesc);2483if (ACPI_FAILURE (Status))2484{2485return;2486}24872488/* Point to next subtable */24892490Offset += sizeof (ACPI_RAS2_PCC_DESC);2491Subtable = ACPI_ADD_PTR (ACPI_RAS2_PCC_DESC, Subtable,2492sizeof (ACPI_RAS2_PCC_DESC));2493}2494}249524962497/*******************************************************************************2498*2499* FUNCTION: AcpiDmDumpRgrt2500*2501* PARAMETERS: Table - A RGRT table2502*2503* RETURN: None2504*2505* DESCRIPTION: Format the contents of a RGRT2506*2507******************************************************************************/25082509void2510AcpiDmDumpRgrt (2511ACPI_TABLE_HEADER *Table)2512{2513ACPI_STATUS Status;2514ACPI_TABLE_RGRT *Subtable = ACPI_CAST_PTR (ACPI_TABLE_RGRT, Table);2515UINT32 Offset = sizeof (ACPI_TABLE_RGRT);251625172518/* Main table */25192520Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoRgrt);2521if (ACPI_FAILURE (Status))2522{2523return;2524}25252526/* Dump the binary image as a subtable */25272528Status = AcpiDmDumpTable (Table->Length, Offset, &Subtable->Image,2529Table->Length - Offset, AcpiDmTableInfoRgrt0);2530if (ACPI_FAILURE (Status))2531{2532return;2533}2534}253525362537/*******************************************************************************2538*2539* FUNCTION: AcpiDmDumpRhct2540*2541* PARAMETERS: Table - A RHCT table2542*2543* RETURN: None2544*2545* DESCRIPTION: Format the contents of a RHCT.2546*2547******************************************************************************/25482549void2550AcpiDmDumpRhct (2551ACPI_TABLE_HEADER *Table)2552{2553ACPI_STATUS Status;2554ACPI_RHCT_NODE_HEADER *Subtable;2555ACPI_RHCT_HART_INFO *RhctHartInfo;2556ACPI_RHCT_ISA_STRING *RhctIsaString;2557ACPI_RHCT_CMO_NODE *RhctCmoNode;2558ACPI_RHCT_MMU_NODE *RhctMmuNode;2559UINT32 Length = Table->Length;2560UINT8 SubtableOffset, IsaPadOffset;2561UINT32 Offset = sizeof (ACPI_TABLE_RHCT);2562UINT32 i;25632564/* Main table */25652566Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRhct);2567if (ACPI_FAILURE (Status))2568{2569return;2570}25712572/* Subtables */25732574while (Offset < Table->Length)2575{2576AcpiOsPrintf ("\n");25772578/* Common subtable header */25792580Subtable = ACPI_ADD_PTR (ACPI_RHCT_NODE_HEADER, Table, Offset);2581if (Subtable->Length < sizeof (ACPI_RHCT_NODE_HEADER))2582{2583AcpiOsPrintf ("Invalid subtable length\n");2584return;2585}2586Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,2587Subtable->Length, AcpiDmTableInfoRhctNodeHdr);2588if (ACPI_FAILURE (Status))2589{2590return;2591}25922593Length = sizeof (ACPI_RHCT_NODE_HEADER);25942595if (Subtable->Length < Length)2596{2597AcpiOsPrintf ("Invalid subtable length\n");2598return;2599}2600SubtableOffset = (UINT8) Length;26012602switch (Subtable->Type)2603{2604case ACPI_RHCT_NODE_TYPE_HART_INFO:2605Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2606ACPI_ADD_PTR (ACPI_RHCT_HART_INFO, Subtable, SubtableOffset),2607sizeof (ACPI_RHCT_HART_INFO), AcpiDmTableInfoRhctHartInfo1);26082609RhctHartInfo = ACPI_ADD_PTR (ACPI_RHCT_HART_INFO, Subtable, SubtableOffset);26102611if ((UINT16)(Subtable->Length - SubtableOffset) <2612(UINT16)(RhctHartInfo->NumOffsets * 4))2613{2614AcpiOsPrintf ("Invalid number of offsets\n");2615return;2616}2617SubtableOffset += sizeof (ACPI_RHCT_HART_INFO);2618for (i = 0; i < RhctHartInfo->NumOffsets; i++)2619{2620Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2621ACPI_ADD_PTR (UINT32, Subtable, SubtableOffset),26224, AcpiDmTableInfoRhctHartInfo2);2623if (ACPI_FAILURE (Status))2624{2625return;2626}26272628SubtableOffset += 4;2629}2630break;26312632case ACPI_RHCT_NODE_TYPE_ISA_STRING:2633RhctIsaString = ACPI_ADD_PTR (ACPI_RHCT_ISA_STRING, Subtable, SubtableOffset);2634IsaPadOffset = (UINT8) (SubtableOffset + 2 + RhctIsaString->IsaLength);2635Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2636RhctIsaString, RhctIsaString->IsaLength, AcpiDmTableInfoRhctIsa1);2637if (Subtable->Length > IsaPadOffset)2638{2639Status = AcpiDmDumpTable (Table->Length, Offset + IsaPadOffset,2640ACPI_ADD_PTR (UINT8, Subtable, IsaPadOffset),2641(Subtable->Length - IsaPadOffset), AcpiDmTableInfoRhctIsaPad);2642}26432644break;26452646case ACPI_RHCT_NODE_TYPE_CMO:2647RhctCmoNode = ACPI_ADD_PTR (ACPI_RHCT_CMO_NODE, Subtable, SubtableOffset);2648Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2649RhctCmoNode, 4, AcpiDmTableInfoRhctCmo1);2650break;26512652case ACPI_RHCT_NODE_TYPE_MMU:2653RhctMmuNode = ACPI_ADD_PTR (ACPI_RHCT_MMU_NODE, Subtable, SubtableOffset);2654Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2655RhctMmuNode, 2, AcpiDmTableInfoRhctMmu1);2656break;26572658default:2659break;2660}26612662/* Point to next subtable */26632664Offset += Subtable->Length;2665}2666}26672668/*******************************************************************************2669*2670* FUNCTION: AcpiDmDumpRimt2671*2672* PARAMETERS: Table - A RIMT table2673*2674* RETURN: None2675*2676* DESCRIPTION: Format the contents of a RIMT.2677*2678******************************************************************************/26792680void2681AcpiDmDumpRimt (2682ACPI_TABLE_HEADER *Table)2683{2684ACPI_RIMT_PLATFORM_DEVICE *PlatNode;2685ACPI_RIMT_PCIE_RC *PcieNode;2686ACPI_RIMT_NODE *Subtable;2687ACPI_STATUS Status;2688UINT32 Length = Table->Length;2689UINT16 SubtableOffset;2690UINT32 NodeOffset;2691UINT16 i;2692UINT32 Offset = sizeof (ACPI_TABLE_RIMT);26932694/* Main table */26952696Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRimt);2697if (ACPI_FAILURE (Status))2698{2699return;2700}27012702/* Subtables */27032704while (Offset < Table->Length)2705{2706AcpiOsPrintf ("\n");27072708/* Common subtable header */27092710Subtable = ACPI_ADD_PTR (ACPI_RIMT_NODE, Table, Offset);2711if (Subtable->Length < sizeof (ACPI_RIMT_NODE))2712{2713AcpiOsPrintf ("Invalid subtable length\n");2714return;2715}2716Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,2717Subtable->Length, AcpiDmTableInfoRimtNodeHdr);2718if (ACPI_FAILURE (Status))2719{2720return;2721}27222723Length = sizeof (ACPI_RIMT_NODE);27242725if (Subtable->Length < Length)2726{2727AcpiOsPrintf ("Invalid subtable length\n");2728return;2729}2730SubtableOffset = (UINT16) Length;27312732switch (Subtable->Type)2733{2734case ACPI_RIMT_NODE_TYPE_IOMMU:2735Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2736ACPI_ADD_PTR (ACPI_RIMT_IOMMU, Subtable, SubtableOffset),2737sizeof (ACPI_RIMT_IOMMU), AcpiDmTableInfoRimtIommu);27382739break;27402741case ACPI_RIMT_NODE_TYPE_PCIE_ROOT_COMPLEX:2742Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2743ACPI_ADD_PTR (ACPI_RIMT_PCIE_RC, Subtable, SubtableOffset),2744sizeof (ACPI_RIMT_PCIE_RC), AcpiDmTableInfoRimtPcieRc);27452746PcieNode = ACPI_ADD_PTR (ACPI_RIMT_PCIE_RC, Subtable, SubtableOffset);27472748/* Dump the ID mappings */2749NodeOffset = PcieNode->IdMappingOffset;2750for (i = 0; i < PcieNode->NumIdMappings; i++)2751{2752AcpiOsPrintf ("\n");2753Length = sizeof (ACPI_RIMT_ID_MAPPING);2754Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,2755ACPI_ADD_PTR (ACPI_RIMT_ID_MAPPING, Subtable, NodeOffset),2756Length, AcpiDmTableInfoRimtIdMapping);2757if (ACPI_FAILURE (Status))2758{2759return;2760}27612762NodeOffset += Length;2763}2764break;27652766case ACPI_RIMT_NODE_TYPE_PLAT_DEVICE:2767Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2768ACPI_ADD_PTR (ACPI_RIMT_PLATFORM_DEVICE, Subtable, SubtableOffset),2769sizeof (ACPI_RIMT_PLATFORM_DEVICE), AcpiDmTableInfoRimtPlatDev);2770PlatNode = ACPI_ADD_PTR (ACPI_RIMT_PLATFORM_DEVICE, Subtable, SubtableOffset);27712772/* Dump the ID mappings */2773NodeOffset = PlatNode->IdMappingOffset;2774for (i = 0; i < PlatNode->NumIdMappings; i++)2775{2776AcpiOsPrintf ("\n");2777Length = sizeof (ACPI_RIMT_ID_MAPPING);2778Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,2779ACPI_ADD_PTR (ACPI_RIMT_ID_MAPPING, Subtable, NodeOffset),2780Length, AcpiDmTableInfoRimtIdMapping);2781if (ACPI_FAILURE (Status))2782{2783return;2784}27852786NodeOffset += Length;2787}2788break;27892790default:2791break;2792}27932794/* Point to next subtable */27952796Offset += Subtable->Length;2797}2798}279928002801/*******************************************************************************2802*2803* FUNCTION: AcpiDmDumpS3pt2804*2805* PARAMETERS: Table - A S3PT table2806*2807* RETURN: Length of the table2808*2809* DESCRIPTION: Format the contents of a S3PT2810*2811******************************************************************************/28122813UINT322814AcpiDmDumpS3pt (2815ACPI_TABLE_HEADER *Tables)2816{2817ACPI_STATUS Status;2818UINT32 Offset = sizeof (ACPI_TABLE_S3PT);2819ACPI_FPDT_HEADER *Subtable;2820ACPI_DMTABLE_INFO *InfoTable;2821ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);282228232824/* Main table */28252826Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);2827if (ACPI_FAILURE (Status))2828{2829return 0;2830}28312832Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);2833while (Offset < S3ptTable->Length)2834{2835/* Common subtable header */28362837AcpiOsPrintf ("\n");2838Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,2839Subtable->Length, AcpiDmTableInfoS3ptHdr);2840if (ACPI_FAILURE (Status))2841{2842return 0;2843}28442845switch (Subtable->Type)2846{2847case ACPI_S3PT_TYPE_RESUME:28482849InfoTable = AcpiDmTableInfoS3pt0;2850break;28512852case ACPI_S3PT_TYPE_SUSPEND:28532854InfoTable = AcpiDmTableInfoS3pt1;2855break;28562857default:28582859AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n",2860Subtable->Type);28612862/* Attempt to continue */28632864if (!Subtable->Length)2865{2866AcpiOsPrintf ("Invalid zero length subtable\n");2867return 0;2868}2869goto NextSubtable;2870}28712872AcpiOsPrintf ("\n");2873Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,2874Subtable->Length, InfoTable);2875if (ACPI_FAILURE (Status))2876{2877return 0;2878}28792880NextSubtable:2881/* Point to next subtable */28822883Offset += Subtable->Length;2884Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length);2885}28862887return (S3ptTable->Length);2888}288928902891/*******************************************************************************2892*2893* FUNCTION: AcpiDmDumpSdev2894*2895* PARAMETERS: Table - A SDEV table2896*2897* RETURN: None2898*2899* DESCRIPTION: Format the contents of a SDEV. This is a variable-length2900* table that contains variable strings and vendor data.2901*2902******************************************************************************/29032904void2905AcpiDmDumpSdev (2906ACPI_TABLE_HEADER *Table)2907{2908ACPI_STATUS Status;2909ACPI_SDEV_HEADER *Subtable;2910ACPI_SDEV_PCIE *Pcie;2911ACPI_SDEV_NAMESPACE *Namesp;2912ACPI_DMTABLE_INFO *InfoTable;2913ACPI_DMTABLE_INFO *SecureComponentInfoTable;2914UINT32 Length = Table->Length;2915UINT32 Offset = sizeof (ACPI_TABLE_SDEV);2916UINT16 PathOffset;2917UINT16 PathLength;2918UINT16 VendorDataOffset;2919UINT16 VendorDataLength;2920ACPI_SDEV_SECURE_COMPONENT *SecureComponent = NULL;2921UINT32 CurrentOffset = 0;292229232924/* Main table */29252926Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev);2927if (ACPI_FAILURE (Status))2928{2929return;2930}29312932/* Subtables */29332934Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset);2935while (Offset < Table->Length)2936{2937/* Common subtable header */29382939AcpiOsPrintf ("\n");2940Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,2941Subtable->Length, AcpiDmTableInfoSdevHdr);2942if (ACPI_FAILURE (Status))2943{2944return;2945}29462947switch (Subtable->Type)2948{2949case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:29502951InfoTable = AcpiDmTableInfoSdev0;2952break;29532954case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:29552956InfoTable = AcpiDmTableInfoSdev1;2957break;29582959default:2960goto NextSubtable;2961}29622963AcpiOsPrintf ("\n");2964Status = AcpiDmDumpTable (Table->Length, 0, Subtable,2965Subtable->Length, InfoTable);2966if (ACPI_FAILURE (Status))2967{2968return;2969}29702971switch (Subtable->Type)2972{2973case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:29742975CurrentOffset = sizeof (ACPI_SDEV_NAMESPACE);2976if (Subtable->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)2977{2978SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,2979ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)));29802981Status = AcpiDmDumpTable (Table->Length, CurrentOffset,2982ACPI_ADD_PTR(UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)),2983sizeof (ACPI_SDEV_SECURE_COMPONENT), AcpiDmTableInfoSdev0b);2984if (ACPI_FAILURE (Status))2985{2986return;2987}2988CurrentOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);29892990Status = AcpiDmDumpTable (Table->Length, CurrentOffset,2991ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),2992sizeof (ACPI_SDEV_HEADER), AcpiDmTableInfoSdevSecCompHdr);2993if (ACPI_FAILURE (Status))2994{2995return;2996}2997CurrentOffset += sizeof (ACPI_SDEV_HEADER);29982999switch (Subtable->Type)3000{3001case ACPI_SDEV_TYPE_ID_COMPONENT:30023003SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;3004break;30053006case ACPI_SDEV_TYPE_MEM_COMPONENT:30073008SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;3009break;30103011default:3012goto NextSubtable;3013}30143015Status = AcpiDmDumpTable (Table->Length, CurrentOffset,3016ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),3017SecureComponent->SecureComponentLength, SecureComponentInfoTable);3018CurrentOffset += SecureComponent->SecureComponentLength;3019}30203021/* Dump the PCIe device ID(s) */30223023Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);3024PathOffset = Namesp->DeviceIdOffset;3025PathLength = Namesp->DeviceIdLength;30263027if (PathLength)3028{3029Status = AcpiDmDumpTable (Table->Length, CurrentOffset,3030ACPI_ADD_PTR (UINT8, Namesp, PathOffset),3031PathLength, AcpiDmTableInfoSdev0a);3032if (ACPI_FAILURE (Status))3033{3034return;3035}3036CurrentOffset += PathLength;3037}30383039/* Dump the vendor-specific data */30403041VendorDataLength =3042Namesp->VendorDataLength;3043VendorDataOffset =3044Namesp->DeviceIdOffset + Namesp->DeviceIdLength;30453046if (VendorDataLength)3047{3048Status = AcpiDmDumpTable (Table->Length, 0,3049ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset),3050VendorDataLength, AcpiDmTableInfoSdev1b);3051if (ACPI_FAILURE (Status))3052{3053return;3054}3055}3056break;30573058case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:30593060/* PCI path substructures */30613062Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable);3063PathOffset = Pcie->PathOffset;3064PathLength = Pcie->PathLength;30653066while (PathLength)3067{3068Status = AcpiDmDumpTable (Table->Length,3069PathOffset + Offset,3070ACPI_ADD_PTR (UINT8, Pcie, PathOffset),3071sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a);3072if (ACPI_FAILURE (Status))3073{3074return;3075}30763077PathOffset += sizeof (ACPI_SDEV_PCIE_PATH);3078PathLength -= sizeof (ACPI_SDEV_PCIE_PATH);3079}30803081/* VendorData */30823083VendorDataLength = Pcie->VendorDataLength;3084VendorDataOffset = Pcie->PathOffset + Pcie->PathLength;30853086if (VendorDataLength)3087{3088Status = AcpiDmDumpTable (Table->Length, 0,3089ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset),3090VendorDataLength, AcpiDmTableInfoSdev1b);3091if (ACPI_FAILURE (Status))3092{3093return;3094}3095}3096break;30973098default:3099goto NextSubtable;3100}31013102NextSubtable:3103/* Point to next subtable */31043105Offset += Subtable->Length;3106Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable,3107Subtable->Length);3108}3109}311031113112