Path: blob/main/sys/contrib/dev/acpica/common/dmtbdump1.c
48378 views
/******************************************************************************1*2* Module Name: dmtbdump1 - 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 <contrib/dev/acpica/include/acpi.h>152#include <contrib/dev/acpica/include/accommon.h>153#include <contrib/dev/acpica/include/acdisasm.h>154#include <contrib/dev/acpica/include/actables.h>155#include <contrib/dev/acpica/compiler/aslcompiler.h>156157/* This module used for application-level code only */158159#define _COMPONENT ACPI_CA_DISASSEMBLER160ACPI_MODULE_NAME ("dmtbdump1")161162163/*******************************************************************************164*165* FUNCTION: AcpiDmDumpAest166*167* PARAMETERS: Table - A AEST table168*169* RETURN: None170*171* DESCRIPTION: Format the contents of a AEST table172*173* NOTE: Assumes the following table structure:174* For all AEST Error Nodes:175* 1) An AEST Error Node, followed immediately by:176* 2) Any node-specific data177* 3) An Interface Structure (one)178* 4) A list (array) of Interrupt Structures179*180* AEST - ARM Error Source table. Conforms to:181* ACPI for the Armv8 RAS Extensions 1.1 Platform Design Document Sep 2020182*183******************************************************************************/184185void186AcpiDmDumpAest (187ACPI_TABLE_HEADER *Table)188{189ACPI_STATUS Status;190UINT32 Offset = sizeof (ACPI_TABLE_HEADER);191ACPI_AEST_HEADER *Subtable;192ACPI_AEST_HEADER *NodeHeader;193ACPI_AEST_PROCESSOR *ProcessorSubtable;194ACPI_DMTABLE_INFO *InfoTable;195ACPI_SIZE Length;196UINT8 Type;197UINT8 Revision = Table->Revision;198UINT32 Count;199ACPI_AEST_NODE_INTERFACE_HEADER *InterfaceHeader;200201202/* Very small, generic main table. AEST consists of mostly subtables */203204while (Offset < Table->Length)205{206NodeHeader = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);207208/* Dump the common error node (subtable) header */209210Status = AcpiDmDumpTable (Table->Length, Offset, NodeHeader,211NodeHeader->Length, AcpiDmTableInfoAestHdr);212if (ACPI_FAILURE (Status))213{214return;215}216217Type = NodeHeader->Type;218219/* Setup the node-specific subtable based on the header Type field */220221switch (Type)222{223case ACPI_AEST_PROCESSOR_ERROR_NODE:224InfoTable = AcpiDmTableInfoAestProcError;225Length = sizeof (ACPI_AEST_PROCESSOR);226break;227228case ACPI_AEST_MEMORY_ERROR_NODE:229InfoTable = AcpiDmTableInfoAestMemError;230Length = sizeof (ACPI_AEST_MEMORY);231break;232233case ACPI_AEST_SMMU_ERROR_NODE:234InfoTable = AcpiDmTableInfoAestSmmuError;235Length = sizeof (ACPI_AEST_SMMU);236break;237238case ACPI_AEST_VENDOR_ERROR_NODE:239switch (Revision)240{241case 1:242InfoTable = AcpiDmTableInfoAestVendorError;243Length = sizeof (ACPI_AEST_VENDOR);244break;245246case 2:247InfoTable = AcpiDmTableInfoAestVendorV2Error;248Length = sizeof (ACPI_AEST_VENDOR_V2);249break;250251default:252AcpiOsPrintf ("\n**** Unknown AEST revision 0x%X\n", Revision);253return;254}255break;256257case ACPI_AEST_GIC_ERROR_NODE:258InfoTable = AcpiDmTableInfoAestGicError;259Length = sizeof (ACPI_AEST_GIC);260break;261262case ACPI_AEST_PCIE_ERROR_NODE:263InfoTable = AcpiDmTableInfoAestPCIeError;264Length = sizeof (ACPI_AEST_PCIE);265break;266267case ACPI_AEST_PROXY_ERROR_NODE:268InfoTable = AcpiDmTableInfoAestProxyError;269Length = sizeof (ACPI_AEST_PROXY);270break;271272/* Error case below */273default:274275AcpiOsPrintf ("\n**** Unknown AEST Error Subtable type 0x%X\n",276Type);277return;278}279280/* Point past the common header (to the node-specific data) */281282Offset += sizeof (ACPI_AEST_HEADER);283Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);284AcpiOsPrintf ("\n");285286/* Dump the node-specific subtable */287288Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length,289InfoTable);290if (ACPI_FAILURE (Status))291{292return;293}294AcpiOsPrintf ("\n");295296if (Type == ACPI_AEST_PROCESSOR_ERROR_NODE)297{298/*299* Special handling for PROCESSOR_ERROR_NODE subtables300* (to handle the Resource Substructure via the ResourceType301* field).302*/303304/* Point past the node-specific data */305306Offset += Length;307ProcessorSubtable = ACPI_CAST_PTR (ACPI_AEST_PROCESSOR, Subtable);308309switch (ProcessorSubtable->ResourceType)310{311/* Setup the Resource Substructure subtable */312313case ACPI_AEST_CACHE_RESOURCE:314InfoTable = AcpiDmTableInfoAestCacheRsrc;315Length = sizeof (ACPI_AEST_PROCESSOR_CACHE);316break;317318case ACPI_AEST_TLB_RESOURCE:319InfoTable = AcpiDmTableInfoAestTlbRsrc;320Length = sizeof (ACPI_AEST_PROCESSOR_TLB);321break;322323case ACPI_AEST_GENERIC_RESOURCE:324InfoTable = AcpiDmTableInfoAestGenRsrc;325Length = sizeof (ACPI_AEST_PROCESSOR_GENERIC);326break;327328/* Error case below */329default:330AcpiOsPrintf ("\n**** Unknown AEST Processor Resource type 0x%X\n",331ProcessorSubtable->ResourceType);332return;333}334335ProcessorSubtable = ACPI_ADD_PTR (ACPI_AEST_PROCESSOR, Table,336Offset);337338/* Dump the resource substructure subtable */339340Status = AcpiDmDumpTable (Table->Length, Offset, ProcessorSubtable,341Length, InfoTable);342if (ACPI_FAILURE (Status))343{344return;345}346347AcpiOsPrintf ("\n");348}349350/* Point past the resource substructure or the node-specific data */351352Offset += Length;353354/* Dump the interface structure, required to be present */355356Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);357if (Subtable->Type >= ACPI_AEST_XFACE_RESERVED)358{359AcpiOsPrintf ("\n**** Unknown AEST Node Interface type 0x%X\n",360Subtable->Type);361return;362}363364if (Revision == 1)365{366InfoTable = AcpiDmTableInfoAestXface;367Length = sizeof (ACPI_AEST_NODE_INTERFACE);368}369else if (Revision == 2)370{371InfoTable = AcpiDmTableInfoAestXfaceHeader;372Length = sizeof (ACPI_AEST_NODE_INTERFACE_HEADER);373374Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length, InfoTable);375if (ACPI_FAILURE (Status))376{377return;378}379380Offset += Length;381382InterfaceHeader = ACPI_CAST_PTR (ACPI_AEST_NODE_INTERFACE_HEADER, Subtable);383switch (InterfaceHeader->GroupFormat)384{385case ACPI_AEST_NODE_GROUP_FORMAT_4K:386InfoTable = AcpiDmTableInfoAestXface4k;387Length = sizeof (ACPI_AEST_NODE_INTERFACE_4K);388break;389390case ACPI_AEST_NODE_GROUP_FORMAT_16K:391InfoTable = AcpiDmTableInfoAestXface16k;392Length = sizeof (ACPI_AEST_NODE_INTERFACE_16K);393break;394395case ACPI_AEST_NODE_GROUP_FORMAT_64K:396InfoTable = AcpiDmTableInfoAestXface64k;397Length = sizeof (ACPI_AEST_NODE_INTERFACE_64K);398break;399400default:401AcpiOsPrintf ("\n**** Unknown AEST Interface Group Format 0x%X\n",402InterfaceHeader->GroupFormat);403return;404}405406Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);407}408else409{410AcpiOsPrintf ("\n**** Unknown AEST revision 0x%X\n", Revision);411return;412}413414Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length, InfoTable);415if (ACPI_FAILURE (Status))416{417return;418}419420/* Point past the interface structure */421422AcpiOsPrintf ("\n");423Offset += Length;424425/* Dump the entire interrupt structure array, if present */426427if (NodeHeader->NodeInterruptOffset)428{429Count = NodeHeader->NodeInterruptCount;430Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);431432while (Count)433{434/* Dump the interrupt structure */435436switch (Revision) {437case 1:438InfoTable = AcpiDmTableInfoAestXrupt;439Length = sizeof (ACPI_AEST_NODE_INTERRUPT);440break;441442case 2:443InfoTable = AcpiDmTableInfoAestXruptV2;444Length = sizeof (ACPI_AEST_NODE_INTERRUPT_V2);445break;446default:447AcpiOsPrintf ("\n**** Unknown AEST revision 0x%X\n",448Revision);449return;450}451Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,452Length, InfoTable);453if (ACPI_FAILURE (Status))454{455return;456}457458/* Point to the next interrupt structure */459460Offset += Length;461Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);462Count--;463AcpiOsPrintf ("\n");464}465}466}467}468469/*******************************************************************************470*471* FUNCTION: AcpiDmDumpApmt472*473* PARAMETERS: Table - A APMT table474*475* RETURN: None476*477* DESCRIPTION: Format the contents of a APMT. This table type consists478* of an open-ended number of subtables.479*480*481* APMT - ARM Performance Monitoring Unit table. Conforms to:482* ARM Performance Monitoring Unit Architecture 1.0 Platform Design Document483* ARM DEN0117 v1.0 November 25, 2021484*485******************************************************************************/486487void488AcpiDmDumpApmt (489ACPI_TABLE_HEADER *Table)490{491ACPI_STATUS Status;492ACPI_APMT_NODE *Subtable;493UINT32 Length = Table->Length;494UINT32 Offset = sizeof (ACPI_TABLE_APMT);495UINT32 NodeNum = 0;496497/* There is no main table (other than the standard ACPI header) */498499/* Subtables */500501Subtable = ACPI_ADD_PTR (ACPI_APMT_NODE, Table, Offset);502while (Offset < Table->Length)503{504AcpiOsPrintf ("\n");505506if (Subtable->Type >= ACPI_APMT_NODE_TYPE_COUNT)507{508AcpiOsPrintf ("\n**** Unknown APMT subtable type 0x%X\n",509Subtable->Type);510return;511}512513AcpiOsPrintf ("/* APMT Node-%u */\n", NodeNum++);514515Status = AcpiDmDumpTable (Length, Offset, Subtable,516Subtable->Length, AcpiDmTableInfoApmtNode);517if (ACPI_FAILURE (Status))518{519return;520}521522/* Point to next subtable */523524Offset += Subtable->Length;525Subtable = ACPI_ADD_PTR (ACPI_APMT_NODE, Subtable,526Subtable->Length);527AcpiOsPrintf ("\n");528}529}530531532/*******************************************************************************533*534* FUNCTION: AcpiDmDumpAsf535*536* PARAMETERS: Table - A ASF table537*538* RETURN: None539*540* DESCRIPTION: Format the contents of a ASF table541*542******************************************************************************/543544void545AcpiDmDumpAsf (546ACPI_TABLE_HEADER *Table)547{548ACPI_STATUS Status;549UINT32 Offset = sizeof (ACPI_TABLE_HEADER);550ACPI_ASF_INFO *Subtable;551ACPI_DMTABLE_INFO *InfoTable;552ACPI_DMTABLE_INFO *DataInfoTable = NULL;553UINT8 *DataTable = NULL;554UINT32 DataCount = 0;555UINT32 DataLength = 0;556UINT32 DataOffset = 0;557UINT32 i;558UINT8 Type;559560561/* No main table, only subtables */562563Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);564while (Offset < Table->Length)565{566/* Common subtable header */567568Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,569Subtable->Header.Length, AcpiDmTableInfoAsfHdr);570if (ACPI_FAILURE (Status))571{572return;573}574575/* The actual type is the lower 7 bits of Type */576577Type = (UINT8) (Subtable->Header.Type & 0x7F);578579switch (Type)580{581case ACPI_ASF_TYPE_INFO:582583InfoTable = AcpiDmTableInfoAsf0;584break;585586case ACPI_ASF_TYPE_ALERT:587588InfoTable = AcpiDmTableInfoAsf1;589DataInfoTable = AcpiDmTableInfoAsf1a;590DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ALERT));591DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->Alerts;592DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->DataLength;593DataOffset = Offset + sizeof (ACPI_ASF_ALERT);594break;595596case ACPI_ASF_TYPE_CONTROL:597598InfoTable = AcpiDmTableInfoAsf2;599DataInfoTable = AcpiDmTableInfoAsf2a;600DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_REMOTE));601DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->Controls;602DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->DataLength;603DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);604break;605606case ACPI_ASF_TYPE_BOOT:607608InfoTable = AcpiDmTableInfoAsf3;609break;610611case ACPI_ASF_TYPE_ADDRESS:612613InfoTable = AcpiDmTableInfoAsf4;614DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ADDRESS));615DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, Subtable)->Devices;616DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);617break;618619default:620621AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n",622Subtable->Header.Type);623return;624}625626Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,627Subtable->Header.Length, InfoTable);628if (ACPI_FAILURE (Status))629{630return;631}632633/* Dump variable-length extra data */634635switch (Type)636{637case ACPI_ASF_TYPE_ALERT:638case ACPI_ASF_TYPE_CONTROL:639640for (i = 0; i < DataCount; i++)641{642AcpiOsPrintf ("\n");643Status = AcpiDmDumpTable (Table->Length, DataOffset,644DataTable, DataLength, DataInfoTable);645if (ACPI_FAILURE (Status))646{647return;648}649650DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);651DataOffset += DataLength;652}653break;654655case ACPI_ASF_TYPE_ADDRESS:656657for (i = 0; i < DataLength; i++)658{659if (!(i % 16))660{661AcpiDmLineHeader (DataOffset, 1, "Addresses");662}663664AcpiOsPrintf ("%2.2X ", *DataTable);665DataTable++;666DataOffset++;667668if (DataOffset > Table->Length)669{670AcpiOsPrintf (671"**** ACPI table terminates in the middle of a "672"data structure! (ASF! table)\n");673return;674}675}676677AcpiOsPrintf ("\n");678break;679680default:681682break;683}684685AcpiOsPrintf ("\n");686687/* Point to next subtable */688689if (!Subtable->Header.Length)690{691AcpiOsPrintf ("Invalid zero subtable header length\n");692return;693}694695Offset += Subtable->Header.Length;696Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Subtable,697Subtable->Header.Length);698}699}700701/*******************************************************************************702*703* FUNCTION: AcpiDmDumpAspt704*705* PARAMETERS: Table - A ASPT table706*707* RETURN: None708*709* DESCRIPTION: Format the contents of a ASPT table710*711******************************************************************************/712713void714AcpiDmDumpAspt (715ACPI_TABLE_HEADER *Table)716{717ACPI_STATUS Status;718UINT32 Offset = sizeof (ACPI_TABLE_ASPT);719UINT32 Length = Table->Length;720ACPI_ASPT_HEADER *Subtable;721ACPI_DMTABLE_INFO *InfoTable;722UINT16 Type;723724/* Main table */725Status = AcpiDmDumpTable(Length, 0, Table, 0, AcpiDmTableInfoAspt);726727/* Subtables */728729Subtable = ACPI_ADD_PTR (ACPI_ASPT_HEADER, Table, Offset);730while (Offset < Table->Length)731{732AcpiOsPrintf ("\n");733734/* Common subtable header */735Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,736Subtable->Length, AcpiDmTableInfoAsptHdr);737if (ACPI_FAILURE (Status))738{739return;740}741742Type = Subtable->Type;743744switch (Type)745{746case ACPI_ASPT_TYPE_GLOBAL_REGS:747748InfoTable = AcpiDmTableInfoAspt0;749break;750751case ACPI_ASPT_TYPE_SEV_MBOX_REGS:752753InfoTable = AcpiDmTableInfoAspt1;754break;755756case ACPI_ASPT_TYPE_ACPI_MBOX_REGS:757758InfoTable = AcpiDmTableInfoAspt2;759break;760761default:762763AcpiOsPrintf ("\n**** Unknown ASPT subtable type 0x%X\n",764Subtable->Type);765return;766}767768Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,769Subtable->Length, InfoTable);770if (ACPI_FAILURE (Status))771{772return;773}774775AcpiOsPrintf ("\n");776777/* Point to next subtable */778if (!Subtable->Length)779{780AcpiOsPrintf ("Invalid zero subtable header length\n");781return;782}783784Offset += Subtable->Length;785Subtable = ACPI_ADD_PTR (ACPI_ASPT_HEADER, Subtable,786Subtable->Length);787}788}789790791/*******************************************************************************792*793* FUNCTION: AcpiDmDumpCdat794*795* PARAMETERS: InTable - A CDAT table796*797* RETURN: None798*799* DESCRIPTION: Format the contents of a CDAT. This table type consists800* of an open-ended number of subtables.801*802******************************************************************************/803804void805AcpiDmDumpCdat (806ACPI_TABLE_HEADER *InTable)807{808ACPI_TABLE_CDAT *Table = ACPI_CAST_PTR (ACPI_TABLE_CDAT, InTable);809ACPI_STATUS Status;810ACPI_CDAT_HEADER *Subtable;811ACPI_TABLE_CDAT *CdatTable = ACPI_CAST_PTR (ACPI_TABLE_CDAT, Table);812ACPI_DMTABLE_INFO *InfoTable;813UINT32 Length = CdatTable->Length;814UINT32 Offset = sizeof (ACPI_TABLE_CDAT);815UINT32 SubtableLength;816UINT32 SubtableType;817INT32 EntriesLength;818819820/* Main table */821822Status = AcpiDmDumpTable (Offset, 0, CdatTable, 0,823AcpiDmTableInfoCdatTableHdr);824if (ACPI_FAILURE (Status))825{826return;827}828829Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, sizeof (ACPI_TABLE_CDAT));830while (Offset < Table->Length)831{832/* Dump the common subtable header */833834DbgPrint (ASL_DEBUG_OUTPUT, "0) HeaderOffset: %X\n", Offset);835AcpiOsPrintf ("\n");836Status = AcpiDmDumpTable (Length, Offset, Subtable,837sizeof (ACPI_CDAT_HEADER), AcpiDmTableInfoCdatHeader);838if (ACPI_FAILURE (Status))839{840return;841}842843/* Point past the common subtable header, decode the subtable type */844845Offset += sizeof (ACPI_CDAT_HEADER);846SubtableType = Subtable->Type;847848switch (Subtable->Type)849{850case ACPI_CDAT_TYPE_DSMAS:851Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);852SubtableLength = sizeof (ACPI_CDAT_DSMAS);853854InfoTable = AcpiDmTableInfoCdat0;855break;856857case ACPI_CDAT_TYPE_DSLBIS:858Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);859SubtableLength = sizeof (ACPI_CDAT_DSLBIS);860DbgPrint (ASL_DEBUG_OUTPUT, "1) Offset: %X\n", Offset);861862InfoTable = AcpiDmTableInfoCdat1;863break;864865case ACPI_CDAT_TYPE_DSMSCIS:866Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);867SubtableLength = sizeof (ACPI_CDAT_DSMSCIS);868869InfoTable = AcpiDmTableInfoCdat2;870break;871872case ACPI_CDAT_TYPE_DSIS:873DbgPrint (ASL_DEBUG_OUTPUT, "2) Offset: %X ", Offset);874SubtableLength = sizeof (ACPI_CDAT_DSIS);875DbgPrint (ASL_DEBUG_OUTPUT, "1) input pointer: %p\n", Table);876Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);877DbgPrint (ASL_DEBUG_OUTPUT, "1) output pointers: %p, %p, Offset: %X\n",878Table, Subtable, Offset);879DbgPrint (ASL_DEBUG_OUTPUT, "3) Offset: %X\n", Offset);880881InfoTable = AcpiDmTableInfoCdat3;882break;883884case ACPI_CDAT_TYPE_DSEMTS:885Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);886SubtableLength = sizeof (ACPI_CDAT_DSEMTS);887888InfoTable = AcpiDmTableInfoCdat4;889break;890891case ACPI_CDAT_TYPE_SSLBIS:892SubtableLength = Subtable->Length;893894InfoTable = AcpiDmTableInfoCdat5;895Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);896break;897898default:899fprintf (stderr, "ERROR: Unknown SubtableType: %X\n", Subtable->Type);900return;901}902903DbgPrint (ASL_DEBUG_OUTPUT, "SubtableType: %X, Length: %X Actual "904"Length: %X Offset: %X tableptr: %p\n", SubtableType,905Subtable->Length, SubtableLength, Offset, Table);906907/*908* Do the subtable-specific fields909*/910Status = AcpiDmDumpTable (Length, Offset, Subtable, Offset, InfoTable);911if (ACPI_FAILURE (Status))912{913return;914}915916DbgPrint (ASL_DEBUG_OUTPUT, "Subtable Type: %X, Offset: %X, SubtableLength: %X\n",917SubtableType, Offset, SubtableLength);918919/* Additional sub-subtables, dependent on the main subtable type */920921switch (SubtableType)922{923case ACPI_CDAT_TYPE_SSLBIS:924Offset += sizeof (ACPI_CDAT_SSLBIS);925Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table,926Offset);927928DbgPrint (ASL_DEBUG_OUTPUT, "Case SSLBIS, Offset: %X, SubtableLength: %X "929"Subtable->Length %X\n", Offset, SubtableLength, Subtable->Length);930931/* Generate the total length of all the SSLBE entries */932933EntriesLength = SubtableLength - sizeof (ACPI_CDAT_HEADER) -934sizeof (ACPI_CDAT_SSLBIS);935DbgPrint (ASL_DEBUG_OUTPUT, "EntriesLength: %X, Offset: %X, Table->Length: %X\n",936EntriesLength, Offset, Table->Length);937938/* Do each of the SSLBE Entries */939940while ((EntriesLength > 0) && (Offset < Table->Length))941{942AcpiOsPrintf ("\n");943944Status = AcpiDmDumpTable (Length, Offset, Subtable, Offset,945AcpiDmTableInfoCdatEntries);946if (ACPI_FAILURE (Status))947{948return;949}950951EntriesLength -= sizeof (ACPI_CDAT_SSLBE);952Offset += sizeof (ACPI_CDAT_SSLBE);953Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);954}955956SubtableLength = 0;957break;958959default:960break;961}962963DbgPrint (ASL_DEBUG_OUTPUT, "Offset: %X, Subtable Length: %X\n",964Offset, SubtableLength);965966/* Point to next subtable */967968Offset += SubtableLength;969Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);970}971972return;973}974975976/*******************************************************************************977*978* FUNCTION: AcpiDmDumpCedt979*980* PARAMETERS: Table - A CEDT table981*982* RETURN: None983*984* DESCRIPTION: Format the contents of a CEDT. This table type consists985* of an open-ended number of subtables.986*987******************************************************************************/988989void990AcpiDmDumpCedt (991ACPI_TABLE_HEADER *Table)992{993ACPI_STATUS Status;994ACPI_CEDT_HEADER *Subtable;995UINT32 Length = Table->Length;996UINT32 Offset = sizeof (ACPI_TABLE_CEDT);997998999/* There is no main table (other than the standard ACPI header) */10001001Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Table, Offset);1002while (Offset < Table->Length)1003{1004/* Common subtable header */10051006AcpiOsPrintf ("\n");1007Status = AcpiDmDumpTable (Length, Offset, Subtable,1008Subtable->Length, AcpiDmTableInfoCedtHdr);1009if (ACPI_FAILURE (Status))1010{1011return;1012}10131014switch (Subtable->Type)1015{1016case ACPI_CEDT_TYPE_CHBS:1017Status = AcpiDmDumpTable (Length, Offset, Subtable,1018Subtable->Length, AcpiDmTableInfoCedt0);1019if (ACPI_FAILURE (Status))1020{1021return;1022}1023break;10241025case ACPI_CEDT_TYPE_CFMWS:1026{1027ACPI_CEDT_CFMWS *ptr = (ACPI_CEDT_CFMWS *) Subtable;1028unsigned int i, max;10291030if (ptr->InterleaveWays < 8)1031max = 1 << (ptr->InterleaveWays);1032else1033max = 3 << (ptr->InterleaveWays - 8);10341035/* print out table with first "Interleave target" */10361037Status = AcpiDmDumpTable (Length, Offset, Subtable,1038Subtable->Length, AcpiDmTableInfoCedt1);1039if (ACPI_FAILURE (Status))1040{1041return;1042}10431044/* Now, print out any interleave targets beyond the first. */10451046for (i = 1; i < max; i++)1047{1048unsigned int loc_offset = Offset + (i * 4) + ACPI_OFFSET (ACPI_CEDT_CFMWS, InterleaveTargets);1049unsigned int *trg = &(ptr->InterleaveTargets[i]);10501051Status = AcpiDmDumpTable (Length, loc_offset, trg,1052Subtable->Length, AcpiDmTableInfoCedt1_te);1053if (ACPI_FAILURE (Status))1054{1055return;1056}1057}1058break;1059}10601061case ACPI_CEDT_TYPE_CXIMS:1062{1063ACPI_CEDT_CXIMS *ptr = (ACPI_CEDT_CXIMS *) Subtable;1064unsigned int i, max = ptr->NrXormaps;10651066/* print out table with first "XOR Map" */10671068Status = AcpiDmDumpTable (Length, Offset, Subtable,1069Subtable->Length, AcpiDmTableInfoCedt2);1070if (ACPI_FAILURE (Status))1071{1072return;1073}10741075/* Now, print out any XOR Map beyond the first. */10761077for (i = 1; i < max; i++)1078{1079unsigned int loc_offset = Offset + (i * 1) + ACPI_OFFSET (ACPI_CEDT_CXIMS, XormapList);1080UINT64 *trg = &(ptr->XormapList[i]);10811082Status = AcpiDmDumpTable (Length, loc_offset, trg,1083Subtable->Length, AcpiDmTableInfoCedt2_te);1084if (ACPI_FAILURE (Status))1085{1086return;1087}1088}1089break;1090}10911092default:1093AcpiOsPrintf ("\n**** Unknown CEDT subtable type 0x%X\n\n",1094Subtable->Type);10951096/* Attempt to continue */1097if (!Subtable->Length)1098{1099AcpiOsPrintf ("Invalid zero length subtable\n");1100return;1101}1102}11031104/* Point to next subtable */1105Offset += Subtable->Length;1106Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Subtable,1107Subtable->Length);1108}1109}11101111/*******************************************************************************1112*1113* FUNCTION: AcpiDmDumpCpep1114*1115* PARAMETERS: Table - A CPEP table1116*1117* RETURN: None1118*1119* DESCRIPTION: Format the contents of a CPEP. This table type consists1120* of an open-ended number of subtables.1121*1122******************************************************************************/11231124void1125AcpiDmDumpCpep (1126ACPI_TABLE_HEADER *Table)1127{1128ACPI_STATUS Status;1129ACPI_CPEP_POLLING *Subtable;1130UINT32 Length = Table->Length;1131UINT32 Offset = sizeof (ACPI_TABLE_CPEP);113211331134/* Main table */11351136Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);1137if (ACPI_FAILURE (Status))1138{1139return;1140}11411142/* Subtables */11431144Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);1145while (Offset < Table->Length)1146{1147AcpiOsPrintf ("\n");1148Status = AcpiDmDumpTable (Length, Offset, Subtable,1149Subtable->Header.Length, AcpiDmTableInfoCpep0);1150if (ACPI_FAILURE (Status))1151{1152return;1153}11541155/* Point to next subtable */11561157Offset += Subtable->Header.Length;1158Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Subtable,1159Subtable->Header.Length);1160}1161}116211631164/*******************************************************************************1165*1166* FUNCTION: AcpiDmDumpCsrt1167*1168* PARAMETERS: Table - A CSRT table1169*1170* RETURN: None1171*1172* DESCRIPTION: Format the contents of a CSRT. This table type consists1173* of an open-ended number of subtables.1174*1175******************************************************************************/11761177void1178AcpiDmDumpCsrt (1179ACPI_TABLE_HEADER *Table)1180{1181ACPI_STATUS Status;1182ACPI_CSRT_GROUP *Subtable;1183ACPI_CSRT_SHARED_INFO *SharedInfoTable;1184ACPI_CSRT_DESCRIPTOR *SubSubtable;1185UINT32 Length = Table->Length;1186UINT32 Offset = sizeof (ACPI_TABLE_CSRT);1187UINT32 SubOffset;1188UINT32 SubSubOffset;1189UINT32 InfoLength;119011911192/* The main table only contains the ACPI header, thus already handled */11931194/* Subtables (Resource Groups) */11951196Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);1197while (Offset < Table->Length)1198{1199/* Resource group subtable */12001201AcpiOsPrintf ("\n");1202Status = AcpiDmDumpTable (Length, Offset, Subtable,1203Subtable->Length, AcpiDmTableInfoCsrt0);1204if (ACPI_FAILURE (Status))1205{1206return;1207}12081209/* Shared info subtable (One per resource group) */12101211SubOffset = sizeof (ACPI_CSRT_GROUP);1212SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,1213Offset + SubOffset);12141215AcpiOsPrintf ("\n");1216Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,1217sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);1218if (ACPI_FAILURE (Status))1219{1220return;1221}12221223SubOffset += Subtable->SharedInfoLength;12241225/* Sub-Subtables (Resource Descriptors) */12261227SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,1228Offset + SubOffset);12291230while ((SubOffset < Subtable->Length) &&1231((Offset + SubOffset) < Table->Length))1232{1233AcpiOsPrintf ("\n");1234Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable,1235SubSubtable->Length, AcpiDmTableInfoCsrt2);1236if (ACPI_FAILURE (Status))1237{1238return;1239}12401241SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);12421243/* Resource-specific info buffer */12441245InfoLength = SubSubtable->Length - SubSubOffset;1246if (InfoLength)1247{1248Status = AcpiDmDumpTable (Length,1249Offset + SubOffset + SubSubOffset, Table,1250InfoLength, AcpiDmTableInfoCsrt2a);1251if (ACPI_FAILURE (Status))1252{1253return;1254}1255}12561257/* Point to next sub-subtable */12581259SubOffset += SubSubtable->Length;1260SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable,1261SubSubtable->Length);1262}12631264/* Point to next subtable */12651266Offset += Subtable->Length;1267Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable,1268Subtable->Length);1269}1270}127112721273/*******************************************************************************1274*1275* FUNCTION: AcpiDmDumpDbg21276*1277* PARAMETERS: Table - A DBG2 table1278*1279* RETURN: None1280*1281* DESCRIPTION: Format the contents of a DBG2. This table type consists1282* of an open-ended number of subtables.1283*1284******************************************************************************/12851286void1287AcpiDmDumpDbg2 (1288ACPI_TABLE_HEADER *Table)1289{1290ACPI_STATUS Status;1291ACPI_DBG2_DEVICE *Subtable;1292UINT32 Length = Table->Length;1293UINT32 Offset = sizeof (ACPI_TABLE_DBG2);1294UINT32 i;1295UINT32 ArrayOffset;1296UINT32 AbsoluteOffset;1297UINT8 *Array;129812991300/* Main table */13011302Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);1303if (ACPI_FAILURE (Status))1304{1305return;1306}13071308/* Subtables */13091310Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);1311while (Offset < Table->Length)1312{1313AcpiOsPrintf ("\n");1314Status = AcpiDmDumpTable (Length, Offset, Subtable,1315Subtable->Length, AcpiDmTableInfoDbg2Device);1316if (ACPI_FAILURE (Status))1317{1318return;1319}13201321/* Dump the BaseAddress array */13221323for (i = 0; i < Subtable->RegisterCount; i++)1324{1325ArrayOffset = Subtable->BaseAddressOffset +1326(sizeof (ACPI_GENERIC_ADDRESS) * i);1327AbsoluteOffset = Offset + ArrayOffset;1328Array = (UINT8 *) Subtable + ArrayOffset;13291330Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,1331Subtable->Length, AcpiDmTableInfoDbg2Addr);1332if (ACPI_FAILURE (Status))1333{1334return;1335}1336}13371338/* Dump the AddressSize array */13391340for (i = 0; i < Subtable->RegisterCount; i++)1341{1342ArrayOffset = Subtable->AddressSizeOffset +1343(sizeof (UINT32) * i);1344AbsoluteOffset = Offset + ArrayOffset;1345Array = (UINT8 *) Subtable + ArrayOffset;13461347Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,1348Subtable->Length, AcpiDmTableInfoDbg2Size);1349if (ACPI_FAILURE (Status))1350{1351return;1352}1353}13541355/* Dump the Namestring (required) */13561357AcpiOsPrintf ("\n");1358ArrayOffset = Subtable->NamepathOffset;1359AbsoluteOffset = Offset + ArrayOffset;1360Array = (UINT8 *) Subtable + ArrayOffset;13611362Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,1363Subtable->Length, AcpiDmTableInfoDbg2Name);1364if (ACPI_FAILURE (Status))1365{1366return;1367}13681369/* Dump the OemData (optional) */13701371if (Subtable->OemDataOffset)1372{1373Status = AcpiDmDumpTable (Length, Subtable->OemDataOffset,1374Subtable, Subtable->OemDataLength,1375AcpiDmTableInfoDbg2OemData);1376if (ACPI_FAILURE (Status))1377{1378return;1379}1380}13811382/* Point to next subtable */13831384Offset += Subtable->Length;1385Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable,1386Subtable->Length);1387}1388}138913901391/*******************************************************************************1392*1393* FUNCTION: AcpiDmDumpDmar1394*1395* PARAMETERS: Table - A DMAR table1396*1397* RETURN: None1398*1399* DESCRIPTION: Format the contents of a DMAR. This table type consists1400* of an open-ended number of subtables.1401*1402******************************************************************************/14031404void1405AcpiDmDumpDmar (1406ACPI_TABLE_HEADER *Table)1407{1408ACPI_STATUS Status;1409ACPI_DMAR_HEADER *Subtable;1410UINT32 Length = Table->Length;1411UINT32 Offset = sizeof (ACPI_TABLE_DMAR);1412ACPI_DMTABLE_INFO *InfoTable;1413ACPI_DMAR_DEVICE_SCOPE *ScopeTable;1414UINT32 ScopeOffset;1415UINT8 *PciPath;1416UINT32 PathOffset;141714181419/* Main table */14201421Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);1422if (ACPI_FAILURE (Status))1423{1424return;1425}14261427/* Subtables */14281429Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);1430while (Offset < Table->Length)1431{1432/* Common subtable header */14331434AcpiOsPrintf ("\n");1435Status = AcpiDmDumpTable (Length, Offset, Subtable,1436Subtable->Length, AcpiDmTableInfoDmarHdr);1437if (ACPI_FAILURE (Status))1438{1439return;1440}14411442AcpiOsPrintf ("\n");14431444switch (Subtable->Type)1445{1446case ACPI_DMAR_TYPE_HARDWARE_UNIT:14471448InfoTable = AcpiDmTableInfoDmar0;1449ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);1450break;14511452case ACPI_DMAR_TYPE_RESERVED_MEMORY:14531454InfoTable = AcpiDmTableInfoDmar1;1455ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);1456break;14571458case ACPI_DMAR_TYPE_ROOT_ATS:14591460InfoTable = AcpiDmTableInfoDmar2;1461ScopeOffset = sizeof (ACPI_DMAR_ATSR);1462break;14631464case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:14651466InfoTable = AcpiDmTableInfoDmar3;1467ScopeOffset = sizeof (ACPI_DMAR_RHSA);1468break;14691470case ACPI_DMAR_TYPE_NAMESPACE:14711472InfoTable = AcpiDmTableInfoDmar4;1473ScopeOffset = sizeof (ACPI_DMAR_ANDD);1474break;14751476case ACPI_DMAR_TYPE_SATC:14771478InfoTable = AcpiDmTableInfoDmar5;1479ScopeOffset = sizeof (ACPI_DMAR_SATC);1480break;14811482case ACPI_DMAR_TYPE_SIDP:14831484InfoTable = AcpiDmTableInfoDmar6;1485ScopeOffset = sizeof (ACPI_DMAR_SIDP);1486break;14871488default:14891490AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",1491Subtable->Type);1492return;1493}14941495Status = AcpiDmDumpTable (Length, Offset, Subtable,1496Subtable->Length, InfoTable);1497if (ACPI_FAILURE (Status))1498{1499return;1500}15011502/*1503* Dump the optional device scope entries1504*/1505if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||1506(Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE))1507{1508/* These types do not support device scopes */15091510goto NextSubtable;1511}15121513ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset);1514while (ScopeOffset < Subtable->Length)1515{1516AcpiOsPrintf ("\n");1517Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,1518ScopeTable->Length, AcpiDmTableInfoDmarScope);1519if (ACPI_FAILURE (Status))1520{1521return;1522}1523AcpiOsPrintf ("\n");15241525/* Dump the PCI Path entries for this device scope */15261527PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */15281529PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,1530sizeof (ACPI_DMAR_DEVICE_SCOPE));15311532while (PathOffset < ScopeTable->Length)1533{1534AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2,1535"PCI Path");1536AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);15371538/* Point to next PCI Path entry */15391540PathOffset += 2;1541PciPath += 2;1542AcpiOsPrintf ("\n");1543}15441545/* Point to next device scope entry */15461547ScopeOffset += ScopeTable->Length;1548ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,1549ScopeTable, ScopeTable->Length);1550}15511552NextSubtable:1553/* Point to next subtable */15541555Offset += Subtable->Length;1556Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable,1557Subtable->Length);1558}1559}156015611562/*******************************************************************************1563*1564* FUNCTION: AcpiDmDumpDrtm1565*1566* PARAMETERS: Table - A DRTM table1567*1568* RETURN: None1569*1570* DESCRIPTION: Format the contents of a DRTM.1571*1572******************************************************************************/15731574void1575AcpiDmDumpDrtm (1576ACPI_TABLE_HEADER *Table)1577{1578ACPI_STATUS Status;1579UINT32 Offset;1580ACPI_DRTM_VTABLE_LIST *DrtmVtl;1581ACPI_DRTM_RESOURCE_LIST *DrtmRl;1582ACPI_DRTM_DPS_ID *DrtmDps;1583UINT32 Count;158415851586/* Main table */15871588Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,1589AcpiDmTableInfoDrtm);1590if (ACPI_FAILURE (Status))1591{1592return;1593}15941595Offset = sizeof (ACPI_TABLE_DRTM);15961597/* Sub-tables */15981599/* Dump ValidatedTable length */16001601DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);1602AcpiOsPrintf ("\n");1603Status = AcpiDmDumpTable (Table->Length, Offset,1604DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),1605AcpiDmTableInfoDrtm0);1606if (ACPI_FAILURE (Status))1607{1608return;1609}16101611Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);16121613/* Dump Validated table addresses */16141615Count = 0;1616while ((Offset < Table->Length) &&1617(DrtmVtl->ValidatedTableCount > Count))1618{1619Status = AcpiDmDumpTable (Table->Length, Offset,1620ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),1621AcpiDmTableInfoDrtm0a);1622if (ACPI_FAILURE (Status))1623{1624return;1625}16261627Offset += sizeof (UINT64);1628Count++;1629}16301631/* Dump ResourceList length */16321633DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);1634AcpiOsPrintf ("\n");1635Status = AcpiDmDumpTable (Table->Length, Offset,1636DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),1637AcpiDmTableInfoDrtm1);1638if (ACPI_FAILURE (Status))1639{1640return;1641}16421643Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);16441645/* Dump the Resource List */16461647Count = 0;1648while ((Offset < Table->Length) &&1649(DrtmRl->ResourceCount > Count))1650{1651Status = AcpiDmDumpTable (Table->Length, Offset,1652ACPI_ADD_PTR (void, Table, Offset),1653sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a);1654if (ACPI_FAILURE (Status))1655{1656return;1657}16581659Offset += sizeof (ACPI_DRTM_RESOURCE);1660Count++;1661}16621663/* Dump DPS */16641665DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);1666AcpiOsPrintf ("\n");1667(void) AcpiDmDumpTable (Table->Length, Offset,1668DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2);1669}167016711672/*******************************************************************************1673*1674* FUNCTION: AcpiDmDumpEinj1675*1676* PARAMETERS: Table - A EINJ table1677*1678* RETURN: None1679*1680* DESCRIPTION: Format the contents of a EINJ. This table type consists1681* of an open-ended number of subtables.1682*1683******************************************************************************/16841685void1686AcpiDmDumpEinj (1687ACPI_TABLE_HEADER *Table)1688{1689ACPI_STATUS Status;1690ACPI_WHEA_HEADER *Subtable;1691UINT32 Length = Table->Length;1692UINT32 Offset = sizeof (ACPI_TABLE_EINJ);169316941695/* Main table */16961697Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);1698if (ACPI_FAILURE (Status))1699{1700return;1701}17021703/* Subtables */17041705Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);1706while (Offset < Table->Length)1707{1708AcpiOsPrintf ("\n");1709Status = AcpiDmDumpTable (Length, Offset, Subtable,1710sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);1711if (ACPI_FAILURE (Status))1712{1713return;1714}17151716/* Point to next subtable (each subtable is of fixed length) */17171718Offset += sizeof (ACPI_WHEA_HEADER);1719Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,1720sizeof (ACPI_WHEA_HEADER));1721}1722}172317241725/*******************************************************************************1726*1727* FUNCTION: AcpiDmDumpErdt1728*1729* PARAMETERS: Table - A ERDT table1730*1731* RETURN: None1732*1733* DESCRIPTION: Format the contents of a ERDT. This table type consists1734* of an open-ended number of subtables.1735*1736******************************************************************************/17371738void1739AcpiDmDumpErdt (1740ACPI_TABLE_HEADER *Table)1741{1742ACPI_STATUS Status;1743ACPI_SUBTBL_HDR_16 *Subtable, *Subsubtable;1744ACPI_ERDT_DACD_PATHS *ScopeTable;1745UINT32 Offset = sizeof (ACPI_TABLE_ERDT);1746UINT32 Suboffset;1747UINT32 ScopeOffset;1748UINT32 SubsubtableLength = 0;1749ACPI_DMTABLE_INFO *InfoTable, *TrailEntries, *DacdEntries;1750UINT32 NumTrailers = 0;17511752/* Main table */17531754Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoErdt);1755if (ACPI_FAILURE (Status))1756{1757return;1758}17591760/* Subtables */1761Subtable = ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, Table, Offset);1762while (Offset < Table->Length)1763{17641765/* Dump common header */17661767AcpiOsPrintf ("\n");1768Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,1769Subtable->Length, AcpiDmTableInfoErdtHdr);1770if (ACPI_FAILURE (Status))1771{1772return;1773}17741775AcpiOsPrintf ("\n");1776Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,1777Subtable->Length, AcpiDmTableInfoErdtRmdd);1778if (ACPI_FAILURE (Status))1779{1780return;1781}17821783/* Subtables of this RMDD table */17841785Suboffset = Offset + sizeof(ACPI_ERDT_RMDD);1786Subsubtable = ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, Table, Suboffset);1787while (Suboffset < Offset + Subtable->Length)1788{1789AcpiOsPrintf ("\n");17901791TrailEntries = NULL;1792DacdEntries = NULL;1793switch (Subsubtable->Type)1794{1795case ACPI_ERDT_TYPE_CACD:1796InfoTable = AcpiDmTableInfoErdtCacd;1797TrailEntries = AcpiDmTableInfoErdtCacdX2apic;1798SubsubtableLength = sizeof(ACPI_ERDT_CACD);1799break;18001801case ACPI_ERDT_TYPE_DACD:1802InfoTable = AcpiDmTableInfoErdtDacd;1803DacdEntries = AcpiDmTableInfoErdtDacdScope;1804SubsubtableLength = sizeof(ACPI_ERDT_DACD);1805break;18061807case ACPI_ERDT_TYPE_CMRC:1808InfoTable = AcpiDmTableInfoErdtCmrc;1809break;18101811case ACPI_ERDT_TYPE_MMRC:1812InfoTable = AcpiDmTableInfoErdtMmrc;1813TrailEntries = AcpiDmTableInfoErdtMmrcCorrFactor;1814SubsubtableLength = sizeof(ACPI_ERDT_MMRC);1815break;18161817case ACPI_ERDT_TYPE_MARC:1818InfoTable = AcpiDmTableInfoErdtMarc;1819break;18201821case ACPI_ERDT_TYPE_CARC:1822InfoTable = AcpiDmTableInfoErdtCarc;1823break;18241825case ACPI_ERDT_TYPE_CMRD:1826InfoTable = AcpiDmTableInfoErdtCmrd;1827break;18281829case ACPI_ERDT_TYPE_IBRD:1830InfoTable = AcpiDmTableInfoErdtIbrd;1831TrailEntries = AcpiDmTableInfoErdtIbrdCorrFactor;1832SubsubtableLength = sizeof(ACPI_ERDT_IBRD);1833break;18341835case ACPI_ERDT_TYPE_IBAD:1836InfoTable = AcpiDmTableInfoErdtIbad;1837break;18381839case ACPI_ERDT_TYPE_CARD:1840InfoTable = AcpiDmTableInfoErdtCard;1841break;18421843default:1844AcpiOsPrintf ("\n**** Unknown RMDD subtable type 0x%X\n",1845Subsubtable->Type);18461847/* Attempt to continue */18481849if (!Subsubtable->Length)1850{1851AcpiOsPrintf ("Invalid zero length subtable\n");1852return;1853}1854goto NextSubsubtable;1855}18561857/* Dump subtable header */18581859Status = AcpiDmDumpTable (Table->Length, Suboffset, Subsubtable,1860Subsubtable->Length, AcpiDmTableInfoErdtHdr);1861if (ACPI_FAILURE (Status))1862{1863return;1864}18651866/* Dump subtable body */18671868Status = AcpiDmDumpTable (Table->Length, Suboffset, Subsubtable,1869Subsubtable->Length, InfoTable);1870if (ACPI_FAILURE (Status))1871{1872return;1873}18741875/* CACD, MMRC, and IBRD subtables have simple flex array at end */18761877if (TrailEntries)1878{1879NumTrailers = 0;1880while (NumTrailers < Subsubtable->Length - SubsubtableLength)1881{18821883/* Dump one flex array element */18841885Status = AcpiDmDumpTable (Table->Length, Suboffset +1886SubsubtableLength + NumTrailers,1887ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, Subsubtable,1888SubsubtableLength + NumTrailers),1889sizeof(UINT32), TrailEntries);1890if (ACPI_FAILURE (Status))1891{1892return;1893}1894NumTrailers += sizeof(UINT32);1895}1896}18971898/* DACD subtable has flex array of device agent structures */18991900if (DacdEntries) {1901ScopeOffset = Suboffset + SubsubtableLength;1902ScopeTable = ACPI_ADD_PTR (ACPI_ERDT_DACD_PATHS,1903Subsubtable, SubsubtableLength);1904while (ScopeOffset < Suboffset + Subsubtable->Length)1905{1906/* Dump one device agent structure */19071908AcpiOsPrintf ("\n");1909Status = AcpiDmDumpTable (Table->Length, ScopeOffset,1910ScopeTable, ScopeTable->Header.Length, DacdEntries);1911if (ACPI_FAILURE (Status))1912{1913return;1914}19151916/* Flex array of UINT8 for device path */19171918NumTrailers = 0;1919while (NumTrailers < ScopeTable->Header.Length - sizeof(ACPI_ERDT_DACD_PATHS))1920{1921/* Dump one UINT8 of the device path */19221923Status = AcpiDmDumpTable (Table->Length, ScopeOffset +1924sizeof(ACPI_ERDT_DACD_PATHS) + NumTrailers,1925ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, ScopeTable,1926sizeof(*ScopeTable) + NumTrailers),1927sizeof(UINT32), AcpiDmTableInfoErdtDacdPath);1928if (ACPI_FAILURE (Status))1929{1930return;1931}1932NumTrailers++;1933}19341935ScopeOffset += ScopeTable->Header.Length;1936ScopeTable = ACPI_ADD_PTR (ACPI_ERDT_DACD_PATHS,1937ScopeTable, ScopeTable->Header.Length);1938}1939}1940NextSubsubtable:1941Suboffset += Subsubtable->Length;1942Subsubtable = ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, Table, Suboffset);1943}19441945Offset += Subtable->Length;1946Subtable = ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, Subtable,1947Subtable->Length);1948}1949}195019511952/*******************************************************************************1953*1954* FUNCTION: AcpiDmDumpErst1955*1956* PARAMETERS: Table - A ERST table1957*1958* RETURN: None1959*1960* DESCRIPTION: Format the contents of a ERST. This table type consists1961* of an open-ended number of subtables.1962*1963******************************************************************************/19641965void1966AcpiDmDumpErst (1967ACPI_TABLE_HEADER *Table)1968{1969ACPI_STATUS Status;1970ACPI_WHEA_HEADER *Subtable;1971UINT32 Length = Table->Length;1972UINT32 Offset = sizeof (ACPI_TABLE_ERST);197319741975/* Main table */19761977Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);1978if (ACPI_FAILURE (Status))1979{1980return;1981}19821983/* Subtables */19841985Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);1986while (Offset < Table->Length)1987{1988AcpiOsPrintf ("\n");1989Status = AcpiDmDumpTable (Length, Offset, Subtable,1990sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);1991if (ACPI_FAILURE (Status))1992{1993return;1994}19951996/* Point to next subtable (each subtable is of fixed length) */19971998Offset += sizeof (ACPI_WHEA_HEADER);1999Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,2000sizeof (ACPI_WHEA_HEADER));2001}2002}200320042005/*******************************************************************************2006*2007* FUNCTION: AcpiDmDumpFpdt2008*2009* PARAMETERS: Table - A FPDT table2010*2011* RETURN: None2012*2013* DESCRIPTION: Format the contents of a FPDT. This table type consists2014* of an open-ended number of subtables.2015*2016******************************************************************************/20172018void2019AcpiDmDumpFpdt (2020ACPI_TABLE_HEADER *Table)2021{2022ACPI_STATUS Status;2023ACPI_FPDT_HEADER *Subtable;2024UINT32 Length = Table->Length;2025UINT32 Offset = sizeof (ACPI_TABLE_FPDT);2026ACPI_DMTABLE_INFO *InfoTable;202720282029/* There is no main table (other than the standard ACPI header) */20302031/* Subtables */20322033Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);2034while (Offset < Table->Length)2035{2036/* Common subtable header */20372038AcpiOsPrintf ("\n");2039Status = AcpiDmDumpTable (Length, Offset, Subtable,2040Subtable->Length, AcpiDmTableInfoFpdtHdr);2041if (ACPI_FAILURE (Status))2042{2043return;2044}20452046switch (Subtable->Type)2047{2048case ACPI_FPDT_TYPE_BOOT:20492050InfoTable = AcpiDmTableInfoFpdt0;2051break;20522053case ACPI_FPDT_TYPE_S3PERF:20542055InfoTable = AcpiDmTableInfoFpdt1;2056break;20572058default:20592060AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",2061Subtable->Type);20622063/* Attempt to continue */20642065if (!Subtable->Length)2066{2067AcpiOsPrintf ("Invalid zero length subtable\n");2068return;2069}2070goto NextSubtable;2071}20722073Status = AcpiDmDumpTable (Length, Offset, Subtable,2074Subtable->Length, InfoTable);2075if (ACPI_FAILURE (Status))2076{2077return;2078}20792080NextSubtable:2081/* Point to next subtable */20822083Offset += Subtable->Length;2084Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable,2085Subtable->Length);2086}2087}208820892090/*******************************************************************************2091*2092* FUNCTION: AcpiDmDumpGtdt2093*2094* PARAMETERS: Table - A GTDT table2095*2096* RETURN: None2097*2098* DESCRIPTION: Format the contents of a GTDT. This table type consists2099* of an open-ended number of subtables.2100*2101******************************************************************************/21022103void2104AcpiDmDumpGtdt (2105ACPI_TABLE_HEADER *Table)2106{2107ACPI_STATUS Status;2108ACPI_GTDT_HEADER *Subtable;2109UINT32 Length = Table->Length;2110UINT32 Offset = sizeof (ACPI_TABLE_GTDT);2111ACPI_DMTABLE_INFO *InfoTable;2112UINT32 SubtableLength;2113UINT32 GtCount;2114ACPI_GTDT_TIMER_ENTRY *GtxTable;211521162117/* Main table */21182119Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);2120if (ACPI_FAILURE (Status))2121{2122return;2123}21242125/* Rev 3 fields */21262127Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);21282129if (Table->Revision > 2)2130{2131SubtableLength = sizeof (ACPI_GTDT_EL2);2132Status = AcpiDmDumpTable (Length, Offset, Subtable,2133SubtableLength, AcpiDmTableInfoGtdtEl2);2134if (ACPI_FAILURE (Status))2135{2136return;2137}2138Offset += SubtableLength;2139}21402141Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);21422143/* Subtables */21442145while (Offset < Table->Length)2146{2147/* Common subtable header */21482149AcpiOsPrintf ("\n");2150Status = AcpiDmDumpTable (Length, Offset, Subtable,2151Subtable->Length, AcpiDmTableInfoGtdtHdr);2152if (ACPI_FAILURE (Status))2153{2154return;2155}21562157GtCount = 0;2158switch (Subtable->Type)2159{2160case ACPI_GTDT_TYPE_TIMER_BLOCK:21612162SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);2163GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,2164Subtable))->TimerCount;21652166InfoTable = AcpiDmTableInfoGtdt0;2167break;21682169case ACPI_GTDT_TYPE_WATCHDOG:21702171SubtableLength = sizeof (ACPI_GTDT_WATCHDOG);21722173InfoTable = AcpiDmTableInfoGtdt1;2174break;21752176default:21772178/* Cannot continue on unknown type - no length */21792180AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n",2181Subtable->Type);2182return;2183}21842185Status = AcpiDmDumpTable (Length, Offset, Subtable,2186Subtable->Length, InfoTable);2187if (ACPI_FAILURE (Status))2188{2189return;2190}21912192/* Point to end of current subtable (each subtable above is of fixed length) */21932194Offset += SubtableLength;21952196/* If there are any Gt Timer Blocks from above, dump them now */21972198if (GtCount)2199{2200GtxTable = ACPI_ADD_PTR (2201ACPI_GTDT_TIMER_ENTRY, Subtable, SubtableLength);2202SubtableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);22032204while (GtCount)2205{2206AcpiOsPrintf ("\n");2207Status = AcpiDmDumpTable (Length, Offset, GtxTable,2208sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);2209if (ACPI_FAILURE (Status))2210{2211return;2212}2213Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);2214GtxTable++;2215GtCount--;2216}2217}22182219/* Point to next subtable */22202221Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Subtable, SubtableLength);2222}2223}222422252226/*******************************************************************************2227*2228* FUNCTION: AcpiDmDumpHest2229*2230* PARAMETERS: Table - A HEST table2231*2232* RETURN: None2233*2234* DESCRIPTION: Format the contents of a HEST. This table type consists2235* of an open-ended number of subtables.2236*2237******************************************************************************/22382239void2240AcpiDmDumpHest (2241ACPI_TABLE_HEADER *Table)2242{2243ACPI_STATUS Status;2244ACPI_HEST_HEADER *Subtable;2245UINT32 Length = Table->Length;2246UINT32 Offset = sizeof (ACPI_TABLE_HEST);2247ACPI_DMTABLE_INFO *InfoTable;2248UINT32 SubtableLength;2249UINT32 BankCount;2250ACPI_HEST_IA_ERROR_BANK *BankTable;225122522253/* Main table */22542255Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);2256if (ACPI_FAILURE (Status))2257{2258return;2259}22602261/* Subtables */22622263Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);2264while (Offset < Table->Length)2265{2266BankCount = 0;2267switch (Subtable->Type)2268{2269case ACPI_HEST_TYPE_IA32_CHECK:22702271InfoTable = AcpiDmTableInfoHest0;2272SubtableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);2273BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,2274Subtable))->NumHardwareBanks;2275break;22762277case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:22782279InfoTable = AcpiDmTableInfoHest1;2280SubtableLength = sizeof (ACPI_HEST_IA_CORRECTED);2281BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,2282Subtable))->NumHardwareBanks;2283break;22842285case ACPI_HEST_TYPE_IA32_NMI:22862287InfoTable = AcpiDmTableInfoHest2;2288SubtableLength = sizeof (ACPI_HEST_IA_NMI);2289break;22902291case ACPI_HEST_TYPE_AER_ROOT_PORT:22922293InfoTable = AcpiDmTableInfoHest6;2294SubtableLength = sizeof (ACPI_HEST_AER_ROOT);2295break;22962297case ACPI_HEST_TYPE_AER_ENDPOINT:22982299InfoTable = AcpiDmTableInfoHest7;2300SubtableLength = sizeof (ACPI_HEST_AER);2301break;23022303case ACPI_HEST_TYPE_AER_BRIDGE:23042305InfoTable = AcpiDmTableInfoHest8;2306SubtableLength = sizeof (ACPI_HEST_AER_BRIDGE);2307break;23082309case ACPI_HEST_TYPE_GENERIC_ERROR:23102311InfoTable = AcpiDmTableInfoHest9;2312SubtableLength = sizeof (ACPI_HEST_GENERIC);2313break;23142315case ACPI_HEST_TYPE_GENERIC_ERROR_V2:23162317InfoTable = AcpiDmTableInfoHest10;2318SubtableLength = sizeof (ACPI_HEST_GENERIC_V2);2319break;23202321case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:23222323InfoTable = AcpiDmTableInfoHest11;2324SubtableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);2325BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,2326Subtable))->NumHardwareBanks;2327break;23282329default:23302331/* Cannot continue on unknown type - no length */23322333AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n",2334Subtable->Type);2335return;2336}23372338AcpiOsPrintf ("\n");2339Status = AcpiDmDumpTable (Length, Offset, Subtable,2340SubtableLength, InfoTable);2341if (ACPI_FAILURE (Status))2342{2343return;2344}23452346/* Point to end of current subtable (each subtable above is of fixed length) */23472348Offset += SubtableLength;23492350/* If there are any (fixed-length) Error Banks from above, dump them now */23512352if (BankCount)2353{2354BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, Subtable,2355SubtableLength);2356SubtableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);23572358while (BankCount)2359{2360AcpiOsPrintf ("\n");2361Status = AcpiDmDumpTable (Length, Offset, BankTable,2362sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);2363if (ACPI_FAILURE (Status))2364{2365return;2366}23672368Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);2369BankTable++;2370BankCount--;2371}2372}23732374/* Point to next subtable */23752376Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Subtable, SubtableLength);2377}2378}237923802381/*******************************************************************************2382*2383* FUNCTION: AcpiDmDumpHmat2384*2385* PARAMETERS: Table - A HMAT table2386*2387* RETURN: None2388*2389* DESCRIPTION: Format the contents of a HMAT.2390*2391******************************************************************************/23922393void2394AcpiDmDumpHmat (2395ACPI_TABLE_HEADER *Table)2396{2397ACPI_STATUS Status;2398ACPI_HMAT_STRUCTURE *HmatStruct;2399ACPI_HMAT_LOCALITY *HmatLocality;2400ACPI_HMAT_CACHE *HmatCache;2401UINT32 Offset;2402UINT32 SubtableOffset;2403UINT32 Length;2404ACPI_DMTABLE_INFO *InfoTable;2405UINT32 i, j;240624072408/* Main table */24092410Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat);2411if (ACPI_FAILURE (Status))2412{2413return;2414}2415Offset = sizeof (ACPI_TABLE_HMAT);24162417while (Offset < Table->Length)2418{2419AcpiOsPrintf ("\n");24202421/* Dump HMAT structure header */24222423HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset);2424if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE))2425{2426AcpiOsPrintf ("Invalid HMAT structure length\n");2427return;2428}2429Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,2430HmatStruct->Length, AcpiDmTableInfoHmatHdr);2431if (ACPI_FAILURE (Status))2432{2433return;2434}24352436switch (HmatStruct->Type)2437{2438case ACPI_HMAT_TYPE_ADDRESS_RANGE:24392440InfoTable = AcpiDmTableInfoHmat0;2441Length = sizeof (ACPI_HMAT_PROXIMITY_DOMAIN);2442break;24432444case ACPI_HMAT_TYPE_LOCALITY:24452446InfoTable = AcpiDmTableInfoHmat1;2447Length = sizeof (ACPI_HMAT_LOCALITY);2448break;24492450case ACPI_HMAT_TYPE_CACHE:24512452InfoTable = AcpiDmTableInfoHmat2;2453Length = sizeof (ACPI_HMAT_CACHE);2454break;24552456default:24572458AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n",2459HmatStruct->Type);24602461/* Attempt to continue */24622463goto NextSubtable;2464}24652466/* Dump HMAT structure body */24672468if (HmatStruct->Length < Length)2469{2470AcpiOsPrintf ("Invalid HMAT structure length\n");2471return;2472}2473Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,2474HmatStruct->Length, InfoTable);2475if (ACPI_FAILURE (Status))2476{2477return;2478}24792480/* Dump HMAT structure additional */24812482switch (HmatStruct->Type)2483{2484case ACPI_HMAT_TYPE_LOCALITY:24852486HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct);2487SubtableOffset = sizeof (ACPI_HMAT_LOCALITY);24882489/* Dump initiator proximity domains */24902491if ((UINT32)(HmatStruct->Length - SubtableOffset) <2492(UINT32)(HmatLocality->NumberOfInitiatorPDs * 4))2493{2494AcpiOsPrintf ("Invalid initiator proximity domain number\n");2495return;2496}2497for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)2498{2499Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2500ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),25014, AcpiDmTableInfoHmat1a);2502if (ACPI_FAILURE (Status))2503{2504return;2505}25062507SubtableOffset += 4;2508}25092510/* Dump target proximity domains */25112512if ((UINT32)(HmatStruct->Length - SubtableOffset) <2513(UINT32)(HmatLocality->NumberOfTargetPDs * 4))2514{2515AcpiOsPrintf ("Invalid target proximity domain number\n");2516return;2517}2518for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++)2519{2520Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2521ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),25224, AcpiDmTableInfoHmat1b);2523if (ACPI_FAILURE (Status))2524{2525return;2526}25272528SubtableOffset += 4;2529}25302531/* Dump latency/bandwidth entris */25322533if ((UINT32)(HmatStruct->Length - SubtableOffset) <2534(UINT32)(HmatLocality->NumberOfInitiatorPDs *2535HmatLocality->NumberOfTargetPDs * 2))2536{2537AcpiOsPrintf ("Invalid latency/bandwidth entry number\n");2538return;2539}2540for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)2541{2542for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++)2543{2544Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2545ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),25462, AcpiDmTableInfoHmat1c);2547if (ACPI_FAILURE(Status))2548{2549return;2550}25512552SubtableOffset += 2;2553}2554}2555break;25562557case ACPI_HMAT_TYPE_CACHE:25582559HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct);2560SubtableOffset = sizeof (ACPI_HMAT_CACHE);25612562/* Dump SMBIOS handles */25632564if ((UINT32)(HmatStruct->Length - SubtableOffset) <2565(UINT32)(HmatCache->NumberOfSMBIOSHandles * 2))2566{2567AcpiOsPrintf ("Invalid SMBIOS handle number\n");2568return;2569}2570for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++)2571{2572Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,2573ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),25742, AcpiDmTableInfoHmat2a);2575if (ACPI_FAILURE (Status))2576{2577return;2578}25792580SubtableOffset += 2;2581}2582break;25832584default:25852586break;2587}25882589NextSubtable:2590/* Point to next HMAT structure subtable */25912592Offset += (HmatStruct->Length);2593}2594}259525962597