1f8146b88SJung-uk Kim /****************************************************************************** 2f8146b88SJung-uk Kim * 3f8146b88SJung-uk Kim * Module Name: dttable1.c - handling for specific ACPI tables 4f8146b88SJung-uk Kim * 5f8146b88SJung-uk Kim *****************************************************************************/ 6f8146b88SJung-uk Kim 70d84335fSJung-uk Kim /****************************************************************************** 80d84335fSJung-uk Kim * 90d84335fSJung-uk Kim * 1. Copyright Notice 100d84335fSJung-uk Kim * 11804fe266SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp. 12f8146b88SJung-uk Kim * All rights reserved. 13f8146b88SJung-uk Kim * 140d84335fSJung-uk Kim * 2. License 150d84335fSJung-uk Kim * 160d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 170d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided 180d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual 190d84335fSJung-uk Kim * property rights. 200d84335fSJung-uk Kim * 210d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 220d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 230d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 240d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 250d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 260d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 270d84335fSJung-uk Kim * 280d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 290d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 300d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 310d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 320d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 330d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions 340d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 350d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 360d84335fSJung-uk Kim * 370d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following 380d84335fSJung-uk Kim * conditions are met: 390d84335fSJung-uk Kim * 400d84335fSJung-uk Kim * 3. Conditions 410d84335fSJung-uk Kim * 420d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 430d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 440d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include 450d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 460d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 470d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 480d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 490d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 500d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 510d84335fSJung-uk Kim * must include a prominent statement that the modification is derived, 520d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code. 530d84335fSJung-uk Kim * 540d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 550d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 560d84335fSJung-uk Kim * Code or modification without rights to further distribute source must 570d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 580d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In 590d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 600d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 610d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 620d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 630d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 640d84335fSJung-uk Kim * make. 650d84335fSJung-uk Kim * 660d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 670d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 680d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 690d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the 700d84335fSJung-uk Kim * distribution. 710d84335fSJung-uk Kim * 720d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 730d84335fSJung-uk Kim * Intel Code. 740d84335fSJung-uk Kim * 750d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 760d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 770d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 780d84335fSJung-uk Kim * without prior written authorization from Intel. 790d84335fSJung-uk Kim * 800d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance 810d84335fSJung-uk Kim * 820d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 830d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 840d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 850d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 860d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 870d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 880d84335fSJung-uk Kim * PARTICULAR PURPOSE. 890d84335fSJung-uk Kim * 900d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 910d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 920d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 930d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 940d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 950d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 960d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 970d84335fSJung-uk Kim * LIMITED REMEDY. 980d84335fSJung-uk Kim * 990d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 1000d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any 1010d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 1020d84335fSJung-uk Kim * any other agency or department of the United States Government. In the 1030d84335fSJung-uk Kim * event Licensee exports any such software from the United States or 1040d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 1050d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 1060d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 1070d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1080d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 1090d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 1100d84335fSJung-uk Kim * United States government or any agency thereof requires an export license, 1110d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 1120d84335fSJung-uk Kim * such license, approval or letter. 1130d84335fSJung-uk Kim * 1140d84335fSJung-uk Kim ***************************************************************************** 1150d84335fSJung-uk Kim * 1160d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 1170d84335fSJung-uk Kim * following license: 1180d84335fSJung-uk Kim * 119f8146b88SJung-uk Kim * Redistribution and use in source and binary forms, with or without 120f8146b88SJung-uk Kim * modification, are permitted provided that the following conditions 121f8146b88SJung-uk Kim * are met: 122f8146b88SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 123f8146b88SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 124f8146b88SJung-uk Kim * without modification. 125f8146b88SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126f8146b88SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 127f8146b88SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 128f8146b88SJung-uk Kim * including a substantially similar Disclaimer requirement for further 129f8146b88SJung-uk Kim * binary redistribution. 130f8146b88SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 131f8146b88SJung-uk Kim * of any contributors may be used to endorse or promote products derived 132f8146b88SJung-uk Kim * from this software without specific prior written permission. 133f8146b88SJung-uk Kim * 1340d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1350d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1360d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1370d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1380d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1390d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1400d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1410d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1420d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1430d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1440d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1450d84335fSJung-uk Kim * 1460d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 147f8146b88SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 148f8146b88SJung-uk Kim * Software Foundation. 149f8146b88SJung-uk Kim * 1500d84335fSJung-uk Kim *****************************************************************************/ 151f8146b88SJung-uk Kim 152f8146b88SJung-uk Kim /* Compile all complex data tables, signatures starting with A-I */ 153f8146b88SJung-uk Kim 154f8146b88SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 155f8146b88SJung-uk Kim 156f8146b88SJung-uk Kim #define _COMPONENT DT_COMPILER 157f8146b88SJung-uk Kim ACPI_MODULE_NAME ("dttable1") 158f8146b88SJung-uk Kim 159f8146b88SJung-uk Kim 160f8146b88SJung-uk Kim static ACPI_DMTABLE_INFO TableInfoAsfAddress[] = 161f8146b88SJung-uk Kim { 162f8146b88SJung-uk Kim {ACPI_DMT_BUFFER, 0, "Addresses", 0}, 163f8146b88SJung-uk Kim {ACPI_DMT_EXIT, 0, NULL, 0} 164f8146b88SJung-uk Kim }; 165f8146b88SJung-uk Kim 166f8146b88SJung-uk Kim static ACPI_DMTABLE_INFO TableInfoDmarPciPath[] = 167f8146b88SJung-uk Kim { 168f8146b88SJung-uk Kim {ACPI_DMT_PCI_PATH, 0, "PCI Path", 0}, 169f8146b88SJung-uk Kim {ACPI_DMT_EXIT, 0, NULL, 0} 170f8146b88SJung-uk Kim }; 171f8146b88SJung-uk Kim 172f8146b88SJung-uk Kim 173f8146b88SJung-uk Kim /****************************************************************************** 174f8146b88SJung-uk Kim * 17597c0b5abSJung-uk Kim * FUNCTION: DtCompileAest 17697c0b5abSJung-uk Kim * 17797c0b5abSJung-uk Kim * PARAMETERS: List - Current field list pointer 17897c0b5abSJung-uk Kim * 17997c0b5abSJung-uk Kim * RETURN: Status 18097c0b5abSJung-uk Kim * 18197c0b5abSJung-uk Kim * DESCRIPTION: Compile AEST. 18297c0b5abSJung-uk Kim * 18397c0b5abSJung-uk Kim * NOTE: Assumes the following table structure: 18497c0b5abSJung-uk Kim * For all AEST Error Nodes: 18597c0b5abSJung-uk Kim * 1) An AEST Error Node, followed immediately by: 18697c0b5abSJung-uk Kim * 2) Any node-specific data 18797c0b5abSJung-uk Kim * 3) An Interface Structure (one) 18897c0b5abSJung-uk Kim * 4) A list (array) of Interrupt Structures, the count as specified 18997c0b5abSJung-uk Kim * in the NodeInterruptCount field of the Error Node header. 19097c0b5abSJung-uk Kim * 19197c0b5abSJung-uk Kim * AEST - ARM Error Source table. Conforms to: 19297c0b5abSJung-uk Kim * ACPI for the Armv8 RAS Extensions 1.1 Platform Design Document Sep 2020 19397c0b5abSJung-uk Kim * 19497c0b5abSJung-uk Kim *****************************************************************************/ 19597c0b5abSJung-uk Kim 19697c0b5abSJung-uk Kim ACPI_STATUS 19797c0b5abSJung-uk Kim DtCompileAest ( 19897c0b5abSJung-uk Kim void **List) 19997c0b5abSJung-uk Kim { 20097c0b5abSJung-uk Kim ACPI_AEST_HEADER *ErrorNodeHeader; 20197c0b5abSJung-uk Kim ACPI_AEST_PROCESSOR *AestProcessor; 20297c0b5abSJung-uk Kim DT_SUBTABLE *Subtable; 20397c0b5abSJung-uk Kim DT_SUBTABLE *ParentTable; 20497c0b5abSJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 20597c0b5abSJung-uk Kim ACPI_STATUS Status; 20697c0b5abSJung-uk Kim UINT32 i; 20797c0b5abSJung-uk Kim UINT32 Offset; 20897c0b5abSJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 209*92f570c3SJung-uk Kim ACPI_AEST_NODE_INTERFACE_HEADER *AestNodeHeader; 210*92f570c3SJung-uk Kim UINT8 Revision; 211*92f570c3SJung-uk Kim ACPI_TABLE_HEADER *Header; 21297c0b5abSJung-uk Kim 213*92f570c3SJung-uk Kim ParentTable = DtPeekSubtable (); 214*92f570c3SJung-uk Kim 215*92f570c3SJung-uk Kim Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); 216*92f570c3SJung-uk Kim Revision = Header->Revision; 21797c0b5abSJung-uk Kim 21897c0b5abSJung-uk Kim while (*PFieldList) 21997c0b5abSJung-uk Kim { 22097c0b5abSJung-uk Kim /* Compile the common error node header */ 22197c0b5abSJung-uk Kim 22297c0b5abSJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoAestHdr, 22397c0b5abSJung-uk Kim &Subtable); 22497c0b5abSJung-uk Kim if (ACPI_FAILURE (Status)) 22597c0b5abSJung-uk Kim { 22697c0b5abSJung-uk Kim return (Status); 22797c0b5abSJung-uk Kim } 22897c0b5abSJung-uk Kim 22997c0b5abSJung-uk Kim ParentTable = DtPeekSubtable (); 23097c0b5abSJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 23197c0b5abSJung-uk Kim 23297c0b5abSJung-uk Kim /* Everything past the error node header will be a subtable */ 23397c0b5abSJung-uk Kim 23497c0b5abSJung-uk Kim DtPushSubtable (Subtable); 23597c0b5abSJung-uk Kim 23697c0b5abSJung-uk Kim /* 23797c0b5abSJung-uk Kim * Compile the node-specific structure (Based on the error 23897c0b5abSJung-uk Kim * node header Type field) 23997c0b5abSJung-uk Kim */ 24097c0b5abSJung-uk Kim ErrorNodeHeader = ACPI_CAST_PTR (ACPI_AEST_HEADER, Subtable->Buffer); 24197c0b5abSJung-uk Kim 24297c0b5abSJung-uk Kim /* Point past the common error node header */ 24397c0b5abSJung-uk Kim 24497c0b5abSJung-uk Kim Offset = sizeof (ACPI_AEST_HEADER); 24597c0b5abSJung-uk Kim ErrorNodeHeader->NodeSpecificOffset = Offset; 24697c0b5abSJung-uk Kim 24797c0b5abSJung-uk Kim /* Decode the error node type */ 24897c0b5abSJung-uk Kim 24997c0b5abSJung-uk Kim switch (ErrorNodeHeader->Type) 25097c0b5abSJung-uk Kim { 25197c0b5abSJung-uk Kim case ACPI_AEST_PROCESSOR_ERROR_NODE: 25297c0b5abSJung-uk Kim 25397c0b5abSJung-uk Kim InfoTable = AcpiDmTableInfoAestProcError; 25497c0b5abSJung-uk Kim break; 25597c0b5abSJung-uk Kim 25697c0b5abSJung-uk Kim case ACPI_AEST_MEMORY_ERROR_NODE: 25797c0b5abSJung-uk Kim 25897c0b5abSJung-uk Kim InfoTable = AcpiDmTableInfoAestMemError; 25997c0b5abSJung-uk Kim break; 26097c0b5abSJung-uk Kim 26197c0b5abSJung-uk Kim case ACPI_AEST_SMMU_ERROR_NODE: 26297c0b5abSJung-uk Kim 26397c0b5abSJung-uk Kim InfoTable = AcpiDmTableInfoAestSmmuError; 26497c0b5abSJung-uk Kim break; 26597c0b5abSJung-uk Kim 26697c0b5abSJung-uk Kim case ACPI_AEST_VENDOR_ERROR_NODE: 267*92f570c3SJung-uk Kim switch (Revision) 268*92f570c3SJung-uk Kim { 269*92f570c3SJung-uk Kim case 1: 27097c0b5abSJung-uk Kim InfoTable = AcpiDmTableInfoAestVendorError; 27197c0b5abSJung-uk Kim break; 27297c0b5abSJung-uk Kim 273*92f570c3SJung-uk Kim case 2: 274*92f570c3SJung-uk Kim InfoTable = AcpiDmTableInfoAestVendorV2Error; 275*92f570c3SJung-uk Kim break; 276*92f570c3SJung-uk Kim 277*92f570c3SJung-uk Kim default: 278*92f570c3SJung-uk Kim AcpiOsPrintf ("Unknown AEST Vendor Error Revision: %X\n", 279*92f570c3SJung-uk Kim Revision); 280*92f570c3SJung-uk Kim return (AE_ERROR); 281*92f570c3SJung-uk Kim } 282*92f570c3SJung-uk Kim break; 283*92f570c3SJung-uk Kim 28497c0b5abSJung-uk Kim case ACPI_AEST_GIC_ERROR_NODE: 28597c0b5abSJung-uk Kim 28697c0b5abSJung-uk Kim InfoTable = AcpiDmTableInfoAestGicError; 28797c0b5abSJung-uk Kim break; 28897c0b5abSJung-uk Kim 289*92f570c3SJung-uk Kim case ACPI_AEST_PCIE_ERROR_NODE: 290*92f570c3SJung-uk Kim 291*92f570c3SJung-uk Kim InfoTable = AcpiDmTableInfoAestPCIeError; 292*92f570c3SJung-uk Kim break; 293*92f570c3SJung-uk Kim 294*92f570c3SJung-uk Kim case ACPI_AEST_PROXY_ERROR_NODE: 295*92f570c3SJung-uk Kim 296*92f570c3SJung-uk Kim InfoTable = AcpiDmTableInfoAestProxyError; 297*92f570c3SJung-uk Kim break; 298*92f570c3SJung-uk Kim 29997c0b5abSJung-uk Kim /* Error case below */ 30097c0b5abSJung-uk Kim default: 30197c0b5abSJung-uk Kim AcpiOsPrintf ("Unknown AEST Subtable Type: %X\n", 30297c0b5abSJung-uk Kim ErrorNodeHeader->Type); 30397c0b5abSJung-uk Kim return (AE_ERROR); 30497c0b5abSJung-uk Kim } 30597c0b5abSJung-uk Kim 30697c0b5abSJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 30797c0b5abSJung-uk Kim if (ACPI_FAILURE (Status)) 30897c0b5abSJung-uk Kim { 30997c0b5abSJung-uk Kim return (Status); 31097c0b5abSJung-uk Kim } 31197c0b5abSJung-uk Kim 31297c0b5abSJung-uk Kim /* Point past the node-specific structure */ 31397c0b5abSJung-uk Kim 31497c0b5abSJung-uk Kim Offset += Subtable->Length; 31597c0b5abSJung-uk Kim ErrorNodeHeader->NodeInterfaceOffset = Offset; 31697c0b5abSJung-uk Kim 31797c0b5abSJung-uk Kim ParentTable = DtPeekSubtable (); 31897c0b5abSJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 31997c0b5abSJung-uk Kim 32097c0b5abSJung-uk Kim /* Compile any additional node-specific substructures */ 32197c0b5abSJung-uk Kim 32297c0b5abSJung-uk Kim if (ErrorNodeHeader->Type == ACPI_AEST_PROCESSOR_ERROR_NODE) 32397c0b5abSJung-uk Kim { 32497c0b5abSJung-uk Kim /* 32597c0b5abSJung-uk Kim * Special handling for PROCESSOR_ERROR_NODE subtables 32697c0b5abSJung-uk Kim * (to handle the Resource Substructure via the ResourceType 32797c0b5abSJung-uk Kim * field). 32897c0b5abSJung-uk Kim */ 32997c0b5abSJung-uk Kim AestProcessor = ACPI_CAST_PTR (ACPI_AEST_PROCESSOR, 33097c0b5abSJung-uk Kim Subtable->Buffer); 33197c0b5abSJung-uk Kim 33297c0b5abSJung-uk Kim switch (AestProcessor->ResourceType) 33397c0b5abSJung-uk Kim { 33497c0b5abSJung-uk Kim case ACPI_AEST_CACHE_RESOURCE: 33597c0b5abSJung-uk Kim 33697c0b5abSJung-uk Kim InfoTable = AcpiDmTableInfoAestCacheRsrc; 33797c0b5abSJung-uk Kim break; 33897c0b5abSJung-uk Kim 33997c0b5abSJung-uk Kim case ACPI_AEST_TLB_RESOURCE: 34097c0b5abSJung-uk Kim 34197c0b5abSJung-uk Kim InfoTable = AcpiDmTableInfoAestTlbRsrc; 34297c0b5abSJung-uk Kim break; 34397c0b5abSJung-uk Kim 34497c0b5abSJung-uk Kim case ACPI_AEST_GENERIC_RESOURCE: 34597c0b5abSJung-uk Kim 34697c0b5abSJung-uk Kim InfoTable = AcpiDmTableInfoAestGenRsrc; 34797c0b5abSJung-uk Kim AcpiOsPrintf ("Generic Resource Type (%X) is not supported at this time\n", 34897c0b5abSJung-uk Kim AestProcessor->ResourceType); 34997c0b5abSJung-uk Kim return (AE_ERROR); 35097c0b5abSJung-uk Kim 35197c0b5abSJung-uk Kim /* Error case below */ 35297c0b5abSJung-uk Kim default: 35397c0b5abSJung-uk Kim AcpiOsPrintf ("Unknown AEST Processor Resource Type: %X\n", 35497c0b5abSJung-uk Kim AestProcessor->ResourceType); 35597c0b5abSJung-uk Kim return (AE_ERROR); 35697c0b5abSJung-uk Kim } 35797c0b5abSJung-uk Kim 35897c0b5abSJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 35997c0b5abSJung-uk Kim if (ACPI_FAILURE (Status)) 36097c0b5abSJung-uk Kim { 36197c0b5abSJung-uk Kim return (Status); 36297c0b5abSJung-uk Kim } 36397c0b5abSJung-uk Kim 36497c0b5abSJung-uk Kim /* Point past the resource substructure subtable */ 36597c0b5abSJung-uk Kim 36697c0b5abSJung-uk Kim Offset += Subtable->Length; 36797c0b5abSJung-uk Kim ErrorNodeHeader->NodeInterfaceOffset = Offset; 36897c0b5abSJung-uk Kim 36997c0b5abSJung-uk Kim ParentTable = DtPeekSubtable (); 37097c0b5abSJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 37197c0b5abSJung-uk Kim } 37297c0b5abSJung-uk Kim 37397c0b5abSJung-uk Kim /* Compile the (required) node interface structure */ 374*92f570c3SJung-uk Kim if (Revision == 1) 375*92f570c3SJung-uk Kim { 376*92f570c3SJung-uk Kim InfoTable = AcpiDmTableInfoAestXface; 377*92f570c3SJung-uk Kim } 378*92f570c3SJung-uk Kim else if (Revision == 2) 379*92f570c3SJung-uk Kim { 380*92f570c3SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoAestXfaceHeader, 38197c0b5abSJung-uk Kim &Subtable); 38297c0b5abSJung-uk Kim if (ACPI_FAILURE (Status)) 38397c0b5abSJung-uk Kim { 38497c0b5abSJung-uk Kim return (Status); 38597c0b5abSJung-uk Kim } 38697c0b5abSJung-uk Kim 387*92f570c3SJung-uk Kim ParentTable = DtPeekSubtable (); 388*92f570c3SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 389*92f570c3SJung-uk Kim 390*92f570c3SJung-uk Kim Offset += Subtable->Length; 391*92f570c3SJung-uk Kim 392*92f570c3SJung-uk Kim AestNodeHeader = ACPI_CAST_PTR (ACPI_AEST_NODE_INTERFACE_HEADER, 393*92f570c3SJung-uk Kim Subtable->Buffer); 394*92f570c3SJung-uk Kim 395*92f570c3SJung-uk Kim switch (AestNodeHeader->GroupFormat) 396*92f570c3SJung-uk Kim { 397*92f570c3SJung-uk Kim case ACPI_AEST_NODE_GROUP_FORMAT_4K: 398*92f570c3SJung-uk Kim 399*92f570c3SJung-uk Kim InfoTable = AcpiDmTableInfoAestXface4k; 400*92f570c3SJung-uk Kim break; 401*92f570c3SJung-uk Kim 402*92f570c3SJung-uk Kim case ACPI_AEST_NODE_GROUP_FORMAT_16K: 403*92f570c3SJung-uk Kim 404*92f570c3SJung-uk Kim InfoTable = AcpiDmTableInfoAestXface16k; 405*92f570c3SJung-uk Kim break; 406*92f570c3SJung-uk Kim 407*92f570c3SJung-uk Kim case ACPI_AEST_NODE_GROUP_FORMAT_64K: 408*92f570c3SJung-uk Kim 409*92f570c3SJung-uk Kim InfoTable = AcpiDmTableInfoAestXface64k; 410*92f570c3SJung-uk Kim break; 411*92f570c3SJung-uk Kim 412*92f570c3SJung-uk Kim /* Error case below */ 413*92f570c3SJung-uk Kim default: 414*92f570c3SJung-uk Kim AcpiOsPrintf ("Unknown AEST Interface Group Format: %X\n", 415*92f570c3SJung-uk Kim AestNodeHeader->GroupFormat); 416*92f570c3SJung-uk Kim return (AE_ERROR); 417*92f570c3SJung-uk Kim } 418*92f570c3SJung-uk Kim } 419*92f570c3SJung-uk Kim else 420*92f570c3SJung-uk Kim { 421*92f570c3SJung-uk Kim AcpiOsPrintf ("Unknown AEST Revision: %X\n", Revision); 422*92f570c3SJung-uk Kim } 423*92f570c3SJung-uk Kim 424*92f570c3SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 425*92f570c3SJung-uk Kim if (ACPI_FAILURE (Status)) 426*92f570c3SJung-uk Kim { 427*92f570c3SJung-uk Kim return (Status); 428*92f570c3SJung-uk Kim } 429*92f570c3SJung-uk Kim 43097c0b5abSJung-uk Kim ErrorNodeHeader->NodeInterruptOffset = 0; 43197c0b5abSJung-uk Kim ParentTable = DtPeekSubtable (); 43297c0b5abSJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 43397c0b5abSJung-uk Kim 43497c0b5abSJung-uk Kim /* Compile each of the node interrupt structures */ 43597c0b5abSJung-uk Kim 43697c0b5abSJung-uk Kim if (ErrorNodeHeader->NodeInterruptCount) 43797c0b5abSJung-uk Kim { 43897c0b5abSJung-uk Kim /* Point to the first interrupt structure */ 43997c0b5abSJung-uk Kim 44097c0b5abSJung-uk Kim Offset += Subtable->Length; 44197c0b5abSJung-uk Kim ErrorNodeHeader->NodeInterruptOffset = Offset; 44297c0b5abSJung-uk Kim } 44397c0b5abSJung-uk Kim 44497c0b5abSJung-uk Kim /* Compile each of the interrupt structures */ 44597c0b5abSJung-uk Kim 44697c0b5abSJung-uk Kim for (i = 0; i < ErrorNodeHeader->NodeInterruptCount; i++) 44797c0b5abSJung-uk Kim { 448*92f570c3SJung-uk Kim switch (Revision) { 449*92f570c3SJung-uk Kim case 1: 450*92f570c3SJung-uk Kim 451*92f570c3SJung-uk Kim InfoTable = AcpiDmTableInfoAestXrupt; 452*92f570c3SJung-uk Kim break; 453*92f570c3SJung-uk Kim 454*92f570c3SJung-uk Kim case 2: 455*92f570c3SJung-uk Kim 456*92f570c3SJung-uk Kim InfoTable = AcpiDmTableInfoAestXruptV2; 457*92f570c3SJung-uk Kim break; 458*92f570c3SJung-uk Kim 459*92f570c3SJung-uk Kim default: 460*92f570c3SJung-uk Kim AcpiOsPrintf ("Unknown AEST Revision: %X\n", Revision); 461*92f570c3SJung-uk Kim return (AE_ERROR); 462*92f570c3SJung-uk Kim } 463*92f570c3SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 46497c0b5abSJung-uk Kim if (ACPI_FAILURE (Status)) 46597c0b5abSJung-uk Kim { 46697c0b5abSJung-uk Kim return (Status); 46797c0b5abSJung-uk Kim } 46897c0b5abSJung-uk Kim 46997c0b5abSJung-uk Kim ParentTable = DtPeekSubtable (); 47097c0b5abSJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 47197c0b5abSJung-uk Kim } 47297c0b5abSJung-uk Kim 47397c0b5abSJung-uk Kim /* Prepare for the next AEST Error node */ 47497c0b5abSJung-uk Kim 47597c0b5abSJung-uk Kim DtPopSubtable (); 47697c0b5abSJung-uk Kim } 47797c0b5abSJung-uk Kim 47897c0b5abSJung-uk Kim return (AE_OK); 47997c0b5abSJung-uk Kim } 48097c0b5abSJung-uk Kim 48197c0b5abSJung-uk Kim 48297c0b5abSJung-uk Kim /****************************************************************************** 48397c0b5abSJung-uk Kim * 484ab71bbb7SJung-uk Kim * FUNCTION: DtCompileApmt 485ab71bbb7SJung-uk Kim * 486ab71bbb7SJung-uk Kim * PARAMETERS: List - Current field list pointer 487ab71bbb7SJung-uk Kim * 488ab71bbb7SJung-uk Kim * RETURN: Status 489ab71bbb7SJung-uk Kim * 490ab71bbb7SJung-uk Kim * DESCRIPTION: Compile APMT. 491ab71bbb7SJung-uk Kim * 492ab71bbb7SJung-uk Kim *****************************************************************************/ 493ab71bbb7SJung-uk Kim 494ab71bbb7SJung-uk Kim ACPI_STATUS 495ab71bbb7SJung-uk Kim DtCompileApmt ( 496ab71bbb7SJung-uk Kim void **List) 497ab71bbb7SJung-uk Kim { 498ab71bbb7SJung-uk Kim ACPI_STATUS Status; 499ab71bbb7SJung-uk Kim ACPI_TABLE_HEADER *Header; 500ab71bbb7SJung-uk Kim ACPI_APMT_NODE *ApmtNode; 501ab71bbb7SJung-uk Kim ACPI_APMT_NODE *PeerApmtNode; 502ab71bbb7SJung-uk Kim DT_SUBTABLE *Subtable; 503ab71bbb7SJung-uk Kim DT_SUBTABLE *PeerSubtable; 504ab71bbb7SJung-uk Kim DT_SUBTABLE *ParentTable; 505ab71bbb7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD**)List; 506ab71bbb7SJung-uk Kim DT_FIELD *SubtableStart; 507ab71bbb7SJung-uk Kim UINT32 CurLength; 508ab71bbb7SJung-uk Kim char MsgBuffer[64] = ""; 509ab71bbb7SJung-uk Kim 510ab71bbb7SJung-uk Kim ParentTable = DtPeekSubtable(); 511ab71bbb7SJung-uk Kim 512ab71bbb7SJung-uk Kim Header = ACPI_CAST_PTR(ACPI_TABLE_HEADER, ParentTable->Buffer); 513ab71bbb7SJung-uk Kim 514ab71bbb7SJung-uk Kim CurLength = sizeof(ACPI_TABLE_HEADER); 515ab71bbb7SJung-uk Kim 516ab71bbb7SJung-uk Kim /* Walk the parse tree */ 517ab71bbb7SJung-uk Kim 518ab71bbb7SJung-uk Kim while (*PFieldList) 519ab71bbb7SJung-uk Kim { 520ab71bbb7SJung-uk Kim /* APMT Node Subtable */ 521ab71bbb7SJung-uk Kim 522ab71bbb7SJung-uk Kim SubtableStart = *PFieldList; 523ab71bbb7SJung-uk Kim 524ab71bbb7SJung-uk Kim Status = DtCompileTable(PFieldList, AcpiDmTableInfoApmtNode, &Subtable); 525ab71bbb7SJung-uk Kim 526ab71bbb7SJung-uk Kim if (ACPI_FAILURE(Status)) 527ab71bbb7SJung-uk Kim { 528ab71bbb7SJung-uk Kim return (Status); 529ab71bbb7SJung-uk Kim } 530ab71bbb7SJung-uk Kim 531ab71bbb7SJung-uk Kim ApmtNode = ACPI_CAST_PTR(ACPI_APMT_NODE, Subtable->Buffer); 532ab71bbb7SJung-uk Kim 533ab71bbb7SJung-uk Kim if (ApmtNode->Length != sizeof(ACPI_APMT_NODE)) 534ab71bbb7SJung-uk Kim { 535ab71bbb7SJung-uk Kim DtFatal(ASL_MSG_INVALID_LENGTH, SubtableStart, "APMT"); 536ab71bbb7SJung-uk Kim return (AE_ERROR); 537ab71bbb7SJung-uk Kim } 538ab71bbb7SJung-uk Kim 539ab71bbb7SJung-uk Kim if (ApmtNode->Type >= ACPI_APMT_NODE_TYPE_COUNT) 540ab71bbb7SJung-uk Kim { 541ab71bbb7SJung-uk Kim snprintf(MsgBuffer, 64, "Node Type : 0x%X", ApmtNode->Type); 542ab71bbb7SJung-uk Kim DtFatal(ASL_MSG_INVALID_TYPE, SubtableStart, MsgBuffer); 543ab71bbb7SJung-uk Kim return (AE_ERROR); 544ab71bbb7SJung-uk Kim } 545ab71bbb7SJung-uk Kim 546ab71bbb7SJung-uk Kim PeerSubtable = DtGetNextSubtable(ParentTable, NULL); 547ab71bbb7SJung-uk Kim 548ab71bbb7SJung-uk Kim /* Validate the node id needs to be unique. */ 549ab71bbb7SJung-uk Kim while(PeerSubtable) 550ab71bbb7SJung-uk Kim { 551ab71bbb7SJung-uk Kim PeerApmtNode = ACPI_CAST_PTR(ACPI_APMT_NODE, PeerSubtable->Buffer); 552ab71bbb7SJung-uk Kim if (PeerApmtNode->Id == ApmtNode->Id) 553ab71bbb7SJung-uk Kim { 554ab71bbb7SJung-uk Kim snprintf(MsgBuffer, 64, "Node Id : 0x%X existed", ApmtNode->Id); 555ab71bbb7SJung-uk Kim DtFatal(ASL_MSG_DUPLICATE_ITEM, SubtableStart, MsgBuffer); 556ab71bbb7SJung-uk Kim return (AE_ERROR); 557ab71bbb7SJung-uk Kim } 558ab71bbb7SJung-uk Kim 559ab71bbb7SJung-uk Kim PeerSubtable = DtGetNextSubtable(ParentTable, PeerSubtable); 560ab71bbb7SJung-uk Kim } 561ab71bbb7SJung-uk Kim 562ab71bbb7SJung-uk Kim CurLength += ApmtNode->Length; 563ab71bbb7SJung-uk Kim 564ab71bbb7SJung-uk Kim DtInsertSubtable(ParentTable, Subtable); 565ab71bbb7SJung-uk Kim } 566ab71bbb7SJung-uk Kim 567ab71bbb7SJung-uk Kim if (Header->Length != CurLength) 568ab71bbb7SJung-uk Kim { 569ab71bbb7SJung-uk Kim snprintf(MsgBuffer, 64, " - APMT Length : %u (expected: %u)", 570ab71bbb7SJung-uk Kim Header->Length, CurLength); 571ab71bbb7SJung-uk Kim DtFatal(ASL_MSG_INVALID_LENGTH, NULL, MsgBuffer); 572ab71bbb7SJung-uk Kim return (AE_ERROR); 573ab71bbb7SJung-uk Kim } 574ab71bbb7SJung-uk Kim 575ab71bbb7SJung-uk Kim return (AE_OK); 576ab71bbb7SJung-uk Kim } 577ab71bbb7SJung-uk Kim 578ab71bbb7SJung-uk Kim /****************************************************************************** 579ab71bbb7SJung-uk Kim * 580f8146b88SJung-uk Kim * FUNCTION: DtCompileAsf 581f8146b88SJung-uk Kim * 582f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 583f8146b88SJung-uk Kim * 584f8146b88SJung-uk Kim * RETURN: Status 585f8146b88SJung-uk Kim * 586f8146b88SJung-uk Kim * DESCRIPTION: Compile ASF!. 587f8146b88SJung-uk Kim * 588f8146b88SJung-uk Kim *****************************************************************************/ 589f8146b88SJung-uk Kim 590f8146b88SJung-uk Kim ACPI_STATUS 591f8146b88SJung-uk Kim DtCompileAsf ( 592f8146b88SJung-uk Kim void **List) 593f8146b88SJung-uk Kim { 594f8146b88SJung-uk Kim ACPI_ASF_INFO *AsfTable; 595f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 596f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 597f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 598f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *DataInfoTable = NULL; 599f8146b88SJung-uk Kim UINT32 DataCount = 0; 600f8146b88SJung-uk Kim ACPI_STATUS Status; 601f8146b88SJung-uk Kim UINT32 i; 602f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 603f8146b88SJung-uk Kim DT_FIELD *SubtableStart; 604f8146b88SJung-uk Kim 605f8146b88SJung-uk Kim 606f8146b88SJung-uk Kim while (*PFieldList) 607f8146b88SJung-uk Kim { 608f8146b88SJung-uk Kim SubtableStart = *PFieldList; 609f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr, 610ff879b07SJung-uk Kim &Subtable); 611f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 612f8146b88SJung-uk Kim { 613f8146b88SJung-uk Kim return (Status); 614f8146b88SJung-uk Kim } 615f8146b88SJung-uk Kim 616f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 617f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 618f8146b88SJung-uk Kim DtPushSubtable (Subtable); 619f8146b88SJung-uk Kim 620f8146b88SJung-uk Kim AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer); 621f8146b88SJung-uk Kim 622f8146b88SJung-uk Kim switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */ 623f8146b88SJung-uk Kim { 624f8146b88SJung-uk Kim case ACPI_ASF_TYPE_INFO: 625f8146b88SJung-uk Kim 626f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoAsf0; 627f8146b88SJung-uk Kim break; 628f8146b88SJung-uk Kim 629f8146b88SJung-uk Kim case ACPI_ASF_TYPE_ALERT: 630f8146b88SJung-uk Kim 631f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoAsf1; 632f8146b88SJung-uk Kim break; 633f8146b88SJung-uk Kim 634f8146b88SJung-uk Kim case ACPI_ASF_TYPE_CONTROL: 635f8146b88SJung-uk Kim 636f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoAsf2; 637f8146b88SJung-uk Kim break; 638f8146b88SJung-uk Kim 639f8146b88SJung-uk Kim case ACPI_ASF_TYPE_BOOT: 640f8146b88SJung-uk Kim 641f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoAsf3; 642f8146b88SJung-uk Kim break; 643f8146b88SJung-uk Kim 644f8146b88SJung-uk Kim case ACPI_ASF_TYPE_ADDRESS: 645f8146b88SJung-uk Kim 646f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoAsf4; 647f8146b88SJung-uk Kim break; 648f8146b88SJung-uk Kim 649f8146b88SJung-uk Kim default: 650f8146b88SJung-uk Kim 651f8146b88SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!"); 652f8146b88SJung-uk Kim return (AE_ERROR); 653f8146b88SJung-uk Kim } 654f8146b88SJung-uk Kim 655ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 656f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 657f8146b88SJung-uk Kim { 658f8146b88SJung-uk Kim return (Status); 659f8146b88SJung-uk Kim } 660f8146b88SJung-uk Kim 661f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 662f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 663f8146b88SJung-uk Kim 664f8146b88SJung-uk Kim switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */ 665f8146b88SJung-uk Kim { 666f8146b88SJung-uk Kim case ACPI_ASF_TYPE_INFO: 667f8146b88SJung-uk Kim 668f8146b88SJung-uk Kim DataInfoTable = NULL; 669f8146b88SJung-uk Kim break; 670f8146b88SJung-uk Kim 671f8146b88SJung-uk Kim case ACPI_ASF_TYPE_ALERT: 672f8146b88SJung-uk Kim 673f8146b88SJung-uk Kim DataInfoTable = AcpiDmTableInfoAsf1a; 674f8146b88SJung-uk Kim DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, 675f8146b88SJung-uk Kim ACPI_SUB_PTR (UINT8, Subtable->Buffer, 676f8146b88SJung-uk Kim sizeof (ACPI_ASF_HEADER)))->Alerts; 677f8146b88SJung-uk Kim break; 678f8146b88SJung-uk Kim 679f8146b88SJung-uk Kim case ACPI_ASF_TYPE_CONTROL: 680f8146b88SJung-uk Kim 681f8146b88SJung-uk Kim DataInfoTable = AcpiDmTableInfoAsf2a; 682f8146b88SJung-uk Kim DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, 683f8146b88SJung-uk Kim ACPI_SUB_PTR (UINT8, Subtable->Buffer, 684f8146b88SJung-uk Kim sizeof (ACPI_ASF_HEADER)))->Controls; 685f8146b88SJung-uk Kim break; 686f8146b88SJung-uk Kim 687f8146b88SJung-uk Kim case ACPI_ASF_TYPE_BOOT: 688f8146b88SJung-uk Kim 689f8146b88SJung-uk Kim DataInfoTable = NULL; 690f8146b88SJung-uk Kim break; 691f8146b88SJung-uk Kim 692f8146b88SJung-uk Kim case ACPI_ASF_TYPE_ADDRESS: 693f8146b88SJung-uk Kim 694f8146b88SJung-uk Kim DataInfoTable = TableInfoAsfAddress; 695f8146b88SJung-uk Kim DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, 696f8146b88SJung-uk Kim ACPI_SUB_PTR (UINT8, Subtable->Buffer, 697f8146b88SJung-uk Kim sizeof (ACPI_ASF_HEADER)))->Devices; 698f8146b88SJung-uk Kim break; 699f8146b88SJung-uk Kim 700f8146b88SJung-uk Kim default: 701f8146b88SJung-uk Kim 702f8146b88SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!"); 703f8146b88SJung-uk Kim return (AE_ERROR); 704f8146b88SJung-uk Kim } 705f8146b88SJung-uk Kim 706f8146b88SJung-uk Kim if (DataInfoTable) 707f8146b88SJung-uk Kim { 708f8146b88SJung-uk Kim switch (AsfTable->Header.Type & 0x7F) 709f8146b88SJung-uk Kim { 710f8146b88SJung-uk Kim case ACPI_ASF_TYPE_ADDRESS: 711f8146b88SJung-uk Kim 712f8146b88SJung-uk Kim while (DataCount > 0) 713f8146b88SJung-uk Kim { 714f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, DataInfoTable, 715ff879b07SJung-uk Kim &Subtable); 716f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 717f8146b88SJung-uk Kim { 718f8146b88SJung-uk Kim return (Status); 719f8146b88SJung-uk Kim } 720f8146b88SJung-uk Kim 721f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 722f8146b88SJung-uk Kim DataCount = DataCount - Subtable->Length; 723f8146b88SJung-uk Kim } 724f8146b88SJung-uk Kim break; 725f8146b88SJung-uk Kim 726f8146b88SJung-uk Kim default: 727f8146b88SJung-uk Kim 728f8146b88SJung-uk Kim for (i = 0; i < DataCount; i++) 729f8146b88SJung-uk Kim { 730f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, DataInfoTable, 731ff879b07SJung-uk Kim &Subtable); 732f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 733f8146b88SJung-uk Kim { 734f8146b88SJung-uk Kim return (Status); 735f8146b88SJung-uk Kim } 736f8146b88SJung-uk Kim 737f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 738f8146b88SJung-uk Kim } 739f8146b88SJung-uk Kim break; 740f8146b88SJung-uk Kim } 741f8146b88SJung-uk Kim } 742f8146b88SJung-uk Kim 743f8146b88SJung-uk Kim DtPopSubtable (); 744f8146b88SJung-uk Kim } 745f8146b88SJung-uk Kim 746f8146b88SJung-uk Kim return (AE_OK); 747f8146b88SJung-uk Kim } 748f8146b88SJung-uk Kim 749722b1667SJung-uk Kim /****************************************************************************** 750722b1667SJung-uk Kim * 751722b1667SJung-uk Kim * FUNCTION: DtCompileAspt 752722b1667SJung-uk Kim * 753722b1667SJung-uk Kim * PARAMETERS: List - Current field list pointer 754722b1667SJung-uk Kim * 755722b1667SJung-uk Kim * RETURN: Status 756722b1667SJung-uk Kim * 757722b1667SJung-uk Kim * DESCRIPTION: Compile ASPT. 758722b1667SJung-uk Kim * 759722b1667SJung-uk Kim *****************************************************************************/ 760722b1667SJung-uk Kim 761722b1667SJung-uk Kim ACPI_STATUS 762722b1667SJung-uk Kim DtCompileAspt ( 763722b1667SJung-uk Kim void **List) 764722b1667SJung-uk Kim { 765722b1667SJung-uk Kim ACPI_ASPT_HEADER *AsptTable; 766722b1667SJung-uk Kim DT_SUBTABLE *Subtable; 767722b1667SJung-uk Kim DT_SUBTABLE *ParentTable; 768722b1667SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 769722b1667SJung-uk Kim ACPI_STATUS Status; 770722b1667SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 771722b1667SJung-uk Kim DT_FIELD *SubtableStart; 772722b1667SJung-uk Kim 773722b1667SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoAspt, &Subtable); 774722b1667SJung-uk Kim if (ACPI_FAILURE (Status)) 775722b1667SJung-uk Kim { 776722b1667SJung-uk Kim return (Status); 777722b1667SJung-uk Kim } 778722b1667SJung-uk Kim 779722b1667SJung-uk Kim ParentTable = DtPeekSubtable (); 780722b1667SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 781722b1667SJung-uk Kim 782722b1667SJung-uk Kim while (*PFieldList) 783722b1667SJung-uk Kim { 784722b1667SJung-uk Kim SubtableStart = *PFieldList; 785722b1667SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsptHdr, 786722b1667SJung-uk Kim &Subtable); 787722b1667SJung-uk Kim if (ACPI_FAILURE (Status)) 788722b1667SJung-uk Kim { 789722b1667SJung-uk Kim return (Status); 790722b1667SJung-uk Kim } 791722b1667SJung-uk Kim 792722b1667SJung-uk Kim ParentTable = DtPeekSubtable (); 793722b1667SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 794722b1667SJung-uk Kim DtPushSubtable (Subtable); 795722b1667SJung-uk Kim 796722b1667SJung-uk Kim AsptTable = ACPI_CAST_PTR (ACPI_ASPT_HEADER, Subtable->Buffer); 797722b1667SJung-uk Kim 798722b1667SJung-uk Kim switch (AsptTable->Type) /* Mask off top bit */ 799722b1667SJung-uk Kim { 800722b1667SJung-uk Kim case ACPI_ASPT_TYPE_GLOBAL_REGS: 801722b1667SJung-uk Kim 802722b1667SJung-uk Kim InfoTable = AcpiDmTableInfoAspt0; 803722b1667SJung-uk Kim break; 804722b1667SJung-uk Kim 805722b1667SJung-uk Kim case ACPI_ASPT_TYPE_SEV_MBOX_REGS: 806722b1667SJung-uk Kim 807722b1667SJung-uk Kim InfoTable = AcpiDmTableInfoAspt1; 808722b1667SJung-uk Kim break; 809722b1667SJung-uk Kim 810722b1667SJung-uk Kim case ACPI_ASPT_TYPE_ACPI_MBOX_REGS: 811722b1667SJung-uk Kim 812722b1667SJung-uk Kim InfoTable = AcpiDmTableInfoAspt2; 813722b1667SJung-uk Kim break; 814722b1667SJung-uk Kim 815722b1667SJung-uk Kim default: 816722b1667SJung-uk Kim 817722b1667SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASPT"); 818722b1667SJung-uk Kim return (AE_ERROR); 819722b1667SJung-uk Kim } 820722b1667SJung-uk Kim 821722b1667SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 822722b1667SJung-uk Kim if (ACPI_FAILURE (Status)) 823722b1667SJung-uk Kim { 824722b1667SJung-uk Kim return (Status); 825722b1667SJung-uk Kim } 826722b1667SJung-uk Kim ParentTable = DtPeekSubtable (); 827722b1667SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 828722b1667SJung-uk Kim DtPopSubtable (); 829722b1667SJung-uk Kim } 830722b1667SJung-uk Kim 831722b1667SJung-uk Kim return (AE_OK); 832722b1667SJung-uk Kim } 833722b1667SJung-uk Kim 834f8146b88SJung-uk Kim 835f8146b88SJung-uk Kim /****************************************************************************** 836f8146b88SJung-uk Kim * 8379a4bc520SJung-uk Kim * FUNCTION: DtCompileCdat 8389a4bc520SJung-uk Kim * 8399a4bc520SJung-uk Kim * PARAMETERS: List - Current field list pointer 8409a4bc520SJung-uk Kim * 8419a4bc520SJung-uk Kim * RETURN: Status 8429a4bc520SJung-uk Kim * 8439a4bc520SJung-uk Kim * DESCRIPTION: Compile CDAT. 8449a4bc520SJung-uk Kim * 8459a4bc520SJung-uk Kim *****************************************************************************/ 8469a4bc520SJung-uk Kim 8479a4bc520SJung-uk Kim ACPI_STATUS 8489a4bc520SJung-uk Kim DtCompileCdat ( 8499a4bc520SJung-uk Kim void **List) 8509a4bc520SJung-uk Kim { 8519a4bc520SJung-uk Kim ACPI_STATUS Status = AE_OK; 8529a4bc520SJung-uk Kim DT_SUBTABLE *Subtable; 8539a4bc520SJung-uk Kim DT_SUBTABLE *ParentTable; 8549a4bc520SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 8559a4bc520SJung-uk Kim ACPI_CDAT_HEADER *CdatHeader; 8569a4bc520SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable = NULL; 8579a4bc520SJung-uk Kim DT_FIELD *SubtableStart; 8589a4bc520SJung-uk Kim 8599a4bc520SJung-uk Kim 8609a4bc520SJung-uk Kim /* Walk the parse tree. 8619a4bc520SJung-uk Kim * 8629a4bc520SJung-uk Kim * Note: Main table consists of only the CDAT table header 8639a4bc520SJung-uk Kim * (This is not the standard ACPI table header, however)-- 8649a4bc520SJung-uk Kim * Followed by some number of subtables. 8659a4bc520SJung-uk Kim */ 8669a4bc520SJung-uk Kim while (*PFieldList) 8679a4bc520SJung-uk Kim { 8689a4bc520SJung-uk Kim SubtableStart = *PFieldList; 8699a4bc520SJung-uk Kim 8709a4bc520SJung-uk Kim /* Compile the expected CDAT Subtable header */ 8719a4bc520SJung-uk Kim 8729a4bc520SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoCdatHeader, 8739a4bc520SJung-uk Kim &Subtable); 8749a4bc520SJung-uk Kim if (ACPI_FAILURE (Status)) 8759a4bc520SJung-uk Kim { 8769a4bc520SJung-uk Kim return (Status); 8779a4bc520SJung-uk Kim } 8789a4bc520SJung-uk Kim 8799a4bc520SJung-uk Kim ParentTable = DtPeekSubtable (); 8809a4bc520SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 8819a4bc520SJung-uk Kim DtPushSubtable (Subtable); 8829a4bc520SJung-uk Kim 8839a4bc520SJung-uk Kim CdatHeader = ACPI_CAST_PTR (ACPI_CDAT_HEADER, Subtable->Buffer); 8849a4bc520SJung-uk Kim 8859a4bc520SJung-uk Kim /* Decode the subtable by type */ 8869a4bc520SJung-uk Kim 8879a4bc520SJung-uk Kim switch (CdatHeader->Type) 8889a4bc520SJung-uk Kim { 8899a4bc520SJung-uk Kim case ACPI_CDAT_TYPE_DSMAS: 8909a4bc520SJung-uk Kim InfoTable = AcpiDmTableInfoCdat0; 8919a4bc520SJung-uk Kim break; 8929a4bc520SJung-uk Kim 8939a4bc520SJung-uk Kim case ACPI_CDAT_TYPE_DSLBIS: 8949a4bc520SJung-uk Kim InfoTable = AcpiDmTableInfoCdat1; 8959a4bc520SJung-uk Kim break; 8969a4bc520SJung-uk Kim 8979a4bc520SJung-uk Kim case ACPI_CDAT_TYPE_DSMSCIS: 8989a4bc520SJung-uk Kim InfoTable = AcpiDmTableInfoCdat2; 8999a4bc520SJung-uk Kim break; 9009a4bc520SJung-uk Kim 9019a4bc520SJung-uk Kim case ACPI_CDAT_TYPE_DSIS: 9029a4bc520SJung-uk Kim InfoTable = AcpiDmTableInfoCdat3; 9039a4bc520SJung-uk Kim break; 9049a4bc520SJung-uk Kim 9059a4bc520SJung-uk Kim case ACPI_CDAT_TYPE_DSEMTS: 9069a4bc520SJung-uk Kim InfoTable = AcpiDmTableInfoCdat4; 9079a4bc520SJung-uk Kim break; 9089a4bc520SJung-uk Kim 9099a4bc520SJung-uk Kim case ACPI_CDAT_TYPE_SSLBIS: 9109a4bc520SJung-uk Kim InfoTable = AcpiDmTableInfoCdat5; 9119a4bc520SJung-uk Kim break; 9129a4bc520SJung-uk Kim 9139a4bc520SJung-uk Kim default: 9149a4bc520SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "CDAT"); 9159a4bc520SJung-uk Kim } 9169a4bc520SJung-uk Kim 9179a4bc520SJung-uk Kim /* Compile the CDAT subtable */ 9189a4bc520SJung-uk Kim 9199a4bc520SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 9209a4bc520SJung-uk Kim if (ACPI_FAILURE (Status)) 9219a4bc520SJung-uk Kim { 9229a4bc520SJung-uk Kim return (Status); 9239a4bc520SJung-uk Kim } 9249a4bc520SJung-uk Kim 9259a4bc520SJung-uk Kim ParentTable = DtPeekSubtable (); 9269a4bc520SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 9279a4bc520SJung-uk Kim 9289a4bc520SJung-uk Kim switch (CdatHeader->Type) 9299a4bc520SJung-uk Kim { 9309a4bc520SJung-uk Kim /* Multiple entries supported for this type */ 9319a4bc520SJung-uk Kim 9329a4bc520SJung-uk Kim case ACPI_CDAT_TYPE_SSLBIS: 9339a4bc520SJung-uk Kim 9349a4bc520SJung-uk Kim /* 9359a4bc520SJung-uk Kim * Check for multiple SSLBEs 9369a4bc520SJung-uk Kim */ 9379a4bc520SJung-uk Kim while (*PFieldList && !AcpiUtStricmp ((*PFieldList)->Name, "Port X ID")) 9389a4bc520SJung-uk Kim { 9399a4bc520SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoCdatEntries, &Subtable); 9409a4bc520SJung-uk Kim if (ACPI_FAILURE (Status)) 9419a4bc520SJung-uk Kim { 9429a4bc520SJung-uk Kim return (Status); 9439a4bc520SJung-uk Kim } 9449a4bc520SJung-uk Kim ParentTable = DtPeekSubtable (); 9459a4bc520SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 9469a4bc520SJung-uk Kim } 9479a4bc520SJung-uk Kim break; 9489a4bc520SJung-uk Kim 9499a4bc520SJung-uk Kim default: 9509a4bc520SJung-uk Kim break; 9519a4bc520SJung-uk Kim } 9529a4bc520SJung-uk Kim 9539a4bc520SJung-uk Kim /* Pop off the CDAT Subtable header subtree */ 9549a4bc520SJung-uk Kim 9559a4bc520SJung-uk Kim DtPopSubtable (); 9569a4bc520SJung-uk Kim } 9579a4bc520SJung-uk Kim 9589a4bc520SJung-uk Kim return (AE_OK); 9599a4bc520SJung-uk Kim } 9609a4bc520SJung-uk Kim 9619a4bc520SJung-uk Kim 9629a4bc520SJung-uk Kim /****************************************************************************** 9639a4bc520SJung-uk Kim * 964cfd1ed46SJung-uk Kim * FUNCTION: DtCompileCedt 965cfd1ed46SJung-uk Kim * 966cfd1ed46SJung-uk Kim * PARAMETERS: List - Current field list pointer 967cfd1ed46SJung-uk Kim * 968cfd1ed46SJung-uk Kim * RETURN: Status 969cfd1ed46SJung-uk Kim * 970cfd1ed46SJung-uk Kim * DESCRIPTION: Compile CEDT. 971cfd1ed46SJung-uk Kim * 972cfd1ed46SJung-uk Kim *****************************************************************************/ 973cfd1ed46SJung-uk Kim 974cfd1ed46SJung-uk Kim ACPI_STATUS 975cfd1ed46SJung-uk Kim DtCompileCedt ( 976cfd1ed46SJung-uk Kim void **List) 977cfd1ed46SJung-uk Kim { 978cfd1ed46SJung-uk Kim ACPI_STATUS Status; 979cfd1ed46SJung-uk Kim DT_SUBTABLE *Subtable; 980cfd1ed46SJung-uk Kim DT_SUBTABLE *ParentTable; 981cfd1ed46SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 982cfd1ed46SJung-uk Kim ACPI_CEDT_HEADER *CedtHeader; 983cfd1ed46SJung-uk Kim DT_FIELD *SubtableStart; 984cfd1ed46SJung-uk Kim 985cfd1ed46SJung-uk Kim 986cfd1ed46SJung-uk Kim /* Walk the parse tree */ 987cfd1ed46SJung-uk Kim 988cfd1ed46SJung-uk Kim while (*PFieldList) 989cfd1ed46SJung-uk Kim { 990ab71bbb7SJung-uk Kim /* if CFMWS and has more than one target, then set to zero later */ 991ab71bbb7SJung-uk Kim 992ab71bbb7SJung-uk Kim int InsertFlag = 1; 993cfd1ed46SJung-uk Kim SubtableStart = *PFieldList; 994cfd1ed46SJung-uk Kim 995cfd1ed46SJung-uk Kim /* CEDT Header */ 996cfd1ed46SJung-uk Kim 997cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedtHdr, 998cfd1ed46SJung-uk Kim &Subtable); 999cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 1000cfd1ed46SJung-uk Kim { 1001cfd1ed46SJung-uk Kim return (Status); 1002cfd1ed46SJung-uk Kim } 1003cfd1ed46SJung-uk Kim 1004cfd1ed46SJung-uk Kim ParentTable = DtPeekSubtable (); 1005cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1006cfd1ed46SJung-uk Kim DtPushSubtable (Subtable); 1007cfd1ed46SJung-uk Kim 1008cfd1ed46SJung-uk Kim CedtHeader = ACPI_CAST_PTR (ACPI_CEDT_HEADER, Subtable->Buffer); 1009cfd1ed46SJung-uk Kim 1010cfd1ed46SJung-uk Kim switch (CedtHeader->Type) 1011cfd1ed46SJung-uk Kim { 1012cfd1ed46SJung-uk Kim case ACPI_CEDT_TYPE_CHBS: 1013cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt0, &Subtable); 1014cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 1015cfd1ed46SJung-uk Kim { 1016cfd1ed46SJung-uk Kim return (Status); 1017cfd1ed46SJung-uk Kim } 1018ab71bbb7SJung-uk Kim break; 1019ab71bbb7SJung-uk Kim case ACPI_CEDT_TYPE_CFMWS: { 1020ab71bbb7SJung-uk Kim unsigned char *dump; 1021ab71bbb7SJung-uk Kim unsigned int idx, offset, max = 0; 1022ab71bbb7SJung-uk Kim 1023ab71bbb7SJung-uk Kim /* Compile table with first "Interleave target" */ 1024ab71bbb7SJung-uk Kim 1025ab71bbb7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt1, &Subtable); 1026ab71bbb7SJung-uk Kim if (ACPI_FAILURE (Status)) 1027ab71bbb7SJung-uk Kim { 1028ab71bbb7SJung-uk Kim return (Status); 1029ab71bbb7SJung-uk Kim } 1030ab71bbb7SJung-uk Kim 1031ab71bbb7SJung-uk Kim /* Look in buffer for the number of targets */ 1032ab71bbb7SJung-uk Kim offset = (unsigned int) ACPI_OFFSET (ACPI_CEDT_CFMWS, InterleaveWays); 1033ab71bbb7SJung-uk Kim dump = (unsigned char *) Subtable->Buffer - 4; /* place at beginning of cedt1 */ 1034ab71bbb7SJung-uk Kim max = 0x01 << dump[offset]; /* 2^max, so 0=1, 1=2, 2=4, 3=8. 8 is MAX */ 1035ab71bbb7SJung-uk Kim if (max > 8) max=1; /* Error in encoding Interleaving Ways. */ 1036ab71bbb7SJung-uk Kim if (max == 1) /* if only one target, then break here. */ 1037ab71bbb7SJung-uk Kim break; /* break if only one target. */ 1038ab71bbb7SJung-uk Kim 1039ab71bbb7SJung-uk Kim /* We need to add more interleave targets, so write the current Subtable. */ 1040cfd1ed46SJung-uk Kim 1041cfd1ed46SJung-uk Kim ParentTable = DtPeekSubtable (); 1042ab71bbb7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); /* Insert AcpiDmTableInfoCedt1 table so we can put in */ 1043ab71bbb7SJung-uk Kim DtPushSubtable (Subtable); /* the targets > the first. */ 1044ab71bbb7SJung-uk Kim 1045ab71bbb7SJung-uk Kim /* Now, find out all interleave targets beyond the first. */ 1046ab71bbb7SJung-uk Kim 1047ab71bbb7SJung-uk Kim for (idx = 1; idx < max; idx++) { 1048ab71bbb7SJung-uk Kim ParentTable = DtPeekSubtable (); 1049ab71bbb7SJung-uk Kim 1050ab71bbb7SJung-uk Kim if (*PFieldList) 1051ab71bbb7SJung-uk Kim { 1052ab71bbb7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt1_te, &Subtable); 1053ab71bbb7SJung-uk Kim if (ACPI_FAILURE (Status)) 1054ab71bbb7SJung-uk Kim { 1055ab71bbb7SJung-uk Kim return (Status); 1056ab71bbb7SJung-uk Kim } 1057ab71bbb7SJung-uk Kim if (Subtable) 1058ab71bbb7SJung-uk Kim { 1059ab71bbb7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); /* got a target, so insert table. */ 1060ab71bbb7SJung-uk Kim InsertFlag = 0; 1061ab71bbb7SJung-uk Kim } 1062ab71bbb7SJung-uk Kim } 1063ab71bbb7SJung-uk Kim } 1064ab71bbb7SJung-uk Kim 1065ab71bbb7SJung-uk Kim DtPopSubtable (); 1066ab71bbb7SJung-uk Kim ParentTable = DtPeekSubtable (); 1067ab71bbb7SJung-uk Kim break; 1068ab71bbb7SJung-uk Kim } 1069*92f570c3SJung-uk Kim case ACPI_CEDT_TYPE_CXIMS: { 1070*92f570c3SJung-uk Kim unsigned char *dump; 1071*92f570c3SJung-uk Kim unsigned int idx, offset, max = 0; 1072*92f570c3SJung-uk Kim 1073*92f570c3SJung-uk Kim /* Compile table with first "Xor map" */ 1074*92f570c3SJung-uk Kim 1075*92f570c3SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt2, &Subtable); 1076*92f570c3SJung-uk Kim if (ACPI_FAILURE (Status)) 1077*92f570c3SJung-uk Kim { 1078*92f570c3SJung-uk Kim return (Status); 1079*92f570c3SJung-uk Kim } 1080*92f570c3SJung-uk Kim 1081*92f570c3SJung-uk Kim /* Look in buffer for the number of Xor maps */ 1082*92f570c3SJung-uk Kim offset = (unsigned int) ACPI_OFFSET (ACPI_CEDT_CXIMS, NrXormaps); 1083*92f570c3SJung-uk Kim dump = (unsigned char *) Subtable->Buffer - 4; /* place at beginning of cedt2 */ 1084*92f570c3SJung-uk Kim max = dump[offset]; 1085*92f570c3SJung-uk Kim 1086*92f570c3SJung-uk Kim /* We need to add more XOR maps, so write the current Subtable. */ 1087*92f570c3SJung-uk Kim 1088*92f570c3SJung-uk Kim ParentTable = DtPeekSubtable (); 1089*92f570c3SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); /* Insert AcpiDmTableInfoCedt2 table so we can put in */ 1090*92f570c3SJung-uk Kim DtPushSubtable (Subtable); 1091*92f570c3SJung-uk Kim 1092*92f570c3SJung-uk Kim /* Now, find out all Xor maps beyond the first. */ 1093*92f570c3SJung-uk Kim 1094*92f570c3SJung-uk Kim for (idx = 1; idx < max; idx++) { 1095*92f570c3SJung-uk Kim ParentTable = DtPeekSubtable (); 1096*92f570c3SJung-uk Kim 1097*92f570c3SJung-uk Kim if (*PFieldList) 1098*92f570c3SJung-uk Kim { 1099*92f570c3SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt2_te, &Subtable); 1100*92f570c3SJung-uk Kim if (ACPI_FAILURE (Status)) 1101*92f570c3SJung-uk Kim { 1102*92f570c3SJung-uk Kim return (Status); 1103*92f570c3SJung-uk Kim } 1104*92f570c3SJung-uk Kim if (Subtable) 1105*92f570c3SJung-uk Kim { 1106*92f570c3SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); /* got an Xor map, so insert table. */ 1107*92f570c3SJung-uk Kim InsertFlag = 0; 1108*92f570c3SJung-uk Kim } 1109*92f570c3SJung-uk Kim } 1110*92f570c3SJung-uk Kim } 1111*92f570c3SJung-uk Kim 1112*92f570c3SJung-uk Kim DtPopSubtable (); 1113*92f570c3SJung-uk Kim ParentTable = DtPeekSubtable (); 1114*92f570c3SJung-uk Kim break; 1115*92f570c3SJung-uk Kim } 1116ab71bbb7SJung-uk Kim 1117ab71bbb7SJung-uk Kim default: 1118ab71bbb7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "CEDT"); 1119ab71bbb7SJung-uk Kim return (AE_ERROR); 1120ab71bbb7SJung-uk Kim } 1121ab71bbb7SJung-uk Kim 1122ab71bbb7SJung-uk Kim ParentTable = DtPeekSubtable (); 1123ab71bbb7SJung-uk Kim if (InsertFlag == 1) { 1124cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1125ab71bbb7SJung-uk Kim } 1126cfd1ed46SJung-uk Kim DtPopSubtable (); 1127cfd1ed46SJung-uk Kim } 1128cfd1ed46SJung-uk Kim 1129cfd1ed46SJung-uk Kim return (AE_OK); 1130cfd1ed46SJung-uk Kim } 1131cfd1ed46SJung-uk Kim 1132cfd1ed46SJung-uk Kim 1133cfd1ed46SJung-uk Kim /****************************************************************************** 1134cfd1ed46SJung-uk Kim * 1135f8146b88SJung-uk Kim * FUNCTION: DtCompileCpep 1136f8146b88SJung-uk Kim * 1137f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 1138f8146b88SJung-uk Kim * 1139f8146b88SJung-uk Kim * RETURN: Status 1140f8146b88SJung-uk Kim * 1141f8146b88SJung-uk Kim * DESCRIPTION: Compile CPEP. 1142f8146b88SJung-uk Kim * 1143f8146b88SJung-uk Kim *****************************************************************************/ 1144f8146b88SJung-uk Kim 1145f8146b88SJung-uk Kim ACPI_STATUS 1146f8146b88SJung-uk Kim DtCompileCpep ( 1147f8146b88SJung-uk Kim void **List) 1148f8146b88SJung-uk Kim { 1149f8146b88SJung-uk Kim ACPI_STATUS Status; 1150f8146b88SJung-uk Kim 1151f8146b88SJung-uk Kim 1152f8146b88SJung-uk Kim Status = DtCompileTwoSubtables (List, 1153f8146b88SJung-uk Kim AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0); 1154f8146b88SJung-uk Kim return (Status); 1155f8146b88SJung-uk Kim } 1156f8146b88SJung-uk Kim 1157f8146b88SJung-uk Kim 1158f8146b88SJung-uk Kim /****************************************************************************** 1159f8146b88SJung-uk Kim * 1160f8146b88SJung-uk Kim * FUNCTION: DtCompileCsrt 1161f8146b88SJung-uk Kim * 1162f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 1163f8146b88SJung-uk Kim * 1164f8146b88SJung-uk Kim * RETURN: Status 1165f8146b88SJung-uk Kim * 1166f8146b88SJung-uk Kim * DESCRIPTION: Compile CSRT. 1167f8146b88SJung-uk Kim * 1168f8146b88SJung-uk Kim *****************************************************************************/ 1169f8146b88SJung-uk Kim 1170f8146b88SJung-uk Kim ACPI_STATUS 1171f8146b88SJung-uk Kim DtCompileCsrt ( 1172f8146b88SJung-uk Kim void **List) 1173f8146b88SJung-uk Kim { 1174f8146b88SJung-uk Kim ACPI_STATUS Status = AE_OK; 1175f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 1176f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 1177f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1178f8146b88SJung-uk Kim UINT32 DescriptorCount; 1179f8146b88SJung-uk Kim UINT32 GroupLength; 1180f8146b88SJung-uk Kim 1181f8146b88SJung-uk Kim 1182f8146b88SJung-uk Kim /* Subtables (Resource Groups) */ 1183f8146b88SJung-uk Kim 1184f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1185f8146b88SJung-uk Kim while (*PFieldList) 1186f8146b88SJung-uk Kim { 1187f8146b88SJung-uk Kim /* Resource group subtable */ 1188f8146b88SJung-uk Kim 1189f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt0, 1190ff879b07SJung-uk Kim &Subtable); 1191f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1192f8146b88SJung-uk Kim { 1193f8146b88SJung-uk Kim return (Status); 1194f8146b88SJung-uk Kim } 1195f8146b88SJung-uk Kim 1196f8146b88SJung-uk Kim /* Compute the number of resource descriptors */ 1197f8146b88SJung-uk Kim 1198f8146b88SJung-uk Kim GroupLength = 1199f8146b88SJung-uk Kim (ACPI_CAST_PTR (ACPI_CSRT_GROUP, 1200f8146b88SJung-uk Kim Subtable->Buffer))->Length - 1201f8146b88SJung-uk Kim (ACPI_CAST_PTR (ACPI_CSRT_GROUP, 1202f8146b88SJung-uk Kim Subtable->Buffer))->SharedInfoLength - 1203f8146b88SJung-uk Kim sizeof (ACPI_CSRT_GROUP); 1204f8146b88SJung-uk Kim 1205f8146b88SJung-uk Kim DescriptorCount = (GroupLength / 1206f8146b88SJung-uk Kim sizeof (ACPI_CSRT_DESCRIPTOR)); 1207f8146b88SJung-uk Kim 1208f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1209f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1210f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1211f8146b88SJung-uk Kim 1212f8146b88SJung-uk Kim /* Shared info subtable (One per resource group) */ 1213f8146b88SJung-uk Kim 1214f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt1, 1215ff879b07SJung-uk Kim &Subtable); 1216f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1217f8146b88SJung-uk Kim { 1218f8146b88SJung-uk Kim return (Status); 1219f8146b88SJung-uk Kim } 1220f8146b88SJung-uk Kim 1221f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1222f8146b88SJung-uk Kim 1223f8146b88SJung-uk Kim /* Sub-Subtables (Resource Descriptors) */ 1224f8146b88SJung-uk Kim 1225f8146b88SJung-uk Kim while (*PFieldList && DescriptorCount) 1226f8146b88SJung-uk Kim { 1227f8146b88SJung-uk Kim 1228f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2, 1229ff879b07SJung-uk Kim &Subtable); 1230f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1231f8146b88SJung-uk Kim { 1232f8146b88SJung-uk Kim return (Status); 1233f8146b88SJung-uk Kim } 1234f8146b88SJung-uk Kim 1235f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1236f8146b88SJung-uk Kim 1237f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1238f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1239f8146b88SJung-uk Kim if (*PFieldList) 1240f8146b88SJung-uk Kim { 1241f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2a, 1242ff879b07SJung-uk Kim &Subtable); 1243f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1244f8146b88SJung-uk Kim { 1245f8146b88SJung-uk Kim return (Status); 1246f8146b88SJung-uk Kim } 1247f8146b88SJung-uk Kim if (Subtable) 1248f8146b88SJung-uk Kim { 1249f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1250f8146b88SJung-uk Kim } 1251f8146b88SJung-uk Kim } 1252f8146b88SJung-uk Kim 1253f8146b88SJung-uk Kim DtPopSubtable (); 1254f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1255f8146b88SJung-uk Kim DescriptorCount--; 1256f8146b88SJung-uk Kim } 1257f8146b88SJung-uk Kim 1258f8146b88SJung-uk Kim DtPopSubtable (); 1259f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1260f8146b88SJung-uk Kim } 1261f8146b88SJung-uk Kim 1262f8146b88SJung-uk Kim return (Status); 1263f8146b88SJung-uk Kim } 1264f8146b88SJung-uk Kim 1265f8146b88SJung-uk Kim 1266f8146b88SJung-uk Kim /****************************************************************************** 1267f8146b88SJung-uk Kim * 1268f8146b88SJung-uk Kim * FUNCTION: DtCompileDbg2 1269f8146b88SJung-uk Kim * 1270f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 1271f8146b88SJung-uk Kim * 1272f8146b88SJung-uk Kim * RETURN: Status 1273f8146b88SJung-uk Kim * 1274f8146b88SJung-uk Kim * DESCRIPTION: Compile DBG2. 1275f8146b88SJung-uk Kim * 1276f8146b88SJung-uk Kim *****************************************************************************/ 1277f8146b88SJung-uk Kim 1278f8146b88SJung-uk Kim ACPI_STATUS 1279f8146b88SJung-uk Kim DtCompileDbg2 ( 1280f8146b88SJung-uk Kim void **List) 1281f8146b88SJung-uk Kim { 1282f8146b88SJung-uk Kim ACPI_STATUS Status; 1283f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 1284f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 1285f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1286f8146b88SJung-uk Kim UINT32 SubtableCount; 1287f8146b88SJung-uk Kim ACPI_DBG2_HEADER *Dbg2Header; 1288f8146b88SJung-uk Kim ACPI_DBG2_DEVICE *DeviceInfo; 1289f8146b88SJung-uk Kim UINT16 CurrentOffset; 1290f8146b88SJung-uk Kim UINT32 i; 1291f8146b88SJung-uk Kim 1292f8146b88SJung-uk Kim 1293f8146b88SJung-uk Kim /* Main table */ 1294f8146b88SJung-uk Kim 1295ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2, &Subtable); 1296f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1297f8146b88SJung-uk Kim { 1298f8146b88SJung-uk Kim return (Status); 1299f8146b88SJung-uk Kim } 1300f8146b88SJung-uk Kim 1301f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1302f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1303f8146b88SJung-uk Kim 1304f8146b88SJung-uk Kim /* Main table fields */ 1305f8146b88SJung-uk Kim 1306f8146b88SJung-uk Kim Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer); 1307f8146b88SJung-uk Kim Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF ( 1308f8146b88SJung-uk Kim ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header); 1309f8146b88SJung-uk Kim 1310f8146b88SJung-uk Kim SubtableCount = Dbg2Header->InfoCount; 1311f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1312f8146b88SJung-uk Kim 1313f8146b88SJung-uk Kim /* Process all Device Information subtables (Count = InfoCount) */ 1314f8146b88SJung-uk Kim 1315f8146b88SJung-uk Kim while (*PFieldList && SubtableCount) 1316f8146b88SJung-uk Kim { 1317f8146b88SJung-uk Kim /* Subtable: Debug Device Information */ 1318f8146b88SJung-uk Kim 1319f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Device, 1320ff879b07SJung-uk Kim &Subtable); 1321f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1322f8146b88SJung-uk Kim { 1323f8146b88SJung-uk Kim return (Status); 1324f8146b88SJung-uk Kim } 1325f8146b88SJung-uk Kim 1326f8146b88SJung-uk Kim DeviceInfo = ACPI_CAST_PTR (ACPI_DBG2_DEVICE, Subtable->Buffer); 1327f8146b88SJung-uk Kim CurrentOffset = (UINT16) sizeof (ACPI_DBG2_DEVICE); 1328f8146b88SJung-uk Kim 1329f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1330f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1331f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1332f8146b88SJung-uk Kim 1333f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1334f8146b88SJung-uk Kim 1335f8146b88SJung-uk Kim /* BaseAddressRegister GAS array (Required, size is RegisterCount) */ 1336f8146b88SJung-uk Kim 1337f8146b88SJung-uk Kim DeviceInfo->BaseAddressOffset = CurrentOffset; 1338f8146b88SJung-uk Kim for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++) 1339f8146b88SJung-uk Kim { 1340f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Addr, 1341ff879b07SJung-uk Kim &Subtable); 1342f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1343f8146b88SJung-uk Kim { 1344f8146b88SJung-uk Kim return (Status); 1345f8146b88SJung-uk Kim } 1346f8146b88SJung-uk Kim 1347f8146b88SJung-uk Kim CurrentOffset += (UINT16) sizeof (ACPI_GENERIC_ADDRESS); 1348f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1349f8146b88SJung-uk Kim } 1350f8146b88SJung-uk Kim 1351f8146b88SJung-uk Kim /* AddressSize array (Required, size = RegisterCount) */ 1352f8146b88SJung-uk Kim 1353f8146b88SJung-uk Kim DeviceInfo->AddressSizeOffset = CurrentOffset; 1354f8146b88SJung-uk Kim for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++) 1355f8146b88SJung-uk Kim { 1356f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Size, 1357ff879b07SJung-uk Kim &Subtable); 1358f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1359f8146b88SJung-uk Kim { 1360f8146b88SJung-uk Kim return (Status); 1361f8146b88SJung-uk Kim } 1362f8146b88SJung-uk Kim 1363f8146b88SJung-uk Kim CurrentOffset += (UINT16) sizeof (UINT32); 1364f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1365f8146b88SJung-uk Kim } 1366f8146b88SJung-uk Kim 1367f8146b88SJung-uk Kim /* NamespaceString device identifier (Required, size = NamePathLength) */ 1368f8146b88SJung-uk Kim 1369f8146b88SJung-uk Kim DeviceInfo->NamepathOffset = CurrentOffset; 1370f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Name, 1371ff879b07SJung-uk Kim &Subtable); 1372f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1373f8146b88SJung-uk Kim { 1374f8146b88SJung-uk Kim return (Status); 1375f8146b88SJung-uk Kim } 1376f8146b88SJung-uk Kim 1377f8146b88SJung-uk Kim /* Update the device info header */ 1378f8146b88SJung-uk Kim 1379f8146b88SJung-uk Kim DeviceInfo->NamepathLength = (UINT16) Subtable->Length; 1380f8146b88SJung-uk Kim CurrentOffset += (UINT16) DeviceInfo->NamepathLength; 1381f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1382f8146b88SJung-uk Kim 1383f8146b88SJung-uk Kim /* OemData - Variable-length data (Optional, size = OemDataLength) */ 1384f8146b88SJung-uk Kim 1385f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2OemData, 1386ff879b07SJung-uk Kim &Subtable); 1387f1db5ef7SJung-uk Kim if (Status == AE_END_OF_TABLE) 1388f1db5ef7SJung-uk Kim { 1389f1db5ef7SJung-uk Kim /* optional field was not found and we're at the end of the file */ 1390f1db5ef7SJung-uk Kim 1391f1db5ef7SJung-uk Kim goto subtableDone; 1392f1db5ef7SJung-uk Kim } 1393f1db5ef7SJung-uk Kim else if (ACPI_FAILURE (Status)) 1394f8146b88SJung-uk Kim { 1395f8146b88SJung-uk Kim return (Status); 1396f8146b88SJung-uk Kim } 1397f8146b88SJung-uk Kim 1398f8146b88SJung-uk Kim /* Update the device info header (zeros if no OEM data present) */ 1399f8146b88SJung-uk Kim 1400f8146b88SJung-uk Kim DeviceInfo->OemDataOffset = 0; 1401f8146b88SJung-uk Kim DeviceInfo->OemDataLength = 0; 1402f8146b88SJung-uk Kim 1403f8146b88SJung-uk Kim /* Optional subtable (OemData) */ 1404f8146b88SJung-uk Kim 1405f8146b88SJung-uk Kim if (Subtable && Subtable->Length) 1406f8146b88SJung-uk Kim { 1407f8146b88SJung-uk Kim DeviceInfo->OemDataOffset = CurrentOffset; 1408f8146b88SJung-uk Kim DeviceInfo->OemDataLength = (UINT16) Subtable->Length; 1409f8146b88SJung-uk Kim 1410f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1411f8146b88SJung-uk Kim } 1412f1db5ef7SJung-uk Kim subtableDone: 1413f8146b88SJung-uk Kim SubtableCount--; 1414f8146b88SJung-uk Kim DtPopSubtable (); /* Get next Device Information subtable */ 1415f8146b88SJung-uk Kim } 1416f8146b88SJung-uk Kim 1417f8146b88SJung-uk Kim DtPopSubtable (); 1418f8146b88SJung-uk Kim return (AE_OK); 1419f8146b88SJung-uk Kim } 1420f8146b88SJung-uk Kim 1421f8146b88SJung-uk Kim 1422f8146b88SJung-uk Kim /****************************************************************************** 1423f8146b88SJung-uk Kim * 1424f8146b88SJung-uk Kim * FUNCTION: DtCompileDmar 1425f8146b88SJung-uk Kim * 1426f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 1427f8146b88SJung-uk Kim * 1428f8146b88SJung-uk Kim * RETURN: Status 1429f8146b88SJung-uk Kim * 1430f8146b88SJung-uk Kim * DESCRIPTION: Compile DMAR. 1431f8146b88SJung-uk Kim * 1432f8146b88SJung-uk Kim *****************************************************************************/ 1433f8146b88SJung-uk Kim 1434f8146b88SJung-uk Kim ACPI_STATUS 1435f8146b88SJung-uk Kim DtCompileDmar ( 1436f8146b88SJung-uk Kim void **List) 1437f8146b88SJung-uk Kim { 1438f8146b88SJung-uk Kim ACPI_STATUS Status; 1439f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 1440f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 1441f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1442f8146b88SJung-uk Kim DT_FIELD *SubtableStart; 1443f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 1444f8146b88SJung-uk Kim ACPI_DMAR_HEADER *DmarHeader; 1445f8146b88SJung-uk Kim ACPI_DMAR_DEVICE_SCOPE *DmarDeviceScope; 1446f8146b88SJung-uk Kim UINT32 DeviceScopeLength; 1447f8146b88SJung-uk Kim UINT32 PciPathLength; 1448f8146b88SJung-uk Kim 1449f8146b88SJung-uk Kim 1450ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable); 1451f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1452f8146b88SJung-uk Kim { 1453f8146b88SJung-uk Kim return (Status); 1454f8146b88SJung-uk Kim } 1455f8146b88SJung-uk Kim 1456f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1457f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1458f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1459f8146b88SJung-uk Kim 1460f8146b88SJung-uk Kim while (*PFieldList) 1461f8146b88SJung-uk Kim { 1462f8146b88SJung-uk Kim /* DMAR Header */ 1463f8146b88SJung-uk Kim 1464f8146b88SJung-uk Kim SubtableStart = *PFieldList; 1465f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr, 1466ff879b07SJung-uk Kim &Subtable); 1467f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1468f8146b88SJung-uk Kim { 1469f8146b88SJung-uk Kim return (Status); 1470f8146b88SJung-uk Kim } 1471f8146b88SJung-uk Kim 1472f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1473f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1474f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1475f8146b88SJung-uk Kim 1476f8146b88SJung-uk Kim DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer); 1477f8146b88SJung-uk Kim 1478f8146b88SJung-uk Kim switch (DmarHeader->Type) 1479f8146b88SJung-uk Kim { 1480f8146b88SJung-uk Kim case ACPI_DMAR_TYPE_HARDWARE_UNIT: 1481f8146b88SJung-uk Kim 1482f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoDmar0; 1483f8146b88SJung-uk Kim break; 1484f8146b88SJung-uk Kim 1485f8146b88SJung-uk Kim case ACPI_DMAR_TYPE_RESERVED_MEMORY: 1486f8146b88SJung-uk Kim 1487f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoDmar1; 1488f8146b88SJung-uk Kim break; 1489f8146b88SJung-uk Kim 1490f8146b88SJung-uk Kim case ACPI_DMAR_TYPE_ROOT_ATS: 1491f8146b88SJung-uk Kim 1492f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoDmar2; 1493f8146b88SJung-uk Kim break; 1494f8146b88SJung-uk Kim 1495f8146b88SJung-uk Kim case ACPI_DMAR_TYPE_HARDWARE_AFFINITY: 1496f8146b88SJung-uk Kim 1497f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoDmar3; 1498f8146b88SJung-uk Kim break; 1499f8146b88SJung-uk Kim 1500f8146b88SJung-uk Kim case ACPI_DMAR_TYPE_NAMESPACE: 1501f8146b88SJung-uk Kim 1502f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoDmar4; 1503f8146b88SJung-uk Kim break; 1504f8146b88SJung-uk Kim 1505ab71bbb7SJung-uk Kim case ACPI_DMAR_TYPE_SATC: 1506ab71bbb7SJung-uk Kim 1507ab71bbb7SJung-uk Kim InfoTable = AcpiDmTableInfoDmar5; 1508ab71bbb7SJung-uk Kim break; 1509ab71bbb7SJung-uk Kim 1510f8146b88SJung-uk Kim default: 1511f8146b88SJung-uk Kim 1512f8146b88SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR"); 1513f8146b88SJung-uk Kim return (AE_ERROR); 1514f8146b88SJung-uk Kim } 1515f8146b88SJung-uk Kim 1516f8146b88SJung-uk Kim /* DMAR Subtable */ 1517f8146b88SJung-uk Kim 1518ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 1519f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1520f8146b88SJung-uk Kim { 1521f8146b88SJung-uk Kim return (Status); 1522f8146b88SJung-uk Kim } 1523f8146b88SJung-uk Kim 1524f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1525f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1526f8146b88SJung-uk Kim 1527f8146b88SJung-uk Kim /* 1528f8146b88SJung-uk Kim * Optional Device Scope subtables 1529f8146b88SJung-uk Kim */ 1530f8146b88SJung-uk Kim if ((DmarHeader->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) || 1531f8146b88SJung-uk Kim (DmarHeader->Type == ACPI_DMAR_TYPE_NAMESPACE)) 1532f8146b88SJung-uk Kim { 1533f8146b88SJung-uk Kim /* These types do not support device scopes */ 1534f8146b88SJung-uk Kim 1535f8146b88SJung-uk Kim DtPopSubtable (); 1536f8146b88SJung-uk Kim continue; 1537f8146b88SJung-uk Kim } 1538f8146b88SJung-uk Kim 1539f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1540f8146b88SJung-uk Kim DeviceScopeLength = DmarHeader->Length - Subtable->Length - 1541f8146b88SJung-uk Kim ParentTable->Length; 1542f8146b88SJung-uk Kim while (DeviceScopeLength) 1543f8146b88SJung-uk Kim { 1544f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope, 1545ff879b07SJung-uk Kim &Subtable); 1546f8146b88SJung-uk Kim if (Status == AE_NOT_FOUND) 1547f8146b88SJung-uk Kim { 1548f8146b88SJung-uk Kim break; 1549f8146b88SJung-uk Kim } 1550f8146b88SJung-uk Kim 1551f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1552f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1553f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1554f8146b88SJung-uk Kim 1555f8146b88SJung-uk Kim DmarDeviceScope = ACPI_CAST_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable->Buffer); 1556f8146b88SJung-uk Kim 1557f8146b88SJung-uk Kim /* Optional PCI Paths */ 1558f8146b88SJung-uk Kim 1559f8146b88SJung-uk Kim PciPathLength = DmarDeviceScope->Length - Subtable->Length; 1560f8146b88SJung-uk Kim while (PciPathLength) 1561f8146b88SJung-uk Kim { 1562f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, TableInfoDmarPciPath, 1563ff879b07SJung-uk Kim &Subtable); 1564f8146b88SJung-uk Kim if (Status == AE_NOT_FOUND) 1565f8146b88SJung-uk Kim { 1566f8146b88SJung-uk Kim DtPopSubtable (); 1567f8146b88SJung-uk Kim break; 1568f8146b88SJung-uk Kim } 1569f8146b88SJung-uk Kim 1570f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1571f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1572f8146b88SJung-uk Kim PciPathLength -= Subtable->Length; 1573f8146b88SJung-uk Kim } 1574f8146b88SJung-uk Kim 1575f8146b88SJung-uk Kim DtPopSubtable (); 1576f8146b88SJung-uk Kim DeviceScopeLength -= DmarDeviceScope->Length; 1577f8146b88SJung-uk Kim } 1578f8146b88SJung-uk Kim 1579f8146b88SJung-uk Kim DtPopSubtable (); 1580f8146b88SJung-uk Kim DtPopSubtable (); 1581f8146b88SJung-uk Kim } 1582f8146b88SJung-uk Kim 1583f8146b88SJung-uk Kim return (AE_OK); 1584f8146b88SJung-uk Kim } 1585f8146b88SJung-uk Kim 1586f8146b88SJung-uk Kim 1587f8146b88SJung-uk Kim /****************************************************************************** 1588f8146b88SJung-uk Kim * 1589f8146b88SJung-uk Kim * FUNCTION: DtCompileDrtm 1590f8146b88SJung-uk Kim * 1591f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 1592f8146b88SJung-uk Kim * 1593f8146b88SJung-uk Kim * RETURN: Status 1594f8146b88SJung-uk Kim * 1595f8146b88SJung-uk Kim * DESCRIPTION: Compile DRTM. 1596f8146b88SJung-uk Kim * 1597f8146b88SJung-uk Kim *****************************************************************************/ 1598f8146b88SJung-uk Kim 1599f8146b88SJung-uk Kim ACPI_STATUS 1600f8146b88SJung-uk Kim DtCompileDrtm ( 1601f8146b88SJung-uk Kim void **List) 1602f8146b88SJung-uk Kim { 1603f8146b88SJung-uk Kim ACPI_STATUS Status; 1604f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 1605f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 1606f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1607f8146b88SJung-uk Kim UINT32 Count; 1608f8146b88SJung-uk Kim /* ACPI_TABLE_DRTM *Drtm; */ 1609f8146b88SJung-uk Kim ACPI_DRTM_VTABLE_LIST *DrtmVtl; 1610f8146b88SJung-uk Kim ACPI_DRTM_RESOURCE_LIST *DrtmRl; 1611f8146b88SJung-uk Kim /* ACPI_DRTM_DPS_ID *DrtmDps; */ 1612f8146b88SJung-uk Kim 1613f8146b88SJung-uk Kim 1614f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1615f8146b88SJung-uk Kim 1616f8146b88SJung-uk Kim /* Compile DRTM header */ 1617f8146b88SJung-uk Kim 1618f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm, 1619ff879b07SJung-uk Kim &Subtable); 1620f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1621f8146b88SJung-uk Kim { 1622f8146b88SJung-uk Kim return (Status); 1623f8146b88SJung-uk Kim } 1624f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1625f8146b88SJung-uk Kim 1626f8146b88SJung-uk Kim /* 1627cd6518c7SJung-uk Kim * Using ACPI_SUB_PTR, We needn't define a separate structure. Care 1628f8146b88SJung-uk Kim * should be taken to avoid accessing ACPI_TABLE_HADER fields. 1629f8146b88SJung-uk Kim */ 1630f8146b88SJung-uk Kim #if 0 1631f8146b88SJung-uk Kim Drtm = ACPI_SUB_PTR (ACPI_TABLE_DRTM, 1632f8146b88SJung-uk Kim Subtable->Buffer, sizeof (ACPI_TABLE_HEADER)); 1633f8146b88SJung-uk Kim #endif 1634f8146b88SJung-uk Kim /* Compile VTL */ 1635f8146b88SJung-uk Kim 1636f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0, 1637ff879b07SJung-uk Kim &Subtable); 1638f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1639f8146b88SJung-uk Kim { 1640f8146b88SJung-uk Kim return (Status); 1641f8146b88SJung-uk Kim } 1642f8146b88SJung-uk Kim 1643f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1644f8146b88SJung-uk Kim DrtmVtl = ACPI_CAST_PTR (ACPI_DRTM_VTABLE_LIST, Subtable->Buffer); 1645f8146b88SJung-uk Kim 1646f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1647f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1648f8146b88SJung-uk Kim Count = 0; 1649f8146b88SJung-uk Kim 1650f8146b88SJung-uk Kim while (*PFieldList) 1651f8146b88SJung-uk Kim { 1652f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0a, 1653ff879b07SJung-uk Kim &Subtable); 1654f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1655f8146b88SJung-uk Kim { 1656f8146b88SJung-uk Kim return (Status); 1657f8146b88SJung-uk Kim } 1658f8146b88SJung-uk Kim if (!Subtable) 1659f8146b88SJung-uk Kim { 1660f8146b88SJung-uk Kim break; 1661f8146b88SJung-uk Kim } 1662f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1663f8146b88SJung-uk Kim Count++; 1664f8146b88SJung-uk Kim } 1665f8146b88SJung-uk Kim 1666f8146b88SJung-uk Kim DrtmVtl->ValidatedTableCount = Count; 1667f8146b88SJung-uk Kim DtPopSubtable (); 1668f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1669f8146b88SJung-uk Kim 1670f8146b88SJung-uk Kim /* Compile RL */ 1671f8146b88SJung-uk Kim 1672f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1, 1673ff879b07SJung-uk Kim &Subtable); 1674f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1675f8146b88SJung-uk Kim { 1676f8146b88SJung-uk Kim return (Status); 1677f8146b88SJung-uk Kim } 1678f8146b88SJung-uk Kim 1679f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1680f8146b88SJung-uk Kim DrtmRl = ACPI_CAST_PTR (ACPI_DRTM_RESOURCE_LIST, Subtable->Buffer); 1681f8146b88SJung-uk Kim 1682f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1683f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1684f8146b88SJung-uk Kim Count = 0; 1685f8146b88SJung-uk Kim 1686f8146b88SJung-uk Kim while (*PFieldList) 1687f8146b88SJung-uk Kim { 1688f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1a, 1689ff879b07SJung-uk Kim &Subtable); 1690f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1691f8146b88SJung-uk Kim { 1692f8146b88SJung-uk Kim return (Status); 1693f8146b88SJung-uk Kim } 1694f8146b88SJung-uk Kim 1695f8146b88SJung-uk Kim if (!Subtable) 1696f8146b88SJung-uk Kim { 1697f8146b88SJung-uk Kim break; 1698f8146b88SJung-uk Kim } 1699f8146b88SJung-uk Kim 1700f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1701f8146b88SJung-uk Kim Count++; 1702f8146b88SJung-uk Kim } 1703f8146b88SJung-uk Kim 1704f8146b88SJung-uk Kim DrtmRl->ResourceCount = Count; 1705f8146b88SJung-uk Kim DtPopSubtable (); 1706f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1707f8146b88SJung-uk Kim 1708f8146b88SJung-uk Kim /* Compile DPS */ 1709f8146b88SJung-uk Kim 1710f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm2, 1711ff879b07SJung-uk Kim &Subtable); 1712f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1713f8146b88SJung-uk Kim { 1714f8146b88SJung-uk Kim return (Status); 1715f8146b88SJung-uk Kim } 1716f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1717f8146b88SJung-uk Kim /* DrtmDps = ACPI_CAST_PTR (ACPI_DRTM_DPS_ID, Subtable->Buffer);*/ 1718f8146b88SJung-uk Kim 1719f8146b88SJung-uk Kim 1720f8146b88SJung-uk Kim return (AE_OK); 1721f8146b88SJung-uk Kim } 1722f8146b88SJung-uk Kim 1723f8146b88SJung-uk Kim 1724f8146b88SJung-uk Kim /****************************************************************************** 1725f8146b88SJung-uk Kim * 1726f8146b88SJung-uk Kim * FUNCTION: DtCompileEinj 1727f8146b88SJung-uk Kim * 1728f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 1729f8146b88SJung-uk Kim * 1730f8146b88SJung-uk Kim * RETURN: Status 1731f8146b88SJung-uk Kim * 1732f8146b88SJung-uk Kim * DESCRIPTION: Compile EINJ. 1733f8146b88SJung-uk Kim * 1734f8146b88SJung-uk Kim *****************************************************************************/ 1735f8146b88SJung-uk Kim 1736f8146b88SJung-uk Kim ACPI_STATUS 1737f8146b88SJung-uk Kim DtCompileEinj ( 1738f8146b88SJung-uk Kim void **List) 1739f8146b88SJung-uk Kim { 1740f8146b88SJung-uk Kim ACPI_STATUS Status; 1741f8146b88SJung-uk Kim 1742f8146b88SJung-uk Kim 1743f8146b88SJung-uk Kim Status = DtCompileTwoSubtables (List, 1744f8146b88SJung-uk Kim AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0); 1745f8146b88SJung-uk Kim return (Status); 1746f8146b88SJung-uk Kim } 1747f8146b88SJung-uk Kim 1748f8146b88SJung-uk Kim 1749f8146b88SJung-uk Kim /****************************************************************************** 1750f8146b88SJung-uk Kim * 1751f8146b88SJung-uk Kim * FUNCTION: DtCompileErst 1752f8146b88SJung-uk Kim * 1753f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 1754f8146b88SJung-uk Kim * 1755f8146b88SJung-uk Kim * RETURN: Status 1756f8146b88SJung-uk Kim * 1757f8146b88SJung-uk Kim * DESCRIPTION: Compile ERST. 1758f8146b88SJung-uk Kim * 1759f8146b88SJung-uk Kim *****************************************************************************/ 1760f8146b88SJung-uk Kim 1761f8146b88SJung-uk Kim ACPI_STATUS 1762f8146b88SJung-uk Kim DtCompileErst ( 1763f8146b88SJung-uk Kim void **List) 1764f8146b88SJung-uk Kim { 1765f8146b88SJung-uk Kim ACPI_STATUS Status; 1766f8146b88SJung-uk Kim 1767f8146b88SJung-uk Kim 1768f8146b88SJung-uk Kim Status = DtCompileTwoSubtables (List, 1769f8146b88SJung-uk Kim AcpiDmTableInfoErst, AcpiDmTableInfoEinj0); 1770f8146b88SJung-uk Kim return (Status); 1771f8146b88SJung-uk Kim } 1772f8146b88SJung-uk Kim 1773f8146b88SJung-uk Kim 1774f8146b88SJung-uk Kim /****************************************************************************** 1775f8146b88SJung-uk Kim * 1776f8146b88SJung-uk Kim * FUNCTION: DtCompileGtdt 1777f8146b88SJung-uk Kim * 1778f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 1779f8146b88SJung-uk Kim * 1780f8146b88SJung-uk Kim * RETURN: Status 1781f8146b88SJung-uk Kim * 1782f8146b88SJung-uk Kim * DESCRIPTION: Compile GTDT. 1783f8146b88SJung-uk Kim * 1784f8146b88SJung-uk Kim *****************************************************************************/ 1785f8146b88SJung-uk Kim 1786f8146b88SJung-uk Kim ACPI_STATUS 1787f8146b88SJung-uk Kim DtCompileGtdt ( 1788f8146b88SJung-uk Kim void **List) 1789f8146b88SJung-uk Kim { 1790f8146b88SJung-uk Kim ACPI_STATUS Status; 1791f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 1792f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 1793f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1794f8146b88SJung-uk Kim DT_FIELD *SubtableStart; 1795f8146b88SJung-uk Kim ACPI_SUBTABLE_HEADER *GtdtHeader; 1796f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 1797f8146b88SJung-uk Kim UINT32 GtCount; 1798cd6518c7SJung-uk Kim ACPI_TABLE_HEADER *Header; 1799f8146b88SJung-uk Kim 1800f8146b88SJung-uk Kim 1801cd6518c7SJung-uk Kim ParentTable = DtPeekSubtable (); 1802cd6518c7SJung-uk Kim 1803cd6518c7SJung-uk Kim Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); 1804cd6518c7SJung-uk Kim 1805cd6518c7SJung-uk Kim /* Compile the main table */ 1806cd6518c7SJung-uk Kim 1807f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt, 1808ff879b07SJung-uk Kim &Subtable); 1809f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1810f8146b88SJung-uk Kim { 1811f8146b88SJung-uk Kim return (Status); 1812f8146b88SJung-uk Kim } 1813f8146b88SJung-uk Kim 1814cd6518c7SJung-uk Kim /* GTDT revision 3 later contains 2 extra fields before subtables */ 1815cd6518c7SJung-uk Kim 1816cd6518c7SJung-uk Kim if (Header->Revision > 2) 1817cd6518c7SJung-uk Kim { 1818cd6518c7SJung-uk Kim ParentTable = DtPeekSubtable (); 1819cd6518c7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1820cd6518c7SJung-uk Kim 1821cd6518c7SJung-uk Kim Status = DtCompileTable (PFieldList, 1822cd6518c7SJung-uk Kim AcpiDmTableInfoGtdtEl2, &Subtable); 1823cd6518c7SJung-uk Kim if (ACPI_FAILURE (Status)) 1824cd6518c7SJung-uk Kim { 1825cd6518c7SJung-uk Kim return (Status); 1826cd6518c7SJung-uk Kim } 1827cd6518c7SJung-uk Kim } 1828cd6518c7SJung-uk Kim 1829f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1830f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1831f8146b88SJung-uk Kim 1832f8146b88SJung-uk Kim while (*PFieldList) 1833f8146b88SJung-uk Kim { 1834f8146b88SJung-uk Kim SubtableStart = *PFieldList; 1835f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdtHdr, 1836ff879b07SJung-uk Kim &Subtable); 1837f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1838f8146b88SJung-uk Kim { 1839f8146b88SJung-uk Kim return (Status); 1840f8146b88SJung-uk Kim } 1841f8146b88SJung-uk Kim 1842f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1843f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1844f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1845f8146b88SJung-uk Kim 1846f8146b88SJung-uk Kim GtdtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 1847f8146b88SJung-uk Kim 1848f8146b88SJung-uk Kim switch (GtdtHeader->Type) 1849f8146b88SJung-uk Kim { 1850f8146b88SJung-uk Kim case ACPI_GTDT_TYPE_TIMER_BLOCK: 1851f8146b88SJung-uk Kim 1852f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoGtdt0; 1853f8146b88SJung-uk Kim break; 1854f8146b88SJung-uk Kim 1855f8146b88SJung-uk Kim case ACPI_GTDT_TYPE_WATCHDOG: 1856f8146b88SJung-uk Kim 1857f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoGtdt1; 1858f8146b88SJung-uk Kim break; 1859f8146b88SJung-uk Kim 1860f8146b88SJung-uk Kim default: 1861f8146b88SJung-uk Kim 1862f8146b88SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "GTDT"); 1863f8146b88SJung-uk Kim return (AE_ERROR); 1864f8146b88SJung-uk Kim } 1865f8146b88SJung-uk Kim 1866ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 1867f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1868f8146b88SJung-uk Kim { 1869f8146b88SJung-uk Kim return (Status); 1870f8146b88SJung-uk Kim } 1871f8146b88SJung-uk Kim 1872f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1873f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1874f8146b88SJung-uk Kim 1875f8146b88SJung-uk Kim /* 1876f8146b88SJung-uk Kim * Additional GT block subtable data 1877f8146b88SJung-uk Kim */ 1878f8146b88SJung-uk Kim 1879f8146b88SJung-uk Kim switch (GtdtHeader->Type) 1880f8146b88SJung-uk Kim { 1881f8146b88SJung-uk Kim case ACPI_GTDT_TYPE_TIMER_BLOCK: 1882f8146b88SJung-uk Kim 1883f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1884f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1885f8146b88SJung-uk Kim 1886f8146b88SJung-uk Kim GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK, 1887f8146b88SJung-uk Kim Subtable->Buffer - sizeof(ACPI_GTDT_HEADER)))->TimerCount; 1888f8146b88SJung-uk Kim 1889f8146b88SJung-uk Kim while (GtCount) 1890f8146b88SJung-uk Kim { 1891f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt0a, 1892ff879b07SJung-uk Kim &Subtable); 1893f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1894f8146b88SJung-uk Kim { 1895f8146b88SJung-uk Kim return (Status); 1896f8146b88SJung-uk Kim } 1897f8146b88SJung-uk Kim 1898f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1899f8146b88SJung-uk Kim GtCount--; 1900f8146b88SJung-uk Kim } 1901f8146b88SJung-uk Kim 1902f8146b88SJung-uk Kim DtPopSubtable (); 1903f8146b88SJung-uk Kim break; 1904f8146b88SJung-uk Kim 1905f8146b88SJung-uk Kim default: 1906f8146b88SJung-uk Kim 1907f8146b88SJung-uk Kim break; 1908f8146b88SJung-uk Kim } 1909f8146b88SJung-uk Kim 1910f8146b88SJung-uk Kim DtPopSubtable (); 1911f8146b88SJung-uk Kim } 1912f8146b88SJung-uk Kim 1913f8146b88SJung-uk Kim return (AE_OK); 1914f8146b88SJung-uk Kim } 1915f8146b88SJung-uk Kim 1916f8146b88SJung-uk Kim 1917f8146b88SJung-uk Kim /****************************************************************************** 1918f8146b88SJung-uk Kim * 1919f8146b88SJung-uk Kim * FUNCTION: DtCompileFpdt 1920f8146b88SJung-uk Kim * 1921f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 1922f8146b88SJung-uk Kim * 1923f8146b88SJung-uk Kim * RETURN: Status 1924f8146b88SJung-uk Kim * 1925f8146b88SJung-uk Kim * DESCRIPTION: Compile FPDT. 1926f8146b88SJung-uk Kim * 1927f8146b88SJung-uk Kim *****************************************************************************/ 1928f8146b88SJung-uk Kim 1929f8146b88SJung-uk Kim ACPI_STATUS 1930f8146b88SJung-uk Kim DtCompileFpdt ( 1931f8146b88SJung-uk Kim void **List) 1932f8146b88SJung-uk Kim { 1933f8146b88SJung-uk Kim ACPI_STATUS Status; 1934f8146b88SJung-uk Kim ACPI_FPDT_HEADER *FpdtHeader; 1935f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 1936f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 1937f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 1938f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1939f8146b88SJung-uk Kim DT_FIELD *SubtableStart; 1940f8146b88SJung-uk Kim 1941f8146b88SJung-uk Kim 1942f8146b88SJung-uk Kim while (*PFieldList) 1943f8146b88SJung-uk Kim { 1944f8146b88SJung-uk Kim SubtableStart = *PFieldList; 1945f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr, 1946ff879b07SJung-uk Kim &Subtable); 1947f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1948f8146b88SJung-uk Kim { 1949f8146b88SJung-uk Kim return (Status); 1950f8146b88SJung-uk Kim } 1951f8146b88SJung-uk Kim 1952f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1953f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1954f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1955f8146b88SJung-uk Kim 1956f8146b88SJung-uk Kim FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer); 1957f8146b88SJung-uk Kim 1958f8146b88SJung-uk Kim switch (FpdtHeader->Type) 1959f8146b88SJung-uk Kim { 1960f8146b88SJung-uk Kim case ACPI_FPDT_TYPE_BOOT: 1961f8146b88SJung-uk Kim 1962f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoFpdt0; 1963f8146b88SJung-uk Kim break; 1964f8146b88SJung-uk Kim 1965f8146b88SJung-uk Kim case ACPI_FPDT_TYPE_S3PERF: 1966f8146b88SJung-uk Kim 1967f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoFpdt1; 1968f8146b88SJung-uk Kim break; 1969f8146b88SJung-uk Kim 1970f8146b88SJung-uk Kim default: 1971f8146b88SJung-uk Kim 1972f8146b88SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT"); 1973f8146b88SJung-uk Kim return (AE_ERROR); 1974f8146b88SJung-uk Kim break; 1975f8146b88SJung-uk Kim } 1976f8146b88SJung-uk Kim 1977ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 1978f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1979f8146b88SJung-uk Kim { 1980f8146b88SJung-uk Kim return (Status); 1981f8146b88SJung-uk Kim } 1982f8146b88SJung-uk Kim 1983f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1984f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1985f8146b88SJung-uk Kim DtPopSubtable (); 1986f8146b88SJung-uk Kim } 1987f8146b88SJung-uk Kim 1988f8146b88SJung-uk Kim return (AE_OK); 1989f8146b88SJung-uk Kim } 1990f8146b88SJung-uk Kim 1991f8146b88SJung-uk Kim 1992f8146b88SJung-uk Kim /****************************************************************************** 1993f8146b88SJung-uk Kim * 1994f8146b88SJung-uk Kim * FUNCTION: DtCompileHest 1995f8146b88SJung-uk Kim * 1996f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 1997f8146b88SJung-uk Kim * 1998f8146b88SJung-uk Kim * RETURN: Status 1999f8146b88SJung-uk Kim * 2000f8146b88SJung-uk Kim * DESCRIPTION: Compile HEST. 2001f8146b88SJung-uk Kim * 2002f8146b88SJung-uk Kim *****************************************************************************/ 2003f8146b88SJung-uk Kim 2004f8146b88SJung-uk Kim ACPI_STATUS 2005f8146b88SJung-uk Kim DtCompileHest ( 2006f8146b88SJung-uk Kim void **List) 2007f8146b88SJung-uk Kim { 2008f8146b88SJung-uk Kim ACPI_STATUS Status; 2009f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 2010f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 2011f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 2012f8146b88SJung-uk Kim DT_FIELD *SubtableStart; 2013f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 2014f8146b88SJung-uk Kim UINT16 Type; 2015f8146b88SJung-uk Kim UINT32 BankCount; 2016f8146b88SJung-uk Kim 2017f8146b88SJung-uk Kim 2018f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest, 2019ff879b07SJung-uk Kim &Subtable); 2020f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2021f8146b88SJung-uk Kim { 2022f8146b88SJung-uk Kim return (Status); 2023f8146b88SJung-uk Kim } 2024f8146b88SJung-uk Kim 2025f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 2026f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2027f8146b88SJung-uk Kim 2028f8146b88SJung-uk Kim while (*PFieldList) 2029f8146b88SJung-uk Kim { 2030f8146b88SJung-uk Kim /* Get subtable type */ 2031f8146b88SJung-uk Kim 2032f8146b88SJung-uk Kim SubtableStart = *PFieldList; 2033f8146b88SJung-uk Kim DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0); 2034f8146b88SJung-uk Kim 2035f8146b88SJung-uk Kim switch (Type) 2036f8146b88SJung-uk Kim { 2037f8146b88SJung-uk Kim case ACPI_HEST_TYPE_IA32_CHECK: 2038f8146b88SJung-uk Kim 2039f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoHest0; 2040f8146b88SJung-uk Kim break; 2041f8146b88SJung-uk Kim 2042f8146b88SJung-uk Kim case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 2043f8146b88SJung-uk Kim 2044f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoHest1; 2045f8146b88SJung-uk Kim break; 2046f8146b88SJung-uk Kim 2047f8146b88SJung-uk Kim case ACPI_HEST_TYPE_IA32_NMI: 2048f8146b88SJung-uk Kim 2049f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoHest2; 2050f8146b88SJung-uk Kim break; 2051f8146b88SJung-uk Kim 2052f8146b88SJung-uk Kim case ACPI_HEST_TYPE_AER_ROOT_PORT: 2053f8146b88SJung-uk Kim 2054f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoHest6; 2055f8146b88SJung-uk Kim break; 2056f8146b88SJung-uk Kim 2057f8146b88SJung-uk Kim case ACPI_HEST_TYPE_AER_ENDPOINT: 2058f8146b88SJung-uk Kim 2059f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoHest7; 2060f8146b88SJung-uk Kim break; 2061f8146b88SJung-uk Kim 2062f8146b88SJung-uk Kim case ACPI_HEST_TYPE_AER_BRIDGE: 2063f8146b88SJung-uk Kim 2064f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoHest8; 2065f8146b88SJung-uk Kim break; 2066f8146b88SJung-uk Kim 2067f8146b88SJung-uk Kim case ACPI_HEST_TYPE_GENERIC_ERROR: 2068f8146b88SJung-uk Kim 2069f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoHest9; 2070f8146b88SJung-uk Kim break; 2071f8146b88SJung-uk Kim 2072af051161SJung-uk Kim case ACPI_HEST_TYPE_GENERIC_ERROR_V2: 2073af051161SJung-uk Kim 2074af051161SJung-uk Kim InfoTable = AcpiDmTableInfoHest10; 2075af051161SJung-uk Kim break; 2076af051161SJung-uk Kim 2077af051161SJung-uk Kim case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK: 2078af051161SJung-uk Kim 2079af051161SJung-uk Kim InfoTable = AcpiDmTableInfoHest11; 2080af051161SJung-uk Kim break; 2081af051161SJung-uk Kim 2082f8146b88SJung-uk Kim default: 2083f8146b88SJung-uk Kim 2084f8146b88SJung-uk Kim /* Cannot continue on unknown type */ 2085f8146b88SJung-uk Kim 2086f8146b88SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST"); 2087f8146b88SJung-uk Kim return (AE_ERROR); 2088f8146b88SJung-uk Kim } 2089f8146b88SJung-uk Kim 2090ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 2091f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2092f8146b88SJung-uk Kim { 2093f8146b88SJung-uk Kim return (Status); 2094f8146b88SJung-uk Kim } 2095f8146b88SJung-uk Kim 2096f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2097f8146b88SJung-uk Kim 2098f8146b88SJung-uk Kim /* 2099f8146b88SJung-uk Kim * Additional subtable data - IA32 Error Bank(s) 2100f8146b88SJung-uk Kim */ 2101f8146b88SJung-uk Kim BankCount = 0; 2102f8146b88SJung-uk Kim switch (Type) 2103f8146b88SJung-uk Kim { 2104f8146b88SJung-uk Kim case ACPI_HEST_TYPE_IA32_CHECK: 2105f8146b88SJung-uk Kim 2106f8146b88SJung-uk Kim BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK, 2107f8146b88SJung-uk Kim Subtable->Buffer))->NumHardwareBanks; 2108f8146b88SJung-uk Kim break; 2109f8146b88SJung-uk Kim 2110f8146b88SJung-uk Kim case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 2111f8146b88SJung-uk Kim 2112f8146b88SJung-uk Kim BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED, 2113f8146b88SJung-uk Kim Subtable->Buffer))->NumHardwareBanks; 2114f8146b88SJung-uk Kim break; 2115f8146b88SJung-uk Kim 2116af051161SJung-uk Kim case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK: 2117af051161SJung-uk Kim 2118af051161SJung-uk Kim BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK, 2119af051161SJung-uk Kim Subtable->Buffer))->NumHardwareBanks; 2120af051161SJung-uk Kim break; 2121af051161SJung-uk Kim 2122f8146b88SJung-uk Kim default: 2123f8146b88SJung-uk Kim 2124f8146b88SJung-uk Kim break; 2125f8146b88SJung-uk Kim } 2126f8146b88SJung-uk Kim 2127f8146b88SJung-uk Kim while (BankCount) 2128f8146b88SJung-uk Kim { 2129f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank, 2130ff879b07SJung-uk Kim &Subtable); 2131f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2132f8146b88SJung-uk Kim { 2133f8146b88SJung-uk Kim return (Status); 2134f8146b88SJung-uk Kim } 2135f8146b88SJung-uk Kim 2136f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2137f8146b88SJung-uk Kim BankCount--; 2138f8146b88SJung-uk Kim } 2139f8146b88SJung-uk Kim } 2140f8146b88SJung-uk Kim 2141f8146b88SJung-uk Kim return (AE_OK); 2142f8146b88SJung-uk Kim } 2143f8146b88SJung-uk Kim 2144f8146b88SJung-uk Kim 2145f8146b88SJung-uk Kim /****************************************************************************** 2146f8146b88SJung-uk Kim * 2147af051161SJung-uk Kim * FUNCTION: DtCompileHmat 2148af051161SJung-uk Kim * 2149af051161SJung-uk Kim * PARAMETERS: List - Current field list pointer 2150af051161SJung-uk Kim * 2151af051161SJung-uk Kim * RETURN: Status 2152af051161SJung-uk Kim * 2153af051161SJung-uk Kim * DESCRIPTION: Compile HMAT. 2154af051161SJung-uk Kim * 2155af051161SJung-uk Kim *****************************************************************************/ 2156af051161SJung-uk Kim 2157af051161SJung-uk Kim ACPI_STATUS 2158af051161SJung-uk Kim DtCompileHmat ( 2159af051161SJung-uk Kim void **List) 2160af051161SJung-uk Kim { 2161af051161SJung-uk Kim ACPI_STATUS Status; 2162af051161SJung-uk Kim DT_SUBTABLE *Subtable; 2163af051161SJung-uk Kim DT_SUBTABLE *ParentTable; 2164af051161SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 2165af051161SJung-uk Kim DT_FIELD *SubtableStart; 2166af051161SJung-uk Kim DT_FIELD *EntryStart; 2167af051161SJung-uk Kim ACPI_HMAT_STRUCTURE *HmatStruct; 2168af051161SJung-uk Kim ACPI_HMAT_LOCALITY *HmatLocality; 2169af051161SJung-uk Kim ACPI_HMAT_CACHE *HmatCache; 2170af051161SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 2171af051161SJung-uk Kim UINT32 IntPDNumber; 2172af051161SJung-uk Kim UINT32 TgtPDNumber; 2173af051161SJung-uk Kim UINT64 EntryNumber; 2174af051161SJung-uk Kim UINT16 SMBIOSHandleNumber; 2175af051161SJung-uk Kim 2176af051161SJung-uk Kim 2177af051161SJung-uk Kim ParentTable = DtPeekSubtable (); 2178af051161SJung-uk Kim 2179af051161SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmat, 2180ff879b07SJung-uk Kim &Subtable); 2181af051161SJung-uk Kim if (ACPI_FAILURE (Status)) 2182af051161SJung-uk Kim { 2183af051161SJung-uk Kim return (Status); 2184af051161SJung-uk Kim } 2185af051161SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2186af051161SJung-uk Kim 2187af051161SJung-uk Kim while (*PFieldList) 2188af051161SJung-uk Kim { 2189af051161SJung-uk Kim /* Compile HMAT structure header */ 2190af051161SJung-uk Kim 2191af051161SJung-uk Kim SubtableStart = *PFieldList; 2192af051161SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmatHdr, 2193ff879b07SJung-uk Kim &Subtable); 2194af051161SJung-uk Kim if (ACPI_FAILURE (Status)) 2195af051161SJung-uk Kim { 2196af051161SJung-uk Kim return (Status); 2197af051161SJung-uk Kim } 2198af051161SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2199af051161SJung-uk Kim 2200af051161SJung-uk Kim HmatStruct = ACPI_CAST_PTR (ACPI_HMAT_STRUCTURE, Subtable->Buffer); 2201af051161SJung-uk Kim HmatStruct->Length = Subtable->Length; 2202af051161SJung-uk Kim 2203af051161SJung-uk Kim /* Compile HMAT structure body */ 2204af051161SJung-uk Kim 2205af051161SJung-uk Kim switch (HmatStruct->Type) 2206af051161SJung-uk Kim { 2207af051161SJung-uk Kim case ACPI_HMAT_TYPE_ADDRESS_RANGE: 2208af051161SJung-uk Kim 2209af051161SJung-uk Kim InfoTable = AcpiDmTableInfoHmat0; 2210af051161SJung-uk Kim break; 2211af051161SJung-uk Kim 2212af051161SJung-uk Kim case ACPI_HMAT_TYPE_LOCALITY: 2213af051161SJung-uk Kim 2214af051161SJung-uk Kim InfoTable = AcpiDmTableInfoHmat1; 2215af051161SJung-uk Kim break; 2216af051161SJung-uk Kim 2217af051161SJung-uk Kim case ACPI_HMAT_TYPE_CACHE: 2218af051161SJung-uk Kim 2219af051161SJung-uk Kim InfoTable = AcpiDmTableInfoHmat2; 2220af051161SJung-uk Kim break; 2221af051161SJung-uk Kim 2222af051161SJung-uk Kim default: 2223af051161SJung-uk Kim 2224af051161SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HMAT"); 2225af051161SJung-uk Kim return (AE_ERROR); 2226af051161SJung-uk Kim } 2227af051161SJung-uk Kim 2228ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 2229af051161SJung-uk Kim if (ACPI_FAILURE (Status)) 2230af051161SJung-uk Kim { 2231af051161SJung-uk Kim return (Status); 2232af051161SJung-uk Kim } 2233af051161SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2234af051161SJung-uk Kim HmatStruct->Length += Subtable->Length; 2235af051161SJung-uk Kim 2236722b1667SJung-uk Kim /* Compile HMAT structure additional */ 2237af051161SJung-uk Kim 2238af051161SJung-uk Kim switch (HmatStruct->Type) 2239af051161SJung-uk Kim { 2240af051161SJung-uk Kim case ACPI_HMAT_TYPE_LOCALITY: 2241af051161SJung-uk Kim 2242af051161SJung-uk Kim HmatLocality = ACPI_SUB_PTR (ACPI_HMAT_LOCALITY, 2243af051161SJung-uk Kim Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE)); 2244af051161SJung-uk Kim 2245af051161SJung-uk Kim /* Compile initiator proximity domain list */ 2246af051161SJung-uk Kim 2247af051161SJung-uk Kim IntPDNumber = 0; 2248af051161SJung-uk Kim while (*PFieldList) 2249af051161SJung-uk Kim { 2250af051161SJung-uk Kim Status = DtCompileTable (PFieldList, 2251ff879b07SJung-uk Kim AcpiDmTableInfoHmat1a, &Subtable); 2252af051161SJung-uk Kim if (ACPI_FAILURE (Status)) 2253af051161SJung-uk Kim { 2254af051161SJung-uk Kim return (Status); 2255af051161SJung-uk Kim } 2256af051161SJung-uk Kim if (!Subtable) 2257af051161SJung-uk Kim { 2258af051161SJung-uk Kim break; 2259af051161SJung-uk Kim } 2260af051161SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2261af051161SJung-uk Kim HmatStruct->Length += Subtable->Length; 2262af051161SJung-uk Kim IntPDNumber++; 2263af051161SJung-uk Kim } 2264af051161SJung-uk Kim HmatLocality->NumberOfInitiatorPDs = IntPDNumber; 2265af051161SJung-uk Kim 2266af051161SJung-uk Kim /* Compile target proximity domain list */ 2267af051161SJung-uk Kim 2268af051161SJung-uk Kim TgtPDNumber = 0; 2269af051161SJung-uk Kim while (*PFieldList) 2270af051161SJung-uk Kim { 2271af051161SJung-uk Kim Status = DtCompileTable (PFieldList, 2272ff879b07SJung-uk Kim AcpiDmTableInfoHmat1b, &Subtable); 2273af051161SJung-uk Kim if (ACPI_FAILURE (Status)) 2274af051161SJung-uk Kim { 2275af051161SJung-uk Kim return (Status); 2276af051161SJung-uk Kim } 2277af051161SJung-uk Kim if (!Subtable) 2278af051161SJung-uk Kim { 2279af051161SJung-uk Kim break; 2280af051161SJung-uk Kim } 2281af051161SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2282af051161SJung-uk Kim HmatStruct->Length += Subtable->Length; 2283af051161SJung-uk Kim TgtPDNumber++; 2284af051161SJung-uk Kim } 2285af051161SJung-uk Kim HmatLocality->NumberOfTargetPDs = TgtPDNumber; 2286af051161SJung-uk Kim 2287af051161SJung-uk Kim /* Save start of the entries for reporting errors */ 2288af051161SJung-uk Kim 2289af051161SJung-uk Kim EntryStart = *PFieldList; 2290af051161SJung-uk Kim 2291af051161SJung-uk Kim /* Compile latency/bandwidth entries */ 2292af051161SJung-uk Kim 2293af051161SJung-uk Kim EntryNumber = 0; 2294af051161SJung-uk Kim while (*PFieldList) 2295af051161SJung-uk Kim { 2296af051161SJung-uk Kim Status = DtCompileTable (PFieldList, 2297ff879b07SJung-uk Kim AcpiDmTableInfoHmat1c, &Subtable); 2298af051161SJung-uk Kim if (ACPI_FAILURE (Status)) 2299af051161SJung-uk Kim { 2300af051161SJung-uk Kim return (Status); 2301af051161SJung-uk Kim } 2302af051161SJung-uk Kim if (!Subtable) 2303af051161SJung-uk Kim { 2304af051161SJung-uk Kim break; 2305af051161SJung-uk Kim } 2306af051161SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2307af051161SJung-uk Kim HmatStruct->Length += Subtable->Length; 2308af051161SJung-uk Kim EntryNumber++; 2309af051161SJung-uk Kim } 2310af051161SJung-uk Kim 2311af051161SJung-uk Kim /* Validate number of entries */ 2312af051161SJung-uk Kim 2313af051161SJung-uk Kim if (EntryNumber != 2314af051161SJung-uk Kim ((UINT64)IntPDNumber * (UINT64)TgtPDNumber)) 2315af051161SJung-uk Kim { 2316af051161SJung-uk Kim DtFatal (ASL_MSG_INVALID_EXPRESSION, EntryStart, "HMAT"); 2317af051161SJung-uk Kim return (AE_ERROR); 2318af051161SJung-uk Kim } 2319af051161SJung-uk Kim break; 2320af051161SJung-uk Kim 2321af051161SJung-uk Kim case ACPI_HMAT_TYPE_CACHE: 2322af051161SJung-uk Kim 2323af051161SJung-uk Kim /* Compile SMBIOS handles */ 2324af051161SJung-uk Kim 2325af051161SJung-uk Kim HmatCache = ACPI_SUB_PTR (ACPI_HMAT_CACHE, 2326af051161SJung-uk Kim Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE)); 2327af051161SJung-uk Kim SMBIOSHandleNumber = 0; 2328af051161SJung-uk Kim while (*PFieldList) 2329af051161SJung-uk Kim { 2330af051161SJung-uk Kim Status = DtCompileTable (PFieldList, 2331ff879b07SJung-uk Kim AcpiDmTableInfoHmat2a, &Subtable); 2332af051161SJung-uk Kim if (ACPI_FAILURE (Status)) 2333af051161SJung-uk Kim { 2334af051161SJung-uk Kim return (Status); 2335af051161SJung-uk Kim } 2336af051161SJung-uk Kim if (!Subtable) 2337af051161SJung-uk Kim { 2338af051161SJung-uk Kim break; 2339af051161SJung-uk Kim } 2340af051161SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2341af051161SJung-uk Kim HmatStruct->Length += Subtable->Length; 2342af051161SJung-uk Kim SMBIOSHandleNumber++; 2343af051161SJung-uk Kim } 2344af051161SJung-uk Kim HmatCache->NumberOfSMBIOSHandles = SMBIOSHandleNumber; 2345af051161SJung-uk Kim break; 2346af051161SJung-uk Kim 2347af051161SJung-uk Kim default: 2348af051161SJung-uk Kim 2349af051161SJung-uk Kim break; 2350af051161SJung-uk Kim } 2351af051161SJung-uk Kim } 2352af051161SJung-uk Kim 2353af051161SJung-uk Kim return (AE_OK); 2354af051161SJung-uk Kim } 2355af051161SJung-uk Kim 2356af051161SJung-uk Kim 2357af051161SJung-uk Kim /****************************************************************************** 2358af051161SJung-uk Kim * 2359f8146b88SJung-uk Kim * FUNCTION: DtCompileIort 2360f8146b88SJung-uk Kim * 2361f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 2362f8146b88SJung-uk Kim * 2363f8146b88SJung-uk Kim * RETURN: Status 2364f8146b88SJung-uk Kim * 2365f8146b88SJung-uk Kim * DESCRIPTION: Compile IORT. 2366f8146b88SJung-uk Kim * 2367f8146b88SJung-uk Kim *****************************************************************************/ 2368f8146b88SJung-uk Kim 2369f8146b88SJung-uk Kim ACPI_STATUS 2370f8146b88SJung-uk Kim DtCompileIort ( 2371f8146b88SJung-uk Kim void **List) 2372f8146b88SJung-uk Kim { 2373f8146b88SJung-uk Kim ACPI_STATUS Status; 2374f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 2375f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 2376f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 2377f8146b88SJung-uk Kim DT_FIELD *SubtableStart; 2378cfd1ed46SJung-uk Kim ACPI_TABLE_HEADER *Table; 2379f8146b88SJung-uk Kim ACPI_TABLE_IORT *Iort; 2380f8146b88SJung-uk Kim ACPI_IORT_NODE *IortNode; 2381f8146b88SJung-uk Kim ACPI_IORT_ITS_GROUP *IortItsGroup; 2382f8146b88SJung-uk Kim ACPI_IORT_SMMU *IortSmmu; 2383cfd1ed46SJung-uk Kim ACPI_IORT_RMR *IortRmr; 2384f8146b88SJung-uk Kim UINT32 NodeNumber; 2385f8146b88SJung-uk Kim UINT32 NodeLength; 2386f8146b88SJung-uk Kim UINT32 IdMappingNumber; 2387f8146b88SJung-uk Kim UINT32 ItsNumber; 2388f8146b88SJung-uk Kim UINT32 ContextIrptNumber; 2389f8146b88SJung-uk Kim UINT32 PmuIrptNumber; 2390f8146b88SJung-uk Kim UINT32 PaddingLength; 2391cfd1ed46SJung-uk Kim UINT8 Revision; 2392cfd1ed46SJung-uk Kim UINT32 RmrCount; 2393f8146b88SJung-uk Kim 2394f8146b88SJung-uk Kim 2395f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 2396f8146b88SJung-uk Kim 2397f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort, 2398ff879b07SJung-uk Kim &Subtable); 2399f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2400f8146b88SJung-uk Kim { 2401f8146b88SJung-uk Kim return (Status); 2402f8146b88SJung-uk Kim } 2403f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2404f8146b88SJung-uk Kim 2405cfd1ed46SJung-uk Kim Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); 2406cfd1ed46SJung-uk Kim Revision = Table->Revision; 2407cfd1ed46SJung-uk Kim 2408ab71bbb7SJung-uk Kim /* IORT Revisions E, E.a & E.c have known issues and are not supported */ 2409cfd1ed46SJung-uk Kim 2410ab71bbb7SJung-uk Kim if (Revision == 1 || Revision == 2 || Revision == 4) 2411cfd1ed46SJung-uk Kim { 2412cfd1ed46SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_UNSUPPORTED, NULL, "IORT table revision"); 2413cfd1ed46SJung-uk Kim return (AE_ERROR); 2414cfd1ed46SJung-uk Kim } 2415cfd1ed46SJung-uk Kim 2416f8146b88SJung-uk Kim /* 2417f8146b88SJung-uk Kim * Using ACPI_SUB_PTR, We needn't define a separate structure. Care 2418f8146b88SJung-uk Kim * should be taken to avoid accessing ACPI_TABLE_HEADER fields. 2419f8146b88SJung-uk Kim */ 2420f8146b88SJung-uk Kim Iort = ACPI_SUB_PTR (ACPI_TABLE_IORT, 2421f8146b88SJung-uk Kim Subtable->Buffer, sizeof (ACPI_TABLE_HEADER)); 2422f8146b88SJung-uk Kim 2423f8146b88SJung-uk Kim /* 2424f8146b88SJung-uk Kim * OptionalPadding - Variable-length data 2425f8146b88SJung-uk Kim * (Optional, size = OffsetToNodes - sizeof (ACPI_TABLE_IORT)) 2426f8146b88SJung-uk Kim * Optionally allows the generic data types to be used for filling 2427f8146b88SJung-uk Kim * this field. 2428f8146b88SJung-uk Kim */ 2429f8146b88SJung-uk Kim Iort->NodeOffset = sizeof (ACPI_TABLE_IORT); 2430f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortPad, 2431ff879b07SJung-uk Kim &Subtable); 2432f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2433f8146b88SJung-uk Kim { 2434f8146b88SJung-uk Kim return (Status); 2435f8146b88SJung-uk Kim } 2436f8146b88SJung-uk Kim if (Subtable) 2437f8146b88SJung-uk Kim { 2438f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2439f8146b88SJung-uk Kim Iort->NodeOffset += Subtable->Length; 2440f8146b88SJung-uk Kim } 2441f8146b88SJung-uk Kim else 2442f8146b88SJung-uk Kim { 2443f8146b88SJung-uk Kim Status = DtCompileGeneric (ACPI_CAST_PTR (void *, PFieldList), 2444f8146b88SJung-uk Kim AcpiDmTableInfoIortHdr[0].Name, &PaddingLength); 2445f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2446f8146b88SJung-uk Kim { 2447f8146b88SJung-uk Kim return (Status); 2448f8146b88SJung-uk Kim } 2449f8146b88SJung-uk Kim Iort->NodeOffset += PaddingLength; 2450f8146b88SJung-uk Kim } 2451f8146b88SJung-uk Kim 2452f8146b88SJung-uk Kim NodeNumber = 0; 2453f8146b88SJung-uk Kim while (*PFieldList) 2454f8146b88SJung-uk Kim { 2455f8146b88SJung-uk Kim SubtableStart = *PFieldList; 2456cfd1ed46SJung-uk Kim if (Revision == 0) 2457cfd1ed46SJung-uk Kim { 2458f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr, 2459ff879b07SJung-uk Kim &Subtable); 2460cfd1ed46SJung-uk Kim } 2461cfd1ed46SJung-uk Kim else if (Revision >= 3) 2462cfd1ed46SJung-uk Kim { 2463cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr3, 2464cfd1ed46SJung-uk Kim &Subtable); 2465cfd1ed46SJung-uk Kim } 2466cfd1ed46SJung-uk Kim 2467f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2468f8146b88SJung-uk Kim { 2469f8146b88SJung-uk Kim return (Status); 2470f8146b88SJung-uk Kim } 2471f8146b88SJung-uk Kim 2472f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2473f8146b88SJung-uk Kim IortNode = ACPI_CAST_PTR (ACPI_IORT_NODE, Subtable->Buffer); 2474f8146b88SJung-uk Kim NodeLength = ACPI_OFFSET (ACPI_IORT_NODE, NodeData); 2475f8146b88SJung-uk Kim 2476f8146b88SJung-uk Kim DtPushSubtable (Subtable); 2477f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 2478f8146b88SJung-uk Kim 2479f8146b88SJung-uk Kim switch (IortNode->Type) 2480f8146b88SJung-uk Kim { 2481f8146b88SJung-uk Kim case ACPI_IORT_NODE_ITS_GROUP: 2482f8146b88SJung-uk Kim 2483f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0, 2484ff879b07SJung-uk Kim &Subtable); 2485f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2486f8146b88SJung-uk Kim { 2487f8146b88SJung-uk Kim return (Status); 2488f8146b88SJung-uk Kim } 2489f8146b88SJung-uk Kim 2490f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2491f8146b88SJung-uk Kim IortItsGroup = ACPI_CAST_PTR (ACPI_IORT_ITS_GROUP, Subtable->Buffer); 2492f8146b88SJung-uk Kim NodeLength += Subtable->Length; 2493f8146b88SJung-uk Kim 2494f8146b88SJung-uk Kim ItsNumber = 0; 2495f8146b88SJung-uk Kim while (*PFieldList) 2496f8146b88SJung-uk Kim { 2497f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0a, 2498ff879b07SJung-uk Kim &Subtable); 2499f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2500f8146b88SJung-uk Kim { 2501f8146b88SJung-uk Kim return (Status); 2502f8146b88SJung-uk Kim } 2503f8146b88SJung-uk Kim if (!Subtable) 2504f8146b88SJung-uk Kim { 2505f8146b88SJung-uk Kim break; 2506f8146b88SJung-uk Kim } 2507f8146b88SJung-uk Kim 2508f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2509f8146b88SJung-uk Kim NodeLength += Subtable->Length; 2510f8146b88SJung-uk Kim ItsNumber++; 2511f8146b88SJung-uk Kim } 2512f8146b88SJung-uk Kim 2513f8146b88SJung-uk Kim IortItsGroup->ItsCount = ItsNumber; 2514f8146b88SJung-uk Kim break; 2515f8146b88SJung-uk Kim 2516f8146b88SJung-uk Kim case ACPI_IORT_NODE_NAMED_COMPONENT: 2517f8146b88SJung-uk Kim 2518f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1, 2519ff879b07SJung-uk Kim &Subtable); 2520f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2521f8146b88SJung-uk Kim { 2522f8146b88SJung-uk Kim return (Status); 2523f8146b88SJung-uk Kim } 2524f8146b88SJung-uk Kim 2525f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2526f8146b88SJung-uk Kim NodeLength += Subtable->Length; 2527f8146b88SJung-uk Kim 2528f8146b88SJung-uk Kim /* 2529f8146b88SJung-uk Kim * Padding - Variable-length data 2530f8146b88SJung-uk Kim * Optionally allows the offset of the ID mappings to be used 2531f8146b88SJung-uk Kim * for filling this field. 2532f8146b88SJung-uk Kim */ 2533f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1a, 2534ff879b07SJung-uk Kim &Subtable); 2535f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2536f8146b88SJung-uk Kim { 2537f8146b88SJung-uk Kim return (Status); 2538f8146b88SJung-uk Kim } 2539f8146b88SJung-uk Kim 2540f8146b88SJung-uk Kim if (Subtable) 2541f8146b88SJung-uk Kim { 2542f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2543f8146b88SJung-uk Kim NodeLength += Subtable->Length; 2544f8146b88SJung-uk Kim } 2545f8146b88SJung-uk Kim else 2546f8146b88SJung-uk Kim { 2547f8146b88SJung-uk Kim if (NodeLength > IortNode->MappingOffset) 2548f8146b88SJung-uk Kim { 2549f8146b88SJung-uk Kim return (AE_BAD_DATA); 2550f8146b88SJung-uk Kim } 2551f8146b88SJung-uk Kim 2552f8146b88SJung-uk Kim if (NodeLength < IortNode->MappingOffset) 2553f8146b88SJung-uk Kim { 2554f8146b88SJung-uk Kim Status = DtCompilePadding ( 2555f8146b88SJung-uk Kim IortNode->MappingOffset - NodeLength, 2556f8146b88SJung-uk Kim &Subtable); 2557f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2558f8146b88SJung-uk Kim { 2559f8146b88SJung-uk Kim return (Status); 2560f8146b88SJung-uk Kim } 2561f8146b88SJung-uk Kim 2562f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2563f8146b88SJung-uk Kim NodeLength = IortNode->MappingOffset; 2564f8146b88SJung-uk Kim } 2565f8146b88SJung-uk Kim } 2566f8146b88SJung-uk Kim break; 2567f8146b88SJung-uk Kim 2568f8146b88SJung-uk Kim case ACPI_IORT_NODE_PCI_ROOT_COMPLEX: 2569f8146b88SJung-uk Kim 2570f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort2, 2571ff879b07SJung-uk Kim &Subtable); 2572f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2573f8146b88SJung-uk Kim { 2574f8146b88SJung-uk Kim return (Status); 2575f8146b88SJung-uk Kim } 2576f8146b88SJung-uk Kim 2577f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2578f8146b88SJung-uk Kim NodeLength += Subtable->Length; 2579f8146b88SJung-uk Kim break; 2580f8146b88SJung-uk Kim 2581f8146b88SJung-uk Kim case ACPI_IORT_NODE_SMMU: 2582f8146b88SJung-uk Kim 2583f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3, 2584ff879b07SJung-uk Kim &Subtable); 2585f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2586f8146b88SJung-uk Kim { 2587f8146b88SJung-uk Kim return (Status); 2588f8146b88SJung-uk Kim } 2589f8146b88SJung-uk Kim 2590f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2591f8146b88SJung-uk Kim IortSmmu = ACPI_CAST_PTR (ACPI_IORT_SMMU, Subtable->Buffer); 2592f8146b88SJung-uk Kim NodeLength += Subtable->Length; 2593f8146b88SJung-uk Kim 2594f8146b88SJung-uk Kim /* Compile global interrupt array */ 2595f8146b88SJung-uk Kim 2596f8146b88SJung-uk Kim IortSmmu->GlobalInterruptOffset = NodeLength; 2597f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3a, 2598ff879b07SJung-uk Kim &Subtable); 2599f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2600f8146b88SJung-uk Kim { 2601f8146b88SJung-uk Kim return (Status); 2602f8146b88SJung-uk Kim } 2603f8146b88SJung-uk Kim 2604f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2605f8146b88SJung-uk Kim NodeLength += Subtable->Length; 2606f8146b88SJung-uk Kim 2607f8146b88SJung-uk Kim /* Compile context interrupt array */ 2608f8146b88SJung-uk Kim 2609f8146b88SJung-uk Kim ContextIrptNumber = 0; 2610f8146b88SJung-uk Kim IortSmmu->ContextInterruptOffset = NodeLength; 2611f8146b88SJung-uk Kim while (*PFieldList) 2612f8146b88SJung-uk Kim { 2613f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3b, 2614ff879b07SJung-uk Kim &Subtable); 2615f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2616f8146b88SJung-uk Kim { 2617f8146b88SJung-uk Kim return (Status); 2618f8146b88SJung-uk Kim } 2619f8146b88SJung-uk Kim 2620f8146b88SJung-uk Kim if (!Subtable) 2621f8146b88SJung-uk Kim { 2622f8146b88SJung-uk Kim break; 2623f8146b88SJung-uk Kim } 2624f8146b88SJung-uk Kim 2625f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2626f8146b88SJung-uk Kim NodeLength += Subtable->Length; 2627f8146b88SJung-uk Kim ContextIrptNumber++; 2628f8146b88SJung-uk Kim } 2629f8146b88SJung-uk Kim 2630f8146b88SJung-uk Kim IortSmmu->ContextInterruptCount = ContextIrptNumber; 2631f8146b88SJung-uk Kim 2632f8146b88SJung-uk Kim /* Compile PMU interrupt array */ 2633f8146b88SJung-uk Kim 2634f8146b88SJung-uk Kim PmuIrptNumber = 0; 2635f8146b88SJung-uk Kim IortSmmu->PmuInterruptOffset = NodeLength; 2636f8146b88SJung-uk Kim while (*PFieldList) 2637f8146b88SJung-uk Kim { 2638f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3c, 2639ff879b07SJung-uk Kim &Subtable); 2640f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2641f8146b88SJung-uk Kim { 2642f8146b88SJung-uk Kim return (Status); 2643f8146b88SJung-uk Kim } 2644f8146b88SJung-uk Kim 2645f8146b88SJung-uk Kim if (!Subtable) 2646f8146b88SJung-uk Kim { 2647f8146b88SJung-uk Kim break; 2648f8146b88SJung-uk Kim } 2649f8146b88SJung-uk Kim 2650f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2651f8146b88SJung-uk Kim NodeLength += Subtable->Length; 2652f8146b88SJung-uk Kim PmuIrptNumber++; 2653f8146b88SJung-uk Kim } 2654f8146b88SJung-uk Kim 2655f8146b88SJung-uk Kim IortSmmu->PmuInterruptCount = PmuIrptNumber; 2656f8146b88SJung-uk Kim break; 2657f8146b88SJung-uk Kim 2658f8146b88SJung-uk Kim case ACPI_IORT_NODE_SMMU_V3: 2659f8146b88SJung-uk Kim 2660f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort4, 2661ff879b07SJung-uk Kim &Subtable); 2662f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2663f8146b88SJung-uk Kim { 2664f8146b88SJung-uk Kim return (Status); 2665f8146b88SJung-uk Kim } 2666f8146b88SJung-uk Kim 2667f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2668f8146b88SJung-uk Kim NodeLength += Subtable->Length; 2669f8146b88SJung-uk Kim break; 2670f8146b88SJung-uk Kim 26713d90091dSJung-uk Kim case ACPI_IORT_NODE_PMCG: 26723d90091dSJung-uk Kim 26733d90091dSJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort5, 26743d90091dSJung-uk Kim &Subtable); 26753d90091dSJung-uk Kim if (ACPI_FAILURE (Status)) 26763d90091dSJung-uk Kim { 26773d90091dSJung-uk Kim return (Status); 26783d90091dSJung-uk Kim } 26793d90091dSJung-uk Kim 26803d90091dSJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 26813d90091dSJung-uk Kim NodeLength += Subtable->Length; 26823d90091dSJung-uk Kim break; 26833d90091dSJung-uk Kim 2684cfd1ed46SJung-uk Kim case ACPI_IORT_NODE_RMR: 2685cfd1ed46SJung-uk Kim 2686cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6, 2687cfd1ed46SJung-uk Kim &Subtable); 2688cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 2689cfd1ed46SJung-uk Kim { 2690cfd1ed46SJung-uk Kim return (Status); 2691cfd1ed46SJung-uk Kim } 2692cfd1ed46SJung-uk Kim 2693cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2694cfd1ed46SJung-uk Kim IortRmr = ACPI_CAST_PTR (ACPI_IORT_RMR, Subtable->Buffer); 2695cfd1ed46SJung-uk Kim NodeLength += Subtable->Length; 2696cfd1ed46SJung-uk Kim 2697cfd1ed46SJung-uk Kim /* Compile RMR Descriptors */ 2698cfd1ed46SJung-uk Kim 2699cfd1ed46SJung-uk Kim RmrCount = 0; 2700cfd1ed46SJung-uk Kim IortRmr->RmrOffset = NodeLength; 2701cfd1ed46SJung-uk Kim while (*PFieldList) 2702cfd1ed46SJung-uk Kim { 2703cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6a, 2704cfd1ed46SJung-uk Kim &Subtable); 2705cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 2706cfd1ed46SJung-uk Kim { 2707cfd1ed46SJung-uk Kim return (Status); 2708cfd1ed46SJung-uk Kim } 2709cfd1ed46SJung-uk Kim 2710cfd1ed46SJung-uk Kim if (!Subtable) 2711cfd1ed46SJung-uk Kim { 2712cfd1ed46SJung-uk Kim break; 2713cfd1ed46SJung-uk Kim } 2714cfd1ed46SJung-uk Kim 2715cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2716cfd1ed46SJung-uk Kim NodeLength += sizeof (ACPI_IORT_RMR_DESC); 2717cfd1ed46SJung-uk Kim RmrCount++; 2718cfd1ed46SJung-uk Kim } 2719cfd1ed46SJung-uk Kim 2720cfd1ed46SJung-uk Kim IortRmr->RmrCount = RmrCount; 2721cfd1ed46SJung-uk Kim break; 2722cfd1ed46SJung-uk Kim 2723f8146b88SJung-uk Kim default: 2724f8146b88SJung-uk Kim 2725f8146b88SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IORT"); 2726f8146b88SJung-uk Kim return (AE_ERROR); 2727f8146b88SJung-uk Kim } 2728f8146b88SJung-uk Kim 2729f8146b88SJung-uk Kim /* Compile Array of ID mappings */ 2730f8146b88SJung-uk Kim 2731f8146b88SJung-uk Kim IortNode->MappingOffset = NodeLength; 2732f8146b88SJung-uk Kim IdMappingNumber = 0; 2733f8146b88SJung-uk Kim while (*PFieldList) 2734f8146b88SJung-uk Kim { 2735f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortMap, 2736ff879b07SJung-uk Kim &Subtable); 2737f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2738f8146b88SJung-uk Kim { 2739f8146b88SJung-uk Kim return (Status); 2740f8146b88SJung-uk Kim } 2741f8146b88SJung-uk Kim 2742f8146b88SJung-uk Kim if (!Subtable) 2743f8146b88SJung-uk Kim { 2744f8146b88SJung-uk Kim break; 2745f8146b88SJung-uk Kim } 2746f8146b88SJung-uk Kim 2747f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2748f8146b88SJung-uk Kim NodeLength += sizeof (ACPI_IORT_ID_MAPPING); 2749f8146b88SJung-uk Kim IdMappingNumber++; 2750f8146b88SJung-uk Kim } 2751f8146b88SJung-uk Kim 2752f8146b88SJung-uk Kim IortNode->MappingCount = IdMappingNumber; 27530d84335fSJung-uk Kim if (!IdMappingNumber) 27540d84335fSJung-uk Kim { 27550d84335fSJung-uk Kim IortNode->MappingOffset = 0; 27560d84335fSJung-uk Kim } 2757f8146b88SJung-uk Kim 2758f8146b88SJung-uk Kim /* 2759f8146b88SJung-uk Kim * Node length can be determined by DT_LENGTH option 2760f8146b88SJung-uk Kim * IortNode->Length = NodeLength; 2761f8146b88SJung-uk Kim */ 2762f8146b88SJung-uk Kim DtPopSubtable (); 2763f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 2764f8146b88SJung-uk Kim NodeNumber++; 2765f8146b88SJung-uk Kim } 2766f8146b88SJung-uk Kim 2767f8146b88SJung-uk Kim Iort->NodeCount = NodeNumber; 2768f8146b88SJung-uk Kim return (AE_OK); 2769f8146b88SJung-uk Kim } 2770f8146b88SJung-uk Kim 2771f8146b88SJung-uk Kim 2772f8146b88SJung-uk Kim /****************************************************************************** 2773f8146b88SJung-uk Kim * 2774f8146b88SJung-uk Kim * FUNCTION: DtCompileIvrs 2775f8146b88SJung-uk Kim * 2776f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 2777f8146b88SJung-uk Kim * 2778f8146b88SJung-uk Kim * RETURN: Status 2779f8146b88SJung-uk Kim * 27801970d693SJung-uk Kim * DESCRIPTION: Compile IVRS. Notes: 27811970d693SJung-uk Kim * The IVRS is essentially a flat table, with the following 27821970d693SJung-uk Kim * structure: 27831970d693SJung-uk Kim * <Main ACPI Table Header> 27841970d693SJung-uk Kim * <Main subtable - virtualization info> 27851970d693SJung-uk Kim * <IVHD> 27861970d693SJung-uk Kim * <Device Entries> 27871970d693SJung-uk Kim * ... 27881970d693SJung-uk Kim * <IVHD> 27891970d693SJung-uk Kim * <Device Entries> 27901970d693SJung-uk Kim * <IVMD> 27911970d693SJung-uk Kim * ... 2792f8146b88SJung-uk Kim * 2793f8146b88SJung-uk Kim *****************************************************************************/ 2794f8146b88SJung-uk Kim 2795f8146b88SJung-uk Kim ACPI_STATUS 2796f8146b88SJung-uk Kim DtCompileIvrs ( 2797f8146b88SJung-uk Kim void **List) 2798f8146b88SJung-uk Kim { 2799f8146b88SJung-uk Kim ACPI_STATUS Status; 2800f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 2801f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 28021970d693SJung-uk Kim DT_SUBTABLE *MainSubtable; 2803f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 2804f8146b88SJung-uk Kim DT_FIELD *SubtableStart; 28051970d693SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable = NULL; 28061970d693SJung-uk Kim UINT8 SubtableType; 28071970d693SJung-uk Kim UINT8 Temp64[16]; 28081970d693SJung-uk Kim UINT8 Temp8; 2809f8146b88SJung-uk Kim 2810f8146b88SJung-uk Kim 28111970d693SJung-uk Kim /* Main table */ 28121970d693SJung-uk Kim 2813f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs, 2814ff879b07SJung-uk Kim &Subtable); 2815f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2816f8146b88SJung-uk Kim { 2817f8146b88SJung-uk Kim return (Status); 2818f8146b88SJung-uk Kim } 2819f8146b88SJung-uk Kim 2820f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 2821f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 28221970d693SJung-uk Kim DtPushSubtable (Subtable); 28231970d693SJung-uk Kim 28241970d693SJung-uk Kim /* Save a pointer to the main subtable */ 28251970d693SJung-uk Kim 28261970d693SJung-uk Kim MainSubtable = Subtable; 2827f8146b88SJung-uk Kim 2828f8146b88SJung-uk Kim while (*PFieldList) 2829f8146b88SJung-uk Kim { 2830f8146b88SJung-uk Kim SubtableStart = *PFieldList; 28311970d693SJung-uk Kim 28321970d693SJung-uk Kim /* Compile the SubtableType integer */ 28331970d693SJung-uk Kim 28341970d693SJung-uk Kim DtCompileInteger (&SubtableType, *PFieldList, 1, 0); 28351970d693SJung-uk Kim 28361970d693SJung-uk Kim switch (SubtableType) 2837f8146b88SJung-uk Kim { 2838f8146b88SJung-uk Kim 28391970d693SJung-uk Kim /* Type 10h, IVHD (I/O Virtualization Hardware Definition) */ 2840f8146b88SJung-uk Kim 28413ee58df5SJung-uk Kim case ACPI_IVRS_TYPE_HARDWARE1: 2842f8146b88SJung-uk Kim 28431970d693SJung-uk Kim InfoTable = AcpiDmTableInfoIvrsHware1; 2844f8146b88SJung-uk Kim break; 2845f8146b88SJung-uk Kim 28461970d693SJung-uk Kim /* Types 11h, 40h, IVHD (I/O Virtualization Hardware Definition) */ 28471970d693SJung-uk Kim 28483ee58df5SJung-uk Kim case ACPI_IVRS_TYPE_HARDWARE2: 28491970d693SJung-uk Kim case ACPI_IVRS_TYPE_HARDWARE3: 28503ee58df5SJung-uk Kim 28511970d693SJung-uk Kim InfoTable = AcpiDmTableInfoIvrsHware23; 28523ee58df5SJung-uk Kim break; 28533ee58df5SJung-uk Kim 28541970d693SJung-uk Kim /* Types 20h, 21h, 22h, IVMD (I/O Virtualization Memory Definition Block) */ 28551970d693SJung-uk Kim 2856f8146b88SJung-uk Kim case ACPI_IVRS_TYPE_MEMORY1: 2857f8146b88SJung-uk Kim case ACPI_IVRS_TYPE_MEMORY2: 2858f8146b88SJung-uk Kim case ACPI_IVRS_TYPE_MEMORY3: 2859f8146b88SJung-uk Kim 28601970d693SJung-uk Kim InfoTable = AcpiDmTableInfoIvrsMemory; 2861f8146b88SJung-uk Kim break; 2862f8146b88SJung-uk Kim 2863f8146b88SJung-uk Kim /* 4-byte device entries */ 2864f8146b88SJung-uk Kim 2865f8146b88SJung-uk Kim case ACPI_IVRS_TYPE_PAD4: 2866f8146b88SJung-uk Kim case ACPI_IVRS_TYPE_ALL: 2867f8146b88SJung-uk Kim case ACPI_IVRS_TYPE_SELECT: 2868f8146b88SJung-uk Kim case ACPI_IVRS_TYPE_START: 2869f8146b88SJung-uk Kim case ACPI_IVRS_TYPE_END: 2870f8146b88SJung-uk Kim 2871f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs4; 2872f8146b88SJung-uk Kim break; 2873f8146b88SJung-uk Kim 28741970d693SJung-uk Kim /* 8-byte device entries, type A */ 2875f8146b88SJung-uk Kim 2876f8146b88SJung-uk Kim case ACPI_IVRS_TYPE_ALIAS_SELECT: 2877f8146b88SJung-uk Kim case ACPI_IVRS_TYPE_ALIAS_START: 2878f8146b88SJung-uk Kim 2879f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs8a; 2880f8146b88SJung-uk Kim break; 2881f8146b88SJung-uk Kim 28821970d693SJung-uk Kim /* 8-byte device entries, type B */ 2883f8146b88SJung-uk Kim 2884f8146b88SJung-uk Kim case ACPI_IVRS_TYPE_EXT_SELECT: 2885f8146b88SJung-uk Kim case ACPI_IVRS_TYPE_EXT_START: 2886f8146b88SJung-uk Kim 2887f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs8b; 2888f8146b88SJung-uk Kim break; 2889f8146b88SJung-uk Kim 28901970d693SJung-uk Kim /* 8-byte device entries, type C */ 2891f8146b88SJung-uk Kim 2892f8146b88SJung-uk Kim case ACPI_IVRS_TYPE_SPECIAL: 2893f8146b88SJung-uk Kim 2894f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs8c; 2895f8146b88SJung-uk Kim break; 2896f8146b88SJung-uk Kim 28971970d693SJung-uk Kim /* Variable device entries, type F0h */ 28981970d693SJung-uk Kim 28991970d693SJung-uk Kim case ACPI_IVRS_TYPE_HID: 29001970d693SJung-uk Kim 29011970d693SJung-uk Kim InfoTable = AcpiDmTableInfoIvrsHid; 29021970d693SJung-uk Kim break; 29031970d693SJung-uk Kim 2904f8146b88SJung-uk Kim default: 2905f8146b88SJung-uk Kim 2906f8146b88SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, 2907f8146b88SJung-uk Kim "IVRS Device Entry"); 2908f8146b88SJung-uk Kim return (AE_ERROR); 2909f8146b88SJung-uk Kim } 2910f8146b88SJung-uk Kim 29111970d693SJung-uk Kim /* Compile the InfoTable from above */ 29121970d693SJung-uk Kim 2913f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, 2914ff879b07SJung-uk Kim &Subtable); 2915f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2916f8146b88SJung-uk Kim { 2917f8146b88SJung-uk Kim return (Status); 2918f8146b88SJung-uk Kim } 2919f8146b88SJung-uk Kim 29201970d693SJung-uk Kim ParentTable = DtPeekSubtable (); 29211970d693SJung-uk Kim if (SubtableType != ACPI_IVRS_TYPE_HARDWARE1 && 29221970d693SJung-uk Kim SubtableType != ACPI_IVRS_TYPE_HARDWARE2 && 29231970d693SJung-uk Kim SubtableType != ACPI_IVRS_TYPE_HARDWARE3 && 29241970d693SJung-uk Kim SubtableType != ACPI_IVRS_TYPE_HID && 29251970d693SJung-uk Kim SubtableType != ACPI_IVRS_TYPE_MEMORY1 && 29261970d693SJung-uk Kim SubtableType != ACPI_IVRS_TYPE_MEMORY2 && 29271970d693SJung-uk Kim SubtableType != ACPI_IVRS_TYPE_MEMORY3) 29281970d693SJung-uk Kim { 29291970d693SJung-uk Kim if (ParentTable) 2930f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2931f8146b88SJung-uk Kim } 29321970d693SJung-uk Kim 29331970d693SJung-uk Kim switch (SubtableType) 29341970d693SJung-uk Kim { 29351970d693SJung-uk Kim case ACPI_IVRS_TYPE_HARDWARE1: 29361970d693SJung-uk Kim case ACPI_IVRS_TYPE_HARDWARE2: 29371970d693SJung-uk Kim case ACPI_IVRS_TYPE_HARDWARE3: 29381970d693SJung-uk Kim case ACPI_IVRS_TYPE_MEMORY1: 29391970d693SJung-uk Kim case ACPI_IVRS_TYPE_MEMORY2: 29401970d693SJung-uk Kim case ACPI_IVRS_TYPE_MEMORY3: 29411970d693SJung-uk Kim 29421970d693SJung-uk Kim /* Insert these IVHDs/IVMDs at the root subtable */ 29431970d693SJung-uk Kim 29441970d693SJung-uk Kim DtInsertSubtable (MainSubtable, Subtable); 29451970d693SJung-uk Kim DtPushSubtable (Subtable); 29461970d693SJung-uk Kim break; 29471970d693SJung-uk Kim 29481970d693SJung-uk Kim case ACPI_IVRS_TYPE_HID: 29491970d693SJung-uk Kim 29501970d693SJung-uk Kim /* Special handling for the HID named device entry (0xF0) */ 29511970d693SJung-uk Kim 29521970d693SJung-uk Kim if (ParentTable) 29531970d693SJung-uk Kim { 29541970d693SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 29551970d693SJung-uk Kim } 29561970d693SJung-uk Kim 29571970d693SJung-uk Kim /* 29581970d693SJung-uk Kim * Process the HID value. First, get the HID value as a string. 29591970d693SJung-uk Kim */ 29601970d693SJung-uk Kim DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 16, DT_FIELD_TYPE_STRING, 0); 29611970d693SJung-uk Kim 29621970d693SJung-uk Kim /* 29631970d693SJung-uk Kim * Determine if the HID is an integer or a string. 29641970d693SJung-uk Kim * An integer is defined to be 32 bits, with the upper 32 bits 29651970d693SJung-uk Kim * set to zero. (from the ACPI Spec): "The HID can be a 32-bit 29661970d693SJung-uk Kim * integer or a character string. If an integer, the lower 29671970d693SJung-uk Kim * 4 bytes of the field contain the integer and the upper 29681970d693SJung-uk Kim * 4 bytes are padded with 0". 29691970d693SJung-uk Kim */ 29701970d693SJung-uk Kim if (UtIsIdInteger ((UINT8 *) &Temp64)) 29711970d693SJung-uk Kim { 29721970d693SJung-uk Kim /* Compile the HID value as an integer */ 29731970d693SJung-uk Kim 29741970d693SJung-uk Kim DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 8, DT_FIELD_TYPE_INTEGER, 0); 29751970d693SJung-uk Kim 29761970d693SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHidInteger, 29771970d693SJung-uk Kim &Subtable); 29781970d693SJung-uk Kim if (ACPI_FAILURE (Status)) 29791970d693SJung-uk Kim { 29801970d693SJung-uk Kim return (Status); 29811970d693SJung-uk Kim } 29821970d693SJung-uk Kim } 29831970d693SJung-uk Kim else 29841970d693SJung-uk Kim { 29851970d693SJung-uk Kim /* Compile the HID value as a string */ 29861970d693SJung-uk Kim 29871970d693SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHidString, 29881970d693SJung-uk Kim &Subtable); 29891970d693SJung-uk Kim if (ACPI_FAILURE (Status)) 29901970d693SJung-uk Kim { 29911970d693SJung-uk Kim return (Status); 29921970d693SJung-uk Kim } 2993f8146b88SJung-uk Kim } 2994f8146b88SJung-uk Kim 29951970d693SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 29961970d693SJung-uk Kim 29971970d693SJung-uk Kim /* 29981970d693SJung-uk Kim * Process the CID value. First, get the CID value as a string. 29991970d693SJung-uk Kim */ 30001970d693SJung-uk Kim DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 16, DT_FIELD_TYPE_STRING, 0); 30011970d693SJung-uk Kim 30021970d693SJung-uk Kim if (UtIsIdInteger ((UINT8 *) &Temp64)) 30031970d693SJung-uk Kim { 30041970d693SJung-uk Kim /* Compile the CID value as an integer */ 30051970d693SJung-uk Kim 30061970d693SJung-uk Kim DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 8, DT_FIELD_TYPE_INTEGER, 0); 30071970d693SJung-uk Kim 30081970d693SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsCidInteger, 30091970d693SJung-uk Kim &Subtable); 30101970d693SJung-uk Kim if (ACPI_FAILURE (Status)) 30111970d693SJung-uk Kim { 30121970d693SJung-uk Kim return (Status); 30131970d693SJung-uk Kim } 30141970d693SJung-uk Kim } 30151970d693SJung-uk Kim else 30161970d693SJung-uk Kim { 30171970d693SJung-uk Kim /* Compile the CID value as a string */ 30181970d693SJung-uk Kim 30191970d693SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsCidString, 30201970d693SJung-uk Kim &Subtable); 30211970d693SJung-uk Kim if (ACPI_FAILURE (Status)) 30221970d693SJung-uk Kim { 30231970d693SJung-uk Kim return (Status); 30241970d693SJung-uk Kim } 30251970d693SJung-uk Kim } 30261970d693SJung-uk Kim 30271970d693SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 30281970d693SJung-uk Kim 30291970d693SJung-uk Kim /* 30301970d693SJung-uk Kim * Process the UID value. First, get and decode the "UID Format" field (Integer). 30311970d693SJung-uk Kim */ 30321970d693SJung-uk Kim if (!*PFieldList) 30331970d693SJung-uk Kim { 30341970d693SJung-uk Kim return (AE_OK); 30351970d693SJung-uk Kim } 30361970d693SJung-uk Kim 30371970d693SJung-uk Kim DtCompileOneField (&Temp8, *PFieldList, 1, DT_FIELD_TYPE_INTEGER, 0); 30381970d693SJung-uk Kim 30391970d693SJung-uk Kim switch (Temp8) 30401970d693SJung-uk Kim { 30411970d693SJung-uk Kim case ACPI_IVRS_UID_NOT_PRESENT: 30421970d693SJung-uk Kim break; 30431970d693SJung-uk Kim 30441970d693SJung-uk Kim case ACPI_IVRS_UID_IS_INTEGER: 30451970d693SJung-uk Kim 30461970d693SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsUidInteger, 30471970d693SJung-uk Kim &Subtable); 30481970d693SJung-uk Kim if (ACPI_FAILURE (Status)) 30491970d693SJung-uk Kim { 30501970d693SJung-uk Kim return (Status); 30511970d693SJung-uk Kim } 30521970d693SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 30531970d693SJung-uk Kim break; 30541970d693SJung-uk Kim 30551970d693SJung-uk Kim case ACPI_IVRS_UID_IS_STRING: 30561970d693SJung-uk Kim 30571970d693SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsUidString, 30581970d693SJung-uk Kim &Subtable); 30591970d693SJung-uk Kim if (ACPI_FAILURE (Status)) 30601970d693SJung-uk Kim { 30611970d693SJung-uk Kim return (Status); 30621970d693SJung-uk Kim } 30631970d693SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 30641970d693SJung-uk Kim break; 30651970d693SJung-uk Kim 30661970d693SJung-uk Kim default: 30671970d693SJung-uk Kim 30681970d693SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_FORMAT, SubtableStart, 30691970d693SJung-uk Kim "IVRS Device Entry"); 30701970d693SJung-uk Kim return (AE_ERROR); 30711970d693SJung-uk Kim } 30721970d693SJung-uk Kim 30731970d693SJung-uk Kim default: 30741970d693SJung-uk Kim 30751970d693SJung-uk Kim /* All other subtable types come through here */ 30761970d693SJung-uk Kim break; 30771970d693SJung-uk Kim } 3078f8146b88SJung-uk Kim } 3079f8146b88SJung-uk Kim 3080f8146b88SJung-uk Kim return (AE_OK); 3081f8146b88SJung-uk Kim } 3082