1f8146b88SJung-uk Kim /****************************************************************************** 2f8146b88SJung-uk Kim * 3f8146b88SJung-uk Kim * Module Name: dttable2.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 * 1129f37e9bSJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2021, 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 L-Z */ 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 ("dttable2") 158f8146b88SJung-uk Kim 159f8146b88SJung-uk Kim 160f8146b88SJung-uk Kim /****************************************************************************** 161f8146b88SJung-uk Kim * 162f8146b88SJung-uk Kim * FUNCTION: DtCompileLpit 163f8146b88SJung-uk Kim * 164f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 165f8146b88SJung-uk Kim * 166f8146b88SJung-uk Kim * RETURN: Status 167f8146b88SJung-uk Kim * 168f8146b88SJung-uk Kim * DESCRIPTION: Compile LPIT. 169f8146b88SJung-uk Kim * 170f8146b88SJung-uk Kim *****************************************************************************/ 171f8146b88SJung-uk Kim 172f8146b88SJung-uk Kim ACPI_STATUS 173f8146b88SJung-uk Kim DtCompileLpit ( 174f8146b88SJung-uk Kim void **List) 175f8146b88SJung-uk Kim { 176f8146b88SJung-uk Kim ACPI_STATUS Status; 177f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 178f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 179f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 180f8146b88SJung-uk Kim DT_FIELD *SubtableStart; 181f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 182f8146b88SJung-uk Kim ACPI_LPIT_HEADER *LpitHeader; 183f8146b88SJung-uk Kim 184f8146b88SJung-uk Kim 185f8146b88SJung-uk Kim /* Note: Main table consists only of the standard ACPI table header */ 186f8146b88SJung-uk Kim 187f8146b88SJung-uk Kim while (*PFieldList) 188f8146b88SJung-uk Kim { 189f8146b88SJung-uk Kim SubtableStart = *PFieldList; 190f8146b88SJung-uk Kim 191f8146b88SJung-uk Kim /* LPIT Subtable header */ 192f8146b88SJung-uk Kim 193f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoLpitHdr, 194ff879b07SJung-uk Kim &Subtable); 195f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 196f8146b88SJung-uk Kim { 197f8146b88SJung-uk Kim return (Status); 198f8146b88SJung-uk Kim } 199f8146b88SJung-uk Kim 200f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 201f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 202f8146b88SJung-uk Kim DtPushSubtable (Subtable); 203f8146b88SJung-uk Kim 204f8146b88SJung-uk Kim LpitHeader = ACPI_CAST_PTR (ACPI_LPIT_HEADER, Subtable->Buffer); 205f8146b88SJung-uk Kim 206f8146b88SJung-uk Kim switch (LpitHeader->Type) 207f8146b88SJung-uk Kim { 208f8146b88SJung-uk Kim case ACPI_LPIT_TYPE_NATIVE_CSTATE: 209f8146b88SJung-uk Kim 210f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoLpit0; 211f8146b88SJung-uk Kim break; 212f8146b88SJung-uk Kim 213f8146b88SJung-uk Kim default: 214f8146b88SJung-uk Kim 215f8146b88SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "LPIT"); 216f8146b88SJung-uk Kim return (AE_ERROR); 217f8146b88SJung-uk Kim } 218f8146b88SJung-uk Kim 219f8146b88SJung-uk Kim /* LPIT Subtable */ 220f8146b88SJung-uk Kim 221ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 222f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 223f8146b88SJung-uk Kim { 224f8146b88SJung-uk Kim return (Status); 225f8146b88SJung-uk Kim } 226f8146b88SJung-uk Kim 227f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 228f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 229f8146b88SJung-uk Kim DtPopSubtable (); 230f8146b88SJung-uk Kim } 231f8146b88SJung-uk Kim 232f8146b88SJung-uk Kim return (AE_OK); 233f8146b88SJung-uk Kim } 234f8146b88SJung-uk Kim 235f8146b88SJung-uk Kim 236f8146b88SJung-uk Kim /****************************************************************************** 237f8146b88SJung-uk Kim * 238f8146b88SJung-uk Kim * FUNCTION: DtCompileMadt 239f8146b88SJung-uk Kim * 240f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 241f8146b88SJung-uk Kim * 242f8146b88SJung-uk Kim * RETURN: Status 243f8146b88SJung-uk Kim * 244f8146b88SJung-uk Kim * DESCRIPTION: Compile MADT. 245f8146b88SJung-uk Kim * 246f8146b88SJung-uk Kim *****************************************************************************/ 247f8146b88SJung-uk Kim 248f8146b88SJung-uk Kim ACPI_STATUS 249f8146b88SJung-uk Kim DtCompileMadt ( 250f8146b88SJung-uk Kim void **List) 251f8146b88SJung-uk Kim { 252f8146b88SJung-uk Kim ACPI_STATUS Status; 253f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 254f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 255f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 256f8146b88SJung-uk Kim DT_FIELD *SubtableStart; 257f8146b88SJung-uk Kim ACPI_SUBTABLE_HEADER *MadtHeader; 258f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 259f8146b88SJung-uk Kim 260f8146b88SJung-uk Kim 261f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt, 262ff879b07SJung-uk Kim &Subtable); 263f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 264f8146b88SJung-uk Kim { 265f8146b88SJung-uk Kim return (Status); 266f8146b88SJung-uk Kim } 267f8146b88SJung-uk Kim 268f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 269f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 270f8146b88SJung-uk Kim 271f8146b88SJung-uk Kim while (*PFieldList) 272f8146b88SJung-uk Kim { 273f8146b88SJung-uk Kim SubtableStart = *PFieldList; 274f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr, 275ff879b07SJung-uk Kim &Subtable); 276f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 277f8146b88SJung-uk Kim { 278f8146b88SJung-uk Kim return (Status); 279f8146b88SJung-uk Kim } 280f8146b88SJung-uk Kim 281f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 282f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 283f8146b88SJung-uk Kim DtPushSubtable (Subtable); 284f8146b88SJung-uk Kim 285f8146b88SJung-uk Kim MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 286f8146b88SJung-uk Kim 287f8146b88SJung-uk Kim switch (MadtHeader->Type) 288f8146b88SJung-uk Kim { 289f8146b88SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_APIC: 290f8146b88SJung-uk Kim 291f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt0; 292f8146b88SJung-uk Kim break; 293f8146b88SJung-uk Kim 294f8146b88SJung-uk Kim case ACPI_MADT_TYPE_IO_APIC: 295f8146b88SJung-uk Kim 296f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt1; 297f8146b88SJung-uk Kim break; 298f8146b88SJung-uk Kim 299f8146b88SJung-uk Kim case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: 300f8146b88SJung-uk Kim 301f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt2; 302f8146b88SJung-uk Kim break; 303f8146b88SJung-uk Kim 304f8146b88SJung-uk Kim case ACPI_MADT_TYPE_NMI_SOURCE: 305f8146b88SJung-uk Kim 306f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt3; 307f8146b88SJung-uk Kim break; 308f8146b88SJung-uk Kim 309f8146b88SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_APIC_NMI: 310f8146b88SJung-uk Kim 311f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt4; 312f8146b88SJung-uk Kim break; 313f8146b88SJung-uk Kim 314f8146b88SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: 315f8146b88SJung-uk Kim 316f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt5; 317f8146b88SJung-uk Kim break; 318f8146b88SJung-uk Kim 319f8146b88SJung-uk Kim case ACPI_MADT_TYPE_IO_SAPIC: 320f8146b88SJung-uk Kim 321f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt6; 322f8146b88SJung-uk Kim break; 323f8146b88SJung-uk Kim 324f8146b88SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_SAPIC: 325f8146b88SJung-uk Kim 326f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt7; 327f8146b88SJung-uk Kim break; 328f8146b88SJung-uk Kim 329f8146b88SJung-uk Kim case ACPI_MADT_TYPE_INTERRUPT_SOURCE: 330f8146b88SJung-uk Kim 331f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt8; 332f8146b88SJung-uk Kim break; 333f8146b88SJung-uk Kim 334f8146b88SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_X2APIC: 335f8146b88SJung-uk Kim 336f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt9; 337f8146b88SJung-uk Kim break; 338f8146b88SJung-uk Kim 339f8146b88SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: 340f8146b88SJung-uk Kim 341f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt10; 342f8146b88SJung-uk Kim break; 343f8146b88SJung-uk Kim 344f8146b88SJung-uk Kim case ACPI_MADT_TYPE_GENERIC_INTERRUPT: 345f8146b88SJung-uk Kim 346f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt11; 347f8146b88SJung-uk Kim break; 348f8146b88SJung-uk Kim 349f8146b88SJung-uk Kim case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR: 350f8146b88SJung-uk Kim 351f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt12; 352f8146b88SJung-uk Kim break; 353f8146b88SJung-uk Kim 354f8146b88SJung-uk Kim case ACPI_MADT_TYPE_GENERIC_MSI_FRAME: 355f8146b88SJung-uk Kim 356f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt13; 357f8146b88SJung-uk Kim break; 358f8146b88SJung-uk Kim 359f8146b88SJung-uk Kim case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR: 360f8146b88SJung-uk Kim 361f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt14; 362f8146b88SJung-uk Kim break; 363f8146b88SJung-uk Kim 364f8146b88SJung-uk Kim case ACPI_MADT_TYPE_GENERIC_TRANSLATOR: 365f8146b88SJung-uk Kim 366f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoMadt15; 367f8146b88SJung-uk Kim break; 368f8146b88SJung-uk Kim 369cfd1ed46SJung-uk Kim case ACPI_MADT_TYPE_MULTIPROC_WAKEUP: 370cfd1ed46SJung-uk Kim 371cfd1ed46SJung-uk Kim InfoTable = AcpiDmTableInfoMadt16; 372cfd1ed46SJung-uk Kim break; 373cfd1ed46SJung-uk Kim 374f8146b88SJung-uk Kim default: 375f8146b88SJung-uk Kim 376f8146b88SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT"); 377f8146b88SJung-uk Kim return (AE_ERROR); 378f8146b88SJung-uk Kim } 379f8146b88SJung-uk Kim 380ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 381f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 382f8146b88SJung-uk Kim { 383f8146b88SJung-uk Kim return (Status); 384f8146b88SJung-uk Kim } 385f8146b88SJung-uk Kim 386f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 387f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 388f8146b88SJung-uk Kim DtPopSubtable (); 389f8146b88SJung-uk Kim } 390f8146b88SJung-uk Kim 391f8146b88SJung-uk Kim return (AE_OK); 392f8146b88SJung-uk Kim } 393f8146b88SJung-uk Kim 394f8146b88SJung-uk Kim 395f8146b88SJung-uk Kim /****************************************************************************** 396f8146b88SJung-uk Kim * 397f8146b88SJung-uk Kim * FUNCTION: DtCompileMcfg 398f8146b88SJung-uk Kim * 399f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 400f8146b88SJung-uk Kim * 401f8146b88SJung-uk Kim * RETURN: Status 402f8146b88SJung-uk Kim * 403f8146b88SJung-uk Kim * DESCRIPTION: Compile MCFG. 404f8146b88SJung-uk Kim * 405f8146b88SJung-uk Kim *****************************************************************************/ 406f8146b88SJung-uk Kim 407f8146b88SJung-uk Kim ACPI_STATUS 408f8146b88SJung-uk Kim DtCompileMcfg ( 409f8146b88SJung-uk Kim void **List) 410f8146b88SJung-uk Kim { 411f8146b88SJung-uk Kim ACPI_STATUS Status; 412f8146b88SJung-uk Kim 413f8146b88SJung-uk Kim 414f8146b88SJung-uk Kim Status = DtCompileTwoSubtables (List, 415f8146b88SJung-uk Kim AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0); 416f8146b88SJung-uk Kim return (Status); 417f8146b88SJung-uk Kim } 418f8146b88SJung-uk Kim 419f8146b88SJung-uk Kim 420f8146b88SJung-uk Kim /****************************************************************************** 421f8146b88SJung-uk Kim * 422f8146b88SJung-uk Kim * FUNCTION: DtCompileMpst 423f8146b88SJung-uk Kim * 424f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 425f8146b88SJung-uk Kim * 426f8146b88SJung-uk Kim * RETURN: Status 427f8146b88SJung-uk Kim * 428f8146b88SJung-uk Kim * DESCRIPTION: Compile MPST. 429f8146b88SJung-uk Kim * 430f8146b88SJung-uk Kim *****************************************************************************/ 431f8146b88SJung-uk Kim 432f8146b88SJung-uk Kim ACPI_STATUS 433f8146b88SJung-uk Kim DtCompileMpst ( 434f8146b88SJung-uk Kim void **List) 435f8146b88SJung-uk Kim { 436f8146b88SJung-uk Kim ACPI_STATUS Status; 437f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 438f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 439f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 440f8146b88SJung-uk Kim ACPI_MPST_CHANNEL *MpstChannelInfo; 441f8146b88SJung-uk Kim ACPI_MPST_POWER_NODE *MpstPowerNode; 442f8146b88SJung-uk Kim ACPI_MPST_DATA_HDR *MpstDataHeader; 443f8146b88SJung-uk Kim UINT16 SubtableCount; 444f8146b88SJung-uk Kim UINT32 PowerStateCount; 445f8146b88SJung-uk Kim UINT32 ComponentCount; 446f8146b88SJung-uk Kim 447f8146b88SJung-uk Kim 448f8146b88SJung-uk Kim /* Main table */ 449f8146b88SJung-uk Kim 450ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable); 451f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 452f8146b88SJung-uk Kim { 453f8146b88SJung-uk Kim return (Status); 454f8146b88SJung-uk Kim } 455f8146b88SJung-uk Kim 456f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 457f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 458f8146b88SJung-uk Kim DtPushSubtable (Subtable); 459f8146b88SJung-uk Kim 460f8146b88SJung-uk Kim MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer); 461f8146b88SJung-uk Kim SubtableCount = MpstChannelInfo->PowerNodeCount; 462f8146b88SJung-uk Kim 463f8146b88SJung-uk Kim while (*PFieldList && SubtableCount) 464f8146b88SJung-uk Kim { 465f8146b88SJung-uk Kim /* Subtable: Memory Power Node(s) */ 466f8146b88SJung-uk Kim 467f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0, 468ff879b07SJung-uk Kim &Subtable); 469f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 470f8146b88SJung-uk Kim { 471f8146b88SJung-uk Kim return (Status); 472f8146b88SJung-uk Kim } 473f8146b88SJung-uk Kim 474f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 475f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 476f8146b88SJung-uk Kim DtPushSubtable (Subtable); 477f8146b88SJung-uk Kim 478f8146b88SJung-uk Kim MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer); 479f8146b88SJung-uk Kim PowerStateCount = MpstPowerNode->NumPowerStates; 480f8146b88SJung-uk Kim ComponentCount = MpstPowerNode->NumPhysicalComponents; 481f8146b88SJung-uk Kim 482f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 483f8146b88SJung-uk Kim 484f8146b88SJung-uk Kim /* Sub-subtables - Memory Power State Structure(s) */ 485f8146b88SJung-uk Kim 486f8146b88SJung-uk Kim while (*PFieldList && PowerStateCount) 487f8146b88SJung-uk Kim { 488f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A, 489ff879b07SJung-uk Kim &Subtable); 490f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 491f8146b88SJung-uk Kim { 492f8146b88SJung-uk Kim return (Status); 493f8146b88SJung-uk Kim } 494f8146b88SJung-uk Kim 495f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 496f8146b88SJung-uk Kim PowerStateCount--; 497f8146b88SJung-uk Kim } 498f8146b88SJung-uk Kim 499f8146b88SJung-uk Kim /* Sub-subtables - Physical Component ID Structure(s) */ 500f8146b88SJung-uk Kim 501f8146b88SJung-uk Kim while (*PFieldList && ComponentCount) 502f8146b88SJung-uk Kim { 503f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B, 504ff879b07SJung-uk Kim &Subtable); 505f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 506f8146b88SJung-uk Kim { 507f8146b88SJung-uk Kim return (Status); 508f8146b88SJung-uk Kim } 509f8146b88SJung-uk Kim 510f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 511f8146b88SJung-uk Kim ComponentCount--; 512f8146b88SJung-uk Kim } 513f8146b88SJung-uk Kim 514f8146b88SJung-uk Kim SubtableCount--; 515f8146b88SJung-uk Kim DtPopSubtable (); 516f8146b88SJung-uk Kim } 517f8146b88SJung-uk Kim 518f8146b88SJung-uk Kim /* Subtable: Count of Memory Power State Characteristic structures */ 519f8146b88SJung-uk Kim 520f8146b88SJung-uk Kim DtPopSubtable (); 521f8146b88SJung-uk Kim 522ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable); 523f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 524f8146b88SJung-uk Kim { 525f8146b88SJung-uk Kim return (Status); 526f8146b88SJung-uk Kim } 527f8146b88SJung-uk Kim 528f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 529f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 530f8146b88SJung-uk Kim DtPushSubtable (Subtable); 531f8146b88SJung-uk Kim 532f8146b88SJung-uk Kim MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer); 533f8146b88SJung-uk Kim SubtableCount = MpstDataHeader->CharacteristicsCount; 534f8146b88SJung-uk Kim 535f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 536f8146b88SJung-uk Kim 537f8146b88SJung-uk Kim /* Subtable: Memory Power State Characteristics structure(s) */ 538f8146b88SJung-uk Kim 539f8146b88SJung-uk Kim while (*PFieldList && SubtableCount) 540f8146b88SJung-uk Kim { 541f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2, 542ff879b07SJung-uk Kim &Subtable); 543f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 544f8146b88SJung-uk Kim { 545f8146b88SJung-uk Kim return (Status); 546f8146b88SJung-uk Kim } 547f8146b88SJung-uk Kim 548f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 549f8146b88SJung-uk Kim SubtableCount--; 550f8146b88SJung-uk Kim } 551f8146b88SJung-uk Kim 552f8146b88SJung-uk Kim DtPopSubtable (); 553f8146b88SJung-uk Kim return (AE_OK); 554f8146b88SJung-uk Kim } 555f8146b88SJung-uk Kim 556f8146b88SJung-uk Kim 557f8146b88SJung-uk Kim /****************************************************************************** 558f8146b88SJung-uk Kim * 559f8146b88SJung-uk Kim * FUNCTION: DtCompileMsct 560f8146b88SJung-uk Kim * 561f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 562f8146b88SJung-uk Kim * 563f8146b88SJung-uk Kim * RETURN: Status 564f8146b88SJung-uk Kim * 565f8146b88SJung-uk Kim * DESCRIPTION: Compile MSCT. 566f8146b88SJung-uk Kim * 567f8146b88SJung-uk Kim *****************************************************************************/ 568f8146b88SJung-uk Kim 569f8146b88SJung-uk Kim ACPI_STATUS 570f8146b88SJung-uk Kim DtCompileMsct ( 571f8146b88SJung-uk Kim void **List) 572f8146b88SJung-uk Kim { 573f8146b88SJung-uk Kim ACPI_STATUS Status; 574f8146b88SJung-uk Kim 575f8146b88SJung-uk Kim 576f8146b88SJung-uk Kim Status = DtCompileTwoSubtables (List, 577f8146b88SJung-uk Kim AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0); 578f8146b88SJung-uk Kim return (Status); 579f8146b88SJung-uk Kim } 580f8146b88SJung-uk Kim 581f8146b88SJung-uk Kim 582f8146b88SJung-uk Kim /****************************************************************************** 583f8146b88SJung-uk Kim * 584f8146b88SJung-uk Kim * FUNCTION: DtCompileNfit 585f8146b88SJung-uk Kim * 586f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 587f8146b88SJung-uk Kim * 588f8146b88SJung-uk Kim * RETURN: Status 589f8146b88SJung-uk Kim * 590f8146b88SJung-uk Kim * DESCRIPTION: Compile NFIT. 591f8146b88SJung-uk Kim * 592f8146b88SJung-uk Kim *****************************************************************************/ 593f8146b88SJung-uk Kim 594f8146b88SJung-uk Kim ACPI_STATUS 595f8146b88SJung-uk Kim DtCompileNfit ( 596f8146b88SJung-uk Kim void **List) 597f8146b88SJung-uk Kim { 598f8146b88SJung-uk Kim ACPI_STATUS Status; 599f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 600f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 601f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 602f8146b88SJung-uk Kim DT_FIELD *SubtableStart; 603f8146b88SJung-uk Kim ACPI_NFIT_HEADER *NfitHeader; 604f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 605f8146b88SJung-uk Kim UINT32 Count; 606f8146b88SJung-uk Kim ACPI_NFIT_INTERLEAVE *Interleave = NULL; 607f8146b88SJung-uk Kim ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL; 608f8146b88SJung-uk Kim 609f8146b88SJung-uk Kim 610f8146b88SJung-uk Kim /* Main table */ 611f8146b88SJung-uk Kim 612f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit, 613ff879b07SJung-uk Kim &Subtable); 614f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 615f8146b88SJung-uk Kim { 616f8146b88SJung-uk Kim return (Status); 617f8146b88SJung-uk Kim } 618f8146b88SJung-uk Kim 619f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 620f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 621f8146b88SJung-uk Kim DtPushSubtable (Subtable); 622f8146b88SJung-uk Kim 623f8146b88SJung-uk Kim /* Subtables */ 624f8146b88SJung-uk Kim 625f8146b88SJung-uk Kim while (*PFieldList) 626f8146b88SJung-uk Kim { 627f8146b88SJung-uk Kim SubtableStart = *PFieldList; 628f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr, 629ff879b07SJung-uk Kim &Subtable); 630f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 631f8146b88SJung-uk Kim { 632f8146b88SJung-uk Kim return (Status); 633f8146b88SJung-uk Kim } 634f8146b88SJung-uk Kim 635f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 636f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 637f8146b88SJung-uk Kim DtPushSubtable (Subtable); 638f8146b88SJung-uk Kim 639f8146b88SJung-uk Kim NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer); 640f8146b88SJung-uk Kim 641f8146b88SJung-uk Kim switch (NfitHeader->Type) 642f8146b88SJung-uk Kim { 643f8146b88SJung-uk Kim case ACPI_NFIT_TYPE_SYSTEM_ADDRESS: 644f8146b88SJung-uk Kim 645f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoNfit0; 646f8146b88SJung-uk Kim break; 647f8146b88SJung-uk Kim 648f8146b88SJung-uk Kim case ACPI_NFIT_TYPE_MEMORY_MAP: 649f8146b88SJung-uk Kim 650f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoNfit1; 651f8146b88SJung-uk Kim break; 652f8146b88SJung-uk Kim 653f8146b88SJung-uk Kim case ACPI_NFIT_TYPE_INTERLEAVE: 654f8146b88SJung-uk Kim 655f8146b88SJung-uk Kim Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer); 656f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoNfit2; 657f8146b88SJung-uk Kim break; 658f8146b88SJung-uk Kim 659f8146b88SJung-uk Kim case ACPI_NFIT_TYPE_SMBIOS: 660f8146b88SJung-uk Kim 661f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoNfit3; 662f8146b88SJung-uk Kim break; 663f8146b88SJung-uk Kim 664f8146b88SJung-uk Kim case ACPI_NFIT_TYPE_CONTROL_REGION: 665f8146b88SJung-uk Kim 666f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoNfit4; 667f8146b88SJung-uk Kim break; 668f8146b88SJung-uk Kim 669f8146b88SJung-uk Kim case ACPI_NFIT_TYPE_DATA_REGION: 670f8146b88SJung-uk Kim 671f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoNfit5; 672f8146b88SJung-uk Kim break; 673f8146b88SJung-uk Kim 674f8146b88SJung-uk Kim case ACPI_NFIT_TYPE_FLUSH_ADDRESS: 675f8146b88SJung-uk Kim 676f8146b88SJung-uk Kim Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer); 677f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoNfit6; 678f8146b88SJung-uk Kim break; 679f8146b88SJung-uk Kim 680b7b7e711SJung-uk Kim case ACPI_NFIT_TYPE_CAPABILITIES: 681b7b7e711SJung-uk Kim 682b7b7e711SJung-uk Kim InfoTable = AcpiDmTableInfoNfit7; 683b7b7e711SJung-uk Kim break; 684b7b7e711SJung-uk Kim 685f8146b88SJung-uk Kim default: 686f8146b88SJung-uk Kim 687f8146b88SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT"); 688f8146b88SJung-uk Kim return (AE_ERROR); 689f8146b88SJung-uk Kim } 690f8146b88SJung-uk Kim 691ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 692f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 693f8146b88SJung-uk Kim { 694f8146b88SJung-uk Kim return (Status); 695f8146b88SJung-uk Kim } 696f8146b88SJung-uk Kim 697f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 698f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 699f8146b88SJung-uk Kim DtPopSubtable (); 700f8146b88SJung-uk Kim 701f8146b88SJung-uk Kim switch (NfitHeader->Type) 702f8146b88SJung-uk Kim { 703f8146b88SJung-uk Kim case ACPI_NFIT_TYPE_INTERLEAVE: 704f8146b88SJung-uk Kim 705f8146b88SJung-uk Kim Count = 0; 706f8146b88SJung-uk Kim DtPushSubtable (Subtable); 707f8146b88SJung-uk Kim while (*PFieldList) 708f8146b88SJung-uk Kim { 709f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a, 710ff879b07SJung-uk Kim &Subtable); 711f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 712f8146b88SJung-uk Kim { 713f8146b88SJung-uk Kim return (Status); 714f8146b88SJung-uk Kim } 715f8146b88SJung-uk Kim 716f8146b88SJung-uk Kim if (!Subtable) 717f8146b88SJung-uk Kim { 718f8146b88SJung-uk Kim DtPopSubtable (); 719f8146b88SJung-uk Kim break; 720f8146b88SJung-uk Kim } 721f8146b88SJung-uk Kim 722f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 723f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 724f8146b88SJung-uk Kim Count++; 725f8146b88SJung-uk Kim } 726f8146b88SJung-uk Kim 727f8146b88SJung-uk Kim Interleave->LineCount = Count; 728f8146b88SJung-uk Kim break; 729f8146b88SJung-uk Kim 730f8146b88SJung-uk Kim case ACPI_NFIT_TYPE_SMBIOS: 731f8146b88SJung-uk Kim 732f8146b88SJung-uk Kim if (*PFieldList) 733f8146b88SJung-uk Kim { 734f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a, 735ff879b07SJung-uk Kim &Subtable); 736f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 737f8146b88SJung-uk Kim { 738f8146b88SJung-uk Kim return (Status); 739f8146b88SJung-uk Kim } 740f8146b88SJung-uk Kim 741f8146b88SJung-uk Kim if (Subtable) 742f8146b88SJung-uk Kim { 743f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 744f8146b88SJung-uk Kim } 745f8146b88SJung-uk Kim } 746f8146b88SJung-uk Kim break; 747f8146b88SJung-uk Kim 748f8146b88SJung-uk Kim case ACPI_NFIT_TYPE_FLUSH_ADDRESS: 749f8146b88SJung-uk Kim 750f8146b88SJung-uk Kim Count = 0; 751f8146b88SJung-uk Kim DtPushSubtable (Subtable); 752f8146b88SJung-uk Kim while (*PFieldList) 753f8146b88SJung-uk Kim { 754f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a, 755ff879b07SJung-uk Kim &Subtable); 756f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 757f8146b88SJung-uk Kim { 758f8146b88SJung-uk Kim return (Status); 759f8146b88SJung-uk Kim } 760f8146b88SJung-uk Kim 761f8146b88SJung-uk Kim if (!Subtable) 762f8146b88SJung-uk Kim { 763f8146b88SJung-uk Kim DtPopSubtable (); 764f8146b88SJung-uk Kim break; 765f8146b88SJung-uk Kim } 766f8146b88SJung-uk Kim 767f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 768f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 769f8146b88SJung-uk Kim Count++; 770f8146b88SJung-uk Kim } 771f8146b88SJung-uk Kim 772f8146b88SJung-uk Kim Hint->HintCount = (UINT16) Count; 773f8146b88SJung-uk Kim break; 774f8146b88SJung-uk Kim 775f8146b88SJung-uk Kim default: 776f8146b88SJung-uk Kim break; 777f8146b88SJung-uk Kim } 778f8146b88SJung-uk Kim } 779f8146b88SJung-uk Kim 780f8146b88SJung-uk Kim return (AE_OK); 781f8146b88SJung-uk Kim } 782f8146b88SJung-uk Kim 783f8146b88SJung-uk Kim 784f8146b88SJung-uk Kim /****************************************************************************** 785f8146b88SJung-uk Kim * 786f8146b88SJung-uk Kim * FUNCTION: DtCompilePcct 787f8146b88SJung-uk Kim * 788f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 789f8146b88SJung-uk Kim * 790f8146b88SJung-uk Kim * RETURN: Status 791f8146b88SJung-uk Kim * 792f8146b88SJung-uk Kim * DESCRIPTION: Compile PCCT. 793f8146b88SJung-uk Kim * 794f8146b88SJung-uk Kim *****************************************************************************/ 795f8146b88SJung-uk Kim 796f8146b88SJung-uk Kim ACPI_STATUS 797f8146b88SJung-uk Kim DtCompilePcct ( 798f8146b88SJung-uk Kim void **List) 799f8146b88SJung-uk Kim { 800f8146b88SJung-uk Kim ACPI_STATUS Status; 801f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 802f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 803f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 804f8146b88SJung-uk Kim DT_FIELD *SubtableStart; 805f8146b88SJung-uk Kim ACPI_SUBTABLE_HEADER *PcctHeader; 806f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 807f8146b88SJung-uk Kim 808f8146b88SJung-uk Kim 809f8146b88SJung-uk Kim /* Main table */ 810f8146b88SJung-uk Kim 811f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct, 812ff879b07SJung-uk Kim &Subtable); 813f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 814f8146b88SJung-uk Kim { 815f8146b88SJung-uk Kim return (Status); 816f8146b88SJung-uk Kim } 817f8146b88SJung-uk Kim 818f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 819f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 820f8146b88SJung-uk Kim 821f8146b88SJung-uk Kim /* Subtables */ 822f8146b88SJung-uk Kim 823f8146b88SJung-uk Kim while (*PFieldList) 824f8146b88SJung-uk Kim { 825f8146b88SJung-uk Kim SubtableStart = *PFieldList; 826f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr, 827ff879b07SJung-uk Kim &Subtable); 828f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 829f8146b88SJung-uk Kim { 830f8146b88SJung-uk Kim return (Status); 831f8146b88SJung-uk Kim } 832f8146b88SJung-uk Kim 833f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 834f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 835f8146b88SJung-uk Kim DtPushSubtable (Subtable); 836f8146b88SJung-uk Kim 837f8146b88SJung-uk Kim PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 838f8146b88SJung-uk Kim 839f8146b88SJung-uk Kim switch (PcctHeader->Type) 840f8146b88SJung-uk Kim { 841f8146b88SJung-uk Kim case ACPI_PCCT_TYPE_GENERIC_SUBSPACE: 842f8146b88SJung-uk Kim 843f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoPcct0; 844f8146b88SJung-uk Kim break; 845f8146b88SJung-uk Kim 846f8146b88SJung-uk Kim case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE: 847f8146b88SJung-uk Kim 848f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoPcct1; 849f8146b88SJung-uk Kim break; 850f8146b88SJung-uk Kim 851f8146b88SJung-uk Kim case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2: 852f8146b88SJung-uk Kim 853f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoPcct2; 854f8146b88SJung-uk Kim break; 855f8146b88SJung-uk Kim 856af051161SJung-uk Kim case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE: 857af051161SJung-uk Kim 858af051161SJung-uk Kim InfoTable = AcpiDmTableInfoPcct3; 859af051161SJung-uk Kim break; 860af051161SJung-uk Kim 861af051161SJung-uk Kim case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE: 862af051161SJung-uk Kim 863af051161SJung-uk Kim InfoTable = AcpiDmTableInfoPcct4; 864af051161SJung-uk Kim break; 865af051161SJung-uk Kim 866cfd1ed46SJung-uk Kim case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE: 867cfd1ed46SJung-uk Kim 868cfd1ed46SJung-uk Kim InfoTable = AcpiDmTableInfoPcct5; 869cfd1ed46SJung-uk Kim break; 870cfd1ed46SJung-uk Kim 871f8146b88SJung-uk Kim default: 872f8146b88SJung-uk Kim 873f8146b88SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT"); 874f8146b88SJung-uk Kim return (AE_ERROR); 875f8146b88SJung-uk Kim } 876f8146b88SJung-uk Kim 877ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 878f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 879f8146b88SJung-uk Kim { 880f8146b88SJung-uk Kim return (Status); 881f8146b88SJung-uk Kim } 882f8146b88SJung-uk Kim 883f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 884f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 885f8146b88SJung-uk Kim DtPopSubtable (); 886f8146b88SJung-uk Kim } 887f8146b88SJung-uk Kim 888f8146b88SJung-uk Kim return (AE_OK); 889f8146b88SJung-uk Kim } 890f8146b88SJung-uk Kim 891f8146b88SJung-uk Kim 892f8146b88SJung-uk Kim /****************************************************************************** 893f8146b88SJung-uk Kim * 89467d9aa44SJung-uk Kim * FUNCTION: DtCompilePdtt 89567d9aa44SJung-uk Kim * 89667d9aa44SJung-uk Kim * PARAMETERS: List - Current field list pointer 89767d9aa44SJung-uk Kim * 89867d9aa44SJung-uk Kim * RETURN: Status 89967d9aa44SJung-uk Kim * 90067d9aa44SJung-uk Kim * DESCRIPTION: Compile PDTT. 90167d9aa44SJung-uk Kim * 90267d9aa44SJung-uk Kim *****************************************************************************/ 90367d9aa44SJung-uk Kim 90467d9aa44SJung-uk Kim ACPI_STATUS 90567d9aa44SJung-uk Kim DtCompilePdtt ( 90667d9aa44SJung-uk Kim void **List) 90767d9aa44SJung-uk Kim { 90867d9aa44SJung-uk Kim ACPI_STATUS Status; 90967d9aa44SJung-uk Kim DT_SUBTABLE *Subtable; 91067d9aa44SJung-uk Kim DT_SUBTABLE *ParentTable; 91167d9aa44SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 91267d9aa44SJung-uk Kim ACPI_TABLE_PDTT *PdttHeader; 91367d9aa44SJung-uk Kim UINT32 Count = 0; 91467d9aa44SJung-uk Kim 91567d9aa44SJung-uk Kim 91667d9aa44SJung-uk Kim /* Main table */ 91767d9aa44SJung-uk Kim 918ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt, &Subtable); 91967d9aa44SJung-uk Kim if (ACPI_FAILURE (Status)) 92067d9aa44SJung-uk Kim { 92167d9aa44SJung-uk Kim return (Status); 92267d9aa44SJung-uk Kim } 92367d9aa44SJung-uk Kim 92467d9aa44SJung-uk Kim ParentTable = DtPeekSubtable (); 92567d9aa44SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 92667d9aa44SJung-uk Kim 92767d9aa44SJung-uk Kim PdttHeader = ACPI_CAST_PTR (ACPI_TABLE_PDTT, ParentTable->Buffer); 92867d9aa44SJung-uk Kim PdttHeader->ArrayOffset = sizeof (ACPI_TABLE_PDTT); 92967d9aa44SJung-uk Kim 93067d9aa44SJung-uk Kim /* There is only one type of subtable at this time, no need to decode */ 93167d9aa44SJung-uk Kim 93267d9aa44SJung-uk Kim while (*PFieldList) 93367d9aa44SJung-uk Kim { 93467d9aa44SJung-uk Kim /* List of subchannel IDs, each 2 bytes */ 93567d9aa44SJung-uk Kim 93667d9aa44SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt0, 937ff879b07SJung-uk Kim &Subtable); 93867d9aa44SJung-uk Kim if (ACPI_FAILURE (Status)) 93967d9aa44SJung-uk Kim { 94067d9aa44SJung-uk Kim return (Status); 94167d9aa44SJung-uk Kim } 94267d9aa44SJung-uk Kim 94367d9aa44SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 94467d9aa44SJung-uk Kim Count++; 94567d9aa44SJung-uk Kim } 94667d9aa44SJung-uk Kim 94767d9aa44SJung-uk Kim PdttHeader->TriggerCount = (UINT8) Count; 94867d9aa44SJung-uk Kim return (AE_OK); 94967d9aa44SJung-uk Kim } 95067d9aa44SJung-uk Kim 95167d9aa44SJung-uk Kim 95267d9aa44SJung-uk Kim /****************************************************************************** 95367d9aa44SJung-uk Kim * 954cfd1ed46SJung-uk Kim * FUNCTION: DtCompilePhat 955cfd1ed46SJung-uk Kim * 956cfd1ed46SJung-uk Kim * PARAMETERS: List - Current field list pointer 957cfd1ed46SJung-uk Kim * 958cfd1ed46SJung-uk Kim * RETURN: Status 959cfd1ed46SJung-uk Kim * 960cfd1ed46SJung-uk Kim * DESCRIPTION: Compile Phat. 961cfd1ed46SJung-uk Kim * 962cfd1ed46SJung-uk Kim *****************************************************************************/ 963cfd1ed46SJung-uk Kim 964cfd1ed46SJung-uk Kim ACPI_STATUS 965cfd1ed46SJung-uk Kim DtCompilePhat ( 966cfd1ed46SJung-uk Kim void **List) 967cfd1ed46SJung-uk Kim { 968cfd1ed46SJung-uk Kim ACPI_STATUS Status = AE_OK; 969cfd1ed46SJung-uk Kim DT_SUBTABLE *Subtable; 970cfd1ed46SJung-uk Kim DT_SUBTABLE *ParentTable; 971cfd1ed46SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 972cfd1ed46SJung-uk Kim ACPI_PHAT_HEADER *PhatHeader; 973cfd1ed46SJung-uk Kim ACPI_DMTABLE_INFO *Info; 974cfd1ed46SJung-uk Kim ACPI_PHAT_VERSION_DATA *VersionData; 975cfd1ed46SJung-uk Kim UINT32 RecordCount; 976cfd1ed46SJung-uk Kim 977cfd1ed46SJung-uk Kim 978cfd1ed46SJung-uk Kim /* The table consist of subtables */ 979cfd1ed46SJung-uk Kim 980cfd1ed46SJung-uk Kim while (*PFieldList) 981cfd1ed46SJung-uk Kim { 982cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable); 983cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 984cfd1ed46SJung-uk Kim { 985cfd1ed46SJung-uk Kim return (Status); 986cfd1ed46SJung-uk Kim } 987cfd1ed46SJung-uk Kim 988cfd1ed46SJung-uk Kim ParentTable = DtPeekSubtable (); 989cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 990cfd1ed46SJung-uk Kim DtPushSubtable (Subtable); 991cfd1ed46SJung-uk Kim 992cfd1ed46SJung-uk Kim PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer); 993cfd1ed46SJung-uk Kim 994cfd1ed46SJung-uk Kim switch (PhatHeader->Type) 995cfd1ed46SJung-uk Kim { 996cfd1ed46SJung-uk Kim case ACPI_PHAT_TYPE_FW_VERSION_DATA: 997cfd1ed46SJung-uk Kim 998cfd1ed46SJung-uk Kim Info = AcpiDmTableInfoPhat0; 999cfd1ed46SJung-uk Kim PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA); 1000cfd1ed46SJung-uk Kim break; 1001cfd1ed46SJung-uk Kim 1002cfd1ed46SJung-uk Kim case ACPI_PHAT_TYPE_FW_HEALTH_DATA: 1003cfd1ed46SJung-uk Kim 1004cfd1ed46SJung-uk Kim Info = AcpiDmTableInfoPhat1; 1005cfd1ed46SJung-uk Kim PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA); 1006cfd1ed46SJung-uk Kim break; 1007cfd1ed46SJung-uk Kim 1008cfd1ed46SJung-uk Kim default: 1009cfd1ed46SJung-uk Kim 1010cfd1ed46SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT"); 1011cfd1ed46SJung-uk Kim return (AE_ERROR); 1012cfd1ed46SJung-uk Kim 1013cfd1ed46SJung-uk Kim break; 1014cfd1ed46SJung-uk Kim } 1015cfd1ed46SJung-uk Kim 1016cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, Info, &Subtable); 1017cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 1018cfd1ed46SJung-uk Kim { 1019cfd1ed46SJung-uk Kim return (Status); 1020cfd1ed46SJung-uk Kim } 1021cfd1ed46SJung-uk Kim 1022cfd1ed46SJung-uk Kim ParentTable = DtPeekSubtable (); 1023cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1024cfd1ed46SJung-uk Kim 1025cfd1ed46SJung-uk Kim switch (PhatHeader->Type) 1026cfd1ed46SJung-uk Kim { 1027cfd1ed46SJung-uk Kim case ACPI_PHAT_TYPE_FW_VERSION_DATA: 1028cfd1ed46SJung-uk Kim 1029cfd1ed46SJung-uk Kim VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, 1030cfd1ed46SJung-uk Kim (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER))); 1031cfd1ed46SJung-uk Kim RecordCount = VersionData->ElementCount; 1032cfd1ed46SJung-uk Kim 1033cfd1ed46SJung-uk Kim while (RecordCount) 1034cfd1ed46SJung-uk Kim { 1035cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a, 1036cfd1ed46SJung-uk Kim &Subtable); 1037cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 1038cfd1ed46SJung-uk Kim { 1039cfd1ed46SJung-uk Kim return (Status); 1040cfd1ed46SJung-uk Kim } 1041cfd1ed46SJung-uk Kim ParentTable = DtPeekSubtable (); 1042cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1043cfd1ed46SJung-uk Kim 1044cfd1ed46SJung-uk Kim RecordCount--; 1045cfd1ed46SJung-uk Kim PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT); 1046cfd1ed46SJung-uk Kim } 1047cfd1ed46SJung-uk Kim break; 1048cfd1ed46SJung-uk Kim 1049cfd1ed46SJung-uk Kim case ACPI_PHAT_TYPE_FW_HEALTH_DATA: 1050cfd1ed46SJung-uk Kim 1051cfd1ed46SJung-uk Kim /* Compile device path */ 1052cfd1ed46SJung-uk Kim 1053cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable); 1054cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 1055cfd1ed46SJung-uk Kim { 1056cfd1ed46SJung-uk Kim return (Status); 1057cfd1ed46SJung-uk Kim } 1058cfd1ed46SJung-uk Kim ParentTable = DtPeekSubtable (); 1059cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1060cfd1ed46SJung-uk Kim 1061cfd1ed46SJung-uk Kim PhatHeader->Length += (UINT16) Subtable->Length; 1062cfd1ed46SJung-uk Kim 1063cfd1ed46SJung-uk Kim /* Compile vendor specific data */ 1064cfd1ed46SJung-uk Kim 1065cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable); 1066cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 1067cfd1ed46SJung-uk Kim { 1068cfd1ed46SJung-uk Kim return (Status); 1069cfd1ed46SJung-uk Kim } 1070cfd1ed46SJung-uk Kim ParentTable = DtPeekSubtable (); 1071cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1072cfd1ed46SJung-uk Kim 1073cfd1ed46SJung-uk Kim PhatHeader->Length += (UINT16) Subtable->Length; 1074cfd1ed46SJung-uk Kim 1075cfd1ed46SJung-uk Kim break; 1076cfd1ed46SJung-uk Kim 1077cfd1ed46SJung-uk Kim default: 1078cfd1ed46SJung-uk Kim 1079cfd1ed46SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT"); 1080cfd1ed46SJung-uk Kim return (AE_ERROR); 1081cfd1ed46SJung-uk Kim } 1082cfd1ed46SJung-uk Kim } 1083cfd1ed46SJung-uk Kim 1084cfd1ed46SJung-uk Kim return (Status); 1085cfd1ed46SJung-uk Kim } 1086cfd1ed46SJung-uk Kim 1087cfd1ed46SJung-uk Kim 1088cfd1ed46SJung-uk Kim /****************************************************************************** 1089cfd1ed46SJung-uk Kim * 1090f8146b88SJung-uk Kim * FUNCTION: DtCompilePmtt 1091f8146b88SJung-uk Kim * 1092f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 1093f8146b88SJung-uk Kim * 1094f8146b88SJung-uk Kim * RETURN: Status 1095f8146b88SJung-uk Kim * 1096f8146b88SJung-uk Kim * DESCRIPTION: Compile PMTT. 1097f8146b88SJung-uk Kim * 1098f8146b88SJung-uk Kim *****************************************************************************/ 1099f8146b88SJung-uk Kim 1100f8146b88SJung-uk Kim ACPI_STATUS 1101f8146b88SJung-uk Kim DtCompilePmtt ( 1102f8146b88SJung-uk Kim void **List) 1103f8146b88SJung-uk Kim { 1104f8146b88SJung-uk Kim ACPI_STATUS Status; 1105f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 1106f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 1107f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1108f8146b88SJung-uk Kim DT_FIELD *SubtableStart; 1109cfd1ed46SJung-uk Kim UINT16 Type; 1110f8146b88SJung-uk Kim 1111f8146b88SJung-uk Kim 1112f8146b88SJung-uk Kim /* Main table */ 1113f8146b88SJung-uk Kim 1114ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable); 1115f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1116f8146b88SJung-uk Kim { 1117f8146b88SJung-uk Kim return (Status); 1118f8146b88SJung-uk Kim } 1119f8146b88SJung-uk Kim 1120f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1121f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1122f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1123f8146b88SJung-uk Kim 1124cfd1ed46SJung-uk Kim /* Subtables */ 1125cfd1ed46SJung-uk Kim 1126f8146b88SJung-uk Kim while (*PFieldList) 1127f8146b88SJung-uk Kim { 1128f8146b88SJung-uk Kim SubtableStart = *PFieldList; 1129cfd1ed46SJung-uk Kim DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0); 1130f8146b88SJung-uk Kim 1131cfd1ed46SJung-uk Kim switch (Type) 1132f8146b88SJung-uk Kim { 1133f8146b88SJung-uk Kim case ACPI_PMTT_TYPE_SOCKET: 1134f8146b88SJung-uk Kim 1135f8146b88SJung-uk Kim /* Subtable: Socket Structure */ 1136f8146b88SJung-uk Kim 1137cfd1ed46SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_SOCKET (0)\n"); 1138cfd1ed46SJung-uk Kim 1139f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0, 1140ff879b07SJung-uk Kim &Subtable); 1141f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1142f8146b88SJung-uk Kim { 1143f8146b88SJung-uk Kim return (Status); 1144f8146b88SJung-uk Kim } 1145f8146b88SJung-uk Kim 1146f8146b88SJung-uk Kim break; 1147f8146b88SJung-uk Kim 1148f8146b88SJung-uk Kim case ACPI_PMTT_TYPE_CONTROLLER: 1149f8146b88SJung-uk Kim 1150f8146b88SJung-uk Kim /* Subtable: Memory Controller Structure */ 1151f8146b88SJung-uk Kim 1152cfd1ed46SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_CONTROLLER (1)\n"); 1153cfd1ed46SJung-uk Kim 1154f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1, 1155ff879b07SJung-uk Kim &Subtable); 1156f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1157f8146b88SJung-uk Kim { 1158f8146b88SJung-uk Kim return (Status); 1159f8146b88SJung-uk Kim } 1160f8146b88SJung-uk Kim 1161f8146b88SJung-uk Kim break; 1162f8146b88SJung-uk Kim 1163f8146b88SJung-uk Kim case ACPI_PMTT_TYPE_DIMM: 1164f8146b88SJung-uk Kim 1165cfd1ed46SJung-uk Kim /* Subtable: Physical Component (DIMM) Structure */ 1166f8146b88SJung-uk Kim 1167cfd1ed46SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_DIMM (2)\n"); 1168f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2, 1169ff879b07SJung-uk Kim &Subtable); 1170f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1171f8146b88SJung-uk Kim { 1172f8146b88SJung-uk Kim return (Status); 1173f8146b88SJung-uk Kim } 1174f8146b88SJung-uk Kim 1175cfd1ed46SJung-uk Kim break; 1176cfd1ed46SJung-uk Kim 1177cfd1ed46SJung-uk Kim case ACPI_PMTT_TYPE_VENDOR: 1178cfd1ed46SJung-uk Kim 1179cfd1ed46SJung-uk Kim /* Subtable: Vendor-specific Structure */ 1180cfd1ed46SJung-uk Kim 1181cfd1ed46SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_VENDOR(FF)\n"); 1182cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttVendor, 1183cfd1ed46SJung-uk Kim &Subtable); 1184cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 1185cfd1ed46SJung-uk Kim { 1186cfd1ed46SJung-uk Kim return (Status); 1187cfd1ed46SJung-uk Kim } 1188cfd1ed46SJung-uk Kim 1189f8146b88SJung-uk Kim break; 1190f8146b88SJung-uk Kim 1191f8146b88SJung-uk Kim default: 1192f8146b88SJung-uk Kim 1193f8146b88SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT"); 1194f8146b88SJung-uk Kim return (AE_ERROR); 1195f8146b88SJung-uk Kim } 1196cfd1ed46SJung-uk Kim 1197cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1198f8146b88SJung-uk Kim } 1199f8146b88SJung-uk Kim 1200f8146b88SJung-uk Kim return (Status); 1201f8146b88SJung-uk Kim } 1202f8146b88SJung-uk Kim 1203f8146b88SJung-uk Kim 1204f8146b88SJung-uk Kim /****************************************************************************** 1205f8146b88SJung-uk Kim * 1206af051161SJung-uk Kim * FUNCTION: DtCompilePptt 1207af051161SJung-uk Kim * 1208af051161SJung-uk Kim * PARAMETERS: List - Current field list pointer 1209af051161SJung-uk Kim * 1210af051161SJung-uk Kim * RETURN: Status 1211af051161SJung-uk Kim * 1212af051161SJung-uk Kim * DESCRIPTION: Compile PPTT. 1213af051161SJung-uk Kim * 1214af051161SJung-uk Kim *****************************************************************************/ 1215af051161SJung-uk Kim 1216af051161SJung-uk Kim ACPI_STATUS 1217af051161SJung-uk Kim DtCompilePptt ( 1218af051161SJung-uk Kim void **List) 1219af051161SJung-uk Kim { 1220af051161SJung-uk Kim ACPI_STATUS Status; 1221af051161SJung-uk Kim ACPI_SUBTABLE_HEADER *PpttHeader; 1222af051161SJung-uk Kim ACPI_PPTT_PROCESSOR *PpttProcessor = NULL; 1223af051161SJung-uk Kim DT_SUBTABLE *Subtable; 1224af051161SJung-uk Kim DT_SUBTABLE *ParentTable; 1225af051161SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 1226af051161SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1227af051161SJung-uk Kim DT_FIELD *SubtableStart; 1228cfd1ed46SJung-uk Kim ACPI_TABLE_HEADER *PpttAcpiHeader; 1229af051161SJung-uk Kim 1230af051161SJung-uk Kim 1231af051161SJung-uk Kim ParentTable = DtPeekSubtable (); 1232af051161SJung-uk Kim while (*PFieldList) 1233af051161SJung-uk Kim { 1234af051161SJung-uk Kim SubtableStart = *PFieldList; 1235af051161SJung-uk Kim 1236af051161SJung-uk Kim /* Compile PPTT subtable header */ 1237af051161SJung-uk Kim 1238af051161SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPpttHdr, 1239ff879b07SJung-uk Kim &Subtable); 1240af051161SJung-uk Kim if (ACPI_FAILURE (Status)) 1241af051161SJung-uk Kim { 1242af051161SJung-uk Kim return (Status); 1243af051161SJung-uk Kim } 1244af051161SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1245af051161SJung-uk Kim PpttHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 1246af051161SJung-uk Kim PpttHeader->Length = (UINT8)(Subtable->Length); 1247af051161SJung-uk Kim 1248af051161SJung-uk Kim switch (PpttHeader->Type) 1249af051161SJung-uk Kim { 1250af051161SJung-uk Kim case ACPI_PPTT_TYPE_PROCESSOR: 1251af051161SJung-uk Kim 1252af051161SJung-uk Kim InfoTable = AcpiDmTableInfoPptt0; 1253af051161SJung-uk Kim break; 1254af051161SJung-uk Kim 1255af051161SJung-uk Kim case ACPI_PPTT_TYPE_CACHE: 1256af051161SJung-uk Kim 1257af051161SJung-uk Kim InfoTable = AcpiDmTableInfoPptt1; 1258af051161SJung-uk Kim break; 1259af051161SJung-uk Kim 1260af051161SJung-uk Kim case ACPI_PPTT_TYPE_ID: 1261af051161SJung-uk Kim 1262af051161SJung-uk Kim InfoTable = AcpiDmTableInfoPptt2; 1263af051161SJung-uk Kim break; 1264af051161SJung-uk Kim 1265af051161SJung-uk Kim default: 1266af051161SJung-uk Kim 1267af051161SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PPTT"); 1268af051161SJung-uk Kim return (AE_ERROR); 1269af051161SJung-uk Kim } 1270af051161SJung-uk Kim 1271af051161SJung-uk Kim /* Compile PPTT subtable body */ 1272af051161SJung-uk Kim 1273ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 1274af051161SJung-uk Kim if (ACPI_FAILURE (Status)) 1275af051161SJung-uk Kim { 1276af051161SJung-uk Kim return (Status); 1277af051161SJung-uk Kim } 1278af051161SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1279af051161SJung-uk Kim PpttHeader->Length += (UINT8)(Subtable->Length); 1280af051161SJung-uk Kim 1281af051161SJung-uk Kim /* Compile PPTT subtable additionals */ 1282af051161SJung-uk Kim 1283af051161SJung-uk Kim switch (PpttHeader->Type) 1284af051161SJung-uk Kim { 1285af051161SJung-uk Kim case ACPI_PPTT_TYPE_PROCESSOR: 1286af051161SJung-uk Kim 1287af051161SJung-uk Kim PpttProcessor = ACPI_SUB_PTR (ACPI_PPTT_PROCESSOR, 1288af051161SJung-uk Kim Subtable->Buffer, sizeof (ACPI_SUBTABLE_HEADER)); 1289af051161SJung-uk Kim if (PpttProcessor) 1290af051161SJung-uk Kim { 1291af051161SJung-uk Kim /* Compile initiator proximity domain list */ 1292af051161SJung-uk Kim 1293af051161SJung-uk Kim PpttProcessor->NumberOfPrivResources = 0; 1294af051161SJung-uk Kim while (*PFieldList) 1295af051161SJung-uk Kim { 1296af051161SJung-uk Kim Status = DtCompileTable (PFieldList, 1297ff879b07SJung-uk Kim AcpiDmTableInfoPptt0a, &Subtable); 1298af051161SJung-uk Kim if (ACPI_FAILURE (Status)) 1299af051161SJung-uk Kim { 1300af051161SJung-uk Kim return (Status); 1301af051161SJung-uk Kim } 1302af051161SJung-uk Kim if (!Subtable) 1303af051161SJung-uk Kim { 1304af051161SJung-uk Kim break; 1305af051161SJung-uk Kim } 1306af051161SJung-uk Kim 1307af051161SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1308af051161SJung-uk Kim PpttHeader->Length += (UINT8)(Subtable->Length); 1309af051161SJung-uk Kim PpttProcessor->NumberOfPrivResources++; 1310af051161SJung-uk Kim } 1311af051161SJung-uk Kim } 1312af051161SJung-uk Kim break; 1313af051161SJung-uk Kim 1314cfd1ed46SJung-uk Kim case ACPI_PPTT_TYPE_CACHE: 1315cfd1ed46SJung-uk Kim 1316cfd1ed46SJung-uk Kim PpttAcpiHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER, 1317cfd1ed46SJung-uk Kim AslGbl_RootTable->Buffer); 1318cfd1ed46SJung-uk Kim if (PpttAcpiHeader->Revision < 3) 1319cfd1ed46SJung-uk Kim { 1320cfd1ed46SJung-uk Kim break; 1321cfd1ed46SJung-uk Kim } 1322cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPptt1a, 1323cfd1ed46SJung-uk Kim &Subtable); 1324cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1325cfd1ed46SJung-uk Kim PpttHeader->Length += (UINT8)(Subtable->Length); 1326cfd1ed46SJung-uk Kim break; 1327cfd1ed46SJung-uk Kim 1328af051161SJung-uk Kim default: 1329af051161SJung-uk Kim 1330af051161SJung-uk Kim break; 1331af051161SJung-uk Kim } 1332af051161SJung-uk Kim } 1333af051161SJung-uk Kim 1334af051161SJung-uk Kim return (AE_OK); 1335af051161SJung-uk Kim } 1336af051161SJung-uk Kim 1337af051161SJung-uk Kim 1338af051161SJung-uk Kim /****************************************************************************** 1339af051161SJung-uk Kim * 1340f8146b88SJung-uk Kim * FUNCTION: DtCompileRsdt 1341f8146b88SJung-uk Kim * 1342f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 1343f8146b88SJung-uk Kim * 1344f8146b88SJung-uk Kim * RETURN: Status 1345f8146b88SJung-uk Kim * 1346f8146b88SJung-uk Kim * DESCRIPTION: Compile RSDT. 1347f8146b88SJung-uk Kim * 1348f8146b88SJung-uk Kim *****************************************************************************/ 1349f8146b88SJung-uk Kim 1350f8146b88SJung-uk Kim ACPI_STATUS 1351f8146b88SJung-uk Kim DtCompileRsdt ( 1352f8146b88SJung-uk Kim void **List) 1353f8146b88SJung-uk Kim { 1354f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 1355f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 1356f8146b88SJung-uk Kim DT_FIELD *FieldList = *(DT_FIELD **) List; 1357f8146b88SJung-uk Kim UINT32 Address; 1358f8146b88SJung-uk Kim 1359f8146b88SJung-uk Kim 1360f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1361f8146b88SJung-uk Kim 1362f8146b88SJung-uk Kim while (FieldList) 1363f8146b88SJung-uk Kim { 1364f8146b88SJung-uk Kim DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO); 1365f8146b88SJung-uk Kim 1366f8146b88SJung-uk Kim DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable); 1367f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1368f8146b88SJung-uk Kim FieldList = FieldList->Next; 1369f8146b88SJung-uk Kim } 1370f8146b88SJung-uk Kim 1371f8146b88SJung-uk Kim return (AE_OK); 1372f8146b88SJung-uk Kim } 1373f8146b88SJung-uk Kim 1374f8146b88SJung-uk Kim 1375f8146b88SJung-uk Kim /****************************************************************************** 1376f8146b88SJung-uk Kim * 1377f8146b88SJung-uk Kim * FUNCTION: DtCompileS3pt 1378f8146b88SJung-uk Kim * 1379f8146b88SJung-uk Kim * PARAMETERS: PFieldList - Current field list pointer 1380f8146b88SJung-uk Kim * 1381f8146b88SJung-uk Kim * RETURN: Status 1382f8146b88SJung-uk Kim * 1383f8146b88SJung-uk Kim * DESCRIPTION: Compile S3PT (Pointed to by FPDT) 1384f8146b88SJung-uk Kim * 1385f8146b88SJung-uk Kim *****************************************************************************/ 1386f8146b88SJung-uk Kim 1387f8146b88SJung-uk Kim ACPI_STATUS 1388f8146b88SJung-uk Kim DtCompileS3pt ( 1389f8146b88SJung-uk Kim DT_FIELD **PFieldList) 1390f8146b88SJung-uk Kim { 1391f8146b88SJung-uk Kim ACPI_STATUS Status; 1392f8146b88SJung-uk Kim ACPI_FPDT_HEADER *S3ptHeader; 1393f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 1394f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 1395f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 1396f8146b88SJung-uk Kim DT_FIELD *SubtableStart; 1397f8146b88SJung-uk Kim 1398f8146b88SJung-uk Kim 1399f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt, 14006f1f1a63SJung-uk Kim &AslGbl_RootTable); 1401f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1402f8146b88SJung-uk Kim { 1403f8146b88SJung-uk Kim return (Status); 1404f8146b88SJung-uk Kim } 1405f8146b88SJung-uk Kim 14066f1f1a63SJung-uk Kim DtPushSubtable (AslGbl_RootTable); 1407f8146b88SJung-uk Kim 1408f8146b88SJung-uk Kim while (*PFieldList) 1409f8146b88SJung-uk Kim { 1410f8146b88SJung-uk Kim SubtableStart = *PFieldList; 1411f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr, 1412ff879b07SJung-uk Kim &Subtable); 1413f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1414f8146b88SJung-uk Kim { 1415f8146b88SJung-uk Kim return (Status); 1416f8146b88SJung-uk Kim } 1417f8146b88SJung-uk Kim 1418f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1419f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1420f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1421f8146b88SJung-uk Kim 1422f8146b88SJung-uk Kim S3ptHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer); 1423f8146b88SJung-uk Kim 1424f8146b88SJung-uk Kim switch (S3ptHeader->Type) 1425f8146b88SJung-uk Kim { 1426f8146b88SJung-uk Kim case ACPI_S3PT_TYPE_RESUME: 1427f8146b88SJung-uk Kim 1428f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoS3pt0; 1429f8146b88SJung-uk Kim break; 1430f8146b88SJung-uk Kim 1431f8146b88SJung-uk Kim case ACPI_S3PT_TYPE_SUSPEND: 1432f8146b88SJung-uk Kim 1433f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoS3pt1; 1434f8146b88SJung-uk Kim break; 1435f8146b88SJung-uk Kim 1436f8146b88SJung-uk Kim default: 1437f8146b88SJung-uk Kim 1438f8146b88SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT"); 1439f8146b88SJung-uk Kim return (AE_ERROR); 1440f8146b88SJung-uk Kim } 1441f8146b88SJung-uk Kim 1442ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 1443f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1444f8146b88SJung-uk Kim { 1445f8146b88SJung-uk Kim return (Status); 1446f8146b88SJung-uk Kim } 1447f8146b88SJung-uk Kim 1448f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1449f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1450f8146b88SJung-uk Kim DtPopSubtable (); 1451f8146b88SJung-uk Kim } 1452f8146b88SJung-uk Kim 1453f8146b88SJung-uk Kim return (AE_OK); 1454f8146b88SJung-uk Kim } 1455f8146b88SJung-uk Kim 1456f8146b88SJung-uk Kim 1457f8146b88SJung-uk Kim /****************************************************************************** 1458f8146b88SJung-uk Kim * 145967d9aa44SJung-uk Kim * FUNCTION: DtCompileSdev 146067d9aa44SJung-uk Kim * 146167d9aa44SJung-uk Kim * PARAMETERS: List - Current field list pointer 146267d9aa44SJung-uk Kim * 146367d9aa44SJung-uk Kim * RETURN: Status 146467d9aa44SJung-uk Kim * 146567d9aa44SJung-uk Kim * DESCRIPTION: Compile SDEV. 146667d9aa44SJung-uk Kim * 146767d9aa44SJung-uk Kim *****************************************************************************/ 146867d9aa44SJung-uk Kim 146967d9aa44SJung-uk Kim ACPI_STATUS 147067d9aa44SJung-uk Kim DtCompileSdev ( 147167d9aa44SJung-uk Kim void **List) 147267d9aa44SJung-uk Kim { 147367d9aa44SJung-uk Kim ACPI_STATUS Status; 147467d9aa44SJung-uk Kim ACPI_SDEV_HEADER *SdevHeader; 1475cfd1ed46SJung-uk Kim ACPI_SDEV_HEADER *SecureComponentHeader; 147667d9aa44SJung-uk Kim DT_SUBTABLE *Subtable; 147767d9aa44SJung-uk Kim DT_SUBTABLE *ParentTable; 147867d9aa44SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 1479cfd1ed46SJung-uk Kim ACPI_DMTABLE_INFO *SecureComponentInfoTable = NULL; 148067d9aa44SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 148167d9aa44SJung-uk Kim DT_FIELD *SubtableStart; 148267d9aa44SJung-uk Kim ACPI_SDEV_PCIE *Pcie = NULL; 148367d9aa44SJung-uk Kim ACPI_SDEV_NAMESPACE *Namesp = NULL; 148467d9aa44SJung-uk Kim UINT32 EntryCount; 1485cfd1ed46SJung-uk Kim ACPI_SDEV_SECURE_COMPONENT *SecureComponent = NULL; 1486cfd1ed46SJung-uk Kim UINT16 ComponentLength = 0; 148767d9aa44SJung-uk Kim 148867d9aa44SJung-uk Kim 148967d9aa44SJung-uk Kim /* Subtables */ 149067d9aa44SJung-uk Kim 149167d9aa44SJung-uk Kim while (*PFieldList) 149267d9aa44SJung-uk Kim { 149367d9aa44SJung-uk Kim /* Compile common SDEV subtable header */ 149467d9aa44SJung-uk Kim 149567d9aa44SJung-uk Kim SubtableStart = *PFieldList; 149667d9aa44SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevHdr, 1497ff879b07SJung-uk Kim &Subtable); 149867d9aa44SJung-uk Kim if (ACPI_FAILURE (Status)) 149967d9aa44SJung-uk Kim { 150067d9aa44SJung-uk Kim return (Status); 150167d9aa44SJung-uk Kim } 150267d9aa44SJung-uk Kim 150367d9aa44SJung-uk Kim ParentTable = DtPeekSubtable (); 150467d9aa44SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 150567d9aa44SJung-uk Kim DtPushSubtable (Subtable); 150667d9aa44SJung-uk Kim 150767d9aa44SJung-uk Kim SdevHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer); 150867d9aa44SJung-uk Kim SdevHeader->Length = (UINT8)(sizeof (ACPI_SDEV_HEADER)); 150967d9aa44SJung-uk Kim 151067d9aa44SJung-uk Kim switch (SdevHeader->Type) 151167d9aa44SJung-uk Kim { 151267d9aa44SJung-uk Kim case ACPI_SDEV_TYPE_NAMESPACE_DEVICE: 151367d9aa44SJung-uk Kim 151467d9aa44SJung-uk Kim InfoTable = AcpiDmTableInfoSdev0; 151567d9aa44SJung-uk Kim Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer); 1516cfd1ed46SJung-uk Kim SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT, 1517cfd1ed46SJung-uk Kim ACPI_ADD_PTR (UINT8, Subtable->Buffer, sizeof(ACPI_SDEV_NAMESPACE))); 151867d9aa44SJung-uk Kim break; 151967d9aa44SJung-uk Kim 152067d9aa44SJung-uk Kim case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE: 152167d9aa44SJung-uk Kim 152267d9aa44SJung-uk Kim InfoTable = AcpiDmTableInfoSdev1; 152367d9aa44SJung-uk Kim Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable->Buffer); 152467d9aa44SJung-uk Kim break; 152567d9aa44SJung-uk Kim 152667d9aa44SJung-uk Kim default: 152767d9aa44SJung-uk Kim 152867d9aa44SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV"); 152967d9aa44SJung-uk Kim return (AE_ERROR); 153067d9aa44SJung-uk Kim } 153167d9aa44SJung-uk Kim 153267d9aa44SJung-uk Kim /* Compile SDEV subtable body */ 153367d9aa44SJung-uk Kim 1534ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 153567d9aa44SJung-uk Kim if (ACPI_FAILURE (Status)) 153667d9aa44SJung-uk Kim { 153767d9aa44SJung-uk Kim return (Status); 153867d9aa44SJung-uk Kim } 153967d9aa44SJung-uk Kim 154067d9aa44SJung-uk Kim ParentTable = DtPeekSubtable (); 154167d9aa44SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 154267d9aa44SJung-uk Kim 154367d9aa44SJung-uk Kim /* Optional data fields are appended to the main subtable body */ 154467d9aa44SJung-uk Kim 154567d9aa44SJung-uk Kim switch (SdevHeader->Type) 154667d9aa44SJung-uk Kim { 154767d9aa44SJung-uk Kim case ACPI_SDEV_TYPE_NAMESPACE_DEVICE: 154867d9aa44SJung-uk Kim 1549cfd1ed46SJung-uk Kim /* 1550cfd1ed46SJung-uk Kim * Device Id Offset will be be calculated differently depending on 1551cfd1ed46SJung-uk Kim * the presence of secure access components. 1552cfd1ed46SJung-uk Kim */ 1553cfd1ed46SJung-uk Kim Namesp->DeviceIdOffset = 0; 1554cfd1ed46SJung-uk Kim ComponentLength = 0; 1555cfd1ed46SJung-uk Kim 1556cfd1ed46SJung-uk Kim /* If the secure access component exists, get the structures */ 1557cfd1ed46SJung-uk Kim 1558cfd1ed46SJung-uk Kim if (SdevHeader->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT) 1559cfd1ed46SJung-uk Kim { 1560cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0b, 1561cfd1ed46SJung-uk Kim &Subtable); 1562cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 1563cfd1ed46SJung-uk Kim { 1564cfd1ed46SJung-uk Kim return (Status); 1565cfd1ed46SJung-uk Kim } 1566cfd1ed46SJung-uk Kim ParentTable = DtPeekSubtable (); 1567cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1568cfd1ed46SJung-uk Kim 1569cfd1ed46SJung-uk Kim Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT); 1570cfd1ed46SJung-uk Kim 1571cfd1ed46SJung-uk Kim /* Compile a secure access component header */ 1572cfd1ed46SJung-uk Kim 1573cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevSecCompHdr, 1574cfd1ed46SJung-uk Kim &Subtable); 1575cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 1576cfd1ed46SJung-uk Kim { 1577cfd1ed46SJung-uk Kim return (Status); 1578cfd1ed46SJung-uk Kim } 1579cfd1ed46SJung-uk Kim ParentTable = DtPeekSubtable (); 1580cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1581cfd1ed46SJung-uk Kim 1582cfd1ed46SJung-uk Kim /* Compile the secure access component */ 1583cfd1ed46SJung-uk Kim 1584cfd1ed46SJung-uk Kim SecureComponentHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer); 1585cfd1ed46SJung-uk Kim switch (SecureComponentHeader->Type) 1586cfd1ed46SJung-uk Kim { 1587cfd1ed46SJung-uk Kim case ACPI_SDEV_TYPE_ID_COMPONENT: 1588cfd1ed46SJung-uk Kim 1589cfd1ed46SJung-uk Kim SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId; 1590cfd1ed46SJung-uk Kim Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_ID_COMPONENT); 1591cfd1ed46SJung-uk Kim ComponentLength = sizeof (ACPI_SDEV_ID_COMPONENT); 1592cfd1ed46SJung-uk Kim break; 1593cfd1ed46SJung-uk Kim 1594cfd1ed46SJung-uk Kim case ACPI_SDEV_TYPE_MEM_COMPONENT: 1595cfd1ed46SJung-uk Kim 1596cfd1ed46SJung-uk Kim SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem; 1597cfd1ed46SJung-uk Kim Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_MEM_COMPONENT); 1598cfd1ed46SJung-uk Kim ComponentLength = sizeof (ACPI_SDEV_MEM_COMPONENT); 1599cfd1ed46SJung-uk Kim break; 1600cfd1ed46SJung-uk Kim 1601cfd1ed46SJung-uk Kim default: 1602cfd1ed46SJung-uk Kim 1603cfd1ed46SJung-uk Kim /* Any other secure component types are undefined */ 1604cfd1ed46SJung-uk Kim 1605cfd1ed46SJung-uk Kim return (AE_ERROR); 1606cfd1ed46SJung-uk Kim } 1607cfd1ed46SJung-uk Kim 1608cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, SecureComponentInfoTable, 1609cfd1ed46SJung-uk Kim &Subtable); 1610cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 1611cfd1ed46SJung-uk Kim { 1612cfd1ed46SJung-uk Kim return (Status); 1613cfd1ed46SJung-uk Kim } 1614cfd1ed46SJung-uk Kim ParentTable = DtPeekSubtable (); 1615cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1616cfd1ed46SJung-uk Kim 1617cfd1ed46SJung-uk Kim SecureComponent->SecureComponentOffset = 1618cfd1ed46SJung-uk Kim sizeof (ACPI_SDEV_NAMESPACE) + sizeof (ACPI_SDEV_SECURE_COMPONENT); 1619cfd1ed46SJung-uk Kim SecureComponent->SecureComponentLength = ComponentLength; 1620cfd1ed46SJung-uk Kim 1621cfd1ed46SJung-uk Kim 1622cfd1ed46SJung-uk Kim /* 1623cfd1ed46SJung-uk Kim * Add the secure component to the subtable to be added for the 1624cfd1ed46SJung-uk Kim * the namespace subtable's length 1625cfd1ed46SJung-uk Kim */ 1626cfd1ed46SJung-uk Kim ComponentLength += sizeof (ACPI_SDEV_SECURE_COMPONENT); 1627cfd1ed46SJung-uk Kim } 1628cfd1ed46SJung-uk Kim 162967d9aa44SJung-uk Kim /* Append DeviceId namespace string */ 163067d9aa44SJung-uk Kim 163167d9aa44SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a, 1632ff879b07SJung-uk Kim &Subtable); 163367d9aa44SJung-uk Kim if (ACPI_FAILURE (Status)) 163467d9aa44SJung-uk Kim { 163567d9aa44SJung-uk Kim return (Status); 163667d9aa44SJung-uk Kim } 163767d9aa44SJung-uk Kim 163867d9aa44SJung-uk Kim if (!Subtable) 163967d9aa44SJung-uk Kim { 164067d9aa44SJung-uk Kim break; 164167d9aa44SJung-uk Kim } 164267d9aa44SJung-uk Kim 164367d9aa44SJung-uk Kim ParentTable = DtPeekSubtable (); 164467d9aa44SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 164567d9aa44SJung-uk Kim 1646cfd1ed46SJung-uk Kim Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_NAMESPACE); 1647cfd1ed46SJung-uk Kim 164867d9aa44SJung-uk Kim Namesp->DeviceIdLength = (UINT16) Subtable->Length; 164967d9aa44SJung-uk Kim 165067d9aa44SJung-uk Kim /* Append Vendor data */ 165167d9aa44SJung-uk Kim 165267d9aa44SJung-uk Kim Namesp->VendorDataLength = 0; 165367d9aa44SJung-uk Kim Namesp->VendorDataOffset = 0; 165467d9aa44SJung-uk Kim 165567d9aa44SJung-uk Kim if (*PFieldList) 165667d9aa44SJung-uk Kim { 165767d9aa44SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b, 1658ff879b07SJung-uk Kim &Subtable); 165967d9aa44SJung-uk Kim if (ACPI_FAILURE (Status)) 166067d9aa44SJung-uk Kim { 166167d9aa44SJung-uk Kim return (Status); 166267d9aa44SJung-uk Kim } 166367d9aa44SJung-uk Kim 166467d9aa44SJung-uk Kim if (Subtable) 166567d9aa44SJung-uk Kim { 166667d9aa44SJung-uk Kim ParentTable = DtPeekSubtable (); 166767d9aa44SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 166867d9aa44SJung-uk Kim 166967d9aa44SJung-uk Kim Namesp->VendorDataOffset = 167067d9aa44SJung-uk Kim Namesp->DeviceIdOffset + Namesp->DeviceIdLength; 167167d9aa44SJung-uk Kim Namesp->VendorDataLength = 167267d9aa44SJung-uk Kim (UINT16) Subtable->Length; 167367d9aa44SJung-uk Kim 167467d9aa44SJung-uk Kim /* Final size of entire namespace structure */ 167567d9aa44SJung-uk Kim 167667d9aa44SJung-uk Kim SdevHeader->Length = (UINT16)(sizeof(ACPI_SDEV_NAMESPACE) + 1677cfd1ed46SJung-uk Kim Subtable->Length + Namesp->DeviceIdLength) + ComponentLength; 1678a009b7dcSJung-uk Kim } 1679a009b7dcSJung-uk Kim } 1680a009b7dcSJung-uk Kim 168167d9aa44SJung-uk Kim break; 168267d9aa44SJung-uk Kim 168367d9aa44SJung-uk Kim case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE: 168467d9aa44SJung-uk Kim 168567d9aa44SJung-uk Kim /* Append the PCIe path info first */ 168667d9aa44SJung-uk Kim 168767d9aa44SJung-uk Kim EntryCount = 0; 168867d9aa44SJung-uk Kim while (*PFieldList && !strcmp ((*PFieldList)->Name, "Device")) 168967d9aa44SJung-uk Kim { 169067d9aa44SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1a, 1691ff879b07SJung-uk Kim &Subtable); 169267d9aa44SJung-uk Kim if (ACPI_FAILURE (Status)) 169367d9aa44SJung-uk Kim { 169467d9aa44SJung-uk Kim return (Status); 169567d9aa44SJung-uk Kim } 169667d9aa44SJung-uk Kim 169767d9aa44SJung-uk Kim if (!Subtable) 169867d9aa44SJung-uk Kim { 169967d9aa44SJung-uk Kim DtPopSubtable (); 170067d9aa44SJung-uk Kim break; 170167d9aa44SJung-uk Kim } 170267d9aa44SJung-uk Kim 170367d9aa44SJung-uk Kim ParentTable = DtPeekSubtable (); 170467d9aa44SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 170567d9aa44SJung-uk Kim EntryCount++; 170667d9aa44SJung-uk Kim } 170767d9aa44SJung-uk Kim 170867d9aa44SJung-uk Kim /* Path offset will point immediately after the main subtable */ 170967d9aa44SJung-uk Kim 171067d9aa44SJung-uk Kim Pcie->PathOffset = sizeof (ACPI_SDEV_PCIE); 171167d9aa44SJung-uk Kim Pcie->PathLength = (UINT16) 171267d9aa44SJung-uk Kim (EntryCount * sizeof (ACPI_SDEV_PCIE_PATH)); 171367d9aa44SJung-uk Kim 171467d9aa44SJung-uk Kim /* Append the Vendor Data last */ 171567d9aa44SJung-uk Kim 171667d9aa44SJung-uk Kim Pcie->VendorDataLength = 0; 171767d9aa44SJung-uk Kim Pcie->VendorDataOffset = 0; 171867d9aa44SJung-uk Kim 171967d9aa44SJung-uk Kim if (*PFieldList) 172067d9aa44SJung-uk Kim { 172167d9aa44SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b, 1722ff879b07SJung-uk Kim &Subtable); 172367d9aa44SJung-uk Kim if (ACPI_FAILURE (Status)) 172467d9aa44SJung-uk Kim { 172567d9aa44SJung-uk Kim return (Status); 172667d9aa44SJung-uk Kim } 172767d9aa44SJung-uk Kim 172867d9aa44SJung-uk Kim if (Subtable) 172967d9aa44SJung-uk Kim { 173067d9aa44SJung-uk Kim ParentTable = DtPeekSubtable (); 173167d9aa44SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 173267d9aa44SJung-uk Kim 173367d9aa44SJung-uk Kim Pcie->VendorDataOffset = 173467d9aa44SJung-uk Kim Pcie->PathOffset + Pcie->PathLength; 173567d9aa44SJung-uk Kim Pcie->VendorDataLength = (UINT16) 173667d9aa44SJung-uk Kim Subtable->Length; 173767d9aa44SJung-uk Kim } 173867d9aa44SJung-uk Kim } 173967d9aa44SJung-uk Kim 174067d9aa44SJung-uk Kim SdevHeader->Length = 174167d9aa44SJung-uk Kim sizeof (ACPI_SDEV_PCIE) + 174267d9aa44SJung-uk Kim Pcie->PathLength + Pcie->VendorDataLength; 174367d9aa44SJung-uk Kim break; 174467d9aa44SJung-uk Kim 174567d9aa44SJung-uk Kim default: 174667d9aa44SJung-uk Kim 174767d9aa44SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV"); 174867d9aa44SJung-uk Kim return (AE_ERROR); 174967d9aa44SJung-uk Kim } 175067d9aa44SJung-uk Kim 175167d9aa44SJung-uk Kim DtPopSubtable (); 175267d9aa44SJung-uk Kim } 175367d9aa44SJung-uk Kim 175467d9aa44SJung-uk Kim return (AE_OK); 175567d9aa44SJung-uk Kim } 175667d9aa44SJung-uk Kim 175767d9aa44SJung-uk Kim 175867d9aa44SJung-uk Kim /****************************************************************************** 175967d9aa44SJung-uk Kim * 1760f8146b88SJung-uk Kim * FUNCTION: DtCompileSlic 1761f8146b88SJung-uk Kim * 1762f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 1763f8146b88SJung-uk Kim * 1764f8146b88SJung-uk Kim * RETURN: Status 1765f8146b88SJung-uk Kim * 1766f8146b88SJung-uk Kim * DESCRIPTION: Compile SLIC. 1767f8146b88SJung-uk Kim * 1768f8146b88SJung-uk Kim *****************************************************************************/ 1769f8146b88SJung-uk Kim 1770f8146b88SJung-uk Kim ACPI_STATUS 1771f8146b88SJung-uk Kim DtCompileSlic ( 1772f8146b88SJung-uk Kim void **List) 1773f8146b88SJung-uk Kim { 1774f8146b88SJung-uk Kim ACPI_STATUS Status; 1775f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 1776f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 1777f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1778f8146b88SJung-uk Kim 1779f8146b88SJung-uk Kim 1780f8146b88SJung-uk Kim while (*PFieldList) 1781f8146b88SJung-uk Kim { 1782f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic, 1783ff879b07SJung-uk Kim &Subtable); 1784f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1785f8146b88SJung-uk Kim { 1786f8146b88SJung-uk Kim return (Status); 1787f8146b88SJung-uk Kim } 1788f8146b88SJung-uk Kim 1789f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1790f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1791f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1792f8146b88SJung-uk Kim DtPopSubtable (); 1793f8146b88SJung-uk Kim } 1794f8146b88SJung-uk Kim 1795f8146b88SJung-uk Kim return (AE_OK); 1796f8146b88SJung-uk Kim } 1797f8146b88SJung-uk Kim 1798f8146b88SJung-uk Kim 1799f8146b88SJung-uk Kim /****************************************************************************** 1800f8146b88SJung-uk Kim * 1801f8146b88SJung-uk Kim * FUNCTION: DtCompileSlit 1802f8146b88SJung-uk Kim * 1803f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 1804f8146b88SJung-uk Kim * 1805f8146b88SJung-uk Kim * RETURN: Status 1806f8146b88SJung-uk Kim * 1807f8146b88SJung-uk Kim * DESCRIPTION: Compile SLIT. 1808f8146b88SJung-uk Kim * 1809f8146b88SJung-uk Kim *****************************************************************************/ 1810f8146b88SJung-uk Kim 1811f8146b88SJung-uk Kim ACPI_STATUS 1812f8146b88SJung-uk Kim DtCompileSlit ( 1813f8146b88SJung-uk Kim void **List) 1814f8146b88SJung-uk Kim { 1815f8146b88SJung-uk Kim ACPI_STATUS Status; 1816f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 1817f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 1818f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1819f8146b88SJung-uk Kim DT_FIELD *FieldList; 1820a009b7dcSJung-uk Kim DT_FIELD *EndOfFieldList = NULL; 1821f8146b88SJung-uk Kim UINT32 Localities; 1822a009b7dcSJung-uk Kim UINT32 LocalityListLength; 1823f8146b88SJung-uk Kim UINT8 *LocalityBuffer; 1824f8146b88SJung-uk Kim 1825f8146b88SJung-uk Kim 1826f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit, 1827ff879b07SJung-uk Kim &Subtable); 1828f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1829f8146b88SJung-uk Kim { 1830f8146b88SJung-uk Kim return (Status); 1831f8146b88SJung-uk Kim } 1832f8146b88SJung-uk Kim 1833f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1834f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1835f8146b88SJung-uk Kim 1836f8146b88SJung-uk Kim Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer); 1837f8146b88SJung-uk Kim LocalityBuffer = UtLocalCalloc (Localities); 1838a009b7dcSJung-uk Kim LocalityListLength = 0; 1839f8146b88SJung-uk Kim 1840f8146b88SJung-uk Kim /* Compile each locality buffer */ 1841f8146b88SJung-uk Kim 1842f8146b88SJung-uk Kim FieldList = *PFieldList; 1843f8146b88SJung-uk Kim while (FieldList) 1844f8146b88SJung-uk Kim { 1845f8146b88SJung-uk Kim DtCompileBuffer (LocalityBuffer, 1846f8146b88SJung-uk Kim FieldList->Value, FieldList, Localities); 1847f8146b88SJung-uk Kim 1848a009b7dcSJung-uk Kim LocalityListLength++; 1849f8146b88SJung-uk Kim DtCreateSubtable (LocalityBuffer, Localities, &Subtable); 1850f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1851a009b7dcSJung-uk Kim EndOfFieldList = FieldList; 1852f8146b88SJung-uk Kim FieldList = FieldList->Next; 1853f8146b88SJung-uk Kim } 1854f8146b88SJung-uk Kim 1855a009b7dcSJung-uk Kim if (LocalityListLength != Localities) 1856a009b7dcSJung-uk Kim { 1857a009b7dcSJung-uk Kim sprintf(AslGbl_MsgBuffer, 1858a009b7dcSJung-uk Kim "Found %u entries, must match LocalityCount: %u", 1859a009b7dcSJung-uk Kim LocalityListLength, Localities); 1860a009b7dcSJung-uk Kim DtError (ASL_ERROR, ASL_MSG_ENTRY_LIST, EndOfFieldList, AslGbl_MsgBuffer); 1861f9a6772eSJung-uk Kim ACPI_FREE (LocalityBuffer); 1862a009b7dcSJung-uk Kim return (AE_LIMIT); 1863a009b7dcSJung-uk Kim } 1864a009b7dcSJung-uk Kim 1865f8146b88SJung-uk Kim ACPI_FREE (LocalityBuffer); 1866f8146b88SJung-uk Kim return (AE_OK); 1867f8146b88SJung-uk Kim } 1868f8146b88SJung-uk Kim 1869f8146b88SJung-uk Kim 1870f8146b88SJung-uk Kim /****************************************************************************** 1871f8146b88SJung-uk Kim * 1872f8146b88SJung-uk Kim * FUNCTION: DtCompileSrat 1873f8146b88SJung-uk Kim * 1874f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 1875f8146b88SJung-uk Kim * 1876f8146b88SJung-uk Kim * RETURN: Status 1877f8146b88SJung-uk Kim * 1878f8146b88SJung-uk Kim * DESCRIPTION: Compile SRAT. 1879f8146b88SJung-uk Kim * 1880f8146b88SJung-uk Kim *****************************************************************************/ 1881f8146b88SJung-uk Kim 1882f8146b88SJung-uk Kim ACPI_STATUS 1883f8146b88SJung-uk Kim DtCompileSrat ( 1884f8146b88SJung-uk Kim void **List) 1885f8146b88SJung-uk Kim { 1886f8146b88SJung-uk Kim ACPI_STATUS Status; 1887f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 1888f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 1889f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1890f8146b88SJung-uk Kim DT_FIELD *SubtableStart; 1891f8146b88SJung-uk Kim ACPI_SUBTABLE_HEADER *SratHeader; 1892f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 1893f8146b88SJung-uk Kim 1894f8146b88SJung-uk Kim 1895f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat, 1896ff879b07SJung-uk Kim &Subtable); 1897f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1898f8146b88SJung-uk Kim { 1899f8146b88SJung-uk Kim return (Status); 1900f8146b88SJung-uk Kim } 1901f8146b88SJung-uk Kim 1902f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1903f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1904f8146b88SJung-uk Kim 1905f8146b88SJung-uk Kim while (*PFieldList) 1906f8146b88SJung-uk Kim { 1907f8146b88SJung-uk Kim SubtableStart = *PFieldList; 1908f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr, 1909ff879b07SJung-uk Kim &Subtable); 1910f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1911f8146b88SJung-uk Kim { 1912f8146b88SJung-uk Kim return (Status); 1913f8146b88SJung-uk Kim } 1914f8146b88SJung-uk Kim 1915f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1916f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1917f8146b88SJung-uk Kim DtPushSubtable (Subtable); 1918f8146b88SJung-uk Kim 1919f8146b88SJung-uk Kim SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 1920f8146b88SJung-uk Kim 1921f8146b88SJung-uk Kim switch (SratHeader->Type) 1922f8146b88SJung-uk Kim { 1923f8146b88SJung-uk Kim case ACPI_SRAT_TYPE_CPU_AFFINITY: 1924f8146b88SJung-uk Kim 1925f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoSrat0; 1926f8146b88SJung-uk Kim break; 1927f8146b88SJung-uk Kim 1928f8146b88SJung-uk Kim case ACPI_SRAT_TYPE_MEMORY_AFFINITY: 1929f8146b88SJung-uk Kim 1930f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoSrat1; 1931f8146b88SJung-uk Kim break; 1932f8146b88SJung-uk Kim 1933f8146b88SJung-uk Kim case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: 1934f8146b88SJung-uk Kim 1935f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoSrat2; 1936f8146b88SJung-uk Kim break; 1937f8146b88SJung-uk Kim 1938f8146b88SJung-uk Kim case ACPI_SRAT_TYPE_GICC_AFFINITY: 1939f8146b88SJung-uk Kim 1940f8146b88SJung-uk Kim InfoTable = AcpiDmTableInfoSrat3; 1941f8146b88SJung-uk Kim break; 1942f8146b88SJung-uk Kim 1943af051161SJung-uk Kim case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY: 1944af051161SJung-uk Kim 1945af051161SJung-uk Kim InfoTable = AcpiDmTableInfoSrat4; 1946af051161SJung-uk Kim break; 1947af051161SJung-uk Kim 1948cd6518c7SJung-uk Kim case ACPI_SRAT_TYPE_GENERIC_AFFINITY: 1949cd6518c7SJung-uk Kim 1950cd6518c7SJung-uk Kim InfoTable = AcpiDmTableInfoSrat5; 1951cd6518c7SJung-uk Kim break; 1952cd6518c7SJung-uk Kim 1953f8146b88SJung-uk Kim default: 1954f8146b88SJung-uk Kim 1955f8146b88SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT"); 1956f8146b88SJung-uk Kim return (AE_ERROR); 1957f8146b88SJung-uk Kim } 1958f8146b88SJung-uk Kim 1959ff879b07SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 1960f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 1961f8146b88SJung-uk Kim { 1962f8146b88SJung-uk Kim return (Status); 1963f8146b88SJung-uk Kim } 1964f8146b88SJung-uk Kim 1965f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 1966f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1967f8146b88SJung-uk Kim DtPopSubtable (); 1968f8146b88SJung-uk Kim } 1969f8146b88SJung-uk Kim 1970f8146b88SJung-uk Kim return (AE_OK); 1971f8146b88SJung-uk Kim } 1972f8146b88SJung-uk Kim 1973f8146b88SJung-uk Kim 1974f8146b88SJung-uk Kim /****************************************************************************** 1975f8146b88SJung-uk Kim * 1976f8146b88SJung-uk Kim * FUNCTION: DtCompileStao 1977f8146b88SJung-uk Kim * 1978f8146b88SJung-uk Kim * PARAMETERS: PFieldList - Current field list pointer 1979f8146b88SJung-uk Kim * 1980f8146b88SJung-uk Kim * RETURN: Status 1981f8146b88SJung-uk Kim * 1982f8146b88SJung-uk Kim * DESCRIPTION: Compile STAO. 1983f8146b88SJung-uk Kim * 1984f8146b88SJung-uk Kim *****************************************************************************/ 1985f8146b88SJung-uk Kim 1986f8146b88SJung-uk Kim ACPI_STATUS 1987f8146b88SJung-uk Kim DtCompileStao ( 1988f8146b88SJung-uk Kim void **List) 1989f8146b88SJung-uk Kim { 1990f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1991f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 1992f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 1993f8146b88SJung-uk Kim ACPI_STATUS Status; 1994f8146b88SJung-uk Kim 1995f8146b88SJung-uk Kim 1996f8146b88SJung-uk Kim /* Compile the main table */ 1997f8146b88SJung-uk Kim 1998f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao, 1999ff879b07SJung-uk Kim &Subtable); 2000f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2001f8146b88SJung-uk Kim { 2002f8146b88SJung-uk Kim return (Status); 2003f8146b88SJung-uk Kim } 2004f8146b88SJung-uk Kim 2005f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 2006f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2007f8146b88SJung-uk Kim 2008f8146b88SJung-uk Kim /* Compile each ASCII namestring as a subtable */ 2009f8146b88SJung-uk Kim 2010f8146b88SJung-uk Kim while (*PFieldList) 2011f8146b88SJung-uk Kim { 2012f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr, 2013ff879b07SJung-uk Kim &Subtable); 2014f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2015f8146b88SJung-uk Kim { 2016f8146b88SJung-uk Kim return (Status); 2017f8146b88SJung-uk Kim } 2018f8146b88SJung-uk Kim 2019f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 2020f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2021f8146b88SJung-uk Kim } 2022f8146b88SJung-uk Kim 2023f8146b88SJung-uk Kim return (AE_OK); 2024f8146b88SJung-uk Kim } 2025f8146b88SJung-uk Kim 2026f8146b88SJung-uk Kim 2027f8146b88SJung-uk Kim /****************************************************************************** 2028f8146b88SJung-uk Kim * 2029f8146b88SJung-uk Kim * FUNCTION: DtCompileTcpa 2030f8146b88SJung-uk Kim * 2031f8146b88SJung-uk Kim * PARAMETERS: PFieldList - Current field list pointer 2032f8146b88SJung-uk Kim * 2033f8146b88SJung-uk Kim * RETURN: Status 2034f8146b88SJung-uk Kim * 2035f8146b88SJung-uk Kim * DESCRIPTION: Compile TCPA. 2036f8146b88SJung-uk Kim * 2037f8146b88SJung-uk Kim *****************************************************************************/ 2038f8146b88SJung-uk Kim 2039f8146b88SJung-uk Kim ACPI_STATUS 2040f8146b88SJung-uk Kim DtCompileTcpa ( 2041f8146b88SJung-uk Kim void **List) 2042f8146b88SJung-uk Kim { 2043f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 2044f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 2045f8146b88SJung-uk Kim ACPI_TABLE_TCPA_HDR *TcpaHeader; 2046f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 2047f8146b88SJung-uk Kim ACPI_STATUS Status; 2048f8146b88SJung-uk Kim 2049f8146b88SJung-uk Kim 2050f8146b88SJung-uk Kim /* Compile the main table */ 2051f8146b88SJung-uk Kim 2052f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaHdr, 2053ff879b07SJung-uk Kim &Subtable); 2054f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2055f8146b88SJung-uk Kim { 2056f8146b88SJung-uk Kim return (Status); 2057f8146b88SJung-uk Kim } 2058f8146b88SJung-uk Kim 2059f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 2060f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2061f8146b88SJung-uk Kim 2062f8146b88SJung-uk Kim /* 2063f8146b88SJung-uk Kim * Examine the PlatformClass field to determine the table type. 2064f8146b88SJung-uk Kim * Either a client or server table. Only one. 2065f8146b88SJung-uk Kim */ 2066f8146b88SJung-uk Kim TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer); 2067f8146b88SJung-uk Kim 2068f8146b88SJung-uk Kim switch (TcpaHeader->PlatformClass) 2069f8146b88SJung-uk Kim { 2070f8146b88SJung-uk Kim case ACPI_TCPA_CLIENT_TABLE: 2071f8146b88SJung-uk Kim 2072f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaClient, 2073ff879b07SJung-uk Kim &Subtable); 2074f8146b88SJung-uk Kim break; 2075f8146b88SJung-uk Kim 2076f8146b88SJung-uk Kim case ACPI_TCPA_SERVER_TABLE: 2077f8146b88SJung-uk Kim 2078f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaServer, 2079ff879b07SJung-uk Kim &Subtable); 2080f8146b88SJung-uk Kim break; 2081f8146b88SJung-uk Kim 2082f8146b88SJung-uk Kim default: 2083f8146b88SJung-uk Kim 2084f8146b88SJung-uk Kim AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n", 2085f8146b88SJung-uk Kim TcpaHeader->PlatformClass); 2086f8146b88SJung-uk Kim Status = AE_ERROR; 2087f8146b88SJung-uk Kim break; 2088f8146b88SJung-uk Kim } 2089f8146b88SJung-uk Kim 2090f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 2091f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2092f8146b88SJung-uk Kim return (Status); 2093f8146b88SJung-uk Kim } 2094f8146b88SJung-uk Kim 2095f8146b88SJung-uk Kim 2096f8146b88SJung-uk Kim /****************************************************************************** 2097f8146b88SJung-uk Kim * 20984a38ee6dSJung-uk Kim * FUNCTION: DtCompileTpm2Rev3 20994a38ee6dSJung-uk Kim * 21004a38ee6dSJung-uk Kim * PARAMETERS: PFieldList - Current field list pointer 21014a38ee6dSJung-uk Kim * 21024a38ee6dSJung-uk Kim * RETURN: Status 21034a38ee6dSJung-uk Kim * 21044a38ee6dSJung-uk Kim * DESCRIPTION: Compile TPM2 revision 3 21054a38ee6dSJung-uk Kim * 21064a38ee6dSJung-uk Kim *****************************************************************************/ 21074a38ee6dSJung-uk Kim static ACPI_STATUS 21084a38ee6dSJung-uk Kim DtCompileTpm2Rev3 ( 21094a38ee6dSJung-uk Kim void **List) 21104a38ee6dSJung-uk Kim { 21114a38ee6dSJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 21124a38ee6dSJung-uk Kim DT_SUBTABLE *Subtable; 21134a38ee6dSJung-uk Kim ACPI_TABLE_TPM23 *Tpm23Header; 21144a38ee6dSJung-uk Kim DT_SUBTABLE *ParentTable; 21154a38ee6dSJung-uk Kim ACPI_STATUS Status = AE_OK; 21164a38ee6dSJung-uk Kim 21174a38ee6dSJung-uk Kim 21184a38ee6dSJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23, 21194a38ee6dSJung-uk Kim &Subtable); 21204a38ee6dSJung-uk Kim 21214a38ee6dSJung-uk Kim ParentTable = DtPeekSubtable (); 21224a38ee6dSJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 21234a38ee6dSJung-uk Kim Tpm23Header = ACPI_CAST_PTR (ACPI_TABLE_TPM23, ParentTable->Buffer); 21244a38ee6dSJung-uk Kim 21254a38ee6dSJung-uk Kim /* Subtable type depends on the StartMethod */ 21264a38ee6dSJung-uk Kim 21274a38ee6dSJung-uk Kim switch (Tpm23Header->StartMethod) 21284a38ee6dSJung-uk Kim { 21294a38ee6dSJung-uk Kim case ACPI_TPM23_ACPI_START_METHOD: 21304a38ee6dSJung-uk Kim 21314a38ee6dSJung-uk Kim /* Subtable specific to to ARM_SMC */ 21324a38ee6dSJung-uk Kim 21334a38ee6dSJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23a, 21344a38ee6dSJung-uk Kim &Subtable); 21354a38ee6dSJung-uk Kim if (ACPI_FAILURE (Status)) 21364a38ee6dSJung-uk Kim { 21374a38ee6dSJung-uk Kim return (Status); 21384a38ee6dSJung-uk Kim } 21394a38ee6dSJung-uk Kim 21404a38ee6dSJung-uk Kim ParentTable = DtPeekSubtable (); 21414a38ee6dSJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 21424a38ee6dSJung-uk Kim break; 21434a38ee6dSJung-uk Kim 21444a38ee6dSJung-uk Kim default: 21454a38ee6dSJung-uk Kim break; 21464a38ee6dSJung-uk Kim } 21474a38ee6dSJung-uk Kim 21484a38ee6dSJung-uk Kim return (Status); 21494a38ee6dSJung-uk Kim } 21504a38ee6dSJung-uk Kim 21514a38ee6dSJung-uk Kim 21524a38ee6dSJung-uk Kim /****************************************************************************** 21534a38ee6dSJung-uk Kim * 215467d9aa44SJung-uk Kim * FUNCTION: DtCompileTpm2 215567d9aa44SJung-uk Kim * 215667d9aa44SJung-uk Kim * PARAMETERS: PFieldList - Current field list pointer 215767d9aa44SJung-uk Kim * 215867d9aa44SJung-uk Kim * RETURN: Status 215967d9aa44SJung-uk Kim * 216067d9aa44SJung-uk Kim * DESCRIPTION: Compile TPM2. 216167d9aa44SJung-uk Kim * 216267d9aa44SJung-uk Kim *****************************************************************************/ 216367d9aa44SJung-uk Kim 216467d9aa44SJung-uk Kim ACPI_STATUS 216567d9aa44SJung-uk Kim DtCompileTpm2 ( 216667d9aa44SJung-uk Kim void **List) 216767d9aa44SJung-uk Kim { 216867d9aa44SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 216967d9aa44SJung-uk Kim DT_SUBTABLE *Subtable; 217067d9aa44SJung-uk Kim ACPI_TABLE_TPM2 *Tpm2Header; 217167d9aa44SJung-uk Kim DT_SUBTABLE *ParentTable; 217267d9aa44SJung-uk Kim ACPI_STATUS Status = AE_OK; 21734a38ee6dSJung-uk Kim ACPI_TABLE_HEADER *Header; 217467d9aa44SJung-uk Kim 217567d9aa44SJung-uk Kim 21764a38ee6dSJung-uk Kim ParentTable = DtPeekSubtable (); 21774a38ee6dSJung-uk Kim 21784a38ee6dSJung-uk Kim Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); 21794a38ee6dSJung-uk Kim 21804a38ee6dSJung-uk Kim if (Header->Revision == 3) 21814a38ee6dSJung-uk Kim { 21824a38ee6dSJung-uk Kim return (DtCompileTpm2Rev3 (List)); 21834a38ee6dSJung-uk Kim } 21844a38ee6dSJung-uk Kim 218567d9aa44SJung-uk Kim /* Compile the main table */ 218667d9aa44SJung-uk Kim 218767d9aa44SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2, 2188ff879b07SJung-uk Kim &Subtable); 218967d9aa44SJung-uk Kim if (ACPI_FAILURE (Status)) 219067d9aa44SJung-uk Kim { 219167d9aa44SJung-uk Kim return (Status); 219267d9aa44SJung-uk Kim } 219367d9aa44SJung-uk Kim 219467d9aa44SJung-uk Kim ParentTable = DtPeekSubtable (); 219567d9aa44SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 219667d9aa44SJung-uk Kim 219767d9aa44SJung-uk Kim Tpm2Header = ACPI_CAST_PTR (ACPI_TABLE_TPM2, ParentTable->Buffer); 219867d9aa44SJung-uk Kim 219967d9aa44SJung-uk Kim /* Method parameters */ 220067d9aa44SJung-uk Kim /* Optional: Log area minimum length */ 220167d9aa44SJung-uk Kim /* Optional: Log area start address */ 220267d9aa44SJung-uk Kim /* TBD: Optional fields above not fully implemented (not optional at this time) */ 220367d9aa44SJung-uk Kim 220467d9aa44SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2a, 2205ff879b07SJung-uk Kim &Subtable); 220667d9aa44SJung-uk Kim if (ACPI_FAILURE (Status)) 220767d9aa44SJung-uk Kim { 220867d9aa44SJung-uk Kim return (Status); 220967d9aa44SJung-uk Kim } 221067d9aa44SJung-uk Kim 221167d9aa44SJung-uk Kim ParentTable = DtPeekSubtable (); 221267d9aa44SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 221367d9aa44SJung-uk Kim 221467d9aa44SJung-uk Kim 221567d9aa44SJung-uk Kim /* Subtable type depends on the StartMethod */ 221667d9aa44SJung-uk Kim 221767d9aa44SJung-uk Kim switch (Tpm2Header->StartMethod) 221867d9aa44SJung-uk Kim { 221967d9aa44SJung-uk Kim case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC: 222067d9aa44SJung-uk Kim 222167d9aa44SJung-uk Kim /* Subtable specific to to ARM_SMC */ 222267d9aa44SJung-uk Kim 222367d9aa44SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm211, 2224ff879b07SJung-uk Kim &Subtable); 222567d9aa44SJung-uk Kim if (ACPI_FAILURE (Status)) 222667d9aa44SJung-uk Kim { 222767d9aa44SJung-uk Kim return (Status); 222867d9aa44SJung-uk Kim } 222967d9aa44SJung-uk Kim 223067d9aa44SJung-uk Kim ParentTable = DtPeekSubtable (); 223167d9aa44SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 223267d9aa44SJung-uk Kim break; 223367d9aa44SJung-uk Kim 223467d9aa44SJung-uk Kim case ACPI_TPM2_START_METHOD: 223567d9aa44SJung-uk Kim case ACPI_TPM2_MEMORY_MAPPED: 223667d9aa44SJung-uk Kim case ACPI_TPM2_COMMAND_BUFFER: 223767d9aa44SJung-uk Kim case ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD: 223867d9aa44SJung-uk Kim break; 223967d9aa44SJung-uk Kim 224067d9aa44SJung-uk Kim case ACPI_TPM2_RESERVED1: 224167d9aa44SJung-uk Kim case ACPI_TPM2_RESERVED3: 224267d9aa44SJung-uk Kim case ACPI_TPM2_RESERVED4: 224367d9aa44SJung-uk Kim case ACPI_TPM2_RESERVED5: 224467d9aa44SJung-uk Kim case ACPI_TPM2_RESERVED9: 224567d9aa44SJung-uk Kim case ACPI_TPM2_RESERVED10: 224667d9aa44SJung-uk Kim 224767d9aa44SJung-uk Kim AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n", 224867d9aa44SJung-uk Kim Tpm2Header->StartMethod); 224967d9aa44SJung-uk Kim Status = AE_ERROR; 225067d9aa44SJung-uk Kim break; 225167d9aa44SJung-uk Kim 225267d9aa44SJung-uk Kim case ACPI_TPM2_NOT_ALLOWED: 225367d9aa44SJung-uk Kim default: 225467d9aa44SJung-uk Kim 225567d9aa44SJung-uk Kim AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n", 225667d9aa44SJung-uk Kim Tpm2Header->StartMethod); 225767d9aa44SJung-uk Kim Status = AE_ERROR; 225867d9aa44SJung-uk Kim break; 225967d9aa44SJung-uk Kim } 226067d9aa44SJung-uk Kim 226167d9aa44SJung-uk Kim return (Status); 226267d9aa44SJung-uk Kim } 226367d9aa44SJung-uk Kim 226467d9aa44SJung-uk Kim 226567d9aa44SJung-uk Kim /****************************************************************************** 226667d9aa44SJung-uk Kim * 2267f8146b88SJung-uk Kim * FUNCTION: DtGetGenericTableInfo 2268f8146b88SJung-uk Kim * 2269f8146b88SJung-uk Kim * PARAMETERS: Name - Generic type name 2270f8146b88SJung-uk Kim * 2271f8146b88SJung-uk Kim * RETURN: Info entry 2272f8146b88SJung-uk Kim * 2273f8146b88SJung-uk Kim * DESCRIPTION: Obtain table info for a generic name entry 2274f8146b88SJung-uk Kim * 2275f8146b88SJung-uk Kim *****************************************************************************/ 2276f8146b88SJung-uk Kim 2277f8146b88SJung-uk Kim ACPI_DMTABLE_INFO * 2278f8146b88SJung-uk Kim DtGetGenericTableInfo ( 2279f8146b88SJung-uk Kim char *Name) 2280f8146b88SJung-uk Kim { 2281f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *Info; 2282f8146b88SJung-uk Kim UINT32 i; 2283f8146b88SJung-uk Kim 2284f8146b88SJung-uk Kim 2285f8146b88SJung-uk Kim if (!Name) 2286f8146b88SJung-uk Kim { 2287f8146b88SJung-uk Kim return (NULL); 2288f8146b88SJung-uk Kim } 2289f8146b88SJung-uk Kim 2290f8146b88SJung-uk Kim /* Search info table for name match */ 2291f8146b88SJung-uk Kim 2292f8146b88SJung-uk Kim for (i = 0; ; i++) 2293f8146b88SJung-uk Kim { 2294f8146b88SJung-uk Kim Info = AcpiDmTableInfoGeneric[i]; 2295f8146b88SJung-uk Kim if (Info->Opcode == ACPI_DMT_EXIT) 2296f8146b88SJung-uk Kim { 2297f8146b88SJung-uk Kim Info = NULL; 2298f8146b88SJung-uk Kim break; 2299f8146b88SJung-uk Kim } 2300f8146b88SJung-uk Kim 2301f8146b88SJung-uk Kim /* Use caseless compare for generic keywords */ 2302f8146b88SJung-uk Kim 2303f8146b88SJung-uk Kim if (!AcpiUtStricmp (Name, Info->Name)) 2304f8146b88SJung-uk Kim { 2305f8146b88SJung-uk Kim break; 2306f8146b88SJung-uk Kim } 2307f8146b88SJung-uk Kim } 2308f8146b88SJung-uk Kim 2309f8146b88SJung-uk Kim return (Info); 2310f8146b88SJung-uk Kim } 2311f8146b88SJung-uk Kim 2312f8146b88SJung-uk Kim 2313f8146b88SJung-uk Kim /****************************************************************************** 2314f8146b88SJung-uk Kim * 2315f8146b88SJung-uk Kim * FUNCTION: DtCompileUefi 2316f8146b88SJung-uk Kim * 2317f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 2318f8146b88SJung-uk Kim * 2319f8146b88SJung-uk Kim * RETURN: Status 2320f8146b88SJung-uk Kim * 2321f8146b88SJung-uk Kim * DESCRIPTION: Compile UEFI. 2322f8146b88SJung-uk Kim * 2323f8146b88SJung-uk Kim *****************************************************************************/ 2324f8146b88SJung-uk Kim 2325f8146b88SJung-uk Kim ACPI_STATUS 2326f8146b88SJung-uk Kim DtCompileUefi ( 2327f8146b88SJung-uk Kim void **List) 2328f8146b88SJung-uk Kim { 2329f8146b88SJung-uk Kim ACPI_STATUS Status; 2330f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 2331f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 2332f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 2333f8146b88SJung-uk Kim UINT16 *DataOffset; 2334f8146b88SJung-uk Kim 2335f8146b88SJung-uk Kim 2336f8146b88SJung-uk Kim /* Compile the predefined portion of the UEFI table */ 2337f8146b88SJung-uk Kim 2338f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi, 2339ff879b07SJung-uk Kim &Subtable); 2340f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2341f8146b88SJung-uk Kim { 2342f8146b88SJung-uk Kim return (Status); 2343f8146b88SJung-uk Kim } 2344f8146b88SJung-uk Kim 2345f8146b88SJung-uk Kim DataOffset = (UINT16 *) (Subtable->Buffer + 16); 2346f8146b88SJung-uk Kim *DataOffset = sizeof (ACPI_TABLE_UEFI); 2347f8146b88SJung-uk Kim 2348f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 2349f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2350f8146b88SJung-uk Kim 2351f8146b88SJung-uk Kim /* 2352f8146b88SJung-uk Kim * Compile the "generic" portion of the UEFI table. This 2353f8146b88SJung-uk Kim * part of the table is not predefined and any of the generic 2354f8146b88SJung-uk Kim * operators may be used. 2355f8146b88SJung-uk Kim */ 2356f8146b88SJung-uk Kim DtCompileGeneric ((void **) PFieldList, NULL, NULL); 2357f8146b88SJung-uk Kim return (AE_OK); 2358f8146b88SJung-uk Kim } 2359f8146b88SJung-uk Kim 2360f8146b88SJung-uk Kim 2361f8146b88SJung-uk Kim /****************************************************************************** 2362f8146b88SJung-uk Kim * 2363cfd1ed46SJung-uk Kim * FUNCTION: DtCompileViot 2364cfd1ed46SJung-uk Kim * 2365cfd1ed46SJung-uk Kim * PARAMETERS: List - Current field list pointer 2366cfd1ed46SJung-uk Kim * 2367cfd1ed46SJung-uk Kim * RETURN: Status 2368cfd1ed46SJung-uk Kim * 2369cfd1ed46SJung-uk Kim * DESCRIPTION: Compile VIOT. 2370cfd1ed46SJung-uk Kim * 2371cfd1ed46SJung-uk Kim *****************************************************************************/ 2372cfd1ed46SJung-uk Kim 2373cfd1ed46SJung-uk Kim ACPI_STATUS 2374cfd1ed46SJung-uk Kim DtCompileViot ( 2375cfd1ed46SJung-uk Kim void **List) 2376cfd1ed46SJung-uk Kim { 2377cfd1ed46SJung-uk Kim ACPI_STATUS Status; 2378cfd1ed46SJung-uk Kim DT_SUBTABLE *Subtable; 2379cfd1ed46SJung-uk Kim DT_SUBTABLE *ParentTable; 2380cfd1ed46SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 2381cfd1ed46SJung-uk Kim DT_FIELD *SubtableStart; 2382cfd1ed46SJung-uk Kim ACPI_TABLE_VIOT *Viot; 2383cfd1ed46SJung-uk Kim ACPI_VIOT_HEADER *ViotHeader; 2384cfd1ed46SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 2385cfd1ed46SJung-uk Kim UINT16 NodeCount; 2386cfd1ed46SJung-uk Kim 2387cfd1ed46SJung-uk Kim ParentTable = DtPeekSubtable (); 2388cfd1ed46SJung-uk Kim 2389cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoViot, &Subtable); 2390cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 2391cfd1ed46SJung-uk Kim { 2392cfd1ed46SJung-uk Kim return (Status); 2393cfd1ed46SJung-uk Kim } 2394cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2395cfd1ed46SJung-uk Kim 2396cfd1ed46SJung-uk Kim /* 2397cfd1ed46SJung-uk Kim * Using ACPI_SUB_PTR, We needn't define a separate structure. Care 2398cfd1ed46SJung-uk Kim * should be taken to avoid accessing ACPI_TABLE_HEADER fields. 2399cfd1ed46SJung-uk Kim */ 2400cfd1ed46SJung-uk Kim Viot = ACPI_SUB_PTR (ACPI_TABLE_VIOT, Subtable->Buffer, 2401cfd1ed46SJung-uk Kim sizeof (ACPI_TABLE_HEADER)); 2402cfd1ed46SJung-uk Kim 2403cfd1ed46SJung-uk Kim Viot->NodeOffset = sizeof (ACPI_TABLE_VIOT); 2404cfd1ed46SJung-uk Kim 2405cfd1ed46SJung-uk Kim NodeCount = 0; 2406cfd1ed46SJung-uk Kim while (*PFieldList) { 2407cfd1ed46SJung-uk Kim SubtableStart = *PFieldList; 2408cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoViotHeader, 2409cfd1ed46SJung-uk Kim &Subtable); 2410cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 2411cfd1ed46SJung-uk Kim { 2412cfd1ed46SJung-uk Kim return (Status); 2413cfd1ed46SJung-uk Kim } 2414cfd1ed46SJung-uk Kim 2415cfd1ed46SJung-uk Kim ParentTable = DtPeekSubtable (); 2416cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2417cfd1ed46SJung-uk Kim DtPushSubtable (Subtable); 2418cfd1ed46SJung-uk Kim 2419cfd1ed46SJung-uk Kim ViotHeader = ACPI_CAST_PTR (ACPI_VIOT_HEADER, Subtable->Buffer); 2420cfd1ed46SJung-uk Kim 2421cfd1ed46SJung-uk Kim switch (ViotHeader->Type) 2422cfd1ed46SJung-uk Kim { 2423cfd1ed46SJung-uk Kim case ACPI_VIOT_NODE_PCI_RANGE: 2424cfd1ed46SJung-uk Kim 2425cfd1ed46SJung-uk Kim InfoTable = AcpiDmTableInfoViot1; 2426cfd1ed46SJung-uk Kim break; 2427cfd1ed46SJung-uk Kim 2428cfd1ed46SJung-uk Kim case ACPI_VIOT_NODE_MMIO: 2429cfd1ed46SJung-uk Kim 2430cfd1ed46SJung-uk Kim InfoTable = AcpiDmTableInfoViot2; 2431cfd1ed46SJung-uk Kim break; 2432cfd1ed46SJung-uk Kim 2433cfd1ed46SJung-uk Kim case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI: 2434cfd1ed46SJung-uk Kim 2435cfd1ed46SJung-uk Kim InfoTable = AcpiDmTableInfoViot3; 2436cfd1ed46SJung-uk Kim break; 2437cfd1ed46SJung-uk Kim 2438cfd1ed46SJung-uk Kim case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO: 2439cfd1ed46SJung-uk Kim 2440cfd1ed46SJung-uk Kim InfoTable = AcpiDmTableInfoViot4; 2441cfd1ed46SJung-uk Kim break; 2442cfd1ed46SJung-uk Kim 2443cfd1ed46SJung-uk Kim default: 2444cfd1ed46SJung-uk Kim 2445cfd1ed46SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "VIOT"); 2446cfd1ed46SJung-uk Kim return (AE_ERROR); 2447cfd1ed46SJung-uk Kim } 2448cfd1ed46SJung-uk Kim 2449cfd1ed46SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 2450cfd1ed46SJung-uk Kim if (ACPI_FAILURE (Status)) 2451cfd1ed46SJung-uk Kim { 2452cfd1ed46SJung-uk Kim return (Status); 2453cfd1ed46SJung-uk Kim } 2454cfd1ed46SJung-uk Kim 2455cfd1ed46SJung-uk Kim ParentTable = DtPeekSubtable (); 2456cfd1ed46SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2457cfd1ed46SJung-uk Kim DtPopSubtable (); 2458cfd1ed46SJung-uk Kim NodeCount++; 2459cfd1ed46SJung-uk Kim } 2460cfd1ed46SJung-uk Kim 2461cfd1ed46SJung-uk Kim Viot->NodeCount = NodeCount; 2462cfd1ed46SJung-uk Kim return (AE_OK); 2463cfd1ed46SJung-uk Kim } 2464cfd1ed46SJung-uk Kim 2465cfd1ed46SJung-uk Kim 2466cfd1ed46SJung-uk Kim /****************************************************************************** 2467cfd1ed46SJung-uk Kim * 2468f8146b88SJung-uk Kim * FUNCTION: DtCompileWdat 2469f8146b88SJung-uk Kim * 2470f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 2471f8146b88SJung-uk Kim * 2472f8146b88SJung-uk Kim * RETURN: Status 2473f8146b88SJung-uk Kim * 2474f8146b88SJung-uk Kim * DESCRIPTION: Compile WDAT. 2475f8146b88SJung-uk Kim * 2476f8146b88SJung-uk Kim *****************************************************************************/ 2477f8146b88SJung-uk Kim 2478f8146b88SJung-uk Kim ACPI_STATUS 2479f8146b88SJung-uk Kim DtCompileWdat ( 2480f8146b88SJung-uk Kim void **List) 2481f8146b88SJung-uk Kim { 2482f8146b88SJung-uk Kim ACPI_STATUS Status; 2483f8146b88SJung-uk Kim 2484f8146b88SJung-uk Kim 2485f8146b88SJung-uk Kim Status = DtCompileTwoSubtables (List, 2486f8146b88SJung-uk Kim AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0); 2487f8146b88SJung-uk Kim return (Status); 2488f8146b88SJung-uk Kim } 2489f8146b88SJung-uk Kim 2490f8146b88SJung-uk Kim 2491f8146b88SJung-uk Kim /****************************************************************************** 2492f8146b88SJung-uk Kim * 2493f8146b88SJung-uk Kim * FUNCTION: DtCompileWpbt 2494f8146b88SJung-uk Kim * 2495f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 2496f8146b88SJung-uk Kim * 2497f8146b88SJung-uk Kim * RETURN: Status 2498f8146b88SJung-uk Kim * 2499f8146b88SJung-uk Kim * DESCRIPTION: Compile WPBT. 2500f8146b88SJung-uk Kim * 2501f8146b88SJung-uk Kim *****************************************************************************/ 2502f8146b88SJung-uk Kim 2503f8146b88SJung-uk Kim ACPI_STATUS 2504f8146b88SJung-uk Kim DtCompileWpbt ( 2505f8146b88SJung-uk Kim void **List) 2506f8146b88SJung-uk Kim { 2507f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 2508f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 2509f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 2510f8146b88SJung-uk Kim ACPI_TABLE_WPBT *Table; 2511f8146b88SJung-uk Kim ACPI_STATUS Status; 2512f8146b88SJung-uk Kim UINT16 Length; 2513f8146b88SJung-uk Kim 2514f8146b88SJung-uk Kim 2515f8146b88SJung-uk Kim /* Compile the main table */ 2516f8146b88SJung-uk Kim 2517f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt, 2518ff879b07SJung-uk Kim &Subtable); 2519f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2520f8146b88SJung-uk Kim { 2521f8146b88SJung-uk Kim return (Status); 2522f8146b88SJung-uk Kim } 2523f8146b88SJung-uk Kim 2524f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 2525f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2526f8146b88SJung-uk Kim 2527f8146b88SJung-uk Kim /* Compile the argument list subtable */ 2528f8146b88SJung-uk Kim 2529f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0, 2530ff879b07SJung-uk Kim &Subtable); 2531f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 2532f8146b88SJung-uk Kim { 2533f8146b88SJung-uk Kim return (Status); 2534f8146b88SJung-uk Kim } 2535f8146b88SJung-uk Kim 2536f8146b88SJung-uk Kim /* Extract the length of the Arguments buffer, insert into main table */ 2537f8146b88SJung-uk Kim 2538f8146b88SJung-uk Kim Length = (UINT16) Subtable->TotalLength; 2539f8146b88SJung-uk Kim Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer); 2540f8146b88SJung-uk Kim Table->ArgumentsLength = Length; 2541f8146b88SJung-uk Kim 2542f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 2543f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2544f8146b88SJung-uk Kim return (AE_OK); 2545f8146b88SJung-uk Kim } 2546f8146b88SJung-uk Kim 2547f8146b88SJung-uk Kim 2548f8146b88SJung-uk Kim /****************************************************************************** 2549f8146b88SJung-uk Kim * 2550f8146b88SJung-uk Kim * FUNCTION: DtCompileXsdt 2551f8146b88SJung-uk Kim * 2552f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 2553f8146b88SJung-uk Kim * 2554f8146b88SJung-uk Kim * RETURN: Status 2555f8146b88SJung-uk Kim * 2556f8146b88SJung-uk Kim * DESCRIPTION: Compile XSDT. 2557f8146b88SJung-uk Kim * 2558f8146b88SJung-uk Kim *****************************************************************************/ 2559f8146b88SJung-uk Kim 2560f8146b88SJung-uk Kim ACPI_STATUS 2561f8146b88SJung-uk Kim DtCompileXsdt ( 2562f8146b88SJung-uk Kim void **List) 2563f8146b88SJung-uk Kim { 2564f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 2565f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 2566f8146b88SJung-uk Kim DT_FIELD *FieldList = *(DT_FIELD **) List; 2567f8146b88SJung-uk Kim UINT64 Address; 2568f8146b88SJung-uk Kim 2569f8146b88SJung-uk Kim 2570f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 2571f8146b88SJung-uk Kim 2572f8146b88SJung-uk Kim while (FieldList) 2573f8146b88SJung-uk Kim { 2574f8146b88SJung-uk Kim DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO); 2575f8146b88SJung-uk Kim 2576f8146b88SJung-uk Kim DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable); 2577f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2578f8146b88SJung-uk Kim FieldList = FieldList->Next; 2579f8146b88SJung-uk Kim } 2580f8146b88SJung-uk Kim 2581f8146b88SJung-uk Kim return (AE_OK); 2582f8146b88SJung-uk Kim } 2583f8146b88SJung-uk Kim 2584f8146b88SJung-uk Kim 2585f8146b88SJung-uk Kim /****************************************************************************** 2586f8146b88SJung-uk Kim * 2587f8146b88SJung-uk Kim * FUNCTION: DtCompileGeneric 2588f8146b88SJung-uk Kim * 2589f8146b88SJung-uk Kim * PARAMETERS: List - Current field list pointer 2590f8146b88SJung-uk Kim * Name - Field name to end generic compiling 2591f8146b88SJung-uk Kim * Length - Compiled table length to return 2592f8146b88SJung-uk Kim * 2593f8146b88SJung-uk Kim * RETURN: Status 2594f8146b88SJung-uk Kim * 2595f8146b88SJung-uk Kim * DESCRIPTION: Compile generic unknown table. 2596f8146b88SJung-uk Kim * 2597f8146b88SJung-uk Kim *****************************************************************************/ 2598f8146b88SJung-uk Kim 2599f8146b88SJung-uk Kim ACPI_STATUS 2600f8146b88SJung-uk Kim DtCompileGeneric ( 2601f8146b88SJung-uk Kim void **List, 2602f8146b88SJung-uk Kim char *Name, 2603f8146b88SJung-uk Kim UINT32 *Length) 2604f8146b88SJung-uk Kim { 2605f8146b88SJung-uk Kim ACPI_STATUS Status; 2606f8146b88SJung-uk Kim DT_SUBTABLE *Subtable; 2607f8146b88SJung-uk Kim DT_SUBTABLE *ParentTable; 2608f8146b88SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 2609f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *Info; 2610f8146b88SJung-uk Kim 2611f8146b88SJung-uk Kim 2612f8146b88SJung-uk Kim ParentTable = DtPeekSubtable (); 2613f8146b88SJung-uk Kim 2614f8146b88SJung-uk Kim /* 2615f8146b88SJung-uk Kim * Compile the "generic" portion of the table. This 2616f8146b88SJung-uk Kim * part of the table is not predefined and any of the generic 2617f8146b88SJung-uk Kim * operators may be used. 2618f8146b88SJung-uk Kim */ 2619f8146b88SJung-uk Kim 2620f8146b88SJung-uk Kim /* Find any and all labels in the entire generic portion */ 2621f8146b88SJung-uk Kim 2622f8146b88SJung-uk Kim DtDetectAllLabels (*PFieldList); 2623f8146b88SJung-uk Kim 2624f8146b88SJung-uk Kim /* Now we can actually compile the parse tree */ 2625f8146b88SJung-uk Kim 2626f8146b88SJung-uk Kim if (Length && *Length) 2627f8146b88SJung-uk Kim { 2628f8146b88SJung-uk Kim *Length = 0; 2629f8146b88SJung-uk Kim } 2630f8146b88SJung-uk Kim while (*PFieldList) 2631f8146b88SJung-uk Kim { 2632f8146b88SJung-uk Kim if (Name && !strcmp ((*PFieldList)->Name, Name)) 2633f8146b88SJung-uk Kim { 2634f8146b88SJung-uk Kim break; 2635f8146b88SJung-uk Kim } 2636f8146b88SJung-uk Kim 2637f8146b88SJung-uk Kim Info = DtGetGenericTableInfo ((*PFieldList)->Name); 2638f8146b88SJung-uk Kim if (!Info) 2639f8146b88SJung-uk Kim { 26406f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found", 2641f8146b88SJung-uk Kim (*PFieldList)->Name); 2642f8146b88SJung-uk Kim DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME, 26436f1f1a63SJung-uk Kim (*PFieldList), AslGbl_MsgBuffer); 2644f8146b88SJung-uk Kim 2645f8146b88SJung-uk Kim *PFieldList = (*PFieldList)->Next; 2646f8146b88SJung-uk Kim continue; 2647f8146b88SJung-uk Kim } 2648f8146b88SJung-uk Kim 2649f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, Info, 2650ff879b07SJung-uk Kim &Subtable); 2651f8146b88SJung-uk Kim if (ACPI_SUCCESS (Status)) 2652f8146b88SJung-uk Kim { 2653f8146b88SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2654f8146b88SJung-uk Kim if (Length) 2655f8146b88SJung-uk Kim { 2656f8146b88SJung-uk Kim *Length += Subtable->Length; 2657f8146b88SJung-uk Kim } 2658f8146b88SJung-uk Kim } 2659f8146b88SJung-uk Kim else 2660f8146b88SJung-uk Kim { 2661f8146b88SJung-uk Kim *PFieldList = (*PFieldList)->Next; 2662f8146b88SJung-uk Kim 2663f8146b88SJung-uk Kim if (Status == AE_NOT_FOUND) 2664f8146b88SJung-uk Kim { 26656f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found", 2666f8146b88SJung-uk Kim (*PFieldList)->Name); 2667f8146b88SJung-uk Kim DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME, 26686f1f1a63SJung-uk Kim (*PFieldList), AslGbl_MsgBuffer); 2669f8146b88SJung-uk Kim } 2670f8146b88SJung-uk Kim } 2671f8146b88SJung-uk Kim } 2672f8146b88SJung-uk Kim 2673f8146b88SJung-uk Kim return (AE_OK); 2674f8146b88SJung-uk Kim } 2675