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