dmtbdump.c revision 272444
1167802Sjkim/******************************************************************************
2167802Sjkim *
3167802Sjkim * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code
4167802Sjkim *
5167802Sjkim *****************************************************************************/
6167802Sjkim
7217365Sjkim/*
8272444Sjkim * Copyright (C) 2000 - 2014, Intel Corp.
9167802Sjkim * All rights reserved.
10167802Sjkim *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25167802Sjkim *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29167802Sjkim *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43167802Sjkim
44193529Sjkim#include <contrib/dev/acpica/include/acpi.h>
45193529Sjkim#include <contrib/dev/acpica/include/accommon.h>
46193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
47193529Sjkim#include <contrib/dev/acpica/include/actables.h>
48167802Sjkim
49167802Sjkim/* This module used for application-level code only */
50167802Sjkim
51167802Sjkim#define _COMPONENT          ACPI_CA_DISASSEMBLER
52167802Sjkim        ACPI_MODULE_NAME    ("dmtbdump")
53167802Sjkim
54167802Sjkim
55239340Sjkim/* Local prototypes */
56239340Sjkim
57218590Sjkimstatic void
58218590SjkimAcpiDmValidateFadtLength (
59218590Sjkim    UINT32                  Revision,
60218590Sjkim    UINT32                  Length);
61218590Sjkim
62239340Sjkimstatic void
63239340SjkimAcpiDmDumpBuffer (
64239340Sjkim    void                    *Table,
65239340Sjkim    UINT32                  BufferOffset,
66239340Sjkim    UINT32                  Length,
67239340Sjkim    UINT32                  AbsoluteOffset,
68239340Sjkim    char                    *Header);
69218590Sjkim
70239340Sjkim
71167802Sjkim/*******************************************************************************
72167802Sjkim *
73239340Sjkim * FUNCTION:    AcpiDmDumpBuffer
74239340Sjkim *
75239340Sjkim * PARAMETERS:  Table               - ACPI Table or subtable
76239340Sjkim *              BufferOffset        - Offset of buffer from Table above
77239340Sjkim *              Length              - Length of the buffer
78239340Sjkim *              AbsoluteOffset      - Offset of buffer in the main ACPI table
79239340Sjkim *              Header              - Name of the buffer field (printed on the
80239340Sjkim *                                    first line only.)
81239340Sjkim *
82239340Sjkim * RETURN:      None
83239340Sjkim *
84239340Sjkim * DESCRIPTION: Format the contents of an arbitrary length data buffer (in the
85239340Sjkim *              disassembler output format.)
86239340Sjkim *
87239340Sjkim ******************************************************************************/
88239340Sjkim
89239340Sjkimstatic void
90239340SjkimAcpiDmDumpBuffer (
91239340Sjkim    void                    *Table,
92239340Sjkim    UINT32                  BufferOffset,
93239340Sjkim    UINT32                  Length,
94239340Sjkim    UINT32                  AbsoluteOffset,
95239340Sjkim    char                    *Header)
96239340Sjkim{
97239340Sjkim    UINT8                   *Buffer;
98239340Sjkim    UINT32                  i;
99239340Sjkim
100239340Sjkim
101239340Sjkim    if (!Length)
102239340Sjkim    {
103239340Sjkim        return;
104239340Sjkim    }
105239340Sjkim
106239340Sjkim    Buffer = ACPI_CAST_PTR (UINT8, Table) + BufferOffset;
107239340Sjkim    i = 0;
108239340Sjkim
109239340Sjkim    while (i < Length)
110239340Sjkim    {
111239340Sjkim        if (!(i % 16))
112239340Sjkim        {
113239340Sjkim            AcpiOsPrintf ("\n");
114239340Sjkim            AcpiDmLineHeader (AbsoluteOffset,
115239340Sjkim                ((Length - i) > 16) ? 16 : (Length - i), Header);
116239340Sjkim            Header = NULL;
117239340Sjkim        }
118239340Sjkim
119239340Sjkim        AcpiOsPrintf ("%.02X ", *Buffer);
120239340Sjkim        i++;
121239340Sjkim        Buffer++;
122239340Sjkim        AbsoluteOffset++;
123239340Sjkim    }
124239340Sjkim
125239340Sjkim    AcpiOsPrintf ("\n");
126239340Sjkim}
127239340Sjkim
128239340Sjkim
129239340Sjkim/*******************************************************************************
130239340Sjkim *
131167802Sjkim * FUNCTION:    AcpiDmDumpRsdp
132167802Sjkim *
133167802Sjkim * PARAMETERS:  Table               - A RSDP
134167802Sjkim *
135209746Sjkim * RETURN:      Length of the table (there is not always a length field,
136209746Sjkim *              use revision or length if available (ACPI 2.0+))
137167802Sjkim *
138167802Sjkim * DESCRIPTION: Format the contents of a RSDP
139167802Sjkim *
140167802Sjkim ******************************************************************************/
141167802Sjkim
142167802SjkimUINT32
143167802SjkimAcpiDmDumpRsdp (
144167802Sjkim    ACPI_TABLE_HEADER       *Table)
145167802Sjkim{
146209746Sjkim    ACPI_TABLE_RSDP         *Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table);
147209746Sjkim    UINT32                  Length = sizeof (ACPI_RSDP_COMMON);
148209746Sjkim    UINT8                   Checksum;
149167802Sjkim
150167802Sjkim
151167802Sjkim    /* Dump the common ACPI 1.0 portion */
152167802Sjkim
153167802Sjkim    AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1);
154167802Sjkim
155209746Sjkim    /* Validate the first checksum */
156167802Sjkim
157209746Sjkim    Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON),
158209746Sjkim                Rsdp->Checksum);
159209746Sjkim    if (Checksum != Rsdp->Checksum)
160167802Sjkim    {
161209746Sjkim        AcpiOsPrintf ("/* Incorrect Checksum above, should be 0x%2.2X */\n",
162209746Sjkim            Checksum);
163209746Sjkim    }
164209746Sjkim
165209746Sjkim    /* The RSDP for ACPI 2.0+ contains more data and has a Length field */
166209746Sjkim
167209746Sjkim    if (Rsdp->Revision > 0)
168209746Sjkim    {
169209746Sjkim        Length = Rsdp->Length;
170167802Sjkim        AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2);
171209746Sjkim
172209746Sjkim        /* Validate the extended checksum over entire RSDP */
173209746Sjkim
174209746Sjkim        Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP),
175209746Sjkim                    Rsdp->ExtendedChecksum);
176209746Sjkim        if (Checksum != Rsdp->ExtendedChecksum)
177209746Sjkim        {
178209746Sjkim            AcpiOsPrintf (
179209746Sjkim                "/* Incorrect Extended Checksum above, should be 0x%2.2X */\n",
180209746Sjkim                Checksum);
181209746Sjkim        }
182167802Sjkim    }
183167802Sjkim
184167802Sjkim    return (Length);
185167802Sjkim}
186167802Sjkim
187167802Sjkim
188167802Sjkim/*******************************************************************************
189167802Sjkim *
190167802Sjkim * FUNCTION:    AcpiDmDumpRsdt
191167802Sjkim *
192167802Sjkim * PARAMETERS:  Table               - A RSDT
193167802Sjkim *
194167802Sjkim * RETURN:      None
195167802Sjkim *
196167802Sjkim * DESCRIPTION: Format the contents of a RSDT
197167802Sjkim *
198167802Sjkim ******************************************************************************/
199167802Sjkim
200167802Sjkimvoid
201167802SjkimAcpiDmDumpRsdt (
202167802Sjkim    ACPI_TABLE_HEADER       *Table)
203167802Sjkim{
204167802Sjkim    UINT32                  *Array;
205167802Sjkim    UINT32                  Entries;
206167802Sjkim    UINT32                  Offset;
207167802Sjkim    UINT32                  i;
208167802Sjkim
209167802Sjkim
210167802Sjkim    /* Point to start of table pointer array */
211167802Sjkim
212167802Sjkim    Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry;
213167802Sjkim    Offset = sizeof (ACPI_TABLE_HEADER);
214167802Sjkim
215167802Sjkim    /* RSDT uses 32-bit pointers */
216167802Sjkim
217167802Sjkim    Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32);
218167802Sjkim
219167802Sjkim    for (i = 0; i < Entries; i++)
220167802Sjkim    {
221167802Sjkim        AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i);
222167802Sjkim        AcpiOsPrintf ("%8.8X\n", Array[i]);
223167802Sjkim        Offset += sizeof (UINT32);
224167802Sjkim    }
225167802Sjkim}
226167802Sjkim
227167802Sjkim
228167802Sjkim/*******************************************************************************
229167802Sjkim *
230167802Sjkim * FUNCTION:    AcpiDmDumpXsdt
231167802Sjkim *
232167802Sjkim * PARAMETERS:  Table               - A XSDT
233167802Sjkim *
234167802Sjkim * RETURN:      None
235167802Sjkim *
236167802Sjkim * DESCRIPTION: Format the contents of a XSDT
237167802Sjkim *
238167802Sjkim ******************************************************************************/
239167802Sjkim
240167802Sjkimvoid
241167802SjkimAcpiDmDumpXsdt (
242167802Sjkim    ACPI_TABLE_HEADER       *Table)
243167802Sjkim{
244167802Sjkim    UINT64                  *Array;
245167802Sjkim    UINT32                  Entries;
246167802Sjkim    UINT32                  Offset;
247167802Sjkim    UINT32                  i;
248167802Sjkim
249167802Sjkim
250167802Sjkim    /* Point to start of table pointer array */
251167802Sjkim
252167802Sjkim    Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry;
253167802Sjkim    Offset = sizeof (ACPI_TABLE_HEADER);
254167802Sjkim
255167802Sjkim    /* XSDT uses 64-bit pointers */
256167802Sjkim
257167802Sjkim    Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64);
258167802Sjkim
259167802Sjkim    for (i = 0; i < Entries; i++)
260167802Sjkim    {
261167802Sjkim        AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i);
262167802Sjkim        AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i]));
263167802Sjkim        Offset += sizeof (UINT64);
264167802Sjkim    }
265167802Sjkim}
266167802Sjkim
267167802Sjkim
268167802Sjkim/*******************************************************************************
269167802Sjkim *
270167802Sjkim * FUNCTION:    AcpiDmDumpFadt
271167802Sjkim *
272167802Sjkim * PARAMETERS:  Table               - A FADT
273167802Sjkim *
274167802Sjkim * RETURN:      None
275167802Sjkim *
276167802Sjkim * DESCRIPTION: Format the contents of a FADT
277167802Sjkim *
278218590Sjkim * NOTE:        We cannot depend on the FADT version to indicate the actual
279218590Sjkim *              contents of the FADT because of BIOS bugs. The table length
280218590Sjkim *              is the only reliable indicator.
281218590Sjkim *
282167802Sjkim ******************************************************************************/
283167802Sjkim
284167802Sjkimvoid
285167802SjkimAcpiDmDumpFadt (
286167802Sjkim    ACPI_TABLE_HEADER       *Table)
287167802Sjkim{
288167802Sjkim
289218590Sjkim    /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */
290167802Sjkim
291167802Sjkim    AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt1);
292167802Sjkim
293218590Sjkim    /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */
294167802Sjkim
295218590Sjkim    if ((Table->Length > ACPI_FADT_V1_SIZE) &&
296218590Sjkim        (Table->Length <= ACPI_FADT_V2_SIZE))
297167802Sjkim    {
298167802Sjkim        AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt2);
299167802Sjkim    }
300167802Sjkim
301228110Sjkim    /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */
302193529Sjkim
303218590Sjkim    else if (Table->Length > ACPI_FADT_V2_SIZE)
304193529Sjkim    {
305193529Sjkim        AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt3);
306228110Sjkim
307228110Sjkim        /* Check for FADT revision 5 fields and up (ACPI 5.0+) */
308228110Sjkim
309228110Sjkim        if (Table->Length > ACPI_FADT_V3_SIZE)
310228110Sjkim        {
311228110Sjkim            AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt5);
312228110Sjkim        }
313193529Sjkim    }
314193529Sjkim
315167802Sjkim    /* Validate various fields in the FADT, including length */
316167802Sjkim
317167802Sjkim    AcpiTbCreateLocalFadt (Table, Table->Length);
318218590Sjkim
319218590Sjkim    /* Validate FADT length against the revision */
320218590Sjkim
321218590Sjkim    AcpiDmValidateFadtLength (Table->Revision, Table->Length);
322167802Sjkim}
323167802Sjkim
324167802Sjkim
325167802Sjkim/*******************************************************************************
326167802Sjkim *
327218590Sjkim * FUNCTION:    AcpiDmValidateFadtLength
328218590Sjkim *
329218590Sjkim * PARAMETERS:  Revision            - FADT revision (Header->Revision)
330218590Sjkim *              Length              - FADT length (Header->Length
331218590Sjkim *
332218590Sjkim * RETURN:      None
333218590Sjkim *
334218590Sjkim * DESCRIPTION: Check the FADT revision against the expected table length for
335218590Sjkim *              that revision. Issue a warning if the length is not what was
336218590Sjkim *              expected. This seems to be such a common BIOS bug that the
337218590Sjkim *              FADT revision has been rendered virtually meaningless.
338218590Sjkim *
339218590Sjkim ******************************************************************************/
340218590Sjkim
341218590Sjkimstatic void
342218590SjkimAcpiDmValidateFadtLength (
343218590Sjkim    UINT32                  Revision,
344218590Sjkim    UINT32                  Length)
345218590Sjkim{
346218590Sjkim    UINT32                  ExpectedLength;
347218590Sjkim
348218590Sjkim
349218590Sjkim    switch (Revision)
350218590Sjkim    {
351218590Sjkim    case 0:
352250838Sjkim
353218590Sjkim        AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n");
354218590Sjkim        return;
355218590Sjkim
356218590Sjkim    case 1:
357250838Sjkim
358218590Sjkim        ExpectedLength = ACPI_FADT_V1_SIZE;
359218590Sjkim        break;
360218590Sjkim
361218590Sjkim    case 2:
362250838Sjkim
363218590Sjkim        ExpectedLength = ACPI_FADT_V2_SIZE;
364218590Sjkim        break;
365218590Sjkim
366218590Sjkim    case 3:
367218590Sjkim    case 4:
368250838Sjkim
369218590Sjkim        ExpectedLength = ACPI_FADT_V3_SIZE;
370218590Sjkim        break;
371218590Sjkim
372228110Sjkim    case 5:
373250838Sjkim
374228110Sjkim        ExpectedLength = ACPI_FADT_V5_SIZE;
375228110Sjkim        break;
376228110Sjkim
377218590Sjkim    default:
378250838Sjkim
379218590Sjkim        return;
380218590Sjkim    }
381218590Sjkim
382218590Sjkim    if (Length == ExpectedLength)
383218590Sjkim    {
384218590Sjkim        return;
385218590Sjkim    }
386218590Sjkim
387218590Sjkim    AcpiOsPrintf (
388218590Sjkim        "\n// ACPI Warning: FADT revision %X does not match length: found %X expected %X\n",
389218590Sjkim        Revision, Length, ExpectedLength);
390218590Sjkim}
391218590Sjkim
392218590Sjkim
393218590Sjkim/*******************************************************************************
394218590Sjkim *
395167802Sjkim * FUNCTION:    AcpiDmDumpAsf
396167802Sjkim *
397167802Sjkim * PARAMETERS:  Table               - A ASF table
398167802Sjkim *
399167802Sjkim * RETURN:      None
400167802Sjkim *
401167802Sjkim * DESCRIPTION: Format the contents of a ASF table
402167802Sjkim *
403167802Sjkim ******************************************************************************/
404167802Sjkim
405167802Sjkimvoid
406167802SjkimAcpiDmDumpAsf (
407167802Sjkim    ACPI_TABLE_HEADER       *Table)
408167802Sjkim{
409193529Sjkim    ACPI_STATUS             Status;
410167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
411167802Sjkim    ACPI_ASF_INFO           *SubTable;
412167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
413167802Sjkim    ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
414167802Sjkim    UINT8                   *DataTable = NULL;
415193529Sjkim    UINT32                  DataCount = 0;
416193529Sjkim    UINT32                  DataLength = 0;
417193529Sjkim    UINT32                  DataOffset = 0;
418193529Sjkim    UINT32                  i;
419197104Sjkim    UINT8                   Type;
420167802Sjkim
421167802Sjkim
422272444Sjkim    /* No main table, only subtables */
423167802Sjkim
424167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
425167802Sjkim    while (Offset < Table->Length)
426167802Sjkim    {
427272444Sjkim        /* Common subtable header */
428167802Sjkim
429193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
430193529Sjkim                    SubTable->Header.Length, AcpiDmTableInfoAsfHdr);
431193529Sjkim        if (ACPI_FAILURE (Status))
432193529Sjkim        {
433193529Sjkim            return;
434193529Sjkim        }
435167802Sjkim
436197104Sjkim        /* The actual type is the lower 7 bits of Type */
437197104Sjkim
438197104Sjkim        Type = (UINT8) (SubTable->Header.Type & 0x7F);
439197104Sjkim
440197104Sjkim        switch (Type)
441167802Sjkim        {
442167802Sjkim        case ACPI_ASF_TYPE_INFO:
443250838Sjkim
444167802Sjkim            InfoTable = AcpiDmTableInfoAsf0;
445167802Sjkim            break;
446167802Sjkim
447167802Sjkim        case ACPI_ASF_TYPE_ALERT:
448250838Sjkim
449167802Sjkim            InfoTable = AcpiDmTableInfoAsf1;
450167802Sjkim            DataInfoTable = AcpiDmTableInfoAsf1a;
451167802Sjkim            DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT));
452197104Sjkim            DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts;
453197104Sjkim            DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength;
454167802Sjkim            DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
455167802Sjkim            break;
456167802Sjkim
457167802Sjkim        case ACPI_ASF_TYPE_CONTROL:
458250838Sjkim
459167802Sjkim            InfoTable = AcpiDmTableInfoAsf2;
460167802Sjkim            DataInfoTable = AcpiDmTableInfoAsf2a;
461167802Sjkim            DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE));
462197104Sjkim            DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls;
463197104Sjkim            DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength;
464167802Sjkim            DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
465167802Sjkim            break;
466167802Sjkim
467167802Sjkim        case ACPI_ASF_TYPE_BOOT:
468250838Sjkim
469167802Sjkim            InfoTable = AcpiDmTableInfoAsf3;
470167802Sjkim            break;
471167802Sjkim
472167802Sjkim        case ACPI_ASF_TYPE_ADDRESS:
473250838Sjkim
474167802Sjkim            InfoTable = AcpiDmTableInfoAsf4;
475167802Sjkim            DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS));
476197104Sjkim            DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices;
477167802Sjkim            DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
478167802Sjkim            break;
479167802Sjkim
480167802Sjkim        default:
481250838Sjkim
482272444Sjkim            AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n", SubTable->Header.Type);
483167802Sjkim            return;
484167802Sjkim        }
485167802Sjkim
486193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
487193529Sjkim                    SubTable->Header.Length, InfoTable);
488193529Sjkim        if (ACPI_FAILURE (Status))
489193529Sjkim        {
490193529Sjkim            return;
491193529Sjkim        }
492167802Sjkim
493167802Sjkim        /* Dump variable-length extra data */
494167802Sjkim
495197104Sjkim        switch (Type)
496167802Sjkim        {
497167802Sjkim        case ACPI_ASF_TYPE_ALERT:
498167802Sjkim        case ACPI_ASF_TYPE_CONTROL:
499167802Sjkim
500167802Sjkim            for (i = 0; i < DataCount; i++)
501167802Sjkim            {
502167802Sjkim                AcpiOsPrintf ("\n");
503193529Sjkim                Status = AcpiDmDumpTable (Table->Length, DataOffset,
504193529Sjkim                            DataTable, DataLength, DataInfoTable);
505193529Sjkim                if (ACPI_FAILURE (Status))
506193529Sjkim                {
507193529Sjkim                    return;
508193529Sjkim                }
509167802Sjkim
510167802Sjkim                DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
511167802Sjkim                DataOffset += DataLength;
512167802Sjkim            }
513167802Sjkim            break;
514167802Sjkim
515167802Sjkim        case ACPI_ASF_TYPE_ADDRESS:
516167802Sjkim
517167802Sjkim            for (i = 0; i < DataLength; i++)
518167802Sjkim            {
519167802Sjkim                if (!(i % 16))
520167802Sjkim                {
521167802Sjkim                    AcpiDmLineHeader (DataOffset, 1, "Addresses");
522167802Sjkim                }
523167802Sjkim
524167802Sjkim                AcpiOsPrintf ("%2.2X ", *DataTable);
525167802Sjkim                DataTable++;
526167802Sjkim                DataOffset++;
527193529Sjkim                if (DataOffset > Table->Length)
528193529Sjkim                {
529193529Sjkim                    AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
530193529Sjkim                    return;
531193529Sjkim                }
532167802Sjkim            }
533167802Sjkim
534167802Sjkim            AcpiOsPrintf ("\n");
535167802Sjkim            break;
536193529Sjkim
537193529Sjkim        default:
538250838Sjkim
539193529Sjkim            break;
540167802Sjkim        }
541167802Sjkim
542167802Sjkim        AcpiOsPrintf ("\n");
543167802Sjkim
544272444Sjkim        /* Point to next subtable */
545167802Sjkim
546193529Sjkim        if (!SubTable->Header.Length)
547193529Sjkim        {
548193529Sjkim            AcpiOsPrintf ("Invalid zero subtable header length\n");
549193529Sjkim            return;
550193529Sjkim        }
551193529Sjkim
552167802Sjkim        Offset += SubTable->Header.Length;
553167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable, SubTable->Header.Length);
554167802Sjkim    }
555167802Sjkim}
556167802Sjkim
557167802Sjkim
558167802Sjkim/*******************************************************************************
559167802Sjkim *
560167802Sjkim * FUNCTION:    AcpiDmDumpCpep
561167802Sjkim *
562167802Sjkim * PARAMETERS:  Table               - A CPEP table
563167802Sjkim *
564167802Sjkim * RETURN:      None
565167802Sjkim *
566167802Sjkim * DESCRIPTION: Format the contents of a CPEP. This table type consists
567167802Sjkim *              of an open-ended number of subtables.
568167802Sjkim *
569167802Sjkim ******************************************************************************/
570167802Sjkim
571167802Sjkimvoid
572167802SjkimAcpiDmDumpCpep (
573167802Sjkim    ACPI_TABLE_HEADER       *Table)
574167802Sjkim{
575193529Sjkim    ACPI_STATUS             Status;
576167802Sjkim    ACPI_CPEP_POLLING       *SubTable;
577167802Sjkim    UINT32                  Length = Table->Length;
578167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_CPEP);
579167802Sjkim
580167802Sjkim
581167802Sjkim    /* Main table */
582167802Sjkim
583193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
584193529Sjkim    if (ACPI_FAILURE (Status))
585193529Sjkim    {
586193529Sjkim        return;
587193529Sjkim    }
588167802Sjkim
589272444Sjkim    /* Subtables */
590167802Sjkim
591167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
592167802Sjkim    while (Offset < Table->Length)
593167802Sjkim    {
594167802Sjkim        AcpiOsPrintf ("\n");
595193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
596197104Sjkim                    SubTable->Header.Length, AcpiDmTableInfoCpep0);
597193529Sjkim        if (ACPI_FAILURE (Status))
598193529Sjkim        {
599193529Sjkim            return;
600193529Sjkim        }
601167802Sjkim
602272444Sjkim        /* Point to next subtable */
603167802Sjkim
604197104Sjkim        Offset += SubTable->Header.Length;
605197104Sjkim        SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable,
606197104Sjkim                    SubTable->Header.Length);
607167802Sjkim    }
608167802Sjkim}
609167802Sjkim
610167802Sjkim
611167802Sjkim/*******************************************************************************
612167802Sjkim *
613239340Sjkim * FUNCTION:    AcpiDmDumpCsrt
614239340Sjkim *
615239340Sjkim * PARAMETERS:  Table               - A CSRT table
616239340Sjkim *
617239340Sjkim * RETURN:      None
618239340Sjkim *
619239340Sjkim * DESCRIPTION: Format the contents of a CSRT. This table type consists
620239340Sjkim *              of an open-ended number of subtables.
621239340Sjkim *
622239340Sjkim ******************************************************************************/
623239340Sjkim
624239340Sjkimvoid
625239340SjkimAcpiDmDumpCsrt (
626239340Sjkim    ACPI_TABLE_HEADER       *Table)
627239340Sjkim{
628239340Sjkim    ACPI_STATUS             Status;
629239340Sjkim    ACPI_CSRT_GROUP         *SubTable;
630245582Sjkim    ACPI_CSRT_SHARED_INFO   *SharedInfoTable;
631239340Sjkim    ACPI_CSRT_DESCRIPTOR    *SubSubTable;
632239340Sjkim    UINT32                  Length = Table->Length;
633239340Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_CSRT);
634239340Sjkim    UINT32                  SubOffset;
635239340Sjkim    UINT32                  SubSubOffset;
636239340Sjkim    UINT32                  InfoLength;
637239340Sjkim
638239340Sjkim
639239340Sjkim    /* The main table only contains the ACPI header, thus already handled */
640239340Sjkim
641272444Sjkim    /* Subtables (Resource Groups) */
642239340Sjkim
643239340Sjkim    SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
644239340Sjkim    while (Offset < Table->Length)
645239340Sjkim    {
646245582Sjkim        /* Resource group subtable */
647245582Sjkim
648239340Sjkim        AcpiOsPrintf ("\n");
649239340Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
650239340Sjkim                    SubTable->Length, AcpiDmTableInfoCsrt0);
651239340Sjkim        if (ACPI_FAILURE (Status))
652239340Sjkim        {
653239340Sjkim            return;
654239340Sjkim        }
655239340Sjkim
656245582Sjkim        /* Shared info subtable (One per resource group) */
657245582Sjkim
658239340Sjkim        SubOffset = sizeof (ACPI_CSRT_GROUP);
659245582Sjkim        SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,
660245582Sjkim            Offset + SubOffset);
661239340Sjkim
662245582Sjkim        AcpiOsPrintf ("\n");
663245582Sjkim        Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
664245582Sjkim                    sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
665245582Sjkim        if (ACPI_FAILURE (Status))
666245582Sjkim        {
667245582Sjkim            return;
668245582Sjkim        }
669239340Sjkim
670245582Sjkim        SubOffset += SubTable->SharedInfoLength;
671239340Sjkim
672245582Sjkim        /* Sub-Subtables (Resource Descriptors) */
673239340Sjkim
674239340Sjkim        SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
675239340Sjkim            Offset + SubOffset);
676239340Sjkim
677239340Sjkim        while ((SubOffset < SubTable->Length) &&
678239340Sjkim              ((Offset + SubOffset) < Table->Length))
679239340Sjkim        {
680239340Sjkim            AcpiOsPrintf ("\n");
681239340Sjkim            Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubTable,
682245582Sjkim                        SubSubTable->Length, AcpiDmTableInfoCsrt2);
683239340Sjkim            if (ACPI_FAILURE (Status))
684239340Sjkim            {
685239340Sjkim                return;
686239340Sjkim            }
687239340Sjkim
688239340Sjkim            SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
689239340Sjkim
690239340Sjkim            /* Resource-specific info buffer */
691239340Sjkim
692239340Sjkim            InfoLength = SubSubTable->Length - SubSubOffset;
693239340Sjkim
694239340Sjkim            AcpiDmDumpBuffer (SubSubTable, SubSubOffset, InfoLength,
695239340Sjkim                Offset + SubOffset + SubSubOffset, "ResourceInfo");
696239340Sjkim            SubSubOffset += InfoLength;
697239340Sjkim
698245582Sjkim            /* Point to next sub-subtable */
699239340Sjkim
700239340Sjkim            SubOffset += SubSubTable->Length;
701239340Sjkim            SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable,
702239340Sjkim                        SubSubTable->Length);
703239340Sjkim        }
704239340Sjkim
705272444Sjkim        /* Point to next subtable */
706239340Sjkim
707239340Sjkim        Offset += SubTable->Length;
708239340Sjkim        SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable,
709239340Sjkim                    SubTable->Length);
710239340Sjkim    }
711239340Sjkim}
712239340Sjkim
713239340Sjkim
714239340Sjkim/*******************************************************************************
715239340Sjkim *
716239340Sjkim * FUNCTION:    AcpiDmDumpDbg2
717239340Sjkim *
718239340Sjkim * PARAMETERS:  Table               - A DBG2 table
719239340Sjkim *
720239340Sjkim * RETURN:      None
721239340Sjkim *
722239340Sjkim * DESCRIPTION: Format the contents of a DBG2. This table type consists
723239340Sjkim *              of an open-ended number of subtables.
724239340Sjkim *
725239340Sjkim ******************************************************************************/
726239340Sjkim
727239340Sjkimvoid
728239340SjkimAcpiDmDumpDbg2 (
729239340Sjkim    ACPI_TABLE_HEADER       *Table)
730239340Sjkim{
731239340Sjkim    ACPI_STATUS             Status;
732239340Sjkim    ACPI_DBG2_DEVICE        *SubTable;
733239340Sjkim    UINT32                  Length = Table->Length;
734239340Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_DBG2);
735239340Sjkim    UINT32                  i;
736239340Sjkim    UINT32                  ArrayOffset;
737239340Sjkim    UINT32                  AbsoluteOffset;
738239340Sjkim    UINT8                   *Array;
739239340Sjkim
740239340Sjkim
741239340Sjkim    /* Main table */
742239340Sjkim
743239340Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
744239340Sjkim    if (ACPI_FAILURE (Status))
745239340Sjkim    {
746239340Sjkim        return;
747239340Sjkim    }
748239340Sjkim
749272444Sjkim    /* Subtables */
750239340Sjkim
751239340Sjkim    SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
752239340Sjkim    while (Offset < Table->Length)
753239340Sjkim    {
754239340Sjkim        AcpiOsPrintf ("\n");
755239340Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
756239340Sjkim                    SubTable->Length, AcpiDmTableInfoDbg2Device);
757239340Sjkim        if (ACPI_FAILURE (Status))
758239340Sjkim        {
759239340Sjkim            return;
760239340Sjkim        }
761239340Sjkim
762239340Sjkim        /* Dump the BaseAddress array */
763239340Sjkim
764239340Sjkim        for (i = 0; i < SubTable->RegisterCount; i++)
765239340Sjkim        {
766239340Sjkim            ArrayOffset = SubTable->BaseAddressOffset +
767239340Sjkim                (sizeof (ACPI_GENERIC_ADDRESS) * i);
768239340Sjkim            AbsoluteOffset = Offset + ArrayOffset;
769239340Sjkim            Array = (UINT8 *) SubTable + ArrayOffset;
770239340Sjkim
771239340Sjkim            Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
772239340Sjkim                        SubTable->Length, AcpiDmTableInfoDbg2Addr);
773239340Sjkim            if (ACPI_FAILURE (Status))
774239340Sjkim            {
775239340Sjkim                return;
776239340Sjkim            }
777239340Sjkim        }
778239340Sjkim
779239340Sjkim        /* Dump the AddressSize array */
780239340Sjkim
781239340Sjkim        for (i = 0; i < SubTable->RegisterCount; i++)
782239340Sjkim        {
783239340Sjkim            ArrayOffset = SubTable->AddressSizeOffset +
784239340Sjkim                (sizeof (UINT32) * i);
785239340Sjkim            AbsoluteOffset = Offset + ArrayOffset;
786239340Sjkim            Array = (UINT8 *) SubTable + ArrayOffset;
787239340Sjkim
788239340Sjkim            Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
789239340Sjkim                        SubTable->Length, AcpiDmTableInfoDbg2Size);
790239340Sjkim            if (ACPI_FAILURE (Status))
791239340Sjkim            {
792239340Sjkim                return;
793239340Sjkim            }
794239340Sjkim        }
795239340Sjkim
796239340Sjkim        /* Dump the Namestring (required) */
797239340Sjkim
798239340Sjkim        AcpiOsPrintf ("\n");
799239340Sjkim        ArrayOffset = SubTable->NamepathOffset;
800239340Sjkim        AbsoluteOffset = Offset + ArrayOffset;
801239340Sjkim        Array = (UINT8 *) SubTable + ArrayOffset;
802239340Sjkim
803239340Sjkim        Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
804239340Sjkim                    SubTable->Length, AcpiDmTableInfoDbg2Name);
805239340Sjkim        if (ACPI_FAILURE (Status))
806239340Sjkim        {
807239340Sjkim            return;
808239340Sjkim        }
809239340Sjkim
810239340Sjkim        /* Dump the OemData (optional) */
811239340Sjkim
812272444Sjkim        if (SubTable->OemDataOffset)
813272444Sjkim        {
814272444Sjkim            AcpiDmDumpBuffer (SubTable, SubTable->OemDataOffset, SubTable->OemDataLength,
815272444Sjkim                Offset + SubTable->OemDataOffset, "OEM Data");
816272444Sjkim        }
817239340Sjkim
818272444Sjkim        /* Point to next subtable */
819239340Sjkim
820239340Sjkim        Offset += SubTable->Length;
821239340Sjkim        SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable,
822239340Sjkim                    SubTable->Length);
823239340Sjkim    }
824239340Sjkim}
825239340Sjkim
826239340Sjkim
827239340Sjkim/*******************************************************************************
828239340Sjkim *
829167802Sjkim * FUNCTION:    AcpiDmDumpDmar
830167802Sjkim *
831167802Sjkim * PARAMETERS:  Table               - A DMAR table
832167802Sjkim *
833167802Sjkim * RETURN:      None
834167802Sjkim *
835167802Sjkim * DESCRIPTION: Format the contents of a DMAR. This table type consists
836167802Sjkim *              of an open-ended number of subtables.
837167802Sjkim *
838167802Sjkim ******************************************************************************/
839167802Sjkim
840239340Sjkim
841167802Sjkimvoid
842167802SjkimAcpiDmDumpDmar (
843167802Sjkim    ACPI_TABLE_HEADER       *Table)
844167802Sjkim{
845193529Sjkim    ACPI_STATUS             Status;
846167802Sjkim    ACPI_DMAR_HEADER        *SubTable;
847167802Sjkim    UINT32                  Length = Table->Length;
848167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_DMAR);
849167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
850167802Sjkim    ACPI_DMAR_DEVICE_SCOPE  *ScopeTable;
851167802Sjkim    UINT32                  ScopeOffset;
852167802Sjkim    UINT8                   *PciPath;
853167802Sjkim    UINT32                  PathOffset;
854167802Sjkim
855167802Sjkim
856167802Sjkim    /* Main table */
857167802Sjkim
858193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
859193529Sjkim    if (ACPI_FAILURE (Status))
860193529Sjkim    {
861193529Sjkim        return;
862193529Sjkim    }
863167802Sjkim
864272444Sjkim    /* Subtables */
865167802Sjkim
866167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
867167802Sjkim    while (Offset < Table->Length)
868167802Sjkim    {
869272444Sjkim        /* Common subtable header */
870167802Sjkim
871167802Sjkim        AcpiOsPrintf ("\n");
872193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
873193529Sjkim                    SubTable->Length, AcpiDmTableInfoDmarHdr);
874193529Sjkim        if (ACPI_FAILURE (Status))
875193529Sjkim        {
876193529Sjkim            return;
877193529Sjkim        }
878252279Sjkim        AcpiOsPrintf ("\n");
879167802Sjkim
880167802Sjkim        switch (SubTable->Type)
881167802Sjkim        {
882167802Sjkim        case ACPI_DMAR_TYPE_HARDWARE_UNIT:
883250838Sjkim
884167802Sjkim            InfoTable = AcpiDmTableInfoDmar0;
885167802Sjkim            ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
886167802Sjkim            break;
887250838Sjkim
888167802Sjkim        case ACPI_DMAR_TYPE_RESERVED_MEMORY:
889250838Sjkim
890167802Sjkim            InfoTable = AcpiDmTableInfoDmar1;
891167802Sjkim            ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
892167802Sjkim            break;
893250838Sjkim
894272444Sjkim        case ACPI_DMAR_TYPE_ROOT_ATS:
895250838Sjkim
896193529Sjkim            InfoTable = AcpiDmTableInfoDmar2;
897193529Sjkim            ScopeOffset = sizeof (ACPI_DMAR_ATSR);
898193529Sjkim            break;
899250838Sjkim
900272444Sjkim        case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
901250838Sjkim
902197104Sjkim            InfoTable = AcpiDmTableInfoDmar3;
903197104Sjkim            ScopeOffset = sizeof (ACPI_DMAR_RHSA);
904197104Sjkim            break;
905250838Sjkim
906272444Sjkim        case ACPI_DMAR_TYPE_NAMESPACE:
907272444Sjkim
908272444Sjkim            InfoTable = AcpiDmTableInfoDmar4;
909272444Sjkim            ScopeOffset = sizeof (ACPI_DMAR_ANDD);
910272444Sjkim            break;
911272444Sjkim
912167802Sjkim        default:
913250838Sjkim
914272444Sjkim            AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n", SubTable->Type);
915167802Sjkim            return;
916167802Sjkim        }
917167802Sjkim
918193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
919193529Sjkim                    SubTable->Length, InfoTable);
920193529Sjkim        if (ACPI_FAILURE (Status))
921193529Sjkim        {
922193529Sjkim            return;
923193529Sjkim        }
924167802Sjkim
925272444Sjkim        /*
926272444Sjkim         * Dump the optional device scope entries
927272444Sjkim         */
928272444Sjkim        if ((SubTable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
929272444Sjkim            (SubTable->Type == ACPI_DMAR_TYPE_NAMESPACE))
930272444Sjkim        {
931272444Sjkim            /* These types do not support device scopes */
932193529Sjkim
933272444Sjkim            goto NextSubtable;
934272444Sjkim        }
935272444Sjkim
936193529Sjkim        ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset);
937193529Sjkim        while (ScopeOffset < SubTable->Length)
938167802Sjkim        {
939193529Sjkim            AcpiOsPrintf ("\n");
940193529Sjkim            Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
941193529Sjkim                        ScopeTable->Length, AcpiDmTableInfoDmarScope);
942193529Sjkim            if (ACPI_FAILURE (Status))
943167802Sjkim            {
944193529Sjkim                return;
945193529Sjkim            }
946252279Sjkim            AcpiOsPrintf ("\n");
947167802Sjkim
948193529Sjkim            /* Dump the PCI Path entries for this device scope */
949167802Sjkim
950193529Sjkim            PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
951167802Sjkim
952193529Sjkim            PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
953193529Sjkim                sizeof (ACPI_DMAR_DEVICE_SCOPE));
954167802Sjkim
955193529Sjkim            while (PathOffset < ScopeTable->Length)
956193529Sjkim            {
957193529Sjkim                AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, "PCI Path");
958209746Sjkim                AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
959167802Sjkim
960193529Sjkim                /* Point to next PCI Path entry */
961167802Sjkim
962193529Sjkim                PathOffset += 2;
963193529Sjkim                PciPath += 2;
964252279Sjkim                AcpiOsPrintf ("\n");
965193529Sjkim            }
966167802Sjkim
967193529Sjkim            /* Point to next device scope entry */
968167802Sjkim
969193529Sjkim            ScopeOffset += ScopeTable->Length;
970193529Sjkim            ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
971193529Sjkim                ScopeTable, ScopeTable->Length);
972167802Sjkim        }
973167802Sjkim
974272444SjkimNextSubtable:
975272444Sjkim        /* Point to next subtable */
976167802Sjkim
977167802Sjkim        Offset += SubTable->Length;
978167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, SubTable->Length);
979167802Sjkim    }
980167802Sjkim}
981167802Sjkim
982167802Sjkim
983167802Sjkim/*******************************************************************************
984167802Sjkim *
985193529Sjkim * FUNCTION:    AcpiDmDumpEinj
986193529Sjkim *
987193529Sjkim * PARAMETERS:  Table               - A EINJ table
988193529Sjkim *
989193529Sjkim * RETURN:      None
990193529Sjkim *
991193529Sjkim * DESCRIPTION: Format the contents of a EINJ. This table type consists
992193529Sjkim *              of an open-ended number of subtables.
993193529Sjkim *
994193529Sjkim ******************************************************************************/
995193529Sjkim
996193529Sjkimvoid
997193529SjkimAcpiDmDumpEinj (
998193529Sjkim    ACPI_TABLE_HEADER       *Table)
999193529Sjkim{
1000193529Sjkim    ACPI_STATUS             Status;
1001193529Sjkim    ACPI_WHEA_HEADER        *SubTable;
1002193529Sjkim    UINT32                  Length = Table->Length;
1003193529Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_EINJ);
1004193529Sjkim
1005193529Sjkim
1006193529Sjkim    /* Main table */
1007193529Sjkim
1008193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
1009193529Sjkim    if (ACPI_FAILURE (Status))
1010193529Sjkim    {
1011193529Sjkim        return;
1012193529Sjkim    }
1013193529Sjkim
1014272444Sjkim    /* Subtables */
1015193529Sjkim
1016193529Sjkim    SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1017193529Sjkim    while (Offset < Table->Length)
1018193529Sjkim    {
1019193529Sjkim        AcpiOsPrintf ("\n");
1020193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1021193529Sjkim                    sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
1022193529Sjkim        if (ACPI_FAILURE (Status))
1023193529Sjkim        {
1024193529Sjkim            return;
1025193529Sjkim        }
1026193529Sjkim
1027272444Sjkim        /* Point to next subtable (each subtable is of fixed length) */
1028193529Sjkim
1029193529Sjkim        Offset += sizeof (ACPI_WHEA_HEADER);
1030193529Sjkim        SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
1031193529Sjkim                        sizeof (ACPI_WHEA_HEADER));
1032193529Sjkim    }
1033193529Sjkim}
1034193529Sjkim
1035193529Sjkim
1036193529Sjkim/*******************************************************************************
1037193529Sjkim *
1038193529Sjkim * FUNCTION:    AcpiDmDumpErst
1039193529Sjkim *
1040193529Sjkim * PARAMETERS:  Table               - A ERST table
1041193529Sjkim *
1042193529Sjkim * RETURN:      None
1043193529Sjkim *
1044193529Sjkim * DESCRIPTION: Format the contents of a ERST. This table type consists
1045193529Sjkim *              of an open-ended number of subtables.
1046193529Sjkim *
1047193529Sjkim ******************************************************************************/
1048193529Sjkim
1049193529Sjkimvoid
1050193529SjkimAcpiDmDumpErst (
1051193529Sjkim    ACPI_TABLE_HEADER       *Table)
1052193529Sjkim{
1053193529Sjkim    ACPI_STATUS             Status;
1054193529Sjkim    ACPI_WHEA_HEADER        *SubTable;
1055193529Sjkim    UINT32                  Length = Table->Length;
1056193529Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_ERST);
1057193529Sjkim
1058193529Sjkim
1059193529Sjkim    /* Main table */
1060193529Sjkim
1061193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
1062193529Sjkim    if (ACPI_FAILURE (Status))
1063193529Sjkim    {
1064193529Sjkim        return;
1065193529Sjkim    }
1066193529Sjkim
1067272444Sjkim    /* Subtables */
1068193529Sjkim
1069193529Sjkim    SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1070193529Sjkim    while (Offset < Table->Length)
1071193529Sjkim    {
1072193529Sjkim        AcpiOsPrintf ("\n");
1073193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1074209746Sjkim                    sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
1075193529Sjkim        if (ACPI_FAILURE (Status))
1076193529Sjkim        {
1077193529Sjkim            return;
1078193529Sjkim        }
1079193529Sjkim
1080272444Sjkim        /* Point to next subtable (each subtable is of fixed length) */
1081193529Sjkim
1082193529Sjkim        Offset += sizeof (ACPI_WHEA_HEADER);
1083193529Sjkim        SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
1084193529Sjkim                        sizeof (ACPI_WHEA_HEADER));
1085193529Sjkim    }
1086193529Sjkim}
1087193529Sjkim
1088193529Sjkim
1089193529Sjkim/*******************************************************************************
1090193529Sjkim *
1091228110Sjkim * FUNCTION:    AcpiDmDumpFpdt
1092228110Sjkim *
1093228110Sjkim * PARAMETERS:  Table               - A FPDT table
1094228110Sjkim *
1095228110Sjkim * RETURN:      None
1096228110Sjkim *
1097228110Sjkim * DESCRIPTION: Format the contents of a FPDT. This table type consists
1098228110Sjkim *              of an open-ended number of subtables.
1099228110Sjkim *
1100228110Sjkim ******************************************************************************/
1101228110Sjkim
1102228110Sjkimvoid
1103228110SjkimAcpiDmDumpFpdt (
1104228110Sjkim    ACPI_TABLE_HEADER       *Table)
1105228110Sjkim{
1106228110Sjkim    ACPI_STATUS             Status;
1107228110Sjkim    ACPI_FPDT_HEADER        *SubTable;
1108228110Sjkim    UINT32                  Length = Table->Length;
1109228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
1110228110Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1111228110Sjkim
1112228110Sjkim
1113228110Sjkim    /* There is no main table (other than the standard ACPI header) */
1114228110Sjkim
1115272444Sjkim    /* Subtables */
1116228110Sjkim
1117228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
1118228110Sjkim    while (Offset < Table->Length)
1119228110Sjkim    {
1120272444Sjkim        /* Common subtable header */
1121228110Sjkim
1122228110Sjkim        AcpiOsPrintf ("\n");
1123228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1124228110Sjkim                    SubTable->Length, AcpiDmTableInfoFpdtHdr);
1125228110Sjkim        if (ACPI_FAILURE (Status))
1126228110Sjkim        {
1127228110Sjkim            return;
1128228110Sjkim        }
1129228110Sjkim
1130228110Sjkim        switch (SubTable->Type)
1131228110Sjkim        {
1132228110Sjkim        case ACPI_FPDT_TYPE_BOOT:
1133250838Sjkim
1134228110Sjkim            InfoTable = AcpiDmTableInfoFpdt0;
1135228110Sjkim            break;
1136250838Sjkim
1137228110Sjkim        case ACPI_FPDT_TYPE_S3PERF:
1138250838Sjkim
1139228110Sjkim            InfoTable = AcpiDmTableInfoFpdt1;
1140228110Sjkim            break;
1141250838Sjkim
1142228110Sjkim        default:
1143250838Sjkim
1144272444Sjkim            AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n", SubTable->Type);
1145228110Sjkim
1146228110Sjkim            /* Attempt to continue */
1147228110Sjkim
1148228110Sjkim            if (!SubTable->Length)
1149228110Sjkim            {
1150228110Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
1151228110Sjkim                return;
1152228110Sjkim            }
1153228110Sjkim            goto NextSubTable;
1154228110Sjkim        }
1155228110Sjkim
1156228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1157228110Sjkim                    SubTable->Length, InfoTable);
1158228110Sjkim        if (ACPI_FAILURE (Status))
1159228110Sjkim        {
1160228110Sjkim            return;
1161228110Sjkim        }
1162228110Sjkim
1163228110SjkimNextSubTable:
1164272444Sjkim        /* Point to next subtable */
1165228110Sjkim
1166228110Sjkim        Offset += SubTable->Length;
1167228110Sjkim        SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length);
1168228110Sjkim    }
1169228110Sjkim}
1170228110Sjkim
1171228110Sjkim
1172228110Sjkim/*******************************************************************************
1173228110Sjkim *
1174272444Sjkim * FUNCTION:    AcpiDmDumpGtdt
1175272444Sjkim *
1176272444Sjkim * PARAMETERS:  Table               - A GTDT table
1177272444Sjkim *
1178272444Sjkim * RETURN:      None
1179272444Sjkim *
1180272444Sjkim * DESCRIPTION: Format the contents of a GTDT. This table type consists
1181272444Sjkim *              of an open-ended number of subtables.
1182272444Sjkim *
1183272444Sjkim ******************************************************************************/
1184272444Sjkim
1185272444Sjkimvoid
1186272444SjkimAcpiDmDumpGtdt (
1187272444Sjkim    ACPI_TABLE_HEADER       *Table)
1188272444Sjkim{
1189272444Sjkim    ACPI_STATUS             Status;
1190272444Sjkim    ACPI_GTDT_HEADER        *SubTable;
1191272444Sjkim    UINT32                  Length = Table->Length;
1192272444Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_GTDT);
1193272444Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1194272444Sjkim    UINT32                  SubTableLength;
1195272444Sjkim    UINT32                  GtCount;
1196272444Sjkim    ACPI_GTDT_TIMER_ENTRY   *GtxTable;
1197272444Sjkim
1198272444Sjkim
1199272444Sjkim    /* Main table */
1200272444Sjkim
1201272444Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
1202272444Sjkim    if (ACPI_FAILURE (Status))
1203272444Sjkim    {
1204272444Sjkim        return;
1205272444Sjkim    }
1206272444Sjkim
1207272444Sjkim    /* Subtables */
1208272444Sjkim
1209272444Sjkim    SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
1210272444Sjkim    while (Offset < Table->Length)
1211272444Sjkim    {
1212272444Sjkim        /* Common subtable header */
1213272444Sjkim
1214272444Sjkim        AcpiOsPrintf ("\n");
1215272444Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1216272444Sjkim                    SubTable->Length, AcpiDmTableInfoGtdtHdr);
1217272444Sjkim        if (ACPI_FAILURE (Status))
1218272444Sjkim        {
1219272444Sjkim            return;
1220272444Sjkim        }
1221272444Sjkim
1222272444Sjkim        GtCount = 0;
1223272444Sjkim        switch (SubTable->Type)
1224272444Sjkim        {
1225272444Sjkim        case ACPI_GTDT_TYPE_TIMER_BLOCK:
1226272444Sjkim
1227272444Sjkim            SubTableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
1228272444Sjkim            GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
1229272444Sjkim                        SubTable))->TimerCount;
1230272444Sjkim
1231272444Sjkim            InfoTable = AcpiDmTableInfoGtdt0;
1232272444Sjkim            break;
1233272444Sjkim
1234272444Sjkim        case ACPI_GTDT_TYPE_WATCHDOG:
1235272444Sjkim
1236272444Sjkim            SubTableLength = sizeof (ACPI_GTDT_WATCHDOG);
1237272444Sjkim
1238272444Sjkim            InfoTable = AcpiDmTableInfoGtdt1;
1239272444Sjkim            break;
1240272444Sjkim
1241272444Sjkim        default:
1242272444Sjkim
1243272444Sjkim            /* Cannot continue on unknown type - no length */
1244272444Sjkim
1245272444Sjkim            AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n", SubTable->Type);
1246272444Sjkim            return;
1247272444Sjkim        }
1248272444Sjkim
1249272444Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1250272444Sjkim                    SubTable->Length, InfoTable);
1251272444Sjkim        if (ACPI_FAILURE (Status))
1252272444Sjkim        {
1253272444Sjkim            return;
1254272444Sjkim        }
1255272444Sjkim
1256272444Sjkim        /* Point to end of current subtable (each subtable above is of fixed length) */
1257272444Sjkim
1258272444Sjkim        Offset += SubTableLength;
1259272444Sjkim
1260272444Sjkim        /* If there are any Gt Timer Blocks from above, dump them now */
1261272444Sjkim
1262272444Sjkim        if (GtCount)
1263272444Sjkim        {
1264272444Sjkim            GtxTable = ACPI_ADD_PTR (ACPI_GTDT_TIMER_ENTRY, SubTable, SubTableLength);
1265272444Sjkim            SubTableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
1266272444Sjkim
1267272444Sjkim            while (GtCount)
1268272444Sjkim            {
1269272444Sjkim                AcpiOsPrintf ("\n");
1270272444Sjkim                Status = AcpiDmDumpTable (Length, Offset, GtxTable,
1271272444Sjkim                            sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
1272272444Sjkim                if (ACPI_FAILURE (Status))
1273272444Sjkim                {
1274272444Sjkim                    return;
1275272444Sjkim                }
1276272444Sjkim                Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
1277272444Sjkim                GtxTable++;
1278272444Sjkim                GtCount--;
1279272444Sjkim            }
1280272444Sjkim        }
1281272444Sjkim
1282272444Sjkim        /* Point to next subtable */
1283272444Sjkim
1284272444Sjkim        SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, SubTable, SubTableLength);
1285272444Sjkim    }
1286272444Sjkim}
1287272444Sjkim
1288272444Sjkim
1289272444Sjkim/*******************************************************************************
1290272444Sjkim *
1291193529Sjkim * FUNCTION:    AcpiDmDumpHest
1292193529Sjkim *
1293193529Sjkim * PARAMETERS:  Table               - A HEST table
1294193529Sjkim *
1295193529Sjkim * RETURN:      None
1296193529Sjkim *
1297193529Sjkim * DESCRIPTION: Format the contents of a HEST. This table type consists
1298193529Sjkim *              of an open-ended number of subtables.
1299193529Sjkim *
1300193529Sjkim ******************************************************************************/
1301193529Sjkim
1302193529Sjkimvoid
1303193529SjkimAcpiDmDumpHest (
1304193529Sjkim    ACPI_TABLE_HEADER       *Table)
1305193529Sjkim{
1306193529Sjkim    ACPI_STATUS             Status;
1307193529Sjkim    ACPI_HEST_HEADER        *SubTable;
1308193529Sjkim    UINT32                  Length = Table->Length;
1309193529Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_HEST);
1310193529Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1311193529Sjkim    UINT32                  SubTableLength;
1312197104Sjkim    UINT32                  BankCount;
1313197104Sjkim    ACPI_HEST_IA_ERROR_BANK *BankTable;
1314193529Sjkim
1315193529Sjkim
1316193529Sjkim    /* Main table */
1317193529Sjkim
1318193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
1319193529Sjkim    if (ACPI_FAILURE (Status))
1320193529Sjkim    {
1321193529Sjkim        return;
1322193529Sjkim    }
1323193529Sjkim
1324272444Sjkim    /* Subtables */
1325193529Sjkim
1326193529Sjkim    SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
1327193529Sjkim    while (Offset < Table->Length)
1328193529Sjkim    {
1329197104Sjkim        BankCount = 0;
1330193529Sjkim        switch (SubTable->Type)
1331193529Sjkim        {
1332197104Sjkim        case ACPI_HEST_TYPE_IA32_CHECK:
1333250838Sjkim
1334193529Sjkim            InfoTable = AcpiDmTableInfoHest0;
1335197104Sjkim            SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
1336197104Sjkim            BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1337197104Sjkim                            SubTable))->NumHardwareBanks;
1338193529Sjkim            break;
1339193529Sjkim
1340197104Sjkim        case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1341250838Sjkim
1342193529Sjkim            InfoTable = AcpiDmTableInfoHest1;
1343197104Sjkim            SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED);
1344197104Sjkim            BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1345197104Sjkim                            SubTable))->NumHardwareBanks;
1346193529Sjkim            break;
1347193529Sjkim
1348197104Sjkim        case ACPI_HEST_TYPE_IA32_NMI:
1349250838Sjkim
1350197104Sjkim            InfoTable = AcpiDmTableInfoHest2;
1351197104Sjkim            SubTableLength = sizeof (ACPI_HEST_IA_NMI);
1352193529Sjkim            break;
1353193529Sjkim
1354193529Sjkim        case ACPI_HEST_TYPE_AER_ROOT_PORT:
1355250838Sjkim
1356193529Sjkim            InfoTable = AcpiDmTableInfoHest6;
1357193529Sjkim            SubTableLength = sizeof (ACPI_HEST_AER_ROOT);
1358193529Sjkim            break;
1359193529Sjkim
1360193529Sjkim        case ACPI_HEST_TYPE_AER_ENDPOINT:
1361250838Sjkim
1362193529Sjkim            InfoTable = AcpiDmTableInfoHest7;
1363193529Sjkim            SubTableLength = sizeof (ACPI_HEST_AER);
1364193529Sjkim            break;
1365193529Sjkim
1366193529Sjkim        case ACPI_HEST_TYPE_AER_BRIDGE:
1367250838Sjkim
1368193529Sjkim            InfoTable = AcpiDmTableInfoHest8;
1369193529Sjkim            SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE);
1370193529Sjkim            break;
1371193529Sjkim
1372197104Sjkim        case ACPI_HEST_TYPE_GENERIC_ERROR:
1373250838Sjkim
1374193529Sjkim            InfoTable = AcpiDmTableInfoHest9;
1375193529Sjkim            SubTableLength = sizeof (ACPI_HEST_GENERIC);
1376193529Sjkim            break;
1377193529Sjkim
1378193529Sjkim        default:
1379250838Sjkim
1380193529Sjkim            /* Cannot continue on unknown type - no length */
1381193529Sjkim
1382272444Sjkim            AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n", SubTable->Type);
1383193529Sjkim            return;
1384193529Sjkim        }
1385193529Sjkim
1386193529Sjkim        AcpiOsPrintf ("\n");
1387193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1388193529Sjkim                    SubTableLength, InfoTable);
1389193529Sjkim        if (ACPI_FAILURE (Status))
1390193529Sjkim        {
1391193529Sjkim            return;
1392193529Sjkim        }
1393193529Sjkim
1394197104Sjkim        /* Point to end of current subtable (each subtable above is of fixed length) */
1395193529Sjkim
1396193529Sjkim        Offset += SubTableLength;
1397197104Sjkim
1398197104Sjkim        /* If there are any (fixed-length) Error Banks from above, dump them now */
1399197104Sjkim
1400197104Sjkim        if (BankCount)
1401197104Sjkim        {
1402197104Sjkim            BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, SubTableLength);
1403197104Sjkim            SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
1404197104Sjkim
1405197104Sjkim            while (BankCount)
1406197104Sjkim            {
1407197104Sjkim                AcpiOsPrintf ("\n");
1408197104Sjkim                Status = AcpiDmDumpTable (Length, Offset, BankTable,
1409197104Sjkim                            sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
1410197104Sjkim                if (ACPI_FAILURE (Status))
1411197104Sjkim                {
1412197104Sjkim                    return;
1413197104Sjkim                }
1414197104Sjkim                Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
1415197104Sjkim                BankTable++;
1416197104Sjkim                BankCount--;
1417197104Sjkim            }
1418197104Sjkim        }
1419197104Sjkim
1420272444Sjkim        /* Point to next subtable */
1421197104Sjkim
1422193529Sjkim        SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength);
1423193529Sjkim    }
1424193529Sjkim}
1425193529Sjkim
1426193529Sjkim
1427193529Sjkim/*******************************************************************************
1428193529Sjkim *
1429197104Sjkim * FUNCTION:    AcpiDmDumpIvrs
1430197104Sjkim *
1431197104Sjkim * PARAMETERS:  Table               - A IVRS table
1432197104Sjkim *
1433197104Sjkim * RETURN:      None
1434197104Sjkim *
1435197104Sjkim * DESCRIPTION: Format the contents of a IVRS
1436197104Sjkim *
1437197104Sjkim ******************************************************************************/
1438197104Sjkim
1439197104Sjkimstatic UINT8 EntrySizes[] = {4,8,16,32};
1440197104Sjkim
1441197104Sjkimvoid
1442197104SjkimAcpiDmDumpIvrs (
1443197104Sjkim    ACPI_TABLE_HEADER       *Table)
1444197104Sjkim{
1445197104Sjkim    ACPI_STATUS             Status;
1446197104Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_IVRS);
1447197104Sjkim    UINT32                  EntryOffset;
1448197104Sjkim    UINT32                  EntryLength;
1449197104Sjkim    UINT32                  EntryType;
1450197104Sjkim    ACPI_IVRS_DE_HEADER     *DeviceEntry;
1451197104Sjkim    ACPI_IVRS_HEADER        *SubTable;
1452197104Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1453197104Sjkim
1454197104Sjkim
1455197104Sjkim    /* Main table */
1456197104Sjkim
1457197104Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
1458197104Sjkim    if (ACPI_FAILURE (Status))
1459197104Sjkim    {
1460197104Sjkim        return;
1461197104Sjkim    }
1462197104Sjkim
1463272444Sjkim    /* Subtables */
1464197104Sjkim
1465197104Sjkim    SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
1466197104Sjkim    while (Offset < Table->Length)
1467197104Sjkim    {
1468272444Sjkim        /* Common subtable header */
1469197104Sjkim
1470197104Sjkim        AcpiOsPrintf ("\n");
1471197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1472197104Sjkim                    SubTable->Length, AcpiDmTableInfoIvrsHdr);
1473197104Sjkim        if (ACPI_FAILURE (Status))
1474197104Sjkim        {
1475197104Sjkim            return;
1476197104Sjkim        }
1477197104Sjkim
1478197104Sjkim        switch (SubTable->Type)
1479197104Sjkim        {
1480197104Sjkim        case ACPI_IVRS_TYPE_HARDWARE:
1481250838Sjkim
1482197104Sjkim            InfoTable = AcpiDmTableInfoIvrs0;
1483197104Sjkim            break;
1484250838Sjkim
1485197104Sjkim        case ACPI_IVRS_TYPE_MEMORY1:
1486197104Sjkim        case ACPI_IVRS_TYPE_MEMORY2:
1487197104Sjkim        case ACPI_IVRS_TYPE_MEMORY3:
1488250838Sjkim
1489197104Sjkim            InfoTable = AcpiDmTableInfoIvrs1;
1490197104Sjkim            break;
1491250838Sjkim
1492197104Sjkim        default:
1493250838Sjkim
1494272444Sjkim            AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n",
1495197104Sjkim                SubTable->Type);
1496197104Sjkim
1497197104Sjkim            /* Attempt to continue */
1498197104Sjkim
1499197104Sjkim            if (!SubTable->Length)
1500197104Sjkim            {
1501197104Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
1502197104Sjkim                return;
1503197104Sjkim            }
1504197104Sjkim            goto NextSubTable;
1505197104Sjkim        }
1506197104Sjkim
1507197104Sjkim        /* Dump the subtable */
1508197104Sjkim
1509197104Sjkim        AcpiOsPrintf ("\n");
1510197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1511197104Sjkim                    SubTable->Length, InfoTable);
1512197104Sjkim        if (ACPI_FAILURE (Status))
1513197104Sjkim        {
1514197104Sjkim            return;
1515197104Sjkim        }
1516197104Sjkim
1517197104Sjkim        /* The hardware subtable can contain multiple device entries */
1518197104Sjkim
1519197104Sjkim        if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE)
1520197104Sjkim        {
1521197104Sjkim            EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE);
1522197104Sjkim            DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable,
1523197104Sjkim                            sizeof (ACPI_IVRS_HARDWARE));
1524197104Sjkim
1525197104Sjkim            while (EntryOffset < (Offset + SubTable->Length))
1526197104Sjkim            {
1527197104Sjkim                AcpiOsPrintf ("\n");
1528197104Sjkim                /*
1529197104Sjkim                 * Upper 2 bits of Type encode the length of the device entry
1530197104Sjkim                 *
1531197104Sjkim                 * 00 = 4 byte
1532197104Sjkim                 * 01 = 8 byte
1533197104Sjkim                 * 10 = 16 byte - currently no entries defined
1534197104Sjkim                 * 11 = 32 byte - currently no entries defined
1535197104Sjkim                 */
1536197104Sjkim                EntryType = DeviceEntry->Type;
1537197104Sjkim                EntryLength = EntrySizes [EntryType >> 6];
1538197104Sjkim
1539197104Sjkim                switch (EntryType)
1540197104Sjkim                {
1541197104Sjkim                /* 4-byte device entries */
1542197104Sjkim
1543197104Sjkim                case ACPI_IVRS_TYPE_PAD4:
1544197104Sjkim                case ACPI_IVRS_TYPE_ALL:
1545197104Sjkim                case ACPI_IVRS_TYPE_SELECT:
1546197104Sjkim                case ACPI_IVRS_TYPE_START:
1547197104Sjkim                case ACPI_IVRS_TYPE_END:
1548197104Sjkim
1549197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs4;
1550197104Sjkim                    break;
1551197104Sjkim
1552197104Sjkim                /* 8-byte entries, type A */
1553197104Sjkim
1554197104Sjkim                case ACPI_IVRS_TYPE_ALIAS_SELECT:
1555197104Sjkim                case ACPI_IVRS_TYPE_ALIAS_START:
1556197104Sjkim
1557197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs8a;
1558197104Sjkim                    break;
1559197104Sjkim
1560197104Sjkim                /* 8-byte entries, type B */
1561197104Sjkim
1562197104Sjkim                case ACPI_IVRS_TYPE_PAD8:
1563197104Sjkim                case ACPI_IVRS_TYPE_EXT_SELECT:
1564197104Sjkim                case ACPI_IVRS_TYPE_EXT_START:
1565197104Sjkim
1566197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs8b;
1567197104Sjkim                    break;
1568197104Sjkim
1569197104Sjkim                /* 8-byte entries, type C */
1570197104Sjkim
1571197104Sjkim                case ACPI_IVRS_TYPE_SPECIAL:
1572197104Sjkim
1573197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs8c;
1574197104Sjkim                    break;
1575197104Sjkim
1576197104Sjkim                default:
1577197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs4;
1578197104Sjkim                    AcpiOsPrintf (
1579197104Sjkim                        "\n**** Unknown IVRS device entry type/length: "
1580204773Sjkim                        "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
1581197104Sjkim                        EntryType, EntryLength, EntryOffset);
1582197104Sjkim                    break;
1583197104Sjkim                }
1584197104Sjkim
1585197104Sjkim                /* Dump the Device Entry */
1586197104Sjkim
1587197104Sjkim                Status = AcpiDmDumpTable (Table->Length, EntryOffset,
1588197104Sjkim                            DeviceEntry, EntryLength, InfoTable);
1589197104Sjkim
1590197104Sjkim                EntryOffset += EntryLength;
1591197104Sjkim                DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
1592197104Sjkim                                EntryLength);
1593197104Sjkim            }
1594197104Sjkim        }
1595197104Sjkim
1596197104SjkimNextSubTable:
1597272444Sjkim        /* Point to next subtable */
1598197104Sjkim
1599197104Sjkim        Offset += SubTable->Length;
1600197104Sjkim        SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length);
1601197104Sjkim    }
1602197104Sjkim}
1603197104Sjkim
1604197104Sjkim
1605197104Sjkim/*******************************************************************************
1606197104Sjkim *
1607272444Sjkim * FUNCTION:    AcpiDmDumpLpit
1608272444Sjkim *
1609272444Sjkim * PARAMETERS:  Table               - A LPIT table
1610272444Sjkim *
1611272444Sjkim * RETURN:      None
1612272444Sjkim *
1613272444Sjkim * DESCRIPTION: Format the contents of a LPIT. This table type consists
1614272444Sjkim *              of an open-ended number of subtables. Note: There are no
1615272444Sjkim *              entries in the main table. An LPIT consists of the table
1616272444Sjkim *              header and then subtables only.
1617272444Sjkim *
1618272444Sjkim ******************************************************************************/
1619272444Sjkim
1620272444Sjkimvoid
1621272444SjkimAcpiDmDumpLpit (
1622272444Sjkim    ACPI_TABLE_HEADER       *Table)
1623272444Sjkim{
1624272444Sjkim    ACPI_STATUS             Status;
1625272444Sjkim    ACPI_LPIT_HEADER        *SubTable;
1626272444Sjkim    UINT32                  Length = Table->Length;
1627272444Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_LPIT);
1628272444Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1629272444Sjkim    UINT32                  SubTableLength;
1630272444Sjkim
1631272444Sjkim
1632272444Sjkim    /* Subtables */
1633272444Sjkim
1634272444Sjkim    SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
1635272444Sjkim    while (Offset < Table->Length)
1636272444Sjkim    {
1637272444Sjkim        /* Common subtable header */
1638272444Sjkim
1639272444Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1640272444Sjkim                    sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);
1641272444Sjkim        if (ACPI_FAILURE (Status))
1642272444Sjkim        {
1643272444Sjkim            return;
1644272444Sjkim        }
1645272444Sjkim
1646272444Sjkim        switch (SubTable->Type)
1647272444Sjkim        {
1648272444Sjkim        case ACPI_LPIT_TYPE_NATIVE_CSTATE:
1649272444Sjkim
1650272444Sjkim            InfoTable = AcpiDmTableInfoLpit0;
1651272444Sjkim            SubTableLength = sizeof (ACPI_LPIT_NATIVE);
1652272444Sjkim            break;
1653272444Sjkim
1654272444Sjkim        case ACPI_LPIT_TYPE_SIMPLE_IO:
1655272444Sjkim
1656272444Sjkim            InfoTable = AcpiDmTableInfoLpit1;
1657272444Sjkim            SubTableLength = sizeof (ACPI_LPIT_IO);
1658272444Sjkim            break;
1659272444Sjkim
1660272444Sjkim        default:
1661272444Sjkim
1662272444Sjkim            /* Cannot continue on unknown type - no length */
1663272444Sjkim
1664272444Sjkim            AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n", SubTable->Type);
1665272444Sjkim            return;
1666272444Sjkim        }
1667272444Sjkim
1668272444Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1669272444Sjkim                    SubTableLength, InfoTable);
1670272444Sjkim        if (ACPI_FAILURE (Status))
1671272444Sjkim        {
1672272444Sjkim            return;
1673272444Sjkim        }
1674272444Sjkim        AcpiOsPrintf ("\n");
1675272444Sjkim
1676272444Sjkim        /* Point to next subtable */
1677272444Sjkim
1678272444Sjkim        Offset += SubTableLength;
1679272444Sjkim        SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, SubTable, SubTableLength);
1680272444Sjkim    }
1681272444Sjkim}
1682272444Sjkim
1683272444Sjkim
1684272444Sjkim/*******************************************************************************
1685272444Sjkim *
1686167802Sjkim * FUNCTION:    AcpiDmDumpMadt
1687167802Sjkim *
1688167802Sjkim * PARAMETERS:  Table               - A MADT table
1689167802Sjkim *
1690167802Sjkim * RETURN:      None
1691167802Sjkim *
1692167802Sjkim * DESCRIPTION: Format the contents of a MADT. This table type consists
1693167802Sjkim *              of an open-ended number of subtables.
1694167802Sjkim *
1695167802Sjkim ******************************************************************************/
1696167802Sjkim
1697167802Sjkimvoid
1698167802SjkimAcpiDmDumpMadt (
1699167802Sjkim    ACPI_TABLE_HEADER       *Table)
1700167802Sjkim{
1701193529Sjkim    ACPI_STATUS             Status;
1702167802Sjkim    ACPI_SUBTABLE_HEADER    *SubTable;
1703167802Sjkim    UINT32                  Length = Table->Length;
1704167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MADT);
1705167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1706167802Sjkim
1707167802Sjkim
1708167802Sjkim    /* Main table */
1709167802Sjkim
1710193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
1711193529Sjkim    if (ACPI_FAILURE (Status))
1712193529Sjkim    {
1713193529Sjkim        return;
1714193529Sjkim    }
1715167802Sjkim
1716272444Sjkim    /* Subtables */
1717167802Sjkim
1718167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
1719167802Sjkim    while (Offset < Table->Length)
1720167802Sjkim    {
1721272444Sjkim        /* Common subtable header */
1722167802Sjkim
1723167802Sjkim        AcpiOsPrintf ("\n");
1724193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1725193529Sjkim                    SubTable->Length, AcpiDmTableInfoMadtHdr);
1726193529Sjkim        if (ACPI_FAILURE (Status))
1727193529Sjkim        {
1728193529Sjkim            return;
1729193529Sjkim        }
1730167802Sjkim
1731167802Sjkim        switch (SubTable->Type)
1732167802Sjkim        {
1733167802Sjkim        case ACPI_MADT_TYPE_LOCAL_APIC:
1734250838Sjkim
1735167802Sjkim            InfoTable = AcpiDmTableInfoMadt0;
1736167802Sjkim            break;
1737250838Sjkim
1738167802Sjkim        case ACPI_MADT_TYPE_IO_APIC:
1739250838Sjkim
1740167802Sjkim            InfoTable = AcpiDmTableInfoMadt1;
1741167802Sjkim            break;
1742250838Sjkim
1743167802Sjkim        case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
1744250838Sjkim
1745167802Sjkim            InfoTable = AcpiDmTableInfoMadt2;
1746167802Sjkim            break;
1747250838Sjkim
1748167802Sjkim        case ACPI_MADT_TYPE_NMI_SOURCE:
1749250838Sjkim
1750167802Sjkim            InfoTable = AcpiDmTableInfoMadt3;
1751167802Sjkim            break;
1752250838Sjkim
1753167802Sjkim        case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
1754250838Sjkim
1755167802Sjkim            InfoTable = AcpiDmTableInfoMadt4;
1756167802Sjkim            break;
1757250838Sjkim
1758167802Sjkim        case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
1759250838Sjkim
1760167802Sjkim            InfoTable = AcpiDmTableInfoMadt5;
1761167802Sjkim            break;
1762250838Sjkim
1763167802Sjkim        case ACPI_MADT_TYPE_IO_SAPIC:
1764250838Sjkim
1765167802Sjkim            InfoTable = AcpiDmTableInfoMadt6;
1766167802Sjkim            break;
1767250838Sjkim
1768167802Sjkim        case ACPI_MADT_TYPE_LOCAL_SAPIC:
1769250838Sjkim
1770167802Sjkim            InfoTable = AcpiDmTableInfoMadt7;
1771167802Sjkim            break;
1772250838Sjkim
1773167802Sjkim        case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
1774250838Sjkim
1775167802Sjkim            InfoTable = AcpiDmTableInfoMadt8;
1776167802Sjkim            break;
1777250838Sjkim
1778193529Sjkim        case ACPI_MADT_TYPE_LOCAL_X2APIC:
1779250838Sjkim
1780193529Sjkim            InfoTable = AcpiDmTableInfoMadt9;
1781193529Sjkim            break;
1782250838Sjkim
1783193529Sjkim        case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
1784250838Sjkim
1785193529Sjkim            InfoTable = AcpiDmTableInfoMadt10;
1786193529Sjkim            break;
1787250838Sjkim
1788228110Sjkim        case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
1789250838Sjkim
1790228110Sjkim            InfoTable = AcpiDmTableInfoMadt11;
1791228110Sjkim            break;
1792250838Sjkim
1793228110Sjkim        case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
1794250838Sjkim
1795228110Sjkim            InfoTable = AcpiDmTableInfoMadt12;
1796228110Sjkim            break;
1797250838Sjkim
1798272444Sjkim        case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
1799272444Sjkim
1800272444Sjkim            InfoTable = AcpiDmTableInfoMadt13;
1801272444Sjkim            break;
1802272444Sjkim
1803272444Sjkim        case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
1804272444Sjkim
1805272444Sjkim            InfoTable = AcpiDmTableInfoMadt14;
1806272444Sjkim            break;
1807272444Sjkim
1808167802Sjkim        default:
1809250838Sjkim
1810272444Sjkim            AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n", SubTable->Type);
1811193529Sjkim
1812193529Sjkim            /* Attempt to continue */
1813193529Sjkim
1814193529Sjkim            if (!SubTable->Length)
1815193529Sjkim            {
1816193529Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
1817193529Sjkim                return;
1818193529Sjkim            }
1819193529Sjkim            goto NextSubTable;
1820193529Sjkim        }
1821193529Sjkim
1822193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1823193529Sjkim                    SubTable->Length, InfoTable);
1824193529Sjkim        if (ACPI_FAILURE (Status))
1825193529Sjkim        {
1826167802Sjkim            return;
1827167802Sjkim        }
1828167802Sjkim
1829193529SjkimNextSubTable:
1830272444Sjkim        /* Point to next subtable */
1831167802Sjkim
1832167802Sjkim        Offset += SubTable->Length;
1833167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
1834167802Sjkim    }
1835167802Sjkim}
1836167802Sjkim
1837167802Sjkim
1838167802Sjkim/*******************************************************************************
1839167802Sjkim *
1840167802Sjkim * FUNCTION:    AcpiDmDumpMcfg
1841167802Sjkim *
1842167802Sjkim * PARAMETERS:  Table               - A MCFG Table
1843167802Sjkim *
1844167802Sjkim * RETURN:      None
1845167802Sjkim *
1846167802Sjkim * DESCRIPTION: Format the contents of a MCFG table
1847167802Sjkim *
1848167802Sjkim ******************************************************************************/
1849167802Sjkim
1850167802Sjkimvoid
1851167802SjkimAcpiDmDumpMcfg (
1852167802Sjkim    ACPI_TABLE_HEADER       *Table)
1853167802Sjkim{
1854193529Sjkim    ACPI_STATUS             Status;
1855167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MCFG);
1856167802Sjkim    ACPI_MCFG_ALLOCATION    *SubTable;
1857167802Sjkim
1858167802Sjkim
1859167802Sjkim    /* Main table */
1860167802Sjkim
1861193529Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
1862193529Sjkim    if (ACPI_FAILURE (Status))
1863193529Sjkim    {
1864193529Sjkim        return;
1865193529Sjkim    }
1866167802Sjkim
1867272444Sjkim    /* Subtables */
1868167802Sjkim
1869167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
1870167802Sjkim    while (Offset < Table->Length)
1871167802Sjkim    {
1872167802Sjkim        if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
1873167802Sjkim        {
1874209746Sjkim            AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
1875167802Sjkim                sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
1876167802Sjkim            return;
1877167802Sjkim        }
1878167802Sjkim
1879167802Sjkim        AcpiOsPrintf ("\n");
1880193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1881193529Sjkim                    sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
1882193529Sjkim        if (ACPI_FAILURE (Status))
1883193529Sjkim        {
1884193529Sjkim            return;
1885193529Sjkim        }
1886167802Sjkim
1887272444Sjkim        /* Point to next subtable (each subtable is of fixed length) */
1888167802Sjkim
1889167802Sjkim        Offset += sizeof (ACPI_MCFG_ALLOCATION);
1890167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable,
1891167802Sjkim                        sizeof (ACPI_MCFG_ALLOCATION));
1892167802Sjkim    }
1893167802Sjkim}
1894167802Sjkim
1895167802Sjkim
1896167802Sjkim/*******************************************************************************
1897167802Sjkim *
1898228110Sjkim * FUNCTION:    AcpiDmDumpMpst
1899228110Sjkim *
1900228110Sjkim * PARAMETERS:  Table               - A MPST Table
1901228110Sjkim *
1902228110Sjkim * RETURN:      None
1903228110Sjkim *
1904228110Sjkim * DESCRIPTION: Format the contents of a MPST table
1905228110Sjkim *
1906228110Sjkim ******************************************************************************/
1907228110Sjkim
1908228110Sjkimvoid
1909228110SjkimAcpiDmDumpMpst (
1910228110Sjkim    ACPI_TABLE_HEADER       *Table)
1911228110Sjkim{
1912228110Sjkim    ACPI_STATUS             Status;
1913228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MPST);
1914228110Sjkim    ACPI_MPST_POWER_NODE    *SubTable0;
1915228110Sjkim    ACPI_MPST_POWER_STATE   *SubTable0A;
1916228110Sjkim    ACPI_MPST_COMPONENT     *SubTable0B;
1917228110Sjkim    ACPI_MPST_DATA_HDR      *SubTable1;
1918228110Sjkim    ACPI_MPST_POWER_DATA    *SubTable2;
1919228110Sjkim    UINT16                  SubtableCount;
1920241973Sjkim    UINT32                  PowerStateCount;
1921241973Sjkim    UINT32                  ComponentCount;
1922228110Sjkim
1923228110Sjkim
1924228110Sjkim    /* Main table */
1925228110Sjkim
1926228110Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
1927228110Sjkim    if (ACPI_FAILURE (Status))
1928228110Sjkim    {
1929228110Sjkim        return;
1930228110Sjkim    }
1931228110Sjkim
1932228110Sjkim    /* Subtable: Memory Power Node(s) */
1933228110Sjkim
1934228110Sjkim    SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
1935228110Sjkim    SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
1936228110Sjkim
1937228110Sjkim    while ((Offset < Table->Length) && SubtableCount)
1938228110Sjkim    {
1939228110Sjkim        AcpiOsPrintf ("\n");
1940228110Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0,
1941228110Sjkim                    sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
1942228110Sjkim        if (ACPI_FAILURE (Status))
1943228110Sjkim        {
1944228110Sjkim            return;
1945228110Sjkim        }
1946228110Sjkim
1947228110Sjkim        /* Extract the sub-subtable counts */
1948228110Sjkim
1949228110Sjkim        PowerStateCount = SubTable0->NumPowerStates;
1950228110Sjkim        ComponentCount = SubTable0->NumPhysicalComponents;
1951228110Sjkim        Offset += sizeof (ACPI_MPST_POWER_NODE);
1952228110Sjkim
1953228110Sjkim        /* Sub-subtables - Memory Power State Structure(s) */
1954228110Sjkim
1955228110Sjkim        SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0,
1956228110Sjkim            sizeof (ACPI_MPST_POWER_NODE));
1957228110Sjkim
1958228110Sjkim        while (PowerStateCount)
1959228110Sjkim        {
1960228110Sjkim            AcpiOsPrintf ("\n");
1961228110Sjkim            Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A,
1962228110Sjkim                        sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
1963228110Sjkim            if (ACPI_FAILURE (Status))
1964228110Sjkim            {
1965228110Sjkim                return;
1966228110Sjkim            }
1967228110Sjkim
1968228110Sjkim            SubTable0A++;
1969228110Sjkim            PowerStateCount--;
1970228110Sjkim            Offset += sizeof (ACPI_MPST_POWER_STATE);
1971228110Sjkim       }
1972228110Sjkim
1973228110Sjkim        /* Sub-subtables - Physical Component ID Structure(s) */
1974228110Sjkim
1975228110Sjkim        SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A);
1976228110Sjkim
1977228110Sjkim        if (ComponentCount)
1978228110Sjkim        {
1979228110Sjkim            AcpiOsPrintf ("\n");
1980228110Sjkim        }
1981228110Sjkim
1982228110Sjkim        while (ComponentCount)
1983228110Sjkim        {
1984228110Sjkim            Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B,
1985228110Sjkim                        sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
1986228110Sjkim            if (ACPI_FAILURE (Status))
1987228110Sjkim            {
1988228110Sjkim                return;
1989228110Sjkim            }
1990228110Sjkim
1991228110Sjkim            SubTable0B++;
1992228110Sjkim            ComponentCount--;
1993228110Sjkim            Offset += sizeof (ACPI_MPST_COMPONENT);
1994228110Sjkim        }
1995228110Sjkim
1996228110Sjkim        /* Point to next Memory Power Node subtable */
1997228110Sjkim
1998228110Sjkim        SubtableCount--;
1999228110Sjkim        SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0,
2000228110Sjkim            sizeof (ACPI_MPST_POWER_NODE) +
2001228110Sjkim            (sizeof (ACPI_MPST_POWER_STATE) * SubTable0->NumPowerStates) +
2002228110Sjkim            (sizeof (ACPI_MPST_COMPONENT) * SubTable0->NumPhysicalComponents));
2003228110Sjkim    }
2004228110Sjkim
2005228110Sjkim    /* Subtable: Count of Memory Power State Characteristic structures */
2006228110Sjkim
2007228110Sjkim    AcpiOsPrintf ("\n");
2008228110Sjkim    SubTable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, SubTable0);
2009228110Sjkim    Status = AcpiDmDumpTable (Table->Length, Offset, SubTable1,
2010228110Sjkim                sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
2011228110Sjkim    if (ACPI_FAILURE (Status))
2012228110Sjkim    {
2013228110Sjkim        return;
2014228110Sjkim    }
2015228110Sjkim
2016228110Sjkim    SubtableCount = SubTable1->CharacteristicsCount;
2017228110Sjkim    Offset += sizeof (ACPI_MPST_DATA_HDR);
2018228110Sjkim
2019228110Sjkim    /* Subtable: Memory Power State Characteristics structure(s) */
2020228110Sjkim
2021228110Sjkim    SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1, sizeof (ACPI_MPST_DATA_HDR));
2022228110Sjkim
2023228110Sjkim    while ((Offset < Table->Length) && SubtableCount)
2024228110Sjkim    {
2025228110Sjkim        AcpiOsPrintf ("\n");
2026228110Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2,
2027228110Sjkim                    sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
2028228110Sjkim        if (ACPI_FAILURE (Status))
2029228110Sjkim        {
2030228110Sjkim            return;
2031228110Sjkim        }
2032228110Sjkim
2033228110Sjkim        SubTable2++;
2034228110Sjkim        SubtableCount--;
2035228110Sjkim        Offset += sizeof (ACPI_MPST_POWER_DATA);
2036228110Sjkim    }
2037228110Sjkim}
2038228110Sjkim
2039228110Sjkim
2040228110Sjkim/*******************************************************************************
2041228110Sjkim *
2042197104Sjkim * FUNCTION:    AcpiDmDumpMsct
2043197104Sjkim *
2044197104Sjkim * PARAMETERS:  Table               - A MSCT table
2045197104Sjkim *
2046197104Sjkim * RETURN:      None
2047197104Sjkim *
2048197104Sjkim * DESCRIPTION: Format the contents of a MSCT
2049197104Sjkim *
2050197104Sjkim ******************************************************************************/
2051197104Sjkim
2052197104Sjkimvoid
2053197104SjkimAcpiDmDumpMsct (
2054197104Sjkim    ACPI_TABLE_HEADER       *Table)
2055197104Sjkim{
2056197104Sjkim    ACPI_STATUS             Status;
2057197104Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MSCT);
2058197104Sjkim    ACPI_MSCT_PROXIMITY     *SubTable;
2059197104Sjkim
2060197104Sjkim
2061197104Sjkim    /* Main table */
2062197104Sjkim
2063197104Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
2064197104Sjkim    if (ACPI_FAILURE (Status))
2065197104Sjkim    {
2066197104Sjkim        return;
2067197104Sjkim    }
2068197104Sjkim
2069272444Sjkim    /* Subtables */
2070197104Sjkim
2071197104Sjkim    SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
2072197104Sjkim    while (Offset < Table->Length)
2073197104Sjkim    {
2074272444Sjkim        /* Common subtable header */
2075197104Sjkim
2076197104Sjkim        AcpiOsPrintf ("\n");
2077197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2078197104Sjkim                    sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
2079197104Sjkim        if (ACPI_FAILURE (Status))
2080197104Sjkim        {
2081197104Sjkim            return;
2082197104Sjkim        }
2083197104Sjkim
2084272444Sjkim        /* Point to next subtable */
2085197104Sjkim
2086197104Sjkim        Offset += sizeof (ACPI_MSCT_PROXIMITY);
2087197104Sjkim        SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable, sizeof (ACPI_MSCT_PROXIMITY));
2088197104Sjkim    }
2089197104Sjkim}
2090197104Sjkim
2091197104Sjkim
2092197104Sjkim/*******************************************************************************
2093197104Sjkim *
2094246849Sjkim * FUNCTION:    AcpiDmDumpMtmr
2095246849Sjkim *
2096246849Sjkim * PARAMETERS:  Table               - A MTMR table
2097246849Sjkim *
2098246849Sjkim * RETURN:      None
2099246849Sjkim *
2100246849Sjkim * DESCRIPTION: Format the contents of a MTMR
2101246849Sjkim *
2102246849Sjkim ******************************************************************************/
2103246849Sjkim
2104246849Sjkimvoid
2105246849SjkimAcpiDmDumpMtmr (
2106246849Sjkim    ACPI_TABLE_HEADER       *Table)
2107246849Sjkim{
2108246849Sjkim    ACPI_STATUS             Status;
2109246849Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MTMR);
2110246849Sjkim    ACPI_MTMR_ENTRY         *SubTable;
2111246849Sjkim
2112246849Sjkim
2113246849Sjkim    /* Main table */
2114246849Sjkim
2115246849Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMtmr);
2116246849Sjkim    if (ACPI_FAILURE (Status))
2117246849Sjkim    {
2118246849Sjkim        return;
2119246849Sjkim    }
2120246849Sjkim
2121272444Sjkim    /* Subtables */
2122246849Sjkim
2123246849Sjkim    SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset);
2124246849Sjkim    while (Offset < Table->Length)
2125246849Sjkim    {
2126272444Sjkim        /* Common subtable header */
2127246849Sjkim
2128246849Sjkim        AcpiOsPrintf ("\n");
2129246849Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2130246849Sjkim                    sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0);
2131246849Sjkim        if (ACPI_FAILURE (Status))
2132246849Sjkim        {
2133246849Sjkim            return;
2134246849Sjkim        }
2135246849Sjkim
2136272444Sjkim        /* Point to next subtable */
2137246849Sjkim
2138246849Sjkim        Offset += sizeof (ACPI_MTMR_ENTRY);
2139246849Sjkim        SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, SubTable, sizeof (ACPI_MTMR_ENTRY));
2140246849Sjkim    }
2141246849Sjkim}
2142246849Sjkim
2143246849Sjkim
2144246849Sjkim/*******************************************************************************
2145246849Sjkim *
2146228110Sjkim * FUNCTION:    AcpiDmDumpPcct
2147228110Sjkim *
2148228110Sjkim * PARAMETERS:  Table               - A PCCT table
2149228110Sjkim *
2150228110Sjkim * RETURN:      None
2151228110Sjkim *
2152228110Sjkim * DESCRIPTION: Format the contents of a PCCT. This table type consists
2153228110Sjkim *              of an open-ended number of subtables.
2154228110Sjkim *
2155228110Sjkim ******************************************************************************/
2156228110Sjkim
2157228110Sjkimvoid
2158228110SjkimAcpiDmDumpPcct (
2159228110Sjkim    ACPI_TABLE_HEADER       *Table)
2160228110Sjkim{
2161228110Sjkim    ACPI_STATUS             Status;
2162228110Sjkim    ACPI_PCCT_SUBSPACE      *SubTable;
2163272444Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
2164228110Sjkim    UINT32                  Length = Table->Length;
2165228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_PCCT);
2166228110Sjkim
2167228110Sjkim
2168228110Sjkim    /* Main table */
2169228110Sjkim
2170228110Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
2171228110Sjkim    if (ACPI_FAILURE (Status))
2172228110Sjkim    {
2173228110Sjkim        return;
2174228110Sjkim    }
2175228110Sjkim
2176272444Sjkim    /* Subtables */
2177228110Sjkim
2178228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
2179228110Sjkim    while (Offset < Table->Length)
2180228110Sjkim    {
2181272444Sjkim        /* Common subtable header */
2182272444Sjkim
2183228110Sjkim        AcpiOsPrintf ("\n");
2184228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2185272444Sjkim                    SubTable->Header.Length, AcpiDmTableInfoPcctHdr);
2186228110Sjkim        if (ACPI_FAILURE (Status))
2187228110Sjkim        {
2188228110Sjkim            return;
2189228110Sjkim        }
2190228110Sjkim
2191272444Sjkim        switch (SubTable->Header.Type)
2192272444Sjkim        {
2193272444Sjkim        case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
2194228110Sjkim
2195272444Sjkim            InfoTable = AcpiDmTableInfoPcct0;
2196272444Sjkim            break;
2197272444Sjkim
2198272444Sjkim        case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
2199272444Sjkim
2200272444Sjkim            InfoTable = AcpiDmTableInfoPcct1;
2201272444Sjkim            break;
2202272444Sjkim
2203272444Sjkim        default:
2204272444Sjkim
2205272444Sjkim            AcpiOsPrintf (
2206272444Sjkim                "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
2207272444Sjkim                SubTable->Header.Type);
2208272444Sjkim            return;
2209272444Sjkim        }
2210272444Sjkim
2211272444Sjkim        AcpiOsPrintf ("\n");
2212272444Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2213272444Sjkim                    SubTable->Header.Length, InfoTable);
2214272444Sjkim        if (ACPI_FAILURE (Status))
2215272444Sjkim        {
2216272444Sjkim            return;
2217272444Sjkim        }
2218272444Sjkim
2219272444Sjkim        /* Point to next subtable */
2220272444Sjkim
2221228110Sjkim        Offset += SubTable->Header.Length;
2222228110Sjkim        SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable,
2223228110Sjkim                    SubTable->Header.Length);
2224228110Sjkim    }
2225228110Sjkim}
2226228110Sjkim
2227228110Sjkim
2228228110Sjkim/*******************************************************************************
2229228110Sjkim *
2230228110Sjkim * FUNCTION:    AcpiDmDumpPmtt
2231228110Sjkim *
2232228110Sjkim * PARAMETERS:  Table               - A PMTT table
2233228110Sjkim *
2234228110Sjkim * RETURN:      None
2235228110Sjkim *
2236228110Sjkim * DESCRIPTION: Format the contents of a PMTT. This table type consists
2237228110Sjkim *              of an open-ended number of subtables.
2238228110Sjkim *
2239228110Sjkim ******************************************************************************/
2240228110Sjkim
2241228110Sjkimvoid
2242228110SjkimAcpiDmDumpPmtt (
2243228110Sjkim    ACPI_TABLE_HEADER       *Table)
2244228110Sjkim{
2245228110Sjkim    ACPI_STATUS             Status;
2246228110Sjkim    ACPI_PMTT_HEADER        *SubTable;
2247228110Sjkim    ACPI_PMTT_HEADER        *MemSubTable;
2248228110Sjkim    ACPI_PMTT_HEADER        *DimmSubTable;
2249228110Sjkim    ACPI_PMTT_DOMAIN        *DomainArray;
2250228110Sjkim    UINT32                  Length = Table->Length;
2251228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
2252228110Sjkim    UINT32                  MemOffset;
2253228110Sjkim    UINT32                  DimmOffset;
2254228110Sjkim    UINT32                  DomainOffset;
2255228110Sjkim    UINT32                  DomainCount;
2256228110Sjkim
2257228110Sjkim
2258228110Sjkim    /* Main table */
2259228110Sjkim
2260228110Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
2261228110Sjkim    if (ACPI_FAILURE (Status))
2262228110Sjkim    {
2263228110Sjkim        return;
2264228110Sjkim    }
2265228110Sjkim
2266228110Sjkim    /* Subtables */
2267228110Sjkim
2268228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
2269228110Sjkim    while (Offset < Table->Length)
2270228110Sjkim    {
2271228110Sjkim        /* Common subtable header */
2272228110Sjkim
2273228110Sjkim        AcpiOsPrintf ("\n");
2274228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2275228110Sjkim                    SubTable->Length, AcpiDmTableInfoPmttHdr);
2276228110Sjkim        if (ACPI_FAILURE (Status))
2277228110Sjkim        {
2278228110Sjkim            return;
2279228110Sjkim        }
2280228110Sjkim
2281228110Sjkim        /* Only Socket subtables are expected at this level */
2282228110Sjkim
2283228110Sjkim        if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET)
2284228110Sjkim        {
2285228110Sjkim            AcpiOsPrintf (
2286228110Sjkim                "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2287228110Sjkim                SubTable->Type);
2288228110Sjkim            return;
2289228110Sjkim        }
2290228110Sjkim
2291228110Sjkim        /* Dump the fixed-length portion of the subtable */
2292228110Sjkim
2293228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2294228110Sjkim                    SubTable->Length, AcpiDmTableInfoPmtt0);
2295228110Sjkim        if (ACPI_FAILURE (Status))
2296228110Sjkim        {
2297228110Sjkim            return;
2298228110Sjkim        }
2299228110Sjkim
2300228110Sjkim        /* Walk the memory controller subtables */
2301228110Sjkim
2302228110Sjkim        MemOffset = sizeof (ACPI_PMTT_SOCKET);
2303228110Sjkim        MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable,
2304228110Sjkim            sizeof (ACPI_PMTT_SOCKET));
2305228110Sjkim
2306228110Sjkim        while (((Offset + MemOffset) < Table->Length) &&
2307228110Sjkim            (MemOffset < SubTable->Length))
2308228110Sjkim        {
2309228110Sjkim            /* Common subtable header */
2310228110Sjkim
2311228110Sjkim            AcpiOsPrintf ("\n");
2312228110Sjkim            Status = AcpiDmDumpTable (Length,
2313228110Sjkim                        Offset + MemOffset, MemSubTable,
2314228110Sjkim                        MemSubTable->Length, AcpiDmTableInfoPmttHdr);
2315228110Sjkim            if (ACPI_FAILURE (Status))
2316228110Sjkim            {
2317228110Sjkim                return;
2318228110Sjkim            }
2319228110Sjkim
2320228110Sjkim            /* Only memory controller subtables are expected at this level */
2321228110Sjkim
2322228110Sjkim            if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER)
2323228110Sjkim            {
2324228110Sjkim                AcpiOsPrintf (
2325228110Sjkim                    "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2326228110Sjkim                    MemSubTable->Type);
2327228110Sjkim                return;
2328228110Sjkim            }
2329228110Sjkim
2330228110Sjkim            /* Dump the fixed-length portion of the controller subtable */
2331228110Sjkim
2332228110Sjkim            Status = AcpiDmDumpTable (Length,
2333228110Sjkim                        Offset + MemOffset, MemSubTable,
2334228110Sjkim                        MemSubTable->Length, AcpiDmTableInfoPmtt1);
2335228110Sjkim            if (ACPI_FAILURE (Status))
2336228110Sjkim            {
2337228110Sjkim                return;
2338228110Sjkim            }
2339228110Sjkim
2340228110Sjkim            /* Walk the variable count of proximity domains */
2341228110Sjkim
2342228110Sjkim            DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount;
2343228110Sjkim            DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
2344228110Sjkim            DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable,
2345228110Sjkim                sizeof (ACPI_PMTT_CONTROLLER));
2346228110Sjkim
2347228110Sjkim            while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
2348228110Sjkim                ((MemOffset + DomainOffset) < SubTable->Length) &&
2349228110Sjkim                DomainCount)
2350228110Sjkim            {
2351228110Sjkim                Status = AcpiDmDumpTable (Length,
2352228110Sjkim                            Offset + MemOffset + DomainOffset, DomainArray,
2353228110Sjkim                            sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
2354228110Sjkim                if (ACPI_FAILURE (Status))
2355228110Sjkim                {
2356228110Sjkim                    return;
2357228110Sjkim                }
2358228110Sjkim
2359228110Sjkim                DomainOffset += sizeof (ACPI_PMTT_DOMAIN);
2360228110Sjkim                DomainArray++;
2361228110Sjkim                DomainCount--;
2362228110Sjkim            }
2363228110Sjkim
2364228110Sjkim            if (DomainCount)
2365228110Sjkim            {
2366228110Sjkim                AcpiOsPrintf (
2367272444Sjkim                    "\n**** DomainCount exceeds subtable length\n\n");
2368228110Sjkim            }
2369228110Sjkim
2370228110Sjkim            /* Walk the physical component (DIMM) subtables */
2371228110Sjkim
2372228110Sjkim            DimmOffset = DomainOffset;
2373228110Sjkim            DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable,
2374228110Sjkim                DomainOffset);
2375228110Sjkim
2376228110Sjkim            while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
2377228110Sjkim                (DimmOffset < MemSubTable->Length))
2378228110Sjkim            {
2379228110Sjkim                /* Common subtable header */
2380228110Sjkim
2381228110Sjkim                AcpiOsPrintf ("\n");
2382228110Sjkim                Status = AcpiDmDumpTable (Length,
2383228110Sjkim                            Offset + MemOffset + DimmOffset, DimmSubTable,
2384228110Sjkim                            DimmSubTable->Length, AcpiDmTableInfoPmttHdr);
2385228110Sjkim                if (ACPI_FAILURE (Status))
2386228110Sjkim                {
2387228110Sjkim                    return;
2388228110Sjkim                }
2389228110Sjkim
2390228110Sjkim                /* Only DIMM subtables are expected at this level */
2391228110Sjkim
2392228110Sjkim                if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM)
2393228110Sjkim                {
2394228110Sjkim                    AcpiOsPrintf (
2395228110Sjkim                        "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2396228110Sjkim                        DimmSubTable->Type);
2397228110Sjkim                    return;
2398228110Sjkim                }
2399228110Sjkim
2400228110Sjkim                /* Dump the fixed-length DIMM subtable */
2401228110Sjkim
2402228110Sjkim                Status = AcpiDmDumpTable (Length,
2403228110Sjkim                            Offset + MemOffset + DimmOffset, DimmSubTable,
2404228110Sjkim                            DimmSubTable->Length, AcpiDmTableInfoPmtt2);
2405228110Sjkim                if (ACPI_FAILURE (Status))
2406228110Sjkim                {
2407228110Sjkim                    return;
2408228110Sjkim                }
2409228110Sjkim
2410228110Sjkim                /* Point to next DIMM subtable */
2411228110Sjkim
2412228110Sjkim                DimmOffset += DimmSubTable->Length;
2413228110Sjkim                DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2414228110Sjkim                    DimmSubTable, DimmSubTable->Length);
2415228110Sjkim            }
2416228110Sjkim
2417228110Sjkim            /* Point to next Controller subtable */
2418228110Sjkim
2419228110Sjkim            MemOffset += MemSubTable->Length;
2420228110Sjkim            MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2421228110Sjkim                MemSubTable, MemSubTable->Length);
2422228110Sjkim        }
2423228110Sjkim
2424228110Sjkim        /* Point to next Socket subtable */
2425228110Sjkim
2426228110Sjkim        Offset += SubTable->Length;
2427228110Sjkim        SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2428228110Sjkim            SubTable, SubTable->Length);
2429228110Sjkim    }
2430228110Sjkim}
2431228110Sjkim
2432228110Sjkim
2433228110Sjkim/*******************************************************************************
2434228110Sjkim *
2435228110Sjkim * FUNCTION:    AcpiDmDumpS3pt
2436228110Sjkim *
2437228110Sjkim * PARAMETERS:  Table               - A S3PT table
2438228110Sjkim *
2439228110Sjkim * RETURN:      Length of the table
2440228110Sjkim *
2441228110Sjkim * DESCRIPTION: Format the contents of a S3PT
2442228110Sjkim *
2443228110Sjkim ******************************************************************************/
2444228110Sjkim
2445228110SjkimUINT32
2446228110SjkimAcpiDmDumpS3pt (
2447228110Sjkim    ACPI_TABLE_HEADER       *Tables)
2448228110Sjkim{
2449228110Sjkim    ACPI_STATUS             Status;
2450228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_S3PT);
2451228110Sjkim    ACPI_S3PT_HEADER        *SubTable;
2452228110Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
2453228110Sjkim    ACPI_TABLE_S3PT         *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
2454228110Sjkim
2455228110Sjkim
2456228110Sjkim    /* Main table */
2457228110Sjkim
2458228110Sjkim    Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
2459228110Sjkim    if (ACPI_FAILURE (Status))
2460228110Sjkim    {
2461228110Sjkim        return 0;
2462228110Sjkim    }
2463228110Sjkim
2464228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, S3ptTable, Offset);
2465228110Sjkim    while (Offset < S3ptTable->Length)
2466228110Sjkim    {
2467272444Sjkim        /* Common subtable header */
2468228110Sjkim
2469228110Sjkim        AcpiOsPrintf ("\n");
2470228110Sjkim        Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
2471228110Sjkim                    SubTable->Length, AcpiDmTableInfoS3ptHdr);
2472228110Sjkim        if (ACPI_FAILURE (Status))
2473228110Sjkim        {
2474228110Sjkim            return 0;
2475228110Sjkim        }
2476228110Sjkim
2477228110Sjkim        switch (SubTable->Type)
2478228110Sjkim        {
2479228110Sjkim        case ACPI_S3PT_TYPE_RESUME:
2480250838Sjkim
2481228110Sjkim            InfoTable = AcpiDmTableInfoS3pt0;
2482228110Sjkim            break;
2483250838Sjkim
2484228110Sjkim        case ACPI_S3PT_TYPE_SUSPEND:
2485250838Sjkim
2486228110Sjkim            InfoTable = AcpiDmTableInfoS3pt1;
2487228110Sjkim            break;
2488250838Sjkim
2489228110Sjkim        default:
2490250838Sjkim
2491272444Sjkim            AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n", SubTable->Type);
2492228110Sjkim
2493228110Sjkim            /* Attempt to continue */
2494228110Sjkim
2495228110Sjkim            if (!SubTable->Length)
2496228110Sjkim            {
2497228110Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
2498228110Sjkim                return 0;
2499228110Sjkim            }
2500228110Sjkim            goto NextSubTable;
2501228110Sjkim        }
2502228110Sjkim
2503228110Sjkim        AcpiOsPrintf ("\n");
2504228110Sjkim        Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
2505228110Sjkim                    SubTable->Length, InfoTable);
2506228110Sjkim        if (ACPI_FAILURE (Status))
2507228110Sjkim        {
2508228110Sjkim            return 0;
2509228110Sjkim        }
2510228110Sjkim
2511228110SjkimNextSubTable:
2512272444Sjkim        /* Point to next subtable */
2513228110Sjkim
2514228110Sjkim        Offset += SubTable->Length;
2515228110Sjkim        SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, SubTable, SubTable->Length);
2516228110Sjkim    }
2517228110Sjkim
2518228110Sjkim    return (S3ptTable->Length);
2519228110Sjkim}
2520228110Sjkim
2521228110Sjkim
2522228110Sjkim/*******************************************************************************
2523228110Sjkim *
2524219707Sjkim * FUNCTION:    AcpiDmDumpSlic
2525219707Sjkim *
2526219707Sjkim * PARAMETERS:  Table               - A SLIC table
2527219707Sjkim *
2528219707Sjkim * RETURN:      None
2529219707Sjkim *
2530219707Sjkim * DESCRIPTION: Format the contents of a SLIC
2531219707Sjkim *
2532219707Sjkim ******************************************************************************/
2533219707Sjkim
2534219707Sjkimvoid
2535219707SjkimAcpiDmDumpSlic (
2536219707Sjkim    ACPI_TABLE_HEADER       *Table)
2537219707Sjkim{
2538219707Sjkim    ACPI_STATUS             Status;
2539219707Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_SLIC);
2540219707Sjkim    ACPI_SLIC_HEADER        *SubTable;
2541219707Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
2542219707Sjkim
2543219707Sjkim
2544219707Sjkim    /* There is no main SLIC table, only subtables */
2545219707Sjkim
2546219707Sjkim    SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, Table, Offset);
2547219707Sjkim    while (Offset < Table->Length)
2548219707Sjkim    {
2549272444Sjkim        /* Common subtable header */
2550219707Sjkim
2551219707Sjkim        AcpiOsPrintf ("\n");
2552219707Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2553219707Sjkim                    SubTable->Length, AcpiDmTableInfoSlicHdr);
2554219707Sjkim        if (ACPI_FAILURE (Status))
2555219707Sjkim        {
2556219707Sjkim            return;
2557219707Sjkim        }
2558219707Sjkim
2559219707Sjkim        switch (SubTable->Type)
2560219707Sjkim        {
2561219707Sjkim        case ACPI_SLIC_TYPE_PUBLIC_KEY:
2562250838Sjkim
2563219707Sjkim            InfoTable = AcpiDmTableInfoSlic0;
2564219707Sjkim            break;
2565250838Sjkim
2566219707Sjkim        case ACPI_SLIC_TYPE_WINDOWS_MARKER:
2567250838Sjkim
2568219707Sjkim            InfoTable = AcpiDmTableInfoSlic1;
2569219707Sjkim            break;
2570250838Sjkim
2571219707Sjkim        default:
2572250838Sjkim
2573272444Sjkim            AcpiOsPrintf ("\n**** Unknown SLIC subtable type 0x%X\n", SubTable->Type);
2574219707Sjkim
2575219707Sjkim            /* Attempt to continue */
2576219707Sjkim
2577219707Sjkim            if (!SubTable->Length)
2578219707Sjkim            {
2579219707Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
2580219707Sjkim                return;
2581219707Sjkim            }
2582219707Sjkim            goto NextSubTable;
2583219707Sjkim        }
2584219707Sjkim
2585219707Sjkim        AcpiOsPrintf ("\n");
2586219707Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2587219707Sjkim                    SubTable->Length, InfoTable);
2588219707Sjkim        if (ACPI_FAILURE (Status))
2589219707Sjkim        {
2590219707Sjkim            return;
2591219707Sjkim        }
2592219707Sjkim
2593219707SjkimNextSubTable:
2594272444Sjkim        /* Point to next subtable */
2595219707Sjkim
2596219707Sjkim        Offset += SubTable->Length;
2597219707Sjkim        SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, SubTable, SubTable->Length);
2598219707Sjkim    }
2599219707Sjkim}
2600219707Sjkim
2601219707Sjkim
2602219707Sjkim/*******************************************************************************
2603219707Sjkim *
2604167802Sjkim * FUNCTION:    AcpiDmDumpSlit
2605167802Sjkim *
2606167802Sjkim * PARAMETERS:  Table               - An SLIT
2607167802Sjkim *
2608167802Sjkim * RETURN:      None
2609167802Sjkim *
2610167802Sjkim * DESCRIPTION: Format the contents of a SLIT
2611167802Sjkim *
2612167802Sjkim ******************************************************************************/
2613167802Sjkim
2614167802Sjkimvoid
2615167802SjkimAcpiDmDumpSlit (
2616167802Sjkim    ACPI_TABLE_HEADER       *Table)
2617167802Sjkim{
2618193529Sjkim    ACPI_STATUS             Status;
2619167802Sjkim    UINT32                  Offset;
2620167802Sjkim    UINT8                   *Row;
2621167802Sjkim    UINT32                  Localities;
2622167802Sjkim    UINT32                  i;
2623167802Sjkim    UINT32                  j;
2624167802Sjkim
2625167802Sjkim
2626167802Sjkim    /* Main table */
2627167802Sjkim
2628193529Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit);
2629193529Sjkim    if (ACPI_FAILURE (Status))
2630193529Sjkim    {
2631193529Sjkim        return;
2632193529Sjkim    }
2633167802Sjkim
2634167802Sjkim    /* Display the Locality NxN Matrix */
2635167802Sjkim
2636167802Sjkim    Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount;
2637167802Sjkim    Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]);
2638167802Sjkim    Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry;
2639167802Sjkim
2640167802Sjkim    for (i = 0; i < Localities; i++)
2641167802Sjkim    {
2642167802Sjkim        /* Display one row of the matrix */
2643167802Sjkim
2644167802Sjkim        AcpiDmLineHeader2 (Offset, Localities, "Locality", i);
2645167802Sjkim        for  (j = 0; j < Localities; j++)
2646167802Sjkim        {
2647167802Sjkim            /* Check for beyond EOT */
2648167802Sjkim
2649167802Sjkim            if (Offset >= Table->Length)
2650167802Sjkim            {
2651167802Sjkim                AcpiOsPrintf ("\n**** Not enough room in table for all localities\n");
2652167802Sjkim                return;
2653167802Sjkim            }
2654167802Sjkim
2655209746Sjkim            AcpiOsPrintf ("%2.2X", Row[j]);
2656167802Sjkim            Offset++;
2657167802Sjkim
2658167802Sjkim            /* Display up to 16 bytes per output row */
2659167802Sjkim
2660209746Sjkim            if ((j+1) < Localities)
2661167802Sjkim            {
2662220663Sjkim                AcpiOsPrintf (" ");
2663209746Sjkim
2664209746Sjkim                if (j && (((j+1) % 16) == 0))
2665209746Sjkim                {
2666220663Sjkim                    AcpiOsPrintf ("\\\n"); /* With line continuation char */
2667220663Sjkim                    AcpiDmLineHeader (Offset, 0, NULL);
2668209746Sjkim                }
2669167802Sjkim            }
2670167802Sjkim        }
2671167802Sjkim
2672167802Sjkim        /* Point to next row */
2673167802Sjkim
2674167802Sjkim        AcpiOsPrintf ("\n");
2675167802Sjkim        Row += Localities;
2676167802Sjkim    }
2677167802Sjkim}
2678167802Sjkim
2679167802Sjkim
2680167802Sjkim/*******************************************************************************
2681167802Sjkim *
2682167802Sjkim * FUNCTION:    AcpiDmDumpSrat
2683167802Sjkim *
2684167802Sjkim * PARAMETERS:  Table               - A SRAT table
2685167802Sjkim *
2686167802Sjkim * RETURN:      None
2687167802Sjkim *
2688167802Sjkim * DESCRIPTION: Format the contents of a SRAT
2689167802Sjkim *
2690167802Sjkim ******************************************************************************/
2691167802Sjkim
2692167802Sjkimvoid
2693167802SjkimAcpiDmDumpSrat (
2694167802Sjkim    ACPI_TABLE_HEADER       *Table)
2695167802Sjkim{
2696193529Sjkim    ACPI_STATUS             Status;
2697167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_SRAT);
2698167802Sjkim    ACPI_SUBTABLE_HEADER    *SubTable;
2699167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
2700167802Sjkim
2701167802Sjkim
2702167802Sjkim    /* Main table */
2703167802Sjkim
2704193529Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat);
2705193529Sjkim    if (ACPI_FAILURE (Status))
2706193529Sjkim    {
2707193529Sjkim        return;
2708193529Sjkim    }
2709167802Sjkim
2710272444Sjkim    /* Subtables */
2711167802Sjkim
2712167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
2713167802Sjkim    while (Offset < Table->Length)
2714167802Sjkim    {
2715272444Sjkim        /* Common subtable header */
2716193529Sjkim
2717193529Sjkim        AcpiOsPrintf ("\n");
2718193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2719193529Sjkim                    SubTable->Length, AcpiDmTableInfoSratHdr);
2720193529Sjkim        if (ACPI_FAILURE (Status))
2721193529Sjkim        {
2722193529Sjkim            return;
2723193529Sjkim        }
2724193529Sjkim
2725167802Sjkim        switch (SubTable->Type)
2726167802Sjkim        {
2727167802Sjkim        case ACPI_SRAT_TYPE_CPU_AFFINITY:
2728250838Sjkim
2729167802Sjkim            InfoTable = AcpiDmTableInfoSrat0;
2730167802Sjkim            break;
2731250838Sjkim
2732167802Sjkim        case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
2733250838Sjkim
2734167802Sjkim            InfoTable = AcpiDmTableInfoSrat1;
2735167802Sjkim            break;
2736250838Sjkim
2737193529Sjkim        case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
2738250838Sjkim
2739193529Sjkim            InfoTable = AcpiDmTableInfoSrat2;
2740193529Sjkim            break;
2741250838Sjkim
2742272444Sjkim        case ACPI_SRAT_TYPE_GICC_AFFINITY:
2743272444Sjkim
2744272444Sjkim            InfoTable = AcpiDmTableInfoSrat3;
2745272444Sjkim            break;
2746272444Sjkim
2747167802Sjkim        default:
2748272444Sjkim            AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n", SubTable->Type);
2749193529Sjkim
2750193529Sjkim            /* Attempt to continue */
2751193529Sjkim
2752193529Sjkim            if (!SubTable->Length)
2753193529Sjkim            {
2754193529Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
2755193529Sjkim                return;
2756193529Sjkim            }
2757193529Sjkim            goto NextSubTable;
2758167802Sjkim        }
2759167802Sjkim
2760167802Sjkim        AcpiOsPrintf ("\n");
2761193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2762193529Sjkim                    SubTable->Length, InfoTable);
2763193529Sjkim        if (ACPI_FAILURE (Status))
2764193529Sjkim        {
2765193529Sjkim            return;
2766193529Sjkim        }
2767167802Sjkim
2768193529SjkimNextSubTable:
2769272444Sjkim        /* Point to next subtable */
2770167802Sjkim
2771167802Sjkim        Offset += SubTable->Length;
2772167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
2773167802Sjkim    }
2774167802Sjkim}
2775167802Sjkim
2776197104Sjkim
2777197104Sjkim/*******************************************************************************
2778197104Sjkim *
2779246849Sjkim * FUNCTION:    AcpiDmDumpVrtc
2780246849Sjkim *
2781246849Sjkim * PARAMETERS:  Table               - A VRTC table
2782246849Sjkim *
2783246849Sjkim * RETURN:      None
2784246849Sjkim *
2785246849Sjkim * DESCRIPTION: Format the contents of a VRTC
2786246849Sjkim *
2787246849Sjkim ******************************************************************************/
2788246849Sjkim
2789246849Sjkimvoid
2790246849SjkimAcpiDmDumpVrtc (
2791246849Sjkim    ACPI_TABLE_HEADER       *Table)
2792246849Sjkim{
2793246849Sjkim    ACPI_STATUS             Status;
2794246849Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_VRTC);
2795246849Sjkim    ACPI_VRTC_ENTRY         *SubTable;
2796246849Sjkim
2797246849Sjkim
2798246849Sjkim    /* Main table */
2799246849Sjkim
2800246849Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoVrtc);
2801246849Sjkim    if (ACPI_FAILURE (Status))
2802246849Sjkim    {
2803246849Sjkim        return;
2804246849Sjkim    }
2805246849Sjkim
2806272444Sjkim    /* Subtables */
2807246849Sjkim
2808246849Sjkim    SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset);
2809246849Sjkim    while (Offset < Table->Length)
2810246849Sjkim    {
2811272444Sjkim        /* Common subtable header */
2812246849Sjkim
2813246849Sjkim        AcpiOsPrintf ("\n");
2814246849Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2815246849Sjkim                    sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0);
2816246849Sjkim        if (ACPI_FAILURE (Status))
2817246849Sjkim        {
2818246849Sjkim            return;
2819246849Sjkim        }
2820246849Sjkim
2821272444Sjkim        /* Point to next subtable */
2822246849Sjkim
2823246849Sjkim        Offset += sizeof (ACPI_VRTC_ENTRY);
2824246849Sjkim        SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, SubTable, sizeof (ACPI_VRTC_ENTRY));
2825246849Sjkim    }
2826246849Sjkim}
2827246849Sjkim
2828246849Sjkim
2829246849Sjkim/*******************************************************************************
2830246849Sjkim *
2831197104Sjkim * FUNCTION:    AcpiDmDumpWdat
2832197104Sjkim *
2833197104Sjkim * PARAMETERS:  Table               - A WDAT table
2834197104Sjkim *
2835197104Sjkim * RETURN:      None
2836197104Sjkim *
2837197104Sjkim * DESCRIPTION: Format the contents of a WDAT
2838197104Sjkim *
2839197104Sjkim ******************************************************************************/
2840197104Sjkim
2841197104Sjkimvoid
2842197104SjkimAcpiDmDumpWdat (
2843197104Sjkim    ACPI_TABLE_HEADER       *Table)
2844197104Sjkim{
2845197104Sjkim    ACPI_STATUS             Status;
2846197104Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_WDAT);
2847197104Sjkim    ACPI_WDAT_ENTRY         *SubTable;
2848197104Sjkim
2849197104Sjkim
2850197104Sjkim    /* Main table */
2851197104Sjkim
2852197104Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat);
2853197104Sjkim    if (ACPI_FAILURE (Status))
2854197104Sjkim    {
2855197104Sjkim        return;
2856197104Sjkim    }
2857197104Sjkim
2858272444Sjkim    /* Subtables */
2859197104Sjkim
2860197104Sjkim    SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
2861197104Sjkim    while (Offset < Table->Length)
2862197104Sjkim    {
2863272444Sjkim        /* Common subtable header */
2864197104Sjkim
2865197104Sjkim        AcpiOsPrintf ("\n");
2866197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2867197104Sjkim                    sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0);
2868197104Sjkim        if (ACPI_FAILURE (Status))
2869197104Sjkim        {
2870197104Sjkim            return;
2871197104Sjkim        }
2872197104Sjkim
2873272444Sjkim        /* Point to next subtable */
2874197104Sjkim
2875197104Sjkim        Offset += sizeof (ACPI_WDAT_ENTRY);
2876197104Sjkim        SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable, sizeof (ACPI_WDAT_ENTRY));
2877197104Sjkim    }
2878197104Sjkim}
2879