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