xref: /freebsd/sys/contrib/dev/acpica/common/dmtbdump2.c (revision 722b16673c40aedf280895f2f2f676bb494518d7)
1ff879b07SJung-uk Kim /******************************************************************************
2ff879b07SJung-uk Kim  *
3ff879b07SJung-uk Kim  * Module Name: dmtbdump2 - Dump ACPI data tables that contain no AML code
4ff879b07SJung-uk Kim  *
5ff879b07SJung-uk Kim  *****************************************************************************/
6ff879b07SJung-uk Kim 
7ff879b07SJung-uk Kim /******************************************************************************
8ff879b07SJung-uk Kim  *
9ff879b07SJung-uk Kim  * 1. Copyright Notice
10ff879b07SJung-uk Kim  *
11*722b1667SJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2023, Intel Corp.
12ff879b07SJung-uk Kim  * All rights reserved.
13ff879b07SJung-uk Kim  *
14ff879b07SJung-uk Kim  * 2. License
15ff879b07SJung-uk Kim  *
16ff879b07SJung-uk Kim  * 2.1. This is your license from Intel Corp. under its intellectual property
17ff879b07SJung-uk Kim  * rights. You may have additional license terms from the party that provided
18ff879b07SJung-uk Kim  * you this software, covering your right to use that party's intellectual
19ff879b07SJung-uk Kim  * property rights.
20ff879b07SJung-uk Kim  *
21ff879b07SJung-uk Kim  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22ff879b07SJung-uk Kim  * copy of the source code appearing in this file ("Covered Code") an
23ff879b07SJung-uk Kim  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24ff879b07SJung-uk Kim  * base code distributed originally by Intel ("Original Intel Code") to copy,
25ff879b07SJung-uk Kim  * make derivatives, distribute, use and display any portion of the Covered
26ff879b07SJung-uk Kim  * Code in any form, with the right to sublicense such rights; and
27ff879b07SJung-uk Kim  *
28ff879b07SJung-uk Kim  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29ff879b07SJung-uk Kim  * license (with the right to sublicense), under only those claims of Intel
30ff879b07SJung-uk Kim  * patents that are infringed by the Original Intel Code, to make, use, sell,
31ff879b07SJung-uk Kim  * offer to sell, and import the Covered Code and derivative works thereof
32ff879b07SJung-uk Kim  * solely to the minimum extent necessary to exercise the above copyright
33ff879b07SJung-uk Kim  * license, and in no event shall the patent license extend to any additions
34ff879b07SJung-uk Kim  * to or modifications of the Original Intel Code. No other license or right
35ff879b07SJung-uk Kim  * is granted directly or by implication, estoppel or otherwise;
36ff879b07SJung-uk Kim  *
37ff879b07SJung-uk Kim  * The above copyright and patent license is granted only if the following
38ff879b07SJung-uk Kim  * conditions are met:
39ff879b07SJung-uk Kim  *
40ff879b07SJung-uk Kim  * 3. Conditions
41ff879b07SJung-uk Kim  *
42ff879b07SJung-uk Kim  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43ff879b07SJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
44ff879b07SJung-uk Kim  * Code or modification with rights to further distribute source must include
45ff879b07SJung-uk Kim  * the above Copyright Notice, the above License, this list of Conditions,
46ff879b07SJung-uk Kim  * and the following Disclaimer and Export Compliance provision. In addition,
47ff879b07SJung-uk Kim  * Licensee must cause all Covered Code to which Licensee contributes to
48ff879b07SJung-uk Kim  * contain a file documenting the changes Licensee made to create that Covered
49ff879b07SJung-uk Kim  * Code and the date of any change. Licensee must include in that file the
50ff879b07SJung-uk Kim  * documentation of any changes made by any predecessor Licensee. Licensee
51ff879b07SJung-uk Kim  * must include a prominent statement that the modification is derived,
52ff879b07SJung-uk Kim  * directly or indirectly, from Original Intel Code.
53ff879b07SJung-uk Kim  *
54ff879b07SJung-uk Kim  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55ff879b07SJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
56ff879b07SJung-uk Kim  * Code or modification without rights to further distribute source must
57ff879b07SJung-uk Kim  * include the following Disclaimer and Export Compliance provision in the
58ff879b07SJung-uk Kim  * documentation and/or other materials provided with distribution. In
59ff879b07SJung-uk Kim  * addition, Licensee may not authorize further sublicense of source of any
60ff879b07SJung-uk Kim  * portion of the Covered Code, and must include terms to the effect that the
61ff879b07SJung-uk Kim  * license from Licensee to its licensee is limited to the intellectual
62ff879b07SJung-uk Kim  * property embodied in the software Licensee provides to its licensee, and
63ff879b07SJung-uk Kim  * not to intellectual property embodied in modifications its licensee may
64ff879b07SJung-uk Kim  * make.
65ff879b07SJung-uk Kim  *
66ff879b07SJung-uk Kim  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67ff879b07SJung-uk Kim  * substantial portion of the Covered Code or modification must reproduce the
68ff879b07SJung-uk Kim  * above Copyright Notice, and the following Disclaimer and Export Compliance
69ff879b07SJung-uk Kim  * provision in the documentation and/or other materials provided with the
70ff879b07SJung-uk Kim  * distribution.
71ff879b07SJung-uk Kim  *
72ff879b07SJung-uk Kim  * 3.4. Intel retains all right, title, and interest in and to the Original
73ff879b07SJung-uk Kim  * Intel Code.
74ff879b07SJung-uk Kim  *
75ff879b07SJung-uk Kim  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76ff879b07SJung-uk Kim  * Intel shall be used in advertising or otherwise to promote the sale, use or
77ff879b07SJung-uk Kim  * other dealings in products derived from or relating to the Covered Code
78ff879b07SJung-uk Kim  * without prior written authorization from Intel.
79ff879b07SJung-uk Kim  *
80ff879b07SJung-uk Kim  * 4. Disclaimer and Export Compliance
81ff879b07SJung-uk Kim  *
82ff879b07SJung-uk Kim  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83ff879b07SJung-uk Kim  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84ff879b07SJung-uk Kim  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85ff879b07SJung-uk Kim  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86ff879b07SJung-uk Kim  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87ff879b07SJung-uk Kim  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88ff879b07SJung-uk Kim  * PARTICULAR PURPOSE.
89ff879b07SJung-uk Kim  *
90ff879b07SJung-uk Kim  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91ff879b07SJung-uk Kim  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92ff879b07SJung-uk Kim  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93ff879b07SJung-uk Kim  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94ff879b07SJung-uk Kim  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95ff879b07SJung-uk Kim  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96ff879b07SJung-uk Kim  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97ff879b07SJung-uk Kim  * LIMITED REMEDY.
98ff879b07SJung-uk Kim  *
99ff879b07SJung-uk Kim  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100ff879b07SJung-uk Kim  * software or system incorporating such software without first obtaining any
101ff879b07SJung-uk Kim  * required license or other approval from the U. S. Department of Commerce or
102ff879b07SJung-uk Kim  * any other agency or department of the United States Government. In the
103ff879b07SJung-uk Kim  * event Licensee exports any such software from the United States or
104ff879b07SJung-uk Kim  * re-exports any such software from a foreign destination, Licensee shall
105ff879b07SJung-uk Kim  * ensure that the distribution and export/re-export of the software is in
106ff879b07SJung-uk Kim  * compliance with all laws, regulations, orders, or other restrictions of the
107ff879b07SJung-uk Kim  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108ff879b07SJung-uk Kim  * any of its subsidiaries will export/re-export any technical data, process,
109ff879b07SJung-uk Kim  * software, or service, directly or indirectly, to any country for which the
110ff879b07SJung-uk Kim  * United States government or any agency thereof requires an export license,
111ff879b07SJung-uk Kim  * other governmental approval, or letter of assurance, without first obtaining
112ff879b07SJung-uk Kim  * such license, approval or letter.
113ff879b07SJung-uk Kim  *
114ff879b07SJung-uk Kim  *****************************************************************************
115ff879b07SJung-uk Kim  *
116ff879b07SJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
117ff879b07SJung-uk Kim  * following license:
118ff879b07SJung-uk Kim  *
119ff879b07SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
120ff879b07SJung-uk Kim  * modification, are permitted provided that the following conditions
121ff879b07SJung-uk Kim  * are met:
122ff879b07SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
123ff879b07SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
124ff879b07SJung-uk Kim  *    without modification.
125ff879b07SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126ff879b07SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
127ff879b07SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
128ff879b07SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
129ff879b07SJung-uk Kim  *    binary redistribution.
130ff879b07SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
131ff879b07SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
132ff879b07SJung-uk Kim  *    from this software without specific prior written permission.
133ff879b07SJung-uk Kim  *
134ff879b07SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135ff879b07SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136ff879b07SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137ff879b07SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138ff879b07SJung-uk Kim  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139ff879b07SJung-uk Kim  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140ff879b07SJung-uk Kim  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141ff879b07SJung-uk Kim  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142ff879b07SJung-uk Kim  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143ff879b07SJung-uk Kim  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144ff879b07SJung-uk Kim  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145ff879b07SJung-uk Kim  *
146ff879b07SJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
147ff879b07SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
148ff879b07SJung-uk Kim  * Software Foundation.
149ff879b07SJung-uk Kim  *
150ff879b07SJung-uk Kim  *****************************************************************************/
151ff879b07SJung-uk Kim 
1529a4bc520SJung-uk Kim #include <wchar.h>
153ff879b07SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
154ff879b07SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
155ff879b07SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h>
156ff879b07SJung-uk Kim #include <contrib/dev/acpica/include/actables.h>
1571970d693SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
158ff879b07SJung-uk Kim 
159ff879b07SJung-uk Kim /* This module used for application-level code only */
160ff879b07SJung-uk Kim 
161ff879b07SJung-uk Kim #define _COMPONENT          ACPI_CA_DISASSEMBLER
162ff879b07SJung-uk Kim         ACPI_MODULE_NAME    ("dmtbdump2")
163ff879b07SJung-uk Kim 
164ff879b07SJung-uk Kim 
165ff879b07SJung-uk Kim /*******************************************************************************
166ff879b07SJung-uk Kim  *
167ff879b07SJung-uk Kim  * FUNCTION:    AcpiDmDumpIort
168ff879b07SJung-uk Kim  *
169ff879b07SJung-uk Kim  * PARAMETERS:  Table               - A IORT table
170ff879b07SJung-uk Kim  *
171ff879b07SJung-uk Kim  * RETURN:      None
172ff879b07SJung-uk Kim  *
173ff879b07SJung-uk Kim  * DESCRIPTION: Format the contents of a IORT
174ff879b07SJung-uk Kim  *
175ff879b07SJung-uk Kim  ******************************************************************************/
176ff879b07SJung-uk Kim 
177ff879b07SJung-uk Kim void
178ff879b07SJung-uk Kim AcpiDmDumpIort (
179ff879b07SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
180ff879b07SJung-uk Kim {
181ff879b07SJung-uk Kim     ACPI_STATUS             Status;
182ff879b07SJung-uk Kim     ACPI_TABLE_IORT         *Iort;
183ff879b07SJung-uk Kim     ACPI_IORT_NODE          *IortNode;
184ff879b07SJung-uk Kim     ACPI_IORT_ITS_GROUP     *IortItsGroup = NULL;
185ff879b07SJung-uk Kim     ACPI_IORT_SMMU          *IortSmmu = NULL;
186cfd1ed46SJung-uk Kim     ACPI_IORT_RMR           *IortRmr = NULL;
187ff879b07SJung-uk Kim     UINT32                  Offset;
188ff879b07SJung-uk Kim     UINT32                  NodeOffset;
189ff879b07SJung-uk Kim     UINT32                  Length;
190ff879b07SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
191ff879b07SJung-uk Kim     char                    *String;
192ff879b07SJung-uk Kim     UINT32                  i;
193a009b7dcSJung-uk Kim     UINT32                  MappingByteLength;
194cfd1ed46SJung-uk Kim     UINT8                   Revision;
195ff879b07SJung-uk Kim 
196ff879b07SJung-uk Kim 
197ff879b07SJung-uk Kim     /* Main table */
198ff879b07SJung-uk Kim 
199ff879b07SJung-uk Kim     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort);
200ff879b07SJung-uk Kim     if (ACPI_FAILURE (Status))
201ff879b07SJung-uk Kim     {
202ff879b07SJung-uk Kim         return;
203ff879b07SJung-uk Kim     }
204ff879b07SJung-uk Kim 
205cfd1ed46SJung-uk Kim     Revision = Table->Revision;
206cfd1ed46SJung-uk Kim 
207ab71bbb7SJung-uk Kim     /* IORT Revisions E, E.a and E.c have known issues and are not supported */
208cfd1ed46SJung-uk Kim 
209ab71bbb7SJung-uk Kim     if (Revision == 1 || Revision == 2 || Revision == 4)
210cfd1ed46SJung-uk Kim     {
211cfd1ed46SJung-uk Kim         AcpiOsPrintf ("\n**** Unsupported IORT revision 0x%X\n",
212cfd1ed46SJung-uk Kim                       Revision);
213cfd1ed46SJung-uk Kim         return;
214cfd1ed46SJung-uk Kim     }
215cfd1ed46SJung-uk Kim 
216ff879b07SJung-uk Kim     Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);
217ff879b07SJung-uk Kim     Offset = sizeof (ACPI_TABLE_IORT);
218ff879b07SJung-uk Kim 
219ff879b07SJung-uk Kim     /* Dump the OptionalPadding (optional) */
220ff879b07SJung-uk Kim 
221ff879b07SJung-uk Kim     if (Iort->NodeOffset > Offset)
222ff879b07SJung-uk Kim     {
223ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Table->Length, Offset, Table,
224ff879b07SJung-uk Kim             Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad);
225ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
226ff879b07SJung-uk Kim         {
227ff879b07SJung-uk Kim             return;
228ff879b07SJung-uk Kim         }
229ff879b07SJung-uk Kim     }
230ff879b07SJung-uk Kim 
231ff879b07SJung-uk Kim     Offset = Iort->NodeOffset;
232ff879b07SJung-uk Kim     while (Offset < Table->Length)
233ff879b07SJung-uk Kim     {
234ff879b07SJung-uk Kim         /* Common subtable header */
235ff879b07SJung-uk Kim 
236ff879b07SJung-uk Kim         IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
237ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
238ff879b07SJung-uk Kim         Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
239cfd1ed46SJung-uk Kim 
240cfd1ed46SJung-uk Kim         if (Revision == 0)
241cfd1ed46SJung-uk Kim         {
242ff879b07SJung-uk Kim             Status = AcpiDmDumpTable (Table->Length, Offset,
243ff879b07SJung-uk Kim                 IortNode, Length, AcpiDmTableInfoIortHdr);
244cfd1ed46SJung-uk Kim         }
245cfd1ed46SJung-uk Kim         else if (Revision >= 3)
246cfd1ed46SJung-uk Kim         {
247cfd1ed46SJung-uk Kim             Status = AcpiDmDumpTable (Table->Length, Offset,
248cfd1ed46SJung-uk Kim                 IortNode, Length, AcpiDmTableInfoIortHdr3);
249cfd1ed46SJung-uk Kim         }
250cfd1ed46SJung-uk Kim 
251ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
252ff879b07SJung-uk Kim         {
253ff879b07SJung-uk Kim             return;
254ff879b07SJung-uk Kim         }
255ff879b07SJung-uk Kim 
256ff879b07SJung-uk Kim         NodeOffset = Length;
257ff879b07SJung-uk Kim 
258ff879b07SJung-uk Kim         switch (IortNode->Type)
259ff879b07SJung-uk Kim         {
260ff879b07SJung-uk Kim         case ACPI_IORT_NODE_ITS_GROUP:
261ff879b07SJung-uk Kim 
262ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoIort0;
263ff879b07SJung-uk Kim             Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers);
264ff879b07SJung-uk Kim             IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset);
265ff879b07SJung-uk Kim             break;
266ff879b07SJung-uk Kim 
267ff879b07SJung-uk Kim         case ACPI_IORT_NODE_NAMED_COMPONENT:
268ff879b07SJung-uk Kim 
269ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoIort1;
270ff879b07SJung-uk Kim             Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName);
271ff879b07SJung-uk Kim             String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length);
272ff879b07SJung-uk Kim             Length += strlen (String) + 1;
273ff879b07SJung-uk Kim             break;
274ff879b07SJung-uk Kim 
275ff879b07SJung-uk Kim         case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
276ff879b07SJung-uk Kim 
277ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoIort2;
278ff879b07SJung-uk Kim             Length = IortNode->Length - NodeOffset;
279ff879b07SJung-uk Kim             break;
280ff879b07SJung-uk Kim 
281ff879b07SJung-uk Kim         case ACPI_IORT_NODE_SMMU:
282ff879b07SJung-uk Kim 
283ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoIort3;
284ff879b07SJung-uk Kim             Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts);
285ff879b07SJung-uk Kim             IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset);
286ff879b07SJung-uk Kim             break;
287ff879b07SJung-uk Kim 
288ff879b07SJung-uk Kim         case ACPI_IORT_NODE_SMMU_V3:
289ff879b07SJung-uk Kim 
290ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoIort4;
291ff879b07SJung-uk Kim             Length = IortNode->Length - NodeOffset;
292ff879b07SJung-uk Kim             break;
293ff879b07SJung-uk Kim 
2943d90091dSJung-uk Kim         case ACPI_IORT_NODE_PMCG:
2953d90091dSJung-uk Kim 
2963d90091dSJung-uk Kim             InfoTable = AcpiDmTableInfoIort5;
2973d90091dSJung-uk Kim             Length = IortNode->Length - NodeOffset;
2983d90091dSJung-uk Kim             break;
2993d90091dSJung-uk Kim 
300cfd1ed46SJung-uk Kim         case ACPI_IORT_NODE_RMR:
301cfd1ed46SJung-uk Kim 
302cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoIort6;
303cfd1ed46SJung-uk Kim             Length = IortNode->Length - NodeOffset;
304cfd1ed46SJung-uk Kim             IortRmr = ACPI_ADD_PTR (ACPI_IORT_RMR, IortNode, NodeOffset);
305cfd1ed46SJung-uk Kim             break;
306cfd1ed46SJung-uk Kim 
307ff879b07SJung-uk Kim         default:
308ff879b07SJung-uk Kim 
309ff879b07SJung-uk Kim             AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",
310ff879b07SJung-uk Kim                 IortNode->Type);
311ff879b07SJung-uk Kim 
312ff879b07SJung-uk Kim             /* Attempt to continue */
313ff879b07SJung-uk Kim 
314ff879b07SJung-uk Kim             if (!IortNode->Length)
315ff879b07SJung-uk Kim             {
316ff879b07SJung-uk Kim                 AcpiOsPrintf ("Invalid zero length IORT node\n");
317ff879b07SJung-uk Kim                 return;
318ff879b07SJung-uk Kim             }
319ff879b07SJung-uk Kim             goto NextSubtable;
320ff879b07SJung-uk Kim         }
321ff879b07SJung-uk Kim 
322ff879b07SJung-uk Kim         /* Dump the node subtable header */
323ff879b07SJung-uk Kim 
324ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
325ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
326ff879b07SJung-uk Kim             ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
327ff879b07SJung-uk Kim             Length, InfoTable);
328ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
329ff879b07SJung-uk Kim         {
330ff879b07SJung-uk Kim             return;
331ff879b07SJung-uk Kim         }
332ff879b07SJung-uk Kim 
333ff879b07SJung-uk Kim         NodeOffset += Length;
334ff879b07SJung-uk Kim 
335ff879b07SJung-uk Kim         /* Dump the node specific data */
336ff879b07SJung-uk Kim 
337ff879b07SJung-uk Kim         switch (IortNode->Type)
338ff879b07SJung-uk Kim         {
339ff879b07SJung-uk Kim         case ACPI_IORT_NODE_ITS_GROUP:
340ff879b07SJung-uk Kim 
341ff879b07SJung-uk Kim             /* Validate IortItsGroup to avoid compiler warnings */
342ff879b07SJung-uk Kim 
343ff879b07SJung-uk Kim             if (IortItsGroup)
344ff879b07SJung-uk Kim             {
345ff879b07SJung-uk Kim                 for (i = 0; i < IortItsGroup->ItsCount; i++)
346ff879b07SJung-uk Kim                 {
347ff879b07SJung-uk Kim                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
348ff879b07SJung-uk Kim                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
349ff879b07SJung-uk Kim                         4, AcpiDmTableInfoIort0a);
350a009b7dcSJung-uk Kim                     if (ACPI_FAILURE (Status))
351a009b7dcSJung-uk Kim                     {
352a009b7dcSJung-uk Kim                         return;
353a009b7dcSJung-uk Kim                     }
354a009b7dcSJung-uk Kim 
355ff879b07SJung-uk Kim                     NodeOffset += 4;
356ff879b07SJung-uk Kim                 }
357ff879b07SJung-uk Kim             }
358ff879b07SJung-uk Kim             break;
359ff879b07SJung-uk Kim 
360ff879b07SJung-uk Kim         case ACPI_IORT_NODE_NAMED_COMPONENT:
361ff879b07SJung-uk Kim 
362ff879b07SJung-uk Kim             /* Dump the Padding (optional) */
363ff879b07SJung-uk Kim 
364ff879b07SJung-uk Kim             if (IortNode->Length > NodeOffset)
365ff879b07SJung-uk Kim             {
366a009b7dcSJung-uk Kim                 MappingByteLength =
367a009b7dcSJung-uk Kim                     IortNode->MappingCount * sizeof (ACPI_IORT_ID_MAPPING);
368ff879b07SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
369a009b7dcSJung-uk Kim                     Table, IortNode->Length - NodeOffset - MappingByteLength,
370ff879b07SJung-uk Kim                     AcpiDmTableInfoIort1a);
371ff879b07SJung-uk Kim                 if (ACPI_FAILURE (Status))
372ff879b07SJung-uk Kim                 {
373ff879b07SJung-uk Kim                     return;
374ff879b07SJung-uk Kim                 }
375ff879b07SJung-uk Kim             }
376ff879b07SJung-uk Kim             break;
377ff879b07SJung-uk Kim 
378ff879b07SJung-uk Kim         case ACPI_IORT_NODE_SMMU:
379ff879b07SJung-uk Kim 
380ff879b07SJung-uk Kim             AcpiOsPrintf ("\n");
381ff879b07SJung-uk Kim 
382ff879b07SJung-uk Kim             /* Validate IortSmmu to avoid compiler warnings */
383ff879b07SJung-uk Kim 
384ff879b07SJung-uk Kim             if (IortSmmu)
385ff879b07SJung-uk Kim             {
386ff879b07SJung-uk Kim                 Length = 2 * sizeof (UINT64);
387ff879b07SJung-uk Kim                 NodeOffset = IortSmmu->GlobalInterruptOffset;
388ff879b07SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
389ff879b07SJung-uk Kim                     ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
390ff879b07SJung-uk Kim                     Length, AcpiDmTableInfoIort3a);
391ff879b07SJung-uk Kim                 if (ACPI_FAILURE (Status))
392ff879b07SJung-uk Kim                 {
393ff879b07SJung-uk Kim                     return;
394ff879b07SJung-uk Kim                 }
395ff879b07SJung-uk Kim 
396ff879b07SJung-uk Kim                 NodeOffset = IortSmmu->ContextInterruptOffset;
397ff879b07SJung-uk Kim                 for (i = 0; i < IortSmmu->ContextInterruptCount; i++)
398ff879b07SJung-uk Kim                 {
399ff879b07SJung-uk Kim                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
400ff879b07SJung-uk Kim                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
401ff879b07SJung-uk Kim                         8, AcpiDmTableInfoIort3b);
402ff879b07SJung-uk Kim                     if (ACPI_FAILURE (Status))
403ff879b07SJung-uk Kim                     {
404ff879b07SJung-uk Kim                         return;
405ff879b07SJung-uk Kim                     }
406ff879b07SJung-uk Kim 
407ff879b07SJung-uk Kim                     NodeOffset += 8;
408ff879b07SJung-uk Kim                 }
409ff879b07SJung-uk Kim 
410ff879b07SJung-uk Kim                 NodeOffset = IortSmmu->PmuInterruptOffset;
411ff879b07SJung-uk Kim                 for (i = 0; i < IortSmmu->PmuInterruptCount; i++)
412ff879b07SJung-uk Kim                 {
413ff879b07SJung-uk Kim                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
414ff879b07SJung-uk Kim                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
415ff879b07SJung-uk Kim                         8, AcpiDmTableInfoIort3c);
416ff879b07SJung-uk Kim                     if (ACPI_FAILURE (Status))
417ff879b07SJung-uk Kim                     {
418ff879b07SJung-uk Kim                         return;
419ff879b07SJung-uk Kim                     }
420ff879b07SJung-uk Kim 
421ff879b07SJung-uk Kim                     NodeOffset += 8;
422ff879b07SJung-uk Kim                 }
423ff879b07SJung-uk Kim             }
424ff879b07SJung-uk Kim             break;
425ff879b07SJung-uk Kim 
426cfd1ed46SJung-uk Kim         case ACPI_IORT_NODE_RMR:
427cfd1ed46SJung-uk Kim 
428cfd1ed46SJung-uk Kim             /* Validate IortRmr to avoid compiler warnings */
429cfd1ed46SJung-uk Kim             if (IortRmr)
430cfd1ed46SJung-uk Kim             {
431cfd1ed46SJung-uk Kim                 NodeOffset = IortRmr->RmrOffset;
432cfd1ed46SJung-uk Kim                 Length = sizeof (ACPI_IORT_RMR_DESC);
433cfd1ed46SJung-uk Kim                 for (i = 0; i < IortRmr->RmrCount; i++)
434cfd1ed46SJung-uk Kim                 {
435cfd1ed46SJung-uk Kim                     AcpiOsPrintf ("\n");
436cfd1ed46SJung-uk Kim                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
437cfd1ed46SJung-uk Kim                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
438cfd1ed46SJung-uk Kim                         Length, AcpiDmTableInfoIort6a);
439cfd1ed46SJung-uk Kim                     if (ACPI_FAILURE (Status))
440cfd1ed46SJung-uk Kim                     {
441cfd1ed46SJung-uk Kim                         return;
442cfd1ed46SJung-uk Kim                     }
443cfd1ed46SJung-uk Kim 
444cfd1ed46SJung-uk Kim                     NodeOffset += Length;
445cfd1ed46SJung-uk Kim                 }
446cfd1ed46SJung-uk Kim             }
447cfd1ed46SJung-uk Kim             break;
448cfd1ed46SJung-uk Kim 
449ff879b07SJung-uk Kim         default:
450ff879b07SJung-uk Kim 
451ff879b07SJung-uk Kim             break;
452ff879b07SJung-uk Kim         }
453ff879b07SJung-uk Kim 
454ff879b07SJung-uk Kim         /* Dump the ID mappings */
455ff879b07SJung-uk Kim 
456ff879b07SJung-uk Kim         NodeOffset = IortNode->MappingOffset;
457ff879b07SJung-uk Kim         for (i = 0; i < IortNode->MappingCount; i++)
458ff879b07SJung-uk Kim         {
459ff879b07SJung-uk Kim             AcpiOsPrintf ("\n");
460ff879b07SJung-uk Kim             Length = sizeof (ACPI_IORT_ID_MAPPING);
461ff879b07SJung-uk Kim             Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
462ff879b07SJung-uk Kim                 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
463ff879b07SJung-uk Kim                 Length, AcpiDmTableInfoIortMap);
464ff879b07SJung-uk Kim             if (ACPI_FAILURE (Status))
465ff879b07SJung-uk Kim             {
466ff879b07SJung-uk Kim                 return;
467ff879b07SJung-uk Kim             }
468ff879b07SJung-uk Kim 
469ff879b07SJung-uk Kim             NodeOffset += Length;
470ff879b07SJung-uk Kim         }
471ff879b07SJung-uk Kim 
472ff879b07SJung-uk Kim NextSubtable:
473ff879b07SJung-uk Kim         /* Point to next node subtable */
474ff879b07SJung-uk Kim 
475ff879b07SJung-uk Kim         Offset += IortNode->Length;
476ff879b07SJung-uk Kim     }
477ff879b07SJung-uk Kim }
478ff879b07SJung-uk Kim 
479ff879b07SJung-uk Kim 
480ff879b07SJung-uk Kim /*******************************************************************************
481ff879b07SJung-uk Kim  *
482ff879b07SJung-uk Kim  * FUNCTION:    AcpiDmDumpIvrs
483ff879b07SJung-uk Kim  *
484ff879b07SJung-uk Kim  * PARAMETERS:  Table               - A IVRS table
485ff879b07SJung-uk Kim  *
486ff879b07SJung-uk Kim  * RETURN:      None
487ff879b07SJung-uk Kim  *
4881970d693SJung-uk Kim  * DESCRIPTION: Format the contents of a IVRS. Notes:
4891970d693SJung-uk Kim  *              The IVRS is essentially a flat table, with the following
4901970d693SJung-uk Kim  *              structure:
4911970d693SJung-uk Kim  *              <Main ACPI Table Header>
4921970d693SJung-uk Kim  *              <Main subtable - virtualization info>
4931970d693SJung-uk Kim  *              <IVHD>
4941970d693SJung-uk Kim  *                  <Device Entries>
4951970d693SJung-uk Kim  *              ...
4961970d693SJung-uk Kim  *              <IVHD>
4971970d693SJung-uk Kim  *                  <Device Entries>
4981970d693SJung-uk Kim  *              <IVMD>
4991970d693SJung-uk Kim  *              ...
500ff879b07SJung-uk Kim  *
501ff879b07SJung-uk Kim  ******************************************************************************/
502ff879b07SJung-uk Kim 
503ff879b07SJung-uk Kim void
504ff879b07SJung-uk Kim AcpiDmDumpIvrs (
505ff879b07SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
506ff879b07SJung-uk Kim {
507ff879b07SJung-uk Kim     ACPI_STATUS             Status;
508ff879b07SJung-uk Kim     UINT32                  Offset = sizeof (ACPI_TABLE_IVRS);
509ff879b07SJung-uk Kim     UINT32                  EntryOffset;
510ff879b07SJung-uk Kim     UINT32                  EntryLength;
511ff879b07SJung-uk Kim     UINT32                  EntryType;
512cfd1ed46SJung-uk Kim     ACPI_IVRS_DEVICE_HID    *HidSubtable;
513ff879b07SJung-uk Kim     ACPI_IVRS_DE_HEADER     *DeviceEntry;
514ff879b07SJung-uk Kim     ACPI_IVRS_HEADER        *Subtable;
515ff879b07SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
516ff879b07SJung-uk Kim 
517ff879b07SJung-uk Kim 
518ff879b07SJung-uk Kim     /* Main table */
519ff879b07SJung-uk Kim 
520ff879b07SJung-uk Kim     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
521ff879b07SJung-uk Kim     if (ACPI_FAILURE (Status))
522ff879b07SJung-uk Kim     {
523ff879b07SJung-uk Kim         return;
524ff879b07SJung-uk Kim     }
525ff879b07SJung-uk Kim 
526ff879b07SJung-uk Kim     /* Subtables */
527ff879b07SJung-uk Kim 
528ff879b07SJung-uk Kim     Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
5291970d693SJung-uk Kim 
530ff879b07SJung-uk Kim     while (Offset < Table->Length)
531ff879b07SJung-uk Kim     {
532ff879b07SJung-uk Kim         switch (Subtable->Type)
533ff879b07SJung-uk Kim         {
5341970d693SJung-uk Kim         /* Type 10h, IVHD (I/O Virtualization Hardware Definition) */
5351970d693SJung-uk Kim 
5363ee58df5SJung-uk Kim         case ACPI_IVRS_TYPE_HARDWARE1:
537ff879b07SJung-uk Kim 
5381970d693SJung-uk Kim             AcpiOsPrintf ("\n");
5391970d693SJung-uk Kim             InfoTable = AcpiDmTableInfoIvrsHware1;
540ff879b07SJung-uk Kim             break;
541ff879b07SJung-uk Kim 
5421970d693SJung-uk Kim         /* Types 11h, 40h, IVHD (I/O Virtualization Hardware Definition) */
5431970d693SJung-uk Kim 
5443ee58df5SJung-uk Kim         case ACPI_IVRS_TYPE_HARDWARE2:
545cfd1ed46SJung-uk Kim         case ACPI_IVRS_TYPE_HARDWARE3:
5463ee58df5SJung-uk Kim 
5471970d693SJung-uk Kim             AcpiOsPrintf ("\n");
5481970d693SJung-uk Kim             InfoTable = AcpiDmTableInfoIvrsHware23;
5493ee58df5SJung-uk Kim             break;
5503ee58df5SJung-uk Kim 
5511970d693SJung-uk Kim         /* Types 20h-22h, IVMD (I/O Virtualization Memory Definition Block) */
5521970d693SJung-uk Kim 
553ff879b07SJung-uk Kim         case ACPI_IVRS_TYPE_MEMORY1:
554ff879b07SJung-uk Kim         case ACPI_IVRS_TYPE_MEMORY2:
555ff879b07SJung-uk Kim         case ACPI_IVRS_TYPE_MEMORY3:
556ff879b07SJung-uk Kim 
5571970d693SJung-uk Kim             AcpiOsPrintf ("\n");
5581970d693SJung-uk Kim             InfoTable = AcpiDmTableInfoIvrsMemory;
559ff879b07SJung-uk Kim             break;
560ff879b07SJung-uk Kim 
561ff879b07SJung-uk Kim         default:
562ff879b07SJung-uk Kim 
563ff879b07SJung-uk Kim             AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n",
564ff879b07SJung-uk Kim                 Subtable->Type);
565ff879b07SJung-uk Kim 
566ff879b07SJung-uk Kim             /* Attempt to continue */
567ff879b07SJung-uk Kim 
568ff879b07SJung-uk Kim             if (!Subtable->Length)
569ff879b07SJung-uk Kim             {
570ff879b07SJung-uk Kim                 AcpiOsPrintf ("Invalid zero length subtable\n");
571ff879b07SJung-uk Kim                 return;
572ff879b07SJung-uk Kim             }
573ff879b07SJung-uk Kim             goto NextSubtable;
574ff879b07SJung-uk Kim         }
575ff879b07SJung-uk Kim 
576ff879b07SJung-uk Kim         /* Dump the subtable */
577ff879b07SJung-uk Kim 
578ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
579ff879b07SJung-uk Kim             Subtable->Length, InfoTable);
580ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
581ff879b07SJung-uk Kim         {
582ff879b07SJung-uk Kim             return;
583ff879b07SJung-uk Kim         }
584ff879b07SJung-uk Kim 
5851970d693SJung-uk Kim         /* The hardware subtables (IVHD) can contain multiple device entries */
586ff879b07SJung-uk Kim 
5873ee58df5SJung-uk Kim         if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1 ||
588cfd1ed46SJung-uk Kim             Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2 ||
589cfd1ed46SJung-uk Kim             Subtable->Type == ACPI_IVRS_TYPE_HARDWARE3)
590ff879b07SJung-uk Kim         {
5913ee58df5SJung-uk Kim             if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1)
5923ee58df5SJung-uk Kim             {
5933ee58df5SJung-uk Kim                 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE1);
594ff879b07SJung-uk Kim                 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
5953ee58df5SJung-uk Kim                     sizeof (ACPI_IVRS_HARDWARE1));
5963ee58df5SJung-uk Kim             }
59708ddfe86SJung-uk Kim             else
5983ee58df5SJung-uk Kim             {
5991970d693SJung-uk Kim                 /* ACPI_IVRS_TYPE_HARDWARE2, HARDWARE3 subtable types */
60008ddfe86SJung-uk Kim 
6013ee58df5SJung-uk Kim                 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE2);
6023ee58df5SJung-uk Kim                 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
6033ee58df5SJung-uk Kim                     sizeof (ACPI_IVRS_HARDWARE2));
6043ee58df5SJung-uk Kim             }
605ff879b07SJung-uk Kim 
6061970d693SJung-uk Kim             /* Process all of the Device Entries */
6071970d693SJung-uk Kim 
608ff879b07SJung-uk Kim             while (EntryOffset < (Offset + Subtable->Length))
609ff879b07SJung-uk Kim             {
610ff879b07SJung-uk Kim                 AcpiOsPrintf ("\n");
6111970d693SJung-uk Kim 
612ff879b07SJung-uk Kim                 /*
613ff879b07SJung-uk Kim                  * Upper 2 bits of Type encode the length of the device entry
614ff879b07SJung-uk Kim                  *
615ff879b07SJung-uk Kim                  * 00 = 4 byte
616ff879b07SJung-uk Kim                  * 01 = 8 byte
617cfd1ed46SJung-uk Kim                  * 1x = variable length
618ff879b07SJung-uk Kim                  */
619ff879b07SJung-uk Kim                 EntryType = DeviceEntry->Type;
620cfd1ed46SJung-uk Kim                 EntryLength = EntryType >> 6 == 1 ? 8 : 4;
621ff879b07SJung-uk Kim 
622ff879b07SJung-uk Kim                 switch (EntryType)
623ff879b07SJung-uk Kim                 {
624ff879b07SJung-uk Kim                 /* 4-byte device entries */
625ff879b07SJung-uk Kim 
626ff879b07SJung-uk Kim                 case ACPI_IVRS_TYPE_PAD4:
627ff879b07SJung-uk Kim                 case ACPI_IVRS_TYPE_ALL:
628ff879b07SJung-uk Kim                 case ACPI_IVRS_TYPE_SELECT:
629ff879b07SJung-uk Kim                 case ACPI_IVRS_TYPE_START:
630ff879b07SJung-uk Kim                 case ACPI_IVRS_TYPE_END:
631ff879b07SJung-uk Kim 
632ff879b07SJung-uk Kim                     InfoTable = AcpiDmTableInfoIvrs4;
633ff879b07SJung-uk Kim                     break;
634ff879b07SJung-uk Kim 
635ff879b07SJung-uk Kim                 /* 8-byte entries, type A */
636ff879b07SJung-uk Kim 
637ff879b07SJung-uk Kim                 case ACPI_IVRS_TYPE_ALIAS_SELECT:
638ff879b07SJung-uk Kim                 case ACPI_IVRS_TYPE_ALIAS_START:
639ff879b07SJung-uk Kim 
640ff879b07SJung-uk Kim                     InfoTable = AcpiDmTableInfoIvrs8a;
641ff879b07SJung-uk Kim                     break;
642ff879b07SJung-uk Kim 
643ff879b07SJung-uk Kim                 /* 8-byte entries, type B */
644ff879b07SJung-uk Kim 
645ff879b07SJung-uk Kim                 case ACPI_IVRS_TYPE_PAD8:
646ff879b07SJung-uk Kim                 case ACPI_IVRS_TYPE_EXT_SELECT:
647ff879b07SJung-uk Kim                 case ACPI_IVRS_TYPE_EXT_START:
648ff879b07SJung-uk Kim 
649ff879b07SJung-uk Kim                     InfoTable = AcpiDmTableInfoIvrs8b;
650ff879b07SJung-uk Kim                     break;
651ff879b07SJung-uk Kim 
652ff879b07SJung-uk Kim                 /* 8-byte entries, type C */
653ff879b07SJung-uk Kim 
654ff879b07SJung-uk Kim                 case ACPI_IVRS_TYPE_SPECIAL:
655ff879b07SJung-uk Kim 
656ff879b07SJung-uk Kim                     InfoTable = AcpiDmTableInfoIvrs8c;
657ff879b07SJung-uk Kim                     break;
658ff879b07SJung-uk Kim 
659cfd1ed46SJung-uk Kim                 /* Variable-length entries */
660cfd1ed46SJung-uk Kim 
661cfd1ed46SJung-uk Kim                 case ACPI_IVRS_TYPE_HID:
662cfd1ed46SJung-uk Kim 
6631970d693SJung-uk Kim                     EntryLength = 4;
664cfd1ed46SJung-uk Kim                     InfoTable = AcpiDmTableInfoIvrsHid;
665cfd1ed46SJung-uk Kim                     break;
666cfd1ed46SJung-uk Kim 
667ff879b07SJung-uk Kim                 default:
668ff879b07SJung-uk Kim                     InfoTable = AcpiDmTableInfoIvrs4;
669ff879b07SJung-uk Kim                     AcpiOsPrintf (
670ff879b07SJung-uk Kim                         "\n**** Unknown IVRS device entry type/length: "
671ff879b07SJung-uk Kim                         "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
672ff879b07SJung-uk Kim                         EntryType, EntryLength, EntryOffset);
673ff879b07SJung-uk Kim                     break;
674ff879b07SJung-uk Kim                 }
675ff879b07SJung-uk Kim 
676ff879b07SJung-uk Kim                 /* Dump the Device Entry */
677ff879b07SJung-uk Kim 
678ff879b07SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
679ff879b07SJung-uk Kim                     DeviceEntry, EntryLength, InfoTable);
680ff879b07SJung-uk Kim                 if (ACPI_FAILURE (Status))
681ff879b07SJung-uk Kim                 {
682ff879b07SJung-uk Kim                     return;
683ff879b07SJung-uk Kim                 }
684ff879b07SJung-uk Kim 
685cfd1ed46SJung-uk Kim                 HidSubtable = ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, DeviceEntry);
686ff879b07SJung-uk Kim                 EntryOffset += EntryLength;
6871970d693SJung-uk Kim                 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, HidSubtable,
688ff879b07SJung-uk Kim                     EntryLength);
689cfd1ed46SJung-uk Kim 
690cfd1ed46SJung-uk Kim                 if (EntryType == ACPI_IVRS_TYPE_HID)
691cfd1ed46SJung-uk Kim                 {
6921970d693SJung-uk Kim                     /*
6931970d693SJung-uk Kim                      * Determine if the HID is an integer or a string.
6941970d693SJung-uk Kim                      * An integer is defined to be 32 bits, with the upper 32 bits
6951970d693SJung-uk Kim                      * set to zero. (from the ACPI Spec): "The HID can be a 32-bit
6961970d693SJung-uk Kim                      * integer or a character string. If an integer, the lower
6971970d693SJung-uk Kim                      * 4 bytes of the field contain the integer and the upper
6981970d693SJung-uk Kim                      * 4 bytes are padded with 0".
6991970d693SJung-uk Kim                      */
7001970d693SJung-uk Kim                     if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiHid))
7011970d693SJung-uk Kim                     {
702cfd1ed46SJung-uk Kim                         Status = AcpiDmDumpTable (Table->Length, EntryOffset,
7031970d693SJung-uk Kim                             &HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidInteger);
7041970d693SJung-uk Kim                     }
7051970d693SJung-uk Kim                     else
7061970d693SJung-uk Kim                     {
7071970d693SJung-uk Kim                         Status = AcpiDmDumpTable (Table->Length, EntryOffset,
7081970d693SJung-uk Kim                             &HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidString);
7091970d693SJung-uk Kim                     }
710cfd1ed46SJung-uk Kim                     if (ACPI_FAILURE (Status))
711cfd1ed46SJung-uk Kim                     {
712cfd1ed46SJung-uk Kim                         return;
713cfd1ed46SJung-uk Kim                     }
7141970d693SJung-uk Kim 
7151970d693SJung-uk Kim                     EntryOffset += 8;
7161970d693SJung-uk Kim 
7171970d693SJung-uk Kim                     /*
7181970d693SJung-uk Kim                      * Determine if the CID is an integer or a string. The format
7191970d693SJung-uk Kim                      * of the CID is the same as the HID above. From ACPI Spec:
7201970d693SJung-uk Kim                      * "If present, CID must be a single Compatible Device ID
7211970d693SJung-uk Kim                      * following the same format as the HID field."
7221970d693SJung-uk Kim                      */
7231970d693SJung-uk Kim                     if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiCid))
7241970d693SJung-uk Kim                     {
7251970d693SJung-uk Kim                         Status = AcpiDmDumpTable (Table->Length, EntryOffset,
7261970d693SJung-uk Kim                             &HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidInteger);
7271970d693SJung-uk Kim                     }
7281970d693SJung-uk Kim                     else
7291970d693SJung-uk Kim                     {
7301970d693SJung-uk Kim                         Status = AcpiDmDumpTable (Table->Length, EntryOffset,
7311970d693SJung-uk Kim                             &HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidString);
7321970d693SJung-uk Kim                     }
7331970d693SJung-uk Kim                     if (ACPI_FAILURE (Status))
7341970d693SJung-uk Kim                     {
7351970d693SJung-uk Kim                         return;
7361970d693SJung-uk Kim                     }
7371970d693SJung-uk Kim 
7381970d693SJung-uk Kim                     EntryOffset += 8;
7391970d693SJung-uk Kim                     EntryLength = HidSubtable->UidLength;
7401970d693SJung-uk Kim 
7411970d693SJung-uk Kim                     if (EntryLength > ACPI_IVRS_UID_NOT_PRESENT)
7421970d693SJung-uk Kim                     {
7431970d693SJung-uk Kim                         /* Dump the UID based upon the UidType field (String or Integer) */
7441970d693SJung-uk Kim 
7451970d693SJung-uk Kim                         if (HidSubtable->UidType == ACPI_IVRS_UID_IS_STRING)
7461970d693SJung-uk Kim                         {
7471970d693SJung-uk Kim                             Status = AcpiDmDumpTable (Table->Length, EntryOffset,
7481970d693SJung-uk Kim                                 &HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidString);
7491970d693SJung-uk Kim                             if (ACPI_FAILURE (Status))
7501970d693SJung-uk Kim                             {
7511970d693SJung-uk Kim                                 return;
7521970d693SJung-uk Kim                             }
7531970d693SJung-uk Kim                         }
7541970d693SJung-uk Kim                         else /* ACPI_IVRS_UID_IS_INTEGER */
7551970d693SJung-uk Kim                         {
7561970d693SJung-uk Kim                             Status = AcpiDmDumpTable (Table->Length, EntryOffset,
7571970d693SJung-uk Kim                                 &HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidInteger);
7581970d693SJung-uk Kim                             if (ACPI_FAILURE (Status))
7591970d693SJung-uk Kim                             {
7601970d693SJung-uk Kim                                 return;
7611970d693SJung-uk Kim                             }
7621970d693SJung-uk Kim                         }
7631970d693SJung-uk Kim                     }
7641970d693SJung-uk Kim 
7651970d693SJung-uk Kim                     EntryOffset += EntryLength+2;
766cfd1ed46SJung-uk Kim                     DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER,
7671970d693SJung-uk Kim                         Table, EntryOffset);
768cfd1ed46SJung-uk Kim                 }
769ff879b07SJung-uk Kim             }
770ff879b07SJung-uk Kim         }
771ff879b07SJung-uk Kim 
772ff879b07SJung-uk Kim NextSubtable:
773ff879b07SJung-uk Kim         /* Point to next subtable */
774ff879b07SJung-uk Kim 
775ff879b07SJung-uk Kim         Offset += Subtable->Length;
776ff879b07SJung-uk Kim         Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, Subtable->Length);
777ff879b07SJung-uk Kim     }
778ff879b07SJung-uk Kim }
779ff879b07SJung-uk Kim 
780ff879b07SJung-uk Kim 
781ff879b07SJung-uk Kim /*******************************************************************************
782ff879b07SJung-uk Kim  *
783ff879b07SJung-uk Kim  * FUNCTION:    AcpiDmDumpLpit
784ff879b07SJung-uk Kim  *
785ff879b07SJung-uk Kim  * PARAMETERS:  Table               - A LPIT table
786ff879b07SJung-uk Kim  *
787ff879b07SJung-uk Kim  * RETURN:      None
788ff879b07SJung-uk Kim  *
789ff879b07SJung-uk Kim  * DESCRIPTION: Format the contents of a LPIT. This table type consists
790ff879b07SJung-uk Kim  *              of an open-ended number of subtables. Note: There are no
791ff879b07SJung-uk Kim  *              entries in the main table. An LPIT consists of the table
792ff879b07SJung-uk Kim  *              header and then subtables only.
793ff879b07SJung-uk Kim  *
794ff879b07SJung-uk Kim  ******************************************************************************/
795ff879b07SJung-uk Kim 
796ff879b07SJung-uk Kim void
797ff879b07SJung-uk Kim AcpiDmDumpLpit (
798ff879b07SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
799ff879b07SJung-uk Kim {
800ff879b07SJung-uk Kim     ACPI_STATUS             Status;
801ff879b07SJung-uk Kim     ACPI_LPIT_HEADER        *Subtable;
802ff879b07SJung-uk Kim     UINT32                  Length = Table->Length;
803ff879b07SJung-uk Kim     UINT32                  Offset = sizeof (ACPI_TABLE_LPIT);
804ff879b07SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
805ff879b07SJung-uk Kim     UINT32                  SubtableLength;
806ff879b07SJung-uk Kim 
807ff879b07SJung-uk Kim 
808ff879b07SJung-uk Kim     /* Subtables */
809ff879b07SJung-uk Kim 
810ff879b07SJung-uk Kim     Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
811ff879b07SJung-uk Kim     while (Offset < Table->Length)
812ff879b07SJung-uk Kim     {
813ff879b07SJung-uk Kim         /* Common subtable header */
814ff879b07SJung-uk Kim 
815ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Length, Offset, Subtable,
816ff879b07SJung-uk Kim             sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);
817ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
818ff879b07SJung-uk Kim         {
819ff879b07SJung-uk Kim             return;
820ff879b07SJung-uk Kim         }
821ff879b07SJung-uk Kim 
822ff879b07SJung-uk Kim         switch (Subtable->Type)
823ff879b07SJung-uk Kim         {
824ff879b07SJung-uk Kim         case ACPI_LPIT_TYPE_NATIVE_CSTATE:
825ff879b07SJung-uk Kim 
826ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoLpit0;
827ff879b07SJung-uk Kim             SubtableLength = sizeof (ACPI_LPIT_NATIVE);
828ff879b07SJung-uk Kim             break;
829ff879b07SJung-uk Kim 
830ff879b07SJung-uk Kim         default:
831ff879b07SJung-uk Kim 
832ff879b07SJung-uk Kim             /* Cannot continue on unknown type - no length */
833ff879b07SJung-uk Kim 
834ff879b07SJung-uk Kim             AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n",
835ff879b07SJung-uk Kim                 Subtable->Type);
836ff879b07SJung-uk Kim             return;
837ff879b07SJung-uk Kim         }
838ff879b07SJung-uk Kim 
839ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Length, Offset, Subtable,
840ff879b07SJung-uk Kim             SubtableLength, InfoTable);
841ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
842ff879b07SJung-uk Kim         {
843ff879b07SJung-uk Kim             return;
844ff879b07SJung-uk Kim         }
845ff879b07SJung-uk Kim 
846ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
847ff879b07SJung-uk Kim 
848ff879b07SJung-uk Kim         /* Point to next subtable */
849ff879b07SJung-uk Kim 
850ff879b07SJung-uk Kim         Offset += SubtableLength;
851ff879b07SJung-uk Kim         Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Subtable, SubtableLength);
852ff879b07SJung-uk Kim     }
853ff879b07SJung-uk Kim }
854ff879b07SJung-uk Kim 
855ff879b07SJung-uk Kim 
856ff879b07SJung-uk Kim /*******************************************************************************
857ff879b07SJung-uk Kim  *
858ff879b07SJung-uk Kim  * FUNCTION:    AcpiDmDumpMadt
859ff879b07SJung-uk Kim  *
860ff879b07SJung-uk Kim  * PARAMETERS:  Table               - A MADT table
861ff879b07SJung-uk Kim  *
862ff879b07SJung-uk Kim  * RETURN:      None
863ff879b07SJung-uk Kim  *
864ff879b07SJung-uk Kim  * DESCRIPTION: Format the contents of a MADT. This table type consists
865ff879b07SJung-uk Kim  *              of an open-ended number of subtables.
866ff879b07SJung-uk Kim  *
867ff879b07SJung-uk Kim  ******************************************************************************/
868ff879b07SJung-uk Kim 
869ff879b07SJung-uk Kim void
870ff879b07SJung-uk Kim AcpiDmDumpMadt (
871ff879b07SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
872ff879b07SJung-uk Kim {
873ff879b07SJung-uk Kim     ACPI_STATUS             Status;
874ff879b07SJung-uk Kim     ACPI_SUBTABLE_HEADER    *Subtable;
875ff879b07SJung-uk Kim     UINT32                  Length = Table->Length;
876ff879b07SJung-uk Kim     UINT32                  Offset = sizeof (ACPI_TABLE_MADT);
877ff879b07SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
878ff879b07SJung-uk Kim 
879ff879b07SJung-uk Kim 
880ff879b07SJung-uk Kim     /* Main table */
881ff879b07SJung-uk Kim 
882ff879b07SJung-uk Kim     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
883ff879b07SJung-uk Kim     if (ACPI_FAILURE (Status))
884ff879b07SJung-uk Kim     {
885ff879b07SJung-uk Kim         return;
886ff879b07SJung-uk Kim     }
887ff879b07SJung-uk Kim 
888ff879b07SJung-uk Kim     /* Subtables */
889ff879b07SJung-uk Kim 
890ff879b07SJung-uk Kim     Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
891ab71bbb7SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "//0B) Offset %X, from table start: 0x%8.8X%8.8X\n",
892ab71bbb7SJung-uk Kim         Offset, ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)));
893ff879b07SJung-uk Kim     while (Offset < Table->Length)
894ff879b07SJung-uk Kim     {
895ff879b07SJung-uk Kim         /* Common subtable header */
896ff879b07SJung-uk Kim 
897ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
898ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Length, Offset, Subtable,
899ff879b07SJung-uk Kim             Subtable->Length, AcpiDmTableInfoMadtHdr);
900ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
901ff879b07SJung-uk Kim         {
902ff879b07SJung-uk Kim             return;
903ff879b07SJung-uk Kim         }
904ff879b07SJung-uk Kim 
905ab71bbb7SJung-uk Kim         DbgPrint (ASL_PARSE_OUTPUT, "subtableType: %X\n", Subtable->Type);
906ff879b07SJung-uk Kim         switch (Subtable->Type)
907ff879b07SJung-uk Kim         {
908ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_APIC:
909ff879b07SJung-uk Kim 
910ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt0;
911ff879b07SJung-uk Kim             break;
912ff879b07SJung-uk Kim 
913ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_IO_APIC:
914ff879b07SJung-uk Kim 
915ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt1;
916ff879b07SJung-uk Kim             break;
917ff879b07SJung-uk Kim 
918ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
919ff879b07SJung-uk Kim 
920ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt2;
921ff879b07SJung-uk Kim             break;
922ff879b07SJung-uk Kim 
923ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_NMI_SOURCE:
924ff879b07SJung-uk Kim 
925ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt3;
926ff879b07SJung-uk Kim             break;
927ff879b07SJung-uk Kim 
928ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
929ff879b07SJung-uk Kim 
930ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt4;
931ff879b07SJung-uk Kim             break;
932ff879b07SJung-uk Kim 
933ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
934ff879b07SJung-uk Kim 
935ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt5;
936ff879b07SJung-uk Kim             break;
937ff879b07SJung-uk Kim 
938ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_IO_SAPIC:
939ff879b07SJung-uk Kim 
940ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt6;
941ff879b07SJung-uk Kim             break;
942ff879b07SJung-uk Kim 
943ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_SAPIC:
944ff879b07SJung-uk Kim 
945ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt7;
946ff879b07SJung-uk Kim             break;
947ff879b07SJung-uk Kim 
948ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
949ff879b07SJung-uk Kim 
950ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt8;
951ff879b07SJung-uk Kim             break;
952ff879b07SJung-uk Kim 
953ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_X2APIC:
954ff879b07SJung-uk Kim 
955ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt9;
956ff879b07SJung-uk Kim             break;
957ff879b07SJung-uk Kim 
958ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
959ff879b07SJung-uk Kim 
960ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt10;
961ff879b07SJung-uk Kim             break;
962ff879b07SJung-uk Kim 
963ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
964ff879b07SJung-uk Kim 
965ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt11;
966ff879b07SJung-uk Kim             break;
967ff879b07SJung-uk Kim 
968ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
969ff879b07SJung-uk Kim 
970ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt12;
971ff879b07SJung-uk Kim             break;
972ff879b07SJung-uk Kim 
973ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
974ff879b07SJung-uk Kim 
975ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt13;
976ff879b07SJung-uk Kim             break;
977ff879b07SJung-uk Kim 
978ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
979ff879b07SJung-uk Kim 
980ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt14;
981ff879b07SJung-uk Kim             break;
982ff879b07SJung-uk Kim 
983ff879b07SJung-uk Kim         case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
984ff879b07SJung-uk Kim 
985ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt15;
986ff879b07SJung-uk Kim             break;
987ff879b07SJung-uk Kim 
988cfd1ed46SJung-uk Kim         case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
989cfd1ed46SJung-uk Kim 
990cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoMadt16;
991cfd1ed46SJung-uk Kim             break;
992cfd1ed46SJung-uk Kim 
993ff879b07SJung-uk Kim         default:
994ff879b07SJung-uk Kim 
995ab71bbb7SJung-uk Kim             if ((Subtable->Type >= ACPI_MADT_TYPE_RESERVED) &&
996ab71bbb7SJung-uk Kim                 (Subtable->Type < ACPI_MADT_TYPE_OEM_RESERVED))
997ab71bbb7SJung-uk Kim             {
998ff879b07SJung-uk Kim                 AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",
999ff879b07SJung-uk Kim                     Subtable->Type);
1000ab71bbb7SJung-uk Kim                 goto NextSubtable;
1001ab71bbb7SJung-uk Kim             }
1002ab71bbb7SJung-uk Kim             else if (Subtable->Type >= ACPI_MADT_TYPE_OEM_RESERVED)
1003ab71bbb7SJung-uk Kim             {
1004ab71bbb7SJung-uk Kim                 DbgPrint (ASL_PARSE_OUTPUT, "//[Found an OEM structure, type = %0x]\n",
1005ab71bbb7SJung-uk Kim                     Subtable->Type);
1006ab71bbb7SJung-uk Kim                 Offset += sizeof (ACPI_SUBTABLE_HEADER);
1007ab71bbb7SJung-uk Kim                 DbgPrint (ASL_PARSE_OUTPUT, "//[0) Subtable->Length = %X, Subtable = %p, Offset = %X]\n",
1008ab71bbb7SJung-uk Kim                     Subtable->Length, Subtable, Offset);
1009ab71bbb7SJung-uk Kim                 DbgPrint (ASL_PARSE_OUTPUT, "//[0A) Offset from table start: 0x%8.8X%8.8X]\n",
1010ab71bbb7SJung-uk Kim                     ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)));
1011ab71bbb7SJung-uk Kim             }
1012ff879b07SJung-uk Kim 
1013ff879b07SJung-uk Kim             /* Attempt to continue */
1014ff879b07SJung-uk Kim 
1015ff879b07SJung-uk Kim             if (!Subtable->Length)
1016ff879b07SJung-uk Kim             {
1017ff879b07SJung-uk Kim                 AcpiOsPrintf ("Invalid zero length subtable\n");
1018ff879b07SJung-uk Kim                 return;
1019ff879b07SJung-uk Kim             }
1020ff879b07SJung-uk Kim 
1021ab71bbb7SJung-uk Kim             /* Dump the OEM data */
1022ab71bbb7SJung-uk Kim 
1023ab71bbb7SJung-uk Kim             Status = AcpiDmDumpTable (Length, Offset, ACPI_CAST_PTR (UINT8, Table) + Offset,
1024ab71bbb7SJung-uk Kim                 Subtable->Length - sizeof (ACPI_SUBTABLE_HEADER), AcpiDmTableInfoMadt17);
1025ab71bbb7SJung-uk Kim             if (ACPI_FAILURE (Status))
1026ab71bbb7SJung-uk Kim             {
1027ab71bbb7SJung-uk Kim                 return;
1028ab71bbb7SJung-uk Kim             }
1029ab71bbb7SJung-uk Kim 
1030ab71bbb7SJung-uk Kim             DbgPrint (ASL_PARSE_OUTPUT, "//[1) Subtable->Length = %X, Offset = %X]\n",
1031ab71bbb7SJung-uk Kim                 Subtable->Length, Offset);
1032ab71bbb7SJung-uk Kim             Offset -= sizeof (ACPI_SUBTABLE_HEADER);
1033ab71bbb7SJung-uk Kim 
1034ff879b07SJung-uk Kim             goto NextSubtable;
1035ff879b07SJung-uk Kim         }
1036ff879b07SJung-uk Kim 
1037ab71bbb7SJung-uk Kim         DbgPrint (ASL_PARSE_OUTPUT, "//[2) Subtable->Length = %X, Offset = %X]\n",
1038ab71bbb7SJung-uk Kim             Subtable->Length, Offset);
1039ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1040ff879b07SJung-uk Kim             Subtable->Length, InfoTable);
1041ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
1042ff879b07SJung-uk Kim         {
1043ff879b07SJung-uk Kim             return;
1044ff879b07SJung-uk Kim         }
1045ff879b07SJung-uk Kim 
1046ff879b07SJung-uk Kim NextSubtable:
1047ff879b07SJung-uk Kim         /* Point to next subtable */
1048ff879b07SJung-uk Kim 
1049ab71bbb7SJung-uk Kim         DbgPrint (ASL_PARSE_OUTPUT, "//[3) Subtable->Length = %X, Offset = %X]\n",
1050ab71bbb7SJung-uk Kim             Subtable->Length, Offset);
1051ab71bbb7SJung-uk Kim         DbgPrint (ASL_PARSE_OUTPUT, "//[4) Offset from table start: 0x%8.8X%8.8X (%p) %p]\n",
1052ab71bbb7SJung-uk Kim             ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (UINT8, Subtable) - ACPI_CAST_PTR (UINT8, Table)), Subtable, Table);
1053ab71bbb7SJung-uk Kim         if (Offset > Table->Length)
1054ab71bbb7SJung-uk Kim         {
1055ab71bbb7SJung-uk Kim             return;
1056ab71bbb7SJung-uk Kim         }
1057ab71bbb7SJung-uk Kim 
1058ff879b07SJung-uk Kim         Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable,
1059ff879b07SJung-uk Kim             Subtable->Length);
1060ab71bbb7SJung-uk Kim 
1061ab71bbb7SJung-uk Kim         DbgPrint (ASL_PARSE_OUTPUT, "//[5) Next Subtable %p, length %X]\n",
1062ab71bbb7SJung-uk Kim             Subtable, Subtable->Length);
1063ab71bbb7SJung-uk Kim         DbgPrint (ASL_PARSE_OUTPUT, "//[5B) Offset from table start: 0x%8.8X%8.8X (%p)]\n",
1064ab71bbb7SJung-uk Kim             ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)), Subtable);
1065ab71bbb7SJung-uk Kim 
1066ab71bbb7SJung-uk Kim         Offset = ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table);
1067ab71bbb7SJung-uk Kim         if (Offset >= Table->Length)
1068ab71bbb7SJung-uk Kim         {
1069ab71bbb7SJung-uk Kim             return;
1070ab71bbb7SJung-uk Kim         }
1071ff879b07SJung-uk Kim     }
1072ff879b07SJung-uk Kim }
1073ff879b07SJung-uk Kim 
1074ff879b07SJung-uk Kim 
1075ff879b07SJung-uk Kim /*******************************************************************************
1076ff879b07SJung-uk Kim  *
1077ff879b07SJung-uk Kim  * FUNCTION:    AcpiDmDumpMcfg
1078ff879b07SJung-uk Kim  *
1079ff879b07SJung-uk Kim  * PARAMETERS:  Table               - A MCFG Table
1080ff879b07SJung-uk Kim  *
1081ff879b07SJung-uk Kim  * RETURN:      None
1082ff879b07SJung-uk Kim  *
1083ff879b07SJung-uk Kim  * DESCRIPTION: Format the contents of a MCFG table
1084ff879b07SJung-uk Kim  *
1085ff879b07SJung-uk Kim  ******************************************************************************/
1086ff879b07SJung-uk Kim 
1087ff879b07SJung-uk Kim void
1088ff879b07SJung-uk Kim AcpiDmDumpMcfg (
1089ff879b07SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
1090ff879b07SJung-uk Kim {
1091ff879b07SJung-uk Kim     ACPI_STATUS             Status;
1092ff879b07SJung-uk Kim     UINT32                  Offset = sizeof (ACPI_TABLE_MCFG);
1093ff879b07SJung-uk Kim     ACPI_MCFG_ALLOCATION    *Subtable;
1094ff879b07SJung-uk Kim 
1095ff879b07SJung-uk Kim 
1096ff879b07SJung-uk Kim     /* Main table */
1097ff879b07SJung-uk Kim 
1098ff879b07SJung-uk Kim     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
1099ff879b07SJung-uk Kim     if (ACPI_FAILURE (Status))
1100ff879b07SJung-uk Kim     {
1101ff879b07SJung-uk Kim         return;
1102ff879b07SJung-uk Kim     }
1103ff879b07SJung-uk Kim 
1104ff879b07SJung-uk Kim     /* Subtables */
1105ff879b07SJung-uk Kim 
1106ff879b07SJung-uk Kim     Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
1107ff879b07SJung-uk Kim     while (Offset < Table->Length)
1108ff879b07SJung-uk Kim     {
1109ff879b07SJung-uk Kim         if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
1110ff879b07SJung-uk Kim         {
1111ff879b07SJung-uk Kim             AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
1112a009b7dcSJung-uk Kim                 (UINT32) sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
1113ff879b07SJung-uk Kim             return;
1114ff879b07SJung-uk Kim         }
1115ff879b07SJung-uk Kim 
1116ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
1117ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1118ff879b07SJung-uk Kim             sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
1119ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
1120ff879b07SJung-uk Kim         {
1121ff879b07SJung-uk Kim             return;
1122ff879b07SJung-uk Kim         }
1123ff879b07SJung-uk Kim 
1124ff879b07SJung-uk Kim         /* Point to next subtable (each subtable is of fixed length) */
1125ff879b07SJung-uk Kim 
1126ff879b07SJung-uk Kim         Offset += sizeof (ACPI_MCFG_ALLOCATION);
1127ff879b07SJung-uk Kim         Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Subtable,
1128ff879b07SJung-uk Kim             sizeof (ACPI_MCFG_ALLOCATION));
1129ff879b07SJung-uk Kim     }
1130ff879b07SJung-uk Kim }
1131ff879b07SJung-uk Kim 
1132*722b1667SJung-uk Kim /*******************************************************************************
1133*722b1667SJung-uk Kim  *
1134*722b1667SJung-uk Kim  * FUNCTION:    AcpiDmDumpMpam
1135*722b1667SJung-uk Kim  *
1136*722b1667SJung-uk Kim  * PARAMETERS:  Table               - A MPAM table
1137*722b1667SJung-uk Kim  *
1138*722b1667SJung-uk Kim  * RETURN:      None
1139*722b1667SJung-uk Kim  *
1140*722b1667SJung-uk Kim  * DESCRIPTION: Format the contents of a MPAM table
1141*722b1667SJung-uk Kim  *
1142*722b1667SJung-uk Kim  ******************************************************************************/
1143*722b1667SJung-uk Kim 
1144*722b1667SJung-uk Kim void
1145*722b1667SJung-uk Kim AcpiDmDumpMpam (
1146*722b1667SJung-uk Kim     ACPI_TABLE_HEADER          *Table)
1147*722b1667SJung-uk Kim {
1148*722b1667SJung-uk Kim     ACPI_STATUS                Status;
1149*722b1667SJung-uk Kim     ACPI_MPAM_MSC_NODE         *MpamMscNode;
1150*722b1667SJung-uk Kim     ACPI_MPAM_RESOURCE_NODE    *MpamResourceNode;
1151*722b1667SJung-uk Kim     ACPI_DMTABLE_INFO          *InfoTable;
1152*722b1667SJung-uk Kim     UINT32                     Offset = sizeof(ACPI_TABLE_HEADER);
1153*722b1667SJung-uk Kim     UINT32                     MpamResourceNodeLength = 0;
1154*722b1667SJung-uk Kim 
1155*722b1667SJung-uk Kim     while (Offset < Table->Length)
1156*722b1667SJung-uk Kim     {
1157*722b1667SJung-uk Kim         MpamMscNode = ACPI_ADD_PTR (ACPI_MPAM_MSC_NODE, Table, Offset);
1158*722b1667SJung-uk Kim 
1159*722b1667SJung-uk Kim         /* Subtable: MSC */
1160*722b1667SJung-uk Kim         Status = AcpiDmDumpTable (MpamMscNode->Length, 0, MpamMscNode, 0,
1161*722b1667SJung-uk Kim             AcpiDmTableInfoMpam0);
1162*722b1667SJung-uk Kim         if (ACPI_FAILURE (Status))
1163*722b1667SJung-uk Kim         {
1164*722b1667SJung-uk Kim             return;
1165*722b1667SJung-uk Kim         }
1166*722b1667SJung-uk Kim 
1167*722b1667SJung-uk Kim         /* Offset the start of the array of resources */
1168*722b1667SJung-uk Kim         Offset += sizeof(ACPI_MPAM_MSC_NODE);
1169*722b1667SJung-uk Kim 
1170*722b1667SJung-uk Kim         /* Subtable: MSC RIS(es) */
1171*722b1667SJung-uk Kim         for (UINT32 ResourceIdx = 0; ResourceIdx < MpamMscNode->NumResouceNodes; ResourceIdx++)
1172*722b1667SJung-uk Kim         {
1173*722b1667SJung-uk Kim             MpamResourceNode = ACPI_ADD_PTR (ACPI_MPAM_RESOURCE_NODE, Table, Offset);
1174*722b1667SJung-uk Kim 
1175*722b1667SJung-uk Kim             MpamResourceNodeLength = sizeof(ACPI_MPAM_RESOURCE_NODE) +
1176*722b1667SJung-uk Kim                 MpamResourceNode->NumFunctionalDeps * sizeof(ACPI_MPAM_FUNC_DEPS);
1177*722b1667SJung-uk Kim 
1178*722b1667SJung-uk Kim             Offset += MpamResourceNodeLength;
1179*722b1667SJung-uk Kim 
1180*722b1667SJung-uk Kim             /* Subtable: MSC RIS */
1181*722b1667SJung-uk Kim             Status = AcpiDmDumpTable (MpamResourceNodeLength, 0, MpamResourceNode, 0,
1182*722b1667SJung-uk Kim                 AcpiDmTableInfoMpam1);
1183*722b1667SJung-uk Kim             if (ACPI_FAILURE (Status))
1184*722b1667SJung-uk Kim             {
1185*722b1667SJung-uk Kim                 return;
1186*722b1667SJung-uk Kim             }
1187*722b1667SJung-uk Kim 
1188*722b1667SJung-uk Kim             switch (MpamResourceNode->LocatorType)
1189*722b1667SJung-uk Kim             {
1190*722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE:
1191*722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1A;
1192*722b1667SJung-uk Kim                     break;
1193*722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_MEMORY:
1194*722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1B;
1195*722b1667SJung-uk Kim                     break;
1196*722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_SMMU:
1197*722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1C;
1198*722b1667SJung-uk Kim                     break;
1199*722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_MEMORY_CACHE:
1200*722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1D;
1201*722b1667SJung-uk Kim                     break;
1202*722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_ACPI_DEVICE:
1203*722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1E;
1204*722b1667SJung-uk Kim                     break;
1205*722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_INTERCONNECT:
1206*722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1F;
1207*722b1667SJung-uk Kim                     break;
1208*722b1667SJung-uk Kim                 case ACPI_MPAM_LOCATION_TYPE_UNKNOWN:
1209*722b1667SJung-uk Kim                     InfoTable = AcpiDmTableInfoMpam1G;
1210*722b1667SJung-uk Kim                 default:
1211*722b1667SJung-uk Kim                     AcpiOsPrintf ("\n**** Unknown MPAM locator type 0x%X\n",
1212*722b1667SJung-uk Kim                         MpamResourceNode->LocatorType);
1213*722b1667SJung-uk Kim                     return;
1214*722b1667SJung-uk Kim             }
1215*722b1667SJung-uk Kim 
1216*722b1667SJung-uk Kim             /* Subtable: MSC Resource Locator(s) */
1217*722b1667SJung-uk Kim             Status = AcpiDmDumpTable (sizeof(ACPI_MPAM_RESOURCE_LOCATOR), 0,
1218*722b1667SJung-uk Kim                 &MpamResourceNode->Locator, 0, InfoTable);
1219*722b1667SJung-uk Kim             if (ACPI_FAILURE (Status))
1220*722b1667SJung-uk Kim             {
1221*722b1667SJung-uk Kim                 return;
1222*722b1667SJung-uk Kim             }
1223*722b1667SJung-uk Kim 
1224*722b1667SJung-uk Kim             /* Get the number of functional dependencies of an RIS */
1225*722b1667SJung-uk Kim             Status = AcpiDmDumpTable (sizeof(UINT32), 0, &MpamResourceNode->NumFunctionalDeps, 0,
1226*722b1667SJung-uk Kim                 AcpiDmTableInfoMpam1Deps);
1227*722b1667SJung-uk Kim             if (ACPI_FAILURE (Status))
1228*722b1667SJung-uk Kim             {
1229*722b1667SJung-uk Kim                 return;
1230*722b1667SJung-uk Kim             }
1231*722b1667SJung-uk Kim 
1232*722b1667SJung-uk Kim             /* Subtable: MSC functional dependencies */
1233*722b1667SJung-uk Kim             for (UINT32 funcDep = 0; funcDep < MpamResourceNode->NumFunctionalDeps; funcDep++)
1234*722b1667SJung-uk Kim             {
1235*722b1667SJung-uk Kim                 Status = AcpiDmDumpTable (sizeof(ACPI_MPAM_FUNC_DEPS), 0,
1236*722b1667SJung-uk Kim                     &MpamResourceNode->NumFunctionalDeps, 0, AcpiDmTableInfoMpam2);
1237*722b1667SJung-uk Kim                 if (ACPI_FAILURE (Status))
1238*722b1667SJung-uk Kim                 {
1239*722b1667SJung-uk Kim                     return;
1240*722b1667SJung-uk Kim                 }
1241*722b1667SJung-uk Kim             }
1242*722b1667SJung-uk Kim 
1243*722b1667SJung-uk Kim             AcpiOsPrintf ("\n\n");
1244*722b1667SJung-uk Kim         }
1245*722b1667SJung-uk Kim 
1246*722b1667SJung-uk Kim     }
1247*722b1667SJung-uk Kim 
1248*722b1667SJung-uk Kim     return;
1249*722b1667SJung-uk Kim }
1250ff879b07SJung-uk Kim 
1251ff879b07SJung-uk Kim /*******************************************************************************
1252ff879b07SJung-uk Kim  *
1253ff879b07SJung-uk Kim  * FUNCTION:    AcpiDmDumpMpst
1254ff879b07SJung-uk Kim  *
1255ff879b07SJung-uk Kim  * PARAMETERS:  Table               - A MPST Table
1256ff879b07SJung-uk Kim  *
1257ff879b07SJung-uk Kim  * RETURN:      None
1258ff879b07SJung-uk Kim  *
1259ff879b07SJung-uk Kim  * DESCRIPTION: Format the contents of a MPST table
1260ff879b07SJung-uk Kim  *
1261ff879b07SJung-uk Kim  ******************************************************************************/
1262ff879b07SJung-uk Kim 
1263ff879b07SJung-uk Kim void
1264ff879b07SJung-uk Kim AcpiDmDumpMpst (
1265ff879b07SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
1266ff879b07SJung-uk Kim {
1267ff879b07SJung-uk Kim     ACPI_STATUS             Status;
1268ff879b07SJung-uk Kim     UINT32                  Offset = sizeof (ACPI_TABLE_MPST);
1269ff879b07SJung-uk Kim     ACPI_MPST_POWER_NODE    *Subtable0;
1270ff879b07SJung-uk Kim     ACPI_MPST_POWER_STATE   *Subtable0A;
1271ff879b07SJung-uk Kim     ACPI_MPST_COMPONENT     *Subtable0B;
1272ff879b07SJung-uk Kim     ACPI_MPST_DATA_HDR      *Subtable1;
1273ff879b07SJung-uk Kim     ACPI_MPST_POWER_DATA    *Subtable2;
1274ff879b07SJung-uk Kim     UINT16                  SubtableCount;
1275ff879b07SJung-uk Kim     UINT32                  PowerStateCount;
1276ff879b07SJung-uk Kim     UINT32                  ComponentCount;
1277ff879b07SJung-uk Kim 
1278ff879b07SJung-uk Kim 
1279ff879b07SJung-uk Kim     /* Main table */
1280ff879b07SJung-uk Kim 
1281ff879b07SJung-uk Kim     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
1282ff879b07SJung-uk Kim     if (ACPI_FAILURE (Status))
1283ff879b07SJung-uk Kim     {
1284ff879b07SJung-uk Kim         return;
1285ff879b07SJung-uk Kim     }
1286ff879b07SJung-uk Kim 
1287ff879b07SJung-uk Kim     /* Subtable: Memory Power Node(s) */
1288ff879b07SJung-uk Kim 
1289ff879b07SJung-uk Kim     SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
1290ff879b07SJung-uk Kim     Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
1291ff879b07SJung-uk Kim 
1292ff879b07SJung-uk Kim     while ((Offset < Table->Length) && SubtableCount)
1293ff879b07SJung-uk Kim     {
1294ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
1295ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0,
1296ff879b07SJung-uk Kim             sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
1297ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
1298ff879b07SJung-uk Kim         {
1299ff879b07SJung-uk Kim             return;
1300ff879b07SJung-uk Kim         }
1301ff879b07SJung-uk Kim 
1302ff879b07SJung-uk Kim         /* Extract the sub-subtable counts */
1303ff879b07SJung-uk Kim 
1304ff879b07SJung-uk Kim         PowerStateCount = Subtable0->NumPowerStates;
1305ff879b07SJung-uk Kim         ComponentCount = Subtable0->NumPhysicalComponents;
1306ff879b07SJung-uk Kim         Offset += sizeof (ACPI_MPST_POWER_NODE);
1307ff879b07SJung-uk Kim 
1308ff879b07SJung-uk Kim         /* Sub-subtables - Memory Power State Structure(s) */
1309ff879b07SJung-uk Kim 
1310ff879b07SJung-uk Kim         Subtable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, Subtable0,
1311ff879b07SJung-uk Kim             sizeof (ACPI_MPST_POWER_NODE));
1312ff879b07SJung-uk Kim 
1313ff879b07SJung-uk Kim         while (PowerStateCount)
1314ff879b07SJung-uk Kim         {
1315ff879b07SJung-uk Kim             AcpiOsPrintf ("\n");
1316ff879b07SJung-uk Kim             Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A,
1317ff879b07SJung-uk Kim                 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
1318ff879b07SJung-uk Kim             if (ACPI_FAILURE (Status))
1319ff879b07SJung-uk Kim             {
1320ff879b07SJung-uk Kim                 return;
1321ff879b07SJung-uk Kim             }
1322ff879b07SJung-uk Kim 
1323ff879b07SJung-uk Kim             Subtable0A++;
1324ff879b07SJung-uk Kim             PowerStateCount--;
1325ff879b07SJung-uk Kim             Offset += sizeof (ACPI_MPST_POWER_STATE);
1326ff879b07SJung-uk Kim        }
1327ff879b07SJung-uk Kim 
1328ff879b07SJung-uk Kim         /* Sub-subtables - Physical Component ID Structure(s) */
1329ff879b07SJung-uk Kim 
1330ff879b07SJung-uk Kim         Subtable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, Subtable0A);
1331ff879b07SJung-uk Kim 
1332ff879b07SJung-uk Kim         if (ComponentCount)
1333ff879b07SJung-uk Kim         {
1334ff879b07SJung-uk Kim             AcpiOsPrintf ("\n");
1335ff879b07SJung-uk Kim         }
1336ff879b07SJung-uk Kim 
1337ff879b07SJung-uk Kim         while (ComponentCount)
1338ff879b07SJung-uk Kim         {
1339ff879b07SJung-uk Kim             Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B,
1340ff879b07SJung-uk Kim                 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
1341ff879b07SJung-uk Kim             if (ACPI_FAILURE (Status))
1342ff879b07SJung-uk Kim             {
1343ff879b07SJung-uk Kim                 return;
1344ff879b07SJung-uk Kim             }
1345ff879b07SJung-uk Kim 
1346ff879b07SJung-uk Kim             Subtable0B++;
1347ff879b07SJung-uk Kim             ComponentCount--;
1348ff879b07SJung-uk Kim             Offset += sizeof (ACPI_MPST_COMPONENT);
1349ff879b07SJung-uk Kim         }
1350ff879b07SJung-uk Kim 
1351ff879b07SJung-uk Kim         /* Point to next Memory Power Node subtable */
1352ff879b07SJung-uk Kim 
1353ff879b07SJung-uk Kim         SubtableCount--;
1354ff879b07SJung-uk Kim         Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Subtable0,
1355ff879b07SJung-uk Kim             sizeof (ACPI_MPST_POWER_NODE) +
1356ff879b07SJung-uk Kim             (sizeof (ACPI_MPST_POWER_STATE) * Subtable0->NumPowerStates) +
1357ff879b07SJung-uk Kim             (sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents));
1358ff879b07SJung-uk Kim     }
1359ff879b07SJung-uk Kim 
1360ff879b07SJung-uk Kim     /* Subtable: Count of Memory Power State Characteristic structures */
1361ff879b07SJung-uk Kim 
1362ff879b07SJung-uk Kim     AcpiOsPrintf ("\n");
1363ff879b07SJung-uk Kim     Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0);
1364ff879b07SJung-uk Kim     Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1,
1365ff879b07SJung-uk Kim         sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
1366ff879b07SJung-uk Kim     if (ACPI_FAILURE (Status))
1367ff879b07SJung-uk Kim     {
1368ff879b07SJung-uk Kim         return;
1369ff879b07SJung-uk Kim     }
1370ff879b07SJung-uk Kim 
1371ff879b07SJung-uk Kim     SubtableCount = Subtable1->CharacteristicsCount;
1372ff879b07SJung-uk Kim     Offset += sizeof (ACPI_MPST_DATA_HDR);
1373ff879b07SJung-uk Kim 
1374ff879b07SJung-uk Kim     /* Subtable: Memory Power State Characteristics structure(s) */
1375ff879b07SJung-uk Kim 
1376ff879b07SJung-uk Kim     Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1,
1377ff879b07SJung-uk Kim         sizeof (ACPI_MPST_DATA_HDR));
1378ff879b07SJung-uk Kim 
1379ff879b07SJung-uk Kim     while ((Offset < Table->Length) && SubtableCount)
1380ff879b07SJung-uk Kim     {
1381ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
1382ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2,
1383ff879b07SJung-uk Kim             sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
1384ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
1385ff879b07SJung-uk Kim         {
1386ff879b07SJung-uk Kim             return;
1387ff879b07SJung-uk Kim         }
1388ff879b07SJung-uk Kim 
1389ff879b07SJung-uk Kim         Subtable2++;
1390ff879b07SJung-uk Kim         SubtableCount--;
1391ff879b07SJung-uk Kim         Offset += sizeof (ACPI_MPST_POWER_DATA);
1392ff879b07SJung-uk Kim     }
1393ff879b07SJung-uk Kim }
1394ff879b07SJung-uk Kim 
1395ff879b07SJung-uk Kim 
1396ff879b07SJung-uk Kim /*******************************************************************************
1397ff879b07SJung-uk Kim  *
1398ff879b07SJung-uk Kim  * FUNCTION:    AcpiDmDumpMsct
1399ff879b07SJung-uk Kim  *
1400ff879b07SJung-uk Kim  * PARAMETERS:  Table               - A MSCT table
1401ff879b07SJung-uk Kim  *
1402ff879b07SJung-uk Kim  * RETURN:      None
1403ff879b07SJung-uk Kim  *
1404ff879b07SJung-uk Kim  * DESCRIPTION: Format the contents of a MSCT
1405ff879b07SJung-uk Kim  *
1406ff879b07SJung-uk Kim  ******************************************************************************/
1407ff879b07SJung-uk Kim 
1408ff879b07SJung-uk Kim void
1409ff879b07SJung-uk Kim AcpiDmDumpMsct (
1410ff879b07SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
1411ff879b07SJung-uk Kim {
1412ff879b07SJung-uk Kim     ACPI_STATUS             Status;
1413ff879b07SJung-uk Kim     UINT32                  Offset = sizeof (ACPI_TABLE_MSCT);
1414ff879b07SJung-uk Kim     ACPI_MSCT_PROXIMITY     *Subtable;
1415ff879b07SJung-uk Kim 
1416ff879b07SJung-uk Kim 
1417ff879b07SJung-uk Kim     /* Main table */
1418ff879b07SJung-uk Kim 
1419ff879b07SJung-uk Kim     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
1420ff879b07SJung-uk Kim     if (ACPI_FAILURE (Status))
1421ff879b07SJung-uk Kim     {
1422ff879b07SJung-uk Kim         return;
1423ff879b07SJung-uk Kim     }
1424ff879b07SJung-uk Kim 
1425ff879b07SJung-uk Kim     /* Subtables */
1426ff879b07SJung-uk Kim 
1427ff879b07SJung-uk Kim     Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
1428ff879b07SJung-uk Kim     while (Offset < Table->Length)
1429ff879b07SJung-uk Kim     {
1430ff879b07SJung-uk Kim         /* Common subtable header */
1431ff879b07SJung-uk Kim 
1432ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
1433ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1434ff879b07SJung-uk Kim             sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
1435ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
1436ff879b07SJung-uk Kim         {
1437ff879b07SJung-uk Kim             return;
1438ff879b07SJung-uk Kim         }
1439ff879b07SJung-uk Kim 
1440ff879b07SJung-uk Kim         /* Point to next subtable */
1441ff879b07SJung-uk Kim 
1442ff879b07SJung-uk Kim         Offset += sizeof (ACPI_MSCT_PROXIMITY);
1443ff879b07SJung-uk Kim         Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Subtable,
1444ff879b07SJung-uk Kim             sizeof (ACPI_MSCT_PROXIMITY));
1445ff879b07SJung-uk Kim     }
1446ff879b07SJung-uk Kim }
1447ff879b07SJung-uk Kim 
1448ff879b07SJung-uk Kim 
1449ff879b07SJung-uk Kim /*******************************************************************************
1450ff879b07SJung-uk Kim  *
1451ff879b07SJung-uk Kim  * FUNCTION:    AcpiDmDumpNfit
1452ff879b07SJung-uk Kim  *
1453ff879b07SJung-uk Kim  * PARAMETERS:  Table               - A NFIT table
1454ff879b07SJung-uk Kim  *
1455ff879b07SJung-uk Kim  * RETURN:      None
1456ff879b07SJung-uk Kim  *
1457ff879b07SJung-uk Kim  * DESCRIPTION: Format the contents of an NFIT.
1458ff879b07SJung-uk Kim  *
1459ff879b07SJung-uk Kim  ******************************************************************************/
1460ff879b07SJung-uk Kim 
1461ff879b07SJung-uk Kim void
1462ff879b07SJung-uk Kim AcpiDmDumpNfit (
1463ff879b07SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
1464ff879b07SJung-uk Kim {
1465ff879b07SJung-uk Kim     ACPI_STATUS             Status;
1466ff879b07SJung-uk Kim     UINT32                  Offset = sizeof (ACPI_TABLE_NFIT);
1467ff879b07SJung-uk Kim     UINT32                  FieldOffset = 0;
1468ff879b07SJung-uk Kim     UINT32                  Length;
1469ff879b07SJung-uk Kim     ACPI_NFIT_HEADER        *Subtable;
1470ff879b07SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
1471ff879b07SJung-uk Kim     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
1472ff879b07SJung-uk Kim     ACPI_NFIT_SMBIOS        *SmbiosInfo = NULL;
1473ff879b07SJung-uk Kim     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
1474ff879b07SJung-uk Kim     UINT32                  i;
1475ff879b07SJung-uk Kim 
1476ff879b07SJung-uk Kim 
1477ff879b07SJung-uk Kim     /* Main table */
1478ff879b07SJung-uk Kim 
1479ff879b07SJung-uk Kim     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
1480ff879b07SJung-uk Kim     if (ACPI_FAILURE (Status))
1481ff879b07SJung-uk Kim     {
1482ff879b07SJung-uk Kim         return;
1483ff879b07SJung-uk Kim     }
1484ff879b07SJung-uk Kim 
1485ff879b07SJung-uk Kim     /* Subtables */
1486ff879b07SJung-uk Kim 
1487ff879b07SJung-uk Kim     Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
1488ff879b07SJung-uk Kim     while (Offset < Table->Length)
1489ff879b07SJung-uk Kim     {
1490ff879b07SJung-uk Kim         /* NFIT subtable header */
1491ff879b07SJung-uk Kim 
1492ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
1493ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1494ff879b07SJung-uk Kim             Subtable->Length, AcpiDmTableInfoNfitHdr);
1495ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
1496ff879b07SJung-uk Kim         {
1497ff879b07SJung-uk Kim             return;
1498ff879b07SJung-uk Kim         }
1499ff879b07SJung-uk Kim 
1500ff879b07SJung-uk Kim         switch (Subtable->Type)
1501ff879b07SJung-uk Kim         {
1502ff879b07SJung-uk Kim         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
1503ff879b07SJung-uk Kim 
1504ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit0;
1505ff879b07SJung-uk Kim             break;
1506ff879b07SJung-uk Kim 
1507ff879b07SJung-uk Kim         case ACPI_NFIT_TYPE_MEMORY_MAP:
1508ff879b07SJung-uk Kim 
1509ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit1;
1510ff879b07SJung-uk Kim             break;
1511ff879b07SJung-uk Kim 
1512ff879b07SJung-uk Kim         case ACPI_NFIT_TYPE_INTERLEAVE:
1513ff879b07SJung-uk Kim 
1514ff879b07SJung-uk Kim             /* Has a variable number of 32-bit values at the end */
1515ff879b07SJung-uk Kim 
1516ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit2;
1517ff879b07SJung-uk Kim             FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);
1518ff879b07SJung-uk Kim             break;
1519ff879b07SJung-uk Kim 
1520ff879b07SJung-uk Kim         case ACPI_NFIT_TYPE_SMBIOS:
1521ff879b07SJung-uk Kim 
1522ff879b07SJung-uk Kim             SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, Subtable);
1523ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit3;
1524ff879b07SJung-uk Kim             break;
1525ff879b07SJung-uk Kim 
1526ff879b07SJung-uk Kim         case ACPI_NFIT_TYPE_CONTROL_REGION:
1527ff879b07SJung-uk Kim 
1528ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit4;
1529ff879b07SJung-uk Kim             break;
1530ff879b07SJung-uk Kim 
1531ff879b07SJung-uk Kim         case ACPI_NFIT_TYPE_DATA_REGION:
1532ff879b07SJung-uk Kim 
1533ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit5;
1534ff879b07SJung-uk Kim             break;
1535ff879b07SJung-uk Kim 
1536ff879b07SJung-uk Kim         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
1537ff879b07SJung-uk Kim 
1538ff879b07SJung-uk Kim             /* Has a variable number of 64-bit addresses at the end */
1539ff879b07SJung-uk Kim 
1540ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit6;
1541*722b1667SJung-uk Kim             FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS);
1542ff879b07SJung-uk Kim             break;
1543ff879b07SJung-uk Kim 
1544ff879b07SJung-uk Kim         case ACPI_NFIT_TYPE_CAPABILITIES:    /* ACPI 6.0A */
1545ff879b07SJung-uk Kim 
1546ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoNfit7;
1547ff879b07SJung-uk Kim             break;
1548ff879b07SJung-uk Kim 
1549ff879b07SJung-uk Kim         default:
1550ff879b07SJung-uk Kim             AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
1551ff879b07SJung-uk Kim                 Subtable->Type);
1552ff879b07SJung-uk Kim 
1553ff879b07SJung-uk Kim             /* Attempt to continue */
1554ff879b07SJung-uk Kim 
1555ff879b07SJung-uk Kim             if (!Subtable->Length)
1556ff879b07SJung-uk Kim             {
1557ff879b07SJung-uk Kim                 AcpiOsPrintf ("Invalid zero length subtable\n");
1558ff879b07SJung-uk Kim                 return;
1559ff879b07SJung-uk Kim             }
1560ff879b07SJung-uk Kim             goto NextSubtable;
1561ff879b07SJung-uk Kim         }
1562ff879b07SJung-uk Kim 
1563ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
1564ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1565ff879b07SJung-uk Kim             Subtable->Length, InfoTable);
1566ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
1567ff879b07SJung-uk Kim         {
1568ff879b07SJung-uk Kim             return;
1569ff879b07SJung-uk Kim         }
1570ff879b07SJung-uk Kim 
1571ff879b07SJung-uk Kim         /* Per-subtable variable-length fields */
1572ff879b07SJung-uk Kim 
1573ff879b07SJung-uk Kim         switch (Subtable->Type)
1574ff879b07SJung-uk Kim         {
1575ff879b07SJung-uk Kim         case ACPI_NFIT_TYPE_INTERLEAVE:
1576ff879b07SJung-uk Kim 
1577a009b7dcSJung-uk Kim             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable);
1578ff879b07SJung-uk Kim             for (i = 0; i < Interleave->LineCount; i++)
1579ff879b07SJung-uk Kim             {
1580ff879b07SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
1581ff879b07SJung-uk Kim                     &Interleave->LineOffset[i],
1582ff879b07SJung-uk Kim                     sizeof (UINT32), AcpiDmTableInfoNfit2a);
1583ff879b07SJung-uk Kim                 if (ACPI_FAILURE (Status))
1584ff879b07SJung-uk Kim                 {
1585ff879b07SJung-uk Kim                     return;
1586ff879b07SJung-uk Kim                 }
1587ff879b07SJung-uk Kim 
1588ff879b07SJung-uk Kim                 FieldOffset += sizeof (UINT32);
1589ff879b07SJung-uk Kim             }
1590ff879b07SJung-uk Kim             break;
1591ff879b07SJung-uk Kim 
1592ff879b07SJung-uk Kim         case ACPI_NFIT_TYPE_SMBIOS:
1593ff879b07SJung-uk Kim 
1594ff879b07SJung-uk Kim             Length = Subtable->Length -
1595*722b1667SJung-uk Kim                 sizeof (ACPI_NFIT_SMBIOS);
1596ff879b07SJung-uk Kim 
1597ff879b07SJung-uk Kim             if (Length)
1598ff879b07SJung-uk Kim             {
1599ff879b07SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length,
1600*722b1667SJung-uk Kim                     sizeof (ACPI_NFIT_SMBIOS),
1601ff879b07SJung-uk Kim                     SmbiosInfo,
1602ff879b07SJung-uk Kim                     Length, AcpiDmTableInfoNfit3a);
1603ff879b07SJung-uk Kim                 if (ACPI_FAILURE (Status))
1604ff879b07SJung-uk Kim                 {
1605ff879b07SJung-uk Kim                     return;
1606ff879b07SJung-uk Kim                 }
1607ff879b07SJung-uk Kim             }
1608ff879b07SJung-uk Kim 
1609ff879b07SJung-uk Kim             break;
1610ff879b07SJung-uk Kim 
1611ff879b07SJung-uk Kim         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
1612ff879b07SJung-uk Kim 
1613a009b7dcSJung-uk Kim             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable);
1614ff879b07SJung-uk Kim             for (i = 0; i < Hint->HintCount; i++)
1615ff879b07SJung-uk Kim             {
1616ff879b07SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
1617ff879b07SJung-uk Kim                     &Hint->HintAddress[i],
1618ff879b07SJung-uk Kim                     sizeof (UINT64), AcpiDmTableInfoNfit6a);
1619ff879b07SJung-uk Kim                 if (ACPI_FAILURE (Status))
1620ff879b07SJung-uk Kim                 {
1621ff879b07SJung-uk Kim                     return;
1622ff879b07SJung-uk Kim                 }
1623ff879b07SJung-uk Kim 
1624ff879b07SJung-uk Kim                 FieldOffset += sizeof (UINT64);
1625ff879b07SJung-uk Kim             }
1626ff879b07SJung-uk Kim             break;
1627ff879b07SJung-uk Kim 
1628ff879b07SJung-uk Kim         default:
1629ff879b07SJung-uk Kim             break;
1630ff879b07SJung-uk Kim         }
1631ff879b07SJung-uk Kim 
1632ff879b07SJung-uk Kim NextSubtable:
1633ff879b07SJung-uk Kim         /* Point to next subtable */
1634ff879b07SJung-uk Kim 
1635ff879b07SJung-uk Kim         Offset += Subtable->Length;
1636ff879b07SJung-uk Kim         Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length);
1637ff879b07SJung-uk Kim     }
1638ff879b07SJung-uk Kim }
1639ff879b07SJung-uk Kim 
1640ff879b07SJung-uk Kim 
1641ff879b07SJung-uk Kim /*******************************************************************************
1642ff879b07SJung-uk Kim  *
16431b7a2680SJung-uk Kim  * FUNCTION:    AcpiDmDumpNhlt
16441b7a2680SJung-uk Kim  *
16451b7a2680SJung-uk Kim  * PARAMETERS:  Table               - A NHLT table
16461b7a2680SJung-uk Kim  *
16471b7a2680SJung-uk Kim  * RETURN:      None
16481b7a2680SJung-uk Kim  *
16491b7a2680SJung-uk Kim  * DESCRIPTION: Format the contents of an NHLT.
16501b7a2680SJung-uk Kim  *
16511b7a2680SJung-uk Kim  ******************************************************************************/
16521b7a2680SJung-uk Kim 
16531b7a2680SJung-uk Kim void
16541b7a2680SJung-uk Kim AcpiDmDumpNhlt (
16551b7a2680SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
16561b7a2680SJung-uk Kim {
16571b7a2680SJung-uk Kim     ACPI_STATUS             Status;
16581b7a2680SJung-uk Kim     UINT32                  Offset;
16591b7a2680SJung-uk Kim     UINT32                  TableLength = Table->Length;
16601b7a2680SJung-uk Kim     UINT32                  EndpointCount;
16611b7a2680SJung-uk Kim     UINT8                   FormatsCount;
16621b7a2680SJung-uk Kim     ACPI_NHLT_ENDPOINT      *Subtable;
16631b7a2680SJung-uk Kim     ACPI_NHLT_FORMAT_CONFIG *FormatSubtable;
16641b7a2680SJung-uk Kim     ACPI_TABLE_NHLT         *InfoTable;
16651b7a2680SJung-uk Kim     UINT32                  CapabilitiesSize;
16661b7a2680SJung-uk Kim     UINT32                  i;
16671b7a2680SJung-uk Kim     UINT32                  j;
16681b7a2680SJung-uk Kim     UINT32                  EndpointEndOffset;
16691b7a2680SJung-uk Kim     UINT8                   ConfigType = 0;
16701b7a2680SJung-uk Kim     UINT8                   ArrayType;
1671ab71bbb7SJung-uk Kim     UINT8                   MicrophoneCount;
1672ab71bbb7SJung-uk Kim     ACPI_NHLT_VENDOR_MIC_COUNT          *MicCount;
16731b7a2680SJung-uk Kim     ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A  *DevSpecific;
16741b7a2680SJung-uk Kim     ACPI_NHLT_FORMATS_CONFIG            *FormatsConfig;
1675ab71bbb7SJung-uk Kim     ACPI_NHLT_DEVICE_INFO_COUNT         *Count;
1676ab71bbb7SJung-uk Kim     ACPI_NHLT_DEVICE_INFO               *DeviceInfo;
1677ab71bbb7SJung-uk Kim     ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B  *Capabilities;
16781b7a2680SJung-uk Kim 
16791b7a2680SJung-uk Kim 
16801b7a2680SJung-uk Kim     /* Main table */
16811b7a2680SJung-uk Kim 
16821b7a2680SJung-uk Kim     AcpiOsPrintf ("    /* Main table */\n");
16831b7a2680SJung-uk Kim 
16841b7a2680SJung-uk Kim     Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoNhlt);
16851b7a2680SJung-uk Kim     if (ACPI_FAILURE (Status))
16861b7a2680SJung-uk Kim     {
16871b7a2680SJung-uk Kim         return;
16881b7a2680SJung-uk Kim     }
16891b7a2680SJung-uk Kim 
16901b7a2680SJung-uk Kim     /* Get the Endpoint Descriptor Count */
16911b7a2680SJung-uk Kim 
16921b7a2680SJung-uk Kim     InfoTable = ACPI_ADD_PTR (ACPI_TABLE_NHLT, Table, 0);
16931b7a2680SJung-uk Kim     EndpointCount = InfoTable->EndpointCount;
16941b7a2680SJung-uk Kim 
16951b7a2680SJung-uk Kim     /* Subtables */
16961b7a2680SJung-uk Kim 
16971b7a2680SJung-uk Kim     Offset = sizeof (ACPI_TABLE_NHLT);
16981b7a2680SJung-uk Kim 
16991b7a2680SJung-uk Kim     while (Offset < TableLength)
17001b7a2680SJung-uk Kim     {
17011b7a2680SJung-uk Kim         /* A variable number of Endpoint Descriptors - process each */
17021b7a2680SJung-uk Kim 
17031b7a2680SJung-uk Kim         for (i = 0; i < EndpointCount; i++)
17041b7a2680SJung-uk Kim         {
17051b7a2680SJung-uk Kim             /* Do the Endpoint Descriptor table */
17061b7a2680SJung-uk Kim 
17071b7a2680SJung-uk Kim             Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
1708ab71bbb7SJung-uk Kim 
1709ab71bbb7SJung-uk Kim             /* Check for endpoint descriptor length beyond end-of-table */
1710ab71bbb7SJung-uk Kim 
17111b7a2680SJung-uk Kim             if (Subtable->DescriptorLength > TableLength)
17121b7a2680SJung-uk Kim             {
17131b7a2680SJung-uk Kim                 Offset += 1;
17141b7a2680SJung-uk Kim                 AcpiOsPrintf ("\n    /* Endpoint Descriptor Length larger than"
17151b7a2680SJung-uk Kim                     " table size: %X, table %X, adjusting table offset (+1) */\n",
17161b7a2680SJung-uk Kim                     Subtable->DescriptorLength, TableLength);
17171b7a2680SJung-uk Kim 
17181b7a2680SJung-uk Kim                 Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
17191b7a2680SJung-uk Kim             }
17201b7a2680SJung-uk Kim 
17211b7a2680SJung-uk Kim             AcpiOsPrintf ("\n    /* Endpoint Descriptor #%u */\n", i+1);
17221b7a2680SJung-uk Kim             Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
17231b7a2680SJung-uk Kim                 Subtable->DescriptorLength, AcpiDmTableInfoNhlt0);
17241b7a2680SJung-uk Kim             if (ACPI_FAILURE (Status))
17251b7a2680SJung-uk Kim             {
17261b7a2680SJung-uk Kim                 return;
17271b7a2680SJung-uk Kim             }
1728ab71bbb7SJung-uk Kim 
17291b7a2680SJung-uk Kim             EndpointEndOffset = Subtable->DescriptorLength + Offset;
17301b7a2680SJung-uk Kim 
17311b7a2680SJung-uk Kim             /* Check for endpoint descriptor beyond end-of-table */
17321b7a2680SJung-uk Kim 
17331b7a2680SJung-uk Kim             if (Subtable->DescriptorLength > TableLength)
17341b7a2680SJung-uk Kim             {
17351b7a2680SJung-uk Kim                 AcpiOsPrintf ("\n    /* Endpoint Descriptor Length larger than table size: %X, table %X */\n",
17361b7a2680SJung-uk Kim                     Subtable->DescriptorLength, TableLength);
17371b7a2680SJung-uk Kim             }
1738ab71bbb7SJung-uk Kim 
17391b7a2680SJung-uk Kim             Offset += sizeof (ACPI_NHLT_ENDPOINT);
17401b7a2680SJung-uk Kim             Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
17411b7a2680SJung-uk Kim 
17421b7a2680SJung-uk Kim             /* Do the Device Specific table */
17431b7a2680SJung-uk Kim 
17441b7a2680SJung-uk Kim             AcpiOsPrintf ("\n    /* Endpoint Device_Specific_Config table */\n");
17451b7a2680SJung-uk Kim             DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable);
17461b7a2680SJung-uk Kim             CapabilitiesSize = DevSpecific->CapabilitiesSize;
17471b7a2680SJung-uk Kim             Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
17481b7a2680SJung-uk Kim                 sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b);
17491b7a2680SJung-uk Kim             if (ACPI_FAILURE (Status))
17501b7a2680SJung-uk Kim             {
17511b7a2680SJung-uk Kim                 return;
17521b7a2680SJung-uk Kim             }
1753ab71bbb7SJung-uk Kim 
1754ab71bbb7SJung-uk Kim             ArrayType = 0;
1755ab71bbb7SJung-uk Kim 
1756ab71bbb7SJung-uk Kim             /* Different subtables based upon capabilities_size */
1757ab71bbb7SJung-uk Kim 
1758ab71bbb7SJung-uk Kim             switch (CapabilitiesSize)
1759ab71bbb7SJung-uk Kim             {
1760ab71bbb7SJung-uk Kim             case 0:
17611b7a2680SJung-uk Kim                 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B);
17621b7a2680SJung-uk Kim                 break;
17631b7a2680SJung-uk Kim 
17641b7a2680SJung-uk Kim             case 1:
17651b7a2680SJung-uk Kim                 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
17661b7a2680SJung-uk Kim                     sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C), AcpiDmTableInfoNhlt5c);
17671b7a2680SJung-uk Kim                 if (ACPI_FAILURE (Status))
17681b7a2680SJung-uk Kim                 {
17691b7a2680SJung-uk Kim                     return;
17701b7a2680SJung-uk Kim                 }
17711b7a2680SJung-uk Kim                 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C);
17721b7a2680SJung-uk Kim                 break;
17731b7a2680SJung-uk Kim 
17741b7a2680SJung-uk Kim             case 2:
17751b7a2680SJung-uk Kim                 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
17761b7a2680SJung-uk Kim                     sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt5);
17771b7a2680SJung-uk Kim                 if (ACPI_FAILURE (Status))
17781b7a2680SJung-uk Kim                 {
17791b7a2680SJung-uk Kim                     return;
17801b7a2680SJung-uk Kim                 }
17811b7a2680SJung-uk Kim                 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG);
17821b7a2680SJung-uk Kim                 break;
17831b7a2680SJung-uk Kim 
17841b7a2680SJung-uk Kim             case 3:
1785ab71bbb7SJung-uk Kim             default:
1786ab71bbb7SJung-uk Kim                 /* Extract the ConfigType and ArrayType */
1787ab71bbb7SJung-uk Kim 
17881b7a2680SJung-uk Kim                 ConfigType = DevSpecific->ConfigType;
17891b7a2680SJung-uk Kim                 ArrayType = DevSpecific->ArrayType;
17901b7a2680SJung-uk Kim 
17911b7a2680SJung-uk Kim                 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
17921b7a2680SJung-uk Kim                     sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A), AcpiDmTableInfoNhlt5a);
17931b7a2680SJung-uk Kim                 if (ACPI_FAILURE (Status))
17941b7a2680SJung-uk Kim                 {
17951b7a2680SJung-uk Kim                     return;
17961b7a2680SJung-uk Kim                 }
17971b7a2680SJung-uk Kim 
17981b7a2680SJung-uk Kim                 /* Capabilities Size == 3 */
17991b7a2680SJung-uk Kim                 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A);
1800ab71bbb7SJung-uk Kim                 break;
1801ab71bbb7SJung-uk Kim 
1802ab71bbb7SJung-uk Kim             case 7:
1803ab71bbb7SJung-uk Kim                 ConfigType = DevSpecific->ConfigType;
1804ab71bbb7SJung-uk Kim                 Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
1805ab71bbb7SJung-uk Kim                 DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable);
1806ab71bbb7SJung-uk Kim 
1807ab71bbb7SJung-uk Kim                 AcpiOsPrintf ("\n    /* Render Feedback Device-Specific table */\n");
1808ab71bbb7SJung-uk Kim                 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1809ab71bbb7SJung-uk Kim                     sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt5);
1810ab71bbb7SJung-uk Kim                 if (ACPI_FAILURE (Status))
1811ab71bbb7SJung-uk Kim                 {
1812ab71bbb7SJung-uk Kim                     return;
1813ab71bbb7SJung-uk Kim                 }
1814ab71bbb7SJung-uk Kim 
1815ab71bbb7SJung-uk Kim                 /* Capabilities Size = 7 */
1816ab71bbb7SJung-uk Kim                 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG);
1817ab71bbb7SJung-uk Kim 
1818ab71bbb7SJung-uk Kim                 if (ConfigType == ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK)
1819ab71bbb7SJung-uk Kim                 {
1820ab71bbb7SJung-uk Kim                     Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
1821ab71bbb7SJung-uk Kim                     DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable);
1822ab71bbb7SJung-uk Kim 
1823ab71bbb7SJung-uk Kim                     Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1824ab71bbb7SJung-uk Kim                         sizeof (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt6b);
1825ab71bbb7SJung-uk Kim                     if (ACPI_FAILURE (Status))
1826ab71bbb7SJung-uk Kim                     {
1827ab71bbb7SJung-uk Kim                         return;
1828ab71bbb7SJung-uk Kim                     }
1829ab71bbb7SJung-uk Kim                     Offset += sizeof (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG);
1830ab71bbb7SJung-uk Kim                 }
1831ab71bbb7SJung-uk Kim                 break;
1832ab71bbb7SJung-uk Kim            }
18331b7a2680SJung-uk Kim 
18341b7a2680SJung-uk Kim             /* Check for a vendor-defined mic array */
18351b7a2680SJung-uk Kim 
1836ab71bbb7SJung-uk Kim             if (ConfigType == ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY)
18371b7a2680SJung-uk Kim             {
1838ab71bbb7SJung-uk Kim                 if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_MASK) == ACPI_NHLT_VENDOR_DEFINED)
1839ab71bbb7SJung-uk Kim                 {
1840ab71bbb7SJung-uk Kim                     /* Vendor-defined microphone array; get the microphone count first */
18411b7a2680SJung-uk Kim 
1842ab71bbb7SJung-uk Kim                     AcpiOsPrintf ("\n    /* Vendor-defined microphone count */\n");
1843ab71bbb7SJung-uk Kim                     MicCount = ACPI_ADD_PTR (ACPI_NHLT_VENDOR_MIC_COUNT, Table, Offset);
1844ab71bbb7SJung-uk Kim                     MicrophoneCount = MicCount->MicrophoneCount;
1845ab71bbb7SJung-uk Kim 
1846ab71bbb7SJung-uk Kim                     Status = AcpiDmDumpTable (TableLength, Offset, MicCount,
1847ab71bbb7SJung-uk Kim                         sizeof (ACPI_NHLT_VENDOR_MIC_COUNT), AcpiDmTableInfoNhlt6a);
1848ab71bbb7SJung-uk Kim                     Offset += sizeof (ACPI_NHLT_VENDOR_MIC_COUNT);
1849ab71bbb7SJung-uk Kim                     if (ACPI_FAILURE (Status))
1850ab71bbb7SJung-uk Kim                     {
1851ab71bbb7SJung-uk Kim                         return;
1852ab71bbb7SJung-uk Kim                     }
1853ab71bbb7SJung-uk Kim 
1854ab71bbb7SJung-uk Kim                     /* Get the vendor microphone config structure(s) */
1855ab71bbb7SJung-uk Kim 
1856ab71bbb7SJung-uk Kim                     for (j = 0; j < MicrophoneCount; j++)
1857ab71bbb7SJung-uk Kim                     {
1858ab71bbb7SJung-uk Kim                         AcpiOsPrintf ("\n    /* Vendor-defined microphone array #%u*/\n", j+1);
1859ab71bbb7SJung-uk Kim                         DevSpecific = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Table, Offset);
18601b7a2680SJung-uk Kim 
18611b7a2680SJung-uk Kim                         Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
18621b7a2680SJung-uk Kim                             sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG), AcpiDmTableInfoNhlt6);
18631b7a2680SJung-uk Kim                         if (ACPI_FAILURE (Status))
18641b7a2680SJung-uk Kim                         {
18651b7a2680SJung-uk Kim                             return;
18661b7a2680SJung-uk Kim                         }
1867ab71bbb7SJung-uk Kim 
18681b7a2680SJung-uk Kim                         Offset += sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG);
18691b7a2680SJung-uk Kim                     }
18701b7a2680SJung-uk Kim 
1871ab71bbb7SJung-uk Kim                     /* Check for Microphone SNR and sensitivity extension */
1872ab71bbb7SJung-uk Kim 
1873ab71bbb7SJung-uk Kim                     if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_EXT_MASK) == ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT)
1874ab71bbb7SJung-uk Kim                     {
1875ab71bbb7SJung-uk Kim                         AcpiOsPrintf ("\n    /* Microphone SNR and sensitivity array */\n");
1876ab71bbb7SJung-uk Kim                         DevSpecific = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Table, Offset);
1877ab71bbb7SJung-uk Kim 
18781b7a2680SJung-uk Kim                         Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1879ab71bbb7SJung-uk Kim                             sizeof (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION), AcpiDmTableInfoNhlt9);
18801b7a2680SJung-uk Kim                         if (ACPI_FAILURE (Status))
18811b7a2680SJung-uk Kim                         {
18821b7a2680SJung-uk Kim                             return;
18831b7a2680SJung-uk Kim                         }
18841b7a2680SJung-uk Kim 
1885ab71bbb7SJung-uk Kim                         Offset += sizeof (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION);
18861b7a2680SJung-uk Kim                     }
1887ab71bbb7SJung-uk Kim                 }
18881b7a2680SJung-uk Kim             }
18891b7a2680SJung-uk Kim 
1890ab71bbb7SJung-uk Kim             /* Do the Formats_Config table - starts with the FormatsCount field */
18911b7a2680SJung-uk Kim 
18921b7a2680SJung-uk Kim             FormatsConfig = ACPI_ADD_PTR (ACPI_NHLT_FORMATS_CONFIG, Table, Offset);
18931b7a2680SJung-uk Kim             FormatsCount = FormatsConfig->FormatsCount;
18941b7a2680SJung-uk Kim 
18951b7a2680SJung-uk Kim             AcpiOsPrintf ("\n    /* Formats_Config table */\n");
18961b7a2680SJung-uk Kim 
1897ab71bbb7SJung-uk Kim             /* Dump the FormatsCount value */
1898ab71bbb7SJung-uk Kim 
1899ab71bbb7SJung-uk Kim             if (FormatsCount > 0)
1900ab71bbb7SJung-uk Kim             {
19011b7a2680SJung-uk Kim                 Status = AcpiDmDumpTable (TableLength, Offset, FormatsConfig,
19021b7a2680SJung-uk Kim                     sizeof (ACPI_NHLT_FORMATS_CONFIG), AcpiDmTableInfoNhlt4);
19031b7a2680SJung-uk Kim                 if (ACPI_FAILURE (Status))
19041b7a2680SJung-uk Kim                 {
19051b7a2680SJung-uk Kim                     return;
19061b7a2680SJung-uk Kim                 }
1907ab71bbb7SJung-uk Kim             }
19081b7a2680SJung-uk Kim             Offset += sizeof (ACPI_NHLT_FORMATS_CONFIG);
19091b7a2680SJung-uk Kim 
19101b7a2680SJung-uk Kim             /* A variable number of Format_Config Descriptors - process each */
19111b7a2680SJung-uk Kim 
19121b7a2680SJung-uk Kim             for (j = 0; j < FormatsCount; j++)
19131b7a2680SJung-uk Kim             {
19141b7a2680SJung-uk Kim                 FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset);
19151b7a2680SJung-uk Kim                 CapabilitiesSize = FormatSubtable->CapabilitySize;
19161b7a2680SJung-uk Kim 
19171b7a2680SJung-uk Kim                 /* Do the Wave_extensible struct */
19181b7a2680SJung-uk Kim 
19191b7a2680SJung-uk Kim                 AcpiOsPrintf ("\n    /* Wave_Format_Extensible table #%u */\n", j+1);
19201b7a2680SJung-uk Kim                 Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable,
19211b7a2680SJung-uk Kim                     sizeof (ACPI_NHLT_FORMAT_CONFIG), AcpiDmTableInfoNhlt3);
19221b7a2680SJung-uk Kim                 if (ACPI_FAILURE (Status))
19231b7a2680SJung-uk Kim                 {
19241b7a2680SJung-uk Kim                     return;
19251b7a2680SJung-uk Kim                 }
19261b7a2680SJung-uk Kim 
1927ab71bbb7SJung-uk Kim                 Offset += sizeof (ACPI_NHLT_FORMAT_CONFIG);
19281b7a2680SJung-uk Kim 
1929ab71bbb7SJung-uk Kim                 if (CapabilitiesSize > 0)
1930ab71bbb7SJung-uk Kim                 {
1931ab71bbb7SJung-uk Kim                     UINT8* CapabilitiesBuf = ACPI_ADD_PTR (UINT8, Table, Offset);
1932ab71bbb7SJung-uk Kim                     /* Do the Capabilities array (of bytes) */
1933ab71bbb7SJung-uk Kim 
19341b7a2680SJung-uk Kim                     AcpiOsPrintf ("\n    /* Specific_Config table #%u */\n", j+1);
1935ab71bbb7SJung-uk Kim 
1936ab71bbb7SJung-uk Kim                     Status = AcpiDmDumpTable (TableLength, Offset, CapabilitiesBuf,
19371b7a2680SJung-uk Kim                         CapabilitiesSize, AcpiDmTableInfoNhlt3a);
19381b7a2680SJung-uk Kim                     if (ACPI_FAILURE (Status))
19391b7a2680SJung-uk Kim                     {
19401b7a2680SJung-uk Kim                         return;
19411b7a2680SJung-uk Kim                     }
1942ab71bbb7SJung-uk Kim 
1943ab71bbb7SJung-uk Kim                     Offset += CapabilitiesSize; /* + sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B); */
19441b7a2680SJung-uk Kim                 }
19451b7a2680SJung-uk Kim 
1946ab71bbb7SJung-uk Kim             } /* for (j = 0; j < FormatsCount; j++) */
1947ab71bbb7SJung-uk Kim 
19481b7a2680SJung-uk Kim             /*
1949ab71bbb7SJung-uk Kim              * If we are not done with the current Endpoint yet, then there must be
1950ab71bbb7SJung-uk Kim              * some non documented structure(s) yet to be processed. First, get
1951ab71bbb7SJung-uk Kim              * the count of such structure(s).
19521b7a2680SJung-uk Kim              */
19531b7a2680SJung-uk Kim             if (Offset < EndpointEndOffset)
19541b7a2680SJung-uk Kim             {
1955ab71bbb7SJung-uk Kim                 AcpiOsPrintf ("\n    /* Structures that are not part of NHLT spec */\n");
1956ab71bbb7SJung-uk Kim                 Count = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_INFO_COUNT, Table, Offset);
19571b7a2680SJung-uk Kim                 Status = AcpiDmDumpTable (TableLength, Offset, Count,
1958ab71bbb7SJung-uk Kim                     sizeof (ACPI_NHLT_DEVICE_INFO_COUNT), AcpiDmTableInfoNhlt7);
19591b7a2680SJung-uk Kim                 if (ACPI_FAILURE (Status))
19601b7a2680SJung-uk Kim                 {
19611b7a2680SJung-uk Kim                     return;
19621b7a2680SJung-uk Kim                 }
1963ab71bbb7SJung-uk Kim                 Offset += sizeof (ACPI_NHLT_DEVICE_INFO_COUNT);
19641b7a2680SJung-uk Kim 
1965ab71bbb7SJung-uk Kim                 /* Variable number of device structures */
19661b7a2680SJung-uk Kim 
1967ab71bbb7SJung-uk Kim                 for (j = 0; j < Count->StructureCount; j++)
19681b7a2680SJung-uk Kim                 {
1969ab71bbb7SJung-uk Kim                     DeviceInfo = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_INFO, Table, Offset);
1970ab71bbb7SJung-uk Kim                     AcpiOsPrintf ("\n    /* Device Info structure #%u (not part of NHLT spec) */\n", j+1);
19711b7a2680SJung-uk Kim 
1972ab71bbb7SJung-uk Kim                     /*
1973ab71bbb7SJung-uk Kim                      * Dump the following Device Info fields:
1974ab71bbb7SJung-uk Kim                      *  1) Device ID
1975ab71bbb7SJung-uk Kim                      *  2) Device Instance ID
1976ab71bbb7SJung-uk Kim                      *  3) Device Port ID
1977ab71bbb7SJung-uk Kim                      */
1978ab71bbb7SJung-uk Kim                     Status = AcpiDmDumpTable (TableLength, Offset, DeviceInfo,
1979ab71bbb7SJung-uk Kim                         sizeof (ACPI_NHLT_DEVICE_INFO), AcpiDmTableInfoNhlt7a);
19801b7a2680SJung-uk Kim                     if (ACPI_FAILURE (Status))
19811b7a2680SJung-uk Kim                     {
19821b7a2680SJung-uk Kim                         return;
19831b7a2680SJung-uk Kim                     }
19841b7a2680SJung-uk Kim 
1985ab71bbb7SJung-uk Kim                     Offset += sizeof (ACPI_NHLT_DEVICE_INFO);
19861b7a2680SJung-uk Kim                 }
19871b7a2680SJung-uk Kim 
1988ab71bbb7SJung-uk Kim                 /*
1989ab71bbb7SJung-uk Kim                  * Check that the current offset is not beyond the end of
1990ab71bbb7SJung-uk Kim                  * this endpoint descriptor. If it is not, print those
1991ab71bbb7SJung-uk Kim                  * undocumented bytes.
1992ab71bbb7SJung-uk Kim                  */
19931b7a2680SJung-uk Kim                 if (Offset < EndpointEndOffset)
19941b7a2680SJung-uk Kim                 {
1995ab71bbb7SJung-uk Kim                     /* Unknown data at the end of the Endpoint */
1996ab71bbb7SJung-uk Kim                     UINT32 size = EndpointEndOffset - Offset;
1997ab71bbb7SJung-uk Kim                     UINT8* buffer = ACPI_ADD_PTR (UINT8, Table, Offset);
1998ab71bbb7SJung-uk Kim                     AcpiOsPrintf ("\n    /* Unknown data at the end of the Endpoint, size: %X */\n", size);
1999ab71bbb7SJung-uk Kim                     Status = AcpiDmDumpTable (TableLength, Offset, buffer,
2000ab71bbb7SJung-uk Kim                         size, AcpiDmTableInfoNhlt7b);
20011b7a2680SJung-uk Kim                     Offset = EndpointEndOffset;
20021b7a2680SJung-uk Kim                 }
2003ab71bbb7SJung-uk Kim 
2004ab71bbb7SJung-uk Kim                 /* Should be at the end of the Endpoint structure. */
20051b7a2680SJung-uk Kim             }
20061b7a2680SJung-uk Kim 
2007ab71bbb7SJung-uk Kim         } /* for (i = 0; i < EndpointCount; i++) */
20081b7a2680SJung-uk Kim 
2009ab71bbb7SJung-uk Kim 
2010ab71bbb7SJung-uk Kim         /*
2011ab71bbb7SJung-uk Kim          * Done with all of the Endpoint Descriptors, Emit the table terminator
2012ab71bbb7SJung-uk Kim          * (if such a legacy structure is present -- not in NHLT specification)
2013ab71bbb7SJung-uk Kim          */
2014ab71bbb7SJung-uk Kim         if (Offset < TableLength)
20151b7a2680SJung-uk Kim         {
2016ab71bbb7SJung-uk Kim             Capabilities = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B, Table, Offset);
2017ab71bbb7SJung-uk Kim             AcpiOsPrintf ("\n/* Terminating specific config (not part of NHLT spec) */\n");
20181b7a2680SJung-uk Kim 
2019ab71bbb7SJung-uk Kim             Status = AcpiDmDumpTable (TableLength, Offset, Capabilities,
2020ab71bbb7SJung-uk Kim                 sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b);
20211b7a2680SJung-uk Kim             if (ACPI_FAILURE (Status))
20221b7a2680SJung-uk Kim             {
20231b7a2680SJung-uk Kim                 return;
20241b7a2680SJung-uk Kim             }
2025ab71bbb7SJung-uk Kim             Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B);
2026ab71bbb7SJung-uk Kim 
2027ab71bbb7SJung-uk Kim             if (Capabilities->CapabilitiesSize > 0)
2028ab71bbb7SJung-uk Kim             {
2029ab71bbb7SJung-uk Kim                 UINT32 remainingBytes = TableLength - Offset;
2030ab71bbb7SJung-uk Kim                 UINT8* buffer = ACPI_ADD_PTR (UINT8, Table, Offset);
2031ab71bbb7SJung-uk Kim 
2032ab71bbb7SJung-uk Kim                 if (remainingBytes != Capabilities->CapabilitiesSize)
2033ab71bbb7SJung-uk Kim                     AcpiOsPrintf ("\n/* Incorrect config size, should be %X, is %X */\n",
2034ab71bbb7SJung-uk Kim                         Capabilities->CapabilitiesSize, remainingBytes);
2035ab71bbb7SJung-uk Kim                 Status = AcpiDmDumpTable (TableLength, Offset, buffer,
2036ab71bbb7SJung-uk Kim                         remainingBytes, AcpiDmTableInfoNhlt3a);
2037ab71bbb7SJung-uk Kim             }
20381b7a2680SJung-uk Kim         }
20391b7a2680SJung-uk Kim 
20401b7a2680SJung-uk Kim         return;
20411b7a2680SJung-uk Kim     }
20421b7a2680SJung-uk Kim }
20431b7a2680SJung-uk Kim 
20441b7a2680SJung-uk Kim 
20451b7a2680SJung-uk Kim /*******************************************************************************
20461b7a2680SJung-uk Kim  *
2047ff879b07SJung-uk Kim  * FUNCTION:    AcpiDmDumpPcct
2048ff879b07SJung-uk Kim  *
2049ff879b07SJung-uk Kim  * PARAMETERS:  Table               - A PCCT table
2050ff879b07SJung-uk Kim  *
2051ff879b07SJung-uk Kim  * RETURN:      None
2052ff879b07SJung-uk Kim  *
2053ff879b07SJung-uk Kim  * DESCRIPTION: Format the contents of a PCCT. This table type consists
2054ff879b07SJung-uk Kim  *              of an open-ended number of subtables.
2055ff879b07SJung-uk Kim  *
2056ff879b07SJung-uk Kim  ******************************************************************************/
2057ff879b07SJung-uk Kim 
2058ff879b07SJung-uk Kim void
2059ff879b07SJung-uk Kim AcpiDmDumpPcct (
2060ff879b07SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
2061ff879b07SJung-uk Kim {
2062ff879b07SJung-uk Kim     ACPI_STATUS             Status;
2063ff879b07SJung-uk Kim     ACPI_PCCT_SUBSPACE      *Subtable;
2064ff879b07SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
2065ff879b07SJung-uk Kim     UINT32                  Length = Table->Length;
2066ff879b07SJung-uk Kim     UINT32                  Offset = sizeof (ACPI_TABLE_PCCT);
2067ff879b07SJung-uk Kim 
2068ff879b07SJung-uk Kim 
2069ff879b07SJung-uk Kim     /* Main table */
2070ff879b07SJung-uk Kim 
2071ff879b07SJung-uk Kim     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
2072ff879b07SJung-uk Kim     if (ACPI_FAILURE (Status))
2073ff879b07SJung-uk Kim     {
2074ff879b07SJung-uk Kim         return;
2075ff879b07SJung-uk Kim     }
2076ff879b07SJung-uk Kim 
2077ff879b07SJung-uk Kim     /* Subtables */
2078ff879b07SJung-uk Kim 
2079ff879b07SJung-uk Kim     Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
2080ff879b07SJung-uk Kim     while (Offset < Table->Length)
2081ff879b07SJung-uk Kim     {
2082ff879b07SJung-uk Kim         /* Common subtable header */
2083ff879b07SJung-uk Kim 
2084ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
2085ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Length, Offset, Subtable,
2086ff879b07SJung-uk Kim             Subtable->Header.Length, AcpiDmTableInfoPcctHdr);
2087ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
2088ff879b07SJung-uk Kim         {
2089ff879b07SJung-uk Kim             return;
2090ff879b07SJung-uk Kim         }
2091ff879b07SJung-uk Kim 
2092ff879b07SJung-uk Kim         switch (Subtable->Header.Type)
2093ff879b07SJung-uk Kim         {
2094ff879b07SJung-uk Kim         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
2095ff879b07SJung-uk Kim 
2096ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct0;
2097ff879b07SJung-uk Kim             break;
2098ff879b07SJung-uk Kim 
2099ff879b07SJung-uk Kim         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
2100ff879b07SJung-uk Kim 
2101ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct1;
2102ff879b07SJung-uk Kim             break;
2103ff879b07SJung-uk Kim 
2104ff879b07SJung-uk Kim         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
2105ff879b07SJung-uk Kim 
2106ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct2;
2107ff879b07SJung-uk Kim             break;
2108ff879b07SJung-uk Kim 
2109ff879b07SJung-uk Kim         case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
2110ff879b07SJung-uk Kim 
2111ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct3;
2112ff879b07SJung-uk Kim             break;
2113ff879b07SJung-uk Kim 
2114ff879b07SJung-uk Kim         case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
2115ff879b07SJung-uk Kim 
2116ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct4;
2117ff879b07SJung-uk Kim             break;
2118ff879b07SJung-uk Kim 
2119cfd1ed46SJung-uk Kim         case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
2120cfd1ed46SJung-uk Kim 
2121cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoPcct5;
2122cfd1ed46SJung-uk Kim             break;
2123cfd1ed46SJung-uk Kim 
2124ff879b07SJung-uk Kim         default:
2125ff879b07SJung-uk Kim 
2126ff879b07SJung-uk Kim             AcpiOsPrintf (
2127ff879b07SJung-uk Kim                 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
2128ff879b07SJung-uk Kim                 Subtable->Header.Type);
2129ff879b07SJung-uk Kim             return;
2130ff879b07SJung-uk Kim         }
2131ff879b07SJung-uk Kim 
2132ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
2133ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Length, Offset, Subtable,
2134ff879b07SJung-uk Kim             Subtable->Header.Length, InfoTable);
2135ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
2136ff879b07SJung-uk Kim         {
2137ff879b07SJung-uk Kim             return;
2138ff879b07SJung-uk Kim         }
2139ff879b07SJung-uk Kim 
2140ff879b07SJung-uk Kim         /* Point to next subtable */
2141ff879b07SJung-uk Kim 
2142ff879b07SJung-uk Kim         Offset += Subtable->Header.Length;
2143ff879b07SJung-uk Kim         Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Subtable,
2144ff879b07SJung-uk Kim             Subtable->Header.Length);
2145ff879b07SJung-uk Kim     }
2146ff879b07SJung-uk Kim }
2147ff879b07SJung-uk Kim 
2148ff879b07SJung-uk Kim 
2149ff879b07SJung-uk Kim /*******************************************************************************
2150ff879b07SJung-uk Kim  *
2151ff879b07SJung-uk Kim  * FUNCTION:    AcpiDmDumpPdtt
2152ff879b07SJung-uk Kim  *
2153ff879b07SJung-uk Kim  * PARAMETERS:  Table               - A PDTT table
2154ff879b07SJung-uk Kim  *
2155ff879b07SJung-uk Kim  * RETURN:      None
2156ff879b07SJung-uk Kim  *
2157ff879b07SJung-uk Kim  * DESCRIPTION: Format the contents of a Pdtt. This is a variable-length
2158ff879b07SJung-uk Kim  *              table that contains an open-ended number of IDs
2159ff879b07SJung-uk Kim  *              at the end of the table.
2160ff879b07SJung-uk Kim  *
2161ff879b07SJung-uk Kim  ******************************************************************************/
2162ff879b07SJung-uk Kim 
2163ff879b07SJung-uk Kim void
2164ff879b07SJung-uk Kim AcpiDmDumpPdtt (
2165ff879b07SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
2166ff879b07SJung-uk Kim {
2167ff879b07SJung-uk Kim     ACPI_STATUS             Status;
2168ff879b07SJung-uk Kim     ACPI_PDTT_CHANNEL       *Subtable;
2169ff879b07SJung-uk Kim     UINT32                  Length = Table->Length;
2170ff879b07SJung-uk Kim     UINT32                  Offset = sizeof (ACPI_TABLE_PDTT);
2171ff879b07SJung-uk Kim 
2172ff879b07SJung-uk Kim 
2173ff879b07SJung-uk Kim     /* Main table */
2174ff879b07SJung-uk Kim 
2175ff879b07SJung-uk Kim     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt);
2176ff879b07SJung-uk Kim     if (ACPI_FAILURE (Status))
2177ff879b07SJung-uk Kim     {
2178ff879b07SJung-uk Kim         return;
2179ff879b07SJung-uk Kim     }
2180ff879b07SJung-uk Kim 
2181ff879b07SJung-uk Kim     /* Subtables. Currently there is only one type, but can be multiples */
2182ff879b07SJung-uk Kim 
2183ff879b07SJung-uk Kim     Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset);
2184ff879b07SJung-uk Kim     while (Offset < Table->Length)
2185ff879b07SJung-uk Kim     {
2186ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
2187ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Length, Offset, Subtable,
2188ff879b07SJung-uk Kim             sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0);
2189ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
2190ff879b07SJung-uk Kim         {
2191ff879b07SJung-uk Kim             return;
2192ff879b07SJung-uk Kim         }
2193ff879b07SJung-uk Kim 
2194ff879b07SJung-uk Kim         /* Point to next subtable */
2195ff879b07SJung-uk Kim 
2196ff879b07SJung-uk Kim         Offset += sizeof (ACPI_PDTT_CHANNEL);
2197ff879b07SJung-uk Kim         Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Subtable,
2198ff879b07SJung-uk Kim             sizeof (ACPI_PDTT_CHANNEL));
2199ff879b07SJung-uk Kim     }
2200ff879b07SJung-uk Kim }
2201ff879b07SJung-uk Kim 
2202ff879b07SJung-uk Kim 
2203ff879b07SJung-uk Kim /*******************************************************************************
2204ff879b07SJung-uk Kim  *
2205cfd1ed46SJung-uk Kim  * FUNCTION:    AcpiDmDumpPhat
2206cfd1ed46SJung-uk Kim  *
2207cfd1ed46SJung-uk Kim  * PARAMETERS:  Table               - A PHAT table
2208cfd1ed46SJung-uk Kim  *
2209cfd1ed46SJung-uk Kim  * RETURN:      None
2210cfd1ed46SJung-uk Kim  *
2211cfd1ed46SJung-uk Kim  * DESCRIPTION: Format the contents of a PHAT.
2212cfd1ed46SJung-uk Kim  *
2213cfd1ed46SJung-uk Kim  ******************************************************************************/
2214cfd1ed46SJung-uk Kim 
2215cfd1ed46SJung-uk Kim void
2216cfd1ed46SJung-uk Kim AcpiDmDumpPhat (
2217cfd1ed46SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
2218cfd1ed46SJung-uk Kim {
2219cfd1ed46SJung-uk Kim     ACPI_STATUS             Status;
2220cfd1ed46SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
2221cfd1ed46SJung-uk Kim     ACPI_PHAT_HEADER        *Subtable;
2222cfd1ed46SJung-uk Kim     ACPI_PHAT_VERSION_DATA  *VersionData;
2223cfd1ed46SJung-uk Kim     UINT32                  RecordCount;
2224cfd1ed46SJung-uk Kim     UINT32                  Length = Table->Length;
2225cfd1ed46SJung-uk Kim     UINT32                  Offset = sizeof (ACPI_TABLE_PHAT);
22269a4bc520SJung-uk Kim     UINT32                  OriginalOffset;
2227cfd1ed46SJung-uk Kim     UINT32                  SubtableLength;
2228cfd1ed46SJung-uk Kim     UINT32                  PathLength;
2229cfd1ed46SJung-uk Kim     UINT32                  VendorLength;
22309a4bc520SJung-uk Kim     UINT16                  RecordType;
22319a4bc520SJung-uk Kim     const wchar_t           *WideString;
2232cfd1ed46SJung-uk Kim 
2233cfd1ed46SJung-uk Kim 
2234cfd1ed46SJung-uk Kim     Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT));
2235cfd1ed46SJung-uk Kim 
2236cfd1ed46SJung-uk Kim     while (Offset < Table->Length)
2237cfd1ed46SJung-uk Kim     {
2238cfd1ed46SJung-uk Kim         /* Common subtable header */
2239cfd1ed46SJung-uk Kim 
2240cfd1ed46SJung-uk Kim         AcpiOsPrintf ("\n");
22419a4bc520SJung-uk Kim         Status = AcpiDmDumpTable (Length, Offset, Subtable,
2242cfd1ed46SJung-uk Kim             sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr);
2243cfd1ed46SJung-uk Kim         if (ACPI_FAILURE (Status))
2244cfd1ed46SJung-uk Kim         {
2245cfd1ed46SJung-uk Kim             return;
2246cfd1ed46SJung-uk Kim         }
2247cfd1ed46SJung-uk Kim 
22489a4bc520SJung-uk Kim         DbgPrint (ASL_DEBUG_OUTPUT, "\n/* %u, Subtable->Type %X */\n",
22499a4bc520SJung-uk Kim             __LINE__, Subtable->Type);
22509a4bc520SJung-uk Kim 
2251cfd1ed46SJung-uk Kim         switch (Subtable->Type)
2252cfd1ed46SJung-uk Kim         {
2253cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
2254cfd1ed46SJung-uk Kim 
2255cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoPhat0;
22569a4bc520SJung-uk Kim             SubtableLength = Offset += sizeof (ACPI_PHAT_VERSION_DATA);
2257cfd1ed46SJung-uk Kim             break;
2258cfd1ed46SJung-uk Kim 
2259cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
2260cfd1ed46SJung-uk Kim 
2261cfd1ed46SJung-uk Kim             InfoTable = AcpiDmTableInfoPhat1;
22629a4bc520SJung-uk Kim             SubtableLength = Offset += sizeof (ACPI_PHAT_TYPE_FW_HEALTH_DATA);
2263cfd1ed46SJung-uk Kim             break;
2264cfd1ed46SJung-uk Kim 
2265cfd1ed46SJung-uk Kim         default:
2266cfd1ed46SJung-uk Kim 
22679a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "\n**** Unknown PHAT subtable type 0x%X\n\n",
2268cfd1ed46SJung-uk Kim                 Subtable->Type);
2269cfd1ed46SJung-uk Kim 
2270cfd1ed46SJung-uk Kim             return;
2271cfd1ed46SJung-uk Kim         }
2272cfd1ed46SJung-uk Kim 
22739a4bc520SJung-uk Kim         Status = AcpiDmDumpTable (Length, SubtableLength, Subtable,
2274cfd1ed46SJung-uk Kim             SubtableLength, InfoTable);
2275cfd1ed46SJung-uk Kim         if (ACPI_FAILURE (Status))
2276cfd1ed46SJung-uk Kim         {
2277cfd1ed46SJung-uk Kim             return;
2278cfd1ed46SJung-uk Kim         }
2279cfd1ed46SJung-uk Kim 
22809a4bc520SJung-uk Kim         OriginalOffset = Offset;
2281cfd1ed46SJung-uk Kim         switch (Subtable->Type)
2282cfd1ed46SJung-uk Kim         {
2283cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
2284cfd1ed46SJung-uk Kim 
2285cfd1ed46SJung-uk Kim             VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable);
2286cfd1ed46SJung-uk Kim             RecordCount = VersionData->ElementCount;
22879a4bc520SJung-uk Kim             RecordType = *ACPI_CAST_PTR (UINT8, Subtable);
22889a4bc520SJung-uk Kim 
22899a4bc520SJung-uk Kim             /*
22909a4bc520SJung-uk Kim              * Skip past a zero-valued block (not part of the ACPI PHAT specification).
22919a4bc520SJung-uk Kim              * First, check for a zero length record and a zero element count
22929a4bc520SJung-uk Kim              */
22939a4bc520SJung-uk Kim             if (!VersionData->Header.Length && !VersionData->ElementCount)
2294cfd1ed46SJung-uk Kim             {
22959a4bc520SJung-uk Kim                 while (RecordType == 0)
22969a4bc520SJung-uk Kim                 {
22979a4bc520SJung-uk Kim                     Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset);
22989a4bc520SJung-uk Kim                     RecordType = *ACPI_CAST_PTR (UINT8, Subtable);
22999a4bc520SJung-uk Kim                     RecordCount = VersionData->ElementCount;
23009a4bc520SJung-uk Kim                     Offset += 1;
23019a4bc520SJung-uk Kim                 }
23029a4bc520SJung-uk Kim 
23039a4bc520SJung-uk Kim                 Offset -= 1;
23049a4bc520SJung-uk Kim                 AcpiOsPrintf ("\n/* Warning: Block of zeros found above starting at Offset %X Length %X */\n"
23059a4bc520SJung-uk Kim                     "/* (not compliant to PHAT specification -- ignoring block) */\n",
23069a4bc520SJung-uk Kim                     OriginalOffset - 12, Offset - OriginalOffset + 12);
23079a4bc520SJung-uk Kim             }
23089a4bc520SJung-uk Kim 
23099a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, RecordCount: %X, Offset %X, SubtableLength %X */\n",
23109a4bc520SJung-uk Kim                 __LINE__, RecordCount, Offset, SubtableLength);
23119a4bc520SJung-uk Kim 
23129a4bc520SJung-uk Kim             /* Emit each of the version elements */
23139a4bc520SJung-uk Kim 
23149a4bc520SJung-uk Kim             while (RecordCount && VersionData->Header.Length)
23159a4bc520SJung-uk Kim             {
23169a4bc520SJung-uk Kim                 AcpiOsPrintf ("\n/* Version Element #%Xh Offset %Xh */\n\n",
23179a4bc520SJung-uk Kim                     VersionData->ElementCount - RecordCount + 1, Offset);
23189a4bc520SJung-uk Kim 
23199a4bc520SJung-uk Kim                 Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset);
23209a4bc520SJung-uk Kim                 Status = AcpiDmDumpTable (Length, Offset, Subtable,
2321cfd1ed46SJung-uk Kim                     sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a);
2322cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
2323cfd1ed46SJung-uk Kim                 {
2324cfd1ed46SJung-uk Kim                     return;
2325cfd1ed46SJung-uk Kim                 }
2326cfd1ed46SJung-uk Kim 
23279a4bc520SJung-uk Kim                 Offset += sizeof (ACPI_PHAT_VERSION_ELEMENT);
2328cfd1ed46SJung-uk Kim                 RecordCount--;
2329cfd1ed46SJung-uk Kim             }
2330cfd1ed46SJung-uk Kim 
2331cfd1ed46SJung-uk Kim             break;
2332cfd1ed46SJung-uk Kim 
2333cfd1ed46SJung-uk Kim         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
2334cfd1ed46SJung-uk Kim 
23359a4bc520SJung-uk Kim             /*
23369a4bc520SJung-uk Kim              * Get the length of the Device Path (UEFI wide string).
23379a4bc520SJung-uk Kim              * Include the wide null terminator (+2),
23389a4bc520SJung-uk Kim              */
23399a4bc520SJung-uk Kim             WideString = ACPI_ADD_PTR (wchar_t, Subtable,
23409a4bc520SJung-uk Kim                 sizeof (ACPI_PHAT_HEALTH_DATA));
2341cfd1ed46SJung-uk Kim 
23429a4bc520SJung-uk Kim             PathLength = (wcslen (WideString) * 2) + 2;
23439a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, PathLength %X, Offset %X, Table->Length %X */\n",
23449a4bc520SJung-uk Kim                 __LINE__, PathLength, Offset, Length);
23459a4bc520SJung-uk Kim 
2346cfd1ed46SJung-uk Kim             Status = AcpiDmDumpTable (Length, Offset,
2347cfd1ed46SJung-uk Kim                 ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)),
2348cfd1ed46SJung-uk Kim                 PathLength, AcpiDmTableInfoPhat1a);
23499a4bc520SJung-uk Kim             Offset += PathLength;
2350cfd1ed46SJung-uk Kim             if (ACPI_FAILURE (Status))
2351cfd1ed46SJung-uk Kim             {
2352cfd1ed46SJung-uk Kim                 return;
2353cfd1ed46SJung-uk Kim             }
2354cfd1ed46SJung-uk Kim 
23559a4bc520SJung-uk Kim             /* Get Device-Specific Data - length of which is the remaining subtable length. */
2356cfd1ed46SJung-uk Kim 
2357cfd1ed46SJung-uk Kim             VendorLength =
2358cfd1ed46SJung-uk Kim                 Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength;
23599a4bc520SJung-uk Kim             DbgPrint (ASL_DEBUG_OUTPUT, "%u, Subtable->Length %X, VendorLength %X, Offset %X PathLength: %X\n",
23609a4bc520SJung-uk Kim                 __LINE__, Subtable->Length, VendorLength, Offset, PathLength);
23619a4bc520SJung-uk Kim 
23629a4bc520SJung-uk Kim             if (VendorLength)
23639a4bc520SJung-uk Kim             {
23649a4bc520SJung-uk Kim                 /* Point past the Device Path, Compile the Device-Specific Data */
23659a4bc520SJung-uk Kim 
23669a4bc520SJung-uk Kim                 Status = AcpiDmDumpTable (Length, Offset,
2367cfd1ed46SJung-uk Kim                     ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength),
2368cfd1ed46SJung-uk Kim                     VendorLength, AcpiDmTableInfoPhat1b);
2369cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
2370cfd1ed46SJung-uk Kim                 {
2371cfd1ed46SJung-uk Kim                     return;
2372cfd1ed46SJung-uk Kim                 }
23739a4bc520SJung-uk Kim 
23749a4bc520SJung-uk Kim                 Offset += VendorLength;
23759a4bc520SJung-uk Kim             }
23769a4bc520SJung-uk Kim 
23779a4bc520SJung-uk Kim             if (ACPI_FAILURE (Status))
23789a4bc520SJung-uk Kim             {
23799a4bc520SJung-uk Kim                 return;
23809a4bc520SJung-uk Kim             }
2381cfd1ed46SJung-uk Kim             break;
2382cfd1ed46SJung-uk Kim 
2383cfd1ed46SJung-uk Kim         default:
2384cfd1ed46SJung-uk Kim 
2385cfd1ed46SJung-uk Kim             AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",
2386cfd1ed46SJung-uk Kim                 Subtable->Type);
2387cfd1ed46SJung-uk Kim             return;
2388cfd1ed46SJung-uk Kim         }
2389cfd1ed46SJung-uk Kim 
2390cfd1ed46SJung-uk Kim         /* Next subtable */
2391cfd1ed46SJung-uk Kim 
23929a4bc520SJung-uk Kim         DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, Bottom of main loop: Offset %X, "
23939a4bc520SJung-uk Kim             "Subtable->Length %X, Table->Length %X */\n",
23949a4bc520SJung-uk Kim             __LINE__, Offset, Subtable->Length, Table->Length);
23959a4bc520SJung-uk Kim 
23969a4bc520SJung-uk Kim         Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table,
23979a4bc520SJung-uk Kim             Offset);
2398cfd1ed46SJung-uk Kim     }
2399cfd1ed46SJung-uk Kim }
2400cfd1ed46SJung-uk Kim 
2401cfd1ed46SJung-uk Kim 
2402cfd1ed46SJung-uk Kim /*******************************************************************************
2403cfd1ed46SJung-uk Kim  *
2404ff879b07SJung-uk Kim  * FUNCTION:    AcpiDmDumpPmtt
2405ff879b07SJung-uk Kim  *
2406ff879b07SJung-uk Kim  * PARAMETERS:  Table               - A PMTT table
2407ff879b07SJung-uk Kim  *
2408ff879b07SJung-uk Kim  * RETURN:      None
2409ff879b07SJung-uk Kim  *
2410ff879b07SJung-uk Kim  * DESCRIPTION: Format the contents of a PMTT. This table type consists
2411ff879b07SJung-uk Kim  *              of an open-ended number of subtables.
2412ff879b07SJung-uk Kim  *
2413ff879b07SJung-uk Kim  ******************************************************************************/
2414ff879b07SJung-uk Kim 
2415ff879b07SJung-uk Kim void
2416ff879b07SJung-uk Kim AcpiDmDumpPmtt (
2417ff879b07SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
2418ff879b07SJung-uk Kim {
2419ff879b07SJung-uk Kim     ACPI_STATUS             Status;
2420ff879b07SJung-uk Kim     ACPI_PMTT_HEADER        *Subtable;
2421ff879b07SJung-uk Kim     UINT32                  Length = Table->Length;
2422ff879b07SJung-uk Kim     UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
2423ff879b07SJung-uk Kim 
2424ff879b07SJung-uk Kim 
2425ff879b07SJung-uk Kim     /* Main table */
2426ff879b07SJung-uk Kim 
2427ff879b07SJung-uk Kim     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
2428ff879b07SJung-uk Kim     if (ACPI_FAILURE (Status))
2429ff879b07SJung-uk Kim     {
2430ff879b07SJung-uk Kim         return;
2431ff879b07SJung-uk Kim     }
2432ff879b07SJung-uk Kim 
2433ff879b07SJung-uk Kim     /* Subtables */
2434ff879b07SJung-uk Kim 
2435ff879b07SJung-uk Kim     Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
2436ff879b07SJung-uk Kim     while (Offset < Table->Length)
2437ff879b07SJung-uk Kim     {
2438cfd1ed46SJung-uk Kim         /* Each of the types below contain the common subtable header */
2439ff879b07SJung-uk Kim 
2440ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
2441cfd1ed46SJung-uk Kim         switch (Subtable->Type)
2442ff879b07SJung-uk Kim         {
2443cfd1ed46SJung-uk Kim         case ACPI_PMTT_TYPE_SOCKET:
2444ff879b07SJung-uk Kim 
2445ff879b07SJung-uk Kim             Status = AcpiDmDumpTable (Length, Offset, Subtable,
2446ff879b07SJung-uk Kim                 Subtable->Length, AcpiDmTableInfoPmtt0);
2447ff879b07SJung-uk Kim             if (ACPI_FAILURE (Status))
2448ff879b07SJung-uk Kim             {
2449ff879b07SJung-uk Kim                 return;
2450ff879b07SJung-uk Kim             }
2451cfd1ed46SJung-uk Kim             break;
2452ff879b07SJung-uk Kim 
2453cfd1ed46SJung-uk Kim         case ACPI_PMTT_TYPE_CONTROLLER:
2454cfd1ed46SJung-uk Kim             Status = AcpiDmDumpTable (Length, Offset, Subtable,
2455cfd1ed46SJung-uk Kim                 Subtable->Length, AcpiDmTableInfoPmtt1);
2456ff879b07SJung-uk Kim             if (ACPI_FAILURE (Status))
2457ff879b07SJung-uk Kim             {
2458ff879b07SJung-uk Kim                 return;
2459ff879b07SJung-uk Kim             }
2460cfd1ed46SJung-uk Kim             break;
2461ff879b07SJung-uk Kim 
2462cfd1ed46SJung-uk Kim        case ACPI_PMTT_TYPE_DIMM:
2463cfd1ed46SJung-uk Kim             Status = AcpiDmDumpTable (Length, Offset, Subtable,
2464cfd1ed46SJung-uk Kim                 Subtable->Length, AcpiDmTableInfoPmtt2);
2465cfd1ed46SJung-uk Kim             if (ACPI_FAILURE (Status))
2466ff879b07SJung-uk Kim             {
2467cfd1ed46SJung-uk Kim                 return;
2468cfd1ed46SJung-uk Kim             }
2469cfd1ed46SJung-uk Kim             break;
2470cfd1ed46SJung-uk Kim 
2471cfd1ed46SJung-uk Kim         case ACPI_PMTT_TYPE_VENDOR:
2472cfd1ed46SJung-uk Kim             Status = AcpiDmDumpTable (Length, Offset, Subtable,
2473cfd1ed46SJung-uk Kim                 Subtable->Length, AcpiDmTableInfoPmttVendor);
2474cfd1ed46SJung-uk Kim             if (ACPI_FAILURE (Status))
2475cfd1ed46SJung-uk Kim             {
2476cfd1ed46SJung-uk Kim                 return;
2477cfd1ed46SJung-uk Kim             }
2478cfd1ed46SJung-uk Kim             break;
2479cfd1ed46SJung-uk Kim 
2480cfd1ed46SJung-uk Kim         default:
2481ff879b07SJung-uk Kim             AcpiOsPrintf (
2482ff879b07SJung-uk Kim                 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2483cfd1ed46SJung-uk Kim                 Subtable->Type);
2484ff879b07SJung-uk Kim             return;
2485ff879b07SJung-uk Kim         }
2486ff879b07SJung-uk Kim 
2487cfd1ed46SJung-uk Kim         /* Point to next subtable */
2488ff879b07SJung-uk Kim 
2489ff879b07SJung-uk Kim         Offset += Subtable->Length;
2490ff879b07SJung-uk Kim         Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2491ff879b07SJung-uk Kim             Subtable, Subtable->Length);
2492ff879b07SJung-uk Kim     }
2493ff879b07SJung-uk Kim }
2494ff879b07SJung-uk Kim 
2495ff879b07SJung-uk Kim 
2496ff879b07SJung-uk Kim /*******************************************************************************
2497ff879b07SJung-uk Kim  *
2498ff879b07SJung-uk Kim  * FUNCTION:    AcpiDmDumpPptt
2499ff879b07SJung-uk Kim  *
2500ff879b07SJung-uk Kim  * PARAMETERS:  Table               - A PMTT table
2501ff879b07SJung-uk Kim  *
2502ff879b07SJung-uk Kim  * RETURN:      None
2503ff879b07SJung-uk Kim  *
2504ff879b07SJung-uk Kim  * DESCRIPTION: Format the contents of a PPTT. This table type consists
2505ff879b07SJung-uk Kim  *              of an open-ended number of subtables.
2506ff879b07SJung-uk Kim  *
2507ff879b07SJung-uk Kim  ******************************************************************************/
2508ff879b07SJung-uk Kim 
2509ff879b07SJung-uk Kim void
2510ff879b07SJung-uk Kim AcpiDmDumpPptt (
2511ff879b07SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
2512ff879b07SJung-uk Kim {
2513ff879b07SJung-uk Kim     ACPI_STATUS             Status;
2514ff879b07SJung-uk Kim     ACPI_SUBTABLE_HEADER    *Subtable;
2515ff879b07SJung-uk Kim     ACPI_PPTT_PROCESSOR     *PpttProcessor;
2516ff879b07SJung-uk Kim     UINT8                   Length;
2517ff879b07SJung-uk Kim     UINT8                   SubtableOffset;
2518ff879b07SJung-uk Kim     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
2519ff879b07SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
2520ff879b07SJung-uk Kim     UINT32                  i;
2521ff879b07SJung-uk Kim 
2522ff879b07SJung-uk Kim 
2523ff879b07SJung-uk Kim     /* There is no main table (other than the standard ACPI header) */
2524ff879b07SJung-uk Kim 
2525ff879b07SJung-uk Kim     /* Subtables */
2526ff879b07SJung-uk Kim 
2527ff879b07SJung-uk Kim     Offset = sizeof (ACPI_TABLE_HEADER);
2528ff879b07SJung-uk Kim     while (Offset < Table->Length)
2529ff879b07SJung-uk Kim     {
2530ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
2531ff879b07SJung-uk Kim 
2532ff879b07SJung-uk Kim         /* Common subtable header */
2533ff879b07SJung-uk Kim 
2534ff879b07SJung-uk Kim         Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
2535ff879b07SJung-uk Kim         if (Subtable->Length < sizeof (ACPI_SUBTABLE_HEADER))
2536ff879b07SJung-uk Kim         {
2537ff879b07SJung-uk Kim             AcpiOsPrintf ("Invalid subtable length\n");
2538ff879b07SJung-uk Kim             return;
2539ff879b07SJung-uk Kim         }
2540ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
2541ff879b07SJung-uk Kim             Subtable->Length, AcpiDmTableInfoPpttHdr);
2542ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
2543ff879b07SJung-uk Kim         {
2544ff879b07SJung-uk Kim             return;
2545ff879b07SJung-uk Kim         }
2546ff879b07SJung-uk Kim 
2547ff879b07SJung-uk Kim         switch (Subtable->Type)
2548ff879b07SJung-uk Kim         {
2549ff879b07SJung-uk Kim         case ACPI_PPTT_TYPE_PROCESSOR:
2550ff879b07SJung-uk Kim 
2551ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoPptt0;
2552ff879b07SJung-uk Kim             Length = sizeof (ACPI_PPTT_PROCESSOR);
2553ff879b07SJung-uk Kim             break;
2554ff879b07SJung-uk Kim 
2555ff879b07SJung-uk Kim         case ACPI_PPTT_TYPE_CACHE:
2556ff879b07SJung-uk Kim 
2557ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoPptt1;
2558ff879b07SJung-uk Kim             Length = sizeof (ACPI_PPTT_CACHE);
2559ff879b07SJung-uk Kim             break;
2560ff879b07SJung-uk Kim 
2561ff879b07SJung-uk Kim         case ACPI_PPTT_TYPE_ID:
2562ff879b07SJung-uk Kim 
2563ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoPptt2;
2564ff879b07SJung-uk Kim             Length = sizeof (ACPI_PPTT_ID);
2565ff879b07SJung-uk Kim             break;
2566ff879b07SJung-uk Kim 
2567ff879b07SJung-uk Kim         default:
2568ff879b07SJung-uk Kim 
2569ff879b07SJung-uk Kim             AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n",
2570ff879b07SJung-uk Kim                 Subtable->Type);
2571ff879b07SJung-uk Kim 
2572ff879b07SJung-uk Kim             /* Attempt to continue */
2573ff879b07SJung-uk Kim 
2574ff879b07SJung-uk Kim             goto NextSubtable;
2575ff879b07SJung-uk Kim         }
2576ff879b07SJung-uk Kim 
2577ff879b07SJung-uk Kim         if (Subtable->Length < Length)
2578ff879b07SJung-uk Kim         {
2579ff879b07SJung-uk Kim             AcpiOsPrintf ("Invalid subtable length\n");
2580ff879b07SJung-uk Kim             return;
2581ff879b07SJung-uk Kim         }
2582ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
2583ff879b07SJung-uk Kim             Subtable->Length, InfoTable);
2584ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
2585ff879b07SJung-uk Kim         {
2586ff879b07SJung-uk Kim             return;
2587ff879b07SJung-uk Kim         }
2588ff879b07SJung-uk Kim         SubtableOffset = Length;
2589ff879b07SJung-uk Kim 
2590ff879b07SJung-uk Kim         switch (Subtable->Type)
2591ff879b07SJung-uk Kim         {
2592ff879b07SJung-uk Kim         case ACPI_PPTT_TYPE_PROCESSOR:
2593ff879b07SJung-uk Kim 
2594ff879b07SJung-uk Kim             PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, Subtable);
2595ff879b07SJung-uk Kim 
2596ff879b07SJung-uk Kim             /* Dump SMBIOS handles */
2597ff879b07SJung-uk Kim 
2598ff879b07SJung-uk Kim             if ((UINT8)(Subtable->Length - SubtableOffset) <
2599ff879b07SJung-uk Kim                 (UINT8)(PpttProcessor->NumberOfPrivResources * 4))
2600ff879b07SJung-uk Kim             {
2601ff879b07SJung-uk Kim                 AcpiOsPrintf ("Invalid private resource number\n");
2602ff879b07SJung-uk Kim                 return;
2603ff879b07SJung-uk Kim             }
2604ff879b07SJung-uk Kim             for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++)
2605ff879b07SJung-uk Kim             {
2606ff879b07SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2607ff879b07SJung-uk Kim                     ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
2608ff879b07SJung-uk Kim                     4, AcpiDmTableInfoPptt0a);
2609a009b7dcSJung-uk Kim                 if (ACPI_FAILURE (Status))
2610a009b7dcSJung-uk Kim                 {
2611a009b7dcSJung-uk Kim                     return;
2612a009b7dcSJung-uk Kim                 }
2613a009b7dcSJung-uk Kim 
2614ff879b07SJung-uk Kim                 SubtableOffset += 4;
2615ff879b07SJung-uk Kim             }
2616ff879b07SJung-uk Kim             break;
2617ff879b07SJung-uk Kim 
2618cfd1ed46SJung-uk Kim         case ACPI_PPTT_TYPE_CACHE:
2619cfd1ed46SJung-uk Kim 
2620cfd1ed46SJung-uk Kim             if (Table->Revision < 3)
2621cfd1ed46SJung-uk Kim             {
2622cfd1ed46SJung-uk Kim                 break;
2623cfd1ed46SJung-uk Kim             }
2624cfd1ed46SJung-uk Kim             Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2625cfd1ed46SJung-uk Kim                 ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
2626cfd1ed46SJung-uk Kim                 sizeof (ACPI_PPTT_CACHE_V1), AcpiDmTableInfoPptt1a);
2627cfd1ed46SJung-uk Kim             if (ACPI_FAILURE (Status))
2628cfd1ed46SJung-uk Kim             {
2629cfd1ed46SJung-uk Kim                 return;
2630cfd1ed46SJung-uk Kim             }
2631cfd1ed46SJung-uk Kim             break;
2632cfd1ed46SJung-uk Kim 
2633ff879b07SJung-uk Kim         default:
2634ff879b07SJung-uk Kim 
2635ff879b07SJung-uk Kim             break;
2636ff879b07SJung-uk Kim         }
2637ff879b07SJung-uk Kim 
2638ff879b07SJung-uk Kim NextSubtable:
2639ff879b07SJung-uk Kim         /* Point to next subtable */
2640ff879b07SJung-uk Kim 
2641ff879b07SJung-uk Kim         Offset += Subtable->Length;
2642ff879b07SJung-uk Kim     }
2643ff879b07SJung-uk Kim }
2644ff879b07SJung-uk Kim 
2645ff879b07SJung-uk Kim 
2646ff879b07SJung-uk Kim /*******************************************************************************
2647ff879b07SJung-uk Kim  *
26481970d693SJung-uk Kim  * FUNCTION:    AcpiDmDumpPrmt
26491970d693SJung-uk Kim  *
26501970d693SJung-uk Kim  * PARAMETERS:  Table               - A PRMT table
26511970d693SJung-uk Kim  *
26521970d693SJung-uk Kim  * RETURN:      None
26531970d693SJung-uk Kim  *
26541970d693SJung-uk Kim  * DESCRIPTION: Format the contents of a PRMT. This table type consists
26551970d693SJung-uk Kim  *              of an open-ended number of subtables.
26561970d693SJung-uk Kim  *
26571970d693SJung-uk Kim  ******************************************************************************/
26581970d693SJung-uk Kim 
26591970d693SJung-uk Kim void
26601970d693SJung-uk Kim AcpiDmDumpPrmt (
26611970d693SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
26621970d693SJung-uk Kim {
26631970d693SJung-uk Kim     UINT32                  CurrentOffset = sizeof (ACPI_TABLE_HEADER);
26641970d693SJung-uk Kim     ACPI_TABLE_PRMT_HEADER  *PrmtHeader;
26651970d693SJung-uk Kim     ACPI_PRMT_MODULE_INFO   *PrmtModuleInfo;
26661970d693SJung-uk Kim     ACPI_PRMT_HANDLER_INFO  *PrmtHandlerInfo;
26671970d693SJung-uk Kim     ACPI_STATUS             Status;
26681970d693SJung-uk Kim     UINT32                  i, j;
26691970d693SJung-uk Kim 
26701970d693SJung-uk Kim 
26711970d693SJung-uk Kim     /* Main table header */
26721970d693SJung-uk Kim 
26731970d693SJung-uk Kim     PrmtHeader = ACPI_ADD_PTR (ACPI_TABLE_PRMT_HEADER, Table, CurrentOffset);
26741970d693SJung-uk Kim     Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHeader,
26751970d693SJung-uk Kim         sizeof (ACPI_TABLE_PRMT_HEADER), AcpiDmTableInfoPrmtHdr);
26761970d693SJung-uk Kim     if (ACPI_FAILURE (Status))
26771970d693SJung-uk Kim     {
26781970d693SJung-uk Kim         AcpiOsPrintf ("Invalid PRMT header\n");
26791970d693SJung-uk Kim         return;
26801970d693SJung-uk Kim     }
26811970d693SJung-uk Kim 
26821970d693SJung-uk Kim     CurrentOffset += sizeof (ACPI_TABLE_PRMT_HEADER);
26831970d693SJung-uk Kim 
26841970d693SJung-uk Kim     /* PRM Module Information Structure array */
26851970d693SJung-uk Kim 
26861970d693SJung-uk Kim     for (i = 0; i < PrmtHeader->ModuleInfoCount; ++i)
26871970d693SJung-uk Kim     {
26881970d693SJung-uk Kim         PrmtModuleInfo = ACPI_ADD_PTR (ACPI_PRMT_MODULE_INFO, Table, CurrentOffset);
26891970d693SJung-uk Kim         Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtModuleInfo,
26901970d693SJung-uk Kim             sizeof (ACPI_PRMT_MODULE_INFO), AcpiDmTableInfoPrmtModule);
26911970d693SJung-uk Kim 
26921970d693SJung-uk Kim         CurrentOffset += sizeof (ACPI_PRMT_MODULE_INFO);
26931970d693SJung-uk Kim 
26941970d693SJung-uk Kim         /* PRM handler information structure array */
26951970d693SJung-uk Kim 
26961970d693SJung-uk Kim         for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; ++j)
26971970d693SJung-uk Kim         {
26981970d693SJung-uk Kim             PrmtHandlerInfo = ACPI_ADD_PTR (ACPI_PRMT_HANDLER_INFO, Table, CurrentOffset);
26991970d693SJung-uk Kim             Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHandlerInfo,
27001970d693SJung-uk Kim                 sizeof (ACPI_PRMT_HANDLER_INFO), AcpiDmTableInfoPrmtHandler);
27011970d693SJung-uk Kim 
27021970d693SJung-uk Kim             CurrentOffset += sizeof (ACPI_PRMT_HANDLER_INFO);
27031970d693SJung-uk Kim         }
27041970d693SJung-uk Kim     }
27051970d693SJung-uk Kim }
27061970d693SJung-uk Kim 
27071970d693SJung-uk Kim 
27081970d693SJung-uk Kim /*******************************************************************************
27091970d693SJung-uk Kim  *
27101970d693SJung-uk Kim  * FUNCTION:    AcpiDmDumpRgrt
27111970d693SJung-uk Kim  *
27121970d693SJung-uk Kim  * PARAMETERS:  Table               - A RGRT table
27131970d693SJung-uk Kim  *
27141970d693SJung-uk Kim  * RETURN:      None
27151970d693SJung-uk Kim  *
27161970d693SJung-uk Kim  * DESCRIPTION: Format the contents of a RGRT
27171970d693SJung-uk Kim  *
27181970d693SJung-uk Kim  ******************************************************************************/
27191970d693SJung-uk Kim 
27201970d693SJung-uk Kim void
27211970d693SJung-uk Kim AcpiDmDumpRgrt (
27221970d693SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
27231970d693SJung-uk Kim {
27241970d693SJung-uk Kim     ACPI_STATUS             Status;
27251970d693SJung-uk Kim     ACPI_TABLE_RGRT         *Subtable = ACPI_CAST_PTR (ACPI_TABLE_RGRT, Table);
27261970d693SJung-uk Kim     UINT32                  Offset = sizeof (ACPI_TABLE_RGRT);
27271970d693SJung-uk Kim 
27281970d693SJung-uk Kim 
27291970d693SJung-uk Kim     /* Main table */
27301970d693SJung-uk Kim 
27311970d693SJung-uk Kim     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoRgrt);
27321970d693SJung-uk Kim     if (ACPI_FAILURE (Status))
27331970d693SJung-uk Kim     {
27341970d693SJung-uk Kim         return;
27351970d693SJung-uk Kim     }
27361970d693SJung-uk Kim 
27371970d693SJung-uk Kim     /* Dump the binary image as a subtable */
27381970d693SJung-uk Kim 
27391970d693SJung-uk Kim     Status = AcpiDmDumpTable (Table->Length, Offset, &Subtable->Image,
27401970d693SJung-uk Kim         Table->Length - Offset, AcpiDmTableInfoRgrt0);
27411970d693SJung-uk Kim     if (ACPI_FAILURE (Status))
27421970d693SJung-uk Kim     {
27431970d693SJung-uk Kim         return;
27441970d693SJung-uk Kim     }
27451970d693SJung-uk Kim }
27461970d693SJung-uk Kim 
27471970d693SJung-uk Kim 
27481970d693SJung-uk Kim /*******************************************************************************
27491970d693SJung-uk Kim  *
2750*722b1667SJung-uk Kim  * FUNCTION:    AcpiDmDumpRhct
2751*722b1667SJung-uk Kim  *
2752*722b1667SJung-uk Kim  * PARAMETERS:  Table               - A RHCT table
2753*722b1667SJung-uk Kim  *
2754*722b1667SJung-uk Kim  * RETURN:      None
2755*722b1667SJung-uk Kim  *
2756*722b1667SJung-uk Kim  * DESCRIPTION: Format the contents of a RHCT.
2757*722b1667SJung-uk Kim  *
2758*722b1667SJung-uk Kim  ******************************************************************************/
2759*722b1667SJung-uk Kim 
2760*722b1667SJung-uk Kim void
2761*722b1667SJung-uk Kim AcpiDmDumpRhct (
2762*722b1667SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
2763*722b1667SJung-uk Kim {
2764*722b1667SJung-uk Kim     ACPI_STATUS             Status;
2765*722b1667SJung-uk Kim     ACPI_RHCT_NODE_HEADER   *Subtable;
2766*722b1667SJung-uk Kim     ACPI_RHCT_HART_INFO     *RhctHartInfo;
2767*722b1667SJung-uk Kim     ACPI_RHCT_ISA_STRING    *RhctIsaString;
2768*722b1667SJung-uk Kim     UINT32                  Length = Table->Length;
2769*722b1667SJung-uk Kim     UINT8                   SubtableOffset, IsaPadOffset;
2770*722b1667SJung-uk Kim     UINT32                  Offset = sizeof (ACPI_TABLE_RHCT);
2771*722b1667SJung-uk Kim     UINT32                  i;
2772*722b1667SJung-uk Kim 
2773*722b1667SJung-uk Kim     /* Main table */
2774*722b1667SJung-uk Kim 
2775*722b1667SJung-uk Kim     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRhct);
2776*722b1667SJung-uk Kim     if (ACPI_FAILURE (Status))
2777*722b1667SJung-uk Kim     {
2778*722b1667SJung-uk Kim         return;
2779*722b1667SJung-uk Kim     }
2780*722b1667SJung-uk Kim 
2781*722b1667SJung-uk Kim     /* Subtables */
2782*722b1667SJung-uk Kim 
2783*722b1667SJung-uk Kim     while (Offset < Table->Length)
2784*722b1667SJung-uk Kim     {
2785*722b1667SJung-uk Kim         AcpiOsPrintf ("\n");
2786*722b1667SJung-uk Kim 
2787*722b1667SJung-uk Kim         /* Common subtable header */
2788*722b1667SJung-uk Kim 
2789*722b1667SJung-uk Kim         Subtable = ACPI_ADD_PTR (ACPI_RHCT_NODE_HEADER, Table, Offset);
2790*722b1667SJung-uk Kim         if (Subtable->Length < sizeof (ACPI_RHCT_NODE_HEADER))
2791*722b1667SJung-uk Kim         {
2792*722b1667SJung-uk Kim             AcpiOsPrintf ("Invalid subtable length\n");
2793*722b1667SJung-uk Kim             return;
2794*722b1667SJung-uk Kim         }
2795*722b1667SJung-uk Kim         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
2796*722b1667SJung-uk Kim             Subtable->Length, AcpiDmTableInfoRhctNodeHdr);
2797*722b1667SJung-uk Kim         if (ACPI_FAILURE (Status))
2798*722b1667SJung-uk Kim         {
2799*722b1667SJung-uk Kim             return;
2800*722b1667SJung-uk Kim         }
2801*722b1667SJung-uk Kim 
2802*722b1667SJung-uk Kim         Length = sizeof (ACPI_RHCT_NODE_HEADER);
2803*722b1667SJung-uk Kim 
2804*722b1667SJung-uk Kim         if (Subtable->Length < Length)
2805*722b1667SJung-uk Kim         {
2806*722b1667SJung-uk Kim             AcpiOsPrintf ("Invalid subtable length\n");
2807*722b1667SJung-uk Kim             return;
2808*722b1667SJung-uk Kim         }
2809*722b1667SJung-uk Kim         SubtableOffset = (UINT8) Length;
2810*722b1667SJung-uk Kim 
2811*722b1667SJung-uk Kim         switch (Subtable->Type)
2812*722b1667SJung-uk Kim         {
2813*722b1667SJung-uk Kim         case ACPI_RHCT_NODE_TYPE_HART_INFO:
2814*722b1667SJung-uk Kim             Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2815*722b1667SJung-uk Kim                     ACPI_ADD_PTR (ACPI_RHCT_HART_INFO, Subtable, SubtableOffset),
2816*722b1667SJung-uk Kim                     sizeof (ACPI_RHCT_HART_INFO), AcpiDmTableInfoRhctHartInfo1);
2817*722b1667SJung-uk Kim 
2818*722b1667SJung-uk Kim             RhctHartInfo = ACPI_ADD_PTR (ACPI_RHCT_HART_INFO, Subtable, SubtableOffset);
2819*722b1667SJung-uk Kim 
2820*722b1667SJung-uk Kim             if ((UINT16)(Subtable->Length - SubtableOffset) <
2821*722b1667SJung-uk Kim                 (UINT16)(RhctHartInfo->NumOffsets * 4))
2822*722b1667SJung-uk Kim             {
2823*722b1667SJung-uk Kim                 AcpiOsPrintf ("Invalid number of offsets\n");
2824*722b1667SJung-uk Kim                 return;
2825*722b1667SJung-uk Kim             }
2826*722b1667SJung-uk Kim             SubtableOffset += sizeof (ACPI_RHCT_HART_INFO);
2827*722b1667SJung-uk Kim             for (i = 0; i < RhctHartInfo->NumOffsets; i++)
2828*722b1667SJung-uk Kim             {
2829*722b1667SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2830*722b1667SJung-uk Kim                     ACPI_ADD_PTR (UINT32, Subtable, SubtableOffset),
2831*722b1667SJung-uk Kim                     4, AcpiDmTableInfoRhctHartInfo2);
2832*722b1667SJung-uk Kim                 if (ACPI_FAILURE (Status))
2833*722b1667SJung-uk Kim                 {
2834*722b1667SJung-uk Kim                     return;
2835*722b1667SJung-uk Kim                 }
2836*722b1667SJung-uk Kim 
2837*722b1667SJung-uk Kim                 SubtableOffset += 4;
2838*722b1667SJung-uk Kim             }
2839*722b1667SJung-uk Kim             break;
2840*722b1667SJung-uk Kim 
2841*722b1667SJung-uk Kim         case ACPI_RHCT_NODE_TYPE_ISA_STRING:
2842*722b1667SJung-uk Kim             RhctIsaString = ACPI_ADD_PTR (ACPI_RHCT_ISA_STRING, Subtable, SubtableOffset);
2843*722b1667SJung-uk Kim             IsaPadOffset = (UINT8) (SubtableOffset + 2 + RhctIsaString->IsaLength);
2844*722b1667SJung-uk Kim             Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2845*722b1667SJung-uk Kim                     RhctIsaString, RhctIsaString->IsaLength, AcpiDmTableInfoRhctIsa1);
2846*722b1667SJung-uk Kim             if (Subtable->Length > IsaPadOffset)
2847*722b1667SJung-uk Kim             {
2848*722b1667SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2849*722b1667SJung-uk Kim                          ACPI_ADD_PTR (UINT8, Subtable, IsaPadOffset),
2850*722b1667SJung-uk Kim                          (Subtable->Length - IsaPadOffset), AcpiDmTableInfoRhctIsaPad);
2851*722b1667SJung-uk Kim             }
2852*722b1667SJung-uk Kim 
2853*722b1667SJung-uk Kim         default:
2854*722b1667SJung-uk Kim             break;
2855*722b1667SJung-uk Kim         }
2856*722b1667SJung-uk Kim 
2857*722b1667SJung-uk Kim         /* Point to next subtable */
2858*722b1667SJung-uk Kim 
2859*722b1667SJung-uk Kim         Offset += Subtable->Length;
2860*722b1667SJung-uk Kim     }
2861*722b1667SJung-uk Kim }
2862*722b1667SJung-uk Kim 
2863*722b1667SJung-uk Kim 
2864*722b1667SJung-uk Kim /*******************************************************************************
2865*722b1667SJung-uk Kim  *
2866ff879b07SJung-uk Kim  * FUNCTION:    AcpiDmDumpS3pt
2867ff879b07SJung-uk Kim  *
2868ff879b07SJung-uk Kim  * PARAMETERS:  Table               - A S3PT table
2869ff879b07SJung-uk Kim  *
2870ff879b07SJung-uk Kim  * RETURN:      Length of the table
2871ff879b07SJung-uk Kim  *
2872ff879b07SJung-uk Kim  * DESCRIPTION: Format the contents of a S3PT
2873ff879b07SJung-uk Kim  *
2874ff879b07SJung-uk Kim  ******************************************************************************/
2875ff879b07SJung-uk Kim 
2876ff879b07SJung-uk Kim UINT32
2877ff879b07SJung-uk Kim AcpiDmDumpS3pt (
2878ff879b07SJung-uk Kim     ACPI_TABLE_HEADER       *Tables)
2879ff879b07SJung-uk Kim {
2880ff879b07SJung-uk Kim     ACPI_STATUS             Status;
2881ff879b07SJung-uk Kim     UINT32                  Offset = sizeof (ACPI_TABLE_S3PT);
2882ff879b07SJung-uk Kim     ACPI_FPDT_HEADER        *Subtable;
2883ff879b07SJung-uk Kim     ACPI_DMTABLE_INFO       *InfoTable;
2884ff879b07SJung-uk Kim     ACPI_TABLE_S3PT         *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
2885ff879b07SJung-uk Kim 
2886ff879b07SJung-uk Kim 
2887ff879b07SJung-uk Kim     /* Main table */
2888ff879b07SJung-uk Kim 
2889ff879b07SJung-uk Kim     Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
2890ff879b07SJung-uk Kim     if (ACPI_FAILURE (Status))
2891ff879b07SJung-uk Kim     {
2892ff879b07SJung-uk Kim         return 0;
2893ff879b07SJung-uk Kim     }
2894ff879b07SJung-uk Kim 
2895ff879b07SJung-uk Kim     Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);
2896ff879b07SJung-uk Kim     while (Offset < S3ptTable->Length)
2897ff879b07SJung-uk Kim     {
2898ff879b07SJung-uk Kim         /* Common subtable header */
2899ff879b07SJung-uk Kim 
2900ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
2901ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
2902ff879b07SJung-uk Kim             Subtable->Length, AcpiDmTableInfoS3ptHdr);
2903ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
2904ff879b07SJung-uk Kim         {
2905ff879b07SJung-uk Kim             return 0;
2906ff879b07SJung-uk Kim         }
2907ff879b07SJung-uk Kim 
2908ff879b07SJung-uk Kim         switch (Subtable->Type)
2909ff879b07SJung-uk Kim         {
2910ff879b07SJung-uk Kim         case ACPI_S3PT_TYPE_RESUME:
2911ff879b07SJung-uk Kim 
2912ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoS3pt0;
2913ff879b07SJung-uk Kim             break;
2914ff879b07SJung-uk Kim 
2915ff879b07SJung-uk Kim         case ACPI_S3PT_TYPE_SUSPEND:
2916ff879b07SJung-uk Kim 
2917ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoS3pt1;
2918ff879b07SJung-uk Kim             break;
2919ff879b07SJung-uk Kim 
2920ff879b07SJung-uk Kim         default:
2921ff879b07SJung-uk Kim 
2922ff879b07SJung-uk Kim             AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n",
2923ff879b07SJung-uk Kim                 Subtable->Type);
2924ff879b07SJung-uk Kim 
2925ff879b07SJung-uk Kim             /* Attempt to continue */
2926ff879b07SJung-uk Kim 
2927ff879b07SJung-uk Kim             if (!Subtable->Length)
2928ff879b07SJung-uk Kim             {
2929ff879b07SJung-uk Kim                 AcpiOsPrintf ("Invalid zero length subtable\n");
2930ff879b07SJung-uk Kim                 return 0;
2931ff879b07SJung-uk Kim             }
2932ff879b07SJung-uk Kim             goto NextSubtable;
2933ff879b07SJung-uk Kim         }
2934ff879b07SJung-uk Kim 
2935ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
2936ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
2937ff879b07SJung-uk Kim             Subtable->Length, InfoTable);
2938ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
2939ff879b07SJung-uk Kim         {
2940ff879b07SJung-uk Kim             return 0;
2941ff879b07SJung-uk Kim         }
2942ff879b07SJung-uk Kim 
2943ff879b07SJung-uk Kim NextSubtable:
2944ff879b07SJung-uk Kim         /* Point to next subtable */
2945ff879b07SJung-uk Kim 
2946ff879b07SJung-uk Kim         Offset += Subtable->Length;
2947ff879b07SJung-uk Kim         Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length);
2948ff879b07SJung-uk Kim     }
2949ff879b07SJung-uk Kim 
2950ff879b07SJung-uk Kim     return (S3ptTable->Length);
2951ff879b07SJung-uk Kim }
2952ff879b07SJung-uk Kim 
2953ff879b07SJung-uk Kim 
2954ff879b07SJung-uk Kim /*******************************************************************************
2955ff879b07SJung-uk Kim  *
2956ff879b07SJung-uk Kim  * FUNCTION:    AcpiDmDumpSdev
2957ff879b07SJung-uk Kim  *
2958ff879b07SJung-uk Kim  * PARAMETERS:  Table               - A SDEV table
2959ff879b07SJung-uk Kim  *
2960ff879b07SJung-uk Kim  * RETURN:      None
2961ff879b07SJung-uk Kim  *
2962ff879b07SJung-uk Kim  * DESCRIPTION: Format the contents of a SDEV. This is a variable-length
2963ff879b07SJung-uk Kim  *              table that contains variable strings and vendor data.
2964ff879b07SJung-uk Kim  *
2965ff879b07SJung-uk Kim  ******************************************************************************/
2966ff879b07SJung-uk Kim 
2967ff879b07SJung-uk Kim void
2968ff879b07SJung-uk Kim AcpiDmDumpSdev (
2969ff879b07SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
2970ff879b07SJung-uk Kim {
2971ff879b07SJung-uk Kim     ACPI_STATUS                 Status;
2972ff879b07SJung-uk Kim     ACPI_SDEV_HEADER            *Subtable;
2973ff879b07SJung-uk Kim     ACPI_SDEV_PCIE              *Pcie;
2974ff879b07SJung-uk Kim     ACPI_SDEV_NAMESPACE         *Namesp;
2975ff879b07SJung-uk Kim     ACPI_DMTABLE_INFO           *InfoTable;
2976cfd1ed46SJung-uk Kim     ACPI_DMTABLE_INFO           *SecureComponentInfoTable;
2977ff879b07SJung-uk Kim     UINT32                      Length = Table->Length;
2978ff879b07SJung-uk Kim     UINT32                      Offset = sizeof (ACPI_TABLE_SDEV);
2979ff879b07SJung-uk Kim     UINT16                      PathOffset;
2980ff879b07SJung-uk Kim     UINT16                      PathLength;
2981ff879b07SJung-uk Kim     UINT16                      VendorDataOffset;
2982ff879b07SJung-uk Kim     UINT16                      VendorDataLength;
2983cfd1ed46SJung-uk Kim     ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
2984cfd1ed46SJung-uk Kim     UINT32                      CurrentOffset = 0;
2985ff879b07SJung-uk Kim 
2986ff879b07SJung-uk Kim 
2987ff879b07SJung-uk Kim     /* Main table */
2988ff879b07SJung-uk Kim 
2989ff879b07SJung-uk Kim     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev);
2990ff879b07SJung-uk Kim     if (ACPI_FAILURE (Status))
2991ff879b07SJung-uk Kim     {
2992ff879b07SJung-uk Kim         return;
2993ff879b07SJung-uk Kim     }
2994ff879b07SJung-uk Kim 
2995ff879b07SJung-uk Kim     /* Subtables */
2996ff879b07SJung-uk Kim 
2997ff879b07SJung-uk Kim     Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset);
2998ff879b07SJung-uk Kim     while (Offset < Table->Length)
2999ff879b07SJung-uk Kim     {
3000ff879b07SJung-uk Kim         /* Common subtable header */
3001ff879b07SJung-uk Kim 
3002ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
3003ff879b07SJung-uk Kim         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
3004ff879b07SJung-uk Kim             Subtable->Length, AcpiDmTableInfoSdevHdr);
3005ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
3006ff879b07SJung-uk Kim         {
3007ff879b07SJung-uk Kim             return;
3008ff879b07SJung-uk Kim         }
3009ff879b07SJung-uk Kim 
3010ff879b07SJung-uk Kim         switch (Subtable->Type)
3011ff879b07SJung-uk Kim         {
3012ff879b07SJung-uk Kim         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
3013ff879b07SJung-uk Kim 
3014ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoSdev0;
3015ff879b07SJung-uk Kim             break;
3016ff879b07SJung-uk Kim 
3017ff879b07SJung-uk Kim         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
3018ff879b07SJung-uk Kim 
3019ff879b07SJung-uk Kim             InfoTable = AcpiDmTableInfoSdev1;
3020ff879b07SJung-uk Kim             break;
3021ff879b07SJung-uk Kim 
3022ff879b07SJung-uk Kim         default:
3023ff879b07SJung-uk Kim             goto NextSubtable;
3024ff879b07SJung-uk Kim         }
3025ff879b07SJung-uk Kim 
3026ff879b07SJung-uk Kim         AcpiOsPrintf ("\n");
3027cfd1ed46SJung-uk Kim         Status = AcpiDmDumpTable (Table->Length, 0, Subtable,
3028ff879b07SJung-uk Kim             Subtable->Length, InfoTable);
3029ff879b07SJung-uk Kim         if (ACPI_FAILURE (Status))
3030ff879b07SJung-uk Kim         {
3031ff879b07SJung-uk Kim             return;
3032ff879b07SJung-uk Kim         }
3033ff879b07SJung-uk Kim 
3034ff879b07SJung-uk Kim         switch (Subtable->Type)
3035ff879b07SJung-uk Kim         {
3036ff879b07SJung-uk Kim         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
3037ff879b07SJung-uk Kim 
3038cfd1ed46SJung-uk Kim             CurrentOffset = sizeof (ACPI_SDEV_NAMESPACE);
3039cfd1ed46SJung-uk Kim             if (Subtable->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
3040cfd1ed46SJung-uk Kim             {
3041cfd1ed46SJung-uk Kim                 SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
3042cfd1ed46SJung-uk Kim                     ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)));
3043cfd1ed46SJung-uk Kim 
3044cfd1ed46SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
3045cfd1ed46SJung-uk Kim                     ACPI_ADD_PTR(UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)),
3046cfd1ed46SJung-uk Kim                     sizeof (ACPI_SDEV_SECURE_COMPONENT), AcpiDmTableInfoSdev0b);
3047cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
3048cfd1ed46SJung-uk Kim                 {
3049cfd1ed46SJung-uk Kim                     return;
3050cfd1ed46SJung-uk Kim                 }
3051cfd1ed46SJung-uk Kim                 CurrentOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
3052cfd1ed46SJung-uk Kim 
3053cfd1ed46SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
3054cfd1ed46SJung-uk Kim                     ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
3055cfd1ed46SJung-uk Kim                     sizeof (ACPI_SDEV_HEADER), AcpiDmTableInfoSdevSecCompHdr);
3056cfd1ed46SJung-uk Kim                 if (ACPI_FAILURE (Status))
3057cfd1ed46SJung-uk Kim                 {
3058cfd1ed46SJung-uk Kim                     return;
3059cfd1ed46SJung-uk Kim                 }
3060cfd1ed46SJung-uk Kim                 CurrentOffset += sizeof (ACPI_SDEV_HEADER);
3061cfd1ed46SJung-uk Kim 
3062cfd1ed46SJung-uk Kim                 switch (Subtable->Type)
3063cfd1ed46SJung-uk Kim                 {
3064cfd1ed46SJung-uk Kim                 case ACPI_SDEV_TYPE_ID_COMPONENT:
3065cfd1ed46SJung-uk Kim 
3066cfd1ed46SJung-uk Kim                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
3067cfd1ed46SJung-uk Kim                     break;
3068cfd1ed46SJung-uk Kim 
3069cfd1ed46SJung-uk Kim                 case ACPI_SDEV_TYPE_MEM_COMPONENT:
3070cfd1ed46SJung-uk Kim 
3071cfd1ed46SJung-uk Kim                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
3072cfd1ed46SJung-uk Kim                     break;
3073cfd1ed46SJung-uk Kim 
3074cfd1ed46SJung-uk Kim                 default:
3075cfd1ed46SJung-uk Kim                     goto NextSubtable;
3076cfd1ed46SJung-uk Kim                 }
3077cfd1ed46SJung-uk Kim 
3078cfd1ed46SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
3079cfd1ed46SJung-uk Kim                     ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
3080cfd1ed46SJung-uk Kim                     SecureComponent->SecureComponentLength, SecureComponentInfoTable);
3081cfd1ed46SJung-uk Kim                 CurrentOffset += SecureComponent->SecureComponentLength;
3082cfd1ed46SJung-uk Kim             }
3083cfd1ed46SJung-uk Kim 
3084ff879b07SJung-uk Kim             /* Dump the PCIe device ID(s) */
3085ff879b07SJung-uk Kim 
3086ff879b07SJung-uk Kim             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);
3087ff879b07SJung-uk Kim             PathOffset = Namesp->DeviceIdOffset;
3088ff879b07SJung-uk Kim             PathLength = Namesp->DeviceIdLength;
3089ff879b07SJung-uk Kim 
3090ff879b07SJung-uk Kim             if (PathLength)
3091ff879b07SJung-uk Kim             {
3092cfd1ed46SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
3093ff879b07SJung-uk Kim                     ACPI_ADD_PTR (UINT8, Namesp, PathOffset),
3094ff879b07SJung-uk Kim                     PathLength, AcpiDmTableInfoSdev0a);
3095ff879b07SJung-uk Kim                 if (ACPI_FAILURE (Status))
3096ff879b07SJung-uk Kim                 {
3097ff879b07SJung-uk Kim                     return;
3098ff879b07SJung-uk Kim                 }
3099cfd1ed46SJung-uk Kim                 CurrentOffset += PathLength;
3100ff879b07SJung-uk Kim             }
3101ff879b07SJung-uk Kim 
3102ff879b07SJung-uk Kim             /* Dump the vendor-specific data */
3103ff879b07SJung-uk Kim 
3104ff879b07SJung-uk Kim             VendorDataLength =
3105ff879b07SJung-uk Kim                 Namesp->VendorDataLength;
3106ff879b07SJung-uk Kim             VendorDataOffset =
3107ff879b07SJung-uk Kim                 Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
3108ff879b07SJung-uk Kim 
3109ff879b07SJung-uk Kim             if (VendorDataLength)
3110ff879b07SJung-uk Kim             {
3111ff879b07SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length, 0,
3112ff879b07SJung-uk Kim                     ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset),
3113ff879b07SJung-uk Kim                     VendorDataLength, AcpiDmTableInfoSdev1b);
3114ff879b07SJung-uk Kim                 if (ACPI_FAILURE (Status))
3115ff879b07SJung-uk Kim                 {
3116ff879b07SJung-uk Kim                     return;
3117ff879b07SJung-uk Kim                 }
3118ff879b07SJung-uk Kim             }
3119ff879b07SJung-uk Kim             break;
3120ff879b07SJung-uk Kim 
3121ff879b07SJung-uk Kim         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
3122ff879b07SJung-uk Kim 
3123ff879b07SJung-uk Kim             /* PCI path substructures */
3124ff879b07SJung-uk Kim 
3125ff879b07SJung-uk Kim             Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable);
3126ff879b07SJung-uk Kim             PathOffset = Pcie->PathOffset;
3127ff879b07SJung-uk Kim             PathLength = Pcie->PathLength;
3128ff879b07SJung-uk Kim 
3129ff879b07SJung-uk Kim             while (PathLength)
3130ff879b07SJung-uk Kim             {
3131ff879b07SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length,
3132ff879b07SJung-uk Kim                     PathOffset + Offset,
3133ff879b07SJung-uk Kim                     ACPI_ADD_PTR (UINT8, Pcie, PathOffset),
3134ff879b07SJung-uk Kim                     sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a);
3135ff879b07SJung-uk Kim                 if (ACPI_FAILURE (Status))
3136ff879b07SJung-uk Kim                 {
3137ff879b07SJung-uk Kim                     return;
3138ff879b07SJung-uk Kim                 }
3139ff879b07SJung-uk Kim 
3140ff879b07SJung-uk Kim                 PathOffset += sizeof (ACPI_SDEV_PCIE_PATH);
3141ff879b07SJung-uk Kim                 PathLength -= sizeof (ACPI_SDEV_PCIE_PATH);
3142ff879b07SJung-uk Kim             }
3143ff879b07SJung-uk Kim 
3144ff879b07SJung-uk Kim             /* VendorData */
3145ff879b07SJung-uk Kim 
3146ff879b07SJung-uk Kim             VendorDataLength = Pcie->VendorDataLength;
3147ff879b07SJung-uk Kim             VendorDataOffset = Pcie->PathOffset + Pcie->PathLength;
3148ff879b07SJung-uk Kim 
3149ff879b07SJung-uk Kim             if (VendorDataLength)
3150ff879b07SJung-uk Kim             {
3151ff879b07SJung-uk Kim                 Status = AcpiDmDumpTable (Table->Length, 0,
3152ff879b07SJung-uk Kim                     ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset),
3153ff879b07SJung-uk Kim                     VendorDataLength, AcpiDmTableInfoSdev1b);
3154a009b7dcSJung-uk Kim                 if (ACPI_FAILURE (Status))
3155a009b7dcSJung-uk Kim                 {
3156a009b7dcSJung-uk Kim                     return;
3157a009b7dcSJung-uk Kim                 }
3158ff879b07SJung-uk Kim             }
3159ff879b07SJung-uk Kim             break;
3160ff879b07SJung-uk Kim 
3161ff879b07SJung-uk Kim         default:
3162ff879b07SJung-uk Kim             goto NextSubtable;
3163ff879b07SJung-uk Kim         }
3164ff879b07SJung-uk Kim 
3165ff879b07SJung-uk Kim NextSubtable:
3166ff879b07SJung-uk Kim         /* Point to next subtable */
3167ff879b07SJung-uk Kim 
3168ff879b07SJung-uk Kim         Offset += Subtable->Length;
3169ff879b07SJung-uk Kim         Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable,
3170ff879b07SJung-uk Kim             Subtable->Length);
3171ff879b07SJung-uk Kim     }
3172ff879b07SJung-uk Kim }
3173