1167802Sjkim/******************************************************************************
2167802Sjkim *
3167802Sjkim * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code
4167802Sjkim *
5167802Sjkim *****************************************************************************/
6167802Sjkim
7217365Sjkim/*
8306536Sjkim * 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
81281687Sjkimvoid
82239340SjkimAcpiDmDumpBuffer (
83239340Sjkim    void                    *Table,
84239340Sjkim    UINT32                  BufferOffset,
85239340Sjkim    UINT32                  Length,
86239340Sjkim    UINT32                  AbsoluteOffset,
87284460Sjkim    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        {
105284460Sjkim            /* Insert a backslash - line continuation character */
106284460Sjkim
107284460Sjkim            if (Length > 16)
108281687Sjkim            {
109281687Sjkim                AcpiOsPrintf ("\\\n    ");
110281687Sjkim            }
111239340Sjkim        }
112239340Sjkim
113239340Sjkim        AcpiOsPrintf ("%.02X ", *Buffer);
114239340Sjkim        i++;
115239340Sjkim        Buffer++;
116239340Sjkim        AbsoluteOffset++;
117239340Sjkim    }
118239340Sjkim
119239340Sjkim    AcpiOsPrintf ("\n");
120239340Sjkim}
121239340Sjkim
122239340Sjkim
123239340Sjkim/*******************************************************************************
124239340Sjkim *
125284460Sjkim * FUNCTION:    AcpiDmDumpUnicode
126284460Sjkim *
127284460Sjkim * PARAMETERS:  Table               - ACPI Table or subtable
128284460Sjkim *              BufferOffset        - Offset of buffer from Table above
129284460Sjkim *              ByteLength          - Length of the buffer
130284460Sjkim *
131284460Sjkim * RETURN:      None
132284460Sjkim *
133284460Sjkim * DESCRIPTION: Validate and dump the contents of a buffer that contains
134284460Sjkim *              unicode data. The output is a standard ASCII string. If it
135284460Sjkim *              appears that the data is not unicode, the buffer is dumped
136284460Sjkim *              as hex characters.
137284460Sjkim *
138284460Sjkim ******************************************************************************/
139284460Sjkim
140284460Sjkimvoid
141284460SjkimAcpiDmDumpUnicode (
142284460Sjkim    void                    *Table,
143284460Sjkim    UINT32                  BufferOffset,
144284460Sjkim    UINT32                  ByteLength)
145284460Sjkim{
146284460Sjkim    UINT8                   *Buffer;
147284460Sjkim    UINT32                  Length;
148284460Sjkim    UINT32                  i;
149284460Sjkim
150284460Sjkim
151284460Sjkim    Buffer = ((UINT8 *) Table) + BufferOffset;
152284460Sjkim    Length = ByteLength - 2; /* Last two bytes are the null terminator */
153284460Sjkim
154284460Sjkim    /* Ensure all low bytes are entirely printable ASCII */
155284460Sjkim
156284460Sjkim    for (i = 0; i < Length; i += 2)
157284460Sjkim    {
158306536Sjkim        if (!isprint (Buffer[i]))
159284460Sjkim        {
160284460Sjkim            goto DumpRawBuffer;
161284460Sjkim        }
162284460Sjkim    }
163284460Sjkim
164284460Sjkim    /* Ensure all high bytes are zero */
165284460Sjkim
166284460Sjkim    for (i = 1; i < Length; i += 2)
167284460Sjkim    {
168284460Sjkim        if (Buffer[i])
169284460Sjkim        {
170284460Sjkim            goto DumpRawBuffer;
171284460Sjkim        }
172284460Sjkim    }
173284460Sjkim
174284460Sjkim    /* Dump the buffer as a normal string */
175284460Sjkim
176284460Sjkim    AcpiOsPrintf ("\"");
177284460Sjkim    for (i = 0; i < Length; i += 2)
178284460Sjkim    {
179284460Sjkim        AcpiOsPrintf ("%c", Buffer[i]);
180284460Sjkim    }
181306536Sjkim
182284460Sjkim    AcpiOsPrintf ("\"\n");
183284460Sjkim    return;
184284460Sjkim
185284460SjkimDumpRawBuffer:
186284460Sjkim    AcpiDmDumpBuffer (Table, BufferOffset, ByteLength,
187284460Sjkim        BufferOffset, NULL);
188284460Sjkim    AcpiOsPrintf ("\n");
189284460Sjkim}
190284460Sjkim
191284460Sjkim
192284460Sjkim/*******************************************************************************
193284460Sjkim *
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;
212306536Sjkim    ACPI_STATUS             Status;
213167802Sjkim
214167802Sjkim
215167802Sjkim    /* Dump the common ACPI 1.0 portion */
216167802Sjkim
217306536Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1);
218306536Sjkim    if (ACPI_FAILURE (Status))
219306536Sjkim    {
220306536Sjkim        return (Length);
221306536Sjkim    }
222167802Sjkim
223209746Sjkim    /* Validate the first checksum */
224167802Sjkim
225209746Sjkim    Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON),
226306536Sjkim        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;
238306536Sjkim        Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2);
239306536Sjkim        if (ACPI_FAILURE (Status))
240306536Sjkim        {
241306536Sjkim            return (Length);
242306536Sjkim        }
243209746Sjkim
244209746Sjkim        /* Validate the extended checksum over entire RSDP */
245209746Sjkim
246209746Sjkim        Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP),
247306536Sjkim            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{
360306536Sjkim    ACPI_STATUS             Status;
361167802Sjkim
362306536Sjkim
363218590Sjkim    /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */
364167802Sjkim
365306536Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
366306536Sjkim        AcpiDmTableInfoFadt1);
367306536Sjkim    if (ACPI_FAILURE (Status))
368306536Sjkim    {
369306536Sjkim        return;
370306536Sjkim    }
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    {
377306536Sjkim        Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
378306536Sjkim            AcpiDmTableInfoFadt2);
379306536Sjkim        if (ACPI_FAILURE (Status))
380306536Sjkim        {
381306536Sjkim            return;
382306536Sjkim        }
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    {
389306536Sjkim        Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
390306536Sjkim            AcpiDmTableInfoFadt3);
391306536Sjkim        if (ACPI_FAILURE (Status))
392306536Sjkim        {
393306536Sjkim            return;
394306536Sjkim        }
395228110Sjkim
396228110Sjkim        /* Check for FADT revision 5 fields and up (ACPI 5.0+) */
397228110Sjkim
398228110Sjkim        if (Table->Length > ACPI_FADT_V3_SIZE)
399228110Sjkim        {
400306536Sjkim            Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
401306536Sjkim                AcpiDmTableInfoFadt5);
402306536Sjkim            if (ACPI_FAILURE (Status))
403306536Sjkim            {
404306536Sjkim                return;
405306536Sjkim            }
406228110Sjkim        }
407284460Sjkim
408284460Sjkim        /* Check for FADT revision 6 fields and up (ACPI 6.0+) */
409284460Sjkim
410284460Sjkim        if (Table->Length > ACPI_FADT_V3_SIZE)
411284460Sjkim        {
412306536Sjkim            Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
413306536Sjkim                AcpiDmTableInfoFadt6);
414306536Sjkim            if (ACPI_FAILURE (Status))
415306536Sjkim            {
416306536Sjkim                return;
417306536Sjkim            }
418284460Sjkim        }
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 (
494306536Sjkim        "\n// ACPI Warning: FADT revision %X does not match length: "
495306536Sjkim        "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
529281075Sdim    /* No main table, only subtables */
530167802Sjkim
531167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
532167802Sjkim    while (Offset < Table->Length)
533167802Sjkim    {
534281075Sdim        /* Common subtable header */
535167802Sjkim
536193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
537306536Sjkim            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
589306536Sjkim            AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n",
590306536Sjkim                SubTable->Header.Type);
591167802Sjkim            return;
592167802Sjkim        }
593167802Sjkim
594193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
595306536Sjkim            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,
612306536Sjkim                    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++;
635306536Sjkim
636193529Sjkim                if (DataOffset > Table->Length)
637193529Sjkim                {
638306536Sjkim                    AcpiOsPrintf (
639306536Sjkim                        "**** ACPI table terminates in the middle of a "
640306536Sjkim                        "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
655281075Sdim        /* 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;
664306536Sjkim        SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable,
665306536Sjkim            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
701281075Sdim    /* 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,
708306536Sjkim            SubTable->Header.Length, AcpiDmTableInfoCpep0);
709193529Sjkim        if (ACPI_FAILURE (Status))
710193529Sjkim        {
711193529Sjkim            return;
712193529Sjkim        }
713167802Sjkim
714281075Sdim        /* Point to next subtable */
715167802Sjkim
716197104Sjkim        Offset += SubTable->Header.Length;
717197104Sjkim        SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable,
718306536Sjkim            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
753281075Sdim    /* 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,
762306536Sjkim            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,
776306536Sjkim            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,
794306536Sjkim                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;
805284460Sjkim            if (InfoLength)
806284460Sjkim            {
807284460Sjkim                Status = AcpiDmDumpTable (Length,
808306536Sjkim                    Offset + SubOffset + SubSubOffset, Table,
809306536Sjkim                    InfoLength, AcpiDmTableInfoCsrt2a);
810284460Sjkim                if (ACPI_FAILURE (Status))
811284460Sjkim                {
812284460Sjkim                    return;
813284460Sjkim                }
814284460Sjkim                SubSubOffset += InfoLength;
815284460Sjkim            }
816239340Sjkim
817245582Sjkim            /* Point to next sub-subtable */
818239340Sjkim
819239340Sjkim            SubOffset += SubSubTable->Length;
820239340Sjkim            SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable,
821306536Sjkim                SubSubTable->Length);
822239340Sjkim        }
823239340Sjkim
824281075Sdim        /* Point to next subtable */
825239340Sjkim
826239340Sjkim        Offset += SubTable->Length;
827239340Sjkim        SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable,
828306536Sjkim            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
868281075Sdim    /* 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,
875306536Sjkim            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,
891306536Sjkim                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,
908306536Sjkim                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,
923306536Sjkim            SubTable->Length, AcpiDmTableInfoDbg2Name);
924239340Sjkim        if (ACPI_FAILURE (Status))
925239340Sjkim        {
926239340Sjkim            return;
927239340Sjkim        }
928239340Sjkim
929239340Sjkim        /* Dump the OemData (optional) */
930239340Sjkim
931281075Sdim        if (SubTable->OemDataOffset)
932281075Sdim        {
933284460Sjkim            Status = AcpiDmDumpTable (Length, Offset + SubTable->OemDataOffset,
934306536Sjkim                Table, SubTable->OemDataLength,
935306536Sjkim                AcpiDmTableInfoDbg2OemData);
936284460Sjkim            if (ACPI_FAILURE (Status))
937284460Sjkim            {
938284460Sjkim                return;
939284460Sjkim            }
940281075Sdim        }
941239340Sjkim
942281075Sdim        /* Point to next subtable */
943239340Sjkim
944239340Sjkim        Offset += SubTable->Length;
945239340Sjkim        SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable,
946306536Sjkim            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
987281075Sdim    /* Subtables */
988167802Sjkim
989167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
990167802Sjkim    while (Offset < Table->Length)
991167802Sjkim    {
992281075Sdim        /* Common subtable header */
993167802Sjkim
994167802Sjkim        AcpiOsPrintf ("\n");
995193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
996306536Sjkim            SubTable->Length, AcpiDmTableInfoDmarHdr);
997193529Sjkim        if (ACPI_FAILURE (Status))
998193529Sjkim        {
999193529Sjkim            return;
1000193529Sjkim        }
1001306536Sjkim
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
1018281075Sdim        case ACPI_DMAR_TYPE_ROOT_ATS:
1019250838Sjkim
1020193529Sjkim            InfoTable = AcpiDmTableInfoDmar2;
1021193529Sjkim            ScopeOffset = sizeof (ACPI_DMAR_ATSR);
1022193529Sjkim            break;
1023250838Sjkim
1024281075Sdim        case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
1025250838Sjkim
1026197104Sjkim            InfoTable = AcpiDmTableInfoDmar3;
1027197104Sjkim            ScopeOffset = sizeof (ACPI_DMAR_RHSA);
1028197104Sjkim            break;
1029250838Sjkim
1030281075Sdim        case ACPI_DMAR_TYPE_NAMESPACE:
1031281075Sdim
1032281075Sdim            InfoTable = AcpiDmTableInfoDmar4;
1033281075Sdim            ScopeOffset = sizeof (ACPI_DMAR_ANDD);
1034281075Sdim            break;
1035281075Sdim
1036167802Sjkim        default:
1037250838Sjkim
1038306536Sjkim            AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",
1039306536Sjkim                SubTable->Type);
1040167802Sjkim            return;
1041167802Sjkim        }
1042167802Sjkim
1043193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1044306536Sjkim            SubTable->Length, InfoTable);
1045193529Sjkim        if (ACPI_FAILURE (Status))
1046193529Sjkim        {
1047193529Sjkim            return;
1048193529Sjkim        }
1049167802Sjkim
1050281075Sdim        /*
1051281075Sdim         * Dump the optional device scope entries
1052281075Sdim         */
1053281075Sdim        if ((SubTable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
1054281075Sdim            (SubTable->Type == ACPI_DMAR_TYPE_NAMESPACE))
1055281075Sdim        {
1056281075Sdim            /* These types do not support device scopes */
1057193529Sjkim
1058281075Sdim            goto NextSubtable;
1059281075Sdim        }
1060281075Sdim
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,
1066306536Sjkim                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            {
1082306536Sjkim                AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2,
1083306536Sjkim                    "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
1100281075SdimNextSubtable:
1101281075Sdim        /* Point to next subtable */
1102167802Sjkim
1103167802Sjkim        Offset += SubTable->Length;
1104306536Sjkim        SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable,
1105306536Sjkim            SubTable->Length);
1106167802Sjkim    }
1107167802Sjkim}
1108167802Sjkim
1109167802Sjkim
1110167802Sjkim/*******************************************************************************
1111167802Sjkim *
1112284460Sjkim * FUNCTION:    AcpiDmDumpDrtm
1113284460Sjkim *
1114284460Sjkim * PARAMETERS:  Table               - A DRTM table
1115284460Sjkim *
1116284460Sjkim * RETURN:      None
1117284460Sjkim *
1118284460Sjkim * DESCRIPTION: Format the contents of a DRTM.
1119284460Sjkim *
1120284460Sjkim ******************************************************************************/
1121284460Sjkim
1122284460Sjkimvoid
1123284460SjkimAcpiDmDumpDrtm (
1124284460Sjkim    ACPI_TABLE_HEADER       *Table)
1125284460Sjkim{
1126284460Sjkim    ACPI_STATUS             Status;
1127284460Sjkim    UINT32                  Offset;
1128284460Sjkim    ACPI_DRTM_VTABLE_LIST   *DrtmVtl;
1129284460Sjkim    ACPI_DRTM_RESOURCE_LIST *DrtmRl;
1130284460Sjkim    ACPI_DRTM_DPS_ID        *DrtmDps;
1131284460Sjkim    UINT32                  Count;
1132284460Sjkim
1133284460Sjkim
1134284460Sjkim    /* Main table */
1135284460Sjkim
1136284460Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
1137306536Sjkim        AcpiDmTableInfoDrtm);
1138284460Sjkim    if (ACPI_FAILURE (Status))
1139284460Sjkim    {
1140284460Sjkim        return;
1141284460Sjkim    }
1142284460Sjkim
1143284460Sjkim    Offset = sizeof (ACPI_TABLE_DRTM);
1144284460Sjkim
1145284460Sjkim    /* Sub-tables */
1146284460Sjkim
1147284460Sjkim    /* Dump ValidatedTable length */
1148284460Sjkim
1149284460Sjkim    DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
1150284460Sjkim    AcpiOsPrintf ("\n");
1151284460Sjkim    Status = AcpiDmDumpTable (Table->Length, Offset,
1152306536Sjkim        DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
1153306536Sjkim        AcpiDmTableInfoDrtm0);
1154284460Sjkim    if (ACPI_FAILURE (Status))
1155284460Sjkim    {
1156284460Sjkim            return;
1157284460Sjkim    }
1158306536Sjkim
1159284460Sjkim    Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);
1160284460Sjkim
1161284460Sjkim    /* Dump Validated table addresses */
1162284460Sjkim
1163284460Sjkim    Count = 0;
1164284460Sjkim    while ((Offset < Table->Length) &&
1165284460Sjkim            (DrtmVtl->ValidatedTableCount > Count))
1166284460Sjkim    {
1167284460Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset,
1168306536Sjkim            ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
1169306536Sjkim            AcpiDmTableInfoDrtm0a);
1170284460Sjkim        if (ACPI_FAILURE (Status))
1171284460Sjkim        {
1172284460Sjkim            return;
1173284460Sjkim        }
1174306536Sjkim
1175284460Sjkim        Offset += sizeof (UINT64);
1176284460Sjkim        Count++;
1177284460Sjkim    }
1178284460Sjkim
1179284460Sjkim    /* Dump ResourceList length */
1180284460Sjkim
1181284460Sjkim    DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
1182284460Sjkim    AcpiOsPrintf ("\n");
1183284460Sjkim    Status = AcpiDmDumpTable (Table->Length, Offset,
1184306536Sjkim        DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
1185306536Sjkim        AcpiDmTableInfoDrtm1);
1186284460Sjkim    if (ACPI_FAILURE (Status))
1187284460Sjkim    {
1188306536Sjkim        return;
1189284460Sjkim    }
1190284460Sjkim
1191284460Sjkim    Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);
1192284460Sjkim
1193284460Sjkim    /* Dump the Resource List */
1194284460Sjkim
1195284460Sjkim    Count = 0;
1196284460Sjkim    while ((Offset < Table->Length) &&
1197284460Sjkim           (DrtmRl->ResourceCount > Count))
1198284460Sjkim    {
1199284460Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset,
1200306536Sjkim            ACPI_ADD_PTR (void, Table, Offset),
1201306536Sjkim            sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a);
1202284460Sjkim        if (ACPI_FAILURE (Status))
1203284460Sjkim        {
1204284460Sjkim            return;
1205284460Sjkim        }
1206284460Sjkim
1207284460Sjkim        Offset += sizeof (ACPI_DRTM_RESOURCE);
1208284460Sjkim        Count++;
1209284460Sjkim    }
1210284460Sjkim
1211284460Sjkim    /* Dump DPS */
1212284460Sjkim
1213284460Sjkim    DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
1214284460Sjkim    AcpiOsPrintf ("\n");
1215306536Sjkim    (void) AcpiDmDumpTable (Table->Length, Offset,
1216306536Sjkim        DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2);
1217284460Sjkim}
1218284460Sjkim
1219284460Sjkim
1220284460Sjkim/*******************************************************************************
1221284460Sjkim *
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
1251281075Sdim    /* 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,
1258306536Sjkim            sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
1259193529Sjkim        if (ACPI_FAILURE (Status))
1260193529Sjkim        {
1261193529Sjkim            return;
1262193529Sjkim        }
1263193529Sjkim
1264281075Sdim        /* 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,
1268306536Sjkim            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
1304281075Sdim    /* 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,
1311306536Sjkim            sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
1312193529Sjkim        if (ACPI_FAILURE (Status))
1313193529Sjkim        {
1314193529Sjkim            return;
1315193529Sjkim        }
1316193529Sjkim
1317281075Sdim        /* 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,
1321306536Sjkim            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
1352281075Sdim    /* Subtables */
1353228110Sjkim
1354228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
1355228110Sjkim    while (Offset < Table->Length)
1356228110Sjkim    {
1357281075Sdim        /* Common subtable header */
1358228110Sjkim
1359228110Sjkim        AcpiOsPrintf ("\n");
1360228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1361306536Sjkim            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
1381306536Sjkim            AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",
1382306536Sjkim                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,
1395306536Sjkim            SubTable->Length, InfoTable);
1396228110Sjkim        if (ACPI_FAILURE (Status))
1397228110Sjkim        {
1398228110Sjkim            return;
1399228110Sjkim        }
1400228110Sjkim
1401228110SjkimNextSubTable:
1402281075Sdim        /* Point to next subtable */
1403228110Sjkim
1404228110Sjkim        Offset += SubTable->Length;
1405306536Sjkim        SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable,
1406306536Sjkim            SubTable->Length);
1407228110Sjkim    }
1408228110Sjkim}
1409228110Sjkim
1410228110Sjkim
1411228110Sjkim/*******************************************************************************
1412228110Sjkim *
1413281075Sdim * FUNCTION:    AcpiDmDumpGtdt
1414281075Sdim *
1415281075Sdim * PARAMETERS:  Table               - A GTDT table
1416281075Sdim *
1417281075Sdim * RETURN:      None
1418281075Sdim *
1419281075Sdim * DESCRIPTION: Format the contents of a GTDT. This table type consists
1420281075Sdim *              of an open-ended number of subtables.
1421281075Sdim *
1422281075Sdim ******************************************************************************/
1423281075Sdim
1424281075Sdimvoid
1425281075SdimAcpiDmDumpGtdt (
1426281075Sdim    ACPI_TABLE_HEADER       *Table)
1427281075Sdim{
1428281075Sdim    ACPI_STATUS             Status;
1429281075Sdim    ACPI_GTDT_HEADER        *SubTable;
1430281075Sdim    UINT32                  Length = Table->Length;
1431281075Sdim    UINT32                  Offset = sizeof (ACPI_TABLE_GTDT);
1432281075Sdim    ACPI_DMTABLE_INFO       *InfoTable;
1433281075Sdim    UINT32                  SubTableLength;
1434281075Sdim    UINT32                  GtCount;
1435281075Sdim    ACPI_GTDT_TIMER_ENTRY   *GtxTable;
1436281075Sdim
1437281075Sdim
1438281075Sdim    /* Main table */
1439281075Sdim
1440281075Sdim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
1441281075Sdim    if (ACPI_FAILURE (Status))
1442281075Sdim    {
1443281075Sdim        return;
1444281075Sdim    }
1445281075Sdim
1446281075Sdim    /* Subtables */
1447281075Sdim
1448281075Sdim    SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
1449281075Sdim    while (Offset < Table->Length)
1450281075Sdim    {
1451281075Sdim        /* Common subtable header */
1452281075Sdim
1453281075Sdim        AcpiOsPrintf ("\n");
1454281075Sdim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1455306536Sjkim            SubTable->Length, AcpiDmTableInfoGtdtHdr);
1456281075Sdim        if (ACPI_FAILURE (Status))
1457281075Sdim        {
1458281075Sdim            return;
1459281075Sdim        }
1460281075Sdim
1461281075Sdim        GtCount = 0;
1462281075Sdim        switch (SubTable->Type)
1463281075Sdim        {
1464281075Sdim        case ACPI_GTDT_TYPE_TIMER_BLOCK:
1465281075Sdim
1466281075Sdim            SubTableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
1467281075Sdim            GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
1468306536Sjkim                SubTable))->TimerCount;
1469281075Sdim
1470281075Sdim            InfoTable = AcpiDmTableInfoGtdt0;
1471281075Sdim            break;
1472281075Sdim
1473281075Sdim        case ACPI_GTDT_TYPE_WATCHDOG:
1474281075Sdim
1475281075Sdim            SubTableLength = sizeof (ACPI_GTDT_WATCHDOG);
1476281075Sdim
1477281075Sdim            InfoTable = AcpiDmTableInfoGtdt1;
1478281075Sdim            break;
1479281075Sdim
1480281075Sdim        default:
1481281075Sdim
1482281075Sdim            /* Cannot continue on unknown type - no length */
1483281075Sdim
1484306536Sjkim            AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n",
1485306536Sjkim                SubTable->Type);
1486281075Sdim            return;
1487281075Sdim        }
1488281075Sdim
1489281075Sdim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1490306536Sjkim            SubTable->Length, InfoTable);
1491281075Sdim        if (ACPI_FAILURE (Status))
1492281075Sdim        {
1493281075Sdim            return;
1494281075Sdim        }
1495281075Sdim
1496281075Sdim        /* Point to end of current subtable (each subtable above is of fixed length) */
1497281075Sdim
1498281075Sdim        Offset += SubTableLength;
1499281075Sdim
1500281075Sdim        /* If there are any Gt Timer Blocks from above, dump them now */
1501281075Sdim
1502281075Sdim        if (GtCount)
1503281075Sdim        {
1504306536Sjkim            GtxTable = ACPI_ADD_PTR (
1505306536Sjkim                ACPI_GTDT_TIMER_ENTRY, SubTable, SubTableLength);
1506281075Sdim            SubTableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
1507281075Sdim
1508281075Sdim            while (GtCount)
1509281075Sdim            {
1510281075Sdim                AcpiOsPrintf ("\n");
1511281075Sdim                Status = AcpiDmDumpTable (Length, Offset, GtxTable,
1512306536Sjkim                    sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
1513281075Sdim                if (ACPI_FAILURE (Status))
1514281075Sdim                {
1515281075Sdim                    return;
1516281075Sdim                }
1517281075Sdim                Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
1518281075Sdim                GtxTable++;
1519281075Sdim                GtCount--;
1520281075Sdim            }
1521281075Sdim        }
1522281075Sdim
1523281075Sdim        /* Point to next subtable */
1524281075Sdim
1525281075Sdim        SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, SubTable, SubTableLength);
1526281075Sdim    }
1527281075Sdim}
1528281075Sdim
1529281075Sdim
1530281075Sdim/*******************************************************************************
1531281075Sdim *
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
1565281075Sdim    /* 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,
1578306536Sjkim                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,
1586306536Sjkim                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
1619306536Sjkim        case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
1620306536Sjkim
1621306536Sjkim            InfoTable = AcpiDmTableInfoHest10;
1622306536Sjkim            SubTableLength = sizeof (ACPI_HEST_GENERIC_V2);
1623306536Sjkim            break;
1624306536Sjkim
1625193529Sjkim        default:
1626250838Sjkim
1627193529Sjkim            /* Cannot continue on unknown type - no length */
1628193529Sjkim
1629306536Sjkim            AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n",
1630306536Sjkim                SubTable->Type);
1631193529Sjkim            return;
1632193529Sjkim        }
1633193529Sjkim
1634193529Sjkim        AcpiOsPrintf ("\n");
1635193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
1636306536Sjkim            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        {
1650306536Sjkim            BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable,
1651306536Sjkim                SubTableLength);
1652197104Sjkim            SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
1653197104Sjkim
1654197104Sjkim            while (BankCount)
1655197104Sjkim            {
1656197104Sjkim                AcpiOsPrintf ("\n");
1657197104Sjkim                Status = AcpiDmDumpTable (Length, Offset, BankTable,
1658306536Sjkim                    sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
1659197104Sjkim                if (ACPI_FAILURE (Status))
1660197104Sjkim                {
1661197104Sjkim                    return;
1662197104Sjkim                }
1663306536Sjkim
1664197104Sjkim                Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
1665197104Sjkim                BankTable++;
1666197104Sjkim                BankCount--;
1667197104Sjkim            }
1668197104Sjkim        }
1669197104Sjkim
1670281075Sdim        /* Point to next subtable */
1671197104Sjkim
1672193529Sjkim        SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength);
1673193529Sjkim    }
1674193529Sjkim}
1675193529Sjkim
1676193529Sjkim
1677193529Sjkim/*******************************************************************************
1678193529Sjkim *
1679284460Sjkim * FUNCTION:    AcpiDmDumpIort
1680284460Sjkim *
1681284460Sjkim * PARAMETERS:  Table               - A IORT table
1682284460Sjkim *
1683284460Sjkim * RETURN:      None
1684284460Sjkim *
1685284460Sjkim * DESCRIPTION: Format the contents of a IORT
1686284460Sjkim *
1687284460Sjkim ******************************************************************************/
1688284460Sjkim
1689284460Sjkimvoid
1690284460SjkimAcpiDmDumpIort (
1691284460Sjkim    ACPI_TABLE_HEADER       *Table)
1692284460Sjkim{
1693284460Sjkim    ACPI_STATUS             Status;
1694284460Sjkim    ACPI_TABLE_IORT         *Iort;
1695284460Sjkim    ACPI_IORT_NODE          *IortNode;
1696284460Sjkim    ACPI_IORT_ITS_GROUP     *IortItsGroup = NULL;
1697284460Sjkim    ACPI_IORT_SMMU          *IortSmmu = NULL;
1698284460Sjkim    UINT32                  Offset;
1699284460Sjkim    UINT32                  NodeOffset;
1700284460Sjkim    UINT32                  Length;
1701284460Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
1702284460Sjkim    char                    *String;
1703284460Sjkim    UINT32                  i;
1704284460Sjkim
1705284460Sjkim
1706284460Sjkim    /* Main table */
1707284460Sjkim
1708284460Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort);
1709284460Sjkim    if (ACPI_FAILURE (Status))
1710284460Sjkim    {
1711284460Sjkim        return;
1712284460Sjkim    }
1713284460Sjkim
1714284460Sjkim    Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);
1715284460Sjkim    Offset = sizeof (ACPI_TABLE_IORT);
1716284460Sjkim
1717284460Sjkim    /* Dump the OptionalPadding (optional) */
1718284460Sjkim
1719284460Sjkim    if (Iort->NodeOffset > Offset)
1720284460Sjkim    {
1721284460Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, Table,
1722306536Sjkim            Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad);
1723284460Sjkim        if (ACPI_FAILURE (Status))
1724284460Sjkim        {
1725284460Sjkim            return;
1726284460Sjkim        }
1727284460Sjkim    }
1728284460Sjkim
1729284460Sjkim    Offset = Iort->NodeOffset;
1730284460Sjkim    while (Offset < Table->Length)
1731284460Sjkim    {
1732284460Sjkim        /* Common subtable header */
1733284460Sjkim
1734284460Sjkim        IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
1735284460Sjkim        AcpiOsPrintf ("\n");
1736284460Sjkim        Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
1737284460Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset,
1738306536Sjkim            IortNode, Length, AcpiDmTableInfoIortHdr);
1739284460Sjkim        if (ACPI_FAILURE (Status))
1740284460Sjkim        {
1741284460Sjkim            return;
1742284460Sjkim        }
1743284460Sjkim
1744284460Sjkim        NodeOffset = Length;
1745284460Sjkim
1746284460Sjkim        switch (IortNode->Type)
1747284460Sjkim        {
1748284460Sjkim        case ACPI_IORT_NODE_ITS_GROUP:
1749284460Sjkim
1750284460Sjkim            InfoTable = AcpiDmTableInfoIort0;
1751284460Sjkim            Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers);
1752284460Sjkim            IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset);
1753284460Sjkim            break;
1754284460Sjkim
1755284460Sjkim        case ACPI_IORT_NODE_NAMED_COMPONENT:
1756284460Sjkim
1757284460Sjkim            InfoTable = AcpiDmTableInfoIort1;
1758284460Sjkim            Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName);
1759284460Sjkim            String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length);
1760306536Sjkim            Length += strlen (String) + 1;
1761284460Sjkim            break;
1762284460Sjkim
1763284460Sjkim        case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
1764284460Sjkim
1765284460Sjkim            InfoTable = AcpiDmTableInfoIort2;
1766284460Sjkim            Length = IortNode->Length - NodeOffset;
1767284460Sjkim            break;
1768284460Sjkim
1769284460Sjkim        case ACPI_IORT_NODE_SMMU:
1770284460Sjkim
1771284460Sjkim            InfoTable = AcpiDmTableInfoIort3;
1772284460Sjkim            Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts);
1773284460Sjkim            IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset);
1774284460Sjkim            break;
1775284460Sjkim
1776306536Sjkim        case ACPI_IORT_NODE_SMMU_V3:
1777306536Sjkim
1778306536Sjkim            InfoTable = AcpiDmTableInfoIort4;
1779306536Sjkim            Length = IortNode->Length - NodeOffset;
1780306536Sjkim            break;
1781306536Sjkim
1782284460Sjkim        default:
1783284460Sjkim
1784284460Sjkim            AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",
1785284460Sjkim                IortNode->Type);
1786284460Sjkim
1787284460Sjkim            /* Attempt to continue */
1788284460Sjkim
1789284460Sjkim            if (!IortNode->Length)
1790284460Sjkim            {
1791284460Sjkim                AcpiOsPrintf ("Invalid zero length IORT node\n");
1792284460Sjkim                return;
1793284460Sjkim            }
1794284460Sjkim            goto NextSubTable;
1795284460Sjkim        }
1796284460Sjkim
1797284460Sjkim        /* Dump the node subtable header */
1798284460Sjkim
1799284460Sjkim        AcpiOsPrintf ("\n");
1800284460Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1801306536Sjkim            ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1802306536Sjkim            Length, InfoTable);
1803284460Sjkim        if (ACPI_FAILURE (Status))
1804284460Sjkim        {
1805284460Sjkim            return;
1806284460Sjkim        }
1807284460Sjkim
1808284460Sjkim        NodeOffset += Length;
1809284460Sjkim
1810284460Sjkim        /* Dump the node specific data */
1811284460Sjkim
1812284460Sjkim        switch (IortNode->Type)
1813284460Sjkim        {
1814284460Sjkim        case ACPI_IORT_NODE_ITS_GROUP:
1815284460Sjkim
1816284460Sjkim            /* Validate IortItsGroup to avoid compiler warnings */
1817284460Sjkim
1818284460Sjkim            if (IortItsGroup)
1819284460Sjkim            {
1820284460Sjkim                for (i = 0; i < IortItsGroup->ItsCount; i++)
1821284460Sjkim                {
1822284460Sjkim                    Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1823306536Sjkim                        ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1824306536Sjkim                        4, AcpiDmTableInfoIort0a);
1825284460Sjkim                    NodeOffset += 4;
1826284460Sjkim                }
1827284460Sjkim            }
1828284460Sjkim            break;
1829284460Sjkim
1830284460Sjkim        case ACPI_IORT_NODE_NAMED_COMPONENT:
1831284460Sjkim
1832284460Sjkim            /* Dump the Padding (optional) */
1833284460Sjkim
1834284460Sjkim            if (IortNode->Length > NodeOffset)
1835284460Sjkim            {
1836284460Sjkim                Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1837306536Sjkim                    Table, IortNode->Length - NodeOffset,
1838306536Sjkim                    AcpiDmTableInfoIort1a);
1839284460Sjkim                if (ACPI_FAILURE (Status))
1840284460Sjkim                {
1841284460Sjkim                    return;
1842284460Sjkim                }
1843284460Sjkim            }
1844284460Sjkim            break;
1845284460Sjkim
1846284460Sjkim        case ACPI_IORT_NODE_SMMU:
1847284460Sjkim
1848284460Sjkim            AcpiOsPrintf ("\n");
1849284460Sjkim
1850284460Sjkim            /* Validate IortSmmu to avoid compiler warnings */
1851284460Sjkim
1852284460Sjkim            if (IortSmmu)
1853284460Sjkim            {
1854284460Sjkim                Length = 2 * sizeof (UINT64);
1855284460Sjkim                NodeOffset = IortSmmu->GlobalInterruptOffset;
1856284460Sjkim                Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1857306536Sjkim                    ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1858306536Sjkim                    Length, AcpiDmTableInfoIort3a);
1859306536Sjkim                if (ACPI_FAILURE (Status))
1860306536Sjkim                {
1861306536Sjkim                    return;
1862306536Sjkim                }
1863284460Sjkim
1864284460Sjkim                NodeOffset = IortSmmu->ContextInterruptOffset;
1865284460Sjkim                for (i = 0; i < IortSmmu->ContextInterruptCount; i++)
1866284460Sjkim                {
1867284460Sjkim                    Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1868306536Sjkim                        ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1869306536Sjkim                        8, AcpiDmTableInfoIort3b);
1870306536Sjkim                    if (ACPI_FAILURE (Status))
1871306536Sjkim                    {
1872306536Sjkim                        return;
1873306536Sjkim                    }
1874306536Sjkim
1875284460Sjkim                    NodeOffset += 8;
1876284460Sjkim                }
1877284460Sjkim
1878284460Sjkim                NodeOffset = IortSmmu->PmuInterruptOffset;
1879284460Sjkim                for (i = 0; i < IortSmmu->PmuInterruptCount; i++)
1880284460Sjkim                {
1881284460Sjkim                    Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1882306536Sjkim                        ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1883306536Sjkim                        8, AcpiDmTableInfoIort3c);
1884306536Sjkim                    if (ACPI_FAILURE (Status))
1885306536Sjkim                    {
1886306536Sjkim                        return;
1887306536Sjkim                    }
1888306536Sjkim
1889284460Sjkim                    NodeOffset += 8;
1890284460Sjkim                }
1891284460Sjkim            }
1892284460Sjkim            break;
1893284460Sjkim
1894284460Sjkim        default:
1895284460Sjkim
1896284460Sjkim            break;
1897284460Sjkim        }
1898284460Sjkim
1899284460Sjkim        /* Dump the ID mappings */
1900284460Sjkim
1901284460Sjkim        NodeOffset = IortNode->MappingOffset;
1902284460Sjkim        for (i = 0; i < IortNode->MappingCount; i++)
1903284460Sjkim        {
1904284460Sjkim            AcpiOsPrintf ("\n");
1905284460Sjkim            Length = sizeof (ACPI_IORT_ID_MAPPING);
1906284460Sjkim            Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1907306536Sjkim                ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1908306536Sjkim                Length, AcpiDmTableInfoIortMap);
1909306536Sjkim            if (ACPI_FAILURE (Status))
1910306536Sjkim            {
1911306536Sjkim                return;
1912306536Sjkim            }
1913306536Sjkim
1914284460Sjkim            NodeOffset += Length;
1915284460Sjkim        }
1916284460Sjkim
1917284460SjkimNextSubTable:
1918284460Sjkim        /* Point to next node subtable */
1919284460Sjkim
1920284460Sjkim        Offset += IortNode->Length;
1921284460Sjkim        IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, IortNode->Length);
1922284460Sjkim    }
1923284460Sjkim}
1924284460Sjkim
1925284460Sjkim
1926284460Sjkim/*******************************************************************************
1927284460Sjkim *
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
1962281075Sdim    /* Subtables */
1963197104Sjkim
1964197104Sjkim    SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
1965197104Sjkim    while (Offset < Table->Length)
1966197104Sjkim    {
1967281075Sdim        /* Common subtable header */
1968197104Sjkim
1969197104Sjkim        AcpiOsPrintf ("\n");
1970197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1971306536Sjkim            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
1993281075Sdim            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,
2010306536Sjkim            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,
2022306536Sjkim                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,
2087306536Sjkim                    DeviceEntry, EntryLength, InfoTable);
2088306536Sjkim                if (ACPI_FAILURE (Status))
2089306536Sjkim                {
2090306536Sjkim                    return;
2091306536Sjkim                }
2092197104Sjkim
2093197104Sjkim                EntryOffset += EntryLength;
2094197104Sjkim                DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
2095306536Sjkim                    EntryLength);
2096197104Sjkim            }
2097197104Sjkim        }
2098197104Sjkim
2099197104SjkimNextSubTable:
2100281075Sdim        /* 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 *
2110281075Sdim * FUNCTION:    AcpiDmDumpLpit
2111281075Sdim *
2112281075Sdim * PARAMETERS:  Table               - A LPIT table
2113281075Sdim *
2114281075Sdim * RETURN:      None
2115281075Sdim *
2116281075Sdim * DESCRIPTION: Format the contents of a LPIT. This table type consists
2117281075Sdim *              of an open-ended number of subtables. Note: There are no
2118281075Sdim *              entries in the main table. An LPIT consists of the table
2119281075Sdim *              header and then subtables only.
2120281075Sdim *
2121281075Sdim ******************************************************************************/
2122281075Sdim
2123281075Sdimvoid
2124281075SdimAcpiDmDumpLpit (
2125281075Sdim    ACPI_TABLE_HEADER       *Table)
2126281075Sdim{
2127281075Sdim    ACPI_STATUS             Status;
2128281075Sdim    ACPI_LPIT_HEADER        *SubTable;
2129281075Sdim    UINT32                  Length = Table->Length;
2130281075Sdim    UINT32                  Offset = sizeof (ACPI_TABLE_LPIT);
2131281075Sdim    ACPI_DMTABLE_INFO       *InfoTable;
2132281075Sdim    UINT32                  SubTableLength;
2133281075Sdim
2134281075Sdim
2135281075Sdim    /* Subtables */
2136281075Sdim
2137281075Sdim    SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
2138281075Sdim    while (Offset < Table->Length)
2139281075Sdim    {
2140281075Sdim        /* Common subtable header */
2141281075Sdim
2142281075Sdim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2143306536Sjkim            sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);
2144281075Sdim        if (ACPI_FAILURE (Status))
2145281075Sdim        {
2146281075Sdim            return;
2147281075Sdim        }
2148281075Sdim
2149281075Sdim        switch (SubTable->Type)
2150281075Sdim        {
2151281075Sdim        case ACPI_LPIT_TYPE_NATIVE_CSTATE:
2152281075Sdim
2153281075Sdim            InfoTable = AcpiDmTableInfoLpit0;
2154281075Sdim            SubTableLength = sizeof (ACPI_LPIT_NATIVE);
2155281075Sdim            break;
2156281075Sdim
2157281075Sdim        default:
2158281075Sdim
2159281075Sdim            /* Cannot continue on unknown type - no length */
2160281075Sdim
2161306536Sjkim            AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n",
2162306536Sjkim                SubTable->Type);
2163281075Sdim            return;
2164281075Sdim        }
2165281075Sdim
2166281075Sdim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2167306536Sjkim            SubTableLength, InfoTable);
2168281075Sdim        if (ACPI_FAILURE (Status))
2169281075Sdim        {
2170281075Sdim            return;
2171281075Sdim        }
2172306536Sjkim
2173281075Sdim        AcpiOsPrintf ("\n");
2174281075Sdim
2175281075Sdim        /* Point to next subtable */
2176281075Sdim
2177281075Sdim        Offset += SubTableLength;
2178281075Sdim        SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, SubTable, SubTableLength);
2179281075Sdim    }
2180281075Sdim}
2181281075Sdim
2182281075Sdim
2183281075Sdim/*******************************************************************************
2184281075Sdim *
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
2215281075Sdim    /* Subtables */
2216167802Sjkim
2217167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
2218167802Sjkim    while (Offset < Table->Length)
2219167802Sjkim    {
2220281075Sdim        /* Common subtable header */
2221167802Sjkim
2222167802Sjkim        AcpiOsPrintf ("\n");
2223193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2224306536Sjkim            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
2297281075Sdim        case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
2298281075Sdim
2299281075Sdim            InfoTable = AcpiDmTableInfoMadt13;
2300281075Sdim            break;
2301281075Sdim
2302281075Sdim        case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
2303281075Sdim
2304281075Sdim            InfoTable = AcpiDmTableInfoMadt14;
2305281075Sdim            break;
2306281075Sdim
2307284460Sjkim        case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
2308284460Sjkim
2309284460Sjkim            InfoTable = AcpiDmTableInfoMadt15;
2310284460Sjkim            break;
2311284460Sjkim
2312167802Sjkim        default:
2313250838Sjkim
2314306536Sjkim            AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",
2315306536Sjkim                SubTable->Type);
2316193529Sjkim
2317193529Sjkim            /* Attempt to continue */
2318193529Sjkim
2319193529Sjkim            if (!SubTable->Length)
2320193529Sjkim            {
2321193529Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
2322193529Sjkim                return;
2323193529Sjkim            }
2324306536Sjkim
2325193529Sjkim            goto NextSubTable;
2326193529Sjkim        }
2327193529Sjkim
2328193529Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2329306536Sjkim            SubTable->Length, InfoTable);
2330193529Sjkim        if (ACPI_FAILURE (Status))
2331193529Sjkim        {
2332167802Sjkim            return;
2333167802Sjkim        }
2334167802Sjkim
2335193529SjkimNextSubTable:
2336281075Sdim        /* Point to next subtable */
2337167802Sjkim
2338167802Sjkim        Offset += SubTable->Length;
2339306536Sjkim        SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable,
2340306536Sjkim            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
2374281075Sdim    /* 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,
2388306536Sjkim            sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
2389193529Sjkim        if (ACPI_FAILURE (Status))
2390193529Sjkim        {
2391193529Sjkim            return;
2392193529Sjkim        }
2393167802Sjkim
2394281075Sdim        /* 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,
2398306536Sjkim            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,
2448306536Sjkim            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,
2469306536Sjkim                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,
2492306536Sjkim                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,
2517306536Sjkim        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
2528306536Sjkim    SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1,
2529306536Sjkim        sizeof (ACPI_MPST_DATA_HDR));
2530228110Sjkim
2531228110Sjkim    while ((Offset < Table->Length) && SubtableCount)
2532228110Sjkim    {
2533228110Sjkim        AcpiOsPrintf ("\n");
2534228110Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2,
2535306536Sjkim            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
2577281075Sdim    /* Subtables */
2578197104Sjkim
2579197104Sjkim    SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
2580197104Sjkim    while (Offset < Table->Length)
2581197104Sjkim    {
2582281075Sdim        /* Common subtable header */
2583197104Sjkim
2584197104Sjkim        AcpiOsPrintf ("\n");
2585197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2586306536Sjkim            sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
2587197104Sjkim        if (ACPI_FAILURE (Status))
2588197104Sjkim        {
2589197104Sjkim            return;
2590197104Sjkim        }
2591197104Sjkim
2592281075Sdim        /* Point to next subtable */
2593197104Sjkim
2594197104Sjkim        Offset += sizeof (ACPI_MSCT_PROXIMITY);
2595306536Sjkim        SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable,
2596306536Sjkim            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
2630281075Sdim    /* Subtables */
2631246849Sjkim
2632246849Sjkim    SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset);
2633246849Sjkim    while (Offset < Table->Length)
2634246849Sjkim    {
2635281075Sdim        /* Common subtable header */
2636246849Sjkim
2637246849Sjkim        AcpiOsPrintf ("\n");
2638246849Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2639306536Sjkim            sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0);
2640246849Sjkim        if (ACPI_FAILURE (Status))
2641246849Sjkim        {
2642246849Sjkim            return;
2643246849Sjkim        }
2644246849Sjkim
2645281075Sdim        /* Point to next subtable */
2646246849Sjkim
2647246849Sjkim        Offset += sizeof (ACPI_MTMR_ENTRY);
2648306536Sjkim        SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, SubTable,
2649306536Sjkim            sizeof (ACPI_MTMR_ENTRY));
2650246849Sjkim    }
2651246849Sjkim}
2652246849Sjkim
2653246849Sjkim
2654246849Sjkim/*******************************************************************************
2655246849Sjkim *
2656284460Sjkim * FUNCTION:    AcpiDmDumpNfit
2657284460Sjkim *
2658284460Sjkim * PARAMETERS:  Table               - A NFIT table
2659284460Sjkim *
2660284460Sjkim * RETURN:      None
2661284460Sjkim *
2662284460Sjkim * DESCRIPTION: Format the contents of an NFIT.
2663284460Sjkim *
2664284460Sjkim ******************************************************************************/
2665284460Sjkim
2666284460Sjkimvoid
2667284460SjkimAcpiDmDumpNfit (
2668284460Sjkim    ACPI_TABLE_HEADER       *Table)
2669284460Sjkim{
2670284460Sjkim    ACPI_STATUS             Status;
2671284460Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_NFIT);
2672284460Sjkim    UINT32                  FieldOffset = 0;
2673284460Sjkim    UINT32                  Length;
2674284460Sjkim    ACPI_NFIT_HEADER        *SubTable;
2675284460Sjkim    ACPI_DMTABLE_INFO       *InfoTable;
2676284460Sjkim    ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
2677284460Sjkim    ACPI_NFIT_SMBIOS        *SmbiosInfo = NULL;
2678284460Sjkim    ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
2679284460Sjkim    UINT32                  i;
2680284460Sjkim
2681284460Sjkim
2682284460Sjkim    /* Main table */
2683284460Sjkim
2684284460Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
2685284460Sjkim    if (ACPI_FAILURE (Status))
2686284460Sjkim    {
2687284460Sjkim        return;
2688284460Sjkim    }
2689284460Sjkim
2690284460Sjkim    /* Subtables */
2691284460Sjkim
2692284460Sjkim    SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
2693284460Sjkim    while (Offset < Table->Length)
2694284460Sjkim    {
2695284460Sjkim        /* NFIT subtable header */
2696284460Sjkim
2697284460Sjkim        AcpiOsPrintf ("\n");
2698284460Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2699306536Sjkim            SubTable->Length, AcpiDmTableInfoNfitHdr);
2700284460Sjkim        if (ACPI_FAILURE (Status))
2701284460Sjkim        {
2702284460Sjkim            return;
2703284460Sjkim        }
2704284460Sjkim
2705284460Sjkim        switch (SubTable->Type)
2706284460Sjkim        {
2707284460Sjkim        case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
2708284460Sjkim
2709284460Sjkim            InfoTable = AcpiDmTableInfoNfit0;
2710284460Sjkim            break;
2711284460Sjkim
2712284460Sjkim        case ACPI_NFIT_TYPE_MEMORY_MAP:
2713284460Sjkim
2714284460Sjkim            InfoTable = AcpiDmTableInfoNfit1;
2715284460Sjkim            break;
2716284460Sjkim
2717284460Sjkim        case ACPI_NFIT_TYPE_INTERLEAVE:
2718284460Sjkim
2719284460Sjkim            /* Has a variable number of 32-bit values at the end */
2720284460Sjkim
2721284460Sjkim            InfoTable = AcpiDmTableInfoNfit2;
2722284460Sjkim            Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, SubTable);
2723284460Sjkim            FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);
2724284460Sjkim            break;
2725284460Sjkim
2726284460Sjkim        case ACPI_NFIT_TYPE_SMBIOS:
2727284460Sjkim
2728284460Sjkim            SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, SubTable);
2729284460Sjkim            InfoTable = AcpiDmTableInfoNfit3;
2730284460Sjkim            break;
2731284460Sjkim
2732284460Sjkim        case ACPI_NFIT_TYPE_CONTROL_REGION:
2733284460Sjkim
2734284460Sjkim            InfoTable = AcpiDmTableInfoNfit4;
2735284460Sjkim            break;
2736284460Sjkim
2737284460Sjkim        case ACPI_NFIT_TYPE_DATA_REGION:
2738284460Sjkim
2739284460Sjkim            InfoTable = AcpiDmTableInfoNfit5;
2740284460Sjkim            break;
2741284460Sjkim
2742284460Sjkim        case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
2743284460Sjkim
2744284460Sjkim            /* Has a variable number of 64-bit addresses at the end */
2745284460Sjkim
2746284460Sjkim            InfoTable = AcpiDmTableInfoNfit6;
2747284460Sjkim            Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, SubTable);
2748284460Sjkim            FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64);
2749284460Sjkim            break;
2750284460Sjkim
2751284460Sjkim        default:
2752306536Sjkim            AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
2753306536Sjkim                SubTable->Type);
2754284460Sjkim
2755284460Sjkim            /* Attempt to continue */
2756284460Sjkim
2757284460Sjkim            if (!SubTable->Length)
2758284460Sjkim            {
2759284460Sjkim                AcpiOsPrintf ("Invalid zero length subtable\n");
2760284460Sjkim                return;
2761284460Sjkim            }
2762284460Sjkim            goto NextSubTable;
2763284460Sjkim        }
2764284460Sjkim
2765284460Sjkim        AcpiOsPrintf ("\n");
2766284460Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2767306536Sjkim            SubTable->Length, InfoTable);
2768284460Sjkim        if (ACPI_FAILURE (Status))
2769284460Sjkim        {
2770284460Sjkim            return;
2771284460Sjkim        }
2772284460Sjkim
2773284460Sjkim        /* Per-subtable variable-length fields */
2774284460Sjkim
2775284460Sjkim        switch (SubTable->Type)
2776284460Sjkim        {
2777284460Sjkim        case ACPI_NFIT_TYPE_INTERLEAVE:
2778284460Sjkim
2779284460Sjkim            for (i = 0; i < Interleave->LineCount; i++)
2780284460Sjkim            {
2781284460Sjkim                Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
2782306536Sjkim                    &Interleave->LineOffset[i],
2783306536Sjkim                    sizeof (UINT32), AcpiDmTableInfoNfit2a);
2784306536Sjkim                if (ACPI_FAILURE (Status))
2785306536Sjkim                {
2786306536Sjkim                    return;
2787306536Sjkim                }
2788306536Sjkim
2789284460Sjkim                FieldOffset += sizeof (UINT32);
2790284460Sjkim            }
2791284460Sjkim            break;
2792284460Sjkim
2793284460Sjkim        case ACPI_NFIT_TYPE_SMBIOS:
2794284460Sjkim
2795306536Sjkim            Length = SubTable->Length -
2796306536Sjkim                sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
2797306536Sjkim
2798284460Sjkim            if (Length)
2799284460Sjkim            {
2800284460Sjkim                Status = AcpiDmDumpTable (Table->Length,
2801306536Sjkim                    sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
2802306536Sjkim                    SmbiosInfo,
2803306536Sjkim                    Length, AcpiDmTableInfoNfit3a);
2804284460Sjkim                if (ACPI_FAILURE (Status))
2805284460Sjkim                {
2806284460Sjkim                    return;
2807284460Sjkim                }
2808284460Sjkim            }
2809284460Sjkim
2810284460Sjkim            break;
2811284460Sjkim
2812284460Sjkim        case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
2813284460Sjkim
2814284460Sjkim            for (i = 0; i < Hint->HintCount; i++)
2815284460Sjkim            {
2816284460Sjkim                Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
2817306536Sjkim                    &Hint->HintAddress[i],
2818306536Sjkim                    sizeof (UINT64), AcpiDmTableInfoNfit6a);
2819306536Sjkim                if (ACPI_FAILURE (Status))
2820306536Sjkim                {
2821306536Sjkim                    return;
2822306536Sjkim                }
2823306536Sjkim
2824284460Sjkim                FieldOffset += sizeof (UINT64);
2825284460Sjkim            }
2826284460Sjkim            break;
2827284460Sjkim
2828284460Sjkim        default:
2829284460Sjkim            break;
2830284460Sjkim        }
2831284460Sjkim
2832284460SjkimNextSubTable:
2833284460Sjkim        /* Point to next subtable */
2834284460Sjkim
2835284460Sjkim        Offset += SubTable->Length;
2836284460Sjkim        SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, SubTable, SubTable->Length);
2837284460Sjkim    }
2838284460Sjkim}
2839284460Sjkim
2840284460Sjkim
2841284460Sjkim/*******************************************************************************
2842284460Sjkim *
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;
2860281075Sdim    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
2873281075Sdim    /* Subtables */
2874228110Sjkim
2875228110Sjkim    SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
2876228110Sjkim    while (Offset < Table->Length)
2877228110Sjkim    {
2878281075Sdim        /* Common subtable header */
2879281075Sdim
2880228110Sjkim        AcpiOsPrintf ("\n");
2881228110Sjkim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2882306536Sjkim            SubTable->Header.Length, AcpiDmTableInfoPcctHdr);
2883228110Sjkim        if (ACPI_FAILURE (Status))
2884228110Sjkim        {
2885228110Sjkim            return;
2886228110Sjkim        }
2887228110Sjkim
2888281075Sdim        switch (SubTable->Header.Type)
2889281075Sdim        {
2890281075Sdim        case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
2891228110Sjkim
2892281075Sdim            InfoTable = AcpiDmTableInfoPcct0;
2893281075Sdim            break;
2894281075Sdim
2895281075Sdim        case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
2896281075Sdim
2897281075Sdim            InfoTable = AcpiDmTableInfoPcct1;
2898281075Sdim            break;
2899281075Sdim
2900306536Sjkim        case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
2901306536Sjkim
2902306536Sjkim            InfoTable = AcpiDmTableInfoPcct2;
2903306536Sjkim            break;
2904306536Sjkim
2905281075Sdim        default:
2906281075Sdim
2907281075Sdim            AcpiOsPrintf (
2908281075Sdim                "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
2909281075Sdim                SubTable->Header.Type);
2910281075Sdim            return;
2911281075Sdim        }
2912281075Sdim
2913281075Sdim        AcpiOsPrintf ("\n");
2914281075Sdim        Status = AcpiDmDumpTable (Length, Offset, SubTable,
2915306536Sjkim            SubTable->Header.Length, InfoTable);
2916281075Sdim        if (ACPI_FAILURE (Status))
2917281075Sdim        {
2918281075Sdim            return;
2919281075Sdim        }
2920281075Sdim
2921281075Sdim        /* Point to next subtable */
2922281075Sdim
2923228110Sjkim        Offset += SubTable->Header.Length;
2924228110Sjkim        SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable,
2925306536Sjkim            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,
2977306536Sjkim            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,
2996306536Sjkim            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,
3015306536Sjkim                Offset + MemOffset, MemSubTable,
3016306536Sjkim                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,
3035306536Sjkim                Offset + MemOffset, MemSubTable,
3036306536Sjkim                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,
3054306536Sjkim                    Offset + MemOffset + DomainOffset, DomainArray,
3055306536Sjkim                    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 (
3069281075Sdim                    "\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,
3085306536Sjkim                    Offset + MemOffset + DimmOffset, DimmSubTable,
3086306536Sjkim                    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,
3105306536Sjkim                    Offset + MemOffset + DimmOffset, DimmSubTable,
3106306536Sjkim                    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);
3153306536Sjkim    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
3166306536Sjkim    SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);
3167228110Sjkim    while (Offset < S3ptTable->Length)
3168228110Sjkim    {
3169281075Sdim        /* Common subtable header */
3170228110Sjkim
3171228110Sjkim        AcpiOsPrintf ("\n");
3172228110Sjkim        Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
3173306536Sjkim            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
3193306536Sjkim            AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n",
3194306536Sjkim                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,
3208306536Sjkim            SubTable->Length, InfoTable);
3209228110Sjkim        if (ACPI_FAILURE (Status))
3210228110Sjkim        {
3211228110Sjkim            return 0;
3212228110Sjkim        }
3213228110Sjkim
3214228110SjkimNextSubTable:
3215281075Sdim        /* Point to next subtable */
3216228110Sjkim
3217228110Sjkim        Offset += SubTable->Length;
3218306536Sjkim        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{
3241306536Sjkim
3242306536Sjkim    (void) AcpiDmDumpTable (Table->Length, sizeof (ACPI_TABLE_HEADER), Table,
3243306536Sjkim        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            {
3296306536Sjkim                AcpiOsPrintf (
3297306536Sjkim                    "\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
3356281075Sdim    /* Subtables */
3357167802Sjkim
3358167802Sjkim    SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
3359167802Sjkim    while (Offset < Table->Length)
3360167802Sjkim    {
3361281075Sdim        /* Common subtable header */
3362193529Sjkim
3363193529Sjkim        AcpiOsPrintf ("\n");
3364193529Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3365306536Sjkim            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
3388281075Sdim        case ACPI_SRAT_TYPE_GICC_AFFINITY:
3389281075Sdim
3390281075Sdim            InfoTable = AcpiDmTableInfoSrat3;
3391281075Sdim            break;
3392281075Sdim
3393167802Sjkim        default:
3394306536Sjkim            AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n",
3395306536Sjkim                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,
3409306536Sjkim            SubTable->Length, InfoTable);
3410193529Sjkim        if (ACPI_FAILURE (Status))
3411193529Sjkim        {
3412193529Sjkim            return;
3413193529Sjkim        }
3414167802Sjkim
3415193529SjkimNextSubTable:
3416281075Sdim        /* Point to next subtable */
3417167802Sjkim
3418167802Sjkim        Offset += SubTable->Length;
3419306536Sjkim        SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable,
3420306536Sjkim            SubTable->Length);
3421167802Sjkim    }
3422167802Sjkim}
3423167802Sjkim
3424197104Sjkim
3425197104Sjkim/*******************************************************************************
3426197104Sjkim *
3427284460Sjkim * FUNCTION:    AcpiDmDumpStao
3428284460Sjkim *
3429284460Sjkim * PARAMETERS:  Table               - A STAO table
3430284460Sjkim *
3431284460Sjkim * RETURN:      None
3432284460Sjkim *
3433284460Sjkim * DESCRIPTION: Format the contents of a STAO. This is a variable-length
3434284460Sjkim *              table that contains an open-ended number of ASCII strings
3435284460Sjkim *              at the end of the table.
3436284460Sjkim *
3437284460Sjkim ******************************************************************************/
3438284460Sjkim
3439284460Sjkimvoid
3440284460SjkimAcpiDmDumpStao (
3441284460Sjkim    ACPI_TABLE_HEADER       *Table)
3442284460Sjkim{
3443284460Sjkim    ACPI_STATUS             Status;
3444284460Sjkim    char                    *Namepath;
3445284460Sjkim    UINT32                  Length = Table->Length;
3446284460Sjkim    UINT32                  StringLength;
3447284460Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_STAO);
3448284460Sjkim
3449284460Sjkim
3450284460Sjkim    /* Main table */
3451284460Sjkim
3452284460Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoStao);
3453284460Sjkim    if (ACPI_FAILURE (Status))
3454284460Sjkim    {
3455284460Sjkim        return;
3456284460Sjkim    }
3457284460Sjkim
3458284460Sjkim    /* The rest of the table consists of Namepath strings */
3459284460Sjkim
3460284460Sjkim    while (Offset < Table->Length)
3461284460Sjkim    {
3462284460Sjkim        Namepath = ACPI_ADD_PTR (char, Table, Offset);
3463306536Sjkim        StringLength = strlen (Namepath) + 1;
3464284460Sjkim
3465284460Sjkim        AcpiDmLineHeader (Offset, StringLength, "Namestring");
3466284460Sjkim        AcpiOsPrintf ("\"%s\"\n", Namepath);
3467284460Sjkim
3468284460Sjkim        /* Point to next namepath */
3469284460Sjkim
3470284460Sjkim        Offset += StringLength;
3471284460Sjkim    }
3472284460Sjkim}
3473284460Sjkim
3474284460Sjkim
3475284460Sjkim/*******************************************************************************
3476284460Sjkim *
3477306536Sjkim * FUNCTION:    AcpiDmDumpTcpa
3478306536Sjkim *
3479306536Sjkim * PARAMETERS:  Table               - A TCPA table
3480306536Sjkim *
3481306536Sjkim * RETURN:      None
3482306536Sjkim *
3483306536Sjkim * DESCRIPTION: Format the contents of a TCPA.
3484306536Sjkim *
3485306536Sjkim * NOTE:        There are two versions of the table with the same signature:
3486306536Sjkim *              the client version and the server version. The common
3487306536Sjkim *              PlatformClass field is used to differentiate the two types of
3488306536Sjkim *              tables.
3489306536Sjkim *
3490306536Sjkim ******************************************************************************/
3491306536Sjkim
3492306536Sjkimvoid
3493306536SjkimAcpiDmDumpTcpa (
3494306536Sjkim    ACPI_TABLE_HEADER       *Table)
3495306536Sjkim{
3496306536Sjkim    UINT32                  Offset = sizeof (ACPI_TABLE_TCPA_HDR);
3497306536Sjkim    ACPI_TABLE_TCPA_HDR     *CommonHeader = ACPI_CAST_PTR (
3498306536Sjkim                                ACPI_TABLE_TCPA_HDR, Table);
3499306536Sjkim    ACPI_TABLE_TCPA_HDR     *SubTable = ACPI_ADD_PTR (
3500306536Sjkim                                ACPI_TABLE_TCPA_HDR, Table, Offset);
3501306536Sjkim    ACPI_STATUS             Status;
3502306536Sjkim
3503306536Sjkim
3504306536Sjkim    /* Main table */
3505306536Sjkim
3506306536Sjkim    Status = AcpiDmDumpTable (Table->Length, 0, Table,
3507306536Sjkim        0, AcpiDmTableInfoTcpaHdr);
3508306536Sjkim    if (ACPI_FAILURE (Status))
3509306536Sjkim    {
3510306536Sjkim        return;
3511306536Sjkim    }
3512306536Sjkim
3513306536Sjkim    /*
3514306536Sjkim     * Examine the PlatformClass field to determine the table type.
3515306536Sjkim     * Either a client or server table. Only one.
3516306536Sjkim     */
3517306536Sjkim    switch (CommonHeader->PlatformClass)
3518306536Sjkim    {
3519306536Sjkim    case ACPI_TCPA_CLIENT_TABLE:
3520306536Sjkim
3521306536Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3522306536Sjkim            Table->Length - Offset, AcpiDmTableInfoTcpaClient);
3523306536Sjkim        break;
3524306536Sjkim
3525306536Sjkim    case ACPI_TCPA_SERVER_TABLE:
3526306536Sjkim
3527306536Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3528306536Sjkim            Table->Length - Offset, AcpiDmTableInfoTcpaServer);
3529306536Sjkim        break;
3530306536Sjkim
3531306536Sjkim    default:
3532306536Sjkim
3533306536Sjkim        AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
3534306536Sjkim            CommonHeader->PlatformClass);
3535306536Sjkim        Status = AE_ERROR;
3536306536Sjkim        break;
3537306536Sjkim    }
3538306536Sjkim
3539306536Sjkim    if (ACPI_FAILURE (Status))
3540306536Sjkim    {
3541306536Sjkim        AcpiOsPrintf ("\n**** Cannot disassemble TCPA table\n");
3542306536Sjkim    }
3543306536Sjkim}
3544306536Sjkim
3545306536Sjkim
3546306536Sjkim/*******************************************************************************
3547306536Sjkim *
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
3575281075Sdim    /* Subtables */
3576246849Sjkim
3577246849Sjkim    SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset);
3578246849Sjkim    while (Offset < Table->Length)
3579246849Sjkim    {
3580281075Sdim        /* Common subtable header */
3581246849Sjkim
3582246849Sjkim        AcpiOsPrintf ("\n");
3583246849Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3584306536Sjkim            sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0);
3585246849Sjkim        if (ACPI_FAILURE (Status))
3586246849Sjkim        {
3587246849Sjkim            return;
3588246849Sjkim        }
3589246849Sjkim
3590281075Sdim        /* Point to next subtable */
3591246849Sjkim
3592246849Sjkim        Offset += sizeof (ACPI_VRTC_ENTRY);
3593306536Sjkim        SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, SubTable,
3594306536Sjkim            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
3628281075Sdim    /* Subtables */
3629197104Sjkim
3630197104Sjkim    SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
3631197104Sjkim    while (Offset < Table->Length)
3632197104Sjkim    {
3633281075Sdim        /* Common subtable header */
3634197104Sjkim
3635197104Sjkim        AcpiOsPrintf ("\n");
3636197104Sjkim        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3637306536Sjkim            sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0);
3638197104Sjkim        if (ACPI_FAILURE (Status))
3639197104Sjkim        {
3640197104Sjkim            return;
3641197104Sjkim        }
3642197104Sjkim
3643281075Sdim        /* Point to next subtable */
3644197104Sjkim
3645197104Sjkim        Offset += sizeof (ACPI_WDAT_ENTRY);
3646306536Sjkim        SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable,
3647306536Sjkim            sizeof (ACPI_WDAT_ENTRY));
3648197104Sjkim    }
3649197104Sjkim}
3650284460Sjkim
3651306536Sjkim
3652284460Sjkim/*******************************************************************************
3653284460Sjkim *
3654284460Sjkim * FUNCTION:    AcpiDmDumpWpbt
3655284460Sjkim *
3656284460Sjkim * PARAMETERS:  Table               - A WPBT table
3657284460Sjkim *
3658284460Sjkim * RETURN:      None
3659284460Sjkim *
3660284460Sjkim * DESCRIPTION: Format the contents of a WPBT. This table type consists
3661284460Sjkim *              of an open-ended arguments buffer at the end of the table.
3662284460Sjkim *
3663284460Sjkim ******************************************************************************/
3664284460Sjkim
3665284460Sjkimvoid
3666284460SjkimAcpiDmDumpWpbt (
3667284460Sjkim    ACPI_TABLE_HEADER       *Table)
3668284460Sjkim{
3669284460Sjkim    ACPI_STATUS             Status;
3670284460Sjkim    ACPI_TABLE_WPBT         *SubTable;
3671284460Sjkim    UINT32                  Length = Table->Length;
3672284460Sjkim    UINT16                  ArgumentsLength;
3673284460Sjkim
3674284460Sjkim
3675284460Sjkim    /* Dump the main table */
3676284460Sjkim
3677284460Sjkim    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoWpbt);
3678284460Sjkim    if (ACPI_FAILURE (Status))
3679284460Sjkim    {
3680284460Sjkim        return;
3681284460Sjkim    }
3682284460Sjkim
3683284460Sjkim    /* Extract the arguments buffer length from the main table */
3684284460Sjkim
3685284460Sjkim    SubTable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table);
3686284460Sjkim    ArgumentsLength = SubTable->ArgumentsLength;
3687284460Sjkim
3688284460Sjkim    /* Dump the arguments buffer */
3689284460Sjkim
3690306536Sjkim    (void) AcpiDmDumpTable (Table->Length, 0, Table, ArgumentsLength,
3691284460Sjkim        AcpiDmTableInfoWpbt0);
3692284460Sjkim}
3693