Path: blob/main/sys/contrib/dev/acpica/common/dmtbdump2.c
105641 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;305306case ACPI_IORT_NODE_IWB:307308InfoTable = AcpiDmTableInfoIort7;309Length = ACPI_OFFSET (ACPI_IORT_IWB, DeviceName);310String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length);311Length += strlen (String) + 1;312break;313314default:315316AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",317IortNode->Type);318319/* Attempt to continue */320321if (!IortNode->Length)322{323AcpiOsPrintf ("Invalid zero length IORT node\n");324return;325}326goto NextSubtable;327}328329/* Dump the node subtable header */330331AcpiOsPrintf ("\n");332Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,333ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),334Length, InfoTable);335if (ACPI_FAILURE (Status))336{337return;338}339340NodeOffset += Length;341342/* Dump the node specific data */343344switch (IortNode->Type)345{346case ACPI_IORT_NODE_ITS_GROUP:347348/* Validate IortItsGroup to avoid compiler warnings */349350if (IortItsGroup)351{352for (i = 0; i < IortItsGroup->ItsCount; i++)353{354Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,355ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),3564, AcpiDmTableInfoIort0a);357if (ACPI_FAILURE (Status))358{359return;360}361362NodeOffset += 4;363}364}365break;366367case ACPI_IORT_NODE_NAMED_COMPONENT:368369/* Dump the Padding (optional) */370371if (IortNode->Length > NodeOffset)372{373MappingByteLength =374IortNode->MappingCount * sizeof (ACPI_IORT_ID_MAPPING);375Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,376Table, IortNode->Length - NodeOffset - MappingByteLength,377AcpiDmTableInfoIort1a);378if (ACPI_FAILURE (Status))379{380return;381}382}383break;384385case ACPI_IORT_NODE_SMMU:386387AcpiOsPrintf ("\n");388389/* Validate IortSmmu to avoid compiler warnings */390391if (IortSmmu)392{393Length = 2 * sizeof (UINT64);394NodeOffset = IortSmmu->GlobalInterruptOffset;395Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,396ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),397Length, AcpiDmTableInfoIort3a);398if (ACPI_FAILURE (Status))399{400return;401}402403NodeOffset = IortSmmu->ContextInterruptOffset;404for (i = 0; i < IortSmmu->ContextInterruptCount; i++)405{406Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,407ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),4088, AcpiDmTableInfoIort3b);409if (ACPI_FAILURE (Status))410{411return;412}413414NodeOffset += 8;415}416417NodeOffset = IortSmmu->PmuInterruptOffset;418for (i = 0; i < IortSmmu->PmuInterruptCount; i++)419{420Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,421ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),4228, AcpiDmTableInfoIort3c);423if (ACPI_FAILURE (Status))424{425return;426}427428NodeOffset += 8;429}430}431break;432433case ACPI_IORT_NODE_RMR:434435/* Validate IortRmr to avoid compiler warnings */436if (IortRmr)437{438NodeOffset = IortRmr->RmrOffset;439Length = sizeof (ACPI_IORT_RMR_DESC);440for (i = 0; i < IortRmr->RmrCount; i++)441{442AcpiOsPrintf ("\n");443Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,444ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),445Length, AcpiDmTableInfoIort6a);446if (ACPI_FAILURE (Status))447{448return;449}450451NodeOffset += Length;452}453}454break;455456default:457458break;459}460461/* Dump the ID mappings */462463NodeOffset = IortNode->MappingOffset;464for (i = 0; i < IortNode->MappingCount; i++)465{466AcpiOsPrintf ("\n");467Length = sizeof (ACPI_IORT_ID_MAPPING);468Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,469ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),470Length, AcpiDmTableInfoIortMap);471if (ACPI_FAILURE (Status))472{473return;474}475476NodeOffset += Length;477}478479NextSubtable:480/* Point to next node subtable */481482Offset += IortNode->Length;483}484}485486487/*******************************************************************************488*489* FUNCTION: AcpiDmDumpIovt490*491* PARAMETERS: Table - A IOVT table492*493* RETURN: None494*495* DESCRIPTION: Format the contents of a IOVT496*497******************************************************************************/498499void500AcpiDmDumpIovt (501ACPI_TABLE_HEADER *Table)502{503ACPI_STATUS Status;504UINT32 Offset;505UINT32 EntryOffset;506UINT32 EntryLength;507UINT32 EntryType;508ACPI_IOVT_DEVICE_ENTRY *DeviceEntry;509ACPI_IOVT_HEADER *SubtableHeader;510ACPI_IOVT_IOMMU *Subtable;511ACPI_DMTABLE_INFO *InfoTable;512ACPI_TABLE_IOVT *Iovt;513514515/* Main table */516517Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIovt);518if (ACPI_FAILURE (Status))519{520return;521}522523Iovt = ACPI_CAST_PTR (ACPI_TABLE_IOVT, Table);524Offset = Iovt->IommuOffset;525526/* Subtables */527528SubtableHeader = ACPI_ADD_PTR (ACPI_IOVT_HEADER, Table, Offset);529530while (Offset < Table->Length)531{532switch (SubtableHeader->Type)533{534535case ACPI_IOVT_IOMMU_V1:536537AcpiOsPrintf ("\n");538InfoTable = AcpiDmTableInfoIovt0;539break;540541default:542543AcpiOsPrintf ("\n**** Unknown IOVT subtable type 0x%X\n",544SubtableHeader->Type);545546/* Attempt to continue */547548if (!SubtableHeader->Length)549{550AcpiOsPrintf ("Invalid zero length subtable\n");551return;552}553goto NextSubtable;554}555556/* Dump the subtable */557558Status = AcpiDmDumpTable (Table->Length, Offset, SubtableHeader,559SubtableHeader->Length, InfoTable);560if (ACPI_FAILURE (Status))561{562return;563}564565/* The hardware subtables (IOVT) can contain multiple device entries */566567if (SubtableHeader->Type == ACPI_IOVT_IOMMU_V1)568{569Subtable = ACPI_ADD_PTR (ACPI_IOVT_IOMMU, Table, Offset);570571EntryOffset = Offset + Subtable->DeviceEntryOffset;572/* Process all of the Device Entries */573574do {575AcpiOsPrintf ("\n");576577DeviceEntry = ACPI_ADD_PTR (ACPI_IOVT_DEVICE_ENTRY,578Table, EntryOffset);579EntryType = DeviceEntry->Type;580EntryLength = DeviceEntry->Length;581582switch (EntryType)583{584case ACPI_IOVT_DEVICE_ENTRY_SINGLE:585case ACPI_IOVT_DEVICE_ENTRY_START:586case ACPI_IOVT_DEVICE_ENTRY_END:587InfoTable = AcpiDmTableInfoIovtdev;588break;589590default:591InfoTable = AcpiDmTableInfoIovtdev;592AcpiOsPrintf (593"\n**** Unknown IOVT device entry type/length: "594"0x%.2X/0x%X at offset 0x%.4X: (header below)\n",595EntryType, EntryLength, EntryOffset);596break;597}598599/* Dump the Device Entry */600601Status = AcpiDmDumpTable (Table->Length, EntryOffset,602DeviceEntry, EntryLength, InfoTable);603if (ACPI_FAILURE (Status))604{605return;606}607608EntryOffset += EntryLength;609} while (EntryOffset < (Offset + Subtable->Header.Length));610}611612NextSubtable:613/* Point to next subtable */614615Offset += SubtableHeader->Length;616SubtableHeader = ACPI_ADD_PTR (ACPI_IOVT_HEADER, SubtableHeader, SubtableHeader->Length);617}618}619620621/*******************************************************************************622*623* FUNCTION: AcpiDmDumpIvrs624*625* PARAMETERS: Table - A IVRS table626*627* RETURN: None628*629* DESCRIPTION: Format the contents of a IVRS. Notes:630* The IVRS is essentially a flat table, with the following631* structure:632* <Main ACPI Table Header>633* <Main subtable - virtualization info>634* <IVHD>635* <Device Entries>636* ...637* <IVHD>638* <Device Entries>639* <IVMD>640* ...641*642******************************************************************************/643644void645AcpiDmDumpIvrs (646ACPI_TABLE_HEADER *Table)647{648ACPI_STATUS Status;649UINT32 Offset = sizeof (ACPI_TABLE_IVRS);650UINT32 EntryOffset;651UINT32 EntryLength;652UINT32 EntryType;653ACPI_IVRS_DEVICE_HID *HidSubtable;654ACPI_IVRS_DE_HEADER *DeviceEntry;655ACPI_IVRS_HEADER *Subtable;656ACPI_DMTABLE_INFO *InfoTable;657658659/* Main table */660661Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);662if (ACPI_FAILURE (Status))663{664return;665}666667/* Subtables */668669Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);670671while (Offset < Table->Length)672{673switch (Subtable->Type)674{675/* Type 10h, IVHD (I/O Virtualization Hardware Definition) */676677case ACPI_IVRS_TYPE_HARDWARE1:678679AcpiOsPrintf ("\n");680InfoTable = AcpiDmTableInfoIvrsHware1;681break;682683/* Types 11h, 40h, IVHD (I/O Virtualization Hardware Definition) */684685case ACPI_IVRS_TYPE_HARDWARE2:686case ACPI_IVRS_TYPE_HARDWARE3:687688AcpiOsPrintf ("\n");689InfoTable = AcpiDmTableInfoIvrsHware23;690break;691692/* Types 20h-22h, IVMD (I/O Virtualization Memory Definition Block) */693694case ACPI_IVRS_TYPE_MEMORY1:695case ACPI_IVRS_TYPE_MEMORY2:696case ACPI_IVRS_TYPE_MEMORY3:697698AcpiOsPrintf ("\n");699InfoTable = AcpiDmTableInfoIvrsMemory;700break;701702default:703704AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n",705Subtable->Type);706707/* Attempt to continue */708709if (!Subtable->Length)710{711AcpiOsPrintf ("Invalid zero length subtable\n");712return;713}714goto NextSubtable;715}716717/* Dump the subtable */718719Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,720Subtable->Length, InfoTable);721if (ACPI_FAILURE (Status))722{723return;724}725726/* The hardware subtables (IVHD) can contain multiple device entries */727728if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1 ||729Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2 ||730Subtable->Type == ACPI_IVRS_TYPE_HARDWARE3)731{732if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1)733{734EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE1);735DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,736sizeof (ACPI_IVRS_HARDWARE1));737}738else739{740/* ACPI_IVRS_TYPE_HARDWARE2, HARDWARE3 subtable types */741742EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE2);743DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,744sizeof (ACPI_IVRS_HARDWARE2));745}746747/* Process all of the Device Entries */748749while (EntryOffset < (Offset + Subtable->Length))750{751AcpiOsPrintf ("\n");752753/*754* Upper 2 bits of Type encode the length of the device entry755*756* 00 = 4 byte757* 01 = 8 byte758* 1x = variable length759*/760EntryType = DeviceEntry->Type;761EntryLength = EntryType >> 6 == 1 ? 8 : 4;762763switch (EntryType)764{765/* 4-byte device entries */766767case ACPI_IVRS_TYPE_PAD4:768case ACPI_IVRS_TYPE_ALL:769case ACPI_IVRS_TYPE_SELECT:770case ACPI_IVRS_TYPE_START:771case ACPI_IVRS_TYPE_END:772773InfoTable = AcpiDmTableInfoIvrs4;774break;775776/* 8-byte entries, type A */777778case ACPI_IVRS_TYPE_ALIAS_SELECT:779case ACPI_IVRS_TYPE_ALIAS_START:780781InfoTable = AcpiDmTableInfoIvrs8a;782break;783784/* 8-byte entries, type B */785786case ACPI_IVRS_TYPE_PAD8:787case ACPI_IVRS_TYPE_EXT_SELECT:788case ACPI_IVRS_TYPE_EXT_START:789790InfoTable = AcpiDmTableInfoIvrs8b;791break;792793/* 8-byte entries, type C */794795case ACPI_IVRS_TYPE_SPECIAL:796797InfoTable = AcpiDmTableInfoIvrs8c;798break;799800/* Variable-length entries */801802case ACPI_IVRS_TYPE_HID:803804EntryLength = 4;805InfoTable = AcpiDmTableInfoIvrsHid;806break;807808default:809InfoTable = AcpiDmTableInfoIvrs4;810AcpiOsPrintf (811"\n**** Unknown IVRS device entry type/length: "812"0x%.2X/0x%X at offset 0x%.4X: (header below)\n",813EntryType, EntryLength, EntryOffset);814break;815}816817/* Dump the Device Entry */818819Status = AcpiDmDumpTable (Table->Length, EntryOffset,820DeviceEntry, EntryLength, InfoTable);821if (ACPI_FAILURE (Status))822{823return;824}825826HidSubtable = ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, DeviceEntry);827EntryOffset += EntryLength;828DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, HidSubtable,829EntryLength);830831if (EntryType == ACPI_IVRS_TYPE_HID)832{833/*834* Determine if the HID is an integer or a string.835* An integer is defined to be 32 bits, with the upper 32 bits836* set to zero. (from the ACPI Spec): "The HID can be a 32-bit837* integer or a character string. If an integer, the lower838* 4 bytes of the field contain the integer and the upper839* 4 bytes are padded with 0".840*/841if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiHid))842{843Status = AcpiDmDumpTable (Table->Length, EntryOffset,844&HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidInteger);845}846else847{848Status = AcpiDmDumpTable (Table->Length, EntryOffset,849&HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidString);850}851if (ACPI_FAILURE (Status))852{853return;854}855856EntryOffset += 8;857858/*859* Determine if the CID is an integer or a string. The format860* of the CID is the same as the HID above. From ACPI Spec:861* "If present, CID must be a single Compatible Device ID862* following the same format as the HID field."863*/864if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiCid))865{866Status = AcpiDmDumpTable (Table->Length, EntryOffset,867&HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidInteger);868}869else870{871Status = AcpiDmDumpTable (Table->Length, EntryOffset,872&HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidString);873}874if (ACPI_FAILURE (Status))875{876return;877}878879EntryOffset += 8;880EntryLength = HidSubtable->UidLength;881882if (EntryLength > ACPI_IVRS_UID_NOT_PRESENT)883{884/* Dump the UID based upon the UidType field (String or Integer) */885886if (HidSubtable->UidType == ACPI_IVRS_UID_IS_STRING)887{888Status = AcpiDmDumpTable (Table->Length, EntryOffset,889&HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidString);890if (ACPI_FAILURE (Status))891{892return;893}894}895else /* ACPI_IVRS_UID_IS_INTEGER */896{897Status = AcpiDmDumpTable (Table->Length, EntryOffset,898&HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidInteger);899if (ACPI_FAILURE (Status))900{901return;902}903}904}905906EntryOffset += EntryLength+2;907DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER,908Table, EntryOffset);909}910}911}912913NextSubtable:914/* Point to next subtable */915916Offset += Subtable->Length;917Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, Subtable->Length);918}919}920921922/*******************************************************************************923*924* FUNCTION: AcpiDmDumpLpit925*926* PARAMETERS: Table - A LPIT table927*928* RETURN: None929*930* DESCRIPTION: Format the contents of a LPIT. This table type consists931* of an open-ended number of subtables. Note: There are no932* entries in the main table. An LPIT consists of the table933* header and then subtables only.934*935******************************************************************************/936937void938AcpiDmDumpLpit (939ACPI_TABLE_HEADER *Table)940{941ACPI_STATUS Status;942ACPI_LPIT_HEADER *Subtable;943UINT32 Length = Table->Length;944UINT32 Offset = sizeof (ACPI_TABLE_LPIT);945ACPI_DMTABLE_INFO *InfoTable;946UINT32 SubtableLength;947948949/* Subtables */950951Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);952while (Offset < Table->Length)953{954/* Common subtable header */955956Status = AcpiDmDumpTable (Length, Offset, Subtable,957sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);958if (ACPI_FAILURE (Status))959{960return;961}962963switch (Subtable->Type)964{965case ACPI_LPIT_TYPE_NATIVE_CSTATE:966967InfoTable = AcpiDmTableInfoLpit0;968SubtableLength = sizeof (ACPI_LPIT_NATIVE);969break;970971default:972973/* Cannot continue on unknown type - no length */974975AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n",976Subtable->Type);977return;978}979980Status = AcpiDmDumpTable (Length, Offset, Subtable,981SubtableLength, InfoTable);982if (ACPI_FAILURE (Status))983{984return;985}986987AcpiOsPrintf ("\n");988989/* Point to next subtable */990991Offset += SubtableLength;992Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Subtable, SubtableLength);993}994}995996997/*******************************************************************************998*999* FUNCTION: AcpiDmDumpMadt1000*1001* PARAMETERS: Table - A MADT table1002*1003* RETURN: None1004*1005* DESCRIPTION: Format the contents of a MADT. This table type consists1006* of an open-ended number of subtables.1007*1008******************************************************************************/10091010void1011AcpiDmDumpMadt (1012ACPI_TABLE_HEADER *Table)1013{1014ACPI_STATUS Status;1015ACPI_SUBTABLE_HEADER *Subtable;1016UINT32 Length = Table->Length;1017UINT32 Offset = sizeof (ACPI_TABLE_MADT);1018ACPI_DMTABLE_INFO *InfoTable;1019UINT8 Revision;102010211022/* Main table */10231024Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);1025if (ACPI_FAILURE (Status))1026{1027return;1028}10291030Revision = Table->Revision;10311032/* Subtables */10331034Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);1035DbgPrint (ASL_PARSE_OUTPUT, "//0B) Offset %X, from table start: 0x%8.8X%8.8X\n",1036Offset, ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)));1037while (Offset < Table->Length)1038{1039/* Common subtable header */10401041AcpiOsPrintf ("\n");1042Status = AcpiDmDumpTable (Length, Offset, Subtable,1043Subtable->Length, AcpiDmTableInfoMadtHdr);1044if (ACPI_FAILURE (Status))1045{1046return;1047}10481049DbgPrint (ASL_PARSE_OUTPUT, "subtableType: %X\n", Subtable->Type);1050switch (Subtable->Type)1051{1052case ACPI_MADT_TYPE_LOCAL_APIC:10531054InfoTable = AcpiDmTableInfoMadt0;1055break;10561057case ACPI_MADT_TYPE_IO_APIC:10581059InfoTable = AcpiDmTableInfoMadt1;1060break;10611062case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:10631064InfoTable = AcpiDmTableInfoMadt2;1065break;10661067case ACPI_MADT_TYPE_NMI_SOURCE:10681069InfoTable = AcpiDmTableInfoMadt3;1070break;10711072case ACPI_MADT_TYPE_LOCAL_APIC_NMI:10731074InfoTable = AcpiDmTableInfoMadt4;1075break;10761077case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:10781079InfoTable = AcpiDmTableInfoMadt5;1080break;10811082case ACPI_MADT_TYPE_IO_SAPIC:10831084InfoTable = AcpiDmTableInfoMadt6;1085break;10861087case ACPI_MADT_TYPE_LOCAL_SAPIC:10881089InfoTable = AcpiDmTableInfoMadt7;1090break;10911092case ACPI_MADT_TYPE_INTERRUPT_SOURCE:10931094InfoTable = AcpiDmTableInfoMadt8;1095break;10961097case ACPI_MADT_TYPE_LOCAL_X2APIC:10981099InfoTable = AcpiDmTableInfoMadt9;1100break;11011102case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:11031104InfoTable = AcpiDmTableInfoMadt10;1105break;11061107case ACPI_MADT_TYPE_GENERIC_INTERRUPT:11081109if (Revision > 6)1110InfoTable = AcpiDmTableInfoMadt11b;1111else if (Revision == 6)1112InfoTable = AcpiDmTableInfoMadt11a;1113else1114InfoTable = AcpiDmTableInfoMadt11;1115break;11161117case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:11181119InfoTable = AcpiDmTableInfoMadt12;1120break;11211122case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:11231124InfoTable = AcpiDmTableInfoMadt13;1125break;11261127case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:11281129InfoTable = Revision > 6 ? AcpiDmTableInfoMadt14a :1130AcpiDmTableInfoMadt14;1131break;11321133case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:11341135InfoTable = Revision > 6 ? AcpiDmTableInfoMadt15a :1136AcpiDmTableInfoMadt15;1137break;11381139case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:11401141InfoTable = AcpiDmTableInfoMadt16;1142break;11431144case ACPI_MADT_TYPE_CORE_PIC:11451146InfoTable = AcpiDmTableInfoMadt17;1147break;11481149case ACPI_MADT_TYPE_LIO_PIC:11501151InfoTable = AcpiDmTableInfoMadt18;1152break;11531154case ACPI_MADT_TYPE_HT_PIC:11551156InfoTable = AcpiDmTableInfoMadt19;1157break;11581159case ACPI_MADT_TYPE_EIO_PIC:11601161InfoTable = AcpiDmTableInfoMadt20;1162break;11631164case ACPI_MADT_TYPE_MSI_PIC:11651166InfoTable = AcpiDmTableInfoMadt21;1167break;11681169case ACPI_MADT_TYPE_BIO_PIC:11701171InfoTable = AcpiDmTableInfoMadt22;1172break;11731174case ACPI_MADT_TYPE_LPC_PIC:11751176InfoTable = AcpiDmTableInfoMadt23;1177break;11781179case ACPI_MADT_TYPE_RINTC:11801181InfoTable = AcpiDmTableInfoMadt24;1182break;11831184case ACPI_MADT_TYPE_IMSIC:11851186InfoTable = AcpiDmTableInfoMadt25;1187break;11881189case ACPI_MADT_TYPE_APLIC:11901191InfoTable = AcpiDmTableInfoMadt26;1192break;11931194case ACPI_MADT_TYPE_PLIC:11951196InfoTable = AcpiDmTableInfoMadt27;1197break;11981199case ACPI_MADT_TYPE_GICV5_IRS:12001201InfoTable = AcpiDmTableInfoMadt28;1202break;12031204case ACPI_MADT_TYPE_GICV5_ITS:12051206InfoTable = AcpiDmTableInfoMadt29;1207break;12081209case ACPI_MADT_TYPE_GICV5_ITS_TRANSLATE:12101211InfoTable = AcpiDmTableInfoMadt30;1212break;12131214default:12151216if ((Subtable->Type >= ACPI_MADT_TYPE_RESERVED) &&1217(Subtable->Type < ACPI_MADT_TYPE_OEM_RESERVED))1218{1219AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",1220Subtable->Type);1221goto NextSubtable;1222}1223else if (Subtable->Type >= ACPI_MADT_TYPE_OEM_RESERVED)1224{1225DbgPrint (ASL_PARSE_OUTPUT, "//[Found an OEM structure, type = %0x]\n",1226Subtable->Type);1227Offset += sizeof (ACPI_SUBTABLE_HEADER);1228DbgPrint (ASL_PARSE_OUTPUT, "//[0) Subtable->Length = %X, Subtable = %p, Offset = %X]\n",1229Subtable->Length, Subtable, Offset);1230DbgPrint (ASL_PARSE_OUTPUT, "//[0A) Offset from table start: 0x%8.8X%8.8X]\n",1231ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)));1232}12331234/* Attempt to continue */12351236if (!Subtable->Length)1237{1238AcpiOsPrintf ("Invalid zero length subtable\n");1239return;1240}12411242/* Dump the OEM data */12431244Status = AcpiDmDumpTable (Length, Offset, ACPI_CAST_PTR (UINT8, Table) + Offset,1245Subtable->Length - sizeof (ACPI_SUBTABLE_HEADER), AcpiDmTableInfoMadt128);1246if (ACPI_FAILURE (Status))1247{1248return;1249}12501251DbgPrint (ASL_PARSE_OUTPUT, "//[1) Subtable->Length = %X, Offset = %X]\n",1252Subtable->Length, Offset);1253Offset -= sizeof (ACPI_SUBTABLE_HEADER);12541255goto NextSubtable;1256}12571258DbgPrint (ASL_PARSE_OUTPUT, "//[2) Subtable->Length = %X, Offset = %X]\n",1259Subtable->Length, Offset);1260Status = AcpiDmDumpTable (Length, Offset, Subtable,1261Subtable->Length, InfoTable);1262if (ACPI_FAILURE (Status))1263{1264return;1265}12661267NextSubtable:1268/* Point to next subtable */12691270DbgPrint (ASL_PARSE_OUTPUT, "//[3) Subtable->Length = %X, Offset = %X]\n",1271Subtable->Length, Offset);1272DbgPrint (ASL_PARSE_OUTPUT, "//[4) Offset from table start: 0x%8.8X%8.8X (%p) %p]\n",1273ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (UINT8, Subtable) - ACPI_CAST_PTR (UINT8, Table)), Subtable, Table);1274if (Offset > Table->Length)1275{1276return;1277}12781279Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable,1280Subtable->Length);12811282Offset = ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table);1283if (Offset >= Table->Length)1284{1285return;1286}12871288DbgPrint (ASL_PARSE_OUTPUT, "//[5) Next Subtable %p, length %X]\n",1289Subtable, Subtable->Length);1290DbgPrint (ASL_PARSE_OUTPUT, "//[5B) Offset from table start: 0x%8.8X%8.8X (%p)]\n",1291ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)), Subtable);1292}1293}129412951296/*******************************************************************************1297*1298* FUNCTION: AcpiDmDumpMcfg1299*1300* PARAMETERS: Table - A MCFG Table1301*1302* RETURN: None1303*1304* DESCRIPTION: Format the contents of a MCFG table1305*1306******************************************************************************/13071308void1309AcpiDmDumpMcfg (1310ACPI_TABLE_HEADER *Table)1311{1312ACPI_STATUS Status;1313UINT32 Offset = sizeof (ACPI_TABLE_MCFG);1314ACPI_MCFG_ALLOCATION *Subtable;131513161317/* Main table */13181319Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);1320if (ACPI_FAILURE (Status))1321{1322return;1323}13241325/* Subtables */13261327Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);1328while (Offset < Table->Length)1329{1330if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)1331{1332AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",1333(UINT32) sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));1334return;1335}13361337AcpiOsPrintf ("\n");1338Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,1339sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);1340if (ACPI_FAILURE (Status))1341{1342return;1343}13441345/* Point to next subtable (each subtable is of fixed length) */13461347Offset += sizeof (ACPI_MCFG_ALLOCATION);1348Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Subtable,1349sizeof (ACPI_MCFG_ALLOCATION));1350}1351}13521353/*******************************************************************************1354*1355* FUNCTION: AcpiDmDumpMpam1356*1357* PARAMETERS: Table - A MPAM table1358*1359* RETURN: None1360*1361* DESCRIPTION: Format the contents of a MPAM table1362*1363******************************************************************************/13641365void1366AcpiDmDumpMpam (1367ACPI_TABLE_HEADER *Table)1368{1369ACPI_STATUS Status;1370ACPI_MPAM_MSC_NODE *MpamMscNode;1371ACPI_MPAM_RESOURCE_NODE *MpamResourceNode;1372ACPI_MPAM_FUNC_DEPS *MpamFunctionalDependency;1373ACPI_DMTABLE_INFO *InfoTable;1374UINT32 Offset = sizeof(ACPI_TABLE_HEADER);1375UINT32 TempOffset;1376UINT32 MpamResourceNodeLength = 0;13771378while (Offset < Table->Length)1379{1380MpamMscNode = ACPI_ADD_PTR (ACPI_MPAM_MSC_NODE, Table, Offset);13811382/* Subtable: MSC */1383Status = AcpiDmDumpTable (Table->Length, Offset, MpamMscNode,1384MpamMscNode->Length, AcpiDmTableInfoMpam0);1385if (ACPI_FAILURE (Status))1386{1387return;1388}13891390/* Offset the start of the array of resources */1391Offset += sizeof(ACPI_MPAM_MSC_NODE);13921393/* Subtable: MSC RIS(es) */1394for (UINT32 ResourceIdx = 0; ResourceIdx < MpamMscNode->NumResourceNodes; ResourceIdx++)1395{1396AcpiOsPrintf ("\n");1397MpamResourceNode = ACPI_ADD_PTR (ACPI_MPAM_RESOURCE_NODE, Table, Offset);13981399MpamResourceNodeLength = sizeof(ACPI_MPAM_RESOURCE_NODE) +1400MpamResourceNode->NumFunctionalDeps * sizeof(ACPI_MPAM_FUNC_DEPS);1401TempOffset = Offset;1402Offset += MpamResourceNodeLength;14031404/* Subtable: MSC RIS */1405Status = AcpiDmDumpTable (Table->Length, TempOffset, MpamResourceNode,1406sizeof(ACPI_MPAM_RESOURCE_NODE), AcpiDmTableInfoMpam1);1407if (ACPI_FAILURE (Status))1408{1409return;1410}14111412switch (MpamResourceNode->LocatorType)1413{1414case ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE:1415InfoTable = AcpiDmTableInfoMpam1A;1416break;1417case ACPI_MPAM_LOCATION_TYPE_MEMORY:1418InfoTable = AcpiDmTableInfoMpam1B;1419break;1420case ACPI_MPAM_LOCATION_TYPE_SMMU:1421InfoTable = AcpiDmTableInfoMpam1C;1422break;1423case ACPI_MPAM_LOCATION_TYPE_MEMORY_CACHE:1424InfoTable = AcpiDmTableInfoMpam1D;1425break;1426case ACPI_MPAM_LOCATION_TYPE_ACPI_DEVICE:1427InfoTable = AcpiDmTableInfoMpam1E;1428break;1429case ACPI_MPAM_LOCATION_TYPE_INTERCONNECT:1430InfoTable = AcpiDmTableInfoMpam1F;1431break;1432case ACPI_MPAM_LOCATION_TYPE_UNKNOWN:1433InfoTable = AcpiDmTableInfoMpam1G;1434default:1435AcpiOsPrintf ("\n**** Unknown MPAM locator type 0x%X\n",1436MpamResourceNode->LocatorType);1437return;1438}14391440/* Subtable: MSC Resource Locator(s) */1441TempOffset += ACPI_OFFSET(ACPI_MPAM_RESOURCE_NODE, Locator);1442Status = AcpiDmDumpTable (Table->Length, TempOffset, &MpamResourceNode->Locator,1443sizeof(ACPI_MPAM_RESOURCE_LOCATOR), InfoTable);1444if (ACPI_FAILURE (Status))1445{1446return;1447}14481449/* Get the number of functional dependencies of an RIS */1450TempOffset += sizeof(ACPI_MPAM_RESOURCE_LOCATOR);1451Status = AcpiDmDumpTable (Table->Length, TempOffset, &MpamResourceNode->NumFunctionalDeps,1452sizeof(UINT32), AcpiDmTableInfoMpam1Deps);1453if (ACPI_FAILURE (Status))1454{1455return;1456}14571458TempOffset += sizeof(UINT32);1459MpamFunctionalDependency = ACPI_ADD_PTR (ACPI_MPAM_FUNC_DEPS, MpamResourceNode,1460sizeof(ACPI_MPAM_RESOURCE_NODE));1461/* Subtable: MSC functional dependencies */1462for (UINT32 funcDep = 0; funcDep < MpamResourceNode->NumFunctionalDeps; funcDep++)1463{1464AcpiOsPrintf ("\n");1465Status = AcpiDmDumpTable (sizeof(ACPI_MPAM_FUNC_DEPS), 0,1466&MpamResourceNode->NumFunctionalDeps, 0, AcpiDmTableInfoMpam2);1467Status = AcpiDmDumpTable (Table->Length, TempOffset, MpamFunctionalDependency,1468sizeof(ACPI_MPAM_FUNC_DEPS), AcpiDmTableInfoMpam2);1469if (ACPI_FAILURE (Status))1470{1471return;1472}1473TempOffset += sizeof(ACPI_MPAM_FUNC_DEPS);1474MpamFunctionalDependency++;1475}14761477AcpiOsPrintf ("\n\n");1478}14791480}14811482return;1483}14841485/*******************************************************************************1486*1487* FUNCTION: AcpiDmDumpMpst1488*1489* PARAMETERS: Table - A MPST Table1490*1491* RETURN: None1492*1493* DESCRIPTION: Format the contents of a MPST table1494*1495******************************************************************************/14961497void1498AcpiDmDumpMpst (1499ACPI_TABLE_HEADER *Table)1500{1501ACPI_STATUS Status;1502UINT32 Offset = sizeof (ACPI_TABLE_MPST);1503ACPI_MPST_POWER_NODE *Subtable0;1504ACPI_MPST_POWER_STATE *Subtable0A;1505ACPI_MPST_COMPONENT *Subtable0B;1506ACPI_MPST_DATA_HDR *Subtable1;1507ACPI_MPST_POWER_DATA *Subtable2;1508UINT16 SubtableCount;1509UINT32 PowerStateCount;1510UINT32 ComponentCount;151115121513/* Main table */15141515Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);1516if (ACPI_FAILURE (Status))1517{1518return;1519}15201521/* Subtable: Memory Power Node(s) */15221523SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;1524Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);15251526while ((Offset < Table->Length) && SubtableCount)1527{1528AcpiOsPrintf ("\n");1529Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0,1530sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);1531if (ACPI_FAILURE (Status))1532{1533return;1534}15351536/* Extract the sub-subtable counts */15371538PowerStateCount = Subtable0->NumPowerStates;1539ComponentCount = Subtable0->NumPhysicalComponents;1540Offset += sizeof (ACPI_MPST_POWER_NODE);15411542/* Sub-subtables - Memory Power State Structure(s) */15431544Subtable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, Subtable0,1545sizeof (ACPI_MPST_POWER_NODE));15461547while (PowerStateCount)1548{1549AcpiOsPrintf ("\n");1550Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A,1551sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);1552if (ACPI_FAILURE (Status))1553{1554return;1555}15561557Subtable0A++;1558PowerStateCount--;1559Offset += sizeof (ACPI_MPST_POWER_STATE);1560}15611562/* Sub-subtables - Physical Component ID Structure(s) */15631564Subtable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, Subtable0A);15651566if (ComponentCount)1567{1568AcpiOsPrintf ("\n");1569}15701571while (ComponentCount)1572{1573Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B,1574sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);1575if (ACPI_FAILURE (Status))1576{1577return;1578}15791580Subtable0B++;1581ComponentCount--;1582Offset += sizeof (ACPI_MPST_COMPONENT);1583}15841585/* Point to next Memory Power Node subtable */15861587SubtableCount--;1588Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Subtable0,1589sizeof (ACPI_MPST_POWER_NODE) +1590(sizeof (ACPI_MPST_POWER_STATE) * Subtable0->NumPowerStates) +1591(sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents));1592}15931594/* Subtable: Count of Memory Power State Characteristic structures */15951596AcpiOsPrintf ("\n");1597Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0);1598Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1,1599sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);1600if (ACPI_FAILURE (Status))1601{1602return;1603}16041605SubtableCount = Subtable1->CharacteristicsCount;1606Offset += sizeof (ACPI_MPST_DATA_HDR);16071608/* Subtable: Memory Power State Characteristics structure(s) */16091610Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1,1611sizeof (ACPI_MPST_DATA_HDR));16121613while ((Offset < Table->Length) && SubtableCount)1614{1615AcpiOsPrintf ("\n");1616Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2,1617sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);1618if (ACPI_FAILURE (Status))1619{1620return;1621}16221623Subtable2++;1624SubtableCount--;1625Offset += sizeof (ACPI_MPST_POWER_DATA);1626}1627}162816291630/*******************************************************************************1631*1632* FUNCTION: AcpiDmDumpMrrm1633*1634* PARAMETERS: Table - A MRRM table1635*1636* RETURN: None1637*1638* DESCRIPTION: Format the contents of a MRRM1639*1640******************************************************************************/16411642void1643AcpiDmDumpMrrm (1644ACPI_TABLE_HEADER *Table)1645{1646ACPI_STATUS Status;1647ACPI_MRRM_MEM_RANGE_ENTRY *Subtable;1648UINT16 Offset = sizeof (ACPI_TABLE_MRRM);16491650/* Main table */16511652Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMrrm);1653if (ACPI_FAILURE (Status))1654{1655return;1656}16571658/* Subtables (all are same type) */16591660Subtable = ACPI_ADD_PTR (ACPI_MRRM_MEM_RANGE_ENTRY, Table, Offset);1661while (Offset < Table->Length)1662{1663AcpiOsPrintf ("\n");1664Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,1665Subtable->Header.Length, AcpiDmTableInfoMrrm0);1666if (ACPI_FAILURE (Status))1667{1668return;1669}16701671Offset += Subtable->Header.Length;1672Subtable = ACPI_ADD_PTR (ACPI_MRRM_MEM_RANGE_ENTRY, Subtable,1673Subtable->Header.Length);1674}1675}167616771678/*******************************************************************************1679*1680* FUNCTION: AcpiDmDumpMsct1681*1682* PARAMETERS: Table - A MSCT table1683*1684* RETURN: None1685*1686* DESCRIPTION: Format the contents of a MSCT1687*1688******************************************************************************/16891690void1691AcpiDmDumpMsct (1692ACPI_TABLE_HEADER *Table)1693{1694ACPI_STATUS Status;1695UINT32 Offset = sizeof (ACPI_TABLE_MSCT);1696ACPI_MSCT_PROXIMITY *Subtable;169716981699/* Main table */17001701Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);1702if (ACPI_FAILURE (Status))1703{1704return;1705}17061707/* Subtables */17081709Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);1710while (Offset < Table->Length)1711{1712/* Common subtable header */17131714AcpiOsPrintf ("\n");1715Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,1716sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);1717if (ACPI_FAILURE (Status))1718{1719return;1720}17211722/* Point to next subtable */17231724Offset += sizeof (ACPI_MSCT_PROXIMITY);1725Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Subtable,1726sizeof (ACPI_MSCT_PROXIMITY));1727}1728}172917301731/*******************************************************************************1732*1733* FUNCTION: AcpiDmDumpNfit1734*1735* PARAMETERS: Table - A NFIT table1736*1737* RETURN: None1738*1739* DESCRIPTION: Format the contents of an NFIT.1740*1741******************************************************************************/17421743void1744AcpiDmDumpNfit (1745ACPI_TABLE_HEADER *Table)1746{1747ACPI_STATUS Status;1748UINT32 Offset = sizeof (ACPI_TABLE_NFIT);1749UINT32 FieldOffset = 0;1750UINT32 Length;1751ACPI_NFIT_HEADER *Subtable;1752ACPI_DMTABLE_INFO *InfoTable;1753ACPI_NFIT_INTERLEAVE *Interleave = NULL;1754ACPI_NFIT_SMBIOS *SmbiosInfo = NULL;1755ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;1756UINT32 i;175717581759/* Main table */17601761Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);1762if (ACPI_FAILURE (Status))1763{1764return;1765}17661767/* Subtables */17681769Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);1770while (Offset < Table->Length)1771{1772/* NFIT subtable header */17731774AcpiOsPrintf ("\n");1775Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,1776Subtable->Length, AcpiDmTableInfoNfitHdr);1777if (ACPI_FAILURE (Status))1778{1779return;1780}17811782switch (Subtable->Type)1783{1784case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:17851786InfoTable = AcpiDmTableInfoNfit0;1787break;17881789case ACPI_NFIT_TYPE_MEMORY_MAP:17901791InfoTable = AcpiDmTableInfoNfit1;1792break;17931794case ACPI_NFIT_TYPE_INTERLEAVE:17951796/* Has a variable number of 32-bit values at the end */17971798InfoTable = AcpiDmTableInfoNfit2;1799FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);1800break;18011802case ACPI_NFIT_TYPE_SMBIOS:18031804SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, Subtable);1805InfoTable = AcpiDmTableInfoNfit3;1806break;18071808case ACPI_NFIT_TYPE_CONTROL_REGION:18091810InfoTable = AcpiDmTableInfoNfit4;1811break;18121813case ACPI_NFIT_TYPE_DATA_REGION:18141815InfoTable = AcpiDmTableInfoNfit5;1816break;18171818case ACPI_NFIT_TYPE_FLUSH_ADDRESS:18191820/* Has a variable number of 64-bit addresses at the end */18211822InfoTable = AcpiDmTableInfoNfit6;1823FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS);1824break;18251826case ACPI_NFIT_TYPE_CAPABILITIES: /* ACPI 6.0A */18271828InfoTable = AcpiDmTableInfoNfit7;1829break;18301831default:1832AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",1833Subtable->Type);18341835/* Attempt to continue */18361837if (!Subtable->Length)1838{1839AcpiOsPrintf ("Invalid zero length subtable\n");1840return;1841}1842goto NextSubtable;1843}18441845AcpiOsPrintf ("\n");1846Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,1847Subtable->Length, InfoTable);1848if (ACPI_FAILURE (Status))1849{1850return;1851}18521853/* Per-subtable variable-length fields */18541855switch (Subtable->Type)1856{1857case ACPI_NFIT_TYPE_INTERLEAVE:18581859Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable);1860for (i = 0; i < Interleave->LineCount; i++)1861{1862Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,1863&Interleave->LineOffset[i],1864sizeof (UINT32), AcpiDmTableInfoNfit2a);1865if (ACPI_FAILURE (Status))1866{1867return;1868}18691870FieldOffset += sizeof (UINT32);1871}1872break;18731874case ACPI_NFIT_TYPE_SMBIOS:18751876Length = Subtable->Length -1877sizeof (ACPI_NFIT_SMBIOS);18781879if (Length)1880{1881Status = AcpiDmDumpTable (Table->Length,1882sizeof (ACPI_NFIT_SMBIOS),1883SmbiosInfo,1884Length, AcpiDmTableInfoNfit3a);1885if (ACPI_FAILURE (Status))1886{1887return;1888}1889}18901891break;18921893case ACPI_NFIT_TYPE_FLUSH_ADDRESS:18941895Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable);1896for (i = 0; i < Hint->HintCount; i++)1897{1898Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,1899&Hint->HintAddress[i],1900sizeof (UINT64), AcpiDmTableInfoNfit6a);1901if (ACPI_FAILURE (Status))1902{1903return;1904}19051906FieldOffset += sizeof (UINT64);1907}1908break;19091910default:1911break;1912}19131914NextSubtable:1915/* Point to next subtable */19161917Offset += Subtable->Length;1918Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length);1919}1920}192119221923/*******************************************************************************1924*1925* FUNCTION: AcpiDmDumpPcct1926*1927* PARAMETERS: Table - A PCCT table1928*1929* RETURN: None1930*1931* DESCRIPTION: Format the contents of a PCCT. This table type consists1932* of an open-ended number of subtables.1933*1934******************************************************************************/19351936void1937AcpiDmDumpPcct (1938ACPI_TABLE_HEADER *Table)1939{1940ACPI_STATUS Status;1941ACPI_PCCT_SUBSPACE *Subtable;1942ACPI_DMTABLE_INFO *InfoTable;1943UINT32 Length = Table->Length;1944UINT32 Offset = sizeof (ACPI_TABLE_PCCT);194519461947/* Main table */19481949Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);1950if (ACPI_FAILURE (Status))1951{1952return;1953}19541955/* Subtables */19561957Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);1958while (Offset < Table->Length)1959{1960/* Common subtable header */19611962AcpiOsPrintf ("\n");1963Status = AcpiDmDumpTable (Length, Offset, Subtable,1964Subtable->Header.Length, AcpiDmTableInfoPcctHdr);1965if (ACPI_FAILURE (Status))1966{1967return;1968}19691970switch (Subtable->Header.Type)1971{1972case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:19731974InfoTable = AcpiDmTableInfoPcct0;1975break;19761977case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:19781979InfoTable = AcpiDmTableInfoPcct1;1980break;19811982case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:19831984InfoTable = AcpiDmTableInfoPcct2;1985break;19861987case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:19881989InfoTable = AcpiDmTableInfoPcct3;1990break;19911992case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:19931994InfoTable = AcpiDmTableInfoPcct4;1995break;19961997case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:19981999InfoTable = AcpiDmTableInfoPcct5;2000break;20012002default:20032004AcpiOsPrintf (2005"\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",2006Subtable->Header.Type);2007return;2008}20092010AcpiOsPrintf ("\n");2011Status = AcpiDmDumpTable (Length, Offset, Subtable,2012Subtable->Header.Length, InfoTable);2013if (ACPI_FAILURE (Status))2014{2015return;2016}20172018/* Point to next subtable */20192020Offset += Subtable->Header.Length;2021Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Subtable,2022Subtable->Header.Length);2023}2024}202520262027/*******************************************************************************2028*2029* FUNCTION: AcpiDmDumpPdtt2030*2031* PARAMETERS: Table - A PDTT table2032*2033* RETURN: None2034*2035* DESCRIPTION: Format the contents of a Pdtt. This is a variable-length2036* table that contains an open-ended number of IDs2037* at the end of the table.2038*2039******************************************************************************/20402041void2042AcpiDmDumpPdtt (2043ACPI_TABLE_HEADER *Table)2044{2045ACPI_STATUS Status;2046ACPI_PDTT_CHANNEL *Subtable;2047UINT32 Length = Table->Length;2048UINT32 Offset = sizeof (ACPI_TABLE_PDTT);204920502051/* Main table */20522053Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt);2054if (ACPI_FAILURE (Status))2055{2056return;2057}20582059/* Subtables. Currently there is only one type, but can be multiples */20602061Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset);2062while (Offset < Table->Length)2063{2064AcpiOsPrintf ("\n");2065Status = AcpiDmDumpTable (Length, Offset, Subtable,2066sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0);2067if (ACPI_FAILURE (Status))2068{2069return;2070}20712072/* Point to next subtable */20732074Offset += sizeof (ACPI_PDTT_CHANNEL);2075Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Subtable,2076sizeof (ACPI_PDTT_CHANNEL));2077}2078}207920802081/*******************************************************************************2082*2083* FUNCTION: AcpiDmDumpPhat2084*2085* PARAMETERS: Table - A PHAT table2086*2087* RETURN: None2088*2089* DESCRIPTION: Format the contents of a PHAT.2090*2091******************************************************************************/20922093void2094AcpiDmDumpPhat (2095ACPI_TABLE_HEADER *Table)2096{2097ACPI_STATUS Status;2098ACPI_DMTABLE_INFO *InfoTable;2099ACPI_PHAT_HEADER *Subtable;2100ACPI_PHAT_VERSION_DATA *VersionData;2101ACPI_PHAT_HEALTH_DATA *HealthData;2102UINT32 RecordCount;2103UINT32 Length = Table->Length;2104UINT32 Offset = sizeof (ACPI_TABLE_PHAT);2105UINT32 OriginalOffset;2106UINT32 SubtableLength;2107UINT32 PathLength;2108UINT32 VendorLength;2109UINT16 RecordType;211021112112Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT));21132114while (Offset < Table->Length)2115{2116/* Common subtable header */21172118AcpiOsPrintf ("\n");2119Status = AcpiDmDumpTable (Length, Offset, Subtable,2120sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr);2121if (ACPI_FAILURE (Status))2122{2123return;2124}21252126DbgPrint (ASL_DEBUG_OUTPUT, "\n/* %u, Subtable->Type %X */\n",2127__LINE__, Subtable->Type);21282129switch (Subtable->Type)2130{2131case ACPI_PHAT_TYPE_FW_VERSION_DATA:21322133InfoTable = AcpiDmTableInfoPhat0;2134SubtableLength = sizeof (ACPI_PHAT_VERSION_DATA);2135break;21362137case ACPI_PHAT_TYPE_FW_HEALTH_DATA:21382139InfoTable = AcpiDmTableInfoPhat1;2140SubtableLength = sizeof (ACPI_PHAT_HEALTH_DATA);2141break;21422143default:21442145DbgPrint (ASL_DEBUG_OUTPUT, "\n**** Unknown PHAT subtable type 0x%X\n\n",2146Subtable->Type);21472148return;2149}21502151Status = AcpiDmDumpTable (Length, Offset, Subtable,2152SubtableLength, InfoTable);2153if (ACPI_FAILURE (Status))2154{2155return;2156}21572158Offset += SubtableLength;21592160OriginalOffset = Offset;2161switch (Subtable->Type)2162{2163case ACPI_PHAT_TYPE_FW_VERSION_DATA:21642165VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable);2166RecordCount = VersionData->ElementCount;2167RecordType = *ACPI_CAST_PTR (UINT8, Subtable);21682169/*2170* Skip past a zero-valued block (not part of the ACPI PHAT specification).2171* First, check for a zero length record and a zero element count2172*/2173if (!VersionData->Header.Length && !VersionData->ElementCount)2174{2175while (RecordType == 0)2176{2177Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset);2178RecordType = *ACPI_CAST_PTR (UINT8, Subtable);2179RecordCount = VersionData->ElementCount;2180Offset += 1;2181}21822183Offset -= 1;2184AcpiOsPrintf ("\n/* Warning: Block of zeros found above starting at Offset %X Length %X */\n"2185"/* (not compliant to PHAT specification -- ignoring block) */\n",2186OriginalOffset - 12, Offset - OriginalOffset + 12);2187}21882189DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, RecordCount: %X, Offset %X, SubtableLength %X */\n",2190__LINE__, RecordCount, Offset, SubtableLength);21912192/* Emit each of the version elements */21932194while (RecordCount && VersionData->Header.Length)2195{2196AcpiOsPrintf ("\n/* Version Element #%Xh Offset %Xh */\n\n",2197VersionData->ElementCount - RecordCount + 1, Offset);21982199Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset);2200Status = AcpiDmDumpTable (Length, Offset, Subtable,2201sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a);2202if (ACPI_FAILURE (Status))2203{2204return;2205}22062207Offset += sizeof (ACPI_PHAT_VERSION_ELEMENT);2208RecordCount--;2209}22102211break;22122213case ACPI_PHAT_TYPE_FW_HEALTH_DATA:22142215HealthData = ACPI_CAST_PTR (ACPI_PHAT_HEALTH_DATA, Subtable);2216PathLength = Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA);2217VendorLength = 0;22182219/* An offset of 0 should be ignored */2220if (HealthData->DeviceSpecificOffset != 0)2221{2222if (HealthData->DeviceSpecificOffset > Subtable->Length)2223{2224AcpiOsPrintf ("\n/* Warning: Oversized device-specific data offset %X */\n"2225"/* (maximum is %X -- ignoring device-specific data) */\n",2226HealthData->DeviceSpecificOffset, Subtable->Length);2227}2228else if (HealthData->DeviceSpecificOffset < sizeof (ACPI_PHAT_HEALTH_DATA))2229{2230AcpiOsPrintf ("\n/* Warning: Undersized device-specific data offset %X */\n"2231"/* (minimum is %X -- ignoring device-specific data) */\n",2232HealthData->DeviceSpecificOffset, (UINT8) sizeof (ACPI_PHAT_HEALTH_DATA));2233}2234else2235{2236PathLength = HealthData->DeviceSpecificOffset - sizeof (ACPI_PHAT_HEALTH_DATA);2237VendorLength = Subtable->Length - HealthData->DeviceSpecificOffset;2238}2239}22402241DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, PathLength %X, Offset %X */\n",2242__LINE__, PathLength, Offset);22432244if (PathLength)2245{2246Status = AcpiDmDumpTable (Length, Offset,2247ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)),2248PathLength, AcpiDmTableInfoPhat1a);2249if (ACPI_FAILURE (Status))2250{2251return;2252}22532254Offset += PathLength;2255}22562257DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, VendorLength %X, Offset %X */\n",2258__LINE__, VendorLength, Offset);22592260if (VendorLength)2261{2262Status = AcpiDmDumpTable (Length, Offset,2263ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, HealthData->DeviceSpecificOffset),2264VendorLength, AcpiDmTableInfoPhat1b);2265if (ACPI_FAILURE (Status))2266{2267return;2268}22692270Offset += VendorLength;2271}22722273break;22742275default:22762277AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",2278Subtable->Type);2279return;2280}22812282/* Next subtable */22832284DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, Bottom of main loop: Offset %X, "2285"Subtable->Length %X, Table->Length %X */\n",2286__LINE__, Offset, Subtable->Length, Table->Length);22872288Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table,2289Offset);2290}2291}229222932294/*******************************************************************************2295*2296* FUNCTION: AcpiDmDumpPmtt2297*2298* PARAMETERS: Table - A PMTT table2299*2300* RETURN: None2301*2302* DESCRIPTION: Format the contents of a PMTT. This table type consists2303* of an open-ended number of subtables.2304*2305******************************************************************************/23062307void2308AcpiDmDumpPmtt (2309ACPI_TABLE_HEADER *Table)2310{2311ACPI_STATUS Status;2312ACPI_PMTT_HEADER *Subtable;2313UINT32 Length = Table->Length;2314UINT32 Offset = sizeof (ACPI_TABLE_PMTT);231523162317/* Main table */23182319Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);2320if (ACPI_FAILURE (Status))2321{2322return;2323}23242325/* Subtables */23262327Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);2328while (Offset < Table->Length)2329{2330/* Each of the types below contain the common subtable header */23312332AcpiOsPrintf ("\n");2333switch (Subtable->Type)2334{2335case ACPI_PMTT_TYPE_SOCKET:23362337Status = AcpiDmDumpTable (Length, Offset, Subtable,2338Subtable->Length, AcpiDmTableInfoPmtt0);2339if (ACPI_FAILURE (Status))2340{2341return;2342}2343break;23442345case ACPI_PMTT_TYPE_CONTROLLER:2346Status = AcpiDmDumpTable (Length, Offset, Subtable,2347Subtable->Length, AcpiDmTableInfoPmtt1);2348if (ACPI_FAILURE (Status))2349{2350return;2351}2352break;23532354case ACPI_PMTT_TYPE_DIMM:2355Status = AcpiDmDumpTable (Length, Offset, Subtable,2356Subtable->Length, AcpiDmTableInfoPmtt2);2357if (ACPI_FAILURE (Status))2358{2359return;2360}2361break;23622363case ACPI_PMTT_TYPE_VENDOR:2364Status = AcpiDmDumpTable (Length, Offset, Subtable,2365Subtable->Length, AcpiDmTableInfoPmttVendor);2366if (ACPI_FAILURE (Status))2367{2368return;2369}2370break;23712372default:2373AcpiOsPrintf (2374"\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",2375Subtable->Type);2376return;2377}23782379/* Point to next subtable */23802381Offset += Subtable->Length;2382Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,2383Subtable, Subtable->Length);2384}2385}238623872388/*******************************************************************************2389*2390* FUNCTION: AcpiDmDumpPptt2391*2392* PARAMETERS: Table - A PMTT table2393*2394* RETURN: None2395*2396* DESCRIPTION: Format the contents of a PPTT. This table type consists2397* of an open-ended number of subtables.2398*2399******************************************************************************/24002401void2402AcpiDmDumpPptt (2403ACPI_TABLE_HEADER *Table)2404{2405ACPI_STATUS Status;2406ACPI_SUBTABLE_HEADER *Subtable;2407ACPI_PPTT_PROCESSOR *PpttProcessor;2408UINT8 Length;2409UINT8 SubtableOffset;2410UINT32 Offset = sizeof (ACPI_TABLE_FPDT);2411ACPI_DMTABLE_INFO *InfoTable;2412UINT32 i;241324142415/* There is no main table (other than the standard ACPI header) */24162417/* Subtables */24182419Offset = sizeof (ACPI_TABLE_HEADER);2420while (Offset < Table->Length)2421{2422AcpiOsPrintf ("\n");24232424/* Common subtable header */24252426Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);2427if (Subtable->Length < sizeof (ACPI_SUBTABLE_HEADER))2428{2429AcpiOsPrintf ("Invalid subtable length\n");2430return;2431}2432Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,2433Subtable->Length, AcpiDmTableInfoPpttHdr);2434if (ACPI_FAILURE (Status))2435{2436return;2437}24382439switch (Subtable->Type)2440{2441case ACPI_PPTT_TYPE_PROCESSOR:24422443InfoTable = AcpiDmTableInfoPptt0;2444Length = sizeof (ACPI_PPTT_PROCESSOR);2445break;24462447case ACPI_PPTT_TYPE_CACHE:24482449if (Table->Revision < 3)2450{2451InfoTable = AcpiDmTableInfoPptt1;2452Length = sizeof (ACPI_PPTT_CACHE);2453}2454else2455{2456InfoTable = AcpiDmTableInfoPptt1a;2457Length = sizeof (ACPI_PPTT_CACHE_V1);2458}2459break;24602461case ACPI_PPTT_TYPE_ID:24622463InfoTable = AcpiDmTableInfoPptt2;2464Length = sizeof (ACPI_PPTT_ID);2465break;24662467default:24682469AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n",2470Subtable->Type);24712472/* Attempt to continue */24732474goto NextSubtable;2475}24762477if (Subtable->Length < Length)2478{2479AcpiOsPrintf ("Invalid subtable length\n");2480return;2481}2482Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,2483Subtable->Length, InfoTable);2484if (ACPI_FAILURE (Status))2485{2486return;2487}2488SubtableOffset = Length;24892490switch (Subtable->Type)2491{2492case ACPI_PPTT_TYPE_PROCESSOR:24932494PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, Subtable);24952496/* Dump SMBIOS handles */24972498if ((UINT8)(Subtable->Length - SubtableOffset) <2499(UINT8)(PpttProcessor->NumberOfPrivResources * 4))2500{2501AcpiOsPrintf ("Invalid private resource number\n");2502return;2503}2504for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++)2505{2506Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2507ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),25084, AcpiDmTableInfoPptt0a);2509if (ACPI_FAILURE (Status))2510{2511return;2512}25132514SubtableOffset += 4;2515}2516break;2517default:25182519break;2520}25212522NextSubtable:2523/* Point to next subtable */25242525Offset += Subtable->Length;2526}2527}252825292530/*******************************************************************************2531*2532* FUNCTION: AcpiDmDumpPrmt2533*2534* PARAMETERS: Table - A PRMT table2535*2536* RETURN: None2537*2538* DESCRIPTION: Format the contents of a PRMT. This table type consists2539* of an open-ended number of subtables.2540*2541******************************************************************************/25422543void2544AcpiDmDumpPrmt (2545ACPI_TABLE_HEADER *Table)2546{2547UINT32 CurrentOffset = sizeof (ACPI_TABLE_HEADER);2548ACPI_TABLE_PRMT_HEADER *PrmtHeader;2549ACPI_PRMT_MODULE_INFO *PrmtModuleInfo;2550ACPI_PRMT_HANDLER_INFO *PrmtHandlerInfo;2551ACPI_STATUS Status;2552UINT32 i, j;255325542555/* Main table header */25562557PrmtHeader = ACPI_ADD_PTR (ACPI_TABLE_PRMT_HEADER, Table, CurrentOffset);2558Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHeader,2559sizeof (ACPI_TABLE_PRMT_HEADER), AcpiDmTableInfoPrmtHdr);2560if (ACPI_FAILURE (Status))2561{2562AcpiOsPrintf ("Invalid PRMT header\n");2563return;2564}25652566CurrentOffset += sizeof (ACPI_TABLE_PRMT_HEADER);25672568/* PRM Module Information Structure array */25692570for (i = 0; i < PrmtHeader->ModuleInfoCount; ++i)2571{2572PrmtModuleInfo = ACPI_ADD_PTR (ACPI_PRMT_MODULE_INFO, Table, CurrentOffset);2573Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtModuleInfo,2574sizeof (ACPI_PRMT_MODULE_INFO), AcpiDmTableInfoPrmtModule);25752576CurrentOffset += sizeof (ACPI_PRMT_MODULE_INFO);25772578/* PRM handler information structure array */25792580for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; ++j)2581{2582PrmtHandlerInfo = ACPI_ADD_PTR (ACPI_PRMT_HANDLER_INFO, Table, CurrentOffset);2583Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHandlerInfo,2584sizeof (ACPI_PRMT_HANDLER_INFO), AcpiDmTableInfoPrmtHandler);25852586CurrentOffset += sizeof (ACPI_PRMT_HANDLER_INFO);2587}2588}2589}259025912592/*******************************************************************************2593*2594* FUNCTION: AcpiDmDumpRas22595*2596* PARAMETERS: Table - A RAS2 table2597*2598* RETURN: None2599*2600* DESCRIPTION: Format the contents of a Ras2. This is a variable-length2601* table that contains an open-ended number of the RAS2 PCC2602* descriptors at the end of the table.2603*2604******************************************************************************/26052606void2607AcpiDmDumpRas2 (2608ACPI_TABLE_HEADER *Table)2609{2610ACPI_STATUS Status;2611ACPI_RAS2_PCC_DESC *Subtable;2612UINT32 Length = Table->Length;2613UINT32 Offset = sizeof (ACPI_TABLE_RAS2);261426152616/* Main table */26172618Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRas2);2619if (ACPI_FAILURE (Status))2620{2621return;2622}26232624/* Subtables - RAS2 PCC descriptor list */26252626Subtable = ACPI_ADD_PTR (ACPI_RAS2_PCC_DESC, Table, Offset);2627while (Offset < Table->Length)2628{2629AcpiOsPrintf ("\n");2630Status = AcpiDmDumpTable (Length, Offset, Subtable,2631sizeof (ACPI_RAS2_PCC_DESC), AcpiDmTableInfoRas2PccDesc);2632if (ACPI_FAILURE (Status))2633{2634return;2635}26362637/* Point to next subtable */26382639Offset += sizeof (ACPI_RAS2_PCC_DESC);2640Subtable = ACPI_ADD_PTR (ACPI_RAS2_PCC_DESC, Subtable,2641sizeof (ACPI_RAS2_PCC_DESC));2642}2643}264426452646/*******************************************************************************2647*2648* FUNCTION: AcpiDmDumpRgrt2649*2650* PARAMETERS: Table - A RGRT table2651*2652* RETURN: None2653*2654* DESCRIPTION: Format the contents of a RGRT2655*2656******************************************************************************/26572658void2659AcpiDmDumpRgrt (2660ACPI_TABLE_HEADER *Table)2661{2662ACPI_STATUS Status;2663ACPI_TABLE_RGRT *Subtable = ACPI_CAST_PTR (ACPI_TABLE_RGRT, Table);2664UINT32 Offset = sizeof (ACPI_TABLE_RGRT);266526662667/* Main table */26682669Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoRgrt);2670if (ACPI_FAILURE (Status))2671{2672return;2673}26742675/* Dump the binary image as a subtable */26762677Status = AcpiDmDumpTable (Table->Length, Offset, &Subtable->Image,2678Table->Length - Offset, AcpiDmTableInfoRgrt0);2679if (ACPI_FAILURE (Status))2680{2681return;2682}2683}268426852686/*******************************************************************************2687*2688* FUNCTION: AcpiDmDumpRhct2689*2690* PARAMETERS: Table - A RHCT table2691*2692* RETURN: None2693*2694* DESCRIPTION: Format the contents of a RHCT.2695*2696******************************************************************************/26972698void2699AcpiDmDumpRhct (2700ACPI_TABLE_HEADER *Table)2701{2702ACPI_STATUS Status;2703ACPI_RHCT_NODE_HEADER *Subtable;2704ACPI_RHCT_HART_INFO *RhctHartInfo;2705ACPI_RHCT_ISA_STRING *RhctIsaString;2706ACPI_RHCT_CMO_NODE *RhctCmoNode;2707ACPI_RHCT_MMU_NODE *RhctMmuNode;2708UINT32 Length = Table->Length;2709UINT8 SubtableOffset, IsaPadOffset;2710UINT32 Offset = sizeof (ACPI_TABLE_RHCT);2711UINT32 i;27122713/* Main table */27142715Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRhct);2716if (ACPI_FAILURE (Status))2717{2718return;2719}27202721/* Subtables */27222723while (Offset < Table->Length)2724{2725AcpiOsPrintf ("\n");27262727/* Common subtable header */27282729Subtable = ACPI_ADD_PTR (ACPI_RHCT_NODE_HEADER, Table, Offset);2730if (Subtable->Length < sizeof (ACPI_RHCT_NODE_HEADER))2731{2732AcpiOsPrintf ("Invalid subtable length\n");2733return;2734}2735Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,2736Subtable->Length, AcpiDmTableInfoRhctNodeHdr);2737if (ACPI_FAILURE (Status))2738{2739return;2740}27412742Length = sizeof (ACPI_RHCT_NODE_HEADER);27432744if (Subtable->Length < Length)2745{2746AcpiOsPrintf ("Invalid subtable length\n");2747return;2748}2749SubtableOffset = (UINT8) Length;27502751switch (Subtable->Type)2752{2753case ACPI_RHCT_NODE_TYPE_HART_INFO:2754Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2755ACPI_ADD_PTR (ACPI_RHCT_HART_INFO, Subtable, SubtableOffset),2756sizeof (ACPI_RHCT_HART_INFO), AcpiDmTableInfoRhctHartInfo1);27572758RhctHartInfo = ACPI_ADD_PTR (ACPI_RHCT_HART_INFO, Subtable, SubtableOffset);27592760if ((UINT16)(Subtable->Length - SubtableOffset) <2761(UINT16)(RhctHartInfo->NumOffsets * 4))2762{2763AcpiOsPrintf ("Invalid number of offsets\n");2764return;2765}2766SubtableOffset += sizeof (ACPI_RHCT_HART_INFO);2767for (i = 0; i < RhctHartInfo->NumOffsets; i++)2768{2769Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2770ACPI_ADD_PTR (UINT32, Subtable, SubtableOffset),27714, AcpiDmTableInfoRhctHartInfo2);2772if (ACPI_FAILURE (Status))2773{2774return;2775}27762777SubtableOffset += 4;2778}2779break;27802781case ACPI_RHCT_NODE_TYPE_ISA_STRING:2782RhctIsaString = ACPI_ADD_PTR (ACPI_RHCT_ISA_STRING, Subtable, SubtableOffset);2783IsaPadOffset = (UINT8) (SubtableOffset + 2 + RhctIsaString->IsaLength);2784Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2785RhctIsaString, RhctIsaString->IsaLength, AcpiDmTableInfoRhctIsa1);2786if (Subtable->Length > IsaPadOffset)2787{2788Status = AcpiDmDumpTable (Table->Length, Offset + IsaPadOffset,2789ACPI_ADD_PTR (UINT8, Subtable, IsaPadOffset),2790(Subtable->Length - IsaPadOffset), AcpiDmTableInfoRhctIsaPad);2791}27922793break;27942795case ACPI_RHCT_NODE_TYPE_CMO:2796RhctCmoNode = ACPI_ADD_PTR (ACPI_RHCT_CMO_NODE, Subtable, SubtableOffset);2797Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2798RhctCmoNode, 4, AcpiDmTableInfoRhctCmo1);2799break;28002801case ACPI_RHCT_NODE_TYPE_MMU:2802RhctMmuNode = ACPI_ADD_PTR (ACPI_RHCT_MMU_NODE, Subtable, SubtableOffset);2803Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2804RhctMmuNode, 2, AcpiDmTableInfoRhctMmu1);2805break;28062807default:2808break;2809}28102811/* Point to next subtable */28122813Offset += Subtable->Length;2814}2815}28162817/*******************************************************************************2818*2819* FUNCTION: AcpiDmDumpRimt2820*2821* PARAMETERS: Table - A RIMT table2822*2823* RETURN: None2824*2825* DESCRIPTION: Format the contents of a RIMT.2826*2827******************************************************************************/28282829void2830AcpiDmDumpRimt (2831ACPI_TABLE_HEADER *Table)2832{2833ACPI_RIMT_PLATFORM_DEVICE *PlatNode;2834ACPI_RIMT_PCIE_RC *PcieNode;2835ACPI_RIMT_NODE *Subtable;2836ACPI_STATUS Status;2837UINT32 Length = Table->Length;2838UINT16 SubtableOffset;2839UINT32 NodeOffset;2840UINT16 i;2841UINT32 Offset = sizeof (ACPI_TABLE_RIMT);28422843/* Main table */28442845Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRimt);2846if (ACPI_FAILURE (Status))2847{2848return;2849}28502851/* Subtables */28522853while (Offset < Table->Length)2854{2855AcpiOsPrintf ("\n");28562857/* Common subtable header */28582859Subtable = ACPI_ADD_PTR (ACPI_RIMT_NODE, Table, Offset);2860if (Subtable->Length < sizeof (ACPI_RIMT_NODE))2861{2862AcpiOsPrintf ("Invalid subtable length\n");2863return;2864}2865Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,2866Subtable->Length, AcpiDmTableInfoRimtNodeHdr);2867if (ACPI_FAILURE (Status))2868{2869return;2870}28712872Length = sizeof (ACPI_RIMT_NODE);28732874if (Subtable->Length < Length)2875{2876AcpiOsPrintf ("Invalid subtable length\n");2877return;2878}2879SubtableOffset = (UINT16) Length;28802881switch (Subtable->Type)2882{2883case ACPI_RIMT_NODE_TYPE_IOMMU:2884Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2885ACPI_ADD_PTR (ACPI_RIMT_IOMMU, Subtable, SubtableOffset),2886sizeof (ACPI_RIMT_IOMMU), AcpiDmTableInfoRimtIommu);28872888break;28892890case ACPI_RIMT_NODE_TYPE_PCIE_ROOT_COMPLEX:2891Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2892ACPI_ADD_PTR (ACPI_RIMT_PCIE_RC, Subtable, SubtableOffset),2893sizeof (ACPI_RIMT_PCIE_RC), AcpiDmTableInfoRimtPcieRc);28942895PcieNode = ACPI_ADD_PTR (ACPI_RIMT_PCIE_RC, Subtable, SubtableOffset);28962897/* Dump the ID mappings */2898NodeOffset = PcieNode->IdMappingOffset;2899for (i = 0; i < PcieNode->NumIdMappings; i++)2900{2901AcpiOsPrintf ("\n");2902Length = sizeof (ACPI_RIMT_ID_MAPPING);2903Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,2904ACPI_ADD_PTR (ACPI_RIMT_ID_MAPPING, Subtable, NodeOffset),2905Length, AcpiDmTableInfoRimtIdMapping);2906if (ACPI_FAILURE (Status))2907{2908return;2909}29102911NodeOffset += Length;2912}2913break;29142915case ACPI_RIMT_NODE_TYPE_PLAT_DEVICE:2916Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2917ACPI_ADD_PTR (ACPI_RIMT_PLATFORM_DEVICE, Subtable, SubtableOffset),2918sizeof (ACPI_RIMT_PLATFORM_DEVICE), AcpiDmTableInfoRimtPlatDev);2919PlatNode = ACPI_ADD_PTR (ACPI_RIMT_PLATFORM_DEVICE, Subtable, SubtableOffset);29202921/* Dump the ID mappings */2922NodeOffset = PlatNode->IdMappingOffset;2923for (i = 0; i < PlatNode->NumIdMappings; i++)2924{2925AcpiOsPrintf ("\n");2926Length = sizeof (ACPI_RIMT_ID_MAPPING);2927Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,2928ACPI_ADD_PTR (ACPI_RIMT_ID_MAPPING, Subtable, NodeOffset),2929Length, AcpiDmTableInfoRimtIdMapping);2930if (ACPI_FAILURE (Status))2931{2932return;2933}29342935NodeOffset += Length;2936}2937break;29382939default:2940break;2941}29422943/* Point to next subtable */29442945Offset += Subtable->Length;2946}2947}294829492950/*******************************************************************************2951*2952* FUNCTION: AcpiDmDumpS3pt2953*2954* PARAMETERS: Table - A S3PT table2955*2956* RETURN: Length of the table2957*2958* DESCRIPTION: Format the contents of a S3PT2959*2960******************************************************************************/29612962UINT322963AcpiDmDumpS3pt (2964ACPI_TABLE_HEADER *Tables)2965{2966ACPI_STATUS Status;2967UINT32 Offset = sizeof (ACPI_TABLE_S3PT);2968ACPI_FPDT_HEADER *Subtable;2969ACPI_DMTABLE_INFO *InfoTable;2970ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);297129722973/* Main table */29742975Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);2976if (ACPI_FAILURE (Status))2977{2978return 0;2979}29802981Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);2982while (Offset < S3ptTable->Length)2983{2984/* Common subtable header */29852986AcpiOsPrintf ("\n");2987Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,2988Subtable->Length, AcpiDmTableInfoS3ptHdr);2989if (ACPI_FAILURE (Status))2990{2991return 0;2992}29932994switch (Subtable->Type)2995{2996case ACPI_S3PT_TYPE_RESUME:29972998InfoTable = AcpiDmTableInfoS3pt0;2999break;30003001case ACPI_S3PT_TYPE_SUSPEND:30023003InfoTable = AcpiDmTableInfoS3pt1;3004break;30053006default:30073008AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n",3009Subtable->Type);30103011/* Attempt to continue */30123013if (!Subtable->Length)3014{3015AcpiOsPrintf ("Invalid zero length subtable\n");3016return 0;3017}3018goto NextSubtable;3019}30203021AcpiOsPrintf ("\n");3022Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,3023Subtable->Length, InfoTable);3024if (ACPI_FAILURE (Status))3025{3026return 0;3027}30283029NextSubtable:3030/* Point to next subtable */30313032Offset += Subtable->Length;3033Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length);3034}30353036return (S3ptTable->Length);3037}303830393040/*******************************************************************************3041*3042* FUNCTION: AcpiDmDumpSdev3043*3044* PARAMETERS: Table - A SDEV table3045*3046* RETURN: None3047*3048* DESCRIPTION: Format the contents of a SDEV. This is a variable-length3049* table that contains variable strings and vendor data.3050*3051******************************************************************************/30523053void3054AcpiDmDumpSdev (3055ACPI_TABLE_HEADER *Table)3056{3057ACPI_STATUS Status;3058ACPI_SDEV_HEADER *Subtable;3059ACPI_SDEV_PCIE *Pcie;3060ACPI_SDEV_NAMESPACE *Namesp;3061ACPI_DMTABLE_INFO *InfoTable;3062ACPI_DMTABLE_INFO *SecureComponentInfoTable;3063UINT32 Length = Table->Length;3064UINT32 Offset = sizeof (ACPI_TABLE_SDEV);3065UINT16 PathOffset;3066UINT16 PathLength;3067UINT16 VendorDataOffset;3068UINT16 VendorDataLength;3069ACPI_SDEV_SECURE_COMPONENT *SecureComponent = NULL;3070UINT32 CurrentOffset = 0;307130723073/* Main table */30743075Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev);3076if (ACPI_FAILURE (Status))3077{3078return;3079}30803081/* Subtables */30823083Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset);3084while (Offset < Table->Length)3085{3086/* Common subtable header */30873088AcpiOsPrintf ("\n");3089Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,3090Subtable->Length, AcpiDmTableInfoSdevHdr);3091if (ACPI_FAILURE (Status))3092{3093return;3094}30953096switch (Subtable->Type)3097{3098case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:30993100InfoTable = AcpiDmTableInfoSdev0;3101break;31023103case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:31043105InfoTable = AcpiDmTableInfoSdev1;3106break;31073108default:3109goto NextSubtable;3110}31113112AcpiOsPrintf ("\n");3113Status = AcpiDmDumpTable (Table->Length, 0, Subtable,3114Subtable->Length, InfoTable);3115if (ACPI_FAILURE (Status))3116{3117return;3118}31193120switch (Subtable->Type)3121{3122case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:31233124CurrentOffset = sizeof (ACPI_SDEV_NAMESPACE);3125if (Subtable->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)3126{3127SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,3128ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)));31293130Status = AcpiDmDumpTable (Table->Length, CurrentOffset,3131ACPI_ADD_PTR(UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)),3132sizeof (ACPI_SDEV_SECURE_COMPONENT), AcpiDmTableInfoSdev0b);3133if (ACPI_FAILURE (Status))3134{3135return;3136}3137CurrentOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);31383139Status = AcpiDmDumpTable (Table->Length, CurrentOffset,3140ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),3141sizeof (ACPI_SDEV_HEADER), AcpiDmTableInfoSdevSecCompHdr);3142if (ACPI_FAILURE (Status))3143{3144return;3145}3146CurrentOffset += sizeof (ACPI_SDEV_HEADER);31473148switch (Subtable->Type)3149{3150case ACPI_SDEV_TYPE_ID_COMPONENT:31513152SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;3153break;31543155case ACPI_SDEV_TYPE_MEM_COMPONENT:31563157SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;3158break;31593160default:3161goto NextSubtable;3162}31633164Status = AcpiDmDumpTable (Table->Length, CurrentOffset,3165ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),3166SecureComponent->SecureComponentLength, SecureComponentInfoTable);3167CurrentOffset += SecureComponent->SecureComponentLength;3168}31693170/* Dump the PCIe device ID(s) */31713172Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);3173PathOffset = Namesp->DeviceIdOffset;3174PathLength = Namesp->DeviceIdLength;31753176if (PathLength)3177{3178Status = AcpiDmDumpTable (Table->Length, CurrentOffset,3179ACPI_ADD_PTR (UINT8, Namesp, PathOffset),3180PathLength, AcpiDmTableInfoSdev0a);3181if (ACPI_FAILURE (Status))3182{3183return;3184}3185CurrentOffset += PathLength;3186}31873188/* Dump the vendor-specific data */31893190VendorDataLength =3191Namesp->VendorDataLength;3192VendorDataOffset =3193Namesp->DeviceIdOffset + Namesp->DeviceIdLength;31943195if (VendorDataLength)3196{3197Status = AcpiDmDumpTable (Table->Length, 0,3198ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset),3199VendorDataLength, AcpiDmTableInfoSdev1b);3200if (ACPI_FAILURE (Status))3201{3202return;3203}3204}3205break;32063207case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:32083209/* PCI path substructures */32103211Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable);3212PathOffset = Pcie->PathOffset;3213PathLength = Pcie->PathLength;32143215while (PathLength)3216{3217Status = AcpiDmDumpTable (Table->Length,3218PathOffset + Offset,3219ACPI_ADD_PTR (UINT8, Pcie, PathOffset),3220sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a);3221if (ACPI_FAILURE (Status))3222{3223return;3224}32253226PathOffset += sizeof (ACPI_SDEV_PCIE_PATH);3227PathLength -= sizeof (ACPI_SDEV_PCIE_PATH);3228}32293230/* VendorData */32313232VendorDataLength = Pcie->VendorDataLength;3233VendorDataOffset = Pcie->PathOffset + Pcie->PathLength;32343235if (VendorDataLength)3236{3237Status = AcpiDmDumpTable (Table->Length, 0,3238ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset),3239VendorDataLength, AcpiDmTableInfoSdev1b);3240if (ACPI_FAILURE (Status))3241{3242return;3243}3244}3245break;32463247default:3248goto NextSubtable;3249}32503251NextSubtable:3252/* Point to next subtable */32533254Offset += Subtable->Length;3255Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable,3256Subtable->Length);3257}3258}325932603261