xref: /freebsd/sys/contrib/dev/acpica/compiler/dttable.c (revision a88e22b7ad0a8400875be9c3d02d09d0a8010b9c)
1*a88e22b7SJung-uk Kim /******************************************************************************
2*a88e22b7SJung-uk Kim  *
3*a88e22b7SJung-uk Kim  * Module Name: dttable.c - handling for specific ACPI tables
4*a88e22b7SJung-uk Kim  *
5*a88e22b7SJung-uk Kim  *****************************************************************************/
6*a88e22b7SJung-uk Kim 
7*a88e22b7SJung-uk Kim /******************************************************************************
8*a88e22b7SJung-uk Kim  *
9*a88e22b7SJung-uk Kim  * 1. Copyright Notice
10*a88e22b7SJung-uk Kim  *
11*a88e22b7SJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
12*a88e22b7SJung-uk Kim  * All rights reserved.
13*a88e22b7SJung-uk Kim  *
14*a88e22b7SJung-uk Kim  * 2. License
15*a88e22b7SJung-uk Kim  *
16*a88e22b7SJung-uk Kim  * 2.1. This is your license from Intel Corp. under its intellectual property
17*a88e22b7SJung-uk Kim  * rights.  You may have additional license terms from the party that provided
18*a88e22b7SJung-uk Kim  * you this software, covering your right to use that party's intellectual
19*a88e22b7SJung-uk Kim  * property rights.
20*a88e22b7SJung-uk Kim  *
21*a88e22b7SJung-uk Kim  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22*a88e22b7SJung-uk Kim  * copy of the source code appearing in this file ("Covered Code") an
23*a88e22b7SJung-uk Kim  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24*a88e22b7SJung-uk Kim  * base code distributed originally by Intel ("Original Intel Code") to copy,
25*a88e22b7SJung-uk Kim  * make derivatives, distribute, use and display any portion of the Covered
26*a88e22b7SJung-uk Kim  * Code in any form, with the right to sublicense such rights; and
27*a88e22b7SJung-uk Kim  *
28*a88e22b7SJung-uk Kim  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29*a88e22b7SJung-uk Kim  * license (with the right to sublicense), under only those claims of Intel
30*a88e22b7SJung-uk Kim  * patents that are infringed by the Original Intel Code, to make, use, sell,
31*a88e22b7SJung-uk Kim  * offer to sell, and import the Covered Code and derivative works thereof
32*a88e22b7SJung-uk Kim  * solely to the minimum extent necessary to exercise the above copyright
33*a88e22b7SJung-uk Kim  * license, and in no event shall the patent license extend to any additions
34*a88e22b7SJung-uk Kim  * to or modifications of the Original Intel Code.  No other license or right
35*a88e22b7SJung-uk Kim  * is granted directly or by implication, estoppel or otherwise;
36*a88e22b7SJung-uk Kim  *
37*a88e22b7SJung-uk Kim  * The above copyright and patent license is granted only if the following
38*a88e22b7SJung-uk Kim  * conditions are met:
39*a88e22b7SJung-uk Kim  *
40*a88e22b7SJung-uk Kim  * 3. Conditions
41*a88e22b7SJung-uk Kim  *
42*a88e22b7SJung-uk Kim  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43*a88e22b7SJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
44*a88e22b7SJung-uk Kim  * Code or modification with rights to further distribute source must include
45*a88e22b7SJung-uk Kim  * the above Copyright Notice, the above License, this list of Conditions,
46*a88e22b7SJung-uk Kim  * and the following Disclaimer and Export Compliance provision.  In addition,
47*a88e22b7SJung-uk Kim  * Licensee must cause all Covered Code to which Licensee contributes to
48*a88e22b7SJung-uk Kim  * contain a file documenting the changes Licensee made to create that Covered
49*a88e22b7SJung-uk Kim  * Code and the date of any change.  Licensee must include in that file the
50*a88e22b7SJung-uk Kim  * documentation of any changes made by any predecessor Licensee.  Licensee
51*a88e22b7SJung-uk Kim  * must include a prominent statement that the modification is derived,
52*a88e22b7SJung-uk Kim  * directly or indirectly, from Original Intel Code.
53*a88e22b7SJung-uk Kim  *
54*a88e22b7SJung-uk Kim  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55*a88e22b7SJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
56*a88e22b7SJung-uk Kim  * Code or modification without rights to further distribute source must
57*a88e22b7SJung-uk Kim  * include the following Disclaimer and Export Compliance provision in the
58*a88e22b7SJung-uk Kim  * documentation and/or other materials provided with distribution.  In
59*a88e22b7SJung-uk Kim  * addition, Licensee may not authorize further sublicense of source of any
60*a88e22b7SJung-uk Kim  * portion of the Covered Code, and must include terms to the effect that the
61*a88e22b7SJung-uk Kim  * license from Licensee to its licensee is limited to the intellectual
62*a88e22b7SJung-uk Kim  * property embodied in the software Licensee provides to its licensee, and
63*a88e22b7SJung-uk Kim  * not to intellectual property embodied in modifications its licensee may
64*a88e22b7SJung-uk Kim  * make.
65*a88e22b7SJung-uk Kim  *
66*a88e22b7SJung-uk Kim  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67*a88e22b7SJung-uk Kim  * substantial portion of the Covered Code or modification must reproduce the
68*a88e22b7SJung-uk Kim  * above Copyright Notice, and the following Disclaimer and Export Compliance
69*a88e22b7SJung-uk Kim  * provision in the documentation and/or other materials provided with the
70*a88e22b7SJung-uk Kim  * distribution.
71*a88e22b7SJung-uk Kim  *
72*a88e22b7SJung-uk Kim  * 3.4. Intel retains all right, title, and interest in and to the Original
73*a88e22b7SJung-uk Kim  * Intel Code.
74*a88e22b7SJung-uk Kim  *
75*a88e22b7SJung-uk Kim  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76*a88e22b7SJung-uk Kim  * Intel shall be used in advertising or otherwise to promote the sale, use or
77*a88e22b7SJung-uk Kim  * other dealings in products derived from or relating to the Covered Code
78*a88e22b7SJung-uk Kim  * without prior written authorization from Intel.
79*a88e22b7SJung-uk Kim  *
80*a88e22b7SJung-uk Kim  * 4. Disclaimer and Export Compliance
81*a88e22b7SJung-uk Kim  *
82*a88e22b7SJung-uk Kim  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83*a88e22b7SJung-uk Kim  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84*a88e22b7SJung-uk Kim  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
85*a88e22b7SJung-uk Kim  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
86*a88e22b7SJung-uk Kim  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
87*a88e22b7SJung-uk Kim  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88*a88e22b7SJung-uk Kim  * PARTICULAR PURPOSE.
89*a88e22b7SJung-uk Kim  *
90*a88e22b7SJung-uk Kim  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91*a88e22b7SJung-uk Kim  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92*a88e22b7SJung-uk Kim  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93*a88e22b7SJung-uk Kim  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94*a88e22b7SJung-uk Kim  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95*a88e22b7SJung-uk Kim  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
96*a88e22b7SJung-uk Kim  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97*a88e22b7SJung-uk Kim  * LIMITED REMEDY.
98*a88e22b7SJung-uk Kim  *
99*a88e22b7SJung-uk Kim  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100*a88e22b7SJung-uk Kim  * software or system incorporating such software without first obtaining any
101*a88e22b7SJung-uk Kim  * required license or other approval from the U. S. Department of Commerce or
102*a88e22b7SJung-uk Kim  * any other agency or department of the United States Government.  In the
103*a88e22b7SJung-uk Kim  * event Licensee exports any such software from the United States or
104*a88e22b7SJung-uk Kim  * re-exports any such software from a foreign destination, Licensee shall
105*a88e22b7SJung-uk Kim  * ensure that the distribution and export/re-export of the software is in
106*a88e22b7SJung-uk Kim  * compliance with all laws, regulations, orders, or other restrictions of the
107*a88e22b7SJung-uk Kim  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108*a88e22b7SJung-uk Kim  * any of its subsidiaries will export/re-export any technical data, process,
109*a88e22b7SJung-uk Kim  * software, or service, directly or indirectly, to any country for which the
110*a88e22b7SJung-uk Kim  * United States government or any agency thereof requires an export license,
111*a88e22b7SJung-uk Kim  * other governmental approval, or letter of assurance, without first obtaining
112*a88e22b7SJung-uk Kim  * such license, approval or letter.
113*a88e22b7SJung-uk Kim  *
114*a88e22b7SJung-uk Kim  *****************************************************************************/
115*a88e22b7SJung-uk Kim 
116*a88e22b7SJung-uk Kim #define __DTTABLE_C__
117*a88e22b7SJung-uk Kim 
118*a88e22b7SJung-uk Kim /* Compile all complex data tables */
119*a88e22b7SJung-uk Kim 
120*a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
121*a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h>
122*a88e22b7SJung-uk Kim 
123*a88e22b7SJung-uk Kim #define _COMPONENT          DT_COMPILER
124*a88e22b7SJung-uk Kim         ACPI_MODULE_NAME    ("dttable")
125*a88e22b7SJung-uk Kim 
126*a88e22b7SJung-uk Kim 
127*a88e22b7SJung-uk Kim /* TBD: merge these into dmtbinfo.c? */
128*a88e22b7SJung-uk Kim 
129*a88e22b7SJung-uk Kim static ACPI_DMTABLE_INFO           TableInfoAsfAddress[] =
130*a88e22b7SJung-uk Kim {
131*a88e22b7SJung-uk Kim     {ACPI_DMT_BUFFER,   0,               "Addresses", 0},
132*a88e22b7SJung-uk Kim     {ACPI_DMT_EXIT,     0,               NULL, 0}
133*a88e22b7SJung-uk Kim };
134*a88e22b7SJung-uk Kim 
135*a88e22b7SJung-uk Kim static ACPI_DMTABLE_INFO           TableInfoDmarPciPath[] =
136*a88e22b7SJung-uk Kim {
137*a88e22b7SJung-uk Kim     {ACPI_DMT_PCI_PATH, 0,               "PCI Path", 0},
138*a88e22b7SJung-uk Kim     {ACPI_DMT_EXIT,     0,               NULL, 0}
139*a88e22b7SJung-uk Kim };
140*a88e22b7SJung-uk Kim 
141*a88e22b7SJung-uk Kim 
142*a88e22b7SJung-uk Kim /* TBD: move to acmacros.h */
143*a88e22b7SJung-uk Kim 
144*a88e22b7SJung-uk Kim #define ACPI_SUB_PTR(t, a, b) \
145*a88e22b7SJung-uk Kim     ACPI_CAST_PTR (t, (ACPI_CAST_PTR (UINT8, (a)) - (ACPI_SIZE)(b)))
146*a88e22b7SJung-uk Kim 
147*a88e22b7SJung-uk Kim 
148*a88e22b7SJung-uk Kim /* Local prototypes */
149*a88e22b7SJung-uk Kim 
150*a88e22b7SJung-uk Kim static ACPI_STATUS
151*a88e22b7SJung-uk Kim DtCompileTwoSubtables (
152*a88e22b7SJung-uk Kim     void                    **List,
153*a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *TableInfo1,
154*a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *TableInfo2);
155*a88e22b7SJung-uk Kim 
156*a88e22b7SJung-uk Kim 
157*a88e22b7SJung-uk Kim /******************************************************************************
158*a88e22b7SJung-uk Kim  *
159*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileTwoSubtables
160*a88e22b7SJung-uk Kim  *
161*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
162*a88e22b7SJung-uk Kim  *              TableInfo1          - Info table 1
163*a88e22b7SJung-uk Kim  *              TableInfo1          - Info table 2
164*a88e22b7SJung-uk Kim  *
165*a88e22b7SJung-uk Kim  * RETURN:      Status
166*a88e22b7SJung-uk Kim  *
167*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile tables with a header and one or more same subtables.
168*a88e22b7SJung-uk Kim  *              Include CPEP, EINJ, ERST, MCFG, MSCT, WDAT
169*a88e22b7SJung-uk Kim  *
170*a88e22b7SJung-uk Kim  *****************************************************************************/
171*a88e22b7SJung-uk Kim 
172*a88e22b7SJung-uk Kim static ACPI_STATUS
173*a88e22b7SJung-uk Kim DtCompileTwoSubtables (
174*a88e22b7SJung-uk Kim     void                    **List,
175*a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *TableInfo1,
176*a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *TableInfo2)
177*a88e22b7SJung-uk Kim {
178*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
179*a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
180*a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
181*a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
182*a88e22b7SJung-uk Kim 
183*a88e22b7SJung-uk Kim 
184*a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, TableInfo1, &Subtable, TRUE);
185*a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
186*a88e22b7SJung-uk Kim     {
187*a88e22b7SJung-uk Kim         return (Status);
188*a88e22b7SJung-uk Kim     }
189*a88e22b7SJung-uk Kim 
190*a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
191*a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
192*a88e22b7SJung-uk Kim 
193*a88e22b7SJung-uk Kim     while (*PFieldList)
194*a88e22b7SJung-uk Kim     {
195*a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, TableInfo2, &Subtable, FALSE);
196*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
197*a88e22b7SJung-uk Kim         {
198*a88e22b7SJung-uk Kim             return (Status);
199*a88e22b7SJung-uk Kim         }
200*a88e22b7SJung-uk Kim 
201*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
202*a88e22b7SJung-uk Kim     }
203*a88e22b7SJung-uk Kim 
204*a88e22b7SJung-uk Kim     return (AE_OK);
205*a88e22b7SJung-uk Kim }
206*a88e22b7SJung-uk Kim 
207*a88e22b7SJung-uk Kim 
208*a88e22b7SJung-uk Kim /******************************************************************************
209*a88e22b7SJung-uk Kim  *
210*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileFacs
211*a88e22b7SJung-uk Kim  *
212*a88e22b7SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
213*a88e22b7SJung-uk Kim  *
214*a88e22b7SJung-uk Kim  * RETURN:      Status
215*a88e22b7SJung-uk Kim  *
216*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile FACS.
217*a88e22b7SJung-uk Kim  *
218*a88e22b7SJung-uk Kim  *****************************************************************************/
219*a88e22b7SJung-uk Kim 
220*a88e22b7SJung-uk Kim ACPI_STATUS
221*a88e22b7SJung-uk Kim DtCompileFacs (
222*a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList)
223*a88e22b7SJung-uk Kim {
224*a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
225*a88e22b7SJung-uk Kim     UINT8                   *ReservedBuffer;
226*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
227*a88e22b7SJung-uk Kim     UINT32                  ReservedSize;
228*a88e22b7SJung-uk Kim 
229*a88e22b7SJung-uk Kim 
230*a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs,
231*a88e22b7SJung-uk Kim                 &Gbl_RootTable, TRUE);
232*a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
233*a88e22b7SJung-uk Kim     {
234*a88e22b7SJung-uk Kim         return (Status);
235*a88e22b7SJung-uk Kim     }
236*a88e22b7SJung-uk Kim 
237*a88e22b7SJung-uk Kim     /* Large FACS reserved area at the end of the table */
238*a88e22b7SJung-uk Kim 
239*a88e22b7SJung-uk Kim     ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1);
240*a88e22b7SJung-uk Kim     ReservedBuffer = UtLocalCalloc (ReservedSize);
241*a88e22b7SJung-uk Kim 
242*a88e22b7SJung-uk Kim     DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
243*a88e22b7SJung-uk Kim 
244*a88e22b7SJung-uk Kim     ACPI_FREE (ReservedBuffer);
245*a88e22b7SJung-uk Kim     DtInsertSubtable (Gbl_RootTable, Subtable);
246*a88e22b7SJung-uk Kim     return (AE_OK);
247*a88e22b7SJung-uk Kim }
248*a88e22b7SJung-uk Kim 
249*a88e22b7SJung-uk Kim 
250*a88e22b7SJung-uk Kim /******************************************************************************
251*a88e22b7SJung-uk Kim  *
252*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileRsdp
253*a88e22b7SJung-uk Kim  *
254*a88e22b7SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
255*a88e22b7SJung-uk Kim  *
256*a88e22b7SJung-uk Kim  * RETURN:      Status
257*a88e22b7SJung-uk Kim  *
258*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile RSDP.
259*a88e22b7SJung-uk Kim  *
260*a88e22b7SJung-uk Kim  *****************************************************************************/
261*a88e22b7SJung-uk Kim 
262*a88e22b7SJung-uk Kim ACPI_STATUS
263*a88e22b7SJung-uk Kim DtCompileRsdp (
264*a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList)
265*a88e22b7SJung-uk Kim {
266*a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
267*a88e22b7SJung-uk Kim     ACPI_TABLE_RSDP         *Rsdp;
268*a88e22b7SJung-uk Kim     ACPI_RSDP_EXTENSION     *RsdpExtension;
269*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
270*a88e22b7SJung-uk Kim 
271*a88e22b7SJung-uk Kim 
272*a88e22b7SJung-uk Kim     /* Compile the "common" RSDP (ACPI 1.0) */
273*a88e22b7SJung-uk Kim 
274*a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp1,
275*a88e22b7SJung-uk Kim                 &Gbl_RootTable, TRUE);
276*a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
277*a88e22b7SJung-uk Kim     {
278*a88e22b7SJung-uk Kim         return (Status);
279*a88e22b7SJung-uk Kim     }
280*a88e22b7SJung-uk Kim 
281*a88e22b7SJung-uk Kim     Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Gbl_RootTable->Buffer);
282*a88e22b7SJung-uk Kim     DtSetTableChecksum (&Rsdp->Checksum);
283*a88e22b7SJung-uk Kim 
284*a88e22b7SJung-uk Kim     if (Rsdp->Revision > 0)
285*a88e22b7SJung-uk Kim     {
286*a88e22b7SJung-uk Kim         /* Compile the "extended" part of the RSDP as a subtable */
287*a88e22b7SJung-uk Kim 
288*a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp2,
289*a88e22b7SJung-uk Kim                     &Subtable, TRUE);
290*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
291*a88e22b7SJung-uk Kim         {
292*a88e22b7SJung-uk Kim             return (Status);
293*a88e22b7SJung-uk Kim         }
294*a88e22b7SJung-uk Kim 
295*a88e22b7SJung-uk Kim         DtInsertSubtable (Gbl_RootTable, Subtable);
296*a88e22b7SJung-uk Kim 
297*a88e22b7SJung-uk Kim         /* Set length and extended checksum for entire RSDP */
298*a88e22b7SJung-uk Kim 
299*a88e22b7SJung-uk Kim         RsdpExtension = ACPI_CAST_PTR (ACPI_RSDP_EXTENSION, Subtable->Buffer);
300*a88e22b7SJung-uk Kim         RsdpExtension->Length = Gbl_RootTable->Length + Subtable->Length;
301*a88e22b7SJung-uk Kim         DtSetTableChecksum (&RsdpExtension->ExtendedChecksum);
302*a88e22b7SJung-uk Kim     }
303*a88e22b7SJung-uk Kim 
304*a88e22b7SJung-uk Kim     return (AE_OK);
305*a88e22b7SJung-uk Kim }
306*a88e22b7SJung-uk Kim 
307*a88e22b7SJung-uk Kim 
308*a88e22b7SJung-uk Kim /******************************************************************************
309*a88e22b7SJung-uk Kim  *
310*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileAsf
311*a88e22b7SJung-uk Kim  *
312*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
313*a88e22b7SJung-uk Kim  *
314*a88e22b7SJung-uk Kim  * RETURN:      Status
315*a88e22b7SJung-uk Kim  *
316*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile ASF!.
317*a88e22b7SJung-uk Kim  *
318*a88e22b7SJung-uk Kim  *****************************************************************************/
319*a88e22b7SJung-uk Kim 
320*a88e22b7SJung-uk Kim ACPI_STATUS
321*a88e22b7SJung-uk Kim DtCompileAsf (
322*a88e22b7SJung-uk Kim     void                    **List)
323*a88e22b7SJung-uk Kim {
324*a88e22b7SJung-uk Kim     ACPI_ASF_INFO           *AsfTable;
325*a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
326*a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
327*a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
328*a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
329*a88e22b7SJung-uk Kim     UINT32                  DataCount = 0;
330*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
331*a88e22b7SJung-uk Kim     UINT32                  i;
332*a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
333*a88e22b7SJung-uk Kim     DT_FIELD                *SubtableStart;
334*a88e22b7SJung-uk Kim 
335*a88e22b7SJung-uk Kim 
336*a88e22b7SJung-uk Kim     while (*PFieldList)
337*a88e22b7SJung-uk Kim     {
338*a88e22b7SJung-uk Kim         SubtableStart = *PFieldList;
339*a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr,
340*a88e22b7SJung-uk Kim                     &Subtable, TRUE);
341*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
342*a88e22b7SJung-uk Kim         {
343*a88e22b7SJung-uk Kim             return (Status);
344*a88e22b7SJung-uk Kim         }
345*a88e22b7SJung-uk Kim 
346*a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
347*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
348*a88e22b7SJung-uk Kim         DtPushSubtable (Subtable);
349*a88e22b7SJung-uk Kim 
350*a88e22b7SJung-uk Kim         AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer);
351*a88e22b7SJung-uk Kim 
352*a88e22b7SJung-uk Kim         switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
353*a88e22b7SJung-uk Kim         {
354*a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_INFO:
355*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoAsf0;
356*a88e22b7SJung-uk Kim             break;
357*a88e22b7SJung-uk Kim 
358*a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_ALERT:
359*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoAsf1;
360*a88e22b7SJung-uk Kim             break;
361*a88e22b7SJung-uk Kim 
362*a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_CONTROL:
363*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoAsf2;
364*a88e22b7SJung-uk Kim             break;
365*a88e22b7SJung-uk Kim 
366*a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_BOOT:
367*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoAsf3;
368*a88e22b7SJung-uk Kim             break;
369*a88e22b7SJung-uk Kim 
370*a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_ADDRESS:
371*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoAsf4;
372*a88e22b7SJung-uk Kim             break;
373*a88e22b7SJung-uk Kim 
374*a88e22b7SJung-uk Kim         default:
375*a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
376*a88e22b7SJung-uk Kim             return (AE_ERROR);
377*a88e22b7SJung-uk Kim         }
378*a88e22b7SJung-uk Kim 
379*a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
380*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
381*a88e22b7SJung-uk Kim         {
382*a88e22b7SJung-uk Kim             return (Status);
383*a88e22b7SJung-uk Kim         }
384*a88e22b7SJung-uk Kim 
385*a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
386*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
387*a88e22b7SJung-uk Kim 
388*a88e22b7SJung-uk Kim         switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
389*a88e22b7SJung-uk Kim         {
390*a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_INFO:
391*a88e22b7SJung-uk Kim             DataInfoTable = NULL;
392*a88e22b7SJung-uk Kim             break;
393*a88e22b7SJung-uk Kim 
394*a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_ALERT:
395*a88e22b7SJung-uk Kim             DataInfoTable = AcpiDmTableInfoAsf1a;
396*a88e22b7SJung-uk Kim             DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT,
397*a88e22b7SJung-uk Kim                         ACPI_SUB_PTR (UINT8, Subtable->Buffer,
398*a88e22b7SJung-uk Kim                             sizeof (ACPI_ASF_HEADER)))->Alerts;
399*a88e22b7SJung-uk Kim             break;
400*a88e22b7SJung-uk Kim 
401*a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_CONTROL:
402*a88e22b7SJung-uk Kim             DataInfoTable = AcpiDmTableInfoAsf2a;
403*a88e22b7SJung-uk Kim             DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE,
404*a88e22b7SJung-uk Kim                         ACPI_SUB_PTR (UINT8, Subtable->Buffer,
405*a88e22b7SJung-uk Kim                             sizeof (ACPI_ASF_HEADER)))->Controls;
406*a88e22b7SJung-uk Kim             break;
407*a88e22b7SJung-uk Kim 
408*a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_BOOT:
409*a88e22b7SJung-uk Kim             DataInfoTable = NULL;
410*a88e22b7SJung-uk Kim             break;
411*a88e22b7SJung-uk Kim 
412*a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_ADDRESS:
413*a88e22b7SJung-uk Kim             DataInfoTable = TableInfoAsfAddress;
414*a88e22b7SJung-uk Kim             DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS,
415*a88e22b7SJung-uk Kim                         ACPI_SUB_PTR (UINT8, Subtable->Buffer,
416*a88e22b7SJung-uk Kim                             sizeof (ACPI_ASF_HEADER)))->Devices;
417*a88e22b7SJung-uk Kim             break;
418*a88e22b7SJung-uk Kim 
419*a88e22b7SJung-uk Kim         default:
420*a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
421*a88e22b7SJung-uk Kim             return (AE_ERROR);
422*a88e22b7SJung-uk Kim         }
423*a88e22b7SJung-uk Kim 
424*a88e22b7SJung-uk Kim         if (DataInfoTable)
425*a88e22b7SJung-uk Kim         {
426*a88e22b7SJung-uk Kim             switch (AsfTable->Header.Type & 0x7F)
427*a88e22b7SJung-uk Kim             {
428*a88e22b7SJung-uk Kim             case ACPI_ASF_TYPE_ADDRESS:
429*a88e22b7SJung-uk Kim 
430*a88e22b7SJung-uk Kim                 while (DataCount > 0)
431*a88e22b7SJung-uk Kim                 {
432*a88e22b7SJung-uk Kim                     Status = DtCompileTable (PFieldList, DataInfoTable,
433*a88e22b7SJung-uk Kim                                 &Subtable, TRUE);
434*a88e22b7SJung-uk Kim                     if (ACPI_FAILURE (Status))
435*a88e22b7SJung-uk Kim                     {
436*a88e22b7SJung-uk Kim                         return (Status);
437*a88e22b7SJung-uk Kim                     }
438*a88e22b7SJung-uk Kim 
439*a88e22b7SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
440*a88e22b7SJung-uk Kim                     DataCount = DataCount - Subtable->Length;
441*a88e22b7SJung-uk Kim                 }
442*a88e22b7SJung-uk Kim                 break;
443*a88e22b7SJung-uk Kim 
444*a88e22b7SJung-uk Kim             default:
445*a88e22b7SJung-uk Kim 
446*a88e22b7SJung-uk Kim                 for (i = 0; i < DataCount; i++)
447*a88e22b7SJung-uk Kim                 {
448*a88e22b7SJung-uk Kim                     Status = DtCompileTable (PFieldList, DataInfoTable,
449*a88e22b7SJung-uk Kim                                 &Subtable, TRUE);
450*a88e22b7SJung-uk Kim                     if (ACPI_FAILURE (Status))
451*a88e22b7SJung-uk Kim                     {
452*a88e22b7SJung-uk Kim                         return (Status);
453*a88e22b7SJung-uk Kim                     }
454*a88e22b7SJung-uk Kim 
455*a88e22b7SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
456*a88e22b7SJung-uk Kim                 }
457*a88e22b7SJung-uk Kim                 break;
458*a88e22b7SJung-uk Kim             }
459*a88e22b7SJung-uk Kim         }
460*a88e22b7SJung-uk Kim 
461*a88e22b7SJung-uk Kim         DtPopSubtable ();
462*a88e22b7SJung-uk Kim     }
463*a88e22b7SJung-uk Kim 
464*a88e22b7SJung-uk Kim     return (AE_OK);
465*a88e22b7SJung-uk Kim }
466*a88e22b7SJung-uk Kim 
467*a88e22b7SJung-uk Kim 
468*a88e22b7SJung-uk Kim /******************************************************************************
469*a88e22b7SJung-uk Kim  *
470*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileCpep
471*a88e22b7SJung-uk Kim  *
472*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
473*a88e22b7SJung-uk Kim  *
474*a88e22b7SJung-uk Kim  * RETURN:      Status
475*a88e22b7SJung-uk Kim  *
476*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile CPEP.
477*a88e22b7SJung-uk Kim  *
478*a88e22b7SJung-uk Kim  *****************************************************************************/
479*a88e22b7SJung-uk Kim 
480*a88e22b7SJung-uk Kim ACPI_STATUS
481*a88e22b7SJung-uk Kim DtCompileCpep (
482*a88e22b7SJung-uk Kim     void                    **List)
483*a88e22b7SJung-uk Kim {
484*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
485*a88e22b7SJung-uk Kim 
486*a88e22b7SJung-uk Kim 
487*a88e22b7SJung-uk Kim     Status = DtCompileTwoSubtables (List,
488*a88e22b7SJung-uk Kim                  AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0);
489*a88e22b7SJung-uk Kim     return (Status);
490*a88e22b7SJung-uk Kim }
491*a88e22b7SJung-uk Kim 
492*a88e22b7SJung-uk Kim 
493*a88e22b7SJung-uk Kim /******************************************************************************
494*a88e22b7SJung-uk Kim  *
495*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileDmar
496*a88e22b7SJung-uk Kim  *
497*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
498*a88e22b7SJung-uk Kim  *
499*a88e22b7SJung-uk Kim  * RETURN:      Status
500*a88e22b7SJung-uk Kim  *
501*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile DMAR.
502*a88e22b7SJung-uk Kim  *
503*a88e22b7SJung-uk Kim  *****************************************************************************/
504*a88e22b7SJung-uk Kim 
505*a88e22b7SJung-uk Kim ACPI_STATUS
506*a88e22b7SJung-uk Kim DtCompileDmar (
507*a88e22b7SJung-uk Kim     void                    **List)
508*a88e22b7SJung-uk Kim {
509*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
510*a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
511*a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
512*a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
513*a88e22b7SJung-uk Kim     DT_FIELD                *SubtableStart;
514*a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
515*a88e22b7SJung-uk Kim     ACPI_DMAR_HEADER        *DmarHeader;
516*a88e22b7SJung-uk Kim     UINT8                   *ReservedBuffer;
517*a88e22b7SJung-uk Kim     UINT32                  ReservedSize;
518*a88e22b7SJung-uk Kim 
519*a88e22b7SJung-uk Kim 
520*a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable, TRUE);
521*a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
522*a88e22b7SJung-uk Kim     {
523*a88e22b7SJung-uk Kim         return (Status);
524*a88e22b7SJung-uk Kim     }
525*a88e22b7SJung-uk Kim 
526*a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
527*a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
528*a88e22b7SJung-uk Kim 
529*a88e22b7SJung-uk Kim     /* DMAR Reserved area */
530*a88e22b7SJung-uk Kim 
531*a88e22b7SJung-uk Kim     ReservedSize = (UINT32) sizeof (((ACPI_TABLE_DMAR *) NULL)->Reserved);
532*a88e22b7SJung-uk Kim     ReservedBuffer = UtLocalCalloc (ReservedSize);
533*a88e22b7SJung-uk Kim 
534*a88e22b7SJung-uk Kim     DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
535*a88e22b7SJung-uk Kim 
536*a88e22b7SJung-uk Kim     ACPI_FREE (ReservedBuffer);
537*a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
538*a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
539*a88e22b7SJung-uk Kim 
540*a88e22b7SJung-uk Kim     while (*PFieldList)
541*a88e22b7SJung-uk Kim     {
542*a88e22b7SJung-uk Kim         /* DMAR Header */
543*a88e22b7SJung-uk Kim 
544*a88e22b7SJung-uk Kim         SubtableStart = *PFieldList;
545*a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr,
546*a88e22b7SJung-uk Kim                     &Subtable, TRUE);
547*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
548*a88e22b7SJung-uk Kim         {
549*a88e22b7SJung-uk Kim             return (Status);
550*a88e22b7SJung-uk Kim         }
551*a88e22b7SJung-uk Kim 
552*a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
553*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
554*a88e22b7SJung-uk Kim         DtPushSubtable (Subtable);
555*a88e22b7SJung-uk Kim 
556*a88e22b7SJung-uk Kim         DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer);
557*a88e22b7SJung-uk Kim 
558*a88e22b7SJung-uk Kim         switch (DmarHeader->Type)
559*a88e22b7SJung-uk Kim         {
560*a88e22b7SJung-uk Kim         case ACPI_DMAR_TYPE_HARDWARE_UNIT:
561*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoDmar0;
562*a88e22b7SJung-uk Kim             break;
563*a88e22b7SJung-uk Kim         case ACPI_DMAR_TYPE_RESERVED_MEMORY:
564*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoDmar1;
565*a88e22b7SJung-uk Kim             break;
566*a88e22b7SJung-uk Kim         case ACPI_DMAR_TYPE_ATSR:
567*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoDmar2;
568*a88e22b7SJung-uk Kim             break;
569*a88e22b7SJung-uk Kim         case ACPI_DMAR_HARDWARE_AFFINITY:
570*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoDmar3;
571*a88e22b7SJung-uk Kim             break;
572*a88e22b7SJung-uk Kim         default:
573*a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR");
574*a88e22b7SJung-uk Kim             return (AE_ERROR);
575*a88e22b7SJung-uk Kim         }
576*a88e22b7SJung-uk Kim 
577*a88e22b7SJung-uk Kim         /* DMAR Subtable */
578*a88e22b7SJung-uk Kim 
579*a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
580*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
581*a88e22b7SJung-uk Kim         {
582*a88e22b7SJung-uk Kim             return (Status);
583*a88e22b7SJung-uk Kim         }
584*a88e22b7SJung-uk Kim 
585*a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
586*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
587*a88e22b7SJung-uk Kim 
588*a88e22b7SJung-uk Kim         /* Optional Device Scope subtables */
589*a88e22b7SJung-uk Kim 
590*a88e22b7SJung-uk Kim         while (*PFieldList)
591*a88e22b7SJung-uk Kim         {
592*a88e22b7SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
593*a88e22b7SJung-uk Kim                         &Subtable, FALSE);
594*a88e22b7SJung-uk Kim             if (Status == AE_NOT_FOUND)
595*a88e22b7SJung-uk Kim             {
596*a88e22b7SJung-uk Kim                 break;
597*a88e22b7SJung-uk Kim             }
598*a88e22b7SJung-uk Kim 
599*a88e22b7SJung-uk Kim             ParentTable = DtPeekSubtable ();
600*a88e22b7SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
601*a88e22b7SJung-uk Kim             DtPushSubtable (Subtable);
602*a88e22b7SJung-uk Kim 
603*a88e22b7SJung-uk Kim             /* Optional PCI Paths */
604*a88e22b7SJung-uk Kim 
605*a88e22b7SJung-uk Kim             while (*PFieldList)
606*a88e22b7SJung-uk Kim             {
607*a88e22b7SJung-uk Kim                 Status = DtCompileTable (PFieldList, TableInfoDmarPciPath,
608*a88e22b7SJung-uk Kim                             &Subtable, FALSE);
609*a88e22b7SJung-uk Kim                 if (Status == AE_NOT_FOUND)
610*a88e22b7SJung-uk Kim                 {
611*a88e22b7SJung-uk Kim                     DtPopSubtable ();
612*a88e22b7SJung-uk Kim                     break;
613*a88e22b7SJung-uk Kim                 }
614*a88e22b7SJung-uk Kim 
615*a88e22b7SJung-uk Kim                 ParentTable = DtPeekSubtable ();
616*a88e22b7SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
617*a88e22b7SJung-uk Kim             }
618*a88e22b7SJung-uk Kim         }
619*a88e22b7SJung-uk Kim 
620*a88e22b7SJung-uk Kim         DtPopSubtable ();
621*a88e22b7SJung-uk Kim     }
622*a88e22b7SJung-uk Kim 
623*a88e22b7SJung-uk Kim     return (AE_OK);
624*a88e22b7SJung-uk Kim }
625*a88e22b7SJung-uk Kim 
626*a88e22b7SJung-uk Kim 
627*a88e22b7SJung-uk Kim /******************************************************************************
628*a88e22b7SJung-uk Kim  *
629*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileEinj
630*a88e22b7SJung-uk Kim  *
631*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
632*a88e22b7SJung-uk Kim  *
633*a88e22b7SJung-uk Kim  * RETURN:      Status
634*a88e22b7SJung-uk Kim  *
635*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile EINJ.
636*a88e22b7SJung-uk Kim  *
637*a88e22b7SJung-uk Kim  *****************************************************************************/
638*a88e22b7SJung-uk Kim 
639*a88e22b7SJung-uk Kim ACPI_STATUS
640*a88e22b7SJung-uk Kim DtCompileEinj (
641*a88e22b7SJung-uk Kim     void                    **List)
642*a88e22b7SJung-uk Kim {
643*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
644*a88e22b7SJung-uk Kim 
645*a88e22b7SJung-uk Kim 
646*a88e22b7SJung-uk Kim     Status = DtCompileTwoSubtables (List,
647*a88e22b7SJung-uk Kim                  AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0);
648*a88e22b7SJung-uk Kim     return (Status);
649*a88e22b7SJung-uk Kim }
650*a88e22b7SJung-uk Kim 
651*a88e22b7SJung-uk Kim 
652*a88e22b7SJung-uk Kim /******************************************************************************
653*a88e22b7SJung-uk Kim  *
654*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileErst
655*a88e22b7SJung-uk Kim  *
656*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
657*a88e22b7SJung-uk Kim  *
658*a88e22b7SJung-uk Kim  * RETURN:      Status
659*a88e22b7SJung-uk Kim  *
660*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile ERST.
661*a88e22b7SJung-uk Kim  *
662*a88e22b7SJung-uk Kim  *****************************************************************************/
663*a88e22b7SJung-uk Kim 
664*a88e22b7SJung-uk Kim ACPI_STATUS
665*a88e22b7SJung-uk Kim DtCompileErst (
666*a88e22b7SJung-uk Kim     void                    **List)
667*a88e22b7SJung-uk Kim {
668*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
669*a88e22b7SJung-uk Kim 
670*a88e22b7SJung-uk Kim 
671*a88e22b7SJung-uk Kim     Status = DtCompileTwoSubtables (List,
672*a88e22b7SJung-uk Kim                  AcpiDmTableInfoErst, AcpiDmTableInfoEinj0);
673*a88e22b7SJung-uk Kim     return (Status);
674*a88e22b7SJung-uk Kim }
675*a88e22b7SJung-uk Kim 
676*a88e22b7SJung-uk Kim 
677*a88e22b7SJung-uk Kim /******************************************************************************
678*a88e22b7SJung-uk Kim  *
679*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileFadt
680*a88e22b7SJung-uk Kim  *
681*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
682*a88e22b7SJung-uk Kim  *
683*a88e22b7SJung-uk Kim  * RETURN:      Status
684*a88e22b7SJung-uk Kim  *
685*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile FADT.
686*a88e22b7SJung-uk Kim  *
687*a88e22b7SJung-uk Kim  *****************************************************************************/
688*a88e22b7SJung-uk Kim 
689*a88e22b7SJung-uk Kim ACPI_STATUS
690*a88e22b7SJung-uk Kim DtCompileFadt (
691*a88e22b7SJung-uk Kim     void                    **List)
692*a88e22b7SJung-uk Kim {
693*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
694*a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
695*a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
696*a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
697*a88e22b7SJung-uk Kim     ACPI_TABLE_HEADER       *Table;
698*a88e22b7SJung-uk Kim     UINT8                   Revision;
699*a88e22b7SJung-uk Kim 
700*a88e22b7SJung-uk Kim 
701*a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1,
702*a88e22b7SJung-uk Kim                 &Subtable, TRUE);
703*a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
704*a88e22b7SJung-uk Kim     {
705*a88e22b7SJung-uk Kim         return (Status);
706*a88e22b7SJung-uk Kim     }
707*a88e22b7SJung-uk Kim 
708*a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
709*a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
710*a88e22b7SJung-uk Kim 
711*a88e22b7SJung-uk Kim     Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
712*a88e22b7SJung-uk Kim     Revision = Table->Revision;
713*a88e22b7SJung-uk Kim 
714*a88e22b7SJung-uk Kim     if (Revision == 2)
715*a88e22b7SJung-uk Kim     {
716*a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2,
717*a88e22b7SJung-uk Kim                     &Subtable, TRUE);
718*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
719*a88e22b7SJung-uk Kim         {
720*a88e22b7SJung-uk Kim             return (Status);
721*a88e22b7SJung-uk Kim         }
722*a88e22b7SJung-uk Kim 
723*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
724*a88e22b7SJung-uk Kim     }
725*a88e22b7SJung-uk Kim     else if (Revision >= 2)
726*a88e22b7SJung-uk Kim     {
727*a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3,
728*a88e22b7SJung-uk Kim                     &Subtable, TRUE);
729*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
730*a88e22b7SJung-uk Kim         {
731*a88e22b7SJung-uk Kim             return (Status);
732*a88e22b7SJung-uk Kim         }
733*a88e22b7SJung-uk Kim 
734*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
735*a88e22b7SJung-uk Kim     }
736*a88e22b7SJung-uk Kim 
737*a88e22b7SJung-uk Kim     return (AE_OK);
738*a88e22b7SJung-uk Kim }
739*a88e22b7SJung-uk Kim 
740*a88e22b7SJung-uk Kim 
741*a88e22b7SJung-uk Kim /******************************************************************************
742*a88e22b7SJung-uk Kim  *
743*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileHest
744*a88e22b7SJung-uk Kim  *
745*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
746*a88e22b7SJung-uk Kim  *
747*a88e22b7SJung-uk Kim  * RETURN:      Status
748*a88e22b7SJung-uk Kim  *
749*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile HEST.
750*a88e22b7SJung-uk Kim  *
751*a88e22b7SJung-uk Kim  *****************************************************************************/
752*a88e22b7SJung-uk Kim 
753*a88e22b7SJung-uk Kim ACPI_STATUS
754*a88e22b7SJung-uk Kim DtCompileHest (
755*a88e22b7SJung-uk Kim     void                    **List)
756*a88e22b7SJung-uk Kim {
757*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
758*a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
759*a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
760*a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
761*a88e22b7SJung-uk Kim     DT_FIELD                *SubtableStart;
762*a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
763*a88e22b7SJung-uk Kim     UINT16                  Type;
764*a88e22b7SJung-uk Kim     UINT32                  BankCount;
765*a88e22b7SJung-uk Kim 
766*a88e22b7SJung-uk Kim 
767*a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest,
768*a88e22b7SJung-uk Kim                 &Subtable, TRUE);
769*a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
770*a88e22b7SJung-uk Kim     {
771*a88e22b7SJung-uk Kim         return (Status);
772*a88e22b7SJung-uk Kim     }
773*a88e22b7SJung-uk Kim 
774*a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
775*a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
776*a88e22b7SJung-uk Kim 
777*a88e22b7SJung-uk Kim     while (*PFieldList)
778*a88e22b7SJung-uk Kim     {
779*a88e22b7SJung-uk Kim         /* Get subtable type */
780*a88e22b7SJung-uk Kim 
781*a88e22b7SJung-uk Kim         SubtableStart = *PFieldList;
782*a88e22b7SJung-uk Kim         DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
783*a88e22b7SJung-uk Kim 
784*a88e22b7SJung-uk Kim         switch (Type)
785*a88e22b7SJung-uk Kim         {
786*a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_IA32_CHECK:
787*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoHest0;
788*a88e22b7SJung-uk Kim             break;
789*a88e22b7SJung-uk Kim 
790*a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
791*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoHest1;
792*a88e22b7SJung-uk Kim             break;
793*a88e22b7SJung-uk Kim 
794*a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_IA32_NMI:
795*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoHest2;
796*a88e22b7SJung-uk Kim             break;
797*a88e22b7SJung-uk Kim 
798*a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_AER_ROOT_PORT:
799*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoHest6;
800*a88e22b7SJung-uk Kim             break;
801*a88e22b7SJung-uk Kim 
802*a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_AER_ENDPOINT:
803*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoHest7;
804*a88e22b7SJung-uk Kim             break;
805*a88e22b7SJung-uk Kim 
806*a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_AER_BRIDGE:
807*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoHest8;
808*a88e22b7SJung-uk Kim             break;
809*a88e22b7SJung-uk Kim 
810*a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_GENERIC_ERROR:
811*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoHest9;
812*a88e22b7SJung-uk Kim             break;
813*a88e22b7SJung-uk Kim 
814*a88e22b7SJung-uk Kim         default:
815*a88e22b7SJung-uk Kim             /* Cannot continue on unknown type */
816*a88e22b7SJung-uk Kim 
817*a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST");
818*a88e22b7SJung-uk Kim             return (AE_ERROR);
819*a88e22b7SJung-uk Kim         }
820*a88e22b7SJung-uk Kim 
821*a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
822*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
823*a88e22b7SJung-uk Kim         {
824*a88e22b7SJung-uk Kim             return (Status);
825*a88e22b7SJung-uk Kim         }
826*a88e22b7SJung-uk Kim 
827*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
828*a88e22b7SJung-uk Kim 
829*a88e22b7SJung-uk Kim         /*
830*a88e22b7SJung-uk Kim          * Additional subtable data - IA32 Error Bank(s)
831*a88e22b7SJung-uk Kim          */
832*a88e22b7SJung-uk Kim         BankCount = 0;
833*a88e22b7SJung-uk Kim         switch (Type)
834*a88e22b7SJung-uk Kim         {
835*a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_IA32_CHECK:
836*a88e22b7SJung-uk Kim             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
837*a88e22b7SJung-uk Kim                             Subtable->Buffer))->NumHardwareBanks;
838*a88e22b7SJung-uk Kim             break;
839*a88e22b7SJung-uk Kim 
840*a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
841*a88e22b7SJung-uk Kim             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
842*a88e22b7SJung-uk Kim                             Subtable->Buffer))->NumHardwareBanks;
843*a88e22b7SJung-uk Kim             break;
844*a88e22b7SJung-uk Kim 
845*a88e22b7SJung-uk Kim         default:
846*a88e22b7SJung-uk Kim             break;
847*a88e22b7SJung-uk Kim         }
848*a88e22b7SJung-uk Kim 
849*a88e22b7SJung-uk Kim         while (BankCount)
850*a88e22b7SJung-uk Kim         {
851*a88e22b7SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank,
852*a88e22b7SJung-uk Kim                         &Subtable, TRUE);
853*a88e22b7SJung-uk Kim             if (ACPI_FAILURE (Status))
854*a88e22b7SJung-uk Kim             {
855*a88e22b7SJung-uk Kim                 return (Status);
856*a88e22b7SJung-uk Kim             }
857*a88e22b7SJung-uk Kim 
858*a88e22b7SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
859*a88e22b7SJung-uk Kim             BankCount--;
860*a88e22b7SJung-uk Kim         }
861*a88e22b7SJung-uk Kim     }
862*a88e22b7SJung-uk Kim 
863*a88e22b7SJung-uk Kim     return AE_OK;
864*a88e22b7SJung-uk Kim }
865*a88e22b7SJung-uk Kim 
866*a88e22b7SJung-uk Kim 
867*a88e22b7SJung-uk Kim /******************************************************************************
868*a88e22b7SJung-uk Kim  *
869*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileIvrs
870*a88e22b7SJung-uk Kim  *
871*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
872*a88e22b7SJung-uk Kim  *
873*a88e22b7SJung-uk Kim  * RETURN:      Status
874*a88e22b7SJung-uk Kim  *
875*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile IVRS.
876*a88e22b7SJung-uk Kim  *
877*a88e22b7SJung-uk Kim  *****************************************************************************/
878*a88e22b7SJung-uk Kim 
879*a88e22b7SJung-uk Kim ACPI_STATUS
880*a88e22b7SJung-uk Kim DtCompileIvrs (
881*a88e22b7SJung-uk Kim     void                    **List)
882*a88e22b7SJung-uk Kim {
883*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
884*a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
885*a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
886*a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
887*a88e22b7SJung-uk Kim     DT_FIELD                *SubtableStart;
888*a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
889*a88e22b7SJung-uk Kim     ACPI_IVRS_HEADER        *IvrsHeader;
890*a88e22b7SJung-uk Kim     UINT8                   EntryType;
891*a88e22b7SJung-uk Kim 
892*a88e22b7SJung-uk Kim 
893*a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs,
894*a88e22b7SJung-uk Kim                 &Subtable, TRUE);
895*a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
896*a88e22b7SJung-uk Kim     {
897*a88e22b7SJung-uk Kim         return (Status);
898*a88e22b7SJung-uk Kim     }
899*a88e22b7SJung-uk Kim 
900*a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
901*a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
902*a88e22b7SJung-uk Kim 
903*a88e22b7SJung-uk Kim     while (*PFieldList)
904*a88e22b7SJung-uk Kim     {
905*a88e22b7SJung-uk Kim         SubtableStart = *PFieldList;
906*a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHdr,
907*a88e22b7SJung-uk Kim                     &Subtable, TRUE);
908*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
909*a88e22b7SJung-uk Kim         {
910*a88e22b7SJung-uk Kim             return (Status);
911*a88e22b7SJung-uk Kim         }
912*a88e22b7SJung-uk Kim 
913*a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
914*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
915*a88e22b7SJung-uk Kim         DtPushSubtable (Subtable);
916*a88e22b7SJung-uk Kim 
917*a88e22b7SJung-uk Kim         IvrsHeader = ACPI_CAST_PTR (ACPI_IVRS_HEADER, Subtable->Buffer);
918*a88e22b7SJung-uk Kim 
919*a88e22b7SJung-uk Kim         switch (IvrsHeader->Type)
920*a88e22b7SJung-uk Kim         {
921*a88e22b7SJung-uk Kim         case ACPI_IVRS_TYPE_HARDWARE:
922*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoIvrs0;
923*a88e22b7SJung-uk Kim             break;
924*a88e22b7SJung-uk Kim 
925*a88e22b7SJung-uk Kim         case ACPI_IVRS_TYPE_MEMORY1:
926*a88e22b7SJung-uk Kim         case ACPI_IVRS_TYPE_MEMORY2:
927*a88e22b7SJung-uk Kim         case ACPI_IVRS_TYPE_MEMORY3:
928*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoIvrs1;
929*a88e22b7SJung-uk Kim             break;
930*a88e22b7SJung-uk Kim 
931*a88e22b7SJung-uk Kim         default:
932*a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS");
933*a88e22b7SJung-uk Kim             return (AE_ERROR);
934*a88e22b7SJung-uk Kim         }
935*a88e22b7SJung-uk Kim 
936*a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
937*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
938*a88e22b7SJung-uk Kim         {
939*a88e22b7SJung-uk Kim             return (Status);
940*a88e22b7SJung-uk Kim         }
941*a88e22b7SJung-uk Kim 
942*a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
943*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
944*a88e22b7SJung-uk Kim 
945*a88e22b7SJung-uk Kim         if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE)
946*a88e22b7SJung-uk Kim         {
947*a88e22b7SJung-uk Kim             while (*PFieldList &&
948*a88e22b7SJung-uk Kim                     !ACPI_STRCMP ((*PFieldList)->Name, "Entry Type"))
949*a88e22b7SJung-uk Kim             {
950*a88e22b7SJung-uk Kim                 SubtableStart = *PFieldList;
951*a88e22b7SJung-uk Kim                 DtCompileInteger (&EntryType, *PFieldList, 1, 0);
952*a88e22b7SJung-uk Kim 
953*a88e22b7SJung-uk Kim                 switch (EntryType)
954*a88e22b7SJung-uk Kim                 {
955*a88e22b7SJung-uk Kim                 /* 4-byte device entries */
956*a88e22b7SJung-uk Kim 
957*a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_PAD4:
958*a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_ALL:
959*a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_SELECT:
960*a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_START:
961*a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_END:
962*a88e22b7SJung-uk Kim 
963*a88e22b7SJung-uk Kim                     InfoTable = AcpiDmTableInfoIvrs4;
964*a88e22b7SJung-uk Kim                     break;
965*a88e22b7SJung-uk Kim 
966*a88e22b7SJung-uk Kim                 /* 8-byte entries, type A */
967*a88e22b7SJung-uk Kim 
968*a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_ALIAS_SELECT:
969*a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_ALIAS_START:
970*a88e22b7SJung-uk Kim 
971*a88e22b7SJung-uk Kim                     InfoTable = AcpiDmTableInfoIvrs8a;
972*a88e22b7SJung-uk Kim                     break;
973*a88e22b7SJung-uk Kim 
974*a88e22b7SJung-uk Kim                 /* 8-byte entries, type B */
975*a88e22b7SJung-uk Kim 
976*a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_PAD8:
977*a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_EXT_SELECT:
978*a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_EXT_START:
979*a88e22b7SJung-uk Kim 
980*a88e22b7SJung-uk Kim                     InfoTable = AcpiDmTableInfoIvrs8b;
981*a88e22b7SJung-uk Kim                     break;
982*a88e22b7SJung-uk Kim 
983*a88e22b7SJung-uk Kim                 /* 8-byte entries, type C */
984*a88e22b7SJung-uk Kim 
985*a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_SPECIAL:
986*a88e22b7SJung-uk Kim 
987*a88e22b7SJung-uk Kim                     InfoTable = AcpiDmTableInfoIvrs8c;
988*a88e22b7SJung-uk Kim                     break;
989*a88e22b7SJung-uk Kim 
990*a88e22b7SJung-uk Kim                 default:
991*a88e22b7SJung-uk Kim                     DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart,
992*a88e22b7SJung-uk Kim                         "IVRS Device Entry");
993*a88e22b7SJung-uk Kim                     return (AE_ERROR);
994*a88e22b7SJung-uk Kim                 }
995*a88e22b7SJung-uk Kim 
996*a88e22b7SJung-uk Kim                 Status = DtCompileTable (PFieldList, InfoTable,
997*a88e22b7SJung-uk Kim                             &Subtable, TRUE);
998*a88e22b7SJung-uk Kim                 if (ACPI_FAILURE (Status))
999*a88e22b7SJung-uk Kim                 {
1000*a88e22b7SJung-uk Kim                     return (Status);
1001*a88e22b7SJung-uk Kim                 }
1002*a88e22b7SJung-uk Kim 
1003*a88e22b7SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1004*a88e22b7SJung-uk Kim             }
1005*a88e22b7SJung-uk Kim         }
1006*a88e22b7SJung-uk Kim 
1007*a88e22b7SJung-uk Kim         DtPopSubtable ();
1008*a88e22b7SJung-uk Kim     }
1009*a88e22b7SJung-uk Kim 
1010*a88e22b7SJung-uk Kim     return (AE_OK);
1011*a88e22b7SJung-uk Kim }
1012*a88e22b7SJung-uk Kim 
1013*a88e22b7SJung-uk Kim 
1014*a88e22b7SJung-uk Kim /******************************************************************************
1015*a88e22b7SJung-uk Kim  *
1016*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileMadt
1017*a88e22b7SJung-uk Kim  *
1018*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1019*a88e22b7SJung-uk Kim  *
1020*a88e22b7SJung-uk Kim  * RETURN:      Status
1021*a88e22b7SJung-uk Kim  *
1022*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile MADT.
1023*a88e22b7SJung-uk Kim  *
1024*a88e22b7SJung-uk Kim  *****************************************************************************/
1025*a88e22b7SJung-uk Kim 
1026*a88e22b7SJung-uk Kim ACPI_STATUS
1027*a88e22b7SJung-uk Kim DtCompileMadt (
1028*a88e22b7SJung-uk Kim     void                    **List)
1029*a88e22b7SJung-uk Kim {
1030*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
1031*a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
1032*a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1033*a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1034*a88e22b7SJung-uk Kim     DT_FIELD                *SubtableStart;
1035*a88e22b7SJung-uk Kim     ACPI_SUBTABLE_HEADER    *MadtHeader;
1036*a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1037*a88e22b7SJung-uk Kim 
1038*a88e22b7SJung-uk Kim 
1039*a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
1040*a88e22b7SJung-uk Kim                 &Subtable, TRUE);
1041*a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
1042*a88e22b7SJung-uk Kim     {
1043*a88e22b7SJung-uk Kim         return (Status);
1044*a88e22b7SJung-uk Kim     }
1045*a88e22b7SJung-uk Kim 
1046*a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
1047*a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1048*a88e22b7SJung-uk Kim 
1049*a88e22b7SJung-uk Kim     while (*PFieldList)
1050*a88e22b7SJung-uk Kim     {
1051*a88e22b7SJung-uk Kim         SubtableStart = *PFieldList;
1052*a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
1053*a88e22b7SJung-uk Kim                     &Subtable, TRUE);
1054*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
1055*a88e22b7SJung-uk Kim         {
1056*a88e22b7SJung-uk Kim             return (Status);
1057*a88e22b7SJung-uk Kim         }
1058*a88e22b7SJung-uk Kim 
1059*a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
1060*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1061*a88e22b7SJung-uk Kim         DtPushSubtable (Subtable);
1062*a88e22b7SJung-uk Kim 
1063*a88e22b7SJung-uk Kim         MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1064*a88e22b7SJung-uk Kim 
1065*a88e22b7SJung-uk Kim         switch (MadtHeader->Type)
1066*a88e22b7SJung-uk Kim         {
1067*a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_APIC:
1068*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt0;
1069*a88e22b7SJung-uk Kim             break;
1070*a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_IO_APIC:
1071*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt1;
1072*a88e22b7SJung-uk Kim             break;
1073*a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
1074*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt2;
1075*a88e22b7SJung-uk Kim             break;
1076*a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_NMI_SOURCE:
1077*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt3;
1078*a88e22b7SJung-uk Kim             break;
1079*a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
1080*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt4;
1081*a88e22b7SJung-uk Kim             break;
1082*a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
1083*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt5;
1084*a88e22b7SJung-uk Kim             break;
1085*a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_IO_SAPIC:
1086*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt6;
1087*a88e22b7SJung-uk Kim             break;
1088*a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_SAPIC:
1089*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt7;
1090*a88e22b7SJung-uk Kim             break;
1091*a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
1092*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt8;
1093*a88e22b7SJung-uk Kim             break;
1094*a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_X2APIC:
1095*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt9;
1096*a88e22b7SJung-uk Kim             break;
1097*a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
1098*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt10;
1099*a88e22b7SJung-uk Kim             break;
1100*a88e22b7SJung-uk Kim         default:
1101*a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
1102*a88e22b7SJung-uk Kim             return (AE_ERROR);
1103*a88e22b7SJung-uk Kim         }
1104*a88e22b7SJung-uk Kim 
1105*a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1106*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
1107*a88e22b7SJung-uk Kim         {
1108*a88e22b7SJung-uk Kim             return (Status);
1109*a88e22b7SJung-uk Kim         }
1110*a88e22b7SJung-uk Kim 
1111*a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
1112*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1113*a88e22b7SJung-uk Kim         DtPopSubtable ();
1114*a88e22b7SJung-uk Kim     }
1115*a88e22b7SJung-uk Kim 
1116*a88e22b7SJung-uk Kim     return (AE_OK);
1117*a88e22b7SJung-uk Kim }
1118*a88e22b7SJung-uk Kim 
1119*a88e22b7SJung-uk Kim 
1120*a88e22b7SJung-uk Kim /******************************************************************************
1121*a88e22b7SJung-uk Kim  *
1122*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileMcfg
1123*a88e22b7SJung-uk Kim  *
1124*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1125*a88e22b7SJung-uk Kim  *
1126*a88e22b7SJung-uk Kim  * RETURN:      Status
1127*a88e22b7SJung-uk Kim  *
1128*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile MCFG.
1129*a88e22b7SJung-uk Kim  *
1130*a88e22b7SJung-uk Kim  *****************************************************************************/
1131*a88e22b7SJung-uk Kim 
1132*a88e22b7SJung-uk Kim ACPI_STATUS
1133*a88e22b7SJung-uk Kim DtCompileMcfg (
1134*a88e22b7SJung-uk Kim     void                    **List)
1135*a88e22b7SJung-uk Kim {
1136*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
1137*a88e22b7SJung-uk Kim 
1138*a88e22b7SJung-uk Kim 
1139*a88e22b7SJung-uk Kim     Status = DtCompileTwoSubtables (List,
1140*a88e22b7SJung-uk Kim                  AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
1141*a88e22b7SJung-uk Kim     return (Status);
1142*a88e22b7SJung-uk Kim }
1143*a88e22b7SJung-uk Kim 
1144*a88e22b7SJung-uk Kim 
1145*a88e22b7SJung-uk Kim /******************************************************************************
1146*a88e22b7SJung-uk Kim  *
1147*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileMsct
1148*a88e22b7SJung-uk Kim  *
1149*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1150*a88e22b7SJung-uk Kim  *
1151*a88e22b7SJung-uk Kim  * RETURN:      Status
1152*a88e22b7SJung-uk Kim  *
1153*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile MSCT.
1154*a88e22b7SJung-uk Kim  *
1155*a88e22b7SJung-uk Kim  *****************************************************************************/
1156*a88e22b7SJung-uk Kim 
1157*a88e22b7SJung-uk Kim ACPI_STATUS
1158*a88e22b7SJung-uk Kim DtCompileMsct (
1159*a88e22b7SJung-uk Kim     void                    **List)
1160*a88e22b7SJung-uk Kim {
1161*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
1162*a88e22b7SJung-uk Kim 
1163*a88e22b7SJung-uk Kim 
1164*a88e22b7SJung-uk Kim     Status = DtCompileTwoSubtables (List,
1165*a88e22b7SJung-uk Kim                  AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
1166*a88e22b7SJung-uk Kim     return (Status);
1167*a88e22b7SJung-uk Kim }
1168*a88e22b7SJung-uk Kim 
1169*a88e22b7SJung-uk Kim 
1170*a88e22b7SJung-uk Kim /******************************************************************************
1171*a88e22b7SJung-uk Kim  *
1172*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileRsdt
1173*a88e22b7SJung-uk Kim  *
1174*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1175*a88e22b7SJung-uk Kim  *
1176*a88e22b7SJung-uk Kim  * RETURN:      Status
1177*a88e22b7SJung-uk Kim  *
1178*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile RSDT.
1179*a88e22b7SJung-uk Kim  *
1180*a88e22b7SJung-uk Kim  *****************************************************************************/
1181*a88e22b7SJung-uk Kim 
1182*a88e22b7SJung-uk Kim ACPI_STATUS
1183*a88e22b7SJung-uk Kim DtCompileRsdt (
1184*a88e22b7SJung-uk Kim     void                    **List)
1185*a88e22b7SJung-uk Kim {
1186*a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
1187*a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1188*a88e22b7SJung-uk Kim     DT_FIELD                *FieldList = *(DT_FIELD **) List;
1189*a88e22b7SJung-uk Kim     UINT32                  Address;
1190*a88e22b7SJung-uk Kim 
1191*a88e22b7SJung-uk Kim 
1192*a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
1193*a88e22b7SJung-uk Kim 
1194*a88e22b7SJung-uk Kim     while (FieldList)
1195*a88e22b7SJung-uk Kim     {
1196*a88e22b7SJung-uk Kim         DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
1197*a88e22b7SJung-uk Kim 
1198*a88e22b7SJung-uk Kim         DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
1199*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1200*a88e22b7SJung-uk Kim         FieldList = FieldList->Next;
1201*a88e22b7SJung-uk Kim     }
1202*a88e22b7SJung-uk Kim 
1203*a88e22b7SJung-uk Kim     return (AE_OK);
1204*a88e22b7SJung-uk Kim }
1205*a88e22b7SJung-uk Kim 
1206*a88e22b7SJung-uk Kim 
1207*a88e22b7SJung-uk Kim /******************************************************************************
1208*a88e22b7SJung-uk Kim  *
1209*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileSlit
1210*a88e22b7SJung-uk Kim  *
1211*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1212*a88e22b7SJung-uk Kim  *
1213*a88e22b7SJung-uk Kim  * RETURN:      Status
1214*a88e22b7SJung-uk Kim  *
1215*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile SLIT.
1216*a88e22b7SJung-uk Kim  *
1217*a88e22b7SJung-uk Kim  *****************************************************************************/
1218*a88e22b7SJung-uk Kim 
1219*a88e22b7SJung-uk Kim ACPI_STATUS
1220*a88e22b7SJung-uk Kim DtCompileSlit (
1221*a88e22b7SJung-uk Kim     void                    **List)
1222*a88e22b7SJung-uk Kim {
1223*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
1224*a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
1225*a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1226*a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1227*a88e22b7SJung-uk Kim     DT_FIELD                *FieldList;
1228*a88e22b7SJung-uk Kim     UINT32                  Localities;
1229*a88e22b7SJung-uk Kim     UINT8                   *LocalityBuffer;
1230*a88e22b7SJung-uk Kim     UINT32                  RemainingData;
1231*a88e22b7SJung-uk Kim 
1232*a88e22b7SJung-uk Kim 
1233*a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
1234*a88e22b7SJung-uk Kim                 &Subtable, TRUE);
1235*a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
1236*a88e22b7SJung-uk Kim     {
1237*a88e22b7SJung-uk Kim         return (Status);
1238*a88e22b7SJung-uk Kim     }
1239*a88e22b7SJung-uk Kim 
1240*a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
1241*a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1242*a88e22b7SJung-uk Kim 
1243*a88e22b7SJung-uk Kim     Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
1244*a88e22b7SJung-uk Kim     LocalityBuffer = UtLocalCalloc (Localities);
1245*a88e22b7SJung-uk Kim 
1246*a88e22b7SJung-uk Kim     FieldList = *PFieldList;
1247*a88e22b7SJung-uk Kim     while (FieldList)
1248*a88e22b7SJung-uk Kim     {
1249*a88e22b7SJung-uk Kim         /* Handle multiple-line buffer */
1250*a88e22b7SJung-uk Kim 
1251*a88e22b7SJung-uk Kim         RemainingData = Localities;
1252*a88e22b7SJung-uk Kim         while (RemainingData && FieldList)
1253*a88e22b7SJung-uk Kim         {
1254*a88e22b7SJung-uk Kim             RemainingData = DtCompileBuffer (
1255*a88e22b7SJung-uk Kim                 LocalityBuffer + (Localities - RemainingData),
1256*a88e22b7SJung-uk Kim                 FieldList->Value, FieldList, RemainingData);
1257*a88e22b7SJung-uk Kim             FieldList = FieldList->Next;
1258*a88e22b7SJung-uk Kim         }
1259*a88e22b7SJung-uk Kim 
1260*a88e22b7SJung-uk Kim         DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
1261*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1262*a88e22b7SJung-uk Kim     }
1263*a88e22b7SJung-uk Kim 
1264*a88e22b7SJung-uk Kim     ACPI_FREE (LocalityBuffer);
1265*a88e22b7SJung-uk Kim     return (AE_OK);
1266*a88e22b7SJung-uk Kim }
1267*a88e22b7SJung-uk Kim 
1268*a88e22b7SJung-uk Kim 
1269*a88e22b7SJung-uk Kim /******************************************************************************
1270*a88e22b7SJung-uk Kim  *
1271*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileSrat
1272*a88e22b7SJung-uk Kim  *
1273*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1274*a88e22b7SJung-uk Kim  *
1275*a88e22b7SJung-uk Kim  * RETURN:      Status
1276*a88e22b7SJung-uk Kim  *
1277*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile SRAT.
1278*a88e22b7SJung-uk Kim  *
1279*a88e22b7SJung-uk Kim  *****************************************************************************/
1280*a88e22b7SJung-uk Kim 
1281*a88e22b7SJung-uk Kim ACPI_STATUS
1282*a88e22b7SJung-uk Kim DtCompileSrat (
1283*a88e22b7SJung-uk Kim     void                    **List)
1284*a88e22b7SJung-uk Kim {
1285*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
1286*a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
1287*a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1288*a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1289*a88e22b7SJung-uk Kim     DT_FIELD                *SubtableStart;
1290*a88e22b7SJung-uk Kim     ACPI_SUBTABLE_HEADER    *SratHeader;
1291*a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1292*a88e22b7SJung-uk Kim 
1293*a88e22b7SJung-uk Kim 
1294*a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
1295*a88e22b7SJung-uk Kim                 &Subtable, TRUE);
1296*a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
1297*a88e22b7SJung-uk Kim     {
1298*a88e22b7SJung-uk Kim         return (Status);
1299*a88e22b7SJung-uk Kim     }
1300*a88e22b7SJung-uk Kim 
1301*a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
1302*a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1303*a88e22b7SJung-uk Kim 
1304*a88e22b7SJung-uk Kim     while (*PFieldList)
1305*a88e22b7SJung-uk Kim     {
1306*a88e22b7SJung-uk Kim         SubtableStart = *PFieldList;
1307*a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
1308*a88e22b7SJung-uk Kim                     &Subtable, TRUE);
1309*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
1310*a88e22b7SJung-uk Kim         {
1311*a88e22b7SJung-uk Kim             return (Status);
1312*a88e22b7SJung-uk Kim         }
1313*a88e22b7SJung-uk Kim 
1314*a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
1315*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1316*a88e22b7SJung-uk Kim         DtPushSubtable (Subtable);
1317*a88e22b7SJung-uk Kim 
1318*a88e22b7SJung-uk Kim         SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1319*a88e22b7SJung-uk Kim 
1320*a88e22b7SJung-uk Kim         switch (SratHeader->Type)
1321*a88e22b7SJung-uk Kim         {
1322*a88e22b7SJung-uk Kim         case ACPI_SRAT_TYPE_CPU_AFFINITY:
1323*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat0;
1324*a88e22b7SJung-uk Kim             break;
1325*a88e22b7SJung-uk Kim         case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
1326*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat1;
1327*a88e22b7SJung-uk Kim             break;
1328*a88e22b7SJung-uk Kim         case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
1329*a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat2;
1330*a88e22b7SJung-uk Kim             break;
1331*a88e22b7SJung-uk Kim         default:
1332*a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
1333*a88e22b7SJung-uk Kim             return (AE_ERROR);
1334*a88e22b7SJung-uk Kim         }
1335*a88e22b7SJung-uk Kim 
1336*a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1337*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
1338*a88e22b7SJung-uk Kim         {
1339*a88e22b7SJung-uk Kim             return (Status);
1340*a88e22b7SJung-uk Kim         }
1341*a88e22b7SJung-uk Kim 
1342*a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
1343*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1344*a88e22b7SJung-uk Kim         DtPopSubtable ();
1345*a88e22b7SJung-uk Kim     }
1346*a88e22b7SJung-uk Kim 
1347*a88e22b7SJung-uk Kim     return (AE_OK);
1348*a88e22b7SJung-uk Kim }
1349*a88e22b7SJung-uk Kim 
1350*a88e22b7SJung-uk Kim 
1351*a88e22b7SJung-uk Kim /******************************************************************************
1352*a88e22b7SJung-uk Kim  *
1353*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileWdat
1354*a88e22b7SJung-uk Kim  *
1355*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1356*a88e22b7SJung-uk Kim  *
1357*a88e22b7SJung-uk Kim  * RETURN:      Status
1358*a88e22b7SJung-uk Kim  *
1359*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile WDAT.
1360*a88e22b7SJung-uk Kim  *
1361*a88e22b7SJung-uk Kim  *****************************************************************************/
1362*a88e22b7SJung-uk Kim 
1363*a88e22b7SJung-uk Kim ACPI_STATUS
1364*a88e22b7SJung-uk Kim DtCompileWdat (
1365*a88e22b7SJung-uk Kim     void                    **List)
1366*a88e22b7SJung-uk Kim {
1367*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
1368*a88e22b7SJung-uk Kim 
1369*a88e22b7SJung-uk Kim 
1370*a88e22b7SJung-uk Kim     Status = DtCompileTwoSubtables (List,
1371*a88e22b7SJung-uk Kim                  AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
1372*a88e22b7SJung-uk Kim     return (Status);
1373*a88e22b7SJung-uk Kim }
1374*a88e22b7SJung-uk Kim 
1375*a88e22b7SJung-uk Kim 
1376*a88e22b7SJung-uk Kim /******************************************************************************
1377*a88e22b7SJung-uk Kim  *
1378*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileXsdt
1379*a88e22b7SJung-uk Kim  *
1380*a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1381*a88e22b7SJung-uk Kim  *
1382*a88e22b7SJung-uk Kim  * RETURN:      Status
1383*a88e22b7SJung-uk Kim  *
1384*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile XSDT.
1385*a88e22b7SJung-uk Kim  *
1386*a88e22b7SJung-uk Kim  *****************************************************************************/
1387*a88e22b7SJung-uk Kim 
1388*a88e22b7SJung-uk Kim ACPI_STATUS
1389*a88e22b7SJung-uk Kim DtCompileXsdt (
1390*a88e22b7SJung-uk Kim     void                    **List)
1391*a88e22b7SJung-uk Kim {
1392*a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
1393*a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1394*a88e22b7SJung-uk Kim     DT_FIELD                *FieldList = *(DT_FIELD **) List;
1395*a88e22b7SJung-uk Kim     UINT64                  Address;
1396*a88e22b7SJung-uk Kim 
1397*a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
1398*a88e22b7SJung-uk Kim 
1399*a88e22b7SJung-uk Kim     while (FieldList)
1400*a88e22b7SJung-uk Kim     {
1401*a88e22b7SJung-uk Kim         DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
1402*a88e22b7SJung-uk Kim 
1403*a88e22b7SJung-uk Kim         DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
1404*a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1405*a88e22b7SJung-uk Kim         FieldList = FieldList->Next;
1406*a88e22b7SJung-uk Kim     }
1407*a88e22b7SJung-uk Kim 
1408*a88e22b7SJung-uk Kim     return (AE_OK);
1409*a88e22b7SJung-uk Kim }
1410