xref: /dflybsd-src/sys/contrib/dev/acpica/source/compiler/dttable1.c (revision 0672a19b343a7dc4779f259e126307624463026c)
1820c5b08SSascha Wildner /******************************************************************************
2820c5b08SSascha Wildner  *
3820c5b08SSascha Wildner  * Module Name: dttable1.c - handling for specific ACPI tables
4820c5b08SSascha Wildner  *
5820c5b08SSascha Wildner  *****************************************************************************/
6820c5b08SSascha Wildner 
7b4315fc7SSascha Wildner /******************************************************************************
8b4315fc7SSascha Wildner  *
9b4315fc7SSascha Wildner  * 1. Copyright Notice
10b4315fc7SSascha Wildner  *
11383048acSSascha Wildner  * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
12820c5b08SSascha Wildner  * All rights reserved.
13820c5b08SSascha Wildner  *
14b4315fc7SSascha Wildner  * 2. License
15b4315fc7SSascha Wildner  *
16b4315fc7SSascha Wildner  * 2.1. This is your license from Intel Corp. under its intellectual property
17b4315fc7SSascha Wildner  * rights. You may have additional license terms from the party that provided
18b4315fc7SSascha Wildner  * you this software, covering your right to use that party's intellectual
19b4315fc7SSascha Wildner  * property rights.
20b4315fc7SSascha Wildner  *
21b4315fc7SSascha Wildner  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22b4315fc7SSascha Wildner  * copy of the source code appearing in this file ("Covered Code") an
23b4315fc7SSascha Wildner  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24b4315fc7SSascha Wildner  * base code distributed originally by Intel ("Original Intel Code") to copy,
25b4315fc7SSascha Wildner  * make derivatives, distribute, use and display any portion of the Covered
26b4315fc7SSascha Wildner  * Code in any form, with the right to sublicense such rights; and
27b4315fc7SSascha Wildner  *
28b4315fc7SSascha Wildner  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29b4315fc7SSascha Wildner  * license (with the right to sublicense), under only those claims of Intel
30b4315fc7SSascha Wildner  * patents that are infringed by the Original Intel Code, to make, use, sell,
31b4315fc7SSascha Wildner  * offer to sell, and import the Covered Code and derivative works thereof
32b4315fc7SSascha Wildner  * solely to the minimum extent necessary to exercise the above copyright
33b4315fc7SSascha Wildner  * license, and in no event shall the patent license extend to any additions
34b4315fc7SSascha Wildner  * to or modifications of the Original Intel Code. No other license or right
35b4315fc7SSascha Wildner  * is granted directly or by implication, estoppel or otherwise;
36b4315fc7SSascha Wildner  *
37b4315fc7SSascha Wildner  * The above copyright and patent license is granted only if the following
38b4315fc7SSascha Wildner  * conditions are met:
39b4315fc7SSascha Wildner  *
40b4315fc7SSascha Wildner  * 3. Conditions
41b4315fc7SSascha Wildner  *
42b4315fc7SSascha Wildner  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
44b4315fc7SSascha Wildner  * Code or modification with rights to further distribute source must include
45b4315fc7SSascha Wildner  * the above Copyright Notice, the above License, this list of Conditions,
46b4315fc7SSascha Wildner  * and the following Disclaimer and Export Compliance provision. In addition,
47b4315fc7SSascha Wildner  * Licensee must cause all Covered Code to which Licensee contributes to
48b4315fc7SSascha Wildner  * contain a file documenting the changes Licensee made to create that Covered
49b4315fc7SSascha Wildner  * Code and the date of any change. Licensee must include in that file the
50b4315fc7SSascha Wildner  * documentation of any changes made by any predecessor Licensee. Licensee
51b4315fc7SSascha Wildner  * must include a prominent statement that the modification is derived,
52b4315fc7SSascha Wildner  * directly or indirectly, from Original Intel Code.
53b4315fc7SSascha Wildner  *
54b4315fc7SSascha Wildner  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
56b4315fc7SSascha Wildner  * Code or modification without rights to further distribute source must
57b4315fc7SSascha Wildner  * include the following Disclaimer and Export Compliance provision in the
58b4315fc7SSascha Wildner  * documentation and/or other materials provided with distribution. In
59b4315fc7SSascha Wildner  * addition, Licensee may not authorize further sublicense of source of any
60b4315fc7SSascha Wildner  * portion of the Covered Code, and must include terms to the effect that the
61b4315fc7SSascha Wildner  * license from Licensee to its licensee is limited to the intellectual
62b4315fc7SSascha Wildner  * property embodied in the software Licensee provides to its licensee, and
63b4315fc7SSascha Wildner  * not to intellectual property embodied in modifications its licensee may
64b4315fc7SSascha Wildner  * make.
65b4315fc7SSascha Wildner  *
66b4315fc7SSascha Wildner  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67b4315fc7SSascha Wildner  * substantial portion of the Covered Code or modification must reproduce the
68b4315fc7SSascha Wildner  * above Copyright Notice, and the following Disclaimer and Export Compliance
69b4315fc7SSascha Wildner  * provision in the documentation and/or other materials provided with the
70b4315fc7SSascha Wildner  * distribution.
71b4315fc7SSascha Wildner  *
72b4315fc7SSascha Wildner  * 3.4. Intel retains all right, title, and interest in and to the Original
73b4315fc7SSascha Wildner  * Intel Code.
74b4315fc7SSascha Wildner  *
75b4315fc7SSascha Wildner  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76b4315fc7SSascha Wildner  * Intel shall be used in advertising or otherwise to promote the sale, use or
77b4315fc7SSascha Wildner  * other dealings in products derived from or relating to the Covered Code
78b4315fc7SSascha Wildner  * without prior written authorization from Intel.
79b4315fc7SSascha Wildner  *
80b4315fc7SSascha Wildner  * 4. Disclaimer and Export Compliance
81b4315fc7SSascha Wildner  *
82b4315fc7SSascha Wildner  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83b4315fc7SSascha Wildner  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84b4315fc7SSascha Wildner  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85b4315fc7SSascha Wildner  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86b4315fc7SSascha Wildner  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87b4315fc7SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88b4315fc7SSascha Wildner  * PARTICULAR PURPOSE.
89b4315fc7SSascha Wildner  *
90b4315fc7SSascha Wildner  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91b4315fc7SSascha Wildner  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92b4315fc7SSascha Wildner  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93b4315fc7SSascha Wildner  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94b4315fc7SSascha Wildner  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95b4315fc7SSascha Wildner  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96b4315fc7SSascha Wildner  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97b4315fc7SSascha Wildner  * LIMITED REMEDY.
98b4315fc7SSascha Wildner  *
99b4315fc7SSascha Wildner  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100b4315fc7SSascha Wildner  * software or system incorporating such software without first obtaining any
101b4315fc7SSascha Wildner  * required license or other approval from the U. S. Department of Commerce or
102b4315fc7SSascha Wildner  * any other agency or department of the United States Government. In the
103b4315fc7SSascha Wildner  * event Licensee exports any such software from the United States or
104b4315fc7SSascha Wildner  * re-exports any such software from a foreign destination, Licensee shall
105b4315fc7SSascha Wildner  * ensure that the distribution and export/re-export of the software is in
106b4315fc7SSascha Wildner  * compliance with all laws, regulations, orders, or other restrictions of the
107b4315fc7SSascha Wildner  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108b4315fc7SSascha Wildner  * any of its subsidiaries will export/re-export any technical data, process,
109b4315fc7SSascha Wildner  * software, or service, directly or indirectly, to any country for which the
110b4315fc7SSascha Wildner  * United States government or any agency thereof requires an export license,
111b4315fc7SSascha Wildner  * other governmental approval, or letter of assurance, without first obtaining
112b4315fc7SSascha Wildner  * such license, approval or letter.
113b4315fc7SSascha Wildner  *
114b4315fc7SSascha Wildner  *****************************************************************************
115b4315fc7SSascha Wildner  *
116b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
117b4315fc7SSascha Wildner  * following license:
118b4315fc7SSascha Wildner  *
119820c5b08SSascha Wildner  * Redistribution and use in source and binary forms, with or without
120820c5b08SSascha Wildner  * modification, are permitted provided that the following conditions
121820c5b08SSascha Wildner  * are met:
122820c5b08SSascha Wildner  * 1. Redistributions of source code must retain the above copyright
123820c5b08SSascha Wildner  *    notice, this list of conditions, and the following disclaimer,
124820c5b08SSascha Wildner  *    without modification.
125820c5b08SSascha Wildner  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126820c5b08SSascha Wildner  *    substantially similar to the "NO WARRANTY" disclaimer below
127820c5b08SSascha Wildner  *    ("Disclaimer") and any redistribution must be conditioned upon
128820c5b08SSascha Wildner  *    including a substantially similar Disclaimer requirement for further
129820c5b08SSascha Wildner  *    binary redistribution.
130820c5b08SSascha Wildner  * 3. Neither the names of the above-listed copyright holders nor the names
131820c5b08SSascha Wildner  *    of any contributors may be used to endorse or promote products derived
132820c5b08SSascha Wildner  *    from this software without specific prior written permission.
133820c5b08SSascha Wildner  *
134b4315fc7SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135b4315fc7SSascha Wildner  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136b4315fc7SSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137b4315fc7SSascha Wildner  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138b4315fc7SSascha Wildner  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139b4315fc7SSascha Wildner  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140b4315fc7SSascha Wildner  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141b4315fc7SSascha Wildner  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142b4315fc7SSascha Wildner  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143b4315fc7SSascha Wildner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144b4315fc7SSascha Wildner  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145b4315fc7SSascha Wildner  *
146b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
147820c5b08SSascha Wildner  * GNU General Public License ("GPL") version 2 as published by the Free
148820c5b08SSascha Wildner  * Software Foundation.
149820c5b08SSascha Wildner  *
150b4315fc7SSascha Wildner  *****************************************************************************/
151820c5b08SSascha Wildner 
152820c5b08SSascha Wildner /* Compile all complex data tables, signatures starting with A-I */
153820c5b08SSascha Wildner 
154820c5b08SSascha Wildner #include "aslcompiler.h"
155820c5b08SSascha Wildner 
156820c5b08SSascha Wildner #define _COMPONENT          DT_COMPILER
157820c5b08SSascha Wildner         ACPI_MODULE_NAME    ("dttable1")
158820c5b08SSascha Wildner 
159820c5b08SSascha Wildner 
160820c5b08SSascha Wildner static ACPI_DMTABLE_INFO           TableInfoAsfAddress[] =
161820c5b08SSascha Wildner {
162820c5b08SSascha Wildner     {ACPI_DMT_BUFFER,   0,               "Addresses", 0},
163820c5b08SSascha Wildner     {ACPI_DMT_EXIT,     0,               NULL, 0}
164820c5b08SSascha Wildner };
165820c5b08SSascha Wildner 
166820c5b08SSascha Wildner static ACPI_DMTABLE_INFO           TableInfoDmarPciPath[] =
167820c5b08SSascha Wildner {
168820c5b08SSascha Wildner     {ACPI_DMT_PCI_PATH, 0,               "PCI Path", 0},
169820c5b08SSascha Wildner     {ACPI_DMT_EXIT,     0,               NULL, 0}
170820c5b08SSascha Wildner };
171820c5b08SSascha Wildner 
172820c5b08SSascha Wildner 
173820c5b08SSascha Wildner /******************************************************************************
174820c5b08SSascha Wildner  *
175*0672a19bSSascha Wildner  * FUNCTION:    DtCompileAest
176*0672a19bSSascha Wildner  *
177*0672a19bSSascha Wildner  * PARAMETERS:  List                - Current field list pointer
178*0672a19bSSascha Wildner  *
179*0672a19bSSascha Wildner  * RETURN:      Status
180*0672a19bSSascha Wildner  *
181*0672a19bSSascha Wildner  * DESCRIPTION: Compile AEST.
182*0672a19bSSascha Wildner  *
183*0672a19bSSascha Wildner  * NOTE: Assumes the following table structure:
184*0672a19bSSascha Wildner  *      For all AEST Error Nodes:
185*0672a19bSSascha Wildner  *          1) An AEST Error Node, followed immediately by:
186*0672a19bSSascha Wildner  *          2) Any node-specific data
187*0672a19bSSascha Wildner  *          3) An Interface Structure (one)
188*0672a19bSSascha Wildner  *          4) A list (array) of Interrupt Structures, the count as specified
189*0672a19bSSascha Wildner  *              in the NodeInterruptCount field of the Error Node header.
190*0672a19bSSascha Wildner  *
191*0672a19bSSascha Wildner  * AEST - ARM Error Source table. Conforms to:
192*0672a19bSSascha Wildner  * ACPI for the Armv8 RAS Extensions 1.1 Platform Design Document Sep 2020
193*0672a19bSSascha Wildner  *
194*0672a19bSSascha Wildner  *****************************************************************************/
195*0672a19bSSascha Wildner 
196*0672a19bSSascha Wildner ACPI_STATUS
DtCompileAest(void ** List)197*0672a19bSSascha Wildner DtCompileAest (
198*0672a19bSSascha Wildner     void                    **List)
199*0672a19bSSascha Wildner {
200*0672a19bSSascha Wildner     ACPI_AEST_HEADER        *ErrorNodeHeader;
201*0672a19bSSascha Wildner     ACPI_AEST_PROCESSOR     *AestProcessor;
202*0672a19bSSascha Wildner     DT_SUBTABLE             *Subtable;
203*0672a19bSSascha Wildner     DT_SUBTABLE             *ParentTable;
204*0672a19bSSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable;
205*0672a19bSSascha Wildner     ACPI_STATUS             Status;
206*0672a19bSSascha Wildner     UINT32                  i;
207*0672a19bSSascha Wildner     UINT32                  Offset;
208*0672a19bSSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
209*0672a19bSSascha Wildner 
210*0672a19bSSascha Wildner 
211*0672a19bSSascha Wildner     while (*PFieldList)
212*0672a19bSSascha Wildner     {
213*0672a19bSSascha Wildner         /* Compile the common error node header */
214*0672a19bSSascha Wildner 
215*0672a19bSSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoAestHdr,
216*0672a19bSSascha Wildner             &Subtable);
217*0672a19bSSascha Wildner         if (ACPI_FAILURE (Status))
218*0672a19bSSascha Wildner         {
219*0672a19bSSascha Wildner             return (Status);
220*0672a19bSSascha Wildner         }
221*0672a19bSSascha Wildner 
222*0672a19bSSascha Wildner         ParentTable = DtPeekSubtable ();
223*0672a19bSSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
224*0672a19bSSascha Wildner 
225*0672a19bSSascha Wildner         /* Everything past the error node header will be a subtable */
226*0672a19bSSascha Wildner 
227*0672a19bSSascha Wildner         DtPushSubtable (Subtable);
228*0672a19bSSascha Wildner 
229*0672a19bSSascha Wildner         /*
230*0672a19bSSascha Wildner          * Compile the node-specific structure (Based on the error
231*0672a19bSSascha Wildner          * node header Type field)
232*0672a19bSSascha Wildner          */
233*0672a19bSSascha Wildner         ErrorNodeHeader = ACPI_CAST_PTR (ACPI_AEST_HEADER, Subtable->Buffer);
234*0672a19bSSascha Wildner 
235*0672a19bSSascha Wildner         /* Point past the common error node header */
236*0672a19bSSascha Wildner 
237*0672a19bSSascha Wildner         Offset = sizeof (ACPI_AEST_HEADER);
238*0672a19bSSascha Wildner         ErrorNodeHeader->NodeSpecificOffset = Offset;
239*0672a19bSSascha Wildner 
240*0672a19bSSascha Wildner         /* Decode the error node type */
241*0672a19bSSascha Wildner 
242*0672a19bSSascha Wildner         switch (ErrorNodeHeader->Type)
243*0672a19bSSascha Wildner         {
244*0672a19bSSascha Wildner         case ACPI_AEST_PROCESSOR_ERROR_NODE:
245*0672a19bSSascha Wildner 
246*0672a19bSSascha Wildner             InfoTable = AcpiDmTableInfoAestProcError;
247*0672a19bSSascha Wildner             break;
248*0672a19bSSascha Wildner 
249*0672a19bSSascha Wildner         case ACPI_AEST_MEMORY_ERROR_NODE:
250*0672a19bSSascha Wildner 
251*0672a19bSSascha Wildner             InfoTable = AcpiDmTableInfoAestMemError;
252*0672a19bSSascha Wildner             break;
253*0672a19bSSascha Wildner 
254*0672a19bSSascha Wildner         case ACPI_AEST_SMMU_ERROR_NODE:
255*0672a19bSSascha Wildner 
256*0672a19bSSascha Wildner             InfoTable = AcpiDmTableInfoAestSmmuError;
257*0672a19bSSascha Wildner             break;
258*0672a19bSSascha Wildner 
259*0672a19bSSascha Wildner         case ACPI_AEST_VENDOR_ERROR_NODE:
260*0672a19bSSascha Wildner 
261*0672a19bSSascha Wildner             InfoTable = AcpiDmTableInfoAestVendorError;
262*0672a19bSSascha Wildner             break;
263*0672a19bSSascha Wildner 
264*0672a19bSSascha Wildner         case ACPI_AEST_GIC_ERROR_NODE:
265*0672a19bSSascha Wildner 
266*0672a19bSSascha Wildner             InfoTable = AcpiDmTableInfoAestGicError;
267*0672a19bSSascha Wildner             break;
268*0672a19bSSascha Wildner 
269*0672a19bSSascha Wildner         /* Error case below */
270*0672a19bSSascha Wildner         default:
271*0672a19bSSascha Wildner             AcpiOsPrintf ("Unknown AEST Subtable Type: %X\n",
272*0672a19bSSascha Wildner                 ErrorNodeHeader->Type);
273*0672a19bSSascha Wildner             return (AE_ERROR);
274*0672a19bSSascha Wildner         }
275*0672a19bSSascha Wildner 
276*0672a19bSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
277*0672a19bSSascha Wildner         if (ACPI_FAILURE (Status))
278*0672a19bSSascha Wildner         {
279*0672a19bSSascha Wildner             return (Status);
280*0672a19bSSascha Wildner         }
281*0672a19bSSascha Wildner 
282*0672a19bSSascha Wildner         /* Point past the node-specific structure */
283*0672a19bSSascha Wildner 
284*0672a19bSSascha Wildner         Offset += Subtable->Length;
285*0672a19bSSascha Wildner         ErrorNodeHeader->NodeInterfaceOffset = Offset;
286*0672a19bSSascha Wildner 
287*0672a19bSSascha Wildner         ParentTable = DtPeekSubtable ();
288*0672a19bSSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
289*0672a19bSSascha Wildner 
290*0672a19bSSascha Wildner         /* Compile any additional node-specific substructures */
291*0672a19bSSascha Wildner 
292*0672a19bSSascha Wildner         if (ErrorNodeHeader->Type == ACPI_AEST_PROCESSOR_ERROR_NODE)
293*0672a19bSSascha Wildner         {
294*0672a19bSSascha Wildner             /*
295*0672a19bSSascha Wildner              * Special handling for PROCESSOR_ERROR_NODE subtables
296*0672a19bSSascha Wildner              * (to handle the Resource Substructure via the ResourceType
297*0672a19bSSascha Wildner              * field).
298*0672a19bSSascha Wildner              */
299*0672a19bSSascha Wildner             AestProcessor = ACPI_CAST_PTR (ACPI_AEST_PROCESSOR,
300*0672a19bSSascha Wildner                 Subtable->Buffer);
301*0672a19bSSascha Wildner 
302*0672a19bSSascha Wildner             switch (AestProcessor->ResourceType)
303*0672a19bSSascha Wildner             {
304*0672a19bSSascha Wildner             case ACPI_AEST_CACHE_RESOURCE:
305*0672a19bSSascha Wildner 
306*0672a19bSSascha Wildner                 InfoTable = AcpiDmTableInfoAestCacheRsrc;
307*0672a19bSSascha Wildner                 break;
308*0672a19bSSascha Wildner 
309*0672a19bSSascha Wildner             case ACPI_AEST_TLB_RESOURCE:
310*0672a19bSSascha Wildner 
311*0672a19bSSascha Wildner                 InfoTable = AcpiDmTableInfoAestTlbRsrc;
312*0672a19bSSascha Wildner                 break;
313*0672a19bSSascha Wildner 
314*0672a19bSSascha Wildner             case ACPI_AEST_GENERIC_RESOURCE:
315*0672a19bSSascha Wildner 
316*0672a19bSSascha Wildner                 InfoTable = AcpiDmTableInfoAestGenRsrc;
317*0672a19bSSascha Wildner                 AcpiOsPrintf ("Generic Resource Type (%X) is not supported at this time\n",
318*0672a19bSSascha Wildner                     AestProcessor->ResourceType);
319*0672a19bSSascha Wildner                 return (AE_ERROR);
320*0672a19bSSascha Wildner 
321*0672a19bSSascha Wildner             /* Error case below */
322*0672a19bSSascha Wildner             default:
323*0672a19bSSascha Wildner                 AcpiOsPrintf ("Unknown AEST Processor Resource Type: %X\n",
324*0672a19bSSascha Wildner                     AestProcessor->ResourceType);
325*0672a19bSSascha Wildner                 return (AE_ERROR);
326*0672a19bSSascha Wildner             }
327*0672a19bSSascha Wildner 
328*0672a19bSSascha Wildner             Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
329*0672a19bSSascha Wildner             if (ACPI_FAILURE (Status))
330*0672a19bSSascha Wildner             {
331*0672a19bSSascha Wildner                 return (Status);
332*0672a19bSSascha Wildner             }
333*0672a19bSSascha Wildner 
334*0672a19bSSascha Wildner             /* Point past the resource substructure subtable */
335*0672a19bSSascha Wildner 
336*0672a19bSSascha Wildner             Offset += Subtable->Length;
337*0672a19bSSascha Wildner             ErrorNodeHeader->NodeInterfaceOffset = Offset;
338*0672a19bSSascha Wildner 
339*0672a19bSSascha Wildner             ParentTable = DtPeekSubtable ();
340*0672a19bSSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
341*0672a19bSSascha Wildner         }
342*0672a19bSSascha Wildner 
343*0672a19bSSascha Wildner         /* Compile the (required) node interface structure */
344*0672a19bSSascha Wildner 
345*0672a19bSSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoAestXface,
346*0672a19bSSascha Wildner             &Subtable);
347*0672a19bSSascha Wildner         if (ACPI_FAILURE (Status))
348*0672a19bSSascha Wildner         {
349*0672a19bSSascha Wildner             return (Status);
350*0672a19bSSascha Wildner         }
351*0672a19bSSascha Wildner 
352*0672a19bSSascha Wildner         ErrorNodeHeader->NodeInterruptOffset = 0;
353*0672a19bSSascha Wildner         ParentTable = DtPeekSubtable ();
354*0672a19bSSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
355*0672a19bSSascha Wildner 
356*0672a19bSSascha Wildner         /* Compile each of the node interrupt structures */
357*0672a19bSSascha Wildner 
358*0672a19bSSascha Wildner         if (ErrorNodeHeader->NodeInterruptCount)
359*0672a19bSSascha Wildner         {
360*0672a19bSSascha Wildner             /* Point to the first interrupt structure */
361*0672a19bSSascha Wildner 
362*0672a19bSSascha Wildner             Offset += Subtable->Length;
363*0672a19bSSascha Wildner             ErrorNodeHeader->NodeInterruptOffset = Offset;
364*0672a19bSSascha Wildner         }
365*0672a19bSSascha Wildner 
366*0672a19bSSascha Wildner         /* Compile each of the interrupt structures */
367*0672a19bSSascha Wildner 
368*0672a19bSSascha Wildner         for (i = 0; i < ErrorNodeHeader->NodeInterruptCount; i++)
369*0672a19bSSascha Wildner         {
370*0672a19bSSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoAestXrupt,
371*0672a19bSSascha Wildner                 &Subtable);
372*0672a19bSSascha Wildner             if (ACPI_FAILURE (Status))
373*0672a19bSSascha Wildner             {
374*0672a19bSSascha Wildner                 return (Status);
375*0672a19bSSascha Wildner             }
376*0672a19bSSascha Wildner 
377*0672a19bSSascha Wildner             ParentTable = DtPeekSubtable ();
378*0672a19bSSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
379*0672a19bSSascha Wildner         }
380*0672a19bSSascha Wildner 
381*0672a19bSSascha Wildner         /* Prepare for the next AEST Error node */
382*0672a19bSSascha Wildner 
383*0672a19bSSascha Wildner         DtPopSubtable ();
384*0672a19bSSascha Wildner     }
385*0672a19bSSascha Wildner 
386*0672a19bSSascha Wildner     return (AE_OK);
387*0672a19bSSascha Wildner }
388*0672a19bSSascha Wildner 
389*0672a19bSSascha Wildner 
390*0672a19bSSascha Wildner /******************************************************************************
391*0672a19bSSascha Wildner  *
392820c5b08SSascha Wildner  * FUNCTION:    DtCompileAsf
393820c5b08SSascha Wildner  *
394820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
395820c5b08SSascha Wildner  *
396820c5b08SSascha Wildner  * RETURN:      Status
397820c5b08SSascha Wildner  *
398820c5b08SSascha Wildner  * DESCRIPTION: Compile ASF!.
399820c5b08SSascha Wildner  *
400820c5b08SSascha Wildner  *****************************************************************************/
401820c5b08SSascha Wildner 
402820c5b08SSascha Wildner ACPI_STATUS
DtCompileAsf(void ** List)403820c5b08SSascha Wildner DtCompileAsf (
404820c5b08SSascha Wildner     void                    **List)
405820c5b08SSascha Wildner {
406820c5b08SSascha Wildner     ACPI_ASF_INFO           *AsfTable;
407820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
408820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
409820c5b08SSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable;
410820c5b08SSascha Wildner     ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
411820c5b08SSascha Wildner     UINT32                  DataCount = 0;
412820c5b08SSascha Wildner     ACPI_STATUS             Status;
413820c5b08SSascha Wildner     UINT32                  i;
414820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
415820c5b08SSascha Wildner     DT_FIELD                *SubtableStart;
416820c5b08SSascha Wildner 
417820c5b08SSascha Wildner 
418820c5b08SSascha Wildner     while (*PFieldList)
419820c5b08SSascha Wildner     {
420820c5b08SSascha Wildner         SubtableStart = *PFieldList;
421820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr,
4227bcb6cafSSascha Wildner             &Subtable);
423820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
424820c5b08SSascha Wildner         {
425820c5b08SSascha Wildner             return (Status);
426820c5b08SSascha Wildner         }
427820c5b08SSascha Wildner 
428820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
429820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
430820c5b08SSascha Wildner         DtPushSubtable (Subtable);
431820c5b08SSascha Wildner 
432820c5b08SSascha Wildner         AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer);
433820c5b08SSascha Wildner 
434820c5b08SSascha Wildner         switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
435820c5b08SSascha Wildner         {
436820c5b08SSascha Wildner         case ACPI_ASF_TYPE_INFO:
437820c5b08SSascha Wildner 
438820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoAsf0;
439820c5b08SSascha Wildner             break;
440820c5b08SSascha Wildner 
441820c5b08SSascha Wildner         case ACPI_ASF_TYPE_ALERT:
442820c5b08SSascha Wildner 
443820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoAsf1;
444820c5b08SSascha Wildner             break;
445820c5b08SSascha Wildner 
446820c5b08SSascha Wildner         case ACPI_ASF_TYPE_CONTROL:
447820c5b08SSascha Wildner 
448820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoAsf2;
449820c5b08SSascha Wildner             break;
450820c5b08SSascha Wildner 
451820c5b08SSascha Wildner         case ACPI_ASF_TYPE_BOOT:
452820c5b08SSascha Wildner 
453820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoAsf3;
454820c5b08SSascha Wildner             break;
455820c5b08SSascha Wildner 
456820c5b08SSascha Wildner         case ACPI_ASF_TYPE_ADDRESS:
457820c5b08SSascha Wildner 
458820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoAsf4;
459820c5b08SSascha Wildner             break;
460820c5b08SSascha Wildner 
461820c5b08SSascha Wildner         default:
462820c5b08SSascha Wildner 
463820c5b08SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
464820c5b08SSascha Wildner             return (AE_ERROR);
465820c5b08SSascha Wildner         }
466820c5b08SSascha Wildner 
4677bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
468820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
469820c5b08SSascha Wildner         {
470820c5b08SSascha Wildner             return (Status);
471820c5b08SSascha Wildner         }
472820c5b08SSascha Wildner 
473820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
474820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
475820c5b08SSascha Wildner 
476820c5b08SSascha Wildner         switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
477820c5b08SSascha Wildner         {
478820c5b08SSascha Wildner         case ACPI_ASF_TYPE_INFO:
479820c5b08SSascha Wildner 
480820c5b08SSascha Wildner             DataInfoTable = NULL;
481820c5b08SSascha Wildner             break;
482820c5b08SSascha Wildner 
483820c5b08SSascha Wildner         case ACPI_ASF_TYPE_ALERT:
484820c5b08SSascha Wildner 
485820c5b08SSascha Wildner             DataInfoTable = AcpiDmTableInfoAsf1a;
486820c5b08SSascha Wildner             DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT,
487820c5b08SSascha Wildner                 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
488820c5b08SSascha Wildner                     sizeof (ACPI_ASF_HEADER)))->Alerts;
489820c5b08SSascha Wildner             break;
490820c5b08SSascha Wildner 
491820c5b08SSascha Wildner         case ACPI_ASF_TYPE_CONTROL:
492820c5b08SSascha Wildner 
493820c5b08SSascha Wildner             DataInfoTable = AcpiDmTableInfoAsf2a;
494820c5b08SSascha Wildner             DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE,
495820c5b08SSascha Wildner                 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
496820c5b08SSascha Wildner                     sizeof (ACPI_ASF_HEADER)))->Controls;
497820c5b08SSascha Wildner             break;
498820c5b08SSascha Wildner 
499820c5b08SSascha Wildner         case ACPI_ASF_TYPE_BOOT:
500820c5b08SSascha Wildner 
501820c5b08SSascha Wildner             DataInfoTable = NULL;
502820c5b08SSascha Wildner             break;
503820c5b08SSascha Wildner 
504820c5b08SSascha Wildner         case ACPI_ASF_TYPE_ADDRESS:
505820c5b08SSascha Wildner 
506820c5b08SSascha Wildner             DataInfoTable = TableInfoAsfAddress;
507820c5b08SSascha Wildner             DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS,
508820c5b08SSascha Wildner                 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
509820c5b08SSascha Wildner                     sizeof (ACPI_ASF_HEADER)))->Devices;
510820c5b08SSascha Wildner             break;
511820c5b08SSascha Wildner 
512820c5b08SSascha Wildner         default:
513820c5b08SSascha Wildner 
514820c5b08SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
515820c5b08SSascha Wildner             return (AE_ERROR);
516820c5b08SSascha Wildner         }
517820c5b08SSascha Wildner 
518820c5b08SSascha Wildner         if (DataInfoTable)
519820c5b08SSascha Wildner         {
520820c5b08SSascha Wildner             switch (AsfTable->Header.Type & 0x7F)
521820c5b08SSascha Wildner             {
522820c5b08SSascha Wildner             case ACPI_ASF_TYPE_ADDRESS:
523820c5b08SSascha Wildner 
524820c5b08SSascha Wildner                 while (DataCount > 0)
525820c5b08SSascha Wildner                 {
526820c5b08SSascha Wildner                     Status = DtCompileTable (PFieldList, DataInfoTable,
5277bcb6cafSSascha Wildner                         &Subtable);
528820c5b08SSascha Wildner                     if (ACPI_FAILURE (Status))
529820c5b08SSascha Wildner                     {
530820c5b08SSascha Wildner                         return (Status);
531820c5b08SSascha Wildner                     }
532820c5b08SSascha Wildner 
533820c5b08SSascha Wildner                     DtInsertSubtable (ParentTable, Subtable);
534820c5b08SSascha Wildner                     DataCount = DataCount - Subtable->Length;
535820c5b08SSascha Wildner                 }
536820c5b08SSascha Wildner                 break;
537820c5b08SSascha Wildner 
538820c5b08SSascha Wildner             default:
539820c5b08SSascha Wildner 
540820c5b08SSascha Wildner                 for (i = 0; i < DataCount; i++)
541820c5b08SSascha Wildner                 {
542820c5b08SSascha Wildner                     Status = DtCompileTable (PFieldList, DataInfoTable,
5437bcb6cafSSascha Wildner                         &Subtable);
544820c5b08SSascha Wildner                     if (ACPI_FAILURE (Status))
545820c5b08SSascha Wildner                     {
546820c5b08SSascha Wildner                         return (Status);
547820c5b08SSascha Wildner                     }
548820c5b08SSascha Wildner 
549820c5b08SSascha Wildner                     DtInsertSubtable (ParentTable, Subtable);
550820c5b08SSascha Wildner                 }
551820c5b08SSascha Wildner                 break;
552820c5b08SSascha Wildner             }
553820c5b08SSascha Wildner         }
554820c5b08SSascha Wildner 
555820c5b08SSascha Wildner         DtPopSubtable ();
556820c5b08SSascha Wildner     }
557820c5b08SSascha Wildner 
558820c5b08SSascha Wildner     return (AE_OK);
559820c5b08SSascha Wildner }
560820c5b08SSascha Wildner 
561820c5b08SSascha Wildner 
562820c5b08SSascha Wildner /******************************************************************************
563820c5b08SSascha Wildner  *
56401d5d5dfSSascha Wildner  * FUNCTION:    DtCompileCedt
56501d5d5dfSSascha Wildner  *
56601d5d5dfSSascha Wildner  * PARAMETERS:  List                - Current field list pointer
56701d5d5dfSSascha Wildner  *
56801d5d5dfSSascha Wildner  * RETURN:      Status
56901d5d5dfSSascha Wildner  *
57001d5d5dfSSascha Wildner  * DESCRIPTION: Compile CEDT.
57101d5d5dfSSascha Wildner  *
57201d5d5dfSSascha Wildner  *****************************************************************************/
57301d5d5dfSSascha Wildner 
57401d5d5dfSSascha Wildner ACPI_STATUS
DtCompileCedt(void ** List)57501d5d5dfSSascha Wildner DtCompileCedt (
57601d5d5dfSSascha Wildner     void                    **List)
57701d5d5dfSSascha Wildner {
57801d5d5dfSSascha Wildner     ACPI_STATUS             Status;
57901d5d5dfSSascha Wildner     DT_SUBTABLE             *Subtable;
58001d5d5dfSSascha Wildner     DT_SUBTABLE             *ParentTable;
58101d5d5dfSSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
58201d5d5dfSSascha Wildner     ACPI_CEDT_HEADER        *CedtHeader;
58301d5d5dfSSascha Wildner     DT_FIELD                *SubtableStart;
58401d5d5dfSSascha Wildner 
58501d5d5dfSSascha Wildner 
58601d5d5dfSSascha Wildner     /* Walk the parse tree */
58701d5d5dfSSascha Wildner 
58801d5d5dfSSascha Wildner     while (*PFieldList)
58901d5d5dfSSascha Wildner     {
59001d5d5dfSSascha Wildner         SubtableStart = *PFieldList;
59101d5d5dfSSascha Wildner 
59201d5d5dfSSascha Wildner         /* CEDT Header */
59301d5d5dfSSascha Wildner 
59401d5d5dfSSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedtHdr,
59501d5d5dfSSascha Wildner             &Subtable);
59601d5d5dfSSascha Wildner         if (ACPI_FAILURE (Status))
59701d5d5dfSSascha Wildner         {
59801d5d5dfSSascha Wildner             return (Status);
59901d5d5dfSSascha Wildner         }
60001d5d5dfSSascha Wildner 
60101d5d5dfSSascha Wildner         ParentTable = DtPeekSubtable ();
60201d5d5dfSSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
60301d5d5dfSSascha Wildner         DtPushSubtable (Subtable);
60401d5d5dfSSascha Wildner 
60501d5d5dfSSascha Wildner         CedtHeader = ACPI_CAST_PTR (ACPI_CEDT_HEADER, Subtable->Buffer);
60601d5d5dfSSascha Wildner 
60701d5d5dfSSascha Wildner         switch (CedtHeader->Type)
60801d5d5dfSSascha Wildner         {
60901d5d5dfSSascha Wildner         case ACPI_CEDT_TYPE_CHBS:
61001d5d5dfSSascha Wildner 
61101d5d5dfSSascha Wildner             break;
61201d5d5dfSSascha Wildner 
61301d5d5dfSSascha Wildner         default:
61401d5d5dfSSascha Wildner 
61501d5d5dfSSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "CEDT");
61601d5d5dfSSascha Wildner             return (AE_ERROR);
61701d5d5dfSSascha Wildner         }
61801d5d5dfSSascha Wildner 
61901d5d5dfSSascha Wildner         /* CEDT Subtable */
62001d5d5dfSSascha Wildner 
62101d5d5dfSSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt0, &Subtable);
62201d5d5dfSSascha Wildner         if (ACPI_FAILURE (Status))
62301d5d5dfSSascha Wildner         {
62401d5d5dfSSascha Wildner             return (Status);
62501d5d5dfSSascha Wildner         }
62601d5d5dfSSascha Wildner 
62701d5d5dfSSascha Wildner         ParentTable = DtPeekSubtable ();
62801d5d5dfSSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
62901d5d5dfSSascha Wildner         DtPopSubtable ();
63001d5d5dfSSascha Wildner     }
63101d5d5dfSSascha Wildner 
63201d5d5dfSSascha Wildner     return (AE_OK);
63301d5d5dfSSascha Wildner }
63401d5d5dfSSascha Wildner 
63501d5d5dfSSascha Wildner 
63601d5d5dfSSascha Wildner /******************************************************************************
63701d5d5dfSSascha Wildner  *
638820c5b08SSascha Wildner  * FUNCTION:    DtCompileCpep
639820c5b08SSascha Wildner  *
640820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
641820c5b08SSascha Wildner  *
642820c5b08SSascha Wildner  * RETURN:      Status
643820c5b08SSascha Wildner  *
644820c5b08SSascha Wildner  * DESCRIPTION: Compile CPEP.
645820c5b08SSascha Wildner  *
646820c5b08SSascha Wildner  *****************************************************************************/
647820c5b08SSascha Wildner 
648820c5b08SSascha Wildner ACPI_STATUS
DtCompileCpep(void ** List)649820c5b08SSascha Wildner DtCompileCpep (
650820c5b08SSascha Wildner     void                    **List)
651820c5b08SSascha Wildner {
652820c5b08SSascha Wildner     ACPI_STATUS             Status;
653820c5b08SSascha Wildner 
654820c5b08SSascha Wildner 
655820c5b08SSascha Wildner     Status = DtCompileTwoSubtables (List,
656820c5b08SSascha Wildner         AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0);
657820c5b08SSascha Wildner     return (Status);
658820c5b08SSascha Wildner }
659820c5b08SSascha Wildner 
660820c5b08SSascha Wildner 
661820c5b08SSascha Wildner /******************************************************************************
662820c5b08SSascha Wildner  *
663820c5b08SSascha Wildner  * FUNCTION:    DtCompileCsrt
664820c5b08SSascha Wildner  *
665820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
666820c5b08SSascha Wildner  *
667820c5b08SSascha Wildner  * RETURN:      Status
668820c5b08SSascha Wildner  *
669820c5b08SSascha Wildner  * DESCRIPTION: Compile CSRT.
670820c5b08SSascha Wildner  *
671820c5b08SSascha Wildner  *****************************************************************************/
672820c5b08SSascha Wildner 
673820c5b08SSascha Wildner ACPI_STATUS
DtCompileCsrt(void ** List)674820c5b08SSascha Wildner DtCompileCsrt (
675820c5b08SSascha Wildner     void                    **List)
676820c5b08SSascha Wildner {
677820c5b08SSascha Wildner     ACPI_STATUS             Status = AE_OK;
678820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
679820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
680820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
681820c5b08SSascha Wildner     UINT32                  DescriptorCount;
682820c5b08SSascha Wildner     UINT32                  GroupLength;
683820c5b08SSascha Wildner 
684820c5b08SSascha Wildner 
685820c5b08SSascha Wildner     /* Subtables (Resource Groups) */
686820c5b08SSascha Wildner 
687820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
688820c5b08SSascha Wildner     while (*PFieldList)
689820c5b08SSascha Wildner     {
690820c5b08SSascha Wildner         /* Resource group subtable */
691820c5b08SSascha Wildner 
692820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt0,
6937bcb6cafSSascha Wildner             &Subtable);
694820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
695820c5b08SSascha Wildner         {
696820c5b08SSascha Wildner             return (Status);
697820c5b08SSascha Wildner         }
698820c5b08SSascha Wildner 
699820c5b08SSascha Wildner         /* Compute the number of resource descriptors */
700820c5b08SSascha Wildner 
701820c5b08SSascha Wildner         GroupLength =
702820c5b08SSascha Wildner             (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
703820c5b08SSascha Wildner                 Subtable->Buffer))->Length -
704820c5b08SSascha Wildner             (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
705820c5b08SSascha Wildner                 Subtable->Buffer))->SharedInfoLength -
706820c5b08SSascha Wildner             sizeof (ACPI_CSRT_GROUP);
707820c5b08SSascha Wildner 
708820c5b08SSascha Wildner         DescriptorCount = (GroupLength  /
709820c5b08SSascha Wildner             sizeof (ACPI_CSRT_DESCRIPTOR));
710820c5b08SSascha Wildner 
711820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
712820c5b08SSascha Wildner         DtPushSubtable (Subtable);
713820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
714820c5b08SSascha Wildner 
715820c5b08SSascha Wildner         /* Shared info subtable (One per resource group) */
716820c5b08SSascha Wildner 
717820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt1,
7187bcb6cafSSascha Wildner             &Subtable);
719820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
720820c5b08SSascha Wildner         {
721820c5b08SSascha Wildner             return (Status);
722820c5b08SSascha Wildner         }
723820c5b08SSascha Wildner 
724820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
725820c5b08SSascha Wildner 
726820c5b08SSascha Wildner         /* Sub-Subtables (Resource Descriptors) */
727820c5b08SSascha Wildner 
728820c5b08SSascha Wildner         while (*PFieldList && DescriptorCount)
729820c5b08SSascha Wildner         {
730820c5b08SSascha Wildner 
731820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2,
7327bcb6cafSSascha Wildner                 &Subtable);
733820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
734820c5b08SSascha Wildner             {
735820c5b08SSascha Wildner                 return (Status);
736820c5b08SSascha Wildner             }
737820c5b08SSascha Wildner 
738820c5b08SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
739820c5b08SSascha Wildner 
740820c5b08SSascha Wildner             DtPushSubtable (Subtable);
741820c5b08SSascha Wildner             ParentTable = DtPeekSubtable ();
742820c5b08SSascha Wildner             if (*PFieldList)
743820c5b08SSascha Wildner             {
744820c5b08SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2a,
7457bcb6cafSSascha Wildner                     &Subtable);
746820c5b08SSascha Wildner                 if (ACPI_FAILURE (Status))
747820c5b08SSascha Wildner                 {
748820c5b08SSascha Wildner                     return (Status);
749820c5b08SSascha Wildner                 }
750820c5b08SSascha Wildner                 if (Subtable)
751820c5b08SSascha Wildner                 {
752820c5b08SSascha Wildner                     DtInsertSubtable (ParentTable, Subtable);
753820c5b08SSascha Wildner                 }
754820c5b08SSascha Wildner             }
755820c5b08SSascha Wildner 
756820c5b08SSascha Wildner             DtPopSubtable ();
757820c5b08SSascha Wildner             ParentTable = DtPeekSubtable ();
758820c5b08SSascha Wildner             DescriptorCount--;
759820c5b08SSascha Wildner         }
760820c5b08SSascha Wildner 
761820c5b08SSascha Wildner         DtPopSubtable ();
762820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
763820c5b08SSascha Wildner     }
764820c5b08SSascha Wildner 
765820c5b08SSascha Wildner     return (Status);
766820c5b08SSascha Wildner }
767820c5b08SSascha Wildner 
768820c5b08SSascha Wildner 
769820c5b08SSascha Wildner /******************************************************************************
770820c5b08SSascha Wildner  *
771820c5b08SSascha Wildner  * FUNCTION:    DtCompileDbg2
772820c5b08SSascha Wildner  *
773820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
774820c5b08SSascha Wildner  *
775820c5b08SSascha Wildner  * RETURN:      Status
776820c5b08SSascha Wildner  *
777820c5b08SSascha Wildner  * DESCRIPTION: Compile DBG2.
778820c5b08SSascha Wildner  *
779820c5b08SSascha Wildner  *****************************************************************************/
780820c5b08SSascha Wildner 
781820c5b08SSascha Wildner ACPI_STATUS
DtCompileDbg2(void ** List)782820c5b08SSascha Wildner DtCompileDbg2 (
783820c5b08SSascha Wildner     void                    **List)
784820c5b08SSascha Wildner {
785820c5b08SSascha Wildner     ACPI_STATUS             Status;
786820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
787820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
788820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
789820c5b08SSascha Wildner     UINT32                  SubtableCount;
790820c5b08SSascha Wildner     ACPI_DBG2_HEADER        *Dbg2Header;
791820c5b08SSascha Wildner     ACPI_DBG2_DEVICE        *DeviceInfo;
792820c5b08SSascha Wildner     UINT16                  CurrentOffset;
793820c5b08SSascha Wildner     UINT32                  i;
794820c5b08SSascha Wildner 
795820c5b08SSascha Wildner 
796820c5b08SSascha Wildner     /* Main table */
797820c5b08SSascha Wildner 
7987bcb6cafSSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2, &Subtable);
799820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
800820c5b08SSascha Wildner     {
801820c5b08SSascha Wildner         return (Status);
802820c5b08SSascha Wildner     }
803820c5b08SSascha Wildner 
804820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
805820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
806820c5b08SSascha Wildner 
807820c5b08SSascha Wildner     /* Main table fields */
808820c5b08SSascha Wildner 
809820c5b08SSascha Wildner     Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer);
810820c5b08SSascha Wildner     Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF (
811820c5b08SSascha Wildner         ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header);
812820c5b08SSascha Wildner 
813820c5b08SSascha Wildner     SubtableCount = Dbg2Header->InfoCount;
814820c5b08SSascha Wildner     DtPushSubtable (Subtable);
815820c5b08SSascha Wildner 
816820c5b08SSascha Wildner     /* Process all Device Information subtables (Count = InfoCount) */
817820c5b08SSascha Wildner 
818820c5b08SSascha Wildner     while (*PFieldList && SubtableCount)
819820c5b08SSascha Wildner     {
820820c5b08SSascha Wildner         /* Subtable: Debug Device Information */
821820c5b08SSascha Wildner 
822820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Device,
8237bcb6cafSSascha Wildner             &Subtable);
824820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
825820c5b08SSascha Wildner         {
826820c5b08SSascha Wildner             return (Status);
827820c5b08SSascha Wildner         }
828820c5b08SSascha Wildner 
829820c5b08SSascha Wildner         DeviceInfo = ACPI_CAST_PTR (ACPI_DBG2_DEVICE, Subtable->Buffer);
830820c5b08SSascha Wildner         CurrentOffset = (UINT16) sizeof (ACPI_DBG2_DEVICE);
831820c5b08SSascha Wildner 
832820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
833820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
834820c5b08SSascha Wildner         DtPushSubtable (Subtable);
835820c5b08SSascha Wildner 
836820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
837820c5b08SSascha Wildner 
838820c5b08SSascha Wildner         /* BaseAddressRegister GAS array (Required, size is RegisterCount) */
839820c5b08SSascha Wildner 
840820c5b08SSascha Wildner         DeviceInfo->BaseAddressOffset = CurrentOffset;
841820c5b08SSascha Wildner         for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
842820c5b08SSascha Wildner         {
843820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Addr,
8447bcb6cafSSascha Wildner                 &Subtable);
845820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
846820c5b08SSascha Wildner             {
847820c5b08SSascha Wildner                 return (Status);
848820c5b08SSascha Wildner             }
849820c5b08SSascha Wildner 
850820c5b08SSascha Wildner             CurrentOffset += (UINT16) sizeof (ACPI_GENERIC_ADDRESS);
851820c5b08SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
852820c5b08SSascha Wildner         }
853820c5b08SSascha Wildner 
854820c5b08SSascha Wildner         /* AddressSize array (Required, size = RegisterCount) */
855820c5b08SSascha Wildner 
856820c5b08SSascha Wildner         DeviceInfo->AddressSizeOffset = CurrentOffset;
857820c5b08SSascha Wildner         for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
858820c5b08SSascha Wildner         {
859820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Size,
8607bcb6cafSSascha Wildner                 &Subtable);
861820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
862820c5b08SSascha Wildner             {
863820c5b08SSascha Wildner                 return (Status);
864820c5b08SSascha Wildner             }
865820c5b08SSascha Wildner 
866820c5b08SSascha Wildner             CurrentOffset += (UINT16) sizeof (UINT32);
867820c5b08SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
868820c5b08SSascha Wildner         }
869820c5b08SSascha Wildner 
870820c5b08SSascha Wildner         /* NamespaceString device identifier (Required, size = NamePathLength) */
871820c5b08SSascha Wildner 
872820c5b08SSascha Wildner         DeviceInfo->NamepathOffset = CurrentOffset;
873820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Name,
8747bcb6cafSSascha Wildner             &Subtable);
875820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
876820c5b08SSascha Wildner         {
877820c5b08SSascha Wildner             return (Status);
878820c5b08SSascha Wildner         }
879820c5b08SSascha Wildner 
880820c5b08SSascha Wildner         /* Update the device info header */
881820c5b08SSascha Wildner 
882820c5b08SSascha Wildner         DeviceInfo->NamepathLength = (UINT16) Subtable->Length;
883820c5b08SSascha Wildner         CurrentOffset += (UINT16) DeviceInfo->NamepathLength;
884820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
885820c5b08SSascha Wildner 
886820c5b08SSascha Wildner         /* OemData - Variable-length data (Optional, size = OemDataLength) */
887820c5b08SSascha Wildner 
888820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2OemData,
8897bcb6cafSSascha Wildner             &Subtable);
8907bcb6cafSSascha Wildner         if (Status == AE_END_OF_TABLE)
8917bcb6cafSSascha Wildner         {
8927bcb6cafSSascha Wildner             /* optional field was not found and we're at the end of the file */
8937bcb6cafSSascha Wildner 
8947bcb6cafSSascha Wildner             goto subtableDone;
8957bcb6cafSSascha Wildner         }
8967bcb6cafSSascha Wildner         else if (ACPI_FAILURE (Status))
897820c5b08SSascha Wildner         {
898820c5b08SSascha Wildner             return (Status);
899820c5b08SSascha Wildner         }
900820c5b08SSascha Wildner 
901820c5b08SSascha Wildner         /* Update the device info header (zeros if no OEM data present) */
902820c5b08SSascha Wildner 
903820c5b08SSascha Wildner         DeviceInfo->OemDataOffset = 0;
904820c5b08SSascha Wildner         DeviceInfo->OemDataLength = 0;
905820c5b08SSascha Wildner 
906820c5b08SSascha Wildner         /* Optional subtable (OemData) */
907820c5b08SSascha Wildner 
908820c5b08SSascha Wildner         if (Subtable && Subtable->Length)
909820c5b08SSascha Wildner         {
910820c5b08SSascha Wildner             DeviceInfo->OemDataOffset = CurrentOffset;
911820c5b08SSascha Wildner             DeviceInfo->OemDataLength = (UINT16) Subtable->Length;
912820c5b08SSascha Wildner 
913820c5b08SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
914820c5b08SSascha Wildner         }
9157bcb6cafSSascha Wildner subtableDone:
916820c5b08SSascha Wildner         SubtableCount--;
917820c5b08SSascha Wildner         DtPopSubtable (); /* Get next Device Information subtable */
918820c5b08SSascha Wildner     }
919820c5b08SSascha Wildner 
920820c5b08SSascha Wildner     DtPopSubtable ();
921820c5b08SSascha Wildner     return (AE_OK);
922820c5b08SSascha Wildner }
923820c5b08SSascha Wildner 
924820c5b08SSascha Wildner 
925820c5b08SSascha Wildner /******************************************************************************
926820c5b08SSascha Wildner  *
927820c5b08SSascha Wildner  * FUNCTION:    DtCompileDmar
928820c5b08SSascha Wildner  *
929820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
930820c5b08SSascha Wildner  *
931820c5b08SSascha Wildner  * RETURN:      Status
932820c5b08SSascha Wildner  *
933820c5b08SSascha Wildner  * DESCRIPTION: Compile DMAR.
934820c5b08SSascha Wildner  *
935820c5b08SSascha Wildner  *****************************************************************************/
936820c5b08SSascha Wildner 
937820c5b08SSascha Wildner ACPI_STATUS
DtCompileDmar(void ** List)938820c5b08SSascha Wildner DtCompileDmar (
939820c5b08SSascha Wildner     void                    **List)
940820c5b08SSascha Wildner {
941820c5b08SSascha Wildner     ACPI_STATUS             Status;
942820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
943820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
944820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
945820c5b08SSascha Wildner     DT_FIELD                *SubtableStart;
946820c5b08SSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable;
947820c5b08SSascha Wildner     ACPI_DMAR_HEADER        *DmarHeader;
948820c5b08SSascha Wildner     ACPI_DMAR_DEVICE_SCOPE  *DmarDeviceScope;
949820c5b08SSascha Wildner     UINT32                  DeviceScopeLength;
950820c5b08SSascha Wildner     UINT32                  PciPathLength;
951820c5b08SSascha Wildner 
952820c5b08SSascha Wildner 
9537bcb6cafSSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable);
954820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
955820c5b08SSascha Wildner     {
956820c5b08SSascha Wildner         return (Status);
957820c5b08SSascha Wildner     }
958820c5b08SSascha Wildner 
959820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
960820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
961820c5b08SSascha Wildner     DtPushSubtable (Subtable);
962820c5b08SSascha Wildner 
963820c5b08SSascha Wildner     while (*PFieldList)
964820c5b08SSascha Wildner     {
965820c5b08SSascha Wildner         /* DMAR Header */
966820c5b08SSascha Wildner 
967820c5b08SSascha Wildner         SubtableStart = *PFieldList;
968820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr,
9697bcb6cafSSascha Wildner             &Subtable);
970820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
971820c5b08SSascha Wildner         {
972820c5b08SSascha Wildner             return (Status);
973820c5b08SSascha Wildner         }
974820c5b08SSascha Wildner 
975820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
976820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
977820c5b08SSascha Wildner         DtPushSubtable (Subtable);
978820c5b08SSascha Wildner 
979820c5b08SSascha Wildner         DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer);
980820c5b08SSascha Wildner 
981820c5b08SSascha Wildner         switch (DmarHeader->Type)
982820c5b08SSascha Wildner         {
983820c5b08SSascha Wildner         case ACPI_DMAR_TYPE_HARDWARE_UNIT:
984820c5b08SSascha Wildner 
985820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoDmar0;
986820c5b08SSascha Wildner             break;
987820c5b08SSascha Wildner 
988820c5b08SSascha Wildner         case ACPI_DMAR_TYPE_RESERVED_MEMORY:
989820c5b08SSascha Wildner 
990820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoDmar1;
991820c5b08SSascha Wildner             break;
992820c5b08SSascha Wildner 
993820c5b08SSascha Wildner         case ACPI_DMAR_TYPE_ROOT_ATS:
994820c5b08SSascha Wildner 
995820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoDmar2;
996820c5b08SSascha Wildner             break;
997820c5b08SSascha Wildner 
998820c5b08SSascha Wildner         case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
999820c5b08SSascha Wildner 
1000820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoDmar3;
1001820c5b08SSascha Wildner             break;
1002820c5b08SSascha Wildner 
1003820c5b08SSascha Wildner         case ACPI_DMAR_TYPE_NAMESPACE:
1004820c5b08SSascha Wildner 
1005820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoDmar4;
1006820c5b08SSascha Wildner             break;
1007820c5b08SSascha Wildner 
1008820c5b08SSascha Wildner         default:
1009820c5b08SSascha Wildner 
1010820c5b08SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR");
1011820c5b08SSascha Wildner             return (AE_ERROR);
1012820c5b08SSascha Wildner         }
1013820c5b08SSascha Wildner 
1014820c5b08SSascha Wildner         /* DMAR Subtable */
1015820c5b08SSascha Wildner 
10167bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
1017820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
1018820c5b08SSascha Wildner         {
1019820c5b08SSascha Wildner             return (Status);
1020820c5b08SSascha Wildner         }
1021820c5b08SSascha Wildner 
1022820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
1023820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1024820c5b08SSascha Wildner 
1025820c5b08SSascha Wildner         /*
1026820c5b08SSascha Wildner          * Optional Device Scope subtables
1027820c5b08SSascha Wildner          */
1028820c5b08SSascha Wildner         if ((DmarHeader->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
1029820c5b08SSascha Wildner             (DmarHeader->Type == ACPI_DMAR_TYPE_NAMESPACE))
1030820c5b08SSascha Wildner         {
1031820c5b08SSascha Wildner             /* These types do not support device scopes */
1032820c5b08SSascha Wildner 
1033820c5b08SSascha Wildner             DtPopSubtable ();
1034820c5b08SSascha Wildner             continue;
1035820c5b08SSascha Wildner         }
1036820c5b08SSascha Wildner 
1037820c5b08SSascha Wildner         DtPushSubtable (Subtable);
1038820c5b08SSascha Wildner         DeviceScopeLength = DmarHeader->Length - Subtable->Length -
1039820c5b08SSascha Wildner             ParentTable->Length;
1040820c5b08SSascha Wildner         while (DeviceScopeLength)
1041820c5b08SSascha Wildner         {
1042820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
10437bcb6cafSSascha Wildner                 &Subtable);
1044820c5b08SSascha Wildner             if (Status == AE_NOT_FOUND)
1045820c5b08SSascha Wildner             {
1046820c5b08SSascha Wildner                 break;
1047820c5b08SSascha Wildner             }
1048820c5b08SSascha Wildner 
1049820c5b08SSascha Wildner             ParentTable = DtPeekSubtable ();
1050820c5b08SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
1051820c5b08SSascha Wildner             DtPushSubtable (Subtable);
1052820c5b08SSascha Wildner 
1053820c5b08SSascha Wildner             DmarDeviceScope = ACPI_CAST_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable->Buffer);
1054820c5b08SSascha Wildner 
1055820c5b08SSascha Wildner             /* Optional PCI Paths */
1056820c5b08SSascha Wildner 
1057820c5b08SSascha Wildner             PciPathLength = DmarDeviceScope->Length - Subtable->Length;
1058820c5b08SSascha Wildner             while (PciPathLength)
1059820c5b08SSascha Wildner             {
1060820c5b08SSascha Wildner                 Status = DtCompileTable (PFieldList, TableInfoDmarPciPath,
10617bcb6cafSSascha Wildner                     &Subtable);
1062820c5b08SSascha Wildner                 if (Status == AE_NOT_FOUND)
1063820c5b08SSascha Wildner                 {
1064820c5b08SSascha Wildner                     DtPopSubtable ();
1065820c5b08SSascha Wildner                     break;
1066820c5b08SSascha Wildner                 }
1067820c5b08SSascha Wildner 
1068820c5b08SSascha Wildner                 ParentTable = DtPeekSubtable ();
1069820c5b08SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
1070820c5b08SSascha Wildner                 PciPathLength -= Subtable->Length;
1071820c5b08SSascha Wildner             }
1072820c5b08SSascha Wildner 
1073820c5b08SSascha Wildner             DtPopSubtable ();
1074820c5b08SSascha Wildner             DeviceScopeLength -= DmarDeviceScope->Length;
1075820c5b08SSascha Wildner         }
1076820c5b08SSascha Wildner 
1077820c5b08SSascha Wildner         DtPopSubtable ();
1078820c5b08SSascha Wildner         DtPopSubtable ();
1079820c5b08SSascha Wildner     }
1080820c5b08SSascha Wildner 
1081820c5b08SSascha Wildner     return (AE_OK);
1082820c5b08SSascha Wildner }
1083820c5b08SSascha Wildner 
1084820c5b08SSascha Wildner 
1085820c5b08SSascha Wildner /******************************************************************************
1086820c5b08SSascha Wildner  *
1087820c5b08SSascha Wildner  * FUNCTION:    DtCompileDrtm
1088820c5b08SSascha Wildner  *
1089820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
1090820c5b08SSascha Wildner  *
1091820c5b08SSascha Wildner  * RETURN:      Status
1092820c5b08SSascha Wildner  *
1093820c5b08SSascha Wildner  * DESCRIPTION: Compile DRTM.
1094820c5b08SSascha Wildner  *
1095820c5b08SSascha Wildner  *****************************************************************************/
1096820c5b08SSascha Wildner 
1097820c5b08SSascha Wildner ACPI_STATUS
DtCompileDrtm(void ** List)1098820c5b08SSascha Wildner DtCompileDrtm (
1099820c5b08SSascha Wildner     void                    **List)
1100820c5b08SSascha Wildner {
1101820c5b08SSascha Wildner     ACPI_STATUS             Status;
1102820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
1103820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
1104820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1105820c5b08SSascha Wildner     UINT32                  Count;
1106820c5b08SSascha Wildner     /* ACPI_TABLE_DRTM         *Drtm; */
1107820c5b08SSascha Wildner     ACPI_DRTM_VTABLE_LIST   *DrtmVtl;
1108820c5b08SSascha Wildner     ACPI_DRTM_RESOURCE_LIST *DrtmRl;
1109820c5b08SSascha Wildner     /* ACPI_DRTM_DPS_ID        *DrtmDps; */
1110820c5b08SSascha Wildner 
1111820c5b08SSascha Wildner 
1112820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
1113820c5b08SSascha Wildner 
1114820c5b08SSascha Wildner     /* Compile DRTM header */
1115820c5b08SSascha Wildner 
1116820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm,
11177bcb6cafSSascha Wildner         &Subtable);
1118820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
1119820c5b08SSascha Wildner     {
1120820c5b08SSascha Wildner         return (Status);
1121820c5b08SSascha Wildner     }
1122820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
1123820c5b08SSascha Wildner 
1124820c5b08SSascha Wildner     /*
112500ffa116SSascha Wildner      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
1126820c5b08SSascha Wildner      * should be taken to avoid accessing ACPI_TABLE_HADER fields.
1127820c5b08SSascha Wildner      */
1128820c5b08SSascha Wildner #if 0
1129820c5b08SSascha Wildner     Drtm = ACPI_SUB_PTR (ACPI_TABLE_DRTM,
1130820c5b08SSascha Wildner         Subtable->Buffer, sizeof (ACPI_TABLE_HEADER));
1131820c5b08SSascha Wildner #endif
1132820c5b08SSascha Wildner     /* Compile VTL */
1133820c5b08SSascha Wildner 
1134820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0,
11357bcb6cafSSascha Wildner         &Subtable);
1136820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
1137820c5b08SSascha Wildner     {
1138820c5b08SSascha Wildner         return (Status);
1139820c5b08SSascha Wildner     }
1140820c5b08SSascha Wildner 
1141820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
1142820c5b08SSascha Wildner     DrtmVtl = ACPI_CAST_PTR (ACPI_DRTM_VTABLE_LIST, Subtable->Buffer);
1143820c5b08SSascha Wildner 
1144820c5b08SSascha Wildner     DtPushSubtable (Subtable);
1145820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
1146820c5b08SSascha Wildner     Count = 0;
1147820c5b08SSascha Wildner 
1148820c5b08SSascha Wildner     while (*PFieldList)
1149820c5b08SSascha Wildner     {
1150820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0a,
11517bcb6cafSSascha Wildner             &Subtable);
1152820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
1153820c5b08SSascha Wildner         {
1154820c5b08SSascha Wildner             return (Status);
1155820c5b08SSascha Wildner         }
1156820c5b08SSascha Wildner         if (!Subtable)
1157820c5b08SSascha Wildner         {
1158820c5b08SSascha Wildner             break;
1159820c5b08SSascha Wildner         }
1160820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1161820c5b08SSascha Wildner         Count++;
1162820c5b08SSascha Wildner     }
1163820c5b08SSascha Wildner 
1164820c5b08SSascha Wildner     DrtmVtl->ValidatedTableCount = Count;
1165820c5b08SSascha Wildner     DtPopSubtable ();
1166820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
1167820c5b08SSascha Wildner 
1168820c5b08SSascha Wildner     /* Compile RL */
1169820c5b08SSascha Wildner 
1170820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1,
11717bcb6cafSSascha Wildner         &Subtable);
1172820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
1173820c5b08SSascha Wildner     {
1174820c5b08SSascha Wildner         return (Status);
1175820c5b08SSascha Wildner     }
1176820c5b08SSascha Wildner 
1177820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
1178820c5b08SSascha Wildner     DrtmRl = ACPI_CAST_PTR (ACPI_DRTM_RESOURCE_LIST, Subtable->Buffer);
1179820c5b08SSascha Wildner 
1180820c5b08SSascha Wildner     DtPushSubtable (Subtable);
1181820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
1182820c5b08SSascha Wildner     Count = 0;
1183820c5b08SSascha Wildner 
1184820c5b08SSascha Wildner     while (*PFieldList)
1185820c5b08SSascha Wildner     {
1186820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1a,
11877bcb6cafSSascha Wildner             &Subtable);
1188820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
1189820c5b08SSascha Wildner         {
1190820c5b08SSascha Wildner             return (Status);
1191820c5b08SSascha Wildner         }
1192820c5b08SSascha Wildner 
1193820c5b08SSascha Wildner         if (!Subtable)
1194820c5b08SSascha Wildner         {
1195820c5b08SSascha Wildner             break;
1196820c5b08SSascha Wildner         }
1197820c5b08SSascha Wildner 
1198820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1199820c5b08SSascha Wildner         Count++;
1200820c5b08SSascha Wildner     }
1201820c5b08SSascha Wildner 
1202820c5b08SSascha Wildner     DrtmRl->ResourceCount = Count;
1203820c5b08SSascha Wildner     DtPopSubtable ();
1204820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
1205820c5b08SSascha Wildner 
1206820c5b08SSascha Wildner     /* Compile DPS */
1207820c5b08SSascha Wildner 
1208820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm2,
12097bcb6cafSSascha Wildner         &Subtable);
1210820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
1211820c5b08SSascha Wildner     {
1212820c5b08SSascha Wildner         return (Status);
1213820c5b08SSascha Wildner     }
1214820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
1215820c5b08SSascha Wildner     /* DrtmDps = ACPI_CAST_PTR (ACPI_DRTM_DPS_ID, Subtable->Buffer);*/
1216820c5b08SSascha Wildner 
1217820c5b08SSascha Wildner 
1218820c5b08SSascha Wildner     return (AE_OK);
1219820c5b08SSascha Wildner }
1220820c5b08SSascha Wildner 
1221820c5b08SSascha Wildner 
1222820c5b08SSascha Wildner /******************************************************************************
1223820c5b08SSascha Wildner  *
1224820c5b08SSascha Wildner  * FUNCTION:    DtCompileEinj
1225820c5b08SSascha Wildner  *
1226820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
1227820c5b08SSascha Wildner  *
1228820c5b08SSascha Wildner  * RETURN:      Status
1229820c5b08SSascha Wildner  *
1230820c5b08SSascha Wildner  * DESCRIPTION: Compile EINJ.
1231820c5b08SSascha Wildner  *
1232820c5b08SSascha Wildner  *****************************************************************************/
1233820c5b08SSascha Wildner 
1234820c5b08SSascha Wildner ACPI_STATUS
DtCompileEinj(void ** List)1235820c5b08SSascha Wildner DtCompileEinj (
1236820c5b08SSascha Wildner     void                    **List)
1237820c5b08SSascha Wildner {
1238820c5b08SSascha Wildner     ACPI_STATUS             Status;
1239820c5b08SSascha Wildner 
1240820c5b08SSascha Wildner 
1241820c5b08SSascha Wildner     Status = DtCompileTwoSubtables (List,
1242820c5b08SSascha Wildner         AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0);
1243820c5b08SSascha Wildner     return (Status);
1244820c5b08SSascha Wildner }
1245820c5b08SSascha Wildner 
1246820c5b08SSascha Wildner 
1247820c5b08SSascha Wildner /******************************************************************************
1248820c5b08SSascha Wildner  *
1249820c5b08SSascha Wildner  * FUNCTION:    DtCompileErst
1250820c5b08SSascha Wildner  *
1251820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
1252820c5b08SSascha Wildner  *
1253820c5b08SSascha Wildner  * RETURN:      Status
1254820c5b08SSascha Wildner  *
1255820c5b08SSascha Wildner  * DESCRIPTION: Compile ERST.
1256820c5b08SSascha Wildner  *
1257820c5b08SSascha Wildner  *****************************************************************************/
1258820c5b08SSascha Wildner 
1259820c5b08SSascha Wildner ACPI_STATUS
DtCompileErst(void ** List)1260820c5b08SSascha Wildner DtCompileErst (
1261820c5b08SSascha Wildner     void                    **List)
1262820c5b08SSascha Wildner {
1263820c5b08SSascha Wildner     ACPI_STATUS             Status;
1264820c5b08SSascha Wildner 
1265820c5b08SSascha Wildner 
1266820c5b08SSascha Wildner     Status = DtCompileTwoSubtables (List,
1267820c5b08SSascha Wildner         AcpiDmTableInfoErst, AcpiDmTableInfoEinj0);
1268820c5b08SSascha Wildner     return (Status);
1269820c5b08SSascha Wildner }
1270820c5b08SSascha Wildner 
1271820c5b08SSascha Wildner 
1272820c5b08SSascha Wildner /******************************************************************************
1273820c5b08SSascha Wildner  *
1274820c5b08SSascha Wildner  * FUNCTION:    DtCompileGtdt
1275820c5b08SSascha Wildner  *
1276820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
1277820c5b08SSascha Wildner  *
1278820c5b08SSascha Wildner  * RETURN:      Status
1279820c5b08SSascha Wildner  *
1280820c5b08SSascha Wildner  * DESCRIPTION: Compile GTDT.
1281820c5b08SSascha Wildner  *
1282820c5b08SSascha Wildner  *****************************************************************************/
1283820c5b08SSascha Wildner 
1284820c5b08SSascha Wildner ACPI_STATUS
DtCompileGtdt(void ** List)1285820c5b08SSascha Wildner DtCompileGtdt (
1286820c5b08SSascha Wildner     void                    **List)
1287820c5b08SSascha Wildner {
1288820c5b08SSascha Wildner     ACPI_STATUS             Status;
1289820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
1290820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
1291820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1292820c5b08SSascha Wildner     DT_FIELD                *SubtableStart;
1293820c5b08SSascha Wildner     ACPI_SUBTABLE_HEADER    *GtdtHeader;
1294820c5b08SSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable;
1295820c5b08SSascha Wildner     UINT32                  GtCount;
129600ffa116SSascha Wildner     ACPI_TABLE_HEADER       *Header;
1297820c5b08SSascha Wildner 
1298820c5b08SSascha Wildner 
129900ffa116SSascha Wildner     ParentTable = DtPeekSubtable ();
130000ffa116SSascha Wildner 
130100ffa116SSascha Wildner     Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
130200ffa116SSascha Wildner 
130300ffa116SSascha Wildner     /* Compile the main table */
130400ffa116SSascha Wildner 
1305820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt,
13067bcb6cafSSascha Wildner         &Subtable);
1307820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
1308820c5b08SSascha Wildner     {
1309820c5b08SSascha Wildner         return (Status);
1310820c5b08SSascha Wildner     }
1311820c5b08SSascha Wildner 
131200ffa116SSascha Wildner     /* GTDT revision 3 later contains 2 extra fields before subtables */
131300ffa116SSascha Wildner 
131400ffa116SSascha Wildner     if (Header->Revision > 2)
131500ffa116SSascha Wildner     {
131600ffa116SSascha Wildner         ParentTable = DtPeekSubtable ();
131700ffa116SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
131800ffa116SSascha Wildner 
131900ffa116SSascha Wildner         Status = DtCompileTable (PFieldList,
132000ffa116SSascha Wildner             AcpiDmTableInfoGtdtEl2, &Subtable);
132100ffa116SSascha Wildner         if (ACPI_FAILURE (Status))
132200ffa116SSascha Wildner         {
132300ffa116SSascha Wildner             return (Status);
132400ffa116SSascha Wildner         }
132500ffa116SSascha Wildner     }
132600ffa116SSascha Wildner 
1327820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
1328820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
1329820c5b08SSascha Wildner 
1330820c5b08SSascha Wildner     while (*PFieldList)
1331820c5b08SSascha Wildner     {
1332820c5b08SSascha Wildner         SubtableStart = *PFieldList;
1333820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdtHdr,
13347bcb6cafSSascha Wildner             &Subtable);
1335820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
1336820c5b08SSascha Wildner         {
1337820c5b08SSascha Wildner             return (Status);
1338820c5b08SSascha Wildner         }
1339820c5b08SSascha Wildner 
1340820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
1341820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1342820c5b08SSascha Wildner         DtPushSubtable (Subtable);
1343820c5b08SSascha Wildner 
1344820c5b08SSascha Wildner         GtdtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1345820c5b08SSascha Wildner 
1346820c5b08SSascha Wildner         switch (GtdtHeader->Type)
1347820c5b08SSascha Wildner         {
1348820c5b08SSascha Wildner         case ACPI_GTDT_TYPE_TIMER_BLOCK:
1349820c5b08SSascha Wildner 
1350820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoGtdt0;
1351820c5b08SSascha Wildner             break;
1352820c5b08SSascha Wildner 
1353820c5b08SSascha Wildner         case ACPI_GTDT_TYPE_WATCHDOG:
1354820c5b08SSascha Wildner 
1355820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoGtdt1;
1356820c5b08SSascha Wildner             break;
1357820c5b08SSascha Wildner 
1358820c5b08SSascha Wildner         default:
1359820c5b08SSascha Wildner 
1360820c5b08SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "GTDT");
1361820c5b08SSascha Wildner             return (AE_ERROR);
1362820c5b08SSascha Wildner         }
1363820c5b08SSascha Wildner 
13647bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
1365820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
1366820c5b08SSascha Wildner         {
1367820c5b08SSascha Wildner             return (Status);
1368820c5b08SSascha Wildner         }
1369820c5b08SSascha Wildner 
1370820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
1371820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1372820c5b08SSascha Wildner 
1373820c5b08SSascha Wildner         /*
1374820c5b08SSascha Wildner          * Additional GT block subtable data
1375820c5b08SSascha Wildner          */
1376820c5b08SSascha Wildner 
1377820c5b08SSascha Wildner         switch (GtdtHeader->Type)
1378820c5b08SSascha Wildner         {
1379820c5b08SSascha Wildner         case ACPI_GTDT_TYPE_TIMER_BLOCK:
1380820c5b08SSascha Wildner 
1381820c5b08SSascha Wildner             DtPushSubtable (Subtable);
1382820c5b08SSascha Wildner             ParentTable = DtPeekSubtable ();
1383820c5b08SSascha Wildner 
1384820c5b08SSascha Wildner             GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
1385820c5b08SSascha Wildner                 Subtable->Buffer - sizeof(ACPI_GTDT_HEADER)))->TimerCount;
1386820c5b08SSascha Wildner 
1387820c5b08SSascha Wildner             while (GtCount)
1388820c5b08SSascha Wildner             {
1389820c5b08SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt0a,
13907bcb6cafSSascha Wildner                     &Subtable);
1391820c5b08SSascha Wildner                 if (ACPI_FAILURE (Status))
1392820c5b08SSascha Wildner                 {
1393820c5b08SSascha Wildner                     return (Status);
1394820c5b08SSascha Wildner                 }
1395820c5b08SSascha Wildner 
1396820c5b08SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
1397820c5b08SSascha Wildner                 GtCount--;
1398820c5b08SSascha Wildner             }
1399820c5b08SSascha Wildner 
1400820c5b08SSascha Wildner             DtPopSubtable ();
1401820c5b08SSascha Wildner             break;
1402820c5b08SSascha Wildner 
1403820c5b08SSascha Wildner         default:
1404820c5b08SSascha Wildner 
1405820c5b08SSascha Wildner             break;
1406820c5b08SSascha Wildner         }
1407820c5b08SSascha Wildner 
1408820c5b08SSascha Wildner         DtPopSubtable ();
1409820c5b08SSascha Wildner     }
1410820c5b08SSascha Wildner 
1411820c5b08SSascha Wildner     return (AE_OK);
1412820c5b08SSascha Wildner }
1413820c5b08SSascha Wildner 
1414820c5b08SSascha Wildner 
1415820c5b08SSascha Wildner /******************************************************************************
1416820c5b08SSascha Wildner  *
1417820c5b08SSascha Wildner  * FUNCTION:    DtCompileFpdt
1418820c5b08SSascha Wildner  *
1419820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
1420820c5b08SSascha Wildner  *
1421820c5b08SSascha Wildner  * RETURN:      Status
1422820c5b08SSascha Wildner  *
1423820c5b08SSascha Wildner  * DESCRIPTION: Compile FPDT.
1424820c5b08SSascha Wildner  *
1425820c5b08SSascha Wildner  *****************************************************************************/
1426820c5b08SSascha Wildner 
1427820c5b08SSascha Wildner ACPI_STATUS
DtCompileFpdt(void ** List)1428820c5b08SSascha Wildner DtCompileFpdt (
1429820c5b08SSascha Wildner     void                    **List)
1430820c5b08SSascha Wildner {
1431820c5b08SSascha Wildner     ACPI_STATUS             Status;
1432820c5b08SSascha Wildner     ACPI_FPDT_HEADER        *FpdtHeader;
1433820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
1434820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
1435820c5b08SSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable;
1436820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1437820c5b08SSascha Wildner     DT_FIELD                *SubtableStart;
1438820c5b08SSascha Wildner 
1439820c5b08SSascha Wildner 
1440820c5b08SSascha Wildner     while (*PFieldList)
1441820c5b08SSascha Wildner     {
1442820c5b08SSascha Wildner         SubtableStart = *PFieldList;
1443820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr,
14447bcb6cafSSascha Wildner             &Subtable);
1445820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
1446820c5b08SSascha Wildner         {
1447820c5b08SSascha Wildner             return (Status);
1448820c5b08SSascha Wildner         }
1449820c5b08SSascha Wildner 
1450820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
1451820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1452820c5b08SSascha Wildner         DtPushSubtable (Subtable);
1453820c5b08SSascha Wildner 
1454820c5b08SSascha Wildner         FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
1455820c5b08SSascha Wildner 
1456820c5b08SSascha Wildner         switch (FpdtHeader->Type)
1457820c5b08SSascha Wildner         {
1458820c5b08SSascha Wildner         case ACPI_FPDT_TYPE_BOOT:
1459820c5b08SSascha Wildner 
1460820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoFpdt0;
1461820c5b08SSascha Wildner             break;
1462820c5b08SSascha Wildner 
1463820c5b08SSascha Wildner         case ACPI_FPDT_TYPE_S3PERF:
1464820c5b08SSascha Wildner 
1465820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoFpdt1;
1466820c5b08SSascha Wildner             break;
1467820c5b08SSascha Wildner 
1468820c5b08SSascha Wildner         default:
1469820c5b08SSascha Wildner 
1470820c5b08SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT");
1471820c5b08SSascha Wildner             return (AE_ERROR);
1472820c5b08SSascha Wildner             break;
1473820c5b08SSascha Wildner         }
1474820c5b08SSascha Wildner 
14757bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
1476820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
1477820c5b08SSascha Wildner         {
1478820c5b08SSascha Wildner             return (Status);
1479820c5b08SSascha Wildner         }
1480820c5b08SSascha Wildner 
1481820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
1482820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1483820c5b08SSascha Wildner         DtPopSubtable ();
1484820c5b08SSascha Wildner     }
1485820c5b08SSascha Wildner 
1486820c5b08SSascha Wildner     return (AE_OK);
1487820c5b08SSascha Wildner }
1488820c5b08SSascha Wildner 
1489820c5b08SSascha Wildner 
1490820c5b08SSascha Wildner /******************************************************************************
1491820c5b08SSascha Wildner  *
1492820c5b08SSascha Wildner  * FUNCTION:    DtCompileHest
1493820c5b08SSascha Wildner  *
1494820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
1495820c5b08SSascha Wildner  *
1496820c5b08SSascha Wildner  * RETURN:      Status
1497820c5b08SSascha Wildner  *
1498820c5b08SSascha Wildner  * DESCRIPTION: Compile HEST.
1499820c5b08SSascha Wildner  *
1500820c5b08SSascha Wildner  *****************************************************************************/
1501820c5b08SSascha Wildner 
1502820c5b08SSascha Wildner ACPI_STATUS
DtCompileHest(void ** List)1503820c5b08SSascha Wildner DtCompileHest (
1504820c5b08SSascha Wildner     void                    **List)
1505820c5b08SSascha Wildner {
1506820c5b08SSascha Wildner     ACPI_STATUS             Status;
1507820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
1508820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
1509820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1510820c5b08SSascha Wildner     DT_FIELD                *SubtableStart;
1511820c5b08SSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable;
1512820c5b08SSascha Wildner     UINT16                  Type;
1513820c5b08SSascha Wildner     UINT32                  BankCount;
1514820c5b08SSascha Wildner 
1515820c5b08SSascha Wildner 
1516820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest,
15177bcb6cafSSascha Wildner         &Subtable);
1518820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
1519820c5b08SSascha Wildner     {
1520820c5b08SSascha Wildner         return (Status);
1521820c5b08SSascha Wildner     }
1522820c5b08SSascha Wildner 
1523820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
1524820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
1525820c5b08SSascha Wildner 
1526820c5b08SSascha Wildner     while (*PFieldList)
1527820c5b08SSascha Wildner     {
1528820c5b08SSascha Wildner         /* Get subtable type */
1529820c5b08SSascha Wildner 
1530820c5b08SSascha Wildner         SubtableStart = *PFieldList;
1531820c5b08SSascha Wildner         DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
1532820c5b08SSascha Wildner 
1533820c5b08SSascha Wildner         switch (Type)
1534820c5b08SSascha Wildner         {
1535820c5b08SSascha Wildner         case ACPI_HEST_TYPE_IA32_CHECK:
1536820c5b08SSascha Wildner 
1537820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoHest0;
1538820c5b08SSascha Wildner             break;
1539820c5b08SSascha Wildner 
1540820c5b08SSascha Wildner         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1541820c5b08SSascha Wildner 
1542820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoHest1;
1543820c5b08SSascha Wildner             break;
1544820c5b08SSascha Wildner 
1545820c5b08SSascha Wildner         case ACPI_HEST_TYPE_IA32_NMI:
1546820c5b08SSascha Wildner 
1547820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoHest2;
1548820c5b08SSascha Wildner             break;
1549820c5b08SSascha Wildner 
1550820c5b08SSascha Wildner         case ACPI_HEST_TYPE_AER_ROOT_PORT:
1551820c5b08SSascha Wildner 
1552820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoHest6;
1553820c5b08SSascha Wildner             break;
1554820c5b08SSascha Wildner 
1555820c5b08SSascha Wildner         case ACPI_HEST_TYPE_AER_ENDPOINT:
1556820c5b08SSascha Wildner 
1557820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoHest7;
1558820c5b08SSascha Wildner             break;
1559820c5b08SSascha Wildner 
1560820c5b08SSascha Wildner         case ACPI_HEST_TYPE_AER_BRIDGE:
1561820c5b08SSascha Wildner 
1562820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoHest8;
1563820c5b08SSascha Wildner             break;
1564820c5b08SSascha Wildner 
1565820c5b08SSascha Wildner         case ACPI_HEST_TYPE_GENERIC_ERROR:
1566820c5b08SSascha Wildner 
1567820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoHest9;
1568820c5b08SSascha Wildner             break;
1569820c5b08SSascha Wildner 
15701093ca81SSascha Wildner         case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
15711093ca81SSascha Wildner 
15721093ca81SSascha Wildner             InfoTable = AcpiDmTableInfoHest10;
15731093ca81SSascha Wildner             break;
15741093ca81SSascha Wildner 
15751093ca81SSascha Wildner         case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
15761093ca81SSascha Wildner 
15771093ca81SSascha Wildner             InfoTable = AcpiDmTableInfoHest11;
15781093ca81SSascha Wildner             break;
15791093ca81SSascha Wildner 
1580820c5b08SSascha Wildner         default:
1581820c5b08SSascha Wildner 
1582820c5b08SSascha Wildner             /* Cannot continue on unknown type */
1583820c5b08SSascha Wildner 
1584820c5b08SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST");
1585820c5b08SSascha Wildner             return (AE_ERROR);
1586820c5b08SSascha Wildner         }
1587820c5b08SSascha Wildner 
15887bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
1589820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
1590820c5b08SSascha Wildner         {
1591820c5b08SSascha Wildner             return (Status);
1592820c5b08SSascha Wildner         }
1593820c5b08SSascha Wildner 
1594820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1595820c5b08SSascha Wildner 
1596820c5b08SSascha Wildner         /*
1597820c5b08SSascha Wildner          * Additional subtable data - IA32 Error Bank(s)
1598820c5b08SSascha Wildner          */
1599820c5b08SSascha Wildner         BankCount = 0;
1600820c5b08SSascha Wildner         switch (Type)
1601820c5b08SSascha Wildner         {
1602820c5b08SSascha Wildner         case ACPI_HEST_TYPE_IA32_CHECK:
1603820c5b08SSascha Wildner 
1604820c5b08SSascha Wildner             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1605820c5b08SSascha Wildner                 Subtable->Buffer))->NumHardwareBanks;
1606820c5b08SSascha Wildner             break;
1607820c5b08SSascha Wildner 
1608820c5b08SSascha Wildner         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1609820c5b08SSascha Wildner 
1610820c5b08SSascha Wildner             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1611820c5b08SSascha Wildner                 Subtable->Buffer))->NumHardwareBanks;
1612820c5b08SSascha Wildner             break;
1613820c5b08SSascha Wildner 
16141093ca81SSascha Wildner         case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
16151093ca81SSascha Wildner 
16161093ca81SSascha Wildner             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
16171093ca81SSascha Wildner                 Subtable->Buffer))->NumHardwareBanks;
16181093ca81SSascha Wildner             break;
16191093ca81SSascha Wildner 
1620820c5b08SSascha Wildner         default:
1621820c5b08SSascha Wildner 
1622820c5b08SSascha Wildner             break;
1623820c5b08SSascha Wildner         }
1624820c5b08SSascha Wildner 
1625820c5b08SSascha Wildner         while (BankCount)
1626820c5b08SSascha Wildner         {
1627820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank,
16287bcb6cafSSascha Wildner                 &Subtable);
1629820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
1630820c5b08SSascha Wildner             {
1631820c5b08SSascha Wildner                 return (Status);
1632820c5b08SSascha Wildner             }
1633820c5b08SSascha Wildner 
1634820c5b08SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
1635820c5b08SSascha Wildner             BankCount--;
1636820c5b08SSascha Wildner         }
1637820c5b08SSascha Wildner     }
1638820c5b08SSascha Wildner 
1639820c5b08SSascha Wildner     return (AE_OK);
1640820c5b08SSascha Wildner }
1641820c5b08SSascha Wildner 
1642820c5b08SSascha Wildner 
1643820c5b08SSascha Wildner /******************************************************************************
1644820c5b08SSascha Wildner  *
16451093ca81SSascha Wildner  * FUNCTION:    DtCompileHmat
16461093ca81SSascha Wildner  *
16471093ca81SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
16481093ca81SSascha Wildner  *
16491093ca81SSascha Wildner  * RETURN:      Status
16501093ca81SSascha Wildner  *
16511093ca81SSascha Wildner  * DESCRIPTION: Compile HMAT.
16521093ca81SSascha Wildner  *
16531093ca81SSascha Wildner  *****************************************************************************/
16541093ca81SSascha Wildner 
16551093ca81SSascha Wildner ACPI_STATUS
DtCompileHmat(void ** List)16561093ca81SSascha Wildner DtCompileHmat (
16571093ca81SSascha Wildner     void                    **List)
16581093ca81SSascha Wildner {
16591093ca81SSascha Wildner     ACPI_STATUS             Status;
16601093ca81SSascha Wildner     DT_SUBTABLE             *Subtable;
16611093ca81SSascha Wildner     DT_SUBTABLE             *ParentTable;
16621093ca81SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
16631093ca81SSascha Wildner     DT_FIELD                *SubtableStart;
16641093ca81SSascha Wildner     DT_FIELD                *EntryStart;
16651093ca81SSascha Wildner     ACPI_HMAT_STRUCTURE     *HmatStruct;
16661093ca81SSascha Wildner     ACPI_HMAT_LOCALITY      *HmatLocality;
16671093ca81SSascha Wildner     ACPI_HMAT_CACHE         *HmatCache;
16681093ca81SSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable;
16691093ca81SSascha Wildner     UINT32                  IntPDNumber;
16701093ca81SSascha Wildner     UINT32                  TgtPDNumber;
16711093ca81SSascha Wildner     UINT64                  EntryNumber;
16721093ca81SSascha Wildner     UINT16                  SMBIOSHandleNumber;
16731093ca81SSascha Wildner 
16741093ca81SSascha Wildner 
16751093ca81SSascha Wildner     ParentTable = DtPeekSubtable ();
16761093ca81SSascha Wildner 
16771093ca81SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmat,
16787bcb6cafSSascha Wildner         &Subtable);
16791093ca81SSascha Wildner     if (ACPI_FAILURE (Status))
16801093ca81SSascha Wildner     {
16811093ca81SSascha Wildner         return (Status);
16821093ca81SSascha Wildner     }
16831093ca81SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
16841093ca81SSascha Wildner 
16851093ca81SSascha Wildner     while (*PFieldList)
16861093ca81SSascha Wildner     {
16871093ca81SSascha Wildner         /* Compile HMAT structure header */
16881093ca81SSascha Wildner 
16891093ca81SSascha Wildner         SubtableStart = *PFieldList;
16901093ca81SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmatHdr,
16917bcb6cafSSascha Wildner             &Subtable);
16921093ca81SSascha Wildner         if (ACPI_FAILURE (Status))
16931093ca81SSascha Wildner         {
16941093ca81SSascha Wildner             return (Status);
16951093ca81SSascha Wildner         }
16961093ca81SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
16971093ca81SSascha Wildner 
16981093ca81SSascha Wildner         HmatStruct = ACPI_CAST_PTR (ACPI_HMAT_STRUCTURE, Subtable->Buffer);
16991093ca81SSascha Wildner         HmatStruct->Length = Subtable->Length;
17001093ca81SSascha Wildner 
17011093ca81SSascha Wildner         /* Compile HMAT structure body */
17021093ca81SSascha Wildner 
17031093ca81SSascha Wildner         switch (HmatStruct->Type)
17041093ca81SSascha Wildner         {
17051093ca81SSascha Wildner         case ACPI_HMAT_TYPE_ADDRESS_RANGE:
17061093ca81SSascha Wildner 
17071093ca81SSascha Wildner             InfoTable = AcpiDmTableInfoHmat0;
17081093ca81SSascha Wildner             break;
17091093ca81SSascha Wildner 
17101093ca81SSascha Wildner         case ACPI_HMAT_TYPE_LOCALITY:
17111093ca81SSascha Wildner 
17121093ca81SSascha Wildner             InfoTable = AcpiDmTableInfoHmat1;
17131093ca81SSascha Wildner             break;
17141093ca81SSascha Wildner 
17151093ca81SSascha Wildner         case ACPI_HMAT_TYPE_CACHE:
17161093ca81SSascha Wildner 
17171093ca81SSascha Wildner             InfoTable = AcpiDmTableInfoHmat2;
17181093ca81SSascha Wildner             break;
17191093ca81SSascha Wildner 
17201093ca81SSascha Wildner         default:
17211093ca81SSascha Wildner 
17221093ca81SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HMAT");
17231093ca81SSascha Wildner             return (AE_ERROR);
17241093ca81SSascha Wildner         }
17251093ca81SSascha Wildner 
17267bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
17271093ca81SSascha Wildner         if (ACPI_FAILURE (Status))
17281093ca81SSascha Wildner         {
17291093ca81SSascha Wildner             return (Status);
17301093ca81SSascha Wildner         }
17311093ca81SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
17321093ca81SSascha Wildner         HmatStruct->Length += Subtable->Length;
17331093ca81SSascha Wildner 
17341093ca81SSascha Wildner         /* Compile HMAT structure additionals */
17351093ca81SSascha Wildner 
17361093ca81SSascha Wildner         switch (HmatStruct->Type)
17371093ca81SSascha Wildner         {
17381093ca81SSascha Wildner         case ACPI_HMAT_TYPE_LOCALITY:
17391093ca81SSascha Wildner 
17401093ca81SSascha Wildner             HmatLocality = ACPI_SUB_PTR (ACPI_HMAT_LOCALITY,
17411093ca81SSascha Wildner                 Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE));
17421093ca81SSascha Wildner 
17431093ca81SSascha Wildner             /* Compile initiator proximity domain list */
17441093ca81SSascha Wildner 
17451093ca81SSascha Wildner             IntPDNumber = 0;
17461093ca81SSascha Wildner             while (*PFieldList)
17471093ca81SSascha Wildner             {
17481093ca81SSascha Wildner                 Status = DtCompileTable (PFieldList,
17497bcb6cafSSascha Wildner                     AcpiDmTableInfoHmat1a, &Subtable);
17501093ca81SSascha Wildner                 if (ACPI_FAILURE (Status))
17511093ca81SSascha Wildner                 {
17521093ca81SSascha Wildner                     return (Status);
17531093ca81SSascha Wildner                 }
17541093ca81SSascha Wildner                 if (!Subtable)
17551093ca81SSascha Wildner                 {
17561093ca81SSascha Wildner                     break;
17571093ca81SSascha Wildner                 }
17581093ca81SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
17591093ca81SSascha Wildner                 HmatStruct->Length += Subtable->Length;
17601093ca81SSascha Wildner                 IntPDNumber++;
17611093ca81SSascha Wildner             }
17621093ca81SSascha Wildner             HmatLocality->NumberOfInitiatorPDs = IntPDNumber;
17631093ca81SSascha Wildner 
17641093ca81SSascha Wildner             /* Compile target proximity domain list */
17651093ca81SSascha Wildner 
17661093ca81SSascha Wildner             TgtPDNumber = 0;
17671093ca81SSascha Wildner             while (*PFieldList)
17681093ca81SSascha Wildner             {
17691093ca81SSascha Wildner                 Status = DtCompileTable (PFieldList,
17707bcb6cafSSascha Wildner                     AcpiDmTableInfoHmat1b, &Subtable);
17711093ca81SSascha Wildner                 if (ACPI_FAILURE (Status))
17721093ca81SSascha Wildner                 {
17731093ca81SSascha Wildner                     return (Status);
17741093ca81SSascha Wildner                 }
17751093ca81SSascha Wildner                 if (!Subtable)
17761093ca81SSascha Wildner                 {
17771093ca81SSascha Wildner                     break;
17781093ca81SSascha Wildner                 }
17791093ca81SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
17801093ca81SSascha Wildner                 HmatStruct->Length += Subtable->Length;
17811093ca81SSascha Wildner                 TgtPDNumber++;
17821093ca81SSascha Wildner             }
17831093ca81SSascha Wildner             HmatLocality->NumberOfTargetPDs = TgtPDNumber;
17841093ca81SSascha Wildner 
17851093ca81SSascha Wildner             /* Save start of the entries for reporting errors */
17861093ca81SSascha Wildner 
17871093ca81SSascha Wildner             EntryStart = *PFieldList;
17881093ca81SSascha Wildner 
17891093ca81SSascha Wildner             /* Compile latency/bandwidth entries */
17901093ca81SSascha Wildner 
17911093ca81SSascha Wildner             EntryNumber = 0;
17921093ca81SSascha Wildner             while (*PFieldList)
17931093ca81SSascha Wildner             {
17941093ca81SSascha Wildner                 Status = DtCompileTable (PFieldList,
17957bcb6cafSSascha Wildner                     AcpiDmTableInfoHmat1c, &Subtable);
17961093ca81SSascha Wildner                 if (ACPI_FAILURE (Status))
17971093ca81SSascha Wildner                 {
17981093ca81SSascha Wildner                     return (Status);
17991093ca81SSascha Wildner                 }
18001093ca81SSascha Wildner                 if (!Subtable)
18011093ca81SSascha Wildner                 {
18021093ca81SSascha Wildner                     break;
18031093ca81SSascha Wildner                 }
18041093ca81SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
18051093ca81SSascha Wildner                 HmatStruct->Length += Subtable->Length;
18061093ca81SSascha Wildner                 EntryNumber++;
18071093ca81SSascha Wildner             }
18081093ca81SSascha Wildner 
18091093ca81SSascha Wildner             /* Validate number of entries */
18101093ca81SSascha Wildner 
18111093ca81SSascha Wildner             if (EntryNumber !=
18121093ca81SSascha Wildner                 ((UINT64)IntPDNumber * (UINT64)TgtPDNumber))
18131093ca81SSascha Wildner             {
18141093ca81SSascha Wildner                 DtFatal (ASL_MSG_INVALID_EXPRESSION, EntryStart, "HMAT");
18151093ca81SSascha Wildner                 return (AE_ERROR);
18161093ca81SSascha Wildner             }
18171093ca81SSascha Wildner             break;
18181093ca81SSascha Wildner 
18191093ca81SSascha Wildner         case ACPI_HMAT_TYPE_CACHE:
18201093ca81SSascha Wildner 
18211093ca81SSascha Wildner             /* Compile SMBIOS handles */
18221093ca81SSascha Wildner 
18231093ca81SSascha Wildner             HmatCache = ACPI_SUB_PTR (ACPI_HMAT_CACHE,
18241093ca81SSascha Wildner                 Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE));
18251093ca81SSascha Wildner             SMBIOSHandleNumber = 0;
18261093ca81SSascha Wildner             while (*PFieldList)
18271093ca81SSascha Wildner             {
18281093ca81SSascha Wildner                 Status = DtCompileTable (PFieldList,
18297bcb6cafSSascha Wildner                     AcpiDmTableInfoHmat2a, &Subtable);
18301093ca81SSascha Wildner                 if (ACPI_FAILURE (Status))
18311093ca81SSascha Wildner                 {
18321093ca81SSascha Wildner                     return (Status);
18331093ca81SSascha Wildner                 }
18341093ca81SSascha Wildner                 if (!Subtable)
18351093ca81SSascha Wildner                 {
18361093ca81SSascha Wildner                     break;
18371093ca81SSascha Wildner                 }
18381093ca81SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
18391093ca81SSascha Wildner                 HmatStruct->Length += Subtable->Length;
18401093ca81SSascha Wildner                 SMBIOSHandleNumber++;
18411093ca81SSascha Wildner             }
18421093ca81SSascha Wildner             HmatCache->NumberOfSMBIOSHandles = SMBIOSHandleNumber;
18431093ca81SSascha Wildner             break;
18441093ca81SSascha Wildner 
18451093ca81SSascha Wildner         default:
18461093ca81SSascha Wildner 
18471093ca81SSascha Wildner             break;
18481093ca81SSascha Wildner         }
18491093ca81SSascha Wildner     }
18501093ca81SSascha Wildner 
18511093ca81SSascha Wildner     return (AE_OK);
18521093ca81SSascha Wildner }
18531093ca81SSascha Wildner 
18541093ca81SSascha Wildner 
18551093ca81SSascha Wildner /******************************************************************************
18561093ca81SSascha Wildner  *
1857820c5b08SSascha Wildner  * FUNCTION:    DtCompileIort
1858820c5b08SSascha Wildner  *
1859820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
1860820c5b08SSascha Wildner  *
1861820c5b08SSascha Wildner  * RETURN:      Status
1862820c5b08SSascha Wildner  *
1863820c5b08SSascha Wildner  * DESCRIPTION: Compile IORT.
1864820c5b08SSascha Wildner  *
1865820c5b08SSascha Wildner  *****************************************************************************/
1866820c5b08SSascha Wildner 
1867820c5b08SSascha Wildner ACPI_STATUS
DtCompileIort(void ** List)1868820c5b08SSascha Wildner DtCompileIort (
1869820c5b08SSascha Wildner     void                    **List)
1870820c5b08SSascha Wildner {
1871820c5b08SSascha Wildner     ACPI_STATUS             Status;
1872820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
1873820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
1874820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1875820c5b08SSascha Wildner     DT_FIELD                *SubtableStart;
187601d5d5dfSSascha Wildner     ACPI_TABLE_HEADER       *Table;
1877820c5b08SSascha Wildner     ACPI_TABLE_IORT         *Iort;
1878820c5b08SSascha Wildner     ACPI_IORT_NODE          *IortNode;
1879820c5b08SSascha Wildner     ACPI_IORT_ITS_GROUP     *IortItsGroup;
1880820c5b08SSascha Wildner     ACPI_IORT_SMMU          *IortSmmu;
188101d5d5dfSSascha Wildner     ACPI_IORT_RMR           *IortRmr;
1882820c5b08SSascha Wildner     UINT32                  NodeNumber;
1883820c5b08SSascha Wildner     UINT32                  NodeLength;
1884820c5b08SSascha Wildner     UINT32                  IdMappingNumber;
1885820c5b08SSascha Wildner     UINT32                  ItsNumber;
1886820c5b08SSascha Wildner     UINT32                  ContextIrptNumber;
1887820c5b08SSascha Wildner     UINT32                  PmuIrptNumber;
1888820c5b08SSascha Wildner     UINT32                  PaddingLength;
188901d5d5dfSSascha Wildner     UINT8                   Revision;
189001d5d5dfSSascha Wildner     UINT32                  RmrCount;
1891820c5b08SSascha Wildner 
1892820c5b08SSascha Wildner 
1893820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
1894820c5b08SSascha Wildner 
1895820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort,
18967bcb6cafSSascha Wildner         &Subtable);
1897820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
1898820c5b08SSascha Wildner     {
1899820c5b08SSascha Wildner         return (Status);
1900820c5b08SSascha Wildner     }
1901820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
1902820c5b08SSascha Wildner 
190301d5d5dfSSascha Wildner     Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
190401d5d5dfSSascha Wildner     Revision = Table->Revision;
190501d5d5dfSSascha Wildner 
190601d5d5dfSSascha Wildner     /* Both IORT Rev E and E.a have known issues and are not supported */
190701d5d5dfSSascha Wildner 
190801d5d5dfSSascha Wildner     if (Revision == 1 || Revision == 2)
190901d5d5dfSSascha Wildner     {
191001d5d5dfSSascha Wildner         DtError (ASL_ERROR, ASL_MSG_UNSUPPORTED, NULL, "IORT table revision");
191101d5d5dfSSascha Wildner         return (AE_ERROR);
191201d5d5dfSSascha Wildner     }
191301d5d5dfSSascha Wildner 
1914820c5b08SSascha Wildner     /*
19152ffe9f16SSascha Wildner      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
19162ffe9f16SSascha Wildner      * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
1917820c5b08SSascha Wildner      */
1918820c5b08SSascha Wildner     Iort = ACPI_SUB_PTR (ACPI_TABLE_IORT,
1919820c5b08SSascha Wildner         Subtable->Buffer, sizeof (ACPI_TABLE_HEADER));
1920820c5b08SSascha Wildner 
1921820c5b08SSascha Wildner     /*
1922820c5b08SSascha Wildner      * OptionalPadding - Variable-length data
1923820c5b08SSascha Wildner      * (Optional, size = OffsetToNodes - sizeof (ACPI_TABLE_IORT))
1924820c5b08SSascha Wildner      * Optionally allows the generic data types to be used for filling
1925820c5b08SSascha Wildner      * this field.
1926820c5b08SSascha Wildner      */
1927820c5b08SSascha Wildner     Iort->NodeOffset = sizeof (ACPI_TABLE_IORT);
1928820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortPad,
19297bcb6cafSSascha Wildner         &Subtable);
1930820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
1931820c5b08SSascha Wildner     {
1932820c5b08SSascha Wildner         return (Status);
1933820c5b08SSascha Wildner     }
1934820c5b08SSascha Wildner     if (Subtable)
1935820c5b08SSascha Wildner     {
1936820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1937820c5b08SSascha Wildner         Iort->NodeOffset += Subtable->Length;
1938820c5b08SSascha Wildner     }
1939820c5b08SSascha Wildner     else
1940820c5b08SSascha Wildner     {
1941820c5b08SSascha Wildner         Status = DtCompileGeneric (ACPI_CAST_PTR (void *, PFieldList),
1942820c5b08SSascha Wildner             AcpiDmTableInfoIortHdr[0].Name, &PaddingLength);
1943820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
1944820c5b08SSascha Wildner         {
1945820c5b08SSascha Wildner             return (Status);
1946820c5b08SSascha Wildner         }
1947820c5b08SSascha Wildner         Iort->NodeOffset += PaddingLength;
1948820c5b08SSascha Wildner     }
1949820c5b08SSascha Wildner 
1950820c5b08SSascha Wildner     NodeNumber = 0;
1951820c5b08SSascha Wildner     while (*PFieldList)
1952820c5b08SSascha Wildner     {
1953820c5b08SSascha Wildner         SubtableStart = *PFieldList;
195401d5d5dfSSascha Wildner         if (Revision == 0)
195501d5d5dfSSascha Wildner         {
1956820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr,
19577bcb6cafSSascha Wildner                 &Subtable);
195801d5d5dfSSascha Wildner         }
195901d5d5dfSSascha Wildner         else if (Revision >= 3)
196001d5d5dfSSascha Wildner         {
196101d5d5dfSSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr3,
196201d5d5dfSSascha Wildner                 &Subtable);
196301d5d5dfSSascha Wildner         }
196401d5d5dfSSascha Wildner 
1965820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
1966820c5b08SSascha Wildner         {
1967820c5b08SSascha Wildner             return (Status);
1968820c5b08SSascha Wildner         }
1969820c5b08SSascha Wildner 
1970820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1971820c5b08SSascha Wildner         IortNode = ACPI_CAST_PTR (ACPI_IORT_NODE, Subtable->Buffer);
1972820c5b08SSascha Wildner         NodeLength = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
1973820c5b08SSascha Wildner 
1974820c5b08SSascha Wildner         DtPushSubtable (Subtable);
1975820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
1976820c5b08SSascha Wildner 
1977820c5b08SSascha Wildner         switch (IortNode->Type)
1978820c5b08SSascha Wildner         {
1979820c5b08SSascha Wildner         case ACPI_IORT_NODE_ITS_GROUP:
1980820c5b08SSascha Wildner 
1981820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0,
19827bcb6cafSSascha Wildner                 &Subtable);
1983820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
1984820c5b08SSascha Wildner             {
1985820c5b08SSascha Wildner                 return (Status);
1986820c5b08SSascha Wildner             }
1987820c5b08SSascha Wildner 
1988820c5b08SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
1989820c5b08SSascha Wildner             IortItsGroup = ACPI_CAST_PTR (ACPI_IORT_ITS_GROUP, Subtable->Buffer);
1990820c5b08SSascha Wildner             NodeLength += Subtable->Length;
1991820c5b08SSascha Wildner 
1992820c5b08SSascha Wildner             ItsNumber = 0;
1993820c5b08SSascha Wildner             while (*PFieldList)
1994820c5b08SSascha Wildner             {
1995820c5b08SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0a,
19967bcb6cafSSascha Wildner                     &Subtable);
1997820c5b08SSascha Wildner                 if (ACPI_FAILURE (Status))
1998820c5b08SSascha Wildner                 {
1999820c5b08SSascha Wildner                     return (Status);
2000820c5b08SSascha Wildner                 }
2001820c5b08SSascha Wildner                 if (!Subtable)
2002820c5b08SSascha Wildner                 {
2003820c5b08SSascha Wildner                     break;
2004820c5b08SSascha Wildner                 }
2005820c5b08SSascha Wildner 
2006820c5b08SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
2007820c5b08SSascha Wildner                 NodeLength += Subtable->Length;
2008820c5b08SSascha Wildner                 ItsNumber++;
2009820c5b08SSascha Wildner             }
2010820c5b08SSascha Wildner 
2011820c5b08SSascha Wildner             IortItsGroup->ItsCount = ItsNumber;
2012820c5b08SSascha Wildner             break;
2013820c5b08SSascha Wildner 
2014820c5b08SSascha Wildner         case ACPI_IORT_NODE_NAMED_COMPONENT:
2015820c5b08SSascha Wildner 
2016820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1,
20177bcb6cafSSascha Wildner                 &Subtable);
2018820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
2019820c5b08SSascha Wildner             {
2020820c5b08SSascha Wildner                 return (Status);
2021820c5b08SSascha Wildner             }
2022820c5b08SSascha Wildner 
2023820c5b08SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
2024820c5b08SSascha Wildner             NodeLength += Subtable->Length;
2025820c5b08SSascha Wildner 
2026820c5b08SSascha Wildner             /*
2027820c5b08SSascha Wildner              * Padding - Variable-length data
2028820c5b08SSascha Wildner              * Optionally allows the offset of the ID mappings to be used
2029820c5b08SSascha Wildner              * for filling this field.
2030820c5b08SSascha Wildner              */
2031820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1a,
20327bcb6cafSSascha Wildner                 &Subtable);
2033820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
2034820c5b08SSascha Wildner             {
2035820c5b08SSascha Wildner                 return (Status);
2036820c5b08SSascha Wildner             }
2037820c5b08SSascha Wildner 
2038820c5b08SSascha Wildner             if (Subtable)
2039820c5b08SSascha Wildner             {
2040820c5b08SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
2041820c5b08SSascha Wildner                 NodeLength += Subtable->Length;
2042820c5b08SSascha Wildner             }
2043820c5b08SSascha Wildner             else
2044820c5b08SSascha Wildner             {
2045820c5b08SSascha Wildner                 if (NodeLength > IortNode->MappingOffset)
2046820c5b08SSascha Wildner                 {
2047820c5b08SSascha Wildner                     return (AE_BAD_DATA);
2048820c5b08SSascha Wildner                 }
2049820c5b08SSascha Wildner 
2050820c5b08SSascha Wildner                 if (NodeLength < IortNode->MappingOffset)
2051820c5b08SSascha Wildner                 {
2052820c5b08SSascha Wildner                     Status = DtCompilePadding (
2053820c5b08SSascha Wildner                         IortNode->MappingOffset - NodeLength,
2054820c5b08SSascha Wildner                         &Subtable);
2055820c5b08SSascha Wildner                     if (ACPI_FAILURE (Status))
2056820c5b08SSascha Wildner                     {
2057820c5b08SSascha Wildner                         return (Status);
2058820c5b08SSascha Wildner                     }
2059820c5b08SSascha Wildner 
2060820c5b08SSascha Wildner                     DtInsertSubtable (ParentTable, Subtable);
2061820c5b08SSascha Wildner                     NodeLength = IortNode->MappingOffset;
2062820c5b08SSascha Wildner                 }
2063820c5b08SSascha Wildner             }
2064820c5b08SSascha Wildner             break;
2065820c5b08SSascha Wildner 
2066820c5b08SSascha Wildner         case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
2067820c5b08SSascha Wildner 
2068820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort2,
20697bcb6cafSSascha Wildner                 &Subtable);
2070820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
2071820c5b08SSascha Wildner             {
2072820c5b08SSascha Wildner                 return (Status);
2073820c5b08SSascha Wildner             }
2074820c5b08SSascha Wildner 
2075820c5b08SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
2076820c5b08SSascha Wildner             NodeLength += Subtable->Length;
2077820c5b08SSascha Wildner             break;
2078820c5b08SSascha Wildner 
2079820c5b08SSascha Wildner         case ACPI_IORT_NODE_SMMU:
2080820c5b08SSascha Wildner 
2081820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3,
20827bcb6cafSSascha Wildner                 &Subtable);
2083820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
2084820c5b08SSascha Wildner             {
2085820c5b08SSascha Wildner                 return (Status);
2086820c5b08SSascha Wildner             }
2087820c5b08SSascha Wildner 
2088820c5b08SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
2089820c5b08SSascha Wildner             IortSmmu = ACPI_CAST_PTR (ACPI_IORT_SMMU, Subtable->Buffer);
2090820c5b08SSascha Wildner             NodeLength += Subtable->Length;
2091820c5b08SSascha Wildner 
2092820c5b08SSascha Wildner             /* Compile global interrupt array */
2093820c5b08SSascha Wildner 
2094820c5b08SSascha Wildner             IortSmmu->GlobalInterruptOffset = NodeLength;
2095820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3a,
20967bcb6cafSSascha Wildner                 &Subtable);
2097820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
2098820c5b08SSascha Wildner             {
2099820c5b08SSascha Wildner                 return (Status);
2100820c5b08SSascha Wildner             }
2101820c5b08SSascha Wildner 
2102820c5b08SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
2103820c5b08SSascha Wildner             NodeLength += Subtable->Length;
2104820c5b08SSascha Wildner 
2105820c5b08SSascha Wildner             /* Compile context interrupt array */
2106820c5b08SSascha Wildner 
2107820c5b08SSascha Wildner             ContextIrptNumber = 0;
2108820c5b08SSascha Wildner             IortSmmu->ContextInterruptOffset = NodeLength;
2109820c5b08SSascha Wildner             while (*PFieldList)
2110820c5b08SSascha Wildner             {
2111820c5b08SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3b,
21127bcb6cafSSascha Wildner                     &Subtable);
2113820c5b08SSascha Wildner                 if (ACPI_FAILURE (Status))
2114820c5b08SSascha Wildner                 {
2115820c5b08SSascha Wildner                     return (Status);
2116820c5b08SSascha Wildner                 }
2117820c5b08SSascha Wildner 
2118820c5b08SSascha Wildner                 if (!Subtable)
2119820c5b08SSascha Wildner                 {
2120820c5b08SSascha Wildner                     break;
2121820c5b08SSascha Wildner                 }
2122820c5b08SSascha Wildner 
2123820c5b08SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
2124820c5b08SSascha Wildner                 NodeLength += Subtable->Length;
2125820c5b08SSascha Wildner                 ContextIrptNumber++;
2126820c5b08SSascha Wildner             }
2127820c5b08SSascha Wildner 
2128820c5b08SSascha Wildner             IortSmmu->ContextInterruptCount = ContextIrptNumber;
2129820c5b08SSascha Wildner 
2130820c5b08SSascha Wildner             /* Compile PMU interrupt array */
2131820c5b08SSascha Wildner 
2132820c5b08SSascha Wildner             PmuIrptNumber = 0;
2133820c5b08SSascha Wildner             IortSmmu->PmuInterruptOffset = NodeLength;
2134820c5b08SSascha Wildner             while (*PFieldList)
2135820c5b08SSascha Wildner             {
2136820c5b08SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3c,
21377bcb6cafSSascha Wildner                     &Subtable);
2138820c5b08SSascha Wildner                 if (ACPI_FAILURE (Status))
2139820c5b08SSascha Wildner                 {
2140820c5b08SSascha Wildner                     return (Status);
2141820c5b08SSascha Wildner                 }
2142820c5b08SSascha Wildner 
2143820c5b08SSascha Wildner                 if (!Subtable)
2144820c5b08SSascha Wildner                 {
2145820c5b08SSascha Wildner                     break;
2146820c5b08SSascha Wildner                 }
2147820c5b08SSascha Wildner 
2148820c5b08SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
2149820c5b08SSascha Wildner                 NodeLength += Subtable->Length;
2150820c5b08SSascha Wildner                 PmuIrptNumber++;
2151820c5b08SSascha Wildner             }
2152820c5b08SSascha Wildner 
2153820c5b08SSascha Wildner             IortSmmu->PmuInterruptCount = PmuIrptNumber;
2154820c5b08SSascha Wildner             break;
2155820c5b08SSascha Wildner 
21562ffe9f16SSascha Wildner         case ACPI_IORT_NODE_SMMU_V3:
21572ffe9f16SSascha Wildner 
21582ffe9f16SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort4,
21597bcb6cafSSascha Wildner                 &Subtable);
21602ffe9f16SSascha Wildner             if (ACPI_FAILURE (Status))
21612ffe9f16SSascha Wildner             {
21622ffe9f16SSascha Wildner                 return (Status);
21632ffe9f16SSascha Wildner             }
21642ffe9f16SSascha Wildner 
21652ffe9f16SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
21662ffe9f16SSascha Wildner             NodeLength += Subtable->Length;
21672ffe9f16SSascha Wildner             break;
21682ffe9f16SSascha Wildner 
2169e416ee21SSascha Wildner         case ACPI_IORT_NODE_PMCG:
2170e416ee21SSascha Wildner 
2171e416ee21SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort5,
2172e416ee21SSascha Wildner                 &Subtable);
2173e416ee21SSascha Wildner             if (ACPI_FAILURE (Status))
2174e416ee21SSascha Wildner             {
2175e416ee21SSascha Wildner                 return (Status);
2176e416ee21SSascha Wildner             }
2177e416ee21SSascha Wildner 
2178e416ee21SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
2179e416ee21SSascha Wildner             NodeLength += Subtable->Length;
2180e416ee21SSascha Wildner             break;
2181e416ee21SSascha Wildner 
218201d5d5dfSSascha Wildner         case ACPI_IORT_NODE_RMR:
218301d5d5dfSSascha Wildner 
218401d5d5dfSSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6,
218501d5d5dfSSascha Wildner                 &Subtable);
218601d5d5dfSSascha Wildner             if (ACPI_FAILURE (Status))
218701d5d5dfSSascha Wildner             {
218801d5d5dfSSascha Wildner                 return (Status);
218901d5d5dfSSascha Wildner             }
219001d5d5dfSSascha Wildner 
219101d5d5dfSSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
219201d5d5dfSSascha Wildner             IortRmr = ACPI_CAST_PTR (ACPI_IORT_RMR, Subtable->Buffer);
219301d5d5dfSSascha Wildner             NodeLength += Subtable->Length;
219401d5d5dfSSascha Wildner 
219501d5d5dfSSascha Wildner             /* Compile RMR Descriptors */
219601d5d5dfSSascha Wildner 
219701d5d5dfSSascha Wildner             RmrCount = 0;
219801d5d5dfSSascha Wildner             IortRmr->RmrOffset = NodeLength;
219901d5d5dfSSascha Wildner             while (*PFieldList)
220001d5d5dfSSascha Wildner             {
220101d5d5dfSSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6a,
220201d5d5dfSSascha Wildner                     &Subtable);
220301d5d5dfSSascha Wildner                 if (ACPI_FAILURE (Status))
220401d5d5dfSSascha Wildner                 {
220501d5d5dfSSascha Wildner                     return (Status);
220601d5d5dfSSascha Wildner                 }
220701d5d5dfSSascha Wildner 
220801d5d5dfSSascha Wildner                 if (!Subtable)
220901d5d5dfSSascha Wildner                 {
221001d5d5dfSSascha Wildner                     break;
221101d5d5dfSSascha Wildner                 }
221201d5d5dfSSascha Wildner 
221301d5d5dfSSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
221401d5d5dfSSascha Wildner                 NodeLength += sizeof (ACPI_IORT_RMR_DESC);
221501d5d5dfSSascha Wildner                 RmrCount++;
221601d5d5dfSSascha Wildner             }
221701d5d5dfSSascha Wildner 
221801d5d5dfSSascha Wildner             IortRmr->RmrCount = RmrCount;
221901d5d5dfSSascha Wildner             break;
222001d5d5dfSSascha Wildner 
2221820c5b08SSascha Wildner 	default:
2222820c5b08SSascha Wildner 
2223820c5b08SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IORT");
2224820c5b08SSascha Wildner             return (AE_ERROR);
2225820c5b08SSascha Wildner         }
2226820c5b08SSascha Wildner 
2227820c5b08SSascha Wildner         /* Compile Array of ID mappings */
2228820c5b08SSascha Wildner 
2229820c5b08SSascha Wildner         IortNode->MappingOffset = NodeLength;
2230820c5b08SSascha Wildner         IdMappingNumber = 0;
2231820c5b08SSascha Wildner         while (*PFieldList)
2232820c5b08SSascha Wildner         {
2233820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortMap,
22347bcb6cafSSascha Wildner                 &Subtable);
2235820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
2236820c5b08SSascha Wildner             {
2237820c5b08SSascha Wildner                 return (Status);
2238820c5b08SSascha Wildner             }
2239820c5b08SSascha Wildner 
2240820c5b08SSascha Wildner             if (!Subtable)
2241820c5b08SSascha Wildner             {
2242820c5b08SSascha Wildner                 break;
2243820c5b08SSascha Wildner             }
2244820c5b08SSascha Wildner 
2245820c5b08SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
2246820c5b08SSascha Wildner             NodeLength += sizeof (ACPI_IORT_ID_MAPPING);
2247820c5b08SSascha Wildner             IdMappingNumber++;
2248820c5b08SSascha Wildner         }
2249820c5b08SSascha Wildner 
2250820c5b08SSascha Wildner         IortNode->MappingCount = IdMappingNumber;
2251d638c6eeSSascha Wildner         if (!IdMappingNumber)
2252d638c6eeSSascha Wildner         {
2253d638c6eeSSascha Wildner             IortNode->MappingOffset = 0;
2254d638c6eeSSascha Wildner         }
2255820c5b08SSascha Wildner 
2256820c5b08SSascha Wildner         /*
2257820c5b08SSascha Wildner          * Node length can be determined by DT_LENGTH option
2258820c5b08SSascha Wildner          * IortNode->Length = NodeLength;
2259820c5b08SSascha Wildner          */
2260820c5b08SSascha Wildner         DtPopSubtable ();
2261820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
2262820c5b08SSascha Wildner         NodeNumber++;
2263820c5b08SSascha Wildner     }
2264820c5b08SSascha Wildner 
2265820c5b08SSascha Wildner     Iort->NodeCount = NodeNumber;
2266820c5b08SSascha Wildner     return (AE_OK);
2267820c5b08SSascha Wildner }
2268820c5b08SSascha Wildner 
2269820c5b08SSascha Wildner 
2270820c5b08SSascha Wildner /******************************************************************************
2271820c5b08SSascha Wildner  *
2272820c5b08SSascha Wildner  * FUNCTION:    DtCompileIvrs
2273820c5b08SSascha Wildner  *
2274820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
2275820c5b08SSascha Wildner  *
2276820c5b08SSascha Wildner  * RETURN:      Status
2277820c5b08SSascha Wildner  *
22784898bea4SSascha Wildner  * DESCRIPTION: Compile IVRS. Notes:
22794898bea4SSascha Wildner  *              The IVRS is essentially a flat table, with the following
22804898bea4SSascha Wildner  *              structure:
22814898bea4SSascha Wildner  *              <Main ACPI Table Header>
22824898bea4SSascha Wildner  *              <Main subtable - virtualization info>
22834898bea4SSascha Wildner  *              <IVHD>
22844898bea4SSascha Wildner  *                  <Device Entries>
22854898bea4SSascha Wildner  *              ...
22864898bea4SSascha Wildner  *              <IVHD>
22874898bea4SSascha Wildner  *                  <Device Entries>
22884898bea4SSascha Wildner  *              <IVMD>
22894898bea4SSascha Wildner  *              ...
2290820c5b08SSascha Wildner  *
2291820c5b08SSascha Wildner  *****************************************************************************/
2292820c5b08SSascha Wildner 
2293820c5b08SSascha Wildner ACPI_STATUS
DtCompileIvrs(void ** List)2294820c5b08SSascha Wildner DtCompileIvrs (
2295820c5b08SSascha Wildner     void                    **List)
2296820c5b08SSascha Wildner {
2297820c5b08SSascha Wildner     ACPI_STATUS             Status;
2298820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
2299820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
23004898bea4SSascha Wildner     DT_SUBTABLE             *MainSubtable;
2301820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2302820c5b08SSascha Wildner     DT_FIELD                *SubtableStart;
23034898bea4SSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable = NULL;
23044898bea4SSascha Wildner     UINT8                   SubtableType;
23054898bea4SSascha Wildner     UINT8                   Temp64[16];
23064898bea4SSascha Wildner     UINT8                   Temp8;
2307820c5b08SSascha Wildner 
2308820c5b08SSascha Wildner 
23094898bea4SSascha Wildner     /* Main table */
23104898bea4SSascha Wildner 
2311820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs,
23127bcb6cafSSascha Wildner         &Subtable);
2313820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
2314820c5b08SSascha Wildner     {
2315820c5b08SSascha Wildner         return (Status);
2316820c5b08SSascha Wildner     }
2317820c5b08SSascha Wildner 
2318820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
2319820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
23204898bea4SSascha Wildner     DtPushSubtable (Subtable);
23214898bea4SSascha Wildner 
23224898bea4SSascha Wildner     /* Save a pointer to the main subtable */
23234898bea4SSascha Wildner 
23244898bea4SSascha Wildner     MainSubtable = Subtable;
2325820c5b08SSascha Wildner 
2326820c5b08SSascha Wildner     while (*PFieldList)
2327820c5b08SSascha Wildner     {
2328820c5b08SSascha Wildner         SubtableStart = *PFieldList;
23294898bea4SSascha Wildner 
23304898bea4SSascha Wildner         /* Compile the SubtableType integer */
23314898bea4SSascha Wildner 
23324898bea4SSascha Wildner         DtCompileInteger (&SubtableType, *PFieldList, 1, 0);
23334898bea4SSascha Wildner 
23344898bea4SSascha Wildner         switch (SubtableType)
2335820c5b08SSascha Wildner         {
2336820c5b08SSascha Wildner 
23374898bea4SSascha Wildner         /* Type 10h, IVHD (I/O Virtualization Hardware Definition) */
2338820c5b08SSascha Wildner 
233971c97a3cSSascha Wildner         case ACPI_IVRS_TYPE_HARDWARE1:
2340820c5b08SSascha Wildner 
23414898bea4SSascha Wildner             InfoTable = AcpiDmTableInfoIvrsHware1;
2342820c5b08SSascha Wildner             break;
2343820c5b08SSascha Wildner 
23444898bea4SSascha Wildner         /* Types 11h, 40h, IVHD (I/O Virtualization Hardware Definition) */
23454898bea4SSascha Wildner 
234671c97a3cSSascha Wildner         case ACPI_IVRS_TYPE_HARDWARE2:
23474898bea4SSascha Wildner         case ACPI_IVRS_TYPE_HARDWARE3:
234871c97a3cSSascha Wildner 
23494898bea4SSascha Wildner             InfoTable = AcpiDmTableInfoIvrsHware23;
235071c97a3cSSascha Wildner             break;
235171c97a3cSSascha Wildner 
23524898bea4SSascha Wildner         /* Types 20h, 21h, 22h, IVMD (I/O Virtualization Memory Definition Block) */
23534898bea4SSascha Wildner 
2354820c5b08SSascha Wildner         case ACPI_IVRS_TYPE_MEMORY1:
2355820c5b08SSascha Wildner         case ACPI_IVRS_TYPE_MEMORY2:
2356820c5b08SSascha Wildner         case ACPI_IVRS_TYPE_MEMORY3:
2357820c5b08SSascha Wildner 
23584898bea4SSascha Wildner             InfoTable = AcpiDmTableInfoIvrsMemory;
2359820c5b08SSascha Wildner             break;
2360820c5b08SSascha Wildner 
2361820c5b08SSascha Wildner         /* 4-byte device entries */
2362820c5b08SSascha Wildner 
2363820c5b08SSascha Wildner         case ACPI_IVRS_TYPE_PAD4:
2364820c5b08SSascha Wildner         case ACPI_IVRS_TYPE_ALL:
2365820c5b08SSascha Wildner         case ACPI_IVRS_TYPE_SELECT:
2366820c5b08SSascha Wildner         case ACPI_IVRS_TYPE_START:
2367820c5b08SSascha Wildner         case ACPI_IVRS_TYPE_END:
2368820c5b08SSascha Wildner 
2369820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoIvrs4;
2370820c5b08SSascha Wildner             break;
2371820c5b08SSascha Wildner 
23724898bea4SSascha Wildner         /* 8-byte device entries, type A */
2373820c5b08SSascha Wildner 
2374820c5b08SSascha Wildner         case ACPI_IVRS_TYPE_ALIAS_SELECT:
2375820c5b08SSascha Wildner         case ACPI_IVRS_TYPE_ALIAS_START:
2376820c5b08SSascha Wildner 
2377820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoIvrs8a;
2378820c5b08SSascha Wildner             break;
2379820c5b08SSascha Wildner 
23804898bea4SSascha Wildner         /* 8-byte device entries, type B */
2381820c5b08SSascha Wildner 
2382820c5b08SSascha Wildner         case ACPI_IVRS_TYPE_EXT_SELECT:
2383820c5b08SSascha Wildner         case ACPI_IVRS_TYPE_EXT_START:
2384820c5b08SSascha Wildner 
2385820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoIvrs8b;
2386820c5b08SSascha Wildner             break;
2387820c5b08SSascha Wildner 
23884898bea4SSascha Wildner         /* 8-byte device entries, type C */
2389820c5b08SSascha Wildner 
2390820c5b08SSascha Wildner         case ACPI_IVRS_TYPE_SPECIAL:
2391820c5b08SSascha Wildner 
2392820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoIvrs8c;
2393820c5b08SSascha Wildner             break;
2394820c5b08SSascha Wildner 
23954898bea4SSascha Wildner         /* Variable device entries, type F0h */
23964898bea4SSascha Wildner 
23974898bea4SSascha Wildner         case ACPI_IVRS_TYPE_HID:
23984898bea4SSascha Wildner 
23994898bea4SSascha Wildner             InfoTable = AcpiDmTableInfoIvrsHid;
24004898bea4SSascha Wildner             break;
24014898bea4SSascha Wildner 
2402820c5b08SSascha Wildner         default:
2403820c5b08SSascha Wildner 
2404820c5b08SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart,
2405820c5b08SSascha Wildner                 "IVRS Device Entry");
2406820c5b08SSascha Wildner             return (AE_ERROR);
2407820c5b08SSascha Wildner         }
2408820c5b08SSascha Wildner 
24094898bea4SSascha Wildner         /* Compile the InfoTable from above */
24104898bea4SSascha Wildner 
2411820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable,
24127bcb6cafSSascha Wildner             &Subtable);
2413820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
2414820c5b08SSascha Wildner         {
2415820c5b08SSascha Wildner             return (Status);
2416820c5b08SSascha Wildner         }
2417820c5b08SSascha Wildner 
24184898bea4SSascha Wildner         ParentTable = DtPeekSubtable ();
24194898bea4SSascha Wildner         if (SubtableType != ACPI_IVRS_TYPE_HARDWARE1 &&
24204898bea4SSascha Wildner             SubtableType != ACPI_IVRS_TYPE_HARDWARE2 &&
24214898bea4SSascha Wildner             SubtableType != ACPI_IVRS_TYPE_HARDWARE3 &&
24224898bea4SSascha Wildner             SubtableType != ACPI_IVRS_TYPE_HID &&
24234898bea4SSascha Wildner             SubtableType != ACPI_IVRS_TYPE_MEMORY1 &&
24244898bea4SSascha Wildner             SubtableType != ACPI_IVRS_TYPE_MEMORY2 &&
24254898bea4SSascha Wildner             SubtableType != ACPI_IVRS_TYPE_MEMORY3)
24264898bea4SSascha Wildner         {
24274898bea4SSascha Wildner             if (ParentTable)
2428820c5b08SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
2429820c5b08SSascha Wildner         }
24304898bea4SSascha Wildner 
24314898bea4SSascha Wildner         switch (SubtableType)
24324898bea4SSascha Wildner         {
24334898bea4SSascha Wildner         case ACPI_IVRS_TYPE_HARDWARE1:
24344898bea4SSascha Wildner         case ACPI_IVRS_TYPE_HARDWARE2:
24354898bea4SSascha Wildner         case ACPI_IVRS_TYPE_HARDWARE3:
24364898bea4SSascha Wildner         case ACPI_IVRS_TYPE_MEMORY1:
24374898bea4SSascha Wildner         case ACPI_IVRS_TYPE_MEMORY2:
24384898bea4SSascha Wildner         case ACPI_IVRS_TYPE_MEMORY3:
24394898bea4SSascha Wildner 
24404898bea4SSascha Wildner             /* Insert these IVHDs/IVMDs at the root subtable */
24414898bea4SSascha Wildner 
24424898bea4SSascha Wildner             DtInsertSubtable (MainSubtable, Subtable);
24434898bea4SSascha Wildner             DtPushSubtable (Subtable);
24444898bea4SSascha Wildner             ParentTable = MainSubtable;
24454898bea4SSascha Wildner             break;
24464898bea4SSascha Wildner 
24474898bea4SSascha Wildner         case ACPI_IVRS_TYPE_HID:
24484898bea4SSascha Wildner 
24494898bea4SSascha Wildner             /* Special handling for the HID named device entry (0xF0) */
24504898bea4SSascha Wildner 
24514898bea4SSascha Wildner             if (ParentTable)
24524898bea4SSascha Wildner             {
24534898bea4SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
24544898bea4SSascha Wildner             }
24554898bea4SSascha Wildner 
24564898bea4SSascha Wildner             /*
24574898bea4SSascha Wildner              * Process the HID value. First, get the HID value as a string.
24584898bea4SSascha Wildner              */
24594898bea4SSascha Wildner             DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 16, DT_FIELD_TYPE_STRING, 0);
24604898bea4SSascha Wildner 
24614898bea4SSascha Wildner                /*
24624898bea4SSascha Wildner                 * Determine if the HID is an integer or a string.
24634898bea4SSascha Wildner                 * An integer is defined to be 32 bits, with the upper 32 bits
24644898bea4SSascha Wildner                 * set to zero. (from the ACPI Spec): "The HID can be a 32-bit
24654898bea4SSascha Wildner                 * integer or a character string. If an integer, the lower
24664898bea4SSascha Wildner                 * 4 bytes of the field contain the integer and the upper
24674898bea4SSascha Wildner                 * 4 bytes are padded with 0".
24684898bea4SSascha Wildner                 */
24694898bea4SSascha Wildner             if (UtIsIdInteger ((UINT8 *) &Temp64))
24704898bea4SSascha Wildner             {
24714898bea4SSascha Wildner                 /* Compile the HID value as an integer */
24724898bea4SSascha Wildner 
24734898bea4SSascha Wildner                 DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 8, DT_FIELD_TYPE_INTEGER, 0);
24744898bea4SSascha Wildner 
24754898bea4SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHidInteger,
24764898bea4SSascha Wildner                     &Subtable);
24774898bea4SSascha Wildner                 if (ACPI_FAILURE (Status))
24784898bea4SSascha Wildner                 {
24794898bea4SSascha Wildner                     return (Status);
24804898bea4SSascha Wildner                 }
24814898bea4SSascha Wildner             }
24824898bea4SSascha Wildner             else
24834898bea4SSascha Wildner             {
24844898bea4SSascha Wildner                 /* Compile the HID value as a string */
24854898bea4SSascha Wildner 
24864898bea4SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHidString,
24874898bea4SSascha Wildner                     &Subtable);
24884898bea4SSascha Wildner                 if (ACPI_FAILURE (Status))
24894898bea4SSascha Wildner                 {
24904898bea4SSascha Wildner                     return (Status);
24914898bea4SSascha Wildner                 }
2492820c5b08SSascha Wildner             }
2493820c5b08SSascha Wildner 
24944898bea4SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
24954898bea4SSascha Wildner 
24964898bea4SSascha Wildner             /*
24974898bea4SSascha Wildner              * Process the CID value. First, get the CID value as a string.
24984898bea4SSascha Wildner              */
24994898bea4SSascha Wildner             DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 16, DT_FIELD_TYPE_STRING, 0);
25004898bea4SSascha Wildner 
25014898bea4SSascha Wildner             if (UtIsIdInteger ((UINT8 *) &Temp64))
25024898bea4SSascha Wildner             {
25034898bea4SSascha Wildner                 /* Compile the CID value as an integer */
25044898bea4SSascha Wildner 
25054898bea4SSascha Wildner                 DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 8, DT_FIELD_TYPE_INTEGER, 0);
25064898bea4SSascha Wildner 
25074898bea4SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsCidInteger,
25084898bea4SSascha Wildner                     &Subtable);
25094898bea4SSascha Wildner                 if (ACPI_FAILURE (Status))
25104898bea4SSascha Wildner                 {
25114898bea4SSascha Wildner                     return (Status);
25124898bea4SSascha Wildner                 }
25134898bea4SSascha Wildner             }
25144898bea4SSascha Wildner             else
25154898bea4SSascha Wildner             {
25164898bea4SSascha Wildner                 /* Compile the CID value as a string */
25174898bea4SSascha Wildner 
25184898bea4SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsCidString,
25194898bea4SSascha Wildner                     &Subtable);
25204898bea4SSascha Wildner                 if (ACPI_FAILURE (Status))
25214898bea4SSascha Wildner                 {
25224898bea4SSascha Wildner                     return (Status);
25234898bea4SSascha Wildner                 }
25244898bea4SSascha Wildner             }
25254898bea4SSascha Wildner 
25264898bea4SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
25274898bea4SSascha Wildner 
25284898bea4SSascha Wildner             /*
25294898bea4SSascha Wildner              * Process the UID value. First, get and decode the "UID Format" field (Integer).
25304898bea4SSascha Wildner              */
25314898bea4SSascha Wildner             if (!*PFieldList)
25324898bea4SSascha Wildner             {
25334898bea4SSascha Wildner                 return (AE_OK);
25344898bea4SSascha Wildner             }
25354898bea4SSascha Wildner 
25364898bea4SSascha Wildner             DtCompileOneField (&Temp8, *PFieldList, 1, DT_FIELD_TYPE_INTEGER, 0);
25374898bea4SSascha Wildner 
25384898bea4SSascha Wildner             switch (Temp8)
25394898bea4SSascha Wildner             {
25404898bea4SSascha Wildner             case ACPI_IVRS_UID_NOT_PRESENT:
25414898bea4SSascha Wildner                 break;
25424898bea4SSascha Wildner 
25434898bea4SSascha Wildner             case ACPI_IVRS_UID_IS_INTEGER:
25444898bea4SSascha Wildner 
25454898bea4SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsUidInteger,
25464898bea4SSascha Wildner                     &Subtable);
25474898bea4SSascha Wildner                 if (ACPI_FAILURE (Status))
25484898bea4SSascha Wildner                 {
25494898bea4SSascha Wildner                     return (Status);
25504898bea4SSascha Wildner                 }
25514898bea4SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
25524898bea4SSascha Wildner                 break;
25534898bea4SSascha Wildner 
25544898bea4SSascha Wildner             case ACPI_IVRS_UID_IS_STRING:
25554898bea4SSascha Wildner 
25564898bea4SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsUidString,
25574898bea4SSascha Wildner                     &Subtable);
25584898bea4SSascha Wildner                 if (ACPI_FAILURE (Status))
25594898bea4SSascha Wildner                 {
25604898bea4SSascha Wildner                     return (Status);
25614898bea4SSascha Wildner                 }
25624898bea4SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
25634898bea4SSascha Wildner                 break;
25644898bea4SSascha Wildner 
25654898bea4SSascha Wildner             default:
25664898bea4SSascha Wildner 
25674898bea4SSascha Wildner                 DtFatal (ASL_MSG_UNKNOWN_FORMAT, SubtableStart,
25684898bea4SSascha Wildner                     "IVRS Device Entry");
25694898bea4SSascha Wildner                 return (AE_ERROR);
25704898bea4SSascha Wildner             }
25714898bea4SSascha Wildner 
25724898bea4SSascha Wildner         default:
25734898bea4SSascha Wildner 
25744898bea4SSascha Wildner             /* All other subtable types come through here */
25754898bea4SSascha Wildner             break;
25764898bea4SSascha Wildner         }
2577820c5b08SSascha Wildner     }
2578820c5b08SSascha Wildner 
2579820c5b08SSascha Wildner     return (AE_OK);
2580820c5b08SSascha Wildner }
2581