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