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