xref: /freebsd/sys/contrib/dev/acpica/compiler/dttable.c (revision 3f0275a0331d5d477f9d8dc5accbba3533ac4cbf)
1a88e22b7SJung-uk Kim /******************************************************************************
2a88e22b7SJung-uk Kim  *
3a88e22b7SJung-uk Kim  * Module Name: dttable.c - handling for specific ACPI tables
4a88e22b7SJung-uk Kim  *
5a88e22b7SJung-uk Kim  *****************************************************************************/
6a88e22b7SJung-uk Kim 
7d244b227SJung-uk Kim /*
8d244b227SJung-uk Kim  * Copyright (C) 2000 - 2011, Intel Corp.
9a88e22b7SJung-uk Kim  * All rights reserved.
10a88e22b7SJung-uk Kim  *
11d244b227SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12d244b227SJung-uk Kim  * modification, are permitted provided that the following conditions
13d244b227SJung-uk Kim  * are met:
14d244b227SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15d244b227SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16d244b227SJung-uk Kim  *    without modification.
17d244b227SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18d244b227SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19d244b227SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20d244b227SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21d244b227SJung-uk Kim  *    binary redistribution.
22d244b227SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23d244b227SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24d244b227SJung-uk Kim  *    from this software without specific prior written permission.
25a88e22b7SJung-uk Kim  *
26d244b227SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27d244b227SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28d244b227SJung-uk Kim  * Software Foundation.
29a88e22b7SJung-uk Kim  *
30d244b227SJung-uk Kim  * NO WARRANTY
31d244b227SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32d244b227SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33d244b227SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34d244b227SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35d244b227SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36d244b227SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37d244b227SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38d244b227SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39d244b227SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40d244b227SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41d244b227SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42d244b227SJung-uk Kim  */
43a88e22b7SJung-uk Kim 
44a88e22b7SJung-uk Kim #define __DTTABLE_C__
45a88e22b7SJung-uk Kim 
46a88e22b7SJung-uk Kim /* Compile all complex data tables */
47a88e22b7SJung-uk Kim 
48a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
49a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h>
50a88e22b7SJung-uk Kim 
51a88e22b7SJung-uk Kim #define _COMPONENT          DT_COMPILER
52a88e22b7SJung-uk Kim         ACPI_MODULE_NAME    ("dttable")
53a88e22b7SJung-uk Kim 
54a88e22b7SJung-uk Kim 
55a88e22b7SJung-uk Kim /* TBD: merge these into dmtbinfo.c? */
56a88e22b7SJung-uk Kim 
57a88e22b7SJung-uk Kim static ACPI_DMTABLE_INFO           TableInfoAsfAddress[] =
58a88e22b7SJung-uk Kim {
59a88e22b7SJung-uk Kim     {ACPI_DMT_BUFFER,   0,               "Addresses", 0},
60a88e22b7SJung-uk Kim     {ACPI_DMT_EXIT,     0,               NULL, 0}
61a88e22b7SJung-uk Kim };
62a88e22b7SJung-uk Kim 
63a88e22b7SJung-uk Kim static ACPI_DMTABLE_INFO           TableInfoDmarPciPath[] =
64a88e22b7SJung-uk Kim {
65a88e22b7SJung-uk Kim     {ACPI_DMT_PCI_PATH, 0,               "PCI Path", 0},
66a88e22b7SJung-uk Kim     {ACPI_DMT_EXIT,     0,               NULL, 0}
67a88e22b7SJung-uk Kim };
68a88e22b7SJung-uk Kim 
69a88e22b7SJung-uk Kim 
70a88e22b7SJung-uk Kim /* TBD: move to acmacros.h */
71a88e22b7SJung-uk Kim 
72a88e22b7SJung-uk Kim #define ACPI_SUB_PTR(t, a, b) \
73a88e22b7SJung-uk Kim     ACPI_CAST_PTR (t, (ACPI_CAST_PTR (UINT8, (a)) - (ACPI_SIZE)(b)))
74a88e22b7SJung-uk Kim 
75a88e22b7SJung-uk Kim 
76a88e22b7SJung-uk Kim /* Local prototypes */
77a88e22b7SJung-uk Kim 
78a88e22b7SJung-uk Kim static ACPI_STATUS
79a88e22b7SJung-uk Kim DtCompileTwoSubtables (
80a88e22b7SJung-uk Kim     void                    **List,
81a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *TableInfo1,
82a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *TableInfo2);
83a88e22b7SJung-uk Kim 
84a88e22b7SJung-uk Kim 
85a88e22b7SJung-uk Kim /******************************************************************************
86a88e22b7SJung-uk Kim  *
87a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileTwoSubtables
88a88e22b7SJung-uk Kim  *
89a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
90a88e22b7SJung-uk Kim  *              TableInfo1          - Info table 1
91a88e22b7SJung-uk Kim  *              TableInfo1          - Info table 2
92a88e22b7SJung-uk Kim  *
93a88e22b7SJung-uk Kim  * RETURN:      Status
94a88e22b7SJung-uk Kim  *
95a88e22b7SJung-uk Kim  * DESCRIPTION: Compile tables with a header and one or more same subtables.
96a88e22b7SJung-uk Kim  *              Include CPEP, EINJ, ERST, MCFG, MSCT, WDAT
97a88e22b7SJung-uk Kim  *
98a88e22b7SJung-uk Kim  *****************************************************************************/
99a88e22b7SJung-uk Kim 
100a88e22b7SJung-uk Kim static ACPI_STATUS
101a88e22b7SJung-uk Kim DtCompileTwoSubtables (
102a88e22b7SJung-uk Kim     void                    **List,
103a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *TableInfo1,
104a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *TableInfo2)
105a88e22b7SJung-uk Kim {
106a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
107a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
108a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
109a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
110a88e22b7SJung-uk Kim 
111a88e22b7SJung-uk Kim 
112a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, TableInfo1, &Subtable, TRUE);
113a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
114a88e22b7SJung-uk Kim     {
115a88e22b7SJung-uk Kim         return (Status);
116a88e22b7SJung-uk Kim     }
117a88e22b7SJung-uk Kim 
118a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
119a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
120a88e22b7SJung-uk Kim 
121a88e22b7SJung-uk Kim     while (*PFieldList)
122a88e22b7SJung-uk Kim     {
123a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, TableInfo2, &Subtable, FALSE);
124a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
125a88e22b7SJung-uk Kim         {
126a88e22b7SJung-uk Kim             return (Status);
127a88e22b7SJung-uk Kim         }
128a88e22b7SJung-uk Kim 
129a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
130a88e22b7SJung-uk Kim     }
131a88e22b7SJung-uk Kim 
132a88e22b7SJung-uk Kim     return (AE_OK);
133a88e22b7SJung-uk Kim }
134a88e22b7SJung-uk Kim 
135a88e22b7SJung-uk Kim 
136a88e22b7SJung-uk Kim /******************************************************************************
137a88e22b7SJung-uk Kim  *
138a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileFacs
139a88e22b7SJung-uk Kim  *
140a88e22b7SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
141a88e22b7SJung-uk Kim  *
142a88e22b7SJung-uk Kim  * RETURN:      Status
143a88e22b7SJung-uk Kim  *
144a88e22b7SJung-uk Kim  * DESCRIPTION: Compile FACS.
145a88e22b7SJung-uk Kim  *
146a88e22b7SJung-uk Kim  *****************************************************************************/
147a88e22b7SJung-uk Kim 
148a88e22b7SJung-uk Kim ACPI_STATUS
149a88e22b7SJung-uk Kim DtCompileFacs (
150a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList)
151a88e22b7SJung-uk Kim {
152a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
153a88e22b7SJung-uk Kim     UINT8                   *ReservedBuffer;
154a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
155a88e22b7SJung-uk Kim     UINT32                  ReservedSize;
156a88e22b7SJung-uk Kim 
157a88e22b7SJung-uk Kim 
158a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs,
159a88e22b7SJung-uk Kim                 &Gbl_RootTable, TRUE);
160a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
161a88e22b7SJung-uk Kim     {
162a88e22b7SJung-uk Kim         return (Status);
163a88e22b7SJung-uk Kim     }
164a88e22b7SJung-uk Kim 
165a88e22b7SJung-uk Kim     /* Large FACS reserved area at the end of the table */
166a88e22b7SJung-uk Kim 
167a88e22b7SJung-uk Kim     ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1);
168a88e22b7SJung-uk Kim     ReservedBuffer = UtLocalCalloc (ReservedSize);
169a88e22b7SJung-uk Kim 
170a88e22b7SJung-uk Kim     DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
171a88e22b7SJung-uk Kim 
172a88e22b7SJung-uk Kim     ACPI_FREE (ReservedBuffer);
173a88e22b7SJung-uk Kim     DtInsertSubtable (Gbl_RootTable, Subtable);
174a88e22b7SJung-uk Kim     return (AE_OK);
175a88e22b7SJung-uk Kim }
176a88e22b7SJung-uk Kim 
177a88e22b7SJung-uk Kim 
178a88e22b7SJung-uk Kim /******************************************************************************
179a88e22b7SJung-uk Kim  *
180a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileRsdp
181a88e22b7SJung-uk Kim  *
182a88e22b7SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
183a88e22b7SJung-uk Kim  *
184a88e22b7SJung-uk Kim  * RETURN:      Status
185a88e22b7SJung-uk Kim  *
186a88e22b7SJung-uk Kim  * DESCRIPTION: Compile RSDP.
187a88e22b7SJung-uk Kim  *
188a88e22b7SJung-uk Kim  *****************************************************************************/
189a88e22b7SJung-uk Kim 
190a88e22b7SJung-uk Kim ACPI_STATUS
191a88e22b7SJung-uk Kim DtCompileRsdp (
192a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList)
193a88e22b7SJung-uk Kim {
194a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
195a88e22b7SJung-uk Kim     ACPI_TABLE_RSDP         *Rsdp;
196a88e22b7SJung-uk Kim     ACPI_RSDP_EXTENSION     *RsdpExtension;
197a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
198a88e22b7SJung-uk Kim 
199a88e22b7SJung-uk Kim 
200a88e22b7SJung-uk Kim     /* Compile the "common" RSDP (ACPI 1.0) */
201a88e22b7SJung-uk Kim 
202a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp1,
203a88e22b7SJung-uk Kim                 &Gbl_RootTable, TRUE);
204a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
205a88e22b7SJung-uk Kim     {
206a88e22b7SJung-uk Kim         return (Status);
207a88e22b7SJung-uk Kim     }
208a88e22b7SJung-uk Kim 
209a88e22b7SJung-uk Kim     Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Gbl_RootTable->Buffer);
210a88e22b7SJung-uk Kim     DtSetTableChecksum (&Rsdp->Checksum);
211a88e22b7SJung-uk Kim 
212a88e22b7SJung-uk Kim     if (Rsdp->Revision > 0)
213a88e22b7SJung-uk Kim     {
214a88e22b7SJung-uk Kim         /* Compile the "extended" part of the RSDP as a subtable */
215a88e22b7SJung-uk Kim 
216a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp2,
217a88e22b7SJung-uk Kim                     &Subtable, TRUE);
218a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
219a88e22b7SJung-uk Kim         {
220a88e22b7SJung-uk Kim             return (Status);
221a88e22b7SJung-uk Kim         }
222a88e22b7SJung-uk Kim 
223a88e22b7SJung-uk Kim         DtInsertSubtable (Gbl_RootTable, Subtable);
224a88e22b7SJung-uk Kim 
225a88e22b7SJung-uk Kim         /* Set length and extended checksum for entire RSDP */
226a88e22b7SJung-uk Kim 
227a88e22b7SJung-uk Kim         RsdpExtension = ACPI_CAST_PTR (ACPI_RSDP_EXTENSION, Subtable->Buffer);
228a88e22b7SJung-uk Kim         RsdpExtension->Length = Gbl_RootTable->Length + Subtable->Length;
229a88e22b7SJung-uk Kim         DtSetTableChecksum (&RsdpExtension->ExtendedChecksum);
230a88e22b7SJung-uk Kim     }
231a88e22b7SJung-uk Kim 
232a88e22b7SJung-uk Kim     return (AE_OK);
233a88e22b7SJung-uk Kim }
234a88e22b7SJung-uk Kim 
235a88e22b7SJung-uk Kim 
236a88e22b7SJung-uk Kim /******************************************************************************
237a88e22b7SJung-uk Kim  *
238a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileAsf
239a88e22b7SJung-uk Kim  *
240a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
241a88e22b7SJung-uk Kim  *
242a88e22b7SJung-uk Kim  * RETURN:      Status
243a88e22b7SJung-uk Kim  *
244a88e22b7SJung-uk Kim  * DESCRIPTION: Compile ASF!.
245a88e22b7SJung-uk Kim  *
246a88e22b7SJung-uk Kim  *****************************************************************************/
247a88e22b7SJung-uk Kim 
248a88e22b7SJung-uk Kim ACPI_STATUS
249a88e22b7SJung-uk Kim DtCompileAsf (
250a88e22b7SJung-uk Kim     void                    **List)
251a88e22b7SJung-uk Kim {
252a88e22b7SJung-uk Kim     ACPI_ASF_INFO           *AsfTable;
253a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
254a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
255a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
256a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
257a88e22b7SJung-uk Kim     UINT32                  DataCount = 0;
258a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
259a88e22b7SJung-uk Kim     UINT32                  i;
260a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
261a88e22b7SJung-uk Kim     DT_FIELD                *SubtableStart;
262a88e22b7SJung-uk Kim 
263a88e22b7SJung-uk Kim 
264a88e22b7SJung-uk Kim     while (*PFieldList)
265a88e22b7SJung-uk Kim     {
266a88e22b7SJung-uk Kim         SubtableStart = *PFieldList;
267a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr,
268a88e22b7SJung-uk Kim                     &Subtable, TRUE);
269a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
270a88e22b7SJung-uk Kim         {
271a88e22b7SJung-uk Kim             return (Status);
272a88e22b7SJung-uk Kim         }
273a88e22b7SJung-uk Kim 
274a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
275a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
276a88e22b7SJung-uk Kim         DtPushSubtable (Subtable);
277a88e22b7SJung-uk Kim 
278a88e22b7SJung-uk Kim         AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer);
279a88e22b7SJung-uk Kim 
280a88e22b7SJung-uk Kim         switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
281a88e22b7SJung-uk Kim         {
282a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_INFO:
283a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoAsf0;
284a88e22b7SJung-uk Kim             break;
285a88e22b7SJung-uk Kim 
286a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_ALERT:
287a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoAsf1;
288a88e22b7SJung-uk Kim             break;
289a88e22b7SJung-uk Kim 
290a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_CONTROL:
291a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoAsf2;
292a88e22b7SJung-uk Kim             break;
293a88e22b7SJung-uk Kim 
294a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_BOOT:
295a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoAsf3;
296a88e22b7SJung-uk Kim             break;
297a88e22b7SJung-uk Kim 
298a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_ADDRESS:
299a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoAsf4;
300a88e22b7SJung-uk Kim             break;
301a88e22b7SJung-uk Kim 
302a88e22b7SJung-uk Kim         default:
303a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
304a88e22b7SJung-uk Kim             return (AE_ERROR);
305a88e22b7SJung-uk Kim         }
306a88e22b7SJung-uk Kim 
307a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
308a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
309a88e22b7SJung-uk Kim         {
310a88e22b7SJung-uk Kim             return (Status);
311a88e22b7SJung-uk Kim         }
312a88e22b7SJung-uk Kim 
313a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
314a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
315a88e22b7SJung-uk Kim 
316a88e22b7SJung-uk Kim         switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
317a88e22b7SJung-uk Kim         {
318a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_INFO:
319a88e22b7SJung-uk Kim             DataInfoTable = NULL;
320a88e22b7SJung-uk Kim             break;
321a88e22b7SJung-uk Kim 
322a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_ALERT:
323a88e22b7SJung-uk Kim             DataInfoTable = AcpiDmTableInfoAsf1a;
324a88e22b7SJung-uk Kim             DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT,
325a88e22b7SJung-uk Kim                         ACPI_SUB_PTR (UINT8, Subtable->Buffer,
326a88e22b7SJung-uk Kim                             sizeof (ACPI_ASF_HEADER)))->Alerts;
327a88e22b7SJung-uk Kim             break;
328a88e22b7SJung-uk Kim 
329a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_CONTROL:
330a88e22b7SJung-uk Kim             DataInfoTable = AcpiDmTableInfoAsf2a;
331a88e22b7SJung-uk Kim             DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE,
332a88e22b7SJung-uk Kim                         ACPI_SUB_PTR (UINT8, Subtable->Buffer,
333a88e22b7SJung-uk Kim                             sizeof (ACPI_ASF_HEADER)))->Controls;
334a88e22b7SJung-uk Kim             break;
335a88e22b7SJung-uk Kim 
336a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_BOOT:
337a88e22b7SJung-uk Kim             DataInfoTable = NULL;
338a88e22b7SJung-uk Kim             break;
339a88e22b7SJung-uk Kim 
340a88e22b7SJung-uk Kim         case ACPI_ASF_TYPE_ADDRESS:
341a88e22b7SJung-uk Kim             DataInfoTable = TableInfoAsfAddress;
342a88e22b7SJung-uk Kim             DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS,
343a88e22b7SJung-uk Kim                         ACPI_SUB_PTR (UINT8, Subtable->Buffer,
344a88e22b7SJung-uk Kim                             sizeof (ACPI_ASF_HEADER)))->Devices;
345a88e22b7SJung-uk Kim             break;
346a88e22b7SJung-uk Kim 
347a88e22b7SJung-uk Kim         default:
348a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
349a88e22b7SJung-uk Kim             return (AE_ERROR);
350a88e22b7SJung-uk Kim         }
351a88e22b7SJung-uk Kim 
352a88e22b7SJung-uk Kim         if (DataInfoTable)
353a88e22b7SJung-uk Kim         {
354a88e22b7SJung-uk Kim             switch (AsfTable->Header.Type & 0x7F)
355a88e22b7SJung-uk Kim             {
356a88e22b7SJung-uk Kim             case ACPI_ASF_TYPE_ADDRESS:
357a88e22b7SJung-uk Kim 
358a88e22b7SJung-uk Kim                 while (DataCount > 0)
359a88e22b7SJung-uk Kim                 {
360a88e22b7SJung-uk Kim                     Status = DtCompileTable (PFieldList, DataInfoTable,
361a88e22b7SJung-uk Kim                                 &Subtable, TRUE);
362a88e22b7SJung-uk Kim                     if (ACPI_FAILURE (Status))
363a88e22b7SJung-uk Kim                     {
364a88e22b7SJung-uk Kim                         return (Status);
365a88e22b7SJung-uk Kim                     }
366a88e22b7SJung-uk Kim 
367a88e22b7SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
368a88e22b7SJung-uk Kim                     DataCount = DataCount - Subtable->Length;
369a88e22b7SJung-uk Kim                 }
370a88e22b7SJung-uk Kim                 break;
371a88e22b7SJung-uk Kim 
372a88e22b7SJung-uk Kim             default:
373a88e22b7SJung-uk Kim 
374a88e22b7SJung-uk Kim                 for (i = 0; i < DataCount; i++)
375a88e22b7SJung-uk Kim                 {
376a88e22b7SJung-uk Kim                     Status = DtCompileTable (PFieldList, DataInfoTable,
377a88e22b7SJung-uk Kim                                 &Subtable, TRUE);
378a88e22b7SJung-uk Kim                     if (ACPI_FAILURE (Status))
379a88e22b7SJung-uk Kim                     {
380a88e22b7SJung-uk Kim                         return (Status);
381a88e22b7SJung-uk Kim                     }
382a88e22b7SJung-uk Kim 
383a88e22b7SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
384a88e22b7SJung-uk Kim                 }
385a88e22b7SJung-uk Kim                 break;
386a88e22b7SJung-uk Kim             }
387a88e22b7SJung-uk Kim         }
388a88e22b7SJung-uk Kim 
389a88e22b7SJung-uk Kim         DtPopSubtable ();
390a88e22b7SJung-uk Kim     }
391a88e22b7SJung-uk Kim 
392a88e22b7SJung-uk Kim     return (AE_OK);
393a88e22b7SJung-uk Kim }
394a88e22b7SJung-uk Kim 
395a88e22b7SJung-uk Kim 
396a88e22b7SJung-uk Kim /******************************************************************************
397a88e22b7SJung-uk Kim  *
398a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileCpep
399a88e22b7SJung-uk Kim  *
400a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
401a88e22b7SJung-uk Kim  *
402a88e22b7SJung-uk Kim  * RETURN:      Status
403a88e22b7SJung-uk Kim  *
404a88e22b7SJung-uk Kim  * DESCRIPTION: Compile CPEP.
405a88e22b7SJung-uk Kim  *
406a88e22b7SJung-uk Kim  *****************************************************************************/
407a88e22b7SJung-uk Kim 
408a88e22b7SJung-uk Kim ACPI_STATUS
409a88e22b7SJung-uk Kim DtCompileCpep (
410a88e22b7SJung-uk Kim     void                    **List)
411a88e22b7SJung-uk Kim {
412a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
413a88e22b7SJung-uk Kim 
414a88e22b7SJung-uk Kim 
415a88e22b7SJung-uk Kim     Status = DtCompileTwoSubtables (List,
416a88e22b7SJung-uk Kim                  AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0);
417a88e22b7SJung-uk Kim     return (Status);
418a88e22b7SJung-uk Kim }
419a88e22b7SJung-uk Kim 
420a88e22b7SJung-uk Kim 
421a88e22b7SJung-uk Kim /******************************************************************************
422a88e22b7SJung-uk Kim  *
423a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileDmar
424a88e22b7SJung-uk Kim  *
425a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
426a88e22b7SJung-uk Kim  *
427a88e22b7SJung-uk Kim  * RETURN:      Status
428a88e22b7SJung-uk Kim  *
429a88e22b7SJung-uk Kim  * DESCRIPTION: Compile DMAR.
430a88e22b7SJung-uk Kim  *
431a88e22b7SJung-uk Kim  *****************************************************************************/
432a88e22b7SJung-uk Kim 
433a88e22b7SJung-uk Kim ACPI_STATUS
434a88e22b7SJung-uk Kim DtCompileDmar (
435a88e22b7SJung-uk Kim     void                    **List)
436a88e22b7SJung-uk Kim {
437a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
438a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
439a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
440a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
441a88e22b7SJung-uk Kim     DT_FIELD                *SubtableStart;
442a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
443a88e22b7SJung-uk Kim     ACPI_DMAR_HEADER        *DmarHeader;
444a88e22b7SJung-uk Kim     UINT8                   *ReservedBuffer;
445a88e22b7SJung-uk Kim     UINT32                  ReservedSize;
446a88e22b7SJung-uk Kim 
447a88e22b7SJung-uk Kim 
448a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable, TRUE);
449a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
450a88e22b7SJung-uk Kim     {
451a88e22b7SJung-uk Kim         return (Status);
452a88e22b7SJung-uk Kim     }
453a88e22b7SJung-uk Kim 
454a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
455a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
456a88e22b7SJung-uk Kim 
457a88e22b7SJung-uk Kim     /* DMAR Reserved area */
458a88e22b7SJung-uk Kim 
459a88e22b7SJung-uk Kim     ReservedSize = (UINT32) sizeof (((ACPI_TABLE_DMAR *) NULL)->Reserved);
460a88e22b7SJung-uk Kim     ReservedBuffer = UtLocalCalloc (ReservedSize);
461a88e22b7SJung-uk Kim 
462a88e22b7SJung-uk Kim     DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
463a88e22b7SJung-uk Kim 
464a88e22b7SJung-uk Kim     ACPI_FREE (ReservedBuffer);
465a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
466a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
467a88e22b7SJung-uk Kim 
468a88e22b7SJung-uk Kim     while (*PFieldList)
469a88e22b7SJung-uk Kim     {
470a88e22b7SJung-uk Kim         /* DMAR Header */
471a88e22b7SJung-uk Kim 
472a88e22b7SJung-uk Kim         SubtableStart = *PFieldList;
473a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr,
474a88e22b7SJung-uk Kim                     &Subtable, TRUE);
475a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
476a88e22b7SJung-uk Kim         {
477a88e22b7SJung-uk Kim             return (Status);
478a88e22b7SJung-uk Kim         }
479a88e22b7SJung-uk Kim 
480a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
481a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
482a88e22b7SJung-uk Kim         DtPushSubtable (Subtable);
483a88e22b7SJung-uk Kim 
484a88e22b7SJung-uk Kim         DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer);
485a88e22b7SJung-uk Kim 
486a88e22b7SJung-uk Kim         switch (DmarHeader->Type)
487a88e22b7SJung-uk Kim         {
488a88e22b7SJung-uk Kim         case ACPI_DMAR_TYPE_HARDWARE_UNIT:
489a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoDmar0;
490a88e22b7SJung-uk Kim             break;
491a88e22b7SJung-uk Kim         case ACPI_DMAR_TYPE_RESERVED_MEMORY:
492a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoDmar1;
493a88e22b7SJung-uk Kim             break;
494a88e22b7SJung-uk Kim         case ACPI_DMAR_TYPE_ATSR:
495a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoDmar2;
496a88e22b7SJung-uk Kim             break;
497a88e22b7SJung-uk Kim         case ACPI_DMAR_HARDWARE_AFFINITY:
498a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoDmar3;
499a88e22b7SJung-uk Kim             break;
500a88e22b7SJung-uk Kim         default:
501a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR");
502a88e22b7SJung-uk Kim             return (AE_ERROR);
503a88e22b7SJung-uk Kim         }
504a88e22b7SJung-uk Kim 
505a88e22b7SJung-uk Kim         /* DMAR Subtable */
506a88e22b7SJung-uk Kim 
507a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
508a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
509a88e22b7SJung-uk Kim         {
510a88e22b7SJung-uk Kim             return (Status);
511a88e22b7SJung-uk Kim         }
512a88e22b7SJung-uk Kim 
513a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
514a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
515a88e22b7SJung-uk Kim 
516a88e22b7SJung-uk Kim         /* Optional Device Scope subtables */
517a88e22b7SJung-uk Kim 
518a88e22b7SJung-uk Kim         while (*PFieldList)
519a88e22b7SJung-uk Kim         {
520a88e22b7SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
521a88e22b7SJung-uk Kim                         &Subtable, FALSE);
522a88e22b7SJung-uk Kim             if (Status == AE_NOT_FOUND)
523a88e22b7SJung-uk Kim             {
524a88e22b7SJung-uk Kim                 break;
525a88e22b7SJung-uk Kim             }
526a88e22b7SJung-uk Kim 
527a88e22b7SJung-uk Kim             ParentTable = DtPeekSubtable ();
528a88e22b7SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
529a88e22b7SJung-uk Kim             DtPushSubtable (Subtable);
530a88e22b7SJung-uk Kim 
531a88e22b7SJung-uk Kim             /* Optional PCI Paths */
532a88e22b7SJung-uk Kim 
533a88e22b7SJung-uk Kim             while (*PFieldList)
534a88e22b7SJung-uk Kim             {
535a88e22b7SJung-uk Kim                 Status = DtCompileTable (PFieldList, TableInfoDmarPciPath,
536a88e22b7SJung-uk Kim                             &Subtable, FALSE);
537a88e22b7SJung-uk Kim                 if (Status == AE_NOT_FOUND)
538a88e22b7SJung-uk Kim                 {
539a88e22b7SJung-uk Kim                     DtPopSubtable ();
540a88e22b7SJung-uk Kim                     break;
541a88e22b7SJung-uk Kim                 }
542a88e22b7SJung-uk Kim 
543a88e22b7SJung-uk Kim                 ParentTable = DtPeekSubtable ();
544a88e22b7SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
545a88e22b7SJung-uk Kim             }
546a88e22b7SJung-uk Kim         }
547a88e22b7SJung-uk Kim 
548a88e22b7SJung-uk Kim         DtPopSubtable ();
549a88e22b7SJung-uk Kim     }
550a88e22b7SJung-uk Kim 
551a88e22b7SJung-uk Kim     return (AE_OK);
552a88e22b7SJung-uk Kim }
553a88e22b7SJung-uk Kim 
554a88e22b7SJung-uk Kim 
555a88e22b7SJung-uk Kim /******************************************************************************
556a88e22b7SJung-uk Kim  *
557a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileEinj
558a88e22b7SJung-uk Kim  *
559a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
560a88e22b7SJung-uk Kim  *
561a88e22b7SJung-uk Kim  * RETURN:      Status
562a88e22b7SJung-uk Kim  *
563a88e22b7SJung-uk Kim  * DESCRIPTION: Compile EINJ.
564a88e22b7SJung-uk Kim  *
565a88e22b7SJung-uk Kim  *****************************************************************************/
566a88e22b7SJung-uk Kim 
567a88e22b7SJung-uk Kim ACPI_STATUS
568a88e22b7SJung-uk Kim DtCompileEinj (
569a88e22b7SJung-uk Kim     void                    **List)
570a88e22b7SJung-uk Kim {
571a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
572a88e22b7SJung-uk Kim 
573a88e22b7SJung-uk Kim 
574a88e22b7SJung-uk Kim     Status = DtCompileTwoSubtables (List,
575a88e22b7SJung-uk Kim                  AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0);
576a88e22b7SJung-uk Kim     return (Status);
577a88e22b7SJung-uk Kim }
578a88e22b7SJung-uk Kim 
579a88e22b7SJung-uk Kim 
580a88e22b7SJung-uk Kim /******************************************************************************
581a88e22b7SJung-uk Kim  *
582a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileErst
583a88e22b7SJung-uk Kim  *
584a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
585a88e22b7SJung-uk Kim  *
586a88e22b7SJung-uk Kim  * RETURN:      Status
587a88e22b7SJung-uk Kim  *
588a88e22b7SJung-uk Kim  * DESCRIPTION: Compile ERST.
589a88e22b7SJung-uk Kim  *
590a88e22b7SJung-uk Kim  *****************************************************************************/
591a88e22b7SJung-uk Kim 
592a88e22b7SJung-uk Kim ACPI_STATUS
593a88e22b7SJung-uk Kim DtCompileErst (
594a88e22b7SJung-uk Kim     void                    **List)
595a88e22b7SJung-uk Kim {
596a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
597a88e22b7SJung-uk Kim 
598a88e22b7SJung-uk Kim 
599a88e22b7SJung-uk Kim     Status = DtCompileTwoSubtables (List,
600a88e22b7SJung-uk Kim                  AcpiDmTableInfoErst, AcpiDmTableInfoEinj0);
601a88e22b7SJung-uk Kim     return (Status);
602a88e22b7SJung-uk Kim }
603a88e22b7SJung-uk Kim 
604a88e22b7SJung-uk Kim 
605a88e22b7SJung-uk Kim /******************************************************************************
606a88e22b7SJung-uk Kim  *
607a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileFadt
608a88e22b7SJung-uk Kim  *
609a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
610a88e22b7SJung-uk Kim  *
611a88e22b7SJung-uk Kim  * RETURN:      Status
612a88e22b7SJung-uk Kim  *
613a88e22b7SJung-uk Kim  * DESCRIPTION: Compile FADT.
614a88e22b7SJung-uk Kim  *
615a88e22b7SJung-uk Kim  *****************************************************************************/
616a88e22b7SJung-uk Kim 
617a88e22b7SJung-uk Kim ACPI_STATUS
618a88e22b7SJung-uk Kim DtCompileFadt (
619a88e22b7SJung-uk Kim     void                    **List)
620a88e22b7SJung-uk Kim {
621a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
622a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
623a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
624a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
625a88e22b7SJung-uk Kim     ACPI_TABLE_HEADER       *Table;
626a88e22b7SJung-uk Kim     UINT8                   Revision;
627a88e22b7SJung-uk Kim 
628a88e22b7SJung-uk Kim 
629a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1,
630a88e22b7SJung-uk Kim                 &Subtable, TRUE);
631a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
632a88e22b7SJung-uk Kim     {
633a88e22b7SJung-uk Kim         return (Status);
634a88e22b7SJung-uk Kim     }
635a88e22b7SJung-uk Kim 
636a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
637a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
638a88e22b7SJung-uk Kim 
639a88e22b7SJung-uk Kim     Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
640a88e22b7SJung-uk Kim     Revision = Table->Revision;
641a88e22b7SJung-uk Kim 
642a88e22b7SJung-uk Kim     if (Revision == 2)
643a88e22b7SJung-uk Kim     {
644a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2,
645a88e22b7SJung-uk Kim                     &Subtable, TRUE);
646a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
647a88e22b7SJung-uk Kim         {
648a88e22b7SJung-uk Kim             return (Status);
649a88e22b7SJung-uk Kim         }
650a88e22b7SJung-uk Kim 
651a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
652a88e22b7SJung-uk Kim     }
653a88e22b7SJung-uk Kim     else if (Revision >= 2)
654a88e22b7SJung-uk Kim     {
655a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3,
656a88e22b7SJung-uk Kim                     &Subtable, TRUE);
657a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
658a88e22b7SJung-uk Kim         {
659a88e22b7SJung-uk Kim             return (Status);
660a88e22b7SJung-uk Kim         }
661a88e22b7SJung-uk Kim 
662a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
663*3f0275a0SJung-uk Kim 
664*3f0275a0SJung-uk Kim         if (Revision >= 5)
665*3f0275a0SJung-uk Kim         {
666*3f0275a0SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5,
667*3f0275a0SJung-uk Kim                         &Subtable, TRUE);
668*3f0275a0SJung-uk Kim             if (ACPI_FAILURE (Status))
669*3f0275a0SJung-uk Kim             {
670*3f0275a0SJung-uk Kim                 return (Status);
671*3f0275a0SJung-uk Kim             }
672*3f0275a0SJung-uk Kim 
673*3f0275a0SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
674*3f0275a0SJung-uk Kim         }
675*3f0275a0SJung-uk Kim     }
676*3f0275a0SJung-uk Kim 
677*3f0275a0SJung-uk Kim     return (AE_OK);
678*3f0275a0SJung-uk Kim }
679*3f0275a0SJung-uk Kim 
680*3f0275a0SJung-uk Kim 
681*3f0275a0SJung-uk Kim /******************************************************************************
682*3f0275a0SJung-uk Kim  *
683*3f0275a0SJung-uk Kim  * FUNCTION:    DtCompileFpdt
684*3f0275a0SJung-uk Kim  *
685*3f0275a0SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
686*3f0275a0SJung-uk Kim  *
687*3f0275a0SJung-uk Kim  * RETURN:      Status
688*3f0275a0SJung-uk Kim  *
689*3f0275a0SJung-uk Kim  * DESCRIPTION: Compile FPDT.
690*3f0275a0SJung-uk Kim  *
691*3f0275a0SJung-uk Kim  *****************************************************************************/
692*3f0275a0SJung-uk Kim 
693*3f0275a0SJung-uk Kim ACPI_STATUS
694*3f0275a0SJung-uk Kim DtCompileFpdt (
695*3f0275a0SJung-uk Kim     void                    **List)
696*3f0275a0SJung-uk Kim {
697*3f0275a0SJung-uk Kim     ACPI_STATUS             Status;
698*3f0275a0SJung-uk Kim     ACPI_FPDT_HEADER        *FpdtHeader;
699*3f0275a0SJung-uk Kim     DT_SUBTABLE             *Subtable;
700*3f0275a0SJung-uk Kim     DT_SUBTABLE             *ParentTable;
701*3f0275a0SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
702*3f0275a0SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
703*3f0275a0SJung-uk Kim     DT_FIELD                *SubtableStart;
704*3f0275a0SJung-uk Kim 
705*3f0275a0SJung-uk Kim 
706*3f0275a0SJung-uk Kim     while (*PFieldList)
707*3f0275a0SJung-uk Kim     {
708*3f0275a0SJung-uk Kim         SubtableStart = *PFieldList;
709*3f0275a0SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr,
710*3f0275a0SJung-uk Kim                     &Subtable, TRUE);
711*3f0275a0SJung-uk Kim         if (ACPI_FAILURE (Status))
712*3f0275a0SJung-uk Kim         {
713*3f0275a0SJung-uk Kim             return (Status);
714*3f0275a0SJung-uk Kim         }
715*3f0275a0SJung-uk Kim 
716*3f0275a0SJung-uk Kim         ParentTable = DtPeekSubtable ();
717*3f0275a0SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
718*3f0275a0SJung-uk Kim         DtPushSubtable (Subtable);
719*3f0275a0SJung-uk Kim 
720*3f0275a0SJung-uk Kim         FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
721*3f0275a0SJung-uk Kim 
722*3f0275a0SJung-uk Kim         switch (FpdtHeader->Type)
723*3f0275a0SJung-uk Kim         {
724*3f0275a0SJung-uk Kim         case ACPI_FPDT_TYPE_BOOT:
725*3f0275a0SJung-uk Kim             InfoTable = AcpiDmTableInfoFpdt0;
726*3f0275a0SJung-uk Kim             break;
727*3f0275a0SJung-uk Kim 
728*3f0275a0SJung-uk Kim         case ACPI_FPDT_TYPE_S3PERF:
729*3f0275a0SJung-uk Kim             InfoTable = AcpiDmTableInfoFpdt1;
730*3f0275a0SJung-uk Kim             break;
731*3f0275a0SJung-uk Kim 
732*3f0275a0SJung-uk Kim         default:
733*3f0275a0SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT");
734*3f0275a0SJung-uk Kim             return (AE_ERROR);
735*3f0275a0SJung-uk Kim             break;
736*3f0275a0SJung-uk Kim         }
737*3f0275a0SJung-uk Kim 
738*3f0275a0SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
739*3f0275a0SJung-uk Kim         if (ACPI_FAILURE (Status))
740*3f0275a0SJung-uk Kim         {
741*3f0275a0SJung-uk Kim             return (Status);
742*3f0275a0SJung-uk Kim         }
743*3f0275a0SJung-uk Kim 
744*3f0275a0SJung-uk Kim         ParentTable = DtPeekSubtable ();
745*3f0275a0SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
746*3f0275a0SJung-uk Kim         DtPopSubtable ();
747a88e22b7SJung-uk Kim     }
748a88e22b7SJung-uk Kim 
749a88e22b7SJung-uk Kim     return (AE_OK);
750a88e22b7SJung-uk Kim }
751a88e22b7SJung-uk Kim 
752a88e22b7SJung-uk Kim 
753a88e22b7SJung-uk Kim /******************************************************************************
754a88e22b7SJung-uk Kim  *
755a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileHest
756a88e22b7SJung-uk Kim  *
757a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
758a88e22b7SJung-uk Kim  *
759a88e22b7SJung-uk Kim  * RETURN:      Status
760a88e22b7SJung-uk Kim  *
761a88e22b7SJung-uk Kim  * DESCRIPTION: Compile HEST.
762a88e22b7SJung-uk Kim  *
763a88e22b7SJung-uk Kim  *****************************************************************************/
764a88e22b7SJung-uk Kim 
765a88e22b7SJung-uk Kim ACPI_STATUS
766a88e22b7SJung-uk Kim DtCompileHest (
767a88e22b7SJung-uk Kim     void                    **List)
768a88e22b7SJung-uk Kim {
769a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
770a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
771a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
772a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
773a88e22b7SJung-uk Kim     DT_FIELD                *SubtableStart;
774a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
775a88e22b7SJung-uk Kim     UINT16                  Type;
776a88e22b7SJung-uk Kim     UINT32                  BankCount;
777a88e22b7SJung-uk Kim 
778a88e22b7SJung-uk Kim 
779a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest,
780a88e22b7SJung-uk Kim                 &Subtable, TRUE);
781a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
782a88e22b7SJung-uk Kim     {
783a88e22b7SJung-uk Kim         return (Status);
784a88e22b7SJung-uk Kim     }
785a88e22b7SJung-uk Kim 
786a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
787a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
788a88e22b7SJung-uk Kim 
789a88e22b7SJung-uk Kim     while (*PFieldList)
790a88e22b7SJung-uk Kim     {
791a88e22b7SJung-uk Kim         /* Get subtable type */
792a88e22b7SJung-uk Kim 
793a88e22b7SJung-uk Kim         SubtableStart = *PFieldList;
794a88e22b7SJung-uk Kim         DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
795a88e22b7SJung-uk Kim 
796a88e22b7SJung-uk Kim         switch (Type)
797a88e22b7SJung-uk Kim         {
798a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_IA32_CHECK:
799a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoHest0;
800a88e22b7SJung-uk Kim             break;
801a88e22b7SJung-uk Kim 
802a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
803a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoHest1;
804a88e22b7SJung-uk Kim             break;
805a88e22b7SJung-uk Kim 
806a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_IA32_NMI:
807a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoHest2;
808a88e22b7SJung-uk Kim             break;
809a88e22b7SJung-uk Kim 
810a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_AER_ROOT_PORT:
811a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoHest6;
812a88e22b7SJung-uk Kim             break;
813a88e22b7SJung-uk Kim 
814a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_AER_ENDPOINT:
815a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoHest7;
816a88e22b7SJung-uk Kim             break;
817a88e22b7SJung-uk Kim 
818a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_AER_BRIDGE:
819a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoHest8;
820a88e22b7SJung-uk Kim             break;
821a88e22b7SJung-uk Kim 
822a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_GENERIC_ERROR:
823a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoHest9;
824a88e22b7SJung-uk Kim             break;
825a88e22b7SJung-uk Kim 
826a88e22b7SJung-uk Kim         default:
827a88e22b7SJung-uk Kim             /* Cannot continue on unknown type */
828a88e22b7SJung-uk Kim 
829a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST");
830a88e22b7SJung-uk Kim             return (AE_ERROR);
831a88e22b7SJung-uk Kim         }
832a88e22b7SJung-uk Kim 
833a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
834a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
835a88e22b7SJung-uk Kim         {
836a88e22b7SJung-uk Kim             return (Status);
837a88e22b7SJung-uk Kim         }
838a88e22b7SJung-uk Kim 
839a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
840a88e22b7SJung-uk Kim 
841a88e22b7SJung-uk Kim         /*
842a88e22b7SJung-uk Kim          * Additional subtable data - IA32 Error Bank(s)
843a88e22b7SJung-uk Kim          */
844a88e22b7SJung-uk Kim         BankCount = 0;
845a88e22b7SJung-uk Kim         switch (Type)
846a88e22b7SJung-uk Kim         {
847a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_IA32_CHECK:
848a88e22b7SJung-uk Kim             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
849a88e22b7SJung-uk Kim                             Subtable->Buffer))->NumHardwareBanks;
850a88e22b7SJung-uk Kim             break;
851a88e22b7SJung-uk Kim 
852a88e22b7SJung-uk Kim         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
853a88e22b7SJung-uk Kim             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
854a88e22b7SJung-uk Kim                             Subtable->Buffer))->NumHardwareBanks;
855a88e22b7SJung-uk Kim             break;
856a88e22b7SJung-uk Kim 
857a88e22b7SJung-uk Kim         default:
858a88e22b7SJung-uk Kim             break;
859a88e22b7SJung-uk Kim         }
860a88e22b7SJung-uk Kim 
861a88e22b7SJung-uk Kim         while (BankCount)
862a88e22b7SJung-uk Kim         {
863a88e22b7SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank,
864a88e22b7SJung-uk Kim                         &Subtable, TRUE);
865a88e22b7SJung-uk Kim             if (ACPI_FAILURE (Status))
866a88e22b7SJung-uk Kim             {
867a88e22b7SJung-uk Kim                 return (Status);
868a88e22b7SJung-uk Kim             }
869a88e22b7SJung-uk Kim 
870a88e22b7SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
871a88e22b7SJung-uk Kim             BankCount--;
872a88e22b7SJung-uk Kim         }
873a88e22b7SJung-uk Kim     }
874a88e22b7SJung-uk Kim 
875a88e22b7SJung-uk Kim     return AE_OK;
876a88e22b7SJung-uk Kim }
877a88e22b7SJung-uk Kim 
878a88e22b7SJung-uk Kim 
879a88e22b7SJung-uk Kim /******************************************************************************
880a88e22b7SJung-uk Kim  *
881a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileIvrs
882a88e22b7SJung-uk Kim  *
883a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
884a88e22b7SJung-uk Kim  *
885a88e22b7SJung-uk Kim  * RETURN:      Status
886a88e22b7SJung-uk Kim  *
887a88e22b7SJung-uk Kim  * DESCRIPTION: Compile IVRS.
888a88e22b7SJung-uk Kim  *
889a88e22b7SJung-uk Kim  *****************************************************************************/
890a88e22b7SJung-uk Kim 
891a88e22b7SJung-uk Kim ACPI_STATUS
892a88e22b7SJung-uk Kim DtCompileIvrs (
893a88e22b7SJung-uk Kim     void                    **List)
894a88e22b7SJung-uk Kim {
895a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
896a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
897a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
898a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
899a88e22b7SJung-uk Kim     DT_FIELD                *SubtableStart;
900a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
901a88e22b7SJung-uk Kim     ACPI_IVRS_HEADER        *IvrsHeader;
902a88e22b7SJung-uk Kim     UINT8                   EntryType;
903a88e22b7SJung-uk Kim 
904a88e22b7SJung-uk Kim 
905a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs,
906a88e22b7SJung-uk Kim                 &Subtable, TRUE);
907a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
908a88e22b7SJung-uk Kim     {
909a88e22b7SJung-uk Kim         return (Status);
910a88e22b7SJung-uk Kim     }
911a88e22b7SJung-uk Kim 
912a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
913a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
914a88e22b7SJung-uk Kim 
915a88e22b7SJung-uk Kim     while (*PFieldList)
916a88e22b7SJung-uk Kim     {
917a88e22b7SJung-uk Kim         SubtableStart = *PFieldList;
918a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHdr,
919a88e22b7SJung-uk Kim                     &Subtable, TRUE);
920a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
921a88e22b7SJung-uk Kim         {
922a88e22b7SJung-uk Kim             return (Status);
923a88e22b7SJung-uk Kim         }
924a88e22b7SJung-uk Kim 
925a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
926a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
927a88e22b7SJung-uk Kim         DtPushSubtable (Subtable);
928a88e22b7SJung-uk Kim 
929a88e22b7SJung-uk Kim         IvrsHeader = ACPI_CAST_PTR (ACPI_IVRS_HEADER, Subtable->Buffer);
930a88e22b7SJung-uk Kim 
931a88e22b7SJung-uk Kim         switch (IvrsHeader->Type)
932a88e22b7SJung-uk Kim         {
933a88e22b7SJung-uk Kim         case ACPI_IVRS_TYPE_HARDWARE:
934a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoIvrs0;
935a88e22b7SJung-uk Kim             break;
936a88e22b7SJung-uk Kim 
937a88e22b7SJung-uk Kim         case ACPI_IVRS_TYPE_MEMORY1:
938a88e22b7SJung-uk Kim         case ACPI_IVRS_TYPE_MEMORY2:
939a88e22b7SJung-uk Kim         case ACPI_IVRS_TYPE_MEMORY3:
940a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoIvrs1;
941a88e22b7SJung-uk Kim             break;
942a88e22b7SJung-uk Kim 
943a88e22b7SJung-uk Kim         default:
944a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS");
945a88e22b7SJung-uk Kim             return (AE_ERROR);
946a88e22b7SJung-uk Kim         }
947a88e22b7SJung-uk Kim 
948a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
949a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
950a88e22b7SJung-uk Kim         {
951a88e22b7SJung-uk Kim             return (Status);
952a88e22b7SJung-uk Kim         }
953a88e22b7SJung-uk Kim 
954a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
955a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
956a88e22b7SJung-uk Kim 
957a88e22b7SJung-uk Kim         if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE)
958a88e22b7SJung-uk Kim         {
959a88e22b7SJung-uk Kim             while (*PFieldList &&
960a88e22b7SJung-uk Kim                     !ACPI_STRCMP ((*PFieldList)->Name, "Entry Type"))
961a88e22b7SJung-uk Kim             {
962a88e22b7SJung-uk Kim                 SubtableStart = *PFieldList;
963a88e22b7SJung-uk Kim                 DtCompileInteger (&EntryType, *PFieldList, 1, 0);
964a88e22b7SJung-uk Kim 
965a88e22b7SJung-uk Kim                 switch (EntryType)
966a88e22b7SJung-uk Kim                 {
967a88e22b7SJung-uk Kim                 /* 4-byte device entries */
968a88e22b7SJung-uk Kim 
969a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_PAD4:
970a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_ALL:
971a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_SELECT:
972a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_START:
973a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_END:
974a88e22b7SJung-uk Kim 
975a88e22b7SJung-uk Kim                     InfoTable = AcpiDmTableInfoIvrs4;
976a88e22b7SJung-uk Kim                     break;
977a88e22b7SJung-uk Kim 
978a88e22b7SJung-uk Kim                 /* 8-byte entries, type A */
979a88e22b7SJung-uk Kim 
980a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_ALIAS_SELECT:
981a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_ALIAS_START:
982a88e22b7SJung-uk Kim 
983a88e22b7SJung-uk Kim                     InfoTable = AcpiDmTableInfoIvrs8a;
984a88e22b7SJung-uk Kim                     break;
985a88e22b7SJung-uk Kim 
986a88e22b7SJung-uk Kim                 /* 8-byte entries, type B */
987a88e22b7SJung-uk Kim 
988a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_PAD8:
989a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_EXT_SELECT:
990a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_EXT_START:
991a88e22b7SJung-uk Kim 
992a88e22b7SJung-uk Kim                     InfoTable = AcpiDmTableInfoIvrs8b;
993a88e22b7SJung-uk Kim                     break;
994a88e22b7SJung-uk Kim 
995a88e22b7SJung-uk Kim                 /* 8-byte entries, type C */
996a88e22b7SJung-uk Kim 
997a88e22b7SJung-uk Kim                 case ACPI_IVRS_TYPE_SPECIAL:
998a88e22b7SJung-uk Kim 
999a88e22b7SJung-uk Kim                     InfoTable = AcpiDmTableInfoIvrs8c;
1000a88e22b7SJung-uk Kim                     break;
1001a88e22b7SJung-uk Kim 
1002a88e22b7SJung-uk Kim                 default:
1003a88e22b7SJung-uk Kim                     DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart,
1004a88e22b7SJung-uk Kim                         "IVRS Device Entry");
1005a88e22b7SJung-uk Kim                     return (AE_ERROR);
1006a88e22b7SJung-uk Kim                 }
1007a88e22b7SJung-uk Kim 
1008a88e22b7SJung-uk Kim                 Status = DtCompileTable (PFieldList, InfoTable,
1009a88e22b7SJung-uk Kim                             &Subtable, TRUE);
1010a88e22b7SJung-uk Kim                 if (ACPI_FAILURE (Status))
1011a88e22b7SJung-uk Kim                 {
1012a88e22b7SJung-uk Kim                     return (Status);
1013a88e22b7SJung-uk Kim                 }
1014a88e22b7SJung-uk Kim 
1015a88e22b7SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1016a88e22b7SJung-uk Kim             }
1017a88e22b7SJung-uk Kim         }
1018a88e22b7SJung-uk Kim 
1019a88e22b7SJung-uk Kim         DtPopSubtable ();
1020a88e22b7SJung-uk Kim     }
1021a88e22b7SJung-uk Kim 
1022a88e22b7SJung-uk Kim     return (AE_OK);
1023a88e22b7SJung-uk Kim }
1024a88e22b7SJung-uk Kim 
1025a88e22b7SJung-uk Kim 
1026a88e22b7SJung-uk Kim /******************************************************************************
1027a88e22b7SJung-uk Kim  *
1028a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileMadt
1029a88e22b7SJung-uk Kim  *
1030a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1031a88e22b7SJung-uk Kim  *
1032a88e22b7SJung-uk Kim  * RETURN:      Status
1033a88e22b7SJung-uk Kim  *
1034a88e22b7SJung-uk Kim  * DESCRIPTION: Compile MADT.
1035a88e22b7SJung-uk Kim  *
1036a88e22b7SJung-uk Kim  *****************************************************************************/
1037a88e22b7SJung-uk Kim 
1038a88e22b7SJung-uk Kim ACPI_STATUS
1039a88e22b7SJung-uk Kim DtCompileMadt (
1040a88e22b7SJung-uk Kim     void                    **List)
1041a88e22b7SJung-uk Kim {
1042a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
1043a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
1044a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1045a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1046a88e22b7SJung-uk Kim     DT_FIELD                *SubtableStart;
1047a88e22b7SJung-uk Kim     ACPI_SUBTABLE_HEADER    *MadtHeader;
1048a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1049a88e22b7SJung-uk Kim 
1050a88e22b7SJung-uk Kim 
1051a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
1052a88e22b7SJung-uk Kim                 &Subtable, TRUE);
1053a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
1054a88e22b7SJung-uk Kim     {
1055a88e22b7SJung-uk Kim         return (Status);
1056a88e22b7SJung-uk Kim     }
1057a88e22b7SJung-uk Kim 
1058a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
1059a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1060a88e22b7SJung-uk Kim 
1061a88e22b7SJung-uk Kim     while (*PFieldList)
1062a88e22b7SJung-uk Kim     {
1063a88e22b7SJung-uk Kim         SubtableStart = *PFieldList;
1064a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
1065a88e22b7SJung-uk Kim                     &Subtable, TRUE);
1066a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
1067a88e22b7SJung-uk Kim         {
1068a88e22b7SJung-uk Kim             return (Status);
1069a88e22b7SJung-uk Kim         }
1070a88e22b7SJung-uk Kim 
1071a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
1072a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1073a88e22b7SJung-uk Kim         DtPushSubtable (Subtable);
1074a88e22b7SJung-uk Kim 
1075a88e22b7SJung-uk Kim         MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1076a88e22b7SJung-uk Kim 
1077a88e22b7SJung-uk Kim         switch (MadtHeader->Type)
1078a88e22b7SJung-uk Kim         {
1079a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_APIC:
1080a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt0;
1081a88e22b7SJung-uk Kim             break;
1082a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_IO_APIC:
1083a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt1;
1084a88e22b7SJung-uk Kim             break;
1085a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
1086a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt2;
1087a88e22b7SJung-uk Kim             break;
1088a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_NMI_SOURCE:
1089a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt3;
1090a88e22b7SJung-uk Kim             break;
1091a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
1092a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt4;
1093a88e22b7SJung-uk Kim             break;
1094a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
1095a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt5;
1096a88e22b7SJung-uk Kim             break;
1097a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_IO_SAPIC:
1098a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt6;
1099a88e22b7SJung-uk Kim             break;
1100a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_SAPIC:
1101a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt7;
1102a88e22b7SJung-uk Kim             break;
1103a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
1104a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt8;
1105a88e22b7SJung-uk Kim             break;
1106a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_X2APIC:
1107a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt9;
1108a88e22b7SJung-uk Kim             break;
1109a88e22b7SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
1110a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt10;
1111a88e22b7SJung-uk Kim             break;
1112*3f0275a0SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
1113*3f0275a0SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt11;
1114*3f0275a0SJung-uk Kim             break;
1115*3f0275a0SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
1116*3f0275a0SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt12;
1117*3f0275a0SJung-uk Kim             break;
1118a88e22b7SJung-uk Kim         default:
1119a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
1120a88e22b7SJung-uk Kim             return (AE_ERROR);
1121a88e22b7SJung-uk Kim         }
1122a88e22b7SJung-uk Kim 
1123a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1124a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
1125a88e22b7SJung-uk Kim         {
1126a88e22b7SJung-uk Kim             return (Status);
1127a88e22b7SJung-uk Kim         }
1128a88e22b7SJung-uk Kim 
1129a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
1130a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1131a88e22b7SJung-uk Kim         DtPopSubtable ();
1132a88e22b7SJung-uk Kim     }
1133a88e22b7SJung-uk Kim 
1134a88e22b7SJung-uk Kim     return (AE_OK);
1135a88e22b7SJung-uk Kim }
1136a88e22b7SJung-uk Kim 
1137a88e22b7SJung-uk Kim 
1138a88e22b7SJung-uk Kim /******************************************************************************
1139a88e22b7SJung-uk Kim  *
1140a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileMcfg
1141a88e22b7SJung-uk Kim  *
1142a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1143a88e22b7SJung-uk Kim  *
1144a88e22b7SJung-uk Kim  * RETURN:      Status
1145a88e22b7SJung-uk Kim  *
1146a88e22b7SJung-uk Kim  * DESCRIPTION: Compile MCFG.
1147a88e22b7SJung-uk Kim  *
1148a88e22b7SJung-uk Kim  *****************************************************************************/
1149a88e22b7SJung-uk Kim 
1150a88e22b7SJung-uk Kim ACPI_STATUS
1151a88e22b7SJung-uk Kim DtCompileMcfg (
1152a88e22b7SJung-uk Kim     void                    **List)
1153a88e22b7SJung-uk Kim {
1154a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
1155a88e22b7SJung-uk Kim 
1156a88e22b7SJung-uk Kim 
1157a88e22b7SJung-uk Kim     Status = DtCompileTwoSubtables (List,
1158a88e22b7SJung-uk Kim                  AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
1159a88e22b7SJung-uk Kim     return (Status);
1160a88e22b7SJung-uk Kim }
1161a88e22b7SJung-uk Kim 
1162a88e22b7SJung-uk Kim 
1163a88e22b7SJung-uk Kim /******************************************************************************
1164a88e22b7SJung-uk Kim  *
1165*3f0275a0SJung-uk Kim  * FUNCTION:    DtCompileMpst
1166*3f0275a0SJung-uk Kim  *
1167*3f0275a0SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1168*3f0275a0SJung-uk Kim  *
1169*3f0275a0SJung-uk Kim  * RETURN:      Status
1170*3f0275a0SJung-uk Kim  *
1171*3f0275a0SJung-uk Kim  * DESCRIPTION: Compile MPST.
1172*3f0275a0SJung-uk Kim  *
1173*3f0275a0SJung-uk Kim  *****************************************************************************/
1174*3f0275a0SJung-uk Kim 
1175*3f0275a0SJung-uk Kim ACPI_STATUS
1176*3f0275a0SJung-uk Kim DtCompileMpst (
1177*3f0275a0SJung-uk Kim     void                    **List)
1178*3f0275a0SJung-uk Kim {
1179*3f0275a0SJung-uk Kim     ACPI_STATUS             Status;
1180*3f0275a0SJung-uk Kim     DT_SUBTABLE             *Subtable;
1181*3f0275a0SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1182*3f0275a0SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1183*3f0275a0SJung-uk Kim     ACPI_MPST_CHANNEL       *MpstChannelInfo;
1184*3f0275a0SJung-uk Kim     ACPI_MPST_POWER_NODE    *MpstPowerNode;
1185*3f0275a0SJung-uk Kim     ACPI_MPST_DATA_HDR      *MpstDataHeader;
1186*3f0275a0SJung-uk Kim     UINT16                  SubtableCount;
1187*3f0275a0SJung-uk Kim     UINT8                   PowerStateCount;
1188*3f0275a0SJung-uk Kim     UINT8                   ComponentCount;
1189*3f0275a0SJung-uk Kim 
1190*3f0275a0SJung-uk Kim 
1191*3f0275a0SJung-uk Kim     /* Main table */
1192*3f0275a0SJung-uk Kim 
1193*3f0275a0SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable, TRUE);
1194*3f0275a0SJung-uk Kim     if (ACPI_FAILURE (Status))
1195*3f0275a0SJung-uk Kim     {
1196*3f0275a0SJung-uk Kim         return (Status);
1197*3f0275a0SJung-uk Kim     }
1198*3f0275a0SJung-uk Kim 
1199*3f0275a0SJung-uk Kim     ParentTable = DtPeekSubtable ();
1200*3f0275a0SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1201*3f0275a0SJung-uk Kim     DtPushSubtable (Subtable);
1202*3f0275a0SJung-uk Kim 
1203*3f0275a0SJung-uk Kim     MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
1204*3f0275a0SJung-uk Kim     SubtableCount = MpstChannelInfo->PowerNodeCount;
1205*3f0275a0SJung-uk Kim 
1206*3f0275a0SJung-uk Kim     while (*PFieldList && SubtableCount)
1207*3f0275a0SJung-uk Kim     {
1208*3f0275a0SJung-uk Kim         /* Subtable: Memory Power Node(s) */
1209*3f0275a0SJung-uk Kim 
1210*3f0275a0SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
1211*3f0275a0SJung-uk Kim                     &Subtable, TRUE);
1212*3f0275a0SJung-uk Kim         if (ACPI_FAILURE (Status))
1213*3f0275a0SJung-uk Kim         {
1214*3f0275a0SJung-uk Kim             return (Status);
1215*3f0275a0SJung-uk Kim         }
1216*3f0275a0SJung-uk Kim 
1217*3f0275a0SJung-uk Kim         ParentTable = DtPeekSubtable ();
1218*3f0275a0SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1219*3f0275a0SJung-uk Kim         DtPushSubtable (Subtable);
1220*3f0275a0SJung-uk Kim 
1221*3f0275a0SJung-uk Kim         MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
1222*3f0275a0SJung-uk Kim         PowerStateCount = MpstPowerNode->NumPowerStates;
1223*3f0275a0SJung-uk Kim         ComponentCount = MpstPowerNode->NumPhysicalComponents;
1224*3f0275a0SJung-uk Kim 
1225*3f0275a0SJung-uk Kim         ParentTable = DtPeekSubtable ();
1226*3f0275a0SJung-uk Kim 
1227*3f0275a0SJung-uk Kim         /* Sub-subtables - Memory Power State Structure(s) */
1228*3f0275a0SJung-uk Kim 
1229*3f0275a0SJung-uk Kim         while (*PFieldList && PowerStateCount)
1230*3f0275a0SJung-uk Kim         {
1231*3f0275a0SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
1232*3f0275a0SJung-uk Kim                         &Subtable, TRUE);
1233*3f0275a0SJung-uk Kim             if (ACPI_FAILURE (Status))
1234*3f0275a0SJung-uk Kim             {
1235*3f0275a0SJung-uk Kim                 return (Status);
1236*3f0275a0SJung-uk Kim             }
1237*3f0275a0SJung-uk Kim 
1238*3f0275a0SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1239*3f0275a0SJung-uk Kim             PowerStateCount--;
1240*3f0275a0SJung-uk Kim         }
1241*3f0275a0SJung-uk Kim 
1242*3f0275a0SJung-uk Kim         /* Sub-subtables - Physical Component ID Structure(s) */
1243*3f0275a0SJung-uk Kim 
1244*3f0275a0SJung-uk Kim         while (*PFieldList && ComponentCount)
1245*3f0275a0SJung-uk Kim         {
1246*3f0275a0SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
1247*3f0275a0SJung-uk Kim                         &Subtable, TRUE);
1248*3f0275a0SJung-uk Kim             if (ACPI_FAILURE (Status))
1249*3f0275a0SJung-uk Kim             {
1250*3f0275a0SJung-uk Kim                 return (Status);
1251*3f0275a0SJung-uk Kim             }
1252*3f0275a0SJung-uk Kim 
1253*3f0275a0SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1254*3f0275a0SJung-uk Kim             ComponentCount--;
1255*3f0275a0SJung-uk Kim         }
1256*3f0275a0SJung-uk Kim 
1257*3f0275a0SJung-uk Kim         SubtableCount--;
1258*3f0275a0SJung-uk Kim         DtPopSubtable ();
1259*3f0275a0SJung-uk Kim     }
1260*3f0275a0SJung-uk Kim 
1261*3f0275a0SJung-uk Kim     /* Subtable: Count of Memory Power State Characteristic structures */
1262*3f0275a0SJung-uk Kim 
1263*3f0275a0SJung-uk Kim     DtPopSubtable ();
1264*3f0275a0SJung-uk Kim 
1265*3f0275a0SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable, TRUE);
1266*3f0275a0SJung-uk Kim     if (ACPI_FAILURE (Status))
1267*3f0275a0SJung-uk Kim     {
1268*3f0275a0SJung-uk Kim         return (Status);
1269*3f0275a0SJung-uk Kim     }
1270*3f0275a0SJung-uk Kim 
1271*3f0275a0SJung-uk Kim     ParentTable = DtPeekSubtable ();
1272*3f0275a0SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1273*3f0275a0SJung-uk Kim     DtPushSubtable (Subtable);
1274*3f0275a0SJung-uk Kim 
1275*3f0275a0SJung-uk Kim     MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
1276*3f0275a0SJung-uk Kim     SubtableCount = MpstDataHeader->CharacteristicsCount;
1277*3f0275a0SJung-uk Kim 
1278*3f0275a0SJung-uk Kim     ParentTable = DtPeekSubtable ();
1279*3f0275a0SJung-uk Kim 
1280*3f0275a0SJung-uk Kim     /* Subtable: Memory Power State Characteristics structure(s) */
1281*3f0275a0SJung-uk Kim 
1282*3f0275a0SJung-uk Kim     while (*PFieldList && SubtableCount)
1283*3f0275a0SJung-uk Kim     {
1284*3f0275a0SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
1285*3f0275a0SJung-uk Kim                     &Subtable, TRUE);
1286*3f0275a0SJung-uk Kim         if (ACPI_FAILURE (Status))
1287*3f0275a0SJung-uk Kim         {
1288*3f0275a0SJung-uk Kim             return (Status);
1289*3f0275a0SJung-uk Kim         }
1290*3f0275a0SJung-uk Kim 
1291*3f0275a0SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1292*3f0275a0SJung-uk Kim         SubtableCount--;
1293*3f0275a0SJung-uk Kim     }
1294*3f0275a0SJung-uk Kim 
1295*3f0275a0SJung-uk Kim     DtPopSubtable ();
1296*3f0275a0SJung-uk Kim     return (AE_OK);
1297*3f0275a0SJung-uk Kim }
1298*3f0275a0SJung-uk Kim 
1299*3f0275a0SJung-uk Kim 
1300*3f0275a0SJung-uk Kim /******************************************************************************
1301*3f0275a0SJung-uk Kim  *
1302a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileMsct
1303a88e22b7SJung-uk Kim  *
1304a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1305a88e22b7SJung-uk Kim  *
1306a88e22b7SJung-uk Kim  * RETURN:      Status
1307a88e22b7SJung-uk Kim  *
1308a88e22b7SJung-uk Kim  * DESCRIPTION: Compile MSCT.
1309a88e22b7SJung-uk Kim  *
1310a88e22b7SJung-uk Kim  *****************************************************************************/
1311a88e22b7SJung-uk Kim 
1312a88e22b7SJung-uk Kim ACPI_STATUS
1313a88e22b7SJung-uk Kim DtCompileMsct (
1314a88e22b7SJung-uk Kim     void                    **List)
1315a88e22b7SJung-uk Kim {
1316a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
1317a88e22b7SJung-uk Kim 
1318a88e22b7SJung-uk Kim 
1319a88e22b7SJung-uk Kim     Status = DtCompileTwoSubtables (List,
1320a88e22b7SJung-uk Kim                  AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
1321a88e22b7SJung-uk Kim     return (Status);
1322a88e22b7SJung-uk Kim }
1323a88e22b7SJung-uk Kim 
1324a88e22b7SJung-uk Kim 
1325a88e22b7SJung-uk Kim /******************************************************************************
1326a88e22b7SJung-uk Kim  *
1327*3f0275a0SJung-uk Kim  * FUNCTION:    DtCompilePmtt
1328*3f0275a0SJung-uk Kim  *
1329*3f0275a0SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1330*3f0275a0SJung-uk Kim  *
1331*3f0275a0SJung-uk Kim  * RETURN:      Status
1332*3f0275a0SJung-uk Kim  *
1333*3f0275a0SJung-uk Kim  * DESCRIPTION: Compile PMTT.
1334*3f0275a0SJung-uk Kim  *
1335*3f0275a0SJung-uk Kim  *****************************************************************************/
1336*3f0275a0SJung-uk Kim 
1337*3f0275a0SJung-uk Kim ACPI_STATUS
1338*3f0275a0SJung-uk Kim DtCompilePmtt (
1339*3f0275a0SJung-uk Kim     void                    **List)
1340*3f0275a0SJung-uk Kim {
1341*3f0275a0SJung-uk Kim     ACPI_STATUS             Status;
1342*3f0275a0SJung-uk Kim     DT_SUBTABLE             *Subtable;
1343*3f0275a0SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1344*3f0275a0SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1345*3f0275a0SJung-uk Kim     DT_FIELD                *SubtableStart;
1346*3f0275a0SJung-uk Kim     ACPI_PMTT_HEADER        *PmttHeader;
1347*3f0275a0SJung-uk Kim     ACPI_PMTT_CONTROLLER    *PmttController;
1348*3f0275a0SJung-uk Kim     UINT16                  DomainCount;
1349*3f0275a0SJung-uk Kim     UINT8                   PrevType = ACPI_PMTT_TYPE_SOCKET;
1350*3f0275a0SJung-uk Kim 
1351*3f0275a0SJung-uk Kim 
1352*3f0275a0SJung-uk Kim     /* Main table */
1353*3f0275a0SJung-uk Kim 
1354*3f0275a0SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable, TRUE);
1355*3f0275a0SJung-uk Kim     if (ACPI_FAILURE (Status))
1356*3f0275a0SJung-uk Kim     {
1357*3f0275a0SJung-uk Kim         return (Status);
1358*3f0275a0SJung-uk Kim     }
1359*3f0275a0SJung-uk Kim 
1360*3f0275a0SJung-uk Kim     ParentTable = DtPeekSubtable ();
1361*3f0275a0SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1362*3f0275a0SJung-uk Kim     DtPushSubtable (Subtable);
1363*3f0275a0SJung-uk Kim 
1364*3f0275a0SJung-uk Kim     while (*PFieldList)
1365*3f0275a0SJung-uk Kim     {
1366*3f0275a0SJung-uk Kim         SubtableStart = *PFieldList;
1367*3f0275a0SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr,
1368*3f0275a0SJung-uk Kim                     &Subtable, TRUE);
1369*3f0275a0SJung-uk Kim         if (ACPI_FAILURE (Status))
1370*3f0275a0SJung-uk Kim         {
1371*3f0275a0SJung-uk Kim             return (Status);
1372*3f0275a0SJung-uk Kim         }
1373*3f0275a0SJung-uk Kim 
1374*3f0275a0SJung-uk Kim         PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer);
1375*3f0275a0SJung-uk Kim         while (PrevType >= PmttHeader->Type)
1376*3f0275a0SJung-uk Kim         {
1377*3f0275a0SJung-uk Kim             DtPopSubtable ();
1378*3f0275a0SJung-uk Kim 
1379*3f0275a0SJung-uk Kim             if (PrevType == ACPI_PMTT_TYPE_SOCKET)
1380*3f0275a0SJung-uk Kim             {
1381*3f0275a0SJung-uk Kim                 break;
1382*3f0275a0SJung-uk Kim             }
1383*3f0275a0SJung-uk Kim             PrevType--;
1384*3f0275a0SJung-uk Kim         }
1385*3f0275a0SJung-uk Kim         PrevType = PmttHeader->Type;
1386*3f0275a0SJung-uk Kim 
1387*3f0275a0SJung-uk Kim         ParentTable = DtPeekSubtable ();
1388*3f0275a0SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1389*3f0275a0SJung-uk Kim         DtPushSubtable (Subtable);
1390*3f0275a0SJung-uk Kim 
1391*3f0275a0SJung-uk Kim         switch (PmttHeader->Type)
1392*3f0275a0SJung-uk Kim         {
1393*3f0275a0SJung-uk Kim         case ACPI_PMTT_TYPE_SOCKET:
1394*3f0275a0SJung-uk Kim 
1395*3f0275a0SJung-uk Kim             /* Subtable: Socket Structure */
1396*3f0275a0SJung-uk Kim 
1397*3f0275a0SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
1398*3f0275a0SJung-uk Kim                     &Subtable, TRUE);
1399*3f0275a0SJung-uk Kim             if (ACPI_FAILURE (Status))
1400*3f0275a0SJung-uk Kim             {
1401*3f0275a0SJung-uk Kim                 return (Status);
1402*3f0275a0SJung-uk Kim             }
1403*3f0275a0SJung-uk Kim 
1404*3f0275a0SJung-uk Kim             ParentTable = DtPeekSubtable ();
1405*3f0275a0SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1406*3f0275a0SJung-uk Kim             break;
1407*3f0275a0SJung-uk Kim 
1408*3f0275a0SJung-uk Kim         case ACPI_PMTT_TYPE_CONTROLLER:
1409*3f0275a0SJung-uk Kim 
1410*3f0275a0SJung-uk Kim             /* Subtable: Memory Controller Structure */
1411*3f0275a0SJung-uk Kim 
1412*3f0275a0SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
1413*3f0275a0SJung-uk Kim                     &Subtable, TRUE);
1414*3f0275a0SJung-uk Kim             if (ACPI_FAILURE (Status))
1415*3f0275a0SJung-uk Kim             {
1416*3f0275a0SJung-uk Kim                 return (Status);
1417*3f0275a0SJung-uk Kim             }
1418*3f0275a0SJung-uk Kim 
1419*3f0275a0SJung-uk Kim             ParentTable = DtPeekSubtable ();
1420*3f0275a0SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1421*3f0275a0SJung-uk Kim 
1422*3f0275a0SJung-uk Kim             PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER,
1423*3f0275a0SJung-uk Kim                 (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER)));
1424*3f0275a0SJung-uk Kim             DomainCount = PmttController->DomainCount;
1425*3f0275a0SJung-uk Kim 
1426*3f0275a0SJung-uk Kim             while (DomainCount)
1427*3f0275a0SJung-uk Kim             {
1428*3f0275a0SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a,
1429*3f0275a0SJung-uk Kim                     &Subtable, TRUE);
1430*3f0275a0SJung-uk Kim                 if (ACPI_FAILURE (Status))
1431*3f0275a0SJung-uk Kim                 {
1432*3f0275a0SJung-uk Kim                     return (Status);
1433*3f0275a0SJung-uk Kim                 }
1434*3f0275a0SJung-uk Kim 
1435*3f0275a0SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1436*3f0275a0SJung-uk Kim                 DomainCount--;
1437*3f0275a0SJung-uk Kim             }
1438*3f0275a0SJung-uk Kim             break;
1439*3f0275a0SJung-uk Kim 
1440*3f0275a0SJung-uk Kim         case ACPI_PMTT_TYPE_DIMM:
1441*3f0275a0SJung-uk Kim 
1442*3f0275a0SJung-uk Kim             /* Subtable: Physical Component Structure */
1443*3f0275a0SJung-uk Kim 
1444*3f0275a0SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
1445*3f0275a0SJung-uk Kim                     &Subtable, TRUE);
1446*3f0275a0SJung-uk Kim             if (ACPI_FAILURE (Status))
1447*3f0275a0SJung-uk Kim             {
1448*3f0275a0SJung-uk Kim                 return (Status);
1449*3f0275a0SJung-uk Kim             }
1450*3f0275a0SJung-uk Kim 
1451*3f0275a0SJung-uk Kim             ParentTable = DtPeekSubtable ();
1452*3f0275a0SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1453*3f0275a0SJung-uk Kim             break;
1454*3f0275a0SJung-uk Kim 
1455*3f0275a0SJung-uk Kim         default:
1456*3f0275a0SJung-uk Kim 
1457*3f0275a0SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
1458*3f0275a0SJung-uk Kim             return (AE_ERROR);
1459*3f0275a0SJung-uk Kim         }
1460*3f0275a0SJung-uk Kim     }
1461*3f0275a0SJung-uk Kim 
1462*3f0275a0SJung-uk Kim     return (Status);
1463*3f0275a0SJung-uk Kim }
1464*3f0275a0SJung-uk Kim 
1465*3f0275a0SJung-uk Kim 
1466*3f0275a0SJung-uk Kim /******************************************************************************
1467*3f0275a0SJung-uk Kim  *
1468a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileRsdt
1469a88e22b7SJung-uk Kim  *
1470a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1471a88e22b7SJung-uk Kim  *
1472a88e22b7SJung-uk Kim  * RETURN:      Status
1473a88e22b7SJung-uk Kim  *
1474a88e22b7SJung-uk Kim  * DESCRIPTION: Compile RSDT.
1475a88e22b7SJung-uk Kim  *
1476a88e22b7SJung-uk Kim  *****************************************************************************/
1477a88e22b7SJung-uk Kim 
1478a88e22b7SJung-uk Kim ACPI_STATUS
1479a88e22b7SJung-uk Kim DtCompileRsdt (
1480a88e22b7SJung-uk Kim     void                    **List)
1481a88e22b7SJung-uk Kim {
1482a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
1483a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1484a88e22b7SJung-uk Kim     DT_FIELD                *FieldList = *(DT_FIELD **) List;
1485a88e22b7SJung-uk Kim     UINT32                  Address;
1486a88e22b7SJung-uk Kim 
1487a88e22b7SJung-uk Kim 
1488a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
1489a88e22b7SJung-uk Kim 
1490a88e22b7SJung-uk Kim     while (FieldList)
1491a88e22b7SJung-uk Kim     {
1492a88e22b7SJung-uk Kim         DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
1493a88e22b7SJung-uk Kim 
1494a88e22b7SJung-uk Kim         DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
1495a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1496a88e22b7SJung-uk Kim         FieldList = FieldList->Next;
1497a88e22b7SJung-uk Kim     }
1498a88e22b7SJung-uk Kim 
1499a88e22b7SJung-uk Kim     return (AE_OK);
1500a88e22b7SJung-uk Kim }
1501a88e22b7SJung-uk Kim 
1502a88e22b7SJung-uk Kim 
1503a88e22b7SJung-uk Kim /******************************************************************************
1504a88e22b7SJung-uk Kim  *
1505*3f0275a0SJung-uk Kim  * FUNCTION:    DtCompileS3pt
1506*3f0275a0SJung-uk Kim  *
1507*3f0275a0SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
1508*3f0275a0SJung-uk Kim  *
1509*3f0275a0SJung-uk Kim  * RETURN:      Status
1510*3f0275a0SJung-uk Kim  *
1511*3f0275a0SJung-uk Kim  * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
1512*3f0275a0SJung-uk Kim  *
1513*3f0275a0SJung-uk Kim  *****************************************************************************/
1514*3f0275a0SJung-uk Kim 
1515*3f0275a0SJung-uk Kim ACPI_STATUS
1516*3f0275a0SJung-uk Kim DtCompileS3pt (
1517*3f0275a0SJung-uk Kim     DT_FIELD                **PFieldList)
1518*3f0275a0SJung-uk Kim {
1519*3f0275a0SJung-uk Kim     ACPI_STATUS             Status;
1520*3f0275a0SJung-uk Kim     ACPI_S3PT_HEADER        *S3ptHeader;
1521*3f0275a0SJung-uk Kim     DT_SUBTABLE             *Subtable;
1522*3f0275a0SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1523*3f0275a0SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1524*3f0275a0SJung-uk Kim     DT_FIELD                *SubtableStart;
1525*3f0275a0SJung-uk Kim 
1526*3f0275a0SJung-uk Kim 
1527*3f0275a0SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
1528*3f0275a0SJung-uk Kim                 &Gbl_RootTable, TRUE);
1529*3f0275a0SJung-uk Kim     if (ACPI_FAILURE (Status))
1530*3f0275a0SJung-uk Kim     {
1531*3f0275a0SJung-uk Kim         return (Status);
1532*3f0275a0SJung-uk Kim     }
1533*3f0275a0SJung-uk Kim 
1534*3f0275a0SJung-uk Kim     DtPushSubtable (Gbl_RootTable);
1535*3f0275a0SJung-uk Kim 
1536*3f0275a0SJung-uk Kim     while (*PFieldList)
1537*3f0275a0SJung-uk Kim     {
1538*3f0275a0SJung-uk Kim         SubtableStart = *PFieldList;
1539*3f0275a0SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
1540*3f0275a0SJung-uk Kim                     &Subtable, TRUE);
1541*3f0275a0SJung-uk Kim         if (ACPI_FAILURE (Status))
1542*3f0275a0SJung-uk Kim         {
1543*3f0275a0SJung-uk Kim             return (Status);
1544*3f0275a0SJung-uk Kim         }
1545*3f0275a0SJung-uk Kim 
1546*3f0275a0SJung-uk Kim         ParentTable = DtPeekSubtable ();
1547*3f0275a0SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1548*3f0275a0SJung-uk Kim         DtPushSubtable (Subtable);
1549*3f0275a0SJung-uk Kim 
1550*3f0275a0SJung-uk Kim         S3ptHeader = ACPI_CAST_PTR (ACPI_S3PT_HEADER, Subtable->Buffer);
1551*3f0275a0SJung-uk Kim 
1552*3f0275a0SJung-uk Kim         switch (S3ptHeader->Type)
1553*3f0275a0SJung-uk Kim         {
1554*3f0275a0SJung-uk Kim         case ACPI_S3PT_TYPE_RESUME:
1555*3f0275a0SJung-uk Kim             InfoTable = AcpiDmTableInfoS3pt0;
1556*3f0275a0SJung-uk Kim             break;
1557*3f0275a0SJung-uk Kim 
1558*3f0275a0SJung-uk Kim         case ACPI_S3PT_TYPE_SUSPEND:
1559*3f0275a0SJung-uk Kim             InfoTable = AcpiDmTableInfoS3pt1;
1560*3f0275a0SJung-uk Kim             break;
1561*3f0275a0SJung-uk Kim 
1562*3f0275a0SJung-uk Kim         default:
1563*3f0275a0SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
1564*3f0275a0SJung-uk Kim             return (AE_ERROR);
1565*3f0275a0SJung-uk Kim         }
1566*3f0275a0SJung-uk Kim 
1567*3f0275a0SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1568*3f0275a0SJung-uk Kim         if (ACPI_FAILURE (Status))
1569*3f0275a0SJung-uk Kim         {
1570*3f0275a0SJung-uk Kim             return (Status);
1571*3f0275a0SJung-uk Kim         }
1572*3f0275a0SJung-uk Kim 
1573*3f0275a0SJung-uk Kim         ParentTable = DtPeekSubtable ();
1574*3f0275a0SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1575*3f0275a0SJung-uk Kim         DtPopSubtable ();
1576*3f0275a0SJung-uk Kim     }
1577*3f0275a0SJung-uk Kim 
1578*3f0275a0SJung-uk Kim     return (AE_OK);
1579*3f0275a0SJung-uk Kim }
1580*3f0275a0SJung-uk Kim 
1581*3f0275a0SJung-uk Kim 
1582*3f0275a0SJung-uk Kim /******************************************************************************
1583*3f0275a0SJung-uk Kim  *
1584dcbce41eSJung-uk Kim  * FUNCTION:    DtCompileSlic
1585dcbce41eSJung-uk Kim  *
1586dcbce41eSJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1587dcbce41eSJung-uk Kim  *
1588dcbce41eSJung-uk Kim  * RETURN:      Status
1589dcbce41eSJung-uk Kim  *
1590dcbce41eSJung-uk Kim  * DESCRIPTION: Compile SLIC.
1591dcbce41eSJung-uk Kim  *
1592dcbce41eSJung-uk Kim  *****************************************************************************/
1593dcbce41eSJung-uk Kim 
1594dcbce41eSJung-uk Kim ACPI_STATUS
1595dcbce41eSJung-uk Kim DtCompileSlic (
1596dcbce41eSJung-uk Kim     void                    **List)
1597dcbce41eSJung-uk Kim {
1598dcbce41eSJung-uk Kim     ACPI_STATUS             Status;
1599dcbce41eSJung-uk Kim     DT_SUBTABLE             *Subtable;
1600dcbce41eSJung-uk Kim     DT_SUBTABLE             *ParentTable;
1601dcbce41eSJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1602dcbce41eSJung-uk Kim     DT_FIELD                *SubtableStart;
1603dcbce41eSJung-uk Kim     ACPI_SLIC_HEADER        *SlicHeader;
1604dcbce41eSJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1605dcbce41eSJung-uk Kim 
1606dcbce41eSJung-uk Kim 
1607dcbce41eSJung-uk Kim     while (*PFieldList)
1608dcbce41eSJung-uk Kim     {
1609dcbce41eSJung-uk Kim         SubtableStart = *PFieldList;
1610dcbce41eSJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlicHdr,
1611dcbce41eSJung-uk Kim                     &Subtable, TRUE);
1612dcbce41eSJung-uk Kim         if (ACPI_FAILURE (Status))
1613dcbce41eSJung-uk Kim         {
1614dcbce41eSJung-uk Kim             return (Status);
1615dcbce41eSJung-uk Kim         }
1616dcbce41eSJung-uk Kim 
1617dcbce41eSJung-uk Kim         ParentTable = DtPeekSubtable ();
1618dcbce41eSJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1619dcbce41eSJung-uk Kim         DtPushSubtable (Subtable);
1620dcbce41eSJung-uk Kim 
1621dcbce41eSJung-uk Kim         SlicHeader = ACPI_CAST_PTR (ACPI_SLIC_HEADER, Subtable->Buffer);
1622dcbce41eSJung-uk Kim 
1623dcbce41eSJung-uk Kim         switch (SlicHeader->Type)
1624dcbce41eSJung-uk Kim         {
1625dcbce41eSJung-uk Kim         case ACPI_SLIC_TYPE_PUBLIC_KEY:
1626dcbce41eSJung-uk Kim             InfoTable = AcpiDmTableInfoSlic0;
1627dcbce41eSJung-uk Kim             break;
1628dcbce41eSJung-uk Kim         case ACPI_SLIC_TYPE_WINDOWS_MARKER:
1629dcbce41eSJung-uk Kim             InfoTable = AcpiDmTableInfoSlic1;
1630dcbce41eSJung-uk Kim             break;
1631dcbce41eSJung-uk Kim         default:
1632dcbce41eSJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SLIC");
1633dcbce41eSJung-uk Kim             return (AE_ERROR);
1634dcbce41eSJung-uk Kim         }
1635dcbce41eSJung-uk Kim 
1636dcbce41eSJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1637dcbce41eSJung-uk Kim         if (ACPI_FAILURE (Status))
1638dcbce41eSJung-uk Kim         {
1639dcbce41eSJung-uk Kim             return (Status);
1640dcbce41eSJung-uk Kim         }
1641dcbce41eSJung-uk Kim 
1642dcbce41eSJung-uk Kim         ParentTable = DtPeekSubtable ();
1643dcbce41eSJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1644dcbce41eSJung-uk Kim         DtPopSubtable ();
1645dcbce41eSJung-uk Kim     }
1646dcbce41eSJung-uk Kim 
1647dcbce41eSJung-uk Kim     return (AE_OK);
1648dcbce41eSJung-uk Kim }
1649dcbce41eSJung-uk Kim 
1650dcbce41eSJung-uk Kim 
1651dcbce41eSJung-uk Kim /******************************************************************************
1652dcbce41eSJung-uk Kim  *
1653a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileSlit
1654a88e22b7SJung-uk Kim  *
1655a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1656a88e22b7SJung-uk Kim  *
1657a88e22b7SJung-uk Kim  * RETURN:      Status
1658a88e22b7SJung-uk Kim  *
1659a88e22b7SJung-uk Kim  * DESCRIPTION: Compile SLIT.
1660a88e22b7SJung-uk Kim  *
1661a88e22b7SJung-uk Kim  *****************************************************************************/
1662a88e22b7SJung-uk Kim 
1663a88e22b7SJung-uk Kim ACPI_STATUS
1664a88e22b7SJung-uk Kim DtCompileSlit (
1665a88e22b7SJung-uk Kim     void                    **List)
1666a88e22b7SJung-uk Kim {
1667a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
1668a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
1669a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1670a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1671a88e22b7SJung-uk Kim     DT_FIELD                *FieldList;
1672a88e22b7SJung-uk Kim     UINT32                  Localities;
1673a88e22b7SJung-uk Kim     UINT8                   *LocalityBuffer;
1674a88e22b7SJung-uk Kim 
1675a88e22b7SJung-uk Kim 
1676a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
1677a88e22b7SJung-uk Kim                 &Subtable, TRUE);
1678a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
1679a88e22b7SJung-uk Kim     {
1680a88e22b7SJung-uk Kim         return (Status);
1681a88e22b7SJung-uk Kim     }
1682a88e22b7SJung-uk Kim 
1683a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
1684a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1685a88e22b7SJung-uk Kim 
1686a88e22b7SJung-uk Kim     Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
1687a88e22b7SJung-uk Kim     LocalityBuffer = UtLocalCalloc (Localities);
1688a88e22b7SJung-uk Kim 
1689d052a1ccSJung-uk Kim     /* Compile each locality buffer */
1690d052a1ccSJung-uk Kim 
1691a88e22b7SJung-uk Kim     FieldList = *PFieldList;
1692a88e22b7SJung-uk Kim     while (FieldList)
1693a88e22b7SJung-uk Kim     {
1694d052a1ccSJung-uk Kim         DtCompileBuffer (LocalityBuffer,
1695d052a1ccSJung-uk Kim             FieldList->Value, FieldList, Localities);
1696a88e22b7SJung-uk Kim 
1697a88e22b7SJung-uk Kim         DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
1698a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1699d052a1ccSJung-uk Kim         FieldList = FieldList->Next;
1700a88e22b7SJung-uk Kim     }
1701a88e22b7SJung-uk Kim 
1702a88e22b7SJung-uk Kim     ACPI_FREE (LocalityBuffer);
1703a88e22b7SJung-uk Kim     return (AE_OK);
1704a88e22b7SJung-uk Kim }
1705a88e22b7SJung-uk Kim 
1706a88e22b7SJung-uk Kim 
1707a88e22b7SJung-uk Kim /******************************************************************************
1708a88e22b7SJung-uk Kim  *
1709a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileSrat
1710a88e22b7SJung-uk Kim  *
1711a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1712a88e22b7SJung-uk Kim  *
1713a88e22b7SJung-uk Kim  * RETURN:      Status
1714a88e22b7SJung-uk Kim  *
1715a88e22b7SJung-uk Kim  * DESCRIPTION: Compile SRAT.
1716a88e22b7SJung-uk Kim  *
1717a88e22b7SJung-uk Kim  *****************************************************************************/
1718a88e22b7SJung-uk Kim 
1719a88e22b7SJung-uk Kim ACPI_STATUS
1720a88e22b7SJung-uk Kim DtCompileSrat (
1721a88e22b7SJung-uk Kim     void                    **List)
1722a88e22b7SJung-uk Kim {
1723a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
1724a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
1725a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1726a88e22b7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1727a88e22b7SJung-uk Kim     DT_FIELD                *SubtableStart;
1728a88e22b7SJung-uk Kim     ACPI_SUBTABLE_HEADER    *SratHeader;
1729a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1730a88e22b7SJung-uk Kim 
1731a88e22b7SJung-uk Kim 
1732a88e22b7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
1733a88e22b7SJung-uk Kim                 &Subtable, TRUE);
1734a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
1735a88e22b7SJung-uk Kim     {
1736a88e22b7SJung-uk Kim         return (Status);
1737a88e22b7SJung-uk Kim     }
1738a88e22b7SJung-uk Kim 
1739a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
1740a88e22b7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1741a88e22b7SJung-uk Kim 
1742a88e22b7SJung-uk Kim     while (*PFieldList)
1743a88e22b7SJung-uk Kim     {
1744a88e22b7SJung-uk Kim         SubtableStart = *PFieldList;
1745a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
1746a88e22b7SJung-uk Kim                     &Subtable, TRUE);
1747a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
1748a88e22b7SJung-uk Kim         {
1749a88e22b7SJung-uk Kim             return (Status);
1750a88e22b7SJung-uk Kim         }
1751a88e22b7SJung-uk Kim 
1752a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
1753a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1754a88e22b7SJung-uk Kim         DtPushSubtable (Subtable);
1755a88e22b7SJung-uk Kim 
1756a88e22b7SJung-uk Kim         SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1757a88e22b7SJung-uk Kim 
1758a88e22b7SJung-uk Kim         switch (SratHeader->Type)
1759a88e22b7SJung-uk Kim         {
1760a88e22b7SJung-uk Kim         case ACPI_SRAT_TYPE_CPU_AFFINITY:
1761a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat0;
1762a88e22b7SJung-uk Kim             break;
1763a88e22b7SJung-uk Kim         case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
1764a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat1;
1765a88e22b7SJung-uk Kim             break;
1766a88e22b7SJung-uk Kim         case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
1767a88e22b7SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat2;
1768a88e22b7SJung-uk Kim             break;
1769a88e22b7SJung-uk Kim         default:
1770a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
1771a88e22b7SJung-uk Kim             return (AE_ERROR);
1772a88e22b7SJung-uk Kim         }
1773a88e22b7SJung-uk Kim 
1774a88e22b7SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1775a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
1776a88e22b7SJung-uk Kim         {
1777a88e22b7SJung-uk Kim             return (Status);
1778a88e22b7SJung-uk Kim         }
1779a88e22b7SJung-uk Kim 
1780a88e22b7SJung-uk Kim         ParentTable = DtPeekSubtable ();
1781a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1782a88e22b7SJung-uk Kim         DtPopSubtable ();
1783a88e22b7SJung-uk Kim     }
1784a88e22b7SJung-uk Kim 
1785a88e22b7SJung-uk Kim     return (AE_OK);
1786a88e22b7SJung-uk Kim }
1787a88e22b7SJung-uk Kim 
1788a88e22b7SJung-uk Kim 
1789a88e22b7SJung-uk Kim /******************************************************************************
1790a88e22b7SJung-uk Kim  *
17910b94ba42SJung-uk Kim  * FUNCTION:    DtGetGenericTableInfo
1792d244b227SJung-uk Kim  *
1793d244b227SJung-uk Kim  * PARAMETERS:  Name                - Generic type name
1794d244b227SJung-uk Kim  *
1795d244b227SJung-uk Kim  * RETURN:      Info entry
1796d244b227SJung-uk Kim  *
1797d244b227SJung-uk Kim  * DESCRIPTION: Obtain table info for a generic name entry
1798d244b227SJung-uk Kim  *
1799d244b227SJung-uk Kim  *****************************************************************************/
1800d244b227SJung-uk Kim 
18010b94ba42SJung-uk Kim ACPI_DMTABLE_INFO *
18020b94ba42SJung-uk Kim DtGetGenericTableInfo (
1803d244b227SJung-uk Kim     char                    *Name)
1804d244b227SJung-uk Kim {
1805d244b227SJung-uk Kim     ACPI_DMTABLE_INFO       *Info;
1806d244b227SJung-uk Kim     UINT32                  i;
1807d244b227SJung-uk Kim 
1808d244b227SJung-uk Kim 
1809d244b227SJung-uk Kim     if (!Name)
1810d244b227SJung-uk Kim     {
1811d244b227SJung-uk Kim         return (NULL);
1812d244b227SJung-uk Kim     }
1813d244b227SJung-uk Kim 
1814d244b227SJung-uk Kim     /* Search info table for name match */
1815d244b227SJung-uk Kim 
1816d244b227SJung-uk Kim     for (i = 0; ; i++)
1817d244b227SJung-uk Kim     {
1818d244b227SJung-uk Kim         Info = AcpiDmTableInfoGeneric[i];
1819d244b227SJung-uk Kim         if (Info->Opcode == ACPI_DMT_EXIT)
1820d244b227SJung-uk Kim         {
1821d244b227SJung-uk Kim             Info = NULL;
1822d244b227SJung-uk Kim             break;
1823d244b227SJung-uk Kim         }
1824d244b227SJung-uk Kim 
1825d244b227SJung-uk Kim         if (!ACPI_STRCMP (Name, Info->Name))
1826d244b227SJung-uk Kim         {
1827d244b227SJung-uk Kim             break;
1828d244b227SJung-uk Kim         }
1829d244b227SJung-uk Kim     }
1830d244b227SJung-uk Kim 
1831d244b227SJung-uk Kim     return (Info);
1832d244b227SJung-uk Kim }
1833d244b227SJung-uk Kim 
1834d244b227SJung-uk Kim 
1835d244b227SJung-uk Kim /******************************************************************************
1836d244b227SJung-uk Kim  *
1837d244b227SJung-uk Kim  * FUNCTION:    DtCompileUefi
1838d244b227SJung-uk Kim  *
1839d244b227SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1840d244b227SJung-uk Kim  *
1841d244b227SJung-uk Kim  * RETURN:      Status
1842d244b227SJung-uk Kim  *
1843d244b227SJung-uk Kim  * DESCRIPTION: Compile UEFI.
1844d244b227SJung-uk Kim  *
1845d244b227SJung-uk Kim  *****************************************************************************/
1846d244b227SJung-uk Kim 
1847d244b227SJung-uk Kim ACPI_STATUS
1848d244b227SJung-uk Kim DtCompileUefi (
1849d244b227SJung-uk Kim     void                    **List)
1850d244b227SJung-uk Kim {
1851d244b227SJung-uk Kim     ACPI_STATUS             Status;
1852d244b227SJung-uk Kim     DT_SUBTABLE             *Subtable;
1853d244b227SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1854d244b227SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1855d244b227SJung-uk Kim     UINT16                  *DataOffset;
1856d244b227SJung-uk Kim 
1857d244b227SJung-uk Kim 
18580b94ba42SJung-uk Kim     /* Compile the predefined portion of the UEFI table */
18590b94ba42SJung-uk Kim 
1860d244b227SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
1861d244b227SJung-uk Kim                 &Subtable, TRUE);
1862d244b227SJung-uk Kim     if (ACPI_FAILURE (Status))
1863d244b227SJung-uk Kim     {
1864d244b227SJung-uk Kim         return (Status);
1865d244b227SJung-uk Kim     }
1866d244b227SJung-uk Kim 
1867d244b227SJung-uk Kim     DataOffset = (UINT16 *) (Subtable->Buffer + 16);
1868d244b227SJung-uk Kim     *DataOffset = sizeof (ACPI_TABLE_UEFI);
1869d244b227SJung-uk Kim 
1870d244b227SJung-uk Kim     ParentTable = DtPeekSubtable ();
1871d244b227SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1872d244b227SJung-uk Kim 
18730b94ba42SJung-uk Kim     /*
18740b94ba42SJung-uk Kim      * Compile the "generic" portion of the UEFI table. This
18750b94ba42SJung-uk Kim      * part of the table is not predefined and any of the generic
18760b94ba42SJung-uk Kim      * operators may be used.
18770b94ba42SJung-uk Kim      */
18780b94ba42SJung-uk Kim 
1879d052a1ccSJung-uk Kim     DtCompileGeneric ((void **) PFieldList);
1880d244b227SJung-uk Kim 
1881d244b227SJung-uk Kim     return (AE_OK);
1882d244b227SJung-uk Kim }
1883d244b227SJung-uk Kim 
1884d244b227SJung-uk Kim 
1885d244b227SJung-uk Kim /******************************************************************************
1886d244b227SJung-uk Kim  *
1887a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileWdat
1888a88e22b7SJung-uk Kim  *
1889a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1890a88e22b7SJung-uk Kim  *
1891a88e22b7SJung-uk Kim  * RETURN:      Status
1892a88e22b7SJung-uk Kim  *
1893a88e22b7SJung-uk Kim  * DESCRIPTION: Compile WDAT.
1894a88e22b7SJung-uk Kim  *
1895a88e22b7SJung-uk Kim  *****************************************************************************/
1896a88e22b7SJung-uk Kim 
1897a88e22b7SJung-uk Kim ACPI_STATUS
1898a88e22b7SJung-uk Kim DtCompileWdat (
1899a88e22b7SJung-uk Kim     void                    **List)
1900a88e22b7SJung-uk Kim {
1901a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
1902a88e22b7SJung-uk Kim 
1903a88e22b7SJung-uk Kim 
1904a88e22b7SJung-uk Kim     Status = DtCompileTwoSubtables (List,
1905a88e22b7SJung-uk Kim                  AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
1906a88e22b7SJung-uk Kim     return (Status);
1907a88e22b7SJung-uk Kim }
1908a88e22b7SJung-uk Kim 
1909a88e22b7SJung-uk Kim 
1910a88e22b7SJung-uk Kim /******************************************************************************
1911a88e22b7SJung-uk Kim  *
1912a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileXsdt
1913a88e22b7SJung-uk Kim  *
1914a88e22b7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1915a88e22b7SJung-uk Kim  *
1916a88e22b7SJung-uk Kim  * RETURN:      Status
1917a88e22b7SJung-uk Kim  *
1918a88e22b7SJung-uk Kim  * DESCRIPTION: Compile XSDT.
1919a88e22b7SJung-uk Kim  *
1920a88e22b7SJung-uk Kim  *****************************************************************************/
1921a88e22b7SJung-uk Kim 
1922a88e22b7SJung-uk Kim ACPI_STATUS
1923a88e22b7SJung-uk Kim DtCompileXsdt (
1924a88e22b7SJung-uk Kim     void                    **List)
1925a88e22b7SJung-uk Kim {
1926a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable;
1927a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1928a88e22b7SJung-uk Kim     DT_FIELD                *FieldList = *(DT_FIELD **) List;
1929a88e22b7SJung-uk Kim     UINT64                  Address;
1930a88e22b7SJung-uk Kim 
1931a88e22b7SJung-uk Kim     ParentTable = DtPeekSubtable ();
1932a88e22b7SJung-uk Kim 
1933a88e22b7SJung-uk Kim     while (FieldList)
1934a88e22b7SJung-uk Kim     {
1935a88e22b7SJung-uk Kim         DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
1936a88e22b7SJung-uk Kim 
1937a88e22b7SJung-uk Kim         DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
1938a88e22b7SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1939a88e22b7SJung-uk Kim         FieldList = FieldList->Next;
1940a88e22b7SJung-uk Kim     }
1941a88e22b7SJung-uk Kim 
1942a88e22b7SJung-uk Kim     return (AE_OK);
1943a88e22b7SJung-uk Kim }
1944d052a1ccSJung-uk Kim 
1945d052a1ccSJung-uk Kim 
1946d052a1ccSJung-uk Kim /******************************************************************************
1947d052a1ccSJung-uk Kim  *
1948d052a1ccSJung-uk Kim  * FUNCTION:    DtCompileGeneric
1949d052a1ccSJung-uk Kim  *
1950d052a1ccSJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1951d052a1ccSJung-uk Kim  *
1952d052a1ccSJung-uk Kim  * RETURN:      Status
1953d052a1ccSJung-uk Kim  *
1954d052a1ccSJung-uk Kim  * DESCRIPTION: Compile generic unknown table.
1955d052a1ccSJung-uk Kim  *
1956d052a1ccSJung-uk Kim  *****************************************************************************/
1957d052a1ccSJung-uk Kim 
1958d052a1ccSJung-uk Kim ACPI_STATUS
1959d052a1ccSJung-uk Kim DtCompileGeneric (
1960d052a1ccSJung-uk Kim     void                    **List)
1961d052a1ccSJung-uk Kim {
1962d052a1ccSJung-uk Kim     ACPI_STATUS             Status;
1963d052a1ccSJung-uk Kim     DT_SUBTABLE             *Subtable;
1964d052a1ccSJung-uk Kim     DT_SUBTABLE             *ParentTable;
1965d052a1ccSJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1966d052a1ccSJung-uk Kim     ACPI_DMTABLE_INFO       *Info;
1967d052a1ccSJung-uk Kim 
1968d052a1ccSJung-uk Kim 
1969d052a1ccSJung-uk Kim     ParentTable = DtPeekSubtable ();
1970d052a1ccSJung-uk Kim 
1971d052a1ccSJung-uk Kim     /*
1972d052a1ccSJung-uk Kim      * Compile the "generic" portion of the table. This
1973d052a1ccSJung-uk Kim      * part of the table is not predefined and any of the generic
1974d052a1ccSJung-uk Kim      * operators may be used.
1975d052a1ccSJung-uk Kim      */
1976d052a1ccSJung-uk Kim 
1977d052a1ccSJung-uk Kim     /* Find any and all labels in the entire generic portion */
1978d052a1ccSJung-uk Kim 
1979d052a1ccSJung-uk Kim     DtDetectAllLabels (*PFieldList);
1980d052a1ccSJung-uk Kim 
1981d052a1ccSJung-uk Kim     /* Now we can actually compile the parse tree */
1982d052a1ccSJung-uk Kim 
1983d052a1ccSJung-uk Kim     while (*PFieldList)
1984d052a1ccSJung-uk Kim     {
1985d052a1ccSJung-uk Kim         Info = DtGetGenericTableInfo ((*PFieldList)->Name);
1986d052a1ccSJung-uk Kim         if (!Info)
1987d052a1ccSJung-uk Kim         {
1988d052a1ccSJung-uk Kim             sprintf (MsgBuffer, "Generic data type \"%s\" not found",
1989d052a1ccSJung-uk Kim                 (*PFieldList)->Name);
1990d052a1ccSJung-uk Kim             DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
1991d052a1ccSJung-uk Kim                 (*PFieldList), MsgBuffer);
1992d052a1ccSJung-uk Kim 
1993d052a1ccSJung-uk Kim             *PFieldList = (*PFieldList)->Next;
1994d052a1ccSJung-uk Kim             continue;
1995d052a1ccSJung-uk Kim         }
1996d052a1ccSJung-uk Kim 
1997d052a1ccSJung-uk Kim         Status = DtCompileTable (PFieldList, Info,
1998d052a1ccSJung-uk Kim                     &Subtable, TRUE);
1999d052a1ccSJung-uk Kim         if (ACPI_SUCCESS (Status))
2000d052a1ccSJung-uk Kim         {
2001d052a1ccSJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
2002d052a1ccSJung-uk Kim         }
2003d052a1ccSJung-uk Kim         else
2004d052a1ccSJung-uk Kim         {
2005d052a1ccSJung-uk Kim             *PFieldList = (*PFieldList)->Next;
2006d052a1ccSJung-uk Kim 
2007d052a1ccSJung-uk Kim             if (Status == AE_NOT_FOUND)
2008d052a1ccSJung-uk Kim             {
2009d052a1ccSJung-uk Kim                 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
2010d052a1ccSJung-uk Kim                     (*PFieldList)->Name);
2011d052a1ccSJung-uk Kim                 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
2012d052a1ccSJung-uk Kim                     (*PFieldList), MsgBuffer);
2013d052a1ccSJung-uk Kim             }
2014d052a1ccSJung-uk Kim         }
2015d052a1ccSJung-uk Kim     }
2016d052a1ccSJung-uk Kim 
2017d052a1ccSJung-uk Kim     return (AE_OK);
2018d052a1ccSJung-uk Kim }
2019