1f8146b88SJung-uk Kim /******************************************************************************
2f8146b88SJung-uk Kim  *
3f8146b88SJung-uk Kim  * Module Name: dttable2.c - handling for specific ACPI tables
4f8146b88SJung-uk Kim  *
5f8146b88SJung-uk Kim  *****************************************************************************/
6f8146b88SJung-uk Kim 
70d84335fSJung-uk Kim /******************************************************************************
80d84335fSJung-uk Kim  *
90d84335fSJung-uk Kim  * 1. Copyright Notice
100d84335fSJung-uk Kim  *
1129f37e9bSJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
12f8146b88SJung-uk Kim  * All rights reserved.
13f8146b88SJung-uk Kim  *
140d84335fSJung-uk Kim  * 2. License
150d84335fSJung-uk Kim  *
160d84335fSJung-uk Kim  * 2.1. This is your license from Intel Corp. under its intellectual property
170d84335fSJung-uk Kim  * rights. You may have additional license terms from the party that provided
180d84335fSJung-uk Kim  * you this software, covering your right to use that party's intellectual
190d84335fSJung-uk Kim  * property rights.
200d84335fSJung-uk Kim  *
210d84335fSJung-uk Kim  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
220d84335fSJung-uk Kim  * copy of the source code appearing in this file ("Covered Code") an
230d84335fSJung-uk Kim  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
240d84335fSJung-uk Kim  * base code distributed originally by Intel ("Original Intel Code") to copy,
250d84335fSJung-uk Kim  * make derivatives, distribute, use and display any portion of the Covered
260d84335fSJung-uk Kim  * Code in any form, with the right to sublicense such rights; and
270d84335fSJung-uk Kim  *
280d84335fSJung-uk Kim  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
290d84335fSJung-uk Kim  * license (with the right to sublicense), under only those claims of Intel
300d84335fSJung-uk Kim  * patents that are infringed by the Original Intel Code, to make, use, sell,
310d84335fSJung-uk Kim  * offer to sell, and import the Covered Code and derivative works thereof
320d84335fSJung-uk Kim  * solely to the minimum extent necessary to exercise the above copyright
330d84335fSJung-uk Kim  * license, and in no event shall the patent license extend to any additions
340d84335fSJung-uk Kim  * to or modifications of the Original Intel Code. No other license or right
350d84335fSJung-uk Kim  * is granted directly or by implication, estoppel or otherwise;
360d84335fSJung-uk Kim  *
370d84335fSJung-uk Kim  * The above copyright and patent license is granted only if the following
380d84335fSJung-uk Kim  * conditions are met:
390d84335fSJung-uk Kim  *
400d84335fSJung-uk Kim  * 3. Conditions
410d84335fSJung-uk Kim  *
420d84335fSJung-uk Kim  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
430d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
440d84335fSJung-uk Kim  * Code or modification with rights to further distribute source must include
450d84335fSJung-uk Kim  * the above Copyright Notice, the above License, this list of Conditions,
460d84335fSJung-uk Kim  * and the following Disclaimer and Export Compliance provision. In addition,
470d84335fSJung-uk Kim  * Licensee must cause all Covered Code to which Licensee contributes to
480d84335fSJung-uk Kim  * contain a file documenting the changes Licensee made to create that Covered
490d84335fSJung-uk Kim  * Code and the date of any change. Licensee must include in that file the
500d84335fSJung-uk Kim  * documentation of any changes made by any predecessor Licensee. Licensee
510d84335fSJung-uk Kim  * must include a prominent statement that the modification is derived,
520d84335fSJung-uk Kim  * directly or indirectly, from Original Intel Code.
530d84335fSJung-uk Kim  *
540d84335fSJung-uk Kim  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
550d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
560d84335fSJung-uk Kim  * Code or modification without rights to further distribute source must
570d84335fSJung-uk Kim  * include the following Disclaimer and Export Compliance provision in the
580d84335fSJung-uk Kim  * documentation and/or other materials provided with distribution. In
590d84335fSJung-uk Kim  * addition, Licensee may not authorize further sublicense of source of any
600d84335fSJung-uk Kim  * portion of the Covered Code, and must include terms to the effect that the
610d84335fSJung-uk Kim  * license from Licensee to its licensee is limited to the intellectual
620d84335fSJung-uk Kim  * property embodied in the software Licensee provides to its licensee, and
630d84335fSJung-uk Kim  * not to intellectual property embodied in modifications its licensee may
640d84335fSJung-uk Kim  * make.
650d84335fSJung-uk Kim  *
660d84335fSJung-uk Kim  * 3.3. Redistribution of Executable. Redistribution in executable form of any
670d84335fSJung-uk Kim  * substantial portion of the Covered Code or modification must reproduce the
680d84335fSJung-uk Kim  * above Copyright Notice, and the following Disclaimer and Export Compliance
690d84335fSJung-uk Kim  * provision in the documentation and/or other materials provided with the
700d84335fSJung-uk Kim  * distribution.
710d84335fSJung-uk Kim  *
720d84335fSJung-uk Kim  * 3.4. Intel retains all right, title, and interest in and to the Original
730d84335fSJung-uk Kim  * Intel Code.
740d84335fSJung-uk Kim  *
750d84335fSJung-uk Kim  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
760d84335fSJung-uk Kim  * Intel shall be used in advertising or otherwise to promote the sale, use or
770d84335fSJung-uk Kim  * other dealings in products derived from or relating to the Covered Code
780d84335fSJung-uk Kim  * without prior written authorization from Intel.
790d84335fSJung-uk Kim  *
800d84335fSJung-uk Kim  * 4. Disclaimer and Export Compliance
810d84335fSJung-uk Kim  *
820d84335fSJung-uk Kim  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
830d84335fSJung-uk Kim  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
840d84335fSJung-uk Kim  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
850d84335fSJung-uk Kim  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
860d84335fSJung-uk Kim  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
870d84335fSJung-uk Kim  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
880d84335fSJung-uk Kim  * PARTICULAR PURPOSE.
890d84335fSJung-uk Kim  *
900d84335fSJung-uk Kim  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
910d84335fSJung-uk Kim  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
920d84335fSJung-uk Kim  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
930d84335fSJung-uk Kim  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
940d84335fSJung-uk Kim  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
950d84335fSJung-uk Kim  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
960d84335fSJung-uk Kim  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
970d84335fSJung-uk Kim  * LIMITED REMEDY.
980d84335fSJung-uk Kim  *
990d84335fSJung-uk Kim  * 4.3. Licensee shall not export, either directly or indirectly, any of this
1000d84335fSJung-uk Kim  * software or system incorporating such software without first obtaining any
1010d84335fSJung-uk Kim  * required license or other approval from the U. S. Department of Commerce or
1020d84335fSJung-uk Kim  * any other agency or department of the United States Government. In the
1030d84335fSJung-uk Kim  * event Licensee exports any such software from the United States or
1040d84335fSJung-uk Kim  * re-exports any such software from a foreign destination, Licensee shall
1050d84335fSJung-uk Kim  * ensure that the distribution and export/re-export of the software is in
1060d84335fSJung-uk Kim  * compliance with all laws, regulations, orders, or other restrictions of the
1070d84335fSJung-uk Kim  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1080d84335fSJung-uk Kim  * any of its subsidiaries will export/re-export any technical data, process,
1090d84335fSJung-uk Kim  * software, or service, directly or indirectly, to any country for which the
1100d84335fSJung-uk Kim  * United States government or any agency thereof requires an export license,
1110d84335fSJung-uk Kim  * other governmental approval, or letter of assurance, without first obtaining
1120d84335fSJung-uk Kim  * such license, approval or letter.
1130d84335fSJung-uk Kim  *
1140d84335fSJung-uk Kim  *****************************************************************************
1150d84335fSJung-uk Kim  *
1160d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
1170d84335fSJung-uk Kim  * following license:
1180d84335fSJung-uk Kim  *
119f8146b88SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
120f8146b88SJung-uk Kim  * modification, are permitted provided that the following conditions
121f8146b88SJung-uk Kim  * are met:
122f8146b88SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
123f8146b88SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
124f8146b88SJung-uk Kim  *    without modification.
125f8146b88SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126f8146b88SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
127f8146b88SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
128f8146b88SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
129f8146b88SJung-uk Kim  *    binary redistribution.
130f8146b88SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
131f8146b88SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
132f8146b88SJung-uk Kim  *    from this software without specific prior written permission.
133f8146b88SJung-uk Kim  *
1340d84335fSJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1350d84335fSJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1360d84335fSJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1370d84335fSJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1380d84335fSJung-uk Kim  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1390d84335fSJung-uk Kim  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1400d84335fSJung-uk Kim  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1410d84335fSJung-uk Kim  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1420d84335fSJung-uk Kim  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1430d84335fSJung-uk Kim  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1440d84335fSJung-uk Kim  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1450d84335fSJung-uk Kim  *
1460d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
147f8146b88SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
148f8146b88SJung-uk Kim  * Software Foundation.
149f8146b88SJung-uk Kim  *
1500d84335fSJung-uk Kim  *****************************************************************************/
151f8146b88SJung-uk Kim 
152f8146b88SJung-uk Kim /* Compile all complex data tables, signatures starting with L-Z */
153f8146b88SJung-uk Kim 
154f8146b88SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
155f8146b88SJung-uk Kim 
156f8146b88SJung-uk Kim #define _COMPONENT          DT_COMPILER
157f8146b88SJung-uk Kim         ACPI_MODULE_NAME    ("dttable2")
158f8146b88SJung-uk Kim 
159f8146b88SJung-uk Kim 
160f8146b88SJung-uk Kim /******************************************************************************
161f8146b88SJung-uk Kim  *
162f8146b88SJung-uk Kim  * FUNCTION:    DtCompileLpit
163f8146b88SJung-uk Kim  *
164f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
165f8146b88SJung-uk Kim  *
166f8146b88SJung-uk Kim  * RETURN:      Status
167f8146b88SJung-uk Kim  *
168f8146b88SJung-uk Kim  * DESCRIPTION: Compile LPIT.
169f8146b88SJung-uk Kim  *
170f8146b88SJung-uk Kim  *****************************************************************************/
171f8146b88SJung-uk Kim 
172f8146b88SJung-uk Kim ACPI_STATUS
173f8146b88SJung-uk Kim DtCompileLpit (
174f8146b88SJung-uk Kim     void                    **List)
175f8146b88SJung-uk Kim {
176f8146b88SJung-uk Kim     ACPI_STATUS             Status;
177f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
178f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
179f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
180f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
181f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
182f8146b88SJung-uk Kim     ACPI_LPIT_HEADER        *LpitHeader;
183f8146b88SJung-uk Kim 
184f8146b88SJung-uk Kim 
185f8146b88SJung-uk Kim     /* Note: Main table consists only of the standard ACPI table header */
186f8146b88SJung-uk Kim 
187f8146b88SJung-uk Kim     while (*PFieldList)
188f8146b88SJung-uk Kim     {
189f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
190f8146b88SJung-uk Kim 
191f8146b88SJung-uk Kim         /* LPIT Subtable header */
192f8146b88SJung-uk Kim 
193f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoLpitHdr,
194ff879b07SJung-uk Kim             &Subtable);
195f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
196f8146b88SJung-uk Kim         {
197f8146b88SJung-uk Kim             return (Status);
198f8146b88SJung-uk Kim         }
199f8146b88SJung-uk Kim 
200f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
201f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
202f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
203f8146b88SJung-uk Kim 
204f8146b88SJung-uk Kim         LpitHeader = ACPI_CAST_PTR (ACPI_LPIT_HEADER, Subtable->Buffer);
205f8146b88SJung-uk Kim 
206f8146b88SJung-uk Kim         switch (LpitHeader->Type)
207f8146b88SJung-uk Kim         {
208f8146b88SJung-uk Kim         case ACPI_LPIT_TYPE_NATIVE_CSTATE:
209f8146b88SJung-uk Kim 
210f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoLpit0;
211f8146b88SJung-uk Kim             break;
212f8146b88SJung-uk Kim 
213f8146b88SJung-uk Kim         default:
214f8146b88SJung-uk Kim 
215f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "LPIT");
216f8146b88SJung-uk Kim             return (AE_ERROR);
217f8146b88SJung-uk Kim         }
218f8146b88SJung-uk Kim 
219f8146b88SJung-uk Kim         /* LPIT Subtable */
220f8146b88SJung-uk Kim 
221ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
222f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
223f8146b88SJung-uk Kim         {
224f8146b88SJung-uk Kim             return (Status);
225f8146b88SJung-uk Kim         }
226f8146b88SJung-uk Kim 
227f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
228f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
229f8146b88SJung-uk Kim         DtPopSubtable ();
230f8146b88SJung-uk Kim     }
231f8146b88SJung-uk Kim 
232f8146b88SJung-uk Kim     return (AE_OK);
233f8146b88SJung-uk Kim }
234f8146b88SJung-uk Kim 
235f8146b88SJung-uk Kim 
236f8146b88SJung-uk Kim /******************************************************************************
237f8146b88SJung-uk Kim  *
238f8146b88SJung-uk Kim  * FUNCTION:    DtCompileMadt
239f8146b88SJung-uk Kim  *
240f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
241f8146b88SJung-uk Kim  *
242f8146b88SJung-uk Kim  * RETURN:      Status
243f8146b88SJung-uk Kim  *
244f8146b88SJung-uk Kim  * DESCRIPTION: Compile MADT.
245f8146b88SJung-uk Kim  *
246f8146b88SJung-uk Kim  *****************************************************************************/
247f8146b88SJung-uk Kim 
248f8146b88SJung-uk Kim ACPI_STATUS
249f8146b88SJung-uk Kim DtCompileMadt (
250f8146b88SJung-uk Kim     void                    **List)
251f8146b88SJung-uk Kim {
252f8146b88SJung-uk Kim     ACPI_STATUS             Status;
253f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
254f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
255f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
256f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
257f8146b88SJung-uk Kim     ACPI_SUBTABLE_HEADER    *MadtHeader;
258f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
259f8146b88SJung-uk Kim 
260f8146b88SJung-uk Kim 
261f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
262ff879b07SJung-uk Kim         &Subtable);
263f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
264f8146b88SJung-uk Kim     {
265f8146b88SJung-uk Kim         return (Status);
266f8146b88SJung-uk Kim     }
267f8146b88SJung-uk Kim 
268f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
269f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
270f8146b88SJung-uk Kim 
271f8146b88SJung-uk Kim     while (*PFieldList)
272f8146b88SJung-uk Kim     {
273f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
274f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
275ff879b07SJung-uk Kim             &Subtable);
276f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
277f8146b88SJung-uk Kim         {
278f8146b88SJung-uk Kim             return (Status);
279f8146b88SJung-uk Kim         }
280f8146b88SJung-uk Kim 
281f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
282f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
283f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
284f8146b88SJung-uk Kim 
285f8146b88SJung-uk Kim         MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
286f8146b88SJung-uk Kim 
287f8146b88SJung-uk Kim         switch (MadtHeader->Type)
288f8146b88SJung-uk Kim         {
289f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_APIC:
290f8146b88SJung-uk Kim 
291f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt0;
292f8146b88SJung-uk Kim             break;
293f8146b88SJung-uk Kim 
294f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_IO_APIC:
295f8146b88SJung-uk Kim 
296f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt1;
297f8146b88SJung-uk Kim             break;
298f8146b88SJung-uk Kim 
299f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
300f8146b88SJung-uk Kim 
301f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt2;
302f8146b88SJung-uk Kim             break;
303f8146b88SJung-uk Kim 
304f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_NMI_SOURCE:
305f8146b88SJung-uk Kim 
306f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt3;
307f8146b88SJung-uk Kim             break;
308f8146b88SJung-uk Kim 
309f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
310f8146b88SJung-uk Kim 
311f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt4;
312f8146b88SJung-uk Kim             break;
313f8146b88SJung-uk Kim 
314f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
315f8146b88SJung-uk Kim 
316f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt5;
317f8146b88SJung-uk Kim             break;
318f8146b88SJung-uk Kim 
319f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_IO_SAPIC:
320f8146b88SJung-uk Kim 
321f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt6;
322f8146b88SJung-uk Kim             break;
323f8146b88SJung-uk Kim 
324f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_SAPIC:
325f8146b88SJung-uk Kim 
326f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt7;
327f8146b88SJung-uk Kim             break;
328f8146b88SJung-uk Kim 
329f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
330f8146b88SJung-uk Kim 
331f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt8;
332f8146b88SJung-uk Kim             break;
333f8146b88SJung-uk Kim 
334f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_X2APIC:
335f8146b88SJung-uk Kim 
336f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt9;
337f8146b88SJung-uk Kim             break;
338f8146b88SJung-uk Kim 
339f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
340f8146b88SJung-uk Kim 
341f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt10;
342f8146b88SJung-uk Kim             break;
343f8146b88SJung-uk Kim 
344f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
345f8146b88SJung-uk Kim 
346f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt11;
347f8146b88SJung-uk Kim             break;
348f8146b88SJung-uk Kim 
349f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
350f8146b88SJung-uk Kim 
351f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt12;
352f8146b88SJung-uk Kim             break;
353f8146b88SJung-uk Kim 
354f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
355f8146b88SJung-uk Kim 
356f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt13;
357f8146b88SJung-uk Kim             break;
358f8146b88SJung-uk Kim 
359f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
360f8146b88SJung-uk Kim 
361f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt14;
362f8146b88SJung-uk Kim             break;
363f8146b88SJung-uk Kim 
364f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
365f8146b88SJung-uk Kim 
366f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt15;
367f8146b88SJung-uk Kim             break;
368f8146b88SJung-uk Kim 
369cfd1ed46SJung-uk Kim         case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
370cfd1ed46SJung-uk Kim 
371cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt16;
372cfd1ed46SJung-uk Kim             break;
373cfd1ed46SJung-uk Kim 
374f8146b88SJung-uk Kim         default:
375f8146b88SJung-uk Kim 
376f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
377f8146b88SJung-uk Kim             return (AE_ERROR);
378f8146b88SJung-uk Kim         }
379f8146b88SJung-uk Kim 
380ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
381f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
382f8146b88SJung-uk Kim         {
383f8146b88SJung-uk Kim             return (Status);
384f8146b88SJung-uk Kim         }
385f8146b88SJung-uk Kim 
386f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
387f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
388f8146b88SJung-uk Kim         DtPopSubtable ();
389f8146b88SJung-uk Kim     }
390f8146b88SJung-uk Kim 
391f8146b88SJung-uk Kim     return (AE_OK);
392f8146b88SJung-uk Kim }
393f8146b88SJung-uk Kim 
394f8146b88SJung-uk Kim 
395f8146b88SJung-uk Kim /******************************************************************************
396f8146b88SJung-uk Kim  *
397f8146b88SJung-uk Kim  * FUNCTION:    DtCompileMcfg
398f8146b88SJung-uk Kim  *
399f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
400f8146b88SJung-uk Kim  *
401f8146b88SJung-uk Kim  * RETURN:      Status
402f8146b88SJung-uk Kim  *
403f8146b88SJung-uk Kim  * DESCRIPTION: Compile MCFG.
404f8146b88SJung-uk Kim  *
405f8146b88SJung-uk Kim  *****************************************************************************/
406f8146b88SJung-uk Kim 
407f8146b88SJung-uk Kim ACPI_STATUS
408f8146b88SJung-uk Kim DtCompileMcfg (
409f8146b88SJung-uk Kim     void                    **List)
410f8146b88SJung-uk Kim {
411f8146b88SJung-uk Kim     ACPI_STATUS             Status;
412f8146b88SJung-uk Kim 
413f8146b88SJung-uk Kim 
414f8146b88SJung-uk Kim     Status = DtCompileTwoSubtables (List,
415f8146b88SJung-uk Kim         AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
416f8146b88SJung-uk Kim     return (Status);
417f8146b88SJung-uk Kim }
418f8146b88SJung-uk Kim 
419f8146b88SJung-uk Kim 
420f8146b88SJung-uk Kim /******************************************************************************
421f8146b88SJung-uk Kim  *
422f8146b88SJung-uk Kim  * FUNCTION:    DtCompileMpst
423f8146b88SJung-uk Kim  *
424f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
425f8146b88SJung-uk Kim  *
426f8146b88SJung-uk Kim  * RETURN:      Status
427f8146b88SJung-uk Kim  *
428f8146b88SJung-uk Kim  * DESCRIPTION: Compile MPST.
429f8146b88SJung-uk Kim  *
430f8146b88SJung-uk Kim  *****************************************************************************/
431f8146b88SJung-uk Kim 
432f8146b88SJung-uk Kim ACPI_STATUS
433f8146b88SJung-uk Kim DtCompileMpst (
434f8146b88SJung-uk Kim     void                    **List)
435f8146b88SJung-uk Kim {
436f8146b88SJung-uk Kim     ACPI_STATUS             Status;
437f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
438f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
439f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
440f8146b88SJung-uk Kim     ACPI_MPST_CHANNEL       *MpstChannelInfo;
441f8146b88SJung-uk Kim     ACPI_MPST_POWER_NODE    *MpstPowerNode;
442f8146b88SJung-uk Kim     ACPI_MPST_DATA_HDR      *MpstDataHeader;
443f8146b88SJung-uk Kim     UINT16                  SubtableCount;
444f8146b88SJung-uk Kim     UINT32                  PowerStateCount;
445f8146b88SJung-uk Kim     UINT32                  ComponentCount;
446f8146b88SJung-uk Kim 
447f8146b88SJung-uk Kim 
448f8146b88SJung-uk Kim     /* Main table */
449f8146b88SJung-uk Kim 
450ff879b07SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable);
451f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
452f8146b88SJung-uk Kim     {
453f8146b88SJung-uk Kim         return (Status);
454f8146b88SJung-uk Kim     }
455f8146b88SJung-uk Kim 
456f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
457f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
458f8146b88SJung-uk Kim     DtPushSubtable (Subtable);
459f8146b88SJung-uk Kim 
460f8146b88SJung-uk Kim     MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
461f8146b88SJung-uk Kim     SubtableCount = MpstChannelInfo->PowerNodeCount;
462f8146b88SJung-uk Kim 
463f8146b88SJung-uk Kim     while (*PFieldList && SubtableCount)
464f8146b88SJung-uk Kim     {
465f8146b88SJung-uk Kim         /* Subtable: Memory Power Node(s) */
466f8146b88SJung-uk Kim 
467f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
468ff879b07SJung-uk Kim             &Subtable);
469f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
470f8146b88SJung-uk Kim         {
471f8146b88SJung-uk Kim             return (Status);
472f8146b88SJung-uk Kim         }
473f8146b88SJung-uk Kim 
474f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
475f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
476f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
477f8146b88SJung-uk Kim 
478f8146b88SJung-uk Kim         MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
479f8146b88SJung-uk Kim         PowerStateCount = MpstPowerNode->NumPowerStates;
480f8146b88SJung-uk Kim         ComponentCount = MpstPowerNode->NumPhysicalComponents;
481f8146b88SJung-uk Kim 
482f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
483f8146b88SJung-uk Kim 
484f8146b88SJung-uk Kim         /* Sub-subtables - Memory Power State Structure(s) */
485f8146b88SJung-uk Kim 
486f8146b88SJung-uk Kim         while (*PFieldList && PowerStateCount)
487f8146b88SJung-uk Kim         {
488f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
489ff879b07SJung-uk Kim                 &Subtable);
490f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
491f8146b88SJung-uk Kim             {
492f8146b88SJung-uk Kim                 return (Status);
493f8146b88SJung-uk Kim             }
494f8146b88SJung-uk Kim 
495f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
496f8146b88SJung-uk Kim             PowerStateCount--;
497f8146b88SJung-uk Kim         }
498f8146b88SJung-uk Kim 
499f8146b88SJung-uk Kim         /* Sub-subtables - Physical Component ID Structure(s) */
500f8146b88SJung-uk Kim 
501f8146b88SJung-uk Kim         while (*PFieldList && ComponentCount)
502f8146b88SJung-uk Kim         {
503f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
504ff879b07SJung-uk Kim                 &Subtable);
505f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
506f8146b88SJung-uk Kim             {
507f8146b88SJung-uk Kim                 return (Status);
508f8146b88SJung-uk Kim             }
509f8146b88SJung-uk Kim 
510f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
511f8146b88SJung-uk Kim             ComponentCount--;
512f8146b88SJung-uk Kim         }
513f8146b88SJung-uk Kim 
514f8146b88SJung-uk Kim         SubtableCount--;
515f8146b88SJung-uk Kim         DtPopSubtable ();
516f8146b88SJung-uk Kim     }
517f8146b88SJung-uk Kim 
518f8146b88SJung-uk Kim     /* Subtable: Count of Memory Power State Characteristic structures */
519f8146b88SJung-uk Kim 
520f8146b88SJung-uk Kim     DtPopSubtable ();
521f8146b88SJung-uk Kim 
522ff879b07SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable);
523f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
524f8146b88SJung-uk Kim     {
525f8146b88SJung-uk Kim         return (Status);
526f8146b88SJung-uk Kim     }
527f8146b88SJung-uk Kim 
528f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
529f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
530f8146b88SJung-uk Kim     DtPushSubtable (Subtable);
531f8146b88SJung-uk Kim 
532f8146b88SJung-uk Kim     MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
533f8146b88SJung-uk Kim     SubtableCount = MpstDataHeader->CharacteristicsCount;
534f8146b88SJung-uk Kim 
535f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
536f8146b88SJung-uk Kim 
537f8146b88SJung-uk Kim     /* Subtable: Memory Power State Characteristics structure(s) */
538f8146b88SJung-uk Kim 
539f8146b88SJung-uk Kim     while (*PFieldList && SubtableCount)
540f8146b88SJung-uk Kim     {
541f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
542ff879b07SJung-uk Kim             &Subtable);
543f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
544f8146b88SJung-uk Kim         {
545f8146b88SJung-uk Kim             return (Status);
546f8146b88SJung-uk Kim         }
547f8146b88SJung-uk Kim 
548f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
549f8146b88SJung-uk Kim         SubtableCount--;
550f8146b88SJung-uk Kim     }
551f8146b88SJung-uk Kim 
552f8146b88SJung-uk Kim     DtPopSubtable ();
553f8146b88SJung-uk Kim     return (AE_OK);
554f8146b88SJung-uk Kim }
555f8146b88SJung-uk Kim 
556f8146b88SJung-uk Kim 
557f8146b88SJung-uk Kim /******************************************************************************
558f8146b88SJung-uk Kim  *
559f8146b88SJung-uk Kim  * FUNCTION:    DtCompileMsct
560f8146b88SJung-uk Kim  *
561f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
562f8146b88SJung-uk Kim  *
563f8146b88SJung-uk Kim  * RETURN:      Status
564f8146b88SJung-uk Kim  *
565f8146b88SJung-uk Kim  * DESCRIPTION: Compile MSCT.
566f8146b88SJung-uk Kim  *
567f8146b88SJung-uk Kim  *****************************************************************************/
568f8146b88SJung-uk Kim 
569f8146b88SJung-uk Kim ACPI_STATUS
570f8146b88SJung-uk Kim DtCompileMsct (
571f8146b88SJung-uk Kim     void                    **List)
572f8146b88SJung-uk Kim {
573f8146b88SJung-uk Kim     ACPI_STATUS             Status;
574f8146b88SJung-uk Kim 
575f8146b88SJung-uk Kim 
576f8146b88SJung-uk Kim     Status = DtCompileTwoSubtables (List,
577f8146b88SJung-uk Kim         AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
578f8146b88SJung-uk Kim     return (Status);
579f8146b88SJung-uk Kim }
580f8146b88SJung-uk Kim 
581f8146b88SJung-uk Kim 
582f8146b88SJung-uk Kim /******************************************************************************
583f8146b88SJung-uk Kim  *
584f8146b88SJung-uk Kim  * FUNCTION:    DtCompileNfit
585f8146b88SJung-uk Kim  *
586f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
587f8146b88SJung-uk Kim  *
588f8146b88SJung-uk Kim  * RETURN:      Status
589f8146b88SJung-uk Kim  *
590f8146b88SJung-uk Kim  * DESCRIPTION: Compile NFIT.
591f8146b88SJung-uk Kim  *
592f8146b88SJung-uk Kim  *****************************************************************************/
593f8146b88SJung-uk Kim 
594f8146b88SJung-uk Kim ACPI_STATUS
595f8146b88SJung-uk Kim DtCompileNfit (
596f8146b88SJung-uk Kim     void                    **List)
597f8146b88SJung-uk Kim {
598f8146b88SJung-uk Kim     ACPI_STATUS             Status;
599f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
600f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
601f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
602f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
603f8146b88SJung-uk Kim     ACPI_NFIT_HEADER        *NfitHeader;
604f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
605f8146b88SJung-uk Kim     UINT32                  Count;
606f8146b88SJung-uk Kim     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
607f8146b88SJung-uk Kim     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
608f8146b88SJung-uk Kim 
609f8146b88SJung-uk Kim 
610f8146b88SJung-uk Kim     /* Main table */
611f8146b88SJung-uk Kim 
612f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit,
613ff879b07SJung-uk Kim         &Subtable);
614f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
615f8146b88SJung-uk Kim     {
616f8146b88SJung-uk Kim         return (Status);
617f8146b88SJung-uk Kim     }
618f8146b88SJung-uk Kim 
619f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
620f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
621f8146b88SJung-uk Kim     DtPushSubtable (Subtable);
622f8146b88SJung-uk Kim 
623f8146b88SJung-uk Kim     /* Subtables */
624f8146b88SJung-uk Kim 
625f8146b88SJung-uk Kim     while (*PFieldList)
626f8146b88SJung-uk Kim     {
627f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
628f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr,
629ff879b07SJung-uk Kim             &Subtable);
630f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
631f8146b88SJung-uk Kim         {
632f8146b88SJung-uk Kim             return (Status);
633f8146b88SJung-uk Kim         }
634f8146b88SJung-uk Kim 
635f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
636f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
637f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
638f8146b88SJung-uk Kim 
639f8146b88SJung-uk Kim         NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
640f8146b88SJung-uk Kim 
641f8146b88SJung-uk Kim         switch (NfitHeader->Type)
642f8146b88SJung-uk Kim         {
643f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
644f8146b88SJung-uk Kim 
645f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit0;
646f8146b88SJung-uk Kim             break;
647f8146b88SJung-uk Kim 
648f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_MEMORY_MAP:
649f8146b88SJung-uk Kim 
650f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit1;
651f8146b88SJung-uk Kim             break;
652f8146b88SJung-uk Kim 
653f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_INTERLEAVE:
654f8146b88SJung-uk Kim 
655f8146b88SJung-uk Kim             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer);
656f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit2;
657f8146b88SJung-uk Kim             break;
658f8146b88SJung-uk Kim 
659f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_SMBIOS:
660f8146b88SJung-uk Kim 
661f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit3;
662f8146b88SJung-uk Kim             break;
663f8146b88SJung-uk Kim 
664f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_CONTROL_REGION:
665f8146b88SJung-uk Kim 
666f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit4;
667f8146b88SJung-uk Kim             break;
668f8146b88SJung-uk Kim 
669f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_DATA_REGION:
670f8146b88SJung-uk Kim 
671f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit5;
672f8146b88SJung-uk Kim             break;
673f8146b88SJung-uk Kim 
674f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
675f8146b88SJung-uk Kim 
676f8146b88SJung-uk Kim             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer);
677f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit6;
678f8146b88SJung-uk Kim             break;
679f8146b88SJung-uk Kim 
680b7b7e711SJung-uk Kim         case ACPI_NFIT_TYPE_CAPABILITIES:
681b7b7e711SJung-uk Kim 
682b7b7e711SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit7;
683b7b7e711SJung-uk Kim             break;
684b7b7e711SJung-uk Kim 
685f8146b88SJung-uk Kim         default:
686f8146b88SJung-uk Kim 
687f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT");
688f8146b88SJung-uk Kim             return (AE_ERROR);
689f8146b88SJung-uk Kim         }
690f8146b88SJung-uk Kim 
691ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
692f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
693f8146b88SJung-uk Kim         {
694f8146b88SJung-uk Kim             return (Status);
695f8146b88SJung-uk Kim         }
696f8146b88SJung-uk Kim 
697f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
698f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
699f8146b88SJung-uk Kim         DtPopSubtable ();
700f8146b88SJung-uk Kim 
701f8146b88SJung-uk Kim         switch (NfitHeader->Type)
702f8146b88SJung-uk Kim         {
703f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_INTERLEAVE:
704f8146b88SJung-uk Kim 
705f8146b88SJung-uk Kim             Count = 0;
706f8146b88SJung-uk Kim             DtPushSubtable (Subtable);
707f8146b88SJung-uk Kim             while (*PFieldList)
708f8146b88SJung-uk Kim             {
709f8146b88SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a,
710ff879b07SJung-uk Kim                     &Subtable);
711f8146b88SJung-uk Kim                 if (ACPI_FAILURE (Status))
712f8146b88SJung-uk Kim                 {
713f8146b88SJung-uk Kim                     return (Status);
714f8146b88SJung-uk Kim                 }
715f8146b88SJung-uk Kim 
716f8146b88SJung-uk Kim                 if (!Subtable)
717f8146b88SJung-uk Kim                 {
718f8146b88SJung-uk Kim                     DtPopSubtable ();
719f8146b88SJung-uk Kim                     break;
720f8146b88SJung-uk Kim                 }
721f8146b88SJung-uk Kim 
722f8146b88SJung-uk Kim                 ParentTable = DtPeekSubtable ();
723f8146b88SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
724f8146b88SJung-uk Kim                 Count++;
725f8146b88SJung-uk Kim             }
726f8146b88SJung-uk Kim 
727f8146b88SJung-uk Kim             Interleave->LineCount = Count;
728f8146b88SJung-uk Kim             break;
729f8146b88SJung-uk Kim 
730f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_SMBIOS:
731f8146b88SJung-uk Kim 
732f8146b88SJung-uk Kim             if (*PFieldList)
733f8146b88SJung-uk Kim             {
734f8146b88SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a,
735ff879b07SJung-uk Kim                     &Subtable);
736f8146b88SJung-uk Kim                 if (ACPI_FAILURE (Status))
737f8146b88SJung-uk Kim                 {
738f8146b88SJung-uk Kim                     return (Status);
739f8146b88SJung-uk Kim                 }
740f8146b88SJung-uk Kim 
741f8146b88SJung-uk Kim                 if (Subtable)
742f8146b88SJung-uk Kim                 {
743f8146b88SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
744f8146b88SJung-uk Kim                 }
745f8146b88SJung-uk Kim             }
746f8146b88SJung-uk Kim             break;
747f8146b88SJung-uk Kim 
748f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
749f8146b88SJung-uk Kim 
750f8146b88SJung-uk Kim             Count = 0;
751f8146b88SJung-uk Kim             DtPushSubtable (Subtable);
752f8146b88SJung-uk Kim             while (*PFieldList)
753f8146b88SJung-uk Kim             {
754f8146b88SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a,
755ff879b07SJung-uk Kim                     &Subtable);
756f8146b88SJung-uk Kim                 if (ACPI_FAILURE (Status))
757f8146b88SJung-uk Kim                 {
758f8146b88SJung-uk Kim                     return (Status);
759f8146b88SJung-uk Kim                 }
760f8146b88SJung-uk Kim 
761f8146b88SJung-uk Kim                 if (!Subtable)
762f8146b88SJung-uk Kim                 {
763f8146b88SJung-uk Kim                     DtPopSubtable ();
764f8146b88SJung-uk Kim                     break;
765f8146b88SJung-uk Kim                 }
766f8146b88SJung-uk Kim 
767f8146b88SJung-uk Kim                 ParentTable = DtPeekSubtable ();
768f8146b88SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
769f8146b88SJung-uk Kim                 Count++;
770f8146b88SJung-uk Kim             }
771f8146b88SJung-uk Kim 
772f8146b88SJung-uk Kim             Hint->HintCount = (UINT16) Count;
773f8146b88SJung-uk Kim             break;
774f8146b88SJung-uk Kim 
775f8146b88SJung-uk Kim         default:
776f8146b88SJung-uk Kim             break;
777f8146b88SJung-uk Kim         }
778f8146b88SJung-uk Kim     }
779f8146b88SJung-uk Kim 
780f8146b88SJung-uk Kim     return (AE_OK);
781f8146b88SJung-uk Kim }
782f8146b88SJung-uk Kim 
783f8146b88SJung-uk Kim 
784f8146b88SJung-uk Kim /******************************************************************************
785f8146b88SJung-uk Kim  *
786f8146b88SJung-uk Kim  * FUNCTION:    DtCompilePcct
787f8146b88SJung-uk Kim  *
788f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
789f8146b88SJung-uk Kim  *
790f8146b88SJung-uk Kim  * RETURN:      Status
791f8146b88SJung-uk Kim  *
792f8146b88SJung-uk Kim  * DESCRIPTION: Compile PCCT.
793f8146b88SJung-uk Kim  *
794f8146b88SJung-uk Kim  *****************************************************************************/
795f8146b88SJung-uk Kim 
796f8146b88SJung-uk Kim ACPI_STATUS
797f8146b88SJung-uk Kim DtCompilePcct (
798f8146b88SJung-uk Kim     void                    **List)
799f8146b88SJung-uk Kim {
800f8146b88SJung-uk Kim     ACPI_STATUS             Status;
801f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
802f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
803f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
804f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
805f8146b88SJung-uk Kim     ACPI_SUBTABLE_HEADER    *PcctHeader;
806f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
807f8146b88SJung-uk Kim 
808f8146b88SJung-uk Kim 
809f8146b88SJung-uk Kim     /* Main table */
810f8146b88SJung-uk Kim 
811f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
812ff879b07SJung-uk Kim         &Subtable);
813f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
814f8146b88SJung-uk Kim     {
815f8146b88SJung-uk Kim         return (Status);
816f8146b88SJung-uk Kim     }
817f8146b88SJung-uk Kim 
818f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
819f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
820f8146b88SJung-uk Kim 
821f8146b88SJung-uk Kim     /* Subtables */
822f8146b88SJung-uk Kim 
823f8146b88SJung-uk Kim     while (*PFieldList)
824f8146b88SJung-uk Kim     {
825f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
826f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
827ff879b07SJung-uk Kim             &Subtable);
828f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
829f8146b88SJung-uk Kim         {
830f8146b88SJung-uk Kim             return (Status);
831f8146b88SJung-uk Kim         }
832f8146b88SJung-uk Kim 
833f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
834f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
835f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
836f8146b88SJung-uk Kim 
837f8146b88SJung-uk Kim         PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
838f8146b88SJung-uk Kim 
839f8146b88SJung-uk Kim         switch (PcctHeader->Type)
840f8146b88SJung-uk Kim         {
841f8146b88SJung-uk Kim         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
842f8146b88SJung-uk Kim 
843f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct0;
844f8146b88SJung-uk Kim             break;
845f8146b88SJung-uk Kim 
846f8146b88SJung-uk Kim         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
847f8146b88SJung-uk Kim 
848f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct1;
849f8146b88SJung-uk Kim             break;
850f8146b88SJung-uk Kim 
851f8146b88SJung-uk Kim         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
852f8146b88SJung-uk Kim 
853f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct2;
854f8146b88SJung-uk Kim             break;
855f8146b88SJung-uk Kim 
856af051161SJung-uk Kim         case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
857af051161SJung-uk Kim 
858af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct3;
859af051161SJung-uk Kim             break;
860af051161SJung-uk Kim 
861af051161SJung-uk Kim         case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
862af051161SJung-uk Kim 
863af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct4;
864af051161SJung-uk Kim             break;
865af051161SJung-uk Kim 
866cfd1ed46SJung-uk Kim         case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
867cfd1ed46SJung-uk Kim 
868cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct5;
869cfd1ed46SJung-uk Kim             break;
870cfd1ed46SJung-uk Kim 
871f8146b88SJung-uk Kim         default:
872f8146b88SJung-uk Kim 
873f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
874f8146b88SJung-uk Kim             return (AE_ERROR);
875f8146b88SJung-uk Kim         }
876f8146b88SJung-uk Kim 
877ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
878f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
879f8146b88SJung-uk Kim         {
880f8146b88SJung-uk Kim             return (Status);
881f8146b88SJung-uk Kim         }
882f8146b88SJung-uk Kim 
883f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
884f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
885f8146b88SJung-uk Kim         DtPopSubtable ();
886f8146b88SJung-uk Kim     }
887f8146b88SJung-uk Kim 
888f8146b88SJung-uk Kim     return (AE_OK);
889f8146b88SJung-uk Kim }
890f8146b88SJung-uk Kim 
891f8146b88SJung-uk Kim 
892f8146b88SJung-uk Kim /******************************************************************************
893f8146b88SJung-uk Kim  *
89467d9aa44SJung-uk Kim  * FUNCTION:    DtCompilePdtt
89567d9aa44SJung-uk Kim  *
89667d9aa44SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
89767d9aa44SJung-uk Kim  *
89867d9aa44SJung-uk Kim  * RETURN:      Status
89967d9aa44SJung-uk Kim  *
90067d9aa44SJung-uk Kim  * DESCRIPTION: Compile PDTT.
90167d9aa44SJung-uk Kim  *
90267d9aa44SJung-uk Kim  *****************************************************************************/
90367d9aa44SJung-uk Kim 
90467d9aa44SJung-uk Kim ACPI_STATUS
90567d9aa44SJung-uk Kim DtCompilePdtt (
90667d9aa44SJung-uk Kim     void                    **List)
90767d9aa44SJung-uk Kim {
90867d9aa44SJung-uk Kim     ACPI_STATUS             Status;
90967d9aa44SJung-uk Kim     DT_SUBTABLE             *Subtable;
91067d9aa44SJung-uk Kim     DT_SUBTABLE             *ParentTable;
91167d9aa44SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
91267d9aa44SJung-uk Kim     ACPI_TABLE_PDTT         *PdttHeader;
91367d9aa44SJung-uk Kim     UINT32                  Count = 0;
91467d9aa44SJung-uk Kim 
91567d9aa44SJung-uk Kim 
91667d9aa44SJung-uk Kim     /* Main table */
91767d9aa44SJung-uk Kim 
918ff879b07SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt, &Subtable);
91967d9aa44SJung-uk Kim     if (ACPI_FAILURE (Status))
92067d9aa44SJung-uk Kim     {
92167d9aa44SJung-uk Kim         return (Status);
92267d9aa44SJung-uk Kim     }
92367d9aa44SJung-uk Kim 
92467d9aa44SJung-uk Kim     ParentTable = DtPeekSubtable ();
92567d9aa44SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
92667d9aa44SJung-uk Kim 
92767d9aa44SJung-uk Kim     PdttHeader = ACPI_CAST_PTR (ACPI_TABLE_PDTT, ParentTable->Buffer);
92867d9aa44SJung-uk Kim     PdttHeader->ArrayOffset = sizeof (ACPI_TABLE_PDTT);
92967d9aa44SJung-uk Kim 
93067d9aa44SJung-uk Kim     /* There is only one type of subtable at this time, no need to decode */
93167d9aa44SJung-uk Kim 
93267d9aa44SJung-uk Kim     while (*PFieldList)
93367d9aa44SJung-uk Kim     {
93467d9aa44SJung-uk Kim         /* List of subchannel IDs, each 2 bytes */
93567d9aa44SJung-uk Kim 
93667d9aa44SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt0,
937ff879b07SJung-uk Kim             &Subtable);
93867d9aa44SJung-uk Kim         if (ACPI_FAILURE (Status))
93967d9aa44SJung-uk Kim         {
94067d9aa44SJung-uk Kim             return (Status);
94167d9aa44SJung-uk Kim         }
94267d9aa44SJung-uk Kim 
94367d9aa44SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
94467d9aa44SJung-uk Kim         Count++;
94567d9aa44SJung-uk Kim     }
94667d9aa44SJung-uk Kim 
94767d9aa44SJung-uk Kim     PdttHeader->TriggerCount = (UINT8) Count;
94867d9aa44SJung-uk Kim     return (AE_OK);
94967d9aa44SJung-uk Kim }
95067d9aa44SJung-uk Kim 
95167d9aa44SJung-uk Kim 
95267d9aa44SJung-uk Kim /******************************************************************************
95367d9aa44SJung-uk Kim  *
954cfd1ed46SJung-uk Kim  * FUNCTION:    DtCompilePhat
955cfd1ed46SJung-uk Kim  *
956cfd1ed46SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
957cfd1ed46SJung-uk Kim  *
958cfd1ed46SJung-uk Kim  * RETURN:      Status
959cfd1ed46SJung-uk Kim  *
960cfd1ed46SJung-uk Kim  * DESCRIPTION: Compile Phat.
961cfd1ed46SJung-uk Kim  *
962cfd1ed46SJung-uk Kim  *****************************************************************************/
963cfd1ed46SJung-uk Kim 
964cfd1ed46SJung-uk Kim ACPI_STATUS
965cfd1ed46SJung-uk Kim DtCompilePhat (
966cfd1ed46SJung-uk Kim     void                    **List)
967cfd1ed46SJung-uk Kim {
968cfd1ed46SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
969cfd1ed46SJung-uk Kim     DT_SUBTABLE             *Subtable;
970cfd1ed46SJung-uk Kim     DT_SUBTABLE             *ParentTable;
971cfd1ed46SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
972cfd1ed46SJung-uk Kim     ACPI_PHAT_HEADER        *PhatHeader;
973cfd1ed46SJung-uk Kim     ACPI_DMTABLE_INFO       *Info;
974cfd1ed46SJung-uk Kim     ACPI_PHAT_VERSION_DATA  *VersionData;
975cfd1ed46SJung-uk Kim     UINT32                  RecordCount;
976cfd1ed46SJung-uk Kim 
977cfd1ed46SJung-uk Kim 
978cfd1ed46SJung-uk Kim     /* The table consist of subtables */
979cfd1ed46SJung-uk Kim 
980cfd1ed46SJung-uk Kim     while (*PFieldList)
981cfd1ed46SJung-uk Kim     {
982cfd1ed46SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable);
983cfd1ed46SJung-uk Kim         if (ACPI_FAILURE (Status))
984cfd1ed46SJung-uk Kim         {
985cfd1ed46SJung-uk Kim             return (Status);
986cfd1ed46SJung-uk Kim         }
987cfd1ed46SJung-uk Kim 
988cfd1ed46SJung-uk Kim         ParentTable = DtPeekSubtable ();
989cfd1ed46SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
990cfd1ed46SJung-uk Kim         DtPushSubtable (Subtable);
991cfd1ed46SJung-uk Kim 
992cfd1ed46SJung-uk Kim         PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer);
993cfd1ed46SJung-uk Kim 
994cfd1ed46SJung-uk Kim         switch (PhatHeader->Type)
995cfd1ed46SJung-uk Kim         {
996cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
997cfd1ed46SJung-uk Kim 
998cfd1ed46SJung-uk Kim             Info = AcpiDmTableInfoPhat0;
999cfd1ed46SJung-uk Kim             PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA);
1000cfd1ed46SJung-uk Kim             break;
1001cfd1ed46SJung-uk Kim 
1002cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
1003cfd1ed46SJung-uk Kim 
1004cfd1ed46SJung-uk Kim             Info = AcpiDmTableInfoPhat1;
1005cfd1ed46SJung-uk Kim             PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA);
1006cfd1ed46SJung-uk Kim             break;
1007cfd1ed46SJung-uk Kim 
1008cfd1ed46SJung-uk Kim         default:
1009cfd1ed46SJung-uk Kim 
1010cfd1ed46SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
1011cfd1ed46SJung-uk Kim             return (AE_ERROR);
1012cfd1ed46SJung-uk Kim 
1013cfd1ed46SJung-uk Kim             break;
1014cfd1ed46SJung-uk Kim         }
1015cfd1ed46SJung-uk Kim 
1016cfd1ed46SJung-uk Kim         Status = DtCompileTable (PFieldList, Info, &Subtable);
1017cfd1ed46SJung-uk Kim         if (ACPI_FAILURE (Status))
1018cfd1ed46SJung-uk Kim         {
1019cfd1ed46SJung-uk Kim             return (Status);
1020cfd1ed46SJung-uk Kim         }
1021cfd1ed46SJung-uk Kim 
1022cfd1ed46SJung-uk Kim         ParentTable = DtPeekSubtable ();
1023cfd1ed46SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1024cfd1ed46SJung-uk Kim 
1025cfd1ed46SJung-uk Kim         switch (PhatHeader->Type)
1026cfd1ed46SJung-uk Kim         {
1027cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
1028cfd1ed46SJung-uk Kim 
1029cfd1ed46SJung-uk Kim             VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA,
1030cfd1ed46SJung-uk Kim                 (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER)));
1031cfd1ed46SJung-uk Kim             RecordCount = VersionData->ElementCount;
1032cfd1ed46SJung-uk Kim 
1033cfd1ed46SJung-uk Kim             while (RecordCount)
1034cfd1ed46SJung-uk Kim             {
1035cfd1ed46SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a,
1036cfd1ed46SJung-uk Kim                     &Subtable);
1037cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
1038cfd1ed46SJung-uk Kim                 {
1039cfd1ed46SJung-uk Kim                     return (Status);
1040cfd1ed46SJung-uk Kim                 }
1041cfd1ed46SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1042cfd1ed46SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1043cfd1ed46SJung-uk Kim 
1044cfd1ed46SJung-uk Kim                 RecordCount--;
1045cfd1ed46SJung-uk Kim                 PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT);
1046cfd1ed46SJung-uk Kim             }
1047cfd1ed46SJung-uk Kim             break;
1048cfd1ed46SJung-uk Kim 
1049cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
1050cfd1ed46SJung-uk Kim 
1051cfd1ed46SJung-uk Kim             /* Compile device path */
1052cfd1ed46SJung-uk Kim 
1053cfd1ed46SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable);
1054cfd1ed46SJung-uk Kim             if (ACPI_FAILURE (Status))
1055cfd1ed46SJung-uk Kim             {
1056cfd1ed46SJung-uk Kim                 return (Status);
1057cfd1ed46SJung-uk Kim             }
1058cfd1ed46SJung-uk Kim             ParentTable = DtPeekSubtable ();
1059cfd1ed46SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1060cfd1ed46SJung-uk Kim 
1061cfd1ed46SJung-uk Kim             PhatHeader->Length += (UINT16) Subtable->Length;
1062cfd1ed46SJung-uk Kim 
1063cfd1ed46SJung-uk Kim             /* Compile vendor specific data */
1064cfd1ed46SJung-uk Kim 
1065cfd1ed46SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable);
1066cfd1ed46SJung-uk Kim             if (ACPI_FAILURE (Status))
1067cfd1ed46SJung-uk Kim             {
1068cfd1ed46SJung-uk Kim                 return (Status);
1069cfd1ed46SJung-uk Kim             }
1070cfd1ed46SJung-uk Kim             ParentTable = DtPeekSubtable ();
1071cfd1ed46SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1072cfd1ed46SJung-uk Kim 
1073cfd1ed46SJung-uk Kim             PhatHeader->Length += (UINT16) Subtable->Length;
1074cfd1ed46SJung-uk Kim 
1075cfd1ed46SJung-uk Kim             break;
1076cfd1ed46SJung-uk Kim 
1077cfd1ed46SJung-uk Kim         default:
1078cfd1ed46SJung-uk Kim 
1079cfd1ed46SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
1080cfd1ed46SJung-uk Kim             return (AE_ERROR);
1081cfd1ed46SJung-uk Kim         }
1082cfd1ed46SJung-uk Kim     }
1083cfd1ed46SJung-uk Kim 
1084cfd1ed46SJung-uk Kim     return (Status);
1085cfd1ed46SJung-uk Kim }
1086cfd1ed46SJung-uk Kim 
1087cfd1ed46SJung-uk Kim 
1088cfd1ed46SJung-uk Kim /******************************************************************************
1089cfd1ed46SJung-uk Kim  *
1090f8146b88SJung-uk Kim  * FUNCTION:    DtCompilePmtt
1091f8146b88SJung-uk Kim  *
1092f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1093f8146b88SJung-uk Kim  *
1094f8146b88SJung-uk Kim  * RETURN:      Status
1095f8146b88SJung-uk Kim  *
1096f8146b88SJung-uk Kim  * DESCRIPTION: Compile PMTT.
1097f8146b88SJung-uk Kim  *
1098f8146b88SJung-uk Kim  *****************************************************************************/
1099f8146b88SJung-uk Kim 
1100f8146b88SJung-uk Kim ACPI_STATUS
1101f8146b88SJung-uk Kim DtCompilePmtt (
1102f8146b88SJung-uk Kim     void                    **List)
1103f8146b88SJung-uk Kim {
1104f8146b88SJung-uk Kim     ACPI_STATUS             Status;
1105f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
1106f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1107f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1108f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
1109cfd1ed46SJung-uk Kim     UINT16                  Type;
1110f8146b88SJung-uk Kim 
1111f8146b88SJung-uk Kim 
1112f8146b88SJung-uk Kim     /* Main table */
1113f8146b88SJung-uk Kim 
1114ff879b07SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable);
1115f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
1116f8146b88SJung-uk Kim     {
1117f8146b88SJung-uk Kim         return (Status);
1118f8146b88SJung-uk Kim     }
1119f8146b88SJung-uk Kim 
1120f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
1121f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1122f8146b88SJung-uk Kim     DtPushSubtable (Subtable);
1123f8146b88SJung-uk Kim 
1124cfd1ed46SJung-uk Kim     /* Subtables */
1125cfd1ed46SJung-uk Kim 
1126f8146b88SJung-uk Kim     while (*PFieldList)
1127f8146b88SJung-uk Kim     {
1128f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
1129cfd1ed46SJung-uk Kim         DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
1130f8146b88SJung-uk Kim 
1131cfd1ed46SJung-uk Kim         switch (Type)
1132f8146b88SJung-uk Kim         {
1133f8146b88SJung-uk Kim         case ACPI_PMTT_TYPE_SOCKET:
1134f8146b88SJung-uk Kim 
1135f8146b88SJung-uk Kim             /* Subtable: Socket Structure */
1136f8146b88SJung-uk Kim 
1137cfd1ed46SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_SOCKET (0)\n");
1138cfd1ed46SJung-uk Kim 
1139f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
1140ff879b07SJung-uk Kim                 &Subtable);
1141f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
1142f8146b88SJung-uk Kim             {
1143f8146b88SJung-uk Kim                 return (Status);
1144f8146b88SJung-uk Kim             }
1145f8146b88SJung-uk Kim 
1146f8146b88SJung-uk Kim             break;
1147f8146b88SJung-uk Kim 
1148f8146b88SJung-uk Kim         case ACPI_PMTT_TYPE_CONTROLLER:
1149f8146b88SJung-uk Kim 
1150f8146b88SJung-uk Kim             /* Subtable: Memory Controller Structure */
1151f8146b88SJung-uk Kim 
1152cfd1ed46SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_CONTROLLER (1)\n");
1153cfd1ed46SJung-uk Kim 
1154f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
1155ff879b07SJung-uk Kim                 &Subtable);
1156f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
1157f8146b88SJung-uk Kim             {
1158f8146b88SJung-uk Kim                 return (Status);
1159f8146b88SJung-uk Kim             }
1160f8146b88SJung-uk Kim 
1161f8146b88SJung-uk Kim             break;
1162f8146b88SJung-uk Kim 
1163f8146b88SJung-uk Kim         case ACPI_PMTT_TYPE_DIMM:
1164f8146b88SJung-uk Kim 
1165cfd1ed46SJung-uk Kim             /* Subtable: Physical Component (DIMM) Structure */
1166f8146b88SJung-uk Kim 
1167cfd1ed46SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_DIMM (2)\n");
1168f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
1169ff879b07SJung-uk Kim                 &Subtable);
1170f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
1171f8146b88SJung-uk Kim             {
1172f8146b88SJung-uk Kim                 return (Status);
1173f8146b88SJung-uk Kim             }
1174f8146b88SJung-uk Kim 
1175cfd1ed46SJung-uk Kim             break;
1176cfd1ed46SJung-uk Kim 
1177cfd1ed46SJung-uk Kim         case ACPI_PMTT_TYPE_VENDOR:
1178cfd1ed46SJung-uk Kim 
1179cfd1ed46SJung-uk Kim             /* Subtable: Vendor-specific Structure */
1180cfd1ed46SJung-uk Kim 
1181cfd1ed46SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_VENDOR(FF)\n");
1182cfd1ed46SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttVendor,
1183cfd1ed46SJung-uk Kim                 &Subtable);
1184cfd1ed46SJung-uk Kim             if (ACPI_FAILURE (Status))
1185cfd1ed46SJung-uk Kim             {
1186cfd1ed46SJung-uk Kim                 return (Status);
1187cfd1ed46SJung-uk Kim             }
1188cfd1ed46SJung-uk Kim 
1189f8146b88SJung-uk Kim             break;
1190f8146b88SJung-uk Kim 
1191f8146b88SJung-uk Kim         default:
1192f8146b88SJung-uk Kim 
1193f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
1194f8146b88SJung-uk Kim             return (AE_ERROR);
1195f8146b88SJung-uk Kim         }
1196cfd1ed46SJung-uk Kim 
1197cfd1ed46SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1198f8146b88SJung-uk Kim     }
1199f8146b88SJung-uk Kim 
1200f8146b88SJung-uk Kim     return (Status);
1201f8146b88SJung-uk Kim }
1202f8146b88SJung-uk Kim 
1203f8146b88SJung-uk Kim 
1204f8146b88SJung-uk Kim /******************************************************************************
1205f8146b88SJung-uk Kim  *
1206af051161SJung-uk Kim  * FUNCTION:    DtCompilePptt
1207af051161SJung-uk Kim  *
1208af051161SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1209af051161SJung-uk Kim  *
1210af051161SJung-uk Kim  * RETURN:      Status
1211af051161SJung-uk Kim  *
1212af051161SJung-uk Kim  * DESCRIPTION: Compile PPTT.
1213af051161SJung-uk Kim  *
1214af051161SJung-uk Kim  *****************************************************************************/
1215af051161SJung-uk Kim 
1216af051161SJung-uk Kim ACPI_STATUS
1217af051161SJung-uk Kim DtCompilePptt (
1218af051161SJung-uk Kim     void                    **List)
1219af051161SJung-uk Kim {
1220af051161SJung-uk Kim     ACPI_STATUS             Status;
1221af051161SJung-uk Kim     ACPI_SUBTABLE_HEADER    *PpttHeader;
1222af051161SJung-uk Kim     ACPI_PPTT_PROCESSOR     *PpttProcessor = NULL;
1223af051161SJung-uk Kim     DT_SUBTABLE             *Subtable;
1224af051161SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1225af051161SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1226af051161SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1227af051161SJung-uk Kim     DT_FIELD                *SubtableStart;
1228cfd1ed46SJung-uk Kim     ACPI_TABLE_HEADER       *PpttAcpiHeader;
1229af051161SJung-uk Kim 
1230af051161SJung-uk Kim 
1231af051161SJung-uk Kim     ParentTable = DtPeekSubtable ();
1232af051161SJung-uk Kim     while (*PFieldList)
1233af051161SJung-uk Kim     {
1234af051161SJung-uk Kim         SubtableStart = *PFieldList;
1235af051161SJung-uk Kim 
1236af051161SJung-uk Kim         /* Compile PPTT subtable header */
1237af051161SJung-uk Kim 
1238af051161SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPpttHdr,
1239ff879b07SJung-uk Kim             &Subtable);
1240af051161SJung-uk Kim         if (ACPI_FAILURE (Status))
1241af051161SJung-uk Kim         {
1242af051161SJung-uk Kim             return (Status);
1243af051161SJung-uk Kim         }
1244af051161SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1245af051161SJung-uk Kim         PpttHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1246af051161SJung-uk Kim         PpttHeader->Length = (UINT8)(Subtable->Length);
1247af051161SJung-uk Kim 
1248af051161SJung-uk Kim         switch (PpttHeader->Type)
1249af051161SJung-uk Kim         {
1250af051161SJung-uk Kim         case ACPI_PPTT_TYPE_PROCESSOR:
1251af051161SJung-uk Kim 
1252af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoPptt0;
1253af051161SJung-uk Kim             break;
1254af051161SJung-uk Kim 
1255af051161SJung-uk Kim         case ACPI_PPTT_TYPE_CACHE:
1256af051161SJung-uk Kim 
1257af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoPptt1;
1258af051161SJung-uk Kim             break;
1259af051161SJung-uk Kim 
1260af051161SJung-uk Kim         case ACPI_PPTT_TYPE_ID:
1261af051161SJung-uk Kim 
1262af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoPptt2;
1263af051161SJung-uk Kim             break;
1264af051161SJung-uk Kim 
1265af051161SJung-uk Kim         default:
1266af051161SJung-uk Kim 
1267af051161SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PPTT");
1268af051161SJung-uk Kim             return (AE_ERROR);
1269af051161SJung-uk Kim         }
1270af051161SJung-uk Kim 
1271af051161SJung-uk Kim         /* Compile PPTT subtable body */
1272af051161SJung-uk Kim 
1273ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
1274af051161SJung-uk Kim         if (ACPI_FAILURE (Status))
1275af051161SJung-uk Kim         {
1276af051161SJung-uk Kim             return (Status);
1277af051161SJung-uk Kim         }
1278af051161SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1279af051161SJung-uk Kim         PpttHeader->Length += (UINT8)(Subtable->Length);
1280af051161SJung-uk Kim 
1281af051161SJung-uk Kim         /* Compile PPTT subtable additionals */
1282af051161SJung-uk Kim 
1283af051161SJung-uk Kim         switch (PpttHeader->Type)
1284af051161SJung-uk Kim         {
1285af051161SJung-uk Kim         case ACPI_PPTT_TYPE_PROCESSOR:
1286af051161SJung-uk Kim 
1287af051161SJung-uk Kim             PpttProcessor = ACPI_SUB_PTR (ACPI_PPTT_PROCESSOR,
1288af051161SJung-uk Kim                 Subtable->Buffer, sizeof (ACPI_SUBTABLE_HEADER));
1289af051161SJung-uk Kim             if (PpttProcessor)
1290af051161SJung-uk Kim             {
1291af051161SJung-uk Kim                 /* Compile initiator proximity domain list */
1292af051161SJung-uk Kim 
1293af051161SJung-uk Kim                 PpttProcessor->NumberOfPrivResources = 0;
1294af051161SJung-uk Kim                 while (*PFieldList)
1295af051161SJung-uk Kim                 {
1296af051161SJung-uk Kim                     Status = DtCompileTable (PFieldList,
1297ff879b07SJung-uk Kim                         AcpiDmTableInfoPptt0a, &Subtable);
1298af051161SJung-uk Kim                     if (ACPI_FAILURE (Status))
1299af051161SJung-uk Kim                     {
1300af051161SJung-uk Kim                         return (Status);
1301af051161SJung-uk Kim                     }
1302af051161SJung-uk Kim                     if (!Subtable)
1303af051161SJung-uk Kim                     {
1304af051161SJung-uk Kim                         break;
1305af051161SJung-uk Kim                     }
1306af051161SJung-uk Kim 
1307af051161SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
1308af051161SJung-uk Kim                     PpttHeader->Length += (UINT8)(Subtable->Length);
1309af051161SJung-uk Kim                     PpttProcessor->NumberOfPrivResources++;
1310af051161SJung-uk Kim                 }
1311af051161SJung-uk Kim             }
1312af051161SJung-uk Kim             break;
1313af051161SJung-uk Kim 
1314cfd1ed46SJung-uk Kim         case ACPI_PPTT_TYPE_CACHE:
1315cfd1ed46SJung-uk Kim 
1316cfd1ed46SJung-uk Kim             PpttAcpiHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
1317cfd1ed46SJung-uk Kim                 AslGbl_RootTable->Buffer);
1318cfd1ed46SJung-uk Kim             if (PpttAcpiHeader->Revision < 3)
1319cfd1ed46SJung-uk Kim             {
1320cfd1ed46SJung-uk Kim                 break;
1321cfd1ed46SJung-uk Kim             }
1322cfd1ed46SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPptt1a,
1323cfd1ed46SJung-uk Kim                 &Subtable);
1324cfd1ed46SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1325cfd1ed46SJung-uk Kim             PpttHeader->Length += (UINT8)(Subtable->Length);
1326cfd1ed46SJung-uk Kim             break;
1327cfd1ed46SJung-uk Kim 
1328af051161SJung-uk Kim         default:
1329af051161SJung-uk Kim 
1330af051161SJung-uk Kim             break;
1331af051161SJung-uk Kim         }
1332af051161SJung-uk Kim     }
1333af051161SJung-uk Kim 
1334af051161SJung-uk Kim     return (AE_OK);
1335af051161SJung-uk Kim }
1336af051161SJung-uk Kim 
1337af051161SJung-uk Kim 
1338af051161SJung-uk Kim /******************************************************************************
1339af051161SJung-uk Kim  *
1340f8146b88SJung-uk Kim  * FUNCTION:    DtCompileRsdt
1341f8146b88SJung-uk Kim  *
1342f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1343f8146b88SJung-uk Kim  *
1344f8146b88SJung-uk Kim  * RETURN:      Status
1345f8146b88SJung-uk Kim  *
1346f8146b88SJung-uk Kim  * DESCRIPTION: Compile RSDT.
1347f8146b88SJung-uk Kim  *
1348f8146b88SJung-uk Kim  *****************************************************************************/
1349f8146b88SJung-uk Kim 
1350f8146b88SJung-uk Kim ACPI_STATUS
1351f8146b88SJung-uk Kim DtCompileRsdt (
1352f8146b88SJung-uk Kim     void                    **List)
1353f8146b88SJung-uk Kim {
1354f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
1355f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1356f8146b88SJung-uk Kim     DT_FIELD                *FieldList = *(DT_FIELD **) List;
1357f8146b88SJung-uk Kim     UINT32                  Address;
1358f8146b88SJung-uk Kim 
1359f8146b88SJung-uk Kim 
1360f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
1361f8146b88SJung-uk Kim 
1362f8146b88SJung-uk Kim     while (FieldList)
1363f8146b88SJung-uk Kim     {
1364f8146b88SJung-uk Kim         DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
1365f8146b88SJung-uk Kim 
1366f8146b88SJung-uk Kim         DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
1367f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1368f8146b88SJung-uk Kim         FieldList = FieldList->Next;
1369f8146b88SJung-uk Kim     }
1370f8146b88SJung-uk Kim 
1371f8146b88SJung-uk Kim     return (AE_OK);
1372f8146b88SJung-uk Kim }
1373f8146b88SJung-uk Kim 
1374f8146b88SJung-uk Kim 
1375f8146b88SJung-uk Kim /******************************************************************************
1376f8146b88SJung-uk Kim  *
1377f8146b88SJung-uk Kim  * FUNCTION:    DtCompileS3pt
1378f8146b88SJung-uk Kim  *
1379f8146b88SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
1380f8146b88SJung-uk Kim  *
1381f8146b88SJung-uk Kim  * RETURN:      Status
1382f8146b88SJung-uk Kim  *
1383f8146b88SJung-uk Kim  * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
1384f8146b88SJung-uk Kim  *
1385f8146b88SJung-uk Kim  *****************************************************************************/
1386f8146b88SJung-uk Kim 
1387f8146b88SJung-uk Kim ACPI_STATUS
1388f8146b88SJung-uk Kim DtCompileS3pt (
1389f8146b88SJung-uk Kim     DT_FIELD                **PFieldList)
1390f8146b88SJung-uk Kim {
1391f8146b88SJung-uk Kim     ACPI_STATUS             Status;
1392f8146b88SJung-uk Kim     ACPI_FPDT_HEADER        *S3ptHeader;
1393f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
1394f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1395f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1396f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
1397f8146b88SJung-uk Kim 
1398f8146b88SJung-uk Kim 
1399f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
14006f1f1a63SJung-uk Kim         &AslGbl_RootTable);
1401f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
1402f8146b88SJung-uk Kim     {
1403f8146b88SJung-uk Kim         return (Status);
1404f8146b88SJung-uk Kim     }
1405f8146b88SJung-uk Kim 
14066f1f1a63SJung-uk Kim     DtPushSubtable (AslGbl_RootTable);
1407f8146b88SJung-uk Kim 
1408f8146b88SJung-uk Kim     while (*PFieldList)
1409f8146b88SJung-uk Kim     {
1410f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
1411f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
1412ff879b07SJung-uk Kim             &Subtable);
1413f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
1414f8146b88SJung-uk Kim         {
1415f8146b88SJung-uk Kim             return (Status);
1416f8146b88SJung-uk Kim         }
1417f8146b88SJung-uk Kim 
1418f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
1419f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1420f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
1421f8146b88SJung-uk Kim 
1422f8146b88SJung-uk Kim         S3ptHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
1423f8146b88SJung-uk Kim 
1424f8146b88SJung-uk Kim         switch (S3ptHeader->Type)
1425f8146b88SJung-uk Kim         {
1426f8146b88SJung-uk Kim         case ACPI_S3PT_TYPE_RESUME:
1427f8146b88SJung-uk Kim 
1428f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoS3pt0;
1429f8146b88SJung-uk Kim             break;
1430f8146b88SJung-uk Kim 
1431f8146b88SJung-uk Kim         case ACPI_S3PT_TYPE_SUSPEND:
1432f8146b88SJung-uk Kim 
1433f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoS3pt1;
1434f8146b88SJung-uk Kim             break;
1435f8146b88SJung-uk Kim 
1436f8146b88SJung-uk Kim         default:
1437f8146b88SJung-uk Kim 
1438f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
1439f8146b88SJung-uk Kim             return (AE_ERROR);
1440f8146b88SJung-uk Kim         }
1441f8146b88SJung-uk Kim 
1442ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
1443f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
1444f8146b88SJung-uk Kim         {
1445f8146b88SJung-uk Kim             return (Status);
1446f8146b88SJung-uk Kim         }
1447f8146b88SJung-uk Kim 
1448f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
1449f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1450f8146b88SJung-uk Kim         DtPopSubtable ();
1451f8146b88SJung-uk Kim     }
1452f8146b88SJung-uk Kim 
1453f8146b88SJung-uk Kim     return (AE_OK);
1454f8146b88SJung-uk Kim }
1455f8146b88SJung-uk Kim 
1456f8146b88SJung-uk Kim 
1457f8146b88SJung-uk Kim /******************************************************************************
1458f8146b88SJung-uk Kim  *
145967d9aa44SJung-uk Kim  * FUNCTION:    DtCompileSdev
146067d9aa44SJung-uk Kim  *
146167d9aa44SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
146267d9aa44SJung-uk Kim  *
146367d9aa44SJung-uk Kim  * RETURN:      Status
146467d9aa44SJung-uk Kim  *
146567d9aa44SJung-uk Kim  * DESCRIPTION: Compile SDEV.
146667d9aa44SJung-uk Kim  *
146767d9aa44SJung-uk Kim  *****************************************************************************/
146867d9aa44SJung-uk Kim 
146967d9aa44SJung-uk Kim ACPI_STATUS
147067d9aa44SJung-uk Kim DtCompileSdev (
147167d9aa44SJung-uk Kim     void                    **List)
147267d9aa44SJung-uk Kim {
147367d9aa44SJung-uk Kim     ACPI_STATUS                 Status;
147467d9aa44SJung-uk Kim     ACPI_SDEV_HEADER            *SdevHeader;
1475cfd1ed46SJung-uk Kim     ACPI_SDEV_HEADER            *SecureComponentHeader;
147667d9aa44SJung-uk Kim     DT_SUBTABLE                 *Subtable;
147767d9aa44SJung-uk Kim     DT_SUBTABLE                 *ParentTable;
147867d9aa44SJung-uk Kim     ACPI_DMTABLE_INFO           *InfoTable;
1479cfd1ed46SJung-uk Kim     ACPI_DMTABLE_INFO           *SecureComponentInfoTable = NULL;
148067d9aa44SJung-uk Kim     DT_FIELD                    **PFieldList = (DT_FIELD **) List;
148167d9aa44SJung-uk Kim     DT_FIELD                    *SubtableStart;
148267d9aa44SJung-uk Kim     ACPI_SDEV_PCIE              *Pcie = NULL;
148367d9aa44SJung-uk Kim     ACPI_SDEV_NAMESPACE         *Namesp = NULL;
148467d9aa44SJung-uk Kim     UINT32                      EntryCount;
1485cfd1ed46SJung-uk Kim     ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
1486cfd1ed46SJung-uk Kim     UINT16                      ComponentLength = 0;
148767d9aa44SJung-uk Kim 
148867d9aa44SJung-uk Kim 
148967d9aa44SJung-uk Kim     /* Subtables */
149067d9aa44SJung-uk Kim 
149167d9aa44SJung-uk Kim     while (*PFieldList)
149267d9aa44SJung-uk Kim     {
149367d9aa44SJung-uk Kim         /* Compile common SDEV subtable header */
149467d9aa44SJung-uk Kim 
149567d9aa44SJung-uk Kim         SubtableStart = *PFieldList;
149667d9aa44SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevHdr,
1497ff879b07SJung-uk Kim             &Subtable);
149867d9aa44SJung-uk Kim         if (ACPI_FAILURE (Status))
149967d9aa44SJung-uk Kim         {
150067d9aa44SJung-uk Kim             return (Status);
150167d9aa44SJung-uk Kim         }
150267d9aa44SJung-uk Kim 
150367d9aa44SJung-uk Kim         ParentTable = DtPeekSubtable ();
150467d9aa44SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
150567d9aa44SJung-uk Kim         DtPushSubtable (Subtable);
150667d9aa44SJung-uk Kim 
150767d9aa44SJung-uk Kim         SdevHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
150867d9aa44SJung-uk Kim         SdevHeader->Length = (UINT8)(sizeof (ACPI_SDEV_HEADER));
150967d9aa44SJung-uk Kim 
151067d9aa44SJung-uk Kim         switch (SdevHeader->Type)
151167d9aa44SJung-uk Kim         {
151267d9aa44SJung-uk Kim         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
151367d9aa44SJung-uk Kim 
151467d9aa44SJung-uk Kim             InfoTable = AcpiDmTableInfoSdev0;
151567d9aa44SJung-uk Kim             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer);
1516cfd1ed46SJung-uk Kim             SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
1517cfd1ed46SJung-uk Kim                 ACPI_ADD_PTR (UINT8, Subtable->Buffer, sizeof(ACPI_SDEV_NAMESPACE)));
151867d9aa44SJung-uk Kim             break;
151967d9aa44SJung-uk Kim 
152067d9aa44SJung-uk Kim         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
152167d9aa44SJung-uk Kim 
152267d9aa44SJung-uk Kim             InfoTable = AcpiDmTableInfoSdev1;
152367d9aa44SJung-uk Kim             Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable->Buffer);
152467d9aa44SJung-uk Kim             break;
152567d9aa44SJung-uk Kim 
152667d9aa44SJung-uk Kim         default:
152767d9aa44SJung-uk Kim 
152867d9aa44SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
152967d9aa44SJung-uk Kim             return (AE_ERROR);
153067d9aa44SJung-uk Kim         }
153167d9aa44SJung-uk Kim 
153267d9aa44SJung-uk Kim         /* Compile SDEV subtable body */
153367d9aa44SJung-uk Kim 
1534ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
153567d9aa44SJung-uk Kim         if (ACPI_FAILURE (Status))
153667d9aa44SJung-uk Kim         {
153767d9aa44SJung-uk Kim             return (Status);
153867d9aa44SJung-uk Kim         }
153967d9aa44SJung-uk Kim 
154067d9aa44SJung-uk Kim         ParentTable = DtPeekSubtable ();
154167d9aa44SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
154267d9aa44SJung-uk Kim 
154367d9aa44SJung-uk Kim         /* Optional data fields are appended to the main subtable body */
154467d9aa44SJung-uk Kim 
154567d9aa44SJung-uk Kim         switch (SdevHeader->Type)
154667d9aa44SJung-uk Kim         {
154767d9aa44SJung-uk Kim         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
154867d9aa44SJung-uk Kim 
1549cfd1ed46SJung-uk Kim             /*
1550cfd1ed46SJung-uk Kim              * Device Id Offset will be be calculated differently depending on
1551cfd1ed46SJung-uk Kim              * the presence of secure access components.
1552cfd1ed46SJung-uk Kim              */
1553cfd1ed46SJung-uk Kim             Namesp->DeviceIdOffset = 0;
1554cfd1ed46SJung-uk Kim             ComponentLength = 0;
1555cfd1ed46SJung-uk Kim 
1556cfd1ed46SJung-uk Kim             /* If the secure access component exists, get the structures */
1557cfd1ed46SJung-uk Kim 
1558cfd1ed46SJung-uk Kim             if (SdevHeader->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
1559cfd1ed46SJung-uk Kim             {
1560cfd1ed46SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0b,
1561cfd1ed46SJung-uk Kim                     &Subtable);
1562cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
1563cfd1ed46SJung-uk Kim                 {
1564cfd1ed46SJung-uk Kim                     return (Status);
1565cfd1ed46SJung-uk Kim                 }
1566cfd1ed46SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1567cfd1ed46SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1568cfd1ed46SJung-uk Kim 
1569cfd1ed46SJung-uk Kim                 Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
1570cfd1ed46SJung-uk Kim 
1571cfd1ed46SJung-uk Kim                 /* Compile a secure access component header */
1572cfd1ed46SJung-uk Kim 
1573cfd1ed46SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevSecCompHdr,
1574cfd1ed46SJung-uk Kim                     &Subtable);
1575cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
1576cfd1ed46SJung-uk Kim                 {
1577cfd1ed46SJung-uk Kim                     return (Status);
1578cfd1ed46SJung-uk Kim                 }
1579cfd1ed46SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1580cfd1ed46SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1581cfd1ed46SJung-uk Kim 
1582cfd1ed46SJung-uk Kim                 /* Compile the secure access component */
1583cfd1ed46SJung-uk Kim 
1584cfd1ed46SJung-uk Kim                 SecureComponentHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
1585cfd1ed46SJung-uk Kim                 switch (SecureComponentHeader->Type)
1586cfd1ed46SJung-uk Kim                 {
1587cfd1ed46SJung-uk Kim                 case ACPI_SDEV_TYPE_ID_COMPONENT:
1588cfd1ed46SJung-uk Kim 
1589cfd1ed46SJung-uk Kim                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
1590cfd1ed46SJung-uk Kim                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_ID_COMPONENT);
1591cfd1ed46SJung-uk Kim                     ComponentLength = sizeof (ACPI_SDEV_ID_COMPONENT);
1592cfd1ed46SJung-uk Kim                     break;
1593cfd1ed46SJung-uk Kim 
1594cfd1ed46SJung-uk Kim                 case ACPI_SDEV_TYPE_MEM_COMPONENT:
1595cfd1ed46SJung-uk Kim 
1596cfd1ed46SJung-uk Kim                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
1597cfd1ed46SJung-uk Kim                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_MEM_COMPONENT);
1598cfd1ed46SJung-uk Kim                     ComponentLength = sizeof (ACPI_SDEV_MEM_COMPONENT);
1599cfd1ed46SJung-uk Kim                     break;
1600cfd1ed46SJung-uk Kim 
1601cfd1ed46SJung-uk Kim                 default:
1602cfd1ed46SJung-uk Kim 
1603cfd1ed46SJung-uk Kim                     /* Any other secure component types are undefined */
1604cfd1ed46SJung-uk Kim 
1605cfd1ed46SJung-uk Kim                     return (AE_ERROR);
1606cfd1ed46SJung-uk Kim                 }
1607cfd1ed46SJung-uk Kim 
1608cfd1ed46SJung-uk Kim                 Status = DtCompileTable (PFieldList, SecureComponentInfoTable,
1609cfd1ed46SJung-uk Kim                     &Subtable);
1610cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
1611cfd1ed46SJung-uk Kim                 {
1612cfd1ed46SJung-uk Kim                     return (Status);
1613cfd1ed46SJung-uk Kim                 }
1614cfd1ed46SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1615cfd1ed46SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1616cfd1ed46SJung-uk Kim 
1617cfd1ed46SJung-uk Kim                 SecureComponent->SecureComponentOffset =
1618cfd1ed46SJung-uk Kim                     sizeof (ACPI_SDEV_NAMESPACE) + sizeof (ACPI_SDEV_SECURE_COMPONENT);
1619cfd1ed46SJung-uk Kim                 SecureComponent->SecureComponentLength = ComponentLength;
1620cfd1ed46SJung-uk Kim 
1621cfd1ed46SJung-uk Kim 
1622cfd1ed46SJung-uk Kim                 /*
1623cfd1ed46SJung-uk Kim                  * Add the secure component to the subtable to be added for the
1624cfd1ed46SJung-uk Kim                  * the namespace subtable's length
1625cfd1ed46SJung-uk Kim                  */
1626cfd1ed46SJung-uk Kim                 ComponentLength += sizeof (ACPI_SDEV_SECURE_COMPONENT);
1627cfd1ed46SJung-uk Kim             }
1628cfd1ed46SJung-uk Kim 
162967d9aa44SJung-uk Kim             /* Append DeviceId namespace string */
163067d9aa44SJung-uk Kim 
163167d9aa44SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a,
1632ff879b07SJung-uk Kim                 &Subtable);
163367d9aa44SJung-uk Kim             if (ACPI_FAILURE (Status))
163467d9aa44SJung-uk Kim             {
163567d9aa44SJung-uk Kim                 return (Status);
163667d9aa44SJung-uk Kim             }
163767d9aa44SJung-uk Kim 
163867d9aa44SJung-uk Kim             if (!Subtable)
163967d9aa44SJung-uk Kim             {
164067d9aa44SJung-uk Kim                 break;
164167d9aa44SJung-uk Kim             }
164267d9aa44SJung-uk Kim 
164367d9aa44SJung-uk Kim             ParentTable = DtPeekSubtable ();
164467d9aa44SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
164567d9aa44SJung-uk Kim 
1646cfd1ed46SJung-uk Kim             Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_NAMESPACE);
1647cfd1ed46SJung-uk Kim 
164867d9aa44SJung-uk Kim             Namesp->DeviceIdLength = (UINT16) Subtable->Length;
164967d9aa44SJung-uk Kim 
165067d9aa44SJung-uk Kim             /* Append Vendor data */
165167d9aa44SJung-uk Kim 
165267d9aa44SJung-uk Kim             Namesp->VendorDataLength = 0;
165367d9aa44SJung-uk Kim             Namesp->VendorDataOffset = 0;
165467d9aa44SJung-uk Kim 
165567d9aa44SJung-uk Kim             if (*PFieldList)
165667d9aa44SJung-uk Kim             {
165767d9aa44SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
1658ff879b07SJung-uk Kim                     &Subtable);
165967d9aa44SJung-uk Kim                 if (ACPI_FAILURE (Status))
166067d9aa44SJung-uk Kim                 {
166167d9aa44SJung-uk Kim                     return (Status);
166267d9aa44SJung-uk Kim                 }
166367d9aa44SJung-uk Kim 
166467d9aa44SJung-uk Kim                 if (Subtable)
166567d9aa44SJung-uk Kim                 {
166667d9aa44SJung-uk Kim                     ParentTable = DtPeekSubtable ();
166767d9aa44SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
166867d9aa44SJung-uk Kim 
166967d9aa44SJung-uk Kim                     Namesp->VendorDataOffset =
167067d9aa44SJung-uk Kim                         Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
167167d9aa44SJung-uk Kim                     Namesp->VendorDataLength =
167267d9aa44SJung-uk Kim                         (UINT16) Subtable->Length;
167367d9aa44SJung-uk Kim 
167467d9aa44SJung-uk Kim                     /* Final size of entire namespace structure */
167567d9aa44SJung-uk Kim 
167667d9aa44SJung-uk Kim                     SdevHeader->Length = (UINT16)(sizeof(ACPI_SDEV_NAMESPACE) +
1677cfd1ed46SJung-uk Kim                         Subtable->Length + Namesp->DeviceIdLength) + ComponentLength;
1678a009b7dcSJung-uk Kim                 }
1679a009b7dcSJung-uk Kim             }
1680a009b7dcSJung-uk Kim 
168167d9aa44SJung-uk Kim             break;
168267d9aa44SJung-uk Kim 
168367d9aa44SJung-uk Kim         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
168467d9aa44SJung-uk Kim 
168567d9aa44SJung-uk Kim             /* Append the PCIe path info first */
168667d9aa44SJung-uk Kim 
168767d9aa44SJung-uk Kim             EntryCount = 0;
168867d9aa44SJung-uk Kim             while (*PFieldList && !strcmp ((*PFieldList)->Name, "Device"))
168967d9aa44SJung-uk Kim             {
169067d9aa44SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1a,
1691ff879b07SJung-uk Kim                     &Subtable);
169267d9aa44SJung-uk Kim                 if (ACPI_FAILURE (Status))
169367d9aa44SJung-uk Kim                 {
169467d9aa44SJung-uk Kim                     return (Status);
169567d9aa44SJung-uk Kim                 }
169667d9aa44SJung-uk Kim 
169767d9aa44SJung-uk Kim                 if (!Subtable)
169867d9aa44SJung-uk Kim                 {
169967d9aa44SJung-uk Kim                     DtPopSubtable ();
170067d9aa44SJung-uk Kim                     break;
170167d9aa44SJung-uk Kim                 }
170267d9aa44SJung-uk Kim 
170367d9aa44SJung-uk Kim                 ParentTable = DtPeekSubtable ();
170467d9aa44SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
170567d9aa44SJung-uk Kim                 EntryCount++;
170667d9aa44SJung-uk Kim             }
170767d9aa44SJung-uk Kim 
170867d9aa44SJung-uk Kim             /* Path offset will point immediately after the main subtable */
170967d9aa44SJung-uk Kim 
171067d9aa44SJung-uk Kim             Pcie->PathOffset = sizeof (ACPI_SDEV_PCIE);
171167d9aa44SJung-uk Kim             Pcie->PathLength = (UINT16)
171267d9aa44SJung-uk Kim                 (EntryCount * sizeof (ACPI_SDEV_PCIE_PATH));
171367d9aa44SJung-uk Kim 
171467d9aa44SJung-uk Kim             /* Append the Vendor Data last */
171567d9aa44SJung-uk Kim 
171667d9aa44SJung-uk Kim             Pcie->VendorDataLength = 0;
171767d9aa44SJung-uk Kim             Pcie->VendorDataOffset = 0;
171867d9aa44SJung-uk Kim 
171967d9aa44SJung-uk Kim             if (*PFieldList)
172067d9aa44SJung-uk Kim             {
172167d9aa44SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
1722ff879b07SJung-uk Kim                     &Subtable);
172367d9aa44SJung-uk Kim                 if (ACPI_FAILURE (Status))
172467d9aa44SJung-uk Kim                 {
172567d9aa44SJung-uk Kim                     return (Status);
172667d9aa44SJung-uk Kim                 }
172767d9aa44SJung-uk Kim 
172867d9aa44SJung-uk Kim                 if (Subtable)
172967d9aa44SJung-uk Kim                 {
173067d9aa44SJung-uk Kim                     ParentTable = DtPeekSubtable ();
173167d9aa44SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
173267d9aa44SJung-uk Kim 
173367d9aa44SJung-uk Kim                     Pcie->VendorDataOffset =
173467d9aa44SJung-uk Kim                         Pcie->PathOffset + Pcie->PathLength;
173567d9aa44SJung-uk Kim                     Pcie->VendorDataLength = (UINT16)
173667d9aa44SJung-uk Kim                         Subtable->Length;
173767d9aa44SJung-uk Kim                 }
173867d9aa44SJung-uk Kim             }
173967d9aa44SJung-uk Kim 
174067d9aa44SJung-uk Kim             SdevHeader->Length =
174167d9aa44SJung-uk Kim                 sizeof (ACPI_SDEV_PCIE) +
174267d9aa44SJung-uk Kim                 Pcie->PathLength + Pcie->VendorDataLength;
174367d9aa44SJung-uk Kim             break;
174467d9aa44SJung-uk Kim 
174567d9aa44SJung-uk Kim         default:
174667d9aa44SJung-uk Kim 
174767d9aa44SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
174867d9aa44SJung-uk Kim             return (AE_ERROR);
174967d9aa44SJung-uk Kim         }
175067d9aa44SJung-uk Kim 
175167d9aa44SJung-uk Kim         DtPopSubtable ();
175267d9aa44SJung-uk Kim     }
175367d9aa44SJung-uk Kim 
175467d9aa44SJung-uk Kim     return (AE_OK);
175567d9aa44SJung-uk Kim }
175667d9aa44SJung-uk Kim 
175767d9aa44SJung-uk Kim 
175867d9aa44SJung-uk Kim /******************************************************************************
175967d9aa44SJung-uk Kim  *
1760f8146b88SJung-uk Kim  * FUNCTION:    DtCompileSlic
1761f8146b88SJung-uk Kim  *
1762f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1763f8146b88SJung-uk Kim  *
1764f8146b88SJung-uk Kim  * RETURN:      Status
1765f8146b88SJung-uk Kim  *
1766f8146b88SJung-uk Kim  * DESCRIPTION: Compile SLIC.
1767f8146b88SJung-uk Kim  *
1768f8146b88SJung-uk Kim  *****************************************************************************/
1769f8146b88SJung-uk Kim 
1770f8146b88SJung-uk Kim ACPI_STATUS
1771f8146b88SJung-uk Kim DtCompileSlic (
1772f8146b88SJung-uk Kim     void                    **List)
1773f8146b88SJung-uk Kim {
1774f8146b88SJung-uk Kim     ACPI_STATUS             Status;
1775f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
1776f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1777f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1778f8146b88SJung-uk Kim 
1779f8146b88SJung-uk Kim 
1780f8146b88SJung-uk Kim     while (*PFieldList)
1781f8146b88SJung-uk Kim     {
1782f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
1783ff879b07SJung-uk Kim             &Subtable);
1784f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
1785f8146b88SJung-uk Kim         {
1786f8146b88SJung-uk Kim             return (Status);
1787f8146b88SJung-uk Kim         }
1788f8146b88SJung-uk Kim 
1789f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
1790f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1791f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
1792f8146b88SJung-uk Kim         DtPopSubtable ();
1793f8146b88SJung-uk Kim     }
1794f8146b88SJung-uk Kim 
1795f8146b88SJung-uk Kim     return (AE_OK);
1796f8146b88SJung-uk Kim }
1797f8146b88SJung-uk Kim 
1798f8146b88SJung-uk Kim 
1799f8146b88SJung-uk Kim /******************************************************************************
1800f8146b88SJung-uk Kim  *
1801f8146b88SJung-uk Kim  * FUNCTION:    DtCompileSlit
1802f8146b88SJung-uk Kim  *
1803f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1804f8146b88SJung-uk Kim  *
1805f8146b88SJung-uk Kim  * RETURN:      Status
1806f8146b88SJung-uk Kim  *
1807f8146b88SJung-uk Kim  * DESCRIPTION: Compile SLIT.
1808f8146b88SJung-uk Kim  *
1809f8146b88SJung-uk Kim  *****************************************************************************/
1810f8146b88SJung-uk Kim 
1811f8146b88SJung-uk Kim ACPI_STATUS
1812f8146b88SJung-uk Kim DtCompileSlit (
1813f8146b88SJung-uk Kim     void                    **List)
1814f8146b88SJung-uk Kim {
1815f8146b88SJung-uk Kim     ACPI_STATUS             Status;
1816f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
1817f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1818f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1819f8146b88SJung-uk Kim     DT_FIELD                *FieldList;
1820a009b7dcSJung-uk Kim     DT_FIELD                *EndOfFieldList = NULL;
1821f8146b88SJung-uk Kim     UINT32                  Localities;
1822a009b7dcSJung-uk Kim     UINT32                  LocalityListLength;
1823f8146b88SJung-uk Kim     UINT8                   *LocalityBuffer;
1824f8146b88SJung-uk Kim 
1825f8146b88SJung-uk Kim 
1826f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
1827ff879b07SJung-uk Kim         &Subtable);
1828f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
1829f8146b88SJung-uk Kim     {
1830f8146b88SJung-uk Kim         return (Status);
1831f8146b88SJung-uk Kim     }
1832f8146b88SJung-uk Kim 
1833f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
1834f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1835f8146b88SJung-uk Kim 
1836f8146b88SJung-uk Kim     Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
1837f8146b88SJung-uk Kim     LocalityBuffer = UtLocalCalloc (Localities);
1838a009b7dcSJung-uk Kim     LocalityListLength = 0;
1839f8146b88SJung-uk Kim 
1840f8146b88SJung-uk Kim     /* Compile each locality buffer */
1841f8146b88SJung-uk Kim 
1842f8146b88SJung-uk Kim     FieldList = *PFieldList;
1843f8146b88SJung-uk Kim     while (FieldList)
1844f8146b88SJung-uk Kim     {
1845f8146b88SJung-uk Kim         DtCompileBuffer (LocalityBuffer,
1846f8146b88SJung-uk Kim             FieldList->Value, FieldList, Localities);
1847f8146b88SJung-uk Kim 
1848a009b7dcSJung-uk Kim         LocalityListLength++;
1849f8146b88SJung-uk Kim         DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
1850f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1851a009b7dcSJung-uk Kim         EndOfFieldList = FieldList;
1852f8146b88SJung-uk Kim         FieldList = FieldList->Next;
1853f8146b88SJung-uk Kim     }
1854f8146b88SJung-uk Kim 
1855a009b7dcSJung-uk Kim     if (LocalityListLength != Localities)
1856a009b7dcSJung-uk Kim     {
1857a009b7dcSJung-uk Kim         sprintf(AslGbl_MsgBuffer,
1858a009b7dcSJung-uk Kim             "Found %u entries, must match LocalityCount: %u",
1859a009b7dcSJung-uk Kim             LocalityListLength, Localities);
1860a009b7dcSJung-uk Kim         DtError (ASL_ERROR, ASL_MSG_ENTRY_LIST, EndOfFieldList, AslGbl_MsgBuffer);
1861f9a6772eSJung-uk Kim         ACPI_FREE (LocalityBuffer);
1862a009b7dcSJung-uk Kim         return (AE_LIMIT);
1863a009b7dcSJung-uk Kim     }
1864a009b7dcSJung-uk Kim 
1865f8146b88SJung-uk Kim     ACPI_FREE (LocalityBuffer);
1866f8146b88SJung-uk Kim     return (AE_OK);
1867f8146b88SJung-uk Kim }
1868f8146b88SJung-uk Kim 
1869f8146b88SJung-uk Kim 
1870f8146b88SJung-uk Kim /******************************************************************************
1871f8146b88SJung-uk Kim  *
1872f8146b88SJung-uk Kim  * FUNCTION:    DtCompileSrat
1873f8146b88SJung-uk Kim  *
1874f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1875f8146b88SJung-uk Kim  *
1876f8146b88SJung-uk Kim  * RETURN:      Status
1877f8146b88SJung-uk Kim  *
1878f8146b88SJung-uk Kim  * DESCRIPTION: Compile SRAT.
1879f8146b88SJung-uk Kim  *
1880f8146b88SJung-uk Kim  *****************************************************************************/
1881f8146b88SJung-uk Kim 
1882f8146b88SJung-uk Kim ACPI_STATUS
1883f8146b88SJung-uk Kim DtCompileSrat (
1884f8146b88SJung-uk Kim     void                    **List)
1885f8146b88SJung-uk Kim {
1886f8146b88SJung-uk Kim     ACPI_STATUS             Status;
1887f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
1888f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1889f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1890f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
1891f8146b88SJung-uk Kim     ACPI_SUBTABLE_HEADER    *SratHeader;
1892f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1893f8146b88SJung-uk Kim 
1894f8146b88SJung-uk Kim 
1895f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
1896ff879b07SJung-uk Kim         &Subtable);
1897f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
1898f8146b88SJung-uk Kim     {
1899f8146b88SJung-uk Kim         return (Status);
1900f8146b88SJung-uk Kim     }
1901f8146b88SJung-uk Kim 
1902f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
1903f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1904f8146b88SJung-uk Kim 
1905f8146b88SJung-uk Kim     while (*PFieldList)
1906f8146b88SJung-uk Kim     {
1907f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
1908f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
1909ff879b07SJung-uk Kim             &Subtable);
1910f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
1911f8146b88SJung-uk Kim         {
1912f8146b88SJung-uk Kim             return (Status);
1913f8146b88SJung-uk Kim         }
1914f8146b88SJung-uk Kim 
1915f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
1916f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1917f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
1918f8146b88SJung-uk Kim 
1919f8146b88SJung-uk Kim         SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1920f8146b88SJung-uk Kim 
1921f8146b88SJung-uk Kim         switch (SratHeader->Type)
1922f8146b88SJung-uk Kim         {
1923f8146b88SJung-uk Kim         case ACPI_SRAT_TYPE_CPU_AFFINITY:
1924f8146b88SJung-uk Kim 
1925f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat0;
1926f8146b88SJung-uk Kim             break;
1927f8146b88SJung-uk Kim 
1928f8146b88SJung-uk Kim         case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
1929f8146b88SJung-uk Kim 
1930f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat1;
1931f8146b88SJung-uk Kim             break;
1932f8146b88SJung-uk Kim 
1933f8146b88SJung-uk Kim         case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
1934f8146b88SJung-uk Kim 
1935f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat2;
1936f8146b88SJung-uk Kim             break;
1937f8146b88SJung-uk Kim 
1938f8146b88SJung-uk Kim         case ACPI_SRAT_TYPE_GICC_AFFINITY:
1939f8146b88SJung-uk Kim 
1940f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat3;
1941f8146b88SJung-uk Kim             break;
1942f8146b88SJung-uk Kim 
1943af051161SJung-uk Kim         case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
1944af051161SJung-uk Kim 
1945af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat4;
1946af051161SJung-uk Kim             break;
1947af051161SJung-uk Kim 
1948cd6518c7SJung-uk Kim         case ACPI_SRAT_TYPE_GENERIC_AFFINITY:
1949cd6518c7SJung-uk Kim 
1950cd6518c7SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat5;
1951cd6518c7SJung-uk Kim             break;
1952cd6518c7SJung-uk Kim 
1953f8146b88SJung-uk Kim         default:
1954f8146b88SJung-uk Kim 
1955f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
1956f8146b88SJung-uk Kim             return (AE_ERROR);
1957f8146b88SJung-uk Kim         }
1958f8146b88SJung-uk Kim 
1959ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
1960f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
1961f8146b88SJung-uk Kim         {
1962f8146b88SJung-uk Kim             return (Status);
1963f8146b88SJung-uk Kim         }
1964f8146b88SJung-uk Kim 
1965f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
1966f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1967f8146b88SJung-uk Kim         DtPopSubtable ();
1968f8146b88SJung-uk Kim     }
1969f8146b88SJung-uk Kim 
1970f8146b88SJung-uk Kim     return (AE_OK);
1971f8146b88SJung-uk Kim }
1972f8146b88SJung-uk Kim 
1973f8146b88SJung-uk Kim 
1974f8146b88SJung-uk Kim /******************************************************************************
1975f8146b88SJung-uk Kim  *
1976f8146b88SJung-uk Kim  * FUNCTION:    DtCompileStao
1977f8146b88SJung-uk Kim  *
1978f8146b88SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
1979f8146b88SJung-uk Kim  *
1980f8146b88SJung-uk Kim  * RETURN:      Status
1981f8146b88SJung-uk Kim  *
1982f8146b88SJung-uk Kim  * DESCRIPTION: Compile STAO.
1983f8146b88SJung-uk Kim  *
1984f8146b88SJung-uk Kim  *****************************************************************************/
1985f8146b88SJung-uk Kim 
1986f8146b88SJung-uk Kim ACPI_STATUS
1987f8146b88SJung-uk Kim DtCompileStao (
1988f8146b88SJung-uk Kim     void                    **List)
1989f8146b88SJung-uk Kim {
1990f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1991f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
1992f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1993f8146b88SJung-uk Kim     ACPI_STATUS             Status;
1994f8146b88SJung-uk Kim 
1995f8146b88SJung-uk Kim 
1996f8146b88SJung-uk Kim     /* Compile the main table */
1997f8146b88SJung-uk Kim 
1998f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao,
1999ff879b07SJung-uk Kim         &Subtable);
2000f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2001f8146b88SJung-uk Kim     {
2002f8146b88SJung-uk Kim         return (Status);
2003f8146b88SJung-uk Kim     }
2004f8146b88SJung-uk Kim 
2005f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2006f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2007f8146b88SJung-uk Kim 
2008f8146b88SJung-uk Kim     /* Compile each ASCII namestring as a subtable */
2009f8146b88SJung-uk Kim 
2010f8146b88SJung-uk Kim     while (*PFieldList)
2011f8146b88SJung-uk Kim     {
2012f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr,
2013ff879b07SJung-uk Kim             &Subtable);
2014f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2015f8146b88SJung-uk Kim         {
2016f8146b88SJung-uk Kim             return (Status);
2017f8146b88SJung-uk Kim         }
2018f8146b88SJung-uk Kim 
2019f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2020f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2021f8146b88SJung-uk Kim     }
2022f8146b88SJung-uk Kim 
2023f8146b88SJung-uk Kim     return (AE_OK);
2024f8146b88SJung-uk Kim }
2025f8146b88SJung-uk Kim 
2026f8146b88SJung-uk Kim 
2027f8146b88SJung-uk Kim /******************************************************************************
2028f8146b88SJung-uk Kim  *
2029f8146b88SJung-uk Kim  * FUNCTION:    DtCompileTcpa
2030f8146b88SJung-uk Kim  *
2031f8146b88SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
2032f8146b88SJung-uk Kim  *
2033f8146b88SJung-uk Kim  * RETURN:      Status
2034f8146b88SJung-uk Kim  *
2035f8146b88SJung-uk Kim  * DESCRIPTION: Compile TCPA.
2036f8146b88SJung-uk Kim  *
2037f8146b88SJung-uk Kim  *****************************************************************************/
2038f8146b88SJung-uk Kim 
2039f8146b88SJung-uk Kim ACPI_STATUS
2040f8146b88SJung-uk Kim DtCompileTcpa (
2041f8146b88SJung-uk Kim     void                    **List)
2042f8146b88SJung-uk Kim {
2043f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2044f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2045f8146b88SJung-uk Kim     ACPI_TABLE_TCPA_HDR     *TcpaHeader;
2046f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2047f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2048f8146b88SJung-uk Kim 
2049f8146b88SJung-uk Kim 
2050f8146b88SJung-uk Kim     /* Compile the main table */
2051f8146b88SJung-uk Kim 
2052f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaHdr,
2053ff879b07SJung-uk Kim         &Subtable);
2054f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2055f8146b88SJung-uk Kim     {
2056f8146b88SJung-uk Kim         return (Status);
2057f8146b88SJung-uk Kim     }
2058f8146b88SJung-uk Kim 
2059f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2060f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2061f8146b88SJung-uk Kim 
2062f8146b88SJung-uk Kim     /*
2063f8146b88SJung-uk Kim      * Examine the PlatformClass field to determine the table type.
2064f8146b88SJung-uk Kim      * Either a client or server table. Only one.
2065f8146b88SJung-uk Kim      */
2066f8146b88SJung-uk Kim     TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer);
2067f8146b88SJung-uk Kim 
2068f8146b88SJung-uk Kim     switch (TcpaHeader->PlatformClass)
2069f8146b88SJung-uk Kim     {
2070f8146b88SJung-uk Kim     case ACPI_TCPA_CLIENT_TABLE:
2071f8146b88SJung-uk Kim 
2072f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaClient,
2073ff879b07SJung-uk Kim             &Subtable);
2074f8146b88SJung-uk Kim         break;
2075f8146b88SJung-uk Kim 
2076f8146b88SJung-uk Kim     case ACPI_TCPA_SERVER_TABLE:
2077f8146b88SJung-uk Kim 
2078f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaServer,
2079ff879b07SJung-uk Kim             &Subtable);
2080f8146b88SJung-uk Kim         break;
2081f8146b88SJung-uk Kim 
2082f8146b88SJung-uk Kim     default:
2083f8146b88SJung-uk Kim 
2084f8146b88SJung-uk Kim         AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
2085f8146b88SJung-uk Kim             TcpaHeader->PlatformClass);
2086f8146b88SJung-uk Kim         Status = AE_ERROR;
2087f8146b88SJung-uk Kim         break;
2088f8146b88SJung-uk Kim     }
2089f8146b88SJung-uk Kim 
2090f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2091f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2092f8146b88SJung-uk Kim     return (Status);
2093f8146b88SJung-uk Kim }
2094f8146b88SJung-uk Kim 
2095f8146b88SJung-uk Kim 
2096f8146b88SJung-uk Kim /******************************************************************************
2097f8146b88SJung-uk Kim  *
20984a38ee6dSJung-uk Kim  * FUNCTION:    DtCompileTpm2Rev3
20994a38ee6dSJung-uk Kim  *
21004a38ee6dSJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
21014a38ee6dSJung-uk Kim  *
21024a38ee6dSJung-uk Kim  * RETURN:      Status
21034a38ee6dSJung-uk Kim  *
21044a38ee6dSJung-uk Kim  * DESCRIPTION: Compile TPM2 revision 3
21054a38ee6dSJung-uk Kim  *
21064a38ee6dSJung-uk Kim  *****************************************************************************/
21074a38ee6dSJung-uk Kim static ACPI_STATUS
21084a38ee6dSJung-uk Kim DtCompileTpm2Rev3 (
21094a38ee6dSJung-uk Kim     void                    **List)
21104a38ee6dSJung-uk Kim {
21114a38ee6dSJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
21124a38ee6dSJung-uk Kim     DT_SUBTABLE             *Subtable;
21134a38ee6dSJung-uk Kim     ACPI_TABLE_TPM23        *Tpm23Header;
21144a38ee6dSJung-uk Kim     DT_SUBTABLE             *ParentTable;
21154a38ee6dSJung-uk Kim     ACPI_STATUS             Status = AE_OK;
21164a38ee6dSJung-uk Kim 
21174a38ee6dSJung-uk Kim 
21184a38ee6dSJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23,
21194a38ee6dSJung-uk Kim         &Subtable);
21204a38ee6dSJung-uk Kim 
21214a38ee6dSJung-uk Kim     ParentTable = DtPeekSubtable ();
21224a38ee6dSJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
21234a38ee6dSJung-uk Kim     Tpm23Header = ACPI_CAST_PTR (ACPI_TABLE_TPM23, ParentTable->Buffer);
21244a38ee6dSJung-uk Kim 
21254a38ee6dSJung-uk Kim     /* Subtable type depends on the StartMethod */
21264a38ee6dSJung-uk Kim 
21274a38ee6dSJung-uk Kim     switch (Tpm23Header->StartMethod)
21284a38ee6dSJung-uk Kim     {
21294a38ee6dSJung-uk Kim     case ACPI_TPM23_ACPI_START_METHOD:
21304a38ee6dSJung-uk Kim 
21314a38ee6dSJung-uk Kim         /* Subtable specific to to ARM_SMC */
21324a38ee6dSJung-uk Kim 
21334a38ee6dSJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23a,
21344a38ee6dSJung-uk Kim             &Subtable);
21354a38ee6dSJung-uk Kim         if (ACPI_FAILURE (Status))
21364a38ee6dSJung-uk Kim         {
21374a38ee6dSJung-uk Kim             return (Status);
21384a38ee6dSJung-uk Kim         }
21394a38ee6dSJung-uk Kim 
21404a38ee6dSJung-uk Kim         ParentTable = DtPeekSubtable ();
21414a38ee6dSJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
21424a38ee6dSJung-uk Kim         break;
21434a38ee6dSJung-uk Kim 
21444a38ee6dSJung-uk Kim     default:
21454a38ee6dSJung-uk Kim         break;
21464a38ee6dSJung-uk Kim     }
21474a38ee6dSJung-uk Kim 
21484a38ee6dSJung-uk Kim     return (Status);
21494a38ee6dSJung-uk Kim }
21504a38ee6dSJung-uk Kim 
21514a38ee6dSJung-uk Kim 
21524a38ee6dSJung-uk Kim /******************************************************************************
21534a38ee6dSJung-uk Kim  *
215467d9aa44SJung-uk Kim  * FUNCTION:    DtCompileTpm2
215567d9aa44SJung-uk Kim  *
215667d9aa44SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
215767d9aa44SJung-uk Kim  *
215867d9aa44SJung-uk Kim  * RETURN:      Status
215967d9aa44SJung-uk Kim  *
216067d9aa44SJung-uk Kim  * DESCRIPTION: Compile TPM2.
216167d9aa44SJung-uk Kim  *
216267d9aa44SJung-uk Kim  *****************************************************************************/
216367d9aa44SJung-uk Kim 
216467d9aa44SJung-uk Kim ACPI_STATUS
216567d9aa44SJung-uk Kim DtCompileTpm2 (
216667d9aa44SJung-uk Kim     void                    **List)
216767d9aa44SJung-uk Kim {
216867d9aa44SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
216967d9aa44SJung-uk Kim     DT_SUBTABLE             *Subtable;
217067d9aa44SJung-uk Kim     ACPI_TABLE_TPM2         *Tpm2Header;
217167d9aa44SJung-uk Kim     DT_SUBTABLE             *ParentTable;
217267d9aa44SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
21734a38ee6dSJung-uk Kim     ACPI_TABLE_HEADER       *Header;
217467d9aa44SJung-uk Kim 
217567d9aa44SJung-uk Kim 
21764a38ee6dSJung-uk Kim     ParentTable = DtPeekSubtable ();
21774a38ee6dSJung-uk Kim 
21784a38ee6dSJung-uk Kim     Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
21794a38ee6dSJung-uk Kim 
21804a38ee6dSJung-uk Kim     if (Header->Revision == 3)
21814a38ee6dSJung-uk Kim     {
21824a38ee6dSJung-uk Kim         return (DtCompileTpm2Rev3 (List));
21834a38ee6dSJung-uk Kim     }
21844a38ee6dSJung-uk Kim 
218567d9aa44SJung-uk Kim     /* Compile the main table */
218667d9aa44SJung-uk Kim 
218767d9aa44SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2,
2188ff879b07SJung-uk Kim         &Subtable);
218967d9aa44SJung-uk Kim     if (ACPI_FAILURE (Status))
219067d9aa44SJung-uk Kim     {
219167d9aa44SJung-uk Kim         return (Status);
219267d9aa44SJung-uk Kim     }
219367d9aa44SJung-uk Kim 
219467d9aa44SJung-uk Kim     ParentTable = DtPeekSubtable ();
219567d9aa44SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
219667d9aa44SJung-uk Kim 
219767d9aa44SJung-uk Kim     Tpm2Header = ACPI_CAST_PTR (ACPI_TABLE_TPM2, ParentTable->Buffer);
219867d9aa44SJung-uk Kim 
219967d9aa44SJung-uk Kim     /* Method parameters */
220067d9aa44SJung-uk Kim     /* Optional: Log area minimum length */
220167d9aa44SJung-uk Kim     /* Optional: Log area start address */
220267d9aa44SJung-uk Kim     /* TBD: Optional fields above not fully implemented (not optional at this time) */
220367d9aa44SJung-uk Kim 
220467d9aa44SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2a,
2205ff879b07SJung-uk Kim         &Subtable);
220667d9aa44SJung-uk Kim     if (ACPI_FAILURE (Status))
220767d9aa44SJung-uk Kim     {
220867d9aa44SJung-uk Kim         return (Status);
220967d9aa44SJung-uk Kim     }
221067d9aa44SJung-uk Kim 
221167d9aa44SJung-uk Kim     ParentTable = DtPeekSubtable ();
221267d9aa44SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
221367d9aa44SJung-uk Kim 
221467d9aa44SJung-uk Kim 
221567d9aa44SJung-uk Kim     /* Subtable type depends on the StartMethod */
221667d9aa44SJung-uk Kim 
221767d9aa44SJung-uk Kim     switch (Tpm2Header->StartMethod)
221867d9aa44SJung-uk Kim     {
221967d9aa44SJung-uk Kim     case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC:
222067d9aa44SJung-uk Kim 
222167d9aa44SJung-uk Kim         /* Subtable specific to to ARM_SMC */
222267d9aa44SJung-uk Kim 
222367d9aa44SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm211,
2224ff879b07SJung-uk Kim             &Subtable);
222567d9aa44SJung-uk Kim         if (ACPI_FAILURE (Status))
222667d9aa44SJung-uk Kim         {
222767d9aa44SJung-uk Kim             return (Status);
222867d9aa44SJung-uk Kim         }
222967d9aa44SJung-uk Kim 
223067d9aa44SJung-uk Kim         ParentTable = DtPeekSubtable ();
223167d9aa44SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
223267d9aa44SJung-uk Kim         break;
223367d9aa44SJung-uk Kim 
223467d9aa44SJung-uk Kim     case ACPI_TPM2_START_METHOD:
223567d9aa44SJung-uk Kim     case ACPI_TPM2_MEMORY_MAPPED:
223667d9aa44SJung-uk Kim     case ACPI_TPM2_COMMAND_BUFFER:
223767d9aa44SJung-uk Kim     case ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD:
223867d9aa44SJung-uk Kim         break;
223967d9aa44SJung-uk Kim 
224067d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED1:
224167d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED3:
224267d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED4:
224367d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED5:
224467d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED9:
224567d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED10:
224667d9aa44SJung-uk Kim 
224767d9aa44SJung-uk Kim         AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n",
224867d9aa44SJung-uk Kim             Tpm2Header->StartMethod);
224967d9aa44SJung-uk Kim         Status = AE_ERROR;
225067d9aa44SJung-uk Kim         break;
225167d9aa44SJung-uk Kim 
225267d9aa44SJung-uk Kim     case ACPI_TPM2_NOT_ALLOWED:
225367d9aa44SJung-uk Kim     default:
225467d9aa44SJung-uk Kim 
225567d9aa44SJung-uk Kim         AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n",
225667d9aa44SJung-uk Kim             Tpm2Header->StartMethod);
225767d9aa44SJung-uk Kim         Status = AE_ERROR;
225867d9aa44SJung-uk Kim         break;
225967d9aa44SJung-uk Kim     }
226067d9aa44SJung-uk Kim 
226167d9aa44SJung-uk Kim     return (Status);
226267d9aa44SJung-uk Kim }
226367d9aa44SJung-uk Kim 
226467d9aa44SJung-uk Kim 
226567d9aa44SJung-uk Kim /******************************************************************************
226667d9aa44SJung-uk Kim  *
2267f8146b88SJung-uk Kim  * FUNCTION:    DtGetGenericTableInfo
2268f8146b88SJung-uk Kim  *
2269f8146b88SJung-uk Kim  * PARAMETERS:  Name                - Generic type name
2270f8146b88SJung-uk Kim  *
2271f8146b88SJung-uk Kim  * RETURN:      Info entry
2272f8146b88SJung-uk Kim  *
2273f8146b88SJung-uk Kim  * DESCRIPTION: Obtain table info for a generic name entry
2274f8146b88SJung-uk Kim  *
2275f8146b88SJung-uk Kim  *****************************************************************************/
2276f8146b88SJung-uk Kim 
2277f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *
2278f8146b88SJung-uk Kim DtGetGenericTableInfo (
2279f8146b88SJung-uk Kim     char                    *Name)
2280f8146b88SJung-uk Kim {
2281f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *Info;
2282f8146b88SJung-uk Kim     UINT32                  i;
2283f8146b88SJung-uk Kim 
2284f8146b88SJung-uk Kim 
2285f8146b88SJung-uk Kim     if (!Name)
2286f8146b88SJung-uk Kim     {
2287f8146b88SJung-uk Kim         return (NULL);
2288f8146b88SJung-uk Kim     }
2289f8146b88SJung-uk Kim 
2290f8146b88SJung-uk Kim     /* Search info table for name match */
2291f8146b88SJung-uk Kim 
2292f8146b88SJung-uk Kim     for (i = 0; ; i++)
2293f8146b88SJung-uk Kim     {
2294f8146b88SJung-uk Kim         Info = AcpiDmTableInfoGeneric[i];
2295f8146b88SJung-uk Kim         if (Info->Opcode == ACPI_DMT_EXIT)
2296f8146b88SJung-uk Kim         {
2297f8146b88SJung-uk Kim             Info = NULL;
2298f8146b88SJung-uk Kim             break;
2299f8146b88SJung-uk Kim         }
2300f8146b88SJung-uk Kim 
2301f8146b88SJung-uk Kim         /* Use caseless compare for generic keywords */
2302f8146b88SJung-uk Kim 
2303f8146b88SJung-uk Kim         if (!AcpiUtStricmp (Name, Info->Name))
2304f8146b88SJung-uk Kim         {
2305f8146b88SJung-uk Kim             break;
2306f8146b88SJung-uk Kim         }
2307f8146b88SJung-uk Kim     }
2308f8146b88SJung-uk Kim 
2309f8146b88SJung-uk Kim     return (Info);
2310f8146b88SJung-uk Kim }
2311f8146b88SJung-uk Kim 
2312f8146b88SJung-uk Kim 
2313f8146b88SJung-uk Kim /******************************************************************************
2314f8146b88SJung-uk Kim  *
2315f8146b88SJung-uk Kim  * FUNCTION:    DtCompileUefi
2316f8146b88SJung-uk Kim  *
2317f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2318f8146b88SJung-uk Kim  *
2319f8146b88SJung-uk Kim  * RETURN:      Status
2320f8146b88SJung-uk Kim  *
2321f8146b88SJung-uk Kim  * DESCRIPTION: Compile UEFI.
2322f8146b88SJung-uk Kim  *
2323f8146b88SJung-uk Kim  *****************************************************************************/
2324f8146b88SJung-uk Kim 
2325f8146b88SJung-uk Kim ACPI_STATUS
2326f8146b88SJung-uk Kim DtCompileUefi (
2327f8146b88SJung-uk Kim     void                    **List)
2328f8146b88SJung-uk Kim {
2329f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2330f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2331f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2332f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2333f8146b88SJung-uk Kim     UINT16                  *DataOffset;
2334f8146b88SJung-uk Kim 
2335f8146b88SJung-uk Kim 
2336f8146b88SJung-uk Kim     /* Compile the predefined portion of the UEFI table */
2337f8146b88SJung-uk Kim 
2338f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
2339ff879b07SJung-uk Kim         &Subtable);
2340f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2341f8146b88SJung-uk Kim     {
2342f8146b88SJung-uk Kim         return (Status);
2343f8146b88SJung-uk Kim     }
2344f8146b88SJung-uk Kim 
2345f8146b88SJung-uk Kim     DataOffset = (UINT16 *) (Subtable->Buffer + 16);
2346f8146b88SJung-uk Kim     *DataOffset = sizeof (ACPI_TABLE_UEFI);
2347f8146b88SJung-uk Kim 
2348f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2349f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2350f8146b88SJung-uk Kim 
2351f8146b88SJung-uk Kim     /*
2352f8146b88SJung-uk Kim      * Compile the "generic" portion of the UEFI table. This
2353f8146b88SJung-uk Kim      * part of the table is not predefined and any of the generic
2354f8146b88SJung-uk Kim      * operators may be used.
2355f8146b88SJung-uk Kim      */
2356f8146b88SJung-uk Kim     DtCompileGeneric ((void **) PFieldList, NULL, NULL);
2357f8146b88SJung-uk Kim     return (AE_OK);
2358f8146b88SJung-uk Kim }
2359f8146b88SJung-uk Kim 
2360f8146b88SJung-uk Kim 
2361f8146b88SJung-uk Kim /******************************************************************************
2362f8146b88SJung-uk Kim  *
2363cfd1ed46SJung-uk Kim  * FUNCTION:    DtCompileViot
2364cfd1ed46SJung-uk Kim  *
2365cfd1ed46SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2366cfd1ed46SJung-uk Kim  *
2367cfd1ed46SJung-uk Kim  * RETURN:      Status
2368cfd1ed46SJung-uk Kim  *
2369cfd1ed46SJung-uk Kim  * DESCRIPTION: Compile VIOT.
2370cfd1ed46SJung-uk Kim  *
2371cfd1ed46SJung-uk Kim  *****************************************************************************/
2372cfd1ed46SJung-uk Kim 
2373cfd1ed46SJung-uk Kim ACPI_STATUS
2374cfd1ed46SJung-uk Kim DtCompileViot (
2375cfd1ed46SJung-uk Kim     void                    **List)
2376cfd1ed46SJung-uk Kim {
2377cfd1ed46SJung-uk Kim     ACPI_STATUS             Status;
2378cfd1ed46SJung-uk Kim     DT_SUBTABLE             *Subtable;
2379cfd1ed46SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2380cfd1ed46SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2381cfd1ed46SJung-uk Kim     DT_FIELD                *SubtableStart;
2382cfd1ed46SJung-uk Kim     ACPI_TABLE_VIOT         *Viot;
2383cfd1ed46SJung-uk Kim     ACPI_VIOT_HEADER        *ViotHeader;
2384cfd1ed46SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
2385cfd1ed46SJung-uk Kim     UINT16                  NodeCount;
2386cfd1ed46SJung-uk Kim 
2387cfd1ed46SJung-uk Kim     ParentTable = DtPeekSubtable ();
2388cfd1ed46SJung-uk Kim 
2389cfd1ed46SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoViot, &Subtable);
2390cfd1ed46SJung-uk Kim     if (ACPI_FAILURE (Status))
2391cfd1ed46SJung-uk Kim     {
2392cfd1ed46SJung-uk Kim         return (Status);
2393cfd1ed46SJung-uk Kim     }
2394cfd1ed46SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2395cfd1ed46SJung-uk Kim 
2396cfd1ed46SJung-uk Kim     /*
2397cfd1ed46SJung-uk Kim      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
2398cfd1ed46SJung-uk Kim      * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
2399cfd1ed46SJung-uk Kim      */
2400cfd1ed46SJung-uk Kim     Viot = ACPI_SUB_PTR (ACPI_TABLE_VIOT, Subtable->Buffer,
2401cfd1ed46SJung-uk Kim         sizeof (ACPI_TABLE_HEADER));
2402cfd1ed46SJung-uk Kim 
2403cfd1ed46SJung-uk Kim     Viot->NodeOffset = sizeof (ACPI_TABLE_VIOT);
2404cfd1ed46SJung-uk Kim 
2405cfd1ed46SJung-uk Kim     NodeCount = 0;
2406cfd1ed46SJung-uk Kim     while (*PFieldList) {
2407cfd1ed46SJung-uk Kim         SubtableStart = *PFieldList;
2408cfd1ed46SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoViotHeader,
2409cfd1ed46SJung-uk Kim             &Subtable);
2410cfd1ed46SJung-uk Kim         if (ACPI_FAILURE (Status))
2411cfd1ed46SJung-uk Kim         {
2412cfd1ed46SJung-uk Kim             return (Status);
2413cfd1ed46SJung-uk Kim         }
2414cfd1ed46SJung-uk Kim 
2415cfd1ed46SJung-uk Kim         ParentTable = DtPeekSubtable ();
2416cfd1ed46SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2417cfd1ed46SJung-uk Kim         DtPushSubtable (Subtable);
2418cfd1ed46SJung-uk Kim 
2419cfd1ed46SJung-uk Kim         ViotHeader = ACPI_CAST_PTR (ACPI_VIOT_HEADER, Subtable->Buffer);
2420cfd1ed46SJung-uk Kim 
2421cfd1ed46SJung-uk Kim         switch (ViotHeader->Type)
2422cfd1ed46SJung-uk Kim         {
2423cfd1ed46SJung-uk Kim         case ACPI_VIOT_NODE_PCI_RANGE:
2424cfd1ed46SJung-uk Kim 
2425cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoViot1;
2426cfd1ed46SJung-uk Kim             break;
2427cfd1ed46SJung-uk Kim 
2428cfd1ed46SJung-uk Kim         case ACPI_VIOT_NODE_MMIO:
2429cfd1ed46SJung-uk Kim 
2430cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoViot2;
2431cfd1ed46SJung-uk Kim             break;
2432cfd1ed46SJung-uk Kim 
2433cfd1ed46SJung-uk Kim         case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI:
2434cfd1ed46SJung-uk Kim 
2435cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoViot3;
2436cfd1ed46SJung-uk Kim             break;
2437cfd1ed46SJung-uk Kim 
2438cfd1ed46SJung-uk Kim         case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO:
2439cfd1ed46SJung-uk Kim 
2440cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoViot4;
2441cfd1ed46SJung-uk Kim             break;
2442cfd1ed46SJung-uk Kim 
2443cfd1ed46SJung-uk Kim         default:
2444cfd1ed46SJung-uk Kim 
2445cfd1ed46SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "VIOT");
2446cfd1ed46SJung-uk Kim             return (AE_ERROR);
2447cfd1ed46SJung-uk Kim         }
2448cfd1ed46SJung-uk Kim 
2449cfd1ed46SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
2450cfd1ed46SJung-uk Kim         if (ACPI_FAILURE (Status))
2451cfd1ed46SJung-uk Kim         {
2452cfd1ed46SJung-uk Kim             return (Status);
2453cfd1ed46SJung-uk Kim         }
2454cfd1ed46SJung-uk Kim 
2455cfd1ed46SJung-uk Kim         ParentTable = DtPeekSubtable ();
2456cfd1ed46SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2457cfd1ed46SJung-uk Kim         DtPopSubtable ();
2458cfd1ed46SJung-uk Kim         NodeCount++;
2459cfd1ed46SJung-uk Kim     }
2460cfd1ed46SJung-uk Kim 
2461cfd1ed46SJung-uk Kim     Viot->NodeCount = NodeCount;
2462cfd1ed46SJung-uk Kim     return (AE_OK);
2463cfd1ed46SJung-uk Kim }
2464cfd1ed46SJung-uk Kim 
2465cfd1ed46SJung-uk Kim 
2466cfd1ed46SJung-uk Kim /******************************************************************************
2467cfd1ed46SJung-uk Kim  *
2468f8146b88SJung-uk Kim  * FUNCTION:    DtCompileWdat
2469f8146b88SJung-uk Kim  *
2470f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2471f8146b88SJung-uk Kim  *
2472f8146b88SJung-uk Kim  * RETURN:      Status
2473f8146b88SJung-uk Kim  *
2474f8146b88SJung-uk Kim  * DESCRIPTION: Compile WDAT.
2475f8146b88SJung-uk Kim  *
2476f8146b88SJung-uk Kim  *****************************************************************************/
2477f8146b88SJung-uk Kim 
2478f8146b88SJung-uk Kim ACPI_STATUS
2479f8146b88SJung-uk Kim DtCompileWdat (
2480f8146b88SJung-uk Kim     void                    **List)
2481f8146b88SJung-uk Kim {
2482f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2483f8146b88SJung-uk Kim 
2484f8146b88SJung-uk Kim 
2485f8146b88SJung-uk Kim     Status = DtCompileTwoSubtables (List,
2486f8146b88SJung-uk Kim         AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
2487f8146b88SJung-uk Kim     return (Status);
2488f8146b88SJung-uk Kim }
2489f8146b88SJung-uk Kim 
2490f8146b88SJung-uk Kim 
2491f8146b88SJung-uk Kim /******************************************************************************
2492f8146b88SJung-uk Kim  *
2493f8146b88SJung-uk Kim  * FUNCTION:    DtCompileWpbt
2494f8146b88SJung-uk Kim  *
2495f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2496f8146b88SJung-uk Kim  *
2497f8146b88SJung-uk Kim  * RETURN:      Status
2498f8146b88SJung-uk Kim  *
2499f8146b88SJung-uk Kim  * DESCRIPTION: Compile WPBT.
2500f8146b88SJung-uk Kim  *
2501f8146b88SJung-uk Kim  *****************************************************************************/
2502f8146b88SJung-uk Kim 
2503f8146b88SJung-uk Kim ACPI_STATUS
2504f8146b88SJung-uk Kim DtCompileWpbt (
2505f8146b88SJung-uk Kim     void                    **List)
2506f8146b88SJung-uk Kim {
2507f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2508f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2509f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2510f8146b88SJung-uk Kim     ACPI_TABLE_WPBT         *Table;
2511f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2512f8146b88SJung-uk Kim     UINT16                  Length;
2513f8146b88SJung-uk Kim 
2514f8146b88SJung-uk Kim 
2515f8146b88SJung-uk Kim     /* Compile the main table */
2516f8146b88SJung-uk Kim 
2517f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt,
2518ff879b07SJung-uk Kim         &Subtable);
2519f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2520f8146b88SJung-uk Kim     {
2521f8146b88SJung-uk Kim         return (Status);
2522f8146b88SJung-uk Kim     }
2523f8146b88SJung-uk Kim 
2524f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2525f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2526f8146b88SJung-uk Kim 
2527f8146b88SJung-uk Kim     /* Compile the argument list subtable */
2528f8146b88SJung-uk Kim 
2529f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0,
2530ff879b07SJung-uk Kim         &Subtable);
2531f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2532f8146b88SJung-uk Kim     {
2533f8146b88SJung-uk Kim         return (Status);
2534f8146b88SJung-uk Kim     }
2535f8146b88SJung-uk Kim 
2536f8146b88SJung-uk Kim     /* Extract the length of the Arguments buffer, insert into main table */
2537f8146b88SJung-uk Kim 
2538f8146b88SJung-uk Kim     Length = (UINT16) Subtable->TotalLength;
2539f8146b88SJung-uk Kim     Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer);
2540f8146b88SJung-uk Kim     Table->ArgumentsLength = Length;
2541f8146b88SJung-uk Kim 
2542f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2543f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2544f8146b88SJung-uk Kim     return (AE_OK);
2545f8146b88SJung-uk Kim }
2546f8146b88SJung-uk Kim 
2547f8146b88SJung-uk Kim 
2548f8146b88SJung-uk Kim /******************************************************************************
2549f8146b88SJung-uk Kim  *
2550f8146b88SJung-uk Kim  * FUNCTION:    DtCompileXsdt
2551f8146b88SJung-uk Kim  *
2552f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2553f8146b88SJung-uk Kim  *
2554f8146b88SJung-uk Kim  * RETURN:      Status
2555f8146b88SJung-uk Kim  *
2556f8146b88SJung-uk Kim  * DESCRIPTION: Compile XSDT.
2557f8146b88SJung-uk Kim  *
2558f8146b88SJung-uk Kim  *****************************************************************************/
2559f8146b88SJung-uk Kim 
2560f8146b88SJung-uk Kim ACPI_STATUS
2561f8146b88SJung-uk Kim DtCompileXsdt (
2562f8146b88SJung-uk Kim     void                    **List)
2563f8146b88SJung-uk Kim {
2564f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2565f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2566f8146b88SJung-uk Kim     DT_FIELD                *FieldList = *(DT_FIELD **) List;
2567f8146b88SJung-uk Kim     UINT64                  Address;
2568f8146b88SJung-uk Kim 
2569f8146b88SJung-uk Kim 
2570f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2571f8146b88SJung-uk Kim 
2572f8146b88SJung-uk Kim     while (FieldList)
2573f8146b88SJung-uk Kim     {
2574f8146b88SJung-uk Kim         DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
2575f8146b88SJung-uk Kim 
2576f8146b88SJung-uk Kim         DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
2577f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2578f8146b88SJung-uk Kim         FieldList = FieldList->Next;
2579f8146b88SJung-uk Kim     }
2580f8146b88SJung-uk Kim 
2581f8146b88SJung-uk Kim     return (AE_OK);
2582f8146b88SJung-uk Kim }
2583f8146b88SJung-uk Kim 
2584f8146b88SJung-uk Kim 
2585f8146b88SJung-uk Kim /******************************************************************************
2586f8146b88SJung-uk Kim  *
2587f8146b88SJung-uk Kim  * FUNCTION:    DtCompileGeneric
2588f8146b88SJung-uk Kim  *
2589f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2590f8146b88SJung-uk Kim  *              Name                - Field name to end generic compiling
2591f8146b88SJung-uk Kim  *              Length              - Compiled table length to return
2592f8146b88SJung-uk Kim  *
2593f8146b88SJung-uk Kim  * RETURN:      Status
2594f8146b88SJung-uk Kim  *
2595f8146b88SJung-uk Kim  * DESCRIPTION: Compile generic unknown table.
2596f8146b88SJung-uk Kim  *
2597f8146b88SJung-uk Kim  *****************************************************************************/
2598f8146b88SJung-uk Kim 
2599f8146b88SJung-uk Kim ACPI_STATUS
2600f8146b88SJung-uk Kim DtCompileGeneric (
2601f8146b88SJung-uk Kim     void                    **List,
2602f8146b88SJung-uk Kim     char                    *Name,
2603f8146b88SJung-uk Kim     UINT32                  *Length)
2604f8146b88SJung-uk Kim {
2605f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2606f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2607f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2608f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2609f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *Info;
2610f8146b88SJung-uk Kim 
2611f8146b88SJung-uk Kim 
2612f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2613f8146b88SJung-uk Kim 
2614f8146b88SJung-uk Kim     /*
2615f8146b88SJung-uk Kim      * Compile the "generic" portion of the table. This
2616f8146b88SJung-uk Kim      * part of the table is not predefined and any of the generic
2617f8146b88SJung-uk Kim      * operators may be used.
2618f8146b88SJung-uk Kim      */
2619f8146b88SJung-uk Kim 
2620f8146b88SJung-uk Kim     /* Find any and all labels in the entire generic portion */
2621f8146b88SJung-uk Kim 
2622f8146b88SJung-uk Kim     DtDetectAllLabels (*PFieldList);
2623f8146b88SJung-uk Kim 
2624f8146b88SJung-uk Kim     /* Now we can actually compile the parse tree */
2625f8146b88SJung-uk Kim 
2626f8146b88SJung-uk Kim     if (Length && *Length)
2627f8146b88SJung-uk Kim     {
2628f8146b88SJung-uk Kim         *Length = 0;
2629f8146b88SJung-uk Kim     }
2630f8146b88SJung-uk Kim     while (*PFieldList)
2631f8146b88SJung-uk Kim     {
2632f8146b88SJung-uk Kim         if (Name && !strcmp ((*PFieldList)->Name, Name))
2633f8146b88SJung-uk Kim         {
2634f8146b88SJung-uk Kim             break;
2635f8146b88SJung-uk Kim         }
2636f8146b88SJung-uk Kim 
2637f8146b88SJung-uk Kim         Info = DtGetGenericTableInfo ((*PFieldList)->Name);
2638f8146b88SJung-uk Kim         if (!Info)
2639f8146b88SJung-uk Kim         {
26406f1f1a63SJung-uk Kim             sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
2641f8146b88SJung-uk Kim                 (*PFieldList)->Name);
2642f8146b88SJung-uk Kim             DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
26436f1f1a63SJung-uk Kim                 (*PFieldList), AslGbl_MsgBuffer);
2644f8146b88SJung-uk Kim 
2645f8146b88SJung-uk Kim             *PFieldList = (*PFieldList)->Next;
2646f8146b88SJung-uk Kim             continue;
2647f8146b88SJung-uk Kim         }
2648f8146b88SJung-uk Kim 
2649f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, Info,
2650ff879b07SJung-uk Kim             &Subtable);
2651f8146b88SJung-uk Kim         if (ACPI_SUCCESS (Status))
2652f8146b88SJung-uk Kim         {
2653f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
2654f8146b88SJung-uk Kim             if (Length)
2655f8146b88SJung-uk Kim             {
2656f8146b88SJung-uk Kim                 *Length += Subtable->Length;
2657f8146b88SJung-uk Kim             }
2658f8146b88SJung-uk Kim         }
2659f8146b88SJung-uk Kim         else
2660f8146b88SJung-uk Kim         {
2661f8146b88SJung-uk Kim             *PFieldList = (*PFieldList)->Next;
2662f8146b88SJung-uk Kim 
2663f8146b88SJung-uk Kim             if (Status == AE_NOT_FOUND)
2664f8146b88SJung-uk Kim             {
26656f1f1a63SJung-uk Kim                 sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
2666f8146b88SJung-uk Kim                     (*PFieldList)->Name);
2667f8146b88SJung-uk Kim                 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
26686f1f1a63SJung-uk Kim                     (*PFieldList), AslGbl_MsgBuffer);
2669f8146b88SJung-uk Kim             }
2670f8146b88SJung-uk Kim         }
2671f8146b88SJung-uk Kim     }
2672f8146b88SJung-uk Kim 
2673f8146b88SJung-uk Kim     return (AE_OK);
2674f8146b88SJung-uk Kim }
2675