1820c5b08SSascha Wildner /******************************************************************************
2820c5b08SSascha Wildner  *
3820c5b08SSascha Wildner  * Module Name: dttable2.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 L-Z */
153820c5b08SSascha Wildner 
154820c5b08SSascha Wildner #include "aslcompiler.h"
155820c5b08SSascha Wildner 
156820c5b08SSascha Wildner #define _COMPONENT          DT_COMPILER
157820c5b08SSascha Wildner         ACPI_MODULE_NAME    ("dttable2")
158820c5b08SSascha Wildner 
159820c5b08SSascha Wildner 
160820c5b08SSascha Wildner /******************************************************************************
161820c5b08SSascha Wildner  *
162820c5b08SSascha Wildner  * FUNCTION:    DtCompileLpit
163820c5b08SSascha Wildner  *
164820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
165820c5b08SSascha Wildner  *
166820c5b08SSascha Wildner  * RETURN:      Status
167820c5b08SSascha Wildner  *
168820c5b08SSascha Wildner  * DESCRIPTION: Compile LPIT.
169820c5b08SSascha Wildner  *
170820c5b08SSascha Wildner  *****************************************************************************/
171820c5b08SSascha Wildner 
172820c5b08SSascha Wildner ACPI_STATUS
DtCompileLpit(void ** List)173820c5b08SSascha Wildner DtCompileLpit (
174820c5b08SSascha Wildner     void                    **List)
175820c5b08SSascha Wildner {
176820c5b08SSascha Wildner     ACPI_STATUS             Status;
177820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
178820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
179820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
180820c5b08SSascha Wildner     DT_FIELD                *SubtableStart;
181820c5b08SSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable;
182820c5b08SSascha Wildner     ACPI_LPIT_HEADER        *LpitHeader;
183820c5b08SSascha Wildner 
184820c5b08SSascha Wildner 
185820c5b08SSascha Wildner     /* Note: Main table consists only of the standard ACPI table header */
186820c5b08SSascha Wildner 
187820c5b08SSascha Wildner     while (*PFieldList)
188820c5b08SSascha Wildner     {
189820c5b08SSascha Wildner         SubtableStart = *PFieldList;
190820c5b08SSascha Wildner 
191820c5b08SSascha Wildner         /* LPIT Subtable header */
192820c5b08SSascha Wildner 
193820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoLpitHdr,
1947bcb6cafSSascha Wildner             &Subtable);
195820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
196820c5b08SSascha Wildner         {
197820c5b08SSascha Wildner             return (Status);
198820c5b08SSascha Wildner         }
199820c5b08SSascha Wildner 
200820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
201820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
202820c5b08SSascha Wildner         DtPushSubtable (Subtable);
203820c5b08SSascha Wildner 
204820c5b08SSascha Wildner         LpitHeader = ACPI_CAST_PTR (ACPI_LPIT_HEADER, Subtable->Buffer);
205820c5b08SSascha Wildner 
206820c5b08SSascha Wildner         switch (LpitHeader->Type)
207820c5b08SSascha Wildner         {
208820c5b08SSascha Wildner         case ACPI_LPIT_TYPE_NATIVE_CSTATE:
209820c5b08SSascha Wildner 
210820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoLpit0;
211820c5b08SSascha Wildner             break;
212820c5b08SSascha Wildner 
213820c5b08SSascha Wildner         default:
214820c5b08SSascha Wildner 
215820c5b08SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "LPIT");
216820c5b08SSascha Wildner             return (AE_ERROR);
217820c5b08SSascha Wildner         }
218820c5b08SSascha Wildner 
219820c5b08SSascha Wildner         /* LPIT Subtable */
220820c5b08SSascha Wildner 
2217bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
222820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
223820c5b08SSascha Wildner         {
224820c5b08SSascha Wildner             return (Status);
225820c5b08SSascha Wildner         }
226820c5b08SSascha Wildner 
227820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
228820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
229820c5b08SSascha Wildner         DtPopSubtable ();
230820c5b08SSascha Wildner     }
231820c5b08SSascha Wildner 
232820c5b08SSascha Wildner     return (AE_OK);
233820c5b08SSascha Wildner }
234820c5b08SSascha Wildner 
235820c5b08SSascha Wildner 
236820c5b08SSascha Wildner /******************************************************************************
237820c5b08SSascha Wildner  *
238820c5b08SSascha Wildner  * FUNCTION:    DtCompileMadt
239820c5b08SSascha Wildner  *
240820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
241820c5b08SSascha Wildner  *
242820c5b08SSascha Wildner  * RETURN:      Status
243820c5b08SSascha Wildner  *
244820c5b08SSascha Wildner  * DESCRIPTION: Compile MADT.
245820c5b08SSascha Wildner  *
246820c5b08SSascha Wildner  *****************************************************************************/
247820c5b08SSascha Wildner 
248820c5b08SSascha Wildner ACPI_STATUS
DtCompileMadt(void ** List)249820c5b08SSascha Wildner DtCompileMadt (
250820c5b08SSascha Wildner     void                    **List)
251820c5b08SSascha Wildner {
252820c5b08SSascha Wildner     ACPI_STATUS             Status;
253820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
254820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
255820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
256820c5b08SSascha Wildner     DT_FIELD                *SubtableStart;
257820c5b08SSascha Wildner     ACPI_SUBTABLE_HEADER    *MadtHeader;
258820c5b08SSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable;
259820c5b08SSascha Wildner 
260820c5b08SSascha Wildner 
261820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
2627bcb6cafSSascha Wildner         &Subtable);
263820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
264820c5b08SSascha Wildner     {
265820c5b08SSascha Wildner         return (Status);
266820c5b08SSascha Wildner     }
267820c5b08SSascha Wildner 
268820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
269820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
270820c5b08SSascha Wildner 
271820c5b08SSascha Wildner     while (*PFieldList)
272820c5b08SSascha Wildner     {
273820c5b08SSascha Wildner         SubtableStart = *PFieldList;
274820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
2757bcb6cafSSascha Wildner             &Subtable);
276820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
277820c5b08SSascha Wildner         {
278820c5b08SSascha Wildner             return (Status);
279820c5b08SSascha Wildner         }
280820c5b08SSascha Wildner 
281820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
282820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
283820c5b08SSascha Wildner         DtPushSubtable (Subtable);
284820c5b08SSascha Wildner 
285820c5b08SSascha Wildner         MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
286820c5b08SSascha Wildner 
287820c5b08SSascha Wildner         switch (MadtHeader->Type)
288820c5b08SSascha Wildner         {
289820c5b08SSascha Wildner         case ACPI_MADT_TYPE_LOCAL_APIC:
290820c5b08SSascha Wildner 
291820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt0;
292820c5b08SSascha Wildner             break;
293820c5b08SSascha Wildner 
294820c5b08SSascha Wildner         case ACPI_MADT_TYPE_IO_APIC:
295820c5b08SSascha Wildner 
296820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt1;
297820c5b08SSascha Wildner             break;
298820c5b08SSascha Wildner 
299820c5b08SSascha Wildner         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
300820c5b08SSascha Wildner 
301820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt2;
302820c5b08SSascha Wildner             break;
303820c5b08SSascha Wildner 
304820c5b08SSascha Wildner         case ACPI_MADT_TYPE_NMI_SOURCE:
305820c5b08SSascha Wildner 
306820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt3;
307820c5b08SSascha Wildner             break;
308820c5b08SSascha Wildner 
309820c5b08SSascha Wildner         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
310820c5b08SSascha Wildner 
311820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt4;
312820c5b08SSascha Wildner             break;
313820c5b08SSascha Wildner 
314820c5b08SSascha Wildner         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
315820c5b08SSascha Wildner 
316820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt5;
317820c5b08SSascha Wildner             break;
318820c5b08SSascha Wildner 
319820c5b08SSascha Wildner         case ACPI_MADT_TYPE_IO_SAPIC:
320820c5b08SSascha Wildner 
321820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt6;
322820c5b08SSascha Wildner             break;
323820c5b08SSascha Wildner 
324820c5b08SSascha Wildner         case ACPI_MADT_TYPE_LOCAL_SAPIC:
325820c5b08SSascha Wildner 
326820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt7;
327820c5b08SSascha Wildner             break;
328820c5b08SSascha Wildner 
329820c5b08SSascha Wildner         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
330820c5b08SSascha Wildner 
331820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt8;
332820c5b08SSascha Wildner             break;
333820c5b08SSascha Wildner 
334820c5b08SSascha Wildner         case ACPI_MADT_TYPE_LOCAL_X2APIC:
335820c5b08SSascha Wildner 
336820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt9;
337820c5b08SSascha Wildner             break;
338820c5b08SSascha Wildner 
339820c5b08SSascha Wildner         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
340820c5b08SSascha Wildner 
341820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt10;
342820c5b08SSascha Wildner             break;
343820c5b08SSascha Wildner 
344820c5b08SSascha Wildner         case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
345820c5b08SSascha Wildner 
346820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt11;
347820c5b08SSascha Wildner             break;
348820c5b08SSascha Wildner 
349820c5b08SSascha Wildner         case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
350820c5b08SSascha Wildner 
351820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt12;
352820c5b08SSascha Wildner             break;
353820c5b08SSascha Wildner 
354820c5b08SSascha Wildner         case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
355820c5b08SSascha Wildner 
356820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt13;
357820c5b08SSascha Wildner             break;
358820c5b08SSascha Wildner 
359820c5b08SSascha Wildner         case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
360820c5b08SSascha Wildner 
361820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt14;
362820c5b08SSascha Wildner             break;
363820c5b08SSascha Wildner 
364820c5b08SSascha Wildner         case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
365820c5b08SSascha Wildner 
366820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoMadt15;
367820c5b08SSascha Wildner             break;
368820c5b08SSascha Wildner 
36901d5d5dfSSascha Wildner         case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
37001d5d5dfSSascha Wildner 
37101d5d5dfSSascha Wildner             InfoTable = AcpiDmTableInfoMadt16;
37201d5d5dfSSascha Wildner             break;
37301d5d5dfSSascha Wildner 
374820c5b08SSascha Wildner         default:
375820c5b08SSascha Wildner 
376820c5b08SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
377820c5b08SSascha Wildner             return (AE_ERROR);
378820c5b08SSascha Wildner         }
379820c5b08SSascha Wildner 
3807bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
381820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
382820c5b08SSascha Wildner         {
383820c5b08SSascha Wildner             return (Status);
384820c5b08SSascha Wildner         }
385820c5b08SSascha Wildner 
386820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
387820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
388820c5b08SSascha Wildner         DtPopSubtable ();
389820c5b08SSascha Wildner     }
390820c5b08SSascha Wildner 
391820c5b08SSascha Wildner     return (AE_OK);
392820c5b08SSascha Wildner }
393820c5b08SSascha Wildner 
394820c5b08SSascha Wildner 
395820c5b08SSascha Wildner /******************************************************************************
396820c5b08SSascha Wildner  *
397820c5b08SSascha Wildner  * FUNCTION:    DtCompileMcfg
398820c5b08SSascha Wildner  *
399820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
400820c5b08SSascha Wildner  *
401820c5b08SSascha Wildner  * RETURN:      Status
402820c5b08SSascha Wildner  *
403820c5b08SSascha Wildner  * DESCRIPTION: Compile MCFG.
404820c5b08SSascha Wildner  *
405820c5b08SSascha Wildner  *****************************************************************************/
406820c5b08SSascha Wildner 
407820c5b08SSascha Wildner ACPI_STATUS
DtCompileMcfg(void ** List)408820c5b08SSascha Wildner DtCompileMcfg (
409820c5b08SSascha Wildner     void                    **List)
410820c5b08SSascha Wildner {
411820c5b08SSascha Wildner     ACPI_STATUS             Status;
412820c5b08SSascha Wildner 
413820c5b08SSascha Wildner 
414820c5b08SSascha Wildner     Status = DtCompileTwoSubtables (List,
415820c5b08SSascha Wildner         AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
416820c5b08SSascha Wildner     return (Status);
417820c5b08SSascha Wildner }
418820c5b08SSascha Wildner 
419820c5b08SSascha Wildner 
420820c5b08SSascha Wildner /******************************************************************************
421820c5b08SSascha Wildner  *
422820c5b08SSascha Wildner  * FUNCTION:    DtCompileMpst
423820c5b08SSascha Wildner  *
424820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
425820c5b08SSascha Wildner  *
426820c5b08SSascha Wildner  * RETURN:      Status
427820c5b08SSascha Wildner  *
428820c5b08SSascha Wildner  * DESCRIPTION: Compile MPST.
429820c5b08SSascha Wildner  *
430820c5b08SSascha Wildner  *****************************************************************************/
431820c5b08SSascha Wildner 
432820c5b08SSascha Wildner ACPI_STATUS
DtCompileMpst(void ** List)433820c5b08SSascha Wildner DtCompileMpst (
434820c5b08SSascha Wildner     void                    **List)
435820c5b08SSascha Wildner {
436820c5b08SSascha Wildner     ACPI_STATUS             Status;
437820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
438820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
439820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
440820c5b08SSascha Wildner     ACPI_MPST_CHANNEL       *MpstChannelInfo;
441820c5b08SSascha Wildner     ACPI_MPST_POWER_NODE    *MpstPowerNode;
442820c5b08SSascha Wildner     ACPI_MPST_DATA_HDR      *MpstDataHeader;
443820c5b08SSascha Wildner     UINT16                  SubtableCount;
444820c5b08SSascha Wildner     UINT32                  PowerStateCount;
445820c5b08SSascha Wildner     UINT32                  ComponentCount;
446820c5b08SSascha Wildner 
447820c5b08SSascha Wildner 
448820c5b08SSascha Wildner     /* Main table */
449820c5b08SSascha Wildner 
4507bcb6cafSSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable);
451820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
452820c5b08SSascha Wildner     {
453820c5b08SSascha Wildner         return (Status);
454820c5b08SSascha Wildner     }
455820c5b08SSascha Wildner 
456820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
457820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
458820c5b08SSascha Wildner     DtPushSubtable (Subtable);
459820c5b08SSascha Wildner 
460820c5b08SSascha Wildner     MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
461820c5b08SSascha Wildner     SubtableCount = MpstChannelInfo->PowerNodeCount;
462820c5b08SSascha Wildner 
463820c5b08SSascha Wildner     while (*PFieldList && SubtableCount)
464820c5b08SSascha Wildner     {
465820c5b08SSascha Wildner         /* Subtable: Memory Power Node(s) */
466820c5b08SSascha Wildner 
467820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
4687bcb6cafSSascha Wildner             &Subtable);
469820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
470820c5b08SSascha Wildner         {
471820c5b08SSascha Wildner             return (Status);
472820c5b08SSascha Wildner         }
473820c5b08SSascha Wildner 
474820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
475820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
476820c5b08SSascha Wildner         DtPushSubtable (Subtable);
477820c5b08SSascha Wildner 
478820c5b08SSascha Wildner         MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
479820c5b08SSascha Wildner         PowerStateCount = MpstPowerNode->NumPowerStates;
480820c5b08SSascha Wildner         ComponentCount = MpstPowerNode->NumPhysicalComponents;
481820c5b08SSascha Wildner 
482820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
483820c5b08SSascha Wildner 
484820c5b08SSascha Wildner         /* Sub-subtables - Memory Power State Structure(s) */
485820c5b08SSascha Wildner 
486820c5b08SSascha Wildner         while (*PFieldList && PowerStateCount)
487820c5b08SSascha Wildner         {
488820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
4897bcb6cafSSascha Wildner                 &Subtable);
490820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
491820c5b08SSascha Wildner             {
492820c5b08SSascha Wildner                 return (Status);
493820c5b08SSascha Wildner             }
494820c5b08SSascha Wildner 
495820c5b08SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
496820c5b08SSascha Wildner             PowerStateCount--;
497820c5b08SSascha Wildner         }
498820c5b08SSascha Wildner 
499820c5b08SSascha Wildner         /* Sub-subtables - Physical Component ID Structure(s) */
500820c5b08SSascha Wildner 
501820c5b08SSascha Wildner         while (*PFieldList && ComponentCount)
502820c5b08SSascha Wildner         {
503820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
5047bcb6cafSSascha Wildner                 &Subtable);
505820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
506820c5b08SSascha Wildner             {
507820c5b08SSascha Wildner                 return (Status);
508820c5b08SSascha Wildner             }
509820c5b08SSascha Wildner 
510820c5b08SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
511820c5b08SSascha Wildner             ComponentCount--;
512820c5b08SSascha Wildner         }
513820c5b08SSascha Wildner 
514820c5b08SSascha Wildner         SubtableCount--;
515820c5b08SSascha Wildner         DtPopSubtable ();
516820c5b08SSascha Wildner     }
517820c5b08SSascha Wildner 
518820c5b08SSascha Wildner     /* Subtable: Count of Memory Power State Characteristic structures */
519820c5b08SSascha Wildner 
520820c5b08SSascha Wildner     DtPopSubtable ();
521820c5b08SSascha Wildner 
5227bcb6cafSSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable);
523820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
524820c5b08SSascha Wildner     {
525820c5b08SSascha Wildner         return (Status);
526820c5b08SSascha Wildner     }
527820c5b08SSascha Wildner 
528820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
529820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
530820c5b08SSascha Wildner     DtPushSubtable (Subtable);
531820c5b08SSascha Wildner 
532820c5b08SSascha Wildner     MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
533820c5b08SSascha Wildner     SubtableCount = MpstDataHeader->CharacteristicsCount;
534820c5b08SSascha Wildner 
535820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
536820c5b08SSascha Wildner 
537820c5b08SSascha Wildner     /* Subtable: Memory Power State Characteristics structure(s) */
538820c5b08SSascha Wildner 
539820c5b08SSascha Wildner     while (*PFieldList && SubtableCount)
540820c5b08SSascha Wildner     {
541820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
5427bcb6cafSSascha Wildner             &Subtable);
543820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
544820c5b08SSascha Wildner         {
545820c5b08SSascha Wildner             return (Status);
546820c5b08SSascha Wildner         }
547820c5b08SSascha Wildner 
548820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
549820c5b08SSascha Wildner         SubtableCount--;
550820c5b08SSascha Wildner     }
551820c5b08SSascha Wildner 
552820c5b08SSascha Wildner     DtPopSubtable ();
553820c5b08SSascha Wildner     return (AE_OK);
554820c5b08SSascha Wildner }
555820c5b08SSascha Wildner 
556820c5b08SSascha Wildner 
557820c5b08SSascha Wildner /******************************************************************************
558820c5b08SSascha Wildner  *
559820c5b08SSascha Wildner  * FUNCTION:    DtCompileMsct
560820c5b08SSascha Wildner  *
561820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
562820c5b08SSascha Wildner  *
563820c5b08SSascha Wildner  * RETURN:      Status
564820c5b08SSascha Wildner  *
565820c5b08SSascha Wildner  * DESCRIPTION: Compile MSCT.
566820c5b08SSascha Wildner  *
567820c5b08SSascha Wildner  *****************************************************************************/
568820c5b08SSascha Wildner 
569820c5b08SSascha Wildner ACPI_STATUS
DtCompileMsct(void ** List)570820c5b08SSascha Wildner DtCompileMsct (
571820c5b08SSascha Wildner     void                    **List)
572820c5b08SSascha Wildner {
573820c5b08SSascha Wildner     ACPI_STATUS             Status;
574820c5b08SSascha Wildner 
575820c5b08SSascha Wildner 
576820c5b08SSascha Wildner     Status = DtCompileTwoSubtables (List,
577820c5b08SSascha Wildner         AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
578820c5b08SSascha Wildner     return (Status);
579820c5b08SSascha Wildner }
580820c5b08SSascha Wildner 
581820c5b08SSascha Wildner 
582820c5b08SSascha Wildner /******************************************************************************
583820c5b08SSascha Wildner  *
584820c5b08SSascha Wildner  * FUNCTION:    DtCompileNfit
585820c5b08SSascha Wildner  *
586820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
587820c5b08SSascha Wildner  *
588820c5b08SSascha Wildner  * RETURN:      Status
589820c5b08SSascha Wildner  *
590820c5b08SSascha Wildner  * DESCRIPTION: Compile NFIT.
591820c5b08SSascha Wildner  *
592820c5b08SSascha Wildner  *****************************************************************************/
593820c5b08SSascha Wildner 
594820c5b08SSascha Wildner ACPI_STATUS
DtCompileNfit(void ** List)595820c5b08SSascha Wildner DtCompileNfit (
596820c5b08SSascha Wildner     void                    **List)
597820c5b08SSascha Wildner {
598820c5b08SSascha Wildner     ACPI_STATUS             Status;
599820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
600820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
601820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
602820c5b08SSascha Wildner     DT_FIELD                *SubtableStart;
603820c5b08SSascha Wildner     ACPI_NFIT_HEADER        *NfitHeader;
604820c5b08SSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable;
605820c5b08SSascha Wildner     UINT32                  Count;
606820c5b08SSascha Wildner     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
607820c5b08SSascha Wildner     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
608820c5b08SSascha Wildner 
609820c5b08SSascha Wildner 
610820c5b08SSascha Wildner     /* Main table */
611820c5b08SSascha Wildner 
612820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit,
6137bcb6cafSSascha Wildner         &Subtable);
614820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
615820c5b08SSascha Wildner     {
616820c5b08SSascha Wildner         return (Status);
617820c5b08SSascha Wildner     }
618820c5b08SSascha Wildner 
619820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
620820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
621820c5b08SSascha Wildner     DtPushSubtable (Subtable);
622820c5b08SSascha Wildner 
623820c5b08SSascha Wildner     /* Subtables */
624820c5b08SSascha Wildner 
625820c5b08SSascha Wildner     while (*PFieldList)
626820c5b08SSascha Wildner     {
627820c5b08SSascha Wildner         SubtableStart = *PFieldList;
628820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr,
6297bcb6cafSSascha Wildner             &Subtable);
630820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
631820c5b08SSascha Wildner         {
632820c5b08SSascha Wildner             return (Status);
633820c5b08SSascha Wildner         }
634820c5b08SSascha Wildner 
635820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
636820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
637820c5b08SSascha Wildner         DtPushSubtable (Subtable);
638820c5b08SSascha Wildner 
639820c5b08SSascha Wildner         NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
640820c5b08SSascha Wildner 
641820c5b08SSascha Wildner         switch (NfitHeader->Type)
642820c5b08SSascha Wildner         {
643820c5b08SSascha Wildner         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
644820c5b08SSascha Wildner 
645820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoNfit0;
646820c5b08SSascha Wildner             break;
647820c5b08SSascha Wildner 
648820c5b08SSascha Wildner         case ACPI_NFIT_TYPE_MEMORY_MAP:
649820c5b08SSascha Wildner 
650820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoNfit1;
651820c5b08SSascha Wildner             break;
652820c5b08SSascha Wildner 
653820c5b08SSascha Wildner         case ACPI_NFIT_TYPE_INTERLEAVE:
654820c5b08SSascha Wildner 
655820c5b08SSascha Wildner             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer);
656820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoNfit2;
657820c5b08SSascha Wildner             break;
658820c5b08SSascha Wildner 
659820c5b08SSascha Wildner         case ACPI_NFIT_TYPE_SMBIOS:
660820c5b08SSascha Wildner 
661820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoNfit3;
662820c5b08SSascha Wildner             break;
663820c5b08SSascha Wildner 
664820c5b08SSascha Wildner         case ACPI_NFIT_TYPE_CONTROL_REGION:
665820c5b08SSascha Wildner 
666820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoNfit4;
667820c5b08SSascha Wildner             break;
668820c5b08SSascha Wildner 
669820c5b08SSascha Wildner         case ACPI_NFIT_TYPE_DATA_REGION:
670820c5b08SSascha Wildner 
671820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoNfit5;
672820c5b08SSascha Wildner             break;
673820c5b08SSascha Wildner 
674820c5b08SSascha Wildner         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
675820c5b08SSascha Wildner 
676820c5b08SSascha Wildner             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer);
677820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoNfit6;
678820c5b08SSascha Wildner             break;
679820c5b08SSascha Wildner 
6807bcb6cafSSascha Wildner         case ACPI_NFIT_TYPE_CAPABILITIES:
6817bcb6cafSSascha Wildner 
6827bcb6cafSSascha Wildner             InfoTable = AcpiDmTableInfoNfit7;
6837bcb6cafSSascha Wildner             break;
6847bcb6cafSSascha Wildner 
685820c5b08SSascha Wildner         default:
686820c5b08SSascha Wildner 
687820c5b08SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT");
688820c5b08SSascha Wildner             return (AE_ERROR);
689820c5b08SSascha Wildner         }
690820c5b08SSascha Wildner 
6917bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
692820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
693820c5b08SSascha Wildner         {
694820c5b08SSascha Wildner             return (Status);
695820c5b08SSascha Wildner         }
696820c5b08SSascha Wildner 
697820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
698820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
699820c5b08SSascha Wildner         DtPopSubtable ();
700820c5b08SSascha Wildner 
701820c5b08SSascha Wildner         switch (NfitHeader->Type)
702820c5b08SSascha Wildner         {
703820c5b08SSascha Wildner         case ACPI_NFIT_TYPE_INTERLEAVE:
704820c5b08SSascha Wildner 
705820c5b08SSascha Wildner             Count = 0;
706820c5b08SSascha Wildner             DtPushSubtable (Subtable);
707820c5b08SSascha Wildner             while (*PFieldList)
708820c5b08SSascha Wildner             {
709820c5b08SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a,
7107bcb6cafSSascha Wildner                     &Subtable);
711820c5b08SSascha Wildner                 if (ACPI_FAILURE (Status))
712820c5b08SSascha Wildner                 {
713820c5b08SSascha Wildner                     return (Status);
714820c5b08SSascha Wildner                 }
715820c5b08SSascha Wildner 
716820c5b08SSascha Wildner                 if (!Subtable)
717820c5b08SSascha Wildner                 {
718820c5b08SSascha Wildner                     DtPopSubtable ();
719820c5b08SSascha Wildner                     break;
720820c5b08SSascha Wildner                 }
721820c5b08SSascha Wildner 
722820c5b08SSascha Wildner                 ParentTable = DtPeekSubtable ();
723820c5b08SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
724820c5b08SSascha Wildner                 Count++;
725820c5b08SSascha Wildner             }
726820c5b08SSascha Wildner 
727820c5b08SSascha Wildner             Interleave->LineCount = Count;
728820c5b08SSascha Wildner             break;
729820c5b08SSascha Wildner 
730820c5b08SSascha Wildner         case ACPI_NFIT_TYPE_SMBIOS:
731820c5b08SSascha Wildner 
732820c5b08SSascha Wildner             if (*PFieldList)
733820c5b08SSascha Wildner             {
734820c5b08SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a,
7357bcb6cafSSascha Wildner                     &Subtable);
736820c5b08SSascha Wildner                 if (ACPI_FAILURE (Status))
737820c5b08SSascha Wildner                 {
738820c5b08SSascha Wildner                     return (Status);
739820c5b08SSascha Wildner                 }
740820c5b08SSascha Wildner 
741820c5b08SSascha Wildner                 if (Subtable)
742820c5b08SSascha Wildner                 {
743820c5b08SSascha Wildner                     DtInsertSubtable (ParentTable, Subtable);
744820c5b08SSascha Wildner                 }
745820c5b08SSascha Wildner             }
746820c5b08SSascha Wildner             break;
747820c5b08SSascha Wildner 
748820c5b08SSascha Wildner         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
749820c5b08SSascha Wildner 
750820c5b08SSascha Wildner             Count = 0;
751820c5b08SSascha Wildner             DtPushSubtable (Subtable);
752820c5b08SSascha Wildner             while (*PFieldList)
753820c5b08SSascha Wildner             {
754820c5b08SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a,
7557bcb6cafSSascha Wildner                     &Subtable);
756820c5b08SSascha Wildner                 if (ACPI_FAILURE (Status))
757820c5b08SSascha Wildner                 {
758820c5b08SSascha Wildner                     return (Status);
759820c5b08SSascha Wildner                 }
760820c5b08SSascha Wildner 
761820c5b08SSascha Wildner                 if (!Subtable)
762820c5b08SSascha Wildner                 {
763820c5b08SSascha Wildner                     DtPopSubtable ();
764820c5b08SSascha Wildner                     break;
765820c5b08SSascha Wildner                 }
766820c5b08SSascha Wildner 
767820c5b08SSascha Wildner                 ParentTable = DtPeekSubtable ();
768820c5b08SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
769820c5b08SSascha Wildner                 Count++;
770820c5b08SSascha Wildner             }
771820c5b08SSascha Wildner 
772820c5b08SSascha Wildner             Hint->HintCount = (UINT16) Count;
773820c5b08SSascha Wildner             break;
774820c5b08SSascha Wildner 
775820c5b08SSascha Wildner         default:
776820c5b08SSascha Wildner             break;
777820c5b08SSascha Wildner         }
778820c5b08SSascha Wildner     }
779820c5b08SSascha Wildner 
780820c5b08SSascha Wildner     return (AE_OK);
781820c5b08SSascha Wildner }
782820c5b08SSascha Wildner 
783820c5b08SSascha Wildner 
784820c5b08SSascha Wildner /******************************************************************************
785820c5b08SSascha Wildner  *
786*aab122a6SSascha Wildner  * FUNCTION:    DtCompileNhlt
787*aab122a6SSascha Wildner  *
788*aab122a6SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
789*aab122a6SSascha Wildner  *
790*aab122a6SSascha Wildner  * RETURN:      Status
791*aab122a6SSascha Wildner  *
792*aab122a6SSascha Wildner  * DESCRIPTION: Compile NHLT.
793*aab122a6SSascha Wildner  *
794*aab122a6SSascha Wildner  *****************************************************************************/
795*aab122a6SSascha Wildner 
796*aab122a6SSascha Wildner ACPI_STATUS
DtCompileNhlt(void ** List)797*aab122a6SSascha Wildner DtCompileNhlt (
798*aab122a6SSascha Wildner     void                    **List)
799*aab122a6SSascha Wildner {
800*aab122a6SSascha Wildner     ACPI_STATUS             Status;
801*aab122a6SSascha Wildner     UINT32                  EndpointCount;
802*aab122a6SSascha Wildner     UINT32                  MicrophoneCount;
803*aab122a6SSascha Wildner     UINT32                  FormatsCount;
804*aab122a6SSascha Wildner     DT_SUBTABLE             *Subtable;
805*aab122a6SSascha Wildner     DT_SUBTABLE             *ParentTable;
806*aab122a6SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
807*aab122a6SSascha Wildner     UINT32                  CapabilitiesSize;
808*aab122a6SSascha Wildner     UINT8                   ArrayType;
809*aab122a6SSascha Wildner     UINT8                   ConfigType;
810*aab122a6SSascha Wildner     UINT8                   LinuxSpecificCount;
811*aab122a6SSascha Wildner     UINT32                  i;
812*aab122a6SSascha Wildner     UINT32                  j;
813*aab122a6SSascha Wildner     ACPI_TABLE_NHLT_ENDPOINT_COUNT      *MainTable;
814*aab122a6SSascha Wildner     ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A  *DevSpecific;
815*aab122a6SSascha Wildner     ACPI_NHLT_VENDOR_MIC_COUNT          *MicCount;
816*aab122a6SSascha Wildner     ACPI_NHLT_FORMATS_CONFIG            *FormatsConfig;
817*aab122a6SSascha Wildner     ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D  *ConfigSpecific;
818*aab122a6SSascha Wildner     ACPI_NHLT_LINUX_SPECIFIC_COUNT      *LinuxSpecific;
819*aab122a6SSascha Wildner 
820*aab122a6SSascha Wildner 
821*aab122a6SSascha Wildner     /* Main table */
822*aab122a6SSascha Wildner 
823*aab122a6SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt,
824*aab122a6SSascha Wildner         &Subtable);
825*aab122a6SSascha Wildner     if (ACPI_FAILURE (Status))
826*aab122a6SSascha Wildner     {
827*aab122a6SSascha Wildner         return (Status);
828*aab122a6SSascha Wildner     }
829*aab122a6SSascha Wildner 
830*aab122a6SSascha Wildner     /* Get the Endpoint Descriptor count */
831*aab122a6SSascha Wildner 
832*aab122a6SSascha Wildner     ParentTable = DtPeekSubtable ();
833*aab122a6SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
834*aab122a6SSascha Wildner     DtPushSubtable (Subtable);
835*aab122a6SSascha Wildner 
836*aab122a6SSascha Wildner     MainTable = ACPI_CAST_PTR (ACPI_TABLE_NHLT_ENDPOINT_COUNT, Subtable->Buffer);
837*aab122a6SSascha Wildner     EndpointCount = MainTable->EndpointCount;
838*aab122a6SSascha Wildner 
839*aab122a6SSascha Wildner     /* Subtables */
840*aab122a6SSascha Wildner 
841*aab122a6SSascha Wildner     while (*PFieldList)
842*aab122a6SSascha Wildner     {
843*aab122a6SSascha Wildner         /* Variable number of Endpoint descriptors */
844*aab122a6SSascha Wildner 
845*aab122a6SSascha Wildner         for (i = 0; i < EndpointCount; i++)
846*aab122a6SSascha Wildner         {
847*aab122a6SSascha Wildner             /* Do the Endpoint Descriptor */
848*aab122a6SSascha Wildner 
849*aab122a6SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt0,
850*aab122a6SSascha Wildner                 &Subtable);
851*aab122a6SSascha Wildner             if (ACPI_FAILURE (Status))
852*aab122a6SSascha Wildner             {
853*aab122a6SSascha Wildner                 return (Status);
854*aab122a6SSascha Wildner             }
855*aab122a6SSascha Wildner 
856*aab122a6SSascha Wildner             ParentTable = DtPeekSubtable ();
857*aab122a6SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
858*aab122a6SSascha Wildner             DtPushSubtable (Subtable);
859*aab122a6SSascha Wildner 
860*aab122a6SSascha Wildner             /* Do the Device Specific table */
861*aab122a6SSascha Wildner 
862*aab122a6SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5b,
863*aab122a6SSascha Wildner                 &Subtable);
864*aab122a6SSascha Wildner             if (ACPI_FAILURE (Status))
865*aab122a6SSascha Wildner             {
866*aab122a6SSascha Wildner                 return (Status);
867*aab122a6SSascha Wildner             }
868*aab122a6SSascha Wildner 
869*aab122a6SSascha Wildner             ParentTable = DtPeekSubtable ();
870*aab122a6SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
871*aab122a6SSascha Wildner             DtPushSubtable (Subtable);
872*aab122a6SSascha Wildner 
873*aab122a6SSascha Wildner             DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable->Buffer);
874*aab122a6SSascha Wildner             CapabilitiesSize = DevSpecific->CapabilitiesSize;
875*aab122a6SSascha Wildner 
876*aab122a6SSascha Wildner             ArrayType = 0;
877*aab122a6SSascha Wildner             ConfigType = 0;
878*aab122a6SSascha Wildner 
879*aab122a6SSascha Wildner             switch (CapabilitiesSize)
880*aab122a6SSascha Wildner             {
881*aab122a6SSascha Wildner             case 0:
882*aab122a6SSascha Wildner                 break;
883*aab122a6SSascha Wildner 
884*aab122a6SSascha Wildner             case 1:
885*aab122a6SSascha Wildner 
886*aab122a6SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5c,
887*aab122a6SSascha Wildner                     &Subtable);
888*aab122a6SSascha Wildner                 if (ACPI_FAILURE (Status))
889*aab122a6SSascha Wildner                 {
890*aab122a6SSascha Wildner                     return (Status);
891*aab122a6SSascha Wildner                 }
892*aab122a6SSascha Wildner 
893*aab122a6SSascha Wildner                 ParentTable = DtPeekSubtable ();
894*aab122a6SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
895*aab122a6SSascha Wildner                 break;
896*aab122a6SSascha Wildner 
897*aab122a6SSascha Wildner             case 2:
898*aab122a6SSascha Wildner 
899*aab122a6SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5,
900*aab122a6SSascha Wildner                     &Subtable);
901*aab122a6SSascha Wildner                 if (ACPI_FAILURE (Status))
902*aab122a6SSascha Wildner                 {
903*aab122a6SSascha Wildner                     return (Status);
904*aab122a6SSascha Wildner                 }
905*aab122a6SSascha Wildner 
906*aab122a6SSascha Wildner                 ParentTable = DtPeekSubtable ();
907*aab122a6SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
908*aab122a6SSascha Wildner                 break;
909*aab122a6SSascha Wildner 
910*aab122a6SSascha Wildner             case 3:
911*aab122a6SSascha Wildner 
912*aab122a6SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5a,
913*aab122a6SSascha Wildner                     &Subtable);
914*aab122a6SSascha Wildner                 if (ACPI_FAILURE (Status))
915*aab122a6SSascha Wildner                 {
916*aab122a6SSascha Wildner                     return (Status);
917*aab122a6SSascha Wildner                 }
918*aab122a6SSascha Wildner 
919*aab122a6SSascha Wildner                 ParentTable = DtPeekSubtable ();
920*aab122a6SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
921*aab122a6SSascha Wildner 
922*aab122a6SSascha Wildner                 ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer);
923*aab122a6SSascha Wildner                 ArrayType = ConfigSpecific->ArrayType;
924*aab122a6SSascha Wildner                 ConfigType = ConfigSpecific->ConfigType;
925*aab122a6SSascha Wildner                 break;
926*aab122a6SSascha Wildner 
927*aab122a6SSascha Wildner             case 7:
928*aab122a6SSascha Wildner 
929*aab122a6SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5,
930*aab122a6SSascha Wildner                     &Subtable);
931*aab122a6SSascha Wildner                 if (ACPI_FAILURE (Status))
932*aab122a6SSascha Wildner                 {
933*aab122a6SSascha Wildner                     return (Status);
934*aab122a6SSascha Wildner                 }
935*aab122a6SSascha Wildner 
936*aab122a6SSascha Wildner                 ParentTable = DtPeekSubtable ();
937*aab122a6SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
938*aab122a6SSascha Wildner 
939*aab122a6SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6b,
940*aab122a6SSascha Wildner                     &Subtable);
941*aab122a6SSascha Wildner                 if (ACPI_FAILURE (Status))
942*aab122a6SSascha Wildner                 {
943*aab122a6SSascha Wildner                     return (Status);
944*aab122a6SSascha Wildner                 }
945*aab122a6SSascha Wildner 
946*aab122a6SSascha Wildner                 ParentTable = DtPeekSubtable ();
947*aab122a6SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
948*aab122a6SSascha Wildner 
949*aab122a6SSascha Wildner                 ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer);
950*aab122a6SSascha Wildner                 ArrayType = ConfigSpecific->ArrayType;
951*aab122a6SSascha Wildner                 ConfigType = ConfigSpecific->ConfigType;
952*aab122a6SSascha Wildner                 break;
953*aab122a6SSascha Wildner 
954*aab122a6SSascha Wildner             default:
955*aab122a6SSascha Wildner 
956*aab122a6SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5a,
957*aab122a6SSascha Wildner                     &Subtable);
958*aab122a6SSascha Wildner                 if (ACPI_FAILURE (Status))
959*aab122a6SSascha Wildner                 {
960*aab122a6SSascha Wildner                     return (Status);
961*aab122a6SSascha Wildner                 }
962*aab122a6SSascha Wildner 
963*aab122a6SSascha Wildner                 ParentTable = DtPeekSubtable ();
964*aab122a6SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
965*aab122a6SSascha Wildner 
966*aab122a6SSascha Wildner                 ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer);
967*aab122a6SSascha Wildner                 ArrayType = ConfigSpecific->ArrayType;
968*aab122a6SSascha Wildner                 ConfigType = ConfigSpecific->ConfigType;
969*aab122a6SSascha Wildner                 break;
970*aab122a6SSascha Wildner 
971*aab122a6SSascha Wildner             } /* switch (CapabilitiesSize) */
972*aab122a6SSascha Wildner 
973*aab122a6SSascha Wildner             if (CapabilitiesSize >= 3)
974*aab122a6SSascha Wildner             {
975*aab122a6SSascha Wildner                 /* Check for a vendor-defined mic array */
976*aab122a6SSascha Wildner 
977*aab122a6SSascha Wildner                 if (ConfigType == ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY)
978*aab122a6SSascha Wildner                 {
979*aab122a6SSascha Wildner                     if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_MASK) == ACPI_NHLT_VENDOR_DEFINED)
980*aab122a6SSascha Wildner                     {
981*aab122a6SSascha Wildner                         /* Get the microphone count */
982*aab122a6SSascha Wildner 
983*aab122a6SSascha Wildner                         Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6a,
984*aab122a6SSascha Wildner                             &Subtable);
985*aab122a6SSascha Wildner                         if (ACPI_FAILURE (Status))
986*aab122a6SSascha Wildner                         {
987*aab122a6SSascha Wildner                             return (Status);
988*aab122a6SSascha Wildner                         }
989*aab122a6SSascha Wildner 
990*aab122a6SSascha Wildner                         MicCount = ACPI_CAST_PTR (ACPI_NHLT_VENDOR_MIC_COUNT, Subtable->Buffer);
991*aab122a6SSascha Wildner                         MicrophoneCount = MicCount->MicrophoneCount;
992*aab122a6SSascha Wildner 
993*aab122a6SSascha Wildner                         ParentTable = DtPeekSubtable ();
994*aab122a6SSascha Wildner                         DtInsertSubtable (ParentTable, Subtable);
995*aab122a6SSascha Wildner 
996*aab122a6SSascha Wildner                         /* Variable number of microphones */
997*aab122a6SSascha Wildner 
998*aab122a6SSascha Wildner                         for (j = 0; j < MicrophoneCount; j++)
999*aab122a6SSascha Wildner                         {
1000*aab122a6SSascha Wildner                             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6,
1001*aab122a6SSascha Wildner                                 &Subtable);
1002*aab122a6SSascha Wildner                             if (ACPI_FAILURE (Status))
1003*aab122a6SSascha Wildner                             {
1004*aab122a6SSascha Wildner                                 return (Status);
1005*aab122a6SSascha Wildner                             }
1006*aab122a6SSascha Wildner 
1007*aab122a6SSascha Wildner                             ParentTable = DtPeekSubtable ();
1008*aab122a6SSascha Wildner                             DtInsertSubtable (ParentTable, Subtable);
1009*aab122a6SSascha Wildner                         }
1010*aab122a6SSascha Wildner 
1011*aab122a6SSascha Wildner                         /* Do the MIC_SNR_SENSITIVITY_EXTENSION, if present */
1012*aab122a6SSascha Wildner 
1013*aab122a6SSascha Wildner                         if (ArrayType & ACPI_NHLT_ARRAY_TYPE_EXT_MASK)
1014*aab122a6SSascha Wildner                         {
1015*aab122a6SSascha Wildner                             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt9,
1016*aab122a6SSascha Wildner                                 &Subtable);
1017*aab122a6SSascha Wildner                             if (ACPI_FAILURE (Status))
1018*aab122a6SSascha Wildner                             {
1019*aab122a6SSascha Wildner                                 return (Status);
1020*aab122a6SSascha Wildner                             }
1021*aab122a6SSascha Wildner 
1022*aab122a6SSascha Wildner                             ParentTable = DtPeekSubtable ();
1023*aab122a6SSascha Wildner                             DtInsertSubtable (ParentTable, Subtable);
1024*aab122a6SSascha Wildner                         }
1025*aab122a6SSascha Wildner                     }
1026*aab122a6SSascha Wildner                 }
1027*aab122a6SSascha Wildner             }
1028*aab122a6SSascha Wildner 
1029*aab122a6SSascha Wildner             /* Get the formats count */
1030*aab122a6SSascha Wildner 
1031*aab122a6SSascha Wildner             DtPopSubtable ();
1032*aab122a6SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt4,
1033*aab122a6SSascha Wildner                 &Subtable);
1034*aab122a6SSascha Wildner             if (ACPI_FAILURE (Status))
1035*aab122a6SSascha Wildner             {
1036*aab122a6SSascha Wildner                 return (Status);
1037*aab122a6SSascha Wildner             }
1038*aab122a6SSascha Wildner 
1039*aab122a6SSascha Wildner             ParentTable = DtPeekSubtable ();
1040*aab122a6SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
1041*aab122a6SSascha Wildner 
1042*aab122a6SSascha Wildner             FormatsConfig = ACPI_CAST_PTR (ACPI_NHLT_FORMATS_CONFIG, Subtable->Buffer);
1043*aab122a6SSascha Wildner             FormatsCount = FormatsConfig->FormatsCount;
1044*aab122a6SSascha Wildner 
1045*aab122a6SSascha Wildner             /* Variable number of wave_format_extensible structs */
1046*aab122a6SSascha Wildner 
1047*aab122a6SSascha Wildner             for (j = 0; j < FormatsCount; j++)
1048*aab122a6SSascha Wildner             {
1049*aab122a6SSascha Wildner                 /* Do the main wave_format_extensible structure */
1050*aab122a6SSascha Wildner 
1051*aab122a6SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3,
1052*aab122a6SSascha Wildner                     &Subtable);
1053*aab122a6SSascha Wildner                 if (ACPI_FAILURE (Status))
1054*aab122a6SSascha Wildner                 {
1055*aab122a6SSascha Wildner                     return (Status);
1056*aab122a6SSascha Wildner                 }
1057*aab122a6SSascha Wildner 
1058*aab122a6SSascha Wildner                 ParentTable = DtPeekSubtable ();
1059*aab122a6SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
1060*aab122a6SSascha Wildner                 DtPushSubtable (Subtable);
1061*aab122a6SSascha Wildner 
1062*aab122a6SSascha Wildner                 /* Do the capabilities list */
1063*aab122a6SSascha Wildner 
1064*aab122a6SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3a,
1065*aab122a6SSascha Wildner                     &Subtable);
1066*aab122a6SSascha Wildner                 if (ACPI_FAILURE (Status))
1067*aab122a6SSascha Wildner                 {
1068*aab122a6SSascha Wildner                     return (Status);
1069*aab122a6SSascha Wildner                 }
1070*aab122a6SSascha Wildner 
1071*aab122a6SSascha Wildner                 DtPopSubtable ();
1072*aab122a6SSascha Wildner                 ParentTable = DtPeekSubtable ();
1073*aab122a6SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
1074*aab122a6SSascha Wildner 
1075*aab122a6SSascha Wildner             } /* for (j = 0; j < FormatsCount; j++) */
1076*aab122a6SSascha Wildner 
1077*aab122a6SSascha Wildner             /*
1078*aab122a6SSascha Wildner              * If we are not done with the current Endpoint yet, then there must be
1079*aab122a6SSascha Wildner              * some Linux-specific structure(s) yet to be processed. First, get
1080*aab122a6SSascha Wildner              * the count of such structure(s).
1081*aab122a6SSascha Wildner              */
1082*aab122a6SSascha Wildner             if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length")))
1083*aab122a6SSascha Wildner             {
1084*aab122a6SSascha Wildner                 /* Get the count of Linux-specific structures */
1085*aab122a6SSascha Wildner 
1086*aab122a6SSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7,
1087*aab122a6SSascha Wildner                     &Subtable);
1088*aab122a6SSascha Wildner                 if (ACPI_FAILURE (Status))
1089*aab122a6SSascha Wildner                 {
1090*aab122a6SSascha Wildner                     return (Status);
1091*aab122a6SSascha Wildner                 }
1092*aab122a6SSascha Wildner 
1093*aab122a6SSascha Wildner                 ParentTable = DtPeekSubtable ();
1094*aab122a6SSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
1095*aab122a6SSascha Wildner 
1096*aab122a6SSascha Wildner                 LinuxSpecific = ACPI_CAST_PTR (ACPI_NHLT_LINUX_SPECIFIC_COUNT, Subtable->Buffer);
1097*aab122a6SSascha Wildner                 LinuxSpecificCount = LinuxSpecific->StructureCount;
1098*aab122a6SSascha Wildner 
1099*aab122a6SSascha Wildner                 for (j = 0; j < LinuxSpecificCount; j++)
1100*aab122a6SSascha Wildner                 {
1101*aab122a6SSascha Wildner                     /*
1102*aab122a6SSascha Wildner                      * Compile the following Linux-specific fields:
1103*aab122a6SSascha Wildner                      *  1) Device ID
1104*aab122a6SSascha Wildner                      *  2) Device Instance ID
1105*aab122a6SSascha Wildner                      *  3) Device Port ID
1106*aab122a6SSascha Wildner                      */
1107*aab122a6SSascha Wildner                     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7a,
1108*aab122a6SSascha Wildner                         &Subtable);
1109*aab122a6SSascha Wildner                     if (ACPI_FAILURE (Status))
1110*aab122a6SSascha Wildner                     {
1111*aab122a6SSascha Wildner                         return (Status);
1112*aab122a6SSascha Wildner                     }
1113*aab122a6SSascha Wildner 
1114*aab122a6SSascha Wildner                     ParentTable = DtPeekSubtable ();
1115*aab122a6SSascha Wildner                     DtInsertSubtable (ParentTable, Subtable);
1116*aab122a6SSascha Wildner 
1117*aab122a6SSascha Wildner                     /*
1118*aab122a6SSascha Wildner                      * To have a valid Linux-specific "Specific Data" at this
1119*aab122a6SSascha Wildner                      * point, we need:
1120*aab122a6SSascha Wildner                      * 1) The next field must be named "Specific Data"
1121*aab122a6SSascha Wildner                      */
1122*aab122a6SSascha Wildner                     if (!strcmp ((const char *) (*PFieldList)->Name, "Specific Data"))
1123*aab122a6SSascha Wildner                     {
1124*aab122a6SSascha Wildner                         /* Compile the "Specific Data" field */
1125*aab122a6SSascha Wildner 
1126*aab122a6SSascha Wildner                         Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7b,
1127*aab122a6SSascha Wildner                             &Subtable);
1128*aab122a6SSascha Wildner                         if (ACPI_FAILURE (Status))
1129*aab122a6SSascha Wildner                         {
1130*aab122a6SSascha Wildner                             return (Status);
1131*aab122a6SSascha Wildner                         }
1132*aab122a6SSascha Wildner 
1133*aab122a6SSascha Wildner                         ParentTable = DtPeekSubtable ();
1134*aab122a6SSascha Wildner                         DtInsertSubtable (ParentTable, Subtable);
1135*aab122a6SSascha Wildner                     }
1136*aab122a6SSascha Wildner 
1137*aab122a6SSascha Wildner                 } /* for (j = 0; j < LinuxSpecificCount; j++) */
1138*aab122a6SSascha Wildner             }
1139*aab122a6SSascha Wildner 
1140*aab122a6SSascha Wildner             DtPopSubtable ();
1141*aab122a6SSascha Wildner 
1142*aab122a6SSascha Wildner         } /* for (i = 0; i < EndpointCount; i++) */
1143*aab122a6SSascha Wildner 
1144*aab122a6SSascha Wildner         /*
1145*aab122a6SSascha Wildner          * All Endpoint Descriptors are completed.
1146*aab122a6SSascha Wildner          * Do the table terminator structure (not in NHLT spec, optional)
1147*aab122a6SSascha Wildner          */
1148*aab122a6SSascha Wildner         if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length")))
1149*aab122a6SSascha Wildner         {
1150*aab122a6SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt8,
1151*aab122a6SSascha Wildner                 &Subtable);
1152*aab122a6SSascha Wildner             if (ACPI_FAILURE (Status))
1153*aab122a6SSascha Wildner             {
1154*aab122a6SSascha Wildner                 return (Status);
1155*aab122a6SSascha Wildner             }
1156*aab122a6SSascha Wildner 
1157*aab122a6SSascha Wildner             ParentTable = DtPeekSubtable ();
1158*aab122a6SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
1159*aab122a6SSascha Wildner         }
1160*aab122a6SSascha Wildner 
1161*aab122a6SSascha Wildner         return (AE_OK);
1162*aab122a6SSascha Wildner     }
1163*aab122a6SSascha Wildner 
1164*aab122a6SSascha Wildner     return (AE_OK);
1165*aab122a6SSascha Wildner }
1166*aab122a6SSascha Wildner 
1167*aab122a6SSascha Wildner 
1168*aab122a6SSascha Wildner /******************************************************************************
1169*aab122a6SSascha Wildner  *
1170820c5b08SSascha Wildner  * FUNCTION:    DtCompilePcct
1171820c5b08SSascha Wildner  *
1172820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
1173820c5b08SSascha Wildner  *
1174820c5b08SSascha Wildner  * RETURN:      Status
1175820c5b08SSascha Wildner  *
1176820c5b08SSascha Wildner  * DESCRIPTION: Compile PCCT.
1177820c5b08SSascha Wildner  *
1178820c5b08SSascha Wildner  *****************************************************************************/
1179820c5b08SSascha Wildner 
1180820c5b08SSascha Wildner ACPI_STATUS
DtCompilePcct(void ** List)1181820c5b08SSascha Wildner DtCompilePcct (
1182820c5b08SSascha Wildner     void                    **List)
1183820c5b08SSascha Wildner {
1184820c5b08SSascha Wildner     ACPI_STATUS             Status;
1185820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
1186820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
1187820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1188820c5b08SSascha Wildner     DT_FIELD                *SubtableStart;
1189820c5b08SSascha Wildner     ACPI_SUBTABLE_HEADER    *PcctHeader;
1190820c5b08SSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable;
1191820c5b08SSascha Wildner 
1192820c5b08SSascha Wildner 
1193820c5b08SSascha Wildner     /* Main table */
1194820c5b08SSascha Wildner 
1195820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
11967bcb6cafSSascha Wildner         &Subtable);
1197820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
1198820c5b08SSascha Wildner     {
1199820c5b08SSascha Wildner         return (Status);
1200820c5b08SSascha Wildner     }
1201820c5b08SSascha Wildner 
1202820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
1203820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
1204820c5b08SSascha Wildner 
1205820c5b08SSascha Wildner     /* Subtables */
1206820c5b08SSascha Wildner 
1207820c5b08SSascha Wildner     while (*PFieldList)
1208820c5b08SSascha Wildner     {
1209820c5b08SSascha Wildner         SubtableStart = *PFieldList;
1210820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
12117bcb6cafSSascha Wildner             &Subtable);
1212820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
1213820c5b08SSascha Wildner         {
1214820c5b08SSascha Wildner             return (Status);
1215820c5b08SSascha Wildner         }
1216820c5b08SSascha Wildner 
1217820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
1218820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1219820c5b08SSascha Wildner         DtPushSubtable (Subtable);
1220820c5b08SSascha Wildner 
1221820c5b08SSascha Wildner         PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1222820c5b08SSascha Wildner 
1223820c5b08SSascha Wildner         switch (PcctHeader->Type)
1224820c5b08SSascha Wildner         {
1225820c5b08SSascha Wildner         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
1226820c5b08SSascha Wildner 
1227820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoPcct0;
1228820c5b08SSascha Wildner             break;
1229820c5b08SSascha Wildner 
1230820c5b08SSascha Wildner         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
1231820c5b08SSascha Wildner 
1232820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoPcct1;
1233820c5b08SSascha Wildner             break;
1234820c5b08SSascha Wildner 
12350d27ae55SSascha Wildner         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
12360d27ae55SSascha Wildner 
12370d27ae55SSascha Wildner             InfoTable = AcpiDmTableInfoPcct2;
12380d27ae55SSascha Wildner             break;
12390d27ae55SSascha Wildner 
12401093ca81SSascha Wildner         case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
12411093ca81SSascha Wildner 
12421093ca81SSascha Wildner             InfoTable = AcpiDmTableInfoPcct3;
12431093ca81SSascha Wildner             break;
12441093ca81SSascha Wildner 
12451093ca81SSascha Wildner         case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
12461093ca81SSascha Wildner 
12471093ca81SSascha Wildner             InfoTable = AcpiDmTableInfoPcct4;
12481093ca81SSascha Wildner             break;
12491093ca81SSascha Wildner 
125001d5d5dfSSascha Wildner         case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
125101d5d5dfSSascha Wildner 
125201d5d5dfSSascha Wildner             InfoTable = AcpiDmTableInfoPcct5;
125301d5d5dfSSascha Wildner             break;
125401d5d5dfSSascha Wildner 
1255820c5b08SSascha Wildner         default:
1256820c5b08SSascha Wildner 
1257820c5b08SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
1258820c5b08SSascha Wildner             return (AE_ERROR);
1259820c5b08SSascha Wildner         }
1260820c5b08SSascha Wildner 
12617bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
1262820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
1263820c5b08SSascha Wildner         {
1264820c5b08SSascha Wildner             return (Status);
1265820c5b08SSascha Wildner         }
1266820c5b08SSascha Wildner 
1267820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
1268820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1269820c5b08SSascha Wildner         DtPopSubtable ();
1270820c5b08SSascha Wildner     }
1271820c5b08SSascha Wildner 
1272820c5b08SSascha Wildner     return (AE_OK);
1273820c5b08SSascha Wildner }
1274820c5b08SSascha Wildner 
1275820c5b08SSascha Wildner 
1276820c5b08SSascha Wildner /******************************************************************************
1277820c5b08SSascha Wildner  *
12787bcb6cafSSascha Wildner  * FUNCTION:    DtCompilePdtt
12797bcb6cafSSascha Wildner  *
12807bcb6cafSSascha Wildner  * PARAMETERS:  List                - Current field list pointer
12817bcb6cafSSascha Wildner  *
12827bcb6cafSSascha Wildner  * RETURN:      Status
12837bcb6cafSSascha Wildner  *
12847bcb6cafSSascha Wildner  * DESCRIPTION: Compile PDTT.
12857bcb6cafSSascha Wildner  *
12867bcb6cafSSascha Wildner  *****************************************************************************/
12877bcb6cafSSascha Wildner 
12887bcb6cafSSascha Wildner ACPI_STATUS
DtCompilePdtt(void ** List)12897bcb6cafSSascha Wildner DtCompilePdtt (
12907bcb6cafSSascha Wildner     void                    **List)
12917bcb6cafSSascha Wildner {
12927bcb6cafSSascha Wildner     ACPI_STATUS             Status;
12937bcb6cafSSascha Wildner     DT_SUBTABLE             *Subtable;
12947bcb6cafSSascha Wildner     DT_SUBTABLE             *ParentTable;
12957bcb6cafSSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
12967bcb6cafSSascha Wildner     ACPI_TABLE_PDTT         *PdttHeader;
12977bcb6cafSSascha Wildner     UINT32                  Count = 0;
12987bcb6cafSSascha Wildner 
12997bcb6cafSSascha Wildner 
13007bcb6cafSSascha Wildner     /* Main table */
13017bcb6cafSSascha Wildner 
13027bcb6cafSSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt, &Subtable);
13037bcb6cafSSascha Wildner     if (ACPI_FAILURE (Status))
13047bcb6cafSSascha Wildner     {
13057bcb6cafSSascha Wildner         return (Status);
13067bcb6cafSSascha Wildner     }
13077bcb6cafSSascha Wildner 
13087bcb6cafSSascha Wildner     ParentTable = DtPeekSubtable ();
13097bcb6cafSSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
13107bcb6cafSSascha Wildner 
13117bcb6cafSSascha Wildner     PdttHeader = ACPI_CAST_PTR (ACPI_TABLE_PDTT, ParentTable->Buffer);
13127bcb6cafSSascha Wildner     PdttHeader->ArrayOffset = sizeof (ACPI_TABLE_PDTT);
13137bcb6cafSSascha Wildner 
13147bcb6cafSSascha Wildner     /* There is only one type of subtable at this time, no need to decode */
13157bcb6cafSSascha Wildner 
13167bcb6cafSSascha Wildner     while (*PFieldList)
13177bcb6cafSSascha Wildner     {
13187bcb6cafSSascha Wildner         /* List of subchannel IDs, each 2 bytes */
13197bcb6cafSSascha Wildner 
13207bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt0,
13217bcb6cafSSascha Wildner             &Subtable);
13227bcb6cafSSascha Wildner         if (ACPI_FAILURE (Status))
13237bcb6cafSSascha Wildner         {
13247bcb6cafSSascha Wildner             return (Status);
13257bcb6cafSSascha Wildner         }
13267bcb6cafSSascha Wildner 
13277bcb6cafSSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
13287bcb6cafSSascha Wildner         Count++;
13297bcb6cafSSascha Wildner     }
13307bcb6cafSSascha Wildner 
13317bcb6cafSSascha Wildner     PdttHeader->TriggerCount = (UINT8) Count;
13327bcb6cafSSascha Wildner     return (AE_OK);
13337bcb6cafSSascha Wildner }
13347bcb6cafSSascha Wildner 
13357bcb6cafSSascha Wildner 
13367bcb6cafSSascha Wildner /******************************************************************************
13377bcb6cafSSascha Wildner  *
133801d5d5dfSSascha Wildner  * FUNCTION:    DtCompilePhat
133901d5d5dfSSascha Wildner  *
134001d5d5dfSSascha Wildner  * PARAMETERS:  List                - Current field list pointer
134101d5d5dfSSascha Wildner  *
134201d5d5dfSSascha Wildner  * RETURN:      Status
134301d5d5dfSSascha Wildner  *
134401d5d5dfSSascha Wildner  * DESCRIPTION: Compile Phat.
134501d5d5dfSSascha Wildner  *
134601d5d5dfSSascha Wildner  *****************************************************************************/
134701d5d5dfSSascha Wildner 
134801d5d5dfSSascha Wildner ACPI_STATUS
DtCompilePhat(void ** List)134901d5d5dfSSascha Wildner DtCompilePhat (
135001d5d5dfSSascha Wildner     void                    **List)
135101d5d5dfSSascha Wildner {
135201d5d5dfSSascha Wildner     ACPI_STATUS             Status = AE_OK;
135301d5d5dfSSascha Wildner     DT_SUBTABLE             *Subtable;
135401d5d5dfSSascha Wildner     DT_SUBTABLE             *ParentTable;
135501d5d5dfSSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
135601d5d5dfSSascha Wildner     ACPI_PHAT_HEADER        *PhatHeader;
135701d5d5dfSSascha Wildner     ACPI_DMTABLE_INFO       *Info;
135801d5d5dfSSascha Wildner     ACPI_PHAT_VERSION_DATA  *VersionData;
135901d5d5dfSSascha Wildner     UINT32                  RecordCount;
136001d5d5dfSSascha Wildner 
136101d5d5dfSSascha Wildner 
136201d5d5dfSSascha Wildner     /* The table consist of subtables */
136301d5d5dfSSascha Wildner 
136401d5d5dfSSascha Wildner     while (*PFieldList)
136501d5d5dfSSascha Wildner     {
136601d5d5dfSSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable);
136701d5d5dfSSascha Wildner         if (ACPI_FAILURE (Status))
136801d5d5dfSSascha Wildner         {
136901d5d5dfSSascha Wildner             return (Status);
137001d5d5dfSSascha Wildner         }
137101d5d5dfSSascha Wildner 
137201d5d5dfSSascha Wildner         ParentTable = DtPeekSubtable ();
137301d5d5dfSSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
137401d5d5dfSSascha Wildner         DtPushSubtable (Subtable);
137501d5d5dfSSascha Wildner 
137601d5d5dfSSascha Wildner         PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer);
137701d5d5dfSSascha Wildner 
137801d5d5dfSSascha Wildner         switch (PhatHeader->Type)
137901d5d5dfSSascha Wildner         {
138001d5d5dfSSascha Wildner         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
138101d5d5dfSSascha Wildner 
138201d5d5dfSSascha Wildner             Info = AcpiDmTableInfoPhat0;
138301d5d5dfSSascha Wildner             PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA);
138401d5d5dfSSascha Wildner             break;
138501d5d5dfSSascha Wildner 
138601d5d5dfSSascha Wildner         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
138701d5d5dfSSascha Wildner 
138801d5d5dfSSascha Wildner             Info = AcpiDmTableInfoPhat1;
138901d5d5dfSSascha Wildner             PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA);
139001d5d5dfSSascha Wildner             break;
139101d5d5dfSSascha Wildner 
139201d5d5dfSSascha Wildner         default:
139301d5d5dfSSascha Wildner 
139401d5d5dfSSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
139501d5d5dfSSascha Wildner             return (AE_ERROR);
139601d5d5dfSSascha Wildner 
139701d5d5dfSSascha Wildner             break;
139801d5d5dfSSascha Wildner         }
139901d5d5dfSSascha Wildner 
140001d5d5dfSSascha Wildner         Status = DtCompileTable (PFieldList, Info, &Subtable);
140101d5d5dfSSascha Wildner         if (ACPI_FAILURE (Status))
140201d5d5dfSSascha Wildner         {
140301d5d5dfSSascha Wildner             return (Status);
140401d5d5dfSSascha Wildner         }
140501d5d5dfSSascha Wildner 
140601d5d5dfSSascha Wildner         ParentTable = DtPeekSubtable ();
140701d5d5dfSSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
140801d5d5dfSSascha Wildner 
140901d5d5dfSSascha Wildner         switch (PhatHeader->Type)
141001d5d5dfSSascha Wildner         {
141101d5d5dfSSascha Wildner         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
141201d5d5dfSSascha Wildner 
141301d5d5dfSSascha Wildner             VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA,
141401d5d5dfSSascha Wildner                 (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER)));
141501d5d5dfSSascha Wildner             RecordCount = VersionData->ElementCount;
141601d5d5dfSSascha Wildner 
141701d5d5dfSSascha Wildner             while (RecordCount)
141801d5d5dfSSascha Wildner             {
141901d5d5dfSSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a,
142001d5d5dfSSascha Wildner                     &Subtable);
142101d5d5dfSSascha Wildner                 if (ACPI_FAILURE (Status))
142201d5d5dfSSascha Wildner                 {
142301d5d5dfSSascha Wildner                     return (Status);
142401d5d5dfSSascha Wildner                 }
142501d5d5dfSSascha Wildner                 ParentTable = DtPeekSubtable ();
142601d5d5dfSSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
142701d5d5dfSSascha Wildner 
142801d5d5dfSSascha Wildner                 RecordCount--;
142901d5d5dfSSascha Wildner                 PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT);
143001d5d5dfSSascha Wildner             }
143101d5d5dfSSascha Wildner             break;
143201d5d5dfSSascha Wildner 
143301d5d5dfSSascha Wildner         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
143401d5d5dfSSascha Wildner 
143501d5d5dfSSascha Wildner             /* Compile device path */
143601d5d5dfSSascha Wildner 
143701d5d5dfSSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable);
143801d5d5dfSSascha Wildner             if (ACPI_FAILURE (Status))
143901d5d5dfSSascha Wildner             {
144001d5d5dfSSascha Wildner                 return (Status);
144101d5d5dfSSascha Wildner             }
144201d5d5dfSSascha Wildner             ParentTable = DtPeekSubtable ();
144301d5d5dfSSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
144401d5d5dfSSascha Wildner 
144501d5d5dfSSascha Wildner             PhatHeader->Length += (UINT16) Subtable->Length;
144601d5d5dfSSascha Wildner 
144701d5d5dfSSascha Wildner             /* Compile vendor specific data */
144801d5d5dfSSascha Wildner 
144901d5d5dfSSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable);
145001d5d5dfSSascha Wildner             if (ACPI_FAILURE (Status))
145101d5d5dfSSascha Wildner             {
145201d5d5dfSSascha Wildner                 return (Status);
145301d5d5dfSSascha Wildner             }
145401d5d5dfSSascha Wildner             ParentTable = DtPeekSubtable ();
145501d5d5dfSSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
145601d5d5dfSSascha Wildner 
145701d5d5dfSSascha Wildner             PhatHeader->Length += (UINT16) Subtable->Length;
145801d5d5dfSSascha Wildner 
145901d5d5dfSSascha Wildner             break;
146001d5d5dfSSascha Wildner 
146101d5d5dfSSascha Wildner         default:
146201d5d5dfSSascha Wildner 
146301d5d5dfSSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
146401d5d5dfSSascha Wildner             return (AE_ERROR);
146501d5d5dfSSascha Wildner         }
146601d5d5dfSSascha Wildner     }
146701d5d5dfSSascha Wildner 
146801d5d5dfSSascha Wildner     return (Status);
146901d5d5dfSSascha Wildner }
147001d5d5dfSSascha Wildner 
147101d5d5dfSSascha Wildner 
147201d5d5dfSSascha Wildner /******************************************************************************
147301d5d5dfSSascha Wildner  *
1474820c5b08SSascha Wildner  * FUNCTION:    DtCompilePmtt
1475820c5b08SSascha Wildner  *
1476820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
1477820c5b08SSascha Wildner  *
1478820c5b08SSascha Wildner  * RETURN:      Status
1479820c5b08SSascha Wildner  *
1480820c5b08SSascha Wildner  * DESCRIPTION: Compile PMTT.
1481820c5b08SSascha Wildner  *
1482820c5b08SSascha Wildner  *****************************************************************************/
1483820c5b08SSascha Wildner 
1484820c5b08SSascha Wildner ACPI_STATUS
DtCompilePmtt(void ** List)1485820c5b08SSascha Wildner DtCompilePmtt (
1486820c5b08SSascha Wildner     void                    **List)
1487820c5b08SSascha Wildner {
1488820c5b08SSascha Wildner     ACPI_STATUS             Status;
1489820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
1490820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
1491820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1492820c5b08SSascha Wildner     DT_FIELD                *SubtableStart;
149301d5d5dfSSascha Wildner     UINT16                  Type;
1494820c5b08SSascha Wildner 
1495820c5b08SSascha Wildner 
1496820c5b08SSascha Wildner     /* Main table */
1497820c5b08SSascha Wildner 
14987bcb6cafSSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable);
1499820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
1500820c5b08SSascha Wildner     {
1501820c5b08SSascha Wildner         return (Status);
1502820c5b08SSascha Wildner     }
1503820c5b08SSascha Wildner 
1504820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
1505820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
1506820c5b08SSascha Wildner     DtPushSubtable (Subtable);
1507820c5b08SSascha Wildner 
150801d5d5dfSSascha Wildner     /* Subtables */
150901d5d5dfSSascha Wildner 
1510820c5b08SSascha Wildner     while (*PFieldList)
1511820c5b08SSascha Wildner     {
1512820c5b08SSascha Wildner         SubtableStart = *PFieldList;
151301d5d5dfSSascha Wildner         DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
1514820c5b08SSascha Wildner 
151501d5d5dfSSascha Wildner         switch (Type)
1516820c5b08SSascha Wildner         {
1517820c5b08SSascha Wildner         case ACPI_PMTT_TYPE_SOCKET:
1518820c5b08SSascha Wildner 
1519820c5b08SSascha Wildner             /* Subtable: Socket Structure */
1520820c5b08SSascha Wildner 
152101d5d5dfSSascha Wildner             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_SOCKET (0)\n");
152201d5d5dfSSascha Wildner 
1523820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
15247bcb6cafSSascha Wildner                 &Subtable);
1525820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
1526820c5b08SSascha Wildner             {
1527820c5b08SSascha Wildner                 return (Status);
1528820c5b08SSascha Wildner             }
1529820c5b08SSascha Wildner 
1530820c5b08SSascha Wildner             break;
1531820c5b08SSascha Wildner 
1532820c5b08SSascha Wildner         case ACPI_PMTT_TYPE_CONTROLLER:
1533820c5b08SSascha Wildner 
1534820c5b08SSascha Wildner             /* Subtable: Memory Controller Structure */
1535820c5b08SSascha Wildner 
153601d5d5dfSSascha Wildner             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_CONTROLLER (1)\n");
153701d5d5dfSSascha Wildner 
1538820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
15397bcb6cafSSascha Wildner                 &Subtable);
1540820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
1541820c5b08SSascha Wildner             {
1542820c5b08SSascha Wildner                 return (Status);
1543820c5b08SSascha Wildner             }
1544820c5b08SSascha Wildner 
1545820c5b08SSascha Wildner             break;
1546820c5b08SSascha Wildner 
1547820c5b08SSascha Wildner         case ACPI_PMTT_TYPE_DIMM:
1548820c5b08SSascha Wildner 
154901d5d5dfSSascha Wildner             /* Subtable: Physical Component (DIMM) Structure */
1550820c5b08SSascha Wildner 
155101d5d5dfSSascha Wildner             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_DIMM (2)\n");
1552820c5b08SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
15537bcb6cafSSascha Wildner                 &Subtable);
1554820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
1555820c5b08SSascha Wildner             {
1556820c5b08SSascha Wildner                 return (Status);
1557820c5b08SSascha Wildner             }
1558820c5b08SSascha Wildner 
155901d5d5dfSSascha Wildner             break;
156001d5d5dfSSascha Wildner 
156101d5d5dfSSascha Wildner         case ACPI_PMTT_TYPE_VENDOR:
156201d5d5dfSSascha Wildner 
156301d5d5dfSSascha Wildner             /* Subtable: Vendor-specific Structure */
156401d5d5dfSSascha Wildner 
156501d5d5dfSSascha Wildner             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_VENDOR(FF)\n");
156601d5d5dfSSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttVendor,
156701d5d5dfSSascha Wildner                 &Subtable);
156801d5d5dfSSascha Wildner             if (ACPI_FAILURE (Status))
156901d5d5dfSSascha Wildner             {
157001d5d5dfSSascha Wildner                 return (Status);
157101d5d5dfSSascha Wildner             }
157201d5d5dfSSascha Wildner 
1573820c5b08SSascha Wildner             break;
1574820c5b08SSascha Wildner 
1575820c5b08SSascha Wildner         default:
1576820c5b08SSascha Wildner 
1577820c5b08SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
1578820c5b08SSascha Wildner             return (AE_ERROR);
1579820c5b08SSascha Wildner         }
158001d5d5dfSSascha Wildner 
158101d5d5dfSSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1582820c5b08SSascha Wildner     }
1583820c5b08SSascha Wildner 
1584820c5b08SSascha Wildner     return (Status);
1585820c5b08SSascha Wildner }
1586820c5b08SSascha Wildner 
1587820c5b08SSascha Wildner 
1588820c5b08SSascha Wildner /******************************************************************************
1589820c5b08SSascha Wildner  *
15901093ca81SSascha Wildner  * FUNCTION:    DtCompilePptt
15911093ca81SSascha Wildner  *
15921093ca81SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
15931093ca81SSascha Wildner  *
15941093ca81SSascha Wildner  * RETURN:      Status
15951093ca81SSascha Wildner  *
15961093ca81SSascha Wildner  * DESCRIPTION: Compile PPTT.
15971093ca81SSascha Wildner  *
15981093ca81SSascha Wildner  *****************************************************************************/
15991093ca81SSascha Wildner 
16001093ca81SSascha Wildner ACPI_STATUS
DtCompilePptt(void ** List)16011093ca81SSascha Wildner DtCompilePptt (
16021093ca81SSascha Wildner     void                    **List)
16031093ca81SSascha Wildner {
16041093ca81SSascha Wildner     ACPI_STATUS             Status;
16051093ca81SSascha Wildner     ACPI_SUBTABLE_HEADER    *PpttHeader;
16061093ca81SSascha Wildner     ACPI_PPTT_PROCESSOR     *PpttProcessor = NULL;
16071093ca81SSascha Wildner     DT_SUBTABLE             *Subtable;
16081093ca81SSascha Wildner     DT_SUBTABLE             *ParentTable;
16091093ca81SSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable;
16101093ca81SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
16111093ca81SSascha Wildner     DT_FIELD                *SubtableStart;
161201d5d5dfSSascha Wildner     ACPI_TABLE_HEADER       *PpttAcpiHeader;
16131093ca81SSascha Wildner 
16141093ca81SSascha Wildner 
16151093ca81SSascha Wildner     ParentTable = DtPeekSubtable ();
16161093ca81SSascha Wildner     while (*PFieldList)
16171093ca81SSascha Wildner     {
16181093ca81SSascha Wildner         SubtableStart = *PFieldList;
16191093ca81SSascha Wildner 
16201093ca81SSascha Wildner         /* Compile PPTT subtable header */
16211093ca81SSascha Wildner 
16221093ca81SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPpttHdr,
16237bcb6cafSSascha Wildner             &Subtable);
16241093ca81SSascha Wildner         if (ACPI_FAILURE (Status))
16251093ca81SSascha Wildner         {
16261093ca81SSascha Wildner             return (Status);
16271093ca81SSascha Wildner         }
16281093ca81SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
16291093ca81SSascha Wildner         PpttHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
16301093ca81SSascha Wildner         PpttHeader->Length = (UINT8)(Subtable->Length);
16311093ca81SSascha Wildner 
16321093ca81SSascha Wildner         switch (PpttHeader->Type)
16331093ca81SSascha Wildner         {
16341093ca81SSascha Wildner         case ACPI_PPTT_TYPE_PROCESSOR:
16351093ca81SSascha Wildner 
16361093ca81SSascha Wildner             InfoTable = AcpiDmTableInfoPptt0;
16371093ca81SSascha Wildner             break;
16381093ca81SSascha Wildner 
16391093ca81SSascha Wildner         case ACPI_PPTT_TYPE_CACHE:
16401093ca81SSascha Wildner 
16411093ca81SSascha Wildner             InfoTable = AcpiDmTableInfoPptt1;
16421093ca81SSascha Wildner             break;
16431093ca81SSascha Wildner 
16441093ca81SSascha Wildner         case ACPI_PPTT_TYPE_ID:
16451093ca81SSascha Wildner 
16461093ca81SSascha Wildner             InfoTable = AcpiDmTableInfoPptt2;
16471093ca81SSascha Wildner             break;
16481093ca81SSascha Wildner 
16491093ca81SSascha Wildner         default:
16501093ca81SSascha Wildner 
16511093ca81SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PPTT");
16521093ca81SSascha Wildner             return (AE_ERROR);
16531093ca81SSascha Wildner         }
16541093ca81SSascha Wildner 
16551093ca81SSascha Wildner         /* Compile PPTT subtable body */
16561093ca81SSascha Wildner 
16577bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
16581093ca81SSascha Wildner         if (ACPI_FAILURE (Status))
16591093ca81SSascha Wildner         {
16601093ca81SSascha Wildner             return (Status);
16611093ca81SSascha Wildner         }
16621093ca81SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
16631093ca81SSascha Wildner         PpttHeader->Length += (UINT8)(Subtable->Length);
16641093ca81SSascha Wildner 
16651093ca81SSascha Wildner         /* Compile PPTT subtable additionals */
16661093ca81SSascha Wildner 
16671093ca81SSascha Wildner         switch (PpttHeader->Type)
16681093ca81SSascha Wildner         {
16691093ca81SSascha Wildner         case ACPI_PPTT_TYPE_PROCESSOR:
16701093ca81SSascha Wildner 
16711093ca81SSascha Wildner             PpttProcessor = ACPI_SUB_PTR (ACPI_PPTT_PROCESSOR,
16721093ca81SSascha Wildner                 Subtable->Buffer, sizeof (ACPI_SUBTABLE_HEADER));
16731093ca81SSascha Wildner             if (PpttProcessor)
16741093ca81SSascha Wildner             {
16751093ca81SSascha Wildner                 /* Compile initiator proximity domain list */
16761093ca81SSascha Wildner 
16771093ca81SSascha Wildner                 PpttProcessor->NumberOfPrivResources = 0;
16781093ca81SSascha Wildner                 while (*PFieldList)
16791093ca81SSascha Wildner                 {
16801093ca81SSascha Wildner                     Status = DtCompileTable (PFieldList,
16817bcb6cafSSascha Wildner                         AcpiDmTableInfoPptt0a, &Subtable);
16821093ca81SSascha Wildner                     if (ACPI_FAILURE (Status))
16831093ca81SSascha Wildner                     {
16841093ca81SSascha Wildner                         return (Status);
16851093ca81SSascha Wildner                     }
16861093ca81SSascha Wildner                     if (!Subtable)
16871093ca81SSascha Wildner                     {
16881093ca81SSascha Wildner                         break;
16891093ca81SSascha Wildner                     }
16901093ca81SSascha Wildner 
16911093ca81SSascha Wildner                     DtInsertSubtable (ParentTable, Subtable);
16921093ca81SSascha Wildner                     PpttHeader->Length += (UINT8)(Subtable->Length);
16931093ca81SSascha Wildner                     PpttProcessor->NumberOfPrivResources++;
16941093ca81SSascha Wildner                 }
16951093ca81SSascha Wildner             }
16961093ca81SSascha Wildner             break;
16971093ca81SSascha Wildner 
169801d5d5dfSSascha Wildner         case ACPI_PPTT_TYPE_CACHE:
169901d5d5dfSSascha Wildner 
170001d5d5dfSSascha Wildner             PpttAcpiHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
170101d5d5dfSSascha Wildner                 AslGbl_RootTable->Buffer);
170201d5d5dfSSascha Wildner             if (PpttAcpiHeader->Revision < 3)
170301d5d5dfSSascha Wildner             {
170401d5d5dfSSascha Wildner                 break;
170501d5d5dfSSascha Wildner             }
170601d5d5dfSSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPptt1a,
170701d5d5dfSSascha Wildner                 &Subtable);
170801d5d5dfSSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
170901d5d5dfSSascha Wildner             PpttHeader->Length += (UINT8)(Subtable->Length);
171001d5d5dfSSascha Wildner             break;
171101d5d5dfSSascha Wildner 
17121093ca81SSascha Wildner         default:
17131093ca81SSascha Wildner 
17141093ca81SSascha Wildner             break;
17151093ca81SSascha Wildner         }
17161093ca81SSascha Wildner     }
17171093ca81SSascha Wildner 
17181093ca81SSascha Wildner     return (AE_OK);
17191093ca81SSascha Wildner }
17201093ca81SSascha Wildner 
17211093ca81SSascha Wildner 
17221093ca81SSascha Wildner /******************************************************************************
17231093ca81SSascha Wildner  *
17244898bea4SSascha Wildner  * FUNCTION:    DtCompilePrmt
17254898bea4SSascha Wildner  *
17264898bea4SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
17274898bea4SSascha Wildner  *
17284898bea4SSascha Wildner  * RETURN:      Status
17294898bea4SSascha Wildner  *
17304898bea4SSascha Wildner  * DESCRIPTION: Compile PRMT.
17314898bea4SSascha Wildner  *
17324898bea4SSascha Wildner  *****************************************************************************/
17334898bea4SSascha Wildner 
17344898bea4SSascha Wildner ACPI_STATUS
DtCompilePrmt(void ** List)17354898bea4SSascha Wildner DtCompilePrmt (
17364898bea4SSascha Wildner     void                    **List)
17374898bea4SSascha Wildner {
17384898bea4SSascha Wildner     ACPI_STATUS             Status;
17394898bea4SSascha Wildner     ACPI_TABLE_PRMT_HEADER  *PrmtHeader;
17404898bea4SSascha Wildner     ACPI_PRMT_MODULE_INFO   *PrmtModuleInfo;
17414898bea4SSascha Wildner     DT_SUBTABLE             *Subtable;
17424898bea4SSascha Wildner     DT_SUBTABLE             *ParentTable;
17434898bea4SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
17444898bea4SSascha Wildner     UINT32                  i, j;
17454898bea4SSascha Wildner 
17464898bea4SSascha Wildner     ParentTable = DtPeekSubtable ();
17474898bea4SSascha Wildner 
17484898bea4SSascha Wildner     /* Compile PRMT subtable header */
17494898bea4SSascha Wildner 
17504898bea4SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHdr,
17514898bea4SSascha Wildner         &Subtable);
17524898bea4SSascha Wildner     if (ACPI_FAILURE (Status))
17534898bea4SSascha Wildner     {
17544898bea4SSascha Wildner         return (Status);
17554898bea4SSascha Wildner     }
17564898bea4SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
17574898bea4SSascha Wildner     PrmtHeader = ACPI_CAST_PTR (ACPI_TABLE_PRMT_HEADER, Subtable->Buffer);
17584898bea4SSascha Wildner 
17594898bea4SSascha Wildner     for (i = 0; i < PrmtHeader->ModuleInfoCount; i++)
17604898bea4SSascha Wildner     {
17614898bea4SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtModule,
17624898bea4SSascha Wildner             &Subtable);
17634898bea4SSascha Wildner         if (ACPI_FAILURE (Status))
17644898bea4SSascha Wildner         {
17654898bea4SSascha Wildner             return (Status);
17664898bea4SSascha Wildner         }
17674898bea4SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
17684898bea4SSascha Wildner         PrmtModuleInfo = ACPI_CAST_PTR (ACPI_PRMT_MODULE_INFO, Subtable->Buffer);
17694898bea4SSascha Wildner 
17704898bea4SSascha Wildner         for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; j++)
17714898bea4SSascha Wildner         {
17724898bea4SSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHandler,
17734898bea4SSascha Wildner                 &Subtable);
17744898bea4SSascha Wildner             if (ACPI_FAILURE (Status))
17754898bea4SSascha Wildner             {
17764898bea4SSascha Wildner                 return (Status);
17774898bea4SSascha Wildner             }
17784898bea4SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
17794898bea4SSascha Wildner         }
17804898bea4SSascha Wildner     }
17814898bea4SSascha Wildner 
17824898bea4SSascha Wildner     return (AE_OK);
17834898bea4SSascha Wildner }
17844898bea4SSascha Wildner 
17854898bea4SSascha Wildner 
17864898bea4SSascha Wildner /******************************************************************************
17874898bea4SSascha Wildner  *
17884898bea4SSascha Wildner  * FUNCTION:    DtCompileRgrt
17894898bea4SSascha Wildner  *
17904898bea4SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
17914898bea4SSascha Wildner  *
17924898bea4SSascha Wildner  * RETURN:      Status
17934898bea4SSascha Wildner  *
17944898bea4SSascha Wildner  * DESCRIPTION: Compile RGRT.
17954898bea4SSascha Wildner  *
17964898bea4SSascha Wildner  *****************************************************************************/
17974898bea4SSascha Wildner 
17984898bea4SSascha Wildner ACPI_STATUS
DtCompileRgrt(void ** List)17994898bea4SSascha Wildner DtCompileRgrt (
18004898bea4SSascha Wildner     void                    **List)
18014898bea4SSascha Wildner {
18024898bea4SSascha Wildner     ACPI_STATUS             Status;
18034898bea4SSascha Wildner     DT_SUBTABLE             *Subtable;
18044898bea4SSascha Wildner     DT_SUBTABLE             *ParentTable;
18054898bea4SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
18064898bea4SSascha Wildner 
18074898bea4SSascha Wildner 
18084898bea4SSascha Wildner     /* Compile the main table */
18094898bea4SSascha Wildner 
18104898bea4SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt,
18114898bea4SSascha Wildner         &Subtable);
18124898bea4SSascha Wildner     if (ACPI_FAILURE (Status))
18134898bea4SSascha Wildner     {
18144898bea4SSascha Wildner         return (Status);
18154898bea4SSascha Wildner     }
18164898bea4SSascha Wildner 
18174898bea4SSascha Wildner     ParentTable = DtPeekSubtable ();
18184898bea4SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
18194898bea4SSascha Wildner 
18204898bea4SSascha Wildner     /* Compile the "Subtable" -- actually just the binary (PNG) image */
18214898bea4SSascha Wildner 
18224898bea4SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt0,
18234898bea4SSascha Wildner         &Subtable);
18244898bea4SSascha Wildner     if (ACPI_FAILURE (Status))
18254898bea4SSascha Wildner     {
18264898bea4SSascha Wildner         return (Status);
18274898bea4SSascha Wildner     }
18284898bea4SSascha Wildner 
18294898bea4SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
18304898bea4SSascha Wildner     return (AE_OK);
18314898bea4SSascha Wildner }
18324898bea4SSascha Wildner 
18334898bea4SSascha Wildner 
18344898bea4SSascha Wildner /******************************************************************************
18354898bea4SSascha Wildner  *
1836820c5b08SSascha Wildner  * FUNCTION:    DtCompileRsdt
1837820c5b08SSascha Wildner  *
1838820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
1839820c5b08SSascha Wildner  *
1840820c5b08SSascha Wildner  * RETURN:      Status
1841820c5b08SSascha Wildner  *
1842820c5b08SSascha Wildner  * DESCRIPTION: Compile RSDT.
1843820c5b08SSascha Wildner  *
1844820c5b08SSascha Wildner  *****************************************************************************/
1845820c5b08SSascha Wildner 
1846820c5b08SSascha Wildner ACPI_STATUS
DtCompileRsdt(void ** List)1847820c5b08SSascha Wildner DtCompileRsdt (
1848820c5b08SSascha Wildner     void                    **List)
1849820c5b08SSascha Wildner {
1850820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
1851820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
1852820c5b08SSascha Wildner     DT_FIELD                *FieldList = *(DT_FIELD **) List;
1853820c5b08SSascha Wildner     UINT32                  Address;
1854820c5b08SSascha Wildner 
1855820c5b08SSascha Wildner 
1856820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
1857820c5b08SSascha Wildner 
1858820c5b08SSascha Wildner     while (FieldList)
1859820c5b08SSascha Wildner     {
1860820c5b08SSascha Wildner         DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
1861820c5b08SSascha Wildner 
1862820c5b08SSascha Wildner         DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
1863820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1864820c5b08SSascha Wildner         FieldList = FieldList->Next;
1865820c5b08SSascha Wildner     }
1866820c5b08SSascha Wildner 
1867820c5b08SSascha Wildner     return (AE_OK);
1868820c5b08SSascha Wildner }
1869820c5b08SSascha Wildner 
1870820c5b08SSascha Wildner 
1871820c5b08SSascha Wildner /******************************************************************************
1872820c5b08SSascha Wildner  *
1873820c5b08SSascha Wildner  * FUNCTION:    DtCompileS3pt
1874820c5b08SSascha Wildner  *
1875820c5b08SSascha Wildner  * PARAMETERS:  PFieldList          - Current field list pointer
1876820c5b08SSascha Wildner  *
1877820c5b08SSascha Wildner  * RETURN:      Status
1878820c5b08SSascha Wildner  *
1879820c5b08SSascha Wildner  * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
1880820c5b08SSascha Wildner  *
1881820c5b08SSascha Wildner  *****************************************************************************/
1882820c5b08SSascha Wildner 
1883820c5b08SSascha Wildner ACPI_STATUS
DtCompileS3pt(DT_FIELD ** PFieldList)1884820c5b08SSascha Wildner DtCompileS3pt (
1885820c5b08SSascha Wildner     DT_FIELD                **PFieldList)
1886820c5b08SSascha Wildner {
1887820c5b08SSascha Wildner     ACPI_STATUS             Status;
18882ffe9f16SSascha Wildner     ACPI_FPDT_HEADER        *S3ptHeader;
1889820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
1890820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
1891820c5b08SSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable;
1892820c5b08SSascha Wildner     DT_FIELD                *SubtableStart;
1893820c5b08SSascha Wildner 
1894820c5b08SSascha Wildner 
1895820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
1896806343b9SSascha Wildner         &AslGbl_RootTable);
1897820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
1898820c5b08SSascha Wildner     {
1899820c5b08SSascha Wildner         return (Status);
1900820c5b08SSascha Wildner     }
1901820c5b08SSascha Wildner 
1902806343b9SSascha Wildner     DtPushSubtable (AslGbl_RootTable);
1903820c5b08SSascha Wildner 
1904820c5b08SSascha Wildner     while (*PFieldList)
1905820c5b08SSascha Wildner     {
1906820c5b08SSascha Wildner         SubtableStart = *PFieldList;
1907820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
19087bcb6cafSSascha Wildner             &Subtable);
1909820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
1910820c5b08SSascha Wildner         {
1911820c5b08SSascha Wildner             return (Status);
1912820c5b08SSascha Wildner         }
1913820c5b08SSascha Wildner 
1914820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
1915820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1916820c5b08SSascha Wildner         DtPushSubtable (Subtable);
1917820c5b08SSascha Wildner 
19182ffe9f16SSascha Wildner         S3ptHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
1919820c5b08SSascha Wildner 
1920820c5b08SSascha Wildner         switch (S3ptHeader->Type)
1921820c5b08SSascha Wildner         {
1922820c5b08SSascha Wildner         case ACPI_S3PT_TYPE_RESUME:
1923820c5b08SSascha Wildner 
1924820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoS3pt0;
1925820c5b08SSascha Wildner             break;
1926820c5b08SSascha Wildner 
1927820c5b08SSascha Wildner         case ACPI_S3PT_TYPE_SUSPEND:
1928820c5b08SSascha Wildner 
1929820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoS3pt1;
1930820c5b08SSascha Wildner             break;
1931820c5b08SSascha Wildner 
1932820c5b08SSascha Wildner         default:
1933820c5b08SSascha Wildner 
1934820c5b08SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
1935820c5b08SSascha Wildner             return (AE_ERROR);
1936820c5b08SSascha Wildner         }
1937820c5b08SSascha Wildner 
19387bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
1939820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
1940820c5b08SSascha Wildner         {
1941820c5b08SSascha Wildner             return (Status);
1942820c5b08SSascha Wildner         }
1943820c5b08SSascha Wildner 
1944820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
1945820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
1946820c5b08SSascha Wildner         DtPopSubtable ();
1947820c5b08SSascha Wildner     }
1948820c5b08SSascha Wildner 
1949820c5b08SSascha Wildner     return (AE_OK);
1950820c5b08SSascha Wildner }
1951820c5b08SSascha Wildner 
1952820c5b08SSascha Wildner 
1953820c5b08SSascha Wildner /******************************************************************************
1954820c5b08SSascha Wildner  *
19557bcb6cafSSascha Wildner  * FUNCTION:    DtCompileSdev
19567bcb6cafSSascha Wildner  *
19577bcb6cafSSascha Wildner  * PARAMETERS:  List                - Current field list pointer
19587bcb6cafSSascha Wildner  *
19597bcb6cafSSascha Wildner  * RETURN:      Status
19607bcb6cafSSascha Wildner  *
19617bcb6cafSSascha Wildner  * DESCRIPTION: Compile SDEV.
19627bcb6cafSSascha Wildner  *
19637bcb6cafSSascha Wildner  *****************************************************************************/
19647bcb6cafSSascha Wildner 
19657bcb6cafSSascha Wildner ACPI_STATUS
DtCompileSdev(void ** List)19667bcb6cafSSascha Wildner DtCompileSdev (
19677bcb6cafSSascha Wildner     void                    **List)
19687bcb6cafSSascha Wildner {
19697bcb6cafSSascha Wildner     ACPI_STATUS                 Status;
19707bcb6cafSSascha Wildner     ACPI_SDEV_HEADER            *SdevHeader;
197101d5d5dfSSascha Wildner     ACPI_SDEV_HEADER            *SecureComponentHeader;
19727bcb6cafSSascha Wildner     DT_SUBTABLE                 *Subtable;
19737bcb6cafSSascha Wildner     DT_SUBTABLE                 *ParentTable;
19747bcb6cafSSascha Wildner     ACPI_DMTABLE_INFO           *InfoTable;
197501d5d5dfSSascha Wildner     ACPI_DMTABLE_INFO           *SecureComponentInfoTable = NULL;
19767bcb6cafSSascha Wildner     DT_FIELD                    **PFieldList = (DT_FIELD **) List;
19777bcb6cafSSascha Wildner     DT_FIELD                    *SubtableStart;
19787bcb6cafSSascha Wildner     ACPI_SDEV_PCIE              *Pcie = NULL;
19797bcb6cafSSascha Wildner     ACPI_SDEV_NAMESPACE         *Namesp = NULL;
19807bcb6cafSSascha Wildner     UINT32                      EntryCount;
198101d5d5dfSSascha Wildner     ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
198201d5d5dfSSascha Wildner     UINT16                      ComponentLength = 0;
19837bcb6cafSSascha Wildner 
19847bcb6cafSSascha Wildner 
19857bcb6cafSSascha Wildner     /* Subtables */
19867bcb6cafSSascha Wildner 
19877bcb6cafSSascha Wildner     while (*PFieldList)
19887bcb6cafSSascha Wildner     {
19897bcb6cafSSascha Wildner         /* Compile common SDEV subtable header */
19907bcb6cafSSascha Wildner 
19917bcb6cafSSascha Wildner         SubtableStart = *PFieldList;
19927bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevHdr,
19937bcb6cafSSascha Wildner             &Subtable);
19947bcb6cafSSascha Wildner         if (ACPI_FAILURE (Status))
19957bcb6cafSSascha Wildner         {
19967bcb6cafSSascha Wildner             return (Status);
19977bcb6cafSSascha Wildner         }
19987bcb6cafSSascha Wildner 
19997bcb6cafSSascha Wildner         ParentTable = DtPeekSubtable ();
20007bcb6cafSSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
20017bcb6cafSSascha Wildner         DtPushSubtable (Subtable);
20027bcb6cafSSascha Wildner 
20037bcb6cafSSascha Wildner         SdevHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
20047bcb6cafSSascha Wildner         SdevHeader->Length = (UINT8)(sizeof (ACPI_SDEV_HEADER));
20057bcb6cafSSascha Wildner 
20067bcb6cafSSascha Wildner         switch (SdevHeader->Type)
20077bcb6cafSSascha Wildner         {
20087bcb6cafSSascha Wildner         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
20097bcb6cafSSascha Wildner 
20107bcb6cafSSascha Wildner             InfoTable = AcpiDmTableInfoSdev0;
20117bcb6cafSSascha Wildner             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer);
201201d5d5dfSSascha Wildner             SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
201301d5d5dfSSascha Wildner                 ACPI_ADD_PTR (UINT8, Subtable->Buffer, sizeof(ACPI_SDEV_NAMESPACE)));
20147bcb6cafSSascha Wildner             break;
20157bcb6cafSSascha Wildner 
20167bcb6cafSSascha Wildner         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
20177bcb6cafSSascha Wildner 
20187bcb6cafSSascha Wildner             InfoTable = AcpiDmTableInfoSdev1;
20197bcb6cafSSascha Wildner             Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable->Buffer);
20207bcb6cafSSascha Wildner             break;
20217bcb6cafSSascha Wildner 
20227bcb6cafSSascha Wildner         default:
20237bcb6cafSSascha Wildner 
20247bcb6cafSSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
20257bcb6cafSSascha Wildner             return (AE_ERROR);
20267bcb6cafSSascha Wildner         }
20277bcb6cafSSascha Wildner 
20287bcb6cafSSascha Wildner         /* Compile SDEV subtable body */
20297bcb6cafSSascha Wildner 
20307bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
20317bcb6cafSSascha Wildner         if (ACPI_FAILURE (Status))
20327bcb6cafSSascha Wildner         {
20337bcb6cafSSascha Wildner             return (Status);
20347bcb6cafSSascha Wildner         }
20357bcb6cafSSascha Wildner 
20367bcb6cafSSascha Wildner         ParentTable = DtPeekSubtable ();
20377bcb6cafSSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
20387bcb6cafSSascha Wildner 
20397bcb6cafSSascha Wildner         /* Optional data fields are appended to the main subtable body */
20407bcb6cafSSascha Wildner 
20417bcb6cafSSascha Wildner         switch (SdevHeader->Type)
20427bcb6cafSSascha Wildner         {
20437bcb6cafSSascha Wildner         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
20447bcb6cafSSascha Wildner 
204501d5d5dfSSascha Wildner             /*
204601d5d5dfSSascha Wildner              * Device Id Offset will be be calculated differently depending on
204701d5d5dfSSascha Wildner              * the presence of secure access components.
204801d5d5dfSSascha Wildner              */
204901d5d5dfSSascha Wildner             Namesp->DeviceIdOffset = 0;
205001d5d5dfSSascha Wildner             ComponentLength = 0;
205101d5d5dfSSascha Wildner 
205201d5d5dfSSascha Wildner             /* If the secure access component exists, get the structures */
205301d5d5dfSSascha Wildner 
205401d5d5dfSSascha Wildner             if (SdevHeader->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
205501d5d5dfSSascha Wildner             {
205601d5d5dfSSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0b,
205701d5d5dfSSascha Wildner                     &Subtable);
205801d5d5dfSSascha Wildner                 if (ACPI_FAILURE (Status))
205901d5d5dfSSascha Wildner                 {
206001d5d5dfSSascha Wildner                     return (Status);
206101d5d5dfSSascha Wildner                 }
206201d5d5dfSSascha Wildner                 ParentTable = DtPeekSubtable ();
206301d5d5dfSSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
206401d5d5dfSSascha Wildner 
206501d5d5dfSSascha Wildner                 Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
206601d5d5dfSSascha Wildner 
206701d5d5dfSSascha Wildner                 /* Compile a secure access component header */
206801d5d5dfSSascha Wildner 
206901d5d5dfSSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevSecCompHdr,
207001d5d5dfSSascha Wildner                     &Subtable);
207101d5d5dfSSascha Wildner                 if (ACPI_FAILURE (Status))
207201d5d5dfSSascha Wildner                 {
207301d5d5dfSSascha Wildner                     return (Status);
207401d5d5dfSSascha Wildner                 }
207501d5d5dfSSascha Wildner                 ParentTable = DtPeekSubtable ();
207601d5d5dfSSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
207701d5d5dfSSascha Wildner 
207801d5d5dfSSascha Wildner                 /* Compile the secure access component */
207901d5d5dfSSascha Wildner 
208001d5d5dfSSascha Wildner                 SecureComponentHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
208101d5d5dfSSascha Wildner                 switch (SecureComponentHeader->Type)
208201d5d5dfSSascha Wildner                 {
208301d5d5dfSSascha Wildner                 case ACPI_SDEV_TYPE_ID_COMPONENT:
208401d5d5dfSSascha Wildner 
208501d5d5dfSSascha Wildner                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
208601d5d5dfSSascha Wildner                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_ID_COMPONENT);
208701d5d5dfSSascha Wildner                     ComponentLength = sizeof (ACPI_SDEV_ID_COMPONENT);
208801d5d5dfSSascha Wildner                     break;
208901d5d5dfSSascha Wildner 
209001d5d5dfSSascha Wildner                 case ACPI_SDEV_TYPE_MEM_COMPONENT:
209101d5d5dfSSascha Wildner 
209201d5d5dfSSascha Wildner                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
209301d5d5dfSSascha Wildner                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_MEM_COMPONENT);
209401d5d5dfSSascha Wildner                     ComponentLength = sizeof (ACPI_SDEV_MEM_COMPONENT);
209501d5d5dfSSascha Wildner                     break;
209601d5d5dfSSascha Wildner 
209701d5d5dfSSascha Wildner                 default:
209801d5d5dfSSascha Wildner 
209901d5d5dfSSascha Wildner                     /* Any other secure component types are undefined */
210001d5d5dfSSascha Wildner 
210101d5d5dfSSascha Wildner                     return (AE_ERROR);
210201d5d5dfSSascha Wildner                 }
210301d5d5dfSSascha Wildner 
210401d5d5dfSSascha Wildner                 Status = DtCompileTable (PFieldList, SecureComponentInfoTable,
210501d5d5dfSSascha Wildner                     &Subtable);
210601d5d5dfSSascha Wildner                 if (ACPI_FAILURE (Status))
210701d5d5dfSSascha Wildner                 {
210801d5d5dfSSascha Wildner                     return (Status);
210901d5d5dfSSascha Wildner                 }
211001d5d5dfSSascha Wildner                 ParentTable = DtPeekSubtable ();
211101d5d5dfSSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
211201d5d5dfSSascha Wildner 
211301d5d5dfSSascha Wildner                 SecureComponent->SecureComponentOffset =
211401d5d5dfSSascha Wildner                     sizeof (ACPI_SDEV_NAMESPACE) + sizeof (ACPI_SDEV_SECURE_COMPONENT);
211501d5d5dfSSascha Wildner                 SecureComponent->SecureComponentLength = ComponentLength;
211601d5d5dfSSascha Wildner 
211701d5d5dfSSascha Wildner 
211801d5d5dfSSascha Wildner                 /*
211901d5d5dfSSascha Wildner                  * Add the secure component to the subtable to be added for the
212001d5d5dfSSascha Wildner                  * the namespace subtable's length
212101d5d5dfSSascha Wildner                  */
212201d5d5dfSSascha Wildner                 ComponentLength += sizeof (ACPI_SDEV_SECURE_COMPONENT);
212301d5d5dfSSascha Wildner             }
212401d5d5dfSSascha Wildner 
21257bcb6cafSSascha Wildner             /* Append DeviceId namespace string */
21267bcb6cafSSascha Wildner 
21277bcb6cafSSascha Wildner             Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a,
21287bcb6cafSSascha Wildner                 &Subtable);
21297bcb6cafSSascha Wildner             if (ACPI_FAILURE (Status))
21307bcb6cafSSascha Wildner             {
21317bcb6cafSSascha Wildner                 return (Status);
21327bcb6cafSSascha Wildner             }
21337bcb6cafSSascha Wildner 
21347bcb6cafSSascha Wildner             if (!Subtable)
21357bcb6cafSSascha Wildner             {
21367bcb6cafSSascha Wildner                 break;
21377bcb6cafSSascha Wildner             }
21387bcb6cafSSascha Wildner 
21397bcb6cafSSascha Wildner             ParentTable = DtPeekSubtable ();
21407bcb6cafSSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
21417bcb6cafSSascha Wildner 
214201d5d5dfSSascha Wildner             Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_NAMESPACE);
214301d5d5dfSSascha Wildner 
21447bcb6cafSSascha Wildner             Namesp->DeviceIdLength = (UINT16) Subtable->Length;
21457bcb6cafSSascha Wildner 
21467bcb6cafSSascha Wildner             /* Append Vendor data */
21477bcb6cafSSascha Wildner 
21487bcb6cafSSascha Wildner             Namesp->VendorDataLength = 0;
21497bcb6cafSSascha Wildner             Namesp->VendorDataOffset = 0;
21507bcb6cafSSascha Wildner 
21517bcb6cafSSascha Wildner             if (*PFieldList)
21527bcb6cafSSascha Wildner             {
21537bcb6cafSSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
21547bcb6cafSSascha Wildner                     &Subtable);
21557bcb6cafSSascha Wildner                 if (ACPI_FAILURE (Status))
21567bcb6cafSSascha Wildner                 {
21577bcb6cafSSascha Wildner                     return (Status);
21587bcb6cafSSascha Wildner                 }
21597bcb6cafSSascha Wildner 
21607bcb6cafSSascha Wildner                 if (Subtable)
21617bcb6cafSSascha Wildner                 {
21627bcb6cafSSascha Wildner                     ParentTable = DtPeekSubtable ();
21637bcb6cafSSascha Wildner                     DtInsertSubtable (ParentTable, Subtable);
21647bcb6cafSSascha Wildner 
21657bcb6cafSSascha Wildner                     Namesp->VendorDataOffset =
21667bcb6cafSSascha Wildner                         Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
21677bcb6cafSSascha Wildner                     Namesp->VendorDataLength =
21687bcb6cafSSascha Wildner                         (UINT16) Subtable->Length;
21697bcb6cafSSascha Wildner 
21707bcb6cafSSascha Wildner                     /* Final size of entire namespace structure */
21717bcb6cafSSascha Wildner 
21727bcb6cafSSascha Wildner                     SdevHeader->Length = (UINT16)(sizeof(ACPI_SDEV_NAMESPACE) +
217301d5d5dfSSascha Wildner                         Subtable->Length + Namesp->DeviceIdLength) + ComponentLength;
2174e5412f1eSSascha Wildner                 }
2175e5412f1eSSascha Wildner             }
2176e5412f1eSSascha Wildner 
21777bcb6cafSSascha Wildner             break;
21787bcb6cafSSascha Wildner 
21797bcb6cafSSascha Wildner         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
21807bcb6cafSSascha Wildner 
21817bcb6cafSSascha Wildner             /* Append the PCIe path info first */
21827bcb6cafSSascha Wildner 
21837bcb6cafSSascha Wildner             EntryCount = 0;
21847bcb6cafSSascha Wildner             while (*PFieldList && !strcmp ((*PFieldList)->Name, "Device"))
21857bcb6cafSSascha Wildner             {
21867bcb6cafSSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1a,
21877bcb6cafSSascha Wildner                     &Subtable);
21887bcb6cafSSascha Wildner                 if (ACPI_FAILURE (Status))
21897bcb6cafSSascha Wildner                 {
21907bcb6cafSSascha Wildner                     return (Status);
21917bcb6cafSSascha Wildner                 }
21927bcb6cafSSascha Wildner 
21937bcb6cafSSascha Wildner                 if (!Subtable)
21947bcb6cafSSascha Wildner                 {
21957bcb6cafSSascha Wildner                     DtPopSubtable ();
21967bcb6cafSSascha Wildner                     break;
21977bcb6cafSSascha Wildner                 }
21987bcb6cafSSascha Wildner 
21997bcb6cafSSascha Wildner                 ParentTable = DtPeekSubtable ();
22007bcb6cafSSascha Wildner                 DtInsertSubtable (ParentTable, Subtable);
22017bcb6cafSSascha Wildner                 EntryCount++;
22027bcb6cafSSascha Wildner             }
22037bcb6cafSSascha Wildner 
22047bcb6cafSSascha Wildner             /* Path offset will point immediately after the main subtable */
22057bcb6cafSSascha Wildner 
22067bcb6cafSSascha Wildner             Pcie->PathOffset = sizeof (ACPI_SDEV_PCIE);
22077bcb6cafSSascha Wildner             Pcie->PathLength = (UINT16)
22087bcb6cafSSascha Wildner                 (EntryCount * sizeof (ACPI_SDEV_PCIE_PATH));
22097bcb6cafSSascha Wildner 
22107bcb6cafSSascha Wildner             /* Append the Vendor Data last */
22117bcb6cafSSascha Wildner 
22127bcb6cafSSascha Wildner             Pcie->VendorDataLength = 0;
22137bcb6cafSSascha Wildner             Pcie->VendorDataOffset = 0;
22147bcb6cafSSascha Wildner 
22157bcb6cafSSascha Wildner             if (*PFieldList)
22167bcb6cafSSascha Wildner             {
22177bcb6cafSSascha Wildner                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
22187bcb6cafSSascha Wildner                     &Subtable);
22197bcb6cafSSascha Wildner                 if (ACPI_FAILURE (Status))
22207bcb6cafSSascha Wildner                 {
22217bcb6cafSSascha Wildner                     return (Status);
22227bcb6cafSSascha Wildner                 }
22237bcb6cafSSascha Wildner 
22247bcb6cafSSascha Wildner                 if (Subtable)
22257bcb6cafSSascha Wildner                 {
22267bcb6cafSSascha Wildner                     ParentTable = DtPeekSubtable ();
22277bcb6cafSSascha Wildner                     DtInsertSubtable (ParentTable, Subtable);
22287bcb6cafSSascha Wildner 
22297bcb6cafSSascha Wildner                     Pcie->VendorDataOffset =
22307bcb6cafSSascha Wildner                         Pcie->PathOffset + Pcie->PathLength;
22317bcb6cafSSascha Wildner                     Pcie->VendorDataLength = (UINT16)
22327bcb6cafSSascha Wildner                         Subtable->Length;
22337bcb6cafSSascha Wildner                 }
22347bcb6cafSSascha Wildner             }
22357bcb6cafSSascha Wildner 
22367bcb6cafSSascha Wildner             SdevHeader->Length =
22377bcb6cafSSascha Wildner                 sizeof (ACPI_SDEV_PCIE) +
22387bcb6cafSSascha Wildner                 Pcie->PathLength + Pcie->VendorDataLength;
22397bcb6cafSSascha Wildner             break;
22407bcb6cafSSascha Wildner 
22417bcb6cafSSascha Wildner         default:
22427bcb6cafSSascha Wildner 
22437bcb6cafSSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
22447bcb6cafSSascha Wildner             return (AE_ERROR);
22457bcb6cafSSascha Wildner         }
22467bcb6cafSSascha Wildner 
22477bcb6cafSSascha Wildner         DtPopSubtable ();
22487bcb6cafSSascha Wildner     }
22497bcb6cafSSascha Wildner 
22507bcb6cafSSascha Wildner     return (AE_OK);
22517bcb6cafSSascha Wildner }
22527bcb6cafSSascha Wildner 
22537bcb6cafSSascha Wildner 
22547bcb6cafSSascha Wildner /******************************************************************************
22557bcb6cafSSascha Wildner  *
2256820c5b08SSascha Wildner  * FUNCTION:    DtCompileSlic
2257820c5b08SSascha Wildner  *
2258820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
2259820c5b08SSascha Wildner  *
2260820c5b08SSascha Wildner  * RETURN:      Status
2261820c5b08SSascha Wildner  *
2262820c5b08SSascha Wildner  * DESCRIPTION: Compile SLIC.
2263820c5b08SSascha Wildner  *
2264820c5b08SSascha Wildner  *****************************************************************************/
2265820c5b08SSascha Wildner 
2266820c5b08SSascha Wildner ACPI_STATUS
DtCompileSlic(void ** List)2267820c5b08SSascha Wildner DtCompileSlic (
2268820c5b08SSascha Wildner     void                    **List)
2269820c5b08SSascha Wildner {
2270820c5b08SSascha Wildner     ACPI_STATUS             Status;
2271820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
2272820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
2273820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2274820c5b08SSascha Wildner 
2275820c5b08SSascha Wildner 
2276820c5b08SSascha Wildner     while (*PFieldList)
2277820c5b08SSascha Wildner     {
2278820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
22797bcb6cafSSascha Wildner             &Subtable);
2280820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
2281820c5b08SSascha Wildner         {
2282820c5b08SSascha Wildner             return (Status);
2283820c5b08SSascha Wildner         }
2284820c5b08SSascha Wildner 
2285820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
2286820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
2287820c5b08SSascha Wildner         DtPushSubtable (Subtable);
2288820c5b08SSascha Wildner         DtPopSubtable ();
2289820c5b08SSascha Wildner     }
2290820c5b08SSascha Wildner 
2291820c5b08SSascha Wildner     return (AE_OK);
2292820c5b08SSascha Wildner }
2293820c5b08SSascha Wildner 
2294820c5b08SSascha Wildner 
2295820c5b08SSascha Wildner /******************************************************************************
2296820c5b08SSascha Wildner  *
2297820c5b08SSascha Wildner  * FUNCTION:    DtCompileSlit
2298820c5b08SSascha Wildner  *
2299820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
2300820c5b08SSascha Wildner  *
2301820c5b08SSascha Wildner  * RETURN:      Status
2302820c5b08SSascha Wildner  *
2303820c5b08SSascha Wildner  * DESCRIPTION: Compile SLIT.
2304820c5b08SSascha Wildner  *
2305820c5b08SSascha Wildner  *****************************************************************************/
2306820c5b08SSascha Wildner 
2307820c5b08SSascha Wildner ACPI_STATUS
DtCompileSlit(void ** List)2308820c5b08SSascha Wildner DtCompileSlit (
2309820c5b08SSascha Wildner     void                    **List)
2310820c5b08SSascha Wildner {
2311820c5b08SSascha Wildner     ACPI_STATUS             Status;
2312820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
2313820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
2314820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2315820c5b08SSascha Wildner     DT_FIELD                *FieldList;
2316e5412f1eSSascha Wildner     DT_FIELD                *EndOfFieldList = NULL;
2317820c5b08SSascha Wildner     UINT32                  Localities;
2318e5412f1eSSascha Wildner     UINT32                  LocalityListLength;
2319820c5b08SSascha Wildner     UINT8                   *LocalityBuffer;
2320820c5b08SSascha Wildner 
2321820c5b08SSascha Wildner 
2322820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
23237bcb6cafSSascha Wildner         &Subtable);
2324820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
2325820c5b08SSascha Wildner     {
2326820c5b08SSascha Wildner         return (Status);
2327820c5b08SSascha Wildner     }
2328820c5b08SSascha Wildner 
2329820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
2330820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
2331820c5b08SSascha Wildner 
2332820c5b08SSascha Wildner     Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
2333820c5b08SSascha Wildner     LocalityBuffer = UtLocalCalloc (Localities);
2334e5412f1eSSascha Wildner     LocalityListLength = 0;
2335820c5b08SSascha Wildner 
2336820c5b08SSascha Wildner     /* Compile each locality buffer */
2337820c5b08SSascha Wildner 
2338820c5b08SSascha Wildner     FieldList = *PFieldList;
2339820c5b08SSascha Wildner     while (FieldList)
2340820c5b08SSascha Wildner     {
2341820c5b08SSascha Wildner         DtCompileBuffer (LocalityBuffer,
2342820c5b08SSascha Wildner             FieldList->Value, FieldList, Localities);
2343820c5b08SSascha Wildner 
2344e5412f1eSSascha Wildner         LocalityListLength++;
2345820c5b08SSascha Wildner         DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
2346820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
2347e5412f1eSSascha Wildner         EndOfFieldList = FieldList;
2348820c5b08SSascha Wildner         FieldList = FieldList->Next;
2349820c5b08SSascha Wildner     }
2350820c5b08SSascha Wildner 
2351e5412f1eSSascha Wildner     if (LocalityListLength != Localities)
2352e5412f1eSSascha Wildner     {
2353e5412f1eSSascha Wildner         sprintf(AslGbl_MsgBuffer,
2354e5412f1eSSascha Wildner             "Found %u entries, must match LocalityCount: %u",
2355e5412f1eSSascha Wildner             LocalityListLength, Localities);
2356e5412f1eSSascha Wildner         DtError (ASL_ERROR, ASL_MSG_ENTRY_LIST, EndOfFieldList, AslGbl_MsgBuffer);
2357e5412f1eSSascha Wildner         ACPI_FREE (LocalityBuffer);
2358e5412f1eSSascha Wildner         return (AE_LIMIT);
2359e5412f1eSSascha Wildner     }
2360e5412f1eSSascha Wildner 
2361820c5b08SSascha Wildner     ACPI_FREE (LocalityBuffer);
2362820c5b08SSascha Wildner     return (AE_OK);
2363820c5b08SSascha Wildner }
2364820c5b08SSascha Wildner 
2365820c5b08SSascha Wildner 
2366820c5b08SSascha Wildner /******************************************************************************
2367820c5b08SSascha Wildner  *
2368820c5b08SSascha Wildner  * FUNCTION:    DtCompileSrat
2369820c5b08SSascha Wildner  *
2370820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
2371820c5b08SSascha Wildner  *
2372820c5b08SSascha Wildner  * RETURN:      Status
2373820c5b08SSascha Wildner  *
2374820c5b08SSascha Wildner  * DESCRIPTION: Compile SRAT.
2375820c5b08SSascha Wildner  *
2376820c5b08SSascha Wildner  *****************************************************************************/
2377820c5b08SSascha Wildner 
2378820c5b08SSascha Wildner ACPI_STATUS
DtCompileSrat(void ** List)2379820c5b08SSascha Wildner DtCompileSrat (
2380820c5b08SSascha Wildner     void                    **List)
2381820c5b08SSascha Wildner {
2382820c5b08SSascha Wildner     ACPI_STATUS             Status;
2383820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
2384820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
2385820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2386820c5b08SSascha Wildner     DT_FIELD                *SubtableStart;
2387820c5b08SSascha Wildner     ACPI_SUBTABLE_HEADER    *SratHeader;
2388820c5b08SSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable;
2389820c5b08SSascha Wildner 
2390820c5b08SSascha Wildner 
2391820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
23927bcb6cafSSascha Wildner         &Subtable);
2393820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
2394820c5b08SSascha Wildner     {
2395820c5b08SSascha Wildner         return (Status);
2396820c5b08SSascha Wildner     }
2397820c5b08SSascha Wildner 
2398820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
2399820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
2400820c5b08SSascha Wildner 
2401820c5b08SSascha Wildner     while (*PFieldList)
2402820c5b08SSascha Wildner     {
2403820c5b08SSascha Wildner         SubtableStart = *PFieldList;
2404820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
24057bcb6cafSSascha Wildner             &Subtable);
2406820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
2407820c5b08SSascha Wildner         {
2408820c5b08SSascha Wildner             return (Status);
2409820c5b08SSascha Wildner         }
2410820c5b08SSascha Wildner 
2411820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
2412820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
2413820c5b08SSascha Wildner         DtPushSubtable (Subtable);
2414820c5b08SSascha Wildner 
2415820c5b08SSascha Wildner         SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
2416820c5b08SSascha Wildner 
2417820c5b08SSascha Wildner         switch (SratHeader->Type)
2418820c5b08SSascha Wildner         {
2419820c5b08SSascha Wildner         case ACPI_SRAT_TYPE_CPU_AFFINITY:
2420820c5b08SSascha Wildner 
2421820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoSrat0;
2422820c5b08SSascha Wildner             break;
2423820c5b08SSascha Wildner 
2424820c5b08SSascha Wildner         case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
2425820c5b08SSascha Wildner 
2426820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoSrat1;
2427820c5b08SSascha Wildner             break;
2428820c5b08SSascha Wildner 
2429820c5b08SSascha Wildner         case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
2430820c5b08SSascha Wildner 
2431820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoSrat2;
2432820c5b08SSascha Wildner             break;
2433820c5b08SSascha Wildner 
2434820c5b08SSascha Wildner         case ACPI_SRAT_TYPE_GICC_AFFINITY:
2435820c5b08SSascha Wildner 
2436820c5b08SSascha Wildner             InfoTable = AcpiDmTableInfoSrat3;
2437820c5b08SSascha Wildner             break;
2438820c5b08SSascha Wildner 
24391093ca81SSascha Wildner         case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
24401093ca81SSascha Wildner 
24411093ca81SSascha Wildner             InfoTable = AcpiDmTableInfoSrat4;
24421093ca81SSascha Wildner             break;
24431093ca81SSascha Wildner 
244400ffa116SSascha Wildner         case ACPI_SRAT_TYPE_GENERIC_AFFINITY:
244500ffa116SSascha Wildner 
244600ffa116SSascha Wildner             InfoTable = AcpiDmTableInfoSrat5;
244700ffa116SSascha Wildner             break;
244800ffa116SSascha Wildner 
244984fe3360SSascha Wildner         case ACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY:
245084fe3360SSascha Wildner 
245184fe3360SSascha Wildner             InfoTable = AcpiDmTableInfoSrat6;
245284fe3360SSascha Wildner             break;
245384fe3360SSascha Wildner 
2454820c5b08SSascha Wildner         default:
2455820c5b08SSascha Wildner 
2456820c5b08SSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
2457820c5b08SSascha Wildner             return (AE_ERROR);
2458820c5b08SSascha Wildner         }
2459820c5b08SSascha Wildner 
24607bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
2461820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
2462820c5b08SSascha Wildner         {
2463820c5b08SSascha Wildner             return (Status);
2464820c5b08SSascha Wildner         }
2465820c5b08SSascha Wildner 
2466820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
2467820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
2468820c5b08SSascha Wildner         DtPopSubtable ();
2469820c5b08SSascha Wildner     }
2470820c5b08SSascha Wildner 
2471820c5b08SSascha Wildner     return (AE_OK);
2472820c5b08SSascha Wildner }
2473820c5b08SSascha Wildner 
2474820c5b08SSascha Wildner 
2475820c5b08SSascha Wildner /******************************************************************************
2476820c5b08SSascha Wildner  *
2477820c5b08SSascha Wildner  * FUNCTION:    DtCompileStao
2478820c5b08SSascha Wildner  *
2479820c5b08SSascha Wildner  * PARAMETERS:  PFieldList          - Current field list pointer
2480820c5b08SSascha Wildner  *
2481820c5b08SSascha Wildner  * RETURN:      Status
2482820c5b08SSascha Wildner  *
2483820c5b08SSascha Wildner  * DESCRIPTION: Compile STAO.
2484820c5b08SSascha Wildner  *
2485820c5b08SSascha Wildner  *****************************************************************************/
2486820c5b08SSascha Wildner 
2487820c5b08SSascha Wildner ACPI_STATUS
DtCompileStao(void ** List)2488820c5b08SSascha Wildner DtCompileStao (
2489820c5b08SSascha Wildner     void                    **List)
2490820c5b08SSascha Wildner {
2491820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2492820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
2493820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
2494820c5b08SSascha Wildner     ACPI_STATUS             Status;
2495820c5b08SSascha Wildner 
2496820c5b08SSascha Wildner 
2497820c5b08SSascha Wildner     /* Compile the main table */
2498820c5b08SSascha Wildner 
2499820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao,
25007bcb6cafSSascha Wildner         &Subtable);
2501820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
2502820c5b08SSascha Wildner     {
2503820c5b08SSascha Wildner         return (Status);
2504820c5b08SSascha Wildner     }
2505820c5b08SSascha Wildner 
2506820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
2507820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
2508820c5b08SSascha Wildner 
2509820c5b08SSascha Wildner     /* Compile each ASCII namestring as a subtable */
2510820c5b08SSascha Wildner 
2511820c5b08SSascha Wildner     while (*PFieldList)
2512820c5b08SSascha Wildner     {
2513820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr,
25147bcb6cafSSascha Wildner             &Subtable);
2515820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
2516820c5b08SSascha Wildner         {
2517820c5b08SSascha Wildner             return (Status);
2518820c5b08SSascha Wildner         }
2519820c5b08SSascha Wildner 
2520820c5b08SSascha Wildner         ParentTable = DtPeekSubtable ();
2521820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
2522820c5b08SSascha Wildner     }
2523820c5b08SSascha Wildner 
2524820c5b08SSascha Wildner     return (AE_OK);
2525820c5b08SSascha Wildner }
2526820c5b08SSascha Wildner 
2527820c5b08SSascha Wildner 
25284898bea4SSascha Wildner /******************************************************************************
25294898bea4SSascha Wildner  *
25304898bea4SSascha Wildner  * FUNCTION:    DtCompileSvkl
25314898bea4SSascha Wildner  *
25324898bea4SSascha Wildner  * PARAMETERS:  PFieldList          - Current field list pointer
25334898bea4SSascha Wildner  *
25344898bea4SSascha Wildner  * RETURN:      Status
25354898bea4SSascha Wildner  *
25364898bea4SSascha Wildner  * DESCRIPTION: Compile SVKL.
25374898bea4SSascha Wildner  *
25384898bea4SSascha Wildner  * NOTES: SVKL is essentially a flat table, with a small main table and
25394898bea4SSascha Wildner  *          a variable number of a single type of subtable.
25404898bea4SSascha Wildner  *
25414898bea4SSascha Wildner  *****************************************************************************/
25424898bea4SSascha Wildner 
25434898bea4SSascha Wildner ACPI_STATUS
DtCompileSvkl(void ** List)25444898bea4SSascha Wildner DtCompileSvkl (
25454898bea4SSascha Wildner     void                    **List)
25464898bea4SSascha Wildner {
25474898bea4SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
25484898bea4SSascha Wildner     DT_SUBTABLE             *Subtable;
25494898bea4SSascha Wildner     DT_SUBTABLE             *ParentTable;
25504898bea4SSascha Wildner     ACPI_STATUS             Status;
25514898bea4SSascha Wildner 
25524898bea4SSascha Wildner 
25534898bea4SSascha Wildner     /* Compile the main table */
25544898bea4SSascha Wildner 
25554898bea4SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl,
25564898bea4SSascha Wildner         &Subtable);
25574898bea4SSascha Wildner     if (ACPI_FAILURE (Status))
25584898bea4SSascha Wildner     {
25594898bea4SSascha Wildner         return (Status);
25604898bea4SSascha Wildner     }
25614898bea4SSascha Wildner 
25624898bea4SSascha Wildner     ParentTable = DtPeekSubtable ();
25634898bea4SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
25644898bea4SSascha Wildner 
25654898bea4SSascha Wildner     /* Compile each subtable */
25664898bea4SSascha Wildner 
25674898bea4SSascha Wildner     while (*PFieldList)
25684898bea4SSascha Wildner     {
25694898bea4SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl0,
25704898bea4SSascha Wildner             &Subtable);
25714898bea4SSascha Wildner         if (ACPI_FAILURE (Status))
25724898bea4SSascha Wildner         {
25734898bea4SSascha Wildner             return (Status);
25744898bea4SSascha Wildner         }
25754898bea4SSascha Wildner 
25764898bea4SSascha Wildner         ParentTable = DtPeekSubtable ();
25774898bea4SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
25784898bea4SSascha Wildner     }
25794898bea4SSascha Wildner 
25804898bea4SSascha Wildner     return (AE_OK);
25814898bea4SSascha Wildner }
25824898bea4SSascha Wildner 
25834898bea4SSascha Wildner 
2584820c5b08SSascha Wildner /******************************************************************************
2585820c5b08SSascha Wildner  *
2586820c5b08SSascha Wildner  * FUNCTION:    DtCompileTcpa
2587820c5b08SSascha Wildner  *
2588820c5b08SSascha Wildner  * PARAMETERS:  PFieldList          - Current field list pointer
2589820c5b08SSascha Wildner  *
2590820c5b08SSascha Wildner  * RETURN:      Status
2591820c5b08SSascha Wildner  *
2592820c5b08SSascha Wildner  * DESCRIPTION: Compile TCPA.
2593820c5b08SSascha Wildner  *
2594820c5b08SSascha Wildner  *****************************************************************************/
2595820c5b08SSascha Wildner 
2596820c5b08SSascha Wildner ACPI_STATUS
DtCompileTcpa(void ** List)2597820c5b08SSascha Wildner DtCompileTcpa (
2598820c5b08SSascha Wildner     void                    **List)
2599820c5b08SSascha Wildner {
2600820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2601820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
2602820c5b08SSascha Wildner     ACPI_TABLE_TCPA_HDR     *TcpaHeader;
2603820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
2604820c5b08SSascha Wildner     ACPI_STATUS             Status;
2605820c5b08SSascha Wildner 
2606820c5b08SSascha Wildner 
2607820c5b08SSascha Wildner     /* Compile the main table */
2608820c5b08SSascha Wildner 
2609820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaHdr,
26107bcb6cafSSascha Wildner         &Subtable);
2611820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
2612820c5b08SSascha Wildner     {
2613820c5b08SSascha Wildner         return (Status);
2614820c5b08SSascha Wildner     }
2615820c5b08SSascha Wildner 
2616820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
2617820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
2618820c5b08SSascha Wildner 
2619820c5b08SSascha Wildner     /*
2620820c5b08SSascha Wildner      * Examine the PlatformClass field to determine the table type.
2621820c5b08SSascha Wildner      * Either a client or server table. Only one.
2622820c5b08SSascha Wildner      */
2623820c5b08SSascha Wildner     TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer);
2624820c5b08SSascha Wildner 
2625820c5b08SSascha Wildner     switch (TcpaHeader->PlatformClass)
2626820c5b08SSascha Wildner     {
2627820c5b08SSascha Wildner     case ACPI_TCPA_CLIENT_TABLE:
2628820c5b08SSascha Wildner 
2629820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaClient,
26307bcb6cafSSascha Wildner             &Subtable);
2631820c5b08SSascha Wildner         break;
2632820c5b08SSascha Wildner 
2633820c5b08SSascha Wildner     case ACPI_TCPA_SERVER_TABLE:
2634820c5b08SSascha Wildner 
2635820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaServer,
26367bcb6cafSSascha Wildner             &Subtable);
2637820c5b08SSascha Wildner         break;
2638820c5b08SSascha Wildner 
2639820c5b08SSascha Wildner     default:
2640820c5b08SSascha Wildner 
2641820c5b08SSascha Wildner         AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
2642820c5b08SSascha Wildner             TcpaHeader->PlatformClass);
2643820c5b08SSascha Wildner         Status = AE_ERROR;
2644820c5b08SSascha Wildner         break;
2645820c5b08SSascha Wildner     }
2646820c5b08SSascha Wildner 
2647820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
2648820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
2649820c5b08SSascha Wildner     return (Status);
2650820c5b08SSascha Wildner }
2651820c5b08SSascha Wildner 
2652820c5b08SSascha Wildner 
2653820c5b08SSascha Wildner /******************************************************************************
2654820c5b08SSascha Wildner  *
26556721db86SSascha Wildner  * FUNCTION:    DtCompileTpm2Rev3
26566721db86SSascha Wildner  *
26576721db86SSascha Wildner  * PARAMETERS:  PFieldList          - Current field list pointer
26586721db86SSascha Wildner  *
26596721db86SSascha Wildner  * RETURN:      Status
26606721db86SSascha Wildner  *
26616721db86SSascha Wildner  * DESCRIPTION: Compile TPM2 revision 3
26626721db86SSascha Wildner  *
26636721db86SSascha Wildner  *****************************************************************************/
26646721db86SSascha Wildner static ACPI_STATUS
DtCompileTpm2Rev3(void ** List)26656721db86SSascha Wildner DtCompileTpm2Rev3 (
26666721db86SSascha Wildner     void                    **List)
26676721db86SSascha Wildner {
26686721db86SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
26696721db86SSascha Wildner     DT_SUBTABLE             *Subtable;
26706721db86SSascha Wildner     ACPI_TABLE_TPM23        *Tpm23Header;
26716721db86SSascha Wildner     DT_SUBTABLE             *ParentTable;
26726721db86SSascha Wildner     ACPI_STATUS             Status = AE_OK;
26736721db86SSascha Wildner 
26746721db86SSascha Wildner 
26756721db86SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23,
26766721db86SSascha Wildner         &Subtable);
26776721db86SSascha Wildner 
26786721db86SSascha Wildner     ParentTable = DtPeekSubtable ();
26796721db86SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
26806721db86SSascha Wildner     Tpm23Header = ACPI_CAST_PTR (ACPI_TABLE_TPM23, ParentTable->Buffer);
26816721db86SSascha Wildner 
26826721db86SSascha Wildner     /* Subtable type depends on the StartMethod */
26836721db86SSascha Wildner 
26846721db86SSascha Wildner     switch (Tpm23Header->StartMethod)
26856721db86SSascha Wildner     {
26866721db86SSascha Wildner     case ACPI_TPM23_ACPI_START_METHOD:
26876721db86SSascha Wildner 
26886721db86SSascha Wildner         /* Subtable specific to to ARM_SMC */
26896721db86SSascha Wildner 
26906721db86SSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23a,
26916721db86SSascha Wildner             &Subtable);
26926721db86SSascha Wildner         if (ACPI_FAILURE (Status))
26936721db86SSascha Wildner         {
26946721db86SSascha Wildner             return (Status);
26956721db86SSascha Wildner         }
26966721db86SSascha Wildner 
26976721db86SSascha Wildner         ParentTable = DtPeekSubtable ();
26986721db86SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
26996721db86SSascha Wildner         break;
27006721db86SSascha Wildner 
27016721db86SSascha Wildner     default:
27026721db86SSascha Wildner         break;
27036721db86SSascha Wildner     }
27046721db86SSascha Wildner 
27056721db86SSascha Wildner     return (Status);
27066721db86SSascha Wildner }
27076721db86SSascha Wildner 
27086721db86SSascha Wildner 
27096721db86SSascha Wildner /******************************************************************************
27106721db86SSascha Wildner  *
27117bcb6cafSSascha Wildner  * FUNCTION:    DtCompileTpm2
27127bcb6cafSSascha Wildner  *
27137bcb6cafSSascha Wildner  * PARAMETERS:  PFieldList          - Current field list pointer
27147bcb6cafSSascha Wildner  *
27157bcb6cafSSascha Wildner  * RETURN:      Status
27167bcb6cafSSascha Wildner  *
27177bcb6cafSSascha Wildner  * DESCRIPTION: Compile TPM2.
27187bcb6cafSSascha Wildner  *
27197bcb6cafSSascha Wildner  *****************************************************************************/
27207bcb6cafSSascha Wildner 
27217bcb6cafSSascha Wildner ACPI_STATUS
DtCompileTpm2(void ** List)27227bcb6cafSSascha Wildner DtCompileTpm2 (
27237bcb6cafSSascha Wildner     void                    **List)
27247bcb6cafSSascha Wildner {
27257bcb6cafSSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
27267bcb6cafSSascha Wildner     DT_SUBTABLE             *Subtable;
27277bcb6cafSSascha Wildner     ACPI_TABLE_TPM2         *Tpm2Header;
27287bcb6cafSSascha Wildner     DT_SUBTABLE             *ParentTable;
27297bcb6cafSSascha Wildner     ACPI_STATUS             Status = AE_OK;
27306721db86SSascha Wildner     ACPI_TABLE_HEADER       *Header;
27317bcb6cafSSascha Wildner 
27327bcb6cafSSascha Wildner 
27336721db86SSascha Wildner     ParentTable = DtPeekSubtable ();
27346721db86SSascha Wildner 
27356721db86SSascha Wildner     Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
27366721db86SSascha Wildner 
27376721db86SSascha Wildner     if (Header->Revision == 3)
27386721db86SSascha Wildner     {
27396721db86SSascha Wildner         return (DtCompileTpm2Rev3 (List));
27406721db86SSascha Wildner     }
27416721db86SSascha Wildner 
27427bcb6cafSSascha Wildner     /* Compile the main table */
27437bcb6cafSSascha Wildner 
27447bcb6cafSSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2,
27457bcb6cafSSascha Wildner         &Subtable);
27467bcb6cafSSascha Wildner     if (ACPI_FAILURE (Status))
27477bcb6cafSSascha Wildner     {
27487bcb6cafSSascha Wildner         return (Status);
27497bcb6cafSSascha Wildner     }
27507bcb6cafSSascha Wildner 
27517bcb6cafSSascha Wildner     ParentTable = DtPeekSubtable ();
27527bcb6cafSSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
27537bcb6cafSSascha Wildner 
27547bcb6cafSSascha Wildner     Tpm2Header = ACPI_CAST_PTR (ACPI_TABLE_TPM2, ParentTable->Buffer);
27557bcb6cafSSascha Wildner 
27567bcb6cafSSascha Wildner     /* Method parameters */
27577bcb6cafSSascha Wildner     /* Optional: Log area minimum length */
27587bcb6cafSSascha Wildner     /* Optional: Log area start address */
27597bcb6cafSSascha Wildner     /* TBD: Optional fields above not fully implemented (not optional at this time) */
27607bcb6cafSSascha Wildner 
27617bcb6cafSSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2a,
27627bcb6cafSSascha Wildner         &Subtable);
27637bcb6cafSSascha Wildner     if (ACPI_FAILURE (Status))
27647bcb6cafSSascha Wildner     {
27657bcb6cafSSascha Wildner         return (Status);
27667bcb6cafSSascha Wildner     }
27677bcb6cafSSascha Wildner 
27687bcb6cafSSascha Wildner     ParentTable = DtPeekSubtable ();
27697bcb6cafSSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
27707bcb6cafSSascha Wildner 
27717bcb6cafSSascha Wildner 
27727bcb6cafSSascha Wildner     /* Subtable type depends on the StartMethod */
27737bcb6cafSSascha Wildner 
27747bcb6cafSSascha Wildner     switch (Tpm2Header->StartMethod)
27757bcb6cafSSascha Wildner     {
27767bcb6cafSSascha Wildner     case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC:
27777bcb6cafSSascha Wildner 
27787bcb6cafSSascha Wildner         /* Subtable specific to to ARM_SMC */
27797bcb6cafSSascha Wildner 
27807bcb6cafSSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm211,
27817bcb6cafSSascha Wildner             &Subtable);
27827bcb6cafSSascha Wildner         if (ACPI_FAILURE (Status))
27837bcb6cafSSascha Wildner         {
27847bcb6cafSSascha Wildner             return (Status);
27857bcb6cafSSascha Wildner         }
27867bcb6cafSSascha Wildner 
27877bcb6cafSSascha Wildner         ParentTable = DtPeekSubtable ();
27887bcb6cafSSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
27897bcb6cafSSascha Wildner         break;
27907bcb6cafSSascha Wildner 
27917bcb6cafSSascha Wildner     case ACPI_TPM2_START_METHOD:
27927bcb6cafSSascha Wildner     case ACPI_TPM2_MEMORY_MAPPED:
27937bcb6cafSSascha Wildner     case ACPI_TPM2_COMMAND_BUFFER:
27947bcb6cafSSascha Wildner     case ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD:
27957bcb6cafSSascha Wildner         break;
27967bcb6cafSSascha Wildner 
27977bcb6cafSSascha Wildner     case ACPI_TPM2_RESERVED1:
27987bcb6cafSSascha Wildner     case ACPI_TPM2_RESERVED3:
27997bcb6cafSSascha Wildner     case ACPI_TPM2_RESERVED4:
28007bcb6cafSSascha Wildner     case ACPI_TPM2_RESERVED5:
28017bcb6cafSSascha Wildner     case ACPI_TPM2_RESERVED9:
28027bcb6cafSSascha Wildner     case ACPI_TPM2_RESERVED10:
28037bcb6cafSSascha Wildner 
28047bcb6cafSSascha Wildner         AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n",
28057bcb6cafSSascha Wildner             Tpm2Header->StartMethod);
28067bcb6cafSSascha Wildner         Status = AE_ERROR;
28077bcb6cafSSascha Wildner         break;
28087bcb6cafSSascha Wildner 
28097bcb6cafSSascha Wildner     case ACPI_TPM2_NOT_ALLOWED:
28107bcb6cafSSascha Wildner     default:
28117bcb6cafSSascha Wildner 
28127bcb6cafSSascha Wildner         AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n",
28137bcb6cafSSascha Wildner             Tpm2Header->StartMethod);
28147bcb6cafSSascha Wildner         Status = AE_ERROR;
28157bcb6cafSSascha Wildner         break;
28167bcb6cafSSascha Wildner     }
28177bcb6cafSSascha Wildner 
28187bcb6cafSSascha Wildner     return (Status);
28197bcb6cafSSascha Wildner }
28207bcb6cafSSascha Wildner 
28217bcb6cafSSascha Wildner 
28227bcb6cafSSascha Wildner /******************************************************************************
28237bcb6cafSSascha Wildner  *
2824820c5b08SSascha Wildner  * FUNCTION:    DtGetGenericTableInfo
2825820c5b08SSascha Wildner  *
2826820c5b08SSascha Wildner  * PARAMETERS:  Name                - Generic type name
2827820c5b08SSascha Wildner  *
2828820c5b08SSascha Wildner  * RETURN:      Info entry
2829820c5b08SSascha Wildner  *
2830820c5b08SSascha Wildner  * DESCRIPTION: Obtain table info for a generic name entry
2831820c5b08SSascha Wildner  *
2832820c5b08SSascha Wildner  *****************************************************************************/
2833820c5b08SSascha Wildner 
2834820c5b08SSascha Wildner ACPI_DMTABLE_INFO *
DtGetGenericTableInfo(char * Name)2835820c5b08SSascha Wildner DtGetGenericTableInfo (
2836820c5b08SSascha Wildner     char                    *Name)
2837820c5b08SSascha Wildner {
2838820c5b08SSascha Wildner     ACPI_DMTABLE_INFO       *Info;
2839820c5b08SSascha Wildner     UINT32                  i;
2840820c5b08SSascha Wildner 
2841820c5b08SSascha Wildner 
2842820c5b08SSascha Wildner     if (!Name)
2843820c5b08SSascha Wildner     {
2844820c5b08SSascha Wildner         return (NULL);
2845820c5b08SSascha Wildner     }
2846820c5b08SSascha Wildner 
2847820c5b08SSascha Wildner     /* Search info table for name match */
2848820c5b08SSascha Wildner 
2849820c5b08SSascha Wildner     for (i = 0; ; i++)
2850820c5b08SSascha Wildner     {
2851820c5b08SSascha Wildner         Info = AcpiDmTableInfoGeneric[i];
2852820c5b08SSascha Wildner         if (Info->Opcode == ACPI_DMT_EXIT)
2853820c5b08SSascha Wildner         {
2854820c5b08SSascha Wildner             Info = NULL;
2855820c5b08SSascha Wildner             break;
2856820c5b08SSascha Wildner         }
2857820c5b08SSascha Wildner 
2858820c5b08SSascha Wildner         /* Use caseless compare for generic keywords */
2859820c5b08SSascha Wildner 
2860820c5b08SSascha Wildner         if (!AcpiUtStricmp (Name, Info->Name))
2861820c5b08SSascha Wildner         {
2862820c5b08SSascha Wildner             break;
2863820c5b08SSascha Wildner         }
2864820c5b08SSascha Wildner     }
2865820c5b08SSascha Wildner 
2866820c5b08SSascha Wildner     return (Info);
2867820c5b08SSascha Wildner }
2868820c5b08SSascha Wildner 
2869820c5b08SSascha Wildner 
2870820c5b08SSascha Wildner /******************************************************************************
2871820c5b08SSascha Wildner  *
2872820c5b08SSascha Wildner  * FUNCTION:    DtCompileUefi
2873820c5b08SSascha Wildner  *
2874820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
2875820c5b08SSascha Wildner  *
2876820c5b08SSascha Wildner  * RETURN:      Status
2877820c5b08SSascha Wildner  *
2878820c5b08SSascha Wildner  * DESCRIPTION: Compile UEFI.
2879820c5b08SSascha Wildner  *
2880820c5b08SSascha Wildner  *****************************************************************************/
2881820c5b08SSascha Wildner 
2882820c5b08SSascha Wildner ACPI_STATUS
DtCompileUefi(void ** List)2883820c5b08SSascha Wildner DtCompileUefi (
2884820c5b08SSascha Wildner     void                    **List)
2885820c5b08SSascha Wildner {
2886820c5b08SSascha Wildner     ACPI_STATUS             Status;
2887820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
2888820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
2889820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2890820c5b08SSascha Wildner     UINT16                  *DataOffset;
2891820c5b08SSascha Wildner 
2892820c5b08SSascha Wildner 
2893820c5b08SSascha Wildner     /* Compile the predefined portion of the UEFI table */
2894820c5b08SSascha Wildner 
2895820c5b08SSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
28967bcb6cafSSascha Wildner         &Subtable);
2897820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
2898820c5b08SSascha Wildner     {
2899820c5b08SSascha Wildner         return (Status);
2900820c5b08SSascha Wildner     }
2901820c5b08SSascha Wildner 
2902820c5b08SSascha Wildner     DataOffset = (UINT16 *) (Subtable->Buffer + 16);
2903820c5b08SSascha Wildner     *DataOffset = sizeof (ACPI_TABLE_UEFI);
2904820c5b08SSascha Wildner 
2905820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
2906820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
2907820c5b08SSascha Wildner 
2908820c5b08SSascha Wildner     /*
2909820c5b08SSascha Wildner      * Compile the "generic" portion of the UEFI table. This
2910820c5b08SSascha Wildner      * part of the table is not predefined and any of the generic
2911820c5b08SSascha Wildner      * operators may be used.
2912820c5b08SSascha Wildner      */
2913820c5b08SSascha Wildner     DtCompileGeneric ((void **) PFieldList, NULL, NULL);
2914820c5b08SSascha Wildner     return (AE_OK);
2915820c5b08SSascha Wildner }
2916820c5b08SSascha Wildner 
2917820c5b08SSascha Wildner 
2918820c5b08SSascha Wildner /******************************************************************************
2919820c5b08SSascha Wildner  *
292001d5d5dfSSascha Wildner  * FUNCTION:    DtCompileViot
292101d5d5dfSSascha Wildner  *
292201d5d5dfSSascha Wildner  * PARAMETERS:  List                - Current field list pointer
292301d5d5dfSSascha Wildner  *
292401d5d5dfSSascha Wildner  * RETURN:      Status
292501d5d5dfSSascha Wildner  *
292601d5d5dfSSascha Wildner  * DESCRIPTION: Compile VIOT.
292701d5d5dfSSascha Wildner  *
292801d5d5dfSSascha Wildner  *****************************************************************************/
292901d5d5dfSSascha Wildner 
293001d5d5dfSSascha Wildner ACPI_STATUS
DtCompileViot(void ** List)293101d5d5dfSSascha Wildner DtCompileViot (
293201d5d5dfSSascha Wildner     void                    **List)
293301d5d5dfSSascha Wildner {
293401d5d5dfSSascha Wildner     ACPI_STATUS             Status;
293501d5d5dfSSascha Wildner     DT_SUBTABLE             *Subtable;
293601d5d5dfSSascha Wildner     DT_SUBTABLE             *ParentTable;
293701d5d5dfSSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
293801d5d5dfSSascha Wildner     DT_FIELD                *SubtableStart;
293901d5d5dfSSascha Wildner     ACPI_TABLE_VIOT         *Viot;
294001d5d5dfSSascha Wildner     ACPI_VIOT_HEADER        *ViotHeader;
294101d5d5dfSSascha Wildner     ACPI_DMTABLE_INFO       *InfoTable;
294201d5d5dfSSascha Wildner     UINT16                  NodeCount;
294301d5d5dfSSascha Wildner 
294401d5d5dfSSascha Wildner     ParentTable = DtPeekSubtable ();
294501d5d5dfSSascha Wildner 
294601d5d5dfSSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoViot, &Subtable);
294701d5d5dfSSascha Wildner     if (ACPI_FAILURE (Status))
294801d5d5dfSSascha Wildner     {
294901d5d5dfSSascha Wildner         return (Status);
295001d5d5dfSSascha Wildner     }
295101d5d5dfSSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
295201d5d5dfSSascha Wildner 
295301d5d5dfSSascha Wildner     /*
295401d5d5dfSSascha Wildner      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
295501d5d5dfSSascha Wildner      * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
295601d5d5dfSSascha Wildner      */
295701d5d5dfSSascha Wildner     Viot = ACPI_SUB_PTR (ACPI_TABLE_VIOT, Subtable->Buffer,
295801d5d5dfSSascha Wildner         sizeof (ACPI_TABLE_HEADER));
295901d5d5dfSSascha Wildner 
296001d5d5dfSSascha Wildner     Viot->NodeOffset = sizeof (ACPI_TABLE_VIOT);
296101d5d5dfSSascha Wildner 
296201d5d5dfSSascha Wildner     NodeCount = 0;
296301d5d5dfSSascha Wildner     while (*PFieldList) {
296401d5d5dfSSascha Wildner         SubtableStart = *PFieldList;
296501d5d5dfSSascha Wildner         Status = DtCompileTable (PFieldList, AcpiDmTableInfoViotHeader,
296601d5d5dfSSascha Wildner             &Subtable);
296701d5d5dfSSascha Wildner         if (ACPI_FAILURE (Status))
296801d5d5dfSSascha Wildner         {
296901d5d5dfSSascha Wildner             return (Status);
297001d5d5dfSSascha Wildner         }
297101d5d5dfSSascha Wildner 
297201d5d5dfSSascha Wildner         ParentTable = DtPeekSubtable ();
297301d5d5dfSSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
297401d5d5dfSSascha Wildner         DtPushSubtable (Subtable);
297501d5d5dfSSascha Wildner 
297601d5d5dfSSascha Wildner         ViotHeader = ACPI_CAST_PTR (ACPI_VIOT_HEADER, Subtable->Buffer);
297701d5d5dfSSascha Wildner 
297801d5d5dfSSascha Wildner         switch (ViotHeader->Type)
297901d5d5dfSSascha Wildner         {
298001d5d5dfSSascha Wildner         case ACPI_VIOT_NODE_PCI_RANGE:
298101d5d5dfSSascha Wildner 
298201d5d5dfSSascha Wildner             InfoTable = AcpiDmTableInfoViot1;
298301d5d5dfSSascha Wildner             break;
298401d5d5dfSSascha Wildner 
298501d5d5dfSSascha Wildner         case ACPI_VIOT_NODE_MMIO:
298601d5d5dfSSascha Wildner 
298701d5d5dfSSascha Wildner             InfoTable = AcpiDmTableInfoViot2;
298801d5d5dfSSascha Wildner             break;
298901d5d5dfSSascha Wildner 
299001d5d5dfSSascha Wildner         case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI:
299101d5d5dfSSascha Wildner 
299201d5d5dfSSascha Wildner             InfoTable = AcpiDmTableInfoViot3;
299301d5d5dfSSascha Wildner             break;
299401d5d5dfSSascha Wildner 
299501d5d5dfSSascha Wildner         case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO:
299601d5d5dfSSascha Wildner 
299701d5d5dfSSascha Wildner             InfoTable = AcpiDmTableInfoViot4;
299801d5d5dfSSascha Wildner             break;
299901d5d5dfSSascha Wildner 
300001d5d5dfSSascha Wildner         default:
300101d5d5dfSSascha Wildner 
300201d5d5dfSSascha Wildner             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "VIOT");
300301d5d5dfSSascha Wildner             return (AE_ERROR);
300401d5d5dfSSascha Wildner         }
300501d5d5dfSSascha Wildner 
300601d5d5dfSSascha Wildner         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
300701d5d5dfSSascha Wildner         if (ACPI_FAILURE (Status))
300801d5d5dfSSascha Wildner         {
300901d5d5dfSSascha Wildner             return (Status);
301001d5d5dfSSascha Wildner         }
301101d5d5dfSSascha Wildner 
301201d5d5dfSSascha Wildner         ParentTable = DtPeekSubtable ();
301301d5d5dfSSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
301401d5d5dfSSascha Wildner         DtPopSubtable ();
301501d5d5dfSSascha Wildner         NodeCount++;
301601d5d5dfSSascha Wildner     }
301701d5d5dfSSascha Wildner 
301801d5d5dfSSascha Wildner     Viot->NodeCount = NodeCount;
301901d5d5dfSSascha Wildner     return (AE_OK);
302001d5d5dfSSascha Wildner }
302101d5d5dfSSascha Wildner 
302201d5d5dfSSascha Wildner 
302301d5d5dfSSascha Wildner /******************************************************************************
302401d5d5dfSSascha Wildner  *
3025820c5b08SSascha Wildner  * FUNCTION:    DtCompileWdat
3026820c5b08SSascha Wildner  *
3027820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
3028820c5b08SSascha Wildner  *
3029820c5b08SSascha Wildner  * RETURN:      Status
3030820c5b08SSascha Wildner  *
3031820c5b08SSascha Wildner  * DESCRIPTION: Compile WDAT.
3032820c5b08SSascha Wildner  *
3033820c5b08SSascha Wildner  *****************************************************************************/
3034820c5b08SSascha Wildner 
3035820c5b08SSascha Wildner ACPI_STATUS
DtCompileWdat(void ** List)3036820c5b08SSascha Wildner DtCompileWdat (
3037820c5b08SSascha Wildner     void                    **List)
3038820c5b08SSascha Wildner {
3039820c5b08SSascha Wildner     ACPI_STATUS             Status;
3040820c5b08SSascha Wildner 
3041820c5b08SSascha Wildner 
3042820c5b08SSascha Wildner     Status = DtCompileTwoSubtables (List,
3043820c5b08SSascha Wildner         AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
3044820c5b08SSascha Wildner     return (Status);
3045820c5b08SSascha Wildner }
3046820c5b08SSascha Wildner 
3047820c5b08SSascha Wildner 
3048820c5b08SSascha Wildner /******************************************************************************
3049820c5b08SSascha Wildner  *
3050820c5b08SSascha Wildner  * FUNCTION:    DtCompileWpbt
3051820c5b08SSascha Wildner  *
3052820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
3053820c5b08SSascha Wildner  *
3054820c5b08SSascha Wildner  * RETURN:      Status
3055820c5b08SSascha Wildner  *
3056820c5b08SSascha Wildner  * DESCRIPTION: Compile WPBT.
3057820c5b08SSascha Wildner  *
3058820c5b08SSascha Wildner  *****************************************************************************/
3059820c5b08SSascha Wildner 
3060820c5b08SSascha Wildner ACPI_STATUS
DtCompileWpbt(void ** List)3061820c5b08SSascha Wildner DtCompileWpbt (
3062820c5b08SSascha Wildner     void                    **List)
3063820c5b08SSascha Wildner {
3064820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
3065820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
3066820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
3067820c5b08SSascha Wildner     ACPI_TABLE_WPBT         *Table;
3068820c5b08SSascha Wildner     ACPI_STATUS             Status;
3069820c5b08SSascha Wildner 
3070820c5b08SSascha Wildner 
3071820c5b08SSascha Wildner     /* Compile the main table */
3072820c5b08SSascha Wildner 
30730672a19bSSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt, &Subtable);
3074820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
3075820c5b08SSascha Wildner     {
3076820c5b08SSascha Wildner         return (Status);
3077820c5b08SSascha Wildner     }
3078820c5b08SSascha Wildner 
3079820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
3080820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
30810672a19bSSascha Wildner     Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer);
30820672a19bSSascha Wildner 
30830672a19bSSascha Wildner     /*
30840672a19bSSascha Wildner      * Exit now if there are no arguments specified. This is indicated by:
30850672a19bSSascha Wildner      * The "Command-line Arguments" field has not been specified (if specified,
30860672a19bSSascha Wildner      * it will be the last field in the field list -- after the main table).
30870672a19bSSascha Wildner      * Set the Argument Length in the main table to zero.
30880672a19bSSascha Wildner      */
30890672a19bSSascha Wildner     if (!*PFieldList)
30900672a19bSSascha Wildner     {
30910672a19bSSascha Wildner         Table->ArgumentsLength = 0;
30920672a19bSSascha Wildner         return (AE_OK);
30930672a19bSSascha Wildner     }
3094820c5b08SSascha Wildner 
3095820c5b08SSascha Wildner     /* Compile the argument list subtable */
3096820c5b08SSascha Wildner 
30970672a19bSSascha Wildner     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0, &Subtable);
3098820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
3099820c5b08SSascha Wildner     {
3100820c5b08SSascha Wildner         return (Status);
3101820c5b08SSascha Wildner     }
3102820c5b08SSascha Wildner 
3103820c5b08SSascha Wildner     /* Extract the length of the Arguments buffer, insert into main table */
3104820c5b08SSascha Wildner 
31050672a19bSSascha Wildner     Table->ArgumentsLength = (UINT16) Subtable->TotalLength;
3106820c5b08SSascha Wildner     DtInsertSubtable (ParentTable, Subtable);
3107820c5b08SSascha Wildner     return (AE_OK);
3108820c5b08SSascha Wildner }
3109820c5b08SSascha Wildner 
3110820c5b08SSascha Wildner 
3111820c5b08SSascha Wildner /******************************************************************************
3112820c5b08SSascha Wildner  *
3113820c5b08SSascha Wildner  * FUNCTION:    DtCompileXsdt
3114820c5b08SSascha Wildner  *
3115820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
3116820c5b08SSascha Wildner  *
3117820c5b08SSascha Wildner  * RETURN:      Status
3118820c5b08SSascha Wildner  *
3119820c5b08SSascha Wildner  * DESCRIPTION: Compile XSDT.
3120820c5b08SSascha Wildner  *
3121820c5b08SSascha Wildner  *****************************************************************************/
3122820c5b08SSascha Wildner 
3123820c5b08SSascha Wildner ACPI_STATUS
DtCompileXsdt(void ** List)3124820c5b08SSascha Wildner DtCompileXsdt (
3125820c5b08SSascha Wildner     void                    **List)
3126820c5b08SSascha Wildner {
3127820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
3128820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
3129820c5b08SSascha Wildner     DT_FIELD                *FieldList = *(DT_FIELD **) List;
3130820c5b08SSascha Wildner     UINT64                  Address;
3131820c5b08SSascha Wildner 
3132820c5b08SSascha Wildner 
3133820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
3134820c5b08SSascha Wildner 
3135820c5b08SSascha Wildner     while (FieldList)
3136820c5b08SSascha Wildner     {
3137820c5b08SSascha Wildner         DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
3138820c5b08SSascha Wildner 
3139820c5b08SSascha Wildner         DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
3140820c5b08SSascha Wildner         DtInsertSubtable (ParentTable, Subtable);
3141820c5b08SSascha Wildner         FieldList = FieldList->Next;
3142820c5b08SSascha Wildner     }
3143820c5b08SSascha Wildner 
3144820c5b08SSascha Wildner     return (AE_OK);
3145820c5b08SSascha Wildner }
3146820c5b08SSascha Wildner 
3147820c5b08SSascha Wildner 
3148820c5b08SSascha Wildner /******************************************************************************
3149820c5b08SSascha Wildner  *
3150820c5b08SSascha Wildner  * FUNCTION:    DtCompileGeneric
3151820c5b08SSascha Wildner  *
3152820c5b08SSascha Wildner  * PARAMETERS:  List                - Current field list pointer
3153820c5b08SSascha Wildner  *              Name                - Field name to end generic compiling
3154820c5b08SSascha Wildner  *              Length              - Compiled table length to return
3155820c5b08SSascha Wildner  *
3156820c5b08SSascha Wildner  * RETURN:      Status
3157820c5b08SSascha Wildner  *
3158820c5b08SSascha Wildner  * DESCRIPTION: Compile generic unknown table.
3159820c5b08SSascha Wildner  *
3160820c5b08SSascha Wildner  *****************************************************************************/
3161820c5b08SSascha Wildner 
3162820c5b08SSascha Wildner ACPI_STATUS
DtCompileGeneric(void ** List,char * Name,UINT32 * Length)3163820c5b08SSascha Wildner DtCompileGeneric (
3164820c5b08SSascha Wildner     void                    **List,
3165820c5b08SSascha Wildner     char                    *Name,
3166820c5b08SSascha Wildner     UINT32                  *Length)
3167820c5b08SSascha Wildner {
3168820c5b08SSascha Wildner     ACPI_STATUS             Status;
3169820c5b08SSascha Wildner     DT_SUBTABLE             *Subtable;
3170820c5b08SSascha Wildner     DT_SUBTABLE             *ParentTable;
3171820c5b08SSascha Wildner     DT_FIELD                **PFieldList = (DT_FIELD **) List;
3172820c5b08SSascha Wildner     ACPI_DMTABLE_INFO       *Info;
3173820c5b08SSascha Wildner 
3174820c5b08SSascha Wildner 
3175820c5b08SSascha Wildner     ParentTable = DtPeekSubtable ();
3176820c5b08SSascha Wildner 
3177820c5b08SSascha Wildner     /*
3178820c5b08SSascha Wildner      * Compile the "generic" portion of the table. This
3179820c5b08SSascha Wildner      * part of the table is not predefined and any of the generic
3180820c5b08SSascha Wildner      * operators may be used.
3181820c5b08SSascha Wildner      */
3182820c5b08SSascha Wildner 
3183820c5b08SSascha Wildner     /* Find any and all labels in the entire generic portion */
3184820c5b08SSascha Wildner 
3185820c5b08SSascha Wildner     DtDetectAllLabels (*PFieldList);
3186820c5b08SSascha Wildner 
3187820c5b08SSascha Wildner     /* Now we can actually compile the parse tree */
3188820c5b08SSascha Wildner 
3189820c5b08SSascha Wildner     if (Length && *Length)
3190820c5b08SSascha Wildner     {
3191820c5b08SSascha Wildner         *Length = 0;
3192820c5b08SSascha Wildner     }
3193820c5b08SSascha Wildner     while (*PFieldList)
3194820c5b08SSascha Wildner     {
3195820c5b08SSascha Wildner         if (Name && !strcmp ((*PFieldList)->Name, Name))
3196820c5b08SSascha Wildner         {
3197820c5b08SSascha Wildner             break;
3198820c5b08SSascha Wildner         }
3199820c5b08SSascha Wildner 
3200820c5b08SSascha Wildner         Info = DtGetGenericTableInfo ((*PFieldList)->Name);
3201820c5b08SSascha Wildner         if (!Info)
3202820c5b08SSascha Wildner         {
3203806343b9SSascha Wildner             sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
3204820c5b08SSascha Wildner                 (*PFieldList)->Name);
3205820c5b08SSascha Wildner             DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
3206806343b9SSascha Wildner                 (*PFieldList), AslGbl_MsgBuffer);
3207820c5b08SSascha Wildner 
3208820c5b08SSascha Wildner             *PFieldList = (*PFieldList)->Next;
3209820c5b08SSascha Wildner             continue;
3210820c5b08SSascha Wildner         }
3211820c5b08SSascha Wildner 
3212820c5b08SSascha Wildner         Status = DtCompileTable (PFieldList, Info,
32137bcb6cafSSascha Wildner             &Subtable);
3214820c5b08SSascha Wildner         if (ACPI_SUCCESS (Status))
3215820c5b08SSascha Wildner         {
3216820c5b08SSascha Wildner             DtInsertSubtable (ParentTable, Subtable);
3217820c5b08SSascha Wildner             if (Length)
3218820c5b08SSascha Wildner             {
3219820c5b08SSascha Wildner                 *Length += Subtable->Length;
3220820c5b08SSascha Wildner             }
3221820c5b08SSascha Wildner         }
3222820c5b08SSascha Wildner         else
3223820c5b08SSascha Wildner         {
3224820c5b08SSascha Wildner             *PFieldList = (*PFieldList)->Next;
3225820c5b08SSascha Wildner 
3226820c5b08SSascha Wildner             if (Status == AE_NOT_FOUND)
3227820c5b08SSascha Wildner             {
3228806343b9SSascha Wildner                 sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
3229820c5b08SSascha Wildner                     (*PFieldList)->Name);
3230820c5b08SSascha Wildner                 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
3231806343b9SSascha Wildner                     (*PFieldList), AslGbl_MsgBuffer);
3232820c5b08SSascha Wildner             }
3233820c5b08SSascha Wildner         }
3234820c5b08SSascha Wildner     }
3235820c5b08SSascha Wildner 
3236820c5b08SSascha Wildner     return (AE_OK);
3237820c5b08SSascha Wildner }
3238