dmtbdump.c revision 241973
1167802Sjkim/******************************************************************************
2167802Sjkim *
3167802Sjkim * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code
4167802Sjkim *
5167802Sjkim *****************************************************************************/
6167802Sjkim
7217365Sjkim/*
8229989Sjkim * Copyright (C) 2000 - 2012, 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:
352218590Sjkim        AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n");
353218590Sjkim        return;
354218590Sjkim
355218590Sjkim    case 1:
356218590Sjkim        ExpectedLength = ACPI_FADT_V1_SIZE;
357218590Sjkim        break;
358218590Sjkim
359218590Sjkim    case 2:
360218590Sjkim        ExpectedLength = ACPI_FADT_V2_SIZE;
361218590Sjkim        break;
362218590Sjkim
363218590Sjkim    case 3:
364218590Sjkim    case 4:
365218590Sjkim        ExpectedLength = ACPI_FADT_V3_SIZE;
366218590Sjkim        break;
367218590Sjkim
368228110Sjkim    case 5:
369228110Sjkim        ExpectedLength = ACPI_FADT_V5_SIZE;
370228110Sjkim        break;
371228110Sjkim
372218590Sjkim    default:
373218590Sjkim        return;
374218590Sjkim    }
375218590Sjkim
376218590Sjkim    if (Length == ExpectedLength)
377218590Sjkim    {
378218590Sjkim        return;
379218590Sjkim    }
380218590Sjkim
381218590Sjkim    AcpiOsPrintf (
382218590Sjkim        "\n// ACPI Warning: FADT revision %X does not match length: found %X expected %X\n",
383218590Sjkim        Revision, Length, ExpectedLength);
384218590Sjkim}
385218590Sjkim
386218590Sjkim
387218590Sjkim/*******************************************************************************
388218590Sjkim *
389167802Sjkim * FUNCTION:    AcpiDmDumpAsf
390167802Sjkim *
391167802Sjkim * PARAMETERS:  Table               - A ASF table
392167802Sjkim *
393167802Sjkim * RETURN:      None
394167802Sjkim *
395167802Sjkim * DESCRIPTION: Format the contents of a ASF table
396167802Sjkim *
397167802Sjkim ******************************************************************************/
398167802Sjkim
399167802Sjkimvoid
400167802SjkimAcpiDmDumpAsf (
401167802Sjkim    ACPI_TABLE_HEADER       *Table)
402167802Sjkim{
403193529Sjkim    ACPI_STATUS             Status;
404167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
405167802Sjkim    ACPI_ASF_INFO           *SubTable;
406167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
407167802Sjkim    ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
408167802Sjkim    UINT8                   *DataTable = NULL;
409193529Sjkim    UINT32                  DataCount = 0;
410193529Sjkim    UINT32                  DataLength = 0;
411193529Sjkim    UINT32                  DataOffset = 0;
412193529Sjkim    UINT32                  i;
413197104Sjkim    UINT8                   Type;
414167802Sjkim
415167802Sjkim
416167802Sjkim    /* No main table, only sub-tables */
417167802Sjkim
418167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
419167802Sjkim    while (Offset < Table->Length)
420167802Sjkim    {
421167802Sjkim        /* Common sub-table header */
422167802Sjkim
423193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
424193529Sjkim                    SubTable->Header.Length, AcpiDmTableInfoAsfHdr);
425193529Sjkim        if (ACPI_FAILURE (Status))
426193529Sjkim        {
427193529Sjkim            return;
428193529Sjkim        }
429167802Sjkim
430197104Sjkim        /* The actual type is the lower 7 bits of Type */
431197104Sjkim
432197104Sjkim        Type = (UINT8) (SubTable->Header.Type & 0x7F);
433197104Sjkim
434197104Sjkim        switch (Type)
435167802Sjkim        {
436167802Sjkim        case ACPI_ASF_TYPE_INFO:
437167802Sjkim            InfoTable = AcpiDmTableInfoAsf0;
438167802Sjkim            break;
439167802Sjkim
440167802Sjkim        case ACPI_ASF_TYPE_ALERT:
441167802Sjkim            InfoTable = AcpiDmTableInfoAsf1;
442167802Sjkim            DataInfoTable = AcpiDmTableInfoAsf1a;
443167802Sjkim            DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT));
444197104Sjkim            DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts;
445197104Sjkim            DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength;
446167802Sjkim            DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
447167802Sjkim            break;
448167802Sjkim
449167802Sjkim        case ACPI_ASF_TYPE_CONTROL:
450167802Sjkim            InfoTable = AcpiDmTableInfoAsf2;
451167802Sjkim            DataInfoTable = AcpiDmTableInfoAsf2a;
452167802Sjkim            DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE));
453197104Sjkim            DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls;
454197104Sjkim            DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength;
455167802Sjkim            DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
456167802Sjkim            break;
457167802Sjkim
458167802Sjkim        case ACPI_ASF_TYPE_BOOT:
459167802Sjkim            InfoTable = AcpiDmTableInfoAsf3;
460167802Sjkim            break;
461167802Sjkim
462167802Sjkim        case ACPI_ASF_TYPE_ADDRESS:
463167802Sjkim            InfoTable = AcpiDmTableInfoAsf4;
464167802Sjkim            DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS));
465197104Sjkim            DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices;
466167802Sjkim            DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
467167802Sjkim            break;
468167802Sjkim
469167802Sjkim        default:
470204773Sjkim            AcpiOsPrintf ("\n**** Unknown ASF sub-table type 0x%X\n", SubTable->Header.Type);
471167802Sjkim            return;
472167802Sjkim        }
473167802Sjkim
474193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
475193529Sjkim                    SubTable->Header.Length, InfoTable);
476193529Sjkim        if (ACPI_FAILURE (Status))
477193529Sjkim        {
478193529Sjkim            return;
479193529Sjkim        }
480167802Sjkim
481167802Sjkim        /* Dump variable-length extra data */
482167802Sjkim
483197104Sjkim        switch (Type)
484167802Sjkim        {
485167802Sjkim        case ACPI_ASF_TYPE_ALERT:
486167802Sjkim        case ACPI_ASF_TYPE_CONTROL:
487167802Sjkim
488167802Sjkim            for (i = 0; i < DataCount; i++)
489167802Sjkim            {
490167802Sjkim                AcpiOsPrintf ("\n");
491193529Sjkim                Status = AcpiDmDumpTable (Table->Length, DataOffset,
492193529Sjkim                            DataTable, DataLength, DataInfoTable);
493193529Sjkim                if (ACPI_FAILURE (Status))
494193529Sjkim                {
495193529Sjkim                    return;
496193529Sjkim                }
497167802Sjkim
498167802Sjkim                DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
499167802Sjkim                DataOffset += DataLength;
500167802Sjkim            }
501167802Sjkim            break;
502167802Sjkim
503167802Sjkim        case ACPI_ASF_TYPE_ADDRESS:
504167802Sjkim
505167802Sjkim            for (i = 0; i < DataLength; i++)
506167802Sjkim            {
507167802Sjkim                if (!(i % 16))
508167802Sjkim                {
509167802Sjkim                    AcpiDmLineHeader (DataOffset, 1, "Addresses");
510167802Sjkim                }
511167802Sjkim
512167802Sjkim                AcpiOsPrintf ("%2.2X ", *DataTable);
513167802Sjkim                DataTable++;
514167802Sjkim                DataOffset++;
515193529Sjkim                if (DataOffset > Table->Length)
516193529Sjkim                {
517193529Sjkim                    AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
518193529Sjkim                    return;
519193529Sjkim                }
520167802Sjkim            }
521167802Sjkim
522167802Sjkim            AcpiOsPrintf ("\n");
523167802Sjkim            break;
524193529Sjkim
525193529Sjkim        default:
526193529Sjkim            break;
527167802Sjkim        }
528167802Sjkim
529167802Sjkim        AcpiOsPrintf ("\n");
530167802Sjkim
531167802Sjkim        /* Point to next sub-table */
532167802Sjkim
533193529Sjkim        if (!SubTable->Header.Length)
534193529Sjkim        {
535193529Sjkim            AcpiOsPrintf ("Invalid zero subtable header length\n");
536193529Sjkim            return;
537193529Sjkim        }
538193529Sjkim
539167802Sjkim        Offset += SubTable->Header.Length;
540167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable, SubTable->Header.Length);
541167802Sjkim    }
542167802Sjkim}
543167802Sjkim
544167802Sjkim
545167802Sjkim/*******************************************************************************
546167802Sjkim *
547167802Sjkim * FUNCTION:    AcpiDmDumpCpep
548167802Sjkim *
549167802Sjkim * PARAMETERS:  Table               - A CPEP table
550167802Sjkim *
551167802Sjkim * RETURN:      None
552167802Sjkim *
553167802Sjkim * DESCRIPTION: Format the contents of a CPEP. This table type consists
554167802Sjkim *              of an open-ended number of subtables.
555167802Sjkim *
556167802Sjkim ******************************************************************************/
557167802Sjkim
558167802Sjkimvoid
559167802SjkimAcpiDmDumpCpep (
560167802Sjkim    ACPI_TABLE_HEADER       *Table)
561167802Sjkim{
562193529Sjkim    ACPI_STATUS             Status;
563167802Sjkim    ACPI_CPEP_POLLING       *SubTable;
564167802Sjkim    UINT32                  Length = Table->Length;
565167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_CPEP);
566167802Sjkim
567167802Sjkim
568167802Sjkim    /* Main table */
569167802Sjkim
570193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
571193529Sjkim    if (ACPI_FAILURE (Status))
572193529Sjkim    {
573193529Sjkim        return;
574193529Sjkim    }
575167802Sjkim
576167802Sjkim    /* Sub-tables */
577167802Sjkim
578167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
579167802Sjkim    while (Offset < Table->Length)
580167802Sjkim    {
581167802Sjkim        AcpiOsPrintf ("\n");
582193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
583197104Sjkim                    SubTable->Header.Length, AcpiDmTableInfoCpep0);
584193529Sjkim        if (ACPI_FAILURE (Status))
585193529Sjkim        {
586193529Sjkim            return;
587193529Sjkim        }
588167802Sjkim
589167802Sjkim        /* Point to next sub-table */
590167802Sjkim
591197104Sjkim        Offset += SubTable->Header.Length;
592197104Sjkim        SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable,
593197104Sjkim                    SubTable->Header.Length);
594167802Sjkim    }
595167802Sjkim}
596167802Sjkim
597167802Sjkim
598167802Sjkim/*******************************************************************************
599167802Sjkim *
600239340Sjkim * FUNCTION:    AcpiDmDumpCsrt
601239340Sjkim *
602239340Sjkim * PARAMETERS:  Table               - A CSRT table
603239340Sjkim *
604239340Sjkim * RETURN:      None
605239340Sjkim *
606239340Sjkim * DESCRIPTION: Format the contents of a CSRT. This table type consists
607239340Sjkim *              of an open-ended number of subtables.
608239340Sjkim *
609239340Sjkim ******************************************************************************/
610239340Sjkim
611239340Sjkimvoid
612239340SjkimAcpiDmDumpCsrt (
613239340Sjkim    ACPI_TABLE_HEADER       *Table)
614239340Sjkim{
615239340Sjkim    ACPI_STATUS             Status;
616239340Sjkim    ACPI_CSRT_GROUP         *SubTable;
617239340Sjkim    ACPI_CSRT_DESCRIPTOR    *SubSubTable;
618239340Sjkim    UINT32                  Length = Table->Length;
619239340Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_CSRT);
620239340Sjkim    UINT32                  SubOffset;
621239340Sjkim    UINT32                  SubSubOffset;
622239340Sjkim    UINT32                  InfoLength;
623239340Sjkim
624239340Sjkim
625239340Sjkim    /* The main table only contains the ACPI header, thus already handled */
626239340Sjkim
627239340Sjkim    /* Sub-tables (Resource Groups) */
628239340Sjkim
629239340Sjkim    SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
630239340Sjkim    while (Offset < Table->Length)
631239340Sjkim    {
632239340Sjkim        AcpiOsPrintf ("\n");
633239340Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
634239340Sjkim                    SubTable->Length, AcpiDmTableInfoCsrt0);
635239340Sjkim        if (ACPI_FAILURE (Status))
636239340Sjkim        {
637239340Sjkim            return;
638239340Sjkim        }
639239340Sjkim
640239340Sjkim        SubOffset = sizeof (ACPI_CSRT_GROUP);
641239340Sjkim
642239340Sjkim        /* Shared resource group info buffer */
643239340Sjkim
644239340Sjkim        AcpiDmDumpBuffer (SubTable, SubOffset, SubTable->InfoLength,
645239340Sjkim            Offset+SubOffset, "Shared Data");
646239340Sjkim        SubOffset += SubTable->InfoLength;
647239340Sjkim
648239340Sjkim        /* Sub-Sub-tables (Resource Descriptors) */
649239340Sjkim
650239340Sjkim        SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
651239340Sjkim            Offset + SubOffset);
652239340Sjkim
653239340Sjkim        while ((SubOffset < SubTable->Length) &&
654239340Sjkim              ((Offset + SubOffset) < Table->Length))
655239340Sjkim        {
656239340Sjkim            AcpiOsPrintf ("\n");
657239340Sjkim            Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubTable,
658239340Sjkim                        SubSubTable->Length, AcpiDmTableInfoCsrt1);
659239340Sjkim            if (ACPI_FAILURE (Status))
660239340Sjkim            {
661239340Sjkim                return;
662239340Sjkim            }
663239340Sjkim
664239340Sjkim            SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
665239340Sjkim
666239340Sjkim            /* Resource-specific info buffer */
667239340Sjkim
668239340Sjkim            InfoLength = SubSubTable->Length - SubSubOffset;
669239340Sjkim
670239340Sjkim            AcpiDmDumpBuffer (SubSubTable, SubSubOffset, InfoLength,
671239340Sjkim                Offset + SubOffset + SubSubOffset, "ResourceInfo");
672239340Sjkim            SubSubOffset += InfoLength;
673239340Sjkim
674239340Sjkim            /* Point to next sub-sub-table */
675239340Sjkim
676239340Sjkim            SubOffset += SubSubTable->Length;
677239340Sjkim            SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable,
678239340Sjkim                        SubSubTable->Length);
679239340Sjkim        }
680239340Sjkim
681239340Sjkim        /* Point to next sub-table */
682239340Sjkim
683239340Sjkim        Offset += SubTable->Length;
684239340Sjkim        SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable,
685239340Sjkim                    SubTable->Length);
686239340Sjkim    }
687239340Sjkim}
688239340Sjkim
689239340Sjkim
690239340Sjkim/*******************************************************************************
691239340Sjkim *
692239340Sjkim * FUNCTION:    AcpiDmDumpDbg2
693239340Sjkim *
694239340Sjkim * PARAMETERS:  Table               - A DBG2 table
695239340Sjkim *
696239340Sjkim * RETURN:      None
697239340Sjkim *
698239340Sjkim * DESCRIPTION: Format the contents of a DBG2. This table type consists
699239340Sjkim *              of an open-ended number of subtables.
700239340Sjkim *
701239340Sjkim ******************************************************************************/
702239340Sjkim
703239340Sjkimvoid
704239340SjkimAcpiDmDumpDbg2 (
705239340Sjkim    ACPI_TABLE_HEADER       *Table)
706239340Sjkim{
707239340Sjkim    ACPI_STATUS             Status;
708239340Sjkim    ACPI_DBG2_DEVICE        *SubTable;
709239340Sjkim    UINT32                  Length = Table->Length;
710239340Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_DBG2);
711239340Sjkim    UINT32                  i;
712239340Sjkim    UINT32                  ArrayOffset;
713239340Sjkim    UINT32                  AbsoluteOffset;
714239340Sjkim    UINT8                   *Array;
715239340Sjkim
716239340Sjkim
717239340Sjkim    /* Main table */
718239340Sjkim
719239340Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
720239340Sjkim    if (ACPI_FAILURE (Status))
721239340Sjkim    {
722239340Sjkim        return;
723239340Sjkim    }
724239340Sjkim
725239340Sjkim    /* Sub-tables */
726239340Sjkim
727239340Sjkim    SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
728239340Sjkim    while (Offset < Table->Length)
729239340Sjkim    {
730239340Sjkim        AcpiOsPrintf ("\n");
731239340Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
732239340Sjkim                    SubTable->Length, AcpiDmTableInfoDbg2Device);
733239340Sjkim        if (ACPI_FAILURE (Status))
734239340Sjkim        {
735239340Sjkim            return;
736239340Sjkim        }
737239340Sjkim
738239340Sjkim        /* Dump the BaseAddress array */
739239340Sjkim
740239340Sjkim        for (i = 0; i < SubTable->RegisterCount; i++)
741239340Sjkim        {
742239340Sjkim            ArrayOffset = SubTable->BaseAddressOffset +
743239340Sjkim                (sizeof (ACPI_GENERIC_ADDRESS) * i);
744239340Sjkim            AbsoluteOffset = Offset + ArrayOffset;
745239340Sjkim            Array = (UINT8 *) SubTable + ArrayOffset;
746239340Sjkim
747239340Sjkim            Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
748239340Sjkim                        SubTable->Length, AcpiDmTableInfoDbg2Addr);
749239340Sjkim            if (ACPI_FAILURE (Status))
750239340Sjkim            {
751239340Sjkim                return;
752239340Sjkim            }
753239340Sjkim        }
754239340Sjkim
755239340Sjkim        /* Dump the AddressSize array */
756239340Sjkim
757239340Sjkim        for (i = 0; i < SubTable->RegisterCount; i++)
758239340Sjkim        {
759239340Sjkim            ArrayOffset = SubTable->AddressSizeOffset +
760239340Sjkim                (sizeof (UINT32) * i);
761239340Sjkim            AbsoluteOffset = Offset + ArrayOffset;
762239340Sjkim            Array = (UINT8 *) SubTable + ArrayOffset;
763239340Sjkim
764239340Sjkim            Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
765239340Sjkim                        SubTable->Length, AcpiDmTableInfoDbg2Size);
766239340Sjkim            if (ACPI_FAILURE (Status))
767239340Sjkim            {
768239340Sjkim                return;
769239340Sjkim            }
770239340Sjkim        }
771239340Sjkim
772239340Sjkim        /* Dump the Namestring (required) */
773239340Sjkim
774239340Sjkim        AcpiOsPrintf ("\n");
775239340Sjkim        ArrayOffset = SubTable->NamepathOffset;
776239340Sjkim        AbsoluteOffset = Offset + ArrayOffset;
777239340Sjkim        Array = (UINT8 *) SubTable + ArrayOffset;
778239340Sjkim
779239340Sjkim        Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
780239340Sjkim                    SubTable->Length, AcpiDmTableInfoDbg2Name);
781239340Sjkim        if (ACPI_FAILURE (Status))
782239340Sjkim        {
783239340Sjkim            return;
784239340Sjkim        }
785239340Sjkim
786239340Sjkim        /* Dump the OemData (optional) */
787239340Sjkim
788239340Sjkim        AcpiDmDumpBuffer (SubTable, SubTable->OemDataOffset, SubTable->OemDataLength,
789239340Sjkim            Offset + SubTable->OemDataOffset, "OEM Data");
790239340Sjkim
791239340Sjkim        /* Point to next sub-table */
792239340Sjkim
793239340Sjkim        Offset += SubTable->Length;
794239340Sjkim        SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable,
795239340Sjkim                    SubTable->Length);
796239340Sjkim    }
797239340Sjkim}
798239340Sjkim
799239340Sjkim
800239340Sjkim/*******************************************************************************
801239340Sjkim *
802167802Sjkim * FUNCTION:    AcpiDmDumpDmar
803167802Sjkim *
804167802Sjkim * PARAMETERS:  Table               - A DMAR table
805167802Sjkim *
806167802Sjkim * RETURN:      None
807167802Sjkim *
808167802Sjkim * DESCRIPTION: Format the contents of a DMAR. This table type consists
809167802Sjkim *              of an open-ended number of subtables.
810167802Sjkim *
811167802Sjkim ******************************************************************************/
812167802Sjkim
813239340Sjkim
814167802Sjkimvoid
815167802SjkimAcpiDmDumpDmar (
816167802Sjkim    ACPI_TABLE_HEADER       *Table)
817167802Sjkim{
818193529Sjkim    ACPI_STATUS             Status;
819167802Sjkim    ACPI_DMAR_HEADER        *SubTable;
820167802Sjkim    UINT32                  Length = Table->Length;
821167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_DMAR);
822167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
823167802Sjkim    ACPI_DMAR_DEVICE_SCOPE  *ScopeTable;
824167802Sjkim    UINT32                  ScopeOffset;
825167802Sjkim    UINT8                   *PciPath;
826167802Sjkim    UINT32                  PathOffset;
827167802Sjkim
828167802Sjkim
829167802Sjkim    /* Main table */
830167802Sjkim
831193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
832193529Sjkim    if (ACPI_FAILURE (Status))
833193529Sjkim    {
834193529Sjkim        return;
835193529Sjkim    }
836167802Sjkim
837167802Sjkim    /* Sub-tables */
838167802Sjkim
839167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
840167802Sjkim    while (Offset < Table->Length)
841167802Sjkim    {
842167802Sjkim        /* Common sub-table header */
843167802Sjkim
844167802Sjkim        AcpiOsPrintf ("\n");
845193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
846193529Sjkim                    SubTable->Length, AcpiDmTableInfoDmarHdr);
847193529Sjkim        if (ACPI_FAILURE (Status))
848193529Sjkim        {
849193529Sjkim            return;
850193529Sjkim        }
851167802Sjkim
852167802Sjkim        switch (SubTable->Type)
853167802Sjkim        {
854167802Sjkim        case ACPI_DMAR_TYPE_HARDWARE_UNIT:
855167802Sjkim            InfoTable = AcpiDmTableInfoDmar0;
856167802Sjkim            ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
857167802Sjkim            break;
858167802Sjkim        case ACPI_DMAR_TYPE_RESERVED_MEMORY:
859167802Sjkim            InfoTable = AcpiDmTableInfoDmar1;
860167802Sjkim            ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
861167802Sjkim            break;
862193529Sjkim        case ACPI_DMAR_TYPE_ATSR:
863193529Sjkim            InfoTable = AcpiDmTableInfoDmar2;
864193529Sjkim            ScopeOffset = sizeof (ACPI_DMAR_ATSR);
865193529Sjkim            break;
866197104Sjkim        case ACPI_DMAR_HARDWARE_AFFINITY:
867197104Sjkim            InfoTable = AcpiDmTableInfoDmar3;
868197104Sjkim            ScopeOffset = sizeof (ACPI_DMAR_RHSA);
869197104Sjkim            break;
870167802Sjkim        default:
871204773Sjkim            AcpiOsPrintf ("\n**** Unknown DMAR sub-table type 0x%X\n\n", SubTable->Type);
872167802Sjkim            return;
873167802Sjkim        }
874167802Sjkim
875193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
876193529Sjkim                    SubTable->Length, InfoTable);
877193529Sjkim        if (ACPI_FAILURE (Status))
878193529Sjkim        {
879193529Sjkim            return;
880193529Sjkim        }
881167802Sjkim
882193529Sjkim        /* Dump the device scope entries (if any) */
883193529Sjkim
884193529Sjkim        ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset);
885193529Sjkim        while (ScopeOffset < SubTable->Length)
886167802Sjkim        {
887193529Sjkim            AcpiOsPrintf ("\n");
888193529Sjkim            Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
889193529Sjkim                        ScopeTable->Length, AcpiDmTableInfoDmarScope);
890193529Sjkim            if (ACPI_FAILURE (Status))
891167802Sjkim            {
892193529Sjkim                return;
893193529Sjkim            }
894167802Sjkim
895193529Sjkim            /* Dump the PCI Path entries for this device scope */
896167802Sjkim
897193529Sjkim            PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
898167802Sjkim
899193529Sjkim            PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
900193529Sjkim                sizeof (ACPI_DMAR_DEVICE_SCOPE));
901167802Sjkim
902193529Sjkim            while (PathOffset < ScopeTable->Length)
903193529Sjkim            {
904193529Sjkim                AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, "PCI Path");
905209746Sjkim                AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
906167802Sjkim
907193529Sjkim                /* Point to next PCI Path entry */
908167802Sjkim
909193529Sjkim                PathOffset += 2;
910193529Sjkim                PciPath += 2;
911193529Sjkim            }
912167802Sjkim
913193529Sjkim            /* Point to next device scope entry */
914167802Sjkim
915193529Sjkim            ScopeOffset += ScopeTable->Length;
916193529Sjkim            ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
917193529Sjkim                ScopeTable, ScopeTable->Length);
918167802Sjkim        }
919167802Sjkim
920167802Sjkim        /* Point to next sub-table */
921167802Sjkim
922167802Sjkim        Offset += SubTable->Length;
923167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, SubTable->Length);
924167802Sjkim    }
925167802Sjkim}
926167802Sjkim
927167802Sjkim
928167802Sjkim/*******************************************************************************
929167802Sjkim *
930193529Sjkim * FUNCTION:    AcpiDmDumpEinj
931193529Sjkim *
932193529Sjkim * PARAMETERS:  Table               - A EINJ table
933193529Sjkim *
934193529Sjkim * RETURN:      None
935193529Sjkim *
936193529Sjkim * DESCRIPTION: Format the contents of a EINJ. This table type consists
937193529Sjkim *              of an open-ended number of subtables.
938193529Sjkim *
939193529Sjkim ******************************************************************************/
940193529Sjkim
941193529Sjkimvoid
942193529SjkimAcpiDmDumpEinj (
943193529Sjkim    ACPI_TABLE_HEADER       *Table)
944193529Sjkim{
945193529Sjkim    ACPI_STATUS             Status;
946193529Sjkim    ACPI_WHEA_HEADER        *SubTable;
947193529Sjkim    UINT32                  Length = Table->Length;
948193529Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_EINJ);
949193529Sjkim
950193529Sjkim
951193529Sjkim    /* Main table */
952193529Sjkim
953193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
954193529Sjkim    if (ACPI_FAILURE (Status))
955193529Sjkim    {
956193529Sjkim        return;
957193529Sjkim    }
958193529Sjkim
959193529Sjkim    /* Sub-tables */
960193529Sjkim
961193529Sjkim    SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
962193529Sjkim    while (Offset < Table->Length)
963193529Sjkim    {
964193529Sjkim        AcpiOsPrintf ("\n");
965193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
966193529Sjkim                    sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
967193529Sjkim        if (ACPI_FAILURE (Status))
968193529Sjkim        {
969193529Sjkim            return;
970193529Sjkim        }
971193529Sjkim
972193529Sjkim        /* Point to next sub-table (each subtable is of fixed length) */
973193529Sjkim
974193529Sjkim        Offset += sizeof (ACPI_WHEA_HEADER);
975193529Sjkim        SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
976193529Sjkim                        sizeof (ACPI_WHEA_HEADER));
977193529Sjkim    }
978193529Sjkim}
979193529Sjkim
980193529Sjkim
981193529Sjkim/*******************************************************************************
982193529Sjkim *
983193529Sjkim * FUNCTION:    AcpiDmDumpErst
984193529Sjkim *
985193529Sjkim * PARAMETERS:  Table               - A ERST table
986193529Sjkim *
987193529Sjkim * RETURN:      None
988193529Sjkim *
989193529Sjkim * DESCRIPTION: Format the contents of a ERST. This table type consists
990193529Sjkim *              of an open-ended number of subtables.
991193529Sjkim *
992193529Sjkim ******************************************************************************/
993193529Sjkim
994193529Sjkimvoid
995193529SjkimAcpiDmDumpErst (
996193529Sjkim    ACPI_TABLE_HEADER       *Table)
997193529Sjkim{
998193529Sjkim    ACPI_STATUS             Status;
999193529Sjkim    ACPI_WHEA_HEADER        *SubTable;
1000193529Sjkim    UINT32                  Length = Table->Length;
1001193529Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_ERST);
1002193529Sjkim
1003193529Sjkim
1004193529Sjkim    /* Main table */
1005193529Sjkim
1006193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
1007193529Sjkim    if (ACPI_FAILURE (Status))
1008193529Sjkim    {
1009193529Sjkim        return;
1010193529Sjkim    }
1011193529Sjkim
1012193529Sjkim    /* Sub-tables */
1013193529Sjkim
1014193529Sjkim    SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1015193529Sjkim    while (Offset < Table->Length)
1016193529Sjkim    {
1017193529Sjkim        AcpiOsPrintf ("\n");
1018193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1019209746Sjkim                    sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
1020193529Sjkim        if (ACPI_FAILURE (Status))
1021193529Sjkim        {
1022193529Sjkim            return;
1023193529Sjkim        }
1024193529Sjkim
1025193529Sjkim        /* Point to next sub-table (each subtable is of fixed length) */
1026193529Sjkim
1027193529Sjkim        Offset += sizeof (ACPI_WHEA_HEADER);
1028193529Sjkim        SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
1029193529Sjkim                        sizeof (ACPI_WHEA_HEADER));
1030193529Sjkim    }
1031193529Sjkim}
1032193529Sjkim
1033193529Sjkim
1034193529Sjkim/*******************************************************************************
1035193529Sjkim *
1036228110Sjkim * FUNCTION:    AcpiDmDumpFpdt
1037228110Sjkim *
1038228110Sjkim * PARAMETERS:  Table               - A FPDT table
1039228110Sjkim *
1040228110Sjkim * RETURN:      None
1041228110Sjkim *
1042228110Sjkim * DESCRIPTION: Format the contents of a FPDT. This table type consists
1043228110Sjkim *              of an open-ended number of subtables.
1044228110Sjkim *
1045228110Sjkim ******************************************************************************/
1046228110Sjkim
1047228110Sjkimvoid
1048228110SjkimAcpiDmDumpFpdt (
1049228110Sjkim    ACPI_TABLE_HEADER       *Table)
1050228110Sjkim{
1051228110Sjkim    ACPI_STATUS             Status;
1052228110Sjkim    ACPI_FPDT_HEADER        *SubTable;
1053228110Sjkim    UINT32                  Length = Table->Length;
1054228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
1055228110Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1056228110Sjkim
1057228110Sjkim
1058228110Sjkim    /* There is no main table (other than the standard ACPI header) */
1059228110Sjkim
1060228110Sjkim    /* Sub-tables */
1061228110Sjkim
1062228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
1063228110Sjkim    while (Offset < Table->Length)
1064228110Sjkim    {
1065228110Sjkim        /* Common sub-table header */
1066228110Sjkim
1067228110Sjkim        AcpiOsPrintf ("\n");
1068228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1069228110Sjkim                    SubTable->Length, AcpiDmTableInfoFpdtHdr);
1070228110Sjkim        if (ACPI_FAILURE (Status))
1071228110Sjkim        {
1072228110Sjkim            return;
1073228110Sjkim        }
1074228110Sjkim
1075228110Sjkim        switch (SubTable->Type)
1076228110Sjkim        {
1077228110Sjkim        case ACPI_FPDT_TYPE_BOOT:
1078228110Sjkim            InfoTable = AcpiDmTableInfoFpdt0;
1079228110Sjkim            break;
1080228110Sjkim        case ACPI_FPDT_TYPE_S3PERF:
1081228110Sjkim            InfoTable = AcpiDmTableInfoFpdt1;
1082228110Sjkim            break;
1083228110Sjkim        default:
1084228110Sjkim            AcpiOsPrintf ("\n**** Unknown FPDT sub-table type 0x%X\n\n", SubTable->Type);
1085228110Sjkim
1086228110Sjkim            /* Attempt to continue */
1087228110Sjkim
1088228110Sjkim            if (!SubTable->Length)
1089228110Sjkim            {
1090228110Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
1091228110Sjkim                return;
1092228110Sjkim            }
1093228110Sjkim            goto NextSubTable;
1094228110Sjkim        }
1095228110Sjkim
1096228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1097228110Sjkim                    SubTable->Length, InfoTable);
1098228110Sjkim        if (ACPI_FAILURE (Status))
1099228110Sjkim        {
1100228110Sjkim            return;
1101228110Sjkim        }
1102228110Sjkim
1103228110SjkimNextSubTable:
1104228110Sjkim        /* Point to next sub-table */
1105228110Sjkim
1106228110Sjkim        Offset += SubTable->Length;
1107228110Sjkim        SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length);
1108228110Sjkim    }
1109228110Sjkim}
1110228110Sjkim
1111228110Sjkim
1112228110Sjkim/*******************************************************************************
1113228110Sjkim *
1114193529Sjkim * FUNCTION:    AcpiDmDumpHest
1115193529Sjkim *
1116193529Sjkim * PARAMETERS:  Table               - A HEST table
1117193529Sjkim *
1118193529Sjkim * RETURN:      None
1119193529Sjkim *
1120193529Sjkim * DESCRIPTION: Format the contents of a HEST. This table type consists
1121193529Sjkim *              of an open-ended number of subtables.
1122193529Sjkim *
1123193529Sjkim ******************************************************************************/
1124193529Sjkim
1125193529Sjkimvoid
1126193529SjkimAcpiDmDumpHest (
1127193529Sjkim    ACPI_TABLE_HEADER       *Table)
1128193529Sjkim{
1129193529Sjkim    ACPI_STATUS             Status;
1130193529Sjkim    ACPI_HEST_HEADER        *SubTable;
1131193529Sjkim    UINT32                  Length = Table->Length;
1132193529Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_HEST);
1133193529Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1134193529Sjkim    UINT32                  SubTableLength;
1135197104Sjkim    UINT32                  BankCount;
1136197104Sjkim    ACPI_HEST_IA_ERROR_BANK *BankTable;
1137193529Sjkim
1138193529Sjkim
1139193529Sjkim    /* Main table */
1140193529Sjkim
1141193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
1142193529Sjkim    if (ACPI_FAILURE (Status))
1143193529Sjkim    {
1144193529Sjkim        return;
1145193529Sjkim    }
1146193529Sjkim
1147193529Sjkim    /* Sub-tables */
1148193529Sjkim
1149193529Sjkim    SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
1150193529Sjkim    while (Offset < Table->Length)
1151193529Sjkim    {
1152197104Sjkim        BankCount = 0;
1153193529Sjkim        switch (SubTable->Type)
1154193529Sjkim        {
1155197104Sjkim        case ACPI_HEST_TYPE_IA32_CHECK:
1156193529Sjkim            InfoTable = AcpiDmTableInfoHest0;
1157197104Sjkim            SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
1158197104Sjkim            BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1159197104Sjkim                            SubTable))->NumHardwareBanks;
1160193529Sjkim            break;
1161193529Sjkim
1162197104Sjkim        case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1163193529Sjkim            InfoTable = AcpiDmTableInfoHest1;
1164197104Sjkim            SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED);
1165197104Sjkim            BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1166197104Sjkim                            SubTable))->NumHardwareBanks;
1167193529Sjkim            break;
1168193529Sjkim
1169197104Sjkim        case ACPI_HEST_TYPE_IA32_NMI:
1170197104Sjkim            InfoTable = AcpiDmTableInfoHest2;
1171197104Sjkim            SubTableLength = sizeof (ACPI_HEST_IA_NMI);
1172193529Sjkim            break;
1173193529Sjkim
1174193529Sjkim        case ACPI_HEST_TYPE_AER_ROOT_PORT:
1175193529Sjkim            InfoTable = AcpiDmTableInfoHest6;
1176193529Sjkim            SubTableLength = sizeof (ACPI_HEST_AER_ROOT);
1177193529Sjkim            break;
1178193529Sjkim
1179193529Sjkim        case ACPI_HEST_TYPE_AER_ENDPOINT:
1180193529Sjkim            InfoTable = AcpiDmTableInfoHest7;
1181193529Sjkim            SubTableLength = sizeof (ACPI_HEST_AER);
1182193529Sjkim            break;
1183193529Sjkim
1184193529Sjkim        case ACPI_HEST_TYPE_AER_BRIDGE:
1185193529Sjkim            InfoTable = AcpiDmTableInfoHest8;
1186193529Sjkim            SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE);
1187193529Sjkim            break;
1188193529Sjkim
1189197104Sjkim        case ACPI_HEST_TYPE_GENERIC_ERROR:
1190193529Sjkim            InfoTable = AcpiDmTableInfoHest9;
1191193529Sjkim            SubTableLength = sizeof (ACPI_HEST_GENERIC);
1192193529Sjkim            break;
1193193529Sjkim
1194193529Sjkim        default:
1195193529Sjkim            /* Cannot continue on unknown type - no length */
1196193529Sjkim
1197204773Sjkim            AcpiOsPrintf ("\n**** Unknown HEST sub-table type 0x%X\n", SubTable->Type);
1198193529Sjkim            return;
1199193529Sjkim        }
1200193529Sjkim
1201193529Sjkim        AcpiOsPrintf ("\n");
1202193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1203193529Sjkim                    SubTableLength, InfoTable);
1204193529Sjkim        if (ACPI_FAILURE (Status))
1205193529Sjkim        {
1206193529Sjkim            return;
1207193529Sjkim        }
1208193529Sjkim
1209197104Sjkim        /* Point to end of current subtable (each subtable above is of fixed length) */
1210193529Sjkim
1211193529Sjkim        Offset += SubTableLength;
1212197104Sjkim
1213197104Sjkim        /* If there are any (fixed-length) Error Banks from above, dump them now */
1214197104Sjkim
1215197104Sjkim        if (BankCount)
1216197104Sjkim        {
1217197104Sjkim            BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, SubTableLength);
1218197104Sjkim            SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
1219197104Sjkim
1220197104Sjkim            while (BankCount)
1221197104Sjkim            {
1222197104Sjkim                AcpiOsPrintf ("\n");
1223197104Sjkim                Status = AcpiDmDumpTable (Length, Offset, BankTable,
1224197104Sjkim                            sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
1225197104Sjkim                if (ACPI_FAILURE (Status))
1226197104Sjkim                {
1227197104Sjkim                    return;
1228197104Sjkim                }
1229197104Sjkim                Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
1230197104Sjkim                BankTable++;
1231197104Sjkim                BankCount--;
1232197104Sjkim            }
1233197104Sjkim        }
1234197104Sjkim
1235197104Sjkim        /* Point to next sub-table */
1236197104Sjkim
1237193529Sjkim        SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength);
1238193529Sjkim    }
1239193529Sjkim}
1240193529Sjkim
1241193529Sjkim
1242193529Sjkim/*******************************************************************************
1243193529Sjkim *
1244197104Sjkim * FUNCTION:    AcpiDmDumpIvrs
1245197104Sjkim *
1246197104Sjkim * PARAMETERS:  Table               - A IVRS table
1247197104Sjkim *
1248197104Sjkim * RETURN:      None
1249197104Sjkim *
1250197104Sjkim * DESCRIPTION: Format the contents of a IVRS
1251197104Sjkim *
1252197104Sjkim ******************************************************************************/
1253197104Sjkim
1254197104Sjkimstatic UINT8 EntrySizes[] = {4,8,16,32};
1255197104Sjkim
1256197104Sjkimvoid
1257197104SjkimAcpiDmDumpIvrs (
1258197104Sjkim    ACPI_TABLE_HEADER       *Table)
1259197104Sjkim{
1260197104Sjkim    ACPI_STATUS             Status;
1261197104Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_IVRS);
1262197104Sjkim    UINT32                  EntryOffset;
1263197104Sjkim    UINT32                  EntryLength;
1264197104Sjkim    UINT32                  EntryType;
1265197104Sjkim    ACPI_IVRS_DE_HEADER     *DeviceEntry;
1266197104Sjkim    ACPI_IVRS_HEADER        *SubTable;
1267197104Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1268197104Sjkim
1269197104Sjkim
1270197104Sjkim    /* Main table */
1271197104Sjkim
1272197104Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
1273197104Sjkim    if (ACPI_FAILURE (Status))
1274197104Sjkim    {
1275197104Sjkim        return;
1276197104Sjkim    }
1277197104Sjkim
1278197104Sjkim    /* Sub-tables */
1279197104Sjkim
1280197104Sjkim    SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
1281197104Sjkim    while (Offset < Table->Length)
1282197104Sjkim    {
1283197104Sjkim        /* Common sub-table header */
1284197104Sjkim
1285197104Sjkim        AcpiOsPrintf ("\n");
1286197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1287197104Sjkim                    SubTable->Length, AcpiDmTableInfoIvrsHdr);
1288197104Sjkim        if (ACPI_FAILURE (Status))
1289197104Sjkim        {
1290197104Sjkim            return;
1291197104Sjkim        }
1292197104Sjkim
1293197104Sjkim        switch (SubTable->Type)
1294197104Sjkim        {
1295197104Sjkim        case ACPI_IVRS_TYPE_HARDWARE:
1296197104Sjkim            InfoTable = AcpiDmTableInfoIvrs0;
1297197104Sjkim            break;
1298197104Sjkim        case ACPI_IVRS_TYPE_MEMORY1:
1299197104Sjkim        case ACPI_IVRS_TYPE_MEMORY2:
1300197104Sjkim        case ACPI_IVRS_TYPE_MEMORY3:
1301197104Sjkim            InfoTable = AcpiDmTableInfoIvrs1;
1302197104Sjkim            break;
1303197104Sjkim        default:
1304204773Sjkim            AcpiOsPrintf ("\n**** Unknown IVRS sub-table type 0x%X\n",
1305197104Sjkim                SubTable->Type);
1306197104Sjkim
1307197104Sjkim            /* Attempt to continue */
1308197104Sjkim
1309197104Sjkim            if (!SubTable->Length)
1310197104Sjkim            {
1311197104Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
1312197104Sjkim                return;
1313197104Sjkim            }
1314197104Sjkim            goto NextSubTable;
1315197104Sjkim        }
1316197104Sjkim
1317197104Sjkim        /* Dump the subtable */
1318197104Sjkim
1319197104Sjkim        AcpiOsPrintf ("\n");
1320197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1321197104Sjkim                    SubTable->Length, InfoTable);
1322197104Sjkim        if (ACPI_FAILURE (Status))
1323197104Sjkim        {
1324197104Sjkim            return;
1325197104Sjkim        }
1326197104Sjkim
1327197104Sjkim        /* The hardware subtable can contain multiple device entries */
1328197104Sjkim
1329197104Sjkim        if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE)
1330197104Sjkim        {
1331197104Sjkim            EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE);
1332197104Sjkim            DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable,
1333197104Sjkim                            sizeof (ACPI_IVRS_HARDWARE));
1334197104Sjkim
1335197104Sjkim            while (EntryOffset < (Offset + SubTable->Length))
1336197104Sjkim            {
1337197104Sjkim                AcpiOsPrintf ("\n");
1338197104Sjkim                /*
1339197104Sjkim                 * Upper 2 bits of Type encode the length of the device entry
1340197104Sjkim                 *
1341197104Sjkim                 * 00 = 4 byte
1342197104Sjkim                 * 01 = 8 byte
1343197104Sjkim                 * 10 = 16 byte - currently no entries defined
1344197104Sjkim                 * 11 = 32 byte - currently no entries defined
1345197104Sjkim                 */
1346197104Sjkim                EntryType = DeviceEntry->Type;
1347197104Sjkim                EntryLength = EntrySizes [EntryType >> 6];
1348197104Sjkim
1349197104Sjkim                switch (EntryType)
1350197104Sjkim                {
1351197104Sjkim                /* 4-byte device entries */
1352197104Sjkim
1353197104Sjkim                case ACPI_IVRS_TYPE_PAD4:
1354197104Sjkim                case ACPI_IVRS_TYPE_ALL:
1355197104Sjkim                case ACPI_IVRS_TYPE_SELECT:
1356197104Sjkim                case ACPI_IVRS_TYPE_START:
1357197104Sjkim                case ACPI_IVRS_TYPE_END:
1358197104Sjkim
1359197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs4;
1360197104Sjkim                    break;
1361197104Sjkim
1362197104Sjkim                /* 8-byte entries, type A */
1363197104Sjkim
1364197104Sjkim                case ACPI_IVRS_TYPE_ALIAS_SELECT:
1365197104Sjkim                case ACPI_IVRS_TYPE_ALIAS_START:
1366197104Sjkim
1367197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs8a;
1368197104Sjkim                    break;
1369197104Sjkim
1370197104Sjkim                /* 8-byte entries, type B */
1371197104Sjkim
1372197104Sjkim                case ACPI_IVRS_TYPE_PAD8:
1373197104Sjkim                case ACPI_IVRS_TYPE_EXT_SELECT:
1374197104Sjkim                case ACPI_IVRS_TYPE_EXT_START:
1375197104Sjkim
1376197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs8b;
1377197104Sjkim                    break;
1378197104Sjkim
1379197104Sjkim                /* 8-byte entries, type C */
1380197104Sjkim
1381197104Sjkim                case ACPI_IVRS_TYPE_SPECIAL:
1382197104Sjkim
1383197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs8c;
1384197104Sjkim                    break;
1385197104Sjkim
1386197104Sjkim                default:
1387197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs4;
1388197104Sjkim                    AcpiOsPrintf (
1389197104Sjkim                        "\n**** Unknown IVRS device entry type/length: "
1390204773Sjkim                        "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
1391197104Sjkim                        EntryType, EntryLength, EntryOffset);
1392197104Sjkim                    break;
1393197104Sjkim                }
1394197104Sjkim
1395197104Sjkim                /* Dump the Device Entry */
1396197104Sjkim
1397197104Sjkim                Status = AcpiDmDumpTable (Table->Length, EntryOffset,
1398197104Sjkim                            DeviceEntry, EntryLength, InfoTable);
1399197104Sjkim
1400197104Sjkim                EntryOffset += EntryLength;
1401197104Sjkim                DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
1402197104Sjkim                                EntryLength);
1403197104Sjkim            }
1404197104Sjkim        }
1405197104Sjkim
1406197104SjkimNextSubTable:
1407197104Sjkim        /* Point to next sub-table */
1408197104Sjkim
1409197104Sjkim        Offset += SubTable->Length;
1410197104Sjkim        SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length);
1411197104Sjkim    }
1412197104Sjkim}
1413197104Sjkim
1414197104Sjkim
1415197104Sjkim/*******************************************************************************
1416197104Sjkim *
1417167802Sjkim * FUNCTION:    AcpiDmDumpMadt
1418167802Sjkim *
1419167802Sjkim * PARAMETERS:  Table               - A MADT table
1420167802Sjkim *
1421167802Sjkim * RETURN:      None
1422167802Sjkim *
1423167802Sjkim * DESCRIPTION: Format the contents of a MADT. This table type consists
1424167802Sjkim *              of an open-ended number of subtables.
1425167802Sjkim *
1426167802Sjkim ******************************************************************************/
1427167802Sjkim
1428167802Sjkimvoid
1429167802SjkimAcpiDmDumpMadt (
1430167802Sjkim    ACPI_TABLE_HEADER       *Table)
1431167802Sjkim{
1432193529Sjkim    ACPI_STATUS             Status;
1433167802Sjkim    ACPI_SUBTABLE_HEADER    *SubTable;
1434167802Sjkim    UINT32                  Length = Table->Length;
1435167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MADT);
1436167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1437167802Sjkim
1438167802Sjkim
1439167802Sjkim    /* Main table */
1440167802Sjkim
1441193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
1442193529Sjkim    if (ACPI_FAILURE (Status))
1443193529Sjkim    {
1444193529Sjkim        return;
1445193529Sjkim    }
1446167802Sjkim
1447167802Sjkim    /* Sub-tables */
1448167802Sjkim
1449167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
1450167802Sjkim    while (Offset < Table->Length)
1451167802Sjkim    {
1452167802Sjkim        /* Common sub-table header */
1453167802Sjkim
1454167802Sjkim        AcpiOsPrintf ("\n");
1455193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1456193529Sjkim                    SubTable->Length, AcpiDmTableInfoMadtHdr);
1457193529Sjkim        if (ACPI_FAILURE (Status))
1458193529Sjkim        {
1459193529Sjkim            return;
1460193529Sjkim        }
1461167802Sjkim
1462167802Sjkim        switch (SubTable->Type)
1463167802Sjkim        {
1464167802Sjkim        case ACPI_MADT_TYPE_LOCAL_APIC:
1465167802Sjkim            InfoTable = AcpiDmTableInfoMadt0;
1466167802Sjkim            break;
1467167802Sjkim        case ACPI_MADT_TYPE_IO_APIC:
1468167802Sjkim            InfoTable = AcpiDmTableInfoMadt1;
1469167802Sjkim            break;
1470167802Sjkim        case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
1471167802Sjkim            InfoTable = AcpiDmTableInfoMadt2;
1472167802Sjkim            break;
1473167802Sjkim        case ACPI_MADT_TYPE_NMI_SOURCE:
1474167802Sjkim            InfoTable = AcpiDmTableInfoMadt3;
1475167802Sjkim            break;
1476167802Sjkim        case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
1477167802Sjkim            InfoTable = AcpiDmTableInfoMadt4;
1478167802Sjkim            break;
1479167802Sjkim        case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
1480167802Sjkim            InfoTable = AcpiDmTableInfoMadt5;
1481167802Sjkim            break;
1482167802Sjkim        case ACPI_MADT_TYPE_IO_SAPIC:
1483167802Sjkim            InfoTable = AcpiDmTableInfoMadt6;
1484167802Sjkim            break;
1485167802Sjkim        case ACPI_MADT_TYPE_LOCAL_SAPIC:
1486167802Sjkim            InfoTable = AcpiDmTableInfoMadt7;
1487167802Sjkim            break;
1488167802Sjkim        case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
1489167802Sjkim            InfoTable = AcpiDmTableInfoMadt8;
1490167802Sjkim            break;
1491193529Sjkim        case ACPI_MADT_TYPE_LOCAL_X2APIC:
1492193529Sjkim            InfoTable = AcpiDmTableInfoMadt9;
1493193529Sjkim            break;
1494193529Sjkim        case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
1495193529Sjkim            InfoTable = AcpiDmTableInfoMadt10;
1496193529Sjkim            break;
1497228110Sjkim        case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
1498228110Sjkim            InfoTable = AcpiDmTableInfoMadt11;
1499228110Sjkim            break;
1500228110Sjkim        case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
1501228110Sjkim            InfoTable = AcpiDmTableInfoMadt12;
1502228110Sjkim            break;
1503167802Sjkim        default:
1504204773Sjkim            AcpiOsPrintf ("\n**** Unknown MADT sub-table type 0x%X\n\n", SubTable->Type);
1505193529Sjkim
1506193529Sjkim            /* Attempt to continue */
1507193529Sjkim
1508193529Sjkim            if (!SubTable->Length)
1509193529Sjkim            {
1510193529Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
1511193529Sjkim                return;
1512193529Sjkim            }
1513193529Sjkim            goto NextSubTable;
1514193529Sjkim        }
1515193529Sjkim
1516193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1517193529Sjkim                    SubTable->Length, InfoTable);
1518193529Sjkim        if (ACPI_FAILURE (Status))
1519193529Sjkim        {
1520167802Sjkim            return;
1521167802Sjkim        }
1522167802Sjkim
1523193529SjkimNextSubTable:
1524167802Sjkim        /* Point to next sub-table */
1525167802Sjkim
1526167802Sjkim        Offset += SubTable->Length;
1527167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
1528167802Sjkim    }
1529167802Sjkim}
1530167802Sjkim
1531167802Sjkim
1532167802Sjkim/*******************************************************************************
1533167802Sjkim *
1534167802Sjkim * FUNCTION:    AcpiDmDumpMcfg
1535167802Sjkim *
1536167802Sjkim * PARAMETERS:  Table               - A MCFG Table
1537167802Sjkim *
1538167802Sjkim * RETURN:      None
1539167802Sjkim *
1540167802Sjkim * DESCRIPTION: Format the contents of a MCFG table
1541167802Sjkim *
1542167802Sjkim ******************************************************************************/
1543167802Sjkim
1544167802Sjkimvoid
1545167802SjkimAcpiDmDumpMcfg (
1546167802Sjkim    ACPI_TABLE_HEADER       *Table)
1547167802Sjkim{
1548193529Sjkim    ACPI_STATUS             Status;
1549167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MCFG);
1550167802Sjkim    ACPI_MCFG_ALLOCATION    *SubTable;
1551167802Sjkim
1552167802Sjkim
1553167802Sjkim    /* Main table */
1554167802Sjkim
1555193529Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
1556193529Sjkim    if (ACPI_FAILURE (Status))
1557193529Sjkim    {
1558193529Sjkim        return;
1559193529Sjkim    }
1560167802Sjkim
1561167802Sjkim    /* Sub-tables */
1562167802Sjkim
1563167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
1564167802Sjkim    while (Offset < Table->Length)
1565167802Sjkim    {
1566167802Sjkim        if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
1567167802Sjkim        {
1568209746Sjkim            AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
1569167802Sjkim                sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
1570167802Sjkim            return;
1571167802Sjkim        }
1572167802Sjkim
1573167802Sjkim        AcpiOsPrintf ("\n");
1574193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1575193529Sjkim                    sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
1576193529Sjkim        if (ACPI_FAILURE (Status))
1577193529Sjkim        {
1578193529Sjkim            return;
1579193529Sjkim        }
1580167802Sjkim
1581167802Sjkim        /* Point to next sub-table (each subtable is of fixed length) */
1582167802Sjkim
1583167802Sjkim        Offset += sizeof (ACPI_MCFG_ALLOCATION);
1584167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable,
1585167802Sjkim                        sizeof (ACPI_MCFG_ALLOCATION));
1586167802Sjkim    }
1587167802Sjkim}
1588167802Sjkim
1589167802Sjkim
1590167802Sjkim/*******************************************************************************
1591167802Sjkim *
1592228110Sjkim * FUNCTION:    AcpiDmDumpMpst
1593228110Sjkim *
1594228110Sjkim * PARAMETERS:  Table               - A MPST Table
1595228110Sjkim *
1596228110Sjkim * RETURN:      None
1597228110Sjkim *
1598228110Sjkim * DESCRIPTION: Format the contents of a MPST table
1599228110Sjkim *
1600228110Sjkim ******************************************************************************/
1601228110Sjkim
1602228110Sjkimvoid
1603228110SjkimAcpiDmDumpMpst (
1604228110Sjkim    ACPI_TABLE_HEADER       *Table)
1605228110Sjkim{
1606228110Sjkim    ACPI_STATUS             Status;
1607228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MPST);
1608228110Sjkim    ACPI_MPST_POWER_NODE    *SubTable0;
1609228110Sjkim    ACPI_MPST_POWER_STATE   *SubTable0A;
1610228110Sjkim    ACPI_MPST_COMPONENT     *SubTable0B;
1611228110Sjkim    ACPI_MPST_DATA_HDR      *SubTable1;
1612228110Sjkim    ACPI_MPST_POWER_DATA    *SubTable2;
1613228110Sjkim    UINT16                  SubtableCount;
1614241973Sjkim    UINT32                  PowerStateCount;
1615241973Sjkim    UINT32                  ComponentCount;
1616228110Sjkim
1617228110Sjkim
1618228110Sjkim    /* Main table */
1619228110Sjkim
1620228110Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
1621228110Sjkim    if (ACPI_FAILURE (Status))
1622228110Sjkim    {
1623228110Sjkim        return;
1624228110Sjkim    }
1625228110Sjkim
1626228110Sjkim    /* Subtable: Memory Power Node(s) */
1627228110Sjkim
1628228110Sjkim    SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
1629228110Sjkim    SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
1630228110Sjkim
1631228110Sjkim    while ((Offset < Table->Length) && SubtableCount)
1632228110Sjkim    {
1633228110Sjkim        AcpiOsPrintf ("\n");
1634228110Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0,
1635228110Sjkim                    sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
1636228110Sjkim        if (ACPI_FAILURE (Status))
1637228110Sjkim        {
1638228110Sjkim            return;
1639228110Sjkim        }
1640228110Sjkim
1641228110Sjkim        /* Extract the sub-subtable counts */
1642228110Sjkim
1643228110Sjkim        PowerStateCount = SubTable0->NumPowerStates;
1644228110Sjkim        ComponentCount = SubTable0->NumPhysicalComponents;
1645228110Sjkim        Offset += sizeof (ACPI_MPST_POWER_NODE);
1646228110Sjkim
1647228110Sjkim        /* Sub-subtables - Memory Power State Structure(s) */
1648228110Sjkim
1649228110Sjkim        SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0,
1650228110Sjkim            sizeof (ACPI_MPST_POWER_NODE));
1651228110Sjkim
1652228110Sjkim        while (PowerStateCount)
1653228110Sjkim        {
1654228110Sjkim            AcpiOsPrintf ("\n");
1655228110Sjkim            Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A,
1656228110Sjkim                        sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
1657228110Sjkim            if (ACPI_FAILURE (Status))
1658228110Sjkim            {
1659228110Sjkim                return;
1660228110Sjkim            }
1661228110Sjkim
1662228110Sjkim            SubTable0A++;
1663228110Sjkim            PowerStateCount--;
1664228110Sjkim            Offset += sizeof (ACPI_MPST_POWER_STATE);
1665228110Sjkim       }
1666228110Sjkim
1667228110Sjkim        /* Sub-subtables - Physical Component ID Structure(s) */
1668228110Sjkim
1669228110Sjkim        SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A);
1670228110Sjkim
1671228110Sjkim        if (ComponentCount)
1672228110Sjkim        {
1673228110Sjkim            AcpiOsPrintf ("\n");
1674228110Sjkim        }
1675228110Sjkim
1676228110Sjkim        while (ComponentCount)
1677228110Sjkim        {
1678228110Sjkim            Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B,
1679228110Sjkim                        sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
1680228110Sjkim            if (ACPI_FAILURE (Status))
1681228110Sjkim            {
1682228110Sjkim                return;
1683228110Sjkim            }
1684228110Sjkim
1685228110Sjkim            SubTable0B++;
1686228110Sjkim            ComponentCount--;
1687228110Sjkim            Offset += sizeof (ACPI_MPST_COMPONENT);
1688228110Sjkim        }
1689228110Sjkim
1690228110Sjkim        /* Point to next Memory Power Node subtable */
1691228110Sjkim
1692228110Sjkim        SubtableCount--;
1693228110Sjkim        SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0,
1694228110Sjkim            sizeof (ACPI_MPST_POWER_NODE) +
1695228110Sjkim            (sizeof (ACPI_MPST_POWER_STATE) * SubTable0->NumPowerStates) +
1696228110Sjkim            (sizeof (ACPI_MPST_COMPONENT) * SubTable0->NumPhysicalComponents));
1697228110Sjkim    }
1698228110Sjkim
1699228110Sjkim    /* Subtable: Count of Memory Power State Characteristic structures */
1700228110Sjkim
1701228110Sjkim    AcpiOsPrintf ("\n");
1702228110Sjkim    SubTable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, SubTable0);
1703228110Sjkim    Status = AcpiDmDumpTable (Table->Length, Offset, SubTable1,
1704228110Sjkim                sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
1705228110Sjkim    if (ACPI_FAILURE (Status))
1706228110Sjkim    {
1707228110Sjkim        return;
1708228110Sjkim    }
1709228110Sjkim
1710228110Sjkim    SubtableCount = SubTable1->CharacteristicsCount;
1711228110Sjkim    Offset += sizeof (ACPI_MPST_DATA_HDR);
1712228110Sjkim
1713228110Sjkim    /* Subtable: Memory Power State Characteristics structure(s) */
1714228110Sjkim
1715228110Sjkim    SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1, sizeof (ACPI_MPST_DATA_HDR));
1716228110Sjkim
1717228110Sjkim    while ((Offset < Table->Length) && SubtableCount)
1718228110Sjkim    {
1719228110Sjkim        AcpiOsPrintf ("\n");
1720228110Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2,
1721228110Sjkim                    sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
1722228110Sjkim        if (ACPI_FAILURE (Status))
1723228110Sjkim        {
1724228110Sjkim            return;
1725228110Sjkim        }
1726228110Sjkim
1727228110Sjkim        SubTable2++;
1728228110Sjkim        SubtableCount--;
1729228110Sjkim        Offset += sizeof (ACPI_MPST_POWER_DATA);
1730228110Sjkim    }
1731228110Sjkim}
1732228110Sjkim
1733228110Sjkim
1734228110Sjkim/*******************************************************************************
1735228110Sjkim *
1736197104Sjkim * FUNCTION:    AcpiDmDumpMsct
1737197104Sjkim *
1738197104Sjkim * PARAMETERS:  Table               - A MSCT table
1739197104Sjkim *
1740197104Sjkim * RETURN:      None
1741197104Sjkim *
1742197104Sjkim * DESCRIPTION: Format the contents of a MSCT
1743197104Sjkim *
1744197104Sjkim ******************************************************************************/
1745197104Sjkim
1746197104Sjkimvoid
1747197104SjkimAcpiDmDumpMsct (
1748197104Sjkim    ACPI_TABLE_HEADER       *Table)
1749197104Sjkim{
1750197104Sjkim    ACPI_STATUS             Status;
1751197104Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MSCT);
1752197104Sjkim    ACPI_MSCT_PROXIMITY     *SubTable;
1753197104Sjkim
1754197104Sjkim
1755197104Sjkim    /* Main table */
1756197104Sjkim
1757197104Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
1758197104Sjkim    if (ACPI_FAILURE (Status))
1759197104Sjkim    {
1760197104Sjkim        return;
1761197104Sjkim    }
1762197104Sjkim
1763197104Sjkim    /* Sub-tables */
1764197104Sjkim
1765197104Sjkim    SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
1766197104Sjkim    while (Offset < Table->Length)
1767197104Sjkim    {
1768197104Sjkim        /* Common sub-table header */
1769197104Sjkim
1770197104Sjkim        AcpiOsPrintf ("\n");
1771197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1772197104Sjkim                    sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
1773197104Sjkim        if (ACPI_FAILURE (Status))
1774197104Sjkim        {
1775197104Sjkim            return;
1776197104Sjkim        }
1777197104Sjkim
1778197104Sjkim        /* Point to next sub-table */
1779197104Sjkim
1780197104Sjkim        Offset += sizeof (ACPI_MSCT_PROXIMITY);
1781197104Sjkim        SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable, sizeof (ACPI_MSCT_PROXIMITY));
1782197104Sjkim    }
1783197104Sjkim}
1784197104Sjkim
1785197104Sjkim
1786197104Sjkim/*******************************************************************************
1787197104Sjkim *
1788228110Sjkim * FUNCTION:    AcpiDmDumpPcct
1789228110Sjkim *
1790228110Sjkim * PARAMETERS:  Table               - A PCCT table
1791228110Sjkim *
1792228110Sjkim * RETURN:      None
1793228110Sjkim *
1794228110Sjkim * DESCRIPTION: Format the contents of a PCCT. This table type consists
1795228110Sjkim *              of an open-ended number of subtables.
1796228110Sjkim *
1797228110Sjkim ******************************************************************************/
1798228110Sjkim
1799228110Sjkimvoid
1800228110SjkimAcpiDmDumpPcct (
1801228110Sjkim    ACPI_TABLE_HEADER       *Table)
1802228110Sjkim{
1803228110Sjkim    ACPI_STATUS             Status;
1804228110Sjkim    ACPI_PCCT_SUBSPACE      *SubTable;
1805228110Sjkim    UINT32                  Length = Table->Length;
1806228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_PCCT);
1807228110Sjkim
1808228110Sjkim
1809228110Sjkim    /* Main table */
1810228110Sjkim
1811228110Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
1812228110Sjkim    if (ACPI_FAILURE (Status))
1813228110Sjkim    {
1814228110Sjkim        return;
1815228110Sjkim    }
1816228110Sjkim
1817228110Sjkim    /* Sub-tables */
1818228110Sjkim
1819228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
1820228110Sjkim    while (Offset < Table->Length)
1821228110Sjkim    {
1822228110Sjkim        AcpiOsPrintf ("\n");
1823228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1824228110Sjkim                    SubTable->Header.Length, AcpiDmTableInfoPcct0);
1825228110Sjkim        if (ACPI_FAILURE (Status))
1826228110Sjkim        {
1827228110Sjkim            return;
1828228110Sjkim        }
1829228110Sjkim
1830228110Sjkim        /* Point to next sub-table */
1831228110Sjkim
1832228110Sjkim        Offset += SubTable->Header.Length;
1833228110Sjkim        SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable,
1834228110Sjkim                    SubTable->Header.Length);
1835228110Sjkim    }
1836228110Sjkim}
1837228110Sjkim
1838228110Sjkim
1839228110Sjkim/*******************************************************************************
1840228110Sjkim *
1841228110Sjkim * FUNCTION:    AcpiDmDumpPmtt
1842228110Sjkim *
1843228110Sjkim * PARAMETERS:  Table               - A PMTT table
1844228110Sjkim *
1845228110Sjkim * RETURN:      None
1846228110Sjkim *
1847228110Sjkim * DESCRIPTION: Format the contents of a PMTT. This table type consists
1848228110Sjkim *              of an open-ended number of subtables.
1849228110Sjkim *
1850228110Sjkim ******************************************************************************/
1851228110Sjkim
1852228110Sjkimvoid
1853228110SjkimAcpiDmDumpPmtt (
1854228110Sjkim    ACPI_TABLE_HEADER       *Table)
1855228110Sjkim{
1856228110Sjkim    ACPI_STATUS             Status;
1857228110Sjkim    ACPI_PMTT_HEADER        *SubTable;
1858228110Sjkim    ACPI_PMTT_HEADER        *MemSubTable;
1859228110Sjkim    ACPI_PMTT_HEADER        *DimmSubTable;
1860228110Sjkim    ACPI_PMTT_DOMAIN        *DomainArray;
1861228110Sjkim    UINT32                  Length = Table->Length;
1862228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
1863228110Sjkim    UINT32                  MemOffset;
1864228110Sjkim    UINT32                  DimmOffset;
1865228110Sjkim    UINT32                  DomainOffset;
1866228110Sjkim    UINT32                  DomainCount;
1867228110Sjkim
1868228110Sjkim
1869228110Sjkim    /* Main table */
1870228110Sjkim
1871228110Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
1872228110Sjkim    if (ACPI_FAILURE (Status))
1873228110Sjkim    {
1874228110Sjkim        return;
1875228110Sjkim    }
1876228110Sjkim
1877228110Sjkim    /* Subtables */
1878228110Sjkim
1879228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
1880228110Sjkim    while (Offset < Table->Length)
1881228110Sjkim    {
1882228110Sjkim        /* Common subtable header */
1883228110Sjkim
1884228110Sjkim        AcpiOsPrintf ("\n");
1885228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1886228110Sjkim                    SubTable->Length, AcpiDmTableInfoPmttHdr);
1887228110Sjkim        if (ACPI_FAILURE (Status))
1888228110Sjkim        {
1889228110Sjkim            return;
1890228110Sjkim        }
1891228110Sjkim
1892228110Sjkim        /* Only Socket subtables are expected at this level */
1893228110Sjkim
1894228110Sjkim        if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET)
1895228110Sjkim        {
1896228110Sjkim            AcpiOsPrintf (
1897228110Sjkim                "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
1898228110Sjkim                SubTable->Type);
1899228110Sjkim            return;
1900228110Sjkim        }
1901228110Sjkim
1902228110Sjkim        /* Dump the fixed-length portion of the subtable */
1903228110Sjkim
1904228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1905228110Sjkim                    SubTable->Length, AcpiDmTableInfoPmtt0);
1906228110Sjkim        if (ACPI_FAILURE (Status))
1907228110Sjkim        {
1908228110Sjkim            return;
1909228110Sjkim        }
1910228110Sjkim
1911228110Sjkim        /* Walk the memory controller subtables */
1912228110Sjkim
1913228110Sjkim        MemOffset = sizeof (ACPI_PMTT_SOCKET);
1914228110Sjkim        MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable,
1915228110Sjkim            sizeof (ACPI_PMTT_SOCKET));
1916228110Sjkim
1917228110Sjkim        while (((Offset + MemOffset) < Table->Length) &&
1918228110Sjkim            (MemOffset < SubTable->Length))
1919228110Sjkim        {
1920228110Sjkim            /* Common subtable header */
1921228110Sjkim
1922228110Sjkim            AcpiOsPrintf ("\n");
1923228110Sjkim            Status = AcpiDmDumpTable (Length,
1924228110Sjkim                        Offset + MemOffset, MemSubTable,
1925228110Sjkim                        MemSubTable->Length, AcpiDmTableInfoPmttHdr);
1926228110Sjkim            if (ACPI_FAILURE (Status))
1927228110Sjkim            {
1928228110Sjkim                return;
1929228110Sjkim            }
1930228110Sjkim
1931228110Sjkim            /* Only memory controller subtables are expected at this level */
1932228110Sjkim
1933228110Sjkim            if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER)
1934228110Sjkim            {
1935228110Sjkim                AcpiOsPrintf (
1936228110Sjkim                    "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
1937228110Sjkim                    MemSubTable->Type);
1938228110Sjkim                return;
1939228110Sjkim            }
1940228110Sjkim
1941228110Sjkim            /* Dump the fixed-length portion of the controller subtable */
1942228110Sjkim
1943228110Sjkim            Status = AcpiDmDumpTable (Length,
1944228110Sjkim                        Offset + MemOffset, MemSubTable,
1945228110Sjkim                        MemSubTable->Length, AcpiDmTableInfoPmtt1);
1946228110Sjkim            if (ACPI_FAILURE (Status))
1947228110Sjkim            {
1948228110Sjkim                return;
1949228110Sjkim            }
1950228110Sjkim
1951228110Sjkim            /* Walk the variable count of proximity domains */
1952228110Sjkim
1953228110Sjkim            DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount;
1954228110Sjkim            DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
1955228110Sjkim            DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable,
1956228110Sjkim                sizeof (ACPI_PMTT_CONTROLLER));
1957228110Sjkim
1958228110Sjkim            while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
1959228110Sjkim                ((MemOffset + DomainOffset) < SubTable->Length) &&
1960228110Sjkim                DomainCount)
1961228110Sjkim            {
1962228110Sjkim                Status = AcpiDmDumpTable (Length,
1963228110Sjkim                            Offset + MemOffset + DomainOffset, DomainArray,
1964228110Sjkim                            sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
1965228110Sjkim                if (ACPI_FAILURE (Status))
1966228110Sjkim                {
1967228110Sjkim                    return;
1968228110Sjkim                }
1969228110Sjkim
1970228110Sjkim                DomainOffset += sizeof (ACPI_PMTT_DOMAIN);
1971228110Sjkim                DomainArray++;
1972228110Sjkim                DomainCount--;
1973228110Sjkim            }
1974228110Sjkim
1975228110Sjkim            if (DomainCount)
1976228110Sjkim            {
1977228110Sjkim                AcpiOsPrintf (
1978228110Sjkim                    "\n**** DomainCount exceeds subtable length\n\n",
1979228110Sjkim                    MemSubTable->Type);
1980228110Sjkim            }
1981228110Sjkim
1982228110Sjkim            /* Walk the physical component (DIMM) subtables */
1983228110Sjkim
1984228110Sjkim            DimmOffset = DomainOffset;
1985228110Sjkim            DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable,
1986228110Sjkim                DomainOffset);
1987228110Sjkim
1988228110Sjkim            while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
1989228110Sjkim                (DimmOffset < MemSubTable->Length))
1990228110Sjkim            {
1991228110Sjkim                /* Common subtable header */
1992228110Sjkim
1993228110Sjkim                AcpiOsPrintf ("\n");
1994228110Sjkim                Status = AcpiDmDumpTable (Length,
1995228110Sjkim                            Offset + MemOffset + DimmOffset, DimmSubTable,
1996228110Sjkim                            DimmSubTable->Length, AcpiDmTableInfoPmttHdr);
1997228110Sjkim                if (ACPI_FAILURE (Status))
1998228110Sjkim                {
1999228110Sjkim                    return;
2000228110Sjkim                }
2001228110Sjkim
2002228110Sjkim                /* Only DIMM subtables are expected at this level */
2003228110Sjkim
2004228110Sjkim                if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM)
2005228110Sjkim                {
2006228110Sjkim                    AcpiOsPrintf (
2007228110Sjkim                        "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2008228110Sjkim                        DimmSubTable->Type);
2009228110Sjkim                    return;
2010228110Sjkim                }
2011228110Sjkim
2012228110Sjkim                /* Dump the fixed-length DIMM subtable */
2013228110Sjkim
2014228110Sjkim                Status = AcpiDmDumpTable (Length,
2015228110Sjkim                            Offset + MemOffset + DimmOffset, DimmSubTable,
2016228110Sjkim                            DimmSubTable->Length, AcpiDmTableInfoPmtt2);
2017228110Sjkim                if (ACPI_FAILURE (Status))
2018228110Sjkim                {
2019228110Sjkim                    return;
2020228110Sjkim                }
2021228110Sjkim
2022228110Sjkim                /* Point to next DIMM subtable */
2023228110Sjkim
2024228110Sjkim                DimmOffset += DimmSubTable->Length;
2025228110Sjkim                DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2026228110Sjkim                    DimmSubTable, DimmSubTable->Length);
2027228110Sjkim            }
2028228110Sjkim
2029228110Sjkim            /* Point to next Controller subtable */
2030228110Sjkim
2031228110Sjkim            MemOffset += MemSubTable->Length;
2032228110Sjkim            MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2033228110Sjkim                MemSubTable, MemSubTable->Length);
2034228110Sjkim        }
2035228110Sjkim
2036228110Sjkim        /* Point to next Socket subtable */
2037228110Sjkim
2038228110Sjkim        Offset += SubTable->Length;
2039228110Sjkim        SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2040228110Sjkim            SubTable, SubTable->Length);
2041228110Sjkim    }
2042228110Sjkim}
2043228110Sjkim
2044228110Sjkim
2045228110Sjkim/*******************************************************************************
2046228110Sjkim *
2047228110Sjkim * FUNCTION:    AcpiDmDumpS3pt
2048228110Sjkim *
2049228110Sjkim * PARAMETERS:  Table               - A S3PT table
2050228110Sjkim *
2051228110Sjkim * RETURN:      Length of the table
2052228110Sjkim *
2053228110Sjkim * DESCRIPTION: Format the contents of a S3PT
2054228110Sjkim *
2055228110Sjkim ******************************************************************************/
2056228110Sjkim
2057228110SjkimUINT32
2058228110SjkimAcpiDmDumpS3pt (
2059228110Sjkim    ACPI_TABLE_HEADER       *Tables)
2060228110Sjkim{
2061228110Sjkim    ACPI_STATUS             Status;
2062228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_S3PT);
2063228110Sjkim    ACPI_S3PT_HEADER        *SubTable;
2064228110Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
2065228110Sjkim    ACPI_TABLE_S3PT         *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
2066228110Sjkim
2067228110Sjkim
2068228110Sjkim    /* Main table */
2069228110Sjkim
2070228110Sjkim    Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
2071228110Sjkim    if (ACPI_FAILURE (Status))
2072228110Sjkim    {
2073228110Sjkim        return 0;
2074228110Sjkim    }
2075228110Sjkim
2076228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, S3ptTable, Offset);
2077228110Sjkim    while (Offset < S3ptTable->Length)
2078228110Sjkim    {
2079228110Sjkim        /* Common sub-table header */
2080228110Sjkim
2081228110Sjkim        AcpiOsPrintf ("\n");
2082228110Sjkim        Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
2083228110Sjkim                    SubTable->Length, AcpiDmTableInfoS3ptHdr);
2084228110Sjkim        if (ACPI_FAILURE (Status))
2085228110Sjkim        {
2086228110Sjkim            return 0;
2087228110Sjkim        }
2088228110Sjkim
2089228110Sjkim        switch (SubTable->Type)
2090228110Sjkim        {
2091228110Sjkim        case ACPI_S3PT_TYPE_RESUME:
2092228110Sjkim            InfoTable = AcpiDmTableInfoS3pt0;
2093228110Sjkim            break;
2094228110Sjkim        case ACPI_S3PT_TYPE_SUSPEND:
2095228110Sjkim            InfoTable = AcpiDmTableInfoS3pt1;
2096228110Sjkim            break;
2097228110Sjkim        default:
2098228110Sjkim            AcpiOsPrintf ("\n**** Unknown S3PT sub-table type 0x%X\n", SubTable->Type);
2099228110Sjkim
2100228110Sjkim            /* Attempt to continue */
2101228110Sjkim
2102228110Sjkim            if (!SubTable->Length)
2103228110Sjkim            {
2104228110Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
2105228110Sjkim                return 0;
2106228110Sjkim            }
2107228110Sjkim            goto NextSubTable;
2108228110Sjkim        }
2109228110Sjkim
2110228110Sjkim        AcpiOsPrintf ("\n");
2111228110Sjkim        Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
2112228110Sjkim                    SubTable->Length, InfoTable);
2113228110Sjkim        if (ACPI_FAILURE (Status))
2114228110Sjkim        {
2115228110Sjkim            return 0;
2116228110Sjkim        }
2117228110Sjkim
2118228110SjkimNextSubTable:
2119228110Sjkim        /* Point to next sub-table */
2120228110Sjkim
2121228110Sjkim        Offset += SubTable->Length;
2122228110Sjkim        SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, SubTable, SubTable->Length);
2123228110Sjkim    }
2124228110Sjkim
2125228110Sjkim    return (S3ptTable->Length);
2126228110Sjkim}
2127228110Sjkim
2128228110Sjkim
2129228110Sjkim/*******************************************************************************
2130228110Sjkim *
2131219707Sjkim * FUNCTION:    AcpiDmDumpSlic
2132219707Sjkim *
2133219707Sjkim * PARAMETERS:  Table               - A SLIC table
2134219707Sjkim *
2135219707Sjkim * RETURN:      None
2136219707Sjkim *
2137219707Sjkim * DESCRIPTION: Format the contents of a SLIC
2138219707Sjkim *
2139219707Sjkim ******************************************************************************/
2140219707Sjkim
2141219707Sjkimvoid
2142219707SjkimAcpiDmDumpSlic (
2143219707Sjkim    ACPI_TABLE_HEADER       *Table)
2144219707Sjkim{
2145219707Sjkim    ACPI_STATUS             Status;
2146219707Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_SLIC);
2147219707Sjkim    ACPI_SLIC_HEADER        *SubTable;
2148219707Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
2149219707Sjkim
2150219707Sjkim
2151219707Sjkim    /* There is no main SLIC table, only subtables */
2152219707Sjkim
2153219707Sjkim    SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, Table, Offset);
2154219707Sjkim    while (Offset < Table->Length)
2155219707Sjkim    {
2156219707Sjkim        /* Common sub-table header */
2157219707Sjkim
2158219707Sjkim        AcpiOsPrintf ("\n");
2159219707Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2160219707Sjkim                    SubTable->Length, AcpiDmTableInfoSlicHdr);
2161219707Sjkim        if (ACPI_FAILURE (Status))
2162219707Sjkim        {
2163219707Sjkim            return;
2164219707Sjkim        }
2165219707Sjkim
2166219707Sjkim        switch (SubTable->Type)
2167219707Sjkim        {
2168219707Sjkim        case ACPI_SLIC_TYPE_PUBLIC_KEY:
2169219707Sjkim            InfoTable = AcpiDmTableInfoSlic0;
2170219707Sjkim            break;
2171219707Sjkim        case ACPI_SLIC_TYPE_WINDOWS_MARKER:
2172219707Sjkim            InfoTable = AcpiDmTableInfoSlic1;
2173219707Sjkim            break;
2174219707Sjkim        default:
2175219707Sjkim            AcpiOsPrintf ("\n**** Unknown SLIC sub-table type 0x%X\n", SubTable->Type);
2176219707Sjkim
2177219707Sjkim            /* Attempt to continue */
2178219707Sjkim
2179219707Sjkim            if (!SubTable->Length)
2180219707Sjkim            {
2181219707Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
2182219707Sjkim                return;
2183219707Sjkim            }
2184219707Sjkim            goto NextSubTable;
2185219707Sjkim        }
2186219707Sjkim
2187219707Sjkim        AcpiOsPrintf ("\n");
2188219707Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2189219707Sjkim                    SubTable->Length, InfoTable);
2190219707Sjkim        if (ACPI_FAILURE (Status))
2191219707Sjkim        {
2192219707Sjkim            return;
2193219707Sjkim        }
2194219707Sjkim
2195219707SjkimNextSubTable:
2196219707Sjkim        /* Point to next sub-table */
2197219707Sjkim
2198219707Sjkim        Offset += SubTable->Length;
2199219707Sjkim        SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, SubTable, SubTable->Length);
2200219707Sjkim    }
2201219707Sjkim}
2202219707Sjkim
2203219707Sjkim
2204219707Sjkim/*******************************************************************************
2205219707Sjkim *
2206167802Sjkim * FUNCTION:    AcpiDmDumpSlit
2207167802Sjkim *
2208167802Sjkim * PARAMETERS:  Table               - An SLIT
2209167802Sjkim *
2210167802Sjkim * RETURN:      None
2211167802Sjkim *
2212167802Sjkim * DESCRIPTION: Format the contents of a SLIT
2213167802Sjkim *
2214167802Sjkim ******************************************************************************/
2215167802Sjkim
2216167802Sjkimvoid
2217167802SjkimAcpiDmDumpSlit (
2218167802Sjkim    ACPI_TABLE_HEADER       *Table)
2219167802Sjkim{
2220193529Sjkim    ACPI_STATUS             Status;
2221167802Sjkim    UINT32                  Offset;
2222167802Sjkim    UINT8                   *Row;
2223167802Sjkim    UINT32                  Localities;
2224167802Sjkim    UINT32                  i;
2225167802Sjkim    UINT32                  j;
2226167802Sjkim
2227167802Sjkim
2228167802Sjkim    /* Main table */
2229167802Sjkim
2230193529Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit);
2231193529Sjkim    if (ACPI_FAILURE (Status))
2232193529Sjkim    {
2233193529Sjkim        return;
2234193529Sjkim    }
2235167802Sjkim
2236167802Sjkim    /* Display the Locality NxN Matrix */
2237167802Sjkim
2238167802Sjkim    Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount;
2239167802Sjkim    Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]);
2240167802Sjkim    Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry;
2241167802Sjkim
2242167802Sjkim    for (i = 0; i < Localities; i++)
2243167802Sjkim    {
2244167802Sjkim        /* Display one row of the matrix */
2245167802Sjkim
2246167802Sjkim        AcpiDmLineHeader2 (Offset, Localities, "Locality", i);
2247167802Sjkim        for  (j = 0; j < Localities; j++)
2248167802Sjkim        {
2249167802Sjkim            /* Check for beyond EOT */
2250167802Sjkim
2251167802Sjkim            if (Offset >= Table->Length)
2252167802Sjkim            {
2253167802Sjkim                AcpiOsPrintf ("\n**** Not enough room in table for all localities\n");
2254167802Sjkim                return;
2255167802Sjkim            }
2256167802Sjkim
2257209746Sjkim            AcpiOsPrintf ("%2.2X", Row[j]);
2258167802Sjkim            Offset++;
2259167802Sjkim
2260167802Sjkim            /* Display up to 16 bytes per output row */
2261167802Sjkim
2262209746Sjkim            if ((j+1) < Localities)
2263167802Sjkim            {
2264220663Sjkim                AcpiOsPrintf (" ");
2265209746Sjkim
2266209746Sjkim                if (j && (((j+1) % 16) == 0))
2267209746Sjkim                {
2268220663Sjkim                    AcpiOsPrintf ("\\\n"); /* With line continuation char */
2269220663Sjkim                    AcpiDmLineHeader (Offset, 0, NULL);
2270209746Sjkim                }
2271167802Sjkim            }
2272167802Sjkim        }
2273167802Sjkim
2274167802Sjkim        /* Point to next row */
2275167802Sjkim
2276167802Sjkim        AcpiOsPrintf ("\n");
2277167802Sjkim        Row += Localities;
2278167802Sjkim    }
2279167802Sjkim}
2280167802Sjkim
2281167802Sjkim
2282167802Sjkim/*******************************************************************************
2283167802Sjkim *
2284167802Sjkim * FUNCTION:    AcpiDmDumpSrat
2285167802Sjkim *
2286167802Sjkim * PARAMETERS:  Table               - A SRAT table
2287167802Sjkim *
2288167802Sjkim * RETURN:      None
2289167802Sjkim *
2290167802Sjkim * DESCRIPTION: Format the contents of a SRAT
2291167802Sjkim *
2292167802Sjkim ******************************************************************************/
2293167802Sjkim
2294167802Sjkimvoid
2295167802SjkimAcpiDmDumpSrat (
2296167802Sjkim    ACPI_TABLE_HEADER       *Table)
2297167802Sjkim{
2298193529Sjkim    ACPI_STATUS             Status;
2299167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_SRAT);
2300167802Sjkim    ACPI_SUBTABLE_HEADER    *SubTable;
2301167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
2302167802Sjkim
2303167802Sjkim
2304167802Sjkim    /* Main table */
2305167802Sjkim
2306193529Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat);
2307193529Sjkim    if (ACPI_FAILURE (Status))
2308193529Sjkim    {
2309193529Sjkim        return;
2310193529Sjkim    }
2311167802Sjkim
2312167802Sjkim    /* Sub-tables */
2313167802Sjkim
2314167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
2315167802Sjkim    while (Offset < Table->Length)
2316167802Sjkim    {
2317193529Sjkim        /* Common sub-table header */
2318193529Sjkim
2319193529Sjkim        AcpiOsPrintf ("\n");
2320193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2321193529Sjkim                    SubTable->Length, AcpiDmTableInfoSratHdr);
2322193529Sjkim        if (ACPI_FAILURE (Status))
2323193529Sjkim        {
2324193529Sjkim            return;
2325193529Sjkim        }
2326193529Sjkim
2327167802Sjkim        switch (SubTable->Type)
2328167802Sjkim        {
2329167802Sjkim        case ACPI_SRAT_TYPE_CPU_AFFINITY:
2330167802Sjkim            InfoTable = AcpiDmTableInfoSrat0;
2331167802Sjkim            break;
2332167802Sjkim        case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
2333167802Sjkim            InfoTable = AcpiDmTableInfoSrat1;
2334167802Sjkim            break;
2335193529Sjkim        case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
2336193529Sjkim            InfoTable = AcpiDmTableInfoSrat2;
2337193529Sjkim            break;
2338167802Sjkim        default:
2339204773Sjkim            AcpiOsPrintf ("\n**** Unknown SRAT sub-table type 0x%X\n", SubTable->Type);
2340193529Sjkim
2341193529Sjkim            /* Attempt to continue */
2342193529Sjkim
2343193529Sjkim            if (!SubTable->Length)
2344193529Sjkim            {
2345193529Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
2346193529Sjkim                return;
2347193529Sjkim            }
2348193529Sjkim            goto NextSubTable;
2349167802Sjkim        }
2350167802Sjkim
2351167802Sjkim        AcpiOsPrintf ("\n");
2352193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2353193529Sjkim                    SubTable->Length, InfoTable);
2354193529Sjkim        if (ACPI_FAILURE (Status))
2355193529Sjkim        {
2356193529Sjkim            return;
2357193529Sjkim        }
2358167802Sjkim
2359193529SjkimNextSubTable:
2360167802Sjkim        /* Point to next sub-table */
2361167802Sjkim
2362167802Sjkim        Offset += SubTable->Length;
2363167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
2364167802Sjkim    }
2365167802Sjkim}
2366167802Sjkim
2367197104Sjkim
2368197104Sjkim/*******************************************************************************
2369197104Sjkim *
2370197104Sjkim * FUNCTION:    AcpiDmDumpWdat
2371197104Sjkim *
2372197104Sjkim * PARAMETERS:  Table               - A WDAT table
2373197104Sjkim *
2374197104Sjkim * RETURN:      None
2375197104Sjkim *
2376197104Sjkim * DESCRIPTION: Format the contents of a WDAT
2377197104Sjkim *
2378197104Sjkim ******************************************************************************/
2379197104Sjkim
2380197104Sjkimvoid
2381197104SjkimAcpiDmDumpWdat (
2382197104Sjkim    ACPI_TABLE_HEADER       *Table)
2383197104Sjkim{
2384197104Sjkim    ACPI_STATUS             Status;
2385197104Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_WDAT);
2386197104Sjkim    ACPI_WDAT_ENTRY         *SubTable;
2387197104Sjkim
2388197104Sjkim
2389197104Sjkim    /* Main table */
2390197104Sjkim
2391197104Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat);
2392197104Sjkim    if (ACPI_FAILURE (Status))
2393197104Sjkim    {
2394197104Sjkim        return;
2395197104Sjkim    }
2396197104Sjkim
2397197104Sjkim    /* Sub-tables */
2398197104Sjkim
2399197104Sjkim    SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
2400197104Sjkim    while (Offset < Table->Length)
2401197104Sjkim    {
2402197104Sjkim        /* Common sub-table header */
2403197104Sjkim
2404197104Sjkim        AcpiOsPrintf ("\n");
2405197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2406197104Sjkim                    sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0);
2407197104Sjkim        if (ACPI_FAILURE (Status))
2408197104Sjkim        {
2409197104Sjkim            return;
2410197104Sjkim        }
2411197104Sjkim
2412197104Sjkim        /* Point to next sub-table */
2413197104Sjkim
2414197104Sjkim        Offset += sizeof (ACPI_WDAT_ENTRY);
2415197104Sjkim        SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable, sizeof (ACPI_WDAT_ENTRY));
2416197104Sjkim    }
2417197104Sjkim}
2418