1167802Sjkim/******************************************************************************
2167802Sjkim *
3167802Sjkim * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code
4167802Sjkim *
5167802Sjkim *****************************************************************************/
6167802Sjkim
7217365Sjkim/*
8298714Sjkim * Copyright (C) 2000 - 2016, 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
62218590Sjkim
63167802Sjkim/*******************************************************************************
64167802Sjkim *
65239340Sjkim * FUNCTION:    AcpiDmDumpBuffer
66239340Sjkim *
67239340Sjkim * PARAMETERS:  Table               - ACPI Table or subtable
68239340Sjkim *              BufferOffset        - Offset of buffer from Table above
69239340Sjkim *              Length              - Length of the buffer
70239340Sjkim *              AbsoluteOffset      - Offset of buffer in the main ACPI table
71239340Sjkim *              Header              - Name of the buffer field (printed on the
72239340Sjkim *                                    first line only.)
73239340Sjkim *
74239340Sjkim * RETURN:      None
75239340Sjkim *
76239340Sjkim * DESCRIPTION: Format the contents of an arbitrary length data buffer (in the
77239340Sjkim *              disassembler output format.)
78239340Sjkim *
79239340Sjkim ******************************************************************************/
80239340Sjkim
81281396Sjkimvoid
82239340SjkimAcpiDmDumpBuffer (
83239340Sjkim    void                    *Table,
84239340Sjkim    UINT32                  BufferOffset,
85239340Sjkim    UINT32                  Length,
86239340Sjkim    UINT32                  AbsoluteOffset,
87283092Sjkim    char                    *Header)
88239340Sjkim{
89239340Sjkim    UINT8                   *Buffer;
90239340Sjkim    UINT32                  i;
91239340Sjkim
92239340Sjkim
93239340Sjkim    if (!Length)
94239340Sjkim    {
95239340Sjkim        return;
96239340Sjkim    }
97239340Sjkim
98239340Sjkim    Buffer = ACPI_CAST_PTR (UINT8, Table) + BufferOffset;
99239340Sjkim    i = 0;
100239340Sjkim
101239340Sjkim    while (i < Length)
102239340Sjkim    {
103239340Sjkim        if (!(i % 16))
104239340Sjkim        {
105283092Sjkim            /* Insert a backslash - line continuation character */
106283092Sjkim
107283092Sjkim            if (Length > 16)
108281396Sjkim            {
109281396Sjkim                AcpiOsPrintf ("\\\n    ");
110281396Sjkim            }
111239340Sjkim        }
112239340Sjkim
113239340Sjkim        AcpiOsPrintf ("%.02X ", *Buffer);
114239340Sjkim        i++;
115239340Sjkim        Buffer++;
116239340Sjkim        AbsoluteOffset++;
117239340Sjkim    }
118239340Sjkim
119239340Sjkim    AcpiOsPrintf ("\n");
120239340Sjkim}
121239340Sjkim
122239340Sjkim
123239340Sjkim/*******************************************************************************
124239340Sjkim *
125283092Sjkim * FUNCTION:    AcpiDmDumpUnicode
126283092Sjkim *
127283092Sjkim * PARAMETERS:  Table               - ACPI Table or subtable
128283092Sjkim *              BufferOffset        - Offset of buffer from Table above
129283092Sjkim *              ByteLength          - Length of the buffer
130283092Sjkim *
131283092Sjkim * RETURN:      None
132283092Sjkim *
133283092Sjkim * DESCRIPTION: Validate and dump the contents of a buffer that contains
134283092Sjkim *              unicode data. The output is a standard ASCII string. If it
135283092Sjkim *              appears that the data is not unicode, the buffer is dumped
136283092Sjkim *              as hex characters.
137283092Sjkim *
138283092Sjkim ******************************************************************************/
139283092Sjkim
140283092Sjkimvoid
141283092SjkimAcpiDmDumpUnicode (
142283092Sjkim    void                    *Table,
143283092Sjkim    UINT32                  BufferOffset,
144283092Sjkim    UINT32                  ByteLength)
145283092Sjkim{
146283092Sjkim    UINT8                   *Buffer;
147283092Sjkim    UINT32                  Length;
148283092Sjkim    UINT32                  i;
149283092Sjkim
150283092Sjkim
151283092Sjkim    Buffer = ((UINT8 *) Table) + BufferOffset;
152283092Sjkim    Length = ByteLength - 2; /* Last two bytes are the null terminator */
153283092Sjkim
154283092Sjkim    /* Ensure all low bytes are entirely printable ASCII */
155283092Sjkim
156283092Sjkim    for (i = 0; i < Length; i += 2)
157283092Sjkim    {
158284583Sjkim        if (!isprint (Buffer[i]))
159283092Sjkim        {
160283092Sjkim            goto DumpRawBuffer;
161283092Sjkim        }
162283092Sjkim    }
163283092Sjkim
164283092Sjkim    /* Ensure all high bytes are zero */
165283092Sjkim
166283092Sjkim    for (i = 1; i < Length; i += 2)
167283092Sjkim    {
168283092Sjkim        if (Buffer[i])
169283092Sjkim        {
170283092Sjkim            goto DumpRawBuffer;
171283092Sjkim        }
172283092Sjkim    }
173283092Sjkim
174283092Sjkim    /* Dump the buffer as a normal string */
175283092Sjkim
176283092Sjkim    AcpiOsPrintf ("\"");
177283092Sjkim    for (i = 0; i < Length; i += 2)
178283092Sjkim    {
179283092Sjkim        AcpiOsPrintf ("%c", Buffer[i]);
180283092Sjkim    }
181298714Sjkim
182283092Sjkim    AcpiOsPrintf ("\"\n");
183283092Sjkim    return;
184283092Sjkim
185283092SjkimDumpRawBuffer:
186283092Sjkim    AcpiDmDumpBuffer (Table, BufferOffset, ByteLength,
187283092Sjkim        BufferOffset, NULL);
188283092Sjkim    AcpiOsPrintf ("\n");
189283092Sjkim}
190283092Sjkim
191283092Sjkim
192283092Sjkim/*******************************************************************************
193283092Sjkim *
194167802Sjkim * FUNCTION:    AcpiDmDumpRsdp
195167802Sjkim *
196167802Sjkim * PARAMETERS:  Table               - A RSDP
197167802Sjkim *
198209746Sjkim * RETURN:      Length of the table (there is not always a length field,
199209746Sjkim *              use revision or length if available (ACPI 2.0+))
200167802Sjkim *
201167802Sjkim * DESCRIPTION: Format the contents of a RSDP
202167802Sjkim *
203167802Sjkim ******************************************************************************/
204167802Sjkim
205167802SjkimUINT32
206167802SjkimAcpiDmDumpRsdp (
207167802Sjkim    ACPI_TABLE_HEADER       *Table)
208167802Sjkim{
209209746Sjkim    ACPI_TABLE_RSDP         *Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table);
210209746Sjkim    UINT32                  Length = sizeof (ACPI_RSDP_COMMON);
211209746Sjkim    UINT8                   Checksum;
212285797Sjkim    ACPI_STATUS             Status;
213167802Sjkim
214167802Sjkim
215167802Sjkim    /* Dump the common ACPI 1.0 portion */
216167802Sjkim
217285797Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1);
218285797Sjkim    if (ACPI_FAILURE (Status))
219285797Sjkim    {
220285797Sjkim        return (Length);
221285797Sjkim    }
222167802Sjkim
223209746Sjkim    /* Validate the first checksum */
224167802Sjkim
225209746Sjkim    Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON),
226298714Sjkim        Rsdp->Checksum);
227209746Sjkim    if (Checksum != Rsdp->Checksum)
228167802Sjkim    {
229209746Sjkim        AcpiOsPrintf ("/* Incorrect Checksum above, should be 0x%2.2X */\n",
230209746Sjkim            Checksum);
231209746Sjkim    }
232209746Sjkim
233209746Sjkim    /* The RSDP for ACPI 2.0+ contains more data and has a Length field */
234209746Sjkim
235209746Sjkim    if (Rsdp->Revision > 0)
236209746Sjkim    {
237209746Sjkim        Length = Rsdp->Length;
238285797Sjkim        Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2);
239285797Sjkim        if (ACPI_FAILURE (Status))
240285797Sjkim        {
241285797Sjkim            return (Length);
242285797Sjkim        }
243209746Sjkim
244209746Sjkim        /* Validate the extended checksum over entire RSDP */
245209746Sjkim
246209746Sjkim        Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP),
247298714Sjkim            Rsdp->ExtendedChecksum);
248209746Sjkim        if (Checksum != Rsdp->ExtendedChecksum)
249209746Sjkim        {
250209746Sjkim            AcpiOsPrintf (
251209746Sjkim                "/* Incorrect Extended Checksum above, should be 0x%2.2X */\n",
252209746Sjkim                Checksum);
253209746Sjkim        }
254167802Sjkim    }
255167802Sjkim
256167802Sjkim    return (Length);
257167802Sjkim}
258167802Sjkim
259167802Sjkim
260167802Sjkim/*******************************************************************************
261167802Sjkim *
262167802Sjkim * FUNCTION:    AcpiDmDumpRsdt
263167802Sjkim *
264167802Sjkim * PARAMETERS:  Table               - A RSDT
265167802Sjkim *
266167802Sjkim * RETURN:      None
267167802Sjkim *
268167802Sjkim * DESCRIPTION: Format the contents of a RSDT
269167802Sjkim *
270167802Sjkim ******************************************************************************/
271167802Sjkim
272167802Sjkimvoid
273167802SjkimAcpiDmDumpRsdt (
274167802Sjkim    ACPI_TABLE_HEADER       *Table)
275167802Sjkim{
276167802Sjkim    UINT32                  *Array;
277167802Sjkim    UINT32                  Entries;
278167802Sjkim    UINT32                  Offset;
279167802Sjkim    UINT32                  i;
280167802Sjkim
281167802Sjkim
282167802Sjkim    /* Point to start of table pointer array */
283167802Sjkim
284167802Sjkim    Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry;
285167802Sjkim    Offset = sizeof (ACPI_TABLE_HEADER);
286167802Sjkim
287167802Sjkim    /* RSDT uses 32-bit pointers */
288167802Sjkim
289167802Sjkim    Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32);
290167802Sjkim
291167802Sjkim    for (i = 0; i < Entries; i++)
292167802Sjkim    {
293167802Sjkim        AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i);
294167802Sjkim        AcpiOsPrintf ("%8.8X\n", Array[i]);
295167802Sjkim        Offset += sizeof (UINT32);
296167802Sjkim    }
297167802Sjkim}
298167802Sjkim
299167802Sjkim
300167802Sjkim/*******************************************************************************
301167802Sjkim *
302167802Sjkim * FUNCTION:    AcpiDmDumpXsdt
303167802Sjkim *
304167802Sjkim * PARAMETERS:  Table               - A XSDT
305167802Sjkim *
306167802Sjkim * RETURN:      None
307167802Sjkim *
308167802Sjkim * DESCRIPTION: Format the contents of a XSDT
309167802Sjkim *
310167802Sjkim ******************************************************************************/
311167802Sjkim
312167802Sjkimvoid
313167802SjkimAcpiDmDumpXsdt (
314167802Sjkim    ACPI_TABLE_HEADER       *Table)
315167802Sjkim{
316167802Sjkim    UINT64                  *Array;
317167802Sjkim    UINT32                  Entries;
318167802Sjkim    UINT32                  Offset;
319167802Sjkim    UINT32                  i;
320167802Sjkim
321167802Sjkim
322167802Sjkim    /* Point to start of table pointer array */
323167802Sjkim
324167802Sjkim    Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry;
325167802Sjkim    Offset = sizeof (ACPI_TABLE_HEADER);
326167802Sjkim
327167802Sjkim    /* XSDT uses 64-bit pointers */
328167802Sjkim
329167802Sjkim    Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64);
330167802Sjkim
331167802Sjkim    for (i = 0; i < Entries; i++)
332167802Sjkim    {
333167802Sjkim        AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i);
334167802Sjkim        AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i]));
335167802Sjkim        Offset += sizeof (UINT64);
336167802Sjkim    }
337167802Sjkim}
338167802Sjkim
339167802Sjkim
340167802Sjkim/*******************************************************************************
341167802Sjkim *
342167802Sjkim * FUNCTION:    AcpiDmDumpFadt
343167802Sjkim *
344167802Sjkim * PARAMETERS:  Table               - A FADT
345167802Sjkim *
346167802Sjkim * RETURN:      None
347167802Sjkim *
348167802Sjkim * DESCRIPTION: Format the contents of a FADT
349167802Sjkim *
350218590Sjkim * NOTE:        We cannot depend on the FADT version to indicate the actual
351218590Sjkim *              contents of the FADT because of BIOS bugs. The table length
352218590Sjkim *              is the only reliable indicator.
353218590Sjkim *
354167802Sjkim ******************************************************************************/
355167802Sjkim
356167802Sjkimvoid
357167802SjkimAcpiDmDumpFadt (
358167802Sjkim    ACPI_TABLE_HEADER       *Table)
359167802Sjkim{
360285797Sjkim    ACPI_STATUS             Status;
361167802Sjkim
362285797Sjkim
363218590Sjkim    /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */
364167802Sjkim
365298714Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
366298714Sjkim        AcpiDmTableInfoFadt1);
367285797Sjkim    if (ACPI_FAILURE (Status))
368285797Sjkim    {
369285797Sjkim        return;
370285797Sjkim    }
371167802Sjkim
372218590Sjkim    /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */
373167802Sjkim
374218590Sjkim    if ((Table->Length > ACPI_FADT_V1_SIZE) &&
375218590Sjkim        (Table->Length <= ACPI_FADT_V2_SIZE))
376167802Sjkim    {
377298714Sjkim        Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
378298714Sjkim            AcpiDmTableInfoFadt2);
379285797Sjkim        if (ACPI_FAILURE (Status))
380285797Sjkim        {
381285797Sjkim            return;
382285797Sjkim        }
383167802Sjkim    }
384167802Sjkim
385228110Sjkim    /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */
386193529Sjkim
387218590Sjkim    else if (Table->Length > ACPI_FADT_V2_SIZE)
388193529Sjkim    {
389298714Sjkim        Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
390298714Sjkim            AcpiDmTableInfoFadt3);
391285797Sjkim        if (ACPI_FAILURE (Status))
392285797Sjkim        {
393285797Sjkim            return;
394285797Sjkim        }
395228110Sjkim
396228110Sjkim        /* Check for FADT revision 5 fields and up (ACPI 5.0+) */
397228110Sjkim
398228110Sjkim        if (Table->Length > ACPI_FADT_V3_SIZE)
399228110Sjkim        {
400298714Sjkim            Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
401298714Sjkim                AcpiDmTableInfoFadt5);
402285797Sjkim            if (ACPI_FAILURE (Status))
403285797Sjkim            {
404285797Sjkim                return;
405285797Sjkim            }
406228110Sjkim        }
407283092Sjkim
408283092Sjkim        /* Check for FADT revision 6 fields and up (ACPI 6.0+) */
409283092Sjkim
410283092Sjkim        if (Table->Length > ACPI_FADT_V3_SIZE)
411283092Sjkim        {
412298714Sjkim            Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
413298714Sjkim                AcpiDmTableInfoFadt6);
414285797Sjkim            if (ACPI_FAILURE (Status))
415285797Sjkim            {
416285797Sjkim                return;
417285797Sjkim            }
418283092Sjkim        }
419193529Sjkim    }
420193529Sjkim
421167802Sjkim    /* Validate various fields in the FADT, including length */
422167802Sjkim
423167802Sjkim    AcpiTbCreateLocalFadt (Table, Table->Length);
424218590Sjkim
425218590Sjkim    /* Validate FADT length against the revision */
426218590Sjkim
427218590Sjkim    AcpiDmValidateFadtLength (Table->Revision, Table->Length);
428167802Sjkim}
429167802Sjkim
430167802Sjkim
431167802Sjkim/*******************************************************************************
432167802Sjkim *
433218590Sjkim * FUNCTION:    AcpiDmValidateFadtLength
434218590Sjkim *
435218590Sjkim * PARAMETERS:  Revision            - FADT revision (Header->Revision)
436218590Sjkim *              Length              - FADT length (Header->Length
437218590Sjkim *
438218590Sjkim * RETURN:      None
439218590Sjkim *
440218590Sjkim * DESCRIPTION: Check the FADT revision against the expected table length for
441218590Sjkim *              that revision. Issue a warning if the length is not what was
442218590Sjkim *              expected. This seems to be such a common BIOS bug that the
443218590Sjkim *              FADT revision has been rendered virtually meaningless.
444218590Sjkim *
445218590Sjkim ******************************************************************************/
446218590Sjkim
447218590Sjkimstatic void
448218590SjkimAcpiDmValidateFadtLength (
449218590Sjkim    UINT32                  Revision,
450218590Sjkim    UINT32                  Length)
451218590Sjkim{
452218590Sjkim    UINT32                  ExpectedLength;
453218590Sjkim
454218590Sjkim
455218590Sjkim    switch (Revision)
456218590Sjkim    {
457218590Sjkim    case 0:
458250838Sjkim
459218590Sjkim        AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n");
460218590Sjkim        return;
461218590Sjkim
462218590Sjkim    case 1:
463250838Sjkim
464218590Sjkim        ExpectedLength = ACPI_FADT_V1_SIZE;
465218590Sjkim        break;
466218590Sjkim
467218590Sjkim    case 2:
468250838Sjkim
469218590Sjkim        ExpectedLength = ACPI_FADT_V2_SIZE;
470218590Sjkim        break;
471218590Sjkim
472218590Sjkim    case 3:
473218590Sjkim    case 4:
474250838Sjkim
475218590Sjkim        ExpectedLength = ACPI_FADT_V3_SIZE;
476218590Sjkim        break;
477218590Sjkim
478228110Sjkim    case 5:
479250838Sjkim
480228110Sjkim        ExpectedLength = ACPI_FADT_V5_SIZE;
481228110Sjkim        break;
482228110Sjkim
483218590Sjkim    default:
484250838Sjkim
485218590Sjkim        return;
486218590Sjkim    }
487218590Sjkim
488218590Sjkim    if (Length == ExpectedLength)
489218590Sjkim    {
490218590Sjkim        return;
491218590Sjkim    }
492218590Sjkim
493218590Sjkim    AcpiOsPrintf (
494298714Sjkim        "\n// ACPI Warning: FADT revision %X does not match length: "
495298714Sjkim        "found %X expected %X\n",
496218590Sjkim        Revision, Length, ExpectedLength);
497218590Sjkim}
498218590Sjkim
499218590Sjkim
500218590Sjkim/*******************************************************************************
501218590Sjkim *
502167802Sjkim * FUNCTION:    AcpiDmDumpAsf
503167802Sjkim *
504167802Sjkim * PARAMETERS:  Table               - A ASF table
505167802Sjkim *
506167802Sjkim * RETURN:      None
507167802Sjkim *
508167802Sjkim * DESCRIPTION: Format the contents of a ASF table
509167802Sjkim *
510167802Sjkim ******************************************************************************/
511167802Sjkim
512167802Sjkimvoid
513167802SjkimAcpiDmDumpAsf (
514167802Sjkim    ACPI_TABLE_HEADER       *Table)
515167802Sjkim{
516193529Sjkim    ACPI_STATUS             Status;
517167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
518167802Sjkim    ACPI_ASF_INFO           *SubTable;
519167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
520167802Sjkim    ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
521167802Sjkim    UINT8                   *DataTable = NULL;
522193529Sjkim    UINT32                  DataCount = 0;
523193529Sjkim    UINT32                  DataLength = 0;
524193529Sjkim    UINT32                  DataOffset = 0;
525193529Sjkim    UINT32                  i;
526197104Sjkim    UINT8                   Type;
527167802Sjkim
528167802Sjkim
529272444Sjkim    /* No main table, only subtables */
530167802Sjkim
531167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
532167802Sjkim    while (Offset < Table->Length)
533167802Sjkim    {
534272444Sjkim        /* Common subtable header */
535167802Sjkim
536193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
537298714Sjkim            SubTable->Header.Length, AcpiDmTableInfoAsfHdr);
538193529Sjkim        if (ACPI_FAILURE (Status))
539193529Sjkim        {
540193529Sjkim            return;
541193529Sjkim        }
542167802Sjkim
543197104Sjkim        /* The actual type is the lower 7 bits of Type */
544197104Sjkim
545197104Sjkim        Type = (UINT8) (SubTable->Header.Type & 0x7F);
546197104Sjkim
547197104Sjkim        switch (Type)
548167802Sjkim        {
549167802Sjkim        case ACPI_ASF_TYPE_INFO:
550250838Sjkim
551167802Sjkim            InfoTable = AcpiDmTableInfoAsf0;
552167802Sjkim            break;
553167802Sjkim
554167802Sjkim        case ACPI_ASF_TYPE_ALERT:
555250838Sjkim
556167802Sjkim            InfoTable = AcpiDmTableInfoAsf1;
557167802Sjkim            DataInfoTable = AcpiDmTableInfoAsf1a;
558167802Sjkim            DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT));
559197104Sjkim            DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts;
560197104Sjkim            DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength;
561167802Sjkim            DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
562167802Sjkim            break;
563167802Sjkim
564167802Sjkim        case ACPI_ASF_TYPE_CONTROL:
565250838Sjkim
566167802Sjkim            InfoTable = AcpiDmTableInfoAsf2;
567167802Sjkim            DataInfoTable = AcpiDmTableInfoAsf2a;
568167802Sjkim            DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE));
569197104Sjkim            DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls;
570197104Sjkim            DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength;
571167802Sjkim            DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
572167802Sjkim            break;
573167802Sjkim
574167802Sjkim        case ACPI_ASF_TYPE_BOOT:
575250838Sjkim
576167802Sjkim            InfoTable = AcpiDmTableInfoAsf3;
577167802Sjkim            break;
578167802Sjkim
579167802Sjkim        case ACPI_ASF_TYPE_ADDRESS:
580250838Sjkim
581167802Sjkim            InfoTable = AcpiDmTableInfoAsf4;
582167802Sjkim            DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS));
583197104Sjkim            DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices;
584167802Sjkim            DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
585167802Sjkim            break;
586167802Sjkim
587167802Sjkim        default:
588250838Sjkim
589298714Sjkim            AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n",
590298714Sjkim                SubTable->Header.Type);
591167802Sjkim            return;
592167802Sjkim        }
593167802Sjkim
594193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
595298714Sjkim            SubTable->Header.Length, InfoTable);
596193529Sjkim        if (ACPI_FAILURE (Status))
597193529Sjkim        {
598193529Sjkim            return;
599193529Sjkim        }
600167802Sjkim
601167802Sjkim        /* Dump variable-length extra data */
602167802Sjkim
603197104Sjkim        switch (Type)
604167802Sjkim        {
605167802Sjkim        case ACPI_ASF_TYPE_ALERT:
606167802Sjkim        case ACPI_ASF_TYPE_CONTROL:
607167802Sjkim
608167802Sjkim            for (i = 0; i < DataCount; i++)
609167802Sjkim            {
610167802Sjkim                AcpiOsPrintf ("\n");
611193529Sjkim                Status = AcpiDmDumpTable (Table->Length, DataOffset,
612298714Sjkim                    DataTable, DataLength, DataInfoTable);
613193529Sjkim                if (ACPI_FAILURE (Status))
614193529Sjkim                {
615193529Sjkim                    return;
616193529Sjkim                }
617167802Sjkim
618167802Sjkim                DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
619167802Sjkim                DataOffset += DataLength;
620167802Sjkim            }
621167802Sjkim            break;
622167802Sjkim
623167802Sjkim        case ACPI_ASF_TYPE_ADDRESS:
624167802Sjkim
625167802Sjkim            for (i = 0; i < DataLength; i++)
626167802Sjkim            {
627167802Sjkim                if (!(i % 16))
628167802Sjkim                {
629167802Sjkim                    AcpiDmLineHeader (DataOffset, 1, "Addresses");
630167802Sjkim                }
631167802Sjkim
632167802Sjkim                AcpiOsPrintf ("%2.2X ", *DataTable);
633167802Sjkim                DataTable++;
634167802Sjkim                DataOffset++;
635298714Sjkim
636193529Sjkim                if (DataOffset > Table->Length)
637193529Sjkim                {
638298714Sjkim                    AcpiOsPrintf (
639298714Sjkim                        "**** ACPI table terminates in the middle of a "
640298714Sjkim                        "data structure! (ASF! table)\n");
641193529Sjkim                    return;
642193529Sjkim                }
643167802Sjkim            }
644167802Sjkim
645167802Sjkim            AcpiOsPrintf ("\n");
646167802Sjkim            break;
647193529Sjkim
648193529Sjkim        default:
649250838Sjkim
650193529Sjkim            break;
651167802Sjkim        }
652167802Sjkim
653167802Sjkim        AcpiOsPrintf ("\n");
654167802Sjkim
655272444Sjkim        /* Point to next subtable */
656167802Sjkim
657193529Sjkim        if (!SubTable->Header.Length)
658193529Sjkim        {
659193529Sjkim            AcpiOsPrintf ("Invalid zero subtable header length\n");
660193529Sjkim            return;
661193529Sjkim        }
662193529Sjkim
663167802Sjkim        Offset += SubTable->Header.Length;
664298714Sjkim        SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable,
665298714Sjkim            SubTable->Header.Length);
666167802Sjkim    }
667167802Sjkim}
668167802Sjkim
669167802Sjkim
670167802Sjkim/*******************************************************************************
671167802Sjkim *
672167802Sjkim * FUNCTION:    AcpiDmDumpCpep
673167802Sjkim *
674167802Sjkim * PARAMETERS:  Table               - A CPEP table
675167802Sjkim *
676167802Sjkim * RETURN:      None
677167802Sjkim *
678167802Sjkim * DESCRIPTION: Format the contents of a CPEP. This table type consists
679167802Sjkim *              of an open-ended number of subtables.
680167802Sjkim *
681167802Sjkim ******************************************************************************/
682167802Sjkim
683167802Sjkimvoid
684167802SjkimAcpiDmDumpCpep (
685167802Sjkim    ACPI_TABLE_HEADER       *Table)
686167802Sjkim{
687193529Sjkim    ACPI_STATUS             Status;
688167802Sjkim    ACPI_CPEP_POLLING       *SubTable;
689167802Sjkim    UINT32                  Length = Table->Length;
690167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_CPEP);
691167802Sjkim
692167802Sjkim
693167802Sjkim    /* Main table */
694167802Sjkim
695193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
696193529Sjkim    if (ACPI_FAILURE (Status))
697193529Sjkim    {
698193529Sjkim        return;
699193529Sjkim    }
700167802Sjkim
701272444Sjkim    /* Subtables */
702167802Sjkim
703167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
704167802Sjkim    while (Offset < Table->Length)
705167802Sjkim    {
706167802Sjkim        AcpiOsPrintf ("\n");
707193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
708298714Sjkim            SubTable->Header.Length, AcpiDmTableInfoCpep0);
709193529Sjkim        if (ACPI_FAILURE (Status))
710193529Sjkim        {
711193529Sjkim            return;
712193529Sjkim        }
713167802Sjkim
714272444Sjkim        /* Point to next subtable */
715167802Sjkim
716197104Sjkim        Offset += SubTable->Header.Length;
717197104Sjkim        SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable,
718298714Sjkim            SubTable->Header.Length);
719167802Sjkim    }
720167802Sjkim}
721167802Sjkim
722167802Sjkim
723167802Sjkim/*******************************************************************************
724167802Sjkim *
725239340Sjkim * FUNCTION:    AcpiDmDumpCsrt
726239340Sjkim *
727239340Sjkim * PARAMETERS:  Table               - A CSRT table
728239340Sjkim *
729239340Sjkim * RETURN:      None
730239340Sjkim *
731239340Sjkim * DESCRIPTION: Format the contents of a CSRT. This table type consists
732239340Sjkim *              of an open-ended number of subtables.
733239340Sjkim *
734239340Sjkim ******************************************************************************/
735239340Sjkim
736239340Sjkimvoid
737239340SjkimAcpiDmDumpCsrt (
738239340Sjkim    ACPI_TABLE_HEADER       *Table)
739239340Sjkim{
740239340Sjkim    ACPI_STATUS             Status;
741239340Sjkim    ACPI_CSRT_GROUP         *SubTable;
742245582Sjkim    ACPI_CSRT_SHARED_INFO   *SharedInfoTable;
743239340Sjkim    ACPI_CSRT_DESCRIPTOR    *SubSubTable;
744239340Sjkim    UINT32                  Length = Table->Length;
745239340Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_CSRT);
746239340Sjkim    UINT32                  SubOffset;
747239340Sjkim    UINT32                  SubSubOffset;
748239340Sjkim    UINT32                  InfoLength;
749239340Sjkim
750239340Sjkim
751239340Sjkim    /* The main table only contains the ACPI header, thus already handled */
752239340Sjkim
753272444Sjkim    /* Subtables (Resource Groups) */
754239340Sjkim
755239340Sjkim    SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
756239340Sjkim    while (Offset < Table->Length)
757239340Sjkim    {
758245582Sjkim        /* Resource group subtable */
759245582Sjkim
760239340Sjkim        AcpiOsPrintf ("\n");
761239340Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
762298714Sjkim            SubTable->Length, AcpiDmTableInfoCsrt0);
763239340Sjkim        if (ACPI_FAILURE (Status))
764239340Sjkim        {
765239340Sjkim            return;
766239340Sjkim        }
767239340Sjkim
768245582Sjkim        /* Shared info subtable (One per resource group) */
769245582Sjkim
770239340Sjkim        SubOffset = sizeof (ACPI_CSRT_GROUP);
771245582Sjkim        SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,
772245582Sjkim            Offset + SubOffset);
773239340Sjkim
774245582Sjkim        AcpiOsPrintf ("\n");
775245582Sjkim        Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
776298714Sjkim            sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
777245582Sjkim        if (ACPI_FAILURE (Status))
778245582Sjkim        {
779245582Sjkim            return;
780245582Sjkim        }
781239340Sjkim
782245582Sjkim        SubOffset += SubTable->SharedInfoLength;
783239340Sjkim
784245582Sjkim        /* Sub-Subtables (Resource Descriptors) */
785239340Sjkim
786239340Sjkim        SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
787239340Sjkim            Offset + SubOffset);
788239340Sjkim
789239340Sjkim        while ((SubOffset < SubTable->Length) &&
790239340Sjkim              ((Offset + SubOffset) < Table->Length))
791239340Sjkim        {
792239340Sjkim            AcpiOsPrintf ("\n");
793239340Sjkim            Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubTable,
794298714Sjkim                SubSubTable->Length, AcpiDmTableInfoCsrt2);
795239340Sjkim            if (ACPI_FAILURE (Status))
796239340Sjkim            {
797239340Sjkim                return;
798239340Sjkim            }
799239340Sjkim
800239340Sjkim            SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
801239340Sjkim
802239340Sjkim            /* Resource-specific info buffer */
803239340Sjkim
804239340Sjkim            InfoLength = SubSubTable->Length - SubSubOffset;
805283092Sjkim            if (InfoLength)
806283092Sjkim            {
807283092Sjkim                Status = AcpiDmDumpTable (Length,
808298714Sjkim                    Offset + SubOffset + SubSubOffset, Table,
809298714Sjkim                    InfoLength, AcpiDmTableInfoCsrt2a);
810283092Sjkim                if (ACPI_FAILURE (Status))
811283092Sjkim                {
812283092Sjkim                    return;
813283092Sjkim                }
814283092Sjkim                SubSubOffset += InfoLength;
815283092Sjkim            }
816239340Sjkim
817245582Sjkim            /* Point to next sub-subtable */
818239340Sjkim
819239340Sjkim            SubOffset += SubSubTable->Length;
820239340Sjkim            SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable,
821298714Sjkim                SubSubTable->Length);
822239340Sjkim        }
823239340Sjkim
824272444Sjkim        /* Point to next subtable */
825239340Sjkim
826239340Sjkim        Offset += SubTable->Length;
827239340Sjkim        SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable,
828298714Sjkim            SubTable->Length);
829239340Sjkim    }
830239340Sjkim}
831239340Sjkim
832239340Sjkim
833239340Sjkim/*******************************************************************************
834239340Sjkim *
835239340Sjkim * FUNCTION:    AcpiDmDumpDbg2
836239340Sjkim *
837239340Sjkim * PARAMETERS:  Table               - A DBG2 table
838239340Sjkim *
839239340Sjkim * RETURN:      None
840239340Sjkim *
841239340Sjkim * DESCRIPTION: Format the contents of a DBG2. This table type consists
842239340Sjkim *              of an open-ended number of subtables.
843239340Sjkim *
844239340Sjkim ******************************************************************************/
845239340Sjkim
846239340Sjkimvoid
847239340SjkimAcpiDmDumpDbg2 (
848239340Sjkim    ACPI_TABLE_HEADER       *Table)
849239340Sjkim{
850239340Sjkim    ACPI_STATUS             Status;
851239340Sjkim    ACPI_DBG2_DEVICE        *SubTable;
852239340Sjkim    UINT32                  Length = Table->Length;
853239340Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_DBG2);
854239340Sjkim    UINT32                  i;
855239340Sjkim    UINT32                  ArrayOffset;
856239340Sjkim    UINT32                  AbsoluteOffset;
857239340Sjkim    UINT8                   *Array;
858239340Sjkim
859239340Sjkim
860239340Sjkim    /* Main table */
861239340Sjkim
862239340Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
863239340Sjkim    if (ACPI_FAILURE (Status))
864239340Sjkim    {
865239340Sjkim        return;
866239340Sjkim    }
867239340Sjkim
868272444Sjkim    /* Subtables */
869239340Sjkim
870239340Sjkim    SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
871239340Sjkim    while (Offset < Table->Length)
872239340Sjkim    {
873239340Sjkim        AcpiOsPrintf ("\n");
874239340Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
875298714Sjkim            SubTable->Length, AcpiDmTableInfoDbg2Device);
876239340Sjkim        if (ACPI_FAILURE (Status))
877239340Sjkim        {
878239340Sjkim            return;
879239340Sjkim        }
880239340Sjkim
881239340Sjkim        /* Dump the BaseAddress array */
882239340Sjkim
883239340Sjkim        for (i = 0; i < SubTable->RegisterCount; i++)
884239340Sjkim        {
885239340Sjkim            ArrayOffset = SubTable->BaseAddressOffset +
886239340Sjkim                (sizeof (ACPI_GENERIC_ADDRESS) * i);
887239340Sjkim            AbsoluteOffset = Offset + ArrayOffset;
888239340Sjkim            Array = (UINT8 *) SubTable + ArrayOffset;
889239340Sjkim
890239340Sjkim            Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
891298714Sjkim                SubTable->Length, AcpiDmTableInfoDbg2Addr);
892239340Sjkim            if (ACPI_FAILURE (Status))
893239340Sjkim            {
894239340Sjkim                return;
895239340Sjkim            }
896239340Sjkim        }
897239340Sjkim
898239340Sjkim        /* Dump the AddressSize array */
899239340Sjkim
900239340Sjkim        for (i = 0; i < SubTable->RegisterCount; i++)
901239340Sjkim        {
902239340Sjkim            ArrayOffset = SubTable->AddressSizeOffset +
903239340Sjkim                (sizeof (UINT32) * i);
904239340Sjkim            AbsoluteOffset = Offset + ArrayOffset;
905239340Sjkim            Array = (UINT8 *) SubTable + ArrayOffset;
906239340Sjkim
907239340Sjkim            Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
908298714Sjkim                SubTable->Length, AcpiDmTableInfoDbg2Size);
909239340Sjkim            if (ACPI_FAILURE (Status))
910239340Sjkim            {
911239340Sjkim                return;
912239340Sjkim            }
913239340Sjkim        }
914239340Sjkim
915239340Sjkim        /* Dump the Namestring (required) */
916239340Sjkim
917239340Sjkim        AcpiOsPrintf ("\n");
918239340Sjkim        ArrayOffset = SubTable->NamepathOffset;
919239340Sjkim        AbsoluteOffset = Offset + ArrayOffset;
920239340Sjkim        Array = (UINT8 *) SubTable + ArrayOffset;
921239340Sjkim
922239340Sjkim        Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
923298714Sjkim            SubTable->Length, AcpiDmTableInfoDbg2Name);
924239340Sjkim        if (ACPI_FAILURE (Status))
925239340Sjkim        {
926239340Sjkim            return;
927239340Sjkim        }
928239340Sjkim
929239340Sjkim        /* Dump the OemData (optional) */
930239340Sjkim
931272444Sjkim        if (SubTable->OemDataOffset)
932272444Sjkim        {
933283092Sjkim            Status = AcpiDmDumpTable (Length, Offset + SubTable->OemDataOffset,
934298714Sjkim                Table, SubTable->OemDataLength,
935298714Sjkim                AcpiDmTableInfoDbg2OemData);
936283092Sjkim            if (ACPI_FAILURE (Status))
937283092Sjkim            {
938283092Sjkim                return;
939283092Sjkim            }
940272444Sjkim        }
941239340Sjkim
942272444Sjkim        /* Point to next subtable */
943239340Sjkim
944239340Sjkim        Offset += SubTable->Length;
945239340Sjkim        SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable,
946298714Sjkim            SubTable->Length);
947239340Sjkim    }
948239340Sjkim}
949239340Sjkim
950239340Sjkim
951239340Sjkim/*******************************************************************************
952239340Sjkim *
953167802Sjkim * FUNCTION:    AcpiDmDumpDmar
954167802Sjkim *
955167802Sjkim * PARAMETERS:  Table               - A DMAR table
956167802Sjkim *
957167802Sjkim * RETURN:      None
958167802Sjkim *
959167802Sjkim * DESCRIPTION: Format the contents of a DMAR. This table type consists
960167802Sjkim *              of an open-ended number of subtables.
961167802Sjkim *
962167802Sjkim ******************************************************************************/
963167802Sjkim
964167802Sjkimvoid
965167802SjkimAcpiDmDumpDmar (
966167802Sjkim    ACPI_TABLE_HEADER       *Table)
967167802Sjkim{
968193529Sjkim    ACPI_STATUS             Status;
969167802Sjkim    ACPI_DMAR_HEADER        *SubTable;
970167802Sjkim    UINT32                  Length = Table->Length;
971167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_DMAR);
972167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
973167802Sjkim    ACPI_DMAR_DEVICE_SCOPE  *ScopeTable;
974167802Sjkim    UINT32                  ScopeOffset;
975167802Sjkim    UINT8                   *PciPath;
976167802Sjkim    UINT32                  PathOffset;
977167802Sjkim
978167802Sjkim
979167802Sjkim    /* Main table */
980167802Sjkim
981193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
982193529Sjkim    if (ACPI_FAILURE (Status))
983193529Sjkim    {
984193529Sjkim        return;
985193529Sjkim    }
986167802Sjkim
987272444Sjkim    /* Subtables */
988167802Sjkim
989167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
990167802Sjkim    while (Offset < Table->Length)
991167802Sjkim    {
992272444Sjkim        /* Common subtable header */
993167802Sjkim
994167802Sjkim        AcpiOsPrintf ("\n");
995193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
996298714Sjkim            SubTable->Length, AcpiDmTableInfoDmarHdr);
997193529Sjkim        if (ACPI_FAILURE (Status))
998193529Sjkim        {
999193529Sjkim            return;
1000193529Sjkim        }
1001298714Sjkim
1002252279Sjkim        AcpiOsPrintf ("\n");
1003167802Sjkim
1004167802Sjkim        switch (SubTable->Type)
1005167802Sjkim        {
1006167802Sjkim        case ACPI_DMAR_TYPE_HARDWARE_UNIT:
1007250838Sjkim
1008167802Sjkim            InfoTable = AcpiDmTableInfoDmar0;
1009167802Sjkim            ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
1010167802Sjkim            break;
1011250838Sjkim
1012167802Sjkim        case ACPI_DMAR_TYPE_RESERVED_MEMORY:
1013250838Sjkim
1014167802Sjkim            InfoTable = AcpiDmTableInfoDmar1;
1015167802Sjkim            ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
1016167802Sjkim            break;
1017250838Sjkim
1018272444Sjkim        case ACPI_DMAR_TYPE_ROOT_ATS:
1019250838Sjkim
1020193529Sjkim            InfoTable = AcpiDmTableInfoDmar2;
1021193529Sjkim            ScopeOffset = sizeof (ACPI_DMAR_ATSR);
1022193529Sjkim            break;
1023250838Sjkim
1024272444Sjkim        case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
1025250838Sjkim
1026197104Sjkim            InfoTable = AcpiDmTableInfoDmar3;
1027197104Sjkim            ScopeOffset = sizeof (ACPI_DMAR_RHSA);
1028197104Sjkim            break;
1029250838Sjkim
1030272444Sjkim        case ACPI_DMAR_TYPE_NAMESPACE:
1031272444Sjkim
1032272444Sjkim            InfoTable = AcpiDmTableInfoDmar4;
1033272444Sjkim            ScopeOffset = sizeof (ACPI_DMAR_ANDD);
1034272444Sjkim            break;
1035272444Sjkim
1036167802Sjkim        default:
1037250838Sjkim
1038298714Sjkim            AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",
1039298714Sjkim                SubTable->Type);
1040167802Sjkim            return;
1041167802Sjkim        }
1042167802Sjkim
1043193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1044298714Sjkim            SubTable->Length, InfoTable);
1045193529Sjkim        if (ACPI_FAILURE (Status))
1046193529Sjkim        {
1047193529Sjkim            return;
1048193529Sjkim        }
1049167802Sjkim
1050272444Sjkim        /*
1051272444Sjkim         * Dump the optional device scope entries
1052272444Sjkim         */
1053272444Sjkim        if ((SubTable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
1054272444Sjkim            (SubTable->Type == ACPI_DMAR_TYPE_NAMESPACE))
1055272444Sjkim        {
1056272444Sjkim            /* These types do not support device scopes */
1057193529Sjkim
1058272444Sjkim            goto NextSubtable;
1059272444Sjkim        }
1060272444Sjkim
1061193529Sjkim        ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset);
1062193529Sjkim        while (ScopeOffset < SubTable->Length)
1063167802Sjkim        {
1064193529Sjkim            AcpiOsPrintf ("\n");
1065193529Sjkim            Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
1066298714Sjkim                ScopeTable->Length, AcpiDmTableInfoDmarScope);
1067193529Sjkim            if (ACPI_FAILURE (Status))
1068167802Sjkim            {
1069193529Sjkim                return;
1070193529Sjkim            }
1071252279Sjkim            AcpiOsPrintf ("\n");
1072167802Sjkim
1073193529Sjkim            /* Dump the PCI Path entries for this device scope */
1074167802Sjkim
1075193529Sjkim            PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
1076167802Sjkim
1077193529Sjkim            PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
1078193529Sjkim                sizeof (ACPI_DMAR_DEVICE_SCOPE));
1079167802Sjkim
1080193529Sjkim            while (PathOffset < ScopeTable->Length)
1081193529Sjkim            {
1082298714Sjkim                AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2,
1083298714Sjkim                    "PCI Path");
1084209746Sjkim                AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
1085167802Sjkim
1086193529Sjkim                /* Point to next PCI Path entry */
1087167802Sjkim
1088193529Sjkim                PathOffset += 2;
1089193529Sjkim                PciPath += 2;
1090252279Sjkim                AcpiOsPrintf ("\n");
1091193529Sjkim            }
1092167802Sjkim
1093193529Sjkim            /* Point to next device scope entry */
1094167802Sjkim
1095193529Sjkim            ScopeOffset += ScopeTable->Length;
1096193529Sjkim            ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
1097193529Sjkim                ScopeTable, ScopeTable->Length);
1098167802Sjkim        }
1099167802Sjkim
1100272444SjkimNextSubtable:
1101272444Sjkim        /* Point to next subtable */
1102167802Sjkim
1103167802Sjkim        Offset += SubTable->Length;
1104298714Sjkim        SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable,
1105298714Sjkim            SubTable->Length);
1106167802Sjkim    }
1107167802Sjkim}
1108167802Sjkim
1109167802Sjkim
1110167802Sjkim/*******************************************************************************
1111167802Sjkim *
1112283092Sjkim * FUNCTION:    AcpiDmDumpDrtm
1113283092Sjkim *
1114283092Sjkim * PARAMETERS:  Table               - A DRTM table
1115283092Sjkim *
1116283092Sjkim * RETURN:      None
1117283092Sjkim *
1118283092Sjkim * DESCRIPTION: Format the contents of a DRTM.
1119283092Sjkim *
1120283092Sjkim ******************************************************************************/
1121283092Sjkim
1122283092Sjkimvoid
1123283092SjkimAcpiDmDumpDrtm (
1124283092Sjkim    ACPI_TABLE_HEADER       *Table)
1125283092Sjkim{
1126283092Sjkim    ACPI_STATUS             Status;
1127283092Sjkim    UINT32                  Offset;
1128283092Sjkim    ACPI_DRTM_VTABLE_LIST   *DrtmVtl;
1129283092Sjkim    ACPI_DRTM_RESOURCE_LIST *DrtmRl;
1130283092Sjkim    ACPI_DRTM_DPS_ID        *DrtmDps;
1131283092Sjkim    UINT32                  Count;
1132283092Sjkim
1133283092Sjkim
1134283092Sjkim    /* Main table */
1135283092Sjkim
1136283092Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
1137298714Sjkim        AcpiDmTableInfoDrtm);
1138283092Sjkim    if (ACPI_FAILURE (Status))
1139283092Sjkim    {
1140283092Sjkim        return;
1141283092Sjkim    }
1142283092Sjkim
1143283092Sjkim    Offset = sizeof (ACPI_TABLE_DRTM);
1144283092Sjkim
1145283092Sjkim    /* Sub-tables */
1146283092Sjkim
1147283092Sjkim    /* Dump ValidatedTable length */
1148283092Sjkim
1149283092Sjkim    DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
1150283092Sjkim    AcpiOsPrintf ("\n");
1151283092Sjkim    Status = AcpiDmDumpTable (Table->Length, Offset,
1152298714Sjkim        DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
1153298714Sjkim        AcpiDmTableInfoDrtm0);
1154283092Sjkim    if (ACPI_FAILURE (Status))
1155283092Sjkim    {
1156283092Sjkim            return;
1157283092Sjkim    }
1158298714Sjkim
1159283092Sjkim    Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);
1160283092Sjkim
1161283092Sjkim    /* Dump Validated table addresses */
1162283092Sjkim
1163283092Sjkim    Count = 0;
1164283092Sjkim    while ((Offset < Table->Length) &&
1165283092Sjkim            (DrtmVtl->ValidatedTableCount > Count))
1166283092Sjkim    {
1167283092Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset,
1168298714Sjkim            ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
1169298714Sjkim            AcpiDmTableInfoDrtm0a);
1170283092Sjkim        if (ACPI_FAILURE (Status))
1171283092Sjkim        {
1172283092Sjkim            return;
1173283092Sjkim        }
1174298714Sjkim
1175283092Sjkim        Offset += sizeof (UINT64);
1176283092Sjkim        Count++;
1177283092Sjkim    }
1178283092Sjkim
1179283092Sjkim    /* Dump ResourceList length */
1180283092Sjkim
1181283092Sjkim    DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
1182283092Sjkim    AcpiOsPrintf ("\n");
1183283092Sjkim    Status = AcpiDmDumpTable (Table->Length, Offset,
1184298714Sjkim        DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
1185298714Sjkim        AcpiDmTableInfoDrtm1);
1186283092Sjkim    if (ACPI_FAILURE (Status))
1187283092Sjkim    {
1188285797Sjkim        return;
1189283092Sjkim    }
1190283092Sjkim
1191283092Sjkim    Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);
1192283092Sjkim
1193283092Sjkim    /* Dump the Resource List */
1194283092Sjkim
1195283092Sjkim    Count = 0;
1196283092Sjkim    while ((Offset < Table->Length) &&
1197283092Sjkim           (DrtmRl->ResourceCount > Count))
1198283092Sjkim    {
1199283092Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset,
1200298714Sjkim            ACPI_ADD_PTR (void, Table, Offset),
1201298714Sjkim            sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a);
1202283092Sjkim        if (ACPI_FAILURE (Status))
1203283092Sjkim        {
1204283092Sjkim            return;
1205283092Sjkim        }
1206283092Sjkim
1207283092Sjkim        Offset += sizeof (ACPI_DRTM_RESOURCE);
1208283092Sjkim        Count++;
1209283092Sjkim    }
1210283092Sjkim
1211283092Sjkim    /* Dump DPS */
1212283092Sjkim
1213283092Sjkim    DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
1214283092Sjkim    AcpiOsPrintf ("\n");
1215285797Sjkim    (void) AcpiDmDumpTable (Table->Length, Offset,
1216298714Sjkim        DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2);
1217283092Sjkim}
1218283092Sjkim
1219283092Sjkim
1220283092Sjkim/*******************************************************************************
1221283092Sjkim *
1222193529Sjkim * FUNCTION:    AcpiDmDumpEinj
1223193529Sjkim *
1224193529Sjkim * PARAMETERS:  Table               - A EINJ table
1225193529Sjkim *
1226193529Sjkim * RETURN:      None
1227193529Sjkim *
1228193529Sjkim * DESCRIPTION: Format the contents of a EINJ. This table type consists
1229193529Sjkim *              of an open-ended number of subtables.
1230193529Sjkim *
1231193529Sjkim ******************************************************************************/
1232193529Sjkim
1233193529Sjkimvoid
1234193529SjkimAcpiDmDumpEinj (
1235193529Sjkim    ACPI_TABLE_HEADER       *Table)
1236193529Sjkim{
1237193529Sjkim    ACPI_STATUS             Status;
1238193529Sjkim    ACPI_WHEA_HEADER        *SubTable;
1239193529Sjkim    UINT32                  Length = Table->Length;
1240193529Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_EINJ);
1241193529Sjkim
1242193529Sjkim
1243193529Sjkim    /* Main table */
1244193529Sjkim
1245193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
1246193529Sjkim    if (ACPI_FAILURE (Status))
1247193529Sjkim    {
1248193529Sjkim        return;
1249193529Sjkim    }
1250193529Sjkim
1251272444Sjkim    /* Subtables */
1252193529Sjkim
1253193529Sjkim    SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1254193529Sjkim    while (Offset < Table->Length)
1255193529Sjkim    {
1256193529Sjkim        AcpiOsPrintf ("\n");
1257193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1258298714Sjkim            sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
1259193529Sjkim        if (ACPI_FAILURE (Status))
1260193529Sjkim        {
1261193529Sjkim            return;
1262193529Sjkim        }
1263193529Sjkim
1264272444Sjkim        /* Point to next subtable (each subtable is of fixed length) */
1265193529Sjkim
1266193529Sjkim        Offset += sizeof (ACPI_WHEA_HEADER);
1267193529Sjkim        SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
1268298714Sjkim            sizeof (ACPI_WHEA_HEADER));
1269193529Sjkim    }
1270193529Sjkim}
1271193529Sjkim
1272193529Sjkim
1273193529Sjkim/*******************************************************************************
1274193529Sjkim *
1275193529Sjkim * FUNCTION:    AcpiDmDumpErst
1276193529Sjkim *
1277193529Sjkim * PARAMETERS:  Table               - A ERST table
1278193529Sjkim *
1279193529Sjkim * RETURN:      None
1280193529Sjkim *
1281193529Sjkim * DESCRIPTION: Format the contents of a ERST. This table type consists
1282193529Sjkim *              of an open-ended number of subtables.
1283193529Sjkim *
1284193529Sjkim ******************************************************************************/
1285193529Sjkim
1286193529Sjkimvoid
1287193529SjkimAcpiDmDumpErst (
1288193529Sjkim    ACPI_TABLE_HEADER       *Table)
1289193529Sjkim{
1290193529Sjkim    ACPI_STATUS             Status;
1291193529Sjkim    ACPI_WHEA_HEADER        *SubTable;
1292193529Sjkim    UINT32                  Length = Table->Length;
1293193529Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_ERST);
1294193529Sjkim
1295193529Sjkim
1296193529Sjkim    /* Main table */
1297193529Sjkim
1298193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
1299193529Sjkim    if (ACPI_FAILURE (Status))
1300193529Sjkim    {
1301193529Sjkim        return;
1302193529Sjkim    }
1303193529Sjkim
1304272444Sjkim    /* Subtables */
1305193529Sjkim
1306193529Sjkim    SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1307193529Sjkim    while (Offset < Table->Length)
1308193529Sjkim    {
1309193529Sjkim        AcpiOsPrintf ("\n");
1310193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1311298714Sjkim            sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
1312193529Sjkim        if (ACPI_FAILURE (Status))
1313193529Sjkim        {
1314193529Sjkim            return;
1315193529Sjkim        }
1316193529Sjkim
1317272444Sjkim        /* Point to next subtable (each subtable is of fixed length) */
1318193529Sjkim
1319193529Sjkim        Offset += sizeof (ACPI_WHEA_HEADER);
1320193529Sjkim        SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
1321298714Sjkim            sizeof (ACPI_WHEA_HEADER));
1322193529Sjkim    }
1323193529Sjkim}
1324193529Sjkim
1325193529Sjkim
1326193529Sjkim/*******************************************************************************
1327193529Sjkim *
1328228110Sjkim * FUNCTION:    AcpiDmDumpFpdt
1329228110Sjkim *
1330228110Sjkim * PARAMETERS:  Table               - A FPDT table
1331228110Sjkim *
1332228110Sjkim * RETURN:      None
1333228110Sjkim *
1334228110Sjkim * DESCRIPTION: Format the contents of a FPDT. This table type consists
1335228110Sjkim *              of an open-ended number of subtables.
1336228110Sjkim *
1337228110Sjkim ******************************************************************************/
1338228110Sjkim
1339228110Sjkimvoid
1340228110SjkimAcpiDmDumpFpdt (
1341228110Sjkim    ACPI_TABLE_HEADER       *Table)
1342228110Sjkim{
1343228110Sjkim    ACPI_STATUS             Status;
1344228110Sjkim    ACPI_FPDT_HEADER        *SubTable;
1345228110Sjkim    UINT32                  Length = Table->Length;
1346228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
1347228110Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1348228110Sjkim
1349228110Sjkim
1350228110Sjkim    /* There is no main table (other than the standard ACPI header) */
1351228110Sjkim
1352272444Sjkim    /* Subtables */
1353228110Sjkim
1354228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
1355228110Sjkim    while (Offset < Table->Length)
1356228110Sjkim    {
1357272444Sjkim        /* Common subtable header */
1358228110Sjkim
1359228110Sjkim        AcpiOsPrintf ("\n");
1360228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1361298714Sjkim            SubTable->Length, AcpiDmTableInfoFpdtHdr);
1362228110Sjkim        if (ACPI_FAILURE (Status))
1363228110Sjkim        {
1364228110Sjkim            return;
1365228110Sjkim        }
1366228110Sjkim
1367228110Sjkim        switch (SubTable->Type)
1368228110Sjkim        {
1369228110Sjkim        case ACPI_FPDT_TYPE_BOOT:
1370250838Sjkim
1371228110Sjkim            InfoTable = AcpiDmTableInfoFpdt0;
1372228110Sjkim            break;
1373250838Sjkim
1374228110Sjkim        case ACPI_FPDT_TYPE_S3PERF:
1375250838Sjkim
1376228110Sjkim            InfoTable = AcpiDmTableInfoFpdt1;
1377228110Sjkim            break;
1378250838Sjkim
1379228110Sjkim        default:
1380250838Sjkim
1381298714Sjkim            AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",
1382298714Sjkim                SubTable->Type);
1383228110Sjkim
1384228110Sjkim            /* Attempt to continue */
1385228110Sjkim
1386228110Sjkim            if (!SubTable->Length)
1387228110Sjkim            {
1388228110Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
1389228110Sjkim                return;
1390228110Sjkim            }
1391228110Sjkim            goto NextSubTable;
1392228110Sjkim        }
1393228110Sjkim
1394228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1395298714Sjkim            SubTable->Length, InfoTable);
1396228110Sjkim        if (ACPI_FAILURE (Status))
1397228110Sjkim        {
1398228110Sjkim            return;
1399228110Sjkim        }
1400228110Sjkim
1401228110SjkimNextSubTable:
1402272444Sjkim        /* Point to next subtable */
1403228110Sjkim
1404228110Sjkim        Offset += SubTable->Length;
1405298714Sjkim        SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable,
1406298714Sjkim            SubTable->Length);
1407228110Sjkim    }
1408228110Sjkim}
1409228110Sjkim
1410228110Sjkim
1411228110Sjkim/*******************************************************************************
1412228110Sjkim *
1413272444Sjkim * FUNCTION:    AcpiDmDumpGtdt
1414272444Sjkim *
1415272444Sjkim * PARAMETERS:  Table               - A GTDT table
1416272444Sjkim *
1417272444Sjkim * RETURN:      None
1418272444Sjkim *
1419272444Sjkim * DESCRIPTION: Format the contents of a GTDT. This table type consists
1420272444Sjkim *              of an open-ended number of subtables.
1421272444Sjkim *
1422272444Sjkim ******************************************************************************/
1423272444Sjkim
1424272444Sjkimvoid
1425272444SjkimAcpiDmDumpGtdt (
1426272444Sjkim    ACPI_TABLE_HEADER       *Table)
1427272444Sjkim{
1428272444Sjkim    ACPI_STATUS             Status;
1429272444Sjkim    ACPI_GTDT_HEADER        *SubTable;
1430272444Sjkim    UINT32                  Length = Table->Length;
1431272444Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_GTDT);
1432272444Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1433272444Sjkim    UINT32                  SubTableLength;
1434272444Sjkim    UINT32                  GtCount;
1435272444Sjkim    ACPI_GTDT_TIMER_ENTRY   *GtxTable;
1436272444Sjkim
1437272444Sjkim
1438272444Sjkim    /* Main table */
1439272444Sjkim
1440272444Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
1441272444Sjkim    if (ACPI_FAILURE (Status))
1442272444Sjkim    {
1443272444Sjkim        return;
1444272444Sjkim    }
1445272444Sjkim
1446272444Sjkim    /* Subtables */
1447272444Sjkim
1448272444Sjkim    SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
1449272444Sjkim    while (Offset < Table->Length)
1450272444Sjkim    {
1451272444Sjkim        /* Common subtable header */
1452272444Sjkim
1453272444Sjkim        AcpiOsPrintf ("\n");
1454272444Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1455298714Sjkim            SubTable->Length, AcpiDmTableInfoGtdtHdr);
1456272444Sjkim        if (ACPI_FAILURE (Status))
1457272444Sjkim        {
1458272444Sjkim            return;
1459272444Sjkim        }
1460272444Sjkim
1461272444Sjkim        GtCount = 0;
1462272444Sjkim        switch (SubTable->Type)
1463272444Sjkim        {
1464272444Sjkim        case ACPI_GTDT_TYPE_TIMER_BLOCK:
1465272444Sjkim
1466272444Sjkim            SubTableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
1467272444Sjkim            GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
1468298714Sjkim                SubTable))->TimerCount;
1469272444Sjkim
1470272444Sjkim            InfoTable = AcpiDmTableInfoGtdt0;
1471272444Sjkim            break;
1472272444Sjkim
1473272444Sjkim        case ACPI_GTDT_TYPE_WATCHDOG:
1474272444Sjkim
1475272444Sjkim            SubTableLength = sizeof (ACPI_GTDT_WATCHDOG);
1476272444Sjkim
1477272444Sjkim            InfoTable = AcpiDmTableInfoGtdt1;
1478272444Sjkim            break;
1479272444Sjkim
1480272444Sjkim        default:
1481272444Sjkim
1482272444Sjkim            /* Cannot continue on unknown type - no length */
1483272444Sjkim
1484298714Sjkim            AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n",
1485298714Sjkim                SubTable->Type);
1486272444Sjkim            return;
1487272444Sjkim        }
1488272444Sjkim
1489272444Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1490298714Sjkim            SubTable->Length, InfoTable);
1491272444Sjkim        if (ACPI_FAILURE (Status))
1492272444Sjkim        {
1493272444Sjkim            return;
1494272444Sjkim        }
1495272444Sjkim
1496272444Sjkim        /* Point to end of current subtable (each subtable above is of fixed length) */
1497272444Sjkim
1498272444Sjkim        Offset += SubTableLength;
1499272444Sjkim
1500272444Sjkim        /* If there are any Gt Timer Blocks from above, dump them now */
1501272444Sjkim
1502272444Sjkim        if (GtCount)
1503272444Sjkim        {
1504298714Sjkim            GtxTable = ACPI_ADD_PTR (
1505298714Sjkim                ACPI_GTDT_TIMER_ENTRY, SubTable, SubTableLength);
1506272444Sjkim            SubTableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
1507272444Sjkim
1508272444Sjkim            while (GtCount)
1509272444Sjkim            {
1510272444Sjkim                AcpiOsPrintf ("\n");
1511272444Sjkim                Status = AcpiDmDumpTable (Length, Offset, GtxTable,
1512298714Sjkim                    sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
1513272444Sjkim                if (ACPI_FAILURE (Status))
1514272444Sjkim                {
1515272444Sjkim                    return;
1516272444Sjkim                }
1517272444Sjkim                Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
1518272444Sjkim                GtxTable++;
1519272444Sjkim                GtCount--;
1520272444Sjkim            }
1521272444Sjkim        }
1522272444Sjkim
1523272444Sjkim        /* Point to next subtable */
1524272444Sjkim
1525272444Sjkim        SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, SubTable, SubTableLength);
1526272444Sjkim    }
1527272444Sjkim}
1528272444Sjkim
1529272444Sjkim
1530272444Sjkim/*******************************************************************************
1531272444Sjkim *
1532193529Sjkim * FUNCTION:    AcpiDmDumpHest
1533193529Sjkim *
1534193529Sjkim * PARAMETERS:  Table               - A HEST table
1535193529Sjkim *
1536193529Sjkim * RETURN:      None
1537193529Sjkim *
1538193529Sjkim * DESCRIPTION: Format the contents of a HEST. This table type consists
1539193529Sjkim *              of an open-ended number of subtables.
1540193529Sjkim *
1541193529Sjkim ******************************************************************************/
1542193529Sjkim
1543193529Sjkimvoid
1544193529SjkimAcpiDmDumpHest (
1545193529Sjkim    ACPI_TABLE_HEADER       *Table)
1546193529Sjkim{
1547193529Sjkim    ACPI_STATUS             Status;
1548193529Sjkim    ACPI_HEST_HEADER        *SubTable;
1549193529Sjkim    UINT32                  Length = Table->Length;
1550193529Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_HEST);
1551193529Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1552193529Sjkim    UINT32                  SubTableLength;
1553197104Sjkim    UINT32                  BankCount;
1554197104Sjkim    ACPI_HEST_IA_ERROR_BANK *BankTable;
1555193529Sjkim
1556193529Sjkim
1557193529Sjkim    /* Main table */
1558193529Sjkim
1559193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
1560193529Sjkim    if (ACPI_FAILURE (Status))
1561193529Sjkim    {
1562193529Sjkim        return;
1563193529Sjkim    }
1564193529Sjkim
1565272444Sjkim    /* Subtables */
1566193529Sjkim
1567193529Sjkim    SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
1568193529Sjkim    while (Offset < Table->Length)
1569193529Sjkim    {
1570197104Sjkim        BankCount = 0;
1571193529Sjkim        switch (SubTable->Type)
1572193529Sjkim        {
1573197104Sjkim        case ACPI_HEST_TYPE_IA32_CHECK:
1574250838Sjkim
1575193529Sjkim            InfoTable = AcpiDmTableInfoHest0;
1576197104Sjkim            SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
1577197104Sjkim            BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1578298714Sjkim                SubTable))->NumHardwareBanks;
1579193529Sjkim            break;
1580193529Sjkim
1581197104Sjkim        case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1582250838Sjkim
1583193529Sjkim            InfoTable = AcpiDmTableInfoHest1;
1584197104Sjkim            SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED);
1585197104Sjkim            BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1586298714Sjkim                SubTable))->NumHardwareBanks;
1587193529Sjkim            break;
1588193529Sjkim
1589197104Sjkim        case ACPI_HEST_TYPE_IA32_NMI:
1590250838Sjkim
1591197104Sjkim            InfoTable = AcpiDmTableInfoHest2;
1592197104Sjkim            SubTableLength = sizeof (ACPI_HEST_IA_NMI);
1593193529Sjkim            break;
1594193529Sjkim
1595193529Sjkim        case ACPI_HEST_TYPE_AER_ROOT_PORT:
1596250838Sjkim
1597193529Sjkim            InfoTable = AcpiDmTableInfoHest6;
1598193529Sjkim            SubTableLength = sizeof (ACPI_HEST_AER_ROOT);
1599193529Sjkim            break;
1600193529Sjkim
1601193529Sjkim        case ACPI_HEST_TYPE_AER_ENDPOINT:
1602250838Sjkim
1603193529Sjkim            InfoTable = AcpiDmTableInfoHest7;
1604193529Sjkim            SubTableLength = sizeof (ACPI_HEST_AER);
1605193529Sjkim            break;
1606193529Sjkim
1607193529Sjkim        case ACPI_HEST_TYPE_AER_BRIDGE:
1608250838Sjkim
1609193529Sjkim            InfoTable = AcpiDmTableInfoHest8;
1610193529Sjkim            SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE);
1611193529Sjkim            break;
1612193529Sjkim
1613197104Sjkim        case ACPI_HEST_TYPE_GENERIC_ERROR:
1614250838Sjkim
1615193529Sjkim            InfoTable = AcpiDmTableInfoHest9;
1616193529Sjkim            SubTableLength = sizeof (ACPI_HEST_GENERIC);
1617193529Sjkim            break;
1618193529Sjkim
1619298714Sjkim        case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
1620298714Sjkim
1621298714Sjkim            InfoTable = AcpiDmTableInfoHest10;
1622298714Sjkim            SubTableLength = sizeof (ACPI_HEST_GENERIC_V2);
1623298714Sjkim            break;
1624298714Sjkim
1625193529Sjkim        default:
1626250838Sjkim
1627193529Sjkim            /* Cannot continue on unknown type - no length */
1628193529Sjkim
1629298714Sjkim            AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n",
1630298714Sjkim                SubTable->Type);
1631193529Sjkim            return;
1632193529Sjkim        }
1633193529Sjkim
1634193529Sjkim        AcpiOsPrintf ("\n");
1635193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1636298714Sjkim            SubTableLength, InfoTable);
1637193529Sjkim        if (ACPI_FAILURE (Status))
1638193529Sjkim        {
1639193529Sjkim            return;
1640193529Sjkim        }
1641193529Sjkim
1642197104Sjkim        /* Point to end of current subtable (each subtable above is of fixed length) */
1643193529Sjkim
1644193529Sjkim        Offset += SubTableLength;
1645197104Sjkim
1646197104Sjkim        /* If there are any (fixed-length) Error Banks from above, dump them now */
1647197104Sjkim
1648197104Sjkim        if (BankCount)
1649197104Sjkim        {
1650298714Sjkim            BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable,
1651298714Sjkim                SubTableLength);
1652197104Sjkim            SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
1653197104Sjkim
1654197104Sjkim            while (BankCount)
1655197104Sjkim            {
1656197104Sjkim                AcpiOsPrintf ("\n");
1657197104Sjkim                Status = AcpiDmDumpTable (Length, Offset, BankTable,
1658298714Sjkim                    sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
1659197104Sjkim                if (ACPI_FAILURE (Status))
1660197104Sjkim                {
1661197104Sjkim                    return;
1662197104Sjkim                }
1663298714Sjkim
1664197104Sjkim                Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
1665197104Sjkim                BankTable++;
1666197104Sjkim                BankCount--;
1667197104Sjkim            }
1668197104Sjkim        }
1669197104Sjkim
1670272444Sjkim        /* Point to next subtable */
1671197104Sjkim
1672193529Sjkim        SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength);
1673193529Sjkim    }
1674193529Sjkim}
1675193529Sjkim
1676193529Sjkim
1677193529Sjkim/*******************************************************************************
1678193529Sjkim *
1679283092Sjkim * FUNCTION:    AcpiDmDumpIort
1680283092Sjkim *
1681283092Sjkim * PARAMETERS:  Table               - A IORT table
1682283092Sjkim *
1683283092Sjkim * RETURN:      None
1684283092Sjkim *
1685283092Sjkim * DESCRIPTION: Format the contents of a IORT
1686283092Sjkim *
1687283092Sjkim ******************************************************************************/
1688283092Sjkim
1689283092Sjkimvoid
1690283092SjkimAcpiDmDumpIort (
1691283092Sjkim    ACPI_TABLE_HEADER       *Table)
1692283092Sjkim{
1693283092Sjkim    ACPI_STATUS             Status;
1694283092Sjkim    ACPI_TABLE_IORT         *Iort;
1695283092Sjkim    ACPI_IORT_NODE          *IortNode;
1696283092Sjkim    ACPI_IORT_ITS_GROUP     *IortItsGroup = NULL;
1697283092Sjkim    ACPI_IORT_SMMU          *IortSmmu = NULL;
1698283092Sjkim    UINT32                  Offset;
1699283092Sjkim    UINT32                  NodeOffset;
1700283092Sjkim    UINT32                  Length;
1701283092Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1702283092Sjkim    char                    *String;
1703283092Sjkim    UINT32                  i;
1704283092Sjkim
1705283092Sjkim
1706283092Sjkim    /* Main table */
1707283092Sjkim
1708283092Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort);
1709283092Sjkim    if (ACPI_FAILURE (Status))
1710283092Sjkim    {
1711283092Sjkim        return;
1712283092Sjkim    }
1713283092Sjkim
1714283092Sjkim    Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);
1715283092Sjkim    Offset = sizeof (ACPI_TABLE_IORT);
1716283092Sjkim
1717283092Sjkim    /* Dump the OptionalPadding (optional) */
1718283092Sjkim
1719283092Sjkim    if (Iort->NodeOffset > Offset)
1720283092Sjkim    {
1721283092Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, Table,
1722298714Sjkim            Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad);
1723283092Sjkim        if (ACPI_FAILURE (Status))
1724283092Sjkim        {
1725283092Sjkim            return;
1726283092Sjkim        }
1727283092Sjkim    }
1728283092Sjkim
1729283092Sjkim    Offset = Iort->NodeOffset;
1730283092Sjkim    while (Offset < Table->Length)
1731283092Sjkim    {
1732283092Sjkim        /* Common subtable header */
1733283092Sjkim
1734283092Sjkim        IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
1735283092Sjkim        AcpiOsPrintf ("\n");
1736283092Sjkim        Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
1737283092Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset,
1738298714Sjkim            IortNode, Length, AcpiDmTableInfoIortHdr);
1739283092Sjkim        if (ACPI_FAILURE (Status))
1740283092Sjkim        {
1741283092Sjkim            return;
1742283092Sjkim        }
1743283092Sjkim
1744283092Sjkim        NodeOffset = Length;
1745283092Sjkim
1746283092Sjkim        switch (IortNode->Type)
1747283092Sjkim        {
1748283092Sjkim        case ACPI_IORT_NODE_ITS_GROUP:
1749283092Sjkim
1750283092Sjkim            InfoTable = AcpiDmTableInfoIort0;
1751283092Sjkim            Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers);
1752283092Sjkim            IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset);
1753283092Sjkim            break;
1754283092Sjkim
1755283092Sjkim        case ACPI_IORT_NODE_NAMED_COMPONENT:
1756283092Sjkim
1757283092Sjkim            InfoTable = AcpiDmTableInfoIort1;
1758283092Sjkim            Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName);
1759283092Sjkim            String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length);
1760284583Sjkim            Length += strlen (String) + 1;
1761283092Sjkim            break;
1762283092Sjkim
1763283092Sjkim        case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
1764283092Sjkim
1765283092Sjkim            InfoTable = AcpiDmTableInfoIort2;
1766283092Sjkim            Length = IortNode->Length - NodeOffset;
1767283092Sjkim            break;
1768283092Sjkim
1769283092Sjkim        case ACPI_IORT_NODE_SMMU:
1770283092Sjkim
1771283092Sjkim            InfoTable = AcpiDmTableInfoIort3;
1772283092Sjkim            Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts);
1773283092Sjkim            IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset);
1774283092Sjkim            break;
1775283092Sjkim
1776298714Sjkim        case ACPI_IORT_NODE_SMMU_V3:
1777298714Sjkim
1778298714Sjkim            InfoTable = AcpiDmTableInfoIort4;
1779298714Sjkim            Length = IortNode->Length - NodeOffset;
1780298714Sjkim            break;
1781298714Sjkim
1782283092Sjkim        default:
1783283092Sjkim
1784283092Sjkim            AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",
1785283092Sjkim                IortNode->Type);
1786283092Sjkim
1787283092Sjkim            /* Attempt to continue */
1788283092Sjkim
1789283092Sjkim            if (!IortNode->Length)
1790283092Sjkim            {
1791283092Sjkim                AcpiOsPrintf ("Invalid zero length IORT node\n");
1792283092Sjkim                return;
1793283092Sjkim            }
1794283092Sjkim            goto NextSubTable;
1795283092Sjkim        }
1796283092Sjkim
1797283092Sjkim        /* Dump the node subtable header */
1798283092Sjkim
1799283092Sjkim        AcpiOsPrintf ("\n");
1800283092Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1801298714Sjkim            ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1802298714Sjkim            Length, InfoTable);
1803283092Sjkim        if (ACPI_FAILURE (Status))
1804283092Sjkim        {
1805283092Sjkim            return;
1806283092Sjkim        }
1807283092Sjkim
1808283092Sjkim        NodeOffset += Length;
1809283092Sjkim
1810283092Sjkim        /* Dump the node specific data */
1811283092Sjkim
1812283092Sjkim        switch (IortNode->Type)
1813283092Sjkim        {
1814283092Sjkim        case ACPI_IORT_NODE_ITS_GROUP:
1815283092Sjkim
1816283092Sjkim            /* Validate IortItsGroup to avoid compiler warnings */
1817283092Sjkim
1818283092Sjkim            if (IortItsGroup)
1819283092Sjkim            {
1820283092Sjkim                for (i = 0; i < IortItsGroup->ItsCount; i++)
1821283092Sjkim                {
1822283092Sjkim                    Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1823298714Sjkim                        ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1824298714Sjkim                        4, AcpiDmTableInfoIort0a);
1825283092Sjkim                    NodeOffset += 4;
1826283092Sjkim                }
1827283092Sjkim            }
1828283092Sjkim            break;
1829283092Sjkim
1830283092Sjkim        case ACPI_IORT_NODE_NAMED_COMPONENT:
1831283092Sjkim
1832283092Sjkim            /* Dump the Padding (optional) */
1833283092Sjkim
1834283092Sjkim            if (IortNode->Length > NodeOffset)
1835283092Sjkim            {
1836283092Sjkim                Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1837298714Sjkim                    Table, IortNode->Length - NodeOffset,
1838298714Sjkim                    AcpiDmTableInfoIort1a);
1839283092Sjkim                if (ACPI_FAILURE (Status))
1840283092Sjkim                {
1841283092Sjkim                    return;
1842283092Sjkim                }
1843283092Sjkim            }
1844283092Sjkim            break;
1845283092Sjkim
1846283092Sjkim        case ACPI_IORT_NODE_SMMU:
1847283092Sjkim
1848283092Sjkim            AcpiOsPrintf ("\n");
1849283092Sjkim
1850283092Sjkim            /* Validate IortSmmu to avoid compiler warnings */
1851283092Sjkim
1852283092Sjkim            if (IortSmmu)
1853283092Sjkim            {
1854283092Sjkim                Length = 2 * sizeof (UINT64);
1855283092Sjkim                NodeOffset = IortSmmu->GlobalInterruptOffset;
1856283092Sjkim                Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1857298714Sjkim                    ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1858298714Sjkim                    Length, AcpiDmTableInfoIort3a);
1859285797Sjkim                if (ACPI_FAILURE (Status))
1860285797Sjkim                {
1861285797Sjkim                    return;
1862285797Sjkim                }
1863283092Sjkim
1864283092Sjkim                NodeOffset = IortSmmu->ContextInterruptOffset;
1865283092Sjkim                for (i = 0; i < IortSmmu->ContextInterruptCount; i++)
1866283092Sjkim                {
1867283092Sjkim                    Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1868298714Sjkim                        ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1869298714Sjkim                        8, AcpiDmTableInfoIort3b);
1870285797Sjkim                    if (ACPI_FAILURE (Status))
1871285797Sjkim                    {
1872285797Sjkim                        return;
1873285797Sjkim                    }
1874298714Sjkim
1875283092Sjkim                    NodeOffset += 8;
1876283092Sjkim                }
1877283092Sjkim
1878283092Sjkim                NodeOffset = IortSmmu->PmuInterruptOffset;
1879283092Sjkim                for (i = 0; i < IortSmmu->PmuInterruptCount; i++)
1880283092Sjkim                {
1881283092Sjkim                    Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1882298714Sjkim                        ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1883298714Sjkim                        8, AcpiDmTableInfoIort3c);
1884285797Sjkim                    if (ACPI_FAILURE (Status))
1885285797Sjkim                    {
1886285797Sjkim                        return;
1887285797Sjkim                    }
1888298714Sjkim
1889283092Sjkim                    NodeOffset += 8;
1890283092Sjkim                }
1891283092Sjkim            }
1892283092Sjkim            break;
1893283092Sjkim
1894283092Sjkim        default:
1895283092Sjkim
1896283092Sjkim            break;
1897283092Sjkim        }
1898283092Sjkim
1899283092Sjkim        /* Dump the ID mappings */
1900283092Sjkim
1901283092Sjkim        NodeOffset = IortNode->MappingOffset;
1902283092Sjkim        for (i = 0; i < IortNode->MappingCount; i++)
1903283092Sjkim        {
1904283092Sjkim            AcpiOsPrintf ("\n");
1905283092Sjkim            Length = sizeof (ACPI_IORT_ID_MAPPING);
1906283092Sjkim            Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1907298714Sjkim                ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1908298714Sjkim                Length, AcpiDmTableInfoIortMap);
1909285797Sjkim            if (ACPI_FAILURE (Status))
1910285797Sjkim            {
1911285797Sjkim                return;
1912285797Sjkim            }
1913298714Sjkim
1914283092Sjkim            NodeOffset += Length;
1915283092Sjkim        }
1916283092Sjkim
1917283092SjkimNextSubTable:
1918283092Sjkim        /* Point to next node subtable */
1919283092Sjkim
1920283092Sjkim        Offset += IortNode->Length;
1921283092Sjkim        IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, IortNode->Length);
1922283092Sjkim    }
1923283092Sjkim}
1924283092Sjkim
1925283092Sjkim
1926283092Sjkim/*******************************************************************************
1927283092Sjkim *
1928197104Sjkim * FUNCTION:    AcpiDmDumpIvrs
1929197104Sjkim *
1930197104Sjkim * PARAMETERS:  Table               - A IVRS table
1931197104Sjkim *
1932197104Sjkim * RETURN:      None
1933197104Sjkim *
1934197104Sjkim * DESCRIPTION: Format the contents of a IVRS
1935197104Sjkim *
1936197104Sjkim ******************************************************************************/
1937197104Sjkim
1938197104Sjkimstatic UINT8 EntrySizes[] = {4,8,16,32};
1939197104Sjkim
1940197104Sjkimvoid
1941197104SjkimAcpiDmDumpIvrs (
1942197104Sjkim    ACPI_TABLE_HEADER       *Table)
1943197104Sjkim{
1944197104Sjkim    ACPI_STATUS             Status;
1945197104Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_IVRS);
1946197104Sjkim    UINT32                  EntryOffset;
1947197104Sjkim    UINT32                  EntryLength;
1948197104Sjkim    UINT32                  EntryType;
1949197104Sjkim    ACPI_IVRS_DE_HEADER     *DeviceEntry;
1950197104Sjkim    ACPI_IVRS_HEADER        *SubTable;
1951197104Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1952197104Sjkim
1953197104Sjkim
1954197104Sjkim    /* Main table */
1955197104Sjkim
1956197104Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
1957197104Sjkim    if (ACPI_FAILURE (Status))
1958197104Sjkim    {
1959197104Sjkim        return;
1960197104Sjkim    }
1961197104Sjkim
1962272444Sjkim    /* Subtables */
1963197104Sjkim
1964197104Sjkim    SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
1965197104Sjkim    while (Offset < Table->Length)
1966197104Sjkim    {
1967272444Sjkim        /* Common subtable header */
1968197104Sjkim
1969197104Sjkim        AcpiOsPrintf ("\n");
1970197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1971298714Sjkim            SubTable->Length, AcpiDmTableInfoIvrsHdr);
1972197104Sjkim        if (ACPI_FAILURE (Status))
1973197104Sjkim        {
1974197104Sjkim            return;
1975197104Sjkim        }
1976197104Sjkim
1977197104Sjkim        switch (SubTable->Type)
1978197104Sjkim        {
1979197104Sjkim        case ACPI_IVRS_TYPE_HARDWARE:
1980250838Sjkim
1981197104Sjkim            InfoTable = AcpiDmTableInfoIvrs0;
1982197104Sjkim            break;
1983250838Sjkim
1984197104Sjkim        case ACPI_IVRS_TYPE_MEMORY1:
1985197104Sjkim        case ACPI_IVRS_TYPE_MEMORY2:
1986197104Sjkim        case ACPI_IVRS_TYPE_MEMORY3:
1987250838Sjkim
1988197104Sjkim            InfoTable = AcpiDmTableInfoIvrs1;
1989197104Sjkim            break;
1990250838Sjkim
1991197104Sjkim        default:
1992250838Sjkim
1993272444Sjkim            AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n",
1994197104Sjkim                SubTable->Type);
1995197104Sjkim
1996197104Sjkim            /* Attempt to continue */
1997197104Sjkim
1998197104Sjkim            if (!SubTable->Length)
1999197104Sjkim            {
2000197104Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
2001197104Sjkim                return;
2002197104Sjkim            }
2003197104Sjkim            goto NextSubTable;
2004197104Sjkim        }
2005197104Sjkim
2006197104Sjkim        /* Dump the subtable */
2007197104Sjkim
2008197104Sjkim        AcpiOsPrintf ("\n");
2009197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2010298714Sjkim            SubTable->Length, InfoTable);
2011197104Sjkim        if (ACPI_FAILURE (Status))
2012197104Sjkim        {
2013197104Sjkim            return;
2014197104Sjkim        }
2015197104Sjkim
2016197104Sjkim        /* The hardware subtable can contain multiple device entries */
2017197104Sjkim
2018197104Sjkim        if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE)
2019197104Sjkim        {
2020197104Sjkim            EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE);
2021197104Sjkim            DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable,
2022298714Sjkim                sizeof (ACPI_IVRS_HARDWARE));
2023197104Sjkim
2024197104Sjkim            while (EntryOffset < (Offset + SubTable->Length))
2025197104Sjkim            {
2026197104Sjkim                AcpiOsPrintf ("\n");
2027197104Sjkim                /*
2028197104Sjkim                 * Upper 2 bits of Type encode the length of the device entry
2029197104Sjkim                 *
2030197104Sjkim                 * 00 = 4 byte
2031197104Sjkim                 * 01 = 8 byte
2032197104Sjkim                 * 10 = 16 byte - currently no entries defined
2033197104Sjkim                 * 11 = 32 byte - currently no entries defined
2034197104Sjkim                 */
2035197104Sjkim                EntryType = DeviceEntry->Type;
2036197104Sjkim                EntryLength = EntrySizes [EntryType >> 6];
2037197104Sjkim
2038197104Sjkim                switch (EntryType)
2039197104Sjkim                {
2040197104Sjkim                /* 4-byte device entries */
2041197104Sjkim
2042197104Sjkim                case ACPI_IVRS_TYPE_PAD4:
2043197104Sjkim                case ACPI_IVRS_TYPE_ALL:
2044197104Sjkim                case ACPI_IVRS_TYPE_SELECT:
2045197104Sjkim                case ACPI_IVRS_TYPE_START:
2046197104Sjkim                case ACPI_IVRS_TYPE_END:
2047197104Sjkim
2048197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs4;
2049197104Sjkim                    break;
2050197104Sjkim
2051197104Sjkim                /* 8-byte entries, type A */
2052197104Sjkim
2053197104Sjkim                case ACPI_IVRS_TYPE_ALIAS_SELECT:
2054197104Sjkim                case ACPI_IVRS_TYPE_ALIAS_START:
2055197104Sjkim
2056197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs8a;
2057197104Sjkim                    break;
2058197104Sjkim
2059197104Sjkim                /* 8-byte entries, type B */
2060197104Sjkim
2061197104Sjkim                case ACPI_IVRS_TYPE_PAD8:
2062197104Sjkim                case ACPI_IVRS_TYPE_EXT_SELECT:
2063197104Sjkim                case ACPI_IVRS_TYPE_EXT_START:
2064197104Sjkim
2065197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs8b;
2066197104Sjkim                    break;
2067197104Sjkim
2068197104Sjkim                /* 8-byte entries, type C */
2069197104Sjkim
2070197104Sjkim                case ACPI_IVRS_TYPE_SPECIAL:
2071197104Sjkim
2072197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs8c;
2073197104Sjkim                    break;
2074197104Sjkim
2075197104Sjkim                default:
2076197104Sjkim                    InfoTable = AcpiDmTableInfoIvrs4;
2077197104Sjkim                    AcpiOsPrintf (
2078197104Sjkim                        "\n**** Unknown IVRS device entry type/length: "
2079204773Sjkim                        "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
2080197104Sjkim                        EntryType, EntryLength, EntryOffset);
2081197104Sjkim                    break;
2082197104Sjkim                }
2083197104Sjkim
2084197104Sjkim                /* Dump the Device Entry */
2085197104Sjkim
2086197104Sjkim                Status = AcpiDmDumpTable (Table->Length, EntryOffset,
2087298714Sjkim                    DeviceEntry, EntryLength, InfoTable);
2088285797Sjkim                if (ACPI_FAILURE (Status))
2089285797Sjkim                {
2090285797Sjkim                    return;
2091285797Sjkim                }
2092197104Sjkim
2093197104Sjkim                EntryOffset += EntryLength;
2094197104Sjkim                DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
2095298714Sjkim                    EntryLength);
2096197104Sjkim            }
2097197104Sjkim        }
2098197104Sjkim
2099197104SjkimNextSubTable:
2100272444Sjkim        /* Point to next subtable */
2101197104Sjkim
2102197104Sjkim        Offset += SubTable->Length;
2103197104Sjkim        SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length);
2104197104Sjkim    }
2105197104Sjkim}
2106197104Sjkim
2107197104Sjkim
2108197104Sjkim/*******************************************************************************
2109197104Sjkim *
2110272444Sjkim * FUNCTION:    AcpiDmDumpLpit
2111272444Sjkim *
2112272444Sjkim * PARAMETERS:  Table               - A LPIT table
2113272444Sjkim *
2114272444Sjkim * RETURN:      None
2115272444Sjkim *
2116272444Sjkim * DESCRIPTION: Format the contents of a LPIT. This table type consists
2117272444Sjkim *              of an open-ended number of subtables. Note: There are no
2118272444Sjkim *              entries in the main table. An LPIT consists of the table
2119272444Sjkim *              header and then subtables only.
2120272444Sjkim *
2121272444Sjkim ******************************************************************************/
2122272444Sjkim
2123272444Sjkimvoid
2124272444SjkimAcpiDmDumpLpit (
2125272444Sjkim    ACPI_TABLE_HEADER       *Table)
2126272444Sjkim{
2127272444Sjkim    ACPI_STATUS             Status;
2128272444Sjkim    ACPI_LPIT_HEADER        *SubTable;
2129272444Sjkim    UINT32                  Length = Table->Length;
2130272444Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_LPIT);
2131272444Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
2132272444Sjkim    UINT32                  SubTableLength;
2133272444Sjkim
2134272444Sjkim
2135272444Sjkim    /* Subtables */
2136272444Sjkim
2137272444Sjkim    SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
2138272444Sjkim    while (Offset < Table->Length)
2139272444Sjkim    {
2140272444Sjkim        /* Common subtable header */
2141272444Sjkim
2142272444Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2143298714Sjkim            sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);
2144272444Sjkim        if (ACPI_FAILURE (Status))
2145272444Sjkim        {
2146272444Sjkim            return;
2147272444Sjkim        }
2148272444Sjkim
2149272444Sjkim        switch (SubTable->Type)
2150272444Sjkim        {
2151272444Sjkim        case ACPI_LPIT_TYPE_NATIVE_CSTATE:
2152272444Sjkim
2153272444Sjkim            InfoTable = AcpiDmTableInfoLpit0;
2154272444Sjkim            SubTableLength = sizeof (ACPI_LPIT_NATIVE);
2155272444Sjkim            break;
2156272444Sjkim
2157272444Sjkim        default:
2158272444Sjkim
2159272444Sjkim            /* Cannot continue on unknown type - no length */
2160272444Sjkim
2161298714Sjkim            AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n",
2162298714Sjkim                SubTable->Type);
2163272444Sjkim            return;
2164272444Sjkim        }
2165272444Sjkim
2166272444Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2167298714Sjkim            SubTableLength, InfoTable);
2168272444Sjkim        if (ACPI_FAILURE (Status))
2169272444Sjkim        {
2170272444Sjkim            return;
2171272444Sjkim        }
2172298714Sjkim
2173272444Sjkim        AcpiOsPrintf ("\n");
2174272444Sjkim
2175272444Sjkim        /* Point to next subtable */
2176272444Sjkim
2177272444Sjkim        Offset += SubTableLength;
2178272444Sjkim        SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, SubTable, SubTableLength);
2179272444Sjkim    }
2180272444Sjkim}
2181272444Sjkim
2182272444Sjkim
2183272444Sjkim/*******************************************************************************
2184272444Sjkim *
2185167802Sjkim * FUNCTION:    AcpiDmDumpMadt
2186167802Sjkim *
2187167802Sjkim * PARAMETERS:  Table               - A MADT table
2188167802Sjkim *
2189167802Sjkim * RETURN:      None
2190167802Sjkim *
2191167802Sjkim * DESCRIPTION: Format the contents of a MADT. This table type consists
2192167802Sjkim *              of an open-ended number of subtables.
2193167802Sjkim *
2194167802Sjkim ******************************************************************************/
2195167802Sjkim
2196167802Sjkimvoid
2197167802SjkimAcpiDmDumpMadt (
2198167802Sjkim    ACPI_TABLE_HEADER       *Table)
2199167802Sjkim{
2200193529Sjkim    ACPI_STATUS             Status;
2201167802Sjkim    ACPI_SUBTABLE_HEADER    *SubTable;
2202167802Sjkim    UINT32                  Length = Table->Length;
2203167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MADT);
2204167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
2205167802Sjkim
2206167802Sjkim
2207167802Sjkim    /* Main table */
2208167802Sjkim
2209193529Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
2210193529Sjkim    if (ACPI_FAILURE (Status))
2211193529Sjkim    {
2212193529Sjkim        return;
2213193529Sjkim    }
2214167802Sjkim
2215272444Sjkim    /* Subtables */
2216167802Sjkim
2217167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
2218167802Sjkim    while (Offset < Table->Length)
2219167802Sjkim    {
2220272444Sjkim        /* Common subtable header */
2221167802Sjkim
2222167802Sjkim        AcpiOsPrintf ("\n");
2223193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2224298714Sjkim            SubTable->Length, AcpiDmTableInfoMadtHdr);
2225193529Sjkim        if (ACPI_FAILURE (Status))
2226193529Sjkim        {
2227193529Sjkim            return;
2228193529Sjkim        }
2229167802Sjkim
2230167802Sjkim        switch (SubTable->Type)
2231167802Sjkim        {
2232167802Sjkim        case ACPI_MADT_TYPE_LOCAL_APIC:
2233250838Sjkim
2234167802Sjkim            InfoTable = AcpiDmTableInfoMadt0;
2235167802Sjkim            break;
2236250838Sjkim
2237167802Sjkim        case ACPI_MADT_TYPE_IO_APIC:
2238250838Sjkim
2239167802Sjkim            InfoTable = AcpiDmTableInfoMadt1;
2240167802Sjkim            break;
2241250838Sjkim
2242167802Sjkim        case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
2243250838Sjkim
2244167802Sjkim            InfoTable = AcpiDmTableInfoMadt2;
2245167802Sjkim            break;
2246250838Sjkim
2247167802Sjkim        case ACPI_MADT_TYPE_NMI_SOURCE:
2248250838Sjkim
2249167802Sjkim            InfoTable = AcpiDmTableInfoMadt3;
2250167802Sjkim            break;
2251250838Sjkim
2252167802Sjkim        case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
2253250838Sjkim
2254167802Sjkim            InfoTable = AcpiDmTableInfoMadt4;
2255167802Sjkim            break;
2256250838Sjkim
2257167802Sjkim        case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
2258250838Sjkim
2259167802Sjkim            InfoTable = AcpiDmTableInfoMadt5;
2260167802Sjkim            break;
2261250838Sjkim
2262167802Sjkim        case ACPI_MADT_TYPE_IO_SAPIC:
2263250838Sjkim
2264167802Sjkim            InfoTable = AcpiDmTableInfoMadt6;
2265167802Sjkim            break;
2266250838Sjkim
2267167802Sjkim        case ACPI_MADT_TYPE_LOCAL_SAPIC:
2268250838Sjkim
2269167802Sjkim            InfoTable = AcpiDmTableInfoMadt7;
2270167802Sjkim            break;
2271250838Sjkim
2272167802Sjkim        case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
2273250838Sjkim
2274167802Sjkim            InfoTable = AcpiDmTableInfoMadt8;
2275167802Sjkim            break;
2276250838Sjkim
2277193529Sjkim        case ACPI_MADT_TYPE_LOCAL_X2APIC:
2278250838Sjkim
2279193529Sjkim            InfoTable = AcpiDmTableInfoMadt9;
2280193529Sjkim            break;
2281250838Sjkim
2282193529Sjkim        case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
2283250838Sjkim
2284193529Sjkim            InfoTable = AcpiDmTableInfoMadt10;
2285193529Sjkim            break;
2286250838Sjkim
2287228110Sjkim        case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
2288250838Sjkim
2289228110Sjkim            InfoTable = AcpiDmTableInfoMadt11;
2290228110Sjkim            break;
2291250838Sjkim
2292228110Sjkim        case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
2293250838Sjkim
2294228110Sjkim            InfoTable = AcpiDmTableInfoMadt12;
2295228110Sjkim            break;
2296250838Sjkim
2297272444Sjkim        case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
2298272444Sjkim
2299272444Sjkim            InfoTable = AcpiDmTableInfoMadt13;
2300272444Sjkim            break;
2301272444Sjkim
2302272444Sjkim        case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
2303272444Sjkim
2304272444Sjkim            InfoTable = AcpiDmTableInfoMadt14;
2305272444Sjkim            break;
2306272444Sjkim
2307283092Sjkim        case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
2308283092Sjkim
2309283092Sjkim            InfoTable = AcpiDmTableInfoMadt15;
2310283092Sjkim            break;
2311283092Sjkim
2312167802Sjkim        default:
2313250838Sjkim
2314298714Sjkim            AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",
2315298714Sjkim                SubTable->Type);
2316193529Sjkim
2317193529Sjkim            /* Attempt to continue */
2318193529Sjkim
2319193529Sjkim            if (!SubTable->Length)
2320193529Sjkim            {
2321193529Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
2322193529Sjkim                return;
2323193529Sjkim            }
2324298714Sjkim
2325193529Sjkim            goto NextSubTable;
2326193529Sjkim        }
2327193529Sjkim
2328193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2329298714Sjkim            SubTable->Length, InfoTable);
2330193529Sjkim        if (ACPI_FAILURE (Status))
2331193529Sjkim        {
2332167802Sjkim            return;
2333167802Sjkim        }
2334167802Sjkim
2335193529SjkimNextSubTable:
2336272444Sjkim        /* Point to next subtable */
2337167802Sjkim
2338167802Sjkim        Offset += SubTable->Length;
2339298714Sjkim        SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable,
2340298714Sjkim            SubTable->Length);
2341167802Sjkim    }
2342167802Sjkim}
2343167802Sjkim
2344167802Sjkim
2345167802Sjkim/*******************************************************************************
2346167802Sjkim *
2347167802Sjkim * FUNCTION:    AcpiDmDumpMcfg
2348167802Sjkim *
2349167802Sjkim * PARAMETERS:  Table               - A MCFG Table
2350167802Sjkim *
2351167802Sjkim * RETURN:      None
2352167802Sjkim *
2353167802Sjkim * DESCRIPTION: Format the contents of a MCFG table
2354167802Sjkim *
2355167802Sjkim ******************************************************************************/
2356167802Sjkim
2357167802Sjkimvoid
2358167802SjkimAcpiDmDumpMcfg (
2359167802Sjkim    ACPI_TABLE_HEADER       *Table)
2360167802Sjkim{
2361193529Sjkim    ACPI_STATUS             Status;
2362167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MCFG);
2363167802Sjkim    ACPI_MCFG_ALLOCATION    *SubTable;
2364167802Sjkim
2365167802Sjkim
2366167802Sjkim    /* Main table */
2367167802Sjkim
2368193529Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
2369193529Sjkim    if (ACPI_FAILURE (Status))
2370193529Sjkim    {
2371193529Sjkim        return;
2372193529Sjkim    }
2373167802Sjkim
2374272444Sjkim    /* Subtables */
2375167802Sjkim
2376167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
2377167802Sjkim    while (Offset < Table->Length)
2378167802Sjkim    {
2379167802Sjkim        if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
2380167802Sjkim        {
2381209746Sjkim            AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
2382167802Sjkim                sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
2383167802Sjkim            return;
2384167802Sjkim        }
2385167802Sjkim
2386167802Sjkim        AcpiOsPrintf ("\n");
2387193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2388298714Sjkim            sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
2389193529Sjkim        if (ACPI_FAILURE (Status))
2390193529Sjkim        {
2391193529Sjkim            return;
2392193529Sjkim        }
2393167802Sjkim
2394272444Sjkim        /* Point to next subtable (each subtable is of fixed length) */
2395167802Sjkim
2396167802Sjkim        Offset += sizeof (ACPI_MCFG_ALLOCATION);
2397167802Sjkim        SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable,
2398298714Sjkim            sizeof (ACPI_MCFG_ALLOCATION));
2399167802Sjkim    }
2400167802Sjkim}
2401167802Sjkim
2402167802Sjkim
2403167802Sjkim/*******************************************************************************
2404167802Sjkim *
2405228110Sjkim * FUNCTION:    AcpiDmDumpMpst
2406228110Sjkim *
2407228110Sjkim * PARAMETERS:  Table               - A MPST Table
2408228110Sjkim *
2409228110Sjkim * RETURN:      None
2410228110Sjkim *
2411228110Sjkim * DESCRIPTION: Format the contents of a MPST table
2412228110Sjkim *
2413228110Sjkim ******************************************************************************/
2414228110Sjkim
2415228110Sjkimvoid
2416228110SjkimAcpiDmDumpMpst (
2417228110Sjkim    ACPI_TABLE_HEADER       *Table)
2418228110Sjkim{
2419228110Sjkim    ACPI_STATUS             Status;
2420228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MPST);
2421228110Sjkim    ACPI_MPST_POWER_NODE    *SubTable0;
2422228110Sjkim    ACPI_MPST_POWER_STATE   *SubTable0A;
2423228110Sjkim    ACPI_MPST_COMPONENT     *SubTable0B;
2424228110Sjkim    ACPI_MPST_DATA_HDR      *SubTable1;
2425228110Sjkim    ACPI_MPST_POWER_DATA    *SubTable2;
2426228110Sjkim    UINT16                  SubtableCount;
2427241973Sjkim    UINT32                  PowerStateCount;
2428241973Sjkim    UINT32                  ComponentCount;
2429228110Sjkim
2430228110Sjkim
2431228110Sjkim    /* Main table */
2432228110Sjkim
2433228110Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
2434228110Sjkim    if (ACPI_FAILURE (Status))
2435228110Sjkim    {
2436228110Sjkim        return;
2437228110Sjkim    }
2438228110Sjkim
2439228110Sjkim    /* Subtable: Memory Power Node(s) */
2440228110Sjkim
2441228110Sjkim    SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
2442228110Sjkim    SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
2443228110Sjkim
2444228110Sjkim    while ((Offset < Table->Length) && SubtableCount)
2445228110Sjkim    {
2446228110Sjkim        AcpiOsPrintf ("\n");
2447228110Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0,
2448298714Sjkim            sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
2449228110Sjkim        if (ACPI_FAILURE (Status))
2450228110Sjkim        {
2451228110Sjkim            return;
2452228110Sjkim        }
2453228110Sjkim
2454228110Sjkim        /* Extract the sub-subtable counts */
2455228110Sjkim
2456228110Sjkim        PowerStateCount = SubTable0->NumPowerStates;
2457228110Sjkim        ComponentCount = SubTable0->NumPhysicalComponents;
2458228110Sjkim        Offset += sizeof (ACPI_MPST_POWER_NODE);
2459228110Sjkim
2460228110Sjkim        /* Sub-subtables - Memory Power State Structure(s) */
2461228110Sjkim
2462228110Sjkim        SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0,
2463228110Sjkim            sizeof (ACPI_MPST_POWER_NODE));
2464228110Sjkim
2465228110Sjkim        while (PowerStateCount)
2466228110Sjkim        {
2467228110Sjkim            AcpiOsPrintf ("\n");
2468228110Sjkim            Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A,
2469298714Sjkim                sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
2470228110Sjkim            if (ACPI_FAILURE (Status))
2471228110Sjkim            {
2472228110Sjkim                return;
2473228110Sjkim            }
2474228110Sjkim
2475228110Sjkim            SubTable0A++;
2476228110Sjkim            PowerStateCount--;
2477228110Sjkim            Offset += sizeof (ACPI_MPST_POWER_STATE);
2478228110Sjkim       }
2479228110Sjkim
2480228110Sjkim        /* Sub-subtables - Physical Component ID Structure(s) */
2481228110Sjkim
2482228110Sjkim        SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A);
2483228110Sjkim
2484228110Sjkim        if (ComponentCount)
2485228110Sjkim        {
2486228110Sjkim            AcpiOsPrintf ("\n");
2487228110Sjkim        }
2488228110Sjkim
2489228110Sjkim        while (ComponentCount)
2490228110Sjkim        {
2491228110Sjkim            Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B,
2492298714Sjkim                sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
2493228110Sjkim            if (ACPI_FAILURE (Status))
2494228110Sjkim            {
2495228110Sjkim                return;
2496228110Sjkim            }
2497228110Sjkim
2498228110Sjkim            SubTable0B++;
2499228110Sjkim            ComponentCount--;
2500228110Sjkim            Offset += sizeof (ACPI_MPST_COMPONENT);
2501228110Sjkim        }
2502228110Sjkim
2503228110Sjkim        /* Point to next Memory Power Node subtable */
2504228110Sjkim
2505228110Sjkim        SubtableCount--;
2506228110Sjkim        SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0,
2507228110Sjkim            sizeof (ACPI_MPST_POWER_NODE) +
2508228110Sjkim            (sizeof (ACPI_MPST_POWER_STATE) * SubTable0->NumPowerStates) +
2509228110Sjkim            (sizeof (ACPI_MPST_COMPONENT) * SubTable0->NumPhysicalComponents));
2510228110Sjkim    }
2511228110Sjkim
2512228110Sjkim    /* Subtable: Count of Memory Power State Characteristic structures */
2513228110Sjkim
2514228110Sjkim    AcpiOsPrintf ("\n");
2515228110Sjkim    SubTable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, SubTable0);
2516228110Sjkim    Status = AcpiDmDumpTable (Table->Length, Offset, SubTable1,
2517298714Sjkim        sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
2518228110Sjkim    if (ACPI_FAILURE (Status))
2519228110Sjkim    {
2520228110Sjkim        return;
2521228110Sjkim    }
2522228110Sjkim
2523228110Sjkim    SubtableCount = SubTable1->CharacteristicsCount;
2524228110Sjkim    Offset += sizeof (ACPI_MPST_DATA_HDR);
2525228110Sjkim
2526228110Sjkim    /* Subtable: Memory Power State Characteristics structure(s) */
2527228110Sjkim
2528298714Sjkim    SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1,
2529298714Sjkim        sizeof (ACPI_MPST_DATA_HDR));
2530228110Sjkim
2531228110Sjkim    while ((Offset < Table->Length) && SubtableCount)
2532228110Sjkim    {
2533228110Sjkim        AcpiOsPrintf ("\n");
2534228110Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2,
2535298714Sjkim            sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
2536228110Sjkim        if (ACPI_FAILURE (Status))
2537228110Sjkim        {
2538228110Sjkim            return;
2539228110Sjkim        }
2540228110Sjkim
2541228110Sjkim        SubTable2++;
2542228110Sjkim        SubtableCount--;
2543228110Sjkim        Offset += sizeof (ACPI_MPST_POWER_DATA);
2544228110Sjkim    }
2545228110Sjkim}
2546228110Sjkim
2547228110Sjkim
2548228110Sjkim/*******************************************************************************
2549228110Sjkim *
2550197104Sjkim * FUNCTION:    AcpiDmDumpMsct
2551197104Sjkim *
2552197104Sjkim * PARAMETERS:  Table               - A MSCT table
2553197104Sjkim *
2554197104Sjkim * RETURN:      None
2555197104Sjkim *
2556197104Sjkim * DESCRIPTION: Format the contents of a MSCT
2557197104Sjkim *
2558197104Sjkim ******************************************************************************/
2559197104Sjkim
2560197104Sjkimvoid
2561197104SjkimAcpiDmDumpMsct (
2562197104Sjkim    ACPI_TABLE_HEADER       *Table)
2563197104Sjkim{
2564197104Sjkim    ACPI_STATUS             Status;
2565197104Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MSCT);
2566197104Sjkim    ACPI_MSCT_PROXIMITY     *SubTable;
2567197104Sjkim
2568197104Sjkim
2569197104Sjkim    /* Main table */
2570197104Sjkim
2571197104Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
2572197104Sjkim    if (ACPI_FAILURE (Status))
2573197104Sjkim    {
2574197104Sjkim        return;
2575197104Sjkim    }
2576197104Sjkim
2577272444Sjkim    /* Subtables */
2578197104Sjkim
2579197104Sjkim    SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
2580197104Sjkim    while (Offset < Table->Length)
2581197104Sjkim    {
2582272444Sjkim        /* Common subtable header */
2583197104Sjkim
2584197104Sjkim        AcpiOsPrintf ("\n");
2585197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2586298714Sjkim            sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
2587197104Sjkim        if (ACPI_FAILURE (Status))
2588197104Sjkim        {
2589197104Sjkim            return;
2590197104Sjkim        }
2591197104Sjkim
2592272444Sjkim        /* Point to next subtable */
2593197104Sjkim
2594197104Sjkim        Offset += sizeof (ACPI_MSCT_PROXIMITY);
2595298714Sjkim        SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable,
2596298714Sjkim            sizeof (ACPI_MSCT_PROXIMITY));
2597197104Sjkim    }
2598197104Sjkim}
2599197104Sjkim
2600197104Sjkim
2601197104Sjkim/*******************************************************************************
2602197104Sjkim *
2603246849Sjkim * FUNCTION:    AcpiDmDumpMtmr
2604246849Sjkim *
2605246849Sjkim * PARAMETERS:  Table               - A MTMR table
2606246849Sjkim *
2607246849Sjkim * RETURN:      None
2608246849Sjkim *
2609246849Sjkim * DESCRIPTION: Format the contents of a MTMR
2610246849Sjkim *
2611246849Sjkim ******************************************************************************/
2612246849Sjkim
2613246849Sjkimvoid
2614246849SjkimAcpiDmDumpMtmr (
2615246849Sjkim    ACPI_TABLE_HEADER       *Table)
2616246849Sjkim{
2617246849Sjkim    ACPI_STATUS             Status;
2618246849Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_MTMR);
2619246849Sjkim    ACPI_MTMR_ENTRY         *SubTable;
2620246849Sjkim
2621246849Sjkim
2622246849Sjkim    /* Main table */
2623246849Sjkim
2624246849Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMtmr);
2625246849Sjkim    if (ACPI_FAILURE (Status))
2626246849Sjkim    {
2627246849Sjkim        return;
2628246849Sjkim    }
2629246849Sjkim
2630272444Sjkim    /* Subtables */
2631246849Sjkim
2632246849Sjkim    SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset);
2633246849Sjkim    while (Offset < Table->Length)
2634246849Sjkim    {
2635272444Sjkim        /* Common subtable header */
2636246849Sjkim
2637246849Sjkim        AcpiOsPrintf ("\n");
2638246849Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2639298714Sjkim            sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0);
2640246849Sjkim        if (ACPI_FAILURE (Status))
2641246849Sjkim        {
2642246849Sjkim            return;
2643246849Sjkim        }
2644246849Sjkim
2645272444Sjkim        /* Point to next subtable */
2646246849Sjkim
2647246849Sjkim        Offset += sizeof (ACPI_MTMR_ENTRY);
2648298714Sjkim        SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, SubTable,
2649298714Sjkim            sizeof (ACPI_MTMR_ENTRY));
2650246849Sjkim    }
2651246849Sjkim}
2652246849Sjkim
2653246849Sjkim
2654246849Sjkim/*******************************************************************************
2655246849Sjkim *
2656283092Sjkim * FUNCTION:    AcpiDmDumpNfit
2657283092Sjkim *
2658283092Sjkim * PARAMETERS:  Table               - A NFIT table
2659283092Sjkim *
2660283092Sjkim * RETURN:      None
2661283092Sjkim *
2662283092Sjkim * DESCRIPTION: Format the contents of an NFIT.
2663283092Sjkim *
2664283092Sjkim ******************************************************************************/
2665283092Sjkim
2666283092Sjkimvoid
2667283092SjkimAcpiDmDumpNfit (
2668283092Sjkim    ACPI_TABLE_HEADER       *Table)
2669283092Sjkim{
2670283092Sjkim    ACPI_STATUS             Status;
2671283092Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_NFIT);
2672283092Sjkim    UINT32                  FieldOffset = 0;
2673283092Sjkim    UINT32                  Length;
2674283092Sjkim    ACPI_NFIT_HEADER        *SubTable;
2675283092Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
2676283092Sjkim    ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
2677283092Sjkim    ACPI_NFIT_SMBIOS        *SmbiosInfo = NULL;
2678283092Sjkim    ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
2679283092Sjkim    UINT32                  i;
2680283092Sjkim
2681283092Sjkim
2682283092Sjkim    /* Main table */
2683283092Sjkim
2684283092Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
2685283092Sjkim    if (ACPI_FAILURE (Status))
2686283092Sjkim    {
2687283092Sjkim        return;
2688283092Sjkim    }
2689283092Sjkim
2690283092Sjkim    /* Subtables */
2691283092Sjkim
2692283092Sjkim    SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
2693283092Sjkim    while (Offset < Table->Length)
2694283092Sjkim    {
2695283092Sjkim        /* NFIT subtable header */
2696283092Sjkim
2697283092Sjkim        AcpiOsPrintf ("\n");
2698283092Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2699298714Sjkim            SubTable->Length, AcpiDmTableInfoNfitHdr);
2700283092Sjkim        if (ACPI_FAILURE (Status))
2701283092Sjkim        {
2702283092Sjkim            return;
2703283092Sjkim        }
2704283092Sjkim
2705283092Sjkim        switch (SubTable->Type)
2706283092Sjkim        {
2707283092Sjkim        case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
2708283092Sjkim
2709283092Sjkim            InfoTable = AcpiDmTableInfoNfit0;
2710283092Sjkim            break;
2711283092Sjkim
2712283092Sjkim        case ACPI_NFIT_TYPE_MEMORY_MAP:
2713283092Sjkim
2714283092Sjkim            InfoTable = AcpiDmTableInfoNfit1;
2715283092Sjkim            break;
2716283092Sjkim
2717283092Sjkim        case ACPI_NFIT_TYPE_INTERLEAVE:
2718283092Sjkim
2719283092Sjkim            /* Has a variable number of 32-bit values at the end */
2720283092Sjkim
2721283092Sjkim            InfoTable = AcpiDmTableInfoNfit2;
2722283092Sjkim            Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, SubTable);
2723283092Sjkim            FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);
2724283092Sjkim            break;
2725283092Sjkim
2726283092Sjkim        case ACPI_NFIT_TYPE_SMBIOS:
2727283092Sjkim
2728283092Sjkim            SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, SubTable);
2729283092Sjkim            InfoTable = AcpiDmTableInfoNfit3;
2730283092Sjkim            break;
2731283092Sjkim
2732283092Sjkim        case ACPI_NFIT_TYPE_CONTROL_REGION:
2733283092Sjkim
2734283092Sjkim            InfoTable = AcpiDmTableInfoNfit4;
2735283092Sjkim            break;
2736283092Sjkim
2737283092Sjkim        case ACPI_NFIT_TYPE_DATA_REGION:
2738283092Sjkim
2739283092Sjkim            InfoTable = AcpiDmTableInfoNfit5;
2740283092Sjkim            break;
2741283092Sjkim
2742283092Sjkim        case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
2743283092Sjkim
2744283092Sjkim            /* Has a variable number of 64-bit addresses at the end */
2745283092Sjkim
2746283092Sjkim            InfoTable = AcpiDmTableInfoNfit6;
2747283092Sjkim            Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, SubTable);
2748283092Sjkim            FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64);
2749283092Sjkim            break;
2750283092Sjkim
2751283092Sjkim        default:
2752298714Sjkim            AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
2753298714Sjkim                SubTable->Type);
2754283092Sjkim
2755283092Sjkim            /* Attempt to continue */
2756283092Sjkim
2757283092Sjkim            if (!SubTable->Length)
2758283092Sjkim            {
2759283092Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
2760283092Sjkim                return;
2761283092Sjkim            }
2762283092Sjkim            goto NextSubTable;
2763283092Sjkim        }
2764283092Sjkim
2765283092Sjkim        AcpiOsPrintf ("\n");
2766283092Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2767298714Sjkim            SubTable->Length, InfoTable);
2768283092Sjkim        if (ACPI_FAILURE (Status))
2769283092Sjkim        {
2770283092Sjkim            return;
2771283092Sjkim        }
2772283092Sjkim
2773283092Sjkim        /* Per-subtable variable-length fields */
2774283092Sjkim
2775283092Sjkim        switch (SubTable->Type)
2776283092Sjkim        {
2777283092Sjkim        case ACPI_NFIT_TYPE_INTERLEAVE:
2778283092Sjkim
2779283092Sjkim            for (i = 0; i < Interleave->LineCount; i++)
2780283092Sjkim            {
2781283092Sjkim                Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
2782298714Sjkim                    &Interleave->LineOffset[i],
2783298714Sjkim                    sizeof (UINT32), AcpiDmTableInfoNfit2a);
2784285797Sjkim                if (ACPI_FAILURE (Status))
2785285797Sjkim                {
2786285797Sjkim                    return;
2787285797Sjkim                }
2788285797Sjkim
2789283092Sjkim                FieldOffset += sizeof (UINT32);
2790283092Sjkim            }
2791283092Sjkim            break;
2792283092Sjkim
2793283092Sjkim        case ACPI_NFIT_TYPE_SMBIOS:
2794283092Sjkim
2795298714Sjkim            Length = SubTable->Length -
2796298714Sjkim                sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
2797298714Sjkim
2798283092Sjkim            if (Length)
2799283092Sjkim            {
2800283092Sjkim                Status = AcpiDmDumpTable (Table->Length,
2801298714Sjkim                    sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
2802298714Sjkim                    SmbiosInfo,
2803298714Sjkim                    Length, AcpiDmTableInfoNfit3a);
2804283092Sjkim                if (ACPI_FAILURE (Status))
2805283092Sjkim                {
2806283092Sjkim                    return;
2807283092Sjkim                }
2808283092Sjkim            }
2809283092Sjkim
2810283092Sjkim            break;
2811283092Sjkim
2812283092Sjkim        case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
2813283092Sjkim
2814283092Sjkim            for (i = 0; i < Hint->HintCount; i++)
2815283092Sjkim            {
2816283092Sjkim                Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
2817298714Sjkim                    &Hint->HintAddress[i],
2818298714Sjkim                    sizeof (UINT64), AcpiDmTableInfoNfit6a);
2819285797Sjkim                if (ACPI_FAILURE (Status))
2820285797Sjkim                {
2821285797Sjkim                    return;
2822285797Sjkim                }
2823285797Sjkim
2824283092Sjkim                FieldOffset += sizeof (UINT64);
2825283092Sjkim            }
2826283092Sjkim            break;
2827283092Sjkim
2828283092Sjkim        default:
2829283092Sjkim            break;
2830283092Sjkim        }
2831283092Sjkim
2832283092SjkimNextSubTable:
2833283092Sjkim        /* Point to next subtable */
2834283092Sjkim
2835283092Sjkim        Offset += SubTable->Length;
2836283092Sjkim        SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, SubTable, SubTable->Length);
2837283092Sjkim    }
2838283092Sjkim}
2839283092Sjkim
2840283092Sjkim
2841283092Sjkim/*******************************************************************************
2842283092Sjkim *
2843228110Sjkim * FUNCTION:    AcpiDmDumpPcct
2844228110Sjkim *
2845228110Sjkim * PARAMETERS:  Table               - A PCCT table
2846228110Sjkim *
2847228110Sjkim * RETURN:      None
2848228110Sjkim *
2849228110Sjkim * DESCRIPTION: Format the contents of a PCCT. This table type consists
2850228110Sjkim *              of an open-ended number of subtables.
2851228110Sjkim *
2852228110Sjkim ******************************************************************************/
2853228110Sjkim
2854228110Sjkimvoid
2855228110SjkimAcpiDmDumpPcct (
2856228110Sjkim    ACPI_TABLE_HEADER       *Table)
2857228110Sjkim{
2858228110Sjkim    ACPI_STATUS             Status;
2859228110Sjkim    ACPI_PCCT_SUBSPACE      *SubTable;
2860272444Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
2861228110Sjkim    UINT32                  Length = Table->Length;
2862228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_PCCT);
2863228110Sjkim
2864228110Sjkim
2865228110Sjkim    /* Main table */
2866228110Sjkim
2867228110Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
2868228110Sjkim    if (ACPI_FAILURE (Status))
2869228110Sjkim    {
2870228110Sjkim        return;
2871228110Sjkim    }
2872228110Sjkim
2873272444Sjkim    /* Subtables */
2874228110Sjkim
2875228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
2876228110Sjkim    while (Offset < Table->Length)
2877228110Sjkim    {
2878272444Sjkim        /* Common subtable header */
2879272444Sjkim
2880228110Sjkim        AcpiOsPrintf ("\n");
2881228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2882298714Sjkim            SubTable->Header.Length, AcpiDmTableInfoPcctHdr);
2883228110Sjkim        if (ACPI_FAILURE (Status))
2884228110Sjkim        {
2885228110Sjkim            return;
2886228110Sjkim        }
2887228110Sjkim
2888272444Sjkim        switch (SubTable->Header.Type)
2889272444Sjkim        {
2890272444Sjkim        case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
2891228110Sjkim
2892272444Sjkim            InfoTable = AcpiDmTableInfoPcct0;
2893272444Sjkim            break;
2894272444Sjkim
2895272444Sjkim        case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
2896272444Sjkim
2897272444Sjkim            InfoTable = AcpiDmTableInfoPcct1;
2898272444Sjkim            break;
2899272444Sjkim
2900298714Sjkim        case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
2901298714Sjkim
2902298714Sjkim            InfoTable = AcpiDmTableInfoPcct2;
2903298714Sjkim            break;
2904298714Sjkim
2905272444Sjkim        default:
2906272444Sjkim
2907272444Sjkim            AcpiOsPrintf (
2908272444Sjkim                "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
2909272444Sjkim                SubTable->Header.Type);
2910272444Sjkim            return;
2911272444Sjkim        }
2912272444Sjkim
2913272444Sjkim        AcpiOsPrintf ("\n");
2914272444Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2915298714Sjkim            SubTable->Header.Length, InfoTable);
2916272444Sjkim        if (ACPI_FAILURE (Status))
2917272444Sjkim        {
2918272444Sjkim            return;
2919272444Sjkim        }
2920272444Sjkim
2921272444Sjkim        /* Point to next subtable */
2922272444Sjkim
2923228110Sjkim        Offset += SubTable->Header.Length;
2924228110Sjkim        SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable,
2925298714Sjkim            SubTable->Header.Length);
2926228110Sjkim    }
2927228110Sjkim}
2928228110Sjkim
2929228110Sjkim
2930228110Sjkim/*******************************************************************************
2931228110Sjkim *
2932228110Sjkim * FUNCTION:    AcpiDmDumpPmtt
2933228110Sjkim *
2934228110Sjkim * PARAMETERS:  Table               - A PMTT table
2935228110Sjkim *
2936228110Sjkim * RETURN:      None
2937228110Sjkim *
2938228110Sjkim * DESCRIPTION: Format the contents of a PMTT. This table type consists
2939228110Sjkim *              of an open-ended number of subtables.
2940228110Sjkim *
2941228110Sjkim ******************************************************************************/
2942228110Sjkim
2943228110Sjkimvoid
2944228110SjkimAcpiDmDumpPmtt (
2945228110Sjkim    ACPI_TABLE_HEADER       *Table)
2946228110Sjkim{
2947228110Sjkim    ACPI_STATUS             Status;
2948228110Sjkim    ACPI_PMTT_HEADER        *SubTable;
2949228110Sjkim    ACPI_PMTT_HEADER        *MemSubTable;
2950228110Sjkim    ACPI_PMTT_HEADER        *DimmSubTable;
2951228110Sjkim    ACPI_PMTT_DOMAIN        *DomainArray;
2952228110Sjkim    UINT32                  Length = Table->Length;
2953228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
2954228110Sjkim    UINT32                  MemOffset;
2955228110Sjkim    UINT32                  DimmOffset;
2956228110Sjkim    UINT32                  DomainOffset;
2957228110Sjkim    UINT32                  DomainCount;
2958228110Sjkim
2959228110Sjkim
2960228110Sjkim    /* Main table */
2961228110Sjkim
2962228110Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
2963228110Sjkim    if (ACPI_FAILURE (Status))
2964228110Sjkim    {
2965228110Sjkim        return;
2966228110Sjkim    }
2967228110Sjkim
2968228110Sjkim    /* Subtables */
2969228110Sjkim
2970228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
2971228110Sjkim    while (Offset < Table->Length)
2972228110Sjkim    {
2973228110Sjkim        /* Common subtable header */
2974228110Sjkim
2975228110Sjkim        AcpiOsPrintf ("\n");
2976228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2977298714Sjkim            SubTable->Length, AcpiDmTableInfoPmttHdr);
2978228110Sjkim        if (ACPI_FAILURE (Status))
2979228110Sjkim        {
2980228110Sjkim            return;
2981228110Sjkim        }
2982228110Sjkim
2983228110Sjkim        /* Only Socket subtables are expected at this level */
2984228110Sjkim
2985228110Sjkim        if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET)
2986228110Sjkim        {
2987228110Sjkim            AcpiOsPrintf (
2988228110Sjkim                "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2989228110Sjkim                SubTable->Type);
2990228110Sjkim            return;
2991228110Sjkim        }
2992228110Sjkim
2993228110Sjkim        /* Dump the fixed-length portion of the subtable */
2994228110Sjkim
2995228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2996298714Sjkim            SubTable->Length, AcpiDmTableInfoPmtt0);
2997228110Sjkim        if (ACPI_FAILURE (Status))
2998228110Sjkim        {
2999228110Sjkim            return;
3000228110Sjkim        }
3001228110Sjkim
3002228110Sjkim        /* Walk the memory controller subtables */
3003228110Sjkim
3004228110Sjkim        MemOffset = sizeof (ACPI_PMTT_SOCKET);
3005228110Sjkim        MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable,
3006228110Sjkim            sizeof (ACPI_PMTT_SOCKET));
3007228110Sjkim
3008228110Sjkim        while (((Offset + MemOffset) < Table->Length) &&
3009228110Sjkim            (MemOffset < SubTable->Length))
3010228110Sjkim        {
3011228110Sjkim            /* Common subtable header */
3012228110Sjkim
3013228110Sjkim            AcpiOsPrintf ("\n");
3014228110Sjkim            Status = AcpiDmDumpTable (Length,
3015298714Sjkim                Offset + MemOffset, MemSubTable,
3016298714Sjkim                MemSubTable->Length, AcpiDmTableInfoPmttHdr);
3017228110Sjkim            if (ACPI_FAILURE (Status))
3018228110Sjkim            {
3019228110Sjkim                return;
3020228110Sjkim            }
3021228110Sjkim
3022228110Sjkim            /* Only memory controller subtables are expected at this level */
3023228110Sjkim
3024228110Sjkim            if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER)
3025228110Sjkim            {
3026228110Sjkim                AcpiOsPrintf (
3027228110Sjkim                    "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
3028228110Sjkim                    MemSubTable->Type);
3029228110Sjkim                return;
3030228110Sjkim            }
3031228110Sjkim
3032228110Sjkim            /* Dump the fixed-length portion of the controller subtable */
3033228110Sjkim
3034228110Sjkim            Status = AcpiDmDumpTable (Length,
3035298714Sjkim                Offset + MemOffset, MemSubTable,
3036298714Sjkim                MemSubTable->Length, AcpiDmTableInfoPmtt1);
3037228110Sjkim            if (ACPI_FAILURE (Status))
3038228110Sjkim            {
3039228110Sjkim                return;
3040228110Sjkim            }
3041228110Sjkim
3042228110Sjkim            /* Walk the variable count of proximity domains */
3043228110Sjkim
3044228110Sjkim            DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount;
3045228110Sjkim            DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
3046228110Sjkim            DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable,
3047228110Sjkim                sizeof (ACPI_PMTT_CONTROLLER));
3048228110Sjkim
3049228110Sjkim            while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
3050228110Sjkim                ((MemOffset + DomainOffset) < SubTable->Length) &&
3051228110Sjkim                DomainCount)
3052228110Sjkim            {
3053228110Sjkim                Status = AcpiDmDumpTable (Length,
3054298714Sjkim                    Offset + MemOffset + DomainOffset, DomainArray,
3055298714Sjkim                    sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
3056228110Sjkim                if (ACPI_FAILURE (Status))
3057228110Sjkim                {
3058228110Sjkim                    return;
3059228110Sjkim                }
3060228110Sjkim
3061228110Sjkim                DomainOffset += sizeof (ACPI_PMTT_DOMAIN);
3062228110Sjkim                DomainArray++;
3063228110Sjkim                DomainCount--;
3064228110Sjkim            }
3065228110Sjkim
3066228110Sjkim            if (DomainCount)
3067228110Sjkim            {
3068228110Sjkim                AcpiOsPrintf (
3069272444Sjkim                    "\n**** DomainCount exceeds subtable length\n\n");
3070228110Sjkim            }
3071228110Sjkim
3072228110Sjkim            /* Walk the physical component (DIMM) subtables */
3073228110Sjkim
3074228110Sjkim            DimmOffset = DomainOffset;
3075228110Sjkim            DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable,
3076228110Sjkim                DomainOffset);
3077228110Sjkim
3078228110Sjkim            while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
3079228110Sjkim                (DimmOffset < MemSubTable->Length))
3080228110Sjkim            {
3081228110Sjkim                /* Common subtable header */
3082228110Sjkim
3083228110Sjkim                AcpiOsPrintf ("\n");
3084228110Sjkim                Status = AcpiDmDumpTable (Length,
3085298714Sjkim                    Offset + MemOffset + DimmOffset, DimmSubTable,
3086298714Sjkim                    DimmSubTable->Length, AcpiDmTableInfoPmttHdr);
3087228110Sjkim                if (ACPI_FAILURE (Status))
3088228110Sjkim                {
3089228110Sjkim                    return;
3090228110Sjkim                }
3091228110Sjkim
3092228110Sjkim                /* Only DIMM subtables are expected at this level */
3093228110Sjkim
3094228110Sjkim                if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM)
3095228110Sjkim                {
3096228110Sjkim                    AcpiOsPrintf (
3097228110Sjkim                        "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
3098228110Sjkim                        DimmSubTable->Type);
3099228110Sjkim                    return;
3100228110Sjkim                }
3101228110Sjkim
3102228110Sjkim                /* Dump the fixed-length DIMM subtable */
3103228110Sjkim
3104228110Sjkim                Status = AcpiDmDumpTable (Length,
3105298714Sjkim                    Offset + MemOffset + DimmOffset, DimmSubTable,
3106298714Sjkim                    DimmSubTable->Length, AcpiDmTableInfoPmtt2);
3107228110Sjkim                if (ACPI_FAILURE (Status))
3108228110Sjkim                {
3109228110Sjkim                    return;
3110228110Sjkim                }
3111228110Sjkim
3112228110Sjkim                /* Point to next DIMM subtable */
3113228110Sjkim
3114228110Sjkim                DimmOffset += DimmSubTable->Length;
3115228110Sjkim                DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
3116228110Sjkim                    DimmSubTable, DimmSubTable->Length);
3117228110Sjkim            }
3118228110Sjkim
3119228110Sjkim            /* Point to next Controller subtable */
3120228110Sjkim
3121228110Sjkim            MemOffset += MemSubTable->Length;
3122228110Sjkim            MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
3123228110Sjkim                MemSubTable, MemSubTable->Length);
3124228110Sjkim        }
3125228110Sjkim
3126228110Sjkim        /* Point to next Socket subtable */
3127228110Sjkim
3128228110Sjkim        Offset += SubTable->Length;
3129228110Sjkim        SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
3130228110Sjkim            SubTable, SubTable->Length);
3131228110Sjkim    }
3132228110Sjkim}
3133228110Sjkim
3134228110Sjkim
3135228110Sjkim/*******************************************************************************
3136228110Sjkim *
3137228110Sjkim * FUNCTION:    AcpiDmDumpS3pt
3138228110Sjkim *
3139228110Sjkim * PARAMETERS:  Table               - A S3PT table
3140228110Sjkim *
3141228110Sjkim * RETURN:      Length of the table
3142228110Sjkim *
3143228110Sjkim * DESCRIPTION: Format the contents of a S3PT
3144228110Sjkim *
3145228110Sjkim ******************************************************************************/
3146228110Sjkim
3147228110SjkimUINT32
3148228110SjkimAcpiDmDumpS3pt (
3149228110Sjkim    ACPI_TABLE_HEADER       *Tables)
3150228110Sjkim{
3151228110Sjkim    ACPI_STATUS             Status;
3152228110Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_S3PT);
3153298714Sjkim    ACPI_FPDT_HEADER        *SubTable;
3154228110Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
3155228110Sjkim    ACPI_TABLE_S3PT         *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
3156228110Sjkim
3157228110Sjkim
3158228110Sjkim    /* Main table */
3159228110Sjkim
3160228110Sjkim    Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
3161228110Sjkim    if (ACPI_FAILURE (Status))
3162228110Sjkim    {
3163228110Sjkim        return 0;
3164228110Sjkim    }
3165228110Sjkim
3166298714Sjkim    SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);
3167228110Sjkim    while (Offset < S3ptTable->Length)
3168228110Sjkim    {
3169272444Sjkim        /* Common subtable header */
3170228110Sjkim
3171228110Sjkim        AcpiOsPrintf ("\n");
3172228110Sjkim        Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
3173298714Sjkim            SubTable->Length, AcpiDmTableInfoS3ptHdr);
3174228110Sjkim        if (ACPI_FAILURE (Status))
3175228110Sjkim        {
3176228110Sjkim            return 0;
3177228110Sjkim        }
3178228110Sjkim
3179228110Sjkim        switch (SubTable->Type)
3180228110Sjkim        {
3181228110Sjkim        case ACPI_S3PT_TYPE_RESUME:
3182250838Sjkim
3183228110Sjkim            InfoTable = AcpiDmTableInfoS3pt0;
3184228110Sjkim            break;
3185250838Sjkim
3186228110Sjkim        case ACPI_S3PT_TYPE_SUSPEND:
3187250838Sjkim
3188228110Sjkim            InfoTable = AcpiDmTableInfoS3pt1;
3189228110Sjkim            break;
3190250838Sjkim
3191228110Sjkim        default:
3192250838Sjkim
3193298714Sjkim            AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n",
3194298714Sjkim                SubTable->Type);
3195228110Sjkim
3196228110Sjkim            /* Attempt to continue */
3197228110Sjkim
3198228110Sjkim            if (!SubTable->Length)
3199228110Sjkim            {
3200228110Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
3201228110Sjkim                return 0;
3202228110Sjkim            }
3203228110Sjkim            goto NextSubTable;
3204228110Sjkim        }
3205228110Sjkim
3206228110Sjkim        AcpiOsPrintf ("\n");
3207228110Sjkim        Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
3208298714Sjkim            SubTable->Length, InfoTable);
3209228110Sjkim        if (ACPI_FAILURE (Status))
3210228110Sjkim        {
3211228110Sjkim            return 0;
3212228110Sjkim        }
3213228110Sjkim
3214228110SjkimNextSubTable:
3215272444Sjkim        /* Point to next subtable */
3216228110Sjkim
3217228110Sjkim        Offset += SubTable->Length;
3218298714Sjkim        SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length);
3219228110Sjkim    }
3220228110Sjkim
3221228110Sjkim    return (S3ptTable->Length);
3222228110Sjkim}
3223228110Sjkim
3224228110Sjkim
3225228110Sjkim/*******************************************************************************
3226228110Sjkim *
3227219707Sjkim * FUNCTION:    AcpiDmDumpSlic
3228219707Sjkim *
3229219707Sjkim * PARAMETERS:  Table               - A SLIC table
3230219707Sjkim *
3231219707Sjkim * RETURN:      None
3232219707Sjkim *
3233219707Sjkim * DESCRIPTION: Format the contents of a SLIC
3234219707Sjkim *
3235219707Sjkim ******************************************************************************/
3236219707Sjkim
3237219707Sjkimvoid
3238219707SjkimAcpiDmDumpSlic (
3239219707Sjkim    ACPI_TABLE_HEADER       *Table)
3240219707Sjkim{
3241298714Sjkim
3242285797Sjkim    (void) AcpiDmDumpTable (Table->Length, sizeof (ACPI_TABLE_HEADER), Table,
3243298714Sjkim        Table->Length - sizeof (*Table), AcpiDmTableInfoSlic);
3244219707Sjkim}
3245219707Sjkim
3246219707Sjkim
3247219707Sjkim/*******************************************************************************
3248219707Sjkim *
3249167802Sjkim * FUNCTION:    AcpiDmDumpSlit
3250167802Sjkim *
3251167802Sjkim * PARAMETERS:  Table               - An SLIT
3252167802Sjkim *
3253167802Sjkim * RETURN:      None
3254167802Sjkim *
3255167802Sjkim * DESCRIPTION: Format the contents of a SLIT
3256167802Sjkim *
3257167802Sjkim ******************************************************************************/
3258167802Sjkim
3259167802Sjkimvoid
3260167802SjkimAcpiDmDumpSlit (
3261167802Sjkim    ACPI_TABLE_HEADER       *Table)
3262167802Sjkim{
3263193529Sjkim    ACPI_STATUS             Status;
3264167802Sjkim    UINT32                  Offset;
3265167802Sjkim    UINT8                   *Row;
3266167802Sjkim    UINT32                  Localities;
3267167802Sjkim    UINT32                  i;
3268167802Sjkim    UINT32                  j;
3269167802Sjkim
3270167802Sjkim
3271167802Sjkim    /* Main table */
3272167802Sjkim
3273193529Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit);
3274193529Sjkim    if (ACPI_FAILURE (Status))
3275193529Sjkim    {
3276193529Sjkim        return;
3277193529Sjkim    }
3278167802Sjkim
3279167802Sjkim    /* Display the Locality NxN Matrix */
3280167802Sjkim
3281167802Sjkim    Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount;
3282167802Sjkim    Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]);
3283167802Sjkim    Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry;
3284167802Sjkim
3285167802Sjkim    for (i = 0; i < Localities; i++)
3286167802Sjkim    {
3287167802Sjkim        /* Display one row of the matrix */
3288167802Sjkim
3289167802Sjkim        AcpiDmLineHeader2 (Offset, Localities, "Locality", i);
3290167802Sjkim        for  (j = 0; j < Localities; j++)
3291167802Sjkim        {
3292167802Sjkim            /* Check for beyond EOT */
3293167802Sjkim
3294167802Sjkim            if (Offset >= Table->Length)
3295167802Sjkim            {
3296298714Sjkim                AcpiOsPrintf (
3297298714Sjkim                    "\n**** Not enough room in table for all localities\n");
3298167802Sjkim                return;
3299167802Sjkim            }
3300167802Sjkim
3301209746Sjkim            AcpiOsPrintf ("%2.2X", Row[j]);
3302167802Sjkim            Offset++;
3303167802Sjkim
3304167802Sjkim            /* Display up to 16 bytes per output row */
3305167802Sjkim
3306209746Sjkim            if ((j+1) < Localities)
3307167802Sjkim            {
3308220663Sjkim                AcpiOsPrintf (" ");
3309209746Sjkim
3310209746Sjkim                if (j && (((j+1) % 16) == 0))
3311209746Sjkim                {
3312220663Sjkim                    AcpiOsPrintf ("\\\n"); /* With line continuation char */
3313220663Sjkim                    AcpiDmLineHeader (Offset, 0, NULL);
3314209746Sjkim                }
3315167802Sjkim            }
3316167802Sjkim        }
3317167802Sjkim
3318167802Sjkim        /* Point to next row */
3319167802Sjkim
3320167802Sjkim        AcpiOsPrintf ("\n");
3321167802Sjkim        Row += Localities;
3322167802Sjkim    }
3323167802Sjkim}
3324167802Sjkim
3325167802Sjkim
3326167802Sjkim/*******************************************************************************
3327167802Sjkim *
3328167802Sjkim * FUNCTION:    AcpiDmDumpSrat
3329167802Sjkim *
3330167802Sjkim * PARAMETERS:  Table               - A SRAT table
3331167802Sjkim *
3332167802Sjkim * RETURN:      None
3333167802Sjkim *
3334167802Sjkim * DESCRIPTION: Format the contents of a SRAT
3335167802Sjkim *
3336167802Sjkim ******************************************************************************/
3337167802Sjkim
3338167802Sjkimvoid
3339167802SjkimAcpiDmDumpSrat (
3340167802Sjkim    ACPI_TABLE_HEADER       *Table)
3341167802Sjkim{
3342193529Sjkim    ACPI_STATUS             Status;
3343167802Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_SRAT);
3344167802Sjkim    ACPI_SUBTABLE_HEADER    *SubTable;
3345167802Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
3346167802Sjkim
3347167802Sjkim
3348167802Sjkim    /* Main table */
3349167802Sjkim
3350193529Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat);
3351193529Sjkim    if (ACPI_FAILURE (Status))
3352193529Sjkim    {
3353193529Sjkim        return;
3354193529Sjkim    }
3355167802Sjkim
3356272444Sjkim    /* Subtables */
3357167802Sjkim
3358167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
3359167802Sjkim    while (Offset < Table->Length)
3360167802Sjkim    {
3361272444Sjkim        /* Common subtable header */
3362193529Sjkim
3363193529Sjkim        AcpiOsPrintf ("\n");
3364193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3365298714Sjkim            SubTable->Length, AcpiDmTableInfoSratHdr);
3366193529Sjkim        if (ACPI_FAILURE (Status))
3367193529Sjkim        {
3368193529Sjkim            return;
3369193529Sjkim        }
3370193529Sjkim
3371167802Sjkim        switch (SubTable->Type)
3372167802Sjkim        {
3373167802Sjkim        case ACPI_SRAT_TYPE_CPU_AFFINITY:
3374250838Sjkim
3375167802Sjkim            InfoTable = AcpiDmTableInfoSrat0;
3376167802Sjkim            break;
3377250838Sjkim
3378167802Sjkim        case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
3379250838Sjkim
3380167802Sjkim            InfoTable = AcpiDmTableInfoSrat1;
3381167802Sjkim            break;
3382250838Sjkim
3383193529Sjkim        case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
3384250838Sjkim
3385193529Sjkim            InfoTable = AcpiDmTableInfoSrat2;
3386193529Sjkim            break;
3387250838Sjkim
3388272444Sjkim        case ACPI_SRAT_TYPE_GICC_AFFINITY:
3389272444Sjkim
3390272444Sjkim            InfoTable = AcpiDmTableInfoSrat3;
3391272444Sjkim            break;
3392272444Sjkim
3393167802Sjkim        default:
3394298714Sjkim            AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n",
3395298714Sjkim                SubTable->Type);
3396193529Sjkim
3397193529Sjkim            /* Attempt to continue */
3398193529Sjkim
3399193529Sjkim            if (!SubTable->Length)
3400193529Sjkim            {
3401193529Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
3402193529Sjkim                return;
3403193529Sjkim            }
3404193529Sjkim            goto NextSubTable;
3405167802Sjkim        }
3406167802Sjkim
3407167802Sjkim        AcpiOsPrintf ("\n");
3408193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3409298714Sjkim            SubTable->Length, InfoTable);
3410193529Sjkim        if (ACPI_FAILURE (Status))
3411193529Sjkim        {
3412193529Sjkim            return;
3413193529Sjkim        }
3414167802Sjkim
3415193529SjkimNextSubTable:
3416272444Sjkim        /* Point to next subtable */
3417167802Sjkim
3418167802Sjkim        Offset += SubTable->Length;
3419298714Sjkim        SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable,
3420298714Sjkim            SubTable->Length);
3421167802Sjkim    }
3422167802Sjkim}
3423167802Sjkim
3424197104Sjkim
3425197104Sjkim/*******************************************************************************
3426197104Sjkim *
3427283092Sjkim * FUNCTION:    AcpiDmDumpStao
3428283092Sjkim *
3429283092Sjkim * PARAMETERS:  Table               - A STAO table
3430283092Sjkim *
3431283092Sjkim * RETURN:      None
3432283092Sjkim *
3433283092Sjkim * DESCRIPTION: Format the contents of a STAO. This is a variable-length
3434283092Sjkim *              table that contains an open-ended number of ASCII strings
3435283092Sjkim *              at the end of the table.
3436283092Sjkim *
3437283092Sjkim ******************************************************************************/
3438283092Sjkim
3439283092Sjkimvoid
3440283092SjkimAcpiDmDumpStao (
3441283092Sjkim    ACPI_TABLE_HEADER       *Table)
3442283092Sjkim{
3443283092Sjkim    ACPI_STATUS             Status;
3444283092Sjkim    char                    *Namepath;
3445283092Sjkim    UINT32                  Length = Table->Length;
3446283092Sjkim    UINT32                  StringLength;
3447283092Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_STAO);
3448283092Sjkim
3449283092Sjkim
3450283092Sjkim    /* Main table */
3451283092Sjkim
3452283092Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoStao);
3453283092Sjkim    if (ACPI_FAILURE (Status))
3454283092Sjkim    {
3455283092Sjkim        return;
3456283092Sjkim    }
3457283092Sjkim
3458283092Sjkim    /* The rest of the table consists of Namepath strings */
3459283092Sjkim
3460283092Sjkim    while (Offset < Table->Length)
3461283092Sjkim    {
3462283092Sjkim        Namepath = ACPI_ADD_PTR (char, Table, Offset);
3463284583Sjkim        StringLength = strlen (Namepath) + 1;
3464283092Sjkim
3465283092Sjkim        AcpiDmLineHeader (Offset, StringLength, "Namestring");
3466283092Sjkim        AcpiOsPrintf ("\"%s\"\n", Namepath);
3467283092Sjkim
3468283092Sjkim        /* Point to next namepath */
3469283092Sjkim
3470283092Sjkim        Offset += StringLength;
3471283092Sjkim    }
3472283092Sjkim}
3473283092Sjkim
3474283092Sjkim
3475283092Sjkim/*******************************************************************************
3476283092Sjkim *
3477285797Sjkim * FUNCTION:    AcpiDmDumpTcpa
3478285797Sjkim *
3479285797Sjkim * PARAMETERS:  Table               - A TCPA table
3480285797Sjkim *
3481285797Sjkim * RETURN:      None
3482285797Sjkim *
3483285797Sjkim * DESCRIPTION: Format the contents of a TCPA.
3484285797Sjkim *
3485285797Sjkim * NOTE:        There are two versions of the table with the same signature:
3486285797Sjkim *              the client version and the server version. The common
3487285797Sjkim *              PlatformClass field is used to differentiate the two types of
3488285797Sjkim *              tables.
3489285797Sjkim *
3490285797Sjkim ******************************************************************************/
3491285797Sjkim
3492285797Sjkimvoid
3493285797SjkimAcpiDmDumpTcpa (
3494285797Sjkim    ACPI_TABLE_HEADER       *Table)
3495285797Sjkim{
3496285797Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_TCPA_HDR);
3497285797Sjkim    ACPI_TABLE_TCPA_HDR     *CommonHeader = ACPI_CAST_PTR (
3498285797Sjkim                                ACPI_TABLE_TCPA_HDR, Table);
3499285797Sjkim    ACPI_TABLE_TCPA_HDR     *SubTable = ACPI_ADD_PTR (
3500285797Sjkim                                ACPI_TABLE_TCPA_HDR, Table, Offset);
3501285797Sjkim    ACPI_STATUS             Status;
3502285797Sjkim
3503285797Sjkim
3504285797Sjkim    /* Main table */
3505285797Sjkim
3506285797Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table,
3507285797Sjkim        0, AcpiDmTableInfoTcpaHdr);
3508285797Sjkim    if (ACPI_FAILURE (Status))
3509285797Sjkim    {
3510285797Sjkim        return;
3511285797Sjkim    }
3512285797Sjkim
3513285797Sjkim    /*
3514285797Sjkim     * Examine the PlatformClass field to determine the table type.
3515285797Sjkim     * Either a client or server table. Only one.
3516285797Sjkim     */
3517285797Sjkim    switch (CommonHeader->PlatformClass)
3518285797Sjkim    {
3519285797Sjkim    case ACPI_TCPA_CLIENT_TABLE:
3520285797Sjkim
3521285797Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3522285797Sjkim            Table->Length - Offset, AcpiDmTableInfoTcpaClient);
3523285797Sjkim        break;
3524285797Sjkim
3525285797Sjkim    case ACPI_TCPA_SERVER_TABLE:
3526285797Sjkim
3527285797Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3528285797Sjkim            Table->Length - Offset, AcpiDmTableInfoTcpaServer);
3529285797Sjkim        break;
3530285797Sjkim
3531285797Sjkim    default:
3532285797Sjkim
3533285797Sjkim        AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
3534285797Sjkim            CommonHeader->PlatformClass);
3535285797Sjkim        Status = AE_ERROR;
3536285797Sjkim        break;
3537285797Sjkim    }
3538285797Sjkim
3539285797Sjkim    if (ACPI_FAILURE (Status))
3540285797Sjkim    {
3541285797Sjkim        AcpiOsPrintf ("\n**** Cannot disassemble TCPA table\n");
3542285797Sjkim    }
3543285797Sjkim}
3544285797Sjkim
3545285797Sjkim
3546285797Sjkim/*******************************************************************************
3547285797Sjkim *
3548246849Sjkim * FUNCTION:    AcpiDmDumpVrtc
3549246849Sjkim *
3550246849Sjkim * PARAMETERS:  Table               - A VRTC table
3551246849Sjkim *
3552246849Sjkim * RETURN:      None
3553246849Sjkim *
3554246849Sjkim * DESCRIPTION: Format the contents of a VRTC
3555246849Sjkim *
3556246849Sjkim ******************************************************************************/
3557246849Sjkim
3558246849Sjkimvoid
3559246849SjkimAcpiDmDumpVrtc (
3560246849Sjkim    ACPI_TABLE_HEADER       *Table)
3561246849Sjkim{
3562246849Sjkim    ACPI_STATUS             Status;
3563246849Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_VRTC);
3564246849Sjkim    ACPI_VRTC_ENTRY         *SubTable;
3565246849Sjkim
3566246849Sjkim
3567246849Sjkim    /* Main table */
3568246849Sjkim
3569246849Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoVrtc);
3570246849Sjkim    if (ACPI_FAILURE (Status))
3571246849Sjkim    {
3572246849Sjkim        return;
3573246849Sjkim    }
3574246849Sjkim
3575272444Sjkim    /* Subtables */
3576246849Sjkim
3577246849Sjkim    SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset);
3578246849Sjkim    while (Offset < Table->Length)
3579246849Sjkim    {
3580272444Sjkim        /* Common subtable header */
3581246849Sjkim
3582246849Sjkim        AcpiOsPrintf ("\n");
3583246849Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3584298714Sjkim            sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0);
3585246849Sjkim        if (ACPI_FAILURE (Status))
3586246849Sjkim        {
3587246849Sjkim            return;
3588246849Sjkim        }
3589246849Sjkim
3590272444Sjkim        /* Point to next subtable */
3591246849Sjkim
3592246849Sjkim        Offset += sizeof (ACPI_VRTC_ENTRY);
3593298714Sjkim        SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, SubTable,
3594298714Sjkim            sizeof (ACPI_VRTC_ENTRY));
3595246849Sjkim    }
3596246849Sjkim}
3597246849Sjkim
3598246849Sjkim
3599246849Sjkim/*******************************************************************************
3600246849Sjkim *
3601197104Sjkim * FUNCTION:    AcpiDmDumpWdat
3602197104Sjkim *
3603197104Sjkim * PARAMETERS:  Table               - A WDAT table
3604197104Sjkim *
3605197104Sjkim * RETURN:      None
3606197104Sjkim *
3607197104Sjkim * DESCRIPTION: Format the contents of a WDAT
3608197104Sjkim *
3609197104Sjkim ******************************************************************************/
3610197104Sjkim
3611197104Sjkimvoid
3612197104SjkimAcpiDmDumpWdat (
3613197104Sjkim    ACPI_TABLE_HEADER       *Table)
3614197104Sjkim{
3615197104Sjkim    ACPI_STATUS             Status;
3616197104Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_WDAT);
3617197104Sjkim    ACPI_WDAT_ENTRY         *SubTable;
3618197104Sjkim
3619197104Sjkim
3620197104Sjkim    /* Main table */
3621197104Sjkim
3622197104Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat);
3623197104Sjkim    if (ACPI_FAILURE (Status))
3624197104Sjkim    {
3625197104Sjkim        return;
3626197104Sjkim    }
3627197104Sjkim
3628272444Sjkim    /* Subtables */
3629197104Sjkim
3630197104Sjkim    SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
3631197104Sjkim    while (Offset < Table->Length)
3632197104Sjkim    {
3633272444Sjkim        /* Common subtable header */
3634197104Sjkim
3635197104Sjkim        AcpiOsPrintf ("\n");
3636197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3637298714Sjkim            sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0);
3638197104Sjkim        if (ACPI_FAILURE (Status))
3639197104Sjkim        {
3640197104Sjkim            return;
3641197104Sjkim        }
3642197104Sjkim
3643272444Sjkim        /* Point to next subtable */
3644197104Sjkim
3645197104Sjkim        Offset += sizeof (ACPI_WDAT_ENTRY);
3646298714Sjkim        SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable,
3647298714Sjkim            sizeof (ACPI_WDAT_ENTRY));
3648197104Sjkim    }
3649197104Sjkim}
3650283092Sjkim
3651298714Sjkim
3652283092Sjkim/*******************************************************************************
3653283092Sjkim *
3654283092Sjkim * FUNCTION:    AcpiDmDumpWpbt
3655283092Sjkim *
3656283092Sjkim * PARAMETERS:  Table               - A WPBT table
3657283092Sjkim *
3658283092Sjkim * RETURN:      None
3659283092Sjkim *
3660283092Sjkim * DESCRIPTION: Format the contents of a WPBT. This table type consists
3661283092Sjkim *              of an open-ended arguments buffer at the end of the table.
3662283092Sjkim *
3663283092Sjkim ******************************************************************************/
3664283092Sjkim
3665283092Sjkimvoid
3666283092SjkimAcpiDmDumpWpbt (
3667283092Sjkim    ACPI_TABLE_HEADER       *Table)
3668283092Sjkim{
3669283092Sjkim    ACPI_STATUS             Status;
3670283092Sjkim    ACPI_TABLE_WPBT         *SubTable;
3671283092Sjkim    UINT32                  Length = Table->Length;
3672283092Sjkim    UINT16                  ArgumentsLength;
3673283092Sjkim
3674283092Sjkim
3675283092Sjkim    /* Dump the main table */
3676283092Sjkim
3677283092Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoWpbt);
3678283092Sjkim    if (ACPI_FAILURE (Status))
3679283092Sjkim    {
3680283092Sjkim        return;
3681283092Sjkim    }
3682283092Sjkim
3683283092Sjkim    /* Extract the arguments buffer length from the main table */
3684283092Sjkim
3685283092Sjkim    SubTable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table);
3686283092Sjkim    ArgumentsLength = SubTable->ArgumentsLength;
3687283092Sjkim
3688283092Sjkim    /* Dump the arguments buffer */
3689283092Sjkim
3690285797Sjkim    (void) AcpiDmDumpTable (Table->Length, 0, Table, ArgumentsLength,
3691283092Sjkim        AcpiDmTableInfoWpbt0);
3692283092Sjkim}
3693