1167802Sjkim/******************************************************************************
2167802Sjkim *
3167802Sjkim * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code
4167802Sjkim *
5167802Sjkim *****************************************************************************/
6167802Sjkim
7217365Sjkim/*
8245582Sjkim * Copyright (C) 2000 - 2013, Intel Corp.
9167802Sjkim * All rights reserved.
10167802Sjkim *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25167802Sjkim *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29167802Sjkim *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43167802Sjkim
44193529Sjkim#include <contrib/dev/acpica/include/acpi.h>
45193529Sjkim#include <contrib/dev/acpica/include/accommon.h>
46193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
47193529Sjkim#include <contrib/dev/acpica/include/actables.h>
48167802Sjkim
49167802Sjkim/* This module used for application-level code only */
50167802Sjkim
51167802Sjkim#define _COMPONENT          ACPI_CA_DISASSEMBLER
52167802Sjkim        ACPI_MODULE_NAME    ("dmtbdump")
53167802Sjkim
54167802Sjkim
55239340Sjkim/* Local prototypes */
56239340Sjkim
57218590Sjkimstatic void
58218590SjkimAcpiDmValidateFadtLength (
59218590Sjkim    UINT32                  Revision,
60218590Sjkim    UINT32                  Length);
61218590Sjkim
62239340Sjkimstatic void
63239340SjkimAcpiDmDumpBuffer (
64239340Sjkim    void                    *Table,
65239340Sjkim    UINT32                  BufferOffset,
66239340Sjkim    UINT32                  Length,
67239340Sjkim    UINT32                  AbsoluteOffset,
68239340Sjkim    char                    *Header);
69218590Sjkim
70239340Sjkim
71167802Sjkim/*******************************************************************************
72167802Sjkim *
73239340Sjkim * FUNCTION:    AcpiDmDumpBuffer
74239340Sjkim *
75239340Sjkim * PARAMETERS:  Table               - ACPI Table or subtable
76239340Sjkim *              BufferOffset        - Offset of buffer from Table above
77239340Sjkim *              Length              - Length of the buffer
78239340Sjkim *              AbsoluteOffset      - Offset of buffer in the main ACPI table
79239340Sjkim *              Header              - Name of the buffer field (printed on the
80239340Sjkim *                                    first line only.)
81239340Sjkim *
82239340Sjkim * RETURN:      None
83239340Sjkim *
84239340Sjkim * DESCRIPTION: Format the contents of an arbitrary length data buffer (in the
85239340Sjkim *              disassembler output format.)
86239340Sjkim *
87239340Sjkim ******************************************************************************/
88239340Sjkim
89239340Sjkimstatic void
90239340SjkimAcpiDmDumpBuffer (
91239340Sjkim    void                    *Table,
92239340Sjkim    UINT32                  BufferOffset,
93239340Sjkim    UINT32                  Length,
94239340Sjkim    UINT32                  AbsoluteOffset,
95239340Sjkim    char                    *Header)
96239340Sjkim{
97239340Sjkim    UINT8                   *Buffer;
98239340Sjkim    UINT32                  i;
99239340Sjkim
100239340Sjkim
101239340Sjkim    if (!Length)
102239340Sjkim    {
103239340Sjkim        return;
104239340Sjkim    }
105239340Sjkim
106239340Sjkim    Buffer = ACPI_CAST_PTR (UINT8, Table) + BufferOffset;
107239340Sjkim    i = 0;
108239340Sjkim
109239340Sjkim    while (i < Length)
110239340Sjkim    {
111239340Sjkim        if (!(i % 16))
112239340Sjkim        {
113239340Sjkim            AcpiOsPrintf ("\n");
114239340Sjkim            AcpiDmLineHeader (AbsoluteOffset,
115239340Sjkim                ((Length - i) > 16) ? 16 : (Length - i), Header);
116239340Sjkim            Header = NULL;
117239340Sjkim        }
118239340Sjkim
119239340Sjkim        AcpiOsPrintf ("%.02X ", *Buffer);
120239340Sjkim        i++;
121239340Sjkim        Buffer++;
122239340Sjkim        AbsoluteOffset++;
123239340Sjkim    }
124239340Sjkim
125239340Sjkim    AcpiOsPrintf ("\n");
126239340Sjkim}
127239340Sjkim
128239340Sjkim
129239340Sjkim/*******************************************************************************
130239340Sjkim *
131167802Sjkim * FUNCTION:    AcpiDmDumpRsdp
132167802Sjkim *
133167802Sjkim * PARAMETERS:  Table               - A RSDP
134167802Sjkim *
135209746Sjkim * RETURN:      Length of the table (there is not always a length field,
136209746Sjkim *              use revision or length if available (ACPI 2.0+))
137167802Sjkim *
138167802Sjkim * DESCRIPTION: Format the contents of a RSDP
139167802Sjkim *
140167802Sjkim ******************************************************************************/
141167802Sjkim
142167802SjkimUINT32
143167802SjkimAcpiDmDumpRsdp (
144167802Sjkim    ACPI_TABLE_HEADER       *Table)
145167802Sjkim{
146209746Sjkim    ACPI_TABLE_RSDP         *Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table);
147209746Sjkim    UINT32                  Length = sizeof (ACPI_RSDP_COMMON);
148209746Sjkim    UINT8                   Checksum;
149167802Sjkim
150167802Sjkim
151167802Sjkim    /* Dump the common ACPI 1.0 portion */
152167802Sjkim
153167802Sjkim    AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1);
154167802Sjkim
155209746Sjkim    /* Validate the first checksum */
156167802Sjkim
157209746Sjkim    Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON),
158209746Sjkim                Rsdp->Checksum);
159209746Sjkim    if (Checksum != Rsdp->Checksum)
160167802Sjkim    {
161209746Sjkim        AcpiOsPrintf ("/* Incorrect Checksum above, should be 0x%2.2X */\n",
162209746Sjkim            Checksum);
163209746Sjkim    }
164209746Sjkim
165209746Sjkim    /* The RSDP for ACPI 2.0+ contains more data and has a Length field */
166209746Sjkim
167209746Sjkim    if (Rsdp->Revision > 0)
168209746Sjkim    {
169209746Sjkim        Length = Rsdp->Length;
170167802Sjkim        AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2);
171209746Sjkim
172209746Sjkim        /* Validate the extended checksum over entire RSDP */
173209746Sjkim
174209746Sjkim        Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP),
175209746Sjkim                    Rsdp->ExtendedChecksum);
176209746Sjkim        if (Checksum != Rsdp->ExtendedChecksum)
177209746Sjkim        {
178209746Sjkim            AcpiOsPrintf (
179209746Sjkim                "/* Incorrect Extended Checksum above, should be 0x%2.2X */\n",
180209746Sjkim                Checksum);
181209746Sjkim        }
182167802Sjkim    }
183167802Sjkim
184167802Sjkim    return (Length);
185167802Sjkim}
186167802Sjkim
187167802Sjkim
188167802Sjkim/*******************************************************************************
189167802Sjkim *
190167802Sjkim * FUNCTION:    AcpiDmDumpRsdt
191167802Sjkim *
192167802Sjkim * PARAMETERS:  Table               - A RSDT
193167802Sjkim *
194167802Sjkim * RETURN:      None
195167802Sjkim *
196167802Sjkim * DESCRIPTION: Format the contents of a RSDT
197167802Sjkim *
198167802Sjkim ******************************************************************************/
199167802Sjkim
200167802Sjkimvoid
201167802SjkimAcpiDmDumpRsdt (
202167802Sjkim    ACPI_TABLE_HEADER       *Table)
203167802Sjkim{
204167802Sjkim    UINT32                  *Array;
205167802Sjkim    UINT32                  Entries;
206167802Sjkim    UINT32                  Offset;
207167802Sjkim    UINT32                  i;
208167802Sjkim
209167802Sjkim
210167802Sjkim    /* Point to start of table pointer array */
211167802Sjkim
212167802Sjkim    Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry;
213167802Sjkim    Offset = sizeof (ACPI_TABLE_HEADER);
214167802Sjkim
215167802Sjkim    /* RSDT uses 32-bit pointers */
216167802Sjkim
217167802Sjkim    Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32);
218167802Sjkim
219167802Sjkim    for (i = 0; i < Entries; i++)
220167802Sjkim    {
221167802Sjkim        AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i);
222167802Sjkim        AcpiOsPrintf ("%8.8X\n", Array[i]);
223167802Sjkim        Offset += sizeof (UINT32);
224167802Sjkim    }
225167802Sjkim}
226167802Sjkim
227167802Sjkim
228167802Sjkim/*******************************************************************************
229167802Sjkim *
230167802Sjkim * FUNCTION:    AcpiDmDumpXsdt
231167802Sjkim *
232167802Sjkim * PARAMETERS:  Table               - A XSDT
233167802Sjkim *
234167802Sjkim * RETURN:      None
235167802Sjkim *
236167802Sjkim * DESCRIPTION: Format the contents of a XSDT
237167802Sjkim *
238167802Sjkim ******************************************************************************/
239167802Sjkim
240167802Sjkimvoid
241167802SjkimAcpiDmDumpXsdt (
242167802Sjkim    ACPI_TABLE_HEADER       *Table)
243167802Sjkim{
244167802Sjkim    UINT64                  *Array;
245167802Sjkim    UINT32                  Entries;
246167802Sjkim    UINT32                  Offset;
247167802Sjkim    UINT32                  i;
248167802Sjkim
249167802Sjkim
250167802Sjkim    /* Point to start of table pointer array */
251167802Sjkim
252167802Sjkim    Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry;
253167802Sjkim    Offset = sizeof (ACPI_TABLE_HEADER);
254167802Sjkim
255167802Sjkim    /* XSDT uses 64-bit pointers */
256167802Sjkim
257167802Sjkim    Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64);
258167802Sjkim
259167802Sjkim    for (i = 0; i < Entries; i++)
260167802Sjkim    {
261167802Sjkim        AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i);
262167802Sjkim        AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i]));
263167802Sjkim        Offset += sizeof (UINT64);
264167802Sjkim    }
265167802Sjkim}
266167802Sjkim
267167802Sjkim
268167802Sjkim/*******************************************************************************
269167802Sjkim *
270167802Sjkim * FUNCTION:    AcpiDmDumpFadt
271167802Sjkim *
272167802Sjkim * PARAMETERS:  Table               - A FADT
273167802Sjkim *
274167802Sjkim * RETURN:      None
275167802Sjkim *
276167802Sjkim * DESCRIPTION: Format the contents of a FADT
277167802Sjkim *
278218590Sjkim * NOTE:        We cannot depend on the FADT version to indicate the actual
279218590Sjkim *              contents of the FADT because of BIOS bugs. The table length
280218590Sjkim *              is the only reliable indicator.
281218590Sjkim *
282167802Sjkim ******************************************************************************/
283167802Sjkim
284167802Sjkimvoid
285167802SjkimAcpiDmDumpFadt (
286167802Sjkim    ACPI_TABLE_HEADER       *Table)
287167802Sjkim{
288167802Sjkim
289218590Sjkim    /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */
290167802Sjkim
291167802Sjkim    AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt1);
292167802Sjkim
293218590Sjkim    /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */
294167802Sjkim
295218590Sjkim    if ((Table->Length > ACPI_FADT_V1_SIZE) &&
296218590Sjkim        (Table->Length <= ACPI_FADT_V2_SIZE))
297167802Sjkim    {
298167802Sjkim        AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt2);
299167802Sjkim    }
300167802Sjkim
301228110Sjkim    /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */
302193529Sjkim
303218590Sjkim    else if (Table->Length > ACPI_FADT_V2_SIZE)
304193529Sjkim    {
305193529Sjkim        AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt3);
306228110Sjkim
307228110Sjkim        /* Check for FADT revision 5 fields and up (ACPI 5.0+) */
308228110Sjkim
309228110Sjkim        if (Table->Length > ACPI_FADT_V3_SIZE)
310228110Sjkim        {
311228110Sjkim            AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt5);
312228110Sjkim        }
313193529Sjkim    }
314193529Sjkim
315167802Sjkim    /* Validate various fields in the FADT, including length */
316167802Sjkim
317167802Sjkim    AcpiTbCreateLocalFadt (Table, Table->Length);
318218590Sjkim
319218590Sjkim    /* Validate FADT length against the revision */
320218590Sjkim
321218590Sjkim    AcpiDmValidateFadtLength (Table->Revision, Table->Length);
322167802Sjkim}
323167802Sjkim
324167802Sjkim
325167802Sjkim/*******************************************************************************
326167802Sjkim *
327218590Sjkim * FUNCTION:    AcpiDmValidateFadtLength
328218590Sjkim *
329218590Sjkim * PARAMETERS:  Revision            - FADT revision (Header->Revision)
330218590Sjkim *              Length              - FADT length (Header->Length
331218590Sjkim *
332218590Sjkim * RETURN:      None
333218590Sjkim *
334218590Sjkim * DESCRIPTION: Check the FADT revision against the expected table length for
335218590Sjkim *              that revision. Issue a warning if the length is not what was
336218590Sjkim *              expected. This seems to be such a common BIOS bug that the
337218590Sjkim *              FADT revision has been rendered virtually meaningless.
338218590Sjkim *
339218590Sjkim ******************************************************************************/
340218590Sjkim
341218590Sjkimstatic void
342218590SjkimAcpiDmValidateFadtLength (
343218590Sjkim    UINT32                  Revision,
344218590Sjkim    UINT32                  Length)
345218590Sjkim{
346218590Sjkim    UINT32                  ExpectedLength;
347218590Sjkim
348218590Sjkim
349218590Sjkim    switch (Revision)
350218590Sjkim    {
351218590Sjkim    case 0:
352250838Sjkim
353218590Sjkim        AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n");
354218590Sjkim        return;
355218590Sjkim
356218590Sjkim    case 1:
357250838Sjkim
358218590Sjkim        ExpectedLength = ACPI_FADT_V1_SIZE;
359218590Sjkim        break;
360218590Sjkim
361218590Sjkim    case 2:
362250838Sjkim
363218590Sjkim        ExpectedLength = ACPI_FADT_V2_SIZE;
364218590Sjkim        break;
365218590Sjkim
366218590Sjkim    case 3:
367218590Sjkim    case 4:
368250838Sjkim
369218590Sjkim        ExpectedLength = ACPI_FADT_V3_SIZE;
370218590Sjkim        break;
371218590Sjkim
372228110Sjkim    case 5:
373250838Sjkim
374228110Sjkim        ExpectedLength = ACPI_FADT_V5_SIZE;
375228110Sjkim        break;
376228110Sjkim
377218590Sjkim    default:
378250838Sjkim
379218590Sjkim        return;
380218590Sjkim    }
381218590Sjkim
382218590Sjkim    if (Length == ExpectedLength)
383218590Sjkim    {
384218590Sjkim        return;
385218590Sjkim    }
386218590Sjkim
387218590Sjkim    AcpiOsPrintf (
388218590Sjkim        "\n// ACPI Warning: FADT revision %X does not match length: found %X expected %X\n",
389218590Sjkim        Revision, Length, ExpectedLength);
390218590Sjkim}
391218590Sjkim
392218590Sjkim
393218590Sjkim/*******************************************************************************
394218590Sjkim *
395167802Sjkim * FUNCTION:    AcpiDmDumpAsf
396167802Sjkim *
397167802Sjkim * PARAMETERS:  Table               - A ASF table
398167802Sjkim *
399167802Sjkim * RETURN:      None
400167802Sjkim *
401167802Sjkim * DESCRIPTION: Format the contents of a ASF table
402167802Sjkim *
403167802Sjkim ******************************************************************************/
404167802Sjkim
405167802Sjkimvoid
406167802SjkimAcpiDmDumpAsf (
407167802Sjkim    ACPI_TABLE_HEADER       *Table)
408167802Sjkim{
409193529Sjkim    ACPI_STATUS             Status;
410167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
411167802Sjkim    ACPI_ASF_INFO           *SubTable;
412167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
413167802Sjkim    ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
414167802Sjkim    UINT8                   *DataTable = NULL;
415193529Sjkim    UINT32                  DataCount = 0;
416193529Sjkim    UINT32                  DataLength = 0;
417193529Sjkim    UINT32                  DataOffset = 0;
418193529Sjkim    UINT32                  i;
419197104Sjkim    UINT8                   Type;
420167802Sjkim
421167802Sjkim
422167802Sjkim    /* No main table, only sub-tables */
423167802Sjkim
424167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
425167802Sjkim    while (Offset < Table->Length)
426167802Sjkim    {
427167802Sjkim        /* Common sub-table header */
428167802Sjkim
429193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
430193529Sjkim                    SubTable->Header.Length, AcpiDmTableInfoAsfHdr);
431193529Sjkim        if (ACPI_FAILURE (Status))
432193529Sjkim        {
433193529Sjkim            return;
434193529Sjkim        }
435167802Sjkim
436197104Sjkim        /* The actual type is the lower 7 bits of Type */
437197104Sjkim
438197104Sjkim        Type = (UINT8) (SubTable->Header.Type & 0x7F);
439197104Sjkim
440197104Sjkim        switch (Type)
441167802Sjkim        {
442167802Sjkim        case ACPI_ASF_TYPE_INFO:
443250838Sjkim
444167802Sjkim            InfoTable = AcpiDmTableInfoAsf0;
445167802Sjkim            break;
446167802Sjkim
447167802Sjkim        case ACPI_ASF_TYPE_ALERT:
448250838Sjkim
449167802Sjkim            InfoTable = AcpiDmTableInfoAsf1;
450167802Sjkim            DataInfoTable = AcpiDmTableInfoAsf1a;
451167802Sjkim            DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT));
452197104Sjkim            DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts;
453197104Sjkim            DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength;
454167802Sjkim            DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
455167802Sjkim            break;
456167802Sjkim
457167802Sjkim        case ACPI_ASF_TYPE_CONTROL:
458250838Sjkim
459167802Sjkim            InfoTable = AcpiDmTableInfoAsf2;
460167802Sjkim            DataInfoTable = AcpiDmTableInfoAsf2a;
461167802Sjkim            DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE));
462197104Sjkim            DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls;
463197104Sjkim            DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength;
464167802Sjkim            DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
465167802Sjkim            break;
466167802Sjkim
467167802Sjkim        case ACPI_ASF_TYPE_BOOT:
468250838Sjkim
469167802Sjkim            InfoTable = AcpiDmTableInfoAsf3;
470167802Sjkim            break;
471167802Sjkim
472167802Sjkim        case ACPI_ASF_TYPE_ADDRESS:
473250838Sjkim
474167802Sjkim            InfoTable = AcpiDmTableInfoAsf4;
475167802Sjkim            DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS));
476197104Sjkim            DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices;
477167802Sjkim            DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
478167802Sjkim            break;
479167802Sjkim
480167802Sjkim        default:
481250838Sjkim
482204773Sjkim            AcpiOsPrintf ("\n**** Unknown ASF sub-table type 0x%X\n", SubTable->Header.Type);
483167802Sjkim            return;
484167802Sjkim        }
485167802Sjkim
486193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
487193529Sjkim                    SubTable->Header.Length, InfoTable);
488193529Sjkim        if (ACPI_FAILURE (Status))
489193529Sjkim        {
490193529Sjkim            return;
491193529Sjkim        }
492167802Sjkim
493167802Sjkim        /* Dump variable-length extra data */
494167802Sjkim
495197104Sjkim        switch (Type)
496167802Sjkim        {
497167802Sjkim        case ACPI_ASF_TYPE_ALERT:
498167802Sjkim        case ACPI_ASF_TYPE_CONTROL:
499167802Sjkim
500167802Sjkim            for (i = 0; i < DataCount; i++)
501167802Sjkim            {
502167802Sjkim                AcpiOsPrintf ("\n");
503193529Sjkim                Status = AcpiDmDumpTable (Table->Length, DataOffset,
504193529Sjkim                            DataTable, DataLength, DataInfoTable);
505193529Sjkim                if (ACPI_FAILURE (Status))
506193529Sjkim                {
507193529Sjkim                    return;
508193529Sjkim                }
509167802Sjkim
510167802Sjkim                DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
511167802Sjkim                DataOffset += DataLength;
512167802Sjkim            }
513167802Sjkim            break;
514167802Sjkim
515167802Sjkim        case ACPI_ASF_TYPE_ADDRESS:
516167802Sjkim
517167802Sjkim            for (i = 0; i < DataLength; i++)
518167802Sjkim            {
519167802Sjkim                if (!(i % 16))
520167802Sjkim                {
521167802Sjkim                    AcpiDmLineHeader (DataOffset, 1, "Addresses");
522167802Sjkim                }
523167802Sjkim
524167802Sjkim                AcpiOsPrintf ("%2.2X ", *DataTable);
525167802Sjkim                DataTable++;
526167802Sjkim                DataOffset++;
527193529Sjkim                if (DataOffset > Table->Length)
528193529Sjkim                {
529193529Sjkim                    AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
530193529Sjkim                    return;
531193529Sjkim                }
532167802Sjkim            }
533167802Sjkim
534167802Sjkim            AcpiOsPrintf ("\n");
535167802Sjkim            break;
536193529Sjkim
537193529Sjkim        default:
538250838Sjkim
539193529Sjkim            break;
540167802Sjkim        }
541167802Sjkim
542167802Sjkim        AcpiOsPrintf ("\n");
543167802Sjkim
544167802Sjkim        /* Point to next sub-table */
545167802Sjkim
546193529Sjkim        if (!SubTable->Header.Length)
547193529Sjkim        {
548193529Sjkim            AcpiOsPrintf ("Invalid zero subtable header length\n");
549193529Sjkim            return;
550193529Sjkim        }
551193529Sjkim
552167802Sjkim        Offset += SubTable->Header.Length;
553167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable, SubTable->Header.Length);
554167802Sjkim    }
555167802Sjkim}
556167802Sjkim
557167802Sjkim
558167802Sjkim/*******************************************************************************
559167802Sjkim *
560167802Sjkim * FUNCTION:    AcpiDmDumpCpep
561167802Sjkim *
562167802Sjkim * PARAMETERS:  Table               - A CPEP table
563167802Sjkim *
564167802Sjkim * RETURN:      None
565167802Sjkim *
566167802Sjkim * DESCRIPTION: Format the contents of a CPEP. This table type consists
567167802Sjkim *              of an open-ended number of subtables.
568167802Sjkim *
569167802Sjkim ******************************************************************************/
570167802Sjkim
571167802Sjkimvoid
572167802SjkimAcpiDmDumpCpep (
573167802Sjkim    ACPI_TABLE_HEADER       *Table)
574167802Sjkim{
575193529Sjkim    ACPI_STATUS             Status;
576167802Sjkim    ACPI_CPEP_POLLING       *SubTable;
577167802Sjkim    UINT32                  Length = Table->Length;
578167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_CPEP);
579167802Sjkim
580167802Sjkim
581167802Sjkim    /* Main table */
582167802Sjkim
583193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
584193529Sjkim    if (ACPI_FAILURE (Status))
585193529Sjkim    {
586193529Sjkim        return;
587193529Sjkim    }
588167802Sjkim
589167802Sjkim    /* Sub-tables */
590167802Sjkim
591167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
592167802Sjkim    while (Offset < Table->Length)
593167802Sjkim    {
594167802Sjkim        AcpiOsPrintf ("\n");
595193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
596197104Sjkim                    SubTable->Header.Length, AcpiDmTableInfoCpep0);
597193529Sjkim        if (ACPI_FAILURE (Status))
598193529Sjkim        {
599193529Sjkim            return;
600193529Sjkim        }
601167802Sjkim
602167802Sjkim        /* Point to next sub-table */
603167802Sjkim
604197104Sjkim        Offset += SubTable->Header.Length;
605197104Sjkim        SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable,
606197104Sjkim                    SubTable->Header.Length);
607167802Sjkim    }
608167802Sjkim}
609167802Sjkim
610167802Sjkim
611167802Sjkim/*******************************************************************************
612167802Sjkim *
613239340Sjkim * FUNCTION:    AcpiDmDumpCsrt
614239340Sjkim *
615239340Sjkim * PARAMETERS:  Table               - A CSRT table
616239340Sjkim *
617239340Sjkim * RETURN:      None
618239340Sjkim *
619239340Sjkim * DESCRIPTION: Format the contents of a CSRT. This table type consists
620239340Sjkim *              of an open-ended number of subtables.
621239340Sjkim *
622239340Sjkim ******************************************************************************/
623239340Sjkim
624239340Sjkimvoid
625239340SjkimAcpiDmDumpCsrt (
626239340Sjkim    ACPI_TABLE_HEADER       *Table)
627239340Sjkim{
628239340Sjkim    ACPI_STATUS             Status;
629239340Sjkim    ACPI_CSRT_GROUP         *SubTable;
630245582Sjkim    ACPI_CSRT_SHARED_INFO   *SharedInfoTable;
631239340Sjkim    ACPI_CSRT_DESCRIPTOR    *SubSubTable;
632239340Sjkim    UINT32                  Length = Table->Length;
633239340Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_CSRT);
634239340Sjkim    UINT32                  SubOffset;
635239340Sjkim    UINT32                  SubSubOffset;
636239340Sjkim    UINT32                  InfoLength;
637239340Sjkim
638239340Sjkim
639239340Sjkim    /* The main table only contains the ACPI header, thus already handled */
640239340Sjkim
641239340Sjkim    /* Sub-tables (Resource Groups) */
642239340Sjkim
643239340Sjkim    SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
644239340Sjkim    while (Offset < Table->Length)
645239340Sjkim    {
646245582Sjkim        /* Resource group subtable */
647245582Sjkim
648239340Sjkim        AcpiOsPrintf ("\n");
649239340Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
650239340Sjkim                    SubTable->Length, AcpiDmTableInfoCsrt0);
651239340Sjkim        if (ACPI_FAILURE (Status))
652239340Sjkim        {
653239340Sjkim            return;
654239340Sjkim        }
655239340Sjkim
656245582Sjkim        /* Shared info subtable (One per resource group) */
657245582Sjkim
658239340Sjkim        SubOffset = sizeof (ACPI_CSRT_GROUP);
659245582Sjkim        SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,
660245582Sjkim            Offset + SubOffset);
661239340Sjkim
662245582Sjkim        AcpiOsPrintf ("\n");
663245582Sjkim        Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
664245582Sjkim                    sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
665245582Sjkim        if (ACPI_FAILURE (Status))
666245582Sjkim        {
667245582Sjkim            return;
668245582Sjkim        }
669239340Sjkim
670245582Sjkim        SubOffset += SubTable->SharedInfoLength;
671239340Sjkim
672245582Sjkim        /* Sub-Subtables (Resource Descriptors) */
673239340Sjkim
674239340Sjkim        SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
675239340Sjkim            Offset + SubOffset);
676239340Sjkim
677239340Sjkim        while ((SubOffset < SubTable->Length) &&
678239340Sjkim              ((Offset + SubOffset) < Table->Length))
679239340Sjkim        {
680239340Sjkim            AcpiOsPrintf ("\n");
681239340Sjkim            Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubTable,
682245582Sjkim                        SubSubTable->Length, AcpiDmTableInfoCsrt2);
683239340Sjkim            if (ACPI_FAILURE (Status))
684239340Sjkim            {
685239340Sjkim                return;
686239340Sjkim            }
687239340Sjkim
688239340Sjkim            SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
689239340Sjkim
690239340Sjkim            /* Resource-specific info buffer */
691239340Sjkim
692239340Sjkim            InfoLength = SubSubTable->Length - SubSubOffset;
693239340Sjkim
694239340Sjkim            AcpiDmDumpBuffer (SubSubTable, SubSubOffset, InfoLength,
695239340Sjkim                Offset + SubOffset + SubSubOffset, "ResourceInfo");
696239340Sjkim            SubSubOffset += InfoLength;
697239340Sjkim
698245582Sjkim            /* Point to next sub-subtable */
699239340Sjkim
700239340Sjkim            SubOffset += SubSubTable->Length;
701239340Sjkim            SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable,
702239340Sjkim                        SubSubTable->Length);
703239340Sjkim        }
704239340Sjkim
705239340Sjkim        /* Point to next sub-table */
706239340Sjkim
707239340Sjkim        Offset += SubTable->Length;
708239340Sjkim        SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable,
709239340Sjkim                    SubTable->Length);
710239340Sjkim    }
711239340Sjkim}
712239340Sjkim
713239340Sjkim
714239340Sjkim/*******************************************************************************
715239340Sjkim *
716239340Sjkim * FUNCTION:    AcpiDmDumpDbg2
717239340Sjkim *
718239340Sjkim * PARAMETERS:  Table               - A DBG2 table
719239340Sjkim *
720239340Sjkim * RETURN:      None
721239340Sjkim *
722239340Sjkim * DESCRIPTION: Format the contents of a DBG2. This table type consists
723239340Sjkim *              of an open-ended number of subtables.
724239340Sjkim *
725239340Sjkim ******************************************************************************/
726239340Sjkim
727239340Sjkimvoid
728239340SjkimAcpiDmDumpDbg2 (
729239340Sjkim    ACPI_TABLE_HEADER       *Table)
730239340Sjkim{
731239340Sjkim    ACPI_STATUS             Status;
732239340Sjkim    ACPI_DBG2_DEVICE        *SubTable;
733239340Sjkim    UINT32                  Length = Table->Length;
734239340Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_DBG2);
735239340Sjkim    UINT32                  i;
736239340Sjkim    UINT32                  ArrayOffset;
737239340Sjkim    UINT32                  AbsoluteOffset;
738239340Sjkim    UINT8                   *Array;
739239340Sjkim
740239340Sjkim
741239340Sjkim    /* Main table */
742239340Sjkim
743239340Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
744239340Sjkim    if (ACPI_FAILURE (Status))
745239340Sjkim    {
746239340Sjkim        return;
747239340Sjkim    }
748239340Sjkim
749239340Sjkim    /* Sub-tables */
750239340Sjkim
751239340Sjkim    SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
752239340Sjkim    while (Offset < Table->Length)
753239340Sjkim    {
754239340Sjkim        AcpiOsPrintf ("\n");
755239340Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
756239340Sjkim                    SubTable->Length, AcpiDmTableInfoDbg2Device);
757239340Sjkim        if (ACPI_FAILURE (Status))
758239340Sjkim        {
759239340Sjkim            return;
760239340Sjkim        }
761239340Sjkim
762239340Sjkim        /* Dump the BaseAddress array */
763239340Sjkim
764239340Sjkim        for (i = 0; i < SubTable->RegisterCount; i++)
765239340Sjkim        {
766239340Sjkim            ArrayOffset = SubTable->BaseAddressOffset +
767239340Sjkim                (sizeof (ACPI_GENERIC_ADDRESS) * i);
768239340Sjkim            AbsoluteOffset = Offset + ArrayOffset;
769239340Sjkim            Array = (UINT8 *) SubTable + ArrayOffset;
770239340Sjkim
771239340Sjkim            Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
772239340Sjkim                        SubTable->Length, AcpiDmTableInfoDbg2Addr);
773239340Sjkim            if (ACPI_FAILURE (Status))
774239340Sjkim            {
775239340Sjkim                return;
776239340Sjkim            }
777239340Sjkim        }
778239340Sjkim
779239340Sjkim        /* Dump the AddressSize array */
780239340Sjkim
781239340Sjkim        for (i = 0; i < SubTable->RegisterCount; i++)
782239340Sjkim        {
783239340Sjkim            ArrayOffset = SubTable->AddressSizeOffset +
784239340Sjkim                (sizeof (UINT32) * i);
785239340Sjkim            AbsoluteOffset = Offset + ArrayOffset;
786239340Sjkim            Array = (UINT8 *) SubTable + ArrayOffset;
787239340Sjkim
788239340Sjkim            Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
789239340Sjkim                        SubTable->Length, AcpiDmTableInfoDbg2Size);
790239340Sjkim            if (ACPI_FAILURE (Status))
791239340Sjkim            {
792239340Sjkim                return;
793239340Sjkim            }
794239340Sjkim        }
795239340Sjkim
796239340Sjkim        /* Dump the Namestring (required) */
797239340Sjkim
798239340Sjkim        AcpiOsPrintf ("\n");
799239340Sjkim        ArrayOffset = SubTable->NamepathOffset;
800239340Sjkim        AbsoluteOffset = Offset + ArrayOffset;
801239340Sjkim        Array = (UINT8 *) SubTable + ArrayOffset;
802239340Sjkim
803239340Sjkim        Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
804239340Sjkim                    SubTable->Length, AcpiDmTableInfoDbg2Name);
805239340Sjkim        if (ACPI_FAILURE (Status))
806239340Sjkim        {
807239340Sjkim            return;
808239340Sjkim        }
809239340Sjkim
810239340Sjkim        /* Dump the OemData (optional) */
811239340Sjkim
812239340Sjkim        AcpiDmDumpBuffer (SubTable, SubTable->OemDataOffset, SubTable->OemDataLength,
813239340Sjkim            Offset + SubTable->OemDataOffset, "OEM Data");
814239340Sjkim
815239340Sjkim        /* Point to next sub-table */
816239340Sjkim
817239340Sjkim        Offset += SubTable->Length;
818239340Sjkim        SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable,
819239340Sjkim                    SubTable->Length);
820239340Sjkim    }
821239340Sjkim}
822239340Sjkim
823239340Sjkim
824239340Sjkim/*******************************************************************************
825239340Sjkim *
826167802Sjkim * FUNCTION:    AcpiDmDumpDmar
827167802Sjkim *
828167802Sjkim * PARAMETERS:  Table               - A DMAR table
829167802Sjkim *
830167802Sjkim * RETURN:      None
831167802Sjkim *
832167802Sjkim * DESCRIPTION: Format the contents of a DMAR. This table type consists
833167802Sjkim *              of an open-ended number of subtables.
834167802Sjkim *
835167802Sjkim ******************************************************************************/
836167802Sjkim
837239340Sjkim
838167802Sjkimvoid
839167802SjkimAcpiDmDumpDmar (
840167802Sjkim    ACPI_TABLE_HEADER       *Table)
841167802Sjkim{
842193529Sjkim    ACPI_STATUS             Status;
843167802Sjkim    ACPI_DMAR_HEADER        *SubTable;
844167802Sjkim    UINT32                  Length = Table->Length;
845167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_DMAR);
846167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
847167802Sjkim    ACPI_DMAR_DEVICE_SCOPE  *ScopeTable;
848167802Sjkim    UINT32                  ScopeOffset;
849167802Sjkim    UINT8                   *PciPath;
850167802Sjkim    UINT32                  PathOffset;
851167802Sjkim
852167802Sjkim
853167802Sjkim    /* Main table */
854167802Sjkim
855193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
856193529Sjkim    if (ACPI_FAILURE (Status))
857193529Sjkim    {
858193529Sjkim        return;
859193529Sjkim    }
860167802Sjkim
861167802Sjkim    /* Sub-tables */
862167802Sjkim
863167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
864167802Sjkim    while (Offset < Table->Length)
865167802Sjkim    {
866167802Sjkim        /* Common sub-table header */
867167802Sjkim
868167802Sjkim        AcpiOsPrintf ("\n");
869193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
870193529Sjkim                    SubTable->Length, AcpiDmTableInfoDmarHdr);
871193529Sjkim        if (ACPI_FAILURE (Status))
872193529Sjkim        {
873193529Sjkim            return;
874193529Sjkim        }
875252279Sjkim        AcpiOsPrintf ("\n");
876167802Sjkim
877167802Sjkim        switch (SubTable->Type)
878167802Sjkim        {
879167802Sjkim        case ACPI_DMAR_TYPE_HARDWARE_UNIT:
880250838Sjkim
881167802Sjkim            InfoTable = AcpiDmTableInfoDmar0;
882167802Sjkim            ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
883167802Sjkim            break;
884250838Sjkim
885167802Sjkim        case ACPI_DMAR_TYPE_RESERVED_MEMORY:
886250838Sjkim
887167802Sjkim            InfoTable = AcpiDmTableInfoDmar1;
888167802Sjkim            ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
889167802Sjkim            break;
890250838Sjkim
891193529Sjkim        case ACPI_DMAR_TYPE_ATSR:
892250838Sjkim
893193529Sjkim            InfoTable = AcpiDmTableInfoDmar2;
894193529Sjkim            ScopeOffset = sizeof (ACPI_DMAR_ATSR);
895193529Sjkim            break;
896250838Sjkim
897197104Sjkim        case ACPI_DMAR_HARDWARE_AFFINITY:
898250838Sjkim
899197104Sjkim            InfoTable = AcpiDmTableInfoDmar3;
900197104Sjkim            ScopeOffset = sizeof (ACPI_DMAR_RHSA);
901197104Sjkim            break;
902250838Sjkim
903167802Sjkim        default:
904250838Sjkim
905204773Sjkim            AcpiOsPrintf ("\n**** Unknown DMAR sub-table type 0x%X\n\n", SubTable->Type);
906167802Sjkim            return;
907167802Sjkim        }
908167802Sjkim
909193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
910193529Sjkim                    SubTable->Length, InfoTable);
911193529Sjkim        if (ACPI_FAILURE (Status))
912193529Sjkim        {
913193529Sjkim            return;
914193529Sjkim        }
915167802Sjkim
916193529Sjkim        /* Dump the device scope entries (if any) */
917193529Sjkim
918193529Sjkim        ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset);
919193529Sjkim        while (ScopeOffset < SubTable->Length)
920167802Sjkim        {
921193529Sjkim            AcpiOsPrintf ("\n");
922193529Sjkim            Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
923193529Sjkim                        ScopeTable->Length, AcpiDmTableInfoDmarScope);
924193529Sjkim            if (ACPI_FAILURE (Status))
925167802Sjkim            {
926193529Sjkim                return;
927193529Sjkim            }
928252279Sjkim            AcpiOsPrintf ("\n");
929167802Sjkim
930193529Sjkim            /* Dump the PCI Path entries for this device scope */
931167802Sjkim
932193529Sjkim            PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
933167802Sjkim
934193529Sjkim            PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
935193529Sjkim                sizeof (ACPI_DMAR_DEVICE_SCOPE));
936167802Sjkim
937193529Sjkim            while (PathOffset < ScopeTable->Length)
938193529Sjkim            {
939193529Sjkim                AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, "PCI Path");
940209746Sjkim                AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
941167802Sjkim
942193529Sjkim                /* Point to next PCI Path entry */
943167802Sjkim
944193529Sjkim                PathOffset += 2;
945193529Sjkim                PciPath += 2;
946252279Sjkim                AcpiOsPrintf ("\n");
947193529Sjkim            }
948167802Sjkim
949193529Sjkim            /* Point to next device scope entry */
950167802Sjkim
951193529Sjkim            ScopeOffset += ScopeTable->Length;
952193529Sjkim            ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
953193529Sjkim                ScopeTable, ScopeTable->Length);
954167802Sjkim        }
955167802Sjkim
956167802Sjkim        /* Point to next sub-table */
957167802Sjkim
958167802Sjkim        Offset += SubTable->Length;
959167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, SubTable->Length);
960167802Sjkim    }
961167802Sjkim}
962167802Sjkim
963167802Sjkim
964167802Sjkim/*******************************************************************************
965167802Sjkim *
966193529Sjkim * FUNCTION:    AcpiDmDumpEinj
967193529Sjkim *
968193529Sjkim * PARAMETERS:  Table               - A EINJ table
969193529Sjkim *
970193529Sjkim * RETURN:      None
971193529Sjkim *
972193529Sjkim * DESCRIPTION: Format the contents of a EINJ. This table type consists
973193529Sjkim *              of an open-ended number of subtables.
974193529Sjkim *
975193529Sjkim ******************************************************************************/
976193529Sjkim
977193529Sjkimvoid
978193529SjkimAcpiDmDumpEinj (
979193529Sjkim    ACPI_TABLE_HEADER       *Table)
980193529Sjkim{
981193529Sjkim    ACPI_STATUS             Status;
982193529Sjkim    ACPI_WHEA_HEADER        *SubTable;
983193529Sjkim    UINT32                  Length = Table->Length;
984193529Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_EINJ);
985193529Sjkim
986193529Sjkim
987193529Sjkim    /* Main table */
988193529Sjkim
989193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
990193529Sjkim    if (ACPI_FAILURE (Status))
991193529Sjkim    {
992193529Sjkim        return;
993193529Sjkim    }
994193529Sjkim
995193529Sjkim    /* Sub-tables */
996193529Sjkim
997193529Sjkim    SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
998193529Sjkim    while (Offset < Table->Length)
999193529Sjkim    {
1000193529Sjkim        AcpiOsPrintf ("\n");
1001193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1002193529Sjkim                    sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
1003193529Sjkim        if (ACPI_FAILURE (Status))
1004193529Sjkim        {
1005193529Sjkim            return;
1006193529Sjkim        }
1007193529Sjkim
1008193529Sjkim        /* Point to next sub-table (each subtable is of fixed length) */
1009193529Sjkim
1010193529Sjkim        Offset += sizeof (ACPI_WHEA_HEADER);
1011193529Sjkim        SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
1012193529Sjkim                        sizeof (ACPI_WHEA_HEADER));
1013193529Sjkim    }
1014193529Sjkim}
1015193529Sjkim
1016193529Sjkim
1017193529Sjkim/*******************************************************************************
1018193529Sjkim *
1019193529Sjkim * FUNCTION:    AcpiDmDumpErst
1020193529Sjkim *
1021193529Sjkim * PARAMETERS:  Table               - A ERST table
1022193529Sjkim *
1023193529Sjkim * RETURN:      None
1024193529Sjkim *
1025193529Sjkim * DESCRIPTION: Format the contents of a ERST. This table type consists
1026193529Sjkim *              of an open-ended number of subtables.
1027193529Sjkim *
1028193529Sjkim ******************************************************************************/
1029193529Sjkim
1030193529Sjkimvoid
1031193529SjkimAcpiDmDumpErst (
1032193529Sjkim    ACPI_TABLE_HEADER       *Table)
1033193529Sjkim{
1034193529Sjkim    ACPI_STATUS             Status;
1035193529Sjkim    ACPI_WHEA_HEADER        *SubTable;
1036193529Sjkim    UINT32                  Length = Table->Length;
1037193529Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_ERST);
1038193529Sjkim
1039193529Sjkim
1040193529Sjkim    /* Main table */
1041193529Sjkim
1042193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
1043193529Sjkim    if (ACPI_FAILURE (Status))
1044193529Sjkim    {
1045193529Sjkim        return;
1046193529Sjkim    }
1047193529Sjkim
1048193529Sjkim    /* Sub-tables */
1049193529Sjkim
1050193529Sjkim    SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1051193529Sjkim    while (Offset < Table->Length)
1052193529Sjkim    {
1053193529Sjkim        AcpiOsPrintf ("\n");
1054193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1055209746Sjkim                    sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
1056193529Sjkim        if (ACPI_FAILURE (Status))
1057193529Sjkim        {
1058193529Sjkim            return;
1059193529Sjkim        }
1060193529Sjkim
1061193529Sjkim        /* Point to next sub-table (each subtable is of fixed length) */
1062193529Sjkim
1063193529Sjkim        Offset += sizeof (ACPI_WHEA_HEADER);
1064193529Sjkim        SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
1065193529Sjkim                        sizeof (ACPI_WHEA_HEADER));
1066193529Sjkim    }
1067193529Sjkim}
1068193529Sjkim
1069193529Sjkim
1070193529Sjkim/*******************************************************************************
1071193529Sjkim *
1072228110Sjkim * FUNCTION:    AcpiDmDumpFpdt
1073228110Sjkim *
1074228110Sjkim * PARAMETERS:  Table               - A FPDT table
1075228110Sjkim *
1076228110Sjkim * RETURN:      None
1077228110Sjkim *
1078228110Sjkim * DESCRIPTION: Format the contents of a FPDT. This table type consists
1079228110Sjkim *              of an open-ended number of subtables.
1080228110Sjkim *
1081228110Sjkim ******************************************************************************/
1082228110Sjkim
1083228110Sjkimvoid
1084228110SjkimAcpiDmDumpFpdt (
1085228110Sjkim    ACPI_TABLE_HEADER       *Table)
1086228110Sjkim{
1087228110Sjkim    ACPI_STATUS             Status;
1088228110Sjkim    ACPI_FPDT_HEADER        *SubTable;
1089228110Sjkim    UINT32                  Length = Table->Length;
1090228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
1091228110Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1092228110Sjkim
1093228110Sjkim
1094228110Sjkim    /* There is no main table (other than the standard ACPI header) */
1095228110Sjkim
1096228110Sjkim    /* Sub-tables */
1097228110Sjkim
1098228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
1099228110Sjkim    while (Offset < Table->Length)
1100228110Sjkim    {
1101228110Sjkim        /* Common sub-table header */
1102228110Sjkim
1103228110Sjkim        AcpiOsPrintf ("\n");
1104228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1105228110Sjkim                    SubTable->Length, AcpiDmTableInfoFpdtHdr);
1106228110Sjkim        if (ACPI_FAILURE (Status))
1107228110Sjkim        {
1108228110Sjkim            return;
1109228110Sjkim        }
1110228110Sjkim
1111228110Sjkim        switch (SubTable->Type)
1112228110Sjkim        {
1113228110Sjkim        case ACPI_FPDT_TYPE_BOOT:
1114250838Sjkim
1115228110Sjkim            InfoTable = AcpiDmTableInfoFpdt0;
1116228110Sjkim            break;
1117250838Sjkim
1118228110Sjkim        case ACPI_FPDT_TYPE_S3PERF:
1119250838Sjkim
1120228110Sjkim            InfoTable = AcpiDmTableInfoFpdt1;
1121228110Sjkim            break;
1122250838Sjkim
1123228110Sjkim        default:
1124250838Sjkim
1125228110Sjkim            AcpiOsPrintf ("\n**** Unknown FPDT sub-table type 0x%X\n\n", SubTable->Type);
1126228110Sjkim
1127228110Sjkim            /* Attempt to continue */
1128228110Sjkim
1129228110Sjkim            if (!SubTable->Length)
1130228110Sjkim            {
1131228110Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
1132228110Sjkim                return;
1133228110Sjkim            }
1134228110Sjkim            goto NextSubTable;
1135228110Sjkim        }
1136228110Sjkim
1137228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1138228110Sjkim                    SubTable->Length, InfoTable);
1139228110Sjkim        if (ACPI_FAILURE (Status))
1140228110Sjkim        {
1141228110Sjkim            return;
1142228110Sjkim        }
1143228110Sjkim
1144228110SjkimNextSubTable:
1145228110Sjkim        /* Point to next sub-table */
1146228110Sjkim
1147228110Sjkim        Offset += SubTable->Length;
1148228110Sjkim        SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length);
1149228110Sjkim    }
1150228110Sjkim}
1151228110Sjkim
1152228110Sjkim
1153228110Sjkim/*******************************************************************************
1154228110Sjkim *
1155193529Sjkim * FUNCTION:    AcpiDmDumpHest
1156193529Sjkim *
1157193529Sjkim * PARAMETERS:  Table               - A HEST table
1158193529Sjkim *
1159193529Sjkim * RETURN:      None
1160193529Sjkim *
1161193529Sjkim * DESCRIPTION: Format the contents of a HEST. This table type consists
1162193529Sjkim *              of an open-ended number of subtables.
1163193529Sjkim *
1164193529Sjkim ******************************************************************************/
1165193529Sjkim
1166193529Sjkimvoid
1167193529SjkimAcpiDmDumpHest (
1168193529Sjkim    ACPI_TABLE_HEADER       *Table)
1169193529Sjkim{
1170193529Sjkim    ACPI_STATUS             Status;
1171193529Sjkim    ACPI_HEST_HEADER        *SubTable;
1172193529Sjkim    UINT32                  Length = Table->Length;
1173193529Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_HEST);
1174193529Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1175193529Sjkim    UINT32                  SubTableLength;
1176197104Sjkim    UINT32                  BankCount;
1177197104Sjkim    ACPI_HEST_IA_ERROR_BANK *BankTable;
1178193529Sjkim
1179193529Sjkim
1180193529Sjkim    /* Main table */
1181193529Sjkim
1182193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
1183193529Sjkim    if (ACPI_FAILURE (Status))
1184193529Sjkim    {
1185193529Sjkim        return;
1186193529Sjkim    }
1187193529Sjkim
1188193529Sjkim    /* Sub-tables */
1189193529Sjkim
1190193529Sjkim    SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
1191193529Sjkim    while (Offset < Table->Length)
1192193529Sjkim    {
1193197104Sjkim        BankCount = 0;
1194193529Sjkim        switch (SubTable->Type)
1195193529Sjkim        {
1196197104Sjkim        case ACPI_HEST_TYPE_IA32_CHECK:
1197250838Sjkim
1198193529Sjkim            InfoTable = AcpiDmTableInfoHest0;
1199197104Sjkim            SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
1200197104Sjkim            BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1201197104Sjkim                            SubTable))->NumHardwareBanks;
1202193529Sjkim            break;
1203193529Sjkim
1204197104Sjkim        case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1205250838Sjkim
1206193529Sjkim            InfoTable = AcpiDmTableInfoHest1;
1207197104Sjkim            SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED);
1208197104Sjkim            BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1209197104Sjkim                            SubTable))->NumHardwareBanks;
1210193529Sjkim            break;
1211193529Sjkim
1212197104Sjkim        case ACPI_HEST_TYPE_IA32_NMI:
1213250838Sjkim
1214197104Sjkim            InfoTable = AcpiDmTableInfoHest2;
1215197104Sjkim            SubTableLength = sizeof (ACPI_HEST_IA_NMI);
1216193529Sjkim            break;
1217193529Sjkim
1218193529Sjkim        case ACPI_HEST_TYPE_AER_ROOT_PORT:
1219250838Sjkim
1220193529Sjkim            InfoTable = AcpiDmTableInfoHest6;
1221193529Sjkim            SubTableLength = sizeof (ACPI_HEST_AER_ROOT);
1222193529Sjkim            break;
1223193529Sjkim
1224193529Sjkim        case ACPI_HEST_TYPE_AER_ENDPOINT:
1225250838Sjkim
1226193529Sjkim            InfoTable = AcpiDmTableInfoHest7;
1227193529Sjkim            SubTableLength = sizeof (ACPI_HEST_AER);
1228193529Sjkim            break;
1229193529Sjkim
1230193529Sjkim        case ACPI_HEST_TYPE_AER_BRIDGE:
1231250838Sjkim
1232193529Sjkim            InfoTable = AcpiDmTableInfoHest8;
1233193529Sjkim            SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE);
1234193529Sjkim            break;
1235193529Sjkim
1236197104Sjkim        case ACPI_HEST_TYPE_GENERIC_ERROR:
1237250838Sjkim
1238193529Sjkim            InfoTable = AcpiDmTableInfoHest9;
1239193529Sjkim            SubTableLength = sizeof (ACPI_HEST_GENERIC);
1240193529Sjkim            break;
1241193529Sjkim
1242193529Sjkim        default:
1243250838Sjkim
1244193529Sjkim            /* Cannot continue on unknown type - no length */
1245193529Sjkim
1246204773Sjkim            AcpiOsPrintf ("\n**** Unknown HEST sub-table type 0x%X\n", SubTable->Type);
1247193529Sjkim            return;
1248193529Sjkim        }
1249193529Sjkim
1250193529Sjkim        AcpiOsPrintf ("\n");
1251193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1252193529Sjkim                    SubTableLength, InfoTable);
1253193529Sjkim        if (ACPI_FAILURE (Status))
1254193529Sjkim        {
1255193529Sjkim            return;
1256193529Sjkim        }
1257193529Sjkim
1258197104Sjkim        /* Point to end of current subtable (each subtable above is of fixed length) */
1259193529Sjkim
1260193529Sjkim        Offset += SubTableLength;
1261197104Sjkim
1262197104Sjkim        /* If there are any (fixed-length) Error Banks from above, dump them now */
1263197104Sjkim
1264197104Sjkim        if (BankCount)
1265197104Sjkim        {
1266197104Sjkim            BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, SubTableLength);
1267197104Sjkim            SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
1268197104Sjkim
1269197104Sjkim            while (BankCount)
1270197104Sjkim            {
1271197104Sjkim                AcpiOsPrintf ("\n");
1272197104Sjkim                Status = AcpiDmDumpTable (Length, Offset, BankTable,
1273197104Sjkim                            sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
1274197104Sjkim                if (ACPI_FAILURE (Status))
1275197104Sjkim                {
1276197104Sjkim                    return;
1277197104Sjkim                }
1278197104Sjkim                Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
1279197104Sjkim                BankTable++;
1280197104Sjkim                BankCount--;
1281197104Sjkim            }
1282197104Sjkim        }
1283197104Sjkim
1284197104Sjkim        /* Point to next sub-table */
1285197104Sjkim
1286193529Sjkim        SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength);
1287193529Sjkim    }
1288193529Sjkim}
1289193529Sjkim
1290193529Sjkim
1291193529Sjkim/*******************************************************************************
1292193529Sjkim *
1293197104Sjkim * FUNCTION:    AcpiDmDumpIvrs
1294197104Sjkim *
1295197104Sjkim * PARAMETERS:  Table               - A IVRS table
1296197104Sjkim *
1297197104Sjkim * RETURN:      None
1298197104Sjkim *
1299197104Sjkim * DESCRIPTION: Format the contents of a IVRS
1300197104Sjkim *
1301197104Sjkim ******************************************************************************/
1302197104Sjkim
1303197104Sjkimstatic UINT8 EntrySizes[] = {4,8,16,32};
1304197104Sjkim
1305197104Sjkimvoid
1306197104SjkimAcpiDmDumpIvrs (
1307197104Sjkim    ACPI_TABLE_HEADER       *Table)
1308197104Sjkim{
1309197104Sjkim    ACPI_STATUS             Status;
1310197104Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_IVRS);
1311197104Sjkim    UINT32                  EntryOffset;
1312197104Sjkim    UINT32                  EntryLength;
1313197104Sjkim    UINT32                  EntryType;
1314197104Sjkim    ACPI_IVRS_DE_HEADER     *DeviceEntry;
1315197104Sjkim    ACPI_IVRS_HEADER        *SubTable;
1316197104Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1317197104Sjkim
1318197104Sjkim
1319197104Sjkim    /* Main table */
1320197104Sjkim
1321197104Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
1322197104Sjkim    if (ACPI_FAILURE (Status))
1323197104Sjkim    {
1324197104Sjkim        return;
1325197104Sjkim    }
1326197104Sjkim
1327197104Sjkim    /* Sub-tables */
1328197104Sjkim
1329197104Sjkim    SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
1330197104Sjkim    while (Offset < Table->Length)
1331197104Sjkim    {
1332197104Sjkim        /* Common sub-table header */
1333197104Sjkim
1334197104Sjkim        AcpiOsPrintf ("\n");
1335197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1336197104Sjkim                    SubTable->Length, AcpiDmTableInfoIvrsHdr);
1337197104Sjkim        if (ACPI_FAILURE (Status))
1338197104Sjkim        {
1339197104Sjkim            return;
1340197104Sjkim        }
1341197104Sjkim
1342197104Sjkim        switch (SubTable->Type)
1343197104Sjkim        {
1344197104Sjkim        case ACPI_IVRS_TYPE_HARDWARE:
1345250838Sjkim
1346197104Sjkim            InfoTable = AcpiDmTableInfoIvrs0;
1347197104Sjkim            break;
1348250838Sjkim
1349197104Sjkim        case ACPI_IVRS_TYPE_MEMORY1:
1350197104Sjkim        case ACPI_IVRS_TYPE_MEMORY2:
1351197104Sjkim        case ACPI_IVRS_TYPE_MEMORY3:
1352250838Sjkim
1353197104Sjkim            InfoTable = AcpiDmTableInfoIvrs1;
1354197104Sjkim            break;
1355250838Sjkim
1356197104Sjkim        default:
1357250838Sjkim
1358204773Sjkim            AcpiOsPrintf ("\n**** Unknown IVRS sub-table type 0x%X\n",
1359197104Sjkim                SubTable->Type);
1360197104Sjkim
1361197104Sjkim            /* Attempt to continue */
1362197104Sjkim
1363197104Sjkim            if (!SubTable->Length)
1364197104Sjkim            {
1365197104Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
1366197104Sjkim                return;
1367197104Sjkim            }
1368197104Sjkim            goto NextSubTable;
1369197104Sjkim        }
1370197104Sjkim
1371197104Sjkim        /* Dump the subtable */
1372197104Sjkim
1373197104Sjkim        AcpiOsPrintf ("\n");
1374197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1375197104Sjkim                    SubTable->Length, InfoTable);
1376197104Sjkim        if (ACPI_FAILURE (Status))
1377197104Sjkim        {
1378197104Sjkim            return;
1379197104Sjkim        }
1380197104Sjkim
1381197104Sjkim        /* The hardware subtable can contain multiple device entries */
1382197104Sjkim
1383197104Sjkim        if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE)
1384197104Sjkim        {
1385197104Sjkim            EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE);
1386197104Sjkim            DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable,
1387197104Sjkim                            sizeof (ACPI_IVRS_HARDWARE));
1388197104Sjkim
1389197104Sjkim            while (EntryOffset < (Offset + SubTable->Length))
1390197104Sjkim            {
1391197104Sjkim                AcpiOsPrintf ("\n");
1392197104Sjkim                /*
1393197104Sjkim                 * Upper 2 bits of Type encode the length of the device entry
1394197104Sjkim                 *
1395197104Sjkim                 * 00 = 4 byte
1396197104Sjkim                 * 01 = 8 byte
1397197104Sjkim                 * 10 = 16 byte - currently no entries defined
1398197104Sjkim                 * 11 = 32 byte - currently no entries defined
1399197104Sjkim                 */
1400197104Sjkim                EntryType = DeviceEntry->Type;
1401197104Sjkim                EntryLength = EntrySizes [EntryType >> 6];
1402197104Sjkim
1403197104Sjkim                switch (EntryType)
1404197104Sjkim                {
1405197104Sjkim                /* 4-byte device entries */
1406197104Sjkim
1407197104Sjkim                case ACPI_IVRS_TYPE_PAD4:
1408197104Sjkim                case ACPI_IVRS_TYPE_ALL:
1409197104Sjkim                case ACPI_IVRS_TYPE_SELECT:
1410197104Sjkim                case ACPI_IVRS_TYPE_START:
1411197104Sjkim                case ACPI_IVRS_TYPE_END:
1412197104Sjkim
1413197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs4;
1414197104Sjkim                    break;
1415197104Sjkim
1416197104Sjkim                /* 8-byte entries, type A */
1417197104Sjkim
1418197104Sjkim                case ACPI_IVRS_TYPE_ALIAS_SELECT:
1419197104Sjkim                case ACPI_IVRS_TYPE_ALIAS_START:
1420197104Sjkim
1421197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs8a;
1422197104Sjkim                    break;
1423197104Sjkim
1424197104Sjkim                /* 8-byte entries, type B */
1425197104Sjkim
1426197104Sjkim                case ACPI_IVRS_TYPE_PAD8:
1427197104Sjkim                case ACPI_IVRS_TYPE_EXT_SELECT:
1428197104Sjkim                case ACPI_IVRS_TYPE_EXT_START:
1429197104Sjkim
1430197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs8b;
1431197104Sjkim                    break;
1432197104Sjkim
1433197104Sjkim                /* 8-byte entries, type C */
1434197104Sjkim
1435197104Sjkim                case ACPI_IVRS_TYPE_SPECIAL:
1436197104Sjkim
1437197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs8c;
1438197104Sjkim                    break;
1439197104Sjkim
1440197104Sjkim                default:
1441197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs4;
1442197104Sjkim                    AcpiOsPrintf (
1443197104Sjkim                        "\n**** Unknown IVRS device entry type/length: "
1444204773Sjkim                        "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
1445197104Sjkim                        EntryType, EntryLength, EntryOffset);
1446197104Sjkim                    break;
1447197104Sjkim                }
1448197104Sjkim
1449197104Sjkim                /* Dump the Device Entry */
1450197104Sjkim
1451197104Sjkim                Status = AcpiDmDumpTable (Table->Length, EntryOffset,
1452197104Sjkim                            DeviceEntry, EntryLength, InfoTable);
1453197104Sjkim
1454197104Sjkim                EntryOffset += EntryLength;
1455197104Sjkim                DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
1456197104Sjkim                                EntryLength);
1457197104Sjkim            }
1458197104Sjkim        }
1459197104Sjkim
1460197104SjkimNextSubTable:
1461197104Sjkim        /* Point to next sub-table */
1462197104Sjkim
1463197104Sjkim        Offset += SubTable->Length;
1464197104Sjkim        SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length);
1465197104Sjkim    }
1466197104Sjkim}
1467197104Sjkim
1468197104Sjkim
1469197104Sjkim/*******************************************************************************
1470197104Sjkim *
1471167802Sjkim * FUNCTION:    AcpiDmDumpMadt
1472167802Sjkim *
1473167802Sjkim * PARAMETERS:  Table               - A MADT table
1474167802Sjkim *
1475167802Sjkim * RETURN:      None
1476167802Sjkim *
1477167802Sjkim * DESCRIPTION: Format the contents of a MADT. This table type consists
1478167802Sjkim *              of an open-ended number of subtables.
1479167802Sjkim *
1480167802Sjkim ******************************************************************************/
1481167802Sjkim
1482167802Sjkimvoid
1483167802SjkimAcpiDmDumpMadt (
1484167802Sjkim    ACPI_TABLE_HEADER       *Table)
1485167802Sjkim{
1486193529Sjkim    ACPI_STATUS             Status;
1487167802Sjkim    ACPI_SUBTABLE_HEADER    *SubTable;
1488167802Sjkim    UINT32                  Length = Table->Length;
1489167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MADT);
1490167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1491167802Sjkim
1492167802Sjkim
1493167802Sjkim    /* Main table */
1494167802Sjkim
1495193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
1496193529Sjkim    if (ACPI_FAILURE (Status))
1497193529Sjkim    {
1498193529Sjkim        return;
1499193529Sjkim    }
1500167802Sjkim
1501167802Sjkim    /* Sub-tables */
1502167802Sjkim
1503167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
1504167802Sjkim    while (Offset < Table->Length)
1505167802Sjkim    {
1506167802Sjkim        /* Common sub-table header */
1507167802Sjkim
1508167802Sjkim        AcpiOsPrintf ("\n");
1509193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1510193529Sjkim                    SubTable->Length, AcpiDmTableInfoMadtHdr);
1511193529Sjkim        if (ACPI_FAILURE (Status))
1512193529Sjkim        {
1513193529Sjkim            return;
1514193529Sjkim        }
1515167802Sjkim
1516167802Sjkim        switch (SubTable->Type)
1517167802Sjkim        {
1518167802Sjkim        case ACPI_MADT_TYPE_LOCAL_APIC:
1519250838Sjkim
1520167802Sjkim            InfoTable = AcpiDmTableInfoMadt0;
1521167802Sjkim            break;
1522250838Sjkim
1523167802Sjkim        case ACPI_MADT_TYPE_IO_APIC:
1524250838Sjkim
1525167802Sjkim            InfoTable = AcpiDmTableInfoMadt1;
1526167802Sjkim            break;
1527250838Sjkim
1528167802Sjkim        case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
1529250838Sjkim
1530167802Sjkim            InfoTable = AcpiDmTableInfoMadt2;
1531167802Sjkim            break;
1532250838Sjkim
1533167802Sjkim        case ACPI_MADT_TYPE_NMI_SOURCE:
1534250838Sjkim
1535167802Sjkim            InfoTable = AcpiDmTableInfoMadt3;
1536167802Sjkim            break;
1537250838Sjkim
1538167802Sjkim        case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
1539250838Sjkim
1540167802Sjkim            InfoTable = AcpiDmTableInfoMadt4;
1541167802Sjkim            break;
1542250838Sjkim
1543167802Sjkim        case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
1544250838Sjkim
1545167802Sjkim            InfoTable = AcpiDmTableInfoMadt5;
1546167802Sjkim            break;
1547250838Sjkim
1548167802Sjkim        case ACPI_MADT_TYPE_IO_SAPIC:
1549250838Sjkim
1550167802Sjkim            InfoTable = AcpiDmTableInfoMadt6;
1551167802Sjkim            break;
1552250838Sjkim
1553167802Sjkim        case ACPI_MADT_TYPE_LOCAL_SAPIC:
1554250838Sjkim
1555167802Sjkim            InfoTable = AcpiDmTableInfoMadt7;
1556167802Sjkim            break;
1557250838Sjkim
1558167802Sjkim        case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
1559250838Sjkim
1560167802Sjkim            InfoTable = AcpiDmTableInfoMadt8;
1561167802Sjkim            break;
1562250838Sjkim
1563193529Sjkim        case ACPI_MADT_TYPE_LOCAL_X2APIC:
1564250838Sjkim
1565193529Sjkim            InfoTable = AcpiDmTableInfoMadt9;
1566193529Sjkim            break;
1567250838Sjkim
1568193529Sjkim        case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
1569250838Sjkim
1570193529Sjkim            InfoTable = AcpiDmTableInfoMadt10;
1571193529Sjkim            break;
1572250838Sjkim
1573228110Sjkim        case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
1574250838Sjkim
1575228110Sjkim            InfoTable = AcpiDmTableInfoMadt11;
1576228110Sjkim            break;
1577250838Sjkim
1578228110Sjkim        case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
1579250838Sjkim
1580228110Sjkim            InfoTable = AcpiDmTableInfoMadt12;
1581228110Sjkim            break;
1582250838Sjkim
1583167802Sjkim        default:
1584250838Sjkim
1585204773Sjkim            AcpiOsPrintf ("\n**** Unknown MADT sub-table type 0x%X\n\n", SubTable->Type);
1586193529Sjkim
1587193529Sjkim            /* Attempt to continue */
1588193529Sjkim
1589193529Sjkim            if (!SubTable->Length)
1590193529Sjkim            {
1591193529Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
1592193529Sjkim                return;
1593193529Sjkim            }
1594193529Sjkim            goto NextSubTable;
1595193529Sjkim        }
1596193529Sjkim
1597193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1598193529Sjkim                    SubTable->Length, InfoTable);
1599193529Sjkim        if (ACPI_FAILURE (Status))
1600193529Sjkim        {
1601167802Sjkim            return;
1602167802Sjkim        }
1603167802Sjkim
1604193529SjkimNextSubTable:
1605167802Sjkim        /* Point to next sub-table */
1606167802Sjkim
1607167802Sjkim        Offset += SubTable->Length;
1608167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
1609167802Sjkim    }
1610167802Sjkim}
1611167802Sjkim
1612167802Sjkim
1613167802Sjkim/*******************************************************************************
1614167802Sjkim *
1615167802Sjkim * FUNCTION:    AcpiDmDumpMcfg
1616167802Sjkim *
1617167802Sjkim * PARAMETERS:  Table               - A MCFG Table
1618167802Sjkim *
1619167802Sjkim * RETURN:      None
1620167802Sjkim *
1621167802Sjkim * DESCRIPTION: Format the contents of a MCFG table
1622167802Sjkim *
1623167802Sjkim ******************************************************************************/
1624167802Sjkim
1625167802Sjkimvoid
1626167802SjkimAcpiDmDumpMcfg (
1627167802Sjkim    ACPI_TABLE_HEADER       *Table)
1628167802Sjkim{
1629193529Sjkim    ACPI_STATUS             Status;
1630167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MCFG);
1631167802Sjkim    ACPI_MCFG_ALLOCATION    *SubTable;
1632167802Sjkim
1633167802Sjkim
1634167802Sjkim    /* Main table */
1635167802Sjkim
1636193529Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
1637193529Sjkim    if (ACPI_FAILURE (Status))
1638193529Sjkim    {
1639193529Sjkim        return;
1640193529Sjkim    }
1641167802Sjkim
1642167802Sjkim    /* Sub-tables */
1643167802Sjkim
1644167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
1645167802Sjkim    while (Offset < Table->Length)
1646167802Sjkim    {
1647167802Sjkim        if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
1648167802Sjkim        {
1649209746Sjkim            AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
1650167802Sjkim                sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
1651167802Sjkim            return;
1652167802Sjkim        }
1653167802Sjkim
1654167802Sjkim        AcpiOsPrintf ("\n");
1655193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1656193529Sjkim                    sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
1657193529Sjkim        if (ACPI_FAILURE (Status))
1658193529Sjkim        {
1659193529Sjkim            return;
1660193529Sjkim        }
1661167802Sjkim
1662167802Sjkim        /* Point to next sub-table (each subtable is of fixed length) */
1663167802Sjkim
1664167802Sjkim        Offset += sizeof (ACPI_MCFG_ALLOCATION);
1665167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable,
1666167802Sjkim                        sizeof (ACPI_MCFG_ALLOCATION));
1667167802Sjkim    }
1668167802Sjkim}
1669167802Sjkim
1670167802Sjkim
1671167802Sjkim/*******************************************************************************
1672167802Sjkim *
1673228110Sjkim * FUNCTION:    AcpiDmDumpMpst
1674228110Sjkim *
1675228110Sjkim * PARAMETERS:  Table               - A MPST Table
1676228110Sjkim *
1677228110Sjkim * RETURN:      None
1678228110Sjkim *
1679228110Sjkim * DESCRIPTION: Format the contents of a MPST table
1680228110Sjkim *
1681228110Sjkim ******************************************************************************/
1682228110Sjkim
1683228110Sjkimvoid
1684228110SjkimAcpiDmDumpMpst (
1685228110Sjkim    ACPI_TABLE_HEADER       *Table)
1686228110Sjkim{
1687228110Sjkim    ACPI_STATUS             Status;
1688228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MPST);
1689228110Sjkim    ACPI_MPST_POWER_NODE    *SubTable0;
1690228110Sjkim    ACPI_MPST_POWER_STATE   *SubTable0A;
1691228110Sjkim    ACPI_MPST_COMPONENT     *SubTable0B;
1692228110Sjkim    ACPI_MPST_DATA_HDR      *SubTable1;
1693228110Sjkim    ACPI_MPST_POWER_DATA    *SubTable2;
1694228110Sjkim    UINT16                  SubtableCount;
1695241973Sjkim    UINT32                  PowerStateCount;
1696241973Sjkim    UINT32                  ComponentCount;
1697228110Sjkim
1698228110Sjkim
1699228110Sjkim    /* Main table */
1700228110Sjkim
1701228110Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
1702228110Sjkim    if (ACPI_FAILURE (Status))
1703228110Sjkim    {
1704228110Sjkim        return;
1705228110Sjkim    }
1706228110Sjkim
1707228110Sjkim    /* Subtable: Memory Power Node(s) */
1708228110Sjkim
1709228110Sjkim    SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
1710228110Sjkim    SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
1711228110Sjkim
1712228110Sjkim    while ((Offset < Table->Length) && SubtableCount)
1713228110Sjkim    {
1714228110Sjkim        AcpiOsPrintf ("\n");
1715228110Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0,
1716228110Sjkim                    sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
1717228110Sjkim        if (ACPI_FAILURE (Status))
1718228110Sjkim        {
1719228110Sjkim            return;
1720228110Sjkim        }
1721228110Sjkim
1722228110Sjkim        /* Extract the sub-subtable counts */
1723228110Sjkim
1724228110Sjkim        PowerStateCount = SubTable0->NumPowerStates;
1725228110Sjkim        ComponentCount = SubTable0->NumPhysicalComponents;
1726228110Sjkim        Offset += sizeof (ACPI_MPST_POWER_NODE);
1727228110Sjkim
1728228110Sjkim        /* Sub-subtables - Memory Power State Structure(s) */
1729228110Sjkim
1730228110Sjkim        SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0,
1731228110Sjkim            sizeof (ACPI_MPST_POWER_NODE));
1732228110Sjkim
1733228110Sjkim        while (PowerStateCount)
1734228110Sjkim        {
1735228110Sjkim            AcpiOsPrintf ("\n");
1736228110Sjkim            Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A,
1737228110Sjkim                        sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
1738228110Sjkim            if (ACPI_FAILURE (Status))
1739228110Sjkim            {
1740228110Sjkim                return;
1741228110Sjkim            }
1742228110Sjkim
1743228110Sjkim            SubTable0A++;
1744228110Sjkim            PowerStateCount--;
1745228110Sjkim            Offset += sizeof (ACPI_MPST_POWER_STATE);
1746228110Sjkim       }
1747228110Sjkim
1748228110Sjkim        /* Sub-subtables - Physical Component ID Structure(s) */
1749228110Sjkim
1750228110Sjkim        SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A);
1751228110Sjkim
1752228110Sjkim        if (ComponentCount)
1753228110Sjkim        {
1754228110Sjkim            AcpiOsPrintf ("\n");
1755228110Sjkim        }
1756228110Sjkim
1757228110Sjkim        while (ComponentCount)
1758228110Sjkim        {
1759228110Sjkim            Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B,
1760228110Sjkim                        sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
1761228110Sjkim            if (ACPI_FAILURE (Status))
1762228110Sjkim            {
1763228110Sjkim                return;
1764228110Sjkim            }
1765228110Sjkim
1766228110Sjkim            SubTable0B++;
1767228110Sjkim            ComponentCount--;
1768228110Sjkim            Offset += sizeof (ACPI_MPST_COMPONENT);
1769228110Sjkim        }
1770228110Sjkim
1771228110Sjkim        /* Point to next Memory Power Node subtable */
1772228110Sjkim
1773228110Sjkim        SubtableCount--;
1774228110Sjkim        SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0,
1775228110Sjkim            sizeof (ACPI_MPST_POWER_NODE) +
1776228110Sjkim            (sizeof (ACPI_MPST_POWER_STATE) * SubTable0->NumPowerStates) +
1777228110Sjkim            (sizeof (ACPI_MPST_COMPONENT) * SubTable0->NumPhysicalComponents));
1778228110Sjkim    }
1779228110Sjkim
1780228110Sjkim    /* Subtable: Count of Memory Power State Characteristic structures */
1781228110Sjkim
1782228110Sjkim    AcpiOsPrintf ("\n");
1783228110Sjkim    SubTable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, SubTable0);
1784228110Sjkim    Status = AcpiDmDumpTable (Table->Length, Offset, SubTable1,
1785228110Sjkim                sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
1786228110Sjkim    if (ACPI_FAILURE (Status))
1787228110Sjkim    {
1788228110Sjkim        return;
1789228110Sjkim    }
1790228110Sjkim
1791228110Sjkim    SubtableCount = SubTable1->CharacteristicsCount;
1792228110Sjkim    Offset += sizeof (ACPI_MPST_DATA_HDR);
1793228110Sjkim
1794228110Sjkim    /* Subtable: Memory Power State Characteristics structure(s) */
1795228110Sjkim
1796228110Sjkim    SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1, sizeof (ACPI_MPST_DATA_HDR));
1797228110Sjkim
1798228110Sjkim    while ((Offset < Table->Length) && SubtableCount)
1799228110Sjkim    {
1800228110Sjkim        AcpiOsPrintf ("\n");
1801228110Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2,
1802228110Sjkim                    sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
1803228110Sjkim        if (ACPI_FAILURE (Status))
1804228110Sjkim        {
1805228110Sjkim            return;
1806228110Sjkim        }
1807228110Sjkim
1808228110Sjkim        SubTable2++;
1809228110Sjkim        SubtableCount--;
1810228110Sjkim        Offset += sizeof (ACPI_MPST_POWER_DATA);
1811228110Sjkim    }
1812228110Sjkim}
1813228110Sjkim
1814228110Sjkim
1815228110Sjkim/*******************************************************************************
1816228110Sjkim *
1817197104Sjkim * FUNCTION:    AcpiDmDumpMsct
1818197104Sjkim *
1819197104Sjkim * PARAMETERS:  Table               - A MSCT table
1820197104Sjkim *
1821197104Sjkim * RETURN:      None
1822197104Sjkim *
1823197104Sjkim * DESCRIPTION: Format the contents of a MSCT
1824197104Sjkim *
1825197104Sjkim ******************************************************************************/
1826197104Sjkim
1827197104Sjkimvoid
1828197104SjkimAcpiDmDumpMsct (
1829197104Sjkim    ACPI_TABLE_HEADER       *Table)
1830197104Sjkim{
1831197104Sjkim    ACPI_STATUS             Status;
1832197104Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MSCT);
1833197104Sjkim    ACPI_MSCT_PROXIMITY     *SubTable;
1834197104Sjkim
1835197104Sjkim
1836197104Sjkim    /* Main table */
1837197104Sjkim
1838197104Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
1839197104Sjkim    if (ACPI_FAILURE (Status))
1840197104Sjkim    {
1841197104Sjkim        return;
1842197104Sjkim    }
1843197104Sjkim
1844197104Sjkim    /* Sub-tables */
1845197104Sjkim
1846197104Sjkim    SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
1847197104Sjkim    while (Offset < Table->Length)
1848197104Sjkim    {
1849197104Sjkim        /* Common sub-table header */
1850197104Sjkim
1851197104Sjkim        AcpiOsPrintf ("\n");
1852197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1853197104Sjkim                    sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
1854197104Sjkim        if (ACPI_FAILURE (Status))
1855197104Sjkim        {
1856197104Sjkim            return;
1857197104Sjkim        }
1858197104Sjkim
1859197104Sjkim        /* Point to next sub-table */
1860197104Sjkim
1861197104Sjkim        Offset += sizeof (ACPI_MSCT_PROXIMITY);
1862197104Sjkim        SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable, sizeof (ACPI_MSCT_PROXIMITY));
1863197104Sjkim    }
1864197104Sjkim}
1865197104Sjkim
1866197104Sjkim
1867197104Sjkim/*******************************************************************************
1868197104Sjkim *
1869246849Sjkim * FUNCTION:    AcpiDmDumpMtmr
1870246849Sjkim *
1871246849Sjkim * PARAMETERS:  Table               - A MTMR table
1872246849Sjkim *
1873246849Sjkim * RETURN:      None
1874246849Sjkim *
1875246849Sjkim * DESCRIPTION: Format the contents of a MTMR
1876246849Sjkim *
1877246849Sjkim ******************************************************************************/
1878246849Sjkim
1879246849Sjkimvoid
1880246849SjkimAcpiDmDumpMtmr (
1881246849Sjkim    ACPI_TABLE_HEADER       *Table)
1882246849Sjkim{
1883246849Sjkim    ACPI_STATUS             Status;
1884246849Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MTMR);
1885246849Sjkim    ACPI_MTMR_ENTRY         *SubTable;
1886246849Sjkim
1887246849Sjkim
1888246849Sjkim    /* Main table */
1889246849Sjkim
1890246849Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMtmr);
1891246849Sjkim    if (ACPI_FAILURE (Status))
1892246849Sjkim    {
1893246849Sjkim        return;
1894246849Sjkim    }
1895246849Sjkim
1896246849Sjkim    /* Sub-tables */
1897246849Sjkim
1898246849Sjkim    SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset);
1899246849Sjkim    while (Offset < Table->Length)
1900246849Sjkim    {
1901246849Sjkim        /* Common sub-table header */
1902246849Sjkim
1903246849Sjkim        AcpiOsPrintf ("\n");
1904246849Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1905246849Sjkim                    sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0);
1906246849Sjkim        if (ACPI_FAILURE (Status))
1907246849Sjkim        {
1908246849Sjkim            return;
1909246849Sjkim        }
1910246849Sjkim
1911246849Sjkim        /* Point to next sub-table */
1912246849Sjkim
1913246849Sjkim        Offset += sizeof (ACPI_MTMR_ENTRY);
1914246849Sjkim        SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, SubTable, sizeof (ACPI_MTMR_ENTRY));
1915246849Sjkim    }
1916246849Sjkim}
1917246849Sjkim
1918246849Sjkim
1919246849Sjkim/*******************************************************************************
1920246849Sjkim *
1921228110Sjkim * FUNCTION:    AcpiDmDumpPcct
1922228110Sjkim *
1923228110Sjkim * PARAMETERS:  Table               - A PCCT table
1924228110Sjkim *
1925228110Sjkim * RETURN:      None
1926228110Sjkim *
1927228110Sjkim * DESCRIPTION: Format the contents of a PCCT. This table type consists
1928228110Sjkim *              of an open-ended number of subtables.
1929228110Sjkim *
1930228110Sjkim ******************************************************************************/
1931228110Sjkim
1932228110Sjkimvoid
1933228110SjkimAcpiDmDumpPcct (
1934228110Sjkim    ACPI_TABLE_HEADER       *Table)
1935228110Sjkim{
1936228110Sjkim    ACPI_STATUS             Status;
1937228110Sjkim    ACPI_PCCT_SUBSPACE      *SubTable;
1938228110Sjkim    UINT32                  Length = Table->Length;
1939228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_PCCT);
1940228110Sjkim
1941228110Sjkim
1942228110Sjkim    /* Main table */
1943228110Sjkim
1944228110Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
1945228110Sjkim    if (ACPI_FAILURE (Status))
1946228110Sjkim    {
1947228110Sjkim        return;
1948228110Sjkim    }
1949228110Sjkim
1950228110Sjkim    /* Sub-tables */
1951228110Sjkim
1952228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
1953228110Sjkim    while (Offset < Table->Length)
1954228110Sjkim    {
1955228110Sjkim        AcpiOsPrintf ("\n");
1956228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1957228110Sjkim                    SubTable->Header.Length, AcpiDmTableInfoPcct0);
1958228110Sjkim        if (ACPI_FAILURE (Status))
1959228110Sjkim        {
1960228110Sjkim            return;
1961228110Sjkim        }
1962228110Sjkim
1963228110Sjkim        /* Point to next sub-table */
1964228110Sjkim
1965228110Sjkim        Offset += SubTable->Header.Length;
1966228110Sjkim        SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable,
1967228110Sjkim                    SubTable->Header.Length);
1968228110Sjkim    }
1969228110Sjkim}
1970228110Sjkim
1971228110Sjkim
1972228110Sjkim/*******************************************************************************
1973228110Sjkim *
1974228110Sjkim * FUNCTION:    AcpiDmDumpPmtt
1975228110Sjkim *
1976228110Sjkim * PARAMETERS:  Table               - A PMTT table
1977228110Sjkim *
1978228110Sjkim * RETURN:      None
1979228110Sjkim *
1980228110Sjkim * DESCRIPTION: Format the contents of a PMTT. This table type consists
1981228110Sjkim *              of an open-ended number of subtables.
1982228110Sjkim *
1983228110Sjkim ******************************************************************************/
1984228110Sjkim
1985228110Sjkimvoid
1986228110SjkimAcpiDmDumpPmtt (
1987228110Sjkim    ACPI_TABLE_HEADER       *Table)
1988228110Sjkim{
1989228110Sjkim    ACPI_STATUS             Status;
1990228110Sjkim    ACPI_PMTT_HEADER        *SubTable;
1991228110Sjkim    ACPI_PMTT_HEADER        *MemSubTable;
1992228110Sjkim    ACPI_PMTT_HEADER        *DimmSubTable;
1993228110Sjkim    ACPI_PMTT_DOMAIN        *DomainArray;
1994228110Sjkim    UINT32                  Length = Table->Length;
1995228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
1996228110Sjkim    UINT32                  MemOffset;
1997228110Sjkim    UINT32                  DimmOffset;
1998228110Sjkim    UINT32                  DomainOffset;
1999228110Sjkim    UINT32                  DomainCount;
2000228110Sjkim
2001228110Sjkim
2002228110Sjkim    /* Main table */
2003228110Sjkim
2004228110Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
2005228110Sjkim    if (ACPI_FAILURE (Status))
2006228110Sjkim    {
2007228110Sjkim        return;
2008228110Sjkim    }
2009228110Sjkim
2010228110Sjkim    /* Subtables */
2011228110Sjkim
2012228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
2013228110Sjkim    while (Offset < Table->Length)
2014228110Sjkim    {
2015228110Sjkim        /* Common subtable header */
2016228110Sjkim
2017228110Sjkim        AcpiOsPrintf ("\n");
2018228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2019228110Sjkim                    SubTable->Length, AcpiDmTableInfoPmttHdr);
2020228110Sjkim        if (ACPI_FAILURE (Status))
2021228110Sjkim        {
2022228110Sjkim            return;
2023228110Sjkim        }
2024228110Sjkim
2025228110Sjkim        /* Only Socket subtables are expected at this level */
2026228110Sjkim
2027228110Sjkim        if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET)
2028228110Sjkim        {
2029228110Sjkim            AcpiOsPrintf (
2030228110Sjkim                "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2031228110Sjkim                SubTable->Type);
2032228110Sjkim            return;
2033228110Sjkim        }
2034228110Sjkim
2035228110Sjkim        /* Dump the fixed-length portion of the subtable */
2036228110Sjkim
2037228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2038228110Sjkim                    SubTable->Length, AcpiDmTableInfoPmtt0);
2039228110Sjkim        if (ACPI_FAILURE (Status))
2040228110Sjkim        {
2041228110Sjkim            return;
2042228110Sjkim        }
2043228110Sjkim
2044228110Sjkim        /* Walk the memory controller subtables */
2045228110Sjkim
2046228110Sjkim        MemOffset = sizeof (ACPI_PMTT_SOCKET);
2047228110Sjkim        MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable,
2048228110Sjkim            sizeof (ACPI_PMTT_SOCKET));
2049228110Sjkim
2050228110Sjkim        while (((Offset + MemOffset) < Table->Length) &&
2051228110Sjkim            (MemOffset < SubTable->Length))
2052228110Sjkim        {
2053228110Sjkim            /* Common subtable header */
2054228110Sjkim
2055228110Sjkim            AcpiOsPrintf ("\n");
2056228110Sjkim            Status = AcpiDmDumpTable (Length,
2057228110Sjkim                        Offset + MemOffset, MemSubTable,
2058228110Sjkim                        MemSubTable->Length, AcpiDmTableInfoPmttHdr);
2059228110Sjkim            if (ACPI_FAILURE (Status))
2060228110Sjkim            {
2061228110Sjkim                return;
2062228110Sjkim            }
2063228110Sjkim
2064228110Sjkim            /* Only memory controller subtables are expected at this level */
2065228110Sjkim
2066228110Sjkim            if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER)
2067228110Sjkim            {
2068228110Sjkim                AcpiOsPrintf (
2069228110Sjkim                    "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2070228110Sjkim                    MemSubTable->Type);
2071228110Sjkim                return;
2072228110Sjkim            }
2073228110Sjkim
2074228110Sjkim            /* Dump the fixed-length portion of the controller subtable */
2075228110Sjkim
2076228110Sjkim            Status = AcpiDmDumpTable (Length,
2077228110Sjkim                        Offset + MemOffset, MemSubTable,
2078228110Sjkim                        MemSubTable->Length, AcpiDmTableInfoPmtt1);
2079228110Sjkim            if (ACPI_FAILURE (Status))
2080228110Sjkim            {
2081228110Sjkim                return;
2082228110Sjkim            }
2083228110Sjkim
2084228110Sjkim            /* Walk the variable count of proximity domains */
2085228110Sjkim
2086228110Sjkim            DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount;
2087228110Sjkim            DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
2088228110Sjkim            DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable,
2089228110Sjkim                sizeof (ACPI_PMTT_CONTROLLER));
2090228110Sjkim
2091228110Sjkim            while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
2092228110Sjkim                ((MemOffset + DomainOffset) < SubTable->Length) &&
2093228110Sjkim                DomainCount)
2094228110Sjkim            {
2095228110Sjkim                Status = AcpiDmDumpTable (Length,
2096228110Sjkim                            Offset + MemOffset + DomainOffset, DomainArray,
2097228110Sjkim                            sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
2098228110Sjkim                if (ACPI_FAILURE (Status))
2099228110Sjkim                {
2100228110Sjkim                    return;
2101228110Sjkim                }
2102228110Sjkim
2103228110Sjkim                DomainOffset += sizeof (ACPI_PMTT_DOMAIN);
2104228110Sjkim                DomainArray++;
2105228110Sjkim                DomainCount--;
2106228110Sjkim            }
2107228110Sjkim
2108228110Sjkim            if (DomainCount)
2109228110Sjkim            {
2110228110Sjkim                AcpiOsPrintf (
2111228110Sjkim                    "\n**** DomainCount exceeds subtable length\n\n",
2112228110Sjkim                    MemSubTable->Type);
2113228110Sjkim            }
2114228110Sjkim
2115228110Sjkim            /* Walk the physical component (DIMM) subtables */
2116228110Sjkim
2117228110Sjkim            DimmOffset = DomainOffset;
2118228110Sjkim            DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable,
2119228110Sjkim                DomainOffset);
2120228110Sjkim
2121228110Sjkim            while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
2122228110Sjkim                (DimmOffset < MemSubTable->Length))
2123228110Sjkim            {
2124228110Sjkim                /* Common subtable header */
2125228110Sjkim
2126228110Sjkim                AcpiOsPrintf ("\n");
2127228110Sjkim                Status = AcpiDmDumpTable (Length,
2128228110Sjkim                            Offset + MemOffset + DimmOffset, DimmSubTable,
2129228110Sjkim                            DimmSubTable->Length, AcpiDmTableInfoPmttHdr);
2130228110Sjkim                if (ACPI_FAILURE (Status))
2131228110Sjkim                {
2132228110Sjkim                    return;
2133228110Sjkim                }
2134228110Sjkim
2135228110Sjkim                /* Only DIMM subtables are expected at this level */
2136228110Sjkim
2137228110Sjkim                if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM)
2138228110Sjkim                {
2139228110Sjkim                    AcpiOsPrintf (
2140228110Sjkim                        "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2141228110Sjkim                        DimmSubTable->Type);
2142228110Sjkim                    return;
2143228110Sjkim                }
2144228110Sjkim
2145228110Sjkim                /* Dump the fixed-length DIMM subtable */
2146228110Sjkim
2147228110Sjkim                Status = AcpiDmDumpTable (Length,
2148228110Sjkim                            Offset + MemOffset + DimmOffset, DimmSubTable,
2149228110Sjkim                            DimmSubTable->Length, AcpiDmTableInfoPmtt2);
2150228110Sjkim                if (ACPI_FAILURE (Status))
2151228110Sjkim                {
2152228110Sjkim                    return;
2153228110Sjkim                }
2154228110Sjkim
2155228110Sjkim                /* Point to next DIMM subtable */
2156228110Sjkim
2157228110Sjkim                DimmOffset += DimmSubTable->Length;
2158228110Sjkim                DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2159228110Sjkim                    DimmSubTable, DimmSubTable->Length);
2160228110Sjkim            }
2161228110Sjkim
2162228110Sjkim            /* Point to next Controller subtable */
2163228110Sjkim
2164228110Sjkim            MemOffset += MemSubTable->Length;
2165228110Sjkim            MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2166228110Sjkim                MemSubTable, MemSubTable->Length);
2167228110Sjkim        }
2168228110Sjkim
2169228110Sjkim        /* Point to next Socket subtable */
2170228110Sjkim
2171228110Sjkim        Offset += SubTable->Length;
2172228110Sjkim        SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2173228110Sjkim            SubTable, SubTable->Length);
2174228110Sjkim    }
2175228110Sjkim}
2176228110Sjkim
2177228110Sjkim
2178228110Sjkim/*******************************************************************************
2179228110Sjkim *
2180228110Sjkim * FUNCTION:    AcpiDmDumpS3pt
2181228110Sjkim *
2182228110Sjkim * PARAMETERS:  Table               - A S3PT table
2183228110Sjkim *
2184228110Sjkim * RETURN:      Length of the table
2185228110Sjkim *
2186228110Sjkim * DESCRIPTION: Format the contents of a S3PT
2187228110Sjkim *
2188228110Sjkim ******************************************************************************/
2189228110Sjkim
2190228110SjkimUINT32
2191228110SjkimAcpiDmDumpS3pt (
2192228110Sjkim    ACPI_TABLE_HEADER       *Tables)
2193228110Sjkim{
2194228110Sjkim    ACPI_STATUS             Status;
2195228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_S3PT);
2196228110Sjkim    ACPI_S3PT_HEADER        *SubTable;
2197228110Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
2198228110Sjkim    ACPI_TABLE_S3PT         *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
2199228110Sjkim
2200228110Sjkim
2201228110Sjkim    /* Main table */
2202228110Sjkim
2203228110Sjkim    Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
2204228110Sjkim    if (ACPI_FAILURE (Status))
2205228110Sjkim    {
2206228110Sjkim        return 0;
2207228110Sjkim    }
2208228110Sjkim
2209228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, S3ptTable, Offset);
2210228110Sjkim    while (Offset < S3ptTable->Length)
2211228110Sjkim    {
2212228110Sjkim        /* Common sub-table header */
2213228110Sjkim
2214228110Sjkim        AcpiOsPrintf ("\n");
2215228110Sjkim        Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
2216228110Sjkim                    SubTable->Length, AcpiDmTableInfoS3ptHdr);
2217228110Sjkim        if (ACPI_FAILURE (Status))
2218228110Sjkim        {
2219228110Sjkim            return 0;
2220228110Sjkim        }
2221228110Sjkim
2222228110Sjkim        switch (SubTable->Type)
2223228110Sjkim        {
2224228110Sjkim        case ACPI_S3PT_TYPE_RESUME:
2225250838Sjkim
2226228110Sjkim            InfoTable = AcpiDmTableInfoS3pt0;
2227228110Sjkim            break;
2228250838Sjkim
2229228110Sjkim        case ACPI_S3PT_TYPE_SUSPEND:
2230250838Sjkim
2231228110Sjkim            InfoTable = AcpiDmTableInfoS3pt1;
2232228110Sjkim            break;
2233250838Sjkim
2234228110Sjkim        default:
2235250838Sjkim
2236228110Sjkim            AcpiOsPrintf ("\n**** Unknown S3PT sub-table type 0x%X\n", SubTable->Type);
2237228110Sjkim
2238228110Sjkim            /* Attempt to continue */
2239228110Sjkim
2240228110Sjkim            if (!SubTable->Length)
2241228110Sjkim            {
2242228110Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
2243228110Sjkim                return 0;
2244228110Sjkim            }
2245228110Sjkim            goto NextSubTable;
2246228110Sjkim        }
2247228110Sjkim
2248228110Sjkim        AcpiOsPrintf ("\n");
2249228110Sjkim        Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
2250228110Sjkim                    SubTable->Length, InfoTable);
2251228110Sjkim        if (ACPI_FAILURE (Status))
2252228110Sjkim        {
2253228110Sjkim            return 0;
2254228110Sjkim        }
2255228110Sjkim
2256228110SjkimNextSubTable:
2257228110Sjkim        /* Point to next sub-table */
2258228110Sjkim
2259228110Sjkim        Offset += SubTable->Length;
2260228110Sjkim        SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, SubTable, SubTable->Length);
2261228110Sjkim    }
2262228110Sjkim
2263228110Sjkim    return (S3ptTable->Length);
2264228110Sjkim}
2265228110Sjkim
2266228110Sjkim
2267228110Sjkim/*******************************************************************************
2268228110Sjkim *
2269219707Sjkim * FUNCTION:    AcpiDmDumpSlic
2270219707Sjkim *
2271219707Sjkim * PARAMETERS:  Table               - A SLIC table
2272219707Sjkim *
2273219707Sjkim * RETURN:      None
2274219707Sjkim *
2275219707Sjkim * DESCRIPTION: Format the contents of a SLIC
2276219707Sjkim *
2277219707Sjkim ******************************************************************************/
2278219707Sjkim
2279219707Sjkimvoid
2280219707SjkimAcpiDmDumpSlic (
2281219707Sjkim    ACPI_TABLE_HEADER       *Table)
2282219707Sjkim{
2283219707Sjkim    ACPI_STATUS             Status;
2284219707Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_SLIC);
2285219707Sjkim    ACPI_SLIC_HEADER        *SubTable;
2286219707Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
2287219707Sjkim
2288219707Sjkim
2289219707Sjkim    /* There is no main SLIC table, only subtables */
2290219707Sjkim
2291219707Sjkim    SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, Table, Offset);
2292219707Sjkim    while (Offset < Table->Length)
2293219707Sjkim    {
2294219707Sjkim        /* Common sub-table header */
2295219707Sjkim
2296219707Sjkim        AcpiOsPrintf ("\n");
2297219707Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2298219707Sjkim                    SubTable->Length, AcpiDmTableInfoSlicHdr);
2299219707Sjkim        if (ACPI_FAILURE (Status))
2300219707Sjkim        {
2301219707Sjkim            return;
2302219707Sjkim        }
2303219707Sjkim
2304219707Sjkim        switch (SubTable->Type)
2305219707Sjkim        {
2306219707Sjkim        case ACPI_SLIC_TYPE_PUBLIC_KEY:
2307250838Sjkim
2308219707Sjkim            InfoTable = AcpiDmTableInfoSlic0;
2309219707Sjkim            break;
2310250838Sjkim
2311219707Sjkim        case ACPI_SLIC_TYPE_WINDOWS_MARKER:
2312250838Sjkim
2313219707Sjkim            InfoTable = AcpiDmTableInfoSlic1;
2314219707Sjkim            break;
2315250838Sjkim
2316219707Sjkim        default:
2317250838Sjkim
2318219707Sjkim            AcpiOsPrintf ("\n**** Unknown SLIC sub-table type 0x%X\n", SubTable->Type);
2319219707Sjkim
2320219707Sjkim            /* Attempt to continue */
2321219707Sjkim
2322219707Sjkim            if (!SubTable->Length)
2323219707Sjkim            {
2324219707Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
2325219707Sjkim                return;
2326219707Sjkim            }
2327219707Sjkim            goto NextSubTable;
2328219707Sjkim        }
2329219707Sjkim
2330219707Sjkim        AcpiOsPrintf ("\n");
2331219707Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2332219707Sjkim                    SubTable->Length, InfoTable);
2333219707Sjkim        if (ACPI_FAILURE (Status))
2334219707Sjkim        {
2335219707Sjkim            return;
2336219707Sjkim        }
2337219707Sjkim
2338219707SjkimNextSubTable:
2339219707Sjkim        /* Point to next sub-table */
2340219707Sjkim
2341219707Sjkim        Offset += SubTable->Length;
2342219707Sjkim        SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, SubTable, SubTable->Length);
2343219707Sjkim    }
2344219707Sjkim}
2345219707Sjkim
2346219707Sjkim
2347219707Sjkim/*******************************************************************************
2348219707Sjkim *
2349167802Sjkim * FUNCTION:    AcpiDmDumpSlit
2350167802Sjkim *
2351167802Sjkim * PARAMETERS:  Table               - An SLIT
2352167802Sjkim *
2353167802Sjkim * RETURN:      None
2354167802Sjkim *
2355167802Sjkim * DESCRIPTION: Format the contents of a SLIT
2356167802Sjkim *
2357167802Sjkim ******************************************************************************/
2358167802Sjkim
2359167802Sjkimvoid
2360167802SjkimAcpiDmDumpSlit (
2361167802Sjkim    ACPI_TABLE_HEADER       *Table)
2362167802Sjkim{
2363193529Sjkim    ACPI_STATUS             Status;
2364167802Sjkim    UINT32                  Offset;
2365167802Sjkim    UINT8                   *Row;
2366167802Sjkim    UINT32                  Localities;
2367167802Sjkim    UINT32                  i;
2368167802Sjkim    UINT32                  j;
2369167802Sjkim
2370167802Sjkim
2371167802Sjkim    /* Main table */
2372167802Sjkim
2373193529Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit);
2374193529Sjkim    if (ACPI_FAILURE (Status))
2375193529Sjkim    {
2376193529Sjkim        return;
2377193529Sjkim    }
2378167802Sjkim
2379167802Sjkim    /* Display the Locality NxN Matrix */
2380167802Sjkim
2381167802Sjkim    Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount;
2382167802Sjkim    Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]);
2383167802Sjkim    Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry;
2384167802Sjkim
2385167802Sjkim    for (i = 0; i < Localities; i++)
2386167802Sjkim    {
2387167802Sjkim        /* Display one row of the matrix */
2388167802Sjkim
2389167802Sjkim        AcpiDmLineHeader2 (Offset, Localities, "Locality", i);
2390167802Sjkim        for  (j = 0; j < Localities; j++)
2391167802Sjkim        {
2392167802Sjkim            /* Check for beyond EOT */
2393167802Sjkim
2394167802Sjkim            if (Offset >= Table->Length)
2395167802Sjkim            {
2396167802Sjkim                AcpiOsPrintf ("\n**** Not enough room in table for all localities\n");
2397167802Sjkim                return;
2398167802Sjkim            }
2399167802Sjkim
2400209746Sjkim            AcpiOsPrintf ("%2.2X", Row[j]);
2401167802Sjkim            Offset++;
2402167802Sjkim
2403167802Sjkim            /* Display up to 16 bytes per output row */
2404167802Sjkim
2405209746Sjkim            if ((j+1) < Localities)
2406167802Sjkim            {
2407220663Sjkim                AcpiOsPrintf (" ");
2408209746Sjkim
2409209746Sjkim                if (j && (((j+1) % 16) == 0))
2410209746Sjkim                {
2411220663Sjkim                    AcpiOsPrintf ("\\\n"); /* With line continuation char */
2412220663Sjkim                    AcpiDmLineHeader (Offset, 0, NULL);
2413209746Sjkim                }
2414167802Sjkim            }
2415167802Sjkim        }
2416167802Sjkim
2417167802Sjkim        /* Point to next row */
2418167802Sjkim
2419167802Sjkim        AcpiOsPrintf ("\n");
2420167802Sjkim        Row += Localities;
2421167802Sjkim    }
2422167802Sjkim}
2423167802Sjkim
2424167802Sjkim
2425167802Sjkim/*******************************************************************************
2426167802Sjkim *
2427167802Sjkim * FUNCTION:    AcpiDmDumpSrat
2428167802Sjkim *
2429167802Sjkim * PARAMETERS:  Table               - A SRAT table
2430167802Sjkim *
2431167802Sjkim * RETURN:      None
2432167802Sjkim *
2433167802Sjkim * DESCRIPTION: Format the contents of a SRAT
2434167802Sjkim *
2435167802Sjkim ******************************************************************************/
2436167802Sjkim
2437167802Sjkimvoid
2438167802SjkimAcpiDmDumpSrat (
2439167802Sjkim    ACPI_TABLE_HEADER       *Table)
2440167802Sjkim{
2441193529Sjkim    ACPI_STATUS             Status;
2442167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_SRAT);
2443167802Sjkim    ACPI_SUBTABLE_HEADER    *SubTable;
2444167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
2445167802Sjkim
2446167802Sjkim
2447167802Sjkim    /* Main table */
2448167802Sjkim
2449193529Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat);
2450193529Sjkim    if (ACPI_FAILURE (Status))
2451193529Sjkim    {
2452193529Sjkim        return;
2453193529Sjkim    }
2454167802Sjkim
2455167802Sjkim    /* Sub-tables */
2456167802Sjkim
2457167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
2458167802Sjkim    while (Offset < Table->Length)
2459167802Sjkim    {
2460193529Sjkim        /* Common sub-table header */
2461193529Sjkim
2462193529Sjkim        AcpiOsPrintf ("\n");
2463193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2464193529Sjkim                    SubTable->Length, AcpiDmTableInfoSratHdr);
2465193529Sjkim        if (ACPI_FAILURE (Status))
2466193529Sjkim        {
2467193529Sjkim            return;
2468193529Sjkim        }
2469193529Sjkim
2470167802Sjkim        switch (SubTable->Type)
2471167802Sjkim        {
2472167802Sjkim        case ACPI_SRAT_TYPE_CPU_AFFINITY:
2473250838Sjkim
2474167802Sjkim            InfoTable = AcpiDmTableInfoSrat0;
2475167802Sjkim            break;
2476250838Sjkim
2477167802Sjkim        case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
2478250838Sjkim
2479167802Sjkim            InfoTable = AcpiDmTableInfoSrat1;
2480167802Sjkim            break;
2481250838Sjkim
2482193529Sjkim        case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
2483250838Sjkim
2484193529Sjkim            InfoTable = AcpiDmTableInfoSrat2;
2485193529Sjkim            break;
2486250838Sjkim
2487167802Sjkim        default:
2488204773Sjkim            AcpiOsPrintf ("\n**** Unknown SRAT sub-table type 0x%X\n", SubTable->Type);
2489193529Sjkim
2490193529Sjkim            /* Attempt to continue */
2491193529Sjkim
2492193529Sjkim            if (!SubTable->Length)
2493193529Sjkim            {
2494193529Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
2495193529Sjkim                return;
2496193529Sjkim            }
2497193529Sjkim            goto NextSubTable;
2498167802Sjkim        }
2499167802Sjkim
2500167802Sjkim        AcpiOsPrintf ("\n");
2501193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2502193529Sjkim                    SubTable->Length, InfoTable);
2503193529Sjkim        if (ACPI_FAILURE (Status))
2504193529Sjkim        {
2505193529Sjkim            return;
2506193529Sjkim        }
2507167802Sjkim
2508193529SjkimNextSubTable:
2509167802Sjkim        /* Point to next sub-table */
2510167802Sjkim
2511167802Sjkim        Offset += SubTable->Length;
2512167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
2513167802Sjkim    }
2514167802Sjkim}
2515167802Sjkim
2516197104Sjkim
2517197104Sjkim/*******************************************************************************
2518197104Sjkim *
2519246849Sjkim * FUNCTION:    AcpiDmDumpVrtc
2520246849Sjkim *
2521246849Sjkim * PARAMETERS:  Table               - A VRTC table
2522246849Sjkim *
2523246849Sjkim * RETURN:      None
2524246849Sjkim *
2525246849Sjkim * DESCRIPTION: Format the contents of a VRTC
2526246849Sjkim *
2527246849Sjkim ******************************************************************************/
2528246849Sjkim
2529246849Sjkimvoid
2530246849SjkimAcpiDmDumpVrtc (
2531246849Sjkim    ACPI_TABLE_HEADER       *Table)
2532246849Sjkim{
2533246849Sjkim    ACPI_STATUS             Status;
2534246849Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_VRTC);
2535246849Sjkim    ACPI_VRTC_ENTRY         *SubTable;
2536246849Sjkim
2537246849Sjkim
2538246849Sjkim    /* Main table */
2539246849Sjkim
2540246849Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoVrtc);
2541246849Sjkim    if (ACPI_FAILURE (Status))
2542246849Sjkim    {
2543246849Sjkim        return;
2544246849Sjkim    }
2545246849Sjkim
2546246849Sjkim    /* Sub-tables */
2547246849Sjkim
2548246849Sjkim    SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset);
2549246849Sjkim    while (Offset < Table->Length)
2550246849Sjkim    {
2551246849Sjkim        /* Common sub-table header */
2552246849Sjkim
2553246849Sjkim        AcpiOsPrintf ("\n");
2554246849Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2555246849Sjkim                    sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0);
2556246849Sjkim        if (ACPI_FAILURE (Status))
2557246849Sjkim        {
2558246849Sjkim            return;
2559246849Sjkim        }
2560246849Sjkim
2561246849Sjkim        /* Point to next sub-table */
2562246849Sjkim
2563246849Sjkim        Offset += sizeof (ACPI_VRTC_ENTRY);
2564246849Sjkim        SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, SubTable, sizeof (ACPI_VRTC_ENTRY));
2565246849Sjkim    }
2566246849Sjkim}
2567246849Sjkim
2568246849Sjkim
2569246849Sjkim/*******************************************************************************
2570246849Sjkim *
2571197104Sjkim * FUNCTION:    AcpiDmDumpWdat
2572197104Sjkim *
2573197104Sjkim * PARAMETERS:  Table               - A WDAT table
2574197104Sjkim *
2575197104Sjkim * RETURN:      None
2576197104Sjkim *
2577197104Sjkim * DESCRIPTION: Format the contents of a WDAT
2578197104Sjkim *
2579197104Sjkim ******************************************************************************/
2580197104Sjkim
2581197104Sjkimvoid
2582197104SjkimAcpiDmDumpWdat (
2583197104Sjkim    ACPI_TABLE_HEADER       *Table)
2584197104Sjkim{
2585197104Sjkim    ACPI_STATUS             Status;
2586197104Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_WDAT);
2587197104Sjkim    ACPI_WDAT_ENTRY         *SubTable;
2588197104Sjkim
2589197104Sjkim
2590197104Sjkim    /* Main table */
2591197104Sjkim
2592197104Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat);
2593197104Sjkim    if (ACPI_FAILURE (Status))
2594197104Sjkim    {
2595197104Sjkim        return;
2596197104Sjkim    }
2597197104Sjkim
2598197104Sjkim    /* Sub-tables */
2599197104Sjkim
2600197104Sjkim    SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
2601197104Sjkim    while (Offset < Table->Length)
2602197104Sjkim    {
2603197104Sjkim        /* Common sub-table header */
2604197104Sjkim
2605197104Sjkim        AcpiOsPrintf ("\n");
2606197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2607197104Sjkim                    sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0);
2608197104Sjkim        if (ACPI_FAILURE (Status))
2609197104Sjkim        {
2610197104Sjkim            return;
2611197104Sjkim        }
2612197104Sjkim
2613197104Sjkim        /* Point to next sub-table */
2614197104Sjkim
2615197104Sjkim        Offset += sizeof (ACPI_WDAT_ENTRY);
2616197104Sjkim        SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable, sizeof (ACPI_WDAT_ENTRY));
2617197104Sjkim    }
2618197104Sjkim}
2619