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  *
11722b1667SJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2023, 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
DtCompileLpit(void ** List)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
DtCompileMadt(void ** List)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 
37407c64d74SJung-uk Kim         case ACPI_MADT_TYPE_CORE_PIC:
37507c64d74SJung-uk Kim 
37607c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt17;
37707c64d74SJung-uk Kim             break;
37807c64d74SJung-uk Kim 
37907c64d74SJung-uk Kim         case ACPI_MADT_TYPE_LIO_PIC:
38007c64d74SJung-uk Kim 
38107c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt18;
38207c64d74SJung-uk Kim             break;
38307c64d74SJung-uk Kim 
38407c64d74SJung-uk Kim         case ACPI_MADT_TYPE_HT_PIC:
38507c64d74SJung-uk Kim 
38607c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt19;
38707c64d74SJung-uk Kim             break;
38807c64d74SJung-uk Kim 
38907c64d74SJung-uk Kim         case ACPI_MADT_TYPE_EIO_PIC:
39007c64d74SJung-uk Kim 
39107c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt20;
39207c64d74SJung-uk Kim             break;
39307c64d74SJung-uk Kim 
39407c64d74SJung-uk Kim         case ACPI_MADT_TYPE_MSI_PIC:
39507c64d74SJung-uk Kim 
39607c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt21;
39707c64d74SJung-uk Kim             break;
39807c64d74SJung-uk Kim 
39907c64d74SJung-uk Kim         case ACPI_MADT_TYPE_BIO_PIC:
40007c64d74SJung-uk Kim 
40107c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt22;
40207c64d74SJung-uk Kim             break;
40307c64d74SJung-uk Kim 
40407c64d74SJung-uk Kim         case ACPI_MADT_TYPE_LPC_PIC:
40507c64d74SJung-uk Kim 
40607c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt23;
40707c64d74SJung-uk Kim             break;
40807c64d74SJung-uk Kim 
40907c64d74SJung-uk Kim         case ACPI_MADT_TYPE_RINTC:
41007c64d74SJung-uk Kim 
41107c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt24;
41207c64d74SJung-uk Kim             break;
41307c64d74SJung-uk Kim 
41407c64d74SJung-uk Kim         case ACPI_MADT_TYPE_IMSIC:
41507c64d74SJung-uk Kim 
41607c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt25;
41707c64d74SJung-uk Kim             break;
41807c64d74SJung-uk Kim 
41907c64d74SJung-uk Kim         case ACPI_MADT_TYPE_APLIC:
42007c64d74SJung-uk Kim 
42107c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt26;
42207c64d74SJung-uk Kim             break;
42307c64d74SJung-uk Kim 
42407c64d74SJung-uk Kim         case ACPI_MADT_TYPE_PLIC:
42507c64d74SJung-uk Kim 
42607c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt27;
42707c64d74SJung-uk Kim             break;
42807c64d74SJung-uk Kim 
429f8146b88SJung-uk Kim         default:
430f8146b88SJung-uk Kim 
431ab71bbb7SJung-uk Kim             if (MadtHeader->Type >= ACPI_MADT_TYPE_OEM_RESERVED)
432ab71bbb7SJung-uk Kim             {
43307c64d74SJung-uk Kim                 InfoTable = AcpiDmTableInfoMadt128;
434ab71bbb7SJung-uk Kim             }
435ab71bbb7SJung-uk Kim             else
436ab71bbb7SJung-uk Kim             {
437f8146b88SJung-uk Kim                 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
438f8146b88SJung-uk Kim                 return (AE_ERROR);
439f8146b88SJung-uk Kim             }
440f8146b88SJung-uk Kim 
441ab71bbb7SJung-uk Kim             break;
442ab71bbb7SJung-uk Kim         }
443ab71bbb7SJung-uk Kim 
444ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
445f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
446f8146b88SJung-uk Kim         {
447f8146b88SJung-uk Kim             return (Status);
448f8146b88SJung-uk Kim         }
449f8146b88SJung-uk Kim 
450f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
451f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
452f8146b88SJung-uk Kim         DtPopSubtable ();
453f8146b88SJung-uk Kim     }
454f8146b88SJung-uk Kim 
455f8146b88SJung-uk Kim     return (AE_OK);
456f8146b88SJung-uk Kim }
457f8146b88SJung-uk Kim 
458f8146b88SJung-uk Kim 
459f8146b88SJung-uk Kim /******************************************************************************
460f8146b88SJung-uk Kim  *
461f8146b88SJung-uk Kim  * FUNCTION:    DtCompileMcfg
462f8146b88SJung-uk Kim  *
463f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
464f8146b88SJung-uk Kim  *
465f8146b88SJung-uk Kim  * RETURN:      Status
466f8146b88SJung-uk Kim  *
467f8146b88SJung-uk Kim  * DESCRIPTION: Compile MCFG.
468f8146b88SJung-uk Kim  *
469f8146b88SJung-uk Kim  *****************************************************************************/
470f8146b88SJung-uk Kim 
471f8146b88SJung-uk Kim ACPI_STATUS
DtCompileMcfg(void ** List)472f8146b88SJung-uk Kim DtCompileMcfg (
473f8146b88SJung-uk Kim     void                    **List)
474f8146b88SJung-uk Kim {
475f8146b88SJung-uk Kim     ACPI_STATUS             Status;
476f8146b88SJung-uk Kim 
477f8146b88SJung-uk Kim 
478f8146b88SJung-uk Kim     Status = DtCompileTwoSubtables (List,
479f8146b88SJung-uk Kim         AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
480f8146b88SJung-uk Kim     return (Status);
481f8146b88SJung-uk Kim }
482f8146b88SJung-uk Kim 
483722b1667SJung-uk Kim /******************************************************************************
484722b1667SJung-uk Kim  *
485722b1667SJung-uk Kim  * FUNCTION:    DtCompileMpam
486722b1667SJung-uk Kim  *
487722b1667SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
488722b1667SJung-uk Kim  *
489722b1667SJung-uk Kim  * RETURN:      Status
490722b1667SJung-uk Kim  *
491722b1667SJung-uk Kim  * DESCRIPTION: Compile MPAM.
492722b1667SJung-uk Kim  *
493722b1667SJung-uk Kim  *****************************************************************************/
494722b1667SJung-uk Kim 
495722b1667SJung-uk Kim ACPI_STATUS
DtCompileMpam(void ** List)496722b1667SJung-uk Kim DtCompileMpam (
497722b1667SJung-uk Kim     void                    **List)
498722b1667SJung-uk Kim {
499722b1667SJung-uk Kim     ACPI_STATUS             Status;
500722b1667SJung-uk Kim     DT_SUBTABLE             *ParentTable;
501722b1667SJung-uk Kim     DT_SUBTABLE             *Subtable;
502722b1667SJung-uk Kim     DT_FIELD                *SubtableStart;
503722b1667SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
504722b1667SJung-uk Kim     ACPI_MPAM_MSC_NODE      *MpamMscNode;
505722b1667SJung-uk Kim     ACPI_MPAM_RESOURCE_NODE *MpamResourceNode;
506722b1667SJung-uk Kim     UINT32                  FuncDepsCount;
507722b1667SJung-uk Kim     UINT32                  RisLength;
508722b1667SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
509722b1667SJung-uk Kim 
510722b1667SJung-uk Kim     ParentTable = DtPeekSubtable ();
511722b1667SJung-uk Kim 
512722b1667SJung-uk Kim     while (*PFieldList)
513722b1667SJung-uk Kim     {
514722b1667SJung-uk Kim         SubtableStart = *PFieldList;
515722b1667SJung-uk Kim 
516722b1667SJung-uk Kim         /* Main MSC Node table */
517722b1667SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam0,
518722b1667SJung-uk Kim             &Subtable);
519722b1667SJung-uk Kim         if (ACPI_FAILURE (Status))
520722b1667SJung-uk Kim         {
521722b1667SJung-uk Kim             return (Status);
522722b1667SJung-uk Kim         }
523722b1667SJung-uk Kim 
524722b1667SJung-uk Kim         MpamMscNode = ACPI_CAST_PTR (ACPI_MPAM_MSC_NODE, Subtable->Buffer);
525722b1667SJung-uk Kim 
526722b1667SJung-uk Kim         ParentTable = DtPeekSubtable ();
527722b1667SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
528722b1667SJung-uk Kim         DtPushSubtable (Subtable);
529722b1667SJung-uk Kim 
530722b1667SJung-uk Kim         ParentTable = DtPeekSubtable ();
531722b1667SJung-uk Kim 
532722b1667SJung-uk Kim         /*
533722b1667SJung-uk Kim          * RIS(es) per MSC node have variable lengths depending on how many RISes there and
534722b1667SJung-uk Kim          * any how many functional dependencies per RIS. Calculate it in order
535722b1667SJung-uk Kim          * to properly set the overall MSC length.
536722b1667SJung-uk Kim          */
537722b1667SJung-uk Kim         RisLength = 0;
538722b1667SJung-uk Kim 
539722b1667SJung-uk Kim         /* Iterate over RIS subtables per MSC node */
540722b1667SJung-uk Kim         for (UINT32 ris = 0; ris < MpamMscNode->NumResouceNodes; ris++)
541722b1667SJung-uk Kim         {
542722b1667SJung-uk Kim             /* Compile RIS subtable */
543722b1667SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam1,
544722b1667SJung-uk Kim                 &Subtable);
545722b1667SJung-uk Kim             if (ACPI_FAILURE (Status))
546722b1667SJung-uk Kim             {
547722b1667SJung-uk Kim                 return (Status);
548722b1667SJung-uk Kim             }
549722b1667SJung-uk Kim 
550722b1667SJung-uk Kim             MpamResourceNode = ACPI_CAST_PTR (ACPI_MPAM_RESOURCE_NODE, Subtable->Buffer);
551722b1667SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
552722b1667SJung-uk Kim             DtPushSubtable (Subtable);
553722b1667SJung-uk Kim 
554722b1667SJung-uk Kim             ParentTable = DtPeekSubtable ();
555722b1667SJung-uk Kim 
556722b1667SJung-uk Kim             switch (MpamResourceNode->LocatorType)
557722b1667SJung-uk Kim             {
558722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE:
559722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1A;
560722b1667SJung-uk Kim                     break;
561722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_MEMORY:
562722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1B;
563722b1667SJung-uk Kim                     break;
564722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_SMMU:
565722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1C;
566722b1667SJung-uk Kim                     break;
567722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_MEMORY_CACHE:
568722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1D;
569722b1667SJung-uk Kim                     break;
570722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_ACPI_DEVICE:
571722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1E;
572722b1667SJung-uk Kim                     break;
573722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_INTERCONNECT:
574722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1F;
575722b1667SJung-uk Kim                     break;
576722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_UNKNOWN:
577722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1G;
578722b1667SJung-uk Kim                 default:
579722b1667SJung-uk Kim                     DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "Resource Locator Type");
580722b1667SJung-uk Kim                     return (AE_ERROR);
581722b1667SJung-uk Kim             }
582722b1667SJung-uk Kim 
583722b1667SJung-uk Kim             /* Compile Resource Locator Table */
584722b1667SJung-uk Kim             Status = DtCompileTable (PFieldList, InfoTable,
585722b1667SJung-uk Kim                 &Subtable);
586722b1667SJung-uk Kim 
587722b1667SJung-uk Kim             if (ACPI_FAILURE (Status))
588722b1667SJung-uk Kim             {
589722b1667SJung-uk Kim                 return (Status);
590722b1667SJung-uk Kim             }
591722b1667SJung-uk Kim 
592722b1667SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
593722b1667SJung-uk Kim 
594722b1667SJung-uk Kim             /* Compile the number of functional dependencies per RIS */
595722b1667SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam1Deps,
596722b1667SJung-uk Kim                 &Subtable);
597722b1667SJung-uk Kim 
598722b1667SJung-uk Kim             if (ACPI_FAILURE (Status))
599722b1667SJung-uk Kim             {
600722b1667SJung-uk Kim                 return (Status);
601722b1667SJung-uk Kim             }
602722b1667SJung-uk Kim 
603722b1667SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
604722b1667SJung-uk Kim             FuncDepsCount = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
605722b1667SJung-uk Kim 
606722b1667SJung-uk Kim             RisLength += sizeof(ACPI_MPAM_RESOURCE_NODE) +
607722b1667SJung-uk Kim                 FuncDepsCount * sizeof(ACPI_MPAM_FUNC_DEPS);
608722b1667SJung-uk Kim 
609722b1667SJung-uk Kim             /* Iterate over functional dependencies per RIS */
610722b1667SJung-uk Kim             for (UINT32 funcDep = 0; funcDep < FuncDepsCount; funcDep++)
611722b1667SJung-uk Kim             {
612722b1667SJung-uk Kim                 /* Compiler functional dependencies table */
613722b1667SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam2,
614722b1667SJung-uk Kim                     &Subtable);
615722b1667SJung-uk Kim 
616722b1667SJung-uk Kim                 if (ACPI_FAILURE (Status))
617722b1667SJung-uk Kim                 {
618722b1667SJung-uk Kim                     return (Status);
619722b1667SJung-uk Kim                 }
620722b1667SJung-uk Kim 
621722b1667SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
622722b1667SJung-uk Kim             }
623722b1667SJung-uk Kim 
624722b1667SJung-uk Kim             DtPopSubtable ();
625722b1667SJung-uk Kim         }
626722b1667SJung-uk Kim 
627722b1667SJung-uk Kim         /* Check if the length of the MSC is correct and override with the correct length */
628722b1667SJung-uk Kim         if (MpamMscNode->Length != sizeof(ACPI_MPAM_MSC_NODE) + RisLength)
629722b1667SJung-uk Kim         {
630722b1667SJung-uk Kim             MpamMscNode->Length = (UINT16) (sizeof(ACPI_MPAM_MSC_NODE) + RisLength);
631722b1667SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "Overriding MSC->Length: %X\n", MpamMscNode->Length);
632722b1667SJung-uk Kim         }
633722b1667SJung-uk Kim 
634722b1667SJung-uk Kim         DtPopSubtable ();
635722b1667SJung-uk Kim     }
636722b1667SJung-uk Kim 
637722b1667SJung-uk Kim     return (AE_OK);
638722b1667SJung-uk Kim }
639722b1667SJung-uk Kim 
640f8146b88SJung-uk Kim 
641f8146b88SJung-uk Kim /******************************************************************************
642f8146b88SJung-uk Kim  *
643f8146b88SJung-uk Kim  * FUNCTION:    DtCompileMpst
644f8146b88SJung-uk Kim  *
645f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
646f8146b88SJung-uk Kim  *
647f8146b88SJung-uk Kim  * RETURN:      Status
648f8146b88SJung-uk Kim  *
649f8146b88SJung-uk Kim  * DESCRIPTION: Compile MPST.
650f8146b88SJung-uk Kim  *
651f8146b88SJung-uk Kim  *****************************************************************************/
652f8146b88SJung-uk Kim 
653f8146b88SJung-uk Kim ACPI_STATUS
DtCompileMpst(void ** List)654f8146b88SJung-uk Kim DtCompileMpst (
655f8146b88SJung-uk Kim     void                    **List)
656f8146b88SJung-uk Kim {
657f8146b88SJung-uk Kim     ACPI_STATUS             Status;
658f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
659f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
660f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
661f8146b88SJung-uk Kim     ACPI_MPST_CHANNEL       *MpstChannelInfo;
662f8146b88SJung-uk Kim     ACPI_MPST_POWER_NODE    *MpstPowerNode;
663f8146b88SJung-uk Kim     ACPI_MPST_DATA_HDR      *MpstDataHeader;
664f8146b88SJung-uk Kim     UINT16                  SubtableCount;
665f8146b88SJung-uk Kim     UINT32                  PowerStateCount;
666f8146b88SJung-uk Kim     UINT32                  ComponentCount;
667f8146b88SJung-uk Kim 
668f8146b88SJung-uk Kim 
669f8146b88SJung-uk Kim     /* Main table */
670f8146b88SJung-uk Kim 
671ff879b07SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable);
672f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
673f8146b88SJung-uk Kim     {
674f8146b88SJung-uk Kim         return (Status);
675f8146b88SJung-uk Kim     }
676f8146b88SJung-uk Kim 
677f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
678f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
679f8146b88SJung-uk Kim     DtPushSubtable (Subtable);
680f8146b88SJung-uk Kim 
681f8146b88SJung-uk Kim     MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
682f8146b88SJung-uk Kim     SubtableCount = MpstChannelInfo->PowerNodeCount;
683f8146b88SJung-uk Kim 
684f8146b88SJung-uk Kim     while (*PFieldList && SubtableCount)
685f8146b88SJung-uk Kim     {
686f8146b88SJung-uk Kim         /* Subtable: Memory Power Node(s) */
687f8146b88SJung-uk Kim 
688f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
689ff879b07SJung-uk Kim             &Subtable);
690f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
691f8146b88SJung-uk Kim         {
692f8146b88SJung-uk Kim             return (Status);
693f8146b88SJung-uk Kim         }
694f8146b88SJung-uk Kim 
695f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
696f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
697f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
698f8146b88SJung-uk Kim 
699f8146b88SJung-uk Kim         MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
700f8146b88SJung-uk Kim         PowerStateCount = MpstPowerNode->NumPowerStates;
701f8146b88SJung-uk Kim         ComponentCount = MpstPowerNode->NumPhysicalComponents;
702f8146b88SJung-uk Kim 
703f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
704f8146b88SJung-uk Kim 
705f8146b88SJung-uk Kim         /* Sub-subtables - Memory Power State Structure(s) */
706f8146b88SJung-uk Kim 
707f8146b88SJung-uk Kim         while (*PFieldList && PowerStateCount)
708f8146b88SJung-uk Kim         {
709f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
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             DtInsertSubtable (ParentTable, Subtable);
717f8146b88SJung-uk Kim             PowerStateCount--;
718f8146b88SJung-uk Kim         }
719f8146b88SJung-uk Kim 
720f8146b88SJung-uk Kim         /* Sub-subtables - Physical Component ID Structure(s) */
721f8146b88SJung-uk Kim 
722f8146b88SJung-uk Kim         while (*PFieldList && ComponentCount)
723f8146b88SJung-uk Kim         {
724f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
725ff879b07SJung-uk Kim                 &Subtable);
726f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
727f8146b88SJung-uk Kim             {
728f8146b88SJung-uk Kim                 return (Status);
729f8146b88SJung-uk Kim             }
730f8146b88SJung-uk Kim 
731f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
732f8146b88SJung-uk Kim             ComponentCount--;
733f8146b88SJung-uk Kim         }
734f8146b88SJung-uk Kim 
735f8146b88SJung-uk Kim         SubtableCount--;
736f8146b88SJung-uk Kim         DtPopSubtable ();
737f8146b88SJung-uk Kim     }
738f8146b88SJung-uk Kim 
739f8146b88SJung-uk Kim     /* Subtable: Count of Memory Power State Characteristic structures */
740f8146b88SJung-uk Kim 
741f8146b88SJung-uk Kim     DtPopSubtable ();
742f8146b88SJung-uk Kim 
743ff879b07SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable);
744f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
745f8146b88SJung-uk Kim     {
746f8146b88SJung-uk Kim         return (Status);
747f8146b88SJung-uk Kim     }
748f8146b88SJung-uk Kim 
749f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
750f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
751f8146b88SJung-uk Kim     DtPushSubtable (Subtable);
752f8146b88SJung-uk Kim 
753f8146b88SJung-uk Kim     MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
754f8146b88SJung-uk Kim     SubtableCount = MpstDataHeader->CharacteristicsCount;
755f8146b88SJung-uk Kim 
756f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
757f8146b88SJung-uk Kim 
758f8146b88SJung-uk Kim     /* Subtable: Memory Power State Characteristics structure(s) */
759f8146b88SJung-uk Kim 
760f8146b88SJung-uk Kim     while (*PFieldList && SubtableCount)
761f8146b88SJung-uk Kim     {
762f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
763ff879b07SJung-uk Kim             &Subtable);
764f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
765f8146b88SJung-uk Kim         {
766f8146b88SJung-uk Kim             return (Status);
767f8146b88SJung-uk Kim         }
768f8146b88SJung-uk Kim 
769f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
770f8146b88SJung-uk Kim         SubtableCount--;
771f8146b88SJung-uk Kim     }
772f8146b88SJung-uk Kim 
773f8146b88SJung-uk Kim     DtPopSubtable ();
774f8146b88SJung-uk Kim     return (AE_OK);
775f8146b88SJung-uk Kim }
776f8146b88SJung-uk Kim 
777f8146b88SJung-uk Kim 
778f8146b88SJung-uk Kim /******************************************************************************
779f8146b88SJung-uk Kim  *
780f8146b88SJung-uk Kim  * FUNCTION:    DtCompileMsct
781f8146b88SJung-uk Kim  *
782f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
783f8146b88SJung-uk Kim  *
784f8146b88SJung-uk Kim  * RETURN:      Status
785f8146b88SJung-uk Kim  *
786f8146b88SJung-uk Kim  * DESCRIPTION: Compile MSCT.
787f8146b88SJung-uk Kim  *
788f8146b88SJung-uk Kim  *****************************************************************************/
789f8146b88SJung-uk Kim 
790f8146b88SJung-uk Kim ACPI_STATUS
DtCompileMsct(void ** List)791f8146b88SJung-uk Kim DtCompileMsct (
792f8146b88SJung-uk Kim     void                    **List)
793f8146b88SJung-uk Kim {
794f8146b88SJung-uk Kim     ACPI_STATUS             Status;
795f8146b88SJung-uk Kim 
796f8146b88SJung-uk Kim 
797f8146b88SJung-uk Kim     Status = DtCompileTwoSubtables (List,
798f8146b88SJung-uk Kim         AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
799f8146b88SJung-uk Kim     return (Status);
800f8146b88SJung-uk Kim }
801f8146b88SJung-uk Kim 
802f8146b88SJung-uk Kim 
803f8146b88SJung-uk Kim /******************************************************************************
804f8146b88SJung-uk Kim  *
805f8146b88SJung-uk Kim  * FUNCTION:    DtCompileNfit
806f8146b88SJung-uk Kim  *
807f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
808f8146b88SJung-uk Kim  *
809f8146b88SJung-uk Kim  * RETURN:      Status
810f8146b88SJung-uk Kim  *
811f8146b88SJung-uk Kim  * DESCRIPTION: Compile NFIT.
812f8146b88SJung-uk Kim  *
813f8146b88SJung-uk Kim  *****************************************************************************/
814f8146b88SJung-uk Kim 
815f8146b88SJung-uk Kim ACPI_STATUS
DtCompileNfit(void ** List)816f8146b88SJung-uk Kim DtCompileNfit (
817f8146b88SJung-uk Kim     void                    **List)
818f8146b88SJung-uk Kim {
819f8146b88SJung-uk Kim     ACPI_STATUS             Status;
820f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
821f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
822f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
823f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
824f8146b88SJung-uk Kim     ACPI_NFIT_HEADER        *NfitHeader;
825f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
826f8146b88SJung-uk Kim     UINT32                  Count;
827f8146b88SJung-uk Kim     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
828f8146b88SJung-uk Kim     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
829f8146b88SJung-uk Kim 
830f8146b88SJung-uk Kim 
831f8146b88SJung-uk Kim     /* Main table */
832f8146b88SJung-uk Kim 
833f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit,
834ff879b07SJung-uk Kim         &Subtable);
835f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
836f8146b88SJung-uk Kim     {
837f8146b88SJung-uk Kim         return (Status);
838f8146b88SJung-uk Kim     }
839f8146b88SJung-uk Kim 
840f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
841f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
842f8146b88SJung-uk Kim     DtPushSubtable (Subtable);
843f8146b88SJung-uk Kim 
844f8146b88SJung-uk Kim     /* Subtables */
845f8146b88SJung-uk Kim 
846f8146b88SJung-uk Kim     while (*PFieldList)
847f8146b88SJung-uk Kim     {
848f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
849f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr,
850ff879b07SJung-uk Kim             &Subtable);
851f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
852f8146b88SJung-uk Kim         {
853f8146b88SJung-uk Kim             return (Status);
854f8146b88SJung-uk Kim         }
855f8146b88SJung-uk Kim 
856f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
857f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
858f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
859f8146b88SJung-uk Kim 
860f8146b88SJung-uk Kim         NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
861f8146b88SJung-uk Kim 
862f8146b88SJung-uk Kim         switch (NfitHeader->Type)
863f8146b88SJung-uk Kim         {
864f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
865f8146b88SJung-uk Kim 
866f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit0;
867f8146b88SJung-uk Kim             break;
868f8146b88SJung-uk Kim 
869f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_MEMORY_MAP:
870f8146b88SJung-uk Kim 
871f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit1;
872f8146b88SJung-uk Kim             break;
873f8146b88SJung-uk Kim 
874f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_INTERLEAVE:
875f8146b88SJung-uk Kim 
876f8146b88SJung-uk Kim             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer);
877f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit2;
878f8146b88SJung-uk Kim             break;
879f8146b88SJung-uk Kim 
880f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_SMBIOS:
881f8146b88SJung-uk Kim 
882f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit3;
883f8146b88SJung-uk Kim             break;
884f8146b88SJung-uk Kim 
885f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_CONTROL_REGION:
886f8146b88SJung-uk Kim 
887f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit4;
888f8146b88SJung-uk Kim             break;
889f8146b88SJung-uk Kim 
890f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_DATA_REGION:
891f8146b88SJung-uk Kim 
892f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit5;
893f8146b88SJung-uk Kim             break;
894f8146b88SJung-uk Kim 
895f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
896f8146b88SJung-uk Kim 
897f8146b88SJung-uk Kim             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer);
898f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit6;
899f8146b88SJung-uk Kim             break;
900f8146b88SJung-uk Kim 
901b7b7e711SJung-uk Kim         case ACPI_NFIT_TYPE_CAPABILITIES:
902b7b7e711SJung-uk Kim 
903b7b7e711SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit7;
904b7b7e711SJung-uk Kim             break;
905b7b7e711SJung-uk Kim 
906f8146b88SJung-uk Kim         default:
907f8146b88SJung-uk Kim 
908f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT");
909f8146b88SJung-uk Kim             return (AE_ERROR);
910f8146b88SJung-uk Kim         }
911f8146b88SJung-uk Kim 
912ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
913f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
914f8146b88SJung-uk Kim         {
915f8146b88SJung-uk Kim             return (Status);
916f8146b88SJung-uk Kim         }
917f8146b88SJung-uk Kim 
918f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
919f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
920f8146b88SJung-uk Kim         DtPopSubtable ();
921f8146b88SJung-uk Kim 
922f8146b88SJung-uk Kim         switch (NfitHeader->Type)
923f8146b88SJung-uk Kim         {
924f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_INTERLEAVE:
925f8146b88SJung-uk Kim 
926f8146b88SJung-uk Kim             Count = 0;
927f8146b88SJung-uk Kim             DtPushSubtable (Subtable);
928f8146b88SJung-uk Kim             while (*PFieldList)
929f8146b88SJung-uk Kim             {
930f8146b88SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a,
931ff879b07SJung-uk Kim                     &Subtable);
932f8146b88SJung-uk Kim                 if (ACPI_FAILURE (Status))
933f8146b88SJung-uk Kim                 {
934f8146b88SJung-uk Kim                     return (Status);
935f8146b88SJung-uk Kim                 }
936f8146b88SJung-uk Kim 
937f8146b88SJung-uk Kim                 if (!Subtable)
938f8146b88SJung-uk Kim                 {
939f8146b88SJung-uk Kim                     DtPopSubtable ();
940f8146b88SJung-uk Kim                     break;
941f8146b88SJung-uk Kim                 }
942f8146b88SJung-uk Kim 
943f8146b88SJung-uk Kim                 ParentTable = DtPeekSubtable ();
944f8146b88SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
945f8146b88SJung-uk Kim                 Count++;
946f8146b88SJung-uk Kim             }
947f8146b88SJung-uk Kim 
948f8146b88SJung-uk Kim             Interleave->LineCount = Count;
949f8146b88SJung-uk Kim             break;
950f8146b88SJung-uk Kim 
951f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_SMBIOS:
952f8146b88SJung-uk Kim 
953f8146b88SJung-uk Kim             if (*PFieldList)
954f8146b88SJung-uk Kim             {
955f8146b88SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a,
956ff879b07SJung-uk Kim                     &Subtable);
957f8146b88SJung-uk Kim                 if (ACPI_FAILURE (Status))
958f8146b88SJung-uk Kim                 {
959f8146b88SJung-uk Kim                     return (Status);
960f8146b88SJung-uk Kim                 }
961f8146b88SJung-uk Kim 
962f8146b88SJung-uk Kim                 if (Subtable)
963f8146b88SJung-uk Kim                 {
964f8146b88SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
965f8146b88SJung-uk Kim                 }
966f8146b88SJung-uk Kim             }
967f8146b88SJung-uk Kim             break;
968f8146b88SJung-uk Kim 
969f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
970f8146b88SJung-uk Kim 
971f8146b88SJung-uk Kim             Count = 0;
972f8146b88SJung-uk Kim             DtPushSubtable (Subtable);
973f8146b88SJung-uk Kim             while (*PFieldList)
974f8146b88SJung-uk Kim             {
975f8146b88SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a,
976ff879b07SJung-uk Kim                     &Subtable);
977f8146b88SJung-uk Kim                 if (ACPI_FAILURE (Status))
978f8146b88SJung-uk Kim                 {
979f8146b88SJung-uk Kim                     return (Status);
980f8146b88SJung-uk Kim                 }
981f8146b88SJung-uk Kim 
982f8146b88SJung-uk Kim                 if (!Subtable)
983f8146b88SJung-uk Kim                 {
984f8146b88SJung-uk Kim                     DtPopSubtable ();
985f8146b88SJung-uk Kim                     break;
986f8146b88SJung-uk Kim                 }
987f8146b88SJung-uk Kim 
988f8146b88SJung-uk Kim                 ParentTable = DtPeekSubtable ();
989f8146b88SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
990f8146b88SJung-uk Kim                 Count++;
991f8146b88SJung-uk Kim             }
992f8146b88SJung-uk Kim 
993f8146b88SJung-uk Kim             Hint->HintCount = (UINT16) Count;
994f8146b88SJung-uk Kim             break;
995f8146b88SJung-uk Kim 
996f8146b88SJung-uk Kim         default:
997f8146b88SJung-uk Kim             break;
998f8146b88SJung-uk Kim         }
999f8146b88SJung-uk Kim     }
1000f8146b88SJung-uk Kim 
1001f8146b88SJung-uk Kim     return (AE_OK);
1002f8146b88SJung-uk Kim }
1003f8146b88SJung-uk Kim 
1004f8146b88SJung-uk Kim 
1005f8146b88SJung-uk Kim /******************************************************************************
1006f8146b88SJung-uk Kim  *
1007ab71bbb7SJung-uk Kim  * FUNCTION:    DtCompileNhlt
1008ab71bbb7SJung-uk Kim  *
1009ab71bbb7SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1010ab71bbb7SJung-uk Kim  *
1011ab71bbb7SJung-uk Kim  * RETURN:      Status
1012ab71bbb7SJung-uk Kim  *
1013ab71bbb7SJung-uk Kim  * DESCRIPTION: Compile NHLT.
1014ab71bbb7SJung-uk Kim  *
1015ab71bbb7SJung-uk Kim  *****************************************************************************/
1016ab71bbb7SJung-uk Kim 
1017ab71bbb7SJung-uk Kim ACPI_STATUS
DtCompileNhlt(void ** List)1018ab71bbb7SJung-uk Kim DtCompileNhlt (
1019ab71bbb7SJung-uk Kim     void                    **List)
1020ab71bbb7SJung-uk Kim {
1021ab71bbb7SJung-uk Kim     ACPI_STATUS             Status;
1022ab71bbb7SJung-uk Kim     UINT32                  EndpointCount;
1023ab71bbb7SJung-uk Kim     UINT32                  MicrophoneCount;
1024ab71bbb7SJung-uk Kim     UINT32                  FormatsCount;
1025ab71bbb7SJung-uk Kim     DT_SUBTABLE             *Subtable;
1026ab71bbb7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1027ab71bbb7SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1028ab71bbb7SJung-uk Kim     UINT32                  CapabilitiesSize;
1029ab71bbb7SJung-uk Kim     UINT8                   ArrayType;
1030ab71bbb7SJung-uk Kim     UINT8                   ConfigType;
1031ab71bbb7SJung-uk Kim     UINT8                   DeviceInfoCount;
1032ab71bbb7SJung-uk Kim     UINT32                  i;
1033ab71bbb7SJung-uk Kim     UINT32                  j;
1034ab71bbb7SJung-uk Kim     ACPI_TABLE_NHLT_ENDPOINT_COUNT      *MainTable;
1035ab71bbb7SJung-uk Kim     ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A  *DevSpecific;
1036ab71bbb7SJung-uk Kim     ACPI_NHLT_VENDOR_MIC_COUNT          *MicCount;
1037ab71bbb7SJung-uk Kim     ACPI_NHLT_FORMATS_CONFIG            *FormatsConfig;
1038ab71bbb7SJung-uk Kim     ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D  *ConfigSpecific;
1039ab71bbb7SJung-uk Kim     ACPI_NHLT_DEVICE_INFO_COUNT         *DeviceInfo;
10409a4bc520SJung-uk Kim     ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B  *Terminator;
1041ab71bbb7SJung-uk Kim 
1042ab71bbb7SJung-uk Kim 
1043ab71bbb7SJung-uk Kim     /* Main table */
1044ab71bbb7SJung-uk Kim 
1045ab71bbb7SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt,
1046ab71bbb7SJung-uk Kim         &Subtable);
1047ab71bbb7SJung-uk Kim     if (ACPI_FAILURE (Status))
1048ab71bbb7SJung-uk Kim     {
1049ab71bbb7SJung-uk Kim         return (Status);
1050ab71bbb7SJung-uk Kim     }
1051ab71bbb7SJung-uk Kim 
1052ab71bbb7SJung-uk Kim     /* Get the Endpoint Descriptor count */
1053ab71bbb7SJung-uk Kim 
1054ab71bbb7SJung-uk Kim     ParentTable = DtPeekSubtable ();
1055ab71bbb7SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1056ab71bbb7SJung-uk Kim     DtPushSubtable (Subtable);
1057ab71bbb7SJung-uk Kim 
1058ab71bbb7SJung-uk Kim     MainTable = ACPI_CAST_PTR (ACPI_TABLE_NHLT_ENDPOINT_COUNT, Subtable->Buffer);
1059ab71bbb7SJung-uk Kim     EndpointCount = MainTable->EndpointCount;
1060ab71bbb7SJung-uk Kim 
1061ab71bbb7SJung-uk Kim     /* Subtables */
1062ab71bbb7SJung-uk Kim 
1063ab71bbb7SJung-uk Kim     while (*PFieldList)
1064ab71bbb7SJung-uk Kim     {
1065ab71bbb7SJung-uk Kim         /* Variable number of Endpoint descriptors */
1066ab71bbb7SJung-uk Kim 
1067ab71bbb7SJung-uk Kim         for (i = 0; i < EndpointCount; i++)
1068ab71bbb7SJung-uk Kim         {
1069ab71bbb7SJung-uk Kim             /* Do the Endpoint Descriptor */
1070ab71bbb7SJung-uk Kim 
1071ab71bbb7SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt0,
1072ab71bbb7SJung-uk Kim                 &Subtable);
1073ab71bbb7SJung-uk Kim             if (ACPI_FAILURE (Status))
1074ab71bbb7SJung-uk Kim             {
1075ab71bbb7SJung-uk Kim                 return (Status);
1076ab71bbb7SJung-uk Kim             }
1077ab71bbb7SJung-uk Kim 
1078ab71bbb7SJung-uk Kim             ParentTable = DtPeekSubtable ();
1079ab71bbb7SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1080ab71bbb7SJung-uk Kim             DtPushSubtable (Subtable);
1081ab71bbb7SJung-uk Kim 
1082ab71bbb7SJung-uk Kim             /* Do the Device Specific table */
1083ab71bbb7SJung-uk Kim 
1084ab71bbb7SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5b,
1085ab71bbb7SJung-uk Kim                 &Subtable);
1086ab71bbb7SJung-uk Kim             if (ACPI_FAILURE (Status))
1087ab71bbb7SJung-uk Kim             {
1088ab71bbb7SJung-uk Kim                 return (Status);
1089ab71bbb7SJung-uk Kim             }
1090ab71bbb7SJung-uk Kim 
1091ab71bbb7SJung-uk Kim             ParentTable = DtPeekSubtable ();
1092ab71bbb7SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1093ab71bbb7SJung-uk Kim             DtPushSubtable (Subtable);
1094ab71bbb7SJung-uk Kim 
1095ab71bbb7SJung-uk Kim             DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable->Buffer);
1096ab71bbb7SJung-uk Kim             CapabilitiesSize = DevSpecific->CapabilitiesSize;
1097ab71bbb7SJung-uk Kim 
1098ab71bbb7SJung-uk Kim             ArrayType = 0;
1099ab71bbb7SJung-uk Kim             ConfigType = 0;
1100ab71bbb7SJung-uk Kim 
1101ab71bbb7SJung-uk Kim             switch (CapabilitiesSize)
1102ab71bbb7SJung-uk Kim             {
1103ab71bbb7SJung-uk Kim             case 0:
1104ab71bbb7SJung-uk Kim                 break;
1105ab71bbb7SJung-uk Kim 
1106ab71bbb7SJung-uk Kim             case 1:
1107ab71bbb7SJung-uk Kim 
1108ab71bbb7SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5c,
1109ab71bbb7SJung-uk Kim                     &Subtable);
1110ab71bbb7SJung-uk Kim                 if (ACPI_FAILURE (Status))
1111ab71bbb7SJung-uk Kim                 {
1112ab71bbb7SJung-uk Kim                     return (Status);
1113ab71bbb7SJung-uk Kim                 }
1114ab71bbb7SJung-uk Kim 
1115ab71bbb7SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1116ab71bbb7SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1117ab71bbb7SJung-uk Kim                 break;
1118ab71bbb7SJung-uk Kim 
1119ab71bbb7SJung-uk Kim             case 2:
1120ab71bbb7SJung-uk Kim 
1121ab71bbb7SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5,
1122ab71bbb7SJung-uk Kim                     &Subtable);
1123ab71bbb7SJung-uk Kim                 if (ACPI_FAILURE (Status))
1124ab71bbb7SJung-uk Kim                 {
1125ab71bbb7SJung-uk Kim                     return (Status);
1126ab71bbb7SJung-uk Kim                 }
1127ab71bbb7SJung-uk Kim 
1128ab71bbb7SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1129ab71bbb7SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1130ab71bbb7SJung-uk Kim                 break;
1131ab71bbb7SJung-uk Kim 
1132ab71bbb7SJung-uk Kim             case 3:
1133ab71bbb7SJung-uk Kim 
1134ab71bbb7SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5a,
1135ab71bbb7SJung-uk Kim                     &Subtable);
1136ab71bbb7SJung-uk Kim                 if (ACPI_FAILURE (Status))
1137ab71bbb7SJung-uk Kim                 {
1138ab71bbb7SJung-uk Kim                     return (Status);
1139ab71bbb7SJung-uk Kim                 }
1140ab71bbb7SJung-uk Kim 
1141ab71bbb7SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1142ab71bbb7SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1143ab71bbb7SJung-uk Kim 
1144ab71bbb7SJung-uk Kim                 ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer);
1145ab71bbb7SJung-uk Kim                 ArrayType = ConfigSpecific->ArrayType;
1146ab71bbb7SJung-uk Kim                 ConfigType = ConfigSpecific->ConfigType;
1147ab71bbb7SJung-uk Kim                 break;
1148ab71bbb7SJung-uk Kim 
1149ab71bbb7SJung-uk Kim             case 7:
1150ab71bbb7SJung-uk Kim 
1151ab71bbb7SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5,
1152ab71bbb7SJung-uk Kim                     &Subtable);
1153ab71bbb7SJung-uk Kim                 if (ACPI_FAILURE (Status))
1154ab71bbb7SJung-uk Kim                 {
1155ab71bbb7SJung-uk Kim                     return (Status);
1156ab71bbb7SJung-uk Kim                 }
1157ab71bbb7SJung-uk Kim 
1158ab71bbb7SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1159ab71bbb7SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1160ab71bbb7SJung-uk Kim 
1161ab71bbb7SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6b,
1162ab71bbb7SJung-uk Kim                     &Subtable);
1163ab71bbb7SJung-uk Kim                 if (ACPI_FAILURE (Status))
1164ab71bbb7SJung-uk Kim                 {
1165ab71bbb7SJung-uk Kim                     return (Status);
1166ab71bbb7SJung-uk Kim                 }
1167ab71bbb7SJung-uk Kim 
1168ab71bbb7SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1169ab71bbb7SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1170ab71bbb7SJung-uk Kim 
1171ab71bbb7SJung-uk Kim                 ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer);
1172ab71bbb7SJung-uk Kim                 ArrayType = ConfigSpecific->ArrayType;
1173ab71bbb7SJung-uk Kim                 ConfigType = ConfigSpecific->ConfigType;
1174ab71bbb7SJung-uk Kim                 break;
1175ab71bbb7SJung-uk Kim 
1176ab71bbb7SJung-uk Kim             default:
1177ab71bbb7SJung-uk Kim 
1178ab71bbb7SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5a,
1179ab71bbb7SJung-uk Kim                     &Subtable);
1180ab71bbb7SJung-uk Kim                 if (ACPI_FAILURE (Status))
1181ab71bbb7SJung-uk Kim                 {
1182ab71bbb7SJung-uk Kim                     return (Status);
1183ab71bbb7SJung-uk Kim                 }
1184ab71bbb7SJung-uk Kim 
1185ab71bbb7SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1186ab71bbb7SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1187ab71bbb7SJung-uk Kim 
1188ab71bbb7SJung-uk Kim                 ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer);
1189ab71bbb7SJung-uk Kim                 ArrayType = ConfigSpecific->ArrayType;
1190ab71bbb7SJung-uk Kim                 ConfigType = ConfigSpecific->ConfigType;
1191ab71bbb7SJung-uk Kim                 break;
1192ab71bbb7SJung-uk Kim 
1193ab71bbb7SJung-uk Kim             } /* switch (CapabilitiesSize) */
1194ab71bbb7SJung-uk Kim 
1195ab71bbb7SJung-uk Kim             if (CapabilitiesSize >= 3)
1196ab71bbb7SJung-uk Kim             {
1197ab71bbb7SJung-uk Kim                 /* Check for a vendor-defined mic array */
1198ab71bbb7SJung-uk Kim 
1199ab71bbb7SJung-uk Kim                 if (ConfigType == ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY)
1200ab71bbb7SJung-uk Kim                 {
1201ab71bbb7SJung-uk Kim                     if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_MASK) == ACPI_NHLT_VENDOR_DEFINED)
1202ab71bbb7SJung-uk Kim                     {
1203ab71bbb7SJung-uk Kim                         /* Get the microphone count */
1204ab71bbb7SJung-uk Kim 
1205ab71bbb7SJung-uk Kim                         Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6a,
1206ab71bbb7SJung-uk Kim                             &Subtable);
1207ab71bbb7SJung-uk Kim                         if (ACPI_FAILURE (Status))
1208ab71bbb7SJung-uk Kim                         {
1209ab71bbb7SJung-uk Kim                             return (Status);
1210ab71bbb7SJung-uk Kim                         }
1211ab71bbb7SJung-uk Kim 
1212ab71bbb7SJung-uk Kim                         MicCount = ACPI_CAST_PTR (ACPI_NHLT_VENDOR_MIC_COUNT, Subtable->Buffer);
1213ab71bbb7SJung-uk Kim                         MicrophoneCount = MicCount->MicrophoneCount;
1214ab71bbb7SJung-uk Kim 
1215ab71bbb7SJung-uk Kim                         ParentTable = DtPeekSubtable ();
1216ab71bbb7SJung-uk Kim                         DtInsertSubtable (ParentTable, Subtable);
1217ab71bbb7SJung-uk Kim 
1218ab71bbb7SJung-uk Kim                         /* Variable number of microphones */
1219ab71bbb7SJung-uk Kim 
1220ab71bbb7SJung-uk Kim                         for (j = 0; j < MicrophoneCount; j++)
1221ab71bbb7SJung-uk Kim                         {
1222ab71bbb7SJung-uk Kim                             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6,
1223ab71bbb7SJung-uk Kim                                 &Subtable);
1224ab71bbb7SJung-uk Kim                             if (ACPI_FAILURE (Status))
1225ab71bbb7SJung-uk Kim                             {
1226ab71bbb7SJung-uk Kim                                 return (Status);
1227ab71bbb7SJung-uk Kim                             }
1228ab71bbb7SJung-uk Kim 
1229ab71bbb7SJung-uk Kim                             ParentTable = DtPeekSubtable ();
1230ab71bbb7SJung-uk Kim                             DtInsertSubtable (ParentTable, Subtable);
1231ab71bbb7SJung-uk Kim                         }
1232ab71bbb7SJung-uk Kim 
1233ab71bbb7SJung-uk Kim                         /* Do the MIC_SNR_SENSITIVITY_EXTENSION, if present */
1234ab71bbb7SJung-uk Kim 
1235ab71bbb7SJung-uk Kim                         if (ArrayType & ACPI_NHLT_ARRAY_TYPE_EXT_MASK)
1236ab71bbb7SJung-uk Kim                         {
1237ab71bbb7SJung-uk Kim                             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt9,
1238ab71bbb7SJung-uk Kim                                 &Subtable);
1239ab71bbb7SJung-uk Kim                             if (ACPI_FAILURE (Status))
1240ab71bbb7SJung-uk Kim                             {
1241ab71bbb7SJung-uk Kim                                 return (Status);
1242ab71bbb7SJung-uk Kim                             }
1243ab71bbb7SJung-uk Kim 
1244ab71bbb7SJung-uk Kim                             ParentTable = DtPeekSubtable ();
1245ab71bbb7SJung-uk Kim                             DtInsertSubtable (ParentTable, Subtable);
1246ab71bbb7SJung-uk Kim                         }
1247ab71bbb7SJung-uk Kim                     }
1248ab71bbb7SJung-uk Kim                 }
1249ab71bbb7SJung-uk Kim             }
1250ab71bbb7SJung-uk Kim 
1251ab71bbb7SJung-uk Kim             /* Get the formats count */
1252ab71bbb7SJung-uk Kim 
1253ab71bbb7SJung-uk Kim             DtPopSubtable ();
1254ab71bbb7SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt4,
1255ab71bbb7SJung-uk Kim                 &Subtable);
1256ab71bbb7SJung-uk Kim             if (ACPI_FAILURE (Status))
1257ab71bbb7SJung-uk Kim             {
1258ab71bbb7SJung-uk Kim                 return (Status);
1259ab71bbb7SJung-uk Kim             }
1260ab71bbb7SJung-uk Kim 
1261ab71bbb7SJung-uk Kim             ParentTable = DtPeekSubtable ();
1262ab71bbb7SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1263ab71bbb7SJung-uk Kim 
1264ab71bbb7SJung-uk Kim             FormatsConfig = ACPI_CAST_PTR (ACPI_NHLT_FORMATS_CONFIG, Subtable->Buffer);
1265ab71bbb7SJung-uk Kim             FormatsCount = FormatsConfig->FormatsCount;
1266ab71bbb7SJung-uk Kim 
1267ab71bbb7SJung-uk Kim             /* Variable number of wave_format_extensible structs */
1268ab71bbb7SJung-uk Kim 
1269ab71bbb7SJung-uk Kim             for (j = 0; j < FormatsCount; j++)
1270ab71bbb7SJung-uk Kim             {
1271ab71bbb7SJung-uk Kim                 /* Do the main wave_format_extensible structure */
1272ab71bbb7SJung-uk Kim 
1273ab71bbb7SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3,
1274ab71bbb7SJung-uk Kim                     &Subtable);
1275ab71bbb7SJung-uk Kim                 if (ACPI_FAILURE (Status))
1276ab71bbb7SJung-uk Kim                 {
1277ab71bbb7SJung-uk Kim                     return (Status);
1278ab71bbb7SJung-uk Kim                 }
1279ab71bbb7SJung-uk Kim 
1280ab71bbb7SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1281ab71bbb7SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1282ab71bbb7SJung-uk Kim                 DtPushSubtable (Subtable);
1283ab71bbb7SJung-uk Kim 
1284ab71bbb7SJung-uk Kim                 /* Do the capabilities list */
1285ab71bbb7SJung-uk Kim 
1286ab71bbb7SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3a,
1287ab71bbb7SJung-uk Kim                     &Subtable);
1288ab71bbb7SJung-uk Kim                 if (ACPI_FAILURE (Status))
1289ab71bbb7SJung-uk Kim                 {
1290ab71bbb7SJung-uk Kim                     return (Status);
1291ab71bbb7SJung-uk Kim                 }
1292ab71bbb7SJung-uk Kim 
1293ab71bbb7SJung-uk Kim                 DtPopSubtable ();
1294ab71bbb7SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1295ab71bbb7SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1296ab71bbb7SJung-uk Kim 
1297ab71bbb7SJung-uk Kim             } /* for (j = 0; j < FormatsCount; j++) */
1298ab71bbb7SJung-uk Kim 
1299ab71bbb7SJung-uk Kim             /*
1300ab71bbb7SJung-uk Kim              * If we are not done with the current Endpoint yet, then there must be
1301722b1667SJung-uk Kim              * some non documented structure(s) yet to be processed. First, get
1302ab71bbb7SJung-uk Kim              * the count of such structure(s).
1303ab71bbb7SJung-uk Kim              */
13049a4bc520SJung-uk Kim             if (*PFieldList && !(strcmp ((const char *) (*PFieldList)->Name, "Device Info struct count")))
1305ab71bbb7SJung-uk Kim             {
1306ab71bbb7SJung-uk Kim                 /* Get the count of non documented structures */
1307ab71bbb7SJung-uk Kim 
1308ab71bbb7SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7,
1309ab71bbb7SJung-uk Kim                     &Subtable);
1310ab71bbb7SJung-uk Kim                 if (ACPI_FAILURE (Status))
1311ab71bbb7SJung-uk Kim                 {
1312ab71bbb7SJung-uk Kim                     return (Status);
1313ab71bbb7SJung-uk Kim                 }
1314ab71bbb7SJung-uk Kim 
1315ab71bbb7SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1316ab71bbb7SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1317ab71bbb7SJung-uk Kim 
1318ab71bbb7SJung-uk Kim                 DeviceInfo = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_INFO_COUNT, Subtable->Buffer);
1319ab71bbb7SJung-uk Kim                 DeviceInfoCount = DeviceInfo->StructureCount;
1320ab71bbb7SJung-uk Kim 
1321ab71bbb7SJung-uk Kim                 for (j = 0; j < DeviceInfoCount; j++)
1322ab71bbb7SJung-uk Kim                 {
1323ab71bbb7SJung-uk Kim                     /*
1324ab71bbb7SJung-uk Kim                      * Compile the following Device Info fields:
1325ab71bbb7SJung-uk Kim                      *  1) Device ID
1326ab71bbb7SJung-uk Kim                      *  2) Device Instance ID
1327ab71bbb7SJung-uk Kim                      *  3) Device Port ID
1328ab71bbb7SJung-uk Kim                      */
1329ab71bbb7SJung-uk Kim                     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7a,
1330ab71bbb7SJung-uk Kim                         &Subtable);
1331ab71bbb7SJung-uk Kim                     if (ACPI_FAILURE (Status))
1332ab71bbb7SJung-uk Kim                     {
1333ab71bbb7SJung-uk Kim                         return (Status);
1334ab71bbb7SJung-uk Kim                     }
1335ab71bbb7SJung-uk Kim 
1336ab71bbb7SJung-uk Kim                     ParentTable = DtPeekSubtable ();
1337ab71bbb7SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
1338ab71bbb7SJung-uk Kim                 } /* for (j = 0; j < LinuxSpecificCount; j++) */
1339ab71bbb7SJung-uk Kim 
1340ab71bbb7SJung-uk Kim                 /* Undocumented data at the end of endpoint */
13419a4bc520SJung-uk Kim                 if (*PFieldList && !(strcmp ((const char *) (*PFieldList)->Name, "Bytes")))
1342ab71bbb7SJung-uk Kim                 {
1343ab71bbb7SJung-uk Kim                     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7b,
1344ab71bbb7SJung-uk Kim                         &Subtable);
1345ab71bbb7SJung-uk Kim                     if (ACPI_FAILURE (Status))
1346ab71bbb7SJung-uk Kim                     {
1347ab71bbb7SJung-uk Kim                         return (Status);
1348ab71bbb7SJung-uk Kim                     }
1349ab71bbb7SJung-uk Kim 
1350ab71bbb7SJung-uk Kim                     ParentTable = DtPeekSubtable ();
1351ab71bbb7SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
1352ab71bbb7SJung-uk Kim                 }
1353ab71bbb7SJung-uk Kim             }
1354ab71bbb7SJung-uk Kim 
1355ab71bbb7SJung-uk Kim             DtPopSubtable ();
1356ab71bbb7SJung-uk Kim 
1357ab71bbb7SJung-uk Kim         } /* for (i = 0; i < EndpointCount; i++) */
1358ab71bbb7SJung-uk Kim 
1359ab71bbb7SJung-uk Kim         /*
1360ab71bbb7SJung-uk Kim          * All Endpoint Descriptors are completed.
1361ab71bbb7SJung-uk Kim          * Do the table terminator specific config (not in NHLT spec, optional)
1362ab71bbb7SJung-uk Kim          */
13639a4bc520SJung-uk Kim         if (*PFieldList && !(strcmp ((const char *) (*PFieldList)->Name, "Capabilities Size")))
1364ab71bbb7SJung-uk Kim         {
1365ab71bbb7SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5b,
1366ab71bbb7SJung-uk Kim                 &Subtable);
1367ab71bbb7SJung-uk Kim             if (ACPI_FAILURE (Status))
1368ab71bbb7SJung-uk Kim             {
1369ab71bbb7SJung-uk Kim                 return (Status);
1370ab71bbb7SJung-uk Kim             }
1371ab71bbb7SJung-uk Kim 
1372ab71bbb7SJung-uk Kim             ParentTable = DtPeekSubtable ();
1373ab71bbb7SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1374ab71bbb7SJung-uk Kim 
13759a4bc520SJung-uk Kim             Terminator = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B, Subtable->Buffer);
13769a4bc520SJung-uk Kim 
13779a4bc520SJung-uk Kim             if (Terminator->CapabilitiesSize)
13789a4bc520SJung-uk Kim             {
1379ab71bbb7SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3a,
1380ab71bbb7SJung-uk Kim                     &Subtable);
1381ab71bbb7SJung-uk Kim                 if (ACPI_FAILURE (Status))
1382ab71bbb7SJung-uk Kim                 {
1383ab71bbb7SJung-uk Kim                     return (Status);
1384ab71bbb7SJung-uk Kim                 }
1385ab71bbb7SJung-uk Kim 
1386ab71bbb7SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1387ab71bbb7SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1388ab71bbb7SJung-uk Kim             }
13899a4bc520SJung-uk Kim         }
1390ab71bbb7SJung-uk Kim 
1391ab71bbb7SJung-uk Kim         return (AE_OK);
1392ab71bbb7SJung-uk Kim     }
1393ab71bbb7SJung-uk Kim 
1394ab71bbb7SJung-uk Kim     return (AE_OK);
1395ab71bbb7SJung-uk Kim }
1396ab71bbb7SJung-uk Kim 
1397ab71bbb7SJung-uk Kim 
1398ab71bbb7SJung-uk Kim /******************************************************************************
1399ab71bbb7SJung-uk Kim  *
1400f8146b88SJung-uk Kim  * FUNCTION:    DtCompilePcct
1401f8146b88SJung-uk Kim  *
1402f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1403f8146b88SJung-uk Kim  *
1404f8146b88SJung-uk Kim  * RETURN:      Status
1405f8146b88SJung-uk Kim  *
1406f8146b88SJung-uk Kim  * DESCRIPTION: Compile PCCT.
1407f8146b88SJung-uk Kim  *
1408f8146b88SJung-uk Kim  *****************************************************************************/
1409f8146b88SJung-uk Kim 
1410f8146b88SJung-uk Kim ACPI_STATUS
DtCompilePcct(void ** List)1411f8146b88SJung-uk Kim DtCompilePcct (
1412f8146b88SJung-uk Kim     void                    **List)
1413f8146b88SJung-uk Kim {
1414f8146b88SJung-uk Kim     ACPI_STATUS             Status;
1415f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
1416f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1417f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1418f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
1419f8146b88SJung-uk Kim     ACPI_SUBTABLE_HEADER    *PcctHeader;
1420f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1421f8146b88SJung-uk Kim 
1422f8146b88SJung-uk Kim 
1423f8146b88SJung-uk Kim     /* Main table */
1424f8146b88SJung-uk Kim 
1425f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
1426ff879b07SJung-uk Kim         &Subtable);
1427f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
1428f8146b88SJung-uk Kim     {
1429f8146b88SJung-uk Kim         return (Status);
1430f8146b88SJung-uk Kim     }
1431f8146b88SJung-uk Kim 
1432f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
1433f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1434f8146b88SJung-uk Kim 
1435f8146b88SJung-uk Kim     /* Subtables */
1436f8146b88SJung-uk Kim 
1437f8146b88SJung-uk Kim     while (*PFieldList)
1438f8146b88SJung-uk Kim     {
1439f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
1440f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
1441ff879b07SJung-uk Kim             &Subtable);
1442f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
1443f8146b88SJung-uk Kim         {
1444f8146b88SJung-uk Kim             return (Status);
1445f8146b88SJung-uk Kim         }
1446f8146b88SJung-uk Kim 
1447f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
1448f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1449f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
1450f8146b88SJung-uk Kim 
1451f8146b88SJung-uk Kim         PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1452f8146b88SJung-uk Kim 
1453f8146b88SJung-uk Kim         switch (PcctHeader->Type)
1454f8146b88SJung-uk Kim         {
1455f8146b88SJung-uk Kim         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
1456f8146b88SJung-uk Kim 
1457f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct0;
1458f8146b88SJung-uk Kim             break;
1459f8146b88SJung-uk Kim 
1460f8146b88SJung-uk Kim         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
1461f8146b88SJung-uk Kim 
1462f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct1;
1463f8146b88SJung-uk Kim             break;
1464f8146b88SJung-uk Kim 
1465f8146b88SJung-uk Kim         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
1466f8146b88SJung-uk Kim 
1467f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct2;
1468f8146b88SJung-uk Kim             break;
1469f8146b88SJung-uk Kim 
1470af051161SJung-uk Kim         case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
1471af051161SJung-uk Kim 
1472af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct3;
1473af051161SJung-uk Kim             break;
1474af051161SJung-uk Kim 
1475af051161SJung-uk Kim         case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
1476af051161SJung-uk Kim 
1477af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct4;
1478af051161SJung-uk Kim             break;
1479af051161SJung-uk Kim 
1480cfd1ed46SJung-uk Kim         case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
1481cfd1ed46SJung-uk Kim 
1482cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct5;
1483cfd1ed46SJung-uk Kim             break;
1484cfd1ed46SJung-uk Kim 
1485f8146b88SJung-uk Kim         default:
1486f8146b88SJung-uk Kim 
1487f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
1488f8146b88SJung-uk Kim             return (AE_ERROR);
1489f8146b88SJung-uk Kim         }
1490f8146b88SJung-uk Kim 
1491ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
1492f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
1493f8146b88SJung-uk Kim         {
1494f8146b88SJung-uk Kim             return (Status);
1495f8146b88SJung-uk Kim         }
1496f8146b88SJung-uk Kim 
1497f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
1498f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1499f8146b88SJung-uk Kim         DtPopSubtable ();
1500f8146b88SJung-uk Kim     }
1501f8146b88SJung-uk Kim 
1502f8146b88SJung-uk Kim     return (AE_OK);
1503f8146b88SJung-uk Kim }
1504f8146b88SJung-uk Kim 
1505f8146b88SJung-uk Kim 
1506f8146b88SJung-uk Kim /******************************************************************************
1507f8146b88SJung-uk Kim  *
150867d9aa44SJung-uk Kim  * FUNCTION:    DtCompilePdtt
150967d9aa44SJung-uk Kim  *
151067d9aa44SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
151167d9aa44SJung-uk Kim  *
151267d9aa44SJung-uk Kim  * RETURN:      Status
151367d9aa44SJung-uk Kim  *
151467d9aa44SJung-uk Kim  * DESCRIPTION: Compile PDTT.
151567d9aa44SJung-uk Kim  *
151667d9aa44SJung-uk Kim  *****************************************************************************/
151767d9aa44SJung-uk Kim 
151867d9aa44SJung-uk Kim ACPI_STATUS
DtCompilePdtt(void ** List)151967d9aa44SJung-uk Kim DtCompilePdtt (
152067d9aa44SJung-uk Kim     void                    **List)
152167d9aa44SJung-uk Kim {
152267d9aa44SJung-uk Kim     ACPI_STATUS             Status;
152367d9aa44SJung-uk Kim     DT_SUBTABLE             *Subtable;
152467d9aa44SJung-uk Kim     DT_SUBTABLE             *ParentTable;
152567d9aa44SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
152667d9aa44SJung-uk Kim     ACPI_TABLE_PDTT         *PdttHeader;
152767d9aa44SJung-uk Kim     UINT32                  Count = 0;
152867d9aa44SJung-uk Kim 
152967d9aa44SJung-uk Kim 
153067d9aa44SJung-uk Kim     /* Main table */
153167d9aa44SJung-uk Kim 
1532ff879b07SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt, &Subtable);
153367d9aa44SJung-uk Kim     if (ACPI_FAILURE (Status))
153467d9aa44SJung-uk Kim     {
153567d9aa44SJung-uk Kim         return (Status);
153667d9aa44SJung-uk Kim     }
153767d9aa44SJung-uk Kim 
153867d9aa44SJung-uk Kim     ParentTable = DtPeekSubtable ();
153967d9aa44SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
154067d9aa44SJung-uk Kim 
154167d9aa44SJung-uk Kim     PdttHeader = ACPI_CAST_PTR (ACPI_TABLE_PDTT, ParentTable->Buffer);
154267d9aa44SJung-uk Kim     PdttHeader->ArrayOffset = sizeof (ACPI_TABLE_PDTT);
154367d9aa44SJung-uk Kim 
154467d9aa44SJung-uk Kim     /* There is only one type of subtable at this time, no need to decode */
154567d9aa44SJung-uk Kim 
154667d9aa44SJung-uk Kim     while (*PFieldList)
154767d9aa44SJung-uk Kim     {
154867d9aa44SJung-uk Kim         /* List of subchannel IDs, each 2 bytes */
154967d9aa44SJung-uk Kim 
155067d9aa44SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt0,
1551ff879b07SJung-uk Kim             &Subtable);
155267d9aa44SJung-uk Kim         if (ACPI_FAILURE (Status))
155367d9aa44SJung-uk Kim         {
155467d9aa44SJung-uk Kim             return (Status);
155567d9aa44SJung-uk Kim         }
155667d9aa44SJung-uk Kim 
155767d9aa44SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
155867d9aa44SJung-uk Kim         Count++;
155967d9aa44SJung-uk Kim     }
156067d9aa44SJung-uk Kim 
156167d9aa44SJung-uk Kim     PdttHeader->TriggerCount = (UINT8) Count;
156267d9aa44SJung-uk Kim     return (AE_OK);
156367d9aa44SJung-uk Kim }
156467d9aa44SJung-uk Kim 
156567d9aa44SJung-uk Kim 
156667d9aa44SJung-uk Kim /******************************************************************************
156767d9aa44SJung-uk Kim  *
1568cfd1ed46SJung-uk Kim  * FUNCTION:    DtCompilePhat
1569cfd1ed46SJung-uk Kim  *
1570cfd1ed46SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1571cfd1ed46SJung-uk Kim  *
1572cfd1ed46SJung-uk Kim  * RETURN:      Status
1573cfd1ed46SJung-uk Kim  *
1574cfd1ed46SJung-uk Kim  * DESCRIPTION: Compile Phat.
1575cfd1ed46SJung-uk Kim  *
1576cfd1ed46SJung-uk Kim  *****************************************************************************/
1577cfd1ed46SJung-uk Kim 
1578cfd1ed46SJung-uk Kim ACPI_STATUS
DtCompilePhat(void ** List)1579cfd1ed46SJung-uk Kim DtCompilePhat (
1580cfd1ed46SJung-uk Kim     void                    **List)
1581cfd1ed46SJung-uk Kim {
1582cfd1ed46SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
1583cfd1ed46SJung-uk Kim     DT_SUBTABLE             *Subtable;
1584cfd1ed46SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1585cfd1ed46SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1586cfd1ed46SJung-uk Kim     ACPI_PHAT_HEADER        *PhatHeader;
1587cfd1ed46SJung-uk Kim     ACPI_DMTABLE_INFO       *Info;
1588cfd1ed46SJung-uk Kim     ACPI_PHAT_VERSION_DATA  *VersionData;
15899a4bc520SJung-uk Kim     UINT32                  DeviceDataLength;
1590cfd1ed46SJung-uk Kim     UINT32                  RecordCount;
15919a4bc520SJung-uk Kim     DT_FIELD                *DataOffsetField;
15929a4bc520SJung-uk Kim     DT_FIELD                *DevicePathField;
15939a4bc520SJung-uk Kim     UINT32                  TableOffset = 0;
15949a4bc520SJung-uk Kim     UINT32                  DataOffsetValue;
15959a4bc520SJung-uk Kim     UINT32                  i;
1596cfd1ed46SJung-uk Kim 
1597cfd1ed46SJung-uk Kim 
15989a4bc520SJung-uk Kim     /* The table consists of subtables */
1599cfd1ed46SJung-uk Kim 
1600cfd1ed46SJung-uk Kim     while (*PFieldList)
1601cfd1ed46SJung-uk Kim     {
16029a4bc520SJung-uk Kim         /* Compile the common subtable header */
16039a4bc520SJung-uk Kim 
1604cfd1ed46SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable);
1605cfd1ed46SJung-uk Kim         if (ACPI_FAILURE (Status))
1606cfd1ed46SJung-uk Kim         {
1607cfd1ed46SJung-uk Kim             return (Status);
1608cfd1ed46SJung-uk Kim         }
1609cfd1ed46SJung-uk Kim 
16109a4bc520SJung-uk Kim         TableOffset += Subtable->Length;
16119a4bc520SJung-uk Kim         DbgPrint (ASL_DEBUG_OUTPUT, "0 Subtable->Length: %X\n", Subtable->Length);
16129a4bc520SJung-uk Kim 
1613cfd1ed46SJung-uk Kim         ParentTable = DtPeekSubtable ();
1614cfd1ed46SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1615cfd1ed46SJung-uk Kim         DtPushSubtable (Subtable);
1616cfd1ed46SJung-uk Kim 
1617cfd1ed46SJung-uk Kim         PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer);
1618cfd1ed46SJung-uk Kim 
1619cfd1ed46SJung-uk Kim         switch (PhatHeader->Type)
1620cfd1ed46SJung-uk Kim         {
1621cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
1622cfd1ed46SJung-uk Kim 
16239a4bc520SJung-uk Kim             /* Compile the middle portion of the Firmware Version Data */
16249a4bc520SJung-uk Kim 
1625cfd1ed46SJung-uk Kim             Info = AcpiDmTableInfoPhat0;
1626cfd1ed46SJung-uk Kim             PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA);
16279a4bc520SJung-uk Kim             DataOffsetField = NULL;
1628cfd1ed46SJung-uk Kim             break;
1629cfd1ed46SJung-uk Kim 
1630cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
1631cfd1ed46SJung-uk Kim 
16329a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "1 Offset: %X, Name: \"%s\" Length: %X\n",
16339a4bc520SJung-uk Kim                 (*PFieldList)->TableOffset, (*PFieldList)->Name, Subtable->Length);
16349a4bc520SJung-uk Kim 
16359a4bc520SJung-uk Kim             DataOffsetField = *PFieldList;
16369a4bc520SJung-uk Kim 
16379a4bc520SJung-uk Kim             /* Walk the field list to get to the "Device-specific data Offset" field */
16389a4bc520SJung-uk Kim 
16399a4bc520SJung-uk Kim             TableOffset = sizeof (ACPI_PHAT_HEALTH_DATA);
16409a4bc520SJung-uk Kim             for (i = 0; i < 3; i++)
16419a4bc520SJung-uk Kim             {
16429a4bc520SJung-uk Kim                 DataOffsetField = DataOffsetField->Next;
16439a4bc520SJung-uk Kim                 DbgPrint (ASL_DEBUG_OUTPUT, "2 Offset: %X, Name: \"%s\" Length: %X Value: %s:\n",
16449a4bc520SJung-uk Kim                     TableOffset, DataOffsetField->Name, DataOffsetField->StringLength, DataOffsetField->Value);
16459a4bc520SJung-uk Kim             }
16469a4bc520SJung-uk Kim 
16479a4bc520SJung-uk Kim             /* Convert DataOffsetField->Value (a char * string) to an integer value */
16489a4bc520SJung-uk Kim 
16499a4bc520SJung-uk Kim             sscanf (DataOffsetField->Value, "%X", &DataOffsetValue);
16509a4bc520SJung-uk Kim 
16519a4bc520SJung-uk Kim             /*
16529a4bc520SJung-uk Kim              * Get the next field (Device Path):
16539a4bc520SJung-uk Kim              * DataOffsetField points to "Device-Specific Offset", next field is
16549a4bc520SJung-uk Kim              * "Device Path".
16559a4bc520SJung-uk Kim              */
16569a4bc520SJung-uk Kim             DevicePathField = DataOffsetField->Next;
16579a4bc520SJung-uk Kim 
16589a4bc520SJung-uk Kim             /* Compute the size of the input ASCII string as a unicode string (*2 + 2) */
16599a4bc520SJung-uk Kim 
16609a4bc520SJung-uk Kim             DevicePathField->StringLength = (strlen ((const char *) DevicePathField->Value) * 2) + 2;
16619a4bc520SJung-uk Kim             TableOffset += DevicePathField->StringLength;
16629a4bc520SJung-uk Kim 
16639a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "3 Offset: %X, Length: %X devicepathLength: %X\n",
16649a4bc520SJung-uk Kim                 TableOffset, Subtable->Length, DevicePathField->StringLength);
16659a4bc520SJung-uk Kim 
16669a4bc520SJung-uk Kim             /* Set the DataOffsetField to the current TableOffset */
16679a4bc520SJung-uk Kim             /* Must set the DataOffsetField here (not later) */
16689a4bc520SJung-uk Kim 
16699a4bc520SJung-uk Kim             if (DataOffsetValue != 0)
16709a4bc520SJung-uk Kim             {
16719a4bc520SJung-uk Kim                 snprintf (DataOffsetField->Value, Subtable->Length, "%X", TableOffset);
16729a4bc520SJung-uk Kim             }
16739a4bc520SJung-uk Kim 
16749a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "4 Offset: %X, Length: %X\n", TableOffset, Subtable->Length);
16759a4bc520SJung-uk Kim 
16769a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "5 TableOffset: %X, DataOffsetField->StringLength: "
16779a4bc520SJung-uk Kim                 "%X DevicePathField Length: %X DevicePathField->Value: %s, DataOffsetField->Value: %s DataOffsetField->ByteOffset %X\n",
16789a4bc520SJung-uk Kim                 TableOffset, DataOffsetField->StringLength, DevicePathField->StringLength,
16799a4bc520SJung-uk Kim                 DevicePathField->Value, DataOffsetField->Value, DataOffsetField->ByteOffset);
16809a4bc520SJung-uk Kim 
16819a4bc520SJung-uk Kim             /* Compile the middle portion of the Health Data Record */
16829a4bc520SJung-uk Kim 
1683cfd1ed46SJung-uk Kim             Info = AcpiDmTableInfoPhat1;
1684cfd1ed46SJung-uk Kim             PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA);
1685cfd1ed46SJung-uk Kim             break;
1686cfd1ed46SJung-uk Kim 
1687cfd1ed46SJung-uk Kim         default:
1688cfd1ed46SJung-uk Kim 
1689cfd1ed46SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
1690cfd1ed46SJung-uk Kim             return (AE_ERROR);
1691cfd1ed46SJung-uk Kim         }
1692cfd1ed46SJung-uk Kim 
16939a4bc520SJung-uk Kim         /* Compile either the Version Data or the Health Data */
16949a4bc520SJung-uk Kim 
1695cfd1ed46SJung-uk Kim         Status = DtCompileTable (PFieldList, Info, &Subtable);
1696cfd1ed46SJung-uk Kim         if (ACPI_FAILURE (Status))
1697cfd1ed46SJung-uk Kim         {
1698cfd1ed46SJung-uk Kim             return (Status);
1699cfd1ed46SJung-uk Kim         }
1700cfd1ed46SJung-uk Kim 
17019a4bc520SJung-uk Kim         DbgPrint (ASL_DEBUG_OUTPUT, "6 Offset: %X, Name: \"%s\" SubtableLength: %X\n",
17029a4bc520SJung-uk Kim             TableOffset /* - StartTableOffset*/, (*PFieldList)->Name, Subtable->Length);
17039a4bc520SJung-uk Kim 
1704cfd1ed46SJung-uk Kim         ParentTable = DtPeekSubtable ();
1705cfd1ed46SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1706cfd1ed46SJung-uk Kim 
1707cfd1ed46SJung-uk Kim         switch (PhatHeader->Type)
1708cfd1ed46SJung-uk Kim         {
1709cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
1710cfd1ed46SJung-uk Kim 
1711cfd1ed46SJung-uk Kim             VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA,
1712cfd1ed46SJung-uk Kim                 (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER)));
1713cfd1ed46SJung-uk Kim             RecordCount = VersionData->ElementCount;
1714cfd1ed46SJung-uk Kim 
17159a4bc520SJung-uk Kim             /* Compile all of the Version Elements */
17169a4bc520SJung-uk Kim 
1717cfd1ed46SJung-uk Kim             while (RecordCount)
1718cfd1ed46SJung-uk Kim             {
1719cfd1ed46SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a,
1720cfd1ed46SJung-uk Kim                     &Subtable);
1721cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
1722cfd1ed46SJung-uk Kim                 {
1723cfd1ed46SJung-uk Kim                     return (Status);
1724cfd1ed46SJung-uk Kim                 }
17259a4bc520SJung-uk Kim 
1726cfd1ed46SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1727cfd1ed46SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1728cfd1ed46SJung-uk Kim 
17299a4bc520SJung-uk Kim                 TableOffset += Subtable->Length;
1730cfd1ed46SJung-uk Kim                 RecordCount--;
1731cfd1ed46SJung-uk Kim                 PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT);
1732cfd1ed46SJung-uk Kim             }
17339a4bc520SJung-uk Kim 
17349a4bc520SJung-uk Kim             DtPopSubtable ();
1735cfd1ed46SJung-uk Kim             break;
1736cfd1ed46SJung-uk Kim 
1737cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
1738cfd1ed46SJung-uk Kim 
17399a4bc520SJung-uk Kim             /* Compile the Device Path */
17409a4bc520SJung-uk Kim 
17419a4bc520SJung-uk Kim             DeviceDataLength = Subtable->Length;
17429a4bc520SJung-uk Kim             TableOffset += Subtable->Length;
17439a4bc520SJung-uk Kim 
17449a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "7 Device Path Length: %X FieldName: \"%s\" FieldLength: "
17459a4bc520SJung-uk Kim                 "%s FieldValue: %s SubtableLength: %X TableOffset: %X\n", DeviceDataLength,
17469a4bc520SJung-uk Kim                 (*PFieldList)->Name, DataOffsetField->Value, (*PFieldList)->Value,
17479a4bc520SJung-uk Kim                 Subtable->Length, TableOffset);
1748cfd1ed46SJung-uk Kim 
1749cfd1ed46SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable);
1750cfd1ed46SJung-uk Kim             if (ACPI_FAILURE (Status))
1751cfd1ed46SJung-uk Kim             {
1752cfd1ed46SJung-uk Kim                 return (Status);
1753cfd1ed46SJung-uk Kim             }
1754cfd1ed46SJung-uk Kim             ParentTable = DtPeekSubtable ();
1755cfd1ed46SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1756cfd1ed46SJung-uk Kim 
17579a4bc520SJung-uk Kim             /* *PFieldList will be null if previous field was at the end-of-ParseTree (EOF) */
17589a4bc520SJung-uk Kim 
17599a4bc520SJung-uk Kim             if (!*PFieldList)
17609a4bc520SJung-uk Kim             {
17619a4bc520SJung-uk Kim                 DbgPrint (ASL_DEBUG_OUTPUT, "8 Exit on end-of-ParseTree\n");
17629a4bc520SJung-uk Kim                 return (AE_OK);
17639a4bc520SJung-uk Kim             }
17649a4bc520SJung-uk Kim 
17659a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "9 Device Data Length: %X FieldName: \"%s"
17669a4bc520SJung-uk Kim                 " TableOffset: %X FieldLength: %X Field Value: %s SubtableLength: %X\n",
17679a4bc520SJung-uk Kim                 DeviceDataLength, (*PFieldList)->Name, TableOffset,
17689a4bc520SJung-uk Kim                 (*PFieldList)->StringLength, (*PFieldList)->Value, Subtable->Length);
17699a4bc520SJung-uk Kim 
1770cfd1ed46SJung-uk Kim             PhatHeader->Length += (UINT16) Subtable->Length;
1771cfd1ed46SJung-uk Kim 
17729a4bc520SJung-uk Kim             /* Convert DataOffsetField->Value (a hex char * string) to an integer value */
17739a4bc520SJung-uk Kim 
17749a4bc520SJung-uk Kim             sscanf (DataOffsetField->Value, "%X", &DataOffsetValue);
17759a4bc520SJung-uk Kim 
17769a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "10 Device-Specific Offset: %X Table Offset: %X\n",
17779a4bc520SJung-uk Kim                 DataOffsetValue, TableOffset);
17789a4bc520SJung-uk Kim             if (DataOffsetValue != 0)
17799a4bc520SJung-uk Kim             {
17809a4bc520SJung-uk Kim                 /* Compile Device-Specific Data - only if the Data Offset is non-zero */
1781cfd1ed46SJung-uk Kim 
1782cfd1ed46SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable);
1783cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
1784cfd1ed46SJung-uk Kim                 {
1785cfd1ed46SJung-uk Kim                     return (Status);
1786cfd1ed46SJung-uk Kim                 }
17879a4bc520SJung-uk Kim 
17889a4bc520SJung-uk Kim                 DbgPrint (ASL_DEBUG_OUTPUT, "11 Subtable: %p Table Offset: %X\n",
17899a4bc520SJung-uk Kim                     Subtable, TableOffset);
17909a4bc520SJung-uk Kim                 if (Subtable)
17919a4bc520SJung-uk Kim                 {
17929a4bc520SJung-uk Kim                     DbgPrint (ASL_DEBUG_OUTPUT, "12 Device Specific Offset: "
17939a4bc520SJung-uk Kim                         "%X FieldName \"%s\" SubtableLength %X\n",
17949a4bc520SJung-uk Kim                         DeviceDataLength, DataOffsetField->Name, Subtable->Length);
17959a4bc520SJung-uk Kim 
17969a4bc520SJung-uk Kim                     DeviceDataLength += Subtable->Length;
17979a4bc520SJung-uk Kim 
1798cfd1ed46SJung-uk Kim                     ParentTable = DtPeekSubtable ();
1799cfd1ed46SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
1800cfd1ed46SJung-uk Kim 
1801cfd1ed46SJung-uk Kim                     PhatHeader->Length += (UINT16) Subtable->Length;
18029a4bc520SJung-uk Kim                 }
18039a4bc520SJung-uk Kim             }
1804cfd1ed46SJung-uk Kim 
18059a4bc520SJung-uk Kim             DtPopSubtable ();
18069a4bc520SJung-uk Kim 
18079a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "13 FieldName: \"%s\" FieldLength: %X Field Value: %s\n",
18089a4bc520SJung-uk Kim                 DataOffsetField->Name, DataOffsetField->StringLength, DataOffsetField->Value);
1809cfd1ed46SJung-uk Kim             break;
1810cfd1ed46SJung-uk Kim 
1811cfd1ed46SJung-uk Kim         default:
1812cfd1ed46SJung-uk Kim 
1813cfd1ed46SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
1814cfd1ed46SJung-uk Kim             return (AE_ERROR);
1815cfd1ed46SJung-uk Kim         }
1816cfd1ed46SJung-uk Kim     }
1817cfd1ed46SJung-uk Kim 
1818cfd1ed46SJung-uk Kim     return (Status);
1819cfd1ed46SJung-uk Kim }
1820cfd1ed46SJung-uk Kim 
1821cfd1ed46SJung-uk Kim 
1822cfd1ed46SJung-uk Kim /******************************************************************************
1823cfd1ed46SJung-uk Kim  *
1824f8146b88SJung-uk Kim  * FUNCTION:    DtCompilePmtt
1825f8146b88SJung-uk Kim  *
1826f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1827f8146b88SJung-uk Kim  *
1828f8146b88SJung-uk Kim  * RETURN:      Status
1829f8146b88SJung-uk Kim  *
1830f8146b88SJung-uk Kim  * DESCRIPTION: Compile PMTT.
1831f8146b88SJung-uk Kim  *
1832f8146b88SJung-uk Kim  *****************************************************************************/
1833f8146b88SJung-uk Kim 
1834f8146b88SJung-uk Kim ACPI_STATUS
DtCompilePmtt(void ** List)1835f8146b88SJung-uk Kim DtCompilePmtt (
1836f8146b88SJung-uk Kim     void                    **List)
1837f8146b88SJung-uk Kim {
1838f8146b88SJung-uk Kim     ACPI_STATUS             Status;
1839f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
1840f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1841f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1842f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
1843cfd1ed46SJung-uk Kim     UINT16                  Type;
1844f8146b88SJung-uk Kim 
1845f8146b88SJung-uk Kim 
1846f8146b88SJung-uk Kim     /* Main table */
1847f8146b88SJung-uk Kim 
1848ff879b07SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable);
1849f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
1850f8146b88SJung-uk Kim     {
1851f8146b88SJung-uk Kim         return (Status);
1852f8146b88SJung-uk Kim     }
1853f8146b88SJung-uk Kim 
1854f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
1855f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1856f8146b88SJung-uk Kim     DtPushSubtable (Subtable);
1857f8146b88SJung-uk Kim 
1858cfd1ed46SJung-uk Kim     /* Subtables */
1859cfd1ed46SJung-uk Kim 
1860f8146b88SJung-uk Kim     while (*PFieldList)
1861f8146b88SJung-uk Kim     {
1862f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
1863cfd1ed46SJung-uk Kim         DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
1864f8146b88SJung-uk Kim 
1865cfd1ed46SJung-uk Kim         switch (Type)
1866f8146b88SJung-uk Kim         {
1867f8146b88SJung-uk Kim         case ACPI_PMTT_TYPE_SOCKET:
1868f8146b88SJung-uk Kim 
1869f8146b88SJung-uk Kim             /* Subtable: Socket Structure */
1870f8146b88SJung-uk Kim 
1871cfd1ed46SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_SOCKET (0)\n");
1872cfd1ed46SJung-uk Kim 
1873f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
1874ff879b07SJung-uk Kim                 &Subtable);
1875f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
1876f8146b88SJung-uk Kim             {
1877f8146b88SJung-uk Kim                 return (Status);
1878f8146b88SJung-uk Kim             }
1879f8146b88SJung-uk Kim 
1880f8146b88SJung-uk Kim             break;
1881f8146b88SJung-uk Kim 
1882f8146b88SJung-uk Kim         case ACPI_PMTT_TYPE_CONTROLLER:
1883f8146b88SJung-uk Kim 
1884f8146b88SJung-uk Kim             /* Subtable: Memory Controller Structure */
1885f8146b88SJung-uk Kim 
1886cfd1ed46SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_CONTROLLER (1)\n");
1887cfd1ed46SJung-uk Kim 
1888f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
1889ff879b07SJung-uk Kim                 &Subtable);
1890f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
1891f8146b88SJung-uk Kim             {
1892f8146b88SJung-uk Kim                 return (Status);
1893f8146b88SJung-uk Kim             }
1894f8146b88SJung-uk Kim 
1895f8146b88SJung-uk Kim             break;
1896f8146b88SJung-uk Kim 
1897f8146b88SJung-uk Kim         case ACPI_PMTT_TYPE_DIMM:
1898f8146b88SJung-uk Kim 
1899cfd1ed46SJung-uk Kim             /* Subtable: Physical Component (DIMM) Structure */
1900f8146b88SJung-uk Kim 
1901cfd1ed46SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_DIMM (2)\n");
1902f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
1903ff879b07SJung-uk Kim                 &Subtable);
1904f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
1905f8146b88SJung-uk Kim             {
1906f8146b88SJung-uk Kim                 return (Status);
1907f8146b88SJung-uk Kim             }
1908f8146b88SJung-uk Kim 
1909cfd1ed46SJung-uk Kim             break;
1910cfd1ed46SJung-uk Kim 
1911cfd1ed46SJung-uk Kim         case ACPI_PMTT_TYPE_VENDOR:
1912cfd1ed46SJung-uk Kim 
1913cfd1ed46SJung-uk Kim             /* Subtable: Vendor-specific Structure */
1914cfd1ed46SJung-uk Kim 
1915cfd1ed46SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_VENDOR(FF)\n");
1916cfd1ed46SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttVendor,
1917cfd1ed46SJung-uk Kim                 &Subtable);
1918cfd1ed46SJung-uk Kim             if (ACPI_FAILURE (Status))
1919cfd1ed46SJung-uk Kim             {
1920cfd1ed46SJung-uk Kim                 return (Status);
1921cfd1ed46SJung-uk Kim             }
1922cfd1ed46SJung-uk Kim 
1923f8146b88SJung-uk Kim             break;
1924f8146b88SJung-uk Kim 
1925f8146b88SJung-uk Kim         default:
1926f8146b88SJung-uk Kim 
1927f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
1928f8146b88SJung-uk Kim             return (AE_ERROR);
1929f8146b88SJung-uk Kim         }
1930cfd1ed46SJung-uk Kim 
1931cfd1ed46SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1932f8146b88SJung-uk Kim     }
1933f8146b88SJung-uk Kim 
1934f8146b88SJung-uk Kim     return (Status);
1935f8146b88SJung-uk Kim }
1936f8146b88SJung-uk Kim 
1937f8146b88SJung-uk Kim 
1938f8146b88SJung-uk Kim /******************************************************************************
1939f8146b88SJung-uk Kim  *
1940af051161SJung-uk Kim  * FUNCTION:    DtCompilePptt
1941af051161SJung-uk Kim  *
1942af051161SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1943af051161SJung-uk Kim  *
1944af051161SJung-uk Kim  * RETURN:      Status
1945af051161SJung-uk Kim  *
1946af051161SJung-uk Kim  * DESCRIPTION: Compile PPTT.
1947af051161SJung-uk Kim  *
1948af051161SJung-uk Kim  *****************************************************************************/
1949af051161SJung-uk Kim 
1950af051161SJung-uk Kim ACPI_STATUS
DtCompilePptt(void ** List)1951af051161SJung-uk Kim DtCompilePptt (
1952af051161SJung-uk Kim     void                    **List)
1953af051161SJung-uk Kim {
1954af051161SJung-uk Kim     ACPI_STATUS             Status;
1955af051161SJung-uk Kim     ACPI_SUBTABLE_HEADER    *PpttHeader;
1956af051161SJung-uk Kim     ACPI_PPTT_PROCESSOR     *PpttProcessor = NULL;
1957af051161SJung-uk Kim     DT_SUBTABLE             *Subtable;
1958af051161SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1959af051161SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1960af051161SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1961af051161SJung-uk Kim     DT_FIELD                *SubtableStart;
1962cfd1ed46SJung-uk Kim     ACPI_TABLE_HEADER       *PpttAcpiHeader;
1963af051161SJung-uk Kim 
1964af051161SJung-uk Kim 
1965af051161SJung-uk Kim     ParentTable = DtPeekSubtable ();
1966af051161SJung-uk Kim     while (*PFieldList)
1967af051161SJung-uk Kim     {
1968af051161SJung-uk Kim         SubtableStart = *PFieldList;
1969af051161SJung-uk Kim 
1970af051161SJung-uk Kim         /* Compile PPTT subtable header */
1971af051161SJung-uk Kim 
1972af051161SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPpttHdr,
1973ff879b07SJung-uk Kim             &Subtable);
1974af051161SJung-uk Kim         if (ACPI_FAILURE (Status))
1975af051161SJung-uk Kim         {
1976af051161SJung-uk Kim             return (Status);
1977af051161SJung-uk Kim         }
1978af051161SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1979af051161SJung-uk Kim         PpttHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1980af051161SJung-uk Kim         PpttHeader->Length = (UINT8)(Subtable->Length);
1981af051161SJung-uk Kim 
1982af051161SJung-uk Kim         switch (PpttHeader->Type)
1983af051161SJung-uk Kim         {
1984af051161SJung-uk Kim         case ACPI_PPTT_TYPE_PROCESSOR:
1985af051161SJung-uk Kim 
1986af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoPptt0;
1987af051161SJung-uk Kim             break;
1988af051161SJung-uk Kim 
1989af051161SJung-uk Kim         case ACPI_PPTT_TYPE_CACHE:
1990af051161SJung-uk Kim 
1991af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoPptt1;
1992af051161SJung-uk Kim             break;
1993af051161SJung-uk Kim 
1994af051161SJung-uk Kim         case ACPI_PPTT_TYPE_ID:
1995af051161SJung-uk Kim 
1996af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoPptt2;
1997af051161SJung-uk Kim             break;
1998af051161SJung-uk Kim 
1999af051161SJung-uk Kim         default:
2000af051161SJung-uk Kim 
2001af051161SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PPTT");
2002af051161SJung-uk Kim             return (AE_ERROR);
2003af051161SJung-uk Kim         }
2004af051161SJung-uk Kim 
2005af051161SJung-uk Kim         /* Compile PPTT subtable body */
2006af051161SJung-uk Kim 
2007ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
2008af051161SJung-uk Kim         if (ACPI_FAILURE (Status))
2009af051161SJung-uk Kim         {
2010af051161SJung-uk Kim             return (Status);
2011af051161SJung-uk Kim         }
2012af051161SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2013af051161SJung-uk Kim         PpttHeader->Length += (UINT8)(Subtable->Length);
2014af051161SJung-uk Kim 
2015722b1667SJung-uk Kim         /* Compile PPTT subtable additional */
2016af051161SJung-uk Kim 
2017af051161SJung-uk Kim         switch (PpttHeader->Type)
2018af051161SJung-uk Kim         {
2019af051161SJung-uk Kim         case ACPI_PPTT_TYPE_PROCESSOR:
2020af051161SJung-uk Kim 
2021af051161SJung-uk Kim             PpttProcessor = ACPI_SUB_PTR (ACPI_PPTT_PROCESSOR,
2022af051161SJung-uk Kim                 Subtable->Buffer, sizeof (ACPI_SUBTABLE_HEADER));
2023af051161SJung-uk Kim             if (PpttProcessor)
2024af051161SJung-uk Kim             {
2025af051161SJung-uk Kim                 /* Compile initiator proximity domain list */
2026af051161SJung-uk Kim 
2027af051161SJung-uk Kim                 PpttProcessor->NumberOfPrivResources = 0;
2028af051161SJung-uk Kim                 while (*PFieldList)
2029af051161SJung-uk Kim                 {
2030af051161SJung-uk Kim                     Status = DtCompileTable (PFieldList,
2031ff879b07SJung-uk Kim                         AcpiDmTableInfoPptt0a, &Subtable);
2032af051161SJung-uk Kim                     if (ACPI_FAILURE (Status))
2033af051161SJung-uk Kim                     {
2034af051161SJung-uk Kim                         return (Status);
2035af051161SJung-uk Kim                     }
2036af051161SJung-uk Kim                     if (!Subtable)
2037af051161SJung-uk Kim                     {
2038af051161SJung-uk Kim                         break;
2039af051161SJung-uk Kim                     }
2040af051161SJung-uk Kim 
2041af051161SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
2042af051161SJung-uk Kim                     PpttHeader->Length += (UINT8)(Subtable->Length);
2043af051161SJung-uk Kim                     PpttProcessor->NumberOfPrivResources++;
2044af051161SJung-uk Kim                 }
2045af051161SJung-uk Kim             }
2046af051161SJung-uk Kim             break;
2047af051161SJung-uk Kim 
2048cfd1ed46SJung-uk Kim         case ACPI_PPTT_TYPE_CACHE:
2049cfd1ed46SJung-uk Kim 
2050cfd1ed46SJung-uk Kim             PpttAcpiHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
2051cfd1ed46SJung-uk Kim                 AslGbl_RootTable->Buffer);
2052cfd1ed46SJung-uk Kim             if (PpttAcpiHeader->Revision < 3)
2053cfd1ed46SJung-uk Kim             {
2054cfd1ed46SJung-uk Kim                 break;
2055cfd1ed46SJung-uk Kim             }
2056cfd1ed46SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPptt1a,
2057cfd1ed46SJung-uk Kim                 &Subtable);
2058cfd1ed46SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
2059cfd1ed46SJung-uk Kim             PpttHeader->Length += (UINT8)(Subtable->Length);
2060cfd1ed46SJung-uk Kim             break;
2061cfd1ed46SJung-uk Kim 
2062af051161SJung-uk Kim         default:
2063af051161SJung-uk Kim 
2064af051161SJung-uk Kim             break;
2065af051161SJung-uk Kim         }
2066af051161SJung-uk Kim     }
2067af051161SJung-uk Kim 
2068af051161SJung-uk Kim     return (AE_OK);
2069af051161SJung-uk Kim }
2070af051161SJung-uk Kim 
2071af051161SJung-uk Kim 
2072af051161SJung-uk Kim /******************************************************************************
2073af051161SJung-uk Kim  *
20741970d693SJung-uk Kim  * FUNCTION:    DtCompilePrmt
20751970d693SJung-uk Kim  *
20761970d693SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
20771970d693SJung-uk Kim  *
20781970d693SJung-uk Kim  * RETURN:      Status
20791970d693SJung-uk Kim  *
20801970d693SJung-uk Kim  * DESCRIPTION: Compile PRMT.
20811970d693SJung-uk Kim  *
20821970d693SJung-uk Kim  *****************************************************************************/
20831970d693SJung-uk Kim 
20841970d693SJung-uk Kim ACPI_STATUS
DtCompilePrmt(void ** List)20851970d693SJung-uk Kim DtCompilePrmt (
20861970d693SJung-uk Kim     void                    **List)
20871970d693SJung-uk Kim {
20881970d693SJung-uk Kim     ACPI_STATUS             Status;
20891970d693SJung-uk Kim     ACPI_TABLE_PRMT_HEADER  *PrmtHeader;
20901970d693SJung-uk Kim     ACPI_PRMT_MODULE_INFO   *PrmtModuleInfo;
20911970d693SJung-uk Kim     DT_SUBTABLE             *Subtable;
20921970d693SJung-uk Kim     DT_SUBTABLE             *ParentTable;
20931970d693SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
20941970d693SJung-uk Kim     UINT32                  i, j;
20951970d693SJung-uk Kim 
20961970d693SJung-uk Kim     ParentTable = DtPeekSubtable ();
20971970d693SJung-uk Kim 
20981970d693SJung-uk Kim     /* Compile PRMT subtable header */
20991970d693SJung-uk Kim 
21001970d693SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHdr,
21011970d693SJung-uk Kim         &Subtable);
21021970d693SJung-uk Kim     if (ACPI_FAILURE (Status))
21031970d693SJung-uk Kim     {
21041970d693SJung-uk Kim         return (Status);
21051970d693SJung-uk Kim     }
21061970d693SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
21071970d693SJung-uk Kim     PrmtHeader = ACPI_CAST_PTR (ACPI_TABLE_PRMT_HEADER, Subtable->Buffer);
21081970d693SJung-uk Kim 
21091970d693SJung-uk Kim     for (i = 0; i < PrmtHeader->ModuleInfoCount; i++)
21101970d693SJung-uk Kim     {
21111970d693SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtModule,
21121970d693SJung-uk Kim             &Subtable);
21131970d693SJung-uk Kim         if (ACPI_FAILURE (Status))
21141970d693SJung-uk Kim         {
21151970d693SJung-uk Kim             return (Status);
21161970d693SJung-uk Kim         }
21171970d693SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
21181970d693SJung-uk Kim         PrmtModuleInfo = ACPI_CAST_PTR (ACPI_PRMT_MODULE_INFO, Subtable->Buffer);
21191970d693SJung-uk Kim 
21201970d693SJung-uk Kim         for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; j++)
21211970d693SJung-uk Kim         {
21221970d693SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHandler,
21231970d693SJung-uk Kim                 &Subtable);
21241970d693SJung-uk Kim             if (ACPI_FAILURE (Status))
21251970d693SJung-uk Kim             {
21261970d693SJung-uk Kim                 return (Status);
21271970d693SJung-uk Kim             }
21281970d693SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
21291970d693SJung-uk Kim         }
21301970d693SJung-uk Kim     }
21311970d693SJung-uk Kim 
21321970d693SJung-uk Kim     return (AE_OK);
21331970d693SJung-uk Kim }
21341970d693SJung-uk Kim 
21351970d693SJung-uk Kim 
21361970d693SJung-uk Kim /******************************************************************************
21371970d693SJung-uk Kim  *
21381970d693SJung-uk Kim  * FUNCTION:    DtCompileRgrt
21391970d693SJung-uk Kim  *
21401970d693SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
21411970d693SJung-uk Kim  *
21421970d693SJung-uk Kim  * RETURN:      Status
21431970d693SJung-uk Kim  *
21441970d693SJung-uk Kim  * DESCRIPTION: Compile RGRT.
21451970d693SJung-uk Kim  *
21461970d693SJung-uk Kim  *****************************************************************************/
21471970d693SJung-uk Kim 
21481970d693SJung-uk Kim ACPI_STATUS
DtCompileRgrt(void ** List)21491970d693SJung-uk Kim DtCompileRgrt (
21501970d693SJung-uk Kim     void                    **List)
21511970d693SJung-uk Kim {
21521970d693SJung-uk Kim     ACPI_STATUS             Status;
21531970d693SJung-uk Kim     DT_SUBTABLE             *Subtable;
21541970d693SJung-uk Kim     DT_SUBTABLE             *ParentTable;
21551970d693SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
21561970d693SJung-uk Kim 
21571970d693SJung-uk Kim 
21581970d693SJung-uk Kim     /* Compile the main table */
21591970d693SJung-uk Kim 
21601970d693SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt,
21611970d693SJung-uk Kim         &Subtable);
21621970d693SJung-uk Kim     if (ACPI_FAILURE (Status))
21631970d693SJung-uk Kim     {
21641970d693SJung-uk Kim         return (Status);
21651970d693SJung-uk Kim     }
21661970d693SJung-uk Kim 
21671970d693SJung-uk Kim     ParentTable = DtPeekSubtable ();
21681970d693SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
21691970d693SJung-uk Kim 
21701970d693SJung-uk Kim     /* Compile the "Subtable" -- actually just the binary (PNG) image */
21711970d693SJung-uk Kim 
21721970d693SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt0,
21731970d693SJung-uk Kim         &Subtable);
21741970d693SJung-uk Kim     if (ACPI_FAILURE (Status))
21751970d693SJung-uk Kim     {
21761970d693SJung-uk Kim         return (Status);
21771970d693SJung-uk Kim     }
21781970d693SJung-uk Kim 
21791970d693SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
21801970d693SJung-uk Kim     return (AE_OK);
21811970d693SJung-uk Kim }
21821970d693SJung-uk Kim 
21831970d693SJung-uk Kim 
21841970d693SJung-uk Kim /******************************************************************************
21851970d693SJung-uk Kim  *
2186722b1667SJung-uk Kim  * FUNCTION:    DtCompileRhct
2187722b1667SJung-uk Kim  *
2188722b1667SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2189722b1667SJung-uk Kim  *
2190722b1667SJung-uk Kim  * RETURN:      Status
2191722b1667SJung-uk Kim  *
2192722b1667SJung-uk Kim  * DESCRIPTION: Compile RHCT.
2193722b1667SJung-uk Kim  *
2194722b1667SJung-uk Kim  *****************************************************************************/
2195722b1667SJung-uk Kim 
2196722b1667SJung-uk Kim ACPI_STATUS
DtCompileRhct(void ** List)2197722b1667SJung-uk Kim DtCompileRhct (
2198722b1667SJung-uk Kim     void                    **List)
2199722b1667SJung-uk Kim {
2200722b1667SJung-uk Kim     ACPI_STATUS             Status;
2201722b1667SJung-uk Kim     ACPI_RHCT_NODE_HEADER   *RhctHeader;
2202722b1667SJung-uk Kim     ACPI_RHCT_HART_INFO     *RhctHartInfo = NULL;
2203722b1667SJung-uk Kim     DT_SUBTABLE             *Subtable;
2204722b1667SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2205722b1667SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
2206722b1667SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2207722b1667SJung-uk Kim     DT_FIELD                *SubtableStart;
2208722b1667SJung-uk Kim 
2209722b1667SJung-uk Kim 
2210722b1667SJung-uk Kim     /* Compile the main table */
2211722b1667SJung-uk Kim 
2212722b1667SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRhct,
2213722b1667SJung-uk Kim         &Subtable);
2214722b1667SJung-uk Kim     if (ACPI_FAILURE (Status))
2215722b1667SJung-uk Kim     {
2216722b1667SJung-uk Kim         return (Status);
2217722b1667SJung-uk Kim     }
2218722b1667SJung-uk Kim 
2219722b1667SJung-uk Kim     ParentTable = DtPeekSubtable ();
2220722b1667SJung-uk Kim     while (*PFieldList)
2221722b1667SJung-uk Kim     {
2222722b1667SJung-uk Kim         SubtableStart = *PFieldList;
2223722b1667SJung-uk Kim 
2224722b1667SJung-uk Kim         /* Compile RHCT subtable header */
2225722b1667SJung-uk Kim 
2226722b1667SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoRhctNodeHdr,
2227722b1667SJung-uk Kim             &Subtable);
2228722b1667SJung-uk Kim         if (ACPI_FAILURE (Status))
2229722b1667SJung-uk Kim         {
2230722b1667SJung-uk Kim             return (Status);
2231722b1667SJung-uk Kim         }
2232722b1667SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2233722b1667SJung-uk Kim         RhctHeader = ACPI_CAST_PTR (ACPI_RHCT_NODE_HEADER, Subtable->Buffer);
2234722b1667SJung-uk Kim         RhctHeader->Length = (UINT16)(Subtable->Length);
2235722b1667SJung-uk Kim 
2236722b1667SJung-uk Kim         switch (RhctHeader->Type)
2237722b1667SJung-uk Kim         {
2238722b1667SJung-uk Kim         case ACPI_RHCT_NODE_TYPE_ISA_STRING:
2239722b1667SJung-uk Kim 
2240722b1667SJung-uk Kim             InfoTable = AcpiDmTableInfoRhctIsa1;
2241722b1667SJung-uk Kim             break;
2242722b1667SJung-uk Kim 
2243722b1667SJung-uk Kim         case ACPI_RHCT_NODE_TYPE_HART_INFO:
2244722b1667SJung-uk Kim 
2245722b1667SJung-uk Kim             InfoTable = AcpiDmTableInfoRhctHartInfo1;
2246722b1667SJung-uk Kim             break;
2247722b1667SJung-uk Kim 
224807c64d74SJung-uk Kim         case ACPI_RHCT_NODE_TYPE_CMO:
224907c64d74SJung-uk Kim 
225007c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoRhctCmo1;
225107c64d74SJung-uk Kim             break;
225207c64d74SJung-uk Kim 
225307c64d74SJung-uk Kim         case ACPI_RHCT_NODE_TYPE_MMU:
225407c64d74SJung-uk Kim 
225507c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoRhctMmu1;
225607c64d74SJung-uk Kim             break;
225707c64d74SJung-uk Kim 
2258722b1667SJung-uk Kim         default:
2259722b1667SJung-uk Kim 
2260722b1667SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "RHCT");
2261722b1667SJung-uk Kim             return (AE_ERROR);
2262722b1667SJung-uk Kim         }
2263722b1667SJung-uk Kim 
2264722b1667SJung-uk Kim         /* Compile RHCT subtable body */
2265722b1667SJung-uk Kim 
2266722b1667SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
2267722b1667SJung-uk Kim         if (ACPI_FAILURE (Status))
2268722b1667SJung-uk Kim         {
2269722b1667SJung-uk Kim             return (Status);
2270722b1667SJung-uk Kim         }
2271722b1667SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2272722b1667SJung-uk Kim         RhctHeader->Length += (UINT16)(Subtable->Length);
2273722b1667SJung-uk Kim 
2274722b1667SJung-uk Kim         /* Compile RHCT subtable additionals */
2275722b1667SJung-uk Kim 
2276722b1667SJung-uk Kim         switch (RhctHeader->Type)
2277722b1667SJung-uk Kim         {
2278722b1667SJung-uk Kim         case ACPI_RHCT_NODE_TYPE_HART_INFO:
2279722b1667SJung-uk Kim 
2280722b1667SJung-uk Kim             RhctHartInfo = ACPI_SUB_PTR (ACPI_RHCT_HART_INFO,
2281722b1667SJung-uk Kim                 Subtable->Buffer, sizeof (ACPI_RHCT_NODE_HEADER));
2282722b1667SJung-uk Kim             if (RhctHartInfo)
2283722b1667SJung-uk Kim             {
2284722b1667SJung-uk Kim 
2285722b1667SJung-uk Kim                 RhctHartInfo->NumOffsets = 0;
2286722b1667SJung-uk Kim                 while (*PFieldList)
2287722b1667SJung-uk Kim                 {
2288722b1667SJung-uk Kim                     Status = DtCompileTable (PFieldList,
2289722b1667SJung-uk Kim                         AcpiDmTableInfoRhctHartInfo2, &Subtable);
2290722b1667SJung-uk Kim                     if (ACPI_FAILURE (Status))
2291722b1667SJung-uk Kim                     {
2292722b1667SJung-uk Kim                         return (Status);
2293722b1667SJung-uk Kim                     }
2294722b1667SJung-uk Kim                     if (!Subtable)
2295722b1667SJung-uk Kim                     {
2296722b1667SJung-uk Kim                         break;
2297722b1667SJung-uk Kim                     }
2298722b1667SJung-uk Kim 
2299722b1667SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
2300722b1667SJung-uk Kim                     RhctHeader->Length += (UINT16)(Subtable->Length);
2301722b1667SJung-uk Kim                     RhctHartInfo->NumOffsets++;
2302722b1667SJung-uk Kim                 }
2303722b1667SJung-uk Kim             }
2304722b1667SJung-uk Kim             break;
2305722b1667SJung-uk Kim 
2306722b1667SJung-uk Kim         default:
2307722b1667SJung-uk Kim 
2308722b1667SJung-uk Kim             break;
2309722b1667SJung-uk Kim         }
2310722b1667SJung-uk Kim     }
2311722b1667SJung-uk Kim 
2312722b1667SJung-uk Kim     return (AE_OK);
2313722b1667SJung-uk Kim }
2314722b1667SJung-uk Kim 
2315722b1667SJung-uk Kim 
2316722b1667SJung-uk Kim /******************************************************************************
2317722b1667SJung-uk Kim  *
2318f8146b88SJung-uk Kim  * FUNCTION:    DtCompileRsdt
2319f8146b88SJung-uk Kim  *
2320f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2321f8146b88SJung-uk Kim  *
2322f8146b88SJung-uk Kim  * RETURN:      Status
2323f8146b88SJung-uk Kim  *
2324f8146b88SJung-uk Kim  * DESCRIPTION: Compile RSDT.
2325f8146b88SJung-uk Kim  *
2326f8146b88SJung-uk Kim  *****************************************************************************/
2327f8146b88SJung-uk Kim 
2328f8146b88SJung-uk Kim ACPI_STATUS
DtCompileRsdt(void ** List)2329f8146b88SJung-uk Kim DtCompileRsdt (
2330f8146b88SJung-uk Kim     void                    **List)
2331f8146b88SJung-uk Kim {
2332f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2333f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2334f8146b88SJung-uk Kim     DT_FIELD                *FieldList = *(DT_FIELD **) List;
2335f8146b88SJung-uk Kim     UINT32                  Address;
2336f8146b88SJung-uk Kim 
2337f8146b88SJung-uk Kim 
2338f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2339f8146b88SJung-uk Kim 
2340f8146b88SJung-uk Kim     while (FieldList)
2341f8146b88SJung-uk Kim     {
2342f8146b88SJung-uk Kim         DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
2343f8146b88SJung-uk Kim 
2344f8146b88SJung-uk Kim         DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
2345f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2346f8146b88SJung-uk Kim         FieldList = FieldList->Next;
2347f8146b88SJung-uk Kim     }
2348f8146b88SJung-uk Kim 
2349f8146b88SJung-uk Kim     return (AE_OK);
2350f8146b88SJung-uk Kim }
2351f8146b88SJung-uk Kim 
2352f8146b88SJung-uk Kim 
2353f8146b88SJung-uk Kim /******************************************************************************
2354f8146b88SJung-uk Kim  *
2355f8146b88SJung-uk Kim  * FUNCTION:    DtCompileS3pt
2356f8146b88SJung-uk Kim  *
2357f8146b88SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
2358f8146b88SJung-uk Kim  *
2359f8146b88SJung-uk Kim  * RETURN:      Status
2360f8146b88SJung-uk Kim  *
2361f8146b88SJung-uk Kim  * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
2362f8146b88SJung-uk Kim  *
2363f8146b88SJung-uk Kim  *****************************************************************************/
2364f8146b88SJung-uk Kim 
2365f8146b88SJung-uk Kim ACPI_STATUS
DtCompileS3pt(DT_FIELD ** PFieldList)2366f8146b88SJung-uk Kim DtCompileS3pt (
2367f8146b88SJung-uk Kim     DT_FIELD                **PFieldList)
2368f8146b88SJung-uk Kim {
2369f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2370f8146b88SJung-uk Kim     ACPI_FPDT_HEADER        *S3ptHeader;
2371f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2372f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2373f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
2374f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
2375f8146b88SJung-uk Kim 
2376f8146b88SJung-uk Kim 
2377f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
23786f1f1a63SJung-uk Kim         &AslGbl_RootTable);
2379f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2380f8146b88SJung-uk Kim     {
2381f8146b88SJung-uk Kim         return (Status);
2382f8146b88SJung-uk Kim     }
2383f8146b88SJung-uk Kim 
23846f1f1a63SJung-uk Kim     DtPushSubtable (AslGbl_RootTable);
2385f8146b88SJung-uk Kim 
2386f8146b88SJung-uk Kim     while (*PFieldList)
2387f8146b88SJung-uk Kim     {
2388f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
2389f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
2390ff879b07SJung-uk Kim             &Subtable);
2391f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2392f8146b88SJung-uk Kim         {
2393f8146b88SJung-uk Kim             return (Status);
2394f8146b88SJung-uk Kim         }
2395f8146b88SJung-uk Kim 
2396f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2397f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2398f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
2399f8146b88SJung-uk Kim 
2400f8146b88SJung-uk Kim         S3ptHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
2401f8146b88SJung-uk Kim 
2402f8146b88SJung-uk Kim         switch (S3ptHeader->Type)
2403f8146b88SJung-uk Kim         {
2404f8146b88SJung-uk Kim         case ACPI_S3PT_TYPE_RESUME:
2405f8146b88SJung-uk Kim 
2406f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoS3pt0;
2407f8146b88SJung-uk Kim             break;
2408f8146b88SJung-uk Kim 
2409f8146b88SJung-uk Kim         case ACPI_S3PT_TYPE_SUSPEND:
2410f8146b88SJung-uk Kim 
2411f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoS3pt1;
2412f8146b88SJung-uk Kim             break;
2413f8146b88SJung-uk Kim 
2414f8146b88SJung-uk Kim         default:
2415f8146b88SJung-uk Kim 
2416f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
2417f8146b88SJung-uk Kim             return (AE_ERROR);
2418f8146b88SJung-uk Kim         }
2419f8146b88SJung-uk Kim 
2420ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
2421f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2422f8146b88SJung-uk Kim         {
2423f8146b88SJung-uk Kim             return (Status);
2424f8146b88SJung-uk Kim         }
2425f8146b88SJung-uk Kim 
2426f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2427f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2428f8146b88SJung-uk Kim         DtPopSubtable ();
2429f8146b88SJung-uk Kim     }
2430f8146b88SJung-uk Kim 
2431f8146b88SJung-uk Kim     return (AE_OK);
2432f8146b88SJung-uk Kim }
2433f8146b88SJung-uk Kim 
2434f8146b88SJung-uk Kim 
2435f8146b88SJung-uk Kim /******************************************************************************
2436f8146b88SJung-uk Kim  *
243767d9aa44SJung-uk Kim  * FUNCTION:    DtCompileSdev
243867d9aa44SJung-uk Kim  *
243967d9aa44SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
244067d9aa44SJung-uk Kim  *
244167d9aa44SJung-uk Kim  * RETURN:      Status
244267d9aa44SJung-uk Kim  *
244367d9aa44SJung-uk Kim  * DESCRIPTION: Compile SDEV.
244467d9aa44SJung-uk Kim  *
244567d9aa44SJung-uk Kim  *****************************************************************************/
244667d9aa44SJung-uk Kim 
244767d9aa44SJung-uk Kim ACPI_STATUS
DtCompileSdev(void ** List)244867d9aa44SJung-uk Kim DtCompileSdev (
244967d9aa44SJung-uk Kim     void                    **List)
245067d9aa44SJung-uk Kim {
245167d9aa44SJung-uk Kim     ACPI_STATUS                 Status;
245267d9aa44SJung-uk Kim     ACPI_SDEV_HEADER            *SdevHeader;
2453cfd1ed46SJung-uk Kim     ACPI_SDEV_HEADER            *SecureComponentHeader;
245467d9aa44SJung-uk Kim     DT_SUBTABLE                 *Subtable;
245567d9aa44SJung-uk Kim     DT_SUBTABLE                 *ParentTable;
245667d9aa44SJung-uk Kim     ACPI_DMTABLE_INFO           *InfoTable;
2457cfd1ed46SJung-uk Kim     ACPI_DMTABLE_INFO           *SecureComponentInfoTable = NULL;
245867d9aa44SJung-uk Kim     DT_FIELD                    **PFieldList = (DT_FIELD **) List;
245967d9aa44SJung-uk Kim     DT_FIELD                    *SubtableStart;
246067d9aa44SJung-uk Kim     ACPI_SDEV_PCIE              *Pcie = NULL;
246167d9aa44SJung-uk Kim     ACPI_SDEV_NAMESPACE         *Namesp = NULL;
246267d9aa44SJung-uk Kim     UINT32                      EntryCount;
2463cfd1ed46SJung-uk Kim     ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
2464cfd1ed46SJung-uk Kim     UINT16                      ComponentLength = 0;
246567d9aa44SJung-uk Kim 
246667d9aa44SJung-uk Kim 
246767d9aa44SJung-uk Kim     /* Subtables */
246867d9aa44SJung-uk Kim 
246967d9aa44SJung-uk Kim     while (*PFieldList)
247067d9aa44SJung-uk Kim     {
247167d9aa44SJung-uk Kim         /* Compile common SDEV subtable header */
247267d9aa44SJung-uk Kim 
247367d9aa44SJung-uk Kim         SubtableStart = *PFieldList;
247467d9aa44SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevHdr,
2475ff879b07SJung-uk Kim             &Subtable);
247667d9aa44SJung-uk Kim         if (ACPI_FAILURE (Status))
247767d9aa44SJung-uk Kim         {
247867d9aa44SJung-uk Kim             return (Status);
247967d9aa44SJung-uk Kim         }
248067d9aa44SJung-uk Kim 
248167d9aa44SJung-uk Kim         ParentTable = DtPeekSubtable ();
248267d9aa44SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
248367d9aa44SJung-uk Kim         DtPushSubtable (Subtable);
248467d9aa44SJung-uk Kim 
248567d9aa44SJung-uk Kim         SdevHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
248667d9aa44SJung-uk Kim         SdevHeader->Length = (UINT8)(sizeof (ACPI_SDEV_HEADER));
248767d9aa44SJung-uk Kim 
248867d9aa44SJung-uk Kim         switch (SdevHeader->Type)
248967d9aa44SJung-uk Kim         {
249067d9aa44SJung-uk Kim         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
249167d9aa44SJung-uk Kim 
249267d9aa44SJung-uk Kim             InfoTable = AcpiDmTableInfoSdev0;
249367d9aa44SJung-uk Kim             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer);
2494cfd1ed46SJung-uk Kim             SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
2495cfd1ed46SJung-uk Kim                 ACPI_ADD_PTR (UINT8, Subtable->Buffer, sizeof(ACPI_SDEV_NAMESPACE)));
249667d9aa44SJung-uk Kim             break;
249767d9aa44SJung-uk Kim 
249867d9aa44SJung-uk Kim         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
249967d9aa44SJung-uk Kim 
250067d9aa44SJung-uk Kim             InfoTable = AcpiDmTableInfoSdev1;
250167d9aa44SJung-uk Kim             Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable->Buffer);
250267d9aa44SJung-uk Kim             break;
250367d9aa44SJung-uk Kim 
250467d9aa44SJung-uk Kim         default:
250567d9aa44SJung-uk Kim 
250667d9aa44SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
250767d9aa44SJung-uk Kim             return (AE_ERROR);
250867d9aa44SJung-uk Kim         }
250967d9aa44SJung-uk Kim 
251067d9aa44SJung-uk Kim         /* Compile SDEV subtable body */
251167d9aa44SJung-uk Kim 
2512ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
251367d9aa44SJung-uk Kim         if (ACPI_FAILURE (Status))
251467d9aa44SJung-uk Kim         {
251567d9aa44SJung-uk Kim             return (Status);
251667d9aa44SJung-uk Kim         }
251767d9aa44SJung-uk Kim 
251867d9aa44SJung-uk Kim         ParentTable = DtPeekSubtable ();
251967d9aa44SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
252067d9aa44SJung-uk Kim 
252167d9aa44SJung-uk Kim         /* Optional data fields are appended to the main subtable body */
252267d9aa44SJung-uk Kim 
252367d9aa44SJung-uk Kim         switch (SdevHeader->Type)
252467d9aa44SJung-uk Kim         {
252567d9aa44SJung-uk Kim         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
252667d9aa44SJung-uk Kim 
2527cfd1ed46SJung-uk Kim             /*
2528cfd1ed46SJung-uk Kim              * Device Id Offset will be be calculated differently depending on
2529cfd1ed46SJung-uk Kim              * the presence of secure access components.
2530cfd1ed46SJung-uk Kim              */
2531cfd1ed46SJung-uk Kim             Namesp->DeviceIdOffset = 0;
2532cfd1ed46SJung-uk Kim             ComponentLength = 0;
2533cfd1ed46SJung-uk Kim 
2534cfd1ed46SJung-uk Kim             /* If the secure access component exists, get the structures */
2535cfd1ed46SJung-uk Kim 
2536cfd1ed46SJung-uk Kim             if (SdevHeader->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
2537cfd1ed46SJung-uk Kim             {
2538cfd1ed46SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0b,
2539cfd1ed46SJung-uk Kim                     &Subtable);
2540cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
2541cfd1ed46SJung-uk Kim                 {
2542cfd1ed46SJung-uk Kim                     return (Status);
2543cfd1ed46SJung-uk Kim                 }
2544cfd1ed46SJung-uk Kim                 ParentTable = DtPeekSubtable ();
2545cfd1ed46SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2546cfd1ed46SJung-uk Kim 
2547cfd1ed46SJung-uk Kim                 Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
2548cfd1ed46SJung-uk Kim 
2549cfd1ed46SJung-uk Kim                 /* Compile a secure access component header */
2550cfd1ed46SJung-uk Kim 
2551cfd1ed46SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevSecCompHdr,
2552cfd1ed46SJung-uk Kim                     &Subtable);
2553cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
2554cfd1ed46SJung-uk Kim                 {
2555cfd1ed46SJung-uk Kim                     return (Status);
2556cfd1ed46SJung-uk Kim                 }
2557cfd1ed46SJung-uk Kim                 ParentTable = DtPeekSubtable ();
2558cfd1ed46SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2559cfd1ed46SJung-uk Kim 
2560cfd1ed46SJung-uk Kim                 /* Compile the secure access component */
2561cfd1ed46SJung-uk Kim 
2562cfd1ed46SJung-uk Kim                 SecureComponentHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
2563cfd1ed46SJung-uk Kim                 switch (SecureComponentHeader->Type)
2564cfd1ed46SJung-uk Kim                 {
2565cfd1ed46SJung-uk Kim                 case ACPI_SDEV_TYPE_ID_COMPONENT:
2566cfd1ed46SJung-uk Kim 
2567cfd1ed46SJung-uk Kim                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
2568cfd1ed46SJung-uk Kim                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_ID_COMPONENT);
2569cfd1ed46SJung-uk Kim                     ComponentLength = sizeof (ACPI_SDEV_ID_COMPONENT);
2570cfd1ed46SJung-uk Kim                     break;
2571cfd1ed46SJung-uk Kim 
2572cfd1ed46SJung-uk Kim                 case ACPI_SDEV_TYPE_MEM_COMPONENT:
2573cfd1ed46SJung-uk Kim 
2574cfd1ed46SJung-uk Kim                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
2575cfd1ed46SJung-uk Kim                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_MEM_COMPONENT);
2576cfd1ed46SJung-uk Kim                     ComponentLength = sizeof (ACPI_SDEV_MEM_COMPONENT);
2577cfd1ed46SJung-uk Kim                     break;
2578cfd1ed46SJung-uk Kim 
2579cfd1ed46SJung-uk Kim                 default:
2580cfd1ed46SJung-uk Kim 
2581cfd1ed46SJung-uk Kim                     /* Any other secure component types are undefined */
2582cfd1ed46SJung-uk Kim 
2583cfd1ed46SJung-uk Kim                     return (AE_ERROR);
2584cfd1ed46SJung-uk Kim                 }
2585cfd1ed46SJung-uk Kim 
2586cfd1ed46SJung-uk Kim                 Status = DtCompileTable (PFieldList, SecureComponentInfoTable,
2587cfd1ed46SJung-uk Kim                     &Subtable);
2588cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
2589cfd1ed46SJung-uk Kim                 {
2590cfd1ed46SJung-uk Kim                     return (Status);
2591cfd1ed46SJung-uk Kim                 }
2592cfd1ed46SJung-uk Kim                 ParentTable = DtPeekSubtable ();
2593cfd1ed46SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2594cfd1ed46SJung-uk Kim 
2595cfd1ed46SJung-uk Kim                 SecureComponent->SecureComponentOffset =
2596cfd1ed46SJung-uk Kim                     sizeof (ACPI_SDEV_NAMESPACE) + sizeof (ACPI_SDEV_SECURE_COMPONENT);
2597cfd1ed46SJung-uk Kim                 SecureComponent->SecureComponentLength = ComponentLength;
2598cfd1ed46SJung-uk Kim 
2599cfd1ed46SJung-uk Kim 
2600cfd1ed46SJung-uk Kim                 /*
2601cfd1ed46SJung-uk Kim                  * Add the secure component to the subtable to be added for the
2602cfd1ed46SJung-uk Kim                  * the namespace subtable's length
2603cfd1ed46SJung-uk Kim                  */
2604cfd1ed46SJung-uk Kim                 ComponentLength += sizeof (ACPI_SDEV_SECURE_COMPONENT);
2605cfd1ed46SJung-uk Kim             }
2606cfd1ed46SJung-uk Kim 
260767d9aa44SJung-uk Kim             /* Append DeviceId namespace string */
260867d9aa44SJung-uk Kim 
260967d9aa44SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a,
2610ff879b07SJung-uk Kim                 &Subtable);
261167d9aa44SJung-uk Kim             if (ACPI_FAILURE (Status))
261267d9aa44SJung-uk Kim             {
261367d9aa44SJung-uk Kim                 return (Status);
261467d9aa44SJung-uk Kim             }
261567d9aa44SJung-uk Kim 
261667d9aa44SJung-uk Kim             if (!Subtable)
261767d9aa44SJung-uk Kim             {
261867d9aa44SJung-uk Kim                 break;
261967d9aa44SJung-uk Kim             }
262067d9aa44SJung-uk Kim 
262167d9aa44SJung-uk Kim             ParentTable = DtPeekSubtable ();
262267d9aa44SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
262367d9aa44SJung-uk Kim 
2624cfd1ed46SJung-uk Kim             Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_NAMESPACE);
2625cfd1ed46SJung-uk Kim 
262667d9aa44SJung-uk Kim             Namesp->DeviceIdLength = (UINT16) Subtable->Length;
262767d9aa44SJung-uk Kim 
262867d9aa44SJung-uk Kim             /* Append Vendor data */
262967d9aa44SJung-uk Kim 
263067d9aa44SJung-uk Kim             Namesp->VendorDataLength = 0;
263167d9aa44SJung-uk Kim             Namesp->VendorDataOffset = 0;
263267d9aa44SJung-uk Kim 
263367d9aa44SJung-uk Kim             if (*PFieldList)
263467d9aa44SJung-uk Kim             {
263567d9aa44SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
2636ff879b07SJung-uk Kim                     &Subtable);
263767d9aa44SJung-uk Kim                 if (ACPI_FAILURE (Status))
263867d9aa44SJung-uk Kim                 {
263967d9aa44SJung-uk Kim                     return (Status);
264067d9aa44SJung-uk Kim                 }
264167d9aa44SJung-uk Kim 
264267d9aa44SJung-uk Kim                 if (Subtable)
264367d9aa44SJung-uk Kim                 {
264467d9aa44SJung-uk Kim                     ParentTable = DtPeekSubtable ();
264567d9aa44SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
264667d9aa44SJung-uk Kim 
264767d9aa44SJung-uk Kim                     Namesp->VendorDataOffset =
264867d9aa44SJung-uk Kim                         Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
264967d9aa44SJung-uk Kim                     Namesp->VendorDataLength =
265067d9aa44SJung-uk Kim                         (UINT16) Subtable->Length;
265167d9aa44SJung-uk Kim 
265267d9aa44SJung-uk Kim                     /* Final size of entire namespace structure */
265367d9aa44SJung-uk Kim 
265467d9aa44SJung-uk Kim                     SdevHeader->Length = (UINT16)(sizeof(ACPI_SDEV_NAMESPACE) +
2655cfd1ed46SJung-uk Kim                         Subtable->Length + Namesp->DeviceIdLength) + ComponentLength;
2656a009b7dcSJung-uk Kim                 }
2657a009b7dcSJung-uk Kim             }
2658a009b7dcSJung-uk Kim 
265967d9aa44SJung-uk Kim             break;
266067d9aa44SJung-uk Kim 
266167d9aa44SJung-uk Kim         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
266267d9aa44SJung-uk Kim 
266367d9aa44SJung-uk Kim             /* Append the PCIe path info first */
266467d9aa44SJung-uk Kim 
266567d9aa44SJung-uk Kim             EntryCount = 0;
266667d9aa44SJung-uk Kim             while (*PFieldList && !strcmp ((*PFieldList)->Name, "Device"))
266767d9aa44SJung-uk Kim             {
266867d9aa44SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1a,
2669ff879b07SJung-uk Kim                     &Subtable);
267067d9aa44SJung-uk Kim                 if (ACPI_FAILURE (Status))
267167d9aa44SJung-uk Kim                 {
267267d9aa44SJung-uk Kim                     return (Status);
267367d9aa44SJung-uk Kim                 }
267467d9aa44SJung-uk Kim 
267567d9aa44SJung-uk Kim                 if (!Subtable)
267667d9aa44SJung-uk Kim                 {
267767d9aa44SJung-uk Kim                     DtPopSubtable ();
267867d9aa44SJung-uk Kim                     break;
267967d9aa44SJung-uk Kim                 }
268067d9aa44SJung-uk Kim 
268167d9aa44SJung-uk Kim                 ParentTable = DtPeekSubtable ();
268267d9aa44SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
268367d9aa44SJung-uk Kim                 EntryCount++;
268467d9aa44SJung-uk Kim             }
268567d9aa44SJung-uk Kim 
268667d9aa44SJung-uk Kim             /* Path offset will point immediately after the main subtable */
268767d9aa44SJung-uk Kim 
268867d9aa44SJung-uk Kim             Pcie->PathOffset = sizeof (ACPI_SDEV_PCIE);
268967d9aa44SJung-uk Kim             Pcie->PathLength = (UINT16)
269067d9aa44SJung-uk Kim                 (EntryCount * sizeof (ACPI_SDEV_PCIE_PATH));
269167d9aa44SJung-uk Kim 
269267d9aa44SJung-uk Kim             /* Append the Vendor Data last */
269367d9aa44SJung-uk Kim 
269467d9aa44SJung-uk Kim             Pcie->VendorDataLength = 0;
269567d9aa44SJung-uk Kim             Pcie->VendorDataOffset = 0;
269667d9aa44SJung-uk Kim 
269767d9aa44SJung-uk Kim             if (*PFieldList)
269867d9aa44SJung-uk Kim             {
269967d9aa44SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
2700ff879b07SJung-uk Kim                     &Subtable);
270167d9aa44SJung-uk Kim                 if (ACPI_FAILURE (Status))
270267d9aa44SJung-uk Kim                 {
270367d9aa44SJung-uk Kim                     return (Status);
270467d9aa44SJung-uk Kim                 }
270567d9aa44SJung-uk Kim 
270667d9aa44SJung-uk Kim                 if (Subtable)
270767d9aa44SJung-uk Kim                 {
270867d9aa44SJung-uk Kim                     ParentTable = DtPeekSubtable ();
270967d9aa44SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
271067d9aa44SJung-uk Kim 
271167d9aa44SJung-uk Kim                     Pcie->VendorDataOffset =
271267d9aa44SJung-uk Kim                         Pcie->PathOffset + Pcie->PathLength;
271367d9aa44SJung-uk Kim                     Pcie->VendorDataLength = (UINT16)
271467d9aa44SJung-uk Kim                         Subtable->Length;
271567d9aa44SJung-uk Kim                 }
271667d9aa44SJung-uk Kim             }
271767d9aa44SJung-uk Kim 
271867d9aa44SJung-uk Kim             SdevHeader->Length =
271967d9aa44SJung-uk Kim                 sizeof (ACPI_SDEV_PCIE) +
272067d9aa44SJung-uk Kim                 Pcie->PathLength + Pcie->VendorDataLength;
272167d9aa44SJung-uk Kim             break;
272267d9aa44SJung-uk Kim 
272367d9aa44SJung-uk Kim         default:
272467d9aa44SJung-uk Kim 
272567d9aa44SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
272667d9aa44SJung-uk Kim             return (AE_ERROR);
272767d9aa44SJung-uk Kim         }
272867d9aa44SJung-uk Kim 
272967d9aa44SJung-uk Kim         DtPopSubtable ();
273067d9aa44SJung-uk Kim     }
273167d9aa44SJung-uk Kim 
273267d9aa44SJung-uk Kim     return (AE_OK);
273367d9aa44SJung-uk Kim }
273467d9aa44SJung-uk Kim 
273567d9aa44SJung-uk Kim 
273667d9aa44SJung-uk Kim /******************************************************************************
273767d9aa44SJung-uk Kim  *
2738f8146b88SJung-uk Kim  * FUNCTION:    DtCompileSlic
2739f8146b88SJung-uk Kim  *
2740f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2741f8146b88SJung-uk Kim  *
2742f8146b88SJung-uk Kim  * RETURN:      Status
2743f8146b88SJung-uk Kim  *
2744f8146b88SJung-uk Kim  * DESCRIPTION: Compile SLIC.
2745f8146b88SJung-uk Kim  *
2746f8146b88SJung-uk Kim  *****************************************************************************/
2747f8146b88SJung-uk Kim 
2748f8146b88SJung-uk Kim ACPI_STATUS
DtCompileSlic(void ** List)2749f8146b88SJung-uk Kim DtCompileSlic (
2750f8146b88SJung-uk Kim     void                    **List)
2751f8146b88SJung-uk Kim {
2752f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2753f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2754f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2755f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2756f8146b88SJung-uk Kim 
2757f8146b88SJung-uk Kim 
2758f8146b88SJung-uk Kim     while (*PFieldList)
2759f8146b88SJung-uk Kim     {
2760f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
2761ff879b07SJung-uk Kim             &Subtable);
2762f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2763f8146b88SJung-uk Kim         {
2764f8146b88SJung-uk Kim             return (Status);
2765f8146b88SJung-uk Kim         }
2766f8146b88SJung-uk Kim 
2767f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2768f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2769f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
2770f8146b88SJung-uk Kim         DtPopSubtable ();
2771f8146b88SJung-uk Kim     }
2772f8146b88SJung-uk Kim 
2773f8146b88SJung-uk Kim     return (AE_OK);
2774f8146b88SJung-uk Kim }
2775f8146b88SJung-uk Kim 
2776f8146b88SJung-uk Kim 
2777f8146b88SJung-uk Kim /******************************************************************************
2778f8146b88SJung-uk Kim  *
2779f8146b88SJung-uk Kim  * FUNCTION:    DtCompileSlit
2780f8146b88SJung-uk Kim  *
2781f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2782f8146b88SJung-uk Kim  *
2783f8146b88SJung-uk Kim  * RETURN:      Status
2784f8146b88SJung-uk Kim  *
2785f8146b88SJung-uk Kim  * DESCRIPTION: Compile SLIT.
2786f8146b88SJung-uk Kim  *
2787f8146b88SJung-uk Kim  *****************************************************************************/
2788f8146b88SJung-uk Kim 
2789f8146b88SJung-uk Kim ACPI_STATUS
DtCompileSlit(void ** List)2790f8146b88SJung-uk Kim DtCompileSlit (
2791f8146b88SJung-uk Kim     void                    **List)
2792f8146b88SJung-uk Kim {
2793f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2794f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2795f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2796f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2797f8146b88SJung-uk Kim     DT_FIELD                *FieldList;
2798a009b7dcSJung-uk Kim     DT_FIELD                *EndOfFieldList = NULL;
2799f8146b88SJung-uk Kim     UINT32                  Localities;
2800a009b7dcSJung-uk Kim     UINT32                  LocalityListLength;
2801f8146b88SJung-uk Kim     UINT8                   *LocalityBuffer;
2802f8146b88SJung-uk Kim 
2803f8146b88SJung-uk Kim 
2804f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
2805ff879b07SJung-uk Kim         &Subtable);
2806f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2807f8146b88SJung-uk Kim     {
2808f8146b88SJung-uk Kim         return (Status);
2809f8146b88SJung-uk Kim     }
2810f8146b88SJung-uk Kim 
2811f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2812f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2813f8146b88SJung-uk Kim 
2814f8146b88SJung-uk Kim     Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
2815f8146b88SJung-uk Kim     LocalityBuffer = UtLocalCalloc (Localities);
2816a009b7dcSJung-uk Kim     LocalityListLength = 0;
2817f8146b88SJung-uk Kim 
2818f8146b88SJung-uk Kim     /* Compile each locality buffer */
2819f8146b88SJung-uk Kim 
2820f8146b88SJung-uk Kim     FieldList = *PFieldList;
2821f8146b88SJung-uk Kim     while (FieldList)
2822f8146b88SJung-uk Kim     {
2823f8146b88SJung-uk Kim         DtCompileBuffer (LocalityBuffer,
2824f8146b88SJung-uk Kim             FieldList->Value, FieldList, Localities);
2825f8146b88SJung-uk Kim 
2826a009b7dcSJung-uk Kim         LocalityListLength++;
2827f8146b88SJung-uk Kim         DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
2828f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2829a009b7dcSJung-uk Kim         EndOfFieldList = FieldList;
2830f8146b88SJung-uk Kim         FieldList = FieldList->Next;
2831f8146b88SJung-uk Kim     }
2832f8146b88SJung-uk Kim 
2833a009b7dcSJung-uk Kim     if (LocalityListLength != Localities)
2834a009b7dcSJung-uk Kim     {
2835a009b7dcSJung-uk Kim         sprintf(AslGbl_MsgBuffer,
2836a009b7dcSJung-uk Kim             "Found %u entries, must match LocalityCount: %u",
2837a009b7dcSJung-uk Kim             LocalityListLength, Localities);
2838a009b7dcSJung-uk Kim         DtError (ASL_ERROR, ASL_MSG_ENTRY_LIST, EndOfFieldList, AslGbl_MsgBuffer);
2839f9a6772eSJung-uk Kim         ACPI_FREE (LocalityBuffer);
2840a009b7dcSJung-uk Kim         return (AE_LIMIT);
2841a009b7dcSJung-uk Kim     }
2842a009b7dcSJung-uk Kim 
2843f8146b88SJung-uk Kim     ACPI_FREE (LocalityBuffer);
2844f8146b88SJung-uk Kim     return (AE_OK);
2845f8146b88SJung-uk Kim }
2846f8146b88SJung-uk Kim 
2847f8146b88SJung-uk Kim 
2848f8146b88SJung-uk Kim /******************************************************************************
2849f8146b88SJung-uk Kim  *
2850f8146b88SJung-uk Kim  * FUNCTION:    DtCompileSrat
2851f8146b88SJung-uk Kim  *
2852f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2853f8146b88SJung-uk Kim  *
2854f8146b88SJung-uk Kim  * RETURN:      Status
2855f8146b88SJung-uk Kim  *
2856f8146b88SJung-uk Kim  * DESCRIPTION: Compile SRAT.
2857f8146b88SJung-uk Kim  *
2858f8146b88SJung-uk Kim  *****************************************************************************/
2859f8146b88SJung-uk Kim 
2860f8146b88SJung-uk Kim ACPI_STATUS
DtCompileSrat(void ** List)2861f8146b88SJung-uk Kim DtCompileSrat (
2862f8146b88SJung-uk Kim     void                    **List)
2863f8146b88SJung-uk Kim {
2864f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2865f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2866f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2867f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2868f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
2869f8146b88SJung-uk Kim     ACPI_SUBTABLE_HEADER    *SratHeader;
2870f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
2871f8146b88SJung-uk Kim 
2872f8146b88SJung-uk Kim 
2873f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
2874ff879b07SJung-uk Kim         &Subtable);
2875f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2876f8146b88SJung-uk Kim     {
2877f8146b88SJung-uk Kim         return (Status);
2878f8146b88SJung-uk Kim     }
2879f8146b88SJung-uk Kim 
2880f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2881f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2882f8146b88SJung-uk Kim 
2883f8146b88SJung-uk Kim     while (*PFieldList)
2884f8146b88SJung-uk Kim     {
2885f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
2886f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
2887ff879b07SJung-uk Kim             &Subtable);
2888f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2889f8146b88SJung-uk Kim         {
2890f8146b88SJung-uk Kim             return (Status);
2891f8146b88SJung-uk Kim         }
2892f8146b88SJung-uk Kim 
2893f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2894f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2895f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
2896f8146b88SJung-uk Kim 
2897f8146b88SJung-uk Kim         SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
2898f8146b88SJung-uk Kim 
2899f8146b88SJung-uk Kim         switch (SratHeader->Type)
2900f8146b88SJung-uk Kim         {
2901f8146b88SJung-uk Kim         case ACPI_SRAT_TYPE_CPU_AFFINITY:
2902f8146b88SJung-uk Kim 
2903f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat0;
2904f8146b88SJung-uk Kim             break;
2905f8146b88SJung-uk Kim 
2906f8146b88SJung-uk Kim         case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
2907f8146b88SJung-uk Kim 
2908f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat1;
2909f8146b88SJung-uk Kim             break;
2910f8146b88SJung-uk Kim 
2911f8146b88SJung-uk Kim         case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
2912f8146b88SJung-uk Kim 
2913f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat2;
2914f8146b88SJung-uk Kim             break;
2915f8146b88SJung-uk Kim 
2916f8146b88SJung-uk Kim         case ACPI_SRAT_TYPE_GICC_AFFINITY:
2917f8146b88SJung-uk Kim 
2918f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat3;
2919f8146b88SJung-uk Kim             break;
2920f8146b88SJung-uk Kim 
2921af051161SJung-uk Kim         case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
2922af051161SJung-uk Kim 
2923af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat4;
2924af051161SJung-uk Kim             break;
2925af051161SJung-uk Kim 
2926cd6518c7SJung-uk Kim         case ACPI_SRAT_TYPE_GENERIC_AFFINITY:
2927cd6518c7SJung-uk Kim 
2928cd6518c7SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat5;
2929cd6518c7SJung-uk Kim             break;
2930cd6518c7SJung-uk Kim 
29311b7a2680SJung-uk Kim         case ACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY:
29321b7a2680SJung-uk Kim 
29331b7a2680SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat6;
29341b7a2680SJung-uk Kim             break;
29351b7a2680SJung-uk Kim 
2936f8146b88SJung-uk Kim         default:
2937f8146b88SJung-uk Kim 
2938f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
2939f8146b88SJung-uk Kim             return (AE_ERROR);
2940f8146b88SJung-uk Kim         }
2941f8146b88SJung-uk Kim 
2942ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
2943f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2944f8146b88SJung-uk Kim         {
2945f8146b88SJung-uk Kim             return (Status);
2946f8146b88SJung-uk Kim         }
2947f8146b88SJung-uk Kim 
2948f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2949f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2950f8146b88SJung-uk Kim         DtPopSubtable ();
2951f8146b88SJung-uk Kim     }
2952f8146b88SJung-uk Kim 
2953f8146b88SJung-uk Kim     return (AE_OK);
2954f8146b88SJung-uk Kim }
2955f8146b88SJung-uk Kim 
2956f8146b88SJung-uk Kim 
2957f8146b88SJung-uk Kim /******************************************************************************
2958f8146b88SJung-uk Kim  *
2959f8146b88SJung-uk Kim  * FUNCTION:    DtCompileStao
2960f8146b88SJung-uk Kim  *
2961f8146b88SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
2962f8146b88SJung-uk Kim  *
2963f8146b88SJung-uk Kim  * RETURN:      Status
2964f8146b88SJung-uk Kim  *
2965f8146b88SJung-uk Kim  * DESCRIPTION: Compile STAO.
2966f8146b88SJung-uk Kim  *
2967f8146b88SJung-uk Kim  *****************************************************************************/
2968f8146b88SJung-uk Kim 
2969f8146b88SJung-uk Kim ACPI_STATUS
DtCompileStao(void ** List)2970f8146b88SJung-uk Kim DtCompileStao (
2971f8146b88SJung-uk Kim     void                    **List)
2972f8146b88SJung-uk Kim {
2973f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2974f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2975f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2976f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2977f8146b88SJung-uk Kim 
2978f8146b88SJung-uk Kim 
2979f8146b88SJung-uk Kim     /* Compile the main table */
2980f8146b88SJung-uk Kim 
2981f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao,
2982ff879b07SJung-uk Kim         &Subtable);
2983f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2984f8146b88SJung-uk Kim     {
2985f8146b88SJung-uk Kim         return (Status);
2986f8146b88SJung-uk Kim     }
2987f8146b88SJung-uk Kim 
2988f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2989f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2990f8146b88SJung-uk Kim 
2991f8146b88SJung-uk Kim     /* Compile each ASCII namestring as a subtable */
2992f8146b88SJung-uk Kim 
2993f8146b88SJung-uk Kim     while (*PFieldList)
2994f8146b88SJung-uk Kim     {
2995f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr,
2996ff879b07SJung-uk Kim             &Subtable);
2997f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2998f8146b88SJung-uk Kim         {
2999f8146b88SJung-uk Kim             return (Status);
3000f8146b88SJung-uk Kim         }
3001f8146b88SJung-uk Kim 
3002f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
3003f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
3004f8146b88SJung-uk Kim     }
3005f8146b88SJung-uk Kim 
3006f8146b88SJung-uk Kim     return (AE_OK);
3007f8146b88SJung-uk Kim }
3008f8146b88SJung-uk Kim 
3009f8146b88SJung-uk Kim 
30101970d693SJung-uk Kim /******************************************************************************
30111970d693SJung-uk Kim  *
30121970d693SJung-uk Kim  * FUNCTION:    DtCompileSvkl
30131970d693SJung-uk Kim  *
30141970d693SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
30151970d693SJung-uk Kim  *
30161970d693SJung-uk Kim  * RETURN:      Status
30171970d693SJung-uk Kim  *
30181970d693SJung-uk Kim  * DESCRIPTION: Compile SVKL.
30191970d693SJung-uk Kim  *
30201970d693SJung-uk Kim  * NOTES: SVKL is essentially a flat table, with a small main table and
30211970d693SJung-uk Kim  *          a variable number of a single type of subtable.
30221970d693SJung-uk Kim  *
30231970d693SJung-uk Kim  *****************************************************************************/
30241970d693SJung-uk Kim 
30251970d693SJung-uk Kim ACPI_STATUS
DtCompileSvkl(void ** List)30261970d693SJung-uk Kim DtCompileSvkl (
30271970d693SJung-uk Kim     void                    **List)
30281970d693SJung-uk Kim {
30291970d693SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
30301970d693SJung-uk Kim     DT_SUBTABLE             *Subtable;
30311970d693SJung-uk Kim     DT_SUBTABLE             *ParentTable;
30321970d693SJung-uk Kim     ACPI_STATUS             Status;
30331970d693SJung-uk Kim 
30341970d693SJung-uk Kim 
30351970d693SJung-uk Kim     /* Compile the main table */
30361970d693SJung-uk Kim 
30371970d693SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl,
30381970d693SJung-uk Kim         &Subtable);
30391970d693SJung-uk Kim     if (ACPI_FAILURE (Status))
30401970d693SJung-uk Kim     {
30411970d693SJung-uk Kim         return (Status);
30421970d693SJung-uk Kim     }
30431970d693SJung-uk Kim 
30441970d693SJung-uk Kim     ParentTable = DtPeekSubtable ();
30451970d693SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
30461970d693SJung-uk Kim 
30471970d693SJung-uk Kim     /* Compile each subtable */
30481970d693SJung-uk Kim 
30491970d693SJung-uk Kim     while (*PFieldList)
30501970d693SJung-uk Kim     {
30511970d693SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl0,
30521970d693SJung-uk Kim             &Subtable);
30531970d693SJung-uk Kim         if (ACPI_FAILURE (Status))
30541970d693SJung-uk Kim         {
30551970d693SJung-uk Kim             return (Status);
30561970d693SJung-uk Kim         }
30571970d693SJung-uk Kim 
30581970d693SJung-uk Kim         ParentTable = DtPeekSubtable ();
30591970d693SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
30601970d693SJung-uk Kim     }
30611970d693SJung-uk Kim 
30621970d693SJung-uk Kim     return (AE_OK);
30631970d693SJung-uk Kim }
30641970d693SJung-uk Kim 
30651970d693SJung-uk Kim 
3066f8146b88SJung-uk Kim /******************************************************************************
3067f8146b88SJung-uk Kim  *
3068f8146b88SJung-uk Kim  * FUNCTION:    DtCompileTcpa
3069f8146b88SJung-uk Kim  *
3070f8146b88SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
3071f8146b88SJung-uk Kim  *
3072f8146b88SJung-uk Kim  * RETURN:      Status
3073f8146b88SJung-uk Kim  *
3074f8146b88SJung-uk Kim  * DESCRIPTION: Compile TCPA.
3075f8146b88SJung-uk Kim  *
3076f8146b88SJung-uk Kim  *****************************************************************************/
3077f8146b88SJung-uk Kim 
3078f8146b88SJung-uk Kim ACPI_STATUS
DtCompileTcpa(void ** List)3079f8146b88SJung-uk Kim DtCompileTcpa (
3080f8146b88SJung-uk Kim     void                    **List)
3081f8146b88SJung-uk Kim {
3082f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
3083f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
3084f8146b88SJung-uk Kim     ACPI_TABLE_TCPA_HDR     *TcpaHeader;
3085f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
3086f8146b88SJung-uk Kim     ACPI_STATUS             Status;
3087f8146b88SJung-uk Kim 
3088f8146b88SJung-uk Kim 
3089f8146b88SJung-uk Kim     /* Compile the main table */
3090f8146b88SJung-uk Kim 
3091f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaHdr,
3092ff879b07SJung-uk Kim         &Subtable);
3093f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
3094f8146b88SJung-uk Kim     {
3095f8146b88SJung-uk Kim         return (Status);
3096f8146b88SJung-uk Kim     }
3097f8146b88SJung-uk Kim 
3098f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
3099f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
3100f8146b88SJung-uk Kim 
3101f8146b88SJung-uk Kim     /*
3102f8146b88SJung-uk Kim      * Examine the PlatformClass field to determine the table type.
3103f8146b88SJung-uk Kim      * Either a client or server table. Only one.
3104f8146b88SJung-uk Kim      */
3105f8146b88SJung-uk Kim     TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer);
3106f8146b88SJung-uk Kim 
3107f8146b88SJung-uk Kim     switch (TcpaHeader->PlatformClass)
3108f8146b88SJung-uk Kim     {
3109f8146b88SJung-uk Kim     case ACPI_TCPA_CLIENT_TABLE:
3110f8146b88SJung-uk Kim 
3111f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaClient,
3112ff879b07SJung-uk Kim             &Subtable);
3113f8146b88SJung-uk Kim         break;
3114f8146b88SJung-uk Kim 
3115f8146b88SJung-uk Kim     case ACPI_TCPA_SERVER_TABLE:
3116f8146b88SJung-uk Kim 
3117f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaServer,
3118ff879b07SJung-uk Kim             &Subtable);
3119f8146b88SJung-uk Kim         break;
3120f8146b88SJung-uk Kim 
3121f8146b88SJung-uk Kim     default:
3122f8146b88SJung-uk Kim 
3123f8146b88SJung-uk Kim         AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
3124f8146b88SJung-uk Kim             TcpaHeader->PlatformClass);
3125f8146b88SJung-uk Kim         Status = AE_ERROR;
3126f8146b88SJung-uk Kim         break;
3127f8146b88SJung-uk Kim     }
3128f8146b88SJung-uk Kim 
3129f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
3130f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
3131f8146b88SJung-uk Kim     return (Status);
3132f8146b88SJung-uk Kim }
3133f8146b88SJung-uk Kim 
3134f8146b88SJung-uk Kim 
3135f8146b88SJung-uk Kim /******************************************************************************
3136f8146b88SJung-uk Kim  *
31374a38ee6dSJung-uk Kim  * FUNCTION:    DtCompileTpm2Rev3
31384a38ee6dSJung-uk Kim  *
31394a38ee6dSJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
31404a38ee6dSJung-uk Kim  *
31414a38ee6dSJung-uk Kim  * RETURN:      Status
31424a38ee6dSJung-uk Kim  *
31434a38ee6dSJung-uk Kim  * DESCRIPTION: Compile TPM2 revision 3
31444a38ee6dSJung-uk Kim  *
31454a38ee6dSJung-uk Kim  *****************************************************************************/
31464a38ee6dSJung-uk Kim static ACPI_STATUS
DtCompileTpm2Rev3(void ** List)31474a38ee6dSJung-uk Kim DtCompileTpm2Rev3 (
31484a38ee6dSJung-uk Kim     void                    **List)
31494a38ee6dSJung-uk Kim {
31504a38ee6dSJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
31514a38ee6dSJung-uk Kim     DT_SUBTABLE             *Subtable;
31524a38ee6dSJung-uk Kim     ACPI_TABLE_TPM23        *Tpm23Header;
31534a38ee6dSJung-uk Kim     DT_SUBTABLE             *ParentTable;
31544a38ee6dSJung-uk Kim     ACPI_STATUS             Status = AE_OK;
31554a38ee6dSJung-uk Kim 
31564a38ee6dSJung-uk Kim 
31574a38ee6dSJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23,
31584a38ee6dSJung-uk Kim         &Subtable);
31594a38ee6dSJung-uk Kim 
31604a38ee6dSJung-uk Kim     ParentTable = DtPeekSubtable ();
31614a38ee6dSJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
31624a38ee6dSJung-uk Kim     Tpm23Header = ACPI_CAST_PTR (ACPI_TABLE_TPM23, ParentTable->Buffer);
31634a38ee6dSJung-uk Kim 
31644a38ee6dSJung-uk Kim     /* Subtable type depends on the StartMethod */
31654a38ee6dSJung-uk Kim 
31664a38ee6dSJung-uk Kim     switch (Tpm23Header->StartMethod)
31674a38ee6dSJung-uk Kim     {
31684a38ee6dSJung-uk Kim     case ACPI_TPM23_ACPI_START_METHOD:
31694a38ee6dSJung-uk Kim 
31704a38ee6dSJung-uk Kim         /* Subtable specific to to ARM_SMC */
31714a38ee6dSJung-uk Kim 
31724a38ee6dSJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23a,
31734a38ee6dSJung-uk Kim             &Subtable);
31744a38ee6dSJung-uk Kim         if (ACPI_FAILURE (Status))
31754a38ee6dSJung-uk Kim         {
31764a38ee6dSJung-uk Kim             return (Status);
31774a38ee6dSJung-uk Kim         }
31784a38ee6dSJung-uk Kim 
31794a38ee6dSJung-uk Kim         ParentTable = DtPeekSubtable ();
31804a38ee6dSJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
31814a38ee6dSJung-uk Kim         break;
31824a38ee6dSJung-uk Kim 
31834a38ee6dSJung-uk Kim     default:
31844a38ee6dSJung-uk Kim         break;
31854a38ee6dSJung-uk Kim     }
31864a38ee6dSJung-uk Kim 
31874a38ee6dSJung-uk Kim     return (Status);
31884a38ee6dSJung-uk Kim }
31894a38ee6dSJung-uk Kim 
31904a38ee6dSJung-uk Kim 
31914a38ee6dSJung-uk Kim /******************************************************************************
31924a38ee6dSJung-uk Kim  *
319367d9aa44SJung-uk Kim  * FUNCTION:    DtCompileTpm2
319467d9aa44SJung-uk Kim  *
319567d9aa44SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
319667d9aa44SJung-uk Kim  *
319767d9aa44SJung-uk Kim  * RETURN:      Status
319867d9aa44SJung-uk Kim  *
319967d9aa44SJung-uk Kim  * DESCRIPTION: Compile TPM2.
320067d9aa44SJung-uk Kim  *
320167d9aa44SJung-uk Kim  *****************************************************************************/
320267d9aa44SJung-uk Kim 
320367d9aa44SJung-uk Kim ACPI_STATUS
DtCompileTpm2(void ** List)320467d9aa44SJung-uk Kim DtCompileTpm2 (
320567d9aa44SJung-uk Kim     void                    **List)
320667d9aa44SJung-uk Kim {
320767d9aa44SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
320867d9aa44SJung-uk Kim     DT_SUBTABLE             *Subtable;
320967d9aa44SJung-uk Kim     ACPI_TABLE_TPM2         *Tpm2Header;
321067d9aa44SJung-uk Kim     DT_SUBTABLE             *ParentTable;
321167d9aa44SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
32124a38ee6dSJung-uk Kim     ACPI_TABLE_HEADER       *Header;
321367d9aa44SJung-uk Kim 
321467d9aa44SJung-uk Kim 
32154a38ee6dSJung-uk Kim     ParentTable = DtPeekSubtable ();
32164a38ee6dSJung-uk Kim 
32174a38ee6dSJung-uk Kim     Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
32184a38ee6dSJung-uk Kim 
32194a38ee6dSJung-uk Kim     if (Header->Revision == 3)
32204a38ee6dSJung-uk Kim     {
32214a38ee6dSJung-uk Kim         return (DtCompileTpm2Rev3 (List));
32224a38ee6dSJung-uk Kim     }
32234a38ee6dSJung-uk Kim 
322467d9aa44SJung-uk Kim     /* Compile the main table */
322567d9aa44SJung-uk Kim 
322667d9aa44SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2,
3227ff879b07SJung-uk Kim         &Subtable);
322867d9aa44SJung-uk Kim     if (ACPI_FAILURE (Status))
322967d9aa44SJung-uk Kim     {
323067d9aa44SJung-uk Kim         return (Status);
323167d9aa44SJung-uk Kim     }
323267d9aa44SJung-uk Kim 
323367d9aa44SJung-uk Kim     ParentTable = DtPeekSubtable ();
323467d9aa44SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
323567d9aa44SJung-uk Kim 
323667d9aa44SJung-uk Kim     Tpm2Header = ACPI_CAST_PTR (ACPI_TABLE_TPM2, ParentTable->Buffer);
323767d9aa44SJung-uk Kim 
323867d9aa44SJung-uk Kim     /* Method parameters */
323967d9aa44SJung-uk Kim     /* Optional: Log area minimum length */
324067d9aa44SJung-uk Kim     /* Optional: Log area start address */
324167d9aa44SJung-uk Kim     /* TBD: Optional fields above not fully implemented (not optional at this time) */
324267d9aa44SJung-uk Kim 
324367d9aa44SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2a,
3244ff879b07SJung-uk Kim         &Subtable);
324567d9aa44SJung-uk Kim     if (ACPI_FAILURE (Status))
324667d9aa44SJung-uk Kim     {
324767d9aa44SJung-uk Kim         return (Status);
324867d9aa44SJung-uk Kim     }
324967d9aa44SJung-uk Kim 
325067d9aa44SJung-uk Kim     ParentTable = DtPeekSubtable ();
325167d9aa44SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
325267d9aa44SJung-uk Kim 
325367d9aa44SJung-uk Kim 
325467d9aa44SJung-uk Kim     /* Subtable type depends on the StartMethod */
325567d9aa44SJung-uk Kim 
325667d9aa44SJung-uk Kim     switch (Tpm2Header->StartMethod)
325767d9aa44SJung-uk Kim     {
325867d9aa44SJung-uk Kim     case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC:
325967d9aa44SJung-uk Kim 
326067d9aa44SJung-uk Kim         /* Subtable specific to to ARM_SMC */
326167d9aa44SJung-uk Kim 
326267d9aa44SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm211,
3263ff879b07SJung-uk Kim             &Subtable);
326467d9aa44SJung-uk Kim         if (ACPI_FAILURE (Status))
326567d9aa44SJung-uk Kim         {
326667d9aa44SJung-uk Kim             return (Status);
326767d9aa44SJung-uk Kim         }
326867d9aa44SJung-uk Kim 
326967d9aa44SJung-uk Kim         ParentTable = DtPeekSubtable ();
327067d9aa44SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
327167d9aa44SJung-uk Kim         break;
327267d9aa44SJung-uk Kim 
327367d9aa44SJung-uk Kim     case ACPI_TPM2_START_METHOD:
327467d9aa44SJung-uk Kim     case ACPI_TPM2_MEMORY_MAPPED:
327567d9aa44SJung-uk Kim     case ACPI_TPM2_COMMAND_BUFFER:
327667d9aa44SJung-uk Kim     case ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD:
327767d9aa44SJung-uk Kim         break;
327867d9aa44SJung-uk Kim 
327967d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED1:
328067d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED3:
328167d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED4:
328267d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED5:
328367d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED9:
328467d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED10:
328567d9aa44SJung-uk Kim 
328667d9aa44SJung-uk Kim         AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n",
328767d9aa44SJung-uk Kim             Tpm2Header->StartMethod);
328867d9aa44SJung-uk Kim         Status = AE_ERROR;
328967d9aa44SJung-uk Kim         break;
329067d9aa44SJung-uk Kim 
329167d9aa44SJung-uk Kim     case ACPI_TPM2_NOT_ALLOWED:
329267d9aa44SJung-uk Kim     default:
329367d9aa44SJung-uk Kim 
329467d9aa44SJung-uk Kim         AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n",
329567d9aa44SJung-uk Kim             Tpm2Header->StartMethod);
329667d9aa44SJung-uk Kim         Status = AE_ERROR;
329767d9aa44SJung-uk Kim         break;
329867d9aa44SJung-uk Kim     }
329967d9aa44SJung-uk Kim 
330067d9aa44SJung-uk Kim     return (Status);
330167d9aa44SJung-uk Kim }
330267d9aa44SJung-uk Kim 
330367d9aa44SJung-uk Kim 
330467d9aa44SJung-uk Kim /******************************************************************************
330567d9aa44SJung-uk Kim  *
3306f8146b88SJung-uk Kim  * FUNCTION:    DtGetGenericTableInfo
3307f8146b88SJung-uk Kim  *
3308f8146b88SJung-uk Kim  * PARAMETERS:  Name                - Generic type name
3309f8146b88SJung-uk Kim  *
3310f8146b88SJung-uk Kim  * RETURN:      Info entry
3311f8146b88SJung-uk Kim  *
3312f8146b88SJung-uk Kim  * DESCRIPTION: Obtain table info for a generic name entry
3313f8146b88SJung-uk Kim  *
3314f8146b88SJung-uk Kim  *****************************************************************************/
3315f8146b88SJung-uk Kim 
3316f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *
DtGetGenericTableInfo(char * Name)3317f8146b88SJung-uk Kim DtGetGenericTableInfo (
3318f8146b88SJung-uk Kim     char                    *Name)
3319f8146b88SJung-uk Kim {
3320f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *Info;
3321f8146b88SJung-uk Kim     UINT32                  i;
3322f8146b88SJung-uk Kim 
3323f8146b88SJung-uk Kim 
3324f8146b88SJung-uk Kim     if (!Name)
3325f8146b88SJung-uk Kim     {
3326f8146b88SJung-uk Kim         return (NULL);
3327f8146b88SJung-uk Kim     }
3328f8146b88SJung-uk Kim 
3329f8146b88SJung-uk Kim     /* Search info table for name match */
3330f8146b88SJung-uk Kim 
3331f8146b88SJung-uk Kim     for (i = 0; ; i++)
3332f8146b88SJung-uk Kim     {
3333f8146b88SJung-uk Kim         Info = AcpiDmTableInfoGeneric[i];
3334f8146b88SJung-uk Kim         if (Info->Opcode == ACPI_DMT_EXIT)
3335f8146b88SJung-uk Kim         {
3336f8146b88SJung-uk Kim             Info = NULL;
3337f8146b88SJung-uk Kim             break;
3338f8146b88SJung-uk Kim         }
3339f8146b88SJung-uk Kim 
3340f8146b88SJung-uk Kim         /* Use caseless compare for generic keywords */
3341f8146b88SJung-uk Kim 
3342f8146b88SJung-uk Kim         if (!AcpiUtStricmp (Name, Info->Name))
3343f8146b88SJung-uk Kim         {
3344f8146b88SJung-uk Kim             break;
3345f8146b88SJung-uk Kim         }
3346f8146b88SJung-uk Kim     }
3347f8146b88SJung-uk Kim 
3348f8146b88SJung-uk Kim     return (Info);
3349f8146b88SJung-uk Kim }
3350f8146b88SJung-uk Kim 
3351f8146b88SJung-uk Kim 
3352f8146b88SJung-uk Kim /******************************************************************************
3353f8146b88SJung-uk Kim  *
3354f8146b88SJung-uk Kim  * FUNCTION:    DtCompileUefi
3355f8146b88SJung-uk Kim  *
3356f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
3357f8146b88SJung-uk Kim  *
3358f8146b88SJung-uk Kim  * RETURN:      Status
3359f8146b88SJung-uk Kim  *
3360f8146b88SJung-uk Kim  * DESCRIPTION: Compile UEFI.
3361f8146b88SJung-uk Kim  *
3362f8146b88SJung-uk Kim  *****************************************************************************/
3363f8146b88SJung-uk Kim 
3364f8146b88SJung-uk Kim ACPI_STATUS
DtCompileUefi(void ** List)3365f8146b88SJung-uk Kim DtCompileUefi (
3366f8146b88SJung-uk Kim     void                    **List)
3367f8146b88SJung-uk Kim {
3368f8146b88SJung-uk Kim     ACPI_STATUS             Status;
3369f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
3370f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
3371f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
3372f8146b88SJung-uk Kim     UINT16                  *DataOffset;
3373f8146b88SJung-uk Kim 
3374f8146b88SJung-uk Kim 
3375f8146b88SJung-uk Kim     /* Compile the predefined portion of the UEFI table */
3376f8146b88SJung-uk Kim 
3377f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
3378ff879b07SJung-uk Kim         &Subtable);
3379f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
3380f8146b88SJung-uk Kim     {
3381f8146b88SJung-uk Kim         return (Status);
3382f8146b88SJung-uk Kim     }
3383f8146b88SJung-uk Kim 
3384f8146b88SJung-uk Kim     DataOffset = (UINT16 *) (Subtable->Buffer + 16);
3385f8146b88SJung-uk Kim     *DataOffset = sizeof (ACPI_TABLE_UEFI);
3386f8146b88SJung-uk Kim 
3387f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
3388f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
3389f8146b88SJung-uk Kim 
3390f8146b88SJung-uk Kim     /*
3391f8146b88SJung-uk Kim      * Compile the "generic" portion of the UEFI table. This
3392f8146b88SJung-uk Kim      * part of the table is not predefined and any of the generic
3393f8146b88SJung-uk Kim      * operators may be used.
3394f8146b88SJung-uk Kim      */
3395f8146b88SJung-uk Kim     DtCompileGeneric ((void **) PFieldList, NULL, NULL);
3396f8146b88SJung-uk Kim     return (AE_OK);
3397f8146b88SJung-uk Kim }
3398f8146b88SJung-uk Kim 
3399f8146b88SJung-uk Kim 
3400f8146b88SJung-uk Kim /******************************************************************************
3401f8146b88SJung-uk Kim  *
3402cfd1ed46SJung-uk Kim  * FUNCTION:    DtCompileViot
3403cfd1ed46SJung-uk Kim  *
3404cfd1ed46SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
3405cfd1ed46SJung-uk Kim  *
3406cfd1ed46SJung-uk Kim  * RETURN:      Status
3407cfd1ed46SJung-uk Kim  *
3408cfd1ed46SJung-uk Kim  * DESCRIPTION: Compile VIOT.
3409cfd1ed46SJung-uk Kim  *
3410cfd1ed46SJung-uk Kim  *****************************************************************************/
3411cfd1ed46SJung-uk Kim 
3412cfd1ed46SJung-uk Kim ACPI_STATUS
DtCompileViot(void ** List)3413cfd1ed46SJung-uk Kim DtCompileViot (
3414cfd1ed46SJung-uk Kim     void                    **List)
3415cfd1ed46SJung-uk Kim {
3416cfd1ed46SJung-uk Kim     ACPI_STATUS             Status;
3417cfd1ed46SJung-uk Kim     DT_SUBTABLE             *Subtable;
3418cfd1ed46SJung-uk Kim     DT_SUBTABLE             *ParentTable;
3419cfd1ed46SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
3420cfd1ed46SJung-uk Kim     DT_FIELD                *SubtableStart;
3421cfd1ed46SJung-uk Kim     ACPI_TABLE_VIOT         *Viot;
3422cfd1ed46SJung-uk Kim     ACPI_VIOT_HEADER        *ViotHeader;
3423cfd1ed46SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
3424cfd1ed46SJung-uk Kim     UINT16                  NodeCount;
3425cfd1ed46SJung-uk Kim 
3426cfd1ed46SJung-uk Kim     ParentTable = DtPeekSubtable ();
3427cfd1ed46SJung-uk Kim 
3428cfd1ed46SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoViot, &Subtable);
3429cfd1ed46SJung-uk Kim     if (ACPI_FAILURE (Status))
3430cfd1ed46SJung-uk Kim     {
3431cfd1ed46SJung-uk Kim         return (Status);
3432cfd1ed46SJung-uk Kim     }
3433cfd1ed46SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
3434cfd1ed46SJung-uk Kim 
3435cfd1ed46SJung-uk Kim     /*
3436cfd1ed46SJung-uk Kim      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
3437cfd1ed46SJung-uk Kim      * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
3438cfd1ed46SJung-uk Kim      */
3439cfd1ed46SJung-uk Kim     Viot = ACPI_SUB_PTR (ACPI_TABLE_VIOT, Subtable->Buffer,
3440cfd1ed46SJung-uk Kim         sizeof (ACPI_TABLE_HEADER));
3441cfd1ed46SJung-uk Kim 
3442cfd1ed46SJung-uk Kim     Viot->NodeOffset = sizeof (ACPI_TABLE_VIOT);
3443cfd1ed46SJung-uk Kim 
3444cfd1ed46SJung-uk Kim     NodeCount = 0;
3445cfd1ed46SJung-uk Kim     while (*PFieldList) {
3446cfd1ed46SJung-uk Kim         SubtableStart = *PFieldList;
3447cfd1ed46SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoViotHeader,
3448cfd1ed46SJung-uk Kim             &Subtable);
3449cfd1ed46SJung-uk Kim         if (ACPI_FAILURE (Status))
3450cfd1ed46SJung-uk Kim         {
3451cfd1ed46SJung-uk Kim             return (Status);
3452cfd1ed46SJung-uk Kim         }
3453cfd1ed46SJung-uk Kim 
3454cfd1ed46SJung-uk Kim         ParentTable = DtPeekSubtable ();
3455cfd1ed46SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
3456cfd1ed46SJung-uk Kim         DtPushSubtable (Subtable);
3457cfd1ed46SJung-uk Kim 
3458cfd1ed46SJung-uk Kim         ViotHeader = ACPI_CAST_PTR (ACPI_VIOT_HEADER, Subtable->Buffer);
3459cfd1ed46SJung-uk Kim 
3460cfd1ed46SJung-uk Kim         switch (ViotHeader->Type)
3461cfd1ed46SJung-uk Kim         {
3462cfd1ed46SJung-uk Kim         case ACPI_VIOT_NODE_PCI_RANGE:
3463cfd1ed46SJung-uk Kim 
3464cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoViot1;
3465cfd1ed46SJung-uk Kim             break;
3466cfd1ed46SJung-uk Kim 
3467cfd1ed46SJung-uk Kim         case ACPI_VIOT_NODE_MMIO:
3468cfd1ed46SJung-uk Kim 
3469cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoViot2;
3470cfd1ed46SJung-uk Kim             break;
3471cfd1ed46SJung-uk Kim 
3472cfd1ed46SJung-uk Kim         case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI:
3473cfd1ed46SJung-uk Kim 
3474cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoViot3;
3475cfd1ed46SJung-uk Kim             break;
3476cfd1ed46SJung-uk Kim 
3477cfd1ed46SJung-uk Kim         case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO:
3478cfd1ed46SJung-uk Kim 
3479cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoViot4;
3480cfd1ed46SJung-uk Kim             break;
3481cfd1ed46SJung-uk Kim 
3482cfd1ed46SJung-uk Kim         default:
3483cfd1ed46SJung-uk Kim 
3484cfd1ed46SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "VIOT");
3485cfd1ed46SJung-uk Kim             return (AE_ERROR);
3486cfd1ed46SJung-uk Kim         }
3487cfd1ed46SJung-uk Kim 
3488cfd1ed46SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
3489cfd1ed46SJung-uk Kim         if (ACPI_FAILURE (Status))
3490cfd1ed46SJung-uk Kim         {
3491cfd1ed46SJung-uk Kim             return (Status);
3492cfd1ed46SJung-uk Kim         }
3493cfd1ed46SJung-uk Kim 
3494cfd1ed46SJung-uk Kim         ParentTable = DtPeekSubtable ();
3495cfd1ed46SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
3496cfd1ed46SJung-uk Kim         DtPopSubtable ();
3497cfd1ed46SJung-uk Kim         NodeCount++;
3498cfd1ed46SJung-uk Kim     }
3499cfd1ed46SJung-uk Kim 
3500cfd1ed46SJung-uk Kim     Viot->NodeCount = NodeCount;
3501cfd1ed46SJung-uk Kim     return (AE_OK);
3502cfd1ed46SJung-uk Kim }
3503cfd1ed46SJung-uk Kim 
3504cfd1ed46SJung-uk Kim 
3505cfd1ed46SJung-uk Kim /******************************************************************************
3506cfd1ed46SJung-uk Kim  *
3507f8146b88SJung-uk Kim  * FUNCTION:    DtCompileWdat
3508f8146b88SJung-uk Kim  *
3509f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
3510f8146b88SJung-uk Kim  *
3511f8146b88SJung-uk Kim  * RETURN:      Status
3512f8146b88SJung-uk Kim  *
3513f8146b88SJung-uk Kim  * DESCRIPTION: Compile WDAT.
3514f8146b88SJung-uk Kim  *
3515f8146b88SJung-uk Kim  *****************************************************************************/
3516f8146b88SJung-uk Kim 
3517f8146b88SJung-uk Kim ACPI_STATUS
DtCompileWdat(void ** List)3518f8146b88SJung-uk Kim DtCompileWdat (
3519f8146b88SJung-uk Kim     void                    **List)
3520f8146b88SJung-uk Kim {
3521f8146b88SJung-uk Kim     ACPI_STATUS             Status;
3522f8146b88SJung-uk Kim 
3523f8146b88SJung-uk Kim 
3524f8146b88SJung-uk Kim     Status = DtCompileTwoSubtables (List,
3525f8146b88SJung-uk Kim         AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
3526f8146b88SJung-uk Kim     return (Status);
3527f8146b88SJung-uk Kim }
3528f8146b88SJung-uk Kim 
3529f8146b88SJung-uk Kim 
3530f8146b88SJung-uk Kim /******************************************************************************
3531f8146b88SJung-uk Kim  *
3532f8146b88SJung-uk Kim  * FUNCTION:    DtCompileWpbt
3533f8146b88SJung-uk Kim  *
3534f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
3535f8146b88SJung-uk Kim  *
3536f8146b88SJung-uk Kim  * RETURN:      Status
3537f8146b88SJung-uk Kim  *
3538f8146b88SJung-uk Kim  * DESCRIPTION: Compile WPBT.
3539f8146b88SJung-uk Kim  *
3540f8146b88SJung-uk Kim  *****************************************************************************/
3541f8146b88SJung-uk Kim 
3542f8146b88SJung-uk Kim ACPI_STATUS
DtCompileWpbt(void ** List)3543f8146b88SJung-uk Kim DtCompileWpbt (
3544f8146b88SJung-uk Kim     void                    **List)
3545f8146b88SJung-uk Kim {
3546f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
3547f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
3548f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
3549f8146b88SJung-uk Kim     ACPI_TABLE_WPBT         *Table;
3550f8146b88SJung-uk Kim     ACPI_STATUS             Status;
3551f8146b88SJung-uk Kim 
3552f8146b88SJung-uk Kim 
3553f8146b88SJung-uk Kim     /* Compile the main table */
3554f8146b88SJung-uk Kim 
355597c0b5abSJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt, &Subtable);
3556f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
3557f8146b88SJung-uk Kim     {
3558f8146b88SJung-uk Kim         return (Status);
3559f8146b88SJung-uk Kim     }
3560f8146b88SJung-uk Kim 
3561f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
3562f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
356397c0b5abSJung-uk Kim     Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer);
356497c0b5abSJung-uk Kim 
356597c0b5abSJung-uk Kim     /*
356697c0b5abSJung-uk Kim      * Exit now if there are no arguments specified. This is indicated by:
356797c0b5abSJung-uk Kim      * The "Command-line Arguments" field has not been specified (if specified,
356897c0b5abSJung-uk Kim      * it will be the last field in the field list -- after the main table).
356997c0b5abSJung-uk Kim      * Set the Argument Length in the main table to zero.
357097c0b5abSJung-uk Kim      */
357197c0b5abSJung-uk Kim     if (!*PFieldList)
357297c0b5abSJung-uk Kim     {
357397c0b5abSJung-uk Kim         Table->ArgumentsLength = 0;
357497c0b5abSJung-uk Kim         return (AE_OK);
357597c0b5abSJung-uk Kim     }
3576f8146b88SJung-uk Kim 
3577f8146b88SJung-uk Kim     /* Compile the argument list subtable */
3578f8146b88SJung-uk Kim 
357997c0b5abSJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0, &Subtable);
3580f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
3581f8146b88SJung-uk Kim     {
3582f8146b88SJung-uk Kim         return (Status);
3583f8146b88SJung-uk Kim     }
3584f8146b88SJung-uk Kim 
3585f8146b88SJung-uk Kim     /* Extract the length of the Arguments buffer, insert into main table */
3586f8146b88SJung-uk Kim 
358797c0b5abSJung-uk Kim     Table->ArgumentsLength = (UINT16) Subtable->TotalLength;
3588f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
3589f8146b88SJung-uk Kim     return (AE_OK);
3590f8146b88SJung-uk Kim }
3591f8146b88SJung-uk Kim 
3592f8146b88SJung-uk Kim 
3593f8146b88SJung-uk Kim /******************************************************************************
3594f8146b88SJung-uk Kim  *
3595f8146b88SJung-uk Kim  * FUNCTION:    DtCompileXsdt
3596f8146b88SJung-uk Kim  *
3597f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
3598f8146b88SJung-uk Kim  *
3599f8146b88SJung-uk Kim  * RETURN:      Status
3600f8146b88SJung-uk Kim  *
3601f8146b88SJung-uk Kim  * DESCRIPTION: Compile XSDT.
3602f8146b88SJung-uk Kim  *
3603f8146b88SJung-uk Kim  *****************************************************************************/
3604f8146b88SJung-uk Kim 
3605f8146b88SJung-uk Kim ACPI_STATUS
DtCompileXsdt(void ** List)3606f8146b88SJung-uk Kim DtCompileXsdt (
3607f8146b88SJung-uk Kim     void                    **List)
3608f8146b88SJung-uk Kim {
3609f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
3610f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
3611f8146b88SJung-uk Kim     DT_FIELD                *FieldList = *(DT_FIELD **) List;
3612f8146b88SJung-uk Kim     UINT64                  Address;
3613f8146b88SJung-uk Kim 
3614f8146b88SJung-uk Kim 
3615f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
3616f8146b88SJung-uk Kim 
3617f8146b88SJung-uk Kim     while (FieldList)
3618f8146b88SJung-uk Kim     {
3619f8146b88SJung-uk Kim         DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
3620f8146b88SJung-uk Kim 
3621f8146b88SJung-uk Kim         DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
3622f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
3623f8146b88SJung-uk Kim         FieldList = FieldList->Next;
3624f8146b88SJung-uk Kim     }
3625f8146b88SJung-uk Kim 
3626f8146b88SJung-uk Kim     return (AE_OK);
3627f8146b88SJung-uk Kim }
3628f8146b88SJung-uk Kim 
3629f8146b88SJung-uk Kim 
3630f8146b88SJung-uk Kim /******************************************************************************
3631f8146b88SJung-uk Kim  *
3632f8146b88SJung-uk Kim  * FUNCTION:    DtCompileGeneric
3633f8146b88SJung-uk Kim  *
3634f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
3635f8146b88SJung-uk Kim  *              Name                - Field name to end generic compiling
3636f8146b88SJung-uk Kim  *              Length              - Compiled table length to return
3637f8146b88SJung-uk Kim  *
3638f8146b88SJung-uk Kim  * RETURN:      Status
3639f8146b88SJung-uk Kim  *
3640f8146b88SJung-uk Kim  * DESCRIPTION: Compile generic unknown table.
3641f8146b88SJung-uk Kim  *
3642f8146b88SJung-uk Kim  *****************************************************************************/
3643f8146b88SJung-uk Kim 
3644f8146b88SJung-uk Kim ACPI_STATUS
DtCompileGeneric(void ** List,char * Name,UINT32 * Length)3645f8146b88SJung-uk Kim DtCompileGeneric (
3646f8146b88SJung-uk Kim     void                    **List,
3647f8146b88SJung-uk Kim     char                    *Name,
3648f8146b88SJung-uk Kim     UINT32                  *Length)
3649f8146b88SJung-uk Kim {
3650f8146b88SJung-uk Kim     ACPI_STATUS             Status;
3651f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
3652f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
3653f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
3654f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *Info;
3655f8146b88SJung-uk Kim 
3656f8146b88SJung-uk Kim 
3657f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
3658f8146b88SJung-uk Kim 
3659f8146b88SJung-uk Kim     /*
3660f8146b88SJung-uk Kim      * Compile the "generic" portion of the table. This
3661f8146b88SJung-uk Kim      * part of the table is not predefined and any of the generic
3662f8146b88SJung-uk Kim      * operators may be used.
3663f8146b88SJung-uk Kim      */
3664f8146b88SJung-uk Kim 
3665f8146b88SJung-uk Kim     /* Find any and all labels in the entire generic portion */
3666f8146b88SJung-uk Kim 
3667f8146b88SJung-uk Kim     DtDetectAllLabels (*PFieldList);
3668f8146b88SJung-uk Kim 
3669f8146b88SJung-uk Kim     /* Now we can actually compile the parse tree */
3670f8146b88SJung-uk Kim 
3671f8146b88SJung-uk Kim     if (Length && *Length)
3672f8146b88SJung-uk Kim     {
3673f8146b88SJung-uk Kim         *Length = 0;
3674f8146b88SJung-uk Kim     }
3675f8146b88SJung-uk Kim     while (*PFieldList)
3676f8146b88SJung-uk Kim     {
3677f8146b88SJung-uk Kim         if (Name && !strcmp ((*PFieldList)->Name, Name))
3678f8146b88SJung-uk Kim         {
3679f8146b88SJung-uk Kim             break;
3680f8146b88SJung-uk Kim         }
3681f8146b88SJung-uk Kim 
3682f8146b88SJung-uk Kim         Info = DtGetGenericTableInfo ((*PFieldList)->Name);
3683f8146b88SJung-uk Kim         if (!Info)
3684f8146b88SJung-uk Kim         {
36856f1f1a63SJung-uk Kim             sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
3686f8146b88SJung-uk Kim                 (*PFieldList)->Name);
3687f8146b88SJung-uk Kim             DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
36886f1f1a63SJung-uk Kim                 (*PFieldList), AslGbl_MsgBuffer);
3689f8146b88SJung-uk Kim 
3690f8146b88SJung-uk Kim             *PFieldList = (*PFieldList)->Next;
3691f8146b88SJung-uk Kim             continue;
3692f8146b88SJung-uk Kim         }
3693f8146b88SJung-uk Kim 
3694f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, Info,
3695ff879b07SJung-uk Kim             &Subtable);
3696f8146b88SJung-uk Kim         if (ACPI_SUCCESS (Status))
3697f8146b88SJung-uk Kim         {
3698f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
3699f8146b88SJung-uk Kim             if (Length)
3700f8146b88SJung-uk Kim             {
3701f8146b88SJung-uk Kim                 *Length += Subtable->Length;
3702f8146b88SJung-uk Kim             }
3703f8146b88SJung-uk Kim         }
3704f8146b88SJung-uk Kim         else
3705f8146b88SJung-uk Kim         {
3706f8146b88SJung-uk Kim             *PFieldList = (*PFieldList)->Next;
3707f8146b88SJung-uk Kim 
3708f8146b88SJung-uk Kim             if (Status == AE_NOT_FOUND)
3709f8146b88SJung-uk Kim             {
37106f1f1a63SJung-uk Kim                 sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
3711f8146b88SJung-uk Kim                     (*PFieldList)->Name);
3712f8146b88SJung-uk Kim                 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
37136f1f1a63SJung-uk Kim                     (*PFieldList), AslGbl_MsgBuffer);
3714f8146b88SJung-uk Kim             }
3715f8146b88SJung-uk Kim         }
3716f8146b88SJung-uk Kim     }
3717f8146b88SJung-uk Kim 
3718f8146b88SJung-uk Kim     return (AE_OK);
3719f8146b88SJung-uk Kim }
3720