xref: /freebsd/sys/contrib/dev/acpica/compiler/dttable2.c (revision 58308fadece25ae4c12bd2f4dce3d73d9c23be43)
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  *
11*58308fadSJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2025, 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;
257804fe266SJung-uk Kim     ACPI_TABLE_HEADER       *Table;
258f8146b88SJung-uk Kim     ACPI_SUBTABLE_HEADER    *MadtHeader;
259f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
260804fe266SJung-uk Kim     UINT8                   Revision;
261f8146b88SJung-uk Kim 
262f8146b88SJung-uk Kim 
263f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
264ff879b07SJung-uk Kim         &Subtable);
265f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
266f8146b88SJung-uk Kim     {
267f8146b88SJung-uk Kim         return (Status);
268f8146b88SJung-uk Kim     }
269f8146b88SJung-uk Kim 
270f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
271f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
272f8146b88SJung-uk Kim 
273804fe266SJung-uk Kim     Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
274804fe266SJung-uk Kim     Revision = Table->Revision;
275804fe266SJung-uk Kim 
276f8146b88SJung-uk Kim     while (*PFieldList)
277f8146b88SJung-uk Kim     {
278f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
279f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
280ff879b07SJung-uk Kim             &Subtable);
281f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
282f8146b88SJung-uk Kim         {
283f8146b88SJung-uk Kim             return (Status);
284f8146b88SJung-uk Kim         }
285f8146b88SJung-uk Kim 
286f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
287f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
288f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
289f8146b88SJung-uk Kim 
290f8146b88SJung-uk Kim         MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
291f8146b88SJung-uk Kim 
292f8146b88SJung-uk Kim         switch (MadtHeader->Type)
293f8146b88SJung-uk Kim         {
294f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_APIC:
295f8146b88SJung-uk Kim 
296f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt0;
297f8146b88SJung-uk Kim             break;
298f8146b88SJung-uk Kim 
299f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_IO_APIC:
300f8146b88SJung-uk Kim 
301f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt1;
302f8146b88SJung-uk Kim             break;
303f8146b88SJung-uk Kim 
304f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
305f8146b88SJung-uk Kim 
306f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt2;
307f8146b88SJung-uk Kim             break;
308f8146b88SJung-uk Kim 
309f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_NMI_SOURCE:
310f8146b88SJung-uk Kim 
311f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt3;
312f8146b88SJung-uk Kim             break;
313f8146b88SJung-uk Kim 
314f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
315f8146b88SJung-uk Kim 
316f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt4;
317f8146b88SJung-uk Kim             break;
318f8146b88SJung-uk Kim 
319f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
320f8146b88SJung-uk Kim 
321f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt5;
322f8146b88SJung-uk Kim             break;
323f8146b88SJung-uk Kim 
324f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_IO_SAPIC:
325f8146b88SJung-uk Kim 
326f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt6;
327f8146b88SJung-uk Kim             break;
328f8146b88SJung-uk Kim 
329f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_SAPIC:
330f8146b88SJung-uk Kim 
331f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt7;
332f8146b88SJung-uk Kim             break;
333f8146b88SJung-uk Kim 
334f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
335f8146b88SJung-uk Kim 
336f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt8;
337f8146b88SJung-uk Kim             break;
338f8146b88SJung-uk Kim 
339f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_X2APIC:
340f8146b88SJung-uk Kim 
341f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt9;
342f8146b88SJung-uk Kim             break;
343f8146b88SJung-uk Kim 
344f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
345f8146b88SJung-uk Kim 
346f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt10;
347f8146b88SJung-uk Kim             break;
348f8146b88SJung-uk Kim 
349f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
350f8146b88SJung-uk Kim 
351804fe266SJung-uk Kim             if (Revision > 6)
352804fe266SJung-uk Kim                     InfoTable = AcpiDmTableInfoMadt11b;
353804fe266SJung-uk Kim             else if (Revision == 6)
354804fe266SJung-uk Kim                     InfoTable = AcpiDmTableInfoMadt11a;
355804fe266SJung-uk Kim             else
356f8146b88SJung-uk Kim                     InfoTable = AcpiDmTableInfoMadt11;
357f8146b88SJung-uk Kim             break;
358f8146b88SJung-uk Kim 
359f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
360f8146b88SJung-uk Kim 
361f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt12;
362f8146b88SJung-uk Kim             break;
363f8146b88SJung-uk Kim 
364f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
365f8146b88SJung-uk Kim 
366f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt13;
367f8146b88SJung-uk Kim             break;
368f8146b88SJung-uk Kim 
369f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
370f8146b88SJung-uk Kim 
371804fe266SJung-uk Kim             InfoTable = Revision > 6 ? AcpiDmTableInfoMadt14a
372804fe266SJung-uk Kim                                      : AcpiDmTableInfoMadt14;
373f8146b88SJung-uk Kim             break;
374f8146b88SJung-uk Kim 
375f8146b88SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
376f8146b88SJung-uk Kim 
377804fe266SJung-uk Kim             InfoTable = Revision > 6 ? AcpiDmTableInfoMadt15a
378804fe266SJung-uk Kim                                      : AcpiDmTableInfoMadt15;
379804fe266SJung-uk Kim 
380f8146b88SJung-uk Kim             break;
381f8146b88SJung-uk Kim 
382cfd1ed46SJung-uk Kim         case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
383cfd1ed46SJung-uk Kim 
384cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt16;
385cfd1ed46SJung-uk Kim             break;
386cfd1ed46SJung-uk Kim 
38707c64d74SJung-uk Kim         case ACPI_MADT_TYPE_CORE_PIC:
38807c64d74SJung-uk Kim 
38907c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt17;
39007c64d74SJung-uk Kim             break;
39107c64d74SJung-uk Kim 
39207c64d74SJung-uk Kim         case ACPI_MADT_TYPE_LIO_PIC:
39307c64d74SJung-uk Kim 
39407c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt18;
39507c64d74SJung-uk Kim             break;
39607c64d74SJung-uk Kim 
39707c64d74SJung-uk Kim         case ACPI_MADT_TYPE_HT_PIC:
39807c64d74SJung-uk Kim 
39907c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt19;
40007c64d74SJung-uk Kim             break;
40107c64d74SJung-uk Kim 
40207c64d74SJung-uk Kim         case ACPI_MADT_TYPE_EIO_PIC:
40307c64d74SJung-uk Kim 
40407c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt20;
40507c64d74SJung-uk Kim             break;
40607c64d74SJung-uk Kim 
40707c64d74SJung-uk Kim         case ACPI_MADT_TYPE_MSI_PIC:
40807c64d74SJung-uk Kim 
40907c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt21;
41007c64d74SJung-uk Kim             break;
41107c64d74SJung-uk Kim 
41207c64d74SJung-uk Kim         case ACPI_MADT_TYPE_BIO_PIC:
41307c64d74SJung-uk Kim 
41407c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt22;
41507c64d74SJung-uk Kim             break;
41607c64d74SJung-uk Kim 
41707c64d74SJung-uk Kim         case ACPI_MADT_TYPE_LPC_PIC:
41807c64d74SJung-uk Kim 
41907c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt23;
42007c64d74SJung-uk Kim             break;
42107c64d74SJung-uk Kim 
42207c64d74SJung-uk Kim         case ACPI_MADT_TYPE_RINTC:
42307c64d74SJung-uk Kim 
42407c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt24;
42507c64d74SJung-uk Kim             break;
42607c64d74SJung-uk Kim 
42707c64d74SJung-uk Kim         case ACPI_MADT_TYPE_IMSIC:
42807c64d74SJung-uk Kim 
42907c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt25;
43007c64d74SJung-uk Kim             break;
43107c64d74SJung-uk Kim 
43207c64d74SJung-uk Kim         case ACPI_MADT_TYPE_APLIC:
43307c64d74SJung-uk Kim 
43407c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt26;
43507c64d74SJung-uk Kim             break;
43607c64d74SJung-uk Kim 
43707c64d74SJung-uk Kim         case ACPI_MADT_TYPE_PLIC:
43807c64d74SJung-uk Kim 
43907c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt27;
44007c64d74SJung-uk Kim             break;
44107c64d74SJung-uk Kim 
442f8146b88SJung-uk Kim         default:
443f8146b88SJung-uk Kim 
444ab71bbb7SJung-uk Kim             if (MadtHeader->Type >= ACPI_MADT_TYPE_OEM_RESERVED)
445ab71bbb7SJung-uk Kim             {
44607c64d74SJung-uk Kim                 InfoTable = AcpiDmTableInfoMadt128;
447ab71bbb7SJung-uk Kim             }
448ab71bbb7SJung-uk Kim             else
449ab71bbb7SJung-uk Kim             {
450f8146b88SJung-uk Kim                 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
451f8146b88SJung-uk Kim                 return (AE_ERROR);
452f8146b88SJung-uk Kim             }
453f8146b88SJung-uk Kim 
454ab71bbb7SJung-uk Kim             break;
455ab71bbb7SJung-uk Kim         }
456ab71bbb7SJung-uk Kim 
457ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
458f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
459f8146b88SJung-uk Kim         {
460f8146b88SJung-uk Kim             return (Status);
461f8146b88SJung-uk Kim         }
462f8146b88SJung-uk Kim 
463f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
464f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
465f8146b88SJung-uk Kim         DtPopSubtable ();
466f8146b88SJung-uk Kim     }
467f8146b88SJung-uk Kim 
468f8146b88SJung-uk Kim     return (AE_OK);
469f8146b88SJung-uk Kim }
470f8146b88SJung-uk Kim 
471f8146b88SJung-uk Kim 
472f8146b88SJung-uk Kim /******************************************************************************
473f8146b88SJung-uk Kim  *
474f8146b88SJung-uk Kim  * FUNCTION:    DtCompileMcfg
475f8146b88SJung-uk Kim  *
476f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
477f8146b88SJung-uk Kim  *
478f8146b88SJung-uk Kim  * RETURN:      Status
479f8146b88SJung-uk Kim  *
480f8146b88SJung-uk Kim  * DESCRIPTION: Compile MCFG.
481f8146b88SJung-uk Kim  *
482f8146b88SJung-uk Kim  *****************************************************************************/
483f8146b88SJung-uk Kim 
484f8146b88SJung-uk Kim ACPI_STATUS
DtCompileMcfg(void ** List)485f8146b88SJung-uk Kim DtCompileMcfg (
486f8146b88SJung-uk Kim     void                    **List)
487f8146b88SJung-uk Kim {
488f8146b88SJung-uk Kim     ACPI_STATUS             Status;
489f8146b88SJung-uk Kim 
490f8146b88SJung-uk Kim 
491f8146b88SJung-uk Kim     Status = DtCompileTwoSubtables (List,
492f8146b88SJung-uk Kim         AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
493f8146b88SJung-uk Kim     return (Status);
494f8146b88SJung-uk Kim }
495f8146b88SJung-uk Kim 
496722b1667SJung-uk Kim /******************************************************************************
497722b1667SJung-uk Kim  *
498722b1667SJung-uk Kim  * FUNCTION:    DtCompileMpam
499722b1667SJung-uk Kim  *
500722b1667SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
501722b1667SJung-uk Kim  *
502722b1667SJung-uk Kim  * RETURN:      Status
503722b1667SJung-uk Kim  *
504722b1667SJung-uk Kim  * DESCRIPTION: Compile MPAM.
505722b1667SJung-uk Kim  *
506722b1667SJung-uk Kim  *****************************************************************************/
507722b1667SJung-uk Kim 
508722b1667SJung-uk Kim ACPI_STATUS
DtCompileMpam(void ** List)509722b1667SJung-uk Kim DtCompileMpam (
510722b1667SJung-uk Kim     void                    **List)
511722b1667SJung-uk Kim {
512722b1667SJung-uk Kim     ACPI_STATUS             Status;
513722b1667SJung-uk Kim     DT_SUBTABLE             *ParentTable;
514722b1667SJung-uk Kim     DT_SUBTABLE             *Subtable;
515722b1667SJung-uk Kim     DT_FIELD                *SubtableStart;
516722b1667SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
517722b1667SJung-uk Kim     ACPI_MPAM_MSC_NODE      *MpamMscNode;
518722b1667SJung-uk Kim     ACPI_MPAM_RESOURCE_NODE *MpamResourceNode;
519722b1667SJung-uk Kim     UINT32                  FuncDepsCount;
520722b1667SJung-uk Kim     UINT32                  RisLength;
521722b1667SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
522722b1667SJung-uk Kim 
523722b1667SJung-uk Kim     ParentTable = DtPeekSubtable ();
524722b1667SJung-uk Kim 
525722b1667SJung-uk Kim     while (*PFieldList)
526722b1667SJung-uk Kim     {
527722b1667SJung-uk Kim         SubtableStart = *PFieldList;
528722b1667SJung-uk Kim 
529722b1667SJung-uk Kim         /* Main MSC Node table */
530722b1667SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam0,
531722b1667SJung-uk Kim             &Subtable);
532722b1667SJung-uk Kim         if (ACPI_FAILURE (Status))
533722b1667SJung-uk Kim         {
534722b1667SJung-uk Kim             return (Status);
535722b1667SJung-uk Kim         }
536722b1667SJung-uk Kim 
537722b1667SJung-uk Kim         MpamMscNode = ACPI_CAST_PTR (ACPI_MPAM_MSC_NODE, Subtable->Buffer);
538722b1667SJung-uk Kim 
539722b1667SJung-uk Kim         ParentTable = DtPeekSubtable ();
540722b1667SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
541722b1667SJung-uk Kim         DtPushSubtable (Subtable);
542722b1667SJung-uk Kim 
543722b1667SJung-uk Kim         ParentTable = DtPeekSubtable ();
544722b1667SJung-uk Kim 
545722b1667SJung-uk Kim         /*
546722b1667SJung-uk Kim          * RIS(es) per MSC node have variable lengths depending on how many RISes there and
547722b1667SJung-uk Kim          * any how many functional dependencies per RIS. Calculate it in order
548722b1667SJung-uk Kim          * to properly set the overall MSC length.
549722b1667SJung-uk Kim          */
550722b1667SJung-uk Kim         RisLength = 0;
551722b1667SJung-uk Kim 
552722b1667SJung-uk Kim         /* Iterate over RIS subtables per MSC node */
55392f570c3SJung-uk Kim         for (UINT32 ris = 0; ris < MpamMscNode->NumResourceNodes; ris++)
554722b1667SJung-uk Kim         {
555722b1667SJung-uk Kim             /* Compile RIS subtable */
556722b1667SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam1,
557722b1667SJung-uk Kim                 &Subtable);
558722b1667SJung-uk Kim             if (ACPI_FAILURE (Status))
559722b1667SJung-uk Kim             {
560722b1667SJung-uk Kim                 return (Status);
561722b1667SJung-uk Kim             }
562722b1667SJung-uk Kim 
563722b1667SJung-uk Kim             MpamResourceNode = ACPI_CAST_PTR (ACPI_MPAM_RESOURCE_NODE, Subtable->Buffer);
564722b1667SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
565722b1667SJung-uk Kim             DtPushSubtable (Subtable);
566722b1667SJung-uk Kim 
567722b1667SJung-uk Kim             ParentTable = DtPeekSubtable ();
568722b1667SJung-uk Kim 
569722b1667SJung-uk Kim             switch (MpamResourceNode->LocatorType)
570722b1667SJung-uk Kim             {
571722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE:
572722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1A;
573722b1667SJung-uk Kim                     break;
574722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_MEMORY:
575722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1B;
576722b1667SJung-uk Kim                     break;
577722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_SMMU:
578722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1C;
579722b1667SJung-uk Kim                     break;
580722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_MEMORY_CACHE:
581722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1D;
582722b1667SJung-uk Kim                     break;
583722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_ACPI_DEVICE:
584722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1E;
585722b1667SJung-uk Kim                     break;
586722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_INTERCONNECT:
587722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1F;
588722b1667SJung-uk Kim                     break;
589722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_UNKNOWN:
590722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1G;
591722b1667SJung-uk Kim                 default:
592722b1667SJung-uk Kim                     DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "Resource Locator Type");
593722b1667SJung-uk Kim                     return (AE_ERROR);
594722b1667SJung-uk Kim             }
595722b1667SJung-uk Kim 
596722b1667SJung-uk Kim             /* Compile Resource Locator Table */
597722b1667SJung-uk Kim             Status = DtCompileTable (PFieldList, InfoTable,
598722b1667SJung-uk Kim                 &Subtable);
599722b1667SJung-uk Kim 
600722b1667SJung-uk Kim             if (ACPI_FAILURE (Status))
601722b1667SJung-uk Kim             {
602722b1667SJung-uk Kim                 return (Status);
603722b1667SJung-uk Kim             }
604722b1667SJung-uk Kim 
605722b1667SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
606722b1667SJung-uk Kim 
607722b1667SJung-uk Kim             /* Compile the number of functional dependencies per RIS */
608722b1667SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam1Deps,
609722b1667SJung-uk Kim                 &Subtable);
610722b1667SJung-uk Kim 
611722b1667SJung-uk Kim             if (ACPI_FAILURE (Status))
612722b1667SJung-uk Kim             {
613722b1667SJung-uk Kim                 return (Status);
614722b1667SJung-uk Kim             }
615722b1667SJung-uk Kim 
616722b1667SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
617722b1667SJung-uk Kim             FuncDepsCount = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
618722b1667SJung-uk Kim 
619722b1667SJung-uk Kim             RisLength += sizeof(ACPI_MPAM_RESOURCE_NODE) +
620722b1667SJung-uk Kim                 FuncDepsCount * sizeof(ACPI_MPAM_FUNC_DEPS);
621722b1667SJung-uk Kim 
622722b1667SJung-uk Kim             /* Iterate over functional dependencies per RIS */
623722b1667SJung-uk Kim             for (UINT32 funcDep = 0; funcDep < FuncDepsCount; funcDep++)
624722b1667SJung-uk Kim             {
625722b1667SJung-uk Kim                 /* Compiler functional dependencies table */
626722b1667SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam2,
627722b1667SJung-uk Kim                     &Subtable);
628722b1667SJung-uk Kim 
629722b1667SJung-uk Kim                 if (ACPI_FAILURE (Status))
630722b1667SJung-uk Kim                 {
631722b1667SJung-uk Kim                     return (Status);
632722b1667SJung-uk Kim                 }
633722b1667SJung-uk Kim 
634722b1667SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
635722b1667SJung-uk Kim             }
636722b1667SJung-uk Kim 
637722b1667SJung-uk Kim             DtPopSubtable ();
638722b1667SJung-uk Kim         }
639722b1667SJung-uk Kim 
640722b1667SJung-uk Kim         /* Check if the length of the MSC is correct and override with the correct length */
641722b1667SJung-uk Kim         if (MpamMscNode->Length != sizeof(ACPI_MPAM_MSC_NODE) + RisLength)
642722b1667SJung-uk Kim         {
643722b1667SJung-uk Kim             MpamMscNode->Length = (UINT16) (sizeof(ACPI_MPAM_MSC_NODE) + RisLength);
644722b1667SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "Overriding MSC->Length: %X\n", MpamMscNode->Length);
645722b1667SJung-uk Kim         }
646722b1667SJung-uk Kim 
647722b1667SJung-uk Kim         DtPopSubtable ();
648722b1667SJung-uk Kim     }
649722b1667SJung-uk Kim 
650722b1667SJung-uk Kim     return (AE_OK);
651722b1667SJung-uk Kim }
652722b1667SJung-uk Kim 
653f8146b88SJung-uk Kim 
654f8146b88SJung-uk Kim /******************************************************************************
655f8146b88SJung-uk Kim  *
656f8146b88SJung-uk Kim  * FUNCTION:    DtCompileMpst
657f8146b88SJung-uk Kim  *
658f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
659f8146b88SJung-uk Kim  *
660f8146b88SJung-uk Kim  * RETURN:      Status
661f8146b88SJung-uk Kim  *
662f8146b88SJung-uk Kim  * DESCRIPTION: Compile MPST.
663f8146b88SJung-uk Kim  *
664f8146b88SJung-uk Kim  *****************************************************************************/
665f8146b88SJung-uk Kim 
666f8146b88SJung-uk Kim ACPI_STATUS
DtCompileMpst(void ** List)667f8146b88SJung-uk Kim DtCompileMpst (
668f8146b88SJung-uk Kim     void                    **List)
669f8146b88SJung-uk Kim {
670f8146b88SJung-uk Kim     ACPI_STATUS             Status;
671f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
672f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
673f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
674f8146b88SJung-uk Kim     ACPI_MPST_CHANNEL       *MpstChannelInfo;
675f8146b88SJung-uk Kim     ACPI_MPST_POWER_NODE    *MpstPowerNode;
676f8146b88SJung-uk Kim     ACPI_MPST_DATA_HDR      *MpstDataHeader;
677f8146b88SJung-uk Kim     UINT16                  SubtableCount;
678f8146b88SJung-uk Kim     UINT32                  PowerStateCount;
679f8146b88SJung-uk Kim     UINT32                  ComponentCount;
680f8146b88SJung-uk Kim 
681f8146b88SJung-uk Kim 
682f8146b88SJung-uk Kim     /* Main table */
683f8146b88SJung-uk Kim 
684ff879b07SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable);
685f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
686f8146b88SJung-uk Kim     {
687f8146b88SJung-uk Kim         return (Status);
688f8146b88SJung-uk Kim     }
689f8146b88SJung-uk Kim 
690f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
691f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
692f8146b88SJung-uk Kim     DtPushSubtable (Subtable);
693f8146b88SJung-uk Kim 
694f8146b88SJung-uk Kim     MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
695f8146b88SJung-uk Kim     SubtableCount = MpstChannelInfo->PowerNodeCount;
696f8146b88SJung-uk Kim 
697f8146b88SJung-uk Kim     while (*PFieldList && SubtableCount)
698f8146b88SJung-uk Kim     {
699f8146b88SJung-uk Kim         /* Subtable: Memory Power Node(s) */
700f8146b88SJung-uk Kim 
701f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
702ff879b07SJung-uk Kim             &Subtable);
703f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
704f8146b88SJung-uk Kim         {
705f8146b88SJung-uk Kim             return (Status);
706f8146b88SJung-uk Kim         }
707f8146b88SJung-uk Kim 
708f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
709f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
710f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
711f8146b88SJung-uk Kim 
712f8146b88SJung-uk Kim         MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
713f8146b88SJung-uk Kim         PowerStateCount = MpstPowerNode->NumPowerStates;
714f8146b88SJung-uk Kim         ComponentCount = MpstPowerNode->NumPhysicalComponents;
715f8146b88SJung-uk Kim 
716f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
717f8146b88SJung-uk Kim 
718f8146b88SJung-uk Kim         /* Sub-subtables - Memory Power State Structure(s) */
719f8146b88SJung-uk Kim 
720f8146b88SJung-uk Kim         while (*PFieldList && PowerStateCount)
721f8146b88SJung-uk Kim         {
722f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
723ff879b07SJung-uk Kim                 &Subtable);
724f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
725f8146b88SJung-uk Kim             {
726f8146b88SJung-uk Kim                 return (Status);
727f8146b88SJung-uk Kim             }
728f8146b88SJung-uk Kim 
729f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
730f8146b88SJung-uk Kim             PowerStateCount--;
731f8146b88SJung-uk Kim         }
732f8146b88SJung-uk Kim 
733f8146b88SJung-uk Kim         /* Sub-subtables - Physical Component ID Structure(s) */
734f8146b88SJung-uk Kim 
735f8146b88SJung-uk Kim         while (*PFieldList && ComponentCount)
736f8146b88SJung-uk Kim         {
737f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
738ff879b07SJung-uk Kim                 &Subtable);
739f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
740f8146b88SJung-uk Kim             {
741f8146b88SJung-uk Kim                 return (Status);
742f8146b88SJung-uk Kim             }
743f8146b88SJung-uk Kim 
744f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
745f8146b88SJung-uk Kim             ComponentCount--;
746f8146b88SJung-uk Kim         }
747f8146b88SJung-uk Kim 
748f8146b88SJung-uk Kim         SubtableCount--;
749f8146b88SJung-uk Kim         DtPopSubtable ();
750f8146b88SJung-uk Kim     }
751f8146b88SJung-uk Kim 
752f8146b88SJung-uk Kim     /* Subtable: Count of Memory Power State Characteristic structures */
753f8146b88SJung-uk Kim 
754f8146b88SJung-uk Kim     DtPopSubtable ();
755f8146b88SJung-uk Kim 
756ff879b07SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable);
757f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
758f8146b88SJung-uk Kim     {
759f8146b88SJung-uk Kim         return (Status);
760f8146b88SJung-uk Kim     }
761f8146b88SJung-uk Kim 
762f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
763f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
764f8146b88SJung-uk Kim     DtPushSubtable (Subtable);
765f8146b88SJung-uk Kim 
766f8146b88SJung-uk Kim     MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
767f8146b88SJung-uk Kim     SubtableCount = MpstDataHeader->CharacteristicsCount;
768f8146b88SJung-uk Kim 
769f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
770f8146b88SJung-uk Kim 
771f8146b88SJung-uk Kim     /* Subtable: Memory Power State Characteristics structure(s) */
772f8146b88SJung-uk Kim 
773f8146b88SJung-uk Kim     while (*PFieldList && SubtableCount)
774f8146b88SJung-uk Kim     {
775f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
776ff879b07SJung-uk Kim             &Subtable);
777f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
778f8146b88SJung-uk Kim         {
779f8146b88SJung-uk Kim             return (Status);
780f8146b88SJung-uk Kim         }
781f8146b88SJung-uk Kim 
782f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
783f8146b88SJung-uk Kim         SubtableCount--;
784f8146b88SJung-uk Kim     }
785f8146b88SJung-uk Kim 
786f8146b88SJung-uk Kim     DtPopSubtable ();
787f8146b88SJung-uk Kim     return (AE_OK);
788f8146b88SJung-uk Kim }
789f8146b88SJung-uk Kim 
790f8146b88SJung-uk Kim 
791f8146b88SJung-uk Kim /******************************************************************************
792f8146b88SJung-uk Kim  *
793*58308fadSJung-uk Kim  * FUNCTION:    DtCompileMrrm
794*58308fadSJung-uk Kim  *
795*58308fadSJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
796*58308fadSJung-uk Kim  *
797*58308fadSJung-uk Kim  * RETURN:      Status
798*58308fadSJung-uk Kim  *
799*58308fadSJung-uk Kim  * DESCRIPTION: Compile MRRM.
800*58308fadSJung-uk Kim  *
801*58308fadSJung-uk Kim  *****************************************************************************/
802*58308fadSJung-uk Kim 
803*58308fadSJung-uk Kim ACPI_STATUS
DtCompileMrrm(void ** List)804*58308fadSJung-uk Kim DtCompileMrrm (
805*58308fadSJung-uk Kim     void                    **List)
806*58308fadSJung-uk Kim {
807*58308fadSJung-uk Kim     ACPI_STATUS             Status;
808*58308fadSJung-uk Kim     DT_SUBTABLE             *Subtable;
809*58308fadSJung-uk Kim     DT_SUBTABLE             *ParentTable;
810*58308fadSJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
811*58308fadSJung-uk Kim 
812*58308fadSJung-uk Kim     /* Main table */
813*58308fadSJung-uk Kim 
814*58308fadSJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMrrm,
815*58308fadSJung-uk Kim         &Subtable);
816*58308fadSJung-uk Kim     if (ACPI_FAILURE (Status))
817*58308fadSJung-uk Kim     {
818*58308fadSJung-uk Kim         return (Status);
819*58308fadSJung-uk Kim     }
820*58308fadSJung-uk Kim 
821*58308fadSJung-uk Kim     ParentTable = DtPeekSubtable ();
822*58308fadSJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
823*58308fadSJung-uk Kim 
824*58308fadSJung-uk Kim     /* Subtables (all are same type) */
825*58308fadSJung-uk Kim 
826*58308fadSJung-uk Kim     while (*PFieldList)
827*58308fadSJung-uk Kim     {
828*58308fadSJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMrrm0,
829*58308fadSJung-uk Kim             &Subtable);
830*58308fadSJung-uk Kim         if (ACPI_FAILURE (Status))
831*58308fadSJung-uk Kim         {
832*58308fadSJung-uk Kim             return (Status);
833*58308fadSJung-uk Kim         }
834*58308fadSJung-uk Kim 
835*58308fadSJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
836*58308fadSJung-uk Kim     }
837*58308fadSJung-uk Kim 
838*58308fadSJung-uk Kim     return (AE_OK);
839*58308fadSJung-uk Kim }
840*58308fadSJung-uk Kim 
841*58308fadSJung-uk Kim 
842*58308fadSJung-uk Kim /******************************************************************************
843*58308fadSJung-uk Kim  *
844f8146b88SJung-uk Kim  * FUNCTION:    DtCompileMsct
845f8146b88SJung-uk Kim  *
846f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
847f8146b88SJung-uk Kim  *
848f8146b88SJung-uk Kim  * RETURN:      Status
849f8146b88SJung-uk Kim  *
850f8146b88SJung-uk Kim  * DESCRIPTION: Compile MSCT.
851f8146b88SJung-uk Kim  *
852f8146b88SJung-uk Kim  *****************************************************************************/
853f8146b88SJung-uk Kim 
854f8146b88SJung-uk Kim ACPI_STATUS
DtCompileMsct(void ** List)855f8146b88SJung-uk Kim DtCompileMsct (
856f8146b88SJung-uk Kim     void                    **List)
857f8146b88SJung-uk Kim {
858f8146b88SJung-uk Kim     ACPI_STATUS             Status;
859f8146b88SJung-uk Kim 
860f8146b88SJung-uk Kim 
861f8146b88SJung-uk Kim     Status = DtCompileTwoSubtables (List,
862f8146b88SJung-uk Kim         AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
863f8146b88SJung-uk Kim     return (Status);
864f8146b88SJung-uk Kim }
865f8146b88SJung-uk Kim 
866f8146b88SJung-uk Kim 
867f8146b88SJung-uk Kim /******************************************************************************
868f8146b88SJung-uk Kim  *
869f8146b88SJung-uk Kim  * FUNCTION:    DtCompileNfit
870f8146b88SJung-uk Kim  *
871f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
872f8146b88SJung-uk Kim  *
873f8146b88SJung-uk Kim  * RETURN:      Status
874f8146b88SJung-uk Kim  *
875f8146b88SJung-uk Kim  * DESCRIPTION: Compile NFIT.
876f8146b88SJung-uk Kim  *
877f8146b88SJung-uk Kim  *****************************************************************************/
878f8146b88SJung-uk Kim 
879f8146b88SJung-uk Kim ACPI_STATUS
DtCompileNfit(void ** List)880f8146b88SJung-uk Kim DtCompileNfit (
881f8146b88SJung-uk Kim     void                    **List)
882f8146b88SJung-uk Kim {
883f8146b88SJung-uk Kim     ACPI_STATUS             Status;
884f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
885f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
886f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
887f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
888f8146b88SJung-uk Kim     ACPI_NFIT_HEADER        *NfitHeader;
889f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
890f8146b88SJung-uk Kim     UINT32                  Count;
891f8146b88SJung-uk Kim     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
892f8146b88SJung-uk Kim     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
893f8146b88SJung-uk Kim 
894f8146b88SJung-uk Kim 
895f8146b88SJung-uk Kim     /* Main table */
896f8146b88SJung-uk Kim 
897f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit,
898ff879b07SJung-uk Kim         &Subtable);
899f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
900f8146b88SJung-uk Kim     {
901f8146b88SJung-uk Kim         return (Status);
902f8146b88SJung-uk Kim     }
903f8146b88SJung-uk Kim 
904f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
905f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
906f8146b88SJung-uk Kim     DtPushSubtable (Subtable);
907f8146b88SJung-uk Kim 
908f8146b88SJung-uk Kim     /* Subtables */
909f8146b88SJung-uk Kim 
910f8146b88SJung-uk Kim     while (*PFieldList)
911f8146b88SJung-uk Kim     {
912f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
913f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr,
914ff879b07SJung-uk Kim             &Subtable);
915f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
916f8146b88SJung-uk Kim         {
917f8146b88SJung-uk Kim             return (Status);
918f8146b88SJung-uk Kim         }
919f8146b88SJung-uk Kim 
920f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
921f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
922f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
923f8146b88SJung-uk Kim 
924f8146b88SJung-uk Kim         NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
925f8146b88SJung-uk Kim 
926f8146b88SJung-uk Kim         switch (NfitHeader->Type)
927f8146b88SJung-uk Kim         {
928f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
929f8146b88SJung-uk Kim 
930f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit0;
931f8146b88SJung-uk Kim             break;
932f8146b88SJung-uk Kim 
933f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_MEMORY_MAP:
934f8146b88SJung-uk Kim 
935f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit1;
936f8146b88SJung-uk Kim             break;
937f8146b88SJung-uk Kim 
938f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_INTERLEAVE:
939f8146b88SJung-uk Kim 
940f8146b88SJung-uk Kim             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer);
941f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit2;
942f8146b88SJung-uk Kim             break;
943f8146b88SJung-uk Kim 
944f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_SMBIOS:
945f8146b88SJung-uk Kim 
946f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit3;
947f8146b88SJung-uk Kim             break;
948f8146b88SJung-uk Kim 
949f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_CONTROL_REGION:
950f8146b88SJung-uk Kim 
951f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit4;
952f8146b88SJung-uk Kim             break;
953f8146b88SJung-uk Kim 
954f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_DATA_REGION:
955f8146b88SJung-uk Kim 
956f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit5;
957f8146b88SJung-uk Kim             break;
958f8146b88SJung-uk Kim 
959f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
960f8146b88SJung-uk Kim 
961f8146b88SJung-uk Kim             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer);
962f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit6;
963f8146b88SJung-uk Kim             break;
964f8146b88SJung-uk Kim 
965b7b7e711SJung-uk Kim         case ACPI_NFIT_TYPE_CAPABILITIES:
966b7b7e711SJung-uk Kim 
967b7b7e711SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit7;
968b7b7e711SJung-uk Kim             break;
969b7b7e711SJung-uk Kim 
970f8146b88SJung-uk Kim         default:
971f8146b88SJung-uk Kim 
972f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT");
973f8146b88SJung-uk Kim             return (AE_ERROR);
974f8146b88SJung-uk Kim         }
975f8146b88SJung-uk Kim 
976ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &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         ParentTable = DtPeekSubtable ();
983f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
984f8146b88SJung-uk Kim         DtPopSubtable ();
985f8146b88SJung-uk Kim 
986f8146b88SJung-uk Kim         switch (NfitHeader->Type)
987f8146b88SJung-uk Kim         {
988f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_INTERLEAVE:
989f8146b88SJung-uk Kim 
990f8146b88SJung-uk Kim             Count = 0;
991f8146b88SJung-uk Kim             DtPushSubtable (Subtable);
992f8146b88SJung-uk Kim             while (*PFieldList)
993f8146b88SJung-uk Kim             {
994f8146b88SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a,
995ff879b07SJung-uk Kim                     &Subtable);
996f8146b88SJung-uk Kim                 if (ACPI_FAILURE (Status))
997f8146b88SJung-uk Kim                 {
998f8146b88SJung-uk Kim                     return (Status);
999f8146b88SJung-uk Kim                 }
1000f8146b88SJung-uk Kim 
1001f8146b88SJung-uk Kim                 if (!Subtable)
1002f8146b88SJung-uk Kim                 {
1003f8146b88SJung-uk Kim                     DtPopSubtable ();
1004f8146b88SJung-uk Kim                     break;
1005f8146b88SJung-uk Kim                 }
1006f8146b88SJung-uk Kim 
1007f8146b88SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1008f8146b88SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1009f8146b88SJung-uk Kim                 Count++;
1010f8146b88SJung-uk Kim             }
1011f8146b88SJung-uk Kim 
1012f8146b88SJung-uk Kim             Interleave->LineCount = Count;
1013f8146b88SJung-uk Kim             break;
1014f8146b88SJung-uk Kim 
1015f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_SMBIOS:
1016f8146b88SJung-uk Kim 
1017f8146b88SJung-uk Kim             if (*PFieldList)
1018f8146b88SJung-uk Kim             {
1019f8146b88SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a,
1020ff879b07SJung-uk Kim                     &Subtable);
1021f8146b88SJung-uk Kim                 if (ACPI_FAILURE (Status))
1022f8146b88SJung-uk Kim                 {
1023f8146b88SJung-uk Kim                     return (Status);
1024f8146b88SJung-uk Kim                 }
1025f8146b88SJung-uk Kim 
1026f8146b88SJung-uk Kim                 if (Subtable)
1027f8146b88SJung-uk Kim                 {
1028f8146b88SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
1029f8146b88SJung-uk Kim                 }
1030f8146b88SJung-uk Kim             }
1031f8146b88SJung-uk Kim             break;
1032f8146b88SJung-uk Kim 
1033f8146b88SJung-uk Kim         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
1034f8146b88SJung-uk Kim 
1035f8146b88SJung-uk Kim             Count = 0;
1036f8146b88SJung-uk Kim             DtPushSubtable (Subtable);
1037f8146b88SJung-uk Kim             while (*PFieldList)
1038f8146b88SJung-uk Kim             {
1039f8146b88SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a,
1040ff879b07SJung-uk Kim                     &Subtable);
1041f8146b88SJung-uk Kim                 if (ACPI_FAILURE (Status))
1042f8146b88SJung-uk Kim                 {
1043f8146b88SJung-uk Kim                     return (Status);
1044f8146b88SJung-uk Kim                 }
1045f8146b88SJung-uk Kim 
1046f8146b88SJung-uk Kim                 if (!Subtable)
1047f8146b88SJung-uk Kim                 {
1048f8146b88SJung-uk Kim                     DtPopSubtable ();
1049f8146b88SJung-uk Kim                     break;
1050f8146b88SJung-uk Kim                 }
1051f8146b88SJung-uk Kim 
1052f8146b88SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1053f8146b88SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1054f8146b88SJung-uk Kim                 Count++;
1055f8146b88SJung-uk Kim             }
1056f8146b88SJung-uk Kim 
1057f8146b88SJung-uk Kim             Hint->HintCount = (UINT16) Count;
1058f8146b88SJung-uk Kim             break;
1059f8146b88SJung-uk Kim 
1060f8146b88SJung-uk Kim         default:
1061f8146b88SJung-uk Kim             break;
1062f8146b88SJung-uk Kim         }
1063f8146b88SJung-uk Kim     }
1064f8146b88SJung-uk Kim 
1065f8146b88SJung-uk Kim     return (AE_OK);
1066f8146b88SJung-uk Kim }
1067f8146b88SJung-uk Kim 
1068f8146b88SJung-uk Kim 
1069f8146b88SJung-uk Kim /******************************************************************************
1070f8146b88SJung-uk Kim  *
1071f8146b88SJung-uk Kim  * FUNCTION:    DtCompilePcct
1072f8146b88SJung-uk Kim  *
1073f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1074f8146b88SJung-uk Kim  *
1075f8146b88SJung-uk Kim  * RETURN:      Status
1076f8146b88SJung-uk Kim  *
1077f8146b88SJung-uk Kim  * DESCRIPTION: Compile PCCT.
1078f8146b88SJung-uk Kim  *
1079f8146b88SJung-uk Kim  *****************************************************************************/
1080f8146b88SJung-uk Kim 
1081f8146b88SJung-uk Kim ACPI_STATUS
DtCompilePcct(void ** List)1082f8146b88SJung-uk Kim DtCompilePcct (
1083f8146b88SJung-uk Kim     void                    **List)
1084f8146b88SJung-uk Kim {
1085f8146b88SJung-uk Kim     ACPI_STATUS             Status;
1086f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
1087f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1088f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1089f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
1090f8146b88SJung-uk Kim     ACPI_SUBTABLE_HEADER    *PcctHeader;
1091f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1092f8146b88SJung-uk Kim 
1093f8146b88SJung-uk Kim 
1094f8146b88SJung-uk Kim     /* Main table */
1095f8146b88SJung-uk Kim 
1096f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
1097ff879b07SJung-uk Kim         &Subtable);
1098f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
1099f8146b88SJung-uk Kim     {
1100f8146b88SJung-uk Kim         return (Status);
1101f8146b88SJung-uk Kim     }
1102f8146b88SJung-uk Kim 
1103f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
1104f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1105f8146b88SJung-uk Kim 
1106f8146b88SJung-uk Kim     /* Subtables */
1107f8146b88SJung-uk Kim 
1108f8146b88SJung-uk Kim     while (*PFieldList)
1109f8146b88SJung-uk Kim     {
1110f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
1111f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
1112ff879b07SJung-uk Kim             &Subtable);
1113f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
1114f8146b88SJung-uk Kim         {
1115f8146b88SJung-uk Kim             return (Status);
1116f8146b88SJung-uk Kim         }
1117f8146b88SJung-uk Kim 
1118f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
1119f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1120f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
1121f8146b88SJung-uk Kim 
1122f8146b88SJung-uk Kim         PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1123f8146b88SJung-uk Kim 
1124f8146b88SJung-uk Kim         switch (PcctHeader->Type)
1125f8146b88SJung-uk Kim         {
1126f8146b88SJung-uk Kim         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
1127f8146b88SJung-uk Kim 
1128f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct0;
1129f8146b88SJung-uk Kim             break;
1130f8146b88SJung-uk Kim 
1131f8146b88SJung-uk Kim         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
1132f8146b88SJung-uk Kim 
1133f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct1;
1134f8146b88SJung-uk Kim             break;
1135f8146b88SJung-uk Kim 
1136f8146b88SJung-uk Kim         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
1137f8146b88SJung-uk Kim 
1138f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct2;
1139f8146b88SJung-uk Kim             break;
1140f8146b88SJung-uk Kim 
1141af051161SJung-uk Kim         case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
1142af051161SJung-uk Kim 
1143af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct3;
1144af051161SJung-uk Kim             break;
1145af051161SJung-uk Kim 
1146af051161SJung-uk Kim         case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
1147af051161SJung-uk Kim 
1148af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct4;
1149af051161SJung-uk Kim             break;
1150af051161SJung-uk Kim 
1151cfd1ed46SJung-uk Kim         case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
1152cfd1ed46SJung-uk Kim 
1153cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct5;
1154cfd1ed46SJung-uk Kim             break;
1155cfd1ed46SJung-uk Kim 
1156f8146b88SJung-uk Kim         default:
1157f8146b88SJung-uk Kim 
1158f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
1159f8146b88SJung-uk Kim             return (AE_ERROR);
1160f8146b88SJung-uk Kim         }
1161f8146b88SJung-uk Kim 
1162ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
1163f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
1164f8146b88SJung-uk Kim         {
1165f8146b88SJung-uk Kim             return (Status);
1166f8146b88SJung-uk Kim         }
1167f8146b88SJung-uk Kim 
1168f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
1169f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1170f8146b88SJung-uk Kim         DtPopSubtable ();
1171f8146b88SJung-uk Kim     }
1172f8146b88SJung-uk Kim 
1173f8146b88SJung-uk Kim     return (AE_OK);
1174f8146b88SJung-uk Kim }
1175f8146b88SJung-uk Kim 
1176f8146b88SJung-uk Kim 
1177f8146b88SJung-uk Kim /******************************************************************************
1178f8146b88SJung-uk Kim  *
117967d9aa44SJung-uk Kim  * FUNCTION:    DtCompilePdtt
118067d9aa44SJung-uk Kim  *
118167d9aa44SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
118267d9aa44SJung-uk Kim  *
118367d9aa44SJung-uk Kim  * RETURN:      Status
118467d9aa44SJung-uk Kim  *
118567d9aa44SJung-uk Kim  * DESCRIPTION: Compile PDTT.
118667d9aa44SJung-uk Kim  *
118767d9aa44SJung-uk Kim  *****************************************************************************/
118867d9aa44SJung-uk Kim 
118967d9aa44SJung-uk Kim ACPI_STATUS
DtCompilePdtt(void ** List)119067d9aa44SJung-uk Kim DtCompilePdtt (
119167d9aa44SJung-uk Kim     void                    **List)
119267d9aa44SJung-uk Kim {
119367d9aa44SJung-uk Kim     ACPI_STATUS             Status;
119467d9aa44SJung-uk Kim     DT_SUBTABLE             *Subtable;
119567d9aa44SJung-uk Kim     DT_SUBTABLE             *ParentTable;
119667d9aa44SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
119767d9aa44SJung-uk Kim     ACPI_TABLE_PDTT         *PdttHeader;
119867d9aa44SJung-uk Kim     UINT32                  Count = 0;
119967d9aa44SJung-uk Kim 
120067d9aa44SJung-uk Kim 
120167d9aa44SJung-uk Kim     /* Main table */
120267d9aa44SJung-uk Kim 
1203ff879b07SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt, &Subtable);
120467d9aa44SJung-uk Kim     if (ACPI_FAILURE (Status))
120567d9aa44SJung-uk Kim     {
120667d9aa44SJung-uk Kim         return (Status);
120767d9aa44SJung-uk Kim     }
120867d9aa44SJung-uk Kim 
120967d9aa44SJung-uk Kim     ParentTable = DtPeekSubtable ();
121067d9aa44SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
121167d9aa44SJung-uk Kim 
121267d9aa44SJung-uk Kim     PdttHeader = ACPI_CAST_PTR (ACPI_TABLE_PDTT, ParentTable->Buffer);
121367d9aa44SJung-uk Kim     PdttHeader->ArrayOffset = sizeof (ACPI_TABLE_PDTT);
121467d9aa44SJung-uk Kim 
121567d9aa44SJung-uk Kim     /* There is only one type of subtable at this time, no need to decode */
121667d9aa44SJung-uk Kim 
121767d9aa44SJung-uk Kim     while (*PFieldList)
121867d9aa44SJung-uk Kim     {
121967d9aa44SJung-uk Kim         /* List of subchannel IDs, each 2 bytes */
122067d9aa44SJung-uk Kim 
122167d9aa44SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt0,
1222ff879b07SJung-uk Kim             &Subtable);
122367d9aa44SJung-uk Kim         if (ACPI_FAILURE (Status))
122467d9aa44SJung-uk Kim         {
122567d9aa44SJung-uk Kim             return (Status);
122667d9aa44SJung-uk Kim         }
122767d9aa44SJung-uk Kim 
122867d9aa44SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
122967d9aa44SJung-uk Kim         Count++;
123067d9aa44SJung-uk Kim     }
123167d9aa44SJung-uk Kim 
123267d9aa44SJung-uk Kim     PdttHeader->TriggerCount = (UINT8) Count;
123367d9aa44SJung-uk Kim     return (AE_OK);
123467d9aa44SJung-uk Kim }
123567d9aa44SJung-uk Kim 
123667d9aa44SJung-uk Kim 
123767d9aa44SJung-uk Kim /******************************************************************************
123867d9aa44SJung-uk Kim  *
1239cfd1ed46SJung-uk Kim  * FUNCTION:    DtCompilePhat
1240cfd1ed46SJung-uk Kim  *
1241cfd1ed46SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1242cfd1ed46SJung-uk Kim  *
1243cfd1ed46SJung-uk Kim  * RETURN:      Status
1244cfd1ed46SJung-uk Kim  *
1245cfd1ed46SJung-uk Kim  * DESCRIPTION: Compile Phat.
1246cfd1ed46SJung-uk Kim  *
1247cfd1ed46SJung-uk Kim  *****************************************************************************/
1248cfd1ed46SJung-uk Kim 
1249cfd1ed46SJung-uk Kim ACPI_STATUS
DtCompilePhat(void ** List)1250cfd1ed46SJung-uk Kim DtCompilePhat (
1251cfd1ed46SJung-uk Kim     void                    **List)
1252cfd1ed46SJung-uk Kim {
1253cfd1ed46SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
1254cfd1ed46SJung-uk Kim     DT_SUBTABLE             *Subtable;
1255cfd1ed46SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1256cfd1ed46SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1257cfd1ed46SJung-uk Kim     ACPI_PHAT_HEADER        *PhatHeader;
1258cfd1ed46SJung-uk Kim     ACPI_DMTABLE_INFO       *Info;
1259cfd1ed46SJung-uk Kim     ACPI_PHAT_VERSION_DATA  *VersionData;
12609a4bc520SJung-uk Kim     UINT32                  DeviceDataLength;
1261cfd1ed46SJung-uk Kim     UINT32                  RecordCount;
12629a4bc520SJung-uk Kim     DT_FIELD                *DataOffsetField;
12639a4bc520SJung-uk Kim     DT_FIELD                *DevicePathField;
12649a4bc520SJung-uk Kim     UINT32                  TableOffset = 0;
12659a4bc520SJung-uk Kim     UINT32                  DataOffsetValue;
12669a4bc520SJung-uk Kim     UINT32                  i;
1267cfd1ed46SJung-uk Kim 
1268cfd1ed46SJung-uk Kim 
12699a4bc520SJung-uk Kim     /* The table consists of subtables */
1270cfd1ed46SJung-uk Kim 
1271cfd1ed46SJung-uk Kim     while (*PFieldList)
1272cfd1ed46SJung-uk Kim     {
12739a4bc520SJung-uk Kim         /* Compile the common subtable header */
12749a4bc520SJung-uk Kim 
1275cfd1ed46SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable);
1276cfd1ed46SJung-uk Kim         if (ACPI_FAILURE (Status))
1277cfd1ed46SJung-uk Kim         {
1278cfd1ed46SJung-uk Kim             return (Status);
1279cfd1ed46SJung-uk Kim         }
1280cfd1ed46SJung-uk Kim 
12819a4bc520SJung-uk Kim         TableOffset += Subtable->Length;
12829a4bc520SJung-uk Kim         DbgPrint (ASL_DEBUG_OUTPUT, "0 Subtable->Length: %X\n", Subtable->Length);
12839a4bc520SJung-uk Kim 
1284cfd1ed46SJung-uk Kim         ParentTable = DtPeekSubtable ();
1285cfd1ed46SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1286cfd1ed46SJung-uk Kim         DtPushSubtable (Subtable);
1287cfd1ed46SJung-uk Kim 
1288cfd1ed46SJung-uk Kim         PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer);
1289cfd1ed46SJung-uk Kim 
1290cfd1ed46SJung-uk Kim         switch (PhatHeader->Type)
1291cfd1ed46SJung-uk Kim         {
1292cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
1293cfd1ed46SJung-uk Kim 
12949a4bc520SJung-uk Kim             /* Compile the middle portion of the Firmware Version Data */
12959a4bc520SJung-uk Kim 
1296cfd1ed46SJung-uk Kim             Info = AcpiDmTableInfoPhat0;
1297cfd1ed46SJung-uk Kim             PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA);
12989a4bc520SJung-uk Kim             DataOffsetField = NULL;
1299cfd1ed46SJung-uk Kim             break;
1300cfd1ed46SJung-uk Kim 
1301cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
1302cfd1ed46SJung-uk Kim 
13039a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "1 Offset: %X, Name: \"%s\" Length: %X\n",
13049a4bc520SJung-uk Kim                 (*PFieldList)->TableOffset, (*PFieldList)->Name, Subtable->Length);
13059a4bc520SJung-uk Kim 
13069a4bc520SJung-uk Kim             DataOffsetField = *PFieldList;
13079a4bc520SJung-uk Kim 
13089a4bc520SJung-uk Kim             /* Walk the field list to get to the "Device-specific data Offset" field */
13099a4bc520SJung-uk Kim 
13109a4bc520SJung-uk Kim             TableOffset = sizeof (ACPI_PHAT_HEALTH_DATA);
13119a4bc520SJung-uk Kim             for (i = 0; i < 3; i++)
13129a4bc520SJung-uk Kim             {
13139a4bc520SJung-uk Kim                 DataOffsetField = DataOffsetField->Next;
13149a4bc520SJung-uk Kim                 DbgPrint (ASL_DEBUG_OUTPUT, "2 Offset: %X, Name: \"%s\" Length: %X Value: %s:\n",
13159a4bc520SJung-uk Kim                     TableOffset, DataOffsetField->Name, DataOffsetField->StringLength, DataOffsetField->Value);
13169a4bc520SJung-uk Kim             }
13179a4bc520SJung-uk Kim 
13189a4bc520SJung-uk Kim             /* Convert DataOffsetField->Value (a char * string) to an integer value */
13199a4bc520SJung-uk Kim 
13209a4bc520SJung-uk Kim             sscanf (DataOffsetField->Value, "%X", &DataOffsetValue);
13219a4bc520SJung-uk Kim 
13229a4bc520SJung-uk Kim             /*
13239a4bc520SJung-uk Kim              * Get the next field (Device Path):
13249a4bc520SJung-uk Kim              * DataOffsetField points to "Device-Specific Offset", next field is
13259a4bc520SJung-uk Kim              * "Device Path".
13269a4bc520SJung-uk Kim              */
13279a4bc520SJung-uk Kim             DevicePathField = DataOffsetField->Next;
13289a4bc520SJung-uk Kim 
13299a4bc520SJung-uk Kim             /* Compute the size of the input ASCII string as a unicode string (*2 + 2) */
13309a4bc520SJung-uk Kim 
13319a4bc520SJung-uk Kim             DevicePathField->StringLength = (strlen ((const char *) DevicePathField->Value) * 2) + 2;
13329a4bc520SJung-uk Kim             TableOffset += DevicePathField->StringLength;
13339a4bc520SJung-uk Kim 
13349a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "3 Offset: %X, Length: %X devicepathLength: %X\n",
13359a4bc520SJung-uk Kim                 TableOffset, Subtable->Length, DevicePathField->StringLength);
13369a4bc520SJung-uk Kim 
13379a4bc520SJung-uk Kim             /* Set the DataOffsetField to the current TableOffset */
13389a4bc520SJung-uk Kim             /* Must set the DataOffsetField here (not later) */
13399a4bc520SJung-uk Kim 
13409a4bc520SJung-uk Kim             if (DataOffsetValue != 0)
13419a4bc520SJung-uk Kim             {
13429a4bc520SJung-uk Kim                 snprintf (DataOffsetField->Value, Subtable->Length, "%X", TableOffset);
13439a4bc520SJung-uk Kim             }
13449a4bc520SJung-uk Kim 
13459a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "4 Offset: %X, Length: %X\n", TableOffset, Subtable->Length);
13469a4bc520SJung-uk Kim 
13479a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "5 TableOffset: %X, DataOffsetField->StringLength: "
13489a4bc520SJung-uk Kim                 "%X DevicePathField Length: %X DevicePathField->Value: %s, DataOffsetField->Value: %s DataOffsetField->ByteOffset %X\n",
13499a4bc520SJung-uk Kim                 TableOffset, DataOffsetField->StringLength, DevicePathField->StringLength,
13509a4bc520SJung-uk Kim                 DevicePathField->Value, DataOffsetField->Value, DataOffsetField->ByteOffset);
13519a4bc520SJung-uk Kim 
13529a4bc520SJung-uk Kim             /* Compile the middle portion of the Health Data Record */
13539a4bc520SJung-uk Kim 
1354cfd1ed46SJung-uk Kim             Info = AcpiDmTableInfoPhat1;
1355cfd1ed46SJung-uk Kim             PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA);
1356cfd1ed46SJung-uk Kim             break;
1357cfd1ed46SJung-uk Kim 
1358cfd1ed46SJung-uk Kim         default:
1359cfd1ed46SJung-uk Kim 
1360cfd1ed46SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
1361cfd1ed46SJung-uk Kim             return (AE_ERROR);
1362cfd1ed46SJung-uk Kim         }
1363cfd1ed46SJung-uk Kim 
13649a4bc520SJung-uk Kim         /* Compile either the Version Data or the Health Data */
13659a4bc520SJung-uk Kim 
1366cfd1ed46SJung-uk Kim         Status = DtCompileTable (PFieldList, Info, &Subtable);
1367cfd1ed46SJung-uk Kim         if (ACPI_FAILURE (Status))
1368cfd1ed46SJung-uk Kim         {
1369cfd1ed46SJung-uk Kim             return (Status);
1370cfd1ed46SJung-uk Kim         }
1371cfd1ed46SJung-uk Kim 
13729a4bc520SJung-uk Kim         DbgPrint (ASL_DEBUG_OUTPUT, "6 Offset: %X, Name: \"%s\" SubtableLength: %X\n",
13739a4bc520SJung-uk Kim             TableOffset /* - StartTableOffset*/, (*PFieldList)->Name, Subtable->Length);
13749a4bc520SJung-uk Kim 
1375cfd1ed46SJung-uk Kim         ParentTable = DtPeekSubtable ();
1376cfd1ed46SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1377cfd1ed46SJung-uk Kim 
1378cfd1ed46SJung-uk Kim         switch (PhatHeader->Type)
1379cfd1ed46SJung-uk Kim         {
1380cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
1381cfd1ed46SJung-uk Kim 
1382cfd1ed46SJung-uk Kim             VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA,
1383cfd1ed46SJung-uk Kim                 (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER)));
1384cfd1ed46SJung-uk Kim             RecordCount = VersionData->ElementCount;
1385cfd1ed46SJung-uk Kim 
13869a4bc520SJung-uk Kim             /* Compile all of the Version Elements */
13879a4bc520SJung-uk Kim 
1388cfd1ed46SJung-uk Kim             while (RecordCount)
1389cfd1ed46SJung-uk Kim             {
1390cfd1ed46SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a,
1391cfd1ed46SJung-uk Kim                     &Subtable);
1392cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
1393cfd1ed46SJung-uk Kim                 {
1394cfd1ed46SJung-uk Kim                     return (Status);
1395cfd1ed46SJung-uk Kim                 }
13969a4bc520SJung-uk Kim 
1397cfd1ed46SJung-uk Kim                 ParentTable = DtPeekSubtable ();
1398cfd1ed46SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
1399cfd1ed46SJung-uk Kim 
14009a4bc520SJung-uk Kim                 TableOffset += Subtable->Length;
1401cfd1ed46SJung-uk Kim                 RecordCount--;
1402cfd1ed46SJung-uk Kim                 PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT);
1403cfd1ed46SJung-uk Kim             }
14049a4bc520SJung-uk Kim 
14059a4bc520SJung-uk Kim             DtPopSubtable ();
1406cfd1ed46SJung-uk Kim             break;
1407cfd1ed46SJung-uk Kim 
1408cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
1409cfd1ed46SJung-uk Kim 
14109a4bc520SJung-uk Kim             /* Compile the Device Path */
14119a4bc520SJung-uk Kim 
14129a4bc520SJung-uk Kim             DeviceDataLength = Subtable->Length;
14139a4bc520SJung-uk Kim             TableOffset += Subtable->Length;
14149a4bc520SJung-uk Kim 
14159a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "7 Device Path Length: %X FieldName: \"%s\" FieldLength: "
14169a4bc520SJung-uk Kim                 "%s FieldValue: %s SubtableLength: %X TableOffset: %X\n", DeviceDataLength,
14179a4bc520SJung-uk Kim                 (*PFieldList)->Name, DataOffsetField->Value, (*PFieldList)->Value,
14189a4bc520SJung-uk Kim                 Subtable->Length, TableOffset);
1419cfd1ed46SJung-uk Kim 
1420cfd1ed46SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable);
1421cfd1ed46SJung-uk Kim             if (ACPI_FAILURE (Status))
1422cfd1ed46SJung-uk Kim             {
1423cfd1ed46SJung-uk Kim                 return (Status);
1424cfd1ed46SJung-uk Kim             }
1425cfd1ed46SJung-uk Kim             ParentTable = DtPeekSubtable ();
1426cfd1ed46SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1427cfd1ed46SJung-uk Kim 
14289a4bc520SJung-uk Kim             /* *PFieldList will be null if previous field was at the end-of-ParseTree (EOF) */
14299a4bc520SJung-uk Kim 
14309a4bc520SJung-uk Kim             if (!*PFieldList)
14319a4bc520SJung-uk Kim             {
14329a4bc520SJung-uk Kim                 DbgPrint (ASL_DEBUG_OUTPUT, "8 Exit on end-of-ParseTree\n");
14339a4bc520SJung-uk Kim                 return (AE_OK);
14349a4bc520SJung-uk Kim             }
14359a4bc520SJung-uk Kim 
14369a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "9 Device Data Length: %X FieldName: \"%s"
14379a4bc520SJung-uk Kim                 " TableOffset: %X FieldLength: %X Field Value: %s SubtableLength: %X\n",
14389a4bc520SJung-uk Kim                 DeviceDataLength, (*PFieldList)->Name, TableOffset,
14399a4bc520SJung-uk Kim                 (*PFieldList)->StringLength, (*PFieldList)->Value, Subtable->Length);
14409a4bc520SJung-uk Kim 
1441cfd1ed46SJung-uk Kim             PhatHeader->Length += (UINT16) Subtable->Length;
1442cfd1ed46SJung-uk Kim 
14439a4bc520SJung-uk Kim             /* Convert DataOffsetField->Value (a hex char * string) to an integer value */
14449a4bc520SJung-uk Kim 
14459a4bc520SJung-uk Kim             sscanf (DataOffsetField->Value, "%X", &DataOffsetValue);
14469a4bc520SJung-uk Kim 
14479a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "10 Device-Specific Offset: %X Table Offset: %X\n",
14489a4bc520SJung-uk Kim                 DataOffsetValue, TableOffset);
14499a4bc520SJung-uk Kim             if (DataOffsetValue != 0)
14509a4bc520SJung-uk Kim             {
14519a4bc520SJung-uk Kim                 /* Compile Device-Specific Data - only if the Data Offset is non-zero */
1452cfd1ed46SJung-uk Kim 
1453cfd1ed46SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable);
1454cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
1455cfd1ed46SJung-uk Kim                 {
1456cfd1ed46SJung-uk Kim                     return (Status);
1457cfd1ed46SJung-uk Kim                 }
14589a4bc520SJung-uk Kim 
14599a4bc520SJung-uk Kim                 DbgPrint (ASL_DEBUG_OUTPUT, "11 Subtable: %p Table Offset: %X\n",
14609a4bc520SJung-uk Kim                     Subtable, TableOffset);
14619a4bc520SJung-uk Kim                 if (Subtable)
14629a4bc520SJung-uk Kim                 {
14639a4bc520SJung-uk Kim                     DbgPrint (ASL_DEBUG_OUTPUT, "12 Device Specific Offset: "
14649a4bc520SJung-uk Kim                         "%X FieldName \"%s\" SubtableLength %X\n",
14659a4bc520SJung-uk Kim                         DeviceDataLength, DataOffsetField->Name, Subtable->Length);
14669a4bc520SJung-uk Kim 
14679a4bc520SJung-uk Kim                     DeviceDataLength += Subtable->Length;
14689a4bc520SJung-uk Kim 
1469cfd1ed46SJung-uk Kim                     ParentTable = DtPeekSubtable ();
1470cfd1ed46SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
1471cfd1ed46SJung-uk Kim 
1472cfd1ed46SJung-uk Kim                     PhatHeader->Length += (UINT16) Subtable->Length;
14739a4bc520SJung-uk Kim                 }
14749a4bc520SJung-uk Kim             }
1475cfd1ed46SJung-uk Kim 
14769a4bc520SJung-uk Kim             DtPopSubtable ();
14779a4bc520SJung-uk Kim 
14789a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "13 FieldName: \"%s\" FieldLength: %X Field Value: %s\n",
14799a4bc520SJung-uk Kim                 DataOffsetField->Name, DataOffsetField->StringLength, DataOffsetField->Value);
1480cfd1ed46SJung-uk Kim             break;
1481cfd1ed46SJung-uk Kim 
1482cfd1ed46SJung-uk Kim         default:
1483cfd1ed46SJung-uk Kim 
1484cfd1ed46SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
1485cfd1ed46SJung-uk Kim             return (AE_ERROR);
1486cfd1ed46SJung-uk Kim         }
1487cfd1ed46SJung-uk Kim     }
1488cfd1ed46SJung-uk Kim 
1489cfd1ed46SJung-uk Kim     return (Status);
1490cfd1ed46SJung-uk Kim }
1491cfd1ed46SJung-uk Kim 
1492cfd1ed46SJung-uk Kim 
1493cfd1ed46SJung-uk Kim /******************************************************************************
1494cfd1ed46SJung-uk Kim  *
1495f8146b88SJung-uk Kim  * FUNCTION:    DtCompilePmtt
1496f8146b88SJung-uk Kim  *
1497f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1498f8146b88SJung-uk Kim  *
1499f8146b88SJung-uk Kim  * RETURN:      Status
1500f8146b88SJung-uk Kim  *
1501f8146b88SJung-uk Kim  * DESCRIPTION: Compile PMTT.
1502f8146b88SJung-uk Kim  *
1503f8146b88SJung-uk Kim  *****************************************************************************/
1504f8146b88SJung-uk Kim 
1505f8146b88SJung-uk Kim ACPI_STATUS
DtCompilePmtt(void ** List)1506f8146b88SJung-uk Kim DtCompilePmtt (
1507f8146b88SJung-uk Kim     void                    **List)
1508f8146b88SJung-uk Kim {
1509f8146b88SJung-uk Kim     ACPI_STATUS             Status;
1510f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
1511f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1512f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1513f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
1514cfd1ed46SJung-uk Kim     UINT16                  Type;
1515f8146b88SJung-uk Kim 
1516f8146b88SJung-uk Kim 
1517f8146b88SJung-uk Kim     /* Main table */
1518f8146b88SJung-uk Kim 
1519ff879b07SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable);
1520f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
1521f8146b88SJung-uk Kim     {
1522f8146b88SJung-uk Kim         return (Status);
1523f8146b88SJung-uk Kim     }
1524f8146b88SJung-uk Kim 
1525f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
1526f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1527f8146b88SJung-uk Kim     DtPushSubtable (Subtable);
1528f8146b88SJung-uk Kim 
1529cfd1ed46SJung-uk Kim     /* Subtables */
1530cfd1ed46SJung-uk Kim 
1531f8146b88SJung-uk Kim     while (*PFieldList)
1532f8146b88SJung-uk Kim     {
1533f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
1534cfd1ed46SJung-uk Kim         DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
1535f8146b88SJung-uk Kim 
1536cfd1ed46SJung-uk Kim         switch (Type)
1537f8146b88SJung-uk Kim         {
1538f8146b88SJung-uk Kim         case ACPI_PMTT_TYPE_SOCKET:
1539f8146b88SJung-uk Kim 
1540f8146b88SJung-uk Kim             /* Subtable: Socket Structure */
1541f8146b88SJung-uk Kim 
1542cfd1ed46SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_SOCKET (0)\n");
1543cfd1ed46SJung-uk Kim 
1544f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
1545ff879b07SJung-uk Kim                 &Subtable);
1546f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
1547f8146b88SJung-uk Kim             {
1548f8146b88SJung-uk Kim                 return (Status);
1549f8146b88SJung-uk Kim             }
1550f8146b88SJung-uk Kim 
1551f8146b88SJung-uk Kim             break;
1552f8146b88SJung-uk Kim 
1553f8146b88SJung-uk Kim         case ACPI_PMTT_TYPE_CONTROLLER:
1554f8146b88SJung-uk Kim 
1555f8146b88SJung-uk Kim             /* Subtable: Memory Controller Structure */
1556f8146b88SJung-uk Kim 
1557cfd1ed46SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_CONTROLLER (1)\n");
1558cfd1ed46SJung-uk Kim 
1559f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
1560ff879b07SJung-uk Kim                 &Subtable);
1561f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
1562f8146b88SJung-uk Kim             {
1563f8146b88SJung-uk Kim                 return (Status);
1564f8146b88SJung-uk Kim             }
1565f8146b88SJung-uk Kim 
1566f8146b88SJung-uk Kim             break;
1567f8146b88SJung-uk Kim 
1568f8146b88SJung-uk Kim         case ACPI_PMTT_TYPE_DIMM:
1569f8146b88SJung-uk Kim 
1570cfd1ed46SJung-uk Kim             /* Subtable: Physical Component (DIMM) Structure */
1571f8146b88SJung-uk Kim 
1572cfd1ed46SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_DIMM (2)\n");
1573f8146b88SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
1574ff879b07SJung-uk Kim                 &Subtable);
1575f8146b88SJung-uk Kim             if (ACPI_FAILURE (Status))
1576f8146b88SJung-uk Kim             {
1577f8146b88SJung-uk Kim                 return (Status);
1578f8146b88SJung-uk Kim             }
1579f8146b88SJung-uk Kim 
1580cfd1ed46SJung-uk Kim             break;
1581cfd1ed46SJung-uk Kim 
1582cfd1ed46SJung-uk Kim         case ACPI_PMTT_TYPE_VENDOR:
1583cfd1ed46SJung-uk Kim 
1584cfd1ed46SJung-uk Kim             /* Subtable: Vendor-specific Structure */
1585cfd1ed46SJung-uk Kim 
1586cfd1ed46SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_VENDOR(FF)\n");
1587cfd1ed46SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttVendor,
1588cfd1ed46SJung-uk Kim                 &Subtable);
1589cfd1ed46SJung-uk Kim             if (ACPI_FAILURE (Status))
1590cfd1ed46SJung-uk Kim             {
1591cfd1ed46SJung-uk Kim                 return (Status);
1592cfd1ed46SJung-uk Kim             }
1593cfd1ed46SJung-uk Kim 
1594f8146b88SJung-uk Kim             break;
1595f8146b88SJung-uk Kim 
1596f8146b88SJung-uk Kim         default:
1597f8146b88SJung-uk Kim 
1598f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
1599f8146b88SJung-uk Kim             return (AE_ERROR);
1600f8146b88SJung-uk Kim         }
1601cfd1ed46SJung-uk Kim 
1602cfd1ed46SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1603f8146b88SJung-uk Kim     }
1604f8146b88SJung-uk Kim 
1605f8146b88SJung-uk Kim     return (Status);
1606f8146b88SJung-uk Kim }
1607f8146b88SJung-uk Kim 
1608f8146b88SJung-uk Kim 
1609f8146b88SJung-uk Kim /******************************************************************************
1610f8146b88SJung-uk Kim  *
1611af051161SJung-uk Kim  * FUNCTION:    DtCompilePptt
1612af051161SJung-uk Kim  *
1613af051161SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1614af051161SJung-uk Kim  *
1615af051161SJung-uk Kim  * RETURN:      Status
1616af051161SJung-uk Kim  *
1617af051161SJung-uk Kim  * DESCRIPTION: Compile PPTT.
1618af051161SJung-uk Kim  *
1619af051161SJung-uk Kim  *****************************************************************************/
1620af051161SJung-uk Kim 
1621af051161SJung-uk Kim ACPI_STATUS
DtCompilePptt(void ** List)1622af051161SJung-uk Kim DtCompilePptt (
1623af051161SJung-uk Kim     void                    **List)
1624af051161SJung-uk Kim {
1625af051161SJung-uk Kim     ACPI_STATUS             Status;
1626af051161SJung-uk Kim     ACPI_SUBTABLE_HEADER    *PpttHeader;
1627af051161SJung-uk Kim     ACPI_PPTT_PROCESSOR     *PpttProcessor = NULL;
1628af051161SJung-uk Kim     DT_SUBTABLE             *Subtable;
1629af051161SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1630af051161SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1631af051161SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1632af051161SJung-uk Kim     DT_FIELD                *SubtableStart;
1633cfd1ed46SJung-uk Kim     ACPI_TABLE_HEADER       *PpttAcpiHeader;
1634af051161SJung-uk Kim 
1635af051161SJung-uk Kim 
1636af051161SJung-uk Kim     ParentTable = DtPeekSubtable ();
1637af051161SJung-uk Kim     while (*PFieldList)
1638af051161SJung-uk Kim     {
1639af051161SJung-uk Kim         SubtableStart = *PFieldList;
1640af051161SJung-uk Kim 
1641af051161SJung-uk Kim         /* Compile PPTT subtable header */
1642af051161SJung-uk Kim 
1643af051161SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPpttHdr,
1644ff879b07SJung-uk Kim             &Subtable);
1645af051161SJung-uk Kim         if (ACPI_FAILURE (Status))
1646af051161SJung-uk Kim         {
1647af051161SJung-uk Kim             return (Status);
1648af051161SJung-uk Kim         }
1649af051161SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1650af051161SJung-uk Kim         PpttHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1651af051161SJung-uk Kim         PpttHeader->Length = (UINT8)(Subtable->Length);
1652af051161SJung-uk Kim 
1653af051161SJung-uk Kim         switch (PpttHeader->Type)
1654af051161SJung-uk Kim         {
1655af051161SJung-uk Kim         case ACPI_PPTT_TYPE_PROCESSOR:
1656af051161SJung-uk Kim 
1657af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoPptt0;
1658af051161SJung-uk Kim             break;
1659af051161SJung-uk Kim 
1660af051161SJung-uk Kim         case ACPI_PPTT_TYPE_CACHE:
1661af051161SJung-uk Kim 
1662af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoPptt1;
1663af051161SJung-uk Kim             break;
1664af051161SJung-uk Kim 
1665af051161SJung-uk Kim         case ACPI_PPTT_TYPE_ID:
1666af051161SJung-uk Kim 
1667af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoPptt2;
1668af051161SJung-uk Kim             break;
1669af051161SJung-uk Kim 
1670af051161SJung-uk Kim         default:
1671af051161SJung-uk Kim 
1672af051161SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PPTT");
1673af051161SJung-uk Kim             return (AE_ERROR);
1674af051161SJung-uk Kim         }
1675af051161SJung-uk Kim 
1676af051161SJung-uk Kim         /* Compile PPTT subtable body */
1677af051161SJung-uk Kim 
1678ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
1679af051161SJung-uk Kim         if (ACPI_FAILURE (Status))
1680af051161SJung-uk Kim         {
1681af051161SJung-uk Kim             return (Status);
1682af051161SJung-uk Kim         }
1683af051161SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1684af051161SJung-uk Kim         PpttHeader->Length += (UINT8)(Subtable->Length);
1685af051161SJung-uk Kim 
1686722b1667SJung-uk Kim         /* Compile PPTT subtable additional */
1687af051161SJung-uk Kim 
1688af051161SJung-uk Kim         switch (PpttHeader->Type)
1689af051161SJung-uk Kim         {
1690af051161SJung-uk Kim         case ACPI_PPTT_TYPE_PROCESSOR:
1691af051161SJung-uk Kim 
1692af051161SJung-uk Kim             PpttProcessor = ACPI_SUB_PTR (ACPI_PPTT_PROCESSOR,
1693af051161SJung-uk Kim                 Subtable->Buffer, sizeof (ACPI_SUBTABLE_HEADER));
1694af051161SJung-uk Kim             if (PpttProcessor)
1695af051161SJung-uk Kim             {
1696af051161SJung-uk Kim                 /* Compile initiator proximity domain list */
1697af051161SJung-uk Kim 
1698af051161SJung-uk Kim                 PpttProcessor->NumberOfPrivResources = 0;
1699af051161SJung-uk Kim                 while (*PFieldList)
1700af051161SJung-uk Kim                 {
1701af051161SJung-uk Kim                     Status = DtCompileTable (PFieldList,
1702ff879b07SJung-uk Kim                         AcpiDmTableInfoPptt0a, &Subtable);
1703af051161SJung-uk Kim                     if (ACPI_FAILURE (Status))
1704af051161SJung-uk Kim                     {
1705af051161SJung-uk Kim                         return (Status);
1706af051161SJung-uk Kim                     }
1707af051161SJung-uk Kim                     if (!Subtable)
1708af051161SJung-uk Kim                     {
1709af051161SJung-uk Kim                         break;
1710af051161SJung-uk Kim                     }
1711af051161SJung-uk Kim 
1712af051161SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
1713af051161SJung-uk Kim                     PpttHeader->Length += (UINT8)(Subtable->Length);
1714af051161SJung-uk Kim                     PpttProcessor->NumberOfPrivResources++;
1715af051161SJung-uk Kim                 }
1716af051161SJung-uk Kim             }
1717af051161SJung-uk Kim             break;
1718af051161SJung-uk Kim 
1719cfd1ed46SJung-uk Kim         case ACPI_PPTT_TYPE_CACHE:
1720cfd1ed46SJung-uk Kim 
1721cfd1ed46SJung-uk Kim             PpttAcpiHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
1722cfd1ed46SJung-uk Kim                 AslGbl_RootTable->Buffer);
1723cfd1ed46SJung-uk Kim             if (PpttAcpiHeader->Revision < 3)
1724cfd1ed46SJung-uk Kim             {
1725cfd1ed46SJung-uk Kim                 break;
1726cfd1ed46SJung-uk Kim             }
1727cfd1ed46SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPptt1a,
1728cfd1ed46SJung-uk Kim                 &Subtable);
1729cfd1ed46SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
1730cfd1ed46SJung-uk Kim             PpttHeader->Length += (UINT8)(Subtable->Length);
1731cfd1ed46SJung-uk Kim             break;
1732cfd1ed46SJung-uk Kim 
1733af051161SJung-uk Kim         default:
1734af051161SJung-uk Kim 
1735af051161SJung-uk Kim             break;
1736af051161SJung-uk Kim         }
1737af051161SJung-uk Kim     }
1738af051161SJung-uk Kim 
1739af051161SJung-uk Kim     return (AE_OK);
1740af051161SJung-uk Kim }
1741af051161SJung-uk Kim 
1742af051161SJung-uk Kim 
1743af051161SJung-uk Kim /******************************************************************************
1744af051161SJung-uk Kim  *
17451970d693SJung-uk Kim  * FUNCTION:    DtCompilePrmt
17461970d693SJung-uk Kim  *
17471970d693SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
17481970d693SJung-uk Kim  *
17491970d693SJung-uk Kim  * RETURN:      Status
17501970d693SJung-uk Kim  *
17511970d693SJung-uk Kim  * DESCRIPTION: Compile PRMT.
17521970d693SJung-uk Kim  *
17531970d693SJung-uk Kim  *****************************************************************************/
17541970d693SJung-uk Kim 
17551970d693SJung-uk Kim ACPI_STATUS
DtCompilePrmt(void ** List)17561970d693SJung-uk Kim DtCompilePrmt (
17571970d693SJung-uk Kim     void                    **List)
17581970d693SJung-uk Kim {
17591970d693SJung-uk Kim     ACPI_STATUS             Status;
17601970d693SJung-uk Kim     ACPI_TABLE_PRMT_HEADER  *PrmtHeader;
17611970d693SJung-uk Kim     ACPI_PRMT_MODULE_INFO   *PrmtModuleInfo;
17621970d693SJung-uk Kim     DT_SUBTABLE             *Subtable;
17631970d693SJung-uk Kim     DT_SUBTABLE             *ParentTable;
17641970d693SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
17651970d693SJung-uk Kim     UINT32                  i, j;
17661970d693SJung-uk Kim 
17671970d693SJung-uk Kim     ParentTable = DtPeekSubtable ();
17681970d693SJung-uk Kim 
17691970d693SJung-uk Kim     /* Compile PRMT subtable header */
17701970d693SJung-uk Kim 
17711970d693SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHdr,
17721970d693SJung-uk Kim         &Subtable);
17731970d693SJung-uk Kim     if (ACPI_FAILURE (Status))
17741970d693SJung-uk Kim     {
17751970d693SJung-uk Kim         return (Status);
17761970d693SJung-uk Kim     }
17771970d693SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
17781970d693SJung-uk Kim     PrmtHeader = ACPI_CAST_PTR (ACPI_TABLE_PRMT_HEADER, Subtable->Buffer);
17791970d693SJung-uk Kim 
17801970d693SJung-uk Kim     for (i = 0; i < PrmtHeader->ModuleInfoCount; i++)
17811970d693SJung-uk Kim     {
17821970d693SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtModule,
17831970d693SJung-uk Kim             &Subtable);
17841970d693SJung-uk Kim         if (ACPI_FAILURE (Status))
17851970d693SJung-uk Kim         {
17861970d693SJung-uk Kim             return (Status);
17871970d693SJung-uk Kim         }
17881970d693SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
17891970d693SJung-uk Kim         PrmtModuleInfo = ACPI_CAST_PTR (ACPI_PRMT_MODULE_INFO, Subtable->Buffer);
17901970d693SJung-uk Kim 
17911970d693SJung-uk Kim         for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; j++)
17921970d693SJung-uk Kim         {
17931970d693SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHandler,
17941970d693SJung-uk Kim                 &Subtable);
17951970d693SJung-uk Kim             if (ACPI_FAILURE (Status))
17961970d693SJung-uk Kim             {
17971970d693SJung-uk Kim                 return (Status);
17981970d693SJung-uk Kim             }
17991970d693SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
18001970d693SJung-uk Kim         }
18011970d693SJung-uk Kim     }
18021970d693SJung-uk Kim 
18031970d693SJung-uk Kim     return (AE_OK);
18041970d693SJung-uk Kim }
18051970d693SJung-uk Kim 
18061970d693SJung-uk Kim 
18071970d693SJung-uk Kim /******************************************************************************
18081970d693SJung-uk Kim  *
1809804fe266SJung-uk Kim  * FUNCTION:    DtCompileRas2
1810804fe266SJung-uk Kim  *
1811804fe266SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1812804fe266SJung-uk Kim  *
1813804fe266SJung-uk Kim  * RETURN:      Status
1814804fe266SJung-uk Kim  *
1815804fe266SJung-uk Kim  * DESCRIPTION: Compile RAS2.
1816804fe266SJung-uk Kim  *
1817804fe266SJung-uk Kim  *****************************************************************************/
1818804fe266SJung-uk Kim 
1819804fe266SJung-uk Kim ACPI_STATUS
DtCompileRas2(void ** List)1820804fe266SJung-uk Kim DtCompileRas2 (
1821804fe266SJung-uk Kim     void                    **List)
1822804fe266SJung-uk Kim {
1823804fe266SJung-uk Kim     ACPI_STATUS             Status;
1824804fe266SJung-uk Kim     DT_SUBTABLE             *Subtable;
1825804fe266SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1826804fe266SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1827804fe266SJung-uk Kim     ACPI_TABLE_RAS2         *Ras2Header;
1828804fe266SJung-uk Kim     UINT32                  Count = 0;
1829804fe266SJung-uk Kim 
1830804fe266SJung-uk Kim 
1831804fe266SJung-uk Kim     /* Main table */
1832804fe266SJung-uk Kim 
1833804fe266SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRas2, &Subtable);
1834804fe266SJung-uk Kim     if (ACPI_FAILURE (Status))
1835804fe266SJung-uk Kim     {
1836804fe266SJung-uk Kim         return (Status);
1837804fe266SJung-uk Kim     }
1838804fe266SJung-uk Kim 
1839804fe266SJung-uk Kim     ParentTable = DtPeekSubtable ();
1840804fe266SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
1841804fe266SJung-uk Kim 
1842804fe266SJung-uk Kim     Ras2Header = ACPI_CAST_PTR (ACPI_TABLE_RAS2, ParentTable->Buffer);
1843804fe266SJung-uk Kim 
1844804fe266SJung-uk Kim     /* There is only one type of subtable at this time, no need to decode */
1845804fe266SJung-uk Kim 
1846804fe266SJung-uk Kim     while (*PFieldList)
1847804fe266SJung-uk Kim     {
1848804fe266SJung-uk Kim         /* List of RAS2 PCC descriptors, each 8 bytes */
1849804fe266SJung-uk Kim 
1850804fe266SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoRas2PccDesc,
1851804fe266SJung-uk Kim             &Subtable);
1852804fe266SJung-uk Kim         if (ACPI_FAILURE (Status))
1853804fe266SJung-uk Kim         {
1854804fe266SJung-uk Kim             return (Status);
1855804fe266SJung-uk Kim         }
1856804fe266SJung-uk Kim 
1857804fe266SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1858804fe266SJung-uk Kim         Count++;
1859804fe266SJung-uk Kim     }
1860804fe266SJung-uk Kim 
1861804fe266SJung-uk Kim     Ras2Header->NumPccDescs = (UINT8) Count;
1862804fe266SJung-uk Kim     return (AE_OK);
1863804fe266SJung-uk Kim }
1864804fe266SJung-uk Kim 
1865804fe266SJung-uk Kim 
1866804fe266SJung-uk Kim /******************************************************************************
1867804fe266SJung-uk Kim  *
18681970d693SJung-uk Kim  * FUNCTION:    DtCompileRgrt
18691970d693SJung-uk Kim  *
18701970d693SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
18711970d693SJung-uk Kim  *
18721970d693SJung-uk Kim  * RETURN:      Status
18731970d693SJung-uk Kim  *
18741970d693SJung-uk Kim  * DESCRIPTION: Compile RGRT.
18751970d693SJung-uk Kim  *
18761970d693SJung-uk Kim  *****************************************************************************/
18771970d693SJung-uk Kim 
18781970d693SJung-uk Kim ACPI_STATUS
DtCompileRgrt(void ** List)18791970d693SJung-uk Kim DtCompileRgrt (
18801970d693SJung-uk Kim     void                    **List)
18811970d693SJung-uk Kim {
18821970d693SJung-uk Kim     ACPI_STATUS             Status;
18831970d693SJung-uk Kim     DT_SUBTABLE             *Subtable;
18841970d693SJung-uk Kim     DT_SUBTABLE             *ParentTable;
18851970d693SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
18861970d693SJung-uk Kim 
18871970d693SJung-uk Kim 
18881970d693SJung-uk Kim     /* Compile the main table */
18891970d693SJung-uk Kim 
18901970d693SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt,
18911970d693SJung-uk Kim         &Subtable);
18921970d693SJung-uk Kim     if (ACPI_FAILURE (Status))
18931970d693SJung-uk Kim     {
18941970d693SJung-uk Kim         return (Status);
18951970d693SJung-uk Kim     }
18961970d693SJung-uk Kim 
18971970d693SJung-uk Kim     ParentTable = DtPeekSubtable ();
18981970d693SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
18991970d693SJung-uk Kim 
19001970d693SJung-uk Kim     /* Compile the "Subtable" -- actually just the binary (PNG) image */
19011970d693SJung-uk Kim 
19021970d693SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt0,
19031970d693SJung-uk Kim         &Subtable);
19041970d693SJung-uk Kim     if (ACPI_FAILURE (Status))
19051970d693SJung-uk Kim     {
19061970d693SJung-uk Kim         return (Status);
19071970d693SJung-uk Kim     }
19081970d693SJung-uk Kim 
19091970d693SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
19101970d693SJung-uk Kim     return (AE_OK);
19111970d693SJung-uk Kim }
19121970d693SJung-uk Kim 
19131970d693SJung-uk Kim 
19141970d693SJung-uk Kim /******************************************************************************
19151970d693SJung-uk Kim  *
1916722b1667SJung-uk Kim  * FUNCTION:    DtCompileRhct
1917722b1667SJung-uk Kim  *
1918722b1667SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
1919722b1667SJung-uk Kim  *
1920722b1667SJung-uk Kim  * RETURN:      Status
1921722b1667SJung-uk Kim  *
1922722b1667SJung-uk Kim  * DESCRIPTION: Compile RHCT.
1923722b1667SJung-uk Kim  *
1924722b1667SJung-uk Kim  *****************************************************************************/
1925722b1667SJung-uk Kim 
1926722b1667SJung-uk Kim ACPI_STATUS
DtCompileRhct(void ** List)1927722b1667SJung-uk Kim DtCompileRhct (
1928722b1667SJung-uk Kim     void                    **List)
1929722b1667SJung-uk Kim {
1930722b1667SJung-uk Kim     ACPI_STATUS             Status;
1931722b1667SJung-uk Kim     ACPI_RHCT_NODE_HEADER   *RhctHeader;
1932722b1667SJung-uk Kim     ACPI_RHCT_HART_INFO     *RhctHartInfo = NULL;
1933722b1667SJung-uk Kim     DT_SUBTABLE             *Subtable;
1934722b1667SJung-uk Kim     DT_SUBTABLE             *ParentTable;
1935722b1667SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1936722b1667SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
1937722b1667SJung-uk Kim     DT_FIELD                *SubtableStart;
1938722b1667SJung-uk Kim 
1939722b1667SJung-uk Kim 
1940722b1667SJung-uk Kim     /* Compile the main table */
1941722b1667SJung-uk Kim 
1942722b1667SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRhct,
1943722b1667SJung-uk Kim         &Subtable);
1944722b1667SJung-uk Kim     if (ACPI_FAILURE (Status))
1945722b1667SJung-uk Kim     {
1946722b1667SJung-uk Kim         return (Status);
1947722b1667SJung-uk Kim     }
1948722b1667SJung-uk Kim 
1949722b1667SJung-uk Kim     ParentTable = DtPeekSubtable ();
1950722b1667SJung-uk Kim     while (*PFieldList)
1951722b1667SJung-uk Kim     {
1952722b1667SJung-uk Kim         SubtableStart = *PFieldList;
1953722b1667SJung-uk Kim 
1954722b1667SJung-uk Kim         /* Compile RHCT subtable header */
1955722b1667SJung-uk Kim 
1956722b1667SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoRhctNodeHdr,
1957722b1667SJung-uk Kim             &Subtable);
1958722b1667SJung-uk Kim         if (ACPI_FAILURE (Status))
1959722b1667SJung-uk Kim         {
1960722b1667SJung-uk Kim             return (Status);
1961722b1667SJung-uk Kim         }
1962722b1667SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
1963722b1667SJung-uk Kim         RhctHeader = ACPI_CAST_PTR (ACPI_RHCT_NODE_HEADER, Subtable->Buffer);
1964722b1667SJung-uk Kim         RhctHeader->Length = (UINT16)(Subtable->Length);
1965722b1667SJung-uk Kim 
1966722b1667SJung-uk Kim         switch (RhctHeader->Type)
1967722b1667SJung-uk Kim         {
1968722b1667SJung-uk Kim         case ACPI_RHCT_NODE_TYPE_ISA_STRING:
1969722b1667SJung-uk Kim 
1970722b1667SJung-uk Kim             InfoTable = AcpiDmTableInfoRhctIsa1;
1971722b1667SJung-uk Kim             break;
1972722b1667SJung-uk Kim 
1973722b1667SJung-uk Kim         case ACPI_RHCT_NODE_TYPE_HART_INFO:
1974722b1667SJung-uk Kim 
1975722b1667SJung-uk Kim             InfoTable = AcpiDmTableInfoRhctHartInfo1;
1976722b1667SJung-uk Kim             break;
1977722b1667SJung-uk Kim 
197807c64d74SJung-uk Kim         case ACPI_RHCT_NODE_TYPE_CMO:
197907c64d74SJung-uk Kim 
198007c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoRhctCmo1;
198107c64d74SJung-uk Kim             break;
198207c64d74SJung-uk Kim 
198307c64d74SJung-uk Kim         case ACPI_RHCT_NODE_TYPE_MMU:
198407c64d74SJung-uk Kim 
198507c64d74SJung-uk Kim             InfoTable = AcpiDmTableInfoRhctMmu1;
198607c64d74SJung-uk Kim             break;
198707c64d74SJung-uk Kim 
1988722b1667SJung-uk Kim         default:
1989722b1667SJung-uk Kim 
1990722b1667SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "RHCT");
1991722b1667SJung-uk Kim             return (AE_ERROR);
1992722b1667SJung-uk Kim         }
1993722b1667SJung-uk Kim 
1994722b1667SJung-uk Kim         /* Compile RHCT subtable body */
1995722b1667SJung-uk Kim 
1996722b1667SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
1997722b1667SJung-uk Kim         if (ACPI_FAILURE (Status))
1998722b1667SJung-uk Kim         {
1999722b1667SJung-uk Kim             return (Status);
2000722b1667SJung-uk Kim         }
2001722b1667SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2002722b1667SJung-uk Kim         RhctHeader->Length += (UINT16)(Subtable->Length);
2003722b1667SJung-uk Kim 
2004722b1667SJung-uk Kim         /* Compile RHCT subtable additionals */
2005722b1667SJung-uk Kim 
2006722b1667SJung-uk Kim         switch (RhctHeader->Type)
2007722b1667SJung-uk Kim         {
2008722b1667SJung-uk Kim         case ACPI_RHCT_NODE_TYPE_HART_INFO:
2009722b1667SJung-uk Kim 
2010722b1667SJung-uk Kim             RhctHartInfo = ACPI_SUB_PTR (ACPI_RHCT_HART_INFO,
2011722b1667SJung-uk Kim                 Subtable->Buffer, sizeof (ACPI_RHCT_NODE_HEADER));
2012722b1667SJung-uk Kim             if (RhctHartInfo)
2013722b1667SJung-uk Kim             {
2014722b1667SJung-uk Kim 
2015722b1667SJung-uk Kim                 RhctHartInfo->NumOffsets = 0;
2016722b1667SJung-uk Kim                 while (*PFieldList)
2017722b1667SJung-uk Kim                 {
2018722b1667SJung-uk Kim                     Status = DtCompileTable (PFieldList,
2019722b1667SJung-uk Kim                         AcpiDmTableInfoRhctHartInfo2, &Subtable);
2020722b1667SJung-uk Kim                     if (ACPI_FAILURE (Status))
2021722b1667SJung-uk Kim                     {
2022722b1667SJung-uk Kim                         return (Status);
2023722b1667SJung-uk Kim                     }
2024722b1667SJung-uk Kim                     if (!Subtable)
2025722b1667SJung-uk Kim                     {
2026722b1667SJung-uk Kim                         break;
2027722b1667SJung-uk Kim                     }
2028722b1667SJung-uk Kim 
2029722b1667SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
2030722b1667SJung-uk Kim                     RhctHeader->Length += (UINT16)(Subtable->Length);
2031722b1667SJung-uk Kim                     RhctHartInfo->NumOffsets++;
2032722b1667SJung-uk Kim                 }
2033722b1667SJung-uk Kim             }
2034722b1667SJung-uk Kim             break;
2035722b1667SJung-uk Kim 
2036722b1667SJung-uk Kim         default:
2037722b1667SJung-uk Kim 
2038722b1667SJung-uk Kim             break;
2039722b1667SJung-uk Kim         }
2040722b1667SJung-uk Kim     }
2041722b1667SJung-uk Kim 
2042722b1667SJung-uk Kim     return (AE_OK);
2043722b1667SJung-uk Kim }
2044722b1667SJung-uk Kim 
2045722b1667SJung-uk Kim 
2046722b1667SJung-uk Kim /******************************************************************************
2047722b1667SJung-uk Kim  *
2048f8146b88SJung-uk Kim  * FUNCTION:    DtCompileRsdt
2049f8146b88SJung-uk Kim  *
2050f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2051f8146b88SJung-uk Kim  *
2052f8146b88SJung-uk Kim  * RETURN:      Status
2053f8146b88SJung-uk Kim  *
2054f8146b88SJung-uk Kim  * DESCRIPTION: Compile RSDT.
2055f8146b88SJung-uk Kim  *
2056f8146b88SJung-uk Kim  *****************************************************************************/
2057f8146b88SJung-uk Kim 
2058f8146b88SJung-uk Kim ACPI_STATUS
DtCompileRsdt(void ** List)2059f8146b88SJung-uk Kim DtCompileRsdt (
2060f8146b88SJung-uk Kim     void                    **List)
2061f8146b88SJung-uk Kim {
2062f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2063f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2064f8146b88SJung-uk Kim     DT_FIELD                *FieldList = *(DT_FIELD **) List;
2065f8146b88SJung-uk Kim     UINT32                  Address;
2066f8146b88SJung-uk Kim 
2067f8146b88SJung-uk Kim 
2068f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2069f8146b88SJung-uk Kim 
2070f8146b88SJung-uk Kim     while (FieldList)
2071f8146b88SJung-uk Kim     {
2072f8146b88SJung-uk Kim         DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
2073f8146b88SJung-uk Kim 
2074f8146b88SJung-uk Kim         DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
2075f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2076f8146b88SJung-uk Kim         FieldList = FieldList->Next;
2077f8146b88SJung-uk Kim     }
2078f8146b88SJung-uk Kim 
2079f8146b88SJung-uk Kim     return (AE_OK);
2080f8146b88SJung-uk Kim }
2081f8146b88SJung-uk Kim 
2082f8146b88SJung-uk Kim 
2083f8146b88SJung-uk Kim /******************************************************************************
2084f8146b88SJung-uk Kim  *
2085f8146b88SJung-uk Kim  * FUNCTION:    DtCompileS3pt
2086f8146b88SJung-uk Kim  *
2087f8146b88SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
2088f8146b88SJung-uk Kim  *
2089f8146b88SJung-uk Kim  * RETURN:      Status
2090f8146b88SJung-uk Kim  *
2091f8146b88SJung-uk Kim  * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
2092f8146b88SJung-uk Kim  *
2093f8146b88SJung-uk Kim  *****************************************************************************/
2094f8146b88SJung-uk Kim 
2095f8146b88SJung-uk Kim ACPI_STATUS
DtCompileS3pt(DT_FIELD ** PFieldList)2096f8146b88SJung-uk Kim DtCompileS3pt (
2097f8146b88SJung-uk Kim     DT_FIELD                **PFieldList)
2098f8146b88SJung-uk Kim {
2099f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2100f8146b88SJung-uk Kim     ACPI_FPDT_HEADER        *S3ptHeader;
2101f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2102f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2103f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
2104f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
2105f8146b88SJung-uk Kim 
2106f8146b88SJung-uk Kim 
2107f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
21086f1f1a63SJung-uk Kim         &AslGbl_RootTable);
2109f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2110f8146b88SJung-uk Kim     {
2111f8146b88SJung-uk Kim         return (Status);
2112f8146b88SJung-uk Kim     }
2113f8146b88SJung-uk Kim 
21146f1f1a63SJung-uk Kim     DtPushSubtable (AslGbl_RootTable);
2115f8146b88SJung-uk Kim 
2116f8146b88SJung-uk Kim     while (*PFieldList)
2117f8146b88SJung-uk Kim     {
2118f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
2119f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
2120ff879b07SJung-uk Kim             &Subtable);
2121f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2122f8146b88SJung-uk Kim         {
2123f8146b88SJung-uk Kim             return (Status);
2124f8146b88SJung-uk Kim         }
2125f8146b88SJung-uk Kim 
2126f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2127f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2128f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
2129f8146b88SJung-uk Kim 
2130f8146b88SJung-uk Kim         S3ptHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
2131f8146b88SJung-uk Kim 
2132f8146b88SJung-uk Kim         switch (S3ptHeader->Type)
2133f8146b88SJung-uk Kim         {
2134f8146b88SJung-uk Kim         case ACPI_S3PT_TYPE_RESUME:
2135f8146b88SJung-uk Kim 
2136f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoS3pt0;
2137f8146b88SJung-uk Kim             break;
2138f8146b88SJung-uk Kim 
2139f8146b88SJung-uk Kim         case ACPI_S3PT_TYPE_SUSPEND:
2140f8146b88SJung-uk Kim 
2141f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoS3pt1;
2142f8146b88SJung-uk Kim             break;
2143f8146b88SJung-uk Kim 
2144f8146b88SJung-uk Kim         default:
2145f8146b88SJung-uk Kim 
2146f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
2147f8146b88SJung-uk Kim             return (AE_ERROR);
2148f8146b88SJung-uk Kim         }
2149f8146b88SJung-uk Kim 
2150ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
2151f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2152f8146b88SJung-uk Kim         {
2153f8146b88SJung-uk Kim             return (Status);
2154f8146b88SJung-uk Kim         }
2155f8146b88SJung-uk Kim 
2156f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2157f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2158f8146b88SJung-uk Kim         DtPopSubtable ();
2159f8146b88SJung-uk Kim     }
2160f8146b88SJung-uk Kim 
2161f8146b88SJung-uk Kim     return (AE_OK);
2162f8146b88SJung-uk Kim }
2163f8146b88SJung-uk Kim 
2164f8146b88SJung-uk Kim 
2165f8146b88SJung-uk Kim /******************************************************************************
2166f8146b88SJung-uk Kim  *
216767d9aa44SJung-uk Kim  * FUNCTION:    DtCompileSdev
216867d9aa44SJung-uk Kim  *
216967d9aa44SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
217067d9aa44SJung-uk Kim  *
217167d9aa44SJung-uk Kim  * RETURN:      Status
217267d9aa44SJung-uk Kim  *
217367d9aa44SJung-uk Kim  * DESCRIPTION: Compile SDEV.
217467d9aa44SJung-uk Kim  *
217567d9aa44SJung-uk Kim  *****************************************************************************/
217667d9aa44SJung-uk Kim 
217767d9aa44SJung-uk Kim ACPI_STATUS
DtCompileSdev(void ** List)217867d9aa44SJung-uk Kim DtCompileSdev (
217967d9aa44SJung-uk Kim     void                    **List)
218067d9aa44SJung-uk Kim {
218167d9aa44SJung-uk Kim     ACPI_STATUS                 Status;
218267d9aa44SJung-uk Kim     ACPI_SDEV_HEADER            *SdevHeader;
2183cfd1ed46SJung-uk Kim     ACPI_SDEV_HEADER            *SecureComponentHeader;
218467d9aa44SJung-uk Kim     DT_SUBTABLE                 *Subtable;
218567d9aa44SJung-uk Kim     DT_SUBTABLE                 *ParentTable;
218667d9aa44SJung-uk Kim     ACPI_DMTABLE_INFO           *InfoTable;
2187cfd1ed46SJung-uk Kim     ACPI_DMTABLE_INFO           *SecureComponentInfoTable = NULL;
218867d9aa44SJung-uk Kim     DT_FIELD                    **PFieldList = (DT_FIELD **) List;
218967d9aa44SJung-uk Kim     DT_FIELD                    *SubtableStart;
219067d9aa44SJung-uk Kim     ACPI_SDEV_PCIE              *Pcie = NULL;
219167d9aa44SJung-uk Kim     ACPI_SDEV_NAMESPACE         *Namesp = NULL;
219267d9aa44SJung-uk Kim     UINT32                      EntryCount;
2193cfd1ed46SJung-uk Kim     ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
2194cfd1ed46SJung-uk Kim     UINT16                      ComponentLength = 0;
219567d9aa44SJung-uk Kim 
219667d9aa44SJung-uk Kim 
219767d9aa44SJung-uk Kim     /* Subtables */
219867d9aa44SJung-uk Kim 
219967d9aa44SJung-uk Kim     while (*PFieldList)
220067d9aa44SJung-uk Kim     {
220167d9aa44SJung-uk Kim         /* Compile common SDEV subtable header */
220267d9aa44SJung-uk Kim 
220367d9aa44SJung-uk Kim         SubtableStart = *PFieldList;
220467d9aa44SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevHdr,
2205ff879b07SJung-uk Kim             &Subtable);
220667d9aa44SJung-uk Kim         if (ACPI_FAILURE (Status))
220767d9aa44SJung-uk Kim         {
220867d9aa44SJung-uk Kim             return (Status);
220967d9aa44SJung-uk Kim         }
221067d9aa44SJung-uk Kim 
221167d9aa44SJung-uk Kim         ParentTable = DtPeekSubtable ();
221267d9aa44SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
221367d9aa44SJung-uk Kim         DtPushSubtable (Subtable);
221467d9aa44SJung-uk Kim 
221567d9aa44SJung-uk Kim         SdevHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
221667d9aa44SJung-uk Kim         SdevHeader->Length = (UINT8)(sizeof (ACPI_SDEV_HEADER));
221767d9aa44SJung-uk Kim 
221867d9aa44SJung-uk Kim         switch (SdevHeader->Type)
221967d9aa44SJung-uk Kim         {
222067d9aa44SJung-uk Kim         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
222167d9aa44SJung-uk Kim 
222267d9aa44SJung-uk Kim             InfoTable = AcpiDmTableInfoSdev0;
222367d9aa44SJung-uk Kim             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer);
2224cfd1ed46SJung-uk Kim             SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
2225cfd1ed46SJung-uk Kim                 ACPI_ADD_PTR (UINT8, Subtable->Buffer, sizeof(ACPI_SDEV_NAMESPACE)));
222667d9aa44SJung-uk Kim             break;
222767d9aa44SJung-uk Kim 
222867d9aa44SJung-uk Kim         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
222967d9aa44SJung-uk Kim 
223067d9aa44SJung-uk Kim             InfoTable = AcpiDmTableInfoSdev1;
223167d9aa44SJung-uk Kim             Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable->Buffer);
223267d9aa44SJung-uk Kim             break;
223367d9aa44SJung-uk Kim 
223467d9aa44SJung-uk Kim         default:
223567d9aa44SJung-uk Kim 
223667d9aa44SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
223767d9aa44SJung-uk Kim             return (AE_ERROR);
223867d9aa44SJung-uk Kim         }
223967d9aa44SJung-uk Kim 
224067d9aa44SJung-uk Kim         /* Compile SDEV subtable body */
224167d9aa44SJung-uk Kim 
2242ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
224367d9aa44SJung-uk Kim         if (ACPI_FAILURE (Status))
224467d9aa44SJung-uk Kim         {
224567d9aa44SJung-uk Kim             return (Status);
224667d9aa44SJung-uk Kim         }
224767d9aa44SJung-uk Kim 
224867d9aa44SJung-uk Kim         ParentTable = DtPeekSubtable ();
224967d9aa44SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
225067d9aa44SJung-uk Kim 
225167d9aa44SJung-uk Kim         /* Optional data fields are appended to the main subtable body */
225267d9aa44SJung-uk Kim 
225367d9aa44SJung-uk Kim         switch (SdevHeader->Type)
225467d9aa44SJung-uk Kim         {
225567d9aa44SJung-uk Kim         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
225667d9aa44SJung-uk Kim 
2257cfd1ed46SJung-uk Kim             /*
2258cfd1ed46SJung-uk Kim              * Device Id Offset will be be calculated differently depending on
2259cfd1ed46SJung-uk Kim              * the presence of secure access components.
2260cfd1ed46SJung-uk Kim              */
2261cfd1ed46SJung-uk Kim             Namesp->DeviceIdOffset = 0;
2262cfd1ed46SJung-uk Kim             ComponentLength = 0;
2263cfd1ed46SJung-uk Kim 
2264cfd1ed46SJung-uk Kim             /* If the secure access component exists, get the structures */
2265cfd1ed46SJung-uk Kim 
2266cfd1ed46SJung-uk Kim             if (SdevHeader->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
2267cfd1ed46SJung-uk Kim             {
2268cfd1ed46SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0b,
2269cfd1ed46SJung-uk Kim                     &Subtable);
2270cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
2271cfd1ed46SJung-uk Kim                 {
2272cfd1ed46SJung-uk Kim                     return (Status);
2273cfd1ed46SJung-uk Kim                 }
2274cfd1ed46SJung-uk Kim                 ParentTable = DtPeekSubtable ();
2275cfd1ed46SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2276cfd1ed46SJung-uk Kim 
2277cfd1ed46SJung-uk Kim                 Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
2278cfd1ed46SJung-uk Kim 
2279cfd1ed46SJung-uk Kim                 /* Compile a secure access component header */
2280cfd1ed46SJung-uk Kim 
2281cfd1ed46SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevSecCompHdr,
2282cfd1ed46SJung-uk Kim                     &Subtable);
2283cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
2284cfd1ed46SJung-uk Kim                 {
2285cfd1ed46SJung-uk Kim                     return (Status);
2286cfd1ed46SJung-uk Kim                 }
2287cfd1ed46SJung-uk Kim                 ParentTable = DtPeekSubtable ();
2288cfd1ed46SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2289cfd1ed46SJung-uk Kim 
2290cfd1ed46SJung-uk Kim                 /* Compile the secure access component */
2291cfd1ed46SJung-uk Kim 
2292cfd1ed46SJung-uk Kim                 SecureComponentHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
2293cfd1ed46SJung-uk Kim                 switch (SecureComponentHeader->Type)
2294cfd1ed46SJung-uk Kim                 {
2295cfd1ed46SJung-uk Kim                 case ACPI_SDEV_TYPE_ID_COMPONENT:
2296cfd1ed46SJung-uk Kim 
2297cfd1ed46SJung-uk Kim                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
2298cfd1ed46SJung-uk Kim                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_ID_COMPONENT);
2299cfd1ed46SJung-uk Kim                     ComponentLength = sizeof (ACPI_SDEV_ID_COMPONENT);
2300cfd1ed46SJung-uk Kim                     break;
2301cfd1ed46SJung-uk Kim 
2302cfd1ed46SJung-uk Kim                 case ACPI_SDEV_TYPE_MEM_COMPONENT:
2303cfd1ed46SJung-uk Kim 
2304cfd1ed46SJung-uk Kim                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
2305cfd1ed46SJung-uk Kim                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_MEM_COMPONENT);
2306cfd1ed46SJung-uk Kim                     ComponentLength = sizeof (ACPI_SDEV_MEM_COMPONENT);
2307cfd1ed46SJung-uk Kim                     break;
2308cfd1ed46SJung-uk Kim 
2309cfd1ed46SJung-uk Kim                 default:
2310cfd1ed46SJung-uk Kim 
2311cfd1ed46SJung-uk Kim                     /* Any other secure component types are undefined */
2312cfd1ed46SJung-uk Kim 
2313cfd1ed46SJung-uk Kim                     return (AE_ERROR);
2314cfd1ed46SJung-uk Kim                 }
2315cfd1ed46SJung-uk Kim 
2316cfd1ed46SJung-uk Kim                 Status = DtCompileTable (PFieldList, SecureComponentInfoTable,
2317cfd1ed46SJung-uk Kim                     &Subtable);
2318cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
2319cfd1ed46SJung-uk Kim                 {
2320cfd1ed46SJung-uk Kim                     return (Status);
2321cfd1ed46SJung-uk Kim                 }
2322cfd1ed46SJung-uk Kim                 ParentTable = DtPeekSubtable ();
2323cfd1ed46SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
2324cfd1ed46SJung-uk Kim 
2325cfd1ed46SJung-uk Kim                 SecureComponent->SecureComponentOffset =
2326cfd1ed46SJung-uk Kim                     sizeof (ACPI_SDEV_NAMESPACE) + sizeof (ACPI_SDEV_SECURE_COMPONENT);
2327cfd1ed46SJung-uk Kim                 SecureComponent->SecureComponentLength = ComponentLength;
2328cfd1ed46SJung-uk Kim 
2329cfd1ed46SJung-uk Kim 
2330cfd1ed46SJung-uk Kim                 /*
2331cfd1ed46SJung-uk Kim                  * Add the secure component to the subtable to be added for the
2332cfd1ed46SJung-uk Kim                  * the namespace subtable's length
2333cfd1ed46SJung-uk Kim                  */
2334cfd1ed46SJung-uk Kim                 ComponentLength += sizeof (ACPI_SDEV_SECURE_COMPONENT);
2335cfd1ed46SJung-uk Kim             }
2336cfd1ed46SJung-uk Kim 
233767d9aa44SJung-uk Kim             /* Append DeviceId namespace string */
233867d9aa44SJung-uk Kim 
233967d9aa44SJung-uk Kim             Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a,
2340ff879b07SJung-uk Kim                 &Subtable);
234167d9aa44SJung-uk Kim             if (ACPI_FAILURE (Status))
234267d9aa44SJung-uk Kim             {
234367d9aa44SJung-uk Kim                 return (Status);
234467d9aa44SJung-uk Kim             }
234567d9aa44SJung-uk Kim 
234667d9aa44SJung-uk Kim             if (!Subtable)
234767d9aa44SJung-uk Kim             {
234867d9aa44SJung-uk Kim                 break;
234967d9aa44SJung-uk Kim             }
235067d9aa44SJung-uk Kim 
235167d9aa44SJung-uk Kim             ParentTable = DtPeekSubtable ();
235267d9aa44SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
235367d9aa44SJung-uk Kim 
2354cfd1ed46SJung-uk Kim             Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_NAMESPACE);
2355cfd1ed46SJung-uk Kim 
235667d9aa44SJung-uk Kim             Namesp->DeviceIdLength = (UINT16) Subtable->Length;
235767d9aa44SJung-uk Kim 
235867d9aa44SJung-uk Kim             /* Append Vendor data */
235967d9aa44SJung-uk Kim 
236067d9aa44SJung-uk Kim             Namesp->VendorDataLength = 0;
236167d9aa44SJung-uk Kim             Namesp->VendorDataOffset = 0;
236267d9aa44SJung-uk Kim 
236367d9aa44SJung-uk Kim             if (*PFieldList)
236467d9aa44SJung-uk Kim             {
236567d9aa44SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
2366ff879b07SJung-uk Kim                     &Subtable);
236767d9aa44SJung-uk Kim                 if (ACPI_FAILURE (Status))
236867d9aa44SJung-uk Kim                 {
236967d9aa44SJung-uk Kim                     return (Status);
237067d9aa44SJung-uk Kim                 }
237167d9aa44SJung-uk Kim 
237267d9aa44SJung-uk Kim                 if (Subtable)
237367d9aa44SJung-uk Kim                 {
237467d9aa44SJung-uk Kim                     ParentTable = DtPeekSubtable ();
237567d9aa44SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
237667d9aa44SJung-uk Kim 
237767d9aa44SJung-uk Kim                     Namesp->VendorDataOffset =
237867d9aa44SJung-uk Kim                         Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
237967d9aa44SJung-uk Kim                     Namesp->VendorDataLength =
238067d9aa44SJung-uk Kim                         (UINT16) Subtable->Length;
238167d9aa44SJung-uk Kim 
238267d9aa44SJung-uk Kim                     /* Final size of entire namespace structure */
238367d9aa44SJung-uk Kim 
238467d9aa44SJung-uk Kim                     SdevHeader->Length = (UINT16)(sizeof(ACPI_SDEV_NAMESPACE) +
2385cfd1ed46SJung-uk Kim                         Subtable->Length + Namesp->DeviceIdLength) + ComponentLength;
2386a009b7dcSJung-uk Kim                 }
2387a009b7dcSJung-uk Kim             }
2388a009b7dcSJung-uk Kim 
238967d9aa44SJung-uk Kim             break;
239067d9aa44SJung-uk Kim 
239167d9aa44SJung-uk Kim         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
239267d9aa44SJung-uk Kim 
239367d9aa44SJung-uk Kim             /* Append the PCIe path info first */
239467d9aa44SJung-uk Kim 
239567d9aa44SJung-uk Kim             EntryCount = 0;
239667d9aa44SJung-uk Kim             while (*PFieldList && !strcmp ((*PFieldList)->Name, "Device"))
239767d9aa44SJung-uk Kim             {
239867d9aa44SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1a,
2399ff879b07SJung-uk Kim                     &Subtable);
240067d9aa44SJung-uk Kim                 if (ACPI_FAILURE (Status))
240167d9aa44SJung-uk Kim                 {
240267d9aa44SJung-uk Kim                     return (Status);
240367d9aa44SJung-uk Kim                 }
240467d9aa44SJung-uk Kim 
240567d9aa44SJung-uk Kim                 if (!Subtable)
240667d9aa44SJung-uk Kim                 {
240767d9aa44SJung-uk Kim                     DtPopSubtable ();
240867d9aa44SJung-uk Kim                     break;
240967d9aa44SJung-uk Kim                 }
241067d9aa44SJung-uk Kim 
241167d9aa44SJung-uk Kim                 ParentTable = DtPeekSubtable ();
241267d9aa44SJung-uk Kim                 DtInsertSubtable (ParentTable, Subtable);
241367d9aa44SJung-uk Kim                 EntryCount++;
241467d9aa44SJung-uk Kim             }
241567d9aa44SJung-uk Kim 
241667d9aa44SJung-uk Kim             /* Path offset will point immediately after the main subtable */
241767d9aa44SJung-uk Kim 
241867d9aa44SJung-uk Kim             Pcie->PathOffset = sizeof (ACPI_SDEV_PCIE);
241967d9aa44SJung-uk Kim             Pcie->PathLength = (UINT16)
242067d9aa44SJung-uk Kim                 (EntryCount * sizeof (ACPI_SDEV_PCIE_PATH));
242167d9aa44SJung-uk Kim 
242267d9aa44SJung-uk Kim             /* Append the Vendor Data last */
242367d9aa44SJung-uk Kim 
242467d9aa44SJung-uk Kim             Pcie->VendorDataLength = 0;
242567d9aa44SJung-uk Kim             Pcie->VendorDataOffset = 0;
242667d9aa44SJung-uk Kim 
242767d9aa44SJung-uk Kim             if (*PFieldList)
242867d9aa44SJung-uk Kim             {
242967d9aa44SJung-uk Kim                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
2430ff879b07SJung-uk Kim                     &Subtable);
243167d9aa44SJung-uk Kim                 if (ACPI_FAILURE (Status))
243267d9aa44SJung-uk Kim                 {
243367d9aa44SJung-uk Kim                     return (Status);
243467d9aa44SJung-uk Kim                 }
243567d9aa44SJung-uk Kim 
243667d9aa44SJung-uk Kim                 if (Subtable)
243767d9aa44SJung-uk Kim                 {
243867d9aa44SJung-uk Kim                     ParentTable = DtPeekSubtable ();
243967d9aa44SJung-uk Kim                     DtInsertSubtable (ParentTable, Subtable);
244067d9aa44SJung-uk Kim 
244167d9aa44SJung-uk Kim                     Pcie->VendorDataOffset =
244267d9aa44SJung-uk Kim                         Pcie->PathOffset + Pcie->PathLength;
244367d9aa44SJung-uk Kim                     Pcie->VendorDataLength = (UINT16)
244467d9aa44SJung-uk Kim                         Subtable->Length;
244567d9aa44SJung-uk Kim                 }
244667d9aa44SJung-uk Kim             }
244767d9aa44SJung-uk Kim 
244867d9aa44SJung-uk Kim             SdevHeader->Length =
244967d9aa44SJung-uk Kim                 sizeof (ACPI_SDEV_PCIE) +
245067d9aa44SJung-uk Kim                 Pcie->PathLength + Pcie->VendorDataLength;
245167d9aa44SJung-uk Kim             break;
245267d9aa44SJung-uk Kim 
245367d9aa44SJung-uk Kim         default:
245467d9aa44SJung-uk Kim 
245567d9aa44SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
245667d9aa44SJung-uk Kim             return (AE_ERROR);
245767d9aa44SJung-uk Kim         }
245867d9aa44SJung-uk Kim 
245967d9aa44SJung-uk Kim         DtPopSubtable ();
246067d9aa44SJung-uk Kim     }
246167d9aa44SJung-uk Kim 
246267d9aa44SJung-uk Kim     return (AE_OK);
246367d9aa44SJung-uk Kim }
246467d9aa44SJung-uk Kim 
246567d9aa44SJung-uk Kim 
246667d9aa44SJung-uk Kim /******************************************************************************
246767d9aa44SJung-uk Kim  *
2468f8146b88SJung-uk Kim  * FUNCTION:    DtCompileSlic
2469f8146b88SJung-uk Kim  *
2470f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2471f8146b88SJung-uk Kim  *
2472f8146b88SJung-uk Kim  * RETURN:      Status
2473f8146b88SJung-uk Kim  *
2474f8146b88SJung-uk Kim  * DESCRIPTION: Compile SLIC.
2475f8146b88SJung-uk Kim  *
2476f8146b88SJung-uk Kim  *****************************************************************************/
2477f8146b88SJung-uk Kim 
2478f8146b88SJung-uk Kim ACPI_STATUS
DtCompileSlic(void ** List)2479f8146b88SJung-uk Kim DtCompileSlic (
2480f8146b88SJung-uk Kim     void                    **List)
2481f8146b88SJung-uk Kim {
2482f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2483f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2484f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2485f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2486f8146b88SJung-uk Kim 
2487f8146b88SJung-uk Kim 
2488f8146b88SJung-uk Kim     while (*PFieldList)
2489f8146b88SJung-uk Kim     {
2490f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
2491ff879b07SJung-uk Kim             &Subtable);
2492f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2493f8146b88SJung-uk Kim         {
2494f8146b88SJung-uk Kim             return (Status);
2495f8146b88SJung-uk Kim         }
2496f8146b88SJung-uk Kim 
2497f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2498f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2499f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
2500f8146b88SJung-uk Kim         DtPopSubtable ();
2501f8146b88SJung-uk Kim     }
2502f8146b88SJung-uk Kim 
2503f8146b88SJung-uk Kim     return (AE_OK);
2504f8146b88SJung-uk Kim }
2505f8146b88SJung-uk Kim 
2506f8146b88SJung-uk Kim 
2507f8146b88SJung-uk Kim /******************************************************************************
2508f8146b88SJung-uk Kim  *
2509f8146b88SJung-uk Kim  * FUNCTION:    DtCompileSlit
2510f8146b88SJung-uk Kim  *
2511f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2512f8146b88SJung-uk Kim  *
2513f8146b88SJung-uk Kim  * RETURN:      Status
2514f8146b88SJung-uk Kim  *
2515f8146b88SJung-uk Kim  * DESCRIPTION: Compile SLIT.
2516f8146b88SJung-uk Kim  *
2517f8146b88SJung-uk Kim  *****************************************************************************/
2518f8146b88SJung-uk Kim 
2519f8146b88SJung-uk Kim ACPI_STATUS
DtCompileSlit(void ** List)2520f8146b88SJung-uk Kim DtCompileSlit (
2521f8146b88SJung-uk Kim     void                    **List)
2522f8146b88SJung-uk Kim {
2523f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2524f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2525f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2526f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2527f8146b88SJung-uk Kim     DT_FIELD                *FieldList;
2528a009b7dcSJung-uk Kim     DT_FIELD                *EndOfFieldList = NULL;
2529f8146b88SJung-uk Kim     UINT32                  Localities;
2530a009b7dcSJung-uk Kim     UINT32                  LocalityListLength;
2531f8146b88SJung-uk Kim     UINT8                   *LocalityBuffer;
2532f8146b88SJung-uk Kim 
2533f8146b88SJung-uk Kim 
2534f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
2535ff879b07SJung-uk Kim         &Subtable);
2536f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2537f8146b88SJung-uk Kim     {
2538f8146b88SJung-uk Kim         return (Status);
2539f8146b88SJung-uk Kim     }
2540f8146b88SJung-uk Kim 
2541f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2542f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2543f8146b88SJung-uk Kim 
2544f8146b88SJung-uk Kim     Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
2545f8146b88SJung-uk Kim     LocalityBuffer = UtLocalCalloc (Localities);
2546a009b7dcSJung-uk Kim     LocalityListLength = 0;
2547f8146b88SJung-uk Kim 
2548f8146b88SJung-uk Kim     /* Compile each locality buffer */
2549f8146b88SJung-uk Kim 
2550f8146b88SJung-uk Kim     FieldList = *PFieldList;
2551f8146b88SJung-uk Kim     while (FieldList)
2552f8146b88SJung-uk Kim     {
2553f8146b88SJung-uk Kim         DtCompileBuffer (LocalityBuffer,
2554f8146b88SJung-uk Kim             FieldList->Value, FieldList, Localities);
2555f8146b88SJung-uk Kim 
2556a009b7dcSJung-uk Kim         LocalityListLength++;
2557f8146b88SJung-uk Kim         DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
2558f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2559a009b7dcSJung-uk Kim         EndOfFieldList = FieldList;
2560f8146b88SJung-uk Kim         FieldList = FieldList->Next;
2561f8146b88SJung-uk Kim     }
2562f8146b88SJung-uk Kim 
2563a009b7dcSJung-uk Kim     if (LocalityListLength != Localities)
2564a009b7dcSJung-uk Kim     {
2565a009b7dcSJung-uk Kim         sprintf(AslGbl_MsgBuffer,
2566a009b7dcSJung-uk Kim             "Found %u entries, must match LocalityCount: %u",
2567a009b7dcSJung-uk Kim             LocalityListLength, Localities);
2568a009b7dcSJung-uk Kim         DtError (ASL_ERROR, ASL_MSG_ENTRY_LIST, EndOfFieldList, AslGbl_MsgBuffer);
2569f9a6772eSJung-uk Kim         ACPI_FREE (LocalityBuffer);
2570a009b7dcSJung-uk Kim         return (AE_LIMIT);
2571a009b7dcSJung-uk Kim     }
2572a009b7dcSJung-uk Kim 
2573f8146b88SJung-uk Kim     ACPI_FREE (LocalityBuffer);
2574f8146b88SJung-uk Kim     return (AE_OK);
2575f8146b88SJung-uk Kim }
2576f8146b88SJung-uk Kim 
2577f8146b88SJung-uk Kim 
2578f8146b88SJung-uk Kim /******************************************************************************
2579f8146b88SJung-uk Kim  *
2580f8146b88SJung-uk Kim  * FUNCTION:    DtCompileSrat
2581f8146b88SJung-uk Kim  *
2582f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
2583f8146b88SJung-uk Kim  *
2584f8146b88SJung-uk Kim  * RETURN:      Status
2585f8146b88SJung-uk Kim  *
2586f8146b88SJung-uk Kim  * DESCRIPTION: Compile SRAT.
2587f8146b88SJung-uk Kim  *
2588f8146b88SJung-uk Kim  *****************************************************************************/
2589f8146b88SJung-uk Kim 
2590f8146b88SJung-uk Kim ACPI_STATUS
DtCompileSrat(void ** List)2591f8146b88SJung-uk Kim DtCompileSrat (
2592f8146b88SJung-uk Kim     void                    **List)
2593f8146b88SJung-uk Kim {
2594f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2595f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2596f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2597f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2598f8146b88SJung-uk Kim     DT_FIELD                *SubtableStart;
2599f8146b88SJung-uk Kim     ACPI_SUBTABLE_HEADER    *SratHeader;
2600f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
2601f8146b88SJung-uk Kim 
2602f8146b88SJung-uk Kim 
2603f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
2604ff879b07SJung-uk Kim         &Subtable);
2605f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2606f8146b88SJung-uk Kim     {
2607f8146b88SJung-uk Kim         return (Status);
2608f8146b88SJung-uk Kim     }
2609f8146b88SJung-uk Kim 
2610f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2611f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2612f8146b88SJung-uk Kim 
2613f8146b88SJung-uk Kim     while (*PFieldList)
2614f8146b88SJung-uk Kim     {
2615f8146b88SJung-uk Kim         SubtableStart = *PFieldList;
2616f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
2617ff879b07SJung-uk Kim             &Subtable);
2618f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2619f8146b88SJung-uk Kim         {
2620f8146b88SJung-uk Kim             return (Status);
2621f8146b88SJung-uk Kim         }
2622f8146b88SJung-uk Kim 
2623f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2624f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2625f8146b88SJung-uk Kim         DtPushSubtable (Subtable);
2626f8146b88SJung-uk Kim 
2627f8146b88SJung-uk Kim         SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
2628f8146b88SJung-uk Kim 
2629f8146b88SJung-uk Kim         switch (SratHeader->Type)
2630f8146b88SJung-uk Kim         {
2631f8146b88SJung-uk Kim         case ACPI_SRAT_TYPE_CPU_AFFINITY:
2632f8146b88SJung-uk Kim 
2633f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat0;
2634f8146b88SJung-uk Kim             break;
2635f8146b88SJung-uk Kim 
2636f8146b88SJung-uk Kim         case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
2637f8146b88SJung-uk Kim 
2638f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat1;
2639f8146b88SJung-uk Kim             break;
2640f8146b88SJung-uk Kim 
2641f8146b88SJung-uk Kim         case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
2642f8146b88SJung-uk Kim 
2643f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat2;
2644f8146b88SJung-uk Kim             break;
2645f8146b88SJung-uk Kim 
2646f8146b88SJung-uk Kim         case ACPI_SRAT_TYPE_GICC_AFFINITY:
2647f8146b88SJung-uk Kim 
2648f8146b88SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat3;
2649f8146b88SJung-uk Kim             break;
2650f8146b88SJung-uk Kim 
2651af051161SJung-uk Kim         case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
2652af051161SJung-uk Kim 
2653af051161SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat4;
2654af051161SJung-uk Kim             break;
2655af051161SJung-uk Kim 
2656cd6518c7SJung-uk Kim         case ACPI_SRAT_TYPE_GENERIC_AFFINITY:
2657cd6518c7SJung-uk Kim 
2658cd6518c7SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat5;
2659cd6518c7SJung-uk Kim             break;
2660cd6518c7SJung-uk Kim 
26611b7a2680SJung-uk Kim         case ACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY:
26621b7a2680SJung-uk Kim 
26631b7a2680SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat6;
26641b7a2680SJung-uk Kim             break;
26651b7a2680SJung-uk Kim 
2666804fe266SJung-uk Kim         case ACPI_SRAT_TYPE_RINTC_AFFINITY:
2667804fe266SJung-uk Kim 
2668804fe266SJung-uk Kim             InfoTable = AcpiDmTableInfoSrat7;
2669804fe266SJung-uk Kim             break;
2670804fe266SJung-uk Kim 
2671f8146b88SJung-uk Kim         default:
2672f8146b88SJung-uk Kim 
2673f8146b88SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
2674f8146b88SJung-uk Kim             return (AE_ERROR);
2675f8146b88SJung-uk Kim         }
2676f8146b88SJung-uk Kim 
2677ff879b07SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
2678f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2679f8146b88SJung-uk Kim         {
2680f8146b88SJung-uk Kim             return (Status);
2681f8146b88SJung-uk Kim         }
2682f8146b88SJung-uk Kim 
2683f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2684f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2685f8146b88SJung-uk Kim         DtPopSubtable ();
2686f8146b88SJung-uk Kim     }
2687f8146b88SJung-uk Kim 
2688f8146b88SJung-uk Kim     return (AE_OK);
2689f8146b88SJung-uk Kim }
2690f8146b88SJung-uk Kim 
2691f8146b88SJung-uk Kim 
2692f8146b88SJung-uk Kim /******************************************************************************
2693f8146b88SJung-uk Kim  *
2694f8146b88SJung-uk Kim  * FUNCTION:    DtCompileStao
2695f8146b88SJung-uk Kim  *
2696f8146b88SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
2697f8146b88SJung-uk Kim  *
2698f8146b88SJung-uk Kim  * RETURN:      Status
2699f8146b88SJung-uk Kim  *
2700f8146b88SJung-uk Kim  * DESCRIPTION: Compile STAO.
2701f8146b88SJung-uk Kim  *
2702f8146b88SJung-uk Kim  *****************************************************************************/
2703f8146b88SJung-uk Kim 
2704f8146b88SJung-uk Kim ACPI_STATUS
DtCompileStao(void ** List)2705f8146b88SJung-uk Kim DtCompileStao (
2706f8146b88SJung-uk Kim     void                    **List)
2707f8146b88SJung-uk Kim {
2708f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2709f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2710f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2711f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2712f8146b88SJung-uk Kim 
2713f8146b88SJung-uk Kim 
2714f8146b88SJung-uk Kim     /* Compile the main table */
2715f8146b88SJung-uk Kim 
2716f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao,
2717ff879b07SJung-uk Kim         &Subtable);
2718f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2719f8146b88SJung-uk Kim     {
2720f8146b88SJung-uk Kim         return (Status);
2721f8146b88SJung-uk Kim     }
2722f8146b88SJung-uk Kim 
2723f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2724f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2725f8146b88SJung-uk Kim 
2726f8146b88SJung-uk Kim     /* Compile each ASCII namestring as a subtable */
2727f8146b88SJung-uk Kim 
2728f8146b88SJung-uk Kim     while (*PFieldList)
2729f8146b88SJung-uk Kim     {
2730f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr,
2731ff879b07SJung-uk Kim             &Subtable);
2732f8146b88SJung-uk Kim         if (ACPI_FAILURE (Status))
2733f8146b88SJung-uk Kim         {
2734f8146b88SJung-uk Kim             return (Status);
2735f8146b88SJung-uk Kim         }
2736f8146b88SJung-uk Kim 
2737f8146b88SJung-uk Kim         ParentTable = DtPeekSubtable ();
2738f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
2739f8146b88SJung-uk Kim     }
2740f8146b88SJung-uk Kim 
2741f8146b88SJung-uk Kim     return (AE_OK);
2742f8146b88SJung-uk Kim }
2743f8146b88SJung-uk Kim 
2744f8146b88SJung-uk Kim 
27451970d693SJung-uk Kim /******************************************************************************
27461970d693SJung-uk Kim  *
27471970d693SJung-uk Kim  * FUNCTION:    DtCompileSvkl
27481970d693SJung-uk Kim  *
27491970d693SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
27501970d693SJung-uk Kim  *
27511970d693SJung-uk Kim  * RETURN:      Status
27521970d693SJung-uk Kim  *
27531970d693SJung-uk Kim  * DESCRIPTION: Compile SVKL.
27541970d693SJung-uk Kim  *
27551970d693SJung-uk Kim  * NOTES: SVKL is essentially a flat table, with a small main table and
27561970d693SJung-uk Kim  *          a variable number of a single type of subtable.
27571970d693SJung-uk Kim  *
27581970d693SJung-uk Kim  *****************************************************************************/
27591970d693SJung-uk Kim 
27601970d693SJung-uk Kim ACPI_STATUS
DtCompileSvkl(void ** List)27611970d693SJung-uk Kim DtCompileSvkl (
27621970d693SJung-uk Kim     void                    **List)
27631970d693SJung-uk Kim {
27641970d693SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
27651970d693SJung-uk Kim     DT_SUBTABLE             *Subtable;
27661970d693SJung-uk Kim     DT_SUBTABLE             *ParentTable;
27671970d693SJung-uk Kim     ACPI_STATUS             Status;
27681970d693SJung-uk Kim 
27691970d693SJung-uk Kim 
27701970d693SJung-uk Kim     /* Compile the main table */
27711970d693SJung-uk Kim 
27721970d693SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl,
27731970d693SJung-uk Kim         &Subtable);
27741970d693SJung-uk Kim     if (ACPI_FAILURE (Status))
27751970d693SJung-uk Kim     {
27761970d693SJung-uk Kim         return (Status);
27771970d693SJung-uk Kim     }
27781970d693SJung-uk Kim 
27791970d693SJung-uk Kim     ParentTable = DtPeekSubtable ();
27801970d693SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
27811970d693SJung-uk Kim 
27821970d693SJung-uk Kim     /* Compile each subtable */
27831970d693SJung-uk Kim 
27841970d693SJung-uk Kim     while (*PFieldList)
27851970d693SJung-uk Kim     {
27861970d693SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl0,
27871970d693SJung-uk Kim             &Subtable);
27881970d693SJung-uk Kim         if (ACPI_FAILURE (Status))
27891970d693SJung-uk Kim         {
27901970d693SJung-uk Kim             return (Status);
27911970d693SJung-uk Kim         }
27921970d693SJung-uk Kim 
27931970d693SJung-uk Kim         ParentTable = DtPeekSubtable ();
27941970d693SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
27951970d693SJung-uk Kim     }
27961970d693SJung-uk Kim 
27971970d693SJung-uk Kim     return (AE_OK);
27981970d693SJung-uk Kim }
27991970d693SJung-uk Kim 
28001970d693SJung-uk Kim 
2801f8146b88SJung-uk Kim /******************************************************************************
2802f8146b88SJung-uk Kim  *
2803f8146b88SJung-uk Kim  * FUNCTION:    DtCompileTcpa
2804f8146b88SJung-uk Kim  *
2805f8146b88SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
2806f8146b88SJung-uk Kim  *
2807f8146b88SJung-uk Kim  * RETURN:      Status
2808f8146b88SJung-uk Kim  *
2809f8146b88SJung-uk Kim  * DESCRIPTION: Compile TCPA.
2810f8146b88SJung-uk Kim  *
2811f8146b88SJung-uk Kim  *****************************************************************************/
2812f8146b88SJung-uk Kim 
2813f8146b88SJung-uk Kim ACPI_STATUS
DtCompileTcpa(void ** List)2814f8146b88SJung-uk Kim DtCompileTcpa (
2815f8146b88SJung-uk Kim     void                    **List)
2816f8146b88SJung-uk Kim {
2817f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
2818f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
2819f8146b88SJung-uk Kim     ACPI_TABLE_TCPA_HDR     *TcpaHeader;
2820f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
2821f8146b88SJung-uk Kim     ACPI_STATUS             Status;
2822f8146b88SJung-uk Kim 
2823f8146b88SJung-uk Kim 
2824f8146b88SJung-uk Kim     /* Compile the main table */
2825f8146b88SJung-uk Kim 
2826f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaHdr,
2827ff879b07SJung-uk Kim         &Subtable);
2828f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
2829f8146b88SJung-uk Kim     {
2830f8146b88SJung-uk Kim         return (Status);
2831f8146b88SJung-uk Kim     }
2832f8146b88SJung-uk Kim 
2833f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2834f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2835f8146b88SJung-uk Kim 
2836f8146b88SJung-uk Kim     /*
2837f8146b88SJung-uk Kim      * Examine the PlatformClass field to determine the table type.
2838f8146b88SJung-uk Kim      * Either a client or server table. Only one.
2839f8146b88SJung-uk Kim      */
2840f8146b88SJung-uk Kim     TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer);
2841f8146b88SJung-uk Kim 
2842f8146b88SJung-uk Kim     switch (TcpaHeader->PlatformClass)
2843f8146b88SJung-uk Kim     {
2844f8146b88SJung-uk Kim     case ACPI_TCPA_CLIENT_TABLE:
2845f8146b88SJung-uk Kim 
2846f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaClient,
2847ff879b07SJung-uk Kim             &Subtable);
2848f8146b88SJung-uk Kim         break;
2849f8146b88SJung-uk Kim 
2850f8146b88SJung-uk Kim     case ACPI_TCPA_SERVER_TABLE:
2851f8146b88SJung-uk Kim 
2852f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaServer,
2853ff879b07SJung-uk Kim             &Subtable);
2854f8146b88SJung-uk Kim         break;
2855f8146b88SJung-uk Kim 
2856f8146b88SJung-uk Kim     default:
2857f8146b88SJung-uk Kim 
2858f8146b88SJung-uk Kim         AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
2859f8146b88SJung-uk Kim             TcpaHeader->PlatformClass);
2860f8146b88SJung-uk Kim         Status = AE_ERROR;
2861f8146b88SJung-uk Kim         break;
2862f8146b88SJung-uk Kim     }
2863f8146b88SJung-uk Kim 
2864f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
2865f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
2866f8146b88SJung-uk Kim     return (Status);
2867f8146b88SJung-uk Kim }
2868f8146b88SJung-uk Kim 
2869f8146b88SJung-uk Kim 
2870f8146b88SJung-uk Kim /******************************************************************************
2871f8146b88SJung-uk Kim  *
28724a38ee6dSJung-uk Kim  * FUNCTION:    DtCompileTpm2Rev3
28734a38ee6dSJung-uk Kim  *
28744a38ee6dSJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
28754a38ee6dSJung-uk Kim  *
28764a38ee6dSJung-uk Kim  * RETURN:      Status
28774a38ee6dSJung-uk Kim  *
28784a38ee6dSJung-uk Kim  * DESCRIPTION: Compile TPM2 revision 3
28794a38ee6dSJung-uk Kim  *
28804a38ee6dSJung-uk Kim  *****************************************************************************/
28814a38ee6dSJung-uk Kim static ACPI_STATUS
DtCompileTpm2Rev3(void ** List)28824a38ee6dSJung-uk Kim DtCompileTpm2Rev3 (
28834a38ee6dSJung-uk Kim     void                    **List)
28844a38ee6dSJung-uk Kim {
28854a38ee6dSJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
28864a38ee6dSJung-uk Kim     DT_SUBTABLE             *Subtable;
28874a38ee6dSJung-uk Kim     ACPI_TABLE_TPM23        *Tpm23Header;
28884a38ee6dSJung-uk Kim     DT_SUBTABLE             *ParentTable;
28894a38ee6dSJung-uk Kim     ACPI_STATUS             Status = AE_OK;
28904a38ee6dSJung-uk Kim 
28914a38ee6dSJung-uk Kim 
28924a38ee6dSJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23,
28934a38ee6dSJung-uk Kim         &Subtable);
28944a38ee6dSJung-uk Kim 
28954a38ee6dSJung-uk Kim     ParentTable = DtPeekSubtable ();
28964a38ee6dSJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
28974a38ee6dSJung-uk Kim     Tpm23Header = ACPI_CAST_PTR (ACPI_TABLE_TPM23, ParentTable->Buffer);
28984a38ee6dSJung-uk Kim 
28994a38ee6dSJung-uk Kim     /* Subtable type depends on the StartMethod */
29004a38ee6dSJung-uk Kim 
29014a38ee6dSJung-uk Kim     switch (Tpm23Header->StartMethod)
29024a38ee6dSJung-uk Kim     {
29034a38ee6dSJung-uk Kim     case ACPI_TPM23_ACPI_START_METHOD:
29044a38ee6dSJung-uk Kim 
29054a38ee6dSJung-uk Kim         /* Subtable specific to to ARM_SMC */
29064a38ee6dSJung-uk Kim 
29074a38ee6dSJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23a,
29084a38ee6dSJung-uk Kim             &Subtable);
29094a38ee6dSJung-uk Kim         if (ACPI_FAILURE (Status))
29104a38ee6dSJung-uk Kim         {
29114a38ee6dSJung-uk Kim             return (Status);
29124a38ee6dSJung-uk Kim         }
29134a38ee6dSJung-uk Kim 
29144a38ee6dSJung-uk Kim         ParentTable = DtPeekSubtable ();
29154a38ee6dSJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
29164a38ee6dSJung-uk Kim         break;
29174a38ee6dSJung-uk Kim 
29184a38ee6dSJung-uk Kim     default:
29194a38ee6dSJung-uk Kim         break;
29204a38ee6dSJung-uk Kim     }
29214a38ee6dSJung-uk Kim 
29224a38ee6dSJung-uk Kim     return (Status);
29234a38ee6dSJung-uk Kim }
29244a38ee6dSJung-uk Kim 
29254a38ee6dSJung-uk Kim 
29264a38ee6dSJung-uk Kim /******************************************************************************
29274a38ee6dSJung-uk Kim  *
292867d9aa44SJung-uk Kim  * FUNCTION:    DtCompileTpm2
292967d9aa44SJung-uk Kim  *
293067d9aa44SJung-uk Kim  * PARAMETERS:  PFieldList          - Current field list pointer
293167d9aa44SJung-uk Kim  *
293267d9aa44SJung-uk Kim  * RETURN:      Status
293367d9aa44SJung-uk Kim  *
293467d9aa44SJung-uk Kim  * DESCRIPTION: Compile TPM2.
293567d9aa44SJung-uk Kim  *
293667d9aa44SJung-uk Kim  *****************************************************************************/
293767d9aa44SJung-uk Kim 
293867d9aa44SJung-uk Kim ACPI_STATUS
DtCompileTpm2(void ** List)293967d9aa44SJung-uk Kim DtCompileTpm2 (
294067d9aa44SJung-uk Kim     void                    **List)
294167d9aa44SJung-uk Kim {
294267d9aa44SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
294367d9aa44SJung-uk Kim     DT_SUBTABLE             *Subtable;
294467d9aa44SJung-uk Kim     ACPI_TABLE_TPM2         *Tpm2Header;
294567d9aa44SJung-uk Kim     DT_SUBTABLE             *ParentTable;
294667d9aa44SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
29474a38ee6dSJung-uk Kim     ACPI_TABLE_HEADER       *Header;
294867d9aa44SJung-uk Kim 
294967d9aa44SJung-uk Kim 
29504a38ee6dSJung-uk Kim     ParentTable = DtPeekSubtable ();
29514a38ee6dSJung-uk Kim 
29524a38ee6dSJung-uk Kim     Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
29534a38ee6dSJung-uk Kim 
29544a38ee6dSJung-uk Kim     if (Header->Revision == 3)
29554a38ee6dSJung-uk Kim     {
29564a38ee6dSJung-uk Kim         return (DtCompileTpm2Rev3 (List));
29574a38ee6dSJung-uk Kim     }
29584a38ee6dSJung-uk Kim 
295967d9aa44SJung-uk Kim     /* Compile the main table */
296067d9aa44SJung-uk Kim 
296167d9aa44SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2,
2962ff879b07SJung-uk Kim         &Subtable);
296367d9aa44SJung-uk Kim     if (ACPI_FAILURE (Status))
296467d9aa44SJung-uk Kim     {
296567d9aa44SJung-uk Kim         return (Status);
296667d9aa44SJung-uk Kim     }
296767d9aa44SJung-uk Kim 
296867d9aa44SJung-uk Kim     ParentTable = DtPeekSubtable ();
296967d9aa44SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
297067d9aa44SJung-uk Kim 
297167d9aa44SJung-uk Kim     Tpm2Header = ACPI_CAST_PTR (ACPI_TABLE_TPM2, ParentTable->Buffer);
297267d9aa44SJung-uk Kim 
297367d9aa44SJung-uk Kim     /* Method parameters */
297467d9aa44SJung-uk Kim     /* Optional: Log area minimum length */
297567d9aa44SJung-uk Kim     /* Optional: Log area start address */
297667d9aa44SJung-uk Kim     /* TBD: Optional fields above not fully implemented (not optional at this time) */
297767d9aa44SJung-uk Kim 
297867d9aa44SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2a,
2979ff879b07SJung-uk Kim         &Subtable);
298067d9aa44SJung-uk Kim     if (ACPI_FAILURE (Status))
298167d9aa44SJung-uk Kim     {
298267d9aa44SJung-uk Kim         return (Status);
298367d9aa44SJung-uk Kim     }
298467d9aa44SJung-uk Kim 
298567d9aa44SJung-uk Kim     ParentTable = DtPeekSubtable ();
298667d9aa44SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
298767d9aa44SJung-uk Kim 
298867d9aa44SJung-uk Kim 
298967d9aa44SJung-uk Kim     /* Subtable type depends on the StartMethod */
299067d9aa44SJung-uk Kim 
299167d9aa44SJung-uk Kim     switch (Tpm2Header->StartMethod)
299267d9aa44SJung-uk Kim     {
299367d9aa44SJung-uk Kim     case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC:
299467d9aa44SJung-uk Kim 
299567d9aa44SJung-uk Kim         /* Subtable specific to to ARM_SMC */
299667d9aa44SJung-uk Kim 
299767d9aa44SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm211,
2998ff879b07SJung-uk Kim             &Subtable);
299967d9aa44SJung-uk Kim         if (ACPI_FAILURE (Status))
300067d9aa44SJung-uk Kim         {
300167d9aa44SJung-uk Kim             return (Status);
300267d9aa44SJung-uk Kim         }
300367d9aa44SJung-uk Kim 
300467d9aa44SJung-uk Kim         ParentTable = DtPeekSubtable ();
300567d9aa44SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
300667d9aa44SJung-uk Kim         break;
300767d9aa44SJung-uk Kim 
300867d9aa44SJung-uk Kim     case ACPI_TPM2_START_METHOD:
300967d9aa44SJung-uk Kim     case ACPI_TPM2_MEMORY_MAPPED:
301067d9aa44SJung-uk Kim     case ACPI_TPM2_COMMAND_BUFFER:
301167d9aa44SJung-uk Kim     case ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD:
301267d9aa44SJung-uk Kim         break;
301367d9aa44SJung-uk Kim 
301467d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED1:
301567d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED3:
301667d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED4:
301767d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED5:
301867d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED9:
301967d9aa44SJung-uk Kim     case ACPI_TPM2_RESERVED10:
302067d9aa44SJung-uk Kim 
302167d9aa44SJung-uk Kim         AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n",
302267d9aa44SJung-uk Kim             Tpm2Header->StartMethod);
302367d9aa44SJung-uk Kim         Status = AE_ERROR;
302467d9aa44SJung-uk Kim         break;
302567d9aa44SJung-uk Kim 
302667d9aa44SJung-uk Kim     case ACPI_TPM2_NOT_ALLOWED:
302767d9aa44SJung-uk Kim     default:
302867d9aa44SJung-uk Kim 
302967d9aa44SJung-uk Kim         AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n",
303067d9aa44SJung-uk Kim             Tpm2Header->StartMethod);
303167d9aa44SJung-uk Kim         Status = AE_ERROR;
303267d9aa44SJung-uk Kim         break;
303367d9aa44SJung-uk Kim     }
303467d9aa44SJung-uk Kim 
303567d9aa44SJung-uk Kim     return (Status);
303667d9aa44SJung-uk Kim }
303767d9aa44SJung-uk Kim 
303867d9aa44SJung-uk Kim 
303967d9aa44SJung-uk Kim /******************************************************************************
304067d9aa44SJung-uk Kim  *
3041f8146b88SJung-uk Kim  * FUNCTION:    DtGetGenericTableInfo
3042f8146b88SJung-uk Kim  *
3043f8146b88SJung-uk Kim  * PARAMETERS:  Name                - Generic type name
3044f8146b88SJung-uk Kim  *
3045f8146b88SJung-uk Kim  * RETURN:      Info entry
3046f8146b88SJung-uk Kim  *
3047f8146b88SJung-uk Kim  * DESCRIPTION: Obtain table info for a generic name entry
3048f8146b88SJung-uk Kim  *
3049f8146b88SJung-uk Kim  *****************************************************************************/
3050f8146b88SJung-uk Kim 
3051f8146b88SJung-uk Kim ACPI_DMTABLE_INFO *
DtGetGenericTableInfo(char * Name)3052f8146b88SJung-uk Kim DtGetGenericTableInfo (
3053f8146b88SJung-uk Kim     char                    *Name)
3054f8146b88SJung-uk Kim {
3055f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *Info;
3056f8146b88SJung-uk Kim     UINT32                  i;
3057f8146b88SJung-uk Kim 
3058f8146b88SJung-uk Kim 
3059f8146b88SJung-uk Kim     if (!Name)
3060f8146b88SJung-uk Kim     {
3061f8146b88SJung-uk Kim         return (NULL);
3062f8146b88SJung-uk Kim     }
3063f8146b88SJung-uk Kim 
3064f8146b88SJung-uk Kim     /* Search info table for name match */
3065f8146b88SJung-uk Kim 
3066f8146b88SJung-uk Kim     for (i = 0; ; i++)
3067f8146b88SJung-uk Kim     {
3068f8146b88SJung-uk Kim         Info = AcpiDmTableInfoGeneric[i];
3069f8146b88SJung-uk Kim         if (Info->Opcode == ACPI_DMT_EXIT)
3070f8146b88SJung-uk Kim         {
3071f8146b88SJung-uk Kim             Info = NULL;
3072f8146b88SJung-uk Kim             break;
3073f8146b88SJung-uk Kim         }
3074f8146b88SJung-uk Kim 
3075f8146b88SJung-uk Kim         /* Use caseless compare for generic keywords */
3076f8146b88SJung-uk Kim 
3077f8146b88SJung-uk Kim         if (!AcpiUtStricmp (Name, Info->Name))
3078f8146b88SJung-uk Kim         {
3079f8146b88SJung-uk Kim             break;
3080f8146b88SJung-uk Kim         }
3081f8146b88SJung-uk Kim     }
3082f8146b88SJung-uk Kim 
3083f8146b88SJung-uk Kim     return (Info);
3084f8146b88SJung-uk Kim }
3085f8146b88SJung-uk Kim 
3086f8146b88SJung-uk Kim 
3087f8146b88SJung-uk Kim /******************************************************************************
3088f8146b88SJung-uk Kim  *
3089f8146b88SJung-uk Kim  * FUNCTION:    DtCompileUefi
3090f8146b88SJung-uk Kim  *
3091f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
3092f8146b88SJung-uk Kim  *
3093f8146b88SJung-uk Kim  * RETURN:      Status
3094f8146b88SJung-uk Kim  *
3095f8146b88SJung-uk Kim  * DESCRIPTION: Compile UEFI.
3096f8146b88SJung-uk Kim  *
3097f8146b88SJung-uk Kim  *****************************************************************************/
3098f8146b88SJung-uk Kim 
3099f8146b88SJung-uk Kim ACPI_STATUS
DtCompileUefi(void ** List)3100f8146b88SJung-uk Kim DtCompileUefi (
3101f8146b88SJung-uk Kim     void                    **List)
3102f8146b88SJung-uk Kim {
3103f8146b88SJung-uk Kim     ACPI_STATUS             Status;
3104f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
3105f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
3106f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
3107f8146b88SJung-uk Kim     UINT16                  *DataOffset;
3108f8146b88SJung-uk Kim 
3109f8146b88SJung-uk Kim 
3110f8146b88SJung-uk Kim     /* Compile the predefined portion of the UEFI table */
3111f8146b88SJung-uk Kim 
3112f8146b88SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
3113ff879b07SJung-uk Kim         &Subtable);
3114f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
3115f8146b88SJung-uk Kim     {
3116f8146b88SJung-uk Kim         return (Status);
3117f8146b88SJung-uk Kim     }
3118f8146b88SJung-uk Kim 
3119f8146b88SJung-uk Kim     DataOffset = (UINT16 *) (Subtable->Buffer + 16);
3120f8146b88SJung-uk Kim     *DataOffset = sizeof (ACPI_TABLE_UEFI);
3121f8146b88SJung-uk Kim 
3122f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
3123f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
3124f8146b88SJung-uk Kim 
3125f8146b88SJung-uk Kim     /*
3126f8146b88SJung-uk Kim      * Compile the "generic" portion of the UEFI table. This
3127f8146b88SJung-uk Kim      * part of the table is not predefined and any of the generic
3128f8146b88SJung-uk Kim      * operators may be used.
3129f8146b88SJung-uk Kim      */
3130f8146b88SJung-uk Kim     DtCompileGeneric ((void **) PFieldList, NULL, NULL);
3131f8146b88SJung-uk Kim     return (AE_OK);
3132f8146b88SJung-uk Kim }
3133f8146b88SJung-uk Kim 
3134f8146b88SJung-uk Kim 
3135f8146b88SJung-uk Kim /******************************************************************************
3136f8146b88SJung-uk Kim  *
3137cfd1ed46SJung-uk Kim  * FUNCTION:    DtCompileViot
3138cfd1ed46SJung-uk Kim  *
3139cfd1ed46SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
3140cfd1ed46SJung-uk Kim  *
3141cfd1ed46SJung-uk Kim  * RETURN:      Status
3142cfd1ed46SJung-uk Kim  *
3143cfd1ed46SJung-uk Kim  * DESCRIPTION: Compile VIOT.
3144cfd1ed46SJung-uk Kim  *
3145cfd1ed46SJung-uk Kim  *****************************************************************************/
3146cfd1ed46SJung-uk Kim 
3147cfd1ed46SJung-uk Kim ACPI_STATUS
DtCompileViot(void ** List)3148cfd1ed46SJung-uk Kim DtCompileViot (
3149cfd1ed46SJung-uk Kim     void                    **List)
3150cfd1ed46SJung-uk Kim {
3151cfd1ed46SJung-uk Kim     ACPI_STATUS             Status;
3152cfd1ed46SJung-uk Kim     DT_SUBTABLE             *Subtable;
3153cfd1ed46SJung-uk Kim     DT_SUBTABLE             *ParentTable;
3154cfd1ed46SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
3155cfd1ed46SJung-uk Kim     DT_FIELD                *SubtableStart;
3156cfd1ed46SJung-uk Kim     ACPI_TABLE_VIOT         *Viot;
3157cfd1ed46SJung-uk Kim     ACPI_VIOT_HEADER        *ViotHeader;
3158cfd1ed46SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
3159cfd1ed46SJung-uk Kim     UINT16                  NodeCount;
3160cfd1ed46SJung-uk Kim 
3161cfd1ed46SJung-uk Kim     ParentTable = DtPeekSubtable ();
3162cfd1ed46SJung-uk Kim 
3163cfd1ed46SJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoViot, &Subtable);
3164cfd1ed46SJung-uk Kim     if (ACPI_FAILURE (Status))
3165cfd1ed46SJung-uk Kim     {
3166cfd1ed46SJung-uk Kim         return (Status);
3167cfd1ed46SJung-uk Kim     }
3168cfd1ed46SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
3169cfd1ed46SJung-uk Kim 
3170cfd1ed46SJung-uk Kim     /*
3171cfd1ed46SJung-uk Kim      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
3172cfd1ed46SJung-uk Kim      * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
3173cfd1ed46SJung-uk Kim      */
3174cfd1ed46SJung-uk Kim     Viot = ACPI_SUB_PTR (ACPI_TABLE_VIOT, Subtable->Buffer,
3175cfd1ed46SJung-uk Kim         sizeof (ACPI_TABLE_HEADER));
3176cfd1ed46SJung-uk Kim 
3177cfd1ed46SJung-uk Kim     Viot->NodeOffset = sizeof (ACPI_TABLE_VIOT);
3178cfd1ed46SJung-uk Kim 
3179cfd1ed46SJung-uk Kim     NodeCount = 0;
3180cfd1ed46SJung-uk Kim     while (*PFieldList) {
3181cfd1ed46SJung-uk Kim         SubtableStart = *PFieldList;
3182cfd1ed46SJung-uk Kim         Status = DtCompileTable (PFieldList, AcpiDmTableInfoViotHeader,
3183cfd1ed46SJung-uk Kim             &Subtable);
3184cfd1ed46SJung-uk Kim         if (ACPI_FAILURE (Status))
3185cfd1ed46SJung-uk Kim         {
3186cfd1ed46SJung-uk Kim             return (Status);
3187cfd1ed46SJung-uk Kim         }
3188cfd1ed46SJung-uk Kim 
3189cfd1ed46SJung-uk Kim         ParentTable = DtPeekSubtable ();
3190cfd1ed46SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
3191cfd1ed46SJung-uk Kim         DtPushSubtable (Subtable);
3192cfd1ed46SJung-uk Kim 
3193cfd1ed46SJung-uk Kim         ViotHeader = ACPI_CAST_PTR (ACPI_VIOT_HEADER, Subtable->Buffer);
3194cfd1ed46SJung-uk Kim 
3195cfd1ed46SJung-uk Kim         switch (ViotHeader->Type)
3196cfd1ed46SJung-uk Kim         {
3197cfd1ed46SJung-uk Kim         case ACPI_VIOT_NODE_PCI_RANGE:
3198cfd1ed46SJung-uk Kim 
3199cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoViot1;
3200cfd1ed46SJung-uk Kim             break;
3201cfd1ed46SJung-uk Kim 
3202cfd1ed46SJung-uk Kim         case ACPI_VIOT_NODE_MMIO:
3203cfd1ed46SJung-uk Kim 
3204cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoViot2;
3205cfd1ed46SJung-uk Kim             break;
3206cfd1ed46SJung-uk Kim 
3207cfd1ed46SJung-uk Kim         case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI:
3208cfd1ed46SJung-uk Kim 
3209cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoViot3;
3210cfd1ed46SJung-uk Kim             break;
3211cfd1ed46SJung-uk Kim 
3212cfd1ed46SJung-uk Kim         case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO:
3213cfd1ed46SJung-uk Kim 
3214cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoViot4;
3215cfd1ed46SJung-uk Kim             break;
3216cfd1ed46SJung-uk Kim 
3217cfd1ed46SJung-uk Kim         default:
3218cfd1ed46SJung-uk Kim 
3219cfd1ed46SJung-uk Kim             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "VIOT");
3220cfd1ed46SJung-uk Kim             return (AE_ERROR);
3221cfd1ed46SJung-uk Kim         }
3222cfd1ed46SJung-uk Kim 
3223cfd1ed46SJung-uk Kim         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
3224cfd1ed46SJung-uk Kim         if (ACPI_FAILURE (Status))
3225cfd1ed46SJung-uk Kim         {
3226cfd1ed46SJung-uk Kim             return (Status);
3227cfd1ed46SJung-uk Kim         }
3228cfd1ed46SJung-uk Kim 
3229cfd1ed46SJung-uk Kim         ParentTable = DtPeekSubtable ();
3230cfd1ed46SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
3231cfd1ed46SJung-uk Kim         DtPopSubtable ();
3232cfd1ed46SJung-uk Kim         NodeCount++;
3233cfd1ed46SJung-uk Kim     }
3234cfd1ed46SJung-uk Kim 
3235cfd1ed46SJung-uk Kim     Viot->NodeCount = NodeCount;
3236cfd1ed46SJung-uk Kim     return (AE_OK);
3237cfd1ed46SJung-uk Kim }
3238cfd1ed46SJung-uk Kim 
3239cfd1ed46SJung-uk Kim 
3240cfd1ed46SJung-uk Kim /******************************************************************************
3241cfd1ed46SJung-uk Kim  *
3242f8146b88SJung-uk Kim  * FUNCTION:    DtCompileWdat
3243f8146b88SJung-uk Kim  *
3244f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
3245f8146b88SJung-uk Kim  *
3246f8146b88SJung-uk Kim  * RETURN:      Status
3247f8146b88SJung-uk Kim  *
3248f8146b88SJung-uk Kim  * DESCRIPTION: Compile WDAT.
3249f8146b88SJung-uk Kim  *
3250f8146b88SJung-uk Kim  *****************************************************************************/
3251f8146b88SJung-uk Kim 
3252f8146b88SJung-uk Kim ACPI_STATUS
DtCompileWdat(void ** List)3253f8146b88SJung-uk Kim DtCompileWdat (
3254f8146b88SJung-uk Kim     void                    **List)
3255f8146b88SJung-uk Kim {
3256f8146b88SJung-uk Kim     ACPI_STATUS             Status;
3257f8146b88SJung-uk Kim 
3258f8146b88SJung-uk Kim 
3259f8146b88SJung-uk Kim     Status = DtCompileTwoSubtables (List,
3260f8146b88SJung-uk Kim         AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
3261f8146b88SJung-uk Kim     return (Status);
3262f8146b88SJung-uk Kim }
3263f8146b88SJung-uk Kim 
3264f8146b88SJung-uk Kim 
3265f8146b88SJung-uk Kim /******************************************************************************
3266f8146b88SJung-uk Kim  *
3267f8146b88SJung-uk Kim  * FUNCTION:    DtCompileWpbt
3268f8146b88SJung-uk Kim  *
3269f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
3270f8146b88SJung-uk Kim  *
3271f8146b88SJung-uk Kim  * RETURN:      Status
3272f8146b88SJung-uk Kim  *
3273f8146b88SJung-uk Kim  * DESCRIPTION: Compile WPBT.
3274f8146b88SJung-uk Kim  *
3275f8146b88SJung-uk Kim  *****************************************************************************/
3276f8146b88SJung-uk Kim 
3277f8146b88SJung-uk Kim ACPI_STATUS
DtCompileWpbt(void ** List)3278f8146b88SJung-uk Kim DtCompileWpbt (
3279f8146b88SJung-uk Kim     void                    **List)
3280f8146b88SJung-uk Kim {
3281f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
3282f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
3283f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
3284f8146b88SJung-uk Kim     ACPI_TABLE_WPBT         *Table;
3285f8146b88SJung-uk Kim     ACPI_STATUS             Status;
3286f8146b88SJung-uk Kim 
3287f8146b88SJung-uk Kim 
3288f8146b88SJung-uk Kim     /* Compile the main table */
3289f8146b88SJung-uk Kim 
329097c0b5abSJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt, &Subtable);
3291f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
3292f8146b88SJung-uk Kim     {
3293f8146b88SJung-uk Kim         return (Status);
3294f8146b88SJung-uk Kim     }
3295f8146b88SJung-uk Kim 
3296f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
3297f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
329897c0b5abSJung-uk Kim     Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer);
329997c0b5abSJung-uk Kim 
330097c0b5abSJung-uk Kim     /*
330197c0b5abSJung-uk Kim      * Exit now if there are no arguments specified. This is indicated by:
330297c0b5abSJung-uk Kim      * The "Command-line Arguments" field has not been specified (if specified,
330397c0b5abSJung-uk Kim      * it will be the last field in the field list -- after the main table).
330497c0b5abSJung-uk Kim      * Set the Argument Length in the main table to zero.
330597c0b5abSJung-uk Kim      */
330697c0b5abSJung-uk Kim     if (!*PFieldList)
330797c0b5abSJung-uk Kim     {
330897c0b5abSJung-uk Kim         Table->ArgumentsLength = 0;
330997c0b5abSJung-uk Kim         return (AE_OK);
331097c0b5abSJung-uk Kim     }
3311f8146b88SJung-uk Kim 
3312f8146b88SJung-uk Kim     /* Compile the argument list subtable */
3313f8146b88SJung-uk Kim 
331497c0b5abSJung-uk Kim     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0, &Subtable);
3315f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
3316f8146b88SJung-uk Kim     {
3317f8146b88SJung-uk Kim         return (Status);
3318f8146b88SJung-uk Kim     }
3319f8146b88SJung-uk Kim 
3320f8146b88SJung-uk Kim     /* Extract the length of the Arguments buffer, insert into main table */
3321f8146b88SJung-uk Kim 
332297c0b5abSJung-uk Kim     Table->ArgumentsLength = (UINT16) Subtable->TotalLength;
3323f8146b88SJung-uk Kim     DtInsertSubtable (ParentTable, Subtable);
3324f8146b88SJung-uk Kim     return (AE_OK);
3325f8146b88SJung-uk Kim }
3326f8146b88SJung-uk Kim 
3327f8146b88SJung-uk Kim 
3328f8146b88SJung-uk Kim /******************************************************************************
3329f8146b88SJung-uk Kim  *
3330f8146b88SJung-uk Kim  * FUNCTION:    DtCompileXsdt
3331f8146b88SJung-uk Kim  *
3332f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
3333f8146b88SJung-uk Kim  *
3334f8146b88SJung-uk Kim  * RETURN:      Status
3335f8146b88SJung-uk Kim  *
3336f8146b88SJung-uk Kim  * DESCRIPTION: Compile XSDT.
3337f8146b88SJung-uk Kim  *
3338f8146b88SJung-uk Kim  *****************************************************************************/
3339f8146b88SJung-uk Kim 
3340f8146b88SJung-uk Kim ACPI_STATUS
DtCompileXsdt(void ** List)3341f8146b88SJung-uk Kim DtCompileXsdt (
3342f8146b88SJung-uk Kim     void                    **List)
3343f8146b88SJung-uk Kim {
3344f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
3345f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
3346f8146b88SJung-uk Kim     DT_FIELD                *FieldList = *(DT_FIELD **) List;
3347f8146b88SJung-uk Kim     UINT64                  Address;
3348f8146b88SJung-uk Kim 
3349f8146b88SJung-uk Kim 
3350f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
3351f8146b88SJung-uk Kim 
3352f8146b88SJung-uk Kim     while (FieldList)
3353f8146b88SJung-uk Kim     {
3354f8146b88SJung-uk Kim         DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
3355f8146b88SJung-uk Kim 
3356f8146b88SJung-uk Kim         DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
3357f8146b88SJung-uk Kim         DtInsertSubtable (ParentTable, Subtable);
3358f8146b88SJung-uk Kim         FieldList = FieldList->Next;
3359f8146b88SJung-uk Kim     }
3360f8146b88SJung-uk Kim 
3361f8146b88SJung-uk Kim     return (AE_OK);
3362f8146b88SJung-uk Kim }
3363f8146b88SJung-uk Kim 
3364f8146b88SJung-uk Kim 
3365f8146b88SJung-uk Kim /******************************************************************************
3366f8146b88SJung-uk Kim  *
3367f8146b88SJung-uk Kim  * FUNCTION:    DtCompileGeneric
3368f8146b88SJung-uk Kim  *
3369f8146b88SJung-uk Kim  * PARAMETERS:  List                - Current field list pointer
3370f8146b88SJung-uk Kim  *              Name                - Field name to end generic compiling
3371f8146b88SJung-uk Kim  *              Length              - Compiled table length to return
3372f8146b88SJung-uk Kim  *
3373f8146b88SJung-uk Kim  * RETURN:      Status
3374f8146b88SJung-uk Kim  *
3375f8146b88SJung-uk Kim  * DESCRIPTION: Compile generic unknown table.
3376f8146b88SJung-uk Kim  *
3377f8146b88SJung-uk Kim  *****************************************************************************/
3378f8146b88SJung-uk Kim 
3379f8146b88SJung-uk Kim ACPI_STATUS
DtCompileGeneric(void ** List,char * Name,UINT32 * Length)3380f8146b88SJung-uk Kim DtCompileGeneric (
3381f8146b88SJung-uk Kim     void                    **List,
3382f8146b88SJung-uk Kim     char                    *Name,
3383f8146b88SJung-uk Kim     UINT32                  *Length)
3384f8146b88SJung-uk Kim {
3385f8146b88SJung-uk Kim     ACPI_STATUS             Status;
3386f8146b88SJung-uk Kim     DT_SUBTABLE             *Subtable;
3387f8146b88SJung-uk Kim     DT_SUBTABLE             *ParentTable;
3388f8146b88SJung-uk Kim     DT_FIELD                **PFieldList = (DT_FIELD **) List;
3389f8146b88SJung-uk Kim     ACPI_DMTABLE_INFO       *Info;
3390f8146b88SJung-uk Kim 
3391f8146b88SJung-uk Kim 
3392f8146b88SJung-uk Kim     ParentTable = DtPeekSubtable ();
3393f8146b88SJung-uk Kim 
3394f8146b88SJung-uk Kim     /*
3395f8146b88SJung-uk Kim      * Compile the "generic" portion of the table. This
3396f8146b88SJung-uk Kim      * part of the table is not predefined and any of the generic
3397f8146b88SJung-uk Kim      * operators may be used.
3398f8146b88SJung-uk Kim      */
3399f8146b88SJung-uk Kim 
3400f8146b88SJung-uk Kim     /* Find any and all labels in the entire generic portion */
3401f8146b88SJung-uk Kim 
3402f8146b88SJung-uk Kim     DtDetectAllLabels (*PFieldList);
3403f8146b88SJung-uk Kim 
3404f8146b88SJung-uk Kim     /* Now we can actually compile the parse tree */
3405f8146b88SJung-uk Kim 
3406f8146b88SJung-uk Kim     if (Length && *Length)
3407f8146b88SJung-uk Kim     {
3408f8146b88SJung-uk Kim         *Length = 0;
3409f8146b88SJung-uk Kim     }
3410f8146b88SJung-uk Kim     while (*PFieldList)
3411f8146b88SJung-uk Kim     {
3412f8146b88SJung-uk Kim         if (Name && !strcmp ((*PFieldList)->Name, Name))
3413f8146b88SJung-uk Kim         {
3414f8146b88SJung-uk Kim             break;
3415f8146b88SJung-uk Kim         }
3416f8146b88SJung-uk Kim 
3417f8146b88SJung-uk Kim         Info = DtGetGenericTableInfo ((*PFieldList)->Name);
3418f8146b88SJung-uk Kim         if (!Info)
3419f8146b88SJung-uk Kim         {
34206f1f1a63SJung-uk Kim             sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
3421f8146b88SJung-uk Kim                 (*PFieldList)->Name);
3422f8146b88SJung-uk Kim             DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
34236f1f1a63SJung-uk Kim                 (*PFieldList), AslGbl_MsgBuffer);
3424f8146b88SJung-uk Kim 
3425f8146b88SJung-uk Kim             *PFieldList = (*PFieldList)->Next;
3426f8146b88SJung-uk Kim             continue;
3427f8146b88SJung-uk Kim         }
3428f8146b88SJung-uk Kim 
3429f8146b88SJung-uk Kim         Status = DtCompileTable (PFieldList, Info,
3430ff879b07SJung-uk Kim             &Subtable);
3431f8146b88SJung-uk Kim         if (ACPI_SUCCESS (Status))
3432f8146b88SJung-uk Kim         {
3433f8146b88SJung-uk Kim             DtInsertSubtable (ParentTable, Subtable);
3434f8146b88SJung-uk Kim             if (Length)
3435f8146b88SJung-uk Kim             {
3436f8146b88SJung-uk Kim                 *Length += Subtable->Length;
3437f8146b88SJung-uk Kim             }
3438f8146b88SJung-uk Kim         }
3439f8146b88SJung-uk Kim         else
3440f8146b88SJung-uk Kim         {
3441f8146b88SJung-uk Kim             *PFieldList = (*PFieldList)->Next;
3442f8146b88SJung-uk Kim 
3443f8146b88SJung-uk Kim             if (Status == AE_NOT_FOUND)
3444f8146b88SJung-uk Kim             {
34456f1f1a63SJung-uk Kim                 sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
3446f8146b88SJung-uk Kim                     (*PFieldList)->Name);
3447f8146b88SJung-uk Kim                 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
34486f1f1a63SJung-uk Kim                     (*PFieldList), AslGbl_MsgBuffer);
3449f8146b88SJung-uk Kim             }
3450f8146b88SJung-uk Kim         }
3451f8146b88SJung-uk Kim     }
3452f8146b88SJung-uk Kim 
3453f8146b88SJung-uk Kim     return (AE_OK);
3454f8146b88SJung-uk Kim }
3455