xref: /freebsd/sys/contrib/dev/acpica/compiler/dttable1.c (revision 58308fadece25ae4c12bd2f4dce3d73d9c23be43)
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  *
11*58308fadSJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2025, 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
DtCompileAest(void ** List)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;
20992f570c3SJung-uk Kim     ACPI_AEST_NODE_INTERFACE_HEADER *AestNodeHeader;
21092f570c3SJung-uk Kim     UINT8                   Revision;
21192f570c3SJung-uk Kim     ACPI_TABLE_HEADER       *Header;
21297c0b5abSJung-uk Kim 
21392f570c3SJung-uk Kim     ParentTable = DtPeekSubtable ();
21492f570c3SJung-uk Kim 
21592f570c3SJung-uk Kim     Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
21692f570c3SJung-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:
26792f570c3SJung-uk Kim             switch (Revision)
26892f570c3SJung-uk Kim             {
26992f570c3SJung-uk Kim             case 1:
27097c0b5abSJung-uk Kim                 InfoTable = AcpiDmTableInfoAestVendorError;
27197c0b5abSJung-uk Kim                 break;
27297c0b5abSJung-uk Kim 
27392f570c3SJung-uk Kim             case 2:
27492f570c3SJung-uk Kim                 InfoTable = AcpiDmTableInfoAestVendorV2Error;
27592f570c3SJung-uk Kim                 break;
27692f570c3SJung-uk Kim 
27792f570c3SJung-uk Kim             default:
27892f570c3SJung-uk Kim                 AcpiOsPrintf ("Unknown AEST Vendor Error Revision: %X\n",
27992f570c3SJung-uk Kim                     Revision);
28092f570c3SJung-uk Kim                 return (AE_ERROR);
28192f570c3SJung-uk Kim             }
28292f570c3SJung-uk Kim             break;
28392f570c3SJung-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 
28992f570c3SJung-uk Kim         case ACPI_AEST_PCIE_ERROR_NODE:
29092f570c3SJung-uk Kim 
29192f570c3SJung-uk Kim             InfoTable = AcpiDmTableInfoAestPCIeError;
29292f570c3SJung-uk Kim             break;
29392f570c3SJung-uk Kim 
29492f570c3SJung-uk Kim         case ACPI_AEST_PROXY_ERROR_NODE:
29592f570c3SJung-uk Kim 
29692f570c3SJung-uk Kim             InfoTable = AcpiDmTableInfoAestProxyError;
29792f570c3SJung-uk Kim             break;
29892f570c3SJung-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 */
37492f570c3SJung-uk Kim         if (Revision == 1)
37592f570c3SJung-uk Kim         {
37692f570c3SJung-uk Kim             InfoTable = AcpiDmTableInfoAestXface;
37792f570c3SJung-uk Kim         }
37892f570c3SJung-uk Kim         else if (Revision == 2)
37992f570c3SJung-uk Kim         {
38092f570c3SJung-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 
38792f570c3SJung-uk Kim             ParentTable = DtPeekSubtable ();
38892f570c3SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
38992f570c3SJung-uk Kim 
39092f570c3SJung-uk Kim             Offset += Subtable->Length;
39192f570c3SJung-uk Kim 
39292f570c3SJung-uk Kim             AestNodeHeader = ACPI_CAST_PTR (ACPI_AEST_NODE_INTERFACE_HEADER,
39392f570c3SJung-uk Kim                     Subtable->Buffer);
39492f570c3SJung-uk Kim 
39592f570c3SJung-uk Kim             switch (AestNodeHeader->GroupFormat)
39692f570c3SJung-uk Kim             {
39792f570c3SJung-uk Kim             case ACPI_AEST_NODE_GROUP_FORMAT_4K:
39892f570c3SJung-uk Kim 
39992f570c3SJung-uk Kim                 InfoTable = AcpiDmTableInfoAestXface4k;
40092f570c3SJung-uk Kim                 break;
40192f570c3SJung-uk Kim 
40292f570c3SJung-uk Kim             case ACPI_AEST_NODE_GROUP_FORMAT_16K:
40392f570c3SJung-uk Kim 
40492f570c3SJung-uk Kim                 InfoTable = AcpiDmTableInfoAestXface16k;
40592f570c3SJung-uk Kim                 break;
40692f570c3SJung-uk Kim 
40792f570c3SJung-uk Kim             case ACPI_AEST_NODE_GROUP_FORMAT_64K:
40892f570c3SJung-uk Kim 
40992f570c3SJung-uk Kim                 InfoTable = AcpiDmTableInfoAestXface64k;
41092f570c3SJung-uk Kim                 break;
41192f570c3SJung-uk Kim 
41292f570c3SJung-uk Kim             /* Error case below */
41392f570c3SJung-uk Kim             default:
41492f570c3SJung-uk Kim                 AcpiOsPrintf ("Unknown AEST Interface Group Format: %X\n",
41592f570c3SJung-uk Kim                     AestNodeHeader->GroupFormat);
41692f570c3SJung-uk Kim                 return (AE_ERROR);
41792f570c3SJung-uk Kim             }
41892f570c3SJung-uk Kim         }
41992f570c3SJung-uk Kim         else
42092f570c3SJung-uk Kim         {
42192f570c3SJung-uk Kim            AcpiOsPrintf ("Unknown AEST Revision: %X\n", Revision);
42292f570c3SJung-uk Kim         }
42392f570c3SJung-uk Kim 
42492f570c3SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
42592f570c3SJung-uk Kim         if (ACPI_FAILURE (Status))
42692f570c3SJung-uk Kim         {
42792f570c3SJung-uk Kim             return (Status);
42892f570c3SJung-uk Kim         }
42992f570c3SJung-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         {
44892f570c3SJung-uk Kim             switch (Revision) {
44992f570c3SJung-uk Kim             case 1:
45092f570c3SJung-uk Kim 
45192f570c3SJung-uk Kim                 InfoTable = AcpiDmTableInfoAestXrupt;
45292f570c3SJung-uk Kim                 break;
45392f570c3SJung-uk Kim 
45492f570c3SJung-uk Kim             case 2:
45592f570c3SJung-uk Kim 
45692f570c3SJung-uk Kim                 InfoTable = AcpiDmTableInfoAestXruptV2;
45792f570c3SJung-uk Kim                 break;
45892f570c3SJung-uk Kim 
45992f570c3SJung-uk Kim             default:
46092f570c3SJung-uk Kim                 AcpiOsPrintf ("Unknown AEST Revision: %X\n", Revision);
46192f570c3SJung-uk Kim                 return (AE_ERROR);
46292f570c3SJung-uk Kim             }
46392f570c3SJung-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
DtCompileApmt(void ** List)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
DtCompileAsf(void ** List)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
DtCompileAspt(void ** List)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
DtCompileCdat(void ** List)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
DtCompileCedt(void ** List)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         }
106992f570c3SJung-uk Kim         case ACPI_CEDT_TYPE_CXIMS: {
107092f570c3SJung-uk Kim             unsigned char *dump;
107192f570c3SJung-uk Kim             unsigned int idx, offset, max = 0;
107292f570c3SJung-uk Kim 
107392f570c3SJung-uk Kim             /* Compile table with first "Xor map" */
107492f570c3SJung-uk Kim 
107592f570c3SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt2, &Subtable);
107692f570c3SJung-uk Kim             if (ACPI_FAILURE (Status))
107792f570c3SJung-uk Kim             {
107892f570c3SJung-uk Kim                 return (Status);
107992f570c3SJung-uk Kim             }
108092f570c3SJung-uk Kim 
108192f570c3SJung-uk Kim             /* Look in buffer for the number of Xor maps */
108292f570c3SJung-uk Kim             offset = (unsigned int) ACPI_OFFSET (ACPI_CEDT_CXIMS, NrXormaps);
108392f570c3SJung-uk Kim             dump = (unsigned char *) Subtable->Buffer - 4;     /* place at beginning of cedt2 */
108492f570c3SJung-uk Kim             max = dump[offset];
108592f570c3SJung-uk Kim 
108692f570c3SJung-uk Kim             /* We need to add more XOR maps, so write the current Subtable. */
108792f570c3SJung-uk Kim 
108892f570c3SJung-uk Kim             ParentTable = DtPeekSubtable ();
108992f570c3SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);   /* Insert AcpiDmTableInfoCedt2 table so we can put in */
109092f570c3SJung-uk Kim             DtPushSubtable (Subtable);
109192f570c3SJung-uk Kim 
109292f570c3SJung-uk Kim             /* Now, find out all Xor maps beyond the first. */
109392f570c3SJung-uk Kim 
109492f570c3SJung-uk Kim             for (idx = 1; idx < max; idx++) {
109592f570c3SJung-uk Kim                 ParentTable = DtPeekSubtable ();
109692f570c3SJung-uk Kim 
109792f570c3SJung-uk Kim                 if (*PFieldList)
109892f570c3SJung-uk Kim                 {
109992f570c3SJung-uk Kim                     Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt2_te, &Subtable);
110092f570c3SJung-uk Kim                     if (ACPI_FAILURE (Status))
110192f570c3SJung-uk Kim                     {
110292f570c3SJung-uk Kim                         return (Status);
110392f570c3SJung-uk Kim                     }
110492f570c3SJung-uk Kim                     if (Subtable)
110592f570c3SJung-uk Kim                     {
110692f570c3SJung-uk Kim                         DtInsertSubtable (ParentTable, Subtable);       /* got an Xor map, so insert table. */
110792f570c3SJung-uk Kim                         InsertFlag = 0;
110892f570c3SJung-uk Kim                     }
110992f570c3SJung-uk Kim                 }
111092f570c3SJung-uk Kim             }
111192f570c3SJung-uk Kim 
111292f570c3SJung-uk Kim             DtPopSubtable ();
111392f570c3SJung-uk Kim             ParentTable = DtPeekSubtable ();
111492f570c3SJung-uk Kim             break;
111592f570c3SJung-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
DtCompileCpep(void ** List)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
DtCompileCsrt(void ** List)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
DtCompileDbg2(void ** List)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
DtCompileDmar(void ** List)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 
1510*58308fadSJung-uk Kim         case ACPI_DMAR_TYPE_SIDP:
1511*58308fadSJung-uk Kim 
1512*58308fadSJung-uk Kim             InfoTable = AcpiDmTableInfoDmar6;
1513*58308fadSJung-uk Kim             break;
1514*58308fadSJung-uk Kim 
1515f8146b88SJung-uk Kim         default:
1516f8146b88SJung-uk Kim 
1517f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR");
1518f8146b88SJung-uk Kim             return (AE_ERROR);
1519f8146b88SJung-uk Kim         }
1520f8146b88SJung-uk Kim 
1521f8146b88SJung-uk Kim         /* DMAR Subtable */
1522f8146b88SJung-uk Kim 
1523ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
1524f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
1525f8146b88SJung-uk Kim         {
1526f8146b88SJung-uk Kim             return (Status);
1527f8146b88SJung-uk Kim         }
1528f8146b88SJung-uk Kim 
1529f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
1530f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1531f8146b88SJung-uk Kim 
1532f8146b88SJung-uk Kim         /*
1533f8146b88SJung-uk Kim          * Optional Device Scope subtables
1534f8146b88SJung-uk Kim          */
1535f8146b88SJung-uk Kim         if ((DmarHeader->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
1536f8146b88SJung-uk Kim             (DmarHeader->Type == ACPI_DMAR_TYPE_NAMESPACE))
1537f8146b88SJung-uk Kim         {
1538f8146b88SJung-uk Kim             /* These types do not support device scopes */
1539f8146b88SJung-uk Kim 
1540f8146b88SJung-uk Kim             DtPopSubtable ();
1541f8146b88SJung-uk Kim             continue;
1542f8146b88SJung-uk Kim         }
1543f8146b88SJung-uk Kim 
1544f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
1545f8146b88SJung-uk Kim         DeviceScopeLength = DmarHeader->Length - Subtable->Length -
1546f8146b88SJung-uk Kim             ParentTable->Length;
1547f8146b88SJung-uk Kim         while (DeviceScopeLength)
1548f8146b88SJung-uk Kim         {
1549f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
1550ff879b07SJung-uk Kim                 &Subtable);
1551f8146b88SJung-uk Kim             if (Status == AE_NOT_FOUND)
1552f8146b88SJung-uk Kim             {
1553f8146b88SJung-uk Kim                 break;
1554f8146b88SJung-uk Kim             }
1555f8146b88SJung-uk Kim 
1556f8146b88SJung-uk Kim             ParentTable = DtPeekSubtable ();
1557f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1558f8146b88SJung-uk Kim             DtPushSubtable (Subtable);
1559f8146b88SJung-uk Kim 
1560f8146b88SJung-uk Kim             DmarDeviceScope = ACPI_CAST_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable->Buffer);
1561f8146b88SJung-uk Kim 
1562f8146b88SJung-uk Kim             /* Optional PCI Paths */
1563f8146b88SJung-uk Kim 
1564f8146b88SJung-uk Kim             PciPathLength = DmarDeviceScope->Length - Subtable->Length;
1565f8146b88SJung-uk Kim             while (PciPathLength)
1566f8146b88SJung-uk Kim             {
1567f8146b88SJung-uk Kim                 Status = DtCompileTable (PFieldList, TableInfoDmarPciPath,
1568ff879b07SJung-uk Kim                     &Subtable);
1569f8146b88SJung-uk Kim                 if (Status == AE_NOT_FOUND)
1570f8146b88SJung-uk Kim                 {
1571f8146b88SJung-uk Kim                     DtPopSubtable ();
1572f8146b88SJung-uk Kim                     break;
1573f8146b88SJung-uk Kim                 }
1574f8146b88SJung-uk Kim 
1575f8146b88SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1576f8146b88SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1577f8146b88SJung-uk Kim                 PciPathLength -= Subtable->Length;
1578f8146b88SJung-uk Kim             }
1579f8146b88SJung-uk Kim 
1580f8146b88SJung-uk Kim             DtPopSubtable ();
1581f8146b88SJung-uk Kim             DeviceScopeLength -= DmarDeviceScope->Length;
1582f8146b88SJung-uk Kim         }
1583f8146b88SJung-uk Kim 
1584f8146b88SJung-uk Kim         DtPopSubtable ();
1585f8146b88SJung-uk Kim         DtPopSubtable ();
1586f8146b88SJung-uk Kim     }
1587f8146b88SJung-uk Kim 
1588f8146b88SJung-uk Kim     return (AE_OK);
1589f8146b88SJung-uk Kim }
1590f8146b88SJung-uk Kim 
1591f8146b88SJung-uk Kim 
1592f8146b88SJung-uk Kim /******************************************************************************
1593f8146b88SJung-uk Kim  *
1594f8146b88SJung-uk Kim  * FUNCTION:    DtCompileDrtm
1595f8146b88SJung-uk Kim  *
1596f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1597f8146b88SJung-uk Kim  *
1598f8146b88SJung-uk Kim  * RETURN:      Status
1599f8146b88SJung-uk Kim  *
1600f8146b88SJung-uk Kim  * DESCRIPTION: Compile DRTM.
1601f8146b88SJung-uk Kim  *
1602f8146b88SJung-uk Kim  *****************************************************************************/
1603f8146b88SJung-uk Kim 
1604f8146b88SJung-uk Kim ACPI_STATUS
DtCompileDrtm(void ** List)1605f8146b88SJung-uk Kim DtCompileDrtm (
1606f8146b88SJung-uk Kim     void                    **List)
1607f8146b88SJung-uk Kim {
1608f8146b88SJung-uk Kim     ACPI_STATUS             Status;
1609f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
1610f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1611f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1612f8146b88SJung-uk Kim     UINT32                  Count;
1613f8146b88SJung-uk Kim     /* ACPI_TABLE_DRTM         *Drtm; */
1614f8146b88SJung-uk Kim     ACPI_DRTM_VTABLE_LIST   *DrtmVtl;
1615f8146b88SJung-uk Kim     ACPI_DRTM_RESOURCE_LIST *DrtmRl;
1616f8146b88SJung-uk Kim     /* ACPI_DRTM_DPS_ID        *DrtmDps; */
1617f8146b88SJung-uk Kim 
1618f8146b88SJung-uk Kim 
1619f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
1620f8146b88SJung-uk Kim 
1621f8146b88SJung-uk Kim     /* Compile DRTM header */
1622f8146b88SJung-uk Kim 
1623f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm,
1624ff879b07SJung-uk Kim         &Subtable);
1625f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
1626f8146b88SJung-uk Kim     {
1627f8146b88SJung-uk Kim         return (Status);
1628f8146b88SJung-uk Kim     }
1629f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1630f8146b88SJung-uk Kim 
1631f8146b88SJung-uk Kim     /*
1632cd6518c7SJung-uk Kim      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
1633f8146b88SJung-uk Kim      * should be taken to avoid accessing ACPI_TABLE_HADER fields.
1634f8146b88SJung-uk Kim      */
1635f8146b88SJung-uk Kim #if 0
1636f8146b88SJung-uk Kim     Drtm = ACPI_SUB_PTR (ACPI_TABLE_DRTM,
1637f8146b88SJung-uk Kim         Subtable->Buffer, sizeof (ACPI_TABLE_HEADER));
1638f8146b88SJung-uk Kim #endif
1639f8146b88SJung-uk Kim     /* Compile VTL */
1640f8146b88SJung-uk Kim 
1641f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0,
1642ff879b07SJung-uk Kim         &Subtable);
1643f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
1644f8146b88SJung-uk Kim     {
1645f8146b88SJung-uk Kim         return (Status);
1646f8146b88SJung-uk Kim     }
1647f8146b88SJung-uk Kim 
1648f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1649f8146b88SJung-uk Kim     DrtmVtl = ACPI_CAST_PTR (ACPI_DRTM_VTABLE_LIST, Subtable->Buffer);
1650f8146b88SJung-uk Kim 
1651f8146b88SJung-uk Kim     DtPushSubtable (Subtable);
1652f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
1653f8146b88SJung-uk Kim     Count = 0;
1654f8146b88SJung-uk Kim 
1655f8146b88SJung-uk Kim     while (*PFieldList)
1656f8146b88SJung-uk Kim     {
1657f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0a,
1658ff879b07SJung-uk Kim             &Subtable);
1659f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
1660f8146b88SJung-uk Kim         {
1661f8146b88SJung-uk Kim             return (Status);
1662f8146b88SJung-uk Kim         }
1663f8146b88SJung-uk Kim         if (!Subtable)
1664f8146b88SJung-uk Kim         {
1665f8146b88SJung-uk Kim             break;
1666f8146b88SJung-uk Kim         }
1667f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1668f8146b88SJung-uk Kim         Count++;
1669f8146b88SJung-uk Kim     }
1670f8146b88SJung-uk Kim 
1671f8146b88SJung-uk Kim     DrtmVtl->ValidatedTableCount = Count;
1672f8146b88SJung-uk Kim     DtPopSubtable ();
1673f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
1674f8146b88SJung-uk Kim 
1675f8146b88SJung-uk Kim     /* Compile RL */
1676f8146b88SJung-uk Kim 
1677f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1,
1678ff879b07SJung-uk Kim         &Subtable);
1679f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
1680f8146b88SJung-uk Kim     {
1681f8146b88SJung-uk Kim         return (Status);
1682f8146b88SJung-uk Kim     }
1683f8146b88SJung-uk Kim 
1684f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1685f8146b88SJung-uk Kim     DrtmRl = ACPI_CAST_PTR (ACPI_DRTM_RESOURCE_LIST, Subtable->Buffer);
1686f8146b88SJung-uk Kim 
1687f8146b88SJung-uk Kim     DtPushSubtable (Subtable);
1688f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
1689f8146b88SJung-uk Kim     Count = 0;
1690f8146b88SJung-uk Kim 
1691f8146b88SJung-uk Kim     while (*PFieldList)
1692f8146b88SJung-uk Kim     {
1693f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1a,
1694ff879b07SJung-uk Kim             &Subtable);
1695f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
1696f8146b88SJung-uk Kim         {
1697f8146b88SJung-uk Kim             return (Status);
1698f8146b88SJung-uk Kim         }
1699f8146b88SJung-uk Kim 
1700f8146b88SJung-uk Kim         if (!Subtable)
1701f8146b88SJung-uk Kim         {
1702f8146b88SJung-uk Kim             break;
1703f8146b88SJung-uk Kim         }
1704f8146b88SJung-uk Kim 
1705f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1706f8146b88SJung-uk Kim         Count++;
1707f8146b88SJung-uk Kim     }
1708f8146b88SJung-uk Kim 
1709f8146b88SJung-uk Kim     DrtmRl->ResourceCount = Count;
1710f8146b88SJung-uk Kim     DtPopSubtable ();
1711f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
1712f8146b88SJung-uk Kim 
1713f8146b88SJung-uk Kim     /* Compile DPS */
1714f8146b88SJung-uk Kim 
1715f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm2,
1716ff879b07SJung-uk Kim         &Subtable);
1717f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
1718f8146b88SJung-uk Kim     {
1719f8146b88SJung-uk Kim         return (Status);
1720f8146b88SJung-uk Kim     }
1721f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1722f8146b88SJung-uk Kim     /* DrtmDps = ACPI_CAST_PTR (ACPI_DRTM_DPS_ID, Subtable->Buffer);*/
1723f8146b88SJung-uk Kim 
1724f8146b88SJung-uk Kim 
1725f8146b88SJung-uk Kim     return (AE_OK);
1726f8146b88SJung-uk Kim }
1727f8146b88SJung-uk Kim 
1728f8146b88SJung-uk Kim 
1729f8146b88SJung-uk Kim /******************************************************************************
1730f8146b88SJung-uk Kim  *
1731f8146b88SJung-uk Kim  * FUNCTION:    DtCompileEinj
1732f8146b88SJung-uk Kim  *
1733f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1734f8146b88SJung-uk Kim  *
1735f8146b88SJung-uk Kim  * RETURN:      Status
1736f8146b88SJung-uk Kim  *
1737f8146b88SJung-uk Kim  * DESCRIPTION: Compile EINJ.
1738f8146b88SJung-uk Kim  *
1739f8146b88SJung-uk Kim  *****************************************************************************/
1740f8146b88SJung-uk Kim 
1741f8146b88SJung-uk Kim ACPI_STATUS
DtCompileEinj(void ** List)1742f8146b88SJung-uk Kim DtCompileEinj (
1743f8146b88SJung-uk Kim     void                    **List)
1744f8146b88SJung-uk Kim {
1745f8146b88SJung-uk Kim     ACPI_STATUS             Status;
1746f8146b88SJung-uk Kim 
1747f8146b88SJung-uk Kim 
1748f8146b88SJung-uk Kim     Status = DtCompileTwoSubtables (List,
1749f8146b88SJung-uk Kim         AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0);
1750f8146b88SJung-uk Kim     return (Status);
1751f8146b88SJung-uk Kim }
1752f8146b88SJung-uk Kim 
1753f8146b88SJung-uk Kim 
1754f8146b88SJung-uk Kim /******************************************************************************
1755f8146b88SJung-uk Kim  *
1756*58308fadSJung-uk Kim  * FUNCTION:    DtCompileErdt
1757*58308fadSJung-uk Kim  *
1758*58308fadSJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1759*58308fadSJung-uk Kim  *
1760*58308fadSJung-uk Kim  * RETURN:      Status
1761*58308fadSJung-uk Kim  *
1762*58308fadSJung-uk Kim  * DESCRIPTION: Compile ERST. Complex table with subtables and subsubtables.
1763*58308fadSJung-uk Kim  *
1764*58308fadSJung-uk Kim  *****************************************************************************/
1765*58308fadSJung-uk Kim 
1766*58308fadSJung-uk Kim ACPI_STATUS
DtCompileErdt(void ** List)1767*58308fadSJung-uk Kim DtCompileErdt (
1768*58308fadSJung-uk Kim     void                    **List)
1769*58308fadSJung-uk Kim {
1770*58308fadSJung-uk Kim     ACPI_STATUS             Status;
1771*58308fadSJung-uk Kim     DT_SUBTABLE             *Subtable, *RmddSubtable = NULL, *Subsubtable;
1772*58308fadSJung-uk Kim     DT_SUBTABLE             *ParentTable;
1773*58308fadSJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1774*58308fadSJung-uk Kim     DT_FIELD                *SubtableStart;
1775*58308fadSJung-uk Kim     ACPI_SUBTBL_HDR_16      *ErdtHeader;
1776*58308fadSJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1777*58308fadSJung-uk Kim     ACPI_ERDT_MMRC          *Mmrc;
1778*58308fadSJung-uk Kim     ACPI_ERDT_IBRD          *Ibrd;
1779*58308fadSJung-uk Kim     UINT32                  NumEntries;
1780*58308fadSJung-uk Kim     BOOLEAN                 SeenRmdd = FALSE;
1781*58308fadSJung-uk Kim     BOOLEAN                 SeenSubtable = FALSE;
1782*58308fadSJung-uk Kim 
1783*58308fadSJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoErdt,
1784*58308fadSJung-uk Kim         &Subtable);
1785*58308fadSJung-uk Kim     if (ACPI_FAILURE (Status))
1786*58308fadSJung-uk Kim     {
1787*58308fadSJung-uk Kim         return (Status);
1788*58308fadSJung-uk Kim     }
1789*58308fadSJung-uk Kim 
1790*58308fadSJung-uk Kim     ParentTable = DtPeekSubtable ();
1791*58308fadSJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1792*58308fadSJung-uk Kim 
1793*58308fadSJung-uk Kim     while (*PFieldList)
1794*58308fadSJung-uk Kim     {
1795*58308fadSJung-uk Kim         SubtableStart = *PFieldList;
1796*58308fadSJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoErdtHdr,
1797*58308fadSJung-uk Kim             &Subtable);
1798*58308fadSJung-uk Kim         if (ACPI_FAILURE (Status))
1799*58308fadSJung-uk Kim         {
1800*58308fadSJung-uk Kim             return (Status);
1801*58308fadSJung-uk Kim         }
1802*58308fadSJung-uk Kim 
1803*58308fadSJung-uk Kim         ErdtHeader = ACPI_CAST_PTR (ACPI_SUBTBL_HDR_16, Subtable->Buffer);
1804*58308fadSJung-uk Kim 
1805*58308fadSJung-uk Kim         /* RMDD tables at top level. All others are subtables of preceeding RMDD */
1806*58308fadSJung-uk Kim         if (ErdtHeader->Type == ACPI_ERDT_TYPE_RMDD)
1807*58308fadSJung-uk Kim         {
1808*58308fadSJung-uk Kim             if (SeenRmdd && SeenSubtable)
1809*58308fadSJung-uk Kim                 DtPopSubtable ();
1810*58308fadSJung-uk Kim             SeenRmdd = TRUE;
1811*58308fadSJung-uk Kim             SeenSubtable = FALSE;
1812*58308fadSJung-uk Kim             RmddSubtable = Subtable;
1813*58308fadSJung-uk Kim         }
1814*58308fadSJung-uk Kim         else
1815*58308fadSJung-uk Kim         {
1816*58308fadSJung-uk Kim             if (!SeenSubtable)
1817*58308fadSJung-uk Kim             {
1818*58308fadSJung-uk Kim                 DtPushSubtable (RmddSubtable);
1819*58308fadSJung-uk Kim                 SeenSubtable = TRUE;
1820*58308fadSJung-uk Kim             }
1821*58308fadSJung-uk Kim         }
1822*58308fadSJung-uk Kim 
1823*58308fadSJung-uk Kim         ParentTable = DtPeekSubtable ();
1824*58308fadSJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1825*58308fadSJung-uk Kim         DtPushSubtable (Subtable);
1826*58308fadSJung-uk Kim 
1827*58308fadSJung-uk Kim         switch (ErdtHeader->Type)
1828*58308fadSJung-uk Kim         {
1829*58308fadSJung-uk Kim         case ACPI_ERDT_TYPE_RMDD:
1830*58308fadSJung-uk Kim             InfoTable = AcpiDmTableInfoErdtRmdd;
1831*58308fadSJung-uk Kim             break;
1832*58308fadSJung-uk Kim 
1833*58308fadSJung-uk Kim         case ACPI_ERDT_TYPE_CACD:
1834*58308fadSJung-uk Kim              InfoTable = AcpiDmTableInfoErdtCacd;
1835*58308fadSJung-uk Kim              break;
1836*58308fadSJung-uk Kim 
1837*58308fadSJung-uk Kim         case ACPI_ERDT_TYPE_DACD:
1838*58308fadSJung-uk Kim              InfoTable = AcpiDmTableInfoErdtDacd;
1839*58308fadSJung-uk Kim              break;
1840*58308fadSJung-uk Kim 
1841*58308fadSJung-uk Kim         case ACPI_ERDT_TYPE_CMRC:
1842*58308fadSJung-uk Kim              InfoTable = AcpiDmTableInfoErdtCmrc;
1843*58308fadSJung-uk Kim              break;
1844*58308fadSJung-uk Kim 
1845*58308fadSJung-uk Kim         case ACPI_ERDT_TYPE_MMRC:
1846*58308fadSJung-uk Kim              InfoTable = AcpiDmTableInfoErdtMmrc;
1847*58308fadSJung-uk Kim              break;
1848*58308fadSJung-uk Kim 
1849*58308fadSJung-uk Kim         case ACPI_ERDT_TYPE_MARC:
1850*58308fadSJung-uk Kim              InfoTable = AcpiDmTableInfoErdtMarc;
1851*58308fadSJung-uk Kim              break;
1852*58308fadSJung-uk Kim 
1853*58308fadSJung-uk Kim         case ACPI_ERDT_TYPE_CARC:
1854*58308fadSJung-uk Kim              InfoTable = AcpiDmTableInfoErdtCarc;
1855*58308fadSJung-uk Kim              break;
1856*58308fadSJung-uk Kim 
1857*58308fadSJung-uk Kim         case ACPI_ERDT_TYPE_CMRD:
1858*58308fadSJung-uk Kim              InfoTable = AcpiDmTableInfoErdtCmrd;
1859*58308fadSJung-uk Kim              break;
1860*58308fadSJung-uk Kim 
1861*58308fadSJung-uk Kim         case ACPI_ERDT_TYPE_IBRD:
1862*58308fadSJung-uk Kim              InfoTable = AcpiDmTableInfoErdtIbrd;
1863*58308fadSJung-uk Kim              break;
1864*58308fadSJung-uk Kim 
1865*58308fadSJung-uk Kim         case ACPI_ERDT_TYPE_IBAD:
1866*58308fadSJung-uk Kim              InfoTable = AcpiDmTableInfoErdtIbad;
1867*58308fadSJung-uk Kim              break;
1868*58308fadSJung-uk Kim 
1869*58308fadSJung-uk Kim         case ACPI_ERDT_TYPE_CARD:
1870*58308fadSJung-uk Kim              InfoTable = AcpiDmTableInfoErdtCard;
1871*58308fadSJung-uk Kim              break;
1872*58308fadSJung-uk Kim 
1873*58308fadSJung-uk Kim         default:
1874*58308fadSJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ERDT");
1875*58308fadSJung-uk Kim             return (AE_ERROR);
1876*58308fadSJung-uk Kim         }
1877*58308fadSJung-uk Kim 
1878*58308fadSJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
1879*58308fadSJung-uk Kim         if (ACPI_FAILURE (Status))
1880*58308fadSJung-uk Kim         {
1881*58308fadSJung-uk Kim             return (Status);
1882*58308fadSJung-uk Kim         }
1883*58308fadSJung-uk Kim 
1884*58308fadSJung-uk Kim         ParentTable = DtPeekSubtable ();
1885*58308fadSJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1886*58308fadSJung-uk Kim 
1887*58308fadSJung-uk Kim         /* Some subtable types end with flex arrays */
1888*58308fadSJung-uk Kim 
1889*58308fadSJung-uk Kim         switch (ErdtHeader->Type)
1890*58308fadSJung-uk Kim         {
1891*58308fadSJung-uk Kim         case ACPI_ERDT_TYPE_CACD:
1892*58308fadSJung-uk Kim             while (*PFieldList)
1893*58308fadSJung-uk Kim             {
1894*58308fadSJung-uk Kim                 Status = DtCompileTable (PFieldList,
1895*58308fadSJung-uk Kim                     AcpiDmTableInfoErdtCacdX2apic, &Subtable);
1896*58308fadSJung-uk Kim                 if (ACPI_FAILURE (Status))
1897*58308fadSJung-uk Kim                 {
1898*58308fadSJung-uk Kim                     return (Status);
1899*58308fadSJung-uk Kim                 }
1900*58308fadSJung-uk Kim                 if (!Subtable)
1901*58308fadSJung-uk Kim                 {
1902*58308fadSJung-uk Kim                     break;
1903*58308fadSJung-uk Kim                 }
1904*58308fadSJung-uk Kim 
1905*58308fadSJung-uk Kim                 ParentTable = DtPeekSubtable ();
1906*58308fadSJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1907*58308fadSJung-uk Kim             }
1908*58308fadSJung-uk Kim             break;
1909*58308fadSJung-uk Kim 
1910*58308fadSJung-uk Kim         case ACPI_ERDT_TYPE_DACD:
1911*58308fadSJung-uk Kim             while (*PFieldList)
1912*58308fadSJung-uk Kim             {
1913*58308fadSJung-uk Kim                 Status = DtCompileTable (PFieldList,
1914*58308fadSJung-uk Kim                     AcpiDmTableInfoErdtDacdScope, &Subtable);
1915*58308fadSJung-uk Kim                 if (ACPI_FAILURE (Status))
1916*58308fadSJung-uk Kim                 {
1917*58308fadSJung-uk Kim                     return (Status);
1918*58308fadSJung-uk Kim                 }
1919*58308fadSJung-uk Kim                 if (!Subtable)
1920*58308fadSJung-uk Kim                 {
1921*58308fadSJung-uk Kim                     break;
1922*58308fadSJung-uk Kim                 }
1923*58308fadSJung-uk Kim 
1924*58308fadSJung-uk Kim                 DtPushSubtable (Subtable);
1925*58308fadSJung-uk Kim                 while (*PFieldList)
1926*58308fadSJung-uk Kim                 {
1927*58308fadSJung-uk Kim                     Status = DtCompileTable (PFieldList,
1928*58308fadSJung-uk Kim                         AcpiDmTableInfoErdtDacdPath, &Subsubtable);
1929*58308fadSJung-uk Kim                     if (ACPI_FAILURE (Status))
1930*58308fadSJung-uk Kim                     {
1931*58308fadSJung-uk Kim                         return (Status);
1932*58308fadSJung-uk Kim                     }
1933*58308fadSJung-uk Kim                     if (!Subsubtable)
1934*58308fadSJung-uk Kim                     {
1935*58308fadSJung-uk Kim                         break;
1936*58308fadSJung-uk Kim                     }
1937*58308fadSJung-uk Kim 
1938*58308fadSJung-uk Kim                     ParentTable = DtPeekSubtable ();
1939*58308fadSJung-uk Kim                     DtInsertSubtable (ParentTable, Subsubtable);
1940*58308fadSJung-uk Kim                 }
1941*58308fadSJung-uk Kim                 DtPopSubtable ();
1942*58308fadSJung-uk Kim 
1943*58308fadSJung-uk Kim                 ParentTable = DtPeekSubtable ();
1944*58308fadSJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1945*58308fadSJung-uk Kim             }
1946*58308fadSJung-uk Kim             break;
1947*58308fadSJung-uk Kim 
1948*58308fadSJung-uk Kim         case ACPI_ERDT_TYPE_MMRC:
1949*58308fadSJung-uk Kim             Mmrc = ACPI_SUB_PTR (ACPI_ERDT_MMRC, Subtable->Buffer,
1950*58308fadSJung-uk Kim                 sizeof(ACPI_SUBTBL_HDR_16));
1951*58308fadSJung-uk Kim             NumEntries = 0;
1952*58308fadSJung-uk Kim             while (*PFieldList)
1953*58308fadSJung-uk Kim             {
1954*58308fadSJung-uk Kim                 Status = DtCompileTable (PFieldList,
1955*58308fadSJung-uk Kim                     AcpiDmTableInfoErdtMmrcCorrFactor, &Subtable);
1956*58308fadSJung-uk Kim                 if (ACPI_FAILURE (Status))
1957*58308fadSJung-uk Kim                 {
1958*58308fadSJung-uk Kim                     return (Status);
1959*58308fadSJung-uk Kim                 }
1960*58308fadSJung-uk Kim                 if (!Subtable)
1961*58308fadSJung-uk Kim                 {
1962*58308fadSJung-uk Kim                     break;
1963*58308fadSJung-uk Kim                 }
1964*58308fadSJung-uk Kim 
1965*58308fadSJung-uk Kim                 ParentTable = DtPeekSubtable ();
1966*58308fadSJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1967*58308fadSJung-uk Kim                 NumEntries++;
1968*58308fadSJung-uk Kim             }
1969*58308fadSJung-uk Kim             Mmrc->CorrFactorListLen = NumEntries;
1970*58308fadSJung-uk Kim             break;
1971*58308fadSJung-uk Kim 
1972*58308fadSJung-uk Kim         case ACPI_ERDT_TYPE_IBRD:
1973*58308fadSJung-uk Kim             Ibrd = ACPI_SUB_PTR (ACPI_ERDT_IBRD, Subtable->Buffer,
1974*58308fadSJung-uk Kim                 sizeof(ACPI_SUBTBL_HDR_16));
1975*58308fadSJung-uk Kim             NumEntries = 0;
1976*58308fadSJung-uk Kim             while (*PFieldList)
1977*58308fadSJung-uk Kim             {
1978*58308fadSJung-uk Kim                 Status = DtCompileTable (PFieldList,
1979*58308fadSJung-uk Kim                     AcpiDmTableInfoErdtIbrdCorrFactor, &Subtable);
1980*58308fadSJung-uk Kim                 if (ACPI_FAILURE (Status))
1981*58308fadSJung-uk Kim                 {
1982*58308fadSJung-uk Kim                     return (Status);
1983*58308fadSJung-uk Kim                 }
1984*58308fadSJung-uk Kim                 if (!Subtable)
1985*58308fadSJung-uk Kim                 {
1986*58308fadSJung-uk Kim                     break;
1987*58308fadSJung-uk Kim                 }
1988*58308fadSJung-uk Kim 
1989*58308fadSJung-uk Kim                 ParentTable = DtPeekSubtable ();
1990*58308fadSJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1991*58308fadSJung-uk Kim                 NumEntries++;
1992*58308fadSJung-uk Kim             }
1993*58308fadSJung-uk Kim             Ibrd->CorrFactorListLen = NumEntries;
1994*58308fadSJung-uk Kim             break;
1995*58308fadSJung-uk Kim 
1996*58308fadSJung-uk Kim         default:
1997*58308fadSJung-uk Kim             /* Already checked for valid subtable type above */
1998*58308fadSJung-uk Kim 
1999*58308fadSJung-uk Kim             break;
2000*58308fadSJung-uk Kim         }
2001*58308fadSJung-uk Kim         DtPopSubtable ();
2002*58308fadSJung-uk Kim     }
2003*58308fadSJung-uk Kim 
2004*58308fadSJung-uk Kim     if (SeenSubtable)
2005*58308fadSJung-uk Kim     {
2006*58308fadSJung-uk Kim         DtPopSubtable ();
2007*58308fadSJung-uk Kim     }
2008*58308fadSJung-uk Kim 
2009*58308fadSJung-uk Kim     return (AE_OK);
2010*58308fadSJung-uk Kim }
2011*58308fadSJung-uk Kim 
2012*58308fadSJung-uk Kim 
2013*58308fadSJung-uk Kim /******************************************************************************
2014*58308fadSJung-uk Kim  *
2015f8146b88SJung-uk Kim  * FUNCTION:    DtCompileErst
2016f8146b88SJung-uk Kim  *
2017f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2018f8146b88SJung-uk Kim  *
2019f8146b88SJung-uk Kim  * RETURN:      Status
2020f8146b88SJung-uk Kim  *
2021f8146b88SJung-uk Kim  * DESCRIPTION: Compile ERST.
2022f8146b88SJung-uk Kim  *
2023f8146b88SJung-uk Kim  *****************************************************************************/
2024f8146b88SJung-uk Kim 
2025f8146b88SJung-uk Kim ACPI_STATUS
DtCompileErst(void ** List)2026f8146b88SJung-uk Kim DtCompileErst (
2027f8146b88SJung-uk Kim     void                    **List)
2028f8146b88SJung-uk Kim {
2029f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2030f8146b88SJung-uk Kim 
2031f8146b88SJung-uk Kim 
2032f8146b88SJung-uk Kim     Status = DtCompileTwoSubtables (List,
2033f8146b88SJung-uk Kim         AcpiDmTableInfoErst, AcpiDmTableInfoEinj0);
2034f8146b88SJung-uk Kim     return (Status);
2035f8146b88SJung-uk Kim }
2036f8146b88SJung-uk Kim 
2037f8146b88SJung-uk Kim 
2038f8146b88SJung-uk Kim /******************************************************************************
2039f8146b88SJung-uk Kim  *
2040f8146b88SJung-uk Kim  * FUNCTION:    DtCompileGtdt
2041f8146b88SJung-uk Kim  *
2042f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2043f8146b88SJung-uk Kim  *
2044f8146b88SJung-uk Kim  * RETURN:      Status
2045f8146b88SJung-uk Kim  *
2046f8146b88SJung-uk Kim  * DESCRIPTION: Compile GTDT.
2047f8146b88SJung-uk Kim  *
2048f8146b88SJung-uk Kim  *****************************************************************************/
2049f8146b88SJung-uk Kim 
2050f8146b88SJung-uk Kim ACPI_STATUS
DtCompileGtdt(void ** List)2051f8146b88SJung-uk Kim DtCompileGtdt (
2052f8146b88SJung-uk Kim     void                    **List)
2053f8146b88SJung-uk Kim {
2054f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2055f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2056f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2057f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2058f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
2059f8146b88SJung-uk Kim     ACPI_SUBTABLE_HEADER    *GtdtHeader;
2060f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
2061f8146b88SJung-uk Kim     UINT32                  GtCount;
2062cd6518c7SJung-uk Kim     ACPI_TABLE_HEADER       *Header;
2063f8146b88SJung-uk Kim 
2064f8146b88SJung-uk Kim 
2065cd6518c7SJung-uk Kim     ParentTable = DtPeekSubtable ();
2066cd6518c7SJung-uk Kim 
2067cd6518c7SJung-uk Kim     Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
2068cd6518c7SJung-uk Kim 
2069cd6518c7SJung-uk Kim     /* Compile the main table */
2070cd6518c7SJung-uk Kim 
2071f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt,
2072ff879b07SJung-uk Kim         &Subtable);
2073f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2074f8146b88SJung-uk Kim     {
2075f8146b88SJung-uk Kim         return (Status);
2076f8146b88SJung-uk Kim     }
2077f8146b88SJung-uk Kim 
2078cd6518c7SJung-uk Kim     /* GTDT revision 3 later contains 2 extra fields before subtables */
2079cd6518c7SJung-uk Kim 
2080cd6518c7SJung-uk Kim     if (Header->Revision > 2)
2081cd6518c7SJung-uk Kim     {
2082cd6518c7SJung-uk Kim         ParentTable = DtPeekSubtable ();
2083cd6518c7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2084cd6518c7SJung-uk Kim 
2085cd6518c7SJung-uk Kim         Status = DtCompileTable (PFieldList,
2086cd6518c7SJung-uk Kim             AcpiDmTableInfoGtdtEl2, &Subtable);
2087cd6518c7SJung-uk Kim         if (ACPI_FAILURE (Status))
2088cd6518c7SJung-uk Kim         {
2089cd6518c7SJung-uk Kim             return (Status);
2090cd6518c7SJung-uk Kim         }
2091cd6518c7SJung-uk Kim     }
2092cd6518c7SJung-uk Kim 
2093f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2094f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2095f8146b88SJung-uk Kim 
2096f8146b88SJung-uk Kim     while (*PFieldList)
2097f8146b88SJung-uk Kim     {
2098f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
2099f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdtHdr,
2100ff879b07SJung-uk Kim             &Subtable);
2101f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2102f8146b88SJung-uk Kim         {
2103f8146b88SJung-uk Kim             return (Status);
2104f8146b88SJung-uk Kim         }
2105f8146b88SJung-uk Kim 
2106f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2107f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2108f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
2109f8146b88SJung-uk Kim 
2110f8146b88SJung-uk Kim         GtdtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
2111f8146b88SJung-uk Kim 
2112f8146b88SJung-uk Kim         switch (GtdtHeader->Type)
2113f8146b88SJung-uk Kim         {
2114f8146b88SJung-uk Kim         case ACPI_GTDT_TYPE_TIMER_BLOCK:
2115f8146b88SJung-uk Kim 
2116f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoGtdt0;
2117f8146b88SJung-uk Kim             break;
2118f8146b88SJung-uk Kim 
2119f8146b88SJung-uk Kim         case ACPI_GTDT_TYPE_WATCHDOG:
2120f8146b88SJung-uk Kim 
2121f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoGtdt1;
2122f8146b88SJung-uk Kim             break;
2123f8146b88SJung-uk Kim 
2124f8146b88SJung-uk Kim         default:
2125f8146b88SJung-uk Kim 
2126f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "GTDT");
2127f8146b88SJung-uk Kim             return (AE_ERROR);
2128f8146b88SJung-uk Kim         }
2129f8146b88SJung-uk Kim 
2130ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &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         ParentTable = DtPeekSubtable ();
2137f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2138f8146b88SJung-uk Kim 
2139f8146b88SJung-uk Kim         /*
2140f8146b88SJung-uk Kim          * Additional GT block subtable data
2141f8146b88SJung-uk Kim          */
2142f8146b88SJung-uk Kim 
2143f8146b88SJung-uk Kim         switch (GtdtHeader->Type)
2144f8146b88SJung-uk Kim         {
2145f8146b88SJung-uk Kim         case ACPI_GTDT_TYPE_TIMER_BLOCK:
2146f8146b88SJung-uk Kim 
2147f8146b88SJung-uk Kim             DtPushSubtable (Subtable);
2148f8146b88SJung-uk Kim             ParentTable = DtPeekSubtable ();
2149f8146b88SJung-uk Kim 
2150f8146b88SJung-uk Kim             GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
2151f8146b88SJung-uk Kim                 Subtable->Buffer - sizeof(ACPI_GTDT_HEADER)))->TimerCount;
2152f8146b88SJung-uk Kim 
2153f8146b88SJung-uk Kim             while (GtCount)
2154f8146b88SJung-uk Kim             {
2155f8146b88SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt0a,
2156ff879b07SJung-uk Kim                     &Subtable);
2157f8146b88SJung-uk Kim                 if (ACPI_FAILURE (Status))
2158f8146b88SJung-uk Kim                 {
2159f8146b88SJung-uk Kim                     return (Status);
2160f8146b88SJung-uk Kim                 }
2161f8146b88SJung-uk Kim 
2162f8146b88SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2163f8146b88SJung-uk Kim                 GtCount--;
2164f8146b88SJung-uk Kim             }
2165f8146b88SJung-uk Kim 
2166f8146b88SJung-uk Kim             DtPopSubtable ();
2167f8146b88SJung-uk Kim             break;
2168f8146b88SJung-uk Kim 
2169f8146b88SJung-uk Kim         default:
2170f8146b88SJung-uk Kim 
2171f8146b88SJung-uk Kim             break;
2172f8146b88SJung-uk Kim         }
2173f8146b88SJung-uk Kim 
2174f8146b88SJung-uk Kim         DtPopSubtable ();
2175f8146b88SJung-uk Kim     }
2176f8146b88SJung-uk Kim 
2177f8146b88SJung-uk Kim     return (AE_OK);
2178f8146b88SJung-uk Kim }
2179f8146b88SJung-uk Kim 
2180f8146b88SJung-uk Kim 
2181f8146b88SJung-uk Kim /******************************************************************************
2182f8146b88SJung-uk Kim  *
2183f8146b88SJung-uk Kim  * FUNCTION:    DtCompileFpdt
2184f8146b88SJung-uk Kim  *
2185f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2186f8146b88SJung-uk Kim  *
2187f8146b88SJung-uk Kim  * RETURN:      Status
2188f8146b88SJung-uk Kim  *
2189f8146b88SJung-uk Kim  * DESCRIPTION: Compile FPDT.
2190f8146b88SJung-uk Kim  *
2191f8146b88SJung-uk Kim  *****************************************************************************/
2192f8146b88SJung-uk Kim 
2193f8146b88SJung-uk Kim ACPI_STATUS
DtCompileFpdt(void ** List)2194f8146b88SJung-uk Kim DtCompileFpdt (
2195f8146b88SJung-uk Kim     void                    **List)
2196f8146b88SJung-uk Kim {
2197f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2198f8146b88SJung-uk Kim     ACPI_FPDT_HEADER        *FpdtHeader;
2199f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2200f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2201f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
2202f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2203f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
2204f8146b88SJung-uk Kim 
2205f8146b88SJung-uk Kim 
2206f8146b88SJung-uk Kim     while (*PFieldList)
2207f8146b88SJung-uk Kim     {
2208f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
2209f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr,
2210ff879b07SJung-uk Kim             &Subtable);
2211f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2212f8146b88SJung-uk Kim         {
2213f8146b88SJung-uk Kim             return (Status);
2214f8146b88SJung-uk Kim         }
2215f8146b88SJung-uk Kim 
2216f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2217f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2218f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
2219f8146b88SJung-uk Kim 
2220f8146b88SJung-uk Kim         FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
2221f8146b88SJung-uk Kim 
2222f8146b88SJung-uk Kim         switch (FpdtHeader->Type)
2223f8146b88SJung-uk Kim         {
2224f8146b88SJung-uk Kim         case ACPI_FPDT_TYPE_BOOT:
2225f8146b88SJung-uk Kim 
2226f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoFpdt0;
2227f8146b88SJung-uk Kim             break;
2228f8146b88SJung-uk Kim 
2229f8146b88SJung-uk Kim         case ACPI_FPDT_TYPE_S3PERF:
2230f8146b88SJung-uk Kim 
2231f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoFpdt1;
2232f8146b88SJung-uk Kim             break;
2233f8146b88SJung-uk Kim 
2234f8146b88SJung-uk Kim         default:
2235f8146b88SJung-uk Kim 
2236f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT");
2237f8146b88SJung-uk Kim             return (AE_ERROR);
2238f8146b88SJung-uk Kim             break;
2239f8146b88SJung-uk Kim         }
2240f8146b88SJung-uk Kim 
2241ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
2242f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2243f8146b88SJung-uk Kim         {
2244f8146b88SJung-uk Kim             return (Status);
2245f8146b88SJung-uk Kim         }
2246f8146b88SJung-uk Kim 
2247f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2248f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2249f8146b88SJung-uk Kim         DtPopSubtable ();
2250f8146b88SJung-uk Kim     }
2251f8146b88SJung-uk Kim 
2252f8146b88SJung-uk Kim     return (AE_OK);
2253f8146b88SJung-uk Kim }
2254f8146b88SJung-uk Kim 
2255f8146b88SJung-uk Kim 
2256f8146b88SJung-uk Kim /******************************************************************************
2257f8146b88SJung-uk Kim  *
2258f8146b88SJung-uk Kim  * FUNCTION:    DtCompileHest
2259f8146b88SJung-uk Kim  *
2260f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2261f8146b88SJung-uk Kim  *
2262f8146b88SJung-uk Kim  * RETURN:      Status
2263f8146b88SJung-uk Kim  *
2264f8146b88SJung-uk Kim  * DESCRIPTION: Compile HEST.
2265f8146b88SJung-uk Kim  *
2266f8146b88SJung-uk Kim  *****************************************************************************/
2267f8146b88SJung-uk Kim 
2268f8146b88SJung-uk Kim ACPI_STATUS
DtCompileHest(void ** List)2269f8146b88SJung-uk Kim DtCompileHest (
2270f8146b88SJung-uk Kim     void                    **List)
2271f8146b88SJung-uk Kim {
2272f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2273f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2274f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2275f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2276f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
2277f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
2278f8146b88SJung-uk Kim     UINT16                  Type;
2279f8146b88SJung-uk Kim     UINT32                  BankCount;
2280f8146b88SJung-uk Kim 
2281f8146b88SJung-uk Kim 
2282f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest,
2283ff879b07SJung-uk Kim         &Subtable);
2284f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2285f8146b88SJung-uk Kim     {
2286f8146b88SJung-uk Kim         return (Status);
2287f8146b88SJung-uk Kim     }
2288f8146b88SJung-uk Kim 
2289f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2290f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2291f8146b88SJung-uk Kim 
2292f8146b88SJung-uk Kim     while (*PFieldList)
2293f8146b88SJung-uk Kim     {
2294f8146b88SJung-uk Kim         /* Get subtable type */
2295f8146b88SJung-uk Kim 
2296f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
2297f8146b88SJung-uk Kim         DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
2298f8146b88SJung-uk Kim 
2299f8146b88SJung-uk Kim         switch (Type)
2300f8146b88SJung-uk Kim         {
2301f8146b88SJung-uk Kim         case ACPI_HEST_TYPE_IA32_CHECK:
2302f8146b88SJung-uk Kim 
2303f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoHest0;
2304f8146b88SJung-uk Kim             break;
2305f8146b88SJung-uk Kim 
2306f8146b88SJung-uk Kim         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
2307f8146b88SJung-uk Kim 
2308f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoHest1;
2309f8146b88SJung-uk Kim             break;
2310f8146b88SJung-uk Kim 
2311f8146b88SJung-uk Kim         case ACPI_HEST_TYPE_IA32_NMI:
2312f8146b88SJung-uk Kim 
2313f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoHest2;
2314f8146b88SJung-uk Kim             break;
2315f8146b88SJung-uk Kim 
2316f8146b88SJung-uk Kim         case ACPI_HEST_TYPE_AER_ROOT_PORT:
2317f8146b88SJung-uk Kim 
2318f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoHest6;
2319f8146b88SJung-uk Kim             break;
2320f8146b88SJung-uk Kim 
2321f8146b88SJung-uk Kim         case ACPI_HEST_TYPE_AER_ENDPOINT:
2322f8146b88SJung-uk Kim 
2323f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoHest7;
2324f8146b88SJung-uk Kim             break;
2325f8146b88SJung-uk Kim 
2326f8146b88SJung-uk Kim         case ACPI_HEST_TYPE_AER_BRIDGE:
2327f8146b88SJung-uk Kim 
2328f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoHest8;
2329f8146b88SJung-uk Kim             break;
2330f8146b88SJung-uk Kim 
2331f8146b88SJung-uk Kim         case ACPI_HEST_TYPE_GENERIC_ERROR:
2332f8146b88SJung-uk Kim 
2333f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoHest9;
2334f8146b88SJung-uk Kim             break;
2335f8146b88SJung-uk Kim 
2336af051161SJung-uk Kim         case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
2337af051161SJung-uk Kim 
2338af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoHest10;
2339af051161SJung-uk Kim             break;
2340af051161SJung-uk Kim 
2341af051161SJung-uk Kim         case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
2342af051161SJung-uk Kim 
2343af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoHest11;
2344af051161SJung-uk Kim             break;
2345af051161SJung-uk Kim 
2346f8146b88SJung-uk Kim         default:
2347f8146b88SJung-uk Kim 
2348f8146b88SJung-uk Kim             /* Cannot continue on unknown type */
2349f8146b88SJung-uk Kim 
2350f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST");
2351f8146b88SJung-uk Kim             return (AE_ERROR);
2352f8146b88SJung-uk Kim         }
2353f8146b88SJung-uk Kim 
2354ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
2355f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2356f8146b88SJung-uk Kim         {
2357f8146b88SJung-uk Kim             return (Status);
2358f8146b88SJung-uk Kim         }
2359f8146b88SJung-uk Kim 
2360f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2361f8146b88SJung-uk Kim 
2362f8146b88SJung-uk Kim         /*
2363f8146b88SJung-uk Kim          * Additional subtable data - IA32 Error Bank(s)
2364f8146b88SJung-uk Kim          */
2365f8146b88SJung-uk Kim         BankCount = 0;
2366f8146b88SJung-uk Kim         switch (Type)
2367f8146b88SJung-uk Kim         {
2368f8146b88SJung-uk Kim         case ACPI_HEST_TYPE_IA32_CHECK:
2369f8146b88SJung-uk Kim 
2370f8146b88SJung-uk Kim             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
2371f8146b88SJung-uk Kim                 Subtable->Buffer))->NumHardwareBanks;
2372f8146b88SJung-uk Kim             break;
2373f8146b88SJung-uk Kim 
2374f8146b88SJung-uk Kim         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
2375f8146b88SJung-uk Kim 
2376f8146b88SJung-uk Kim             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
2377f8146b88SJung-uk Kim                 Subtable->Buffer))->NumHardwareBanks;
2378f8146b88SJung-uk Kim             break;
2379f8146b88SJung-uk Kim 
2380af051161SJung-uk Kim         case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
2381af051161SJung-uk Kim 
2382af051161SJung-uk Kim             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
2383af051161SJung-uk Kim                 Subtable->Buffer))->NumHardwareBanks;
2384af051161SJung-uk Kim             break;
2385af051161SJung-uk Kim 
2386f8146b88SJung-uk Kim         default:
2387f8146b88SJung-uk Kim 
2388f8146b88SJung-uk Kim             break;
2389f8146b88SJung-uk Kim         }
2390f8146b88SJung-uk Kim 
2391f8146b88SJung-uk Kim         while (BankCount)
2392f8146b88SJung-uk Kim         {
2393f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank,
2394ff879b07SJung-uk Kim                 &Subtable);
2395f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
2396f8146b88SJung-uk Kim             {
2397f8146b88SJung-uk Kim                 return (Status);
2398f8146b88SJung-uk Kim             }
2399f8146b88SJung-uk Kim 
2400f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
2401f8146b88SJung-uk Kim             BankCount--;
2402f8146b88SJung-uk Kim         }
2403f8146b88SJung-uk Kim     }
2404f8146b88SJung-uk Kim 
2405f8146b88SJung-uk Kim     return (AE_OK);
2406f8146b88SJung-uk Kim }
2407f8146b88SJung-uk Kim 
2408f8146b88SJung-uk Kim 
2409f8146b88SJung-uk Kim /******************************************************************************
2410f8146b88SJung-uk Kim  *
2411af051161SJung-uk Kim  * FUNCTION:    DtCompileHmat
2412af051161SJung-uk Kim  *
2413af051161SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2414af051161SJung-uk Kim  *
2415af051161SJung-uk Kim  * RETURN:      Status
2416af051161SJung-uk Kim  *
2417af051161SJung-uk Kim  * DESCRIPTION: Compile HMAT.
2418af051161SJung-uk Kim  *
2419af051161SJung-uk Kim  *****************************************************************************/
2420af051161SJung-uk Kim 
2421af051161SJung-uk Kim ACPI_STATUS
DtCompileHmat(void ** List)2422af051161SJung-uk Kim DtCompileHmat (
2423af051161SJung-uk Kim     void                    **List)
2424af051161SJung-uk Kim {
2425af051161SJung-uk Kim     ACPI_STATUS             Status;
2426af051161SJung-uk Kim     DT_SUBTABLE             *Subtable;
2427af051161SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2428af051161SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2429af051161SJung-uk Kim     DT_FIELD                *SubtableStart;
2430af051161SJung-uk Kim     DT_FIELD                *EntryStart;
2431af051161SJung-uk Kim     ACPI_HMAT_STRUCTURE     *HmatStruct;
2432af051161SJung-uk Kim     ACPI_HMAT_LOCALITY      *HmatLocality;
2433af051161SJung-uk Kim     ACPI_HMAT_CACHE         *HmatCache;
2434af051161SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
2435af051161SJung-uk Kim     UINT32                  IntPDNumber;
2436af051161SJung-uk Kim     UINT32                  TgtPDNumber;
2437af051161SJung-uk Kim     UINT64                  EntryNumber;
2438af051161SJung-uk Kim     UINT16                  SMBIOSHandleNumber;
2439af051161SJung-uk Kim 
2440af051161SJung-uk Kim 
2441af051161SJung-uk Kim     ParentTable = DtPeekSubtable ();
2442af051161SJung-uk Kim 
2443af051161SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmat,
2444ff879b07SJung-uk Kim         &Subtable);
2445af051161SJung-uk Kim     if (ACPI_FAILURE (Status))
2446af051161SJung-uk Kim     {
2447af051161SJung-uk Kim         return (Status);
2448af051161SJung-uk Kim     }
2449af051161SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2450af051161SJung-uk Kim 
2451af051161SJung-uk Kim     while (*PFieldList)
2452af051161SJung-uk Kim     {
2453af051161SJung-uk Kim         /* Compile HMAT structure header */
2454af051161SJung-uk Kim 
2455af051161SJung-uk Kim         SubtableStart = *PFieldList;
2456af051161SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmatHdr,
2457ff879b07SJung-uk Kim             &Subtable);
2458af051161SJung-uk Kim         if (ACPI_FAILURE (Status))
2459af051161SJung-uk Kim         {
2460af051161SJung-uk Kim             return (Status);
2461af051161SJung-uk Kim         }
2462af051161SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2463af051161SJung-uk Kim 
2464af051161SJung-uk Kim         HmatStruct = ACPI_CAST_PTR (ACPI_HMAT_STRUCTURE, Subtable->Buffer);
2465af051161SJung-uk Kim         HmatStruct->Length = Subtable->Length;
2466af051161SJung-uk Kim 
2467af051161SJung-uk Kim         /* Compile HMAT structure body */
2468af051161SJung-uk Kim 
2469af051161SJung-uk Kim         switch (HmatStruct->Type)
2470af051161SJung-uk Kim         {
2471af051161SJung-uk Kim         case ACPI_HMAT_TYPE_ADDRESS_RANGE:
2472af051161SJung-uk Kim 
2473af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoHmat0;
2474af051161SJung-uk Kim             break;
2475af051161SJung-uk Kim 
2476af051161SJung-uk Kim         case ACPI_HMAT_TYPE_LOCALITY:
2477af051161SJung-uk Kim 
2478af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoHmat1;
2479af051161SJung-uk Kim             break;
2480af051161SJung-uk Kim 
2481af051161SJung-uk Kim         case ACPI_HMAT_TYPE_CACHE:
2482af051161SJung-uk Kim 
2483af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoHmat2;
2484af051161SJung-uk Kim             break;
2485af051161SJung-uk Kim 
2486af051161SJung-uk Kim         default:
2487af051161SJung-uk Kim 
2488af051161SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HMAT");
2489af051161SJung-uk Kim             return (AE_ERROR);
2490af051161SJung-uk Kim         }
2491af051161SJung-uk Kim 
2492ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
2493af051161SJung-uk Kim         if (ACPI_FAILURE (Status))
2494af051161SJung-uk Kim         {
2495af051161SJung-uk Kim             return (Status);
2496af051161SJung-uk Kim         }
2497af051161SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2498af051161SJung-uk Kim         HmatStruct->Length += Subtable->Length;
2499af051161SJung-uk Kim 
2500722b1667SJung-uk Kim         /* Compile HMAT structure additional */
2501af051161SJung-uk Kim 
2502af051161SJung-uk Kim         switch (HmatStruct->Type)
2503af051161SJung-uk Kim         {
2504af051161SJung-uk Kim         case ACPI_HMAT_TYPE_LOCALITY:
2505af051161SJung-uk Kim 
2506af051161SJung-uk Kim             HmatLocality = ACPI_SUB_PTR (ACPI_HMAT_LOCALITY,
2507af051161SJung-uk Kim                 Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE));
2508af051161SJung-uk Kim 
2509af051161SJung-uk Kim             /* Compile initiator proximity domain list */
2510af051161SJung-uk Kim 
2511af051161SJung-uk Kim             IntPDNumber = 0;
2512af051161SJung-uk Kim             while (*PFieldList)
2513af051161SJung-uk Kim             {
2514af051161SJung-uk Kim                 Status = DtCompileTable (PFieldList,
2515ff879b07SJung-uk Kim                     AcpiDmTableInfoHmat1a, &Subtable);
2516af051161SJung-uk Kim                 if (ACPI_FAILURE (Status))
2517af051161SJung-uk Kim                 {
2518af051161SJung-uk Kim                     return (Status);
2519af051161SJung-uk Kim                 }
2520af051161SJung-uk Kim                 if (!Subtable)
2521af051161SJung-uk Kim                 {
2522af051161SJung-uk Kim                     break;
2523af051161SJung-uk Kim                 }
2524af051161SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2525af051161SJung-uk Kim                 HmatStruct->Length += Subtable->Length;
2526af051161SJung-uk Kim                 IntPDNumber++;
2527af051161SJung-uk Kim             }
2528af051161SJung-uk Kim             HmatLocality->NumberOfInitiatorPDs = IntPDNumber;
2529af051161SJung-uk Kim 
2530af051161SJung-uk Kim             /* Compile target proximity domain list */
2531af051161SJung-uk Kim 
2532af051161SJung-uk Kim             TgtPDNumber = 0;
2533af051161SJung-uk Kim             while (*PFieldList)
2534af051161SJung-uk Kim             {
2535af051161SJung-uk Kim                 Status = DtCompileTable (PFieldList,
2536ff879b07SJung-uk Kim                     AcpiDmTableInfoHmat1b, &Subtable);
2537af051161SJung-uk Kim                 if (ACPI_FAILURE (Status))
2538af051161SJung-uk Kim                 {
2539af051161SJung-uk Kim                     return (Status);
2540af051161SJung-uk Kim                 }
2541af051161SJung-uk Kim                 if (!Subtable)
2542af051161SJung-uk Kim                 {
2543af051161SJung-uk Kim                     break;
2544af051161SJung-uk Kim                 }
2545af051161SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2546af051161SJung-uk Kim                 HmatStruct->Length += Subtable->Length;
2547af051161SJung-uk Kim                 TgtPDNumber++;
2548af051161SJung-uk Kim             }
2549af051161SJung-uk Kim             HmatLocality->NumberOfTargetPDs = TgtPDNumber;
2550af051161SJung-uk Kim 
2551af051161SJung-uk Kim             /* Save start of the entries for reporting errors */
2552af051161SJung-uk Kim 
2553af051161SJung-uk Kim             EntryStart = *PFieldList;
2554af051161SJung-uk Kim 
2555af051161SJung-uk Kim             /* Compile latency/bandwidth entries */
2556af051161SJung-uk Kim 
2557af051161SJung-uk Kim             EntryNumber = 0;
2558af051161SJung-uk Kim             while (*PFieldList)
2559af051161SJung-uk Kim             {
2560af051161SJung-uk Kim                 Status = DtCompileTable (PFieldList,
2561ff879b07SJung-uk Kim                     AcpiDmTableInfoHmat1c, &Subtable);
2562af051161SJung-uk Kim                 if (ACPI_FAILURE (Status))
2563af051161SJung-uk Kim                 {
2564af051161SJung-uk Kim                     return (Status);
2565af051161SJung-uk Kim                 }
2566af051161SJung-uk Kim                 if (!Subtable)
2567af051161SJung-uk Kim                 {
2568af051161SJung-uk Kim                     break;
2569af051161SJung-uk Kim                 }
2570af051161SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2571af051161SJung-uk Kim                 HmatStruct->Length += Subtable->Length;
2572af051161SJung-uk Kim                 EntryNumber++;
2573af051161SJung-uk Kim             }
2574af051161SJung-uk Kim 
2575af051161SJung-uk Kim             /* Validate number of entries */
2576af051161SJung-uk Kim 
2577af051161SJung-uk Kim             if (EntryNumber !=
2578af051161SJung-uk Kim                 ((UINT64)IntPDNumber * (UINT64)TgtPDNumber))
2579af051161SJung-uk Kim             {
2580af051161SJung-uk Kim                 DtFatal (ASL_MSG_INVALID_EXPRESSION, EntryStart, "HMAT");
2581af051161SJung-uk Kim                 return (AE_ERROR);
2582af051161SJung-uk Kim             }
2583af051161SJung-uk Kim             break;
2584af051161SJung-uk Kim 
2585af051161SJung-uk Kim         case ACPI_HMAT_TYPE_CACHE:
2586af051161SJung-uk Kim 
2587af051161SJung-uk Kim             /* Compile SMBIOS handles */
2588af051161SJung-uk Kim 
2589af051161SJung-uk Kim             HmatCache = ACPI_SUB_PTR (ACPI_HMAT_CACHE,
2590af051161SJung-uk Kim                 Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE));
2591af051161SJung-uk Kim             SMBIOSHandleNumber = 0;
2592af051161SJung-uk Kim             while (*PFieldList)
2593af051161SJung-uk Kim             {
2594af051161SJung-uk Kim                 Status = DtCompileTable (PFieldList,
2595ff879b07SJung-uk Kim                     AcpiDmTableInfoHmat2a, &Subtable);
2596af051161SJung-uk Kim                 if (ACPI_FAILURE (Status))
2597af051161SJung-uk Kim                 {
2598af051161SJung-uk Kim                     return (Status);
2599af051161SJung-uk Kim                 }
2600af051161SJung-uk Kim                 if (!Subtable)
2601af051161SJung-uk Kim                 {
2602af051161SJung-uk Kim                     break;
2603af051161SJung-uk Kim                 }
2604af051161SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2605af051161SJung-uk Kim                 HmatStruct->Length += Subtable->Length;
2606af051161SJung-uk Kim                 SMBIOSHandleNumber++;
2607af051161SJung-uk Kim             }
2608af051161SJung-uk Kim             HmatCache->NumberOfSMBIOSHandles = SMBIOSHandleNumber;
2609af051161SJung-uk Kim             break;
2610af051161SJung-uk Kim 
2611af051161SJung-uk Kim         default:
2612af051161SJung-uk Kim 
2613af051161SJung-uk Kim             break;
2614af051161SJung-uk Kim         }
2615af051161SJung-uk Kim     }
2616af051161SJung-uk Kim 
2617af051161SJung-uk Kim     return (AE_OK);
2618af051161SJung-uk Kim }
2619af051161SJung-uk Kim 
2620af051161SJung-uk Kim 
2621af051161SJung-uk Kim /******************************************************************************
2622af051161SJung-uk Kim  *
2623f8146b88SJung-uk Kim  * FUNCTION:    DtCompileIort
2624f8146b88SJung-uk Kim  *
2625f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2626f8146b88SJung-uk Kim  *
2627f8146b88SJung-uk Kim  * RETURN:      Status
2628f8146b88SJung-uk Kim  *
2629f8146b88SJung-uk Kim  * DESCRIPTION: Compile IORT.
2630f8146b88SJung-uk Kim  *
2631f8146b88SJung-uk Kim  *****************************************************************************/
2632f8146b88SJung-uk Kim 
2633f8146b88SJung-uk Kim ACPI_STATUS
DtCompileIort(void ** List)2634f8146b88SJung-uk Kim DtCompileIort (
2635f8146b88SJung-uk Kim     void                    **List)
2636f8146b88SJung-uk Kim {
2637f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2638f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2639f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2640f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2641f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
2642cfd1ed46SJung-uk Kim     ACPI_TABLE_HEADER       *Table;
2643f8146b88SJung-uk Kim     ACPI_TABLE_IORT         *Iort;
2644f8146b88SJung-uk Kim     ACPI_IORT_NODE          *IortNode;
2645f8146b88SJung-uk Kim     ACPI_IORT_ITS_GROUP     *IortItsGroup;
2646f8146b88SJung-uk Kim     ACPI_IORT_SMMU          *IortSmmu;
2647cfd1ed46SJung-uk Kim     ACPI_IORT_RMR           *IortRmr;
2648f8146b88SJung-uk Kim     UINT32                  NodeNumber;
2649f8146b88SJung-uk Kim     UINT32                  NodeLength;
2650f8146b88SJung-uk Kim     UINT32                  IdMappingNumber;
2651f8146b88SJung-uk Kim     UINT32                  ItsNumber;
2652f8146b88SJung-uk Kim     UINT32                  ContextIrptNumber;
2653f8146b88SJung-uk Kim     UINT32                  PmuIrptNumber;
2654f8146b88SJung-uk Kim     UINT32                  PaddingLength;
2655cfd1ed46SJung-uk Kim     UINT8                   Revision;
2656cfd1ed46SJung-uk Kim     UINT32                  RmrCount;
2657f8146b88SJung-uk Kim 
2658f8146b88SJung-uk Kim 
2659f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2660f8146b88SJung-uk Kim 
2661f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort,
2662ff879b07SJung-uk Kim         &Subtable);
2663f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2664f8146b88SJung-uk Kim     {
2665f8146b88SJung-uk Kim         return (Status);
2666f8146b88SJung-uk Kim     }
2667f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2668f8146b88SJung-uk Kim 
2669cfd1ed46SJung-uk Kim     Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
2670cfd1ed46SJung-uk Kim     Revision = Table->Revision;
2671cfd1ed46SJung-uk Kim 
2672ab71bbb7SJung-uk Kim     /* IORT Revisions E, E.a & E.c have known issues and are not supported */
2673cfd1ed46SJung-uk Kim 
2674ab71bbb7SJung-uk Kim     if (Revision == 1 || Revision == 2 || Revision == 4)
2675cfd1ed46SJung-uk Kim     {
2676cfd1ed46SJung-uk Kim         DtError (ASL_ERROR, ASL_MSG_UNSUPPORTED, NULL, "IORT table revision");
2677cfd1ed46SJung-uk Kim         return (AE_ERROR);
2678cfd1ed46SJung-uk Kim     }
2679cfd1ed46SJung-uk Kim 
2680f8146b88SJung-uk Kim     /*
2681f8146b88SJung-uk Kim      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
2682f8146b88SJung-uk Kim      * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
2683f8146b88SJung-uk Kim      */
2684f8146b88SJung-uk Kim     Iort = ACPI_SUB_PTR (ACPI_TABLE_IORT,
2685f8146b88SJung-uk Kim         Subtable->Buffer, sizeof (ACPI_TABLE_HEADER));
2686f8146b88SJung-uk Kim 
2687f8146b88SJung-uk Kim     /*
2688f8146b88SJung-uk Kim      * OptionalPadding - Variable-length data
2689f8146b88SJung-uk Kim      * (Optional, size = OffsetToNodes - sizeof (ACPI_TABLE_IORT))
2690f8146b88SJung-uk Kim      * Optionally allows the generic data types to be used for filling
2691f8146b88SJung-uk Kim      * this field.
2692f8146b88SJung-uk Kim      */
2693f8146b88SJung-uk Kim     Iort->NodeOffset = sizeof (ACPI_TABLE_IORT);
2694f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortPad,
2695ff879b07SJung-uk Kim         &Subtable);
2696f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2697f8146b88SJung-uk Kim     {
2698f8146b88SJung-uk Kim         return (Status);
2699f8146b88SJung-uk Kim     }
2700f8146b88SJung-uk Kim     if (Subtable)
2701f8146b88SJung-uk Kim     {
2702f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2703f8146b88SJung-uk Kim         Iort->NodeOffset += Subtable->Length;
2704f8146b88SJung-uk Kim     }
2705f8146b88SJung-uk Kim     else
2706f8146b88SJung-uk Kim     {
2707f8146b88SJung-uk Kim         Status = DtCompileGeneric (ACPI_CAST_PTR (void *, PFieldList),
2708f8146b88SJung-uk Kim             AcpiDmTableInfoIortHdr[0].Name, &PaddingLength);
2709f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2710f8146b88SJung-uk Kim         {
2711f8146b88SJung-uk Kim             return (Status);
2712f8146b88SJung-uk Kim         }
2713f8146b88SJung-uk Kim         Iort->NodeOffset += PaddingLength;
2714f8146b88SJung-uk Kim     }
2715f8146b88SJung-uk Kim 
2716f8146b88SJung-uk Kim     NodeNumber = 0;
2717f8146b88SJung-uk Kim     while (*PFieldList)
2718f8146b88SJung-uk Kim     {
2719f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
2720cfd1ed46SJung-uk Kim         if (Revision == 0)
2721cfd1ed46SJung-uk Kim         {
2722f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr,
2723ff879b07SJung-uk Kim                 &Subtable);
2724cfd1ed46SJung-uk Kim         }
2725cfd1ed46SJung-uk Kim         else if (Revision >= 3)
2726cfd1ed46SJung-uk Kim         {
2727cfd1ed46SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr3,
2728cfd1ed46SJung-uk Kim                 &Subtable);
2729cfd1ed46SJung-uk Kim         }
2730cfd1ed46SJung-uk Kim 
2731f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2732f8146b88SJung-uk Kim         {
2733f8146b88SJung-uk Kim             return (Status);
2734f8146b88SJung-uk Kim         }
2735f8146b88SJung-uk Kim 
2736f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2737f8146b88SJung-uk Kim         IortNode = ACPI_CAST_PTR (ACPI_IORT_NODE, Subtable->Buffer);
2738f8146b88SJung-uk Kim         NodeLength = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
2739f8146b88SJung-uk Kim 
2740f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
2741f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2742f8146b88SJung-uk Kim 
2743f8146b88SJung-uk Kim         switch (IortNode->Type)
2744f8146b88SJung-uk Kim         {
2745f8146b88SJung-uk Kim         case ACPI_IORT_NODE_ITS_GROUP:
2746f8146b88SJung-uk Kim 
2747f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0,
2748ff879b07SJung-uk Kim                 &Subtable);
2749f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
2750f8146b88SJung-uk Kim             {
2751f8146b88SJung-uk Kim                 return (Status);
2752f8146b88SJung-uk Kim             }
2753f8146b88SJung-uk Kim 
2754f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
2755f8146b88SJung-uk Kim             IortItsGroup = ACPI_CAST_PTR (ACPI_IORT_ITS_GROUP, Subtable->Buffer);
2756f8146b88SJung-uk Kim             NodeLength += Subtable->Length;
2757f8146b88SJung-uk Kim 
2758f8146b88SJung-uk Kim             ItsNumber = 0;
2759f8146b88SJung-uk Kim             while (*PFieldList)
2760f8146b88SJung-uk Kim             {
2761f8146b88SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0a,
2762ff879b07SJung-uk Kim                     &Subtable);
2763f8146b88SJung-uk Kim                 if (ACPI_FAILURE (Status))
2764f8146b88SJung-uk Kim                 {
2765f8146b88SJung-uk Kim                     return (Status);
2766f8146b88SJung-uk Kim                 }
2767f8146b88SJung-uk Kim                 if (!Subtable)
2768f8146b88SJung-uk Kim                 {
2769f8146b88SJung-uk Kim                     break;
2770f8146b88SJung-uk Kim                 }
2771f8146b88SJung-uk Kim 
2772f8146b88SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2773f8146b88SJung-uk Kim                 NodeLength += Subtable->Length;
2774f8146b88SJung-uk Kim                 ItsNumber++;
2775f8146b88SJung-uk Kim             }
2776f8146b88SJung-uk Kim 
2777f8146b88SJung-uk Kim             IortItsGroup->ItsCount = ItsNumber;
2778f8146b88SJung-uk Kim             break;
2779f8146b88SJung-uk Kim 
2780f8146b88SJung-uk Kim         case ACPI_IORT_NODE_NAMED_COMPONENT:
2781f8146b88SJung-uk Kim 
2782f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1,
2783ff879b07SJung-uk Kim                 &Subtable);
2784f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
2785f8146b88SJung-uk Kim             {
2786f8146b88SJung-uk Kim                 return (Status);
2787f8146b88SJung-uk Kim             }
2788f8146b88SJung-uk Kim 
2789f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
2790f8146b88SJung-uk Kim             NodeLength += Subtable->Length;
2791f8146b88SJung-uk Kim 
2792f8146b88SJung-uk Kim             /*
2793f8146b88SJung-uk Kim              * Padding - Variable-length data
2794f8146b88SJung-uk Kim              * Optionally allows the offset of the ID mappings to be used
2795f8146b88SJung-uk Kim              * for filling this field.
2796f8146b88SJung-uk Kim              */
2797f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1a,
2798ff879b07SJung-uk Kim                 &Subtable);
2799f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
2800f8146b88SJung-uk Kim             {
2801f8146b88SJung-uk Kim                 return (Status);
2802f8146b88SJung-uk Kim             }
2803f8146b88SJung-uk Kim 
2804f8146b88SJung-uk Kim             if (Subtable)
2805f8146b88SJung-uk Kim             {
2806f8146b88SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2807f8146b88SJung-uk Kim                 NodeLength += Subtable->Length;
2808f8146b88SJung-uk Kim             }
2809f8146b88SJung-uk Kim             else
2810f8146b88SJung-uk Kim             {
2811f8146b88SJung-uk Kim                 if (NodeLength > IortNode->MappingOffset)
2812f8146b88SJung-uk Kim                 {
2813f8146b88SJung-uk Kim                     return (AE_BAD_DATA);
2814f8146b88SJung-uk Kim                 }
2815f8146b88SJung-uk Kim 
2816f8146b88SJung-uk Kim                 if (NodeLength < IortNode->MappingOffset)
2817f8146b88SJung-uk Kim                 {
2818f8146b88SJung-uk Kim                     Status = DtCompilePadding (
2819f8146b88SJung-uk Kim                         IortNode->MappingOffset - NodeLength,
2820f8146b88SJung-uk Kim                         &Subtable);
2821f8146b88SJung-uk Kim                     if (ACPI_FAILURE (Status))
2822f8146b88SJung-uk Kim                     {
2823f8146b88SJung-uk Kim                         return (Status);
2824f8146b88SJung-uk Kim                     }
2825f8146b88SJung-uk Kim 
2826f8146b88SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
2827f8146b88SJung-uk Kim                     NodeLength = IortNode->MappingOffset;
2828f8146b88SJung-uk Kim                 }
2829f8146b88SJung-uk Kim             }
2830f8146b88SJung-uk Kim             break;
2831f8146b88SJung-uk Kim 
2832f8146b88SJung-uk Kim         case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
2833f8146b88SJung-uk Kim 
2834f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort2,
2835ff879b07SJung-uk Kim                 &Subtable);
2836f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
2837f8146b88SJung-uk Kim             {
2838f8146b88SJung-uk Kim                 return (Status);
2839f8146b88SJung-uk Kim             }
2840f8146b88SJung-uk Kim 
2841f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
2842f8146b88SJung-uk Kim             NodeLength += Subtable->Length;
2843f8146b88SJung-uk Kim             break;
2844f8146b88SJung-uk Kim 
2845f8146b88SJung-uk Kim         case ACPI_IORT_NODE_SMMU:
2846f8146b88SJung-uk Kim 
2847f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3,
2848ff879b07SJung-uk Kim                 &Subtable);
2849f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
2850f8146b88SJung-uk Kim             {
2851f8146b88SJung-uk Kim                 return (Status);
2852f8146b88SJung-uk Kim             }
2853f8146b88SJung-uk Kim 
2854f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
2855f8146b88SJung-uk Kim             IortSmmu = ACPI_CAST_PTR (ACPI_IORT_SMMU, Subtable->Buffer);
2856f8146b88SJung-uk Kim             NodeLength += Subtable->Length;
2857f8146b88SJung-uk Kim 
2858f8146b88SJung-uk Kim             /* Compile global interrupt array */
2859f8146b88SJung-uk Kim 
2860f8146b88SJung-uk Kim             IortSmmu->GlobalInterruptOffset = NodeLength;
2861f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3a,
2862ff879b07SJung-uk Kim                 &Subtable);
2863f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
2864f8146b88SJung-uk Kim             {
2865f8146b88SJung-uk Kim                 return (Status);
2866f8146b88SJung-uk Kim             }
2867f8146b88SJung-uk Kim 
2868f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
2869f8146b88SJung-uk Kim             NodeLength += Subtable->Length;
2870f8146b88SJung-uk Kim 
2871f8146b88SJung-uk Kim             /* Compile context interrupt array */
2872f8146b88SJung-uk Kim 
2873f8146b88SJung-uk Kim             ContextIrptNumber = 0;
2874f8146b88SJung-uk Kim             IortSmmu->ContextInterruptOffset = NodeLength;
2875f8146b88SJung-uk Kim             while (*PFieldList)
2876f8146b88SJung-uk Kim             {
2877f8146b88SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3b,
2878ff879b07SJung-uk Kim                     &Subtable);
2879f8146b88SJung-uk Kim                 if (ACPI_FAILURE (Status))
2880f8146b88SJung-uk Kim                 {
2881f8146b88SJung-uk Kim                     return (Status);
2882f8146b88SJung-uk Kim                 }
2883f8146b88SJung-uk Kim 
2884f8146b88SJung-uk Kim                 if (!Subtable)
2885f8146b88SJung-uk Kim                 {
2886f8146b88SJung-uk Kim                     break;
2887f8146b88SJung-uk Kim                 }
2888f8146b88SJung-uk Kim 
2889f8146b88SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2890f8146b88SJung-uk Kim                 NodeLength += Subtable->Length;
2891f8146b88SJung-uk Kim                 ContextIrptNumber++;
2892f8146b88SJung-uk Kim             }
2893f8146b88SJung-uk Kim 
2894f8146b88SJung-uk Kim             IortSmmu->ContextInterruptCount = ContextIrptNumber;
2895f8146b88SJung-uk Kim 
2896f8146b88SJung-uk Kim             /* Compile PMU interrupt array */
2897f8146b88SJung-uk Kim 
2898f8146b88SJung-uk Kim             PmuIrptNumber = 0;
2899f8146b88SJung-uk Kim             IortSmmu->PmuInterruptOffset = NodeLength;
2900f8146b88SJung-uk Kim             while (*PFieldList)
2901f8146b88SJung-uk Kim             {
2902f8146b88SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3c,
2903ff879b07SJung-uk Kim                     &Subtable);
2904f8146b88SJung-uk Kim                 if (ACPI_FAILURE (Status))
2905f8146b88SJung-uk Kim                 {
2906f8146b88SJung-uk Kim                     return (Status);
2907f8146b88SJung-uk Kim                 }
2908f8146b88SJung-uk Kim 
2909f8146b88SJung-uk Kim                 if (!Subtable)
2910f8146b88SJung-uk Kim                 {
2911f8146b88SJung-uk Kim                     break;
2912f8146b88SJung-uk Kim                 }
2913f8146b88SJung-uk Kim 
2914f8146b88SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2915f8146b88SJung-uk Kim                 NodeLength += Subtable->Length;
2916f8146b88SJung-uk Kim                 PmuIrptNumber++;
2917f8146b88SJung-uk Kim             }
2918f8146b88SJung-uk Kim 
2919f8146b88SJung-uk Kim             IortSmmu->PmuInterruptCount = PmuIrptNumber;
2920f8146b88SJung-uk Kim             break;
2921f8146b88SJung-uk Kim 
2922f8146b88SJung-uk Kim         case ACPI_IORT_NODE_SMMU_V3:
2923f8146b88SJung-uk Kim 
2924f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort4,
2925ff879b07SJung-uk Kim                 &Subtable);
2926f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
2927f8146b88SJung-uk Kim             {
2928f8146b88SJung-uk Kim                 return (Status);
2929f8146b88SJung-uk Kim             }
2930f8146b88SJung-uk Kim 
2931f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
2932f8146b88SJung-uk Kim             NodeLength += Subtable->Length;
2933f8146b88SJung-uk Kim             break;
2934f8146b88SJung-uk Kim 
29353d90091dSJung-uk Kim         case ACPI_IORT_NODE_PMCG:
29363d90091dSJung-uk Kim 
29373d90091dSJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort5,
29383d90091dSJung-uk Kim                 &Subtable);
29393d90091dSJung-uk Kim             if (ACPI_FAILURE (Status))
29403d90091dSJung-uk Kim             {
29413d90091dSJung-uk Kim                 return (Status);
29423d90091dSJung-uk Kim             }
29433d90091dSJung-uk Kim 
29443d90091dSJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
29453d90091dSJung-uk Kim             NodeLength += Subtable->Length;
29463d90091dSJung-uk Kim             break;
29473d90091dSJung-uk Kim 
2948cfd1ed46SJung-uk Kim         case ACPI_IORT_NODE_RMR:
2949cfd1ed46SJung-uk Kim 
2950cfd1ed46SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6,
2951cfd1ed46SJung-uk Kim                 &Subtable);
2952cfd1ed46SJung-uk Kim             if (ACPI_FAILURE (Status))
2953cfd1ed46SJung-uk Kim             {
2954cfd1ed46SJung-uk Kim                 return (Status);
2955cfd1ed46SJung-uk Kim             }
2956cfd1ed46SJung-uk Kim 
2957cfd1ed46SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
2958cfd1ed46SJung-uk Kim             IortRmr = ACPI_CAST_PTR (ACPI_IORT_RMR, Subtable->Buffer);
2959cfd1ed46SJung-uk Kim             NodeLength += Subtable->Length;
2960cfd1ed46SJung-uk Kim 
2961cfd1ed46SJung-uk Kim             /* Compile RMR Descriptors */
2962cfd1ed46SJung-uk Kim 
2963cfd1ed46SJung-uk Kim             RmrCount = 0;
2964cfd1ed46SJung-uk Kim             IortRmr->RmrOffset = NodeLength;
2965cfd1ed46SJung-uk Kim             while (*PFieldList)
2966cfd1ed46SJung-uk Kim             {
2967cfd1ed46SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6a,
2968cfd1ed46SJung-uk Kim                     &Subtable);
2969cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
2970cfd1ed46SJung-uk Kim                 {
2971cfd1ed46SJung-uk Kim                     return (Status);
2972cfd1ed46SJung-uk Kim                 }
2973cfd1ed46SJung-uk Kim 
2974cfd1ed46SJung-uk Kim                 if (!Subtable)
2975cfd1ed46SJung-uk Kim                 {
2976cfd1ed46SJung-uk Kim                     break;
2977cfd1ed46SJung-uk Kim                 }
2978cfd1ed46SJung-uk Kim 
2979cfd1ed46SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2980cfd1ed46SJung-uk Kim                 NodeLength += sizeof (ACPI_IORT_RMR_DESC);
2981cfd1ed46SJung-uk Kim                 RmrCount++;
2982cfd1ed46SJung-uk Kim             }
2983cfd1ed46SJung-uk Kim 
2984cfd1ed46SJung-uk Kim             IortRmr->RmrCount = RmrCount;
2985cfd1ed46SJung-uk Kim             break;
2986cfd1ed46SJung-uk Kim 
2987f8146b88SJung-uk Kim         default:
2988f8146b88SJung-uk Kim 
2989f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IORT");
2990f8146b88SJung-uk Kim             return (AE_ERROR);
2991f8146b88SJung-uk Kim         }
2992f8146b88SJung-uk Kim 
2993f8146b88SJung-uk Kim         /* Compile Array of ID mappings */
2994f8146b88SJung-uk Kim 
2995f8146b88SJung-uk Kim         IortNode->MappingOffset = NodeLength;
2996f8146b88SJung-uk Kim         IdMappingNumber = 0;
2997f8146b88SJung-uk Kim         while (*PFieldList)
2998f8146b88SJung-uk Kim         {
2999f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortMap,
3000ff879b07SJung-uk Kim                 &Subtable);
3001f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
3002f8146b88SJung-uk Kim             {
3003f8146b88SJung-uk Kim                 return (Status);
3004f8146b88SJung-uk Kim             }
3005f8146b88SJung-uk Kim 
3006f8146b88SJung-uk Kim             if (!Subtable)
3007f8146b88SJung-uk Kim             {
3008f8146b88SJung-uk Kim                 break;
3009f8146b88SJung-uk Kim             }
3010f8146b88SJung-uk Kim 
3011f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
3012f8146b88SJung-uk Kim             NodeLength += sizeof (ACPI_IORT_ID_MAPPING);
3013f8146b88SJung-uk Kim             IdMappingNumber++;
3014f8146b88SJung-uk Kim         }
3015f8146b88SJung-uk Kim 
3016f8146b88SJung-uk Kim         IortNode->MappingCount = IdMappingNumber;
30170d84335fSJung-uk Kim         if (!IdMappingNumber)
30180d84335fSJung-uk Kim         {
30190d84335fSJung-uk Kim             IortNode->MappingOffset = 0;
30200d84335fSJung-uk Kim         }
3021f8146b88SJung-uk Kim 
3022f8146b88SJung-uk Kim         /*
3023f8146b88SJung-uk Kim          * Node length can be determined by DT_LENGTH option
3024f8146b88SJung-uk Kim          * IortNode->Length = NodeLength;
3025f8146b88SJung-uk Kim          */
3026f8146b88SJung-uk Kim         DtPopSubtable ();
3027f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
3028f8146b88SJung-uk Kim         NodeNumber++;
3029f8146b88SJung-uk Kim     }
3030f8146b88SJung-uk Kim 
3031f8146b88SJung-uk Kim     Iort->NodeCount = NodeNumber;
3032f8146b88SJung-uk Kim     return (AE_OK);
3033f8146b88SJung-uk Kim }
3034f8146b88SJung-uk Kim 
3035f8146b88SJung-uk Kim 
3036f8146b88SJung-uk Kim /******************************************************************************
3037f8146b88SJung-uk Kim  *
3038f8146b88SJung-uk Kim  * FUNCTION:    DtCompileIvrs
3039f8146b88SJung-uk Kim  *
3040f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
3041f8146b88SJung-uk Kim  *
3042f8146b88SJung-uk Kim  * RETURN:      Status
3043f8146b88SJung-uk Kim  *
30441970d693SJung-uk Kim  * DESCRIPTION: Compile IVRS. Notes:
30451970d693SJung-uk Kim  *              The IVRS is essentially a flat table, with the following
30461970d693SJung-uk Kim  *              structure:
30471970d693SJung-uk Kim  *              <Main ACPI Table Header>
30481970d693SJung-uk Kim  *              <Main subtable - virtualization info>
30491970d693SJung-uk Kim  *              <IVHD>
30501970d693SJung-uk Kim  *                  <Device Entries>
30511970d693SJung-uk Kim  *              ...
30521970d693SJung-uk Kim  *              <IVHD>
30531970d693SJung-uk Kim  *                  <Device Entries>
30541970d693SJung-uk Kim  *              <IVMD>
30551970d693SJung-uk Kim  *              ...
3056f8146b88SJung-uk Kim  *
3057f8146b88SJung-uk Kim  *****************************************************************************/
3058f8146b88SJung-uk Kim 
3059f8146b88SJung-uk Kim ACPI_STATUS
DtCompileIvrs(void ** List)3060f8146b88SJung-uk Kim DtCompileIvrs (
3061f8146b88SJung-uk Kim     void                    **List)
3062f8146b88SJung-uk Kim {
3063f8146b88SJung-uk Kim     ACPI_STATUS             Status;
3064f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
3065f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
30661970d693SJung-uk Kim     DT_SUBTABLE             *MainSubtable;
3067f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
3068f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
30691970d693SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable = NULL;
30701970d693SJung-uk Kim     UINT8                   SubtableType;
30711970d693SJung-uk Kim     UINT8                   Temp64[16];
30721970d693SJung-uk Kim     UINT8                   Temp8;
3073f8146b88SJung-uk Kim 
3074f8146b88SJung-uk Kim 
30751970d693SJung-uk Kim     /* Main table */
30761970d693SJung-uk Kim 
3077f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs,
3078ff879b07SJung-uk Kim         &Subtable);
3079f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
3080f8146b88SJung-uk Kim     {
3081f8146b88SJung-uk Kim         return (Status);
3082f8146b88SJung-uk Kim     }
3083f8146b88SJung-uk Kim 
3084f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
3085f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
30861970d693SJung-uk Kim     DtPushSubtable (Subtable);
30871970d693SJung-uk Kim 
30881970d693SJung-uk Kim     /* Save a pointer to the main subtable */
30891970d693SJung-uk Kim 
30901970d693SJung-uk Kim     MainSubtable = Subtable;
3091f8146b88SJung-uk Kim 
3092f8146b88SJung-uk Kim     while (*PFieldList)
3093f8146b88SJung-uk Kim     {
3094f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
30951970d693SJung-uk Kim 
30961970d693SJung-uk Kim         /* Compile the SubtableType integer */
30971970d693SJung-uk Kim 
30981970d693SJung-uk Kim         DtCompileInteger (&SubtableType, *PFieldList, 1, 0);
30991970d693SJung-uk Kim 
31001970d693SJung-uk Kim         switch (SubtableType)
3101f8146b88SJung-uk Kim         {
3102f8146b88SJung-uk Kim 
31031970d693SJung-uk Kim         /* Type 10h, IVHD (I/O Virtualization Hardware Definition) */
3104f8146b88SJung-uk Kim 
31053ee58df5SJung-uk Kim         case ACPI_IVRS_TYPE_HARDWARE1:
3106f8146b88SJung-uk Kim 
31071970d693SJung-uk Kim             InfoTable = AcpiDmTableInfoIvrsHware1;
3108f8146b88SJung-uk Kim             break;
3109f8146b88SJung-uk Kim 
31101970d693SJung-uk Kim         /* Types 11h, 40h, IVHD (I/O Virtualization Hardware Definition) */
31111970d693SJung-uk Kim 
31123ee58df5SJung-uk Kim         case ACPI_IVRS_TYPE_HARDWARE2:
31131970d693SJung-uk Kim         case ACPI_IVRS_TYPE_HARDWARE3:
31143ee58df5SJung-uk Kim 
31151970d693SJung-uk Kim             InfoTable = AcpiDmTableInfoIvrsHware23;
31163ee58df5SJung-uk Kim             break;
31173ee58df5SJung-uk Kim 
31181970d693SJung-uk Kim         /* Types 20h, 21h, 22h, IVMD (I/O Virtualization Memory Definition Block) */
31191970d693SJung-uk Kim 
3120f8146b88SJung-uk Kim         case ACPI_IVRS_TYPE_MEMORY1:
3121f8146b88SJung-uk Kim         case ACPI_IVRS_TYPE_MEMORY2:
3122f8146b88SJung-uk Kim         case ACPI_IVRS_TYPE_MEMORY3:
3123f8146b88SJung-uk Kim 
31241970d693SJung-uk Kim             InfoTable = AcpiDmTableInfoIvrsMemory;
3125f8146b88SJung-uk Kim             break;
3126f8146b88SJung-uk Kim 
3127f8146b88SJung-uk Kim         /* 4-byte device entries */
3128f8146b88SJung-uk Kim 
3129f8146b88SJung-uk Kim         case ACPI_IVRS_TYPE_PAD4:
3130f8146b88SJung-uk Kim         case ACPI_IVRS_TYPE_ALL:
3131f8146b88SJung-uk Kim         case ACPI_IVRS_TYPE_SELECT:
3132f8146b88SJung-uk Kim         case ACPI_IVRS_TYPE_START:
3133f8146b88SJung-uk Kim         case ACPI_IVRS_TYPE_END:
3134f8146b88SJung-uk Kim 
3135f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoIvrs4;
3136f8146b88SJung-uk Kim             break;
3137f8146b88SJung-uk Kim 
31381970d693SJung-uk Kim         /* 8-byte device entries, type A */
3139f8146b88SJung-uk Kim 
3140f8146b88SJung-uk Kim         case ACPI_IVRS_TYPE_ALIAS_SELECT:
3141f8146b88SJung-uk Kim         case ACPI_IVRS_TYPE_ALIAS_START:
3142f8146b88SJung-uk Kim 
3143f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoIvrs8a;
3144f8146b88SJung-uk Kim             break;
3145f8146b88SJung-uk Kim 
31461970d693SJung-uk Kim         /* 8-byte device entries, type B */
3147f8146b88SJung-uk Kim 
3148f8146b88SJung-uk Kim         case ACPI_IVRS_TYPE_EXT_SELECT:
3149f8146b88SJung-uk Kim         case ACPI_IVRS_TYPE_EXT_START:
3150f8146b88SJung-uk Kim 
3151f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoIvrs8b;
3152f8146b88SJung-uk Kim             break;
3153f8146b88SJung-uk Kim 
31541970d693SJung-uk Kim         /* 8-byte device entries, type C */
3155f8146b88SJung-uk Kim 
3156f8146b88SJung-uk Kim         case ACPI_IVRS_TYPE_SPECIAL:
3157f8146b88SJung-uk Kim 
3158f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoIvrs8c;
3159f8146b88SJung-uk Kim             break;
3160f8146b88SJung-uk Kim 
31611970d693SJung-uk Kim         /* Variable device entries, type F0h */
31621970d693SJung-uk Kim 
31631970d693SJung-uk Kim         case ACPI_IVRS_TYPE_HID:
31641970d693SJung-uk Kim 
31651970d693SJung-uk Kim             InfoTable = AcpiDmTableInfoIvrsHid;
31661970d693SJung-uk Kim             break;
31671970d693SJung-uk Kim 
3168f8146b88SJung-uk Kim         default:
3169f8146b88SJung-uk Kim 
3170f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart,
3171f8146b88SJung-uk Kim                 "IVRS Device Entry");
3172f8146b88SJung-uk Kim             return (AE_ERROR);
3173f8146b88SJung-uk Kim         }
3174f8146b88SJung-uk Kim 
31751970d693SJung-uk Kim         /* Compile the InfoTable from above */
31761970d693SJung-uk Kim 
3177f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable,
3178ff879b07SJung-uk Kim             &Subtable);
3179f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
3180f8146b88SJung-uk Kim         {
3181f8146b88SJung-uk Kim             return (Status);
3182f8146b88SJung-uk Kim         }
3183f8146b88SJung-uk Kim 
31841970d693SJung-uk Kim         ParentTable = DtPeekSubtable ();
31851970d693SJung-uk Kim         if (SubtableType != ACPI_IVRS_TYPE_HARDWARE1 &&
31861970d693SJung-uk Kim             SubtableType != ACPI_IVRS_TYPE_HARDWARE2 &&
31871970d693SJung-uk Kim             SubtableType != ACPI_IVRS_TYPE_HARDWARE3 &&
31881970d693SJung-uk Kim             SubtableType != ACPI_IVRS_TYPE_HID &&
31891970d693SJung-uk Kim             SubtableType != ACPI_IVRS_TYPE_MEMORY1 &&
31901970d693SJung-uk Kim             SubtableType != ACPI_IVRS_TYPE_MEMORY2 &&
31911970d693SJung-uk Kim             SubtableType != ACPI_IVRS_TYPE_MEMORY3)
31921970d693SJung-uk Kim         {
31931970d693SJung-uk Kim             if (ParentTable)
3194f8146b88SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
3195f8146b88SJung-uk Kim         }
31961970d693SJung-uk Kim 
31971970d693SJung-uk Kim         switch (SubtableType)
31981970d693SJung-uk Kim         {
31991970d693SJung-uk Kim         case ACPI_IVRS_TYPE_HARDWARE1:
32001970d693SJung-uk Kim         case ACPI_IVRS_TYPE_HARDWARE2:
32011970d693SJung-uk Kim         case ACPI_IVRS_TYPE_HARDWARE3:
32021970d693SJung-uk Kim         case ACPI_IVRS_TYPE_MEMORY1:
32031970d693SJung-uk Kim         case ACPI_IVRS_TYPE_MEMORY2:
32041970d693SJung-uk Kim         case ACPI_IVRS_TYPE_MEMORY3:
32051970d693SJung-uk Kim 
32061970d693SJung-uk Kim             /* Insert these IVHDs/IVMDs at the root subtable */
32071970d693SJung-uk Kim 
32081970d693SJung-uk Kim             DtInsertSubtable (MainSubtable, Subtable);
32091970d693SJung-uk Kim             DtPushSubtable (Subtable);
32101970d693SJung-uk Kim             break;
32111970d693SJung-uk Kim 
32121970d693SJung-uk Kim         case ACPI_IVRS_TYPE_HID:
32131970d693SJung-uk Kim 
32141970d693SJung-uk Kim             /* Special handling for the HID named device entry (0xF0) */
32151970d693SJung-uk Kim 
32161970d693SJung-uk Kim             if (ParentTable)
32171970d693SJung-uk Kim             {
32181970d693SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
32191970d693SJung-uk Kim             }
32201970d693SJung-uk Kim 
32211970d693SJung-uk Kim             /*
32221970d693SJung-uk Kim              * Process the HID value. First, get the HID value as a string.
32231970d693SJung-uk Kim              */
32241970d693SJung-uk Kim             DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 16, DT_FIELD_TYPE_STRING, 0);
32251970d693SJung-uk Kim 
32261970d693SJung-uk Kim                /*
32271970d693SJung-uk Kim                 * Determine if the HID is an integer or a string.
32281970d693SJung-uk Kim                 * An integer is defined to be 32 bits, with the upper 32 bits
32291970d693SJung-uk Kim                 * set to zero. (from the ACPI Spec): "The HID can be a 32-bit
32301970d693SJung-uk Kim                 * integer or a character string. If an integer, the lower
32311970d693SJung-uk Kim                 * 4 bytes of the field contain the integer and the upper
32321970d693SJung-uk Kim                 * 4 bytes are padded with 0".
32331970d693SJung-uk Kim                 */
32341970d693SJung-uk Kim             if (UtIsIdInteger ((UINT8 *) &Temp64))
32351970d693SJung-uk Kim             {
32361970d693SJung-uk Kim                 /* Compile the HID value as an integer */
32371970d693SJung-uk Kim 
32381970d693SJung-uk Kim                 DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 8, DT_FIELD_TYPE_INTEGER, 0);
32391970d693SJung-uk Kim 
32401970d693SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHidInteger,
32411970d693SJung-uk Kim                     &Subtable);
32421970d693SJung-uk Kim                 if (ACPI_FAILURE (Status))
32431970d693SJung-uk Kim                 {
32441970d693SJung-uk Kim                     return (Status);
32451970d693SJung-uk Kim                 }
32461970d693SJung-uk Kim             }
32471970d693SJung-uk Kim             else
32481970d693SJung-uk Kim             {
32491970d693SJung-uk Kim                 /* Compile the HID value as a string */
32501970d693SJung-uk Kim 
32511970d693SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHidString,
32521970d693SJung-uk Kim                     &Subtable);
32531970d693SJung-uk Kim                 if (ACPI_FAILURE (Status))
32541970d693SJung-uk Kim                 {
32551970d693SJung-uk Kim                     return (Status);
32561970d693SJung-uk Kim                 }
3257f8146b88SJung-uk Kim             }
3258f8146b88SJung-uk Kim 
32591970d693SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
32601970d693SJung-uk Kim 
32611970d693SJung-uk Kim             /*
32621970d693SJung-uk Kim              * Process the CID value. First, get the CID value as a string.
32631970d693SJung-uk Kim              */
32641970d693SJung-uk Kim             DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 16, DT_FIELD_TYPE_STRING, 0);
32651970d693SJung-uk Kim 
32661970d693SJung-uk Kim             if (UtIsIdInteger ((UINT8 *) &Temp64))
32671970d693SJung-uk Kim             {
32681970d693SJung-uk Kim                 /* Compile the CID value as an integer */
32691970d693SJung-uk Kim 
32701970d693SJung-uk Kim                 DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 8, DT_FIELD_TYPE_INTEGER, 0);
32711970d693SJung-uk Kim 
32721970d693SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsCidInteger,
32731970d693SJung-uk Kim                     &Subtable);
32741970d693SJung-uk Kim                 if (ACPI_FAILURE (Status))
32751970d693SJung-uk Kim                 {
32761970d693SJung-uk Kim                     return (Status);
32771970d693SJung-uk Kim                 }
32781970d693SJung-uk Kim             }
32791970d693SJung-uk Kim             else
32801970d693SJung-uk Kim             {
32811970d693SJung-uk Kim                 /* Compile the CID value as a string */
32821970d693SJung-uk Kim 
32831970d693SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsCidString,
32841970d693SJung-uk Kim                     &Subtable);
32851970d693SJung-uk Kim                 if (ACPI_FAILURE (Status))
32861970d693SJung-uk Kim                 {
32871970d693SJung-uk Kim                     return (Status);
32881970d693SJung-uk Kim                 }
32891970d693SJung-uk Kim             }
32901970d693SJung-uk Kim 
32911970d693SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
32921970d693SJung-uk Kim 
32931970d693SJung-uk Kim             /*
32941970d693SJung-uk Kim              * Process the UID value. First, get and decode the "UID Format" field (Integer).
32951970d693SJung-uk Kim              */
32961970d693SJung-uk Kim             if (!*PFieldList)
32971970d693SJung-uk Kim             {
32981970d693SJung-uk Kim                 return (AE_OK);
32991970d693SJung-uk Kim             }
33001970d693SJung-uk Kim 
33011970d693SJung-uk Kim             DtCompileOneField (&Temp8, *PFieldList, 1, DT_FIELD_TYPE_INTEGER, 0);
33021970d693SJung-uk Kim 
33031970d693SJung-uk Kim             switch (Temp8)
33041970d693SJung-uk Kim             {
33051970d693SJung-uk Kim             case ACPI_IVRS_UID_NOT_PRESENT:
33061970d693SJung-uk Kim                 break;
33071970d693SJung-uk Kim 
33081970d693SJung-uk Kim             case ACPI_IVRS_UID_IS_INTEGER:
33091970d693SJung-uk Kim 
33101970d693SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsUidInteger,
33111970d693SJung-uk Kim                     &Subtable);
33121970d693SJung-uk Kim                 if (ACPI_FAILURE (Status))
33131970d693SJung-uk Kim                 {
33141970d693SJung-uk Kim                     return (Status);
33151970d693SJung-uk Kim                 }
33161970d693SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
33171970d693SJung-uk Kim                 break;
33181970d693SJung-uk Kim 
33191970d693SJung-uk Kim             case ACPI_IVRS_UID_IS_STRING:
33201970d693SJung-uk Kim 
33211970d693SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsUidString,
33221970d693SJung-uk Kim                     &Subtable);
33231970d693SJung-uk Kim                 if (ACPI_FAILURE (Status))
33241970d693SJung-uk Kim                 {
33251970d693SJung-uk Kim                     return (Status);
33261970d693SJung-uk Kim                 }
33271970d693SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
33281970d693SJung-uk Kim                 break;
33291970d693SJung-uk Kim 
33301970d693SJung-uk Kim             default:
33311970d693SJung-uk Kim 
33321970d693SJung-uk Kim                 DtFatal (ASL_MSG_UNKNOWN_FORMAT, SubtableStart,
33331970d693SJung-uk Kim                     "IVRS Device Entry");
33341970d693SJung-uk Kim                 return (AE_ERROR);
33351970d693SJung-uk Kim             }
33361970d693SJung-uk Kim 
33371970d693SJung-uk Kim         default:
33381970d693SJung-uk Kim 
33391970d693SJung-uk Kim             /* All other subtable types come through here */
33401970d693SJung-uk Kim             break;
33411970d693SJung-uk Kim         }
3342f8146b88SJung-uk Kim     }
3343f8146b88SJung-uk Kim 
3344f8146b88SJung-uk Kim     return (AE_OK);
3345f8146b88SJung-uk Kim }
3346*58308fadSJung-uk Kim 
3347*58308fadSJung-uk Kim 
3348*58308fadSJung-uk Kim /******************************************************************************
3349*58308fadSJung-uk Kim  *
3350*58308fadSJung-uk Kim  * FUNCTION:    DtCompileRimt
3351*58308fadSJung-uk Kim  *
3352*58308fadSJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
3353*58308fadSJung-uk Kim  *
3354*58308fadSJung-uk Kim  * RETURN:      Status
3355*58308fadSJung-uk Kim  *
3356*58308fadSJung-uk Kim  * DESCRIPTION: Compile RIMT.
3357*58308fadSJung-uk Kim  *
3358*58308fadSJung-uk Kim  *****************************************************************************/
3359*58308fadSJung-uk Kim 
3360*58308fadSJung-uk Kim ACPI_STATUS
DtCompileRimt(void ** List)3361*58308fadSJung-uk Kim DtCompileRimt (
3362*58308fadSJung-uk Kim     void                    **List)
3363*58308fadSJung-uk Kim {
3364*58308fadSJung-uk Kim     ACPI_RIMT_PLATFORM_DEVICE  *PlatDevNode;
3365*58308fadSJung-uk Kim     ACPI_RIMT_PCIE_RC          *PcieRcNode;
3366*58308fadSJung-uk Kim     ACPI_TABLE_RIMT            *Rimt;
3367*58308fadSJung-uk Kim     ACPI_RIMT_IOMMU            *IommuNode;
3368*58308fadSJung-uk Kim     ACPI_RIMT_NODE             *RimtNode;
3369*58308fadSJung-uk Kim     ACPI_STATUS                Status;
3370*58308fadSJung-uk Kim     DT_SUBTABLE                *Subtable;
3371*58308fadSJung-uk Kim     DT_SUBTABLE                *ParentTable;
3372*58308fadSJung-uk Kim     DT_FIELD                   **PFieldList = (DT_FIELD **) List;
3373*58308fadSJung-uk Kim     DT_FIELD                   *SubtableStart;
3374*58308fadSJung-uk Kim     UINT32                     NodeNumber;
3375*58308fadSJung-uk Kim     UINT32                     NodeLength;
3376*58308fadSJung-uk Kim     UINT16                     IdMappingNumber;
3377*58308fadSJung-uk Kim     UINT32                     i;
3378*58308fadSJung-uk Kim 
3379*58308fadSJung-uk Kim 
3380*58308fadSJung-uk Kim     ParentTable = DtPeekSubtable ();
3381*58308fadSJung-uk Kim 
3382*58308fadSJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRimt, &Subtable);
3383*58308fadSJung-uk Kim     if (ACPI_FAILURE (Status))
3384*58308fadSJung-uk Kim     {
3385*58308fadSJung-uk Kim         return (Status);
3386*58308fadSJung-uk Kim     }
3387*58308fadSJung-uk Kim 
3388*58308fadSJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
3389*58308fadSJung-uk Kim 
3390*58308fadSJung-uk Kim     /*
3391*58308fadSJung-uk Kim      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
3392*58308fadSJung-uk Kim      * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
3393*58308fadSJung-uk Kim      */
3394*58308fadSJung-uk Kim     Rimt = ACPI_SUB_PTR (ACPI_TABLE_RIMT, Subtable->Buffer,
3395*58308fadSJung-uk Kim                          sizeof (ACPI_TABLE_HEADER));
3396*58308fadSJung-uk Kim 
3397*58308fadSJung-uk Kim     NodeNumber = 0;
3398*58308fadSJung-uk Kim     while (*PFieldList)
3399*58308fadSJung-uk Kim     {
3400*58308fadSJung-uk Kim         SubtableStart = *PFieldList;
3401*58308fadSJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoRimtNodeHdr, &Subtable);
3402*58308fadSJung-uk Kim 
3403*58308fadSJung-uk Kim         if (ACPI_FAILURE (Status))
3404*58308fadSJung-uk Kim         {
3405*58308fadSJung-uk Kim             return (Status);
3406*58308fadSJung-uk Kim         }
3407*58308fadSJung-uk Kim 
3408*58308fadSJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
3409*58308fadSJung-uk Kim         RimtNode = ACPI_CAST_PTR (ACPI_RIMT_NODE, Subtable->Buffer);
3410*58308fadSJung-uk Kim         NodeLength = ACPI_OFFSET (ACPI_RIMT_NODE, NodeData);
3411*58308fadSJung-uk Kim 
3412*58308fadSJung-uk Kim         DtPushSubtable (Subtable);
3413*58308fadSJung-uk Kim         ParentTable = DtPeekSubtable ();
3414*58308fadSJung-uk Kim 
3415*58308fadSJung-uk Kim         switch (RimtNode->Type)
3416*58308fadSJung-uk Kim         {
3417*58308fadSJung-uk Kim         case ACPI_RIMT_NODE_TYPE_IOMMU:
3418*58308fadSJung-uk Kim 
3419*58308fadSJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoRimtIommu,
3420*58308fadSJung-uk Kim                                      &Subtable);
3421*58308fadSJung-uk Kim             if (ACPI_FAILURE (Status))
3422*58308fadSJung-uk Kim             {
3423*58308fadSJung-uk Kim                 return (Status);
3424*58308fadSJung-uk Kim             }
3425*58308fadSJung-uk Kim 
3426*58308fadSJung-uk Kim             IommuNode = ACPI_CAST_PTR (ACPI_RIMT_IOMMU, Subtable->Buffer);
3427*58308fadSJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
3428*58308fadSJung-uk Kim             NodeLength += Subtable->Length;
3429*58308fadSJung-uk Kim 
3430*58308fadSJung-uk Kim             for (i = 0; i < IommuNode->NumInterruptWires; i++)
3431*58308fadSJung-uk Kim             {
3432*58308fadSJung-uk Kim                 while (*PFieldList)
3433*58308fadSJung-uk Kim                 {
3434*58308fadSJung-uk Kim                     Status = DtCompileTable (PFieldList,
3435*58308fadSJung-uk Kim                                              AcpiDmTableInfoRimtIommuWire,
3436*58308fadSJung-uk Kim                                              &Subtable);
3437*58308fadSJung-uk Kim                     if (ACPI_FAILURE (Status))
3438*58308fadSJung-uk Kim                     {
3439*58308fadSJung-uk Kim                         return (Status);
3440*58308fadSJung-uk Kim                     }
3441*58308fadSJung-uk Kim                     if (!Subtable)
3442*58308fadSJung-uk Kim                     {
3443*58308fadSJung-uk Kim                         break;
3444*58308fadSJung-uk Kim                     }
3445*58308fadSJung-uk Kim 
3446*58308fadSJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
3447*58308fadSJung-uk Kim                     NodeLength += Subtable->Length;
3448*58308fadSJung-uk Kim                 }
3449*58308fadSJung-uk Kim             }
3450*58308fadSJung-uk Kim 
3451*58308fadSJung-uk Kim             break;
3452*58308fadSJung-uk Kim 
3453*58308fadSJung-uk Kim         case ACPI_RIMT_NODE_TYPE_PCIE_ROOT_COMPLEX:
3454*58308fadSJung-uk Kim 
3455*58308fadSJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoRimtPcieRc,
3456*58308fadSJung-uk Kim                                      &Subtable);
3457*58308fadSJung-uk Kim             if (ACPI_FAILURE (Status))
3458*58308fadSJung-uk Kim             {
3459*58308fadSJung-uk Kim                 return (Status);
3460*58308fadSJung-uk Kim             }
3461*58308fadSJung-uk Kim 
3462*58308fadSJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
3463*58308fadSJung-uk Kim             PcieRcNode = ACPI_CAST_PTR (ACPI_RIMT_PCIE_RC, Subtable->Buffer);
3464*58308fadSJung-uk Kim             NodeLength += Subtable->Length;
3465*58308fadSJung-uk Kim 
3466*58308fadSJung-uk Kim             /* Compile Array of ID mappings */
3467*58308fadSJung-uk Kim 
3468*58308fadSJung-uk Kim             PcieRcNode->IdMappingOffset = (UINT16) NodeLength;
3469*58308fadSJung-uk Kim             IdMappingNumber = 0;
3470*58308fadSJung-uk Kim             while (*PFieldList)
3471*58308fadSJung-uk Kim             {
3472*58308fadSJung-uk Kim                 Status = DtCompileTable (PFieldList,
3473*58308fadSJung-uk Kim                                          AcpiDmTableInfoRimtIdMapping,
3474*58308fadSJung-uk Kim                                          &Subtable);
3475*58308fadSJung-uk Kim                 if (ACPI_FAILURE (Status))
3476*58308fadSJung-uk Kim                 {
3477*58308fadSJung-uk Kim                     return (Status);
3478*58308fadSJung-uk Kim                 }
3479*58308fadSJung-uk Kim 
3480*58308fadSJung-uk Kim                 if (!Subtable)
3481*58308fadSJung-uk Kim                 {
3482*58308fadSJung-uk Kim                     break;
3483*58308fadSJung-uk Kim                 }
3484*58308fadSJung-uk Kim 
3485*58308fadSJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
3486*58308fadSJung-uk Kim                 NodeLength += sizeof (ACPI_RIMT_ID_MAPPING);
3487*58308fadSJung-uk Kim                 IdMappingNumber++;
3488*58308fadSJung-uk Kim             }
3489*58308fadSJung-uk Kim 
3490*58308fadSJung-uk Kim             PcieRcNode->NumIdMappings = IdMappingNumber;
3491*58308fadSJung-uk Kim             if (!IdMappingNumber)
3492*58308fadSJung-uk Kim             {
3493*58308fadSJung-uk Kim                 PcieRcNode->IdMappingOffset = 0;
3494*58308fadSJung-uk Kim             }
3495*58308fadSJung-uk Kim 
3496*58308fadSJung-uk Kim             break;
3497*58308fadSJung-uk Kim 
3498*58308fadSJung-uk Kim         case ACPI_RIMT_NODE_TYPE_PLAT_DEVICE:
3499*58308fadSJung-uk Kim 
3500*58308fadSJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoRimtPlatDev,
3501*58308fadSJung-uk Kim                                      &Subtable);
3502*58308fadSJung-uk Kim             if (ACPI_FAILURE (Status))
3503*58308fadSJung-uk Kim             {
3504*58308fadSJung-uk Kim                 return (Status);
3505*58308fadSJung-uk Kim             }
3506*58308fadSJung-uk Kim 
3507*58308fadSJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
3508*58308fadSJung-uk Kim             PlatDevNode = ACPI_CAST_PTR (ACPI_RIMT_PLATFORM_DEVICE, Subtable->Buffer);
3509*58308fadSJung-uk Kim             NodeLength += Subtable->Length;
3510*58308fadSJung-uk Kim 
3511*58308fadSJung-uk Kim             /*
3512*58308fadSJung-uk Kim              * Padding - Variable-length data
3513*58308fadSJung-uk Kim              * Optionally allows the offset of the ID mappings to be used
3514*58308fadSJung-uk Kim              * for filling this field.
3515*58308fadSJung-uk Kim              */
3516*58308fadSJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoRimtPlatDevPad,
3517*58308fadSJung-uk Kim                                      &Subtable);
3518*58308fadSJung-uk Kim             if (ACPI_FAILURE (Status))
3519*58308fadSJung-uk Kim             {
3520*58308fadSJung-uk Kim                 return (Status);
3521*58308fadSJung-uk Kim             }
3522*58308fadSJung-uk Kim 
3523*58308fadSJung-uk Kim             if (Subtable)
3524*58308fadSJung-uk Kim             {
3525*58308fadSJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
3526*58308fadSJung-uk Kim                 NodeLength += Subtable->Length;
3527*58308fadSJung-uk Kim             }
3528*58308fadSJung-uk Kim             else
3529*58308fadSJung-uk Kim             {
3530*58308fadSJung-uk Kim                 if (NodeLength > PlatDevNode->IdMappingOffset)
3531*58308fadSJung-uk Kim                 {
3532*58308fadSJung-uk Kim                     return (AE_BAD_DATA);
3533*58308fadSJung-uk Kim                 }
3534*58308fadSJung-uk Kim 
3535*58308fadSJung-uk Kim                 if (NodeLength < PlatDevNode->IdMappingOffset)
3536*58308fadSJung-uk Kim                 {
3537*58308fadSJung-uk Kim                     Status = DtCompilePadding (
3538*58308fadSJung-uk Kim                         PlatDevNode->IdMappingOffset - (UINT16) NodeLength,
3539*58308fadSJung-uk Kim                         &Subtable);
3540*58308fadSJung-uk Kim                     if (ACPI_FAILURE (Status))
3541*58308fadSJung-uk Kim                     {
3542*58308fadSJung-uk Kim                         return (Status);
3543*58308fadSJung-uk Kim                     }
3544*58308fadSJung-uk Kim 
3545*58308fadSJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
3546*58308fadSJung-uk Kim                     NodeLength = PlatDevNode->IdMappingOffset;
3547*58308fadSJung-uk Kim                 }
3548*58308fadSJung-uk Kim             }
3549*58308fadSJung-uk Kim 
3550*58308fadSJung-uk Kim             /* Compile Array of ID mappings */
3551*58308fadSJung-uk Kim 
3552*58308fadSJung-uk Kim             PlatDevNode->IdMappingOffset = (UINT16) NodeLength;
3553*58308fadSJung-uk Kim             IdMappingNumber = 0;
3554*58308fadSJung-uk Kim             while (*PFieldList)
3555*58308fadSJung-uk Kim             {
3556*58308fadSJung-uk Kim                 Status = DtCompileTable (PFieldList,
3557*58308fadSJung-uk Kim                                          AcpiDmTableInfoRimtIdMapping,
3558*58308fadSJung-uk Kim                                          &Subtable);
3559*58308fadSJung-uk Kim                 if (ACPI_FAILURE (Status))
3560*58308fadSJung-uk Kim                 {
3561*58308fadSJung-uk Kim                     return (Status);
3562*58308fadSJung-uk Kim                 }
3563*58308fadSJung-uk Kim 
3564*58308fadSJung-uk Kim                 if (!Subtable)
3565*58308fadSJung-uk Kim                 {
3566*58308fadSJung-uk Kim                     break;
3567*58308fadSJung-uk Kim                 }
3568*58308fadSJung-uk Kim 
3569*58308fadSJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
3570*58308fadSJung-uk Kim                 NodeLength += sizeof (ACPI_RIMT_ID_MAPPING);
3571*58308fadSJung-uk Kim                 IdMappingNumber++;
3572*58308fadSJung-uk Kim             }
3573*58308fadSJung-uk Kim 
3574*58308fadSJung-uk Kim             PlatDevNode->NumIdMappings = IdMappingNumber;
3575*58308fadSJung-uk Kim             if (!IdMappingNumber)
3576*58308fadSJung-uk Kim             {
3577*58308fadSJung-uk Kim                 PlatDevNode->IdMappingOffset = 0;
3578*58308fadSJung-uk Kim             }
3579*58308fadSJung-uk Kim 
3580*58308fadSJung-uk Kim             break;
3581*58308fadSJung-uk Kim 
3582*58308fadSJung-uk Kim 
3583*58308fadSJung-uk Kim         default:
3584*58308fadSJung-uk Kim 
3585*58308fadSJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "RIMT");
3586*58308fadSJung-uk Kim             return (AE_ERROR);
3587*58308fadSJung-uk Kim         }
3588*58308fadSJung-uk Kim 
3589*58308fadSJung-uk Kim         DtPopSubtable ();
3590*58308fadSJung-uk Kim         ParentTable = DtPeekSubtable ();
3591*58308fadSJung-uk Kim         NodeNumber++;
3592*58308fadSJung-uk Kim     }
3593*58308fadSJung-uk Kim 
3594*58308fadSJung-uk Kim     Rimt->NumNodes = NodeNumber;
3595*58308fadSJung-uk Kim     return (AE_OK);
3596*58308fadSJung-uk Kim }
3597