xref: /illumos-gate/usr/src/cmd/acpi/common/dmtbdump2.c (revision 35786f68)
1*35786f68SRobert Mustacchi /******************************************************************************
2*35786f68SRobert Mustacchi  *
3*35786f68SRobert Mustacchi  * Module Name: dmtbdump2 - Dump ACPI data tables that contain no AML code
4*35786f68SRobert Mustacchi  *
5*35786f68SRobert Mustacchi  *****************************************************************************/
6*35786f68SRobert Mustacchi 
7*35786f68SRobert Mustacchi /******************************************************************************
8*35786f68SRobert Mustacchi  *
9*35786f68SRobert Mustacchi  * 1. Copyright Notice
10*35786f68SRobert Mustacchi  *
11*35786f68SRobert Mustacchi  * Some or all of this work - Copyright (c) 1999 - 2018, Intel Corp.
12*35786f68SRobert Mustacchi  * All rights reserved.
13*35786f68SRobert Mustacchi  *
14*35786f68SRobert Mustacchi  * 2. License
15*35786f68SRobert Mustacchi  *
16*35786f68SRobert Mustacchi  * 2.1. This is your license from Intel Corp. under its intellectual property
17*35786f68SRobert Mustacchi  * rights. You may have additional license terms from the party that provided
18*35786f68SRobert Mustacchi  * you this software, covering your right to use that party's intellectual
19*35786f68SRobert Mustacchi  * property rights.
20*35786f68SRobert Mustacchi  *
21*35786f68SRobert Mustacchi  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22*35786f68SRobert Mustacchi  * copy of the source code appearing in this file ("Covered Code") an
23*35786f68SRobert Mustacchi  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24*35786f68SRobert Mustacchi  * base code distributed originally by Intel ("Original Intel Code") to copy,
25*35786f68SRobert Mustacchi  * make derivatives, distribute, use and display any portion of the Covered
26*35786f68SRobert Mustacchi  * Code in any form, with the right to sublicense such rights; and
27*35786f68SRobert Mustacchi  *
28*35786f68SRobert Mustacchi  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29*35786f68SRobert Mustacchi  * license (with the right to sublicense), under only those claims of Intel
30*35786f68SRobert Mustacchi  * patents that are infringed by the Original Intel Code, to make, use, sell,
31*35786f68SRobert Mustacchi  * offer to sell, and import the Covered Code and derivative works thereof
32*35786f68SRobert Mustacchi  * solely to the minimum extent necessary to exercise the above copyright
33*35786f68SRobert Mustacchi  * license, and in no event shall the patent license extend to any additions
34*35786f68SRobert Mustacchi  * to or modifications of the Original Intel Code. No other license or right
35*35786f68SRobert Mustacchi  * is granted directly or by implication, estoppel or otherwise;
36*35786f68SRobert Mustacchi  *
37*35786f68SRobert Mustacchi  * The above copyright and patent license is granted only if the following
38*35786f68SRobert Mustacchi  * conditions are met:
39*35786f68SRobert Mustacchi  *
40*35786f68SRobert Mustacchi  * 3. Conditions
41*35786f68SRobert Mustacchi  *
42*35786f68SRobert Mustacchi  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43*35786f68SRobert Mustacchi  * Redistribution of source code of any substantial portion of the Covered
44*35786f68SRobert Mustacchi  * Code or modification with rights to further distribute source must include
45*35786f68SRobert Mustacchi  * the above Copyright Notice, the above License, this list of Conditions,
46*35786f68SRobert Mustacchi  * and the following Disclaimer and Export Compliance provision. In addition,
47*35786f68SRobert Mustacchi  * Licensee must cause all Covered Code to which Licensee contributes to
48*35786f68SRobert Mustacchi  * contain a file documenting the changes Licensee made to create that Covered
49*35786f68SRobert Mustacchi  * Code and the date of any change. Licensee must include in that file the
50*35786f68SRobert Mustacchi  * documentation of any changes made by any predecessor Licensee. Licensee
51*35786f68SRobert Mustacchi  * must include a prominent statement that the modification is derived,
52*35786f68SRobert Mustacchi  * directly or indirectly, from Original Intel Code.
53*35786f68SRobert Mustacchi  *
54*35786f68SRobert Mustacchi  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55*35786f68SRobert Mustacchi  * Redistribution of source code of any substantial portion of the Covered
56*35786f68SRobert Mustacchi  * Code or modification without rights to further distribute source must
57*35786f68SRobert Mustacchi  * include the following Disclaimer and Export Compliance provision in the
58*35786f68SRobert Mustacchi  * documentation and/or other materials provided with distribution. In
59*35786f68SRobert Mustacchi  * addition, Licensee may not authorize further sublicense of source of any
60*35786f68SRobert Mustacchi  * portion of the Covered Code, and must include terms to the effect that the
61*35786f68SRobert Mustacchi  * license from Licensee to its licensee is limited to the intellectual
62*35786f68SRobert Mustacchi  * property embodied in the software Licensee provides to its licensee, and
63*35786f68SRobert Mustacchi  * not to intellectual property embodied in modifications its licensee may
64*35786f68SRobert Mustacchi  * make.
65*35786f68SRobert Mustacchi  *
66*35786f68SRobert Mustacchi  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67*35786f68SRobert Mustacchi  * substantial portion of the Covered Code or modification must reproduce the
68*35786f68SRobert Mustacchi  * above Copyright Notice, and the following Disclaimer and Export Compliance
69*35786f68SRobert Mustacchi  * provision in the documentation and/or other materials provided with the
70*35786f68SRobert Mustacchi  * distribution.
71*35786f68SRobert Mustacchi  *
72*35786f68SRobert Mustacchi  * 3.4. Intel retains all right, title, and interest in and to the Original
73*35786f68SRobert Mustacchi  * Intel Code.
74*35786f68SRobert Mustacchi  *
75*35786f68SRobert Mustacchi  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76*35786f68SRobert Mustacchi  * Intel shall be used in advertising or otherwise to promote the sale, use or
77*35786f68SRobert Mustacchi  * other dealings in products derived from or relating to the Covered Code
78*35786f68SRobert Mustacchi  * without prior written authorization from Intel.
79*35786f68SRobert Mustacchi  *
80*35786f68SRobert Mustacchi  * 4. Disclaimer and Export Compliance
81*35786f68SRobert Mustacchi  *
82*35786f68SRobert Mustacchi  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83*35786f68SRobert Mustacchi  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84*35786f68SRobert Mustacchi  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85*35786f68SRobert Mustacchi  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86*35786f68SRobert Mustacchi  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87*35786f68SRobert Mustacchi  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88*35786f68SRobert Mustacchi  * PARTICULAR PURPOSE.
89*35786f68SRobert Mustacchi  *
90*35786f68SRobert Mustacchi  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91*35786f68SRobert Mustacchi  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92*35786f68SRobert Mustacchi  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93*35786f68SRobert Mustacchi  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94*35786f68SRobert Mustacchi  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95*35786f68SRobert Mustacchi  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96*35786f68SRobert Mustacchi  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97*35786f68SRobert Mustacchi  * LIMITED REMEDY.
98*35786f68SRobert Mustacchi  *
99*35786f68SRobert Mustacchi  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100*35786f68SRobert Mustacchi  * software or system incorporating such software without first obtaining any
101*35786f68SRobert Mustacchi  * required license or other approval from the U. S. Department of Commerce or
102*35786f68SRobert Mustacchi  * any other agency or department of the United States Government. In the
103*35786f68SRobert Mustacchi  * event Licensee exports any such software from the United States or
104*35786f68SRobert Mustacchi  * re-exports any such software from a foreign destination, Licensee shall
105*35786f68SRobert Mustacchi  * ensure that the distribution and export/re-export of the software is in
106*35786f68SRobert Mustacchi  * compliance with all laws, regulations, orders, or other restrictions of the
107*35786f68SRobert Mustacchi  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108*35786f68SRobert Mustacchi  * any of its subsidiaries will export/re-export any technical data, process,
109*35786f68SRobert Mustacchi  * software, or service, directly or indirectly, to any country for which the
110*35786f68SRobert Mustacchi  * United States government or any agency thereof requires an export license,
111*35786f68SRobert Mustacchi  * other governmental approval, or letter of assurance, without first obtaining
112*35786f68SRobert Mustacchi  * such license, approval or letter.
113*35786f68SRobert Mustacchi  *
114*35786f68SRobert Mustacchi  *****************************************************************************
115*35786f68SRobert Mustacchi  *
116*35786f68SRobert Mustacchi  * Alternatively, you may choose to be licensed under the terms of the
117*35786f68SRobert Mustacchi  * following license:
118*35786f68SRobert Mustacchi  *
119*35786f68SRobert Mustacchi  * Redistribution and use in source and binary forms, with or without
120*35786f68SRobert Mustacchi  * modification, are permitted provided that the following conditions
121*35786f68SRobert Mustacchi  * are met:
122*35786f68SRobert Mustacchi  * 1. Redistributions of source code must retain the above copyright
123*35786f68SRobert Mustacchi  *    notice, this list of conditions, and the following disclaimer,
124*35786f68SRobert Mustacchi  *    without modification.
125*35786f68SRobert Mustacchi  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126*35786f68SRobert Mustacchi  *    substantially similar to the "NO WARRANTY" disclaimer below
127*35786f68SRobert Mustacchi  *    ("Disclaimer") and any redistribution must be conditioned upon
128*35786f68SRobert Mustacchi  *    including a substantially similar Disclaimer requirement for further
129*35786f68SRobert Mustacchi  *    binary redistribution.
130*35786f68SRobert Mustacchi  * 3. Neither the names of the above-listed copyright holders nor the names
131*35786f68SRobert Mustacchi  *    of any contributors may be used to endorse or promote products derived
132*35786f68SRobert Mustacchi  *    from this software without specific prior written permission.
133*35786f68SRobert Mustacchi  *
134*35786f68SRobert Mustacchi  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135*35786f68SRobert Mustacchi  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136*35786f68SRobert Mustacchi  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137*35786f68SRobert Mustacchi  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138*35786f68SRobert Mustacchi  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139*35786f68SRobert Mustacchi  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140*35786f68SRobert Mustacchi  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141*35786f68SRobert Mustacchi  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142*35786f68SRobert Mustacchi  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143*35786f68SRobert Mustacchi  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144*35786f68SRobert Mustacchi  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145*35786f68SRobert Mustacchi  *
146*35786f68SRobert Mustacchi  * Alternatively, you may choose to be licensed under the terms of the
147*35786f68SRobert Mustacchi  * GNU General Public License ("GPL") version 2 as published by the Free
148*35786f68SRobert Mustacchi  * Software Foundation.
149*35786f68SRobert Mustacchi  *
150*35786f68SRobert Mustacchi  *****************************************************************************/
151*35786f68SRobert Mustacchi 
152*35786f68SRobert Mustacchi #include "acpi.h"
153*35786f68SRobert Mustacchi #include "accommon.h"
154*35786f68SRobert Mustacchi #include "acdisasm.h"
155*35786f68SRobert Mustacchi #include "actables.h"
156*35786f68SRobert Mustacchi 
157*35786f68SRobert Mustacchi /* This module used for application-level code only */
158*35786f68SRobert Mustacchi 
159*35786f68SRobert Mustacchi #define _COMPONENT          ACPI_CA_DISASSEMBLER
160*35786f68SRobert Mustacchi         ACPI_MODULE_NAME    ("dmtbdump2")
161*35786f68SRobert Mustacchi 
162*35786f68SRobert Mustacchi 
163*35786f68SRobert Mustacchi /*******************************************************************************
164*35786f68SRobert Mustacchi  *
165*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmDumpIort
166*35786f68SRobert Mustacchi  *
167*35786f68SRobert Mustacchi  * PARAMETERS:  Table               - A IORT table
168*35786f68SRobert Mustacchi  *
169*35786f68SRobert Mustacchi  * RETURN:      None
170*35786f68SRobert Mustacchi  *
171*35786f68SRobert Mustacchi  * DESCRIPTION: Format the contents of a IORT
172*35786f68SRobert Mustacchi  *
173*35786f68SRobert Mustacchi  ******************************************************************************/
174*35786f68SRobert Mustacchi 
175*35786f68SRobert Mustacchi void
AcpiDmDumpIort(ACPI_TABLE_HEADER * Table)176*35786f68SRobert Mustacchi AcpiDmDumpIort (
177*35786f68SRobert Mustacchi     ACPI_TABLE_HEADER       *Table)
178*35786f68SRobert Mustacchi {
179*35786f68SRobert Mustacchi     ACPI_STATUS             Status;
180*35786f68SRobert Mustacchi     ACPI_TABLE_IORT         *Iort;
181*35786f68SRobert Mustacchi     ACPI_IORT_NODE          *IortNode;
182*35786f68SRobert Mustacchi     ACPI_IORT_ITS_GROUP     *IortItsGroup = NULL;
183*35786f68SRobert Mustacchi     ACPI_IORT_SMMU          *IortSmmu = NULL;
184*35786f68SRobert Mustacchi     UINT32                  Offset;
185*35786f68SRobert Mustacchi     UINT32                  NodeOffset;
186*35786f68SRobert Mustacchi     UINT32                  Length;
187*35786f68SRobert Mustacchi     ACPI_DMTABLE_INFO       *InfoTable;
188*35786f68SRobert Mustacchi     char                    *String;
189*35786f68SRobert Mustacchi     UINT32                  i;
190*35786f68SRobert Mustacchi 
191*35786f68SRobert Mustacchi 
192*35786f68SRobert Mustacchi     /* Main table */
193*35786f68SRobert Mustacchi 
194*35786f68SRobert Mustacchi     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort);
195*35786f68SRobert Mustacchi     if (ACPI_FAILURE (Status))
196*35786f68SRobert Mustacchi     {
197*35786f68SRobert Mustacchi         return;
198*35786f68SRobert Mustacchi     }
199*35786f68SRobert Mustacchi 
200*35786f68SRobert Mustacchi     Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);
201*35786f68SRobert Mustacchi     Offset = sizeof (ACPI_TABLE_IORT);
202*35786f68SRobert Mustacchi 
203*35786f68SRobert Mustacchi     /* Dump the OptionalPadding (optional) */
204*35786f68SRobert Mustacchi 
205*35786f68SRobert Mustacchi     if (Iort->NodeOffset > Offset)
206*35786f68SRobert Mustacchi     {
207*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset, Table,
208*35786f68SRobert Mustacchi             Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad);
209*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
210*35786f68SRobert Mustacchi         {
211*35786f68SRobert Mustacchi             return;
212*35786f68SRobert Mustacchi         }
213*35786f68SRobert Mustacchi     }
214*35786f68SRobert Mustacchi 
215*35786f68SRobert Mustacchi     Offset = Iort->NodeOffset;
216*35786f68SRobert Mustacchi     while (Offset < Table->Length)
217*35786f68SRobert Mustacchi     {
218*35786f68SRobert Mustacchi         /* Common subtable header */
219*35786f68SRobert Mustacchi 
220*35786f68SRobert Mustacchi         IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
221*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
222*35786f68SRobert Mustacchi         Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
223*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset,
224*35786f68SRobert Mustacchi             IortNode, Length, AcpiDmTableInfoIortHdr);
225*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
226*35786f68SRobert Mustacchi         {
227*35786f68SRobert Mustacchi             return;
228*35786f68SRobert Mustacchi         }
229*35786f68SRobert Mustacchi 
230*35786f68SRobert Mustacchi         NodeOffset = Length;
231*35786f68SRobert Mustacchi 
232*35786f68SRobert Mustacchi         switch (IortNode->Type)
233*35786f68SRobert Mustacchi         {
234*35786f68SRobert Mustacchi         case ACPI_IORT_NODE_ITS_GROUP:
235*35786f68SRobert Mustacchi 
236*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoIort0;
237*35786f68SRobert Mustacchi             Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers);
238*35786f68SRobert Mustacchi             IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset);
239*35786f68SRobert Mustacchi             break;
240*35786f68SRobert Mustacchi 
241*35786f68SRobert Mustacchi         case ACPI_IORT_NODE_NAMED_COMPONENT:
242*35786f68SRobert Mustacchi 
243*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoIort1;
244*35786f68SRobert Mustacchi             Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName);
245*35786f68SRobert Mustacchi             String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length);
246*35786f68SRobert Mustacchi             Length += strlen (String) + 1;
247*35786f68SRobert Mustacchi             break;
248*35786f68SRobert Mustacchi 
249*35786f68SRobert Mustacchi         case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
250*35786f68SRobert Mustacchi 
251*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoIort2;
252*35786f68SRobert Mustacchi             Length = IortNode->Length - NodeOffset;
253*35786f68SRobert Mustacchi             break;
254*35786f68SRobert Mustacchi 
255*35786f68SRobert Mustacchi         case ACPI_IORT_NODE_SMMU:
256*35786f68SRobert Mustacchi 
257*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoIort3;
258*35786f68SRobert Mustacchi             Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts);
259*35786f68SRobert Mustacchi             IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset);
260*35786f68SRobert Mustacchi             break;
261*35786f68SRobert Mustacchi 
262*35786f68SRobert Mustacchi         case ACPI_IORT_NODE_SMMU_V3:
263*35786f68SRobert Mustacchi 
264*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoIort4;
265*35786f68SRobert Mustacchi             Length = IortNode->Length - NodeOffset;
266*35786f68SRobert Mustacchi             break;
267*35786f68SRobert Mustacchi 
268*35786f68SRobert Mustacchi         case ACPI_IORT_NODE_PMCG:
269*35786f68SRobert Mustacchi 
270*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoIort5;
271*35786f68SRobert Mustacchi             Length = IortNode->Length - NodeOffset;
272*35786f68SRobert Mustacchi             break;
273*35786f68SRobert Mustacchi 
274*35786f68SRobert Mustacchi         default:
275*35786f68SRobert Mustacchi 
276*35786f68SRobert Mustacchi             AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",
277*35786f68SRobert Mustacchi                 IortNode->Type);
278*35786f68SRobert Mustacchi 
279*35786f68SRobert Mustacchi             /* Attempt to continue */
280*35786f68SRobert Mustacchi 
281*35786f68SRobert Mustacchi             if (!IortNode->Length)
282*35786f68SRobert Mustacchi             {
283*35786f68SRobert Mustacchi                 AcpiOsPrintf ("Invalid zero length IORT node\n");
284*35786f68SRobert Mustacchi                 return;
285*35786f68SRobert Mustacchi             }
286*35786f68SRobert Mustacchi             goto NextSubtable;
287*35786f68SRobert Mustacchi         }
288*35786f68SRobert Mustacchi 
289*35786f68SRobert Mustacchi         /* Dump the node subtable header */
290*35786f68SRobert Mustacchi 
291*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
292*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
293*35786f68SRobert Mustacchi             ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
294*35786f68SRobert Mustacchi             Length, InfoTable);
295*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
296*35786f68SRobert Mustacchi         {
297*35786f68SRobert Mustacchi             return;
298*35786f68SRobert Mustacchi         }
299*35786f68SRobert Mustacchi 
300*35786f68SRobert Mustacchi         NodeOffset += Length;
301*35786f68SRobert Mustacchi 
302*35786f68SRobert Mustacchi         /* Dump the node specific data */
303*35786f68SRobert Mustacchi 
304*35786f68SRobert Mustacchi         switch (IortNode->Type)
305*35786f68SRobert Mustacchi         {
306*35786f68SRobert Mustacchi         case ACPI_IORT_NODE_ITS_GROUP:
307*35786f68SRobert Mustacchi 
308*35786f68SRobert Mustacchi             /* Validate IortItsGroup to avoid compiler warnings */
309*35786f68SRobert Mustacchi 
310*35786f68SRobert Mustacchi             if (IortItsGroup)
311*35786f68SRobert Mustacchi             {
312*35786f68SRobert Mustacchi                 for (i = 0; i < IortItsGroup->ItsCount; i++)
313*35786f68SRobert Mustacchi                 {
314*35786f68SRobert Mustacchi                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
315*35786f68SRobert Mustacchi                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
316*35786f68SRobert Mustacchi                         4, AcpiDmTableInfoIort0a);
317*35786f68SRobert Mustacchi                     NodeOffset += 4;
318*35786f68SRobert Mustacchi                 }
319*35786f68SRobert Mustacchi             }
320*35786f68SRobert Mustacchi             break;
321*35786f68SRobert Mustacchi 
322*35786f68SRobert Mustacchi         case ACPI_IORT_NODE_NAMED_COMPONENT:
323*35786f68SRobert Mustacchi 
324*35786f68SRobert Mustacchi             /* Dump the Padding (optional) */
325*35786f68SRobert Mustacchi 
326*35786f68SRobert Mustacchi             if (IortNode->Length > NodeOffset)
327*35786f68SRobert Mustacchi             {
328*35786f68SRobert Mustacchi                 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
329*35786f68SRobert Mustacchi                     Table, IortNode->Length - NodeOffset,
330*35786f68SRobert Mustacchi                     AcpiDmTableInfoIort1a);
331*35786f68SRobert Mustacchi                 if (ACPI_FAILURE (Status))
332*35786f68SRobert Mustacchi                 {
333*35786f68SRobert Mustacchi                     return;
334*35786f68SRobert Mustacchi                 }
335*35786f68SRobert Mustacchi             }
336*35786f68SRobert Mustacchi             break;
337*35786f68SRobert Mustacchi 
338*35786f68SRobert Mustacchi         case ACPI_IORT_NODE_SMMU:
339*35786f68SRobert Mustacchi 
340*35786f68SRobert Mustacchi             AcpiOsPrintf ("\n");
341*35786f68SRobert Mustacchi 
342*35786f68SRobert Mustacchi             /* Validate IortSmmu to avoid compiler warnings */
343*35786f68SRobert Mustacchi 
344*35786f68SRobert Mustacchi             if (IortSmmu)
345*35786f68SRobert Mustacchi             {
346*35786f68SRobert Mustacchi                 Length = 2 * sizeof (UINT64);
347*35786f68SRobert Mustacchi                 NodeOffset = IortSmmu->GlobalInterruptOffset;
348*35786f68SRobert Mustacchi                 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
349*35786f68SRobert Mustacchi                     ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
350*35786f68SRobert Mustacchi                     Length, AcpiDmTableInfoIort3a);
351*35786f68SRobert Mustacchi                 if (ACPI_FAILURE (Status))
352*35786f68SRobert Mustacchi                 {
353*35786f68SRobert Mustacchi                     return;
354*35786f68SRobert Mustacchi                 }
355*35786f68SRobert Mustacchi 
356*35786f68SRobert Mustacchi                 NodeOffset = IortSmmu->ContextInterruptOffset;
357*35786f68SRobert Mustacchi                 for (i = 0; i < IortSmmu->ContextInterruptCount; i++)
358*35786f68SRobert Mustacchi                 {
359*35786f68SRobert Mustacchi                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
360*35786f68SRobert Mustacchi                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
361*35786f68SRobert Mustacchi                         8, AcpiDmTableInfoIort3b);
362*35786f68SRobert Mustacchi                     if (ACPI_FAILURE (Status))
363*35786f68SRobert Mustacchi                     {
364*35786f68SRobert Mustacchi                         return;
365*35786f68SRobert Mustacchi                     }
366*35786f68SRobert Mustacchi 
367*35786f68SRobert Mustacchi                     NodeOffset += 8;
368*35786f68SRobert Mustacchi                 }
369*35786f68SRobert Mustacchi 
370*35786f68SRobert Mustacchi                 NodeOffset = IortSmmu->PmuInterruptOffset;
371*35786f68SRobert Mustacchi                 for (i = 0; i < IortSmmu->PmuInterruptCount; i++)
372*35786f68SRobert Mustacchi                 {
373*35786f68SRobert Mustacchi                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
374*35786f68SRobert Mustacchi                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
375*35786f68SRobert Mustacchi                         8, AcpiDmTableInfoIort3c);
376*35786f68SRobert Mustacchi                     if (ACPI_FAILURE (Status))
377*35786f68SRobert Mustacchi                     {
378*35786f68SRobert Mustacchi                         return;
379*35786f68SRobert Mustacchi                     }
380*35786f68SRobert Mustacchi 
381*35786f68SRobert Mustacchi                     NodeOffset += 8;
382*35786f68SRobert Mustacchi                 }
383*35786f68SRobert Mustacchi             }
384*35786f68SRobert Mustacchi             break;
385*35786f68SRobert Mustacchi 
386*35786f68SRobert Mustacchi         default:
387*35786f68SRobert Mustacchi 
388*35786f68SRobert Mustacchi             break;
389*35786f68SRobert Mustacchi         }
390*35786f68SRobert Mustacchi 
391*35786f68SRobert Mustacchi         /* Dump the ID mappings */
392*35786f68SRobert Mustacchi 
393*35786f68SRobert Mustacchi         NodeOffset = IortNode->MappingOffset;
394*35786f68SRobert Mustacchi         for (i = 0; i < IortNode->MappingCount; i++)
395*35786f68SRobert Mustacchi         {
396*35786f68SRobert Mustacchi             AcpiOsPrintf ("\n");
397*35786f68SRobert Mustacchi             Length = sizeof (ACPI_IORT_ID_MAPPING);
398*35786f68SRobert Mustacchi             Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
399*35786f68SRobert Mustacchi                 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
400*35786f68SRobert Mustacchi                 Length, AcpiDmTableInfoIortMap);
401*35786f68SRobert Mustacchi             if (ACPI_FAILURE (Status))
402*35786f68SRobert Mustacchi             {
403*35786f68SRobert Mustacchi                 return;
404*35786f68SRobert Mustacchi             }
405*35786f68SRobert Mustacchi 
406*35786f68SRobert Mustacchi             NodeOffset += Length;
407*35786f68SRobert Mustacchi         }
408*35786f68SRobert Mustacchi 
409*35786f68SRobert Mustacchi NextSubtable:
410*35786f68SRobert Mustacchi         /* Point to next node subtable */
411*35786f68SRobert Mustacchi 
412*35786f68SRobert Mustacchi         Offset += IortNode->Length;
413*35786f68SRobert Mustacchi         IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, IortNode->Length);
414*35786f68SRobert Mustacchi     }
415*35786f68SRobert Mustacchi }
416*35786f68SRobert Mustacchi 
417*35786f68SRobert Mustacchi 
418*35786f68SRobert Mustacchi /*******************************************************************************
419*35786f68SRobert Mustacchi  *
420*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmDumpIvrs
421*35786f68SRobert Mustacchi  *
422*35786f68SRobert Mustacchi  * PARAMETERS:  Table               - A IVRS table
423*35786f68SRobert Mustacchi  *
424*35786f68SRobert Mustacchi  * RETURN:      None
425*35786f68SRobert Mustacchi  *
426*35786f68SRobert Mustacchi  * DESCRIPTION: Format the contents of a IVRS
427*35786f68SRobert Mustacchi  *
428*35786f68SRobert Mustacchi  ******************************************************************************/
429*35786f68SRobert Mustacchi 
430*35786f68SRobert Mustacchi static UINT8 EntrySizes[] = {4,8,16,32};
431*35786f68SRobert Mustacchi 
432*35786f68SRobert Mustacchi void
AcpiDmDumpIvrs(ACPI_TABLE_HEADER * Table)433*35786f68SRobert Mustacchi AcpiDmDumpIvrs (
434*35786f68SRobert Mustacchi     ACPI_TABLE_HEADER       *Table)
435*35786f68SRobert Mustacchi {
436*35786f68SRobert Mustacchi     ACPI_STATUS             Status;
437*35786f68SRobert Mustacchi     UINT32                  Offset = sizeof (ACPI_TABLE_IVRS);
438*35786f68SRobert Mustacchi     UINT32                  EntryOffset;
439*35786f68SRobert Mustacchi     UINT32                  EntryLength;
440*35786f68SRobert Mustacchi     UINT32                  EntryType;
441*35786f68SRobert Mustacchi     ACPI_IVRS_DE_HEADER     *DeviceEntry;
442*35786f68SRobert Mustacchi     ACPI_IVRS_HEADER        *Subtable;
443*35786f68SRobert Mustacchi     ACPI_DMTABLE_INFO       *InfoTable;
444*35786f68SRobert Mustacchi 
445*35786f68SRobert Mustacchi 
446*35786f68SRobert Mustacchi     /* Main table */
447*35786f68SRobert Mustacchi 
448*35786f68SRobert Mustacchi     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
449*35786f68SRobert Mustacchi     if (ACPI_FAILURE (Status))
450*35786f68SRobert Mustacchi     {
451*35786f68SRobert Mustacchi         return;
452*35786f68SRobert Mustacchi     }
453*35786f68SRobert Mustacchi 
454*35786f68SRobert Mustacchi     /* Subtables */
455*35786f68SRobert Mustacchi 
456*35786f68SRobert Mustacchi     Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
457*35786f68SRobert Mustacchi     while (Offset < Table->Length)
458*35786f68SRobert Mustacchi     {
459*35786f68SRobert Mustacchi         /* Common subtable header */
460*35786f68SRobert Mustacchi 
461*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
462*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
463*35786f68SRobert Mustacchi             Subtable->Length, AcpiDmTableInfoIvrsHdr);
464*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
465*35786f68SRobert Mustacchi         {
466*35786f68SRobert Mustacchi             return;
467*35786f68SRobert Mustacchi         }
468*35786f68SRobert Mustacchi 
469*35786f68SRobert Mustacchi         switch (Subtable->Type)
470*35786f68SRobert Mustacchi         {
471*35786f68SRobert Mustacchi         case ACPI_IVRS_TYPE_HARDWARE:
472*35786f68SRobert Mustacchi 
473*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoIvrs0;
474*35786f68SRobert Mustacchi             break;
475*35786f68SRobert Mustacchi 
476*35786f68SRobert Mustacchi         case ACPI_IVRS_TYPE_MEMORY1:
477*35786f68SRobert Mustacchi         case ACPI_IVRS_TYPE_MEMORY2:
478*35786f68SRobert Mustacchi         case ACPI_IVRS_TYPE_MEMORY3:
479*35786f68SRobert Mustacchi 
480*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoIvrs1;
481*35786f68SRobert Mustacchi             break;
482*35786f68SRobert Mustacchi 
483*35786f68SRobert Mustacchi         default:
484*35786f68SRobert Mustacchi 
485*35786f68SRobert Mustacchi             AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n",
486*35786f68SRobert Mustacchi                 Subtable->Type);
487*35786f68SRobert Mustacchi 
488*35786f68SRobert Mustacchi             /* Attempt to continue */
489*35786f68SRobert Mustacchi 
490*35786f68SRobert Mustacchi             if (!Subtable->Length)
491*35786f68SRobert Mustacchi             {
492*35786f68SRobert Mustacchi                 AcpiOsPrintf ("Invalid zero length subtable\n");
493*35786f68SRobert Mustacchi                 return;
494*35786f68SRobert Mustacchi             }
495*35786f68SRobert Mustacchi             goto NextSubtable;
496*35786f68SRobert Mustacchi         }
497*35786f68SRobert Mustacchi 
498*35786f68SRobert Mustacchi         /* Dump the subtable */
499*35786f68SRobert Mustacchi 
500*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
501*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
502*35786f68SRobert Mustacchi             Subtable->Length, InfoTable);
503*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
504*35786f68SRobert Mustacchi         {
505*35786f68SRobert Mustacchi             return;
506*35786f68SRobert Mustacchi         }
507*35786f68SRobert Mustacchi 
508*35786f68SRobert Mustacchi         /* The hardware subtable can contain multiple device entries */
509*35786f68SRobert Mustacchi 
510*35786f68SRobert Mustacchi         if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE)
511*35786f68SRobert Mustacchi         {
512*35786f68SRobert Mustacchi             EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE);
513*35786f68SRobert Mustacchi             DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
514*35786f68SRobert Mustacchi                 sizeof (ACPI_IVRS_HARDWARE));
515*35786f68SRobert Mustacchi 
516*35786f68SRobert Mustacchi             while (EntryOffset < (Offset + Subtable->Length))
517*35786f68SRobert Mustacchi             {
518*35786f68SRobert Mustacchi                 AcpiOsPrintf ("\n");
519*35786f68SRobert Mustacchi                 /*
520*35786f68SRobert Mustacchi                  * Upper 2 bits of Type encode the length of the device entry
521*35786f68SRobert Mustacchi                  *
522*35786f68SRobert Mustacchi                  * 00 = 4 byte
523*35786f68SRobert Mustacchi                  * 01 = 8 byte
524*35786f68SRobert Mustacchi                  * 10 = 16 byte - currently no entries defined
525*35786f68SRobert Mustacchi                  * 11 = 32 byte - currently no entries defined
526*35786f68SRobert Mustacchi                  */
527*35786f68SRobert Mustacchi                 EntryType = DeviceEntry->Type;
528*35786f68SRobert Mustacchi                 EntryLength = EntrySizes [EntryType >> 6];
529*35786f68SRobert Mustacchi 
530*35786f68SRobert Mustacchi                 switch (EntryType)
531*35786f68SRobert Mustacchi                 {
532*35786f68SRobert Mustacchi                 /* 4-byte device entries */
533*35786f68SRobert Mustacchi 
534*35786f68SRobert Mustacchi                 case ACPI_IVRS_TYPE_PAD4:
535*35786f68SRobert Mustacchi                 case ACPI_IVRS_TYPE_ALL:
536*35786f68SRobert Mustacchi                 case ACPI_IVRS_TYPE_SELECT:
537*35786f68SRobert Mustacchi                 case ACPI_IVRS_TYPE_START:
538*35786f68SRobert Mustacchi                 case ACPI_IVRS_TYPE_END:
539*35786f68SRobert Mustacchi 
540*35786f68SRobert Mustacchi                     InfoTable = AcpiDmTableInfoIvrs4;
541*35786f68SRobert Mustacchi                     break;
542*35786f68SRobert Mustacchi 
543*35786f68SRobert Mustacchi                 /* 8-byte entries, type A */
544*35786f68SRobert Mustacchi 
545*35786f68SRobert Mustacchi                 case ACPI_IVRS_TYPE_ALIAS_SELECT:
546*35786f68SRobert Mustacchi                 case ACPI_IVRS_TYPE_ALIAS_START:
547*35786f68SRobert Mustacchi 
548*35786f68SRobert Mustacchi                     InfoTable = AcpiDmTableInfoIvrs8a;
549*35786f68SRobert Mustacchi                     break;
550*35786f68SRobert Mustacchi 
551*35786f68SRobert Mustacchi                 /* 8-byte entries, type B */
552*35786f68SRobert Mustacchi 
553*35786f68SRobert Mustacchi                 case ACPI_IVRS_TYPE_PAD8:
554*35786f68SRobert Mustacchi                 case ACPI_IVRS_TYPE_EXT_SELECT:
555*35786f68SRobert Mustacchi                 case ACPI_IVRS_TYPE_EXT_START:
556*35786f68SRobert Mustacchi 
557*35786f68SRobert Mustacchi                     InfoTable = AcpiDmTableInfoIvrs8b;
558*35786f68SRobert Mustacchi                     break;
559*35786f68SRobert Mustacchi 
560*35786f68SRobert Mustacchi                 /* 8-byte entries, type C */
561*35786f68SRobert Mustacchi 
562*35786f68SRobert Mustacchi                 case ACPI_IVRS_TYPE_SPECIAL:
563*35786f68SRobert Mustacchi 
564*35786f68SRobert Mustacchi                     InfoTable = AcpiDmTableInfoIvrs8c;
565*35786f68SRobert Mustacchi                     break;
566*35786f68SRobert Mustacchi 
567*35786f68SRobert Mustacchi                 default:
568*35786f68SRobert Mustacchi                     InfoTable = AcpiDmTableInfoIvrs4;
569*35786f68SRobert Mustacchi                     AcpiOsPrintf (
570*35786f68SRobert Mustacchi                         "\n**** Unknown IVRS device entry type/length: "
571*35786f68SRobert Mustacchi                         "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
572*35786f68SRobert Mustacchi                         EntryType, EntryLength, EntryOffset);
573*35786f68SRobert Mustacchi                     break;
574*35786f68SRobert Mustacchi                 }
575*35786f68SRobert Mustacchi 
576*35786f68SRobert Mustacchi                 /* Dump the Device Entry */
577*35786f68SRobert Mustacchi 
578*35786f68SRobert Mustacchi                 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
579*35786f68SRobert Mustacchi                     DeviceEntry, EntryLength, InfoTable);
580*35786f68SRobert Mustacchi                 if (ACPI_FAILURE (Status))
581*35786f68SRobert Mustacchi                 {
582*35786f68SRobert Mustacchi                     return;
583*35786f68SRobert Mustacchi                 }
584*35786f68SRobert Mustacchi 
585*35786f68SRobert Mustacchi                 EntryOffset += EntryLength;
586*35786f68SRobert Mustacchi                 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
587*35786f68SRobert Mustacchi                     EntryLength);
588*35786f68SRobert Mustacchi             }
589*35786f68SRobert Mustacchi         }
590*35786f68SRobert Mustacchi 
591*35786f68SRobert Mustacchi NextSubtable:
592*35786f68SRobert Mustacchi         /* Point to next subtable */
593*35786f68SRobert Mustacchi 
594*35786f68SRobert Mustacchi         Offset += Subtable->Length;
595*35786f68SRobert Mustacchi         Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, Subtable->Length);
596*35786f68SRobert Mustacchi     }
597*35786f68SRobert Mustacchi }
598*35786f68SRobert Mustacchi 
599*35786f68SRobert Mustacchi 
600*35786f68SRobert Mustacchi /*******************************************************************************
601*35786f68SRobert Mustacchi  *
602*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmDumpLpit
603*35786f68SRobert Mustacchi  *
604*35786f68SRobert Mustacchi  * PARAMETERS:  Table               - A LPIT table
605*35786f68SRobert Mustacchi  *
606*35786f68SRobert Mustacchi  * RETURN:      None
607*35786f68SRobert Mustacchi  *
608*35786f68SRobert Mustacchi  * DESCRIPTION: Format the contents of a LPIT. This table type consists
609*35786f68SRobert Mustacchi  *              of an open-ended number of subtables. Note: There are no
610*35786f68SRobert Mustacchi  *              entries in the main table. An LPIT consists of the table
611*35786f68SRobert Mustacchi  *              header and then subtables only.
612*35786f68SRobert Mustacchi  *
613*35786f68SRobert Mustacchi  ******************************************************************************/
614*35786f68SRobert Mustacchi 
615*35786f68SRobert Mustacchi void
AcpiDmDumpLpit(ACPI_TABLE_HEADER * Table)616*35786f68SRobert Mustacchi AcpiDmDumpLpit (
617*35786f68SRobert Mustacchi     ACPI_TABLE_HEADER       *Table)
618*35786f68SRobert Mustacchi {
619*35786f68SRobert Mustacchi     ACPI_STATUS             Status;
620*35786f68SRobert Mustacchi     ACPI_LPIT_HEADER        *Subtable;
621*35786f68SRobert Mustacchi     UINT32                  Length = Table->Length;
622*35786f68SRobert Mustacchi     UINT32                  Offset = sizeof (ACPI_TABLE_LPIT);
623*35786f68SRobert Mustacchi     ACPI_DMTABLE_INFO       *InfoTable;
624*35786f68SRobert Mustacchi     UINT32                  SubtableLength;
625*35786f68SRobert Mustacchi 
626*35786f68SRobert Mustacchi 
627*35786f68SRobert Mustacchi     /* Subtables */
628*35786f68SRobert Mustacchi 
629*35786f68SRobert Mustacchi     Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
630*35786f68SRobert Mustacchi     while (Offset < Table->Length)
631*35786f68SRobert Mustacchi     {
632*35786f68SRobert Mustacchi         /* Common subtable header */
633*35786f68SRobert Mustacchi 
634*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Length, Offset, Subtable,
635*35786f68SRobert Mustacchi             sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);
636*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
637*35786f68SRobert Mustacchi         {
638*35786f68SRobert Mustacchi             return;
639*35786f68SRobert Mustacchi         }
640*35786f68SRobert Mustacchi 
641*35786f68SRobert Mustacchi         switch (Subtable->Type)
642*35786f68SRobert Mustacchi         {
643*35786f68SRobert Mustacchi         case ACPI_LPIT_TYPE_NATIVE_CSTATE:
644*35786f68SRobert Mustacchi 
645*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoLpit0;
646*35786f68SRobert Mustacchi             SubtableLength = sizeof (ACPI_LPIT_NATIVE);
647*35786f68SRobert Mustacchi             break;
648*35786f68SRobert Mustacchi 
649*35786f68SRobert Mustacchi         default:
650*35786f68SRobert Mustacchi 
651*35786f68SRobert Mustacchi             /* Cannot continue on unknown type - no length */
652*35786f68SRobert Mustacchi 
653*35786f68SRobert Mustacchi             AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n",
654*35786f68SRobert Mustacchi                 Subtable->Type);
655*35786f68SRobert Mustacchi             return;
656*35786f68SRobert Mustacchi         }
657*35786f68SRobert Mustacchi 
658*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Length, Offset, Subtable,
659*35786f68SRobert Mustacchi             SubtableLength, InfoTable);
660*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
661*35786f68SRobert Mustacchi         {
662*35786f68SRobert Mustacchi             return;
663*35786f68SRobert Mustacchi         }
664*35786f68SRobert Mustacchi 
665*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
666*35786f68SRobert Mustacchi 
667*35786f68SRobert Mustacchi         /* Point to next subtable */
668*35786f68SRobert Mustacchi 
669*35786f68SRobert Mustacchi         Offset += SubtableLength;
670*35786f68SRobert Mustacchi         Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Subtable, SubtableLength);
671*35786f68SRobert Mustacchi     }
672*35786f68SRobert Mustacchi }
673*35786f68SRobert Mustacchi 
674*35786f68SRobert Mustacchi 
675*35786f68SRobert Mustacchi /*******************************************************************************
676*35786f68SRobert Mustacchi  *
677*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmDumpMadt
678*35786f68SRobert Mustacchi  *
679*35786f68SRobert Mustacchi  * PARAMETERS:  Table               - A MADT table
680*35786f68SRobert Mustacchi  *
681*35786f68SRobert Mustacchi  * RETURN:      None
682*35786f68SRobert Mustacchi  *
683*35786f68SRobert Mustacchi  * DESCRIPTION: Format the contents of a MADT. This table type consists
684*35786f68SRobert Mustacchi  *              of an open-ended number of subtables.
685*35786f68SRobert Mustacchi  *
686*35786f68SRobert Mustacchi  ******************************************************************************/
687*35786f68SRobert Mustacchi 
688*35786f68SRobert Mustacchi void
AcpiDmDumpMadt(ACPI_TABLE_HEADER * Table)689*35786f68SRobert Mustacchi AcpiDmDumpMadt (
690*35786f68SRobert Mustacchi     ACPI_TABLE_HEADER       *Table)
691*35786f68SRobert Mustacchi {
692*35786f68SRobert Mustacchi     ACPI_STATUS             Status;
693*35786f68SRobert Mustacchi     ACPI_SUBTABLE_HEADER    *Subtable;
694*35786f68SRobert Mustacchi     UINT32                  Length = Table->Length;
695*35786f68SRobert Mustacchi     UINT32                  Offset = sizeof (ACPI_TABLE_MADT);
696*35786f68SRobert Mustacchi     ACPI_DMTABLE_INFO       *InfoTable;
697*35786f68SRobert Mustacchi 
698*35786f68SRobert Mustacchi 
699*35786f68SRobert Mustacchi     /* Main table */
700*35786f68SRobert Mustacchi 
701*35786f68SRobert Mustacchi     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
702*35786f68SRobert Mustacchi     if (ACPI_FAILURE (Status))
703*35786f68SRobert Mustacchi     {
704*35786f68SRobert Mustacchi         return;
705*35786f68SRobert Mustacchi     }
706*35786f68SRobert Mustacchi 
707*35786f68SRobert Mustacchi     /* Subtables */
708*35786f68SRobert Mustacchi 
709*35786f68SRobert Mustacchi     Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
710*35786f68SRobert Mustacchi     while (Offset < Table->Length)
711*35786f68SRobert Mustacchi     {
712*35786f68SRobert Mustacchi         /* Common subtable header */
713*35786f68SRobert Mustacchi 
714*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
715*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Length, Offset, Subtable,
716*35786f68SRobert Mustacchi             Subtable->Length, AcpiDmTableInfoMadtHdr);
717*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
718*35786f68SRobert Mustacchi         {
719*35786f68SRobert Mustacchi             return;
720*35786f68SRobert Mustacchi         }
721*35786f68SRobert Mustacchi 
722*35786f68SRobert Mustacchi         switch (Subtable->Type)
723*35786f68SRobert Mustacchi         {
724*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_LOCAL_APIC:
725*35786f68SRobert Mustacchi 
726*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt0;
727*35786f68SRobert Mustacchi             break;
728*35786f68SRobert Mustacchi 
729*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_IO_APIC:
730*35786f68SRobert Mustacchi 
731*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt1;
732*35786f68SRobert Mustacchi             break;
733*35786f68SRobert Mustacchi 
734*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
735*35786f68SRobert Mustacchi 
736*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt2;
737*35786f68SRobert Mustacchi             break;
738*35786f68SRobert Mustacchi 
739*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_NMI_SOURCE:
740*35786f68SRobert Mustacchi 
741*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt3;
742*35786f68SRobert Mustacchi             break;
743*35786f68SRobert Mustacchi 
744*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
745*35786f68SRobert Mustacchi 
746*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt4;
747*35786f68SRobert Mustacchi             break;
748*35786f68SRobert Mustacchi 
749*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
750*35786f68SRobert Mustacchi 
751*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt5;
752*35786f68SRobert Mustacchi             break;
753*35786f68SRobert Mustacchi 
754*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_IO_SAPIC:
755*35786f68SRobert Mustacchi 
756*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt6;
757*35786f68SRobert Mustacchi             break;
758*35786f68SRobert Mustacchi 
759*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_LOCAL_SAPIC:
760*35786f68SRobert Mustacchi 
761*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt7;
762*35786f68SRobert Mustacchi             break;
763*35786f68SRobert Mustacchi 
764*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
765*35786f68SRobert Mustacchi 
766*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt8;
767*35786f68SRobert Mustacchi             break;
768*35786f68SRobert Mustacchi 
769*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_LOCAL_X2APIC:
770*35786f68SRobert Mustacchi 
771*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt9;
772*35786f68SRobert Mustacchi             break;
773*35786f68SRobert Mustacchi 
774*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
775*35786f68SRobert Mustacchi 
776*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt10;
777*35786f68SRobert Mustacchi             break;
778*35786f68SRobert Mustacchi 
779*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
780*35786f68SRobert Mustacchi 
781*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt11;
782*35786f68SRobert Mustacchi             break;
783*35786f68SRobert Mustacchi 
784*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
785*35786f68SRobert Mustacchi 
786*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt12;
787*35786f68SRobert Mustacchi             break;
788*35786f68SRobert Mustacchi 
789*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
790*35786f68SRobert Mustacchi 
791*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt13;
792*35786f68SRobert Mustacchi             break;
793*35786f68SRobert Mustacchi 
794*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
795*35786f68SRobert Mustacchi 
796*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt14;
797*35786f68SRobert Mustacchi             break;
798*35786f68SRobert Mustacchi 
799*35786f68SRobert Mustacchi         case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
800*35786f68SRobert Mustacchi 
801*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoMadt15;
802*35786f68SRobert Mustacchi             break;
803*35786f68SRobert Mustacchi 
804*35786f68SRobert Mustacchi         default:
805*35786f68SRobert Mustacchi 
806*35786f68SRobert Mustacchi             AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",
807*35786f68SRobert Mustacchi                 Subtable->Type);
808*35786f68SRobert Mustacchi 
809*35786f68SRobert Mustacchi             /* Attempt to continue */
810*35786f68SRobert Mustacchi 
811*35786f68SRobert Mustacchi             if (!Subtable->Length)
812*35786f68SRobert Mustacchi             {
813*35786f68SRobert Mustacchi                 AcpiOsPrintf ("Invalid zero length subtable\n");
814*35786f68SRobert Mustacchi                 return;
815*35786f68SRobert Mustacchi             }
816*35786f68SRobert Mustacchi 
817*35786f68SRobert Mustacchi             goto NextSubtable;
818*35786f68SRobert Mustacchi         }
819*35786f68SRobert Mustacchi 
820*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Length, Offset, Subtable,
821*35786f68SRobert Mustacchi             Subtable->Length, InfoTable);
822*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
823*35786f68SRobert Mustacchi         {
824*35786f68SRobert Mustacchi             return;
825*35786f68SRobert Mustacchi         }
826*35786f68SRobert Mustacchi 
827*35786f68SRobert Mustacchi NextSubtable:
828*35786f68SRobert Mustacchi         /* Point to next subtable */
829*35786f68SRobert Mustacchi 
830*35786f68SRobert Mustacchi         Offset += Subtable->Length;
831*35786f68SRobert Mustacchi         Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable,
832*35786f68SRobert Mustacchi             Subtable->Length);
833*35786f68SRobert Mustacchi     }
834*35786f68SRobert Mustacchi }
835*35786f68SRobert Mustacchi 
836*35786f68SRobert Mustacchi 
837*35786f68SRobert Mustacchi /*******************************************************************************
838*35786f68SRobert Mustacchi  *
839*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmDumpMcfg
840*35786f68SRobert Mustacchi  *
841*35786f68SRobert Mustacchi  * PARAMETERS:  Table               - A MCFG Table
842*35786f68SRobert Mustacchi  *
843*35786f68SRobert Mustacchi  * RETURN:      None
844*35786f68SRobert Mustacchi  *
845*35786f68SRobert Mustacchi  * DESCRIPTION: Format the contents of a MCFG table
846*35786f68SRobert Mustacchi  *
847*35786f68SRobert Mustacchi  ******************************************************************************/
848*35786f68SRobert Mustacchi 
849*35786f68SRobert Mustacchi void
AcpiDmDumpMcfg(ACPI_TABLE_HEADER * Table)850*35786f68SRobert Mustacchi AcpiDmDumpMcfg (
851*35786f68SRobert Mustacchi     ACPI_TABLE_HEADER       *Table)
852*35786f68SRobert Mustacchi {
853*35786f68SRobert Mustacchi     ACPI_STATUS             Status;
854*35786f68SRobert Mustacchi     UINT32                  Offset = sizeof (ACPI_TABLE_MCFG);
855*35786f68SRobert Mustacchi     ACPI_MCFG_ALLOCATION    *Subtable;
856*35786f68SRobert Mustacchi 
857*35786f68SRobert Mustacchi 
858*35786f68SRobert Mustacchi     /* Main table */
859*35786f68SRobert Mustacchi 
860*35786f68SRobert Mustacchi     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
861*35786f68SRobert Mustacchi     if (ACPI_FAILURE (Status))
862*35786f68SRobert Mustacchi     {
863*35786f68SRobert Mustacchi         return;
864*35786f68SRobert Mustacchi     }
865*35786f68SRobert Mustacchi 
866*35786f68SRobert Mustacchi     /* Subtables */
867*35786f68SRobert Mustacchi 
868*35786f68SRobert Mustacchi     Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
869*35786f68SRobert Mustacchi     while (Offset < Table->Length)
870*35786f68SRobert Mustacchi     {
871*35786f68SRobert Mustacchi         if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
872*35786f68SRobert Mustacchi         {
873*35786f68SRobert Mustacchi             AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
874*35786f68SRobert Mustacchi                 sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
875*35786f68SRobert Mustacchi             return;
876*35786f68SRobert Mustacchi         }
877*35786f68SRobert Mustacchi 
878*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
879*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
880*35786f68SRobert Mustacchi             sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
881*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
882*35786f68SRobert Mustacchi         {
883*35786f68SRobert Mustacchi             return;
884*35786f68SRobert Mustacchi         }
885*35786f68SRobert Mustacchi 
886*35786f68SRobert Mustacchi         /* Point to next subtable (each subtable is of fixed length) */
887*35786f68SRobert Mustacchi 
888*35786f68SRobert Mustacchi         Offset += sizeof (ACPI_MCFG_ALLOCATION);
889*35786f68SRobert Mustacchi         Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Subtable,
890*35786f68SRobert Mustacchi             sizeof (ACPI_MCFG_ALLOCATION));
891*35786f68SRobert Mustacchi     }
892*35786f68SRobert Mustacchi }
893*35786f68SRobert Mustacchi 
894*35786f68SRobert Mustacchi 
895*35786f68SRobert Mustacchi /*******************************************************************************
896*35786f68SRobert Mustacchi  *
897*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmDumpMpst
898*35786f68SRobert Mustacchi  *
899*35786f68SRobert Mustacchi  * PARAMETERS:  Table               - A MPST Table
900*35786f68SRobert Mustacchi  *
901*35786f68SRobert Mustacchi  * RETURN:      None
902*35786f68SRobert Mustacchi  *
903*35786f68SRobert Mustacchi  * DESCRIPTION: Format the contents of a MPST table
904*35786f68SRobert Mustacchi  *
905*35786f68SRobert Mustacchi  ******************************************************************************/
906*35786f68SRobert Mustacchi 
907*35786f68SRobert Mustacchi void
AcpiDmDumpMpst(ACPI_TABLE_HEADER * Table)908*35786f68SRobert Mustacchi AcpiDmDumpMpst (
909*35786f68SRobert Mustacchi     ACPI_TABLE_HEADER       *Table)
910*35786f68SRobert Mustacchi {
911*35786f68SRobert Mustacchi     ACPI_STATUS             Status;
912*35786f68SRobert Mustacchi     UINT32                  Offset = sizeof (ACPI_TABLE_MPST);
913*35786f68SRobert Mustacchi     ACPI_MPST_POWER_NODE    *Subtable0;
914*35786f68SRobert Mustacchi     ACPI_MPST_POWER_STATE   *Subtable0A;
915*35786f68SRobert Mustacchi     ACPI_MPST_COMPONENT     *Subtable0B;
916*35786f68SRobert Mustacchi     ACPI_MPST_DATA_HDR      *Subtable1;
917*35786f68SRobert Mustacchi     ACPI_MPST_POWER_DATA    *Subtable2;
918*35786f68SRobert Mustacchi     UINT16                  SubtableCount;
919*35786f68SRobert Mustacchi     UINT32                  PowerStateCount;
920*35786f68SRobert Mustacchi     UINT32                  ComponentCount;
921*35786f68SRobert Mustacchi 
922*35786f68SRobert Mustacchi 
923*35786f68SRobert Mustacchi     /* Main table */
924*35786f68SRobert Mustacchi 
925*35786f68SRobert Mustacchi     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
926*35786f68SRobert Mustacchi     if (ACPI_FAILURE (Status))
927*35786f68SRobert Mustacchi     {
928*35786f68SRobert Mustacchi         return;
929*35786f68SRobert Mustacchi     }
930*35786f68SRobert Mustacchi 
931*35786f68SRobert Mustacchi     /* Subtable: Memory Power Node(s) */
932*35786f68SRobert Mustacchi 
933*35786f68SRobert Mustacchi     SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
934*35786f68SRobert Mustacchi     Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
935*35786f68SRobert Mustacchi 
936*35786f68SRobert Mustacchi     while ((Offset < Table->Length) && SubtableCount)
937*35786f68SRobert Mustacchi     {
938*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
939*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0,
940*35786f68SRobert Mustacchi             sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
941*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
942*35786f68SRobert Mustacchi         {
943*35786f68SRobert Mustacchi             return;
944*35786f68SRobert Mustacchi         }
945*35786f68SRobert Mustacchi 
946*35786f68SRobert Mustacchi         /* Extract the sub-subtable counts */
947*35786f68SRobert Mustacchi 
948*35786f68SRobert Mustacchi         PowerStateCount = Subtable0->NumPowerStates;
949*35786f68SRobert Mustacchi         ComponentCount = Subtable0->NumPhysicalComponents;
950*35786f68SRobert Mustacchi         Offset += sizeof (ACPI_MPST_POWER_NODE);
951*35786f68SRobert Mustacchi 
952*35786f68SRobert Mustacchi         /* Sub-subtables - Memory Power State Structure(s) */
953*35786f68SRobert Mustacchi 
954*35786f68SRobert Mustacchi         Subtable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, Subtable0,
955*35786f68SRobert Mustacchi             sizeof (ACPI_MPST_POWER_NODE));
956*35786f68SRobert Mustacchi 
957*35786f68SRobert Mustacchi         while (PowerStateCount)
958*35786f68SRobert Mustacchi         {
959*35786f68SRobert Mustacchi             AcpiOsPrintf ("\n");
960*35786f68SRobert Mustacchi             Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A,
961*35786f68SRobert Mustacchi                 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
962*35786f68SRobert Mustacchi             if (ACPI_FAILURE (Status))
963*35786f68SRobert Mustacchi             {
964*35786f68SRobert Mustacchi                 return;
965*35786f68SRobert Mustacchi             }
966*35786f68SRobert Mustacchi 
967*35786f68SRobert Mustacchi             Subtable0A++;
968*35786f68SRobert Mustacchi             PowerStateCount--;
969*35786f68SRobert Mustacchi             Offset += sizeof (ACPI_MPST_POWER_STATE);
970*35786f68SRobert Mustacchi        }
971*35786f68SRobert Mustacchi 
972*35786f68SRobert Mustacchi         /* Sub-subtables - Physical Component ID Structure(s) */
973*35786f68SRobert Mustacchi 
974*35786f68SRobert Mustacchi         Subtable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, Subtable0A);
975*35786f68SRobert Mustacchi 
976*35786f68SRobert Mustacchi         if (ComponentCount)
977*35786f68SRobert Mustacchi         {
978*35786f68SRobert Mustacchi             AcpiOsPrintf ("\n");
979*35786f68SRobert Mustacchi         }
980*35786f68SRobert Mustacchi 
981*35786f68SRobert Mustacchi         while (ComponentCount)
982*35786f68SRobert Mustacchi         {
983*35786f68SRobert Mustacchi             Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B,
984*35786f68SRobert Mustacchi                 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
985*35786f68SRobert Mustacchi             if (ACPI_FAILURE (Status))
986*35786f68SRobert Mustacchi             {
987*35786f68SRobert Mustacchi                 return;
988*35786f68SRobert Mustacchi             }
989*35786f68SRobert Mustacchi 
990*35786f68SRobert Mustacchi             Subtable0B++;
991*35786f68SRobert Mustacchi             ComponentCount--;
992*35786f68SRobert Mustacchi             Offset += sizeof (ACPI_MPST_COMPONENT);
993*35786f68SRobert Mustacchi         }
994*35786f68SRobert Mustacchi 
995*35786f68SRobert Mustacchi         /* Point to next Memory Power Node subtable */
996*35786f68SRobert Mustacchi 
997*35786f68SRobert Mustacchi         SubtableCount--;
998*35786f68SRobert Mustacchi         Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Subtable0,
999*35786f68SRobert Mustacchi             sizeof (ACPI_MPST_POWER_NODE) +
1000*35786f68SRobert Mustacchi             (sizeof (ACPI_MPST_POWER_STATE) * Subtable0->NumPowerStates) +
1001*35786f68SRobert Mustacchi             (sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents));
1002*35786f68SRobert Mustacchi     }
1003*35786f68SRobert Mustacchi 
1004*35786f68SRobert Mustacchi     /* Subtable: Count of Memory Power State Characteristic structures */
1005*35786f68SRobert Mustacchi 
1006*35786f68SRobert Mustacchi     AcpiOsPrintf ("\n");
1007*35786f68SRobert Mustacchi     Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0);
1008*35786f68SRobert Mustacchi     Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1,
1009*35786f68SRobert Mustacchi         sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
1010*35786f68SRobert Mustacchi     if (ACPI_FAILURE (Status))
1011*35786f68SRobert Mustacchi     {
1012*35786f68SRobert Mustacchi         return;
1013*35786f68SRobert Mustacchi     }
1014*35786f68SRobert Mustacchi 
1015*35786f68SRobert Mustacchi     SubtableCount = Subtable1->CharacteristicsCount;
1016*35786f68SRobert Mustacchi     Offset += sizeof (ACPI_MPST_DATA_HDR);
1017*35786f68SRobert Mustacchi 
1018*35786f68SRobert Mustacchi     /* Subtable: Memory Power State Characteristics structure(s) */
1019*35786f68SRobert Mustacchi 
1020*35786f68SRobert Mustacchi     Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1,
1021*35786f68SRobert Mustacchi         sizeof (ACPI_MPST_DATA_HDR));
1022*35786f68SRobert Mustacchi 
1023*35786f68SRobert Mustacchi     while ((Offset < Table->Length) && SubtableCount)
1024*35786f68SRobert Mustacchi     {
1025*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
1026*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2,
1027*35786f68SRobert Mustacchi             sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
1028*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1029*35786f68SRobert Mustacchi         {
1030*35786f68SRobert Mustacchi             return;
1031*35786f68SRobert Mustacchi         }
1032*35786f68SRobert Mustacchi 
1033*35786f68SRobert Mustacchi         Subtable2++;
1034*35786f68SRobert Mustacchi         SubtableCount--;
1035*35786f68SRobert Mustacchi         Offset += sizeof (ACPI_MPST_POWER_DATA);
1036*35786f68SRobert Mustacchi     }
1037*35786f68SRobert Mustacchi }
1038*35786f68SRobert Mustacchi 
1039*35786f68SRobert Mustacchi 
1040*35786f68SRobert Mustacchi /*******************************************************************************
1041*35786f68SRobert Mustacchi  *
1042*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmDumpMsct
1043*35786f68SRobert Mustacchi  *
1044*35786f68SRobert Mustacchi  * PARAMETERS:  Table               - A MSCT table
1045*35786f68SRobert Mustacchi  *
1046*35786f68SRobert Mustacchi  * RETURN:      None
1047*35786f68SRobert Mustacchi  *
1048*35786f68SRobert Mustacchi  * DESCRIPTION: Format the contents of a MSCT
1049*35786f68SRobert Mustacchi  *
1050*35786f68SRobert Mustacchi  ******************************************************************************/
1051*35786f68SRobert Mustacchi 
1052*35786f68SRobert Mustacchi void
AcpiDmDumpMsct(ACPI_TABLE_HEADER * Table)1053*35786f68SRobert Mustacchi AcpiDmDumpMsct (
1054*35786f68SRobert Mustacchi     ACPI_TABLE_HEADER       *Table)
1055*35786f68SRobert Mustacchi {
1056*35786f68SRobert Mustacchi     ACPI_STATUS             Status;
1057*35786f68SRobert Mustacchi     UINT32                  Offset = sizeof (ACPI_TABLE_MSCT);
1058*35786f68SRobert Mustacchi     ACPI_MSCT_PROXIMITY     *Subtable;
1059*35786f68SRobert Mustacchi 
1060*35786f68SRobert Mustacchi 
1061*35786f68SRobert Mustacchi     /* Main table */
1062*35786f68SRobert Mustacchi 
1063*35786f68SRobert Mustacchi     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
1064*35786f68SRobert Mustacchi     if (ACPI_FAILURE (Status))
1065*35786f68SRobert Mustacchi     {
1066*35786f68SRobert Mustacchi         return;
1067*35786f68SRobert Mustacchi     }
1068*35786f68SRobert Mustacchi 
1069*35786f68SRobert Mustacchi     /* Subtables */
1070*35786f68SRobert Mustacchi 
1071*35786f68SRobert Mustacchi     Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
1072*35786f68SRobert Mustacchi     while (Offset < Table->Length)
1073*35786f68SRobert Mustacchi     {
1074*35786f68SRobert Mustacchi         /* Common subtable header */
1075*35786f68SRobert Mustacchi 
1076*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
1077*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1078*35786f68SRobert Mustacchi             sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
1079*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1080*35786f68SRobert Mustacchi         {
1081*35786f68SRobert Mustacchi             return;
1082*35786f68SRobert Mustacchi         }
1083*35786f68SRobert Mustacchi 
1084*35786f68SRobert Mustacchi         /* Point to next subtable */
1085*35786f68SRobert Mustacchi 
1086*35786f68SRobert Mustacchi         Offset += sizeof (ACPI_MSCT_PROXIMITY);
1087*35786f68SRobert Mustacchi         Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Subtable,
1088*35786f68SRobert Mustacchi             sizeof (ACPI_MSCT_PROXIMITY));
1089*35786f68SRobert Mustacchi     }
1090*35786f68SRobert Mustacchi }
1091*35786f68SRobert Mustacchi 
1092*35786f68SRobert Mustacchi 
1093*35786f68SRobert Mustacchi /*******************************************************************************
1094*35786f68SRobert Mustacchi  *
1095*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmDumpMtmr
1096*35786f68SRobert Mustacchi  *
1097*35786f68SRobert Mustacchi  * PARAMETERS:  Table               - A MTMR table
1098*35786f68SRobert Mustacchi  *
1099*35786f68SRobert Mustacchi  * RETURN:      None
1100*35786f68SRobert Mustacchi  *
1101*35786f68SRobert Mustacchi  * DESCRIPTION: Format the contents of a MTMR
1102*35786f68SRobert Mustacchi  *
1103*35786f68SRobert Mustacchi  ******************************************************************************/
1104*35786f68SRobert Mustacchi 
1105*35786f68SRobert Mustacchi void
AcpiDmDumpMtmr(ACPI_TABLE_HEADER * Table)1106*35786f68SRobert Mustacchi AcpiDmDumpMtmr (
1107*35786f68SRobert Mustacchi     ACPI_TABLE_HEADER       *Table)
1108*35786f68SRobert Mustacchi {
1109*35786f68SRobert Mustacchi     ACPI_STATUS             Status;
1110*35786f68SRobert Mustacchi     UINT32                  Offset = sizeof (ACPI_TABLE_MTMR);
1111*35786f68SRobert Mustacchi     ACPI_MTMR_ENTRY         *Subtable;
1112*35786f68SRobert Mustacchi 
1113*35786f68SRobert Mustacchi 
1114*35786f68SRobert Mustacchi     /* Main table */
1115*35786f68SRobert Mustacchi 
1116*35786f68SRobert Mustacchi     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMtmr);
1117*35786f68SRobert Mustacchi     if (ACPI_FAILURE (Status))
1118*35786f68SRobert Mustacchi     {
1119*35786f68SRobert Mustacchi         return;
1120*35786f68SRobert Mustacchi     }
1121*35786f68SRobert Mustacchi 
1122*35786f68SRobert Mustacchi     /* Subtables */
1123*35786f68SRobert Mustacchi 
1124*35786f68SRobert Mustacchi     Subtable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset);
1125*35786f68SRobert Mustacchi     while (Offset < Table->Length)
1126*35786f68SRobert Mustacchi     {
1127*35786f68SRobert Mustacchi         /* Common subtable header */
1128*35786f68SRobert Mustacchi 
1129*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
1130*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1131*35786f68SRobert Mustacchi             sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0);
1132*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1133*35786f68SRobert Mustacchi         {
1134*35786f68SRobert Mustacchi             return;
1135*35786f68SRobert Mustacchi         }
1136*35786f68SRobert Mustacchi 
1137*35786f68SRobert Mustacchi         /* Point to next subtable */
1138*35786f68SRobert Mustacchi 
1139*35786f68SRobert Mustacchi         Offset += sizeof (ACPI_MTMR_ENTRY);
1140*35786f68SRobert Mustacchi         Subtable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Subtable,
1141*35786f68SRobert Mustacchi             sizeof (ACPI_MTMR_ENTRY));
1142*35786f68SRobert Mustacchi     }
1143*35786f68SRobert Mustacchi }
1144*35786f68SRobert Mustacchi 
1145*35786f68SRobert Mustacchi 
1146*35786f68SRobert Mustacchi /*******************************************************************************
1147*35786f68SRobert Mustacchi  *
1148*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmDumpNfit
1149*35786f68SRobert Mustacchi  *
1150*35786f68SRobert Mustacchi  * PARAMETERS:  Table               - A NFIT table
1151*35786f68SRobert Mustacchi  *
1152*35786f68SRobert Mustacchi  * RETURN:      None
1153*35786f68SRobert Mustacchi  *
1154*35786f68SRobert Mustacchi  * DESCRIPTION: Format the contents of an NFIT.
1155*35786f68SRobert Mustacchi  *
1156*35786f68SRobert Mustacchi  ******************************************************************************/
1157*35786f68SRobert Mustacchi 
1158*35786f68SRobert Mustacchi void
AcpiDmDumpNfit(ACPI_TABLE_HEADER * Table)1159*35786f68SRobert Mustacchi AcpiDmDumpNfit (
1160*35786f68SRobert Mustacchi     ACPI_TABLE_HEADER       *Table)
1161*35786f68SRobert Mustacchi {
1162*35786f68SRobert Mustacchi     ACPI_STATUS             Status;
1163*35786f68SRobert Mustacchi     UINT32                  Offset = sizeof (ACPI_TABLE_NFIT);
1164*35786f68SRobert Mustacchi     UINT32                  FieldOffset = 0;
1165*35786f68SRobert Mustacchi     UINT32                  Length;
1166*35786f68SRobert Mustacchi     ACPI_NFIT_HEADER        *Subtable;
1167*35786f68SRobert Mustacchi     ACPI_DMTABLE_INFO       *InfoTable;
1168*35786f68SRobert Mustacchi     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
1169*35786f68SRobert Mustacchi     ACPI_NFIT_SMBIOS        *SmbiosInfo = NULL;
1170*35786f68SRobert Mustacchi     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
1171*35786f68SRobert Mustacchi     UINT32                  i;
1172*35786f68SRobert Mustacchi 
1173*35786f68SRobert Mustacchi 
1174*35786f68SRobert Mustacchi     /* Main table */
1175*35786f68SRobert Mustacchi 
1176*35786f68SRobert Mustacchi     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
1177*35786f68SRobert Mustacchi     if (ACPI_FAILURE (Status))
1178*35786f68SRobert Mustacchi     {
1179*35786f68SRobert Mustacchi         return;
1180*35786f68SRobert Mustacchi     }
1181*35786f68SRobert Mustacchi 
1182*35786f68SRobert Mustacchi     /* Subtables */
1183*35786f68SRobert Mustacchi 
1184*35786f68SRobert Mustacchi     Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
1185*35786f68SRobert Mustacchi     while (Offset < Table->Length)
1186*35786f68SRobert Mustacchi     {
1187*35786f68SRobert Mustacchi         /* NFIT subtable header */
1188*35786f68SRobert Mustacchi 
1189*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
1190*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1191*35786f68SRobert Mustacchi             Subtable->Length, AcpiDmTableInfoNfitHdr);
1192*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1193*35786f68SRobert Mustacchi         {
1194*35786f68SRobert Mustacchi             return;
1195*35786f68SRobert Mustacchi         }
1196*35786f68SRobert Mustacchi 
1197*35786f68SRobert Mustacchi         switch (Subtable->Type)
1198*35786f68SRobert Mustacchi         {
1199*35786f68SRobert Mustacchi         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
1200*35786f68SRobert Mustacchi 
1201*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoNfit0;
1202*35786f68SRobert Mustacchi             break;
1203*35786f68SRobert Mustacchi 
1204*35786f68SRobert Mustacchi         case ACPI_NFIT_TYPE_MEMORY_MAP:
1205*35786f68SRobert Mustacchi 
1206*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoNfit1;
1207*35786f68SRobert Mustacchi             break;
1208*35786f68SRobert Mustacchi 
1209*35786f68SRobert Mustacchi         case ACPI_NFIT_TYPE_INTERLEAVE:
1210*35786f68SRobert Mustacchi 
1211*35786f68SRobert Mustacchi             /* Has a variable number of 32-bit values at the end */
1212*35786f68SRobert Mustacchi 
1213*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoNfit2;
1214*35786f68SRobert Mustacchi             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable);
1215*35786f68SRobert Mustacchi             FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);
1216*35786f68SRobert Mustacchi             break;
1217*35786f68SRobert Mustacchi 
1218*35786f68SRobert Mustacchi         case ACPI_NFIT_TYPE_SMBIOS:
1219*35786f68SRobert Mustacchi 
1220*35786f68SRobert Mustacchi             SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, Subtable);
1221*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoNfit3;
1222*35786f68SRobert Mustacchi             break;
1223*35786f68SRobert Mustacchi 
1224*35786f68SRobert Mustacchi         case ACPI_NFIT_TYPE_CONTROL_REGION:
1225*35786f68SRobert Mustacchi 
1226*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoNfit4;
1227*35786f68SRobert Mustacchi             break;
1228*35786f68SRobert Mustacchi 
1229*35786f68SRobert Mustacchi         case ACPI_NFIT_TYPE_DATA_REGION:
1230*35786f68SRobert Mustacchi 
1231*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoNfit5;
1232*35786f68SRobert Mustacchi             break;
1233*35786f68SRobert Mustacchi 
1234*35786f68SRobert Mustacchi         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
1235*35786f68SRobert Mustacchi 
1236*35786f68SRobert Mustacchi             /* Has a variable number of 64-bit addresses at the end */
1237*35786f68SRobert Mustacchi 
1238*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoNfit6;
1239*35786f68SRobert Mustacchi             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable);
1240*35786f68SRobert Mustacchi             FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64);
1241*35786f68SRobert Mustacchi             break;
1242*35786f68SRobert Mustacchi 
1243*35786f68SRobert Mustacchi         case ACPI_NFIT_TYPE_CAPABILITIES:    /* ACPI 6.0A */
1244*35786f68SRobert Mustacchi 
1245*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoNfit7;
1246*35786f68SRobert Mustacchi             break;
1247*35786f68SRobert Mustacchi 
1248*35786f68SRobert Mustacchi         default:
1249*35786f68SRobert Mustacchi             AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
1250*35786f68SRobert Mustacchi                 Subtable->Type);
1251*35786f68SRobert Mustacchi 
1252*35786f68SRobert Mustacchi             /* Attempt to continue */
1253*35786f68SRobert Mustacchi 
1254*35786f68SRobert Mustacchi             if (!Subtable->Length)
1255*35786f68SRobert Mustacchi             {
1256*35786f68SRobert Mustacchi                 AcpiOsPrintf ("Invalid zero length subtable\n");
1257*35786f68SRobert Mustacchi                 return;
1258*35786f68SRobert Mustacchi             }
1259*35786f68SRobert Mustacchi             goto NextSubtable;
1260*35786f68SRobert Mustacchi         }
1261*35786f68SRobert Mustacchi 
1262*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
1263*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1264*35786f68SRobert Mustacchi             Subtable->Length, InfoTable);
1265*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1266*35786f68SRobert Mustacchi         {
1267*35786f68SRobert Mustacchi             return;
1268*35786f68SRobert Mustacchi         }
1269*35786f68SRobert Mustacchi 
1270*35786f68SRobert Mustacchi         /* Per-subtable variable-length fields */
1271*35786f68SRobert Mustacchi 
1272*35786f68SRobert Mustacchi         switch (Subtable->Type)
1273*35786f68SRobert Mustacchi         {
1274*35786f68SRobert Mustacchi         case ACPI_NFIT_TYPE_INTERLEAVE:
1275*35786f68SRobert Mustacchi 
1276*35786f68SRobert Mustacchi             for (i = 0; i < Interleave->LineCount; i++)
1277*35786f68SRobert Mustacchi             {
1278*35786f68SRobert Mustacchi                 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
1279*35786f68SRobert Mustacchi                     &Interleave->LineOffset[i],
1280*35786f68SRobert Mustacchi                     sizeof (UINT32), AcpiDmTableInfoNfit2a);
1281*35786f68SRobert Mustacchi                 if (ACPI_FAILURE (Status))
1282*35786f68SRobert Mustacchi                 {
1283*35786f68SRobert Mustacchi                     return;
1284*35786f68SRobert Mustacchi                 }
1285*35786f68SRobert Mustacchi 
1286*35786f68SRobert Mustacchi                 FieldOffset += sizeof (UINT32);
1287*35786f68SRobert Mustacchi             }
1288*35786f68SRobert Mustacchi             break;
1289*35786f68SRobert Mustacchi 
1290*35786f68SRobert Mustacchi         case ACPI_NFIT_TYPE_SMBIOS:
1291*35786f68SRobert Mustacchi 
1292*35786f68SRobert Mustacchi             Length = Subtable->Length -
1293*35786f68SRobert Mustacchi                 sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
1294*35786f68SRobert Mustacchi 
1295*35786f68SRobert Mustacchi             if (Length)
1296*35786f68SRobert Mustacchi             {
1297*35786f68SRobert Mustacchi                 Status = AcpiDmDumpTable (Table->Length,
1298*35786f68SRobert Mustacchi                     sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
1299*35786f68SRobert Mustacchi                     SmbiosInfo,
1300*35786f68SRobert Mustacchi                     Length, AcpiDmTableInfoNfit3a);
1301*35786f68SRobert Mustacchi                 if (ACPI_FAILURE (Status))
1302*35786f68SRobert Mustacchi                 {
1303*35786f68SRobert Mustacchi                     return;
1304*35786f68SRobert Mustacchi                 }
1305*35786f68SRobert Mustacchi             }
1306*35786f68SRobert Mustacchi 
1307*35786f68SRobert Mustacchi             break;
1308*35786f68SRobert Mustacchi 
1309*35786f68SRobert Mustacchi         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
1310*35786f68SRobert Mustacchi 
1311*35786f68SRobert Mustacchi             for (i = 0; i < Hint->HintCount; i++)
1312*35786f68SRobert Mustacchi             {
1313*35786f68SRobert Mustacchi                 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
1314*35786f68SRobert Mustacchi                     &Hint->HintAddress[i],
1315*35786f68SRobert Mustacchi                     sizeof (UINT64), AcpiDmTableInfoNfit6a);
1316*35786f68SRobert Mustacchi                 if (ACPI_FAILURE (Status))
1317*35786f68SRobert Mustacchi                 {
1318*35786f68SRobert Mustacchi                     return;
1319*35786f68SRobert Mustacchi                 }
1320*35786f68SRobert Mustacchi 
1321*35786f68SRobert Mustacchi                 FieldOffset += sizeof (UINT64);
1322*35786f68SRobert Mustacchi             }
1323*35786f68SRobert Mustacchi             break;
1324*35786f68SRobert Mustacchi 
1325*35786f68SRobert Mustacchi         default:
1326*35786f68SRobert Mustacchi             break;
1327*35786f68SRobert Mustacchi         }
1328*35786f68SRobert Mustacchi 
1329*35786f68SRobert Mustacchi NextSubtable:
1330*35786f68SRobert Mustacchi         /* Point to next subtable */
1331*35786f68SRobert Mustacchi 
1332*35786f68SRobert Mustacchi         Offset += Subtable->Length;
1333*35786f68SRobert Mustacchi         Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length);
1334*35786f68SRobert Mustacchi     }
1335*35786f68SRobert Mustacchi }
1336*35786f68SRobert Mustacchi 
1337*35786f68SRobert Mustacchi 
1338*35786f68SRobert Mustacchi /*******************************************************************************
1339*35786f68SRobert Mustacchi  *
1340*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmDumpPcct
1341*35786f68SRobert Mustacchi  *
1342*35786f68SRobert Mustacchi  * PARAMETERS:  Table               - A PCCT table
1343*35786f68SRobert Mustacchi  *
1344*35786f68SRobert Mustacchi  * RETURN:      None
1345*35786f68SRobert Mustacchi  *
1346*35786f68SRobert Mustacchi  * DESCRIPTION: Format the contents of a PCCT. This table type consists
1347*35786f68SRobert Mustacchi  *              of an open-ended number of subtables.
1348*35786f68SRobert Mustacchi  *
1349*35786f68SRobert Mustacchi  ******************************************************************************/
1350*35786f68SRobert Mustacchi 
1351*35786f68SRobert Mustacchi void
AcpiDmDumpPcct(ACPI_TABLE_HEADER * Table)1352*35786f68SRobert Mustacchi AcpiDmDumpPcct (
1353*35786f68SRobert Mustacchi     ACPI_TABLE_HEADER       *Table)
1354*35786f68SRobert Mustacchi {
1355*35786f68SRobert Mustacchi     ACPI_STATUS             Status;
1356*35786f68SRobert Mustacchi     ACPI_PCCT_SUBSPACE      *Subtable;
1357*35786f68SRobert Mustacchi     ACPI_DMTABLE_INFO       *InfoTable;
1358*35786f68SRobert Mustacchi     UINT32                  Length = Table->Length;
1359*35786f68SRobert Mustacchi     UINT32                  Offset = sizeof (ACPI_TABLE_PCCT);
1360*35786f68SRobert Mustacchi 
1361*35786f68SRobert Mustacchi 
1362*35786f68SRobert Mustacchi     /* Main table */
1363*35786f68SRobert Mustacchi 
1364*35786f68SRobert Mustacchi     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
1365*35786f68SRobert Mustacchi     if (ACPI_FAILURE (Status))
1366*35786f68SRobert Mustacchi     {
1367*35786f68SRobert Mustacchi         return;
1368*35786f68SRobert Mustacchi     }
1369*35786f68SRobert Mustacchi 
1370*35786f68SRobert Mustacchi     /* Subtables */
1371*35786f68SRobert Mustacchi 
1372*35786f68SRobert Mustacchi     Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
1373*35786f68SRobert Mustacchi     while (Offset < Table->Length)
1374*35786f68SRobert Mustacchi     {
1375*35786f68SRobert Mustacchi         /* Common subtable header */
1376*35786f68SRobert Mustacchi 
1377*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
1378*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1379*35786f68SRobert Mustacchi             Subtable->Header.Length, AcpiDmTableInfoPcctHdr);
1380*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1381*35786f68SRobert Mustacchi         {
1382*35786f68SRobert Mustacchi             return;
1383*35786f68SRobert Mustacchi         }
1384*35786f68SRobert Mustacchi 
1385*35786f68SRobert Mustacchi         switch (Subtable->Header.Type)
1386*35786f68SRobert Mustacchi         {
1387*35786f68SRobert Mustacchi         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
1388*35786f68SRobert Mustacchi 
1389*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoPcct0;
1390*35786f68SRobert Mustacchi             break;
1391*35786f68SRobert Mustacchi 
1392*35786f68SRobert Mustacchi         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
1393*35786f68SRobert Mustacchi 
1394*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoPcct1;
1395*35786f68SRobert Mustacchi             break;
1396*35786f68SRobert Mustacchi 
1397*35786f68SRobert Mustacchi         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
1398*35786f68SRobert Mustacchi 
1399*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoPcct2;
1400*35786f68SRobert Mustacchi             break;
1401*35786f68SRobert Mustacchi 
1402*35786f68SRobert Mustacchi         case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
1403*35786f68SRobert Mustacchi 
1404*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoPcct3;
1405*35786f68SRobert Mustacchi             break;
1406*35786f68SRobert Mustacchi 
1407*35786f68SRobert Mustacchi         case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
1408*35786f68SRobert Mustacchi 
1409*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoPcct4;
1410*35786f68SRobert Mustacchi             break;
1411*35786f68SRobert Mustacchi 
1412*35786f68SRobert Mustacchi         default:
1413*35786f68SRobert Mustacchi 
1414*35786f68SRobert Mustacchi             AcpiOsPrintf (
1415*35786f68SRobert Mustacchi                 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
1416*35786f68SRobert Mustacchi                 Subtable->Header.Type);
1417*35786f68SRobert Mustacchi             return;
1418*35786f68SRobert Mustacchi         }
1419*35786f68SRobert Mustacchi 
1420*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
1421*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1422*35786f68SRobert Mustacchi             Subtable->Header.Length, InfoTable);
1423*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1424*35786f68SRobert Mustacchi         {
1425*35786f68SRobert Mustacchi             return;
1426*35786f68SRobert Mustacchi         }
1427*35786f68SRobert Mustacchi 
1428*35786f68SRobert Mustacchi         /* Point to next subtable */
1429*35786f68SRobert Mustacchi 
1430*35786f68SRobert Mustacchi         Offset += Subtable->Header.Length;
1431*35786f68SRobert Mustacchi         Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Subtable,
1432*35786f68SRobert Mustacchi             Subtable->Header.Length);
1433*35786f68SRobert Mustacchi     }
1434*35786f68SRobert Mustacchi }
1435*35786f68SRobert Mustacchi 
1436*35786f68SRobert Mustacchi 
1437*35786f68SRobert Mustacchi /*******************************************************************************
1438*35786f68SRobert Mustacchi  *
1439*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmDumpPdtt
1440*35786f68SRobert Mustacchi  *
1441*35786f68SRobert Mustacchi  * PARAMETERS:  Table               - A PDTT table
1442*35786f68SRobert Mustacchi  *
1443*35786f68SRobert Mustacchi  * RETURN:      None
1444*35786f68SRobert Mustacchi  *
1445*35786f68SRobert Mustacchi  * DESCRIPTION: Format the contents of a Pdtt. This is a variable-length
1446*35786f68SRobert Mustacchi  *              table that contains an open-ended number of IDs
1447*35786f68SRobert Mustacchi  *              at the end of the table.
1448*35786f68SRobert Mustacchi  *
1449*35786f68SRobert Mustacchi  ******************************************************************************/
1450*35786f68SRobert Mustacchi 
1451*35786f68SRobert Mustacchi void
AcpiDmDumpPdtt(ACPI_TABLE_HEADER * Table)1452*35786f68SRobert Mustacchi AcpiDmDumpPdtt (
1453*35786f68SRobert Mustacchi     ACPI_TABLE_HEADER       *Table)
1454*35786f68SRobert Mustacchi {
1455*35786f68SRobert Mustacchi     ACPI_STATUS             Status;
1456*35786f68SRobert Mustacchi     ACPI_PDTT_CHANNEL       *Subtable;
1457*35786f68SRobert Mustacchi     UINT32                  Length = Table->Length;
1458*35786f68SRobert Mustacchi     UINT32                  Offset = sizeof (ACPI_TABLE_PDTT);
1459*35786f68SRobert Mustacchi 
1460*35786f68SRobert Mustacchi 
1461*35786f68SRobert Mustacchi     /* Main table */
1462*35786f68SRobert Mustacchi 
1463*35786f68SRobert Mustacchi     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt);
1464*35786f68SRobert Mustacchi     if (ACPI_FAILURE (Status))
1465*35786f68SRobert Mustacchi     {
1466*35786f68SRobert Mustacchi         return;
1467*35786f68SRobert Mustacchi     }
1468*35786f68SRobert Mustacchi 
1469*35786f68SRobert Mustacchi     /* Subtables. Currently there is only one type, but can be multiples */
1470*35786f68SRobert Mustacchi 
1471*35786f68SRobert Mustacchi     Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset);
1472*35786f68SRobert Mustacchi     while (Offset < Table->Length)
1473*35786f68SRobert Mustacchi     {
1474*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
1475*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1476*35786f68SRobert Mustacchi             sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0);
1477*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1478*35786f68SRobert Mustacchi         {
1479*35786f68SRobert Mustacchi             return;
1480*35786f68SRobert Mustacchi         }
1481*35786f68SRobert Mustacchi 
1482*35786f68SRobert Mustacchi         /* Point to next subtable */
1483*35786f68SRobert Mustacchi 
1484*35786f68SRobert Mustacchi         Offset += sizeof (ACPI_PDTT_CHANNEL);
1485*35786f68SRobert Mustacchi         Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Subtable,
1486*35786f68SRobert Mustacchi             sizeof (ACPI_PDTT_CHANNEL));
1487*35786f68SRobert Mustacchi     }
1488*35786f68SRobert Mustacchi }
1489*35786f68SRobert Mustacchi 
1490*35786f68SRobert Mustacchi 
1491*35786f68SRobert Mustacchi /*******************************************************************************
1492*35786f68SRobert Mustacchi  *
1493*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmDumpPmtt
1494*35786f68SRobert Mustacchi  *
1495*35786f68SRobert Mustacchi  * PARAMETERS:  Table               - A PMTT table
1496*35786f68SRobert Mustacchi  *
1497*35786f68SRobert Mustacchi  * RETURN:      None
1498*35786f68SRobert Mustacchi  *
1499*35786f68SRobert Mustacchi  * DESCRIPTION: Format the contents of a PMTT. This table type consists
1500*35786f68SRobert Mustacchi  *              of an open-ended number of subtables.
1501*35786f68SRobert Mustacchi  *
1502*35786f68SRobert Mustacchi  ******************************************************************************/
1503*35786f68SRobert Mustacchi 
1504*35786f68SRobert Mustacchi void
AcpiDmDumpPmtt(ACPI_TABLE_HEADER * Table)1505*35786f68SRobert Mustacchi AcpiDmDumpPmtt (
1506*35786f68SRobert Mustacchi     ACPI_TABLE_HEADER       *Table)
1507*35786f68SRobert Mustacchi {
1508*35786f68SRobert Mustacchi     ACPI_STATUS             Status;
1509*35786f68SRobert Mustacchi     ACPI_PMTT_HEADER        *Subtable;
1510*35786f68SRobert Mustacchi     ACPI_PMTT_HEADER        *MemSubtable;
1511*35786f68SRobert Mustacchi     ACPI_PMTT_HEADER        *DimmSubtable;
1512*35786f68SRobert Mustacchi     ACPI_PMTT_DOMAIN        *DomainArray;
1513*35786f68SRobert Mustacchi     UINT32                  Length = Table->Length;
1514*35786f68SRobert Mustacchi     UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
1515*35786f68SRobert Mustacchi     UINT32                  MemOffset;
1516*35786f68SRobert Mustacchi     UINT32                  DimmOffset;
1517*35786f68SRobert Mustacchi     UINT32                  DomainOffset;
1518*35786f68SRobert Mustacchi     UINT32                  DomainCount;
1519*35786f68SRobert Mustacchi 
1520*35786f68SRobert Mustacchi 
1521*35786f68SRobert Mustacchi     /* Main table */
1522*35786f68SRobert Mustacchi 
1523*35786f68SRobert Mustacchi     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
1524*35786f68SRobert Mustacchi     if (ACPI_FAILURE (Status))
1525*35786f68SRobert Mustacchi     {
1526*35786f68SRobert Mustacchi         return;
1527*35786f68SRobert Mustacchi     }
1528*35786f68SRobert Mustacchi 
1529*35786f68SRobert Mustacchi     /* Subtables */
1530*35786f68SRobert Mustacchi 
1531*35786f68SRobert Mustacchi     Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
1532*35786f68SRobert Mustacchi     while (Offset < Table->Length)
1533*35786f68SRobert Mustacchi     {
1534*35786f68SRobert Mustacchi         /* Common subtable header */
1535*35786f68SRobert Mustacchi 
1536*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
1537*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1538*35786f68SRobert Mustacchi             Subtable->Length, AcpiDmTableInfoPmttHdr);
1539*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1540*35786f68SRobert Mustacchi         {
1541*35786f68SRobert Mustacchi             return;
1542*35786f68SRobert Mustacchi         }
1543*35786f68SRobert Mustacchi 
1544*35786f68SRobert Mustacchi         /* Only Socket subtables are expected at this level */
1545*35786f68SRobert Mustacchi 
1546*35786f68SRobert Mustacchi         if (Subtable->Type != ACPI_PMTT_TYPE_SOCKET)
1547*35786f68SRobert Mustacchi         {
1548*35786f68SRobert Mustacchi             AcpiOsPrintf (
1549*35786f68SRobert Mustacchi                 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
1550*35786f68SRobert Mustacchi                 Subtable->Type);
1551*35786f68SRobert Mustacchi             return;
1552*35786f68SRobert Mustacchi         }
1553*35786f68SRobert Mustacchi 
1554*35786f68SRobert Mustacchi         /* Dump the fixed-length portion of the subtable */
1555*35786f68SRobert Mustacchi 
1556*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1557*35786f68SRobert Mustacchi             Subtable->Length, AcpiDmTableInfoPmtt0);
1558*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1559*35786f68SRobert Mustacchi         {
1560*35786f68SRobert Mustacchi             return;
1561*35786f68SRobert Mustacchi         }
1562*35786f68SRobert Mustacchi 
1563*35786f68SRobert Mustacchi         /* Walk the memory controller subtables */
1564*35786f68SRobert Mustacchi 
1565*35786f68SRobert Mustacchi         MemOffset = sizeof (ACPI_PMTT_SOCKET);
1566*35786f68SRobert Mustacchi         MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Subtable,
1567*35786f68SRobert Mustacchi             sizeof (ACPI_PMTT_SOCKET));
1568*35786f68SRobert Mustacchi 
1569*35786f68SRobert Mustacchi         while (((Offset + MemOffset) < Table->Length) &&
1570*35786f68SRobert Mustacchi             (MemOffset < Subtable->Length))
1571*35786f68SRobert Mustacchi         {
1572*35786f68SRobert Mustacchi             /* Common subtable header */
1573*35786f68SRobert Mustacchi 
1574*35786f68SRobert Mustacchi             AcpiOsPrintf ("\n");
1575*35786f68SRobert Mustacchi             Status = AcpiDmDumpTable (Length,
1576*35786f68SRobert Mustacchi                 Offset + MemOffset, MemSubtable,
1577*35786f68SRobert Mustacchi                 MemSubtable->Length, AcpiDmTableInfoPmttHdr);
1578*35786f68SRobert Mustacchi             if (ACPI_FAILURE (Status))
1579*35786f68SRobert Mustacchi             {
1580*35786f68SRobert Mustacchi                 return;
1581*35786f68SRobert Mustacchi             }
1582*35786f68SRobert Mustacchi 
1583*35786f68SRobert Mustacchi             /* Only memory controller subtables are expected at this level */
1584*35786f68SRobert Mustacchi 
1585*35786f68SRobert Mustacchi             if (MemSubtable->Type != ACPI_PMTT_TYPE_CONTROLLER)
1586*35786f68SRobert Mustacchi             {
1587*35786f68SRobert Mustacchi                 AcpiOsPrintf (
1588*35786f68SRobert Mustacchi                     "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
1589*35786f68SRobert Mustacchi                     MemSubtable->Type);
1590*35786f68SRobert Mustacchi                 return;
1591*35786f68SRobert Mustacchi             }
1592*35786f68SRobert Mustacchi 
1593*35786f68SRobert Mustacchi             /* Dump the fixed-length portion of the controller subtable */
1594*35786f68SRobert Mustacchi 
1595*35786f68SRobert Mustacchi             Status = AcpiDmDumpTable (Length,
1596*35786f68SRobert Mustacchi                 Offset + MemOffset, MemSubtable,
1597*35786f68SRobert Mustacchi                 MemSubtable->Length, AcpiDmTableInfoPmtt1);
1598*35786f68SRobert Mustacchi             if (ACPI_FAILURE (Status))
1599*35786f68SRobert Mustacchi             {
1600*35786f68SRobert Mustacchi                 return;
1601*35786f68SRobert Mustacchi             }
1602*35786f68SRobert Mustacchi 
1603*35786f68SRobert Mustacchi             /* Walk the variable count of proximity domains */
1604*35786f68SRobert Mustacchi 
1605*35786f68SRobert Mustacchi             DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubtable)->DomainCount;
1606*35786f68SRobert Mustacchi             DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
1607*35786f68SRobert Mustacchi             DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubtable,
1608*35786f68SRobert Mustacchi                 sizeof (ACPI_PMTT_CONTROLLER));
1609*35786f68SRobert Mustacchi 
1610*35786f68SRobert Mustacchi             while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
1611*35786f68SRobert Mustacchi                 ((MemOffset + DomainOffset) < Subtable->Length) &&
1612*35786f68SRobert Mustacchi                 DomainCount)
1613*35786f68SRobert Mustacchi             {
1614*35786f68SRobert Mustacchi                 Status = AcpiDmDumpTable (Length,
1615*35786f68SRobert Mustacchi                     Offset + MemOffset + DomainOffset, DomainArray,
1616*35786f68SRobert Mustacchi                     sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
1617*35786f68SRobert Mustacchi                 if (ACPI_FAILURE (Status))
1618*35786f68SRobert Mustacchi                 {
1619*35786f68SRobert Mustacchi                     return;
1620*35786f68SRobert Mustacchi                 }
1621*35786f68SRobert Mustacchi 
1622*35786f68SRobert Mustacchi                 DomainOffset += sizeof (ACPI_PMTT_DOMAIN);
1623*35786f68SRobert Mustacchi                 DomainArray++;
1624*35786f68SRobert Mustacchi                 DomainCount--;
1625*35786f68SRobert Mustacchi             }
1626*35786f68SRobert Mustacchi 
1627*35786f68SRobert Mustacchi             if (DomainCount)
1628*35786f68SRobert Mustacchi             {
1629*35786f68SRobert Mustacchi                 AcpiOsPrintf (
1630*35786f68SRobert Mustacchi                     "\n**** DomainCount exceeds subtable length\n\n");
1631*35786f68SRobert Mustacchi             }
1632*35786f68SRobert Mustacchi 
1633*35786f68SRobert Mustacchi             /* Walk the physical component (DIMM) subtables */
1634*35786f68SRobert Mustacchi 
1635*35786f68SRobert Mustacchi             DimmOffset = DomainOffset;
1636*35786f68SRobert Mustacchi             DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubtable,
1637*35786f68SRobert Mustacchi                 DomainOffset);
1638*35786f68SRobert Mustacchi 
1639*35786f68SRobert Mustacchi             while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
1640*35786f68SRobert Mustacchi                 (DimmOffset < MemSubtable->Length))
1641*35786f68SRobert Mustacchi             {
1642*35786f68SRobert Mustacchi                 /* Common subtable header */
1643*35786f68SRobert Mustacchi 
1644*35786f68SRobert Mustacchi                 AcpiOsPrintf ("\n");
1645*35786f68SRobert Mustacchi                 Status = AcpiDmDumpTable (Length,
1646*35786f68SRobert Mustacchi                     Offset + MemOffset + DimmOffset, DimmSubtable,
1647*35786f68SRobert Mustacchi                     DimmSubtable->Length, AcpiDmTableInfoPmttHdr);
1648*35786f68SRobert Mustacchi                 if (ACPI_FAILURE (Status))
1649*35786f68SRobert Mustacchi                 {
1650*35786f68SRobert Mustacchi                     return;
1651*35786f68SRobert Mustacchi                 }
1652*35786f68SRobert Mustacchi 
1653*35786f68SRobert Mustacchi                 /* Only DIMM subtables are expected at this level */
1654*35786f68SRobert Mustacchi 
1655*35786f68SRobert Mustacchi                 if (DimmSubtable->Type != ACPI_PMTT_TYPE_DIMM)
1656*35786f68SRobert Mustacchi                 {
1657*35786f68SRobert Mustacchi                     AcpiOsPrintf (
1658*35786f68SRobert Mustacchi                         "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
1659*35786f68SRobert Mustacchi                         DimmSubtable->Type);
1660*35786f68SRobert Mustacchi                     return;
1661*35786f68SRobert Mustacchi                 }
1662*35786f68SRobert Mustacchi 
1663*35786f68SRobert Mustacchi                 /* Dump the fixed-length DIMM subtable */
1664*35786f68SRobert Mustacchi 
1665*35786f68SRobert Mustacchi                 Status = AcpiDmDumpTable (Length,
1666*35786f68SRobert Mustacchi                     Offset + MemOffset + DimmOffset, DimmSubtable,
1667*35786f68SRobert Mustacchi                     DimmSubtable->Length, AcpiDmTableInfoPmtt2);
1668*35786f68SRobert Mustacchi                 if (ACPI_FAILURE (Status))
1669*35786f68SRobert Mustacchi                 {
1670*35786f68SRobert Mustacchi                     return;
1671*35786f68SRobert Mustacchi                 }
1672*35786f68SRobert Mustacchi 
1673*35786f68SRobert Mustacchi                 /* Point to next DIMM subtable */
1674*35786f68SRobert Mustacchi 
1675*35786f68SRobert Mustacchi                 DimmOffset += DimmSubtable->Length;
1676*35786f68SRobert Mustacchi                 DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
1677*35786f68SRobert Mustacchi                     DimmSubtable, DimmSubtable->Length);
1678*35786f68SRobert Mustacchi             }
1679*35786f68SRobert Mustacchi 
1680*35786f68SRobert Mustacchi             /* Point to next Controller subtable */
1681*35786f68SRobert Mustacchi 
1682*35786f68SRobert Mustacchi             MemOffset += MemSubtable->Length;
1683*35786f68SRobert Mustacchi             MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
1684*35786f68SRobert Mustacchi                 MemSubtable, MemSubtable->Length);
1685*35786f68SRobert Mustacchi         }
1686*35786f68SRobert Mustacchi 
1687*35786f68SRobert Mustacchi         /* Point to next Socket subtable */
1688*35786f68SRobert Mustacchi 
1689*35786f68SRobert Mustacchi         Offset += Subtable->Length;
1690*35786f68SRobert Mustacchi         Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
1691*35786f68SRobert Mustacchi             Subtable, Subtable->Length);
1692*35786f68SRobert Mustacchi     }
1693*35786f68SRobert Mustacchi }
1694*35786f68SRobert Mustacchi 
1695*35786f68SRobert Mustacchi 
1696*35786f68SRobert Mustacchi /*******************************************************************************
1697*35786f68SRobert Mustacchi  *
1698*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmDumpPptt
1699*35786f68SRobert Mustacchi  *
1700*35786f68SRobert Mustacchi  * PARAMETERS:  Table               - A PMTT table
1701*35786f68SRobert Mustacchi  *
1702*35786f68SRobert Mustacchi  * RETURN:      None
1703*35786f68SRobert Mustacchi  *
1704*35786f68SRobert Mustacchi  * DESCRIPTION: Format the contents of a PPTT. This table type consists
1705*35786f68SRobert Mustacchi  *              of an open-ended number of subtables.
1706*35786f68SRobert Mustacchi  *
1707*35786f68SRobert Mustacchi  ******************************************************************************/
1708*35786f68SRobert Mustacchi 
1709*35786f68SRobert Mustacchi void
AcpiDmDumpPptt(ACPI_TABLE_HEADER * Table)1710*35786f68SRobert Mustacchi AcpiDmDumpPptt (
1711*35786f68SRobert Mustacchi     ACPI_TABLE_HEADER       *Table)
1712*35786f68SRobert Mustacchi {
1713*35786f68SRobert Mustacchi     ACPI_STATUS             Status;
1714*35786f68SRobert Mustacchi     ACPI_SUBTABLE_HEADER    *Subtable;
1715*35786f68SRobert Mustacchi     ACPI_PPTT_PROCESSOR     *PpttProcessor;
1716*35786f68SRobert Mustacchi     UINT8                   Length;
1717*35786f68SRobert Mustacchi     UINT8                   SubtableOffset;
1718*35786f68SRobert Mustacchi     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
1719*35786f68SRobert Mustacchi     ACPI_DMTABLE_INFO       *InfoTable;
1720*35786f68SRobert Mustacchi     UINT32                  i;
1721*35786f68SRobert Mustacchi 
1722*35786f68SRobert Mustacchi 
1723*35786f68SRobert Mustacchi     /* There is no main table (other than the standard ACPI header) */
1724*35786f68SRobert Mustacchi 
1725*35786f68SRobert Mustacchi     /* Subtables */
1726*35786f68SRobert Mustacchi 
1727*35786f68SRobert Mustacchi     Offset = sizeof (ACPI_TABLE_HEADER);
1728*35786f68SRobert Mustacchi     while (Offset < Table->Length)
1729*35786f68SRobert Mustacchi     {
1730*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
1731*35786f68SRobert Mustacchi 
1732*35786f68SRobert Mustacchi         /* Common subtable header */
1733*35786f68SRobert Mustacchi 
1734*35786f68SRobert Mustacchi         Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
1735*35786f68SRobert Mustacchi         if (Subtable->Length < sizeof (ACPI_SUBTABLE_HEADER))
1736*35786f68SRobert Mustacchi         {
1737*35786f68SRobert Mustacchi             AcpiOsPrintf ("Invalid subtable length\n");
1738*35786f68SRobert Mustacchi             return;
1739*35786f68SRobert Mustacchi         }
1740*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1741*35786f68SRobert Mustacchi             Subtable->Length, AcpiDmTableInfoPpttHdr);
1742*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1743*35786f68SRobert Mustacchi         {
1744*35786f68SRobert Mustacchi             return;
1745*35786f68SRobert Mustacchi         }
1746*35786f68SRobert Mustacchi 
1747*35786f68SRobert Mustacchi         switch (Subtable->Type)
1748*35786f68SRobert Mustacchi         {
1749*35786f68SRobert Mustacchi         case ACPI_PPTT_TYPE_PROCESSOR:
1750*35786f68SRobert Mustacchi 
1751*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoPptt0;
1752*35786f68SRobert Mustacchi             Length = sizeof (ACPI_PPTT_PROCESSOR);
1753*35786f68SRobert Mustacchi             break;
1754*35786f68SRobert Mustacchi 
1755*35786f68SRobert Mustacchi         case ACPI_PPTT_TYPE_CACHE:
1756*35786f68SRobert Mustacchi 
1757*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoPptt1;
1758*35786f68SRobert Mustacchi             Length = sizeof (ACPI_PPTT_CACHE);
1759*35786f68SRobert Mustacchi             break;
1760*35786f68SRobert Mustacchi 
1761*35786f68SRobert Mustacchi         case ACPI_PPTT_TYPE_ID:
1762*35786f68SRobert Mustacchi 
1763*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoPptt2;
1764*35786f68SRobert Mustacchi             Length = sizeof (ACPI_PPTT_ID);
1765*35786f68SRobert Mustacchi             break;
1766*35786f68SRobert Mustacchi 
1767*35786f68SRobert Mustacchi         default:
1768*35786f68SRobert Mustacchi 
1769*35786f68SRobert Mustacchi             AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n",
1770*35786f68SRobert Mustacchi                 Subtable->Type);
1771*35786f68SRobert Mustacchi 
1772*35786f68SRobert Mustacchi             /* Attempt to continue */
1773*35786f68SRobert Mustacchi 
1774*35786f68SRobert Mustacchi             goto NextSubtable;
1775*35786f68SRobert Mustacchi         }
1776*35786f68SRobert Mustacchi 
1777*35786f68SRobert Mustacchi         if (Subtable->Length < Length)
1778*35786f68SRobert Mustacchi         {
1779*35786f68SRobert Mustacchi             AcpiOsPrintf ("Invalid subtable length\n");
1780*35786f68SRobert Mustacchi             return;
1781*35786f68SRobert Mustacchi         }
1782*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1783*35786f68SRobert Mustacchi             Subtable->Length, InfoTable);
1784*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1785*35786f68SRobert Mustacchi         {
1786*35786f68SRobert Mustacchi             return;
1787*35786f68SRobert Mustacchi         }
1788*35786f68SRobert Mustacchi         SubtableOffset = Length;
1789*35786f68SRobert Mustacchi 
1790*35786f68SRobert Mustacchi         switch (Subtable->Type)
1791*35786f68SRobert Mustacchi         {
1792*35786f68SRobert Mustacchi         case ACPI_PPTT_TYPE_PROCESSOR:
1793*35786f68SRobert Mustacchi 
1794*35786f68SRobert Mustacchi             PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, Subtable);
1795*35786f68SRobert Mustacchi 
1796*35786f68SRobert Mustacchi             /* Dump SMBIOS handles */
1797*35786f68SRobert Mustacchi 
1798*35786f68SRobert Mustacchi             if ((UINT8)(Subtable->Length - SubtableOffset) <
1799*35786f68SRobert Mustacchi                 (UINT8)(PpttProcessor->NumberOfPrivResources * 4))
1800*35786f68SRobert Mustacchi             {
1801*35786f68SRobert Mustacchi                 AcpiOsPrintf ("Invalid private resource number\n");
1802*35786f68SRobert Mustacchi                 return;
1803*35786f68SRobert Mustacchi             }
1804*35786f68SRobert Mustacchi             for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++)
1805*35786f68SRobert Mustacchi             {
1806*35786f68SRobert Mustacchi                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
1807*35786f68SRobert Mustacchi                     ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
1808*35786f68SRobert Mustacchi                     4, AcpiDmTableInfoPptt0a);
1809*35786f68SRobert Mustacchi                 SubtableOffset += 4;
1810*35786f68SRobert Mustacchi             }
1811*35786f68SRobert Mustacchi             break;
1812*35786f68SRobert Mustacchi 
1813*35786f68SRobert Mustacchi         default:
1814*35786f68SRobert Mustacchi 
1815*35786f68SRobert Mustacchi             break;
1816*35786f68SRobert Mustacchi         }
1817*35786f68SRobert Mustacchi 
1818*35786f68SRobert Mustacchi NextSubtable:
1819*35786f68SRobert Mustacchi         /* Point to next subtable */
1820*35786f68SRobert Mustacchi 
1821*35786f68SRobert Mustacchi         Offset += Subtable->Length;
1822*35786f68SRobert Mustacchi     }
1823*35786f68SRobert Mustacchi }
1824*35786f68SRobert Mustacchi 
1825*35786f68SRobert Mustacchi 
1826*35786f68SRobert Mustacchi /*******************************************************************************
1827*35786f68SRobert Mustacchi  *
1828*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmDumpS3pt
1829*35786f68SRobert Mustacchi  *
1830*35786f68SRobert Mustacchi  * PARAMETERS:  Table               - A S3PT table
1831*35786f68SRobert Mustacchi  *
1832*35786f68SRobert Mustacchi  * RETURN:      Length of the table
1833*35786f68SRobert Mustacchi  *
1834*35786f68SRobert Mustacchi  * DESCRIPTION: Format the contents of a S3PT
1835*35786f68SRobert Mustacchi  *
1836*35786f68SRobert Mustacchi  ******************************************************************************/
1837*35786f68SRobert Mustacchi 
1838*35786f68SRobert Mustacchi UINT32
AcpiDmDumpS3pt(ACPI_TABLE_HEADER * Tables)1839*35786f68SRobert Mustacchi AcpiDmDumpS3pt (
1840*35786f68SRobert Mustacchi     ACPI_TABLE_HEADER       *Tables)
1841*35786f68SRobert Mustacchi {
1842*35786f68SRobert Mustacchi     ACPI_STATUS             Status;
1843*35786f68SRobert Mustacchi     UINT32                  Offset = sizeof (ACPI_TABLE_S3PT);
1844*35786f68SRobert Mustacchi     ACPI_FPDT_HEADER        *Subtable;
1845*35786f68SRobert Mustacchi     ACPI_DMTABLE_INFO       *InfoTable;
1846*35786f68SRobert Mustacchi     ACPI_TABLE_S3PT         *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
1847*35786f68SRobert Mustacchi 
1848*35786f68SRobert Mustacchi 
1849*35786f68SRobert Mustacchi     /* Main table */
1850*35786f68SRobert Mustacchi 
1851*35786f68SRobert Mustacchi     Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
1852*35786f68SRobert Mustacchi     if (ACPI_FAILURE (Status))
1853*35786f68SRobert Mustacchi     {
1854*35786f68SRobert Mustacchi         return 0;
1855*35786f68SRobert Mustacchi     }
1856*35786f68SRobert Mustacchi 
1857*35786f68SRobert Mustacchi     Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);
1858*35786f68SRobert Mustacchi     while (Offset < S3ptTable->Length)
1859*35786f68SRobert Mustacchi     {
1860*35786f68SRobert Mustacchi         /* Common subtable header */
1861*35786f68SRobert Mustacchi 
1862*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
1863*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
1864*35786f68SRobert Mustacchi             Subtable->Length, AcpiDmTableInfoS3ptHdr);
1865*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1866*35786f68SRobert Mustacchi         {
1867*35786f68SRobert Mustacchi             return 0;
1868*35786f68SRobert Mustacchi         }
1869*35786f68SRobert Mustacchi 
1870*35786f68SRobert Mustacchi         switch (Subtable->Type)
1871*35786f68SRobert Mustacchi         {
1872*35786f68SRobert Mustacchi         case ACPI_S3PT_TYPE_RESUME:
1873*35786f68SRobert Mustacchi 
1874*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoS3pt0;
1875*35786f68SRobert Mustacchi             break;
1876*35786f68SRobert Mustacchi 
1877*35786f68SRobert Mustacchi         case ACPI_S3PT_TYPE_SUSPEND:
1878*35786f68SRobert Mustacchi 
1879*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoS3pt1;
1880*35786f68SRobert Mustacchi             break;
1881*35786f68SRobert Mustacchi 
1882*35786f68SRobert Mustacchi         default:
1883*35786f68SRobert Mustacchi 
1884*35786f68SRobert Mustacchi             AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n",
1885*35786f68SRobert Mustacchi                 Subtable->Type);
1886*35786f68SRobert Mustacchi 
1887*35786f68SRobert Mustacchi             /* Attempt to continue */
1888*35786f68SRobert Mustacchi 
1889*35786f68SRobert Mustacchi             if (!Subtable->Length)
1890*35786f68SRobert Mustacchi             {
1891*35786f68SRobert Mustacchi                 AcpiOsPrintf ("Invalid zero length subtable\n");
1892*35786f68SRobert Mustacchi                 return 0;
1893*35786f68SRobert Mustacchi             }
1894*35786f68SRobert Mustacchi             goto NextSubtable;
1895*35786f68SRobert Mustacchi         }
1896*35786f68SRobert Mustacchi 
1897*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
1898*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
1899*35786f68SRobert Mustacchi             Subtable->Length, InfoTable);
1900*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1901*35786f68SRobert Mustacchi         {
1902*35786f68SRobert Mustacchi             return 0;
1903*35786f68SRobert Mustacchi         }
1904*35786f68SRobert Mustacchi 
1905*35786f68SRobert Mustacchi NextSubtable:
1906*35786f68SRobert Mustacchi         /* Point to next subtable */
1907*35786f68SRobert Mustacchi 
1908*35786f68SRobert Mustacchi         Offset += Subtable->Length;
1909*35786f68SRobert Mustacchi         Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length);
1910*35786f68SRobert Mustacchi     }
1911*35786f68SRobert Mustacchi 
1912*35786f68SRobert Mustacchi     return (S3ptTable->Length);
1913*35786f68SRobert Mustacchi }
1914*35786f68SRobert Mustacchi 
1915*35786f68SRobert Mustacchi 
1916*35786f68SRobert Mustacchi /*******************************************************************************
1917*35786f68SRobert Mustacchi  *
1918*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmDumpSdev
1919*35786f68SRobert Mustacchi  *
1920*35786f68SRobert Mustacchi  * PARAMETERS:  Table               - A SDEV table
1921*35786f68SRobert Mustacchi  *
1922*35786f68SRobert Mustacchi  * RETURN:      None
1923*35786f68SRobert Mustacchi  *
1924*35786f68SRobert Mustacchi  * DESCRIPTION: Format the contents of a SDEV. This is a variable-length
1925*35786f68SRobert Mustacchi  *              table that contains variable strings and vendor data.
1926*35786f68SRobert Mustacchi  *
1927*35786f68SRobert Mustacchi  ******************************************************************************/
1928*35786f68SRobert Mustacchi 
1929*35786f68SRobert Mustacchi void
AcpiDmDumpSdev(ACPI_TABLE_HEADER * Table)1930*35786f68SRobert Mustacchi AcpiDmDumpSdev (
1931*35786f68SRobert Mustacchi     ACPI_TABLE_HEADER       *Table)
1932*35786f68SRobert Mustacchi {
1933*35786f68SRobert Mustacchi     ACPI_STATUS             Status;
1934*35786f68SRobert Mustacchi     ACPI_SDEV_HEADER        *Subtable;
1935*35786f68SRobert Mustacchi     ACPI_SDEV_PCIE          *Pcie;
1936*35786f68SRobert Mustacchi     ACPI_SDEV_NAMESPACE     *Namesp;
1937*35786f68SRobert Mustacchi     ACPI_DMTABLE_INFO       *InfoTable;
1938*35786f68SRobert Mustacchi     UINT32                  Length = Table->Length;
1939*35786f68SRobert Mustacchi     UINT32                  Offset = sizeof (ACPI_TABLE_SDEV);
1940*35786f68SRobert Mustacchi     UINT16                  PathOffset;
1941*35786f68SRobert Mustacchi     UINT16                  PathLength;
1942*35786f68SRobert Mustacchi     UINT16                  VendorDataOffset;
1943*35786f68SRobert Mustacchi     UINT16                  VendorDataLength;
1944*35786f68SRobert Mustacchi 
1945*35786f68SRobert Mustacchi 
1946*35786f68SRobert Mustacchi     /* Main table */
1947*35786f68SRobert Mustacchi 
1948*35786f68SRobert Mustacchi     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev);
1949*35786f68SRobert Mustacchi     if (ACPI_FAILURE (Status))
1950*35786f68SRobert Mustacchi     {
1951*35786f68SRobert Mustacchi         return;
1952*35786f68SRobert Mustacchi     }
1953*35786f68SRobert Mustacchi 
1954*35786f68SRobert Mustacchi     /* Subtables */
1955*35786f68SRobert Mustacchi 
1956*35786f68SRobert Mustacchi     Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset);
1957*35786f68SRobert Mustacchi     while (Offset < Table->Length)
1958*35786f68SRobert Mustacchi     {
1959*35786f68SRobert Mustacchi         /* Common subtable header */
1960*35786f68SRobert Mustacchi 
1961*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
1962*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1963*35786f68SRobert Mustacchi             Subtable->Length, AcpiDmTableInfoSdevHdr);
1964*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1965*35786f68SRobert Mustacchi         {
1966*35786f68SRobert Mustacchi             return;
1967*35786f68SRobert Mustacchi         }
1968*35786f68SRobert Mustacchi 
1969*35786f68SRobert Mustacchi         switch (Subtable->Type)
1970*35786f68SRobert Mustacchi         {
1971*35786f68SRobert Mustacchi         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
1972*35786f68SRobert Mustacchi 
1973*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoSdev0;
1974*35786f68SRobert Mustacchi             break;
1975*35786f68SRobert Mustacchi 
1976*35786f68SRobert Mustacchi         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
1977*35786f68SRobert Mustacchi 
1978*35786f68SRobert Mustacchi             InfoTable = AcpiDmTableInfoSdev1;
1979*35786f68SRobert Mustacchi             break;
1980*35786f68SRobert Mustacchi 
1981*35786f68SRobert Mustacchi         default:
1982*35786f68SRobert Mustacchi             goto NextSubtable;
1983*35786f68SRobert Mustacchi         }
1984*35786f68SRobert Mustacchi 
1985*35786f68SRobert Mustacchi         AcpiOsPrintf ("\n");
1986*35786f68SRobert Mustacchi         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1987*35786f68SRobert Mustacchi             Subtable->Length, InfoTable);
1988*35786f68SRobert Mustacchi         if (ACPI_FAILURE (Status))
1989*35786f68SRobert Mustacchi         {
1990*35786f68SRobert Mustacchi             return;
1991*35786f68SRobert Mustacchi         }
1992*35786f68SRobert Mustacchi 
1993*35786f68SRobert Mustacchi         switch (Subtable->Type)
1994*35786f68SRobert Mustacchi         {
1995*35786f68SRobert Mustacchi         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
1996*35786f68SRobert Mustacchi 
1997*35786f68SRobert Mustacchi             /* Dump the PCIe device ID(s) */
1998*35786f68SRobert Mustacchi 
1999*35786f68SRobert Mustacchi             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);
2000*35786f68SRobert Mustacchi             PathOffset = Namesp->DeviceIdOffset;
2001*35786f68SRobert Mustacchi             PathLength = Namesp->DeviceIdLength;
2002*35786f68SRobert Mustacchi 
2003*35786f68SRobert Mustacchi             if (PathLength)
2004*35786f68SRobert Mustacchi             {
2005*35786f68SRobert Mustacchi                 Status = AcpiDmDumpTable (Table->Length, 0,
2006*35786f68SRobert Mustacchi                     ACPI_ADD_PTR (UINT8, Namesp, PathOffset),
2007*35786f68SRobert Mustacchi                     PathLength, AcpiDmTableInfoSdev0a);
2008*35786f68SRobert Mustacchi                 if (ACPI_FAILURE (Status))
2009*35786f68SRobert Mustacchi                 {
2010*35786f68SRobert Mustacchi                     return;
2011*35786f68SRobert Mustacchi                 }
2012*35786f68SRobert Mustacchi             }
2013*35786f68SRobert Mustacchi 
2014*35786f68SRobert Mustacchi             /* Dump the vendor-specific data */
2015*35786f68SRobert Mustacchi 
2016*35786f68SRobert Mustacchi             VendorDataLength =
2017*35786f68SRobert Mustacchi                 Namesp->VendorDataLength;
2018*35786f68SRobert Mustacchi             VendorDataOffset =
2019*35786f68SRobert Mustacchi                 Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
2020*35786f68SRobert Mustacchi 
2021*35786f68SRobert Mustacchi             if (VendorDataLength)
2022*35786f68SRobert Mustacchi             {
2023*35786f68SRobert Mustacchi                 Status = AcpiDmDumpTable (Table->Length, 0,
2024*35786f68SRobert Mustacchi                     ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset),
2025*35786f68SRobert Mustacchi                     VendorDataLength, AcpiDmTableInfoSdev1b);
2026*35786f68SRobert Mustacchi                 if (ACPI_FAILURE (Status))
2027*35786f68SRobert Mustacchi                 {
2028*35786f68SRobert Mustacchi                     return;
2029*35786f68SRobert Mustacchi                 }
2030*35786f68SRobert Mustacchi             }
2031*35786f68SRobert Mustacchi             break;
2032*35786f68SRobert Mustacchi 
2033*35786f68SRobert Mustacchi         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
2034*35786f68SRobert Mustacchi 
2035*35786f68SRobert Mustacchi             /* PCI path substructures */
2036*35786f68SRobert Mustacchi 
2037*35786f68SRobert Mustacchi             Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable);
2038*35786f68SRobert Mustacchi             PathOffset = Pcie->PathOffset;
2039*35786f68SRobert Mustacchi             PathLength = Pcie->PathLength;
2040*35786f68SRobert Mustacchi 
2041*35786f68SRobert Mustacchi             while (PathLength)
2042*35786f68SRobert Mustacchi             {
2043*35786f68SRobert Mustacchi                 Status = AcpiDmDumpTable (Table->Length,
2044*35786f68SRobert Mustacchi                     PathOffset + Offset,
2045*35786f68SRobert Mustacchi                     ACPI_ADD_PTR (UINT8, Pcie, PathOffset),
2046*35786f68SRobert Mustacchi                     sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a);
2047*35786f68SRobert Mustacchi                 if (ACPI_FAILURE (Status))
2048*35786f68SRobert Mustacchi                 {
2049*35786f68SRobert Mustacchi                     return;
2050*35786f68SRobert Mustacchi                 }
2051*35786f68SRobert Mustacchi 
2052*35786f68SRobert Mustacchi                 PathOffset += sizeof (ACPI_SDEV_PCIE_PATH);
2053*35786f68SRobert Mustacchi                 PathLength -= sizeof (ACPI_SDEV_PCIE_PATH);
2054*35786f68SRobert Mustacchi             }
2055*35786f68SRobert Mustacchi 
2056*35786f68SRobert Mustacchi             /* VendorData */
2057*35786f68SRobert Mustacchi 
2058*35786f68SRobert Mustacchi             VendorDataLength = Pcie->VendorDataLength;
2059*35786f68SRobert Mustacchi             VendorDataOffset = Pcie->PathOffset + Pcie->PathLength;
2060*35786f68SRobert Mustacchi 
2061*35786f68SRobert Mustacchi             if (VendorDataLength)
2062*35786f68SRobert Mustacchi             {
2063*35786f68SRobert Mustacchi                 Status = AcpiDmDumpTable (Table->Length, 0,
2064*35786f68SRobert Mustacchi                     ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset),
2065*35786f68SRobert Mustacchi                     VendorDataLength, AcpiDmTableInfoSdev1b);
2066*35786f68SRobert Mustacchi             }
2067*35786f68SRobert Mustacchi             break;
2068*35786f68SRobert Mustacchi 
2069*35786f68SRobert Mustacchi         default:
2070*35786f68SRobert Mustacchi             goto NextSubtable;
2071*35786f68SRobert Mustacchi         }
2072*35786f68SRobert Mustacchi 
2073*35786f68SRobert Mustacchi NextSubtable:
2074*35786f68SRobert Mustacchi         /* Point to next subtable */
2075*35786f68SRobert Mustacchi 
2076*35786f68SRobert Mustacchi         Offset += Subtable->Length;
2077*35786f68SRobert Mustacchi         Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable,
2078*35786f68SRobert Mustacchi             Subtable->Length);
2079*35786f68SRobert Mustacchi     }
2080*35786f68SRobert Mustacchi }
2081