1*a88e22b7SJung-uk Kim /****************************************************************************** 2*a88e22b7SJung-uk Kim * 3*a88e22b7SJung-uk Kim * Module Name: dttable.c - handling for specific ACPI tables 4*a88e22b7SJung-uk Kim * 5*a88e22b7SJung-uk Kim *****************************************************************************/ 6*a88e22b7SJung-uk Kim 7*a88e22b7SJung-uk Kim /****************************************************************************** 8*a88e22b7SJung-uk Kim * 9*a88e22b7SJung-uk Kim * 1. Copyright Notice 10*a88e22b7SJung-uk Kim * 11*a88e22b7SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. 12*a88e22b7SJung-uk Kim * All rights reserved. 13*a88e22b7SJung-uk Kim * 14*a88e22b7SJung-uk Kim * 2. License 15*a88e22b7SJung-uk Kim * 16*a88e22b7SJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 17*a88e22b7SJung-uk Kim * rights. You may have additional license terms from the party that provided 18*a88e22b7SJung-uk Kim * you this software, covering your right to use that party's intellectual 19*a88e22b7SJung-uk Kim * property rights. 20*a88e22b7SJung-uk Kim * 21*a88e22b7SJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22*a88e22b7SJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 23*a88e22b7SJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24*a88e22b7SJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 25*a88e22b7SJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 26*a88e22b7SJung-uk Kim * Code in any form, with the right to sublicense such rights; and 27*a88e22b7SJung-uk Kim * 28*a88e22b7SJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29*a88e22b7SJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 30*a88e22b7SJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 31*a88e22b7SJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 32*a88e22b7SJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 33*a88e22b7SJung-uk Kim * license, and in no event shall the patent license extend to any additions 34*a88e22b7SJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 35*a88e22b7SJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 36*a88e22b7SJung-uk Kim * 37*a88e22b7SJung-uk Kim * The above copyright and patent license is granted only if the following 38*a88e22b7SJung-uk Kim * conditions are met: 39*a88e22b7SJung-uk Kim * 40*a88e22b7SJung-uk Kim * 3. Conditions 41*a88e22b7SJung-uk Kim * 42*a88e22b7SJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43*a88e22b7SJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 44*a88e22b7SJung-uk Kim * Code or modification with rights to further distribute source must include 45*a88e22b7SJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 46*a88e22b7SJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 47*a88e22b7SJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 48*a88e22b7SJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 49*a88e22b7SJung-uk Kim * Code and the date of any change. Licensee must include in that file the 50*a88e22b7SJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 51*a88e22b7SJung-uk Kim * must include a prominent statement that the modification is derived, 52*a88e22b7SJung-uk Kim * directly or indirectly, from Original Intel Code. 53*a88e22b7SJung-uk Kim * 54*a88e22b7SJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55*a88e22b7SJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 56*a88e22b7SJung-uk Kim * Code or modification without rights to further distribute source must 57*a88e22b7SJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 58*a88e22b7SJung-uk Kim * documentation and/or other materials provided with distribution. In 59*a88e22b7SJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 60*a88e22b7SJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 61*a88e22b7SJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 62*a88e22b7SJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 63*a88e22b7SJung-uk Kim * not to intellectual property embodied in modifications its licensee may 64*a88e22b7SJung-uk Kim * make. 65*a88e22b7SJung-uk Kim * 66*a88e22b7SJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 67*a88e22b7SJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 68*a88e22b7SJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 69*a88e22b7SJung-uk Kim * provision in the documentation and/or other materials provided with the 70*a88e22b7SJung-uk Kim * distribution. 71*a88e22b7SJung-uk Kim * 72*a88e22b7SJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 73*a88e22b7SJung-uk Kim * Intel Code. 74*a88e22b7SJung-uk Kim * 75*a88e22b7SJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76*a88e22b7SJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 77*a88e22b7SJung-uk Kim * other dealings in products derived from or relating to the Covered Code 78*a88e22b7SJung-uk Kim * without prior written authorization from Intel. 79*a88e22b7SJung-uk Kim * 80*a88e22b7SJung-uk Kim * 4. Disclaimer and Export Compliance 81*a88e22b7SJung-uk Kim * 82*a88e22b7SJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83*a88e22b7SJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84*a88e22b7SJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85*a88e22b7SJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86*a88e22b7SJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87*a88e22b7SJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88*a88e22b7SJung-uk Kim * PARTICULAR PURPOSE. 89*a88e22b7SJung-uk Kim * 90*a88e22b7SJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91*a88e22b7SJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92*a88e22b7SJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93*a88e22b7SJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94*a88e22b7SJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95*a88e22b7SJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96*a88e22b7SJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97*a88e22b7SJung-uk Kim * LIMITED REMEDY. 98*a88e22b7SJung-uk Kim * 99*a88e22b7SJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 100*a88e22b7SJung-uk Kim * software or system incorporating such software without first obtaining any 101*a88e22b7SJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 102*a88e22b7SJung-uk Kim * any other agency or department of the United States Government. In the 103*a88e22b7SJung-uk Kim * event Licensee exports any such software from the United States or 104*a88e22b7SJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 105*a88e22b7SJung-uk Kim * ensure that the distribution and export/re-export of the software is in 106*a88e22b7SJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 107*a88e22b7SJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108*a88e22b7SJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 109*a88e22b7SJung-uk Kim * software, or service, directly or indirectly, to any country for which the 110*a88e22b7SJung-uk Kim * United States government or any agency thereof requires an export license, 111*a88e22b7SJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 112*a88e22b7SJung-uk Kim * such license, approval or letter. 113*a88e22b7SJung-uk Kim * 114*a88e22b7SJung-uk Kim *****************************************************************************/ 115*a88e22b7SJung-uk Kim 116*a88e22b7SJung-uk Kim #define __DTTABLE_C__ 117*a88e22b7SJung-uk Kim 118*a88e22b7SJung-uk Kim /* Compile all complex data tables */ 119*a88e22b7SJung-uk Kim 120*a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 121*a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h> 122*a88e22b7SJung-uk Kim 123*a88e22b7SJung-uk Kim #define _COMPONENT DT_COMPILER 124*a88e22b7SJung-uk Kim ACPI_MODULE_NAME ("dttable") 125*a88e22b7SJung-uk Kim 126*a88e22b7SJung-uk Kim 127*a88e22b7SJung-uk Kim /* TBD: merge these into dmtbinfo.c? */ 128*a88e22b7SJung-uk Kim 129*a88e22b7SJung-uk Kim static ACPI_DMTABLE_INFO TableInfoAsfAddress[] = 130*a88e22b7SJung-uk Kim { 131*a88e22b7SJung-uk Kim {ACPI_DMT_BUFFER, 0, "Addresses", 0}, 132*a88e22b7SJung-uk Kim {ACPI_DMT_EXIT, 0, NULL, 0} 133*a88e22b7SJung-uk Kim }; 134*a88e22b7SJung-uk Kim 135*a88e22b7SJung-uk Kim static ACPI_DMTABLE_INFO TableInfoDmarPciPath[] = 136*a88e22b7SJung-uk Kim { 137*a88e22b7SJung-uk Kim {ACPI_DMT_PCI_PATH, 0, "PCI Path", 0}, 138*a88e22b7SJung-uk Kim {ACPI_DMT_EXIT, 0, NULL, 0} 139*a88e22b7SJung-uk Kim }; 140*a88e22b7SJung-uk Kim 141*a88e22b7SJung-uk Kim 142*a88e22b7SJung-uk Kim /* TBD: move to acmacros.h */ 143*a88e22b7SJung-uk Kim 144*a88e22b7SJung-uk Kim #define ACPI_SUB_PTR(t, a, b) \ 145*a88e22b7SJung-uk Kim ACPI_CAST_PTR (t, (ACPI_CAST_PTR (UINT8, (a)) - (ACPI_SIZE)(b))) 146*a88e22b7SJung-uk Kim 147*a88e22b7SJung-uk Kim 148*a88e22b7SJung-uk Kim /* Local prototypes */ 149*a88e22b7SJung-uk Kim 150*a88e22b7SJung-uk Kim static ACPI_STATUS 151*a88e22b7SJung-uk Kim DtCompileTwoSubtables ( 152*a88e22b7SJung-uk Kim void **List, 153*a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *TableInfo1, 154*a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *TableInfo2); 155*a88e22b7SJung-uk Kim 156*a88e22b7SJung-uk Kim 157*a88e22b7SJung-uk Kim /****************************************************************************** 158*a88e22b7SJung-uk Kim * 159*a88e22b7SJung-uk Kim * FUNCTION: DtCompileTwoSubtables 160*a88e22b7SJung-uk Kim * 161*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 162*a88e22b7SJung-uk Kim * TableInfo1 - Info table 1 163*a88e22b7SJung-uk Kim * TableInfo1 - Info table 2 164*a88e22b7SJung-uk Kim * 165*a88e22b7SJung-uk Kim * RETURN: Status 166*a88e22b7SJung-uk Kim * 167*a88e22b7SJung-uk Kim * DESCRIPTION: Compile tables with a header and one or more same subtables. 168*a88e22b7SJung-uk Kim * Include CPEP, EINJ, ERST, MCFG, MSCT, WDAT 169*a88e22b7SJung-uk Kim * 170*a88e22b7SJung-uk Kim *****************************************************************************/ 171*a88e22b7SJung-uk Kim 172*a88e22b7SJung-uk Kim static ACPI_STATUS 173*a88e22b7SJung-uk Kim DtCompileTwoSubtables ( 174*a88e22b7SJung-uk Kim void **List, 175*a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *TableInfo1, 176*a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *TableInfo2) 177*a88e22b7SJung-uk Kim { 178*a88e22b7SJung-uk Kim ACPI_STATUS Status; 179*a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 180*a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 181*a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 182*a88e22b7SJung-uk Kim 183*a88e22b7SJung-uk Kim 184*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, TableInfo1, &Subtable, TRUE); 185*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 186*a88e22b7SJung-uk Kim { 187*a88e22b7SJung-uk Kim return (Status); 188*a88e22b7SJung-uk Kim } 189*a88e22b7SJung-uk Kim 190*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 191*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 192*a88e22b7SJung-uk Kim 193*a88e22b7SJung-uk Kim while (*PFieldList) 194*a88e22b7SJung-uk Kim { 195*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, TableInfo2, &Subtable, FALSE); 196*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 197*a88e22b7SJung-uk Kim { 198*a88e22b7SJung-uk Kim return (Status); 199*a88e22b7SJung-uk Kim } 200*a88e22b7SJung-uk Kim 201*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 202*a88e22b7SJung-uk Kim } 203*a88e22b7SJung-uk Kim 204*a88e22b7SJung-uk Kim return (AE_OK); 205*a88e22b7SJung-uk Kim } 206*a88e22b7SJung-uk Kim 207*a88e22b7SJung-uk Kim 208*a88e22b7SJung-uk Kim /****************************************************************************** 209*a88e22b7SJung-uk Kim * 210*a88e22b7SJung-uk Kim * FUNCTION: DtCompileFacs 211*a88e22b7SJung-uk Kim * 212*a88e22b7SJung-uk Kim * PARAMETERS: PFieldList - Current field list pointer 213*a88e22b7SJung-uk Kim * 214*a88e22b7SJung-uk Kim * RETURN: Status 215*a88e22b7SJung-uk Kim * 216*a88e22b7SJung-uk Kim * DESCRIPTION: Compile FACS. 217*a88e22b7SJung-uk Kim * 218*a88e22b7SJung-uk Kim *****************************************************************************/ 219*a88e22b7SJung-uk Kim 220*a88e22b7SJung-uk Kim ACPI_STATUS 221*a88e22b7SJung-uk Kim DtCompileFacs ( 222*a88e22b7SJung-uk Kim DT_FIELD **PFieldList) 223*a88e22b7SJung-uk Kim { 224*a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 225*a88e22b7SJung-uk Kim UINT8 *ReservedBuffer; 226*a88e22b7SJung-uk Kim ACPI_STATUS Status; 227*a88e22b7SJung-uk Kim UINT32 ReservedSize; 228*a88e22b7SJung-uk Kim 229*a88e22b7SJung-uk Kim 230*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs, 231*a88e22b7SJung-uk Kim &Gbl_RootTable, TRUE); 232*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 233*a88e22b7SJung-uk Kim { 234*a88e22b7SJung-uk Kim return (Status); 235*a88e22b7SJung-uk Kim } 236*a88e22b7SJung-uk Kim 237*a88e22b7SJung-uk Kim /* Large FACS reserved area at the end of the table */ 238*a88e22b7SJung-uk Kim 239*a88e22b7SJung-uk Kim ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1); 240*a88e22b7SJung-uk Kim ReservedBuffer = UtLocalCalloc (ReservedSize); 241*a88e22b7SJung-uk Kim 242*a88e22b7SJung-uk Kim DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable); 243*a88e22b7SJung-uk Kim 244*a88e22b7SJung-uk Kim ACPI_FREE (ReservedBuffer); 245*a88e22b7SJung-uk Kim DtInsertSubtable (Gbl_RootTable, Subtable); 246*a88e22b7SJung-uk Kim return (AE_OK); 247*a88e22b7SJung-uk Kim } 248*a88e22b7SJung-uk Kim 249*a88e22b7SJung-uk Kim 250*a88e22b7SJung-uk Kim /****************************************************************************** 251*a88e22b7SJung-uk Kim * 252*a88e22b7SJung-uk Kim * FUNCTION: DtCompileRsdp 253*a88e22b7SJung-uk Kim * 254*a88e22b7SJung-uk Kim * PARAMETERS: PFieldList - Current field list pointer 255*a88e22b7SJung-uk Kim * 256*a88e22b7SJung-uk Kim * RETURN: Status 257*a88e22b7SJung-uk Kim * 258*a88e22b7SJung-uk Kim * DESCRIPTION: Compile RSDP. 259*a88e22b7SJung-uk Kim * 260*a88e22b7SJung-uk Kim *****************************************************************************/ 261*a88e22b7SJung-uk Kim 262*a88e22b7SJung-uk Kim ACPI_STATUS 263*a88e22b7SJung-uk Kim DtCompileRsdp ( 264*a88e22b7SJung-uk Kim DT_FIELD **PFieldList) 265*a88e22b7SJung-uk Kim { 266*a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 267*a88e22b7SJung-uk Kim ACPI_TABLE_RSDP *Rsdp; 268*a88e22b7SJung-uk Kim ACPI_RSDP_EXTENSION *RsdpExtension; 269*a88e22b7SJung-uk Kim ACPI_STATUS Status; 270*a88e22b7SJung-uk Kim 271*a88e22b7SJung-uk Kim 272*a88e22b7SJung-uk Kim /* Compile the "common" RSDP (ACPI 1.0) */ 273*a88e22b7SJung-uk Kim 274*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp1, 275*a88e22b7SJung-uk Kim &Gbl_RootTable, TRUE); 276*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 277*a88e22b7SJung-uk Kim { 278*a88e22b7SJung-uk Kim return (Status); 279*a88e22b7SJung-uk Kim } 280*a88e22b7SJung-uk Kim 281*a88e22b7SJung-uk Kim Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Gbl_RootTable->Buffer); 282*a88e22b7SJung-uk Kim DtSetTableChecksum (&Rsdp->Checksum); 283*a88e22b7SJung-uk Kim 284*a88e22b7SJung-uk Kim if (Rsdp->Revision > 0) 285*a88e22b7SJung-uk Kim { 286*a88e22b7SJung-uk Kim /* Compile the "extended" part of the RSDP as a subtable */ 287*a88e22b7SJung-uk Kim 288*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp2, 289*a88e22b7SJung-uk Kim &Subtable, TRUE); 290*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 291*a88e22b7SJung-uk Kim { 292*a88e22b7SJung-uk Kim return (Status); 293*a88e22b7SJung-uk Kim } 294*a88e22b7SJung-uk Kim 295*a88e22b7SJung-uk Kim DtInsertSubtable (Gbl_RootTable, Subtable); 296*a88e22b7SJung-uk Kim 297*a88e22b7SJung-uk Kim /* Set length and extended checksum for entire RSDP */ 298*a88e22b7SJung-uk Kim 299*a88e22b7SJung-uk Kim RsdpExtension = ACPI_CAST_PTR (ACPI_RSDP_EXTENSION, Subtable->Buffer); 300*a88e22b7SJung-uk Kim RsdpExtension->Length = Gbl_RootTable->Length + Subtable->Length; 301*a88e22b7SJung-uk Kim DtSetTableChecksum (&RsdpExtension->ExtendedChecksum); 302*a88e22b7SJung-uk Kim } 303*a88e22b7SJung-uk Kim 304*a88e22b7SJung-uk Kim return (AE_OK); 305*a88e22b7SJung-uk Kim } 306*a88e22b7SJung-uk Kim 307*a88e22b7SJung-uk Kim 308*a88e22b7SJung-uk Kim /****************************************************************************** 309*a88e22b7SJung-uk Kim * 310*a88e22b7SJung-uk Kim * FUNCTION: DtCompileAsf 311*a88e22b7SJung-uk Kim * 312*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 313*a88e22b7SJung-uk Kim * 314*a88e22b7SJung-uk Kim * RETURN: Status 315*a88e22b7SJung-uk Kim * 316*a88e22b7SJung-uk Kim * DESCRIPTION: Compile ASF!. 317*a88e22b7SJung-uk Kim * 318*a88e22b7SJung-uk Kim *****************************************************************************/ 319*a88e22b7SJung-uk Kim 320*a88e22b7SJung-uk Kim ACPI_STATUS 321*a88e22b7SJung-uk Kim DtCompileAsf ( 322*a88e22b7SJung-uk Kim void **List) 323*a88e22b7SJung-uk Kim { 324*a88e22b7SJung-uk Kim ACPI_ASF_INFO *AsfTable; 325*a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 326*a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 327*a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 328*a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *DataInfoTable = NULL; 329*a88e22b7SJung-uk Kim UINT32 DataCount = 0; 330*a88e22b7SJung-uk Kim ACPI_STATUS Status; 331*a88e22b7SJung-uk Kim UINT32 i; 332*a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 333*a88e22b7SJung-uk Kim DT_FIELD *SubtableStart; 334*a88e22b7SJung-uk Kim 335*a88e22b7SJung-uk Kim 336*a88e22b7SJung-uk Kim while (*PFieldList) 337*a88e22b7SJung-uk Kim { 338*a88e22b7SJung-uk Kim SubtableStart = *PFieldList; 339*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr, 340*a88e22b7SJung-uk Kim &Subtable, TRUE); 341*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 342*a88e22b7SJung-uk Kim { 343*a88e22b7SJung-uk Kim return (Status); 344*a88e22b7SJung-uk Kim } 345*a88e22b7SJung-uk Kim 346*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 347*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 348*a88e22b7SJung-uk Kim DtPushSubtable (Subtable); 349*a88e22b7SJung-uk Kim 350*a88e22b7SJung-uk Kim AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer); 351*a88e22b7SJung-uk Kim 352*a88e22b7SJung-uk Kim switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */ 353*a88e22b7SJung-uk Kim { 354*a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_INFO: 355*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoAsf0; 356*a88e22b7SJung-uk Kim break; 357*a88e22b7SJung-uk Kim 358*a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_ALERT: 359*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoAsf1; 360*a88e22b7SJung-uk Kim break; 361*a88e22b7SJung-uk Kim 362*a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_CONTROL: 363*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoAsf2; 364*a88e22b7SJung-uk Kim break; 365*a88e22b7SJung-uk Kim 366*a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_BOOT: 367*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoAsf3; 368*a88e22b7SJung-uk Kim break; 369*a88e22b7SJung-uk Kim 370*a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_ADDRESS: 371*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoAsf4; 372*a88e22b7SJung-uk Kim break; 373*a88e22b7SJung-uk Kim 374*a88e22b7SJung-uk Kim default: 375*a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!"); 376*a88e22b7SJung-uk Kim return (AE_ERROR); 377*a88e22b7SJung-uk Kim } 378*a88e22b7SJung-uk Kim 379*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 380*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 381*a88e22b7SJung-uk Kim { 382*a88e22b7SJung-uk Kim return (Status); 383*a88e22b7SJung-uk Kim } 384*a88e22b7SJung-uk Kim 385*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 386*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 387*a88e22b7SJung-uk Kim 388*a88e22b7SJung-uk Kim switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */ 389*a88e22b7SJung-uk Kim { 390*a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_INFO: 391*a88e22b7SJung-uk Kim DataInfoTable = NULL; 392*a88e22b7SJung-uk Kim break; 393*a88e22b7SJung-uk Kim 394*a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_ALERT: 395*a88e22b7SJung-uk Kim DataInfoTable = AcpiDmTableInfoAsf1a; 396*a88e22b7SJung-uk Kim DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, 397*a88e22b7SJung-uk Kim ACPI_SUB_PTR (UINT8, Subtable->Buffer, 398*a88e22b7SJung-uk Kim sizeof (ACPI_ASF_HEADER)))->Alerts; 399*a88e22b7SJung-uk Kim break; 400*a88e22b7SJung-uk Kim 401*a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_CONTROL: 402*a88e22b7SJung-uk Kim DataInfoTable = AcpiDmTableInfoAsf2a; 403*a88e22b7SJung-uk Kim DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, 404*a88e22b7SJung-uk Kim ACPI_SUB_PTR (UINT8, Subtable->Buffer, 405*a88e22b7SJung-uk Kim sizeof (ACPI_ASF_HEADER)))->Controls; 406*a88e22b7SJung-uk Kim break; 407*a88e22b7SJung-uk Kim 408*a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_BOOT: 409*a88e22b7SJung-uk Kim DataInfoTable = NULL; 410*a88e22b7SJung-uk Kim break; 411*a88e22b7SJung-uk Kim 412*a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_ADDRESS: 413*a88e22b7SJung-uk Kim DataInfoTable = TableInfoAsfAddress; 414*a88e22b7SJung-uk Kim DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, 415*a88e22b7SJung-uk Kim ACPI_SUB_PTR (UINT8, Subtable->Buffer, 416*a88e22b7SJung-uk Kim sizeof (ACPI_ASF_HEADER)))->Devices; 417*a88e22b7SJung-uk Kim break; 418*a88e22b7SJung-uk Kim 419*a88e22b7SJung-uk Kim default: 420*a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!"); 421*a88e22b7SJung-uk Kim return (AE_ERROR); 422*a88e22b7SJung-uk Kim } 423*a88e22b7SJung-uk Kim 424*a88e22b7SJung-uk Kim if (DataInfoTable) 425*a88e22b7SJung-uk Kim { 426*a88e22b7SJung-uk Kim switch (AsfTable->Header.Type & 0x7F) 427*a88e22b7SJung-uk Kim { 428*a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_ADDRESS: 429*a88e22b7SJung-uk Kim 430*a88e22b7SJung-uk Kim while (DataCount > 0) 431*a88e22b7SJung-uk Kim { 432*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, DataInfoTable, 433*a88e22b7SJung-uk Kim &Subtable, TRUE); 434*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 435*a88e22b7SJung-uk Kim { 436*a88e22b7SJung-uk Kim return (Status); 437*a88e22b7SJung-uk Kim } 438*a88e22b7SJung-uk Kim 439*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 440*a88e22b7SJung-uk Kim DataCount = DataCount - Subtable->Length; 441*a88e22b7SJung-uk Kim } 442*a88e22b7SJung-uk Kim break; 443*a88e22b7SJung-uk Kim 444*a88e22b7SJung-uk Kim default: 445*a88e22b7SJung-uk Kim 446*a88e22b7SJung-uk Kim for (i = 0; i < DataCount; i++) 447*a88e22b7SJung-uk Kim { 448*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, DataInfoTable, 449*a88e22b7SJung-uk Kim &Subtable, TRUE); 450*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 451*a88e22b7SJung-uk Kim { 452*a88e22b7SJung-uk Kim return (Status); 453*a88e22b7SJung-uk Kim } 454*a88e22b7SJung-uk Kim 455*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 456*a88e22b7SJung-uk Kim } 457*a88e22b7SJung-uk Kim break; 458*a88e22b7SJung-uk Kim } 459*a88e22b7SJung-uk Kim } 460*a88e22b7SJung-uk Kim 461*a88e22b7SJung-uk Kim DtPopSubtable (); 462*a88e22b7SJung-uk Kim } 463*a88e22b7SJung-uk Kim 464*a88e22b7SJung-uk Kim return (AE_OK); 465*a88e22b7SJung-uk Kim } 466*a88e22b7SJung-uk Kim 467*a88e22b7SJung-uk Kim 468*a88e22b7SJung-uk Kim /****************************************************************************** 469*a88e22b7SJung-uk Kim * 470*a88e22b7SJung-uk Kim * FUNCTION: DtCompileCpep 471*a88e22b7SJung-uk Kim * 472*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 473*a88e22b7SJung-uk Kim * 474*a88e22b7SJung-uk Kim * RETURN: Status 475*a88e22b7SJung-uk Kim * 476*a88e22b7SJung-uk Kim * DESCRIPTION: Compile CPEP. 477*a88e22b7SJung-uk Kim * 478*a88e22b7SJung-uk Kim *****************************************************************************/ 479*a88e22b7SJung-uk Kim 480*a88e22b7SJung-uk Kim ACPI_STATUS 481*a88e22b7SJung-uk Kim DtCompileCpep ( 482*a88e22b7SJung-uk Kim void **List) 483*a88e22b7SJung-uk Kim { 484*a88e22b7SJung-uk Kim ACPI_STATUS Status; 485*a88e22b7SJung-uk Kim 486*a88e22b7SJung-uk Kim 487*a88e22b7SJung-uk Kim Status = DtCompileTwoSubtables (List, 488*a88e22b7SJung-uk Kim AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0); 489*a88e22b7SJung-uk Kim return (Status); 490*a88e22b7SJung-uk Kim } 491*a88e22b7SJung-uk Kim 492*a88e22b7SJung-uk Kim 493*a88e22b7SJung-uk Kim /****************************************************************************** 494*a88e22b7SJung-uk Kim * 495*a88e22b7SJung-uk Kim * FUNCTION: DtCompileDmar 496*a88e22b7SJung-uk Kim * 497*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 498*a88e22b7SJung-uk Kim * 499*a88e22b7SJung-uk Kim * RETURN: Status 500*a88e22b7SJung-uk Kim * 501*a88e22b7SJung-uk Kim * DESCRIPTION: Compile DMAR. 502*a88e22b7SJung-uk Kim * 503*a88e22b7SJung-uk Kim *****************************************************************************/ 504*a88e22b7SJung-uk Kim 505*a88e22b7SJung-uk Kim ACPI_STATUS 506*a88e22b7SJung-uk Kim DtCompileDmar ( 507*a88e22b7SJung-uk Kim void **List) 508*a88e22b7SJung-uk Kim { 509*a88e22b7SJung-uk Kim ACPI_STATUS Status; 510*a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 511*a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 512*a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 513*a88e22b7SJung-uk Kim DT_FIELD *SubtableStart; 514*a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 515*a88e22b7SJung-uk Kim ACPI_DMAR_HEADER *DmarHeader; 516*a88e22b7SJung-uk Kim UINT8 *ReservedBuffer; 517*a88e22b7SJung-uk Kim UINT32 ReservedSize; 518*a88e22b7SJung-uk Kim 519*a88e22b7SJung-uk Kim 520*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable, TRUE); 521*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 522*a88e22b7SJung-uk Kim { 523*a88e22b7SJung-uk Kim return (Status); 524*a88e22b7SJung-uk Kim } 525*a88e22b7SJung-uk Kim 526*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 527*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 528*a88e22b7SJung-uk Kim 529*a88e22b7SJung-uk Kim /* DMAR Reserved area */ 530*a88e22b7SJung-uk Kim 531*a88e22b7SJung-uk Kim ReservedSize = (UINT32) sizeof (((ACPI_TABLE_DMAR *) NULL)->Reserved); 532*a88e22b7SJung-uk Kim ReservedBuffer = UtLocalCalloc (ReservedSize); 533*a88e22b7SJung-uk Kim 534*a88e22b7SJung-uk Kim DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable); 535*a88e22b7SJung-uk Kim 536*a88e22b7SJung-uk Kim ACPI_FREE (ReservedBuffer); 537*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 538*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 539*a88e22b7SJung-uk Kim 540*a88e22b7SJung-uk Kim while (*PFieldList) 541*a88e22b7SJung-uk Kim { 542*a88e22b7SJung-uk Kim /* DMAR Header */ 543*a88e22b7SJung-uk Kim 544*a88e22b7SJung-uk Kim SubtableStart = *PFieldList; 545*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr, 546*a88e22b7SJung-uk Kim &Subtable, TRUE); 547*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 548*a88e22b7SJung-uk Kim { 549*a88e22b7SJung-uk Kim return (Status); 550*a88e22b7SJung-uk Kim } 551*a88e22b7SJung-uk Kim 552*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 553*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 554*a88e22b7SJung-uk Kim DtPushSubtable (Subtable); 555*a88e22b7SJung-uk Kim 556*a88e22b7SJung-uk Kim DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer); 557*a88e22b7SJung-uk Kim 558*a88e22b7SJung-uk Kim switch (DmarHeader->Type) 559*a88e22b7SJung-uk Kim { 560*a88e22b7SJung-uk Kim case ACPI_DMAR_TYPE_HARDWARE_UNIT: 561*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoDmar0; 562*a88e22b7SJung-uk Kim break; 563*a88e22b7SJung-uk Kim case ACPI_DMAR_TYPE_RESERVED_MEMORY: 564*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoDmar1; 565*a88e22b7SJung-uk Kim break; 566*a88e22b7SJung-uk Kim case ACPI_DMAR_TYPE_ATSR: 567*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoDmar2; 568*a88e22b7SJung-uk Kim break; 569*a88e22b7SJung-uk Kim case ACPI_DMAR_HARDWARE_AFFINITY: 570*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoDmar3; 571*a88e22b7SJung-uk Kim break; 572*a88e22b7SJung-uk Kim default: 573*a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR"); 574*a88e22b7SJung-uk Kim return (AE_ERROR); 575*a88e22b7SJung-uk Kim } 576*a88e22b7SJung-uk Kim 577*a88e22b7SJung-uk Kim /* DMAR Subtable */ 578*a88e22b7SJung-uk Kim 579*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 580*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 581*a88e22b7SJung-uk Kim { 582*a88e22b7SJung-uk Kim return (Status); 583*a88e22b7SJung-uk Kim } 584*a88e22b7SJung-uk Kim 585*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 586*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 587*a88e22b7SJung-uk Kim 588*a88e22b7SJung-uk Kim /* Optional Device Scope subtables */ 589*a88e22b7SJung-uk Kim 590*a88e22b7SJung-uk Kim while (*PFieldList) 591*a88e22b7SJung-uk Kim { 592*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope, 593*a88e22b7SJung-uk Kim &Subtable, FALSE); 594*a88e22b7SJung-uk Kim if (Status == AE_NOT_FOUND) 595*a88e22b7SJung-uk Kim { 596*a88e22b7SJung-uk Kim break; 597*a88e22b7SJung-uk Kim } 598*a88e22b7SJung-uk Kim 599*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 600*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 601*a88e22b7SJung-uk Kim DtPushSubtable (Subtable); 602*a88e22b7SJung-uk Kim 603*a88e22b7SJung-uk Kim /* Optional PCI Paths */ 604*a88e22b7SJung-uk Kim 605*a88e22b7SJung-uk Kim while (*PFieldList) 606*a88e22b7SJung-uk Kim { 607*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, TableInfoDmarPciPath, 608*a88e22b7SJung-uk Kim &Subtable, FALSE); 609*a88e22b7SJung-uk Kim if (Status == AE_NOT_FOUND) 610*a88e22b7SJung-uk Kim { 611*a88e22b7SJung-uk Kim DtPopSubtable (); 612*a88e22b7SJung-uk Kim break; 613*a88e22b7SJung-uk Kim } 614*a88e22b7SJung-uk Kim 615*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 616*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 617*a88e22b7SJung-uk Kim } 618*a88e22b7SJung-uk Kim } 619*a88e22b7SJung-uk Kim 620*a88e22b7SJung-uk Kim DtPopSubtable (); 621*a88e22b7SJung-uk Kim } 622*a88e22b7SJung-uk Kim 623*a88e22b7SJung-uk Kim return (AE_OK); 624*a88e22b7SJung-uk Kim } 625*a88e22b7SJung-uk Kim 626*a88e22b7SJung-uk Kim 627*a88e22b7SJung-uk Kim /****************************************************************************** 628*a88e22b7SJung-uk Kim * 629*a88e22b7SJung-uk Kim * FUNCTION: DtCompileEinj 630*a88e22b7SJung-uk Kim * 631*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 632*a88e22b7SJung-uk Kim * 633*a88e22b7SJung-uk Kim * RETURN: Status 634*a88e22b7SJung-uk Kim * 635*a88e22b7SJung-uk Kim * DESCRIPTION: Compile EINJ. 636*a88e22b7SJung-uk Kim * 637*a88e22b7SJung-uk Kim *****************************************************************************/ 638*a88e22b7SJung-uk Kim 639*a88e22b7SJung-uk Kim ACPI_STATUS 640*a88e22b7SJung-uk Kim DtCompileEinj ( 641*a88e22b7SJung-uk Kim void **List) 642*a88e22b7SJung-uk Kim { 643*a88e22b7SJung-uk Kim ACPI_STATUS Status; 644*a88e22b7SJung-uk Kim 645*a88e22b7SJung-uk Kim 646*a88e22b7SJung-uk Kim Status = DtCompileTwoSubtables (List, 647*a88e22b7SJung-uk Kim AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0); 648*a88e22b7SJung-uk Kim return (Status); 649*a88e22b7SJung-uk Kim } 650*a88e22b7SJung-uk Kim 651*a88e22b7SJung-uk Kim 652*a88e22b7SJung-uk Kim /****************************************************************************** 653*a88e22b7SJung-uk Kim * 654*a88e22b7SJung-uk Kim * FUNCTION: DtCompileErst 655*a88e22b7SJung-uk Kim * 656*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 657*a88e22b7SJung-uk Kim * 658*a88e22b7SJung-uk Kim * RETURN: Status 659*a88e22b7SJung-uk Kim * 660*a88e22b7SJung-uk Kim * DESCRIPTION: Compile ERST. 661*a88e22b7SJung-uk Kim * 662*a88e22b7SJung-uk Kim *****************************************************************************/ 663*a88e22b7SJung-uk Kim 664*a88e22b7SJung-uk Kim ACPI_STATUS 665*a88e22b7SJung-uk Kim DtCompileErst ( 666*a88e22b7SJung-uk Kim void **List) 667*a88e22b7SJung-uk Kim { 668*a88e22b7SJung-uk Kim ACPI_STATUS Status; 669*a88e22b7SJung-uk Kim 670*a88e22b7SJung-uk Kim 671*a88e22b7SJung-uk Kim Status = DtCompileTwoSubtables (List, 672*a88e22b7SJung-uk Kim AcpiDmTableInfoErst, AcpiDmTableInfoEinj0); 673*a88e22b7SJung-uk Kim return (Status); 674*a88e22b7SJung-uk Kim } 675*a88e22b7SJung-uk Kim 676*a88e22b7SJung-uk Kim 677*a88e22b7SJung-uk Kim /****************************************************************************** 678*a88e22b7SJung-uk Kim * 679*a88e22b7SJung-uk Kim * FUNCTION: DtCompileFadt 680*a88e22b7SJung-uk Kim * 681*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 682*a88e22b7SJung-uk Kim * 683*a88e22b7SJung-uk Kim * RETURN: Status 684*a88e22b7SJung-uk Kim * 685*a88e22b7SJung-uk Kim * DESCRIPTION: Compile FADT. 686*a88e22b7SJung-uk Kim * 687*a88e22b7SJung-uk Kim *****************************************************************************/ 688*a88e22b7SJung-uk Kim 689*a88e22b7SJung-uk Kim ACPI_STATUS 690*a88e22b7SJung-uk Kim DtCompileFadt ( 691*a88e22b7SJung-uk Kim void **List) 692*a88e22b7SJung-uk Kim { 693*a88e22b7SJung-uk Kim ACPI_STATUS Status; 694*a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 695*a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 696*a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 697*a88e22b7SJung-uk Kim ACPI_TABLE_HEADER *Table; 698*a88e22b7SJung-uk Kim UINT8 Revision; 699*a88e22b7SJung-uk Kim 700*a88e22b7SJung-uk Kim 701*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1, 702*a88e22b7SJung-uk Kim &Subtable, TRUE); 703*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 704*a88e22b7SJung-uk Kim { 705*a88e22b7SJung-uk Kim return (Status); 706*a88e22b7SJung-uk Kim } 707*a88e22b7SJung-uk Kim 708*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 709*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 710*a88e22b7SJung-uk Kim 711*a88e22b7SJung-uk Kim Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); 712*a88e22b7SJung-uk Kim Revision = Table->Revision; 713*a88e22b7SJung-uk Kim 714*a88e22b7SJung-uk Kim if (Revision == 2) 715*a88e22b7SJung-uk Kim { 716*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2, 717*a88e22b7SJung-uk Kim &Subtable, TRUE); 718*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 719*a88e22b7SJung-uk Kim { 720*a88e22b7SJung-uk Kim return (Status); 721*a88e22b7SJung-uk Kim } 722*a88e22b7SJung-uk Kim 723*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 724*a88e22b7SJung-uk Kim } 725*a88e22b7SJung-uk Kim else if (Revision >= 2) 726*a88e22b7SJung-uk Kim { 727*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3, 728*a88e22b7SJung-uk Kim &Subtable, TRUE); 729*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 730*a88e22b7SJung-uk Kim { 731*a88e22b7SJung-uk Kim return (Status); 732*a88e22b7SJung-uk Kim } 733*a88e22b7SJung-uk Kim 734*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 735*a88e22b7SJung-uk Kim } 736*a88e22b7SJung-uk Kim 737*a88e22b7SJung-uk Kim return (AE_OK); 738*a88e22b7SJung-uk Kim } 739*a88e22b7SJung-uk Kim 740*a88e22b7SJung-uk Kim 741*a88e22b7SJung-uk Kim /****************************************************************************** 742*a88e22b7SJung-uk Kim * 743*a88e22b7SJung-uk Kim * FUNCTION: DtCompileHest 744*a88e22b7SJung-uk Kim * 745*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 746*a88e22b7SJung-uk Kim * 747*a88e22b7SJung-uk Kim * RETURN: Status 748*a88e22b7SJung-uk Kim * 749*a88e22b7SJung-uk Kim * DESCRIPTION: Compile HEST. 750*a88e22b7SJung-uk Kim * 751*a88e22b7SJung-uk Kim *****************************************************************************/ 752*a88e22b7SJung-uk Kim 753*a88e22b7SJung-uk Kim ACPI_STATUS 754*a88e22b7SJung-uk Kim DtCompileHest ( 755*a88e22b7SJung-uk Kim void **List) 756*a88e22b7SJung-uk Kim { 757*a88e22b7SJung-uk Kim ACPI_STATUS Status; 758*a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 759*a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 760*a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 761*a88e22b7SJung-uk Kim DT_FIELD *SubtableStart; 762*a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 763*a88e22b7SJung-uk Kim UINT16 Type; 764*a88e22b7SJung-uk Kim UINT32 BankCount; 765*a88e22b7SJung-uk Kim 766*a88e22b7SJung-uk Kim 767*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest, 768*a88e22b7SJung-uk Kim &Subtable, TRUE); 769*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 770*a88e22b7SJung-uk Kim { 771*a88e22b7SJung-uk Kim return (Status); 772*a88e22b7SJung-uk Kim } 773*a88e22b7SJung-uk Kim 774*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 775*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 776*a88e22b7SJung-uk Kim 777*a88e22b7SJung-uk Kim while (*PFieldList) 778*a88e22b7SJung-uk Kim { 779*a88e22b7SJung-uk Kim /* Get subtable type */ 780*a88e22b7SJung-uk Kim 781*a88e22b7SJung-uk Kim SubtableStart = *PFieldList; 782*a88e22b7SJung-uk Kim DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0); 783*a88e22b7SJung-uk Kim 784*a88e22b7SJung-uk Kim switch (Type) 785*a88e22b7SJung-uk Kim { 786*a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_IA32_CHECK: 787*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoHest0; 788*a88e22b7SJung-uk Kim break; 789*a88e22b7SJung-uk Kim 790*a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 791*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoHest1; 792*a88e22b7SJung-uk Kim break; 793*a88e22b7SJung-uk Kim 794*a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_IA32_NMI: 795*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoHest2; 796*a88e22b7SJung-uk Kim break; 797*a88e22b7SJung-uk Kim 798*a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_AER_ROOT_PORT: 799*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoHest6; 800*a88e22b7SJung-uk Kim break; 801*a88e22b7SJung-uk Kim 802*a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_AER_ENDPOINT: 803*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoHest7; 804*a88e22b7SJung-uk Kim break; 805*a88e22b7SJung-uk Kim 806*a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_AER_BRIDGE: 807*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoHest8; 808*a88e22b7SJung-uk Kim break; 809*a88e22b7SJung-uk Kim 810*a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_GENERIC_ERROR: 811*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoHest9; 812*a88e22b7SJung-uk Kim break; 813*a88e22b7SJung-uk Kim 814*a88e22b7SJung-uk Kim default: 815*a88e22b7SJung-uk Kim /* Cannot continue on unknown type */ 816*a88e22b7SJung-uk Kim 817*a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST"); 818*a88e22b7SJung-uk Kim return (AE_ERROR); 819*a88e22b7SJung-uk Kim } 820*a88e22b7SJung-uk Kim 821*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 822*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 823*a88e22b7SJung-uk Kim { 824*a88e22b7SJung-uk Kim return (Status); 825*a88e22b7SJung-uk Kim } 826*a88e22b7SJung-uk Kim 827*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 828*a88e22b7SJung-uk Kim 829*a88e22b7SJung-uk Kim /* 830*a88e22b7SJung-uk Kim * Additional subtable data - IA32 Error Bank(s) 831*a88e22b7SJung-uk Kim */ 832*a88e22b7SJung-uk Kim BankCount = 0; 833*a88e22b7SJung-uk Kim switch (Type) 834*a88e22b7SJung-uk Kim { 835*a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_IA32_CHECK: 836*a88e22b7SJung-uk Kim BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK, 837*a88e22b7SJung-uk Kim Subtable->Buffer))->NumHardwareBanks; 838*a88e22b7SJung-uk Kim break; 839*a88e22b7SJung-uk Kim 840*a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 841*a88e22b7SJung-uk Kim BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED, 842*a88e22b7SJung-uk Kim Subtable->Buffer))->NumHardwareBanks; 843*a88e22b7SJung-uk Kim break; 844*a88e22b7SJung-uk Kim 845*a88e22b7SJung-uk Kim default: 846*a88e22b7SJung-uk Kim break; 847*a88e22b7SJung-uk Kim } 848*a88e22b7SJung-uk Kim 849*a88e22b7SJung-uk Kim while (BankCount) 850*a88e22b7SJung-uk Kim { 851*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank, 852*a88e22b7SJung-uk Kim &Subtable, TRUE); 853*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 854*a88e22b7SJung-uk Kim { 855*a88e22b7SJung-uk Kim return (Status); 856*a88e22b7SJung-uk Kim } 857*a88e22b7SJung-uk Kim 858*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 859*a88e22b7SJung-uk Kim BankCount--; 860*a88e22b7SJung-uk Kim } 861*a88e22b7SJung-uk Kim } 862*a88e22b7SJung-uk Kim 863*a88e22b7SJung-uk Kim return AE_OK; 864*a88e22b7SJung-uk Kim } 865*a88e22b7SJung-uk Kim 866*a88e22b7SJung-uk Kim 867*a88e22b7SJung-uk Kim /****************************************************************************** 868*a88e22b7SJung-uk Kim * 869*a88e22b7SJung-uk Kim * FUNCTION: DtCompileIvrs 870*a88e22b7SJung-uk Kim * 871*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 872*a88e22b7SJung-uk Kim * 873*a88e22b7SJung-uk Kim * RETURN: Status 874*a88e22b7SJung-uk Kim * 875*a88e22b7SJung-uk Kim * DESCRIPTION: Compile IVRS. 876*a88e22b7SJung-uk Kim * 877*a88e22b7SJung-uk Kim *****************************************************************************/ 878*a88e22b7SJung-uk Kim 879*a88e22b7SJung-uk Kim ACPI_STATUS 880*a88e22b7SJung-uk Kim DtCompileIvrs ( 881*a88e22b7SJung-uk Kim void **List) 882*a88e22b7SJung-uk Kim { 883*a88e22b7SJung-uk Kim ACPI_STATUS Status; 884*a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 885*a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 886*a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 887*a88e22b7SJung-uk Kim DT_FIELD *SubtableStart; 888*a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 889*a88e22b7SJung-uk Kim ACPI_IVRS_HEADER *IvrsHeader; 890*a88e22b7SJung-uk Kim UINT8 EntryType; 891*a88e22b7SJung-uk Kim 892*a88e22b7SJung-uk Kim 893*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs, 894*a88e22b7SJung-uk Kim &Subtable, TRUE); 895*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 896*a88e22b7SJung-uk Kim { 897*a88e22b7SJung-uk Kim return (Status); 898*a88e22b7SJung-uk Kim } 899*a88e22b7SJung-uk Kim 900*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 901*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 902*a88e22b7SJung-uk Kim 903*a88e22b7SJung-uk Kim while (*PFieldList) 904*a88e22b7SJung-uk Kim { 905*a88e22b7SJung-uk Kim SubtableStart = *PFieldList; 906*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHdr, 907*a88e22b7SJung-uk Kim &Subtable, TRUE); 908*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 909*a88e22b7SJung-uk Kim { 910*a88e22b7SJung-uk Kim return (Status); 911*a88e22b7SJung-uk Kim } 912*a88e22b7SJung-uk Kim 913*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 914*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 915*a88e22b7SJung-uk Kim DtPushSubtable (Subtable); 916*a88e22b7SJung-uk Kim 917*a88e22b7SJung-uk Kim IvrsHeader = ACPI_CAST_PTR (ACPI_IVRS_HEADER, Subtable->Buffer); 918*a88e22b7SJung-uk Kim 919*a88e22b7SJung-uk Kim switch (IvrsHeader->Type) 920*a88e22b7SJung-uk Kim { 921*a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_HARDWARE: 922*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs0; 923*a88e22b7SJung-uk Kim break; 924*a88e22b7SJung-uk Kim 925*a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_MEMORY1: 926*a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_MEMORY2: 927*a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_MEMORY3: 928*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs1; 929*a88e22b7SJung-uk Kim break; 930*a88e22b7SJung-uk Kim 931*a88e22b7SJung-uk Kim default: 932*a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS"); 933*a88e22b7SJung-uk Kim return (AE_ERROR); 934*a88e22b7SJung-uk Kim } 935*a88e22b7SJung-uk Kim 936*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 937*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 938*a88e22b7SJung-uk Kim { 939*a88e22b7SJung-uk Kim return (Status); 940*a88e22b7SJung-uk Kim } 941*a88e22b7SJung-uk Kim 942*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 943*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 944*a88e22b7SJung-uk Kim 945*a88e22b7SJung-uk Kim if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE) 946*a88e22b7SJung-uk Kim { 947*a88e22b7SJung-uk Kim while (*PFieldList && 948*a88e22b7SJung-uk Kim !ACPI_STRCMP ((*PFieldList)->Name, "Entry Type")) 949*a88e22b7SJung-uk Kim { 950*a88e22b7SJung-uk Kim SubtableStart = *PFieldList; 951*a88e22b7SJung-uk Kim DtCompileInteger (&EntryType, *PFieldList, 1, 0); 952*a88e22b7SJung-uk Kim 953*a88e22b7SJung-uk Kim switch (EntryType) 954*a88e22b7SJung-uk Kim { 955*a88e22b7SJung-uk Kim /* 4-byte device entries */ 956*a88e22b7SJung-uk Kim 957*a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_PAD4: 958*a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_ALL: 959*a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_SELECT: 960*a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_START: 961*a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_END: 962*a88e22b7SJung-uk Kim 963*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs4; 964*a88e22b7SJung-uk Kim break; 965*a88e22b7SJung-uk Kim 966*a88e22b7SJung-uk Kim /* 8-byte entries, type A */ 967*a88e22b7SJung-uk Kim 968*a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_ALIAS_SELECT: 969*a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_ALIAS_START: 970*a88e22b7SJung-uk Kim 971*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs8a; 972*a88e22b7SJung-uk Kim break; 973*a88e22b7SJung-uk Kim 974*a88e22b7SJung-uk Kim /* 8-byte entries, type B */ 975*a88e22b7SJung-uk Kim 976*a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_PAD8: 977*a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_EXT_SELECT: 978*a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_EXT_START: 979*a88e22b7SJung-uk Kim 980*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs8b; 981*a88e22b7SJung-uk Kim break; 982*a88e22b7SJung-uk Kim 983*a88e22b7SJung-uk Kim /* 8-byte entries, type C */ 984*a88e22b7SJung-uk Kim 985*a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_SPECIAL: 986*a88e22b7SJung-uk Kim 987*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs8c; 988*a88e22b7SJung-uk Kim break; 989*a88e22b7SJung-uk Kim 990*a88e22b7SJung-uk Kim default: 991*a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, 992*a88e22b7SJung-uk Kim "IVRS Device Entry"); 993*a88e22b7SJung-uk Kim return (AE_ERROR); 994*a88e22b7SJung-uk Kim } 995*a88e22b7SJung-uk Kim 996*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, 997*a88e22b7SJung-uk Kim &Subtable, TRUE); 998*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 999*a88e22b7SJung-uk Kim { 1000*a88e22b7SJung-uk Kim return (Status); 1001*a88e22b7SJung-uk Kim } 1002*a88e22b7SJung-uk Kim 1003*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1004*a88e22b7SJung-uk Kim } 1005*a88e22b7SJung-uk Kim } 1006*a88e22b7SJung-uk Kim 1007*a88e22b7SJung-uk Kim DtPopSubtable (); 1008*a88e22b7SJung-uk Kim } 1009*a88e22b7SJung-uk Kim 1010*a88e22b7SJung-uk Kim return (AE_OK); 1011*a88e22b7SJung-uk Kim } 1012*a88e22b7SJung-uk Kim 1013*a88e22b7SJung-uk Kim 1014*a88e22b7SJung-uk Kim /****************************************************************************** 1015*a88e22b7SJung-uk Kim * 1016*a88e22b7SJung-uk Kim * FUNCTION: DtCompileMadt 1017*a88e22b7SJung-uk Kim * 1018*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1019*a88e22b7SJung-uk Kim * 1020*a88e22b7SJung-uk Kim * RETURN: Status 1021*a88e22b7SJung-uk Kim * 1022*a88e22b7SJung-uk Kim * DESCRIPTION: Compile MADT. 1023*a88e22b7SJung-uk Kim * 1024*a88e22b7SJung-uk Kim *****************************************************************************/ 1025*a88e22b7SJung-uk Kim 1026*a88e22b7SJung-uk Kim ACPI_STATUS 1027*a88e22b7SJung-uk Kim DtCompileMadt ( 1028*a88e22b7SJung-uk Kim void **List) 1029*a88e22b7SJung-uk Kim { 1030*a88e22b7SJung-uk Kim ACPI_STATUS Status; 1031*a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 1032*a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 1033*a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1034*a88e22b7SJung-uk Kim DT_FIELD *SubtableStart; 1035*a88e22b7SJung-uk Kim ACPI_SUBTABLE_HEADER *MadtHeader; 1036*a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 1037*a88e22b7SJung-uk Kim 1038*a88e22b7SJung-uk Kim 1039*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt, 1040*a88e22b7SJung-uk Kim &Subtable, TRUE); 1041*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 1042*a88e22b7SJung-uk Kim { 1043*a88e22b7SJung-uk Kim return (Status); 1044*a88e22b7SJung-uk Kim } 1045*a88e22b7SJung-uk Kim 1046*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1047*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1048*a88e22b7SJung-uk Kim 1049*a88e22b7SJung-uk Kim while (*PFieldList) 1050*a88e22b7SJung-uk Kim { 1051*a88e22b7SJung-uk Kim SubtableStart = *PFieldList; 1052*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr, 1053*a88e22b7SJung-uk Kim &Subtable, TRUE); 1054*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 1055*a88e22b7SJung-uk Kim { 1056*a88e22b7SJung-uk Kim return (Status); 1057*a88e22b7SJung-uk Kim } 1058*a88e22b7SJung-uk Kim 1059*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1060*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1061*a88e22b7SJung-uk Kim DtPushSubtable (Subtable); 1062*a88e22b7SJung-uk Kim 1063*a88e22b7SJung-uk Kim MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 1064*a88e22b7SJung-uk Kim 1065*a88e22b7SJung-uk Kim switch (MadtHeader->Type) 1066*a88e22b7SJung-uk Kim { 1067*a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_APIC: 1068*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt0; 1069*a88e22b7SJung-uk Kim break; 1070*a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_IO_APIC: 1071*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt1; 1072*a88e22b7SJung-uk Kim break; 1073*a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: 1074*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt2; 1075*a88e22b7SJung-uk Kim break; 1076*a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_NMI_SOURCE: 1077*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt3; 1078*a88e22b7SJung-uk Kim break; 1079*a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_APIC_NMI: 1080*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt4; 1081*a88e22b7SJung-uk Kim break; 1082*a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: 1083*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt5; 1084*a88e22b7SJung-uk Kim break; 1085*a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_IO_SAPIC: 1086*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt6; 1087*a88e22b7SJung-uk Kim break; 1088*a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_SAPIC: 1089*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt7; 1090*a88e22b7SJung-uk Kim break; 1091*a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_INTERRUPT_SOURCE: 1092*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt8; 1093*a88e22b7SJung-uk Kim break; 1094*a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_X2APIC: 1095*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt9; 1096*a88e22b7SJung-uk Kim break; 1097*a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: 1098*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt10; 1099*a88e22b7SJung-uk Kim break; 1100*a88e22b7SJung-uk Kim default: 1101*a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT"); 1102*a88e22b7SJung-uk Kim return (AE_ERROR); 1103*a88e22b7SJung-uk Kim } 1104*a88e22b7SJung-uk Kim 1105*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 1106*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 1107*a88e22b7SJung-uk Kim { 1108*a88e22b7SJung-uk Kim return (Status); 1109*a88e22b7SJung-uk Kim } 1110*a88e22b7SJung-uk Kim 1111*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1112*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1113*a88e22b7SJung-uk Kim DtPopSubtable (); 1114*a88e22b7SJung-uk Kim } 1115*a88e22b7SJung-uk Kim 1116*a88e22b7SJung-uk Kim return (AE_OK); 1117*a88e22b7SJung-uk Kim } 1118*a88e22b7SJung-uk Kim 1119*a88e22b7SJung-uk Kim 1120*a88e22b7SJung-uk Kim /****************************************************************************** 1121*a88e22b7SJung-uk Kim * 1122*a88e22b7SJung-uk Kim * FUNCTION: DtCompileMcfg 1123*a88e22b7SJung-uk Kim * 1124*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1125*a88e22b7SJung-uk Kim * 1126*a88e22b7SJung-uk Kim * RETURN: Status 1127*a88e22b7SJung-uk Kim * 1128*a88e22b7SJung-uk Kim * DESCRIPTION: Compile MCFG. 1129*a88e22b7SJung-uk Kim * 1130*a88e22b7SJung-uk Kim *****************************************************************************/ 1131*a88e22b7SJung-uk Kim 1132*a88e22b7SJung-uk Kim ACPI_STATUS 1133*a88e22b7SJung-uk Kim DtCompileMcfg ( 1134*a88e22b7SJung-uk Kim void **List) 1135*a88e22b7SJung-uk Kim { 1136*a88e22b7SJung-uk Kim ACPI_STATUS Status; 1137*a88e22b7SJung-uk Kim 1138*a88e22b7SJung-uk Kim 1139*a88e22b7SJung-uk Kim Status = DtCompileTwoSubtables (List, 1140*a88e22b7SJung-uk Kim AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0); 1141*a88e22b7SJung-uk Kim return (Status); 1142*a88e22b7SJung-uk Kim } 1143*a88e22b7SJung-uk Kim 1144*a88e22b7SJung-uk Kim 1145*a88e22b7SJung-uk Kim /****************************************************************************** 1146*a88e22b7SJung-uk Kim * 1147*a88e22b7SJung-uk Kim * FUNCTION: DtCompileMsct 1148*a88e22b7SJung-uk Kim * 1149*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1150*a88e22b7SJung-uk Kim * 1151*a88e22b7SJung-uk Kim * RETURN: Status 1152*a88e22b7SJung-uk Kim * 1153*a88e22b7SJung-uk Kim * DESCRIPTION: Compile MSCT. 1154*a88e22b7SJung-uk Kim * 1155*a88e22b7SJung-uk Kim *****************************************************************************/ 1156*a88e22b7SJung-uk Kim 1157*a88e22b7SJung-uk Kim ACPI_STATUS 1158*a88e22b7SJung-uk Kim DtCompileMsct ( 1159*a88e22b7SJung-uk Kim void **List) 1160*a88e22b7SJung-uk Kim { 1161*a88e22b7SJung-uk Kim ACPI_STATUS Status; 1162*a88e22b7SJung-uk Kim 1163*a88e22b7SJung-uk Kim 1164*a88e22b7SJung-uk Kim Status = DtCompileTwoSubtables (List, 1165*a88e22b7SJung-uk Kim AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0); 1166*a88e22b7SJung-uk Kim return (Status); 1167*a88e22b7SJung-uk Kim } 1168*a88e22b7SJung-uk Kim 1169*a88e22b7SJung-uk Kim 1170*a88e22b7SJung-uk Kim /****************************************************************************** 1171*a88e22b7SJung-uk Kim * 1172*a88e22b7SJung-uk Kim * FUNCTION: DtCompileRsdt 1173*a88e22b7SJung-uk Kim * 1174*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1175*a88e22b7SJung-uk Kim * 1176*a88e22b7SJung-uk Kim * RETURN: Status 1177*a88e22b7SJung-uk Kim * 1178*a88e22b7SJung-uk Kim * DESCRIPTION: Compile RSDT. 1179*a88e22b7SJung-uk Kim * 1180*a88e22b7SJung-uk Kim *****************************************************************************/ 1181*a88e22b7SJung-uk Kim 1182*a88e22b7SJung-uk Kim ACPI_STATUS 1183*a88e22b7SJung-uk Kim DtCompileRsdt ( 1184*a88e22b7SJung-uk Kim void **List) 1185*a88e22b7SJung-uk Kim { 1186*a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 1187*a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 1188*a88e22b7SJung-uk Kim DT_FIELD *FieldList = *(DT_FIELD **) List; 1189*a88e22b7SJung-uk Kim UINT32 Address; 1190*a88e22b7SJung-uk Kim 1191*a88e22b7SJung-uk Kim 1192*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1193*a88e22b7SJung-uk Kim 1194*a88e22b7SJung-uk Kim while (FieldList) 1195*a88e22b7SJung-uk Kim { 1196*a88e22b7SJung-uk Kim DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO); 1197*a88e22b7SJung-uk Kim 1198*a88e22b7SJung-uk Kim DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable); 1199*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1200*a88e22b7SJung-uk Kim FieldList = FieldList->Next; 1201*a88e22b7SJung-uk Kim } 1202*a88e22b7SJung-uk Kim 1203*a88e22b7SJung-uk Kim return (AE_OK); 1204*a88e22b7SJung-uk Kim } 1205*a88e22b7SJung-uk Kim 1206*a88e22b7SJung-uk Kim 1207*a88e22b7SJung-uk Kim /****************************************************************************** 1208*a88e22b7SJung-uk Kim * 1209*a88e22b7SJung-uk Kim * FUNCTION: DtCompileSlit 1210*a88e22b7SJung-uk Kim * 1211*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1212*a88e22b7SJung-uk Kim * 1213*a88e22b7SJung-uk Kim * RETURN: Status 1214*a88e22b7SJung-uk Kim * 1215*a88e22b7SJung-uk Kim * DESCRIPTION: Compile SLIT. 1216*a88e22b7SJung-uk Kim * 1217*a88e22b7SJung-uk Kim *****************************************************************************/ 1218*a88e22b7SJung-uk Kim 1219*a88e22b7SJung-uk Kim ACPI_STATUS 1220*a88e22b7SJung-uk Kim DtCompileSlit ( 1221*a88e22b7SJung-uk Kim void **List) 1222*a88e22b7SJung-uk Kim { 1223*a88e22b7SJung-uk Kim ACPI_STATUS Status; 1224*a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 1225*a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 1226*a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1227*a88e22b7SJung-uk Kim DT_FIELD *FieldList; 1228*a88e22b7SJung-uk Kim UINT32 Localities; 1229*a88e22b7SJung-uk Kim UINT8 *LocalityBuffer; 1230*a88e22b7SJung-uk Kim UINT32 RemainingData; 1231*a88e22b7SJung-uk Kim 1232*a88e22b7SJung-uk Kim 1233*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit, 1234*a88e22b7SJung-uk Kim &Subtable, TRUE); 1235*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 1236*a88e22b7SJung-uk Kim { 1237*a88e22b7SJung-uk Kim return (Status); 1238*a88e22b7SJung-uk Kim } 1239*a88e22b7SJung-uk Kim 1240*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1241*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1242*a88e22b7SJung-uk Kim 1243*a88e22b7SJung-uk Kim Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer); 1244*a88e22b7SJung-uk Kim LocalityBuffer = UtLocalCalloc (Localities); 1245*a88e22b7SJung-uk Kim 1246*a88e22b7SJung-uk Kim FieldList = *PFieldList; 1247*a88e22b7SJung-uk Kim while (FieldList) 1248*a88e22b7SJung-uk Kim { 1249*a88e22b7SJung-uk Kim /* Handle multiple-line buffer */ 1250*a88e22b7SJung-uk Kim 1251*a88e22b7SJung-uk Kim RemainingData = Localities; 1252*a88e22b7SJung-uk Kim while (RemainingData && FieldList) 1253*a88e22b7SJung-uk Kim { 1254*a88e22b7SJung-uk Kim RemainingData = DtCompileBuffer ( 1255*a88e22b7SJung-uk Kim LocalityBuffer + (Localities - RemainingData), 1256*a88e22b7SJung-uk Kim FieldList->Value, FieldList, RemainingData); 1257*a88e22b7SJung-uk Kim FieldList = FieldList->Next; 1258*a88e22b7SJung-uk Kim } 1259*a88e22b7SJung-uk Kim 1260*a88e22b7SJung-uk Kim DtCreateSubtable (LocalityBuffer, Localities, &Subtable); 1261*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1262*a88e22b7SJung-uk Kim } 1263*a88e22b7SJung-uk Kim 1264*a88e22b7SJung-uk Kim ACPI_FREE (LocalityBuffer); 1265*a88e22b7SJung-uk Kim return (AE_OK); 1266*a88e22b7SJung-uk Kim } 1267*a88e22b7SJung-uk Kim 1268*a88e22b7SJung-uk Kim 1269*a88e22b7SJung-uk Kim /****************************************************************************** 1270*a88e22b7SJung-uk Kim * 1271*a88e22b7SJung-uk Kim * FUNCTION: DtCompileSrat 1272*a88e22b7SJung-uk Kim * 1273*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1274*a88e22b7SJung-uk Kim * 1275*a88e22b7SJung-uk Kim * RETURN: Status 1276*a88e22b7SJung-uk Kim * 1277*a88e22b7SJung-uk Kim * DESCRIPTION: Compile SRAT. 1278*a88e22b7SJung-uk Kim * 1279*a88e22b7SJung-uk Kim *****************************************************************************/ 1280*a88e22b7SJung-uk Kim 1281*a88e22b7SJung-uk Kim ACPI_STATUS 1282*a88e22b7SJung-uk Kim DtCompileSrat ( 1283*a88e22b7SJung-uk Kim void **List) 1284*a88e22b7SJung-uk Kim { 1285*a88e22b7SJung-uk Kim ACPI_STATUS Status; 1286*a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 1287*a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 1288*a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1289*a88e22b7SJung-uk Kim DT_FIELD *SubtableStart; 1290*a88e22b7SJung-uk Kim ACPI_SUBTABLE_HEADER *SratHeader; 1291*a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 1292*a88e22b7SJung-uk Kim 1293*a88e22b7SJung-uk Kim 1294*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat, 1295*a88e22b7SJung-uk Kim &Subtable, TRUE); 1296*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 1297*a88e22b7SJung-uk Kim { 1298*a88e22b7SJung-uk Kim return (Status); 1299*a88e22b7SJung-uk Kim } 1300*a88e22b7SJung-uk Kim 1301*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1302*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1303*a88e22b7SJung-uk Kim 1304*a88e22b7SJung-uk Kim while (*PFieldList) 1305*a88e22b7SJung-uk Kim { 1306*a88e22b7SJung-uk Kim SubtableStart = *PFieldList; 1307*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr, 1308*a88e22b7SJung-uk Kim &Subtable, TRUE); 1309*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 1310*a88e22b7SJung-uk Kim { 1311*a88e22b7SJung-uk Kim return (Status); 1312*a88e22b7SJung-uk Kim } 1313*a88e22b7SJung-uk Kim 1314*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1315*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1316*a88e22b7SJung-uk Kim DtPushSubtable (Subtable); 1317*a88e22b7SJung-uk Kim 1318*a88e22b7SJung-uk Kim SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 1319*a88e22b7SJung-uk Kim 1320*a88e22b7SJung-uk Kim switch (SratHeader->Type) 1321*a88e22b7SJung-uk Kim { 1322*a88e22b7SJung-uk Kim case ACPI_SRAT_TYPE_CPU_AFFINITY: 1323*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoSrat0; 1324*a88e22b7SJung-uk Kim break; 1325*a88e22b7SJung-uk Kim case ACPI_SRAT_TYPE_MEMORY_AFFINITY: 1326*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoSrat1; 1327*a88e22b7SJung-uk Kim break; 1328*a88e22b7SJung-uk Kim case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: 1329*a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoSrat2; 1330*a88e22b7SJung-uk Kim break; 1331*a88e22b7SJung-uk Kim default: 1332*a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT"); 1333*a88e22b7SJung-uk Kim return (AE_ERROR); 1334*a88e22b7SJung-uk Kim } 1335*a88e22b7SJung-uk Kim 1336*a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 1337*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 1338*a88e22b7SJung-uk Kim { 1339*a88e22b7SJung-uk Kim return (Status); 1340*a88e22b7SJung-uk Kim } 1341*a88e22b7SJung-uk Kim 1342*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1343*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1344*a88e22b7SJung-uk Kim DtPopSubtable (); 1345*a88e22b7SJung-uk Kim } 1346*a88e22b7SJung-uk Kim 1347*a88e22b7SJung-uk Kim return (AE_OK); 1348*a88e22b7SJung-uk Kim } 1349*a88e22b7SJung-uk Kim 1350*a88e22b7SJung-uk Kim 1351*a88e22b7SJung-uk Kim /****************************************************************************** 1352*a88e22b7SJung-uk Kim * 1353*a88e22b7SJung-uk Kim * FUNCTION: DtCompileWdat 1354*a88e22b7SJung-uk Kim * 1355*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1356*a88e22b7SJung-uk Kim * 1357*a88e22b7SJung-uk Kim * RETURN: Status 1358*a88e22b7SJung-uk Kim * 1359*a88e22b7SJung-uk Kim * DESCRIPTION: Compile WDAT. 1360*a88e22b7SJung-uk Kim * 1361*a88e22b7SJung-uk Kim *****************************************************************************/ 1362*a88e22b7SJung-uk Kim 1363*a88e22b7SJung-uk Kim ACPI_STATUS 1364*a88e22b7SJung-uk Kim DtCompileWdat ( 1365*a88e22b7SJung-uk Kim void **List) 1366*a88e22b7SJung-uk Kim { 1367*a88e22b7SJung-uk Kim ACPI_STATUS Status; 1368*a88e22b7SJung-uk Kim 1369*a88e22b7SJung-uk Kim 1370*a88e22b7SJung-uk Kim Status = DtCompileTwoSubtables (List, 1371*a88e22b7SJung-uk Kim AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0); 1372*a88e22b7SJung-uk Kim return (Status); 1373*a88e22b7SJung-uk Kim } 1374*a88e22b7SJung-uk Kim 1375*a88e22b7SJung-uk Kim 1376*a88e22b7SJung-uk Kim /****************************************************************************** 1377*a88e22b7SJung-uk Kim * 1378*a88e22b7SJung-uk Kim * FUNCTION: DtCompileXsdt 1379*a88e22b7SJung-uk Kim * 1380*a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1381*a88e22b7SJung-uk Kim * 1382*a88e22b7SJung-uk Kim * RETURN: Status 1383*a88e22b7SJung-uk Kim * 1384*a88e22b7SJung-uk Kim * DESCRIPTION: Compile XSDT. 1385*a88e22b7SJung-uk Kim * 1386*a88e22b7SJung-uk Kim *****************************************************************************/ 1387*a88e22b7SJung-uk Kim 1388*a88e22b7SJung-uk Kim ACPI_STATUS 1389*a88e22b7SJung-uk Kim DtCompileXsdt ( 1390*a88e22b7SJung-uk Kim void **List) 1391*a88e22b7SJung-uk Kim { 1392*a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 1393*a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 1394*a88e22b7SJung-uk Kim DT_FIELD *FieldList = *(DT_FIELD **) List; 1395*a88e22b7SJung-uk Kim UINT64 Address; 1396*a88e22b7SJung-uk Kim 1397*a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1398*a88e22b7SJung-uk Kim 1399*a88e22b7SJung-uk Kim while (FieldList) 1400*a88e22b7SJung-uk Kim { 1401*a88e22b7SJung-uk Kim DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO); 1402*a88e22b7SJung-uk Kim 1403*a88e22b7SJung-uk Kim DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable); 1404*a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1405*a88e22b7SJung-uk Kim FieldList = FieldList->Next; 1406*a88e22b7SJung-uk Kim } 1407*a88e22b7SJung-uk Kim 1408*a88e22b7SJung-uk Kim return (AE_OK); 1409*a88e22b7SJung-uk Kim } 1410