1 /******************************************************************************
3 * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code
5 *****************************************************************************/
8 * Copyright (C) 2000 - 2015, Intel Corp.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
49 /* This module used for application-level code only */
51 #define _COMPONENT ACPI_CA_DISASSEMBLER
52 ACPI_MODULE_NAME ("dmtbdump")
55 /* Local prototypes */
58 AcpiDmValidateFadtLength (
63 /*******************************************************************************
65 * FUNCTION: AcpiDmDumpBuffer
67 * PARAMETERS: Table - ACPI Table or subtable
68 * BufferOffset - Offset of buffer from Table above
69 * Length - Length of the buffer
70 * AbsoluteOffset - Offset of buffer in the main ACPI table
71 * Header - Name of the buffer field (printed on the
76 * DESCRIPTION: Format the contents of an arbitrary length data buffer (in the
77 * disassembler output format.)
79 ******************************************************************************/
86 UINT32 AbsoluteOffset,
98 Buffer = ACPI_CAST_PTR (UINT8, Table) + BufferOffset;
105 /* Insert a backslash - line continuation character */
109 AcpiOsPrintf ("\\\n ");
113 AcpiOsPrintf ("%.02X ", *Buffer);
123 /*******************************************************************************
125 * FUNCTION: AcpiDmDumpUnicode
127 * PARAMETERS: Table - ACPI Table or subtable
128 * BufferOffset - Offset of buffer from Table above
129 * ByteLength - Length of the buffer
133 * DESCRIPTION: Validate and dump the contents of a buffer that contains
134 * unicode data. The output is a standard ASCII string. If it
135 * appears that the data is not unicode, the buffer is dumped
138 ******************************************************************************/
151 Buffer = ((UINT8 *) Table) + BufferOffset;
152 Length = ByteLength - 2; /* Last two bytes are the null terminator */
154 /* Ensure all low bytes are entirely printable ASCII */
156 for (i = 0; i < Length; i += 2)
158 if (!ACPI_IS_PRINT (Buffer[i]))
164 /* Ensure all high bytes are zero */
166 for (i = 1; i < Length; i += 2)
174 /* Dump the buffer as a normal string */
177 for (i = 0; i < Length; i += 2)
179 AcpiOsPrintf ("%c", Buffer[i]);
181 AcpiOsPrintf ("\"\n");
185 AcpiDmDumpBuffer (Table, BufferOffset, ByteLength,
191 /*******************************************************************************
193 * FUNCTION: AcpiDmDumpRsdp
195 * PARAMETERS: Table - A RSDP
197 * RETURN: Length of the table (there is not always a length field,
198 * use revision or length if available (ACPI 2.0+))
200 * DESCRIPTION: Format the contents of a RSDP
202 ******************************************************************************/
206 ACPI_TABLE_HEADER *Table)
208 ACPI_TABLE_RSDP *Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table);
209 UINT32 Length = sizeof (ACPI_RSDP_COMMON);
213 /* Dump the common ACPI 1.0 portion */
215 AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1);
217 /* Validate the first checksum */
219 Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON),
221 if (Checksum != Rsdp->Checksum)
223 AcpiOsPrintf ("/* Incorrect Checksum above, should be 0x%2.2X */\n",
227 /* The RSDP for ACPI 2.0+ contains more data and has a Length field */
229 if (Rsdp->Revision > 0)
231 Length = Rsdp->Length;
232 AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2);
234 /* Validate the extended checksum over entire RSDP */
236 Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP),
237 Rsdp->ExtendedChecksum);
238 if (Checksum != Rsdp->ExtendedChecksum)
241 "/* Incorrect Extended Checksum above, should be 0x%2.2X */\n",
250 /*******************************************************************************
252 * FUNCTION: AcpiDmDumpRsdt
254 * PARAMETERS: Table - A RSDT
258 * DESCRIPTION: Format the contents of a RSDT
260 ******************************************************************************/
264 ACPI_TABLE_HEADER *Table)
272 /* Point to start of table pointer array */
274 Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry;
275 Offset = sizeof (ACPI_TABLE_HEADER);
277 /* RSDT uses 32-bit pointers */
279 Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32);
281 for (i = 0; i < Entries; i++)
283 AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i);
284 AcpiOsPrintf ("%8.8X\n", Array[i]);
285 Offset += sizeof (UINT32);
290 /*******************************************************************************
292 * FUNCTION: AcpiDmDumpXsdt
294 * PARAMETERS: Table - A XSDT
298 * DESCRIPTION: Format the contents of a XSDT
300 ******************************************************************************/
304 ACPI_TABLE_HEADER *Table)
312 /* Point to start of table pointer array */
314 Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry;
315 Offset = sizeof (ACPI_TABLE_HEADER);
317 /* XSDT uses 64-bit pointers */
319 Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64);
321 for (i = 0; i < Entries; i++)
323 AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i);
324 AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i]));
325 Offset += sizeof (UINT64);
330 /*******************************************************************************
332 * FUNCTION: AcpiDmDumpFadt
334 * PARAMETERS: Table - A FADT
338 * DESCRIPTION: Format the contents of a FADT
340 * NOTE: We cannot depend on the FADT version to indicate the actual
341 * contents of the FADT because of BIOS bugs. The table length
342 * is the only reliable indicator.
344 ******************************************************************************/
348 ACPI_TABLE_HEADER *Table)
351 /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */
353 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt1);
355 /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */
357 if ((Table->Length > ACPI_FADT_V1_SIZE) &&
358 (Table->Length <= ACPI_FADT_V2_SIZE))
360 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt2);
363 /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */
365 else if (Table->Length > ACPI_FADT_V2_SIZE)
367 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt3);
369 /* Check for FADT revision 5 fields and up (ACPI 5.0+) */
371 if (Table->Length > ACPI_FADT_V3_SIZE)
373 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt5);
376 /* Check for FADT revision 6 fields and up (ACPI 6.0+) */
378 if (Table->Length > ACPI_FADT_V3_SIZE)
380 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt6);
384 /* Validate various fields in the FADT, including length */
386 AcpiTbCreateLocalFadt (Table, Table->Length);
388 /* Validate FADT length against the revision */
390 AcpiDmValidateFadtLength (Table->Revision, Table->Length);
394 /*******************************************************************************
396 * FUNCTION: AcpiDmValidateFadtLength
398 * PARAMETERS: Revision - FADT revision (Header->Revision)
399 * Length - FADT length (Header->Length
403 * DESCRIPTION: Check the FADT revision against the expected table length for
404 * that revision. Issue a warning if the length is not what was
405 * expected. This seems to be such a common BIOS bug that the
406 * FADT revision has been rendered virtually meaningless.
408 ******************************************************************************/
411 AcpiDmValidateFadtLength (
415 UINT32 ExpectedLength;
422 AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n");
427 ExpectedLength = ACPI_FADT_V1_SIZE;
432 ExpectedLength = ACPI_FADT_V2_SIZE;
438 ExpectedLength = ACPI_FADT_V3_SIZE;
443 ExpectedLength = ACPI_FADT_V5_SIZE;
451 if (Length == ExpectedLength)
457 "\n// ACPI Warning: FADT revision %X does not match length: found %X expected %X\n",
458 Revision, Length, ExpectedLength);
462 /*******************************************************************************
464 * FUNCTION: AcpiDmDumpAsf
466 * PARAMETERS: Table - A ASF table
470 * DESCRIPTION: Format the contents of a ASF table
472 ******************************************************************************/
476 ACPI_TABLE_HEADER *Table)
479 UINT32 Offset = sizeof (ACPI_TABLE_HEADER);
480 ACPI_ASF_INFO *SubTable;
481 ACPI_DMTABLE_INFO *InfoTable;
482 ACPI_DMTABLE_INFO *DataInfoTable = NULL;
483 UINT8 *DataTable = NULL;
484 UINT32 DataCount = 0;
485 UINT32 DataLength = 0;
486 UINT32 DataOffset = 0;
491 /* No main table, only subtables */
493 SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
494 while (Offset < Table->Length)
496 /* Common subtable header */
498 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
499 SubTable->Header.Length, AcpiDmTableInfoAsfHdr);
500 if (ACPI_FAILURE (Status))
505 /* The actual type is the lower 7 bits of Type */
507 Type = (UINT8) (SubTable->Header.Type & 0x7F);
511 case ACPI_ASF_TYPE_INFO:
513 InfoTable = AcpiDmTableInfoAsf0;
516 case ACPI_ASF_TYPE_ALERT:
518 InfoTable = AcpiDmTableInfoAsf1;
519 DataInfoTable = AcpiDmTableInfoAsf1a;
520 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT));
521 DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts;
522 DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength;
523 DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
526 case ACPI_ASF_TYPE_CONTROL:
528 InfoTable = AcpiDmTableInfoAsf2;
529 DataInfoTable = AcpiDmTableInfoAsf2a;
530 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE));
531 DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls;
532 DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength;
533 DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
536 case ACPI_ASF_TYPE_BOOT:
538 InfoTable = AcpiDmTableInfoAsf3;
541 case ACPI_ASF_TYPE_ADDRESS:
543 InfoTable = AcpiDmTableInfoAsf4;
544 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS));
545 DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices;
546 DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
551 AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n", SubTable->Header.Type);
555 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
556 SubTable->Header.Length, InfoTable);
557 if (ACPI_FAILURE (Status))
562 /* Dump variable-length extra data */
566 case ACPI_ASF_TYPE_ALERT:
567 case ACPI_ASF_TYPE_CONTROL:
569 for (i = 0; i < DataCount; i++)
572 Status = AcpiDmDumpTable (Table->Length, DataOffset,
573 DataTable, DataLength, DataInfoTable);
574 if (ACPI_FAILURE (Status))
579 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
580 DataOffset += DataLength;
584 case ACPI_ASF_TYPE_ADDRESS:
586 for (i = 0; i < DataLength; i++)
590 AcpiDmLineHeader (DataOffset, 1, "Addresses");
593 AcpiOsPrintf ("%2.2X ", *DataTable);
596 if (DataOffset > Table->Length)
598 AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure! (ASF! table)\n");
613 /* Point to next subtable */
615 if (!SubTable->Header.Length)
617 AcpiOsPrintf ("Invalid zero subtable header length\n");
621 Offset += SubTable->Header.Length;
622 SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable, SubTable->Header.Length);
627 /*******************************************************************************
629 * FUNCTION: AcpiDmDumpCpep
631 * PARAMETERS: Table - A CPEP table
635 * DESCRIPTION: Format the contents of a CPEP. This table type consists
636 * of an open-ended number of subtables.
638 ******************************************************************************/
642 ACPI_TABLE_HEADER *Table)
645 ACPI_CPEP_POLLING *SubTable;
646 UINT32 Length = Table->Length;
647 UINT32 Offset = sizeof (ACPI_TABLE_CPEP);
652 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
653 if (ACPI_FAILURE (Status))
660 SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
661 while (Offset < Table->Length)
664 Status = AcpiDmDumpTable (Length, Offset, SubTable,
665 SubTable->Header.Length, AcpiDmTableInfoCpep0);
666 if (ACPI_FAILURE (Status))
671 /* Point to next subtable */
673 Offset += SubTable->Header.Length;
674 SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable,
675 SubTable->Header.Length);
680 /*******************************************************************************
682 * FUNCTION: AcpiDmDumpCsrt
684 * PARAMETERS: Table - A CSRT table
688 * DESCRIPTION: Format the contents of a CSRT. This table type consists
689 * of an open-ended number of subtables.
691 ******************************************************************************/
695 ACPI_TABLE_HEADER *Table)
698 ACPI_CSRT_GROUP *SubTable;
699 ACPI_CSRT_SHARED_INFO *SharedInfoTable;
700 ACPI_CSRT_DESCRIPTOR *SubSubTable;
701 UINT32 Length = Table->Length;
702 UINT32 Offset = sizeof (ACPI_TABLE_CSRT);
708 /* The main table only contains the ACPI header, thus already handled */
710 /* Subtables (Resource Groups) */
712 SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
713 while (Offset < Table->Length)
715 /* Resource group subtable */
718 Status = AcpiDmDumpTable (Length, Offset, SubTable,
719 SubTable->Length, AcpiDmTableInfoCsrt0);
720 if (ACPI_FAILURE (Status))
725 /* Shared info subtable (One per resource group) */
727 SubOffset = sizeof (ACPI_CSRT_GROUP);
728 SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,
732 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
733 sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
734 if (ACPI_FAILURE (Status))
739 SubOffset += SubTable->SharedInfoLength;
741 /* Sub-Subtables (Resource Descriptors) */
743 SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
746 while ((SubOffset < SubTable->Length) &&
747 ((Offset + SubOffset) < Table->Length))
750 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubTable,
751 SubSubTable->Length, AcpiDmTableInfoCsrt2);
752 if (ACPI_FAILURE (Status))
757 SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
759 /* Resource-specific info buffer */
761 InfoLength = SubSubTable->Length - SubSubOffset;
764 Status = AcpiDmDumpTable (Length,
765 Offset + SubOffset + SubSubOffset, Table,
766 InfoLength, AcpiDmTableInfoCsrt2a);
767 if (ACPI_FAILURE (Status))
771 SubSubOffset += InfoLength;
774 /* Point to next sub-subtable */
776 SubOffset += SubSubTable->Length;
777 SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable,
778 SubSubTable->Length);
781 /* Point to next subtable */
783 Offset += SubTable->Length;
784 SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable,
790 /*******************************************************************************
792 * FUNCTION: AcpiDmDumpDbg2
794 * PARAMETERS: Table - A DBG2 table
798 * DESCRIPTION: Format the contents of a DBG2. This table type consists
799 * of an open-ended number of subtables.
801 ******************************************************************************/
805 ACPI_TABLE_HEADER *Table)
808 ACPI_DBG2_DEVICE *SubTable;
809 UINT32 Length = Table->Length;
810 UINT32 Offset = sizeof (ACPI_TABLE_DBG2);
813 UINT32 AbsoluteOffset;
819 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
820 if (ACPI_FAILURE (Status))
827 SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
828 while (Offset < Table->Length)
831 Status = AcpiDmDumpTable (Length, Offset, SubTable,
832 SubTable->Length, AcpiDmTableInfoDbg2Device);
833 if (ACPI_FAILURE (Status))
838 /* Dump the BaseAddress array */
840 for (i = 0; i < SubTable->RegisterCount; i++)
842 ArrayOffset = SubTable->BaseAddressOffset +
843 (sizeof (ACPI_GENERIC_ADDRESS) * i);
844 AbsoluteOffset = Offset + ArrayOffset;
845 Array = (UINT8 *) SubTable + ArrayOffset;
847 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
848 SubTable->Length, AcpiDmTableInfoDbg2Addr);
849 if (ACPI_FAILURE (Status))
855 /* Dump the AddressSize array */
857 for (i = 0; i < SubTable->RegisterCount; i++)
859 ArrayOffset = SubTable->AddressSizeOffset +
860 (sizeof (UINT32) * i);
861 AbsoluteOffset = Offset + ArrayOffset;
862 Array = (UINT8 *) SubTable + ArrayOffset;
864 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
865 SubTable->Length, AcpiDmTableInfoDbg2Size);
866 if (ACPI_FAILURE (Status))
872 /* Dump the Namestring (required) */
875 ArrayOffset = SubTable->NamepathOffset;
876 AbsoluteOffset = Offset + ArrayOffset;
877 Array = (UINT8 *) SubTable + ArrayOffset;
879 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
880 SubTable->Length, AcpiDmTableInfoDbg2Name);
881 if (ACPI_FAILURE (Status))
886 /* Dump the OemData (optional) */
888 if (SubTable->OemDataOffset)
890 Status = AcpiDmDumpTable (Length, Offset + SubTable->OemDataOffset,
891 Table, SubTable->OemDataLength,
892 AcpiDmTableInfoDbg2OemData);
893 if (ACPI_FAILURE (Status))
899 /* Point to next subtable */
901 Offset += SubTable->Length;
902 SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable,
908 /*******************************************************************************
910 * FUNCTION: AcpiDmDumpDmar
912 * PARAMETERS: Table - A DMAR table
916 * DESCRIPTION: Format the contents of a DMAR. This table type consists
917 * of an open-ended number of subtables.
919 ******************************************************************************/
923 ACPI_TABLE_HEADER *Table)
926 ACPI_DMAR_HEADER *SubTable;
927 UINT32 Length = Table->Length;
928 UINT32 Offset = sizeof (ACPI_TABLE_DMAR);
929 ACPI_DMTABLE_INFO *InfoTable;
930 ACPI_DMAR_DEVICE_SCOPE *ScopeTable;
938 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
939 if (ACPI_FAILURE (Status))
946 SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
947 while (Offset < Table->Length)
949 /* Common subtable header */
952 Status = AcpiDmDumpTable (Length, Offset, SubTable,
953 SubTable->Length, AcpiDmTableInfoDmarHdr);
954 if (ACPI_FAILURE (Status))
960 switch (SubTable->Type)
962 case ACPI_DMAR_TYPE_HARDWARE_UNIT:
964 InfoTable = AcpiDmTableInfoDmar0;
965 ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
968 case ACPI_DMAR_TYPE_RESERVED_MEMORY:
970 InfoTable = AcpiDmTableInfoDmar1;
971 ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
974 case ACPI_DMAR_TYPE_ROOT_ATS:
976 InfoTable = AcpiDmTableInfoDmar2;
977 ScopeOffset = sizeof (ACPI_DMAR_ATSR);
980 case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
982 InfoTable = AcpiDmTableInfoDmar3;
983 ScopeOffset = sizeof (ACPI_DMAR_RHSA);
986 case ACPI_DMAR_TYPE_NAMESPACE:
988 InfoTable = AcpiDmTableInfoDmar4;
989 ScopeOffset = sizeof (ACPI_DMAR_ANDD);
994 AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n", SubTable->Type);
998 Status = AcpiDmDumpTable (Length, Offset, SubTable,
999 SubTable->Length, InfoTable);
1000 if (ACPI_FAILURE (Status))
1006 * Dump the optional device scope entries
1008 if ((SubTable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
1009 (SubTable->Type == ACPI_DMAR_TYPE_NAMESPACE))
1011 /* These types do not support device scopes */
1016 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset);
1017 while (ScopeOffset < SubTable->Length)
1019 AcpiOsPrintf ("\n");
1020 Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
1021 ScopeTable->Length, AcpiDmTableInfoDmarScope);
1022 if (ACPI_FAILURE (Status))
1026 AcpiOsPrintf ("\n");
1028 /* Dump the PCI Path entries for this device scope */
1030 PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
1032 PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
1033 sizeof (ACPI_DMAR_DEVICE_SCOPE));
1035 while (PathOffset < ScopeTable->Length)
1037 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, "PCI Path");
1038 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
1040 /* Point to next PCI Path entry */
1044 AcpiOsPrintf ("\n");
1047 /* Point to next device scope entry */
1049 ScopeOffset += ScopeTable->Length;
1050 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
1051 ScopeTable, ScopeTable->Length);
1055 /* Point to next subtable */
1057 Offset += SubTable->Length;
1058 SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, SubTable->Length);
1063 /*******************************************************************************
1065 * FUNCTION: AcpiDmDumpDrtm
1067 * PARAMETERS: Table - A DRTM table
1071 * DESCRIPTION: Format the contents of a DRTM.
1073 ******************************************************************************/
1077 ACPI_TABLE_HEADER *Table)
1081 ACPI_DRTM_VTABLE_LIST *DrtmVtl;
1082 ACPI_DRTM_RESOURCE_LIST *DrtmRl;
1083 ACPI_DRTM_DPS_ID *DrtmDps;
1089 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
1090 AcpiDmTableInfoDrtm);
1091 if (ACPI_FAILURE (Status))
1096 Offset = sizeof (ACPI_TABLE_DRTM);
1100 /* Dump ValidatedTable length */
1102 DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
1103 AcpiOsPrintf ("\n");
1104 Status = AcpiDmDumpTable (Table->Length, Offset,
1105 DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
1106 AcpiDmTableInfoDrtm0);
1107 if (ACPI_FAILURE (Status))
1111 Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);
1113 /* Dump Validated table addresses */
1116 while ((Offset < Table->Length) &&
1117 (DrtmVtl->ValidatedTableCount > Count))
1119 Status = AcpiDmDumpTable (Table->Length, Offset,
1120 ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
1121 AcpiDmTableInfoDrtm0a);
1122 if (ACPI_FAILURE (Status))
1126 Offset += sizeof (UINT64);
1130 /* Dump ResourceList length */
1132 DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
1133 AcpiOsPrintf ("\n");
1134 Status = AcpiDmDumpTable (Table->Length, Offset,
1135 DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
1136 AcpiDmTableInfoDrtm1);
1137 if (ACPI_FAILURE (Status))
1142 Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);
1144 /* Dump the Resource List */
1147 while ((Offset < Table->Length) &&
1148 (DrtmRl->ResourceCount > Count))
1150 Status = AcpiDmDumpTable (Table->Length, Offset,
1151 ACPI_ADD_PTR (void, Table, Offset),
1152 sizeof (ACPI_DRTM_RESOURCE),
1153 AcpiDmTableInfoDrtm1a);
1154 if (ACPI_FAILURE (Status))
1159 Offset += sizeof (ACPI_DRTM_RESOURCE);
1165 DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
1166 AcpiOsPrintf ("\n");
1167 Status = AcpiDmDumpTable (Table->Length, Offset,
1168 DrtmDps, sizeof (ACPI_DRTM_DPS_ID),
1169 AcpiDmTableInfoDrtm2);
1170 if (ACPI_FAILURE (Status))
1177 /*******************************************************************************
1179 * FUNCTION: AcpiDmDumpEinj
1181 * PARAMETERS: Table - A EINJ table
1185 * DESCRIPTION: Format the contents of a EINJ. This table type consists
1186 * of an open-ended number of subtables.
1188 ******************************************************************************/
1192 ACPI_TABLE_HEADER *Table)
1195 ACPI_WHEA_HEADER *SubTable;
1196 UINT32 Length = Table->Length;
1197 UINT32 Offset = sizeof (ACPI_TABLE_EINJ);
1202 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
1203 if (ACPI_FAILURE (Status))
1210 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1211 while (Offset < Table->Length)
1213 AcpiOsPrintf ("\n");
1214 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1215 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
1216 if (ACPI_FAILURE (Status))
1221 /* Point to next subtable (each subtable is of fixed length) */
1223 Offset += sizeof (ACPI_WHEA_HEADER);
1224 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
1225 sizeof (ACPI_WHEA_HEADER));
1230 /*******************************************************************************
1232 * FUNCTION: AcpiDmDumpErst
1234 * PARAMETERS: Table - A ERST table
1238 * DESCRIPTION: Format the contents of a ERST. This table type consists
1239 * of an open-ended number of subtables.
1241 ******************************************************************************/
1245 ACPI_TABLE_HEADER *Table)
1248 ACPI_WHEA_HEADER *SubTable;
1249 UINT32 Length = Table->Length;
1250 UINT32 Offset = sizeof (ACPI_TABLE_ERST);
1255 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
1256 if (ACPI_FAILURE (Status))
1263 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1264 while (Offset < Table->Length)
1266 AcpiOsPrintf ("\n");
1267 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1268 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
1269 if (ACPI_FAILURE (Status))
1274 /* Point to next subtable (each subtable is of fixed length) */
1276 Offset += sizeof (ACPI_WHEA_HEADER);
1277 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
1278 sizeof (ACPI_WHEA_HEADER));
1283 /*******************************************************************************
1285 * FUNCTION: AcpiDmDumpFpdt
1287 * PARAMETERS: Table - A FPDT table
1291 * DESCRIPTION: Format the contents of a FPDT. This table type consists
1292 * of an open-ended number of subtables.
1294 ******************************************************************************/
1298 ACPI_TABLE_HEADER *Table)
1301 ACPI_FPDT_HEADER *SubTable;
1302 UINT32 Length = Table->Length;
1303 UINT32 Offset = sizeof (ACPI_TABLE_FPDT);
1304 ACPI_DMTABLE_INFO *InfoTable;
1307 /* There is no main table (other than the standard ACPI header) */
1311 SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
1312 while (Offset < Table->Length)
1314 /* Common subtable header */
1316 AcpiOsPrintf ("\n");
1317 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1318 SubTable->Length, AcpiDmTableInfoFpdtHdr);
1319 if (ACPI_FAILURE (Status))
1324 switch (SubTable->Type)
1326 case ACPI_FPDT_TYPE_BOOT:
1328 InfoTable = AcpiDmTableInfoFpdt0;
1331 case ACPI_FPDT_TYPE_S3PERF:
1333 InfoTable = AcpiDmTableInfoFpdt1;
1338 AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n", SubTable->Type);
1340 /* Attempt to continue */
1342 if (!SubTable->Length)
1344 AcpiOsPrintf ("Invalid zero length subtable\n");
1350 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1351 SubTable->Length, InfoTable);
1352 if (ACPI_FAILURE (Status))
1358 /* Point to next subtable */
1360 Offset += SubTable->Length;
1361 SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length);
1366 /*******************************************************************************
1368 * FUNCTION: AcpiDmDumpGtdt
1370 * PARAMETERS: Table - A GTDT table
1374 * DESCRIPTION: Format the contents of a GTDT. This table type consists
1375 * of an open-ended number of subtables.
1377 ******************************************************************************/
1381 ACPI_TABLE_HEADER *Table)
1384 ACPI_GTDT_HEADER *SubTable;
1385 UINT32 Length = Table->Length;
1386 UINT32 Offset = sizeof (ACPI_TABLE_GTDT);
1387 ACPI_DMTABLE_INFO *InfoTable;
1388 UINT32 SubTableLength;
1390 ACPI_GTDT_TIMER_ENTRY *GtxTable;
1395 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
1396 if (ACPI_FAILURE (Status))
1403 SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
1404 while (Offset < Table->Length)
1406 /* Common subtable header */
1408 AcpiOsPrintf ("\n");
1409 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1410 SubTable->Length, AcpiDmTableInfoGtdtHdr);
1411 if (ACPI_FAILURE (Status))
1417 switch (SubTable->Type)
1419 case ACPI_GTDT_TYPE_TIMER_BLOCK:
1421 SubTableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
1422 GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
1423 SubTable))->TimerCount;
1425 InfoTable = AcpiDmTableInfoGtdt0;
1428 case ACPI_GTDT_TYPE_WATCHDOG:
1430 SubTableLength = sizeof (ACPI_GTDT_WATCHDOG);
1432 InfoTable = AcpiDmTableInfoGtdt1;
1437 /* Cannot continue on unknown type - no length */
1439 AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n", SubTable->Type);
1443 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1444 SubTable->Length, InfoTable);
1445 if (ACPI_FAILURE (Status))
1450 /* Point to end of current subtable (each subtable above is of fixed length) */
1452 Offset += SubTableLength;
1454 /* If there are any Gt Timer Blocks from above, dump them now */
1458 GtxTable = ACPI_ADD_PTR (ACPI_GTDT_TIMER_ENTRY, SubTable, SubTableLength);
1459 SubTableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
1463 AcpiOsPrintf ("\n");
1464 Status = AcpiDmDumpTable (Length, Offset, GtxTable,
1465 sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
1466 if (ACPI_FAILURE (Status))
1470 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
1476 /* Point to next subtable */
1478 SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, SubTable, SubTableLength);
1483 /*******************************************************************************
1485 * FUNCTION: AcpiDmDumpHest
1487 * PARAMETERS: Table - A HEST table
1491 * DESCRIPTION: Format the contents of a HEST. This table type consists
1492 * of an open-ended number of subtables.
1494 ******************************************************************************/
1498 ACPI_TABLE_HEADER *Table)
1501 ACPI_HEST_HEADER *SubTable;
1502 UINT32 Length = Table->Length;
1503 UINT32 Offset = sizeof (ACPI_TABLE_HEST);
1504 ACPI_DMTABLE_INFO *InfoTable;
1505 UINT32 SubTableLength;
1507 ACPI_HEST_IA_ERROR_BANK *BankTable;
1512 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
1513 if (ACPI_FAILURE (Status))
1520 SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
1521 while (Offset < Table->Length)
1524 switch (SubTable->Type)
1526 case ACPI_HEST_TYPE_IA32_CHECK:
1528 InfoTable = AcpiDmTableInfoHest0;
1529 SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
1530 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1531 SubTable))->NumHardwareBanks;
1534 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1536 InfoTable = AcpiDmTableInfoHest1;
1537 SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED);
1538 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1539 SubTable))->NumHardwareBanks;
1542 case ACPI_HEST_TYPE_IA32_NMI:
1544 InfoTable = AcpiDmTableInfoHest2;
1545 SubTableLength = sizeof (ACPI_HEST_IA_NMI);
1548 case ACPI_HEST_TYPE_AER_ROOT_PORT:
1550 InfoTable = AcpiDmTableInfoHest6;
1551 SubTableLength = sizeof (ACPI_HEST_AER_ROOT);
1554 case ACPI_HEST_TYPE_AER_ENDPOINT:
1556 InfoTable = AcpiDmTableInfoHest7;
1557 SubTableLength = sizeof (ACPI_HEST_AER);
1560 case ACPI_HEST_TYPE_AER_BRIDGE:
1562 InfoTable = AcpiDmTableInfoHest8;
1563 SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE);
1566 case ACPI_HEST_TYPE_GENERIC_ERROR:
1568 InfoTable = AcpiDmTableInfoHest9;
1569 SubTableLength = sizeof (ACPI_HEST_GENERIC);
1574 /* Cannot continue on unknown type - no length */
1576 AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n", SubTable->Type);
1580 AcpiOsPrintf ("\n");
1581 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1582 SubTableLength, InfoTable);
1583 if (ACPI_FAILURE (Status))
1588 /* Point to end of current subtable (each subtable above is of fixed length) */
1590 Offset += SubTableLength;
1592 /* If there are any (fixed-length) Error Banks from above, dump them now */
1596 BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, SubTableLength);
1597 SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
1601 AcpiOsPrintf ("\n");
1602 Status = AcpiDmDumpTable (Length, Offset, BankTable,
1603 sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
1604 if (ACPI_FAILURE (Status))
1608 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
1614 /* Point to next subtable */
1616 SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength);
1621 /*******************************************************************************
1623 * FUNCTION: AcpiDmDumpIort
1625 * PARAMETERS: Table - A IORT table
1629 * DESCRIPTION: Format the contents of a IORT
1631 ******************************************************************************/
1635 ACPI_TABLE_HEADER *Table)
1638 ACPI_TABLE_IORT *Iort;
1639 ACPI_IORT_NODE *IortNode;
1640 ACPI_IORT_ITS_GROUP *IortItsGroup = NULL;
1641 ACPI_IORT_SMMU *IortSmmu = NULL;
1645 ACPI_DMTABLE_INFO *InfoTable;
1652 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort);
1653 if (ACPI_FAILURE (Status))
1658 Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);
1659 Offset = sizeof (ACPI_TABLE_IORT);
1661 /* Dump the OptionalPadding (optional) */
1663 if (Iort->NodeOffset > Offset)
1665 Status = AcpiDmDumpTable (Table->Length, Offset, Table,
1666 Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad);
1667 if (ACPI_FAILURE (Status))
1673 Offset = Iort->NodeOffset;
1674 while (Offset < Table->Length)
1676 /* Common subtable header */
1678 IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
1679 AcpiOsPrintf ("\n");
1680 Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
1681 Status = AcpiDmDumpTable (Table->Length, Offset,
1682 IortNode, Length, AcpiDmTableInfoIortHdr);
1683 if (ACPI_FAILURE (Status))
1688 NodeOffset = Length;
1690 switch (IortNode->Type)
1692 case ACPI_IORT_NODE_ITS_GROUP:
1694 InfoTable = AcpiDmTableInfoIort0;
1695 Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers);
1696 IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset);
1699 case ACPI_IORT_NODE_NAMED_COMPONENT:
1701 InfoTable = AcpiDmTableInfoIort1;
1702 Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName);
1703 String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length);
1704 Length += ACPI_STRLEN (String) + 1;
1707 case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
1709 InfoTable = AcpiDmTableInfoIort2;
1710 Length = IortNode->Length - NodeOffset;
1713 case ACPI_IORT_NODE_SMMU:
1715 InfoTable = AcpiDmTableInfoIort3;
1716 Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts);
1717 IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset);
1722 AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",
1725 /* Attempt to continue */
1727 if (!IortNode->Length)
1729 AcpiOsPrintf ("Invalid zero length IORT node\n");
1735 /* Dump the node subtable header */
1737 AcpiOsPrintf ("\n");
1738 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1739 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1741 if (ACPI_FAILURE (Status))
1746 NodeOffset += Length;
1748 /* Dump the node specific data */
1750 switch (IortNode->Type)
1752 case ACPI_IORT_NODE_ITS_GROUP:
1754 /* Validate IortItsGroup to avoid compiler warnings */
1758 for (i = 0; i < IortItsGroup->ItsCount; i++)
1760 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1761 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1762 4, AcpiDmTableInfoIort0a);
1768 case ACPI_IORT_NODE_NAMED_COMPONENT:
1770 /* Dump the Padding (optional) */
1772 if (IortNode->Length > NodeOffset)
1774 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1775 Table, IortNode->Length - NodeOffset,
1776 AcpiDmTableInfoIort1a);
1777 if (ACPI_FAILURE (Status))
1784 case ACPI_IORT_NODE_SMMU:
1786 AcpiOsPrintf ("\n");
1788 /* Validate IortSmmu to avoid compiler warnings */
1792 Length = 2 * sizeof (UINT64);
1793 NodeOffset = IortSmmu->GlobalInterruptOffset;
1794 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1795 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1796 Length, AcpiDmTableInfoIort3a);
1798 NodeOffset = IortSmmu->ContextInterruptOffset;
1799 for (i = 0; i < IortSmmu->ContextInterruptCount; i++)
1801 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1802 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1803 8, AcpiDmTableInfoIort3b);
1807 NodeOffset = IortSmmu->PmuInterruptOffset;
1808 for (i = 0; i < IortSmmu->PmuInterruptCount; i++)
1810 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1811 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1812 8, AcpiDmTableInfoIort3c);
1823 /* Dump the ID mappings */
1825 NodeOffset = IortNode->MappingOffset;
1826 for (i = 0; i < IortNode->MappingCount; i++)
1828 AcpiOsPrintf ("\n");
1829 Length = sizeof (ACPI_IORT_ID_MAPPING);
1830 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1831 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1832 Length, AcpiDmTableInfoIortMap);
1833 NodeOffset += Length;
1837 /* Point to next node subtable */
1839 Offset += IortNode->Length;
1840 IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, IortNode->Length);
1845 /*******************************************************************************
1847 * FUNCTION: AcpiDmDumpIvrs
1849 * PARAMETERS: Table - A IVRS table
1853 * DESCRIPTION: Format the contents of a IVRS
1855 ******************************************************************************/
1857 static UINT8 EntrySizes[] = {4,8,16,32};
1861 ACPI_TABLE_HEADER *Table)
1864 UINT32 Offset = sizeof (ACPI_TABLE_IVRS);
1868 ACPI_IVRS_DE_HEADER *DeviceEntry;
1869 ACPI_IVRS_HEADER *SubTable;
1870 ACPI_DMTABLE_INFO *InfoTable;
1875 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
1876 if (ACPI_FAILURE (Status))
1883 SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
1884 while (Offset < Table->Length)
1886 /* Common subtable header */
1888 AcpiOsPrintf ("\n");
1889 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1890 SubTable->Length, AcpiDmTableInfoIvrsHdr);
1891 if (ACPI_FAILURE (Status))
1896 switch (SubTable->Type)
1898 case ACPI_IVRS_TYPE_HARDWARE:
1900 InfoTable = AcpiDmTableInfoIvrs0;
1903 case ACPI_IVRS_TYPE_MEMORY1:
1904 case ACPI_IVRS_TYPE_MEMORY2:
1905 case ACPI_IVRS_TYPE_MEMORY3:
1907 InfoTable = AcpiDmTableInfoIvrs1;
1912 AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n",
1915 /* Attempt to continue */
1917 if (!SubTable->Length)
1919 AcpiOsPrintf ("Invalid zero length subtable\n");
1925 /* Dump the subtable */
1927 AcpiOsPrintf ("\n");
1928 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1929 SubTable->Length, InfoTable);
1930 if (ACPI_FAILURE (Status))
1935 /* The hardware subtable can contain multiple device entries */
1937 if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE)
1939 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE);
1940 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable,
1941 sizeof (ACPI_IVRS_HARDWARE));
1943 while (EntryOffset < (Offset + SubTable->Length))
1945 AcpiOsPrintf ("\n");
1947 * Upper 2 bits of Type encode the length of the device entry
1951 * 10 = 16 byte - currently no entries defined
1952 * 11 = 32 byte - currently no entries defined
1954 EntryType = DeviceEntry->Type;
1955 EntryLength = EntrySizes [EntryType >> 6];
1959 /* 4-byte device entries */
1961 case ACPI_IVRS_TYPE_PAD4:
1962 case ACPI_IVRS_TYPE_ALL:
1963 case ACPI_IVRS_TYPE_SELECT:
1964 case ACPI_IVRS_TYPE_START:
1965 case ACPI_IVRS_TYPE_END:
1967 InfoTable = AcpiDmTableInfoIvrs4;
1970 /* 8-byte entries, type A */
1972 case ACPI_IVRS_TYPE_ALIAS_SELECT:
1973 case ACPI_IVRS_TYPE_ALIAS_START:
1975 InfoTable = AcpiDmTableInfoIvrs8a;
1978 /* 8-byte entries, type B */
1980 case ACPI_IVRS_TYPE_PAD8:
1981 case ACPI_IVRS_TYPE_EXT_SELECT:
1982 case ACPI_IVRS_TYPE_EXT_START:
1984 InfoTable = AcpiDmTableInfoIvrs8b;
1987 /* 8-byte entries, type C */
1989 case ACPI_IVRS_TYPE_SPECIAL:
1991 InfoTable = AcpiDmTableInfoIvrs8c;
1995 InfoTable = AcpiDmTableInfoIvrs4;
1997 "\n**** Unknown IVRS device entry type/length: "
1998 "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
1999 EntryType, EntryLength, EntryOffset);
2003 /* Dump the Device Entry */
2005 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
2006 DeviceEntry, EntryLength, InfoTable);
2008 EntryOffset += EntryLength;
2009 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
2015 /* Point to next subtable */
2017 Offset += SubTable->Length;
2018 SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length);
2023 /*******************************************************************************
2025 * FUNCTION: AcpiDmDumpLpit
2027 * PARAMETERS: Table - A LPIT table
2031 * DESCRIPTION: Format the contents of a LPIT. This table type consists
2032 * of an open-ended number of subtables. Note: There are no
2033 * entries in the main table. An LPIT consists of the table
2034 * header and then subtables only.
2036 ******************************************************************************/
2040 ACPI_TABLE_HEADER *Table)
2043 ACPI_LPIT_HEADER *SubTable;
2044 UINT32 Length = Table->Length;
2045 UINT32 Offset = sizeof (ACPI_TABLE_LPIT);
2046 ACPI_DMTABLE_INFO *InfoTable;
2047 UINT32 SubTableLength;
2052 SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
2053 while (Offset < Table->Length)
2055 /* Common subtable header */
2057 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2058 sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);
2059 if (ACPI_FAILURE (Status))
2064 switch (SubTable->Type)
2066 case ACPI_LPIT_TYPE_NATIVE_CSTATE:
2068 InfoTable = AcpiDmTableInfoLpit0;
2069 SubTableLength = sizeof (ACPI_LPIT_NATIVE);
2074 /* Cannot continue on unknown type - no length */
2076 AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n", SubTable->Type);
2080 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2081 SubTableLength, InfoTable);
2082 if (ACPI_FAILURE (Status))
2086 AcpiOsPrintf ("\n");
2088 /* Point to next subtable */
2090 Offset += SubTableLength;
2091 SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, SubTable, SubTableLength);
2096 /*******************************************************************************
2098 * FUNCTION: AcpiDmDumpMadt
2100 * PARAMETERS: Table - A MADT table
2104 * DESCRIPTION: Format the contents of a MADT. This table type consists
2105 * of an open-ended number of subtables.
2107 ******************************************************************************/
2111 ACPI_TABLE_HEADER *Table)
2114 ACPI_SUBTABLE_HEADER *SubTable;
2115 UINT32 Length = Table->Length;
2116 UINT32 Offset = sizeof (ACPI_TABLE_MADT);
2117 ACPI_DMTABLE_INFO *InfoTable;
2122 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
2123 if (ACPI_FAILURE (Status))
2130 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
2131 while (Offset < Table->Length)
2133 /* Common subtable header */
2135 AcpiOsPrintf ("\n");
2136 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2137 SubTable->Length, AcpiDmTableInfoMadtHdr);
2138 if (ACPI_FAILURE (Status))
2143 switch (SubTable->Type)
2145 case ACPI_MADT_TYPE_LOCAL_APIC:
2147 InfoTable = AcpiDmTableInfoMadt0;
2150 case ACPI_MADT_TYPE_IO_APIC:
2152 InfoTable = AcpiDmTableInfoMadt1;
2155 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
2157 InfoTable = AcpiDmTableInfoMadt2;
2160 case ACPI_MADT_TYPE_NMI_SOURCE:
2162 InfoTable = AcpiDmTableInfoMadt3;
2165 case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
2167 InfoTable = AcpiDmTableInfoMadt4;
2170 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
2172 InfoTable = AcpiDmTableInfoMadt5;
2175 case ACPI_MADT_TYPE_IO_SAPIC:
2177 InfoTable = AcpiDmTableInfoMadt6;
2180 case ACPI_MADT_TYPE_LOCAL_SAPIC:
2182 InfoTable = AcpiDmTableInfoMadt7;
2185 case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
2187 InfoTable = AcpiDmTableInfoMadt8;
2190 case ACPI_MADT_TYPE_LOCAL_X2APIC:
2192 InfoTable = AcpiDmTableInfoMadt9;
2195 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
2197 InfoTable = AcpiDmTableInfoMadt10;
2200 case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
2202 InfoTable = AcpiDmTableInfoMadt11;
2205 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
2207 InfoTable = AcpiDmTableInfoMadt12;
2210 case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
2212 InfoTable = AcpiDmTableInfoMadt13;
2215 case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
2217 InfoTable = AcpiDmTableInfoMadt14;
2220 case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
2222 InfoTable = AcpiDmTableInfoMadt15;
2227 AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n", SubTable->Type);
2229 /* Attempt to continue */
2231 if (!SubTable->Length)
2233 AcpiOsPrintf ("Invalid zero length subtable\n");
2239 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2240 SubTable->Length, InfoTable);
2241 if (ACPI_FAILURE (Status))
2247 /* Point to next subtable */
2249 Offset += SubTable->Length;
2250 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
2255 /*******************************************************************************
2257 * FUNCTION: AcpiDmDumpMcfg
2259 * PARAMETERS: Table - A MCFG Table
2263 * DESCRIPTION: Format the contents of a MCFG table
2265 ******************************************************************************/
2269 ACPI_TABLE_HEADER *Table)
2272 UINT32 Offset = sizeof (ACPI_TABLE_MCFG);
2273 ACPI_MCFG_ALLOCATION *SubTable;
2278 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
2279 if (ACPI_FAILURE (Status))
2286 SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
2287 while (Offset < Table->Length)
2289 if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
2291 AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
2292 sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
2296 AcpiOsPrintf ("\n");
2297 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2298 sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
2299 if (ACPI_FAILURE (Status))
2304 /* Point to next subtable (each subtable is of fixed length) */
2306 Offset += sizeof (ACPI_MCFG_ALLOCATION);
2307 SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable,
2308 sizeof (ACPI_MCFG_ALLOCATION));
2313 /*******************************************************************************
2315 * FUNCTION: AcpiDmDumpMpst
2317 * PARAMETERS: Table - A MPST Table
2321 * DESCRIPTION: Format the contents of a MPST table
2323 ******************************************************************************/
2327 ACPI_TABLE_HEADER *Table)
2330 UINT32 Offset = sizeof (ACPI_TABLE_MPST);
2331 ACPI_MPST_POWER_NODE *SubTable0;
2332 ACPI_MPST_POWER_STATE *SubTable0A;
2333 ACPI_MPST_COMPONENT *SubTable0B;
2334 ACPI_MPST_DATA_HDR *SubTable1;
2335 ACPI_MPST_POWER_DATA *SubTable2;
2336 UINT16 SubtableCount;
2337 UINT32 PowerStateCount;
2338 UINT32 ComponentCount;
2343 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
2344 if (ACPI_FAILURE (Status))
2349 /* Subtable: Memory Power Node(s) */
2351 SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
2352 SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
2354 while ((Offset < Table->Length) && SubtableCount)
2356 AcpiOsPrintf ("\n");
2357 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0,
2358 sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
2359 if (ACPI_FAILURE (Status))
2364 /* Extract the sub-subtable counts */
2366 PowerStateCount = SubTable0->NumPowerStates;
2367 ComponentCount = SubTable0->NumPhysicalComponents;
2368 Offset += sizeof (ACPI_MPST_POWER_NODE);
2370 /* Sub-subtables - Memory Power State Structure(s) */
2372 SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0,
2373 sizeof (ACPI_MPST_POWER_NODE));
2375 while (PowerStateCount)
2377 AcpiOsPrintf ("\n");
2378 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A,
2379 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
2380 if (ACPI_FAILURE (Status))
2387 Offset += sizeof (ACPI_MPST_POWER_STATE);
2390 /* Sub-subtables - Physical Component ID Structure(s) */
2392 SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A);
2396 AcpiOsPrintf ("\n");
2399 while (ComponentCount)
2401 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B,
2402 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
2403 if (ACPI_FAILURE (Status))
2410 Offset += sizeof (ACPI_MPST_COMPONENT);
2413 /* Point to next Memory Power Node subtable */
2416 SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0,
2417 sizeof (ACPI_MPST_POWER_NODE) +
2418 (sizeof (ACPI_MPST_POWER_STATE) * SubTable0->NumPowerStates) +
2419 (sizeof (ACPI_MPST_COMPONENT) * SubTable0->NumPhysicalComponents));
2422 /* Subtable: Count of Memory Power State Characteristic structures */
2424 AcpiOsPrintf ("\n");
2425 SubTable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, SubTable0);
2426 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable1,
2427 sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
2428 if (ACPI_FAILURE (Status))
2433 SubtableCount = SubTable1->CharacteristicsCount;
2434 Offset += sizeof (ACPI_MPST_DATA_HDR);
2436 /* Subtable: Memory Power State Characteristics structure(s) */
2438 SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1, sizeof (ACPI_MPST_DATA_HDR));
2440 while ((Offset < Table->Length) && SubtableCount)
2442 AcpiOsPrintf ("\n");
2443 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2,
2444 sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
2445 if (ACPI_FAILURE (Status))
2452 Offset += sizeof (ACPI_MPST_POWER_DATA);
2457 /*******************************************************************************
2459 * FUNCTION: AcpiDmDumpMsct
2461 * PARAMETERS: Table - A MSCT table
2465 * DESCRIPTION: Format the contents of a MSCT
2467 ******************************************************************************/
2471 ACPI_TABLE_HEADER *Table)
2474 UINT32 Offset = sizeof (ACPI_TABLE_MSCT);
2475 ACPI_MSCT_PROXIMITY *SubTable;
2480 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
2481 if (ACPI_FAILURE (Status))
2488 SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
2489 while (Offset < Table->Length)
2491 /* Common subtable header */
2493 AcpiOsPrintf ("\n");
2494 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2495 sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
2496 if (ACPI_FAILURE (Status))
2501 /* Point to next subtable */
2503 Offset += sizeof (ACPI_MSCT_PROXIMITY);
2504 SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable, sizeof (ACPI_MSCT_PROXIMITY));
2509 /*******************************************************************************
2511 * FUNCTION: AcpiDmDumpMtmr
2513 * PARAMETERS: Table - A MTMR table
2517 * DESCRIPTION: Format the contents of a MTMR
2519 ******************************************************************************/
2523 ACPI_TABLE_HEADER *Table)
2526 UINT32 Offset = sizeof (ACPI_TABLE_MTMR);
2527 ACPI_MTMR_ENTRY *SubTable;
2532 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMtmr);
2533 if (ACPI_FAILURE (Status))
2540 SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset);
2541 while (Offset < Table->Length)
2543 /* Common subtable header */
2545 AcpiOsPrintf ("\n");
2546 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2547 sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0);
2548 if (ACPI_FAILURE (Status))
2553 /* Point to next subtable */
2555 Offset += sizeof (ACPI_MTMR_ENTRY);
2556 SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, SubTable, sizeof (ACPI_MTMR_ENTRY));
2561 /*******************************************************************************
2563 * FUNCTION: AcpiDmDumpNfit
2565 * PARAMETERS: Table - A NFIT table
2569 * DESCRIPTION: Format the contents of an NFIT.
2571 ******************************************************************************/
2575 ACPI_TABLE_HEADER *Table)
2578 UINT32 Offset = sizeof (ACPI_TABLE_NFIT);
2579 UINT32 FieldOffset = 0;
2581 ACPI_NFIT_HEADER *SubTable;
2582 ACPI_DMTABLE_INFO *InfoTable;
2583 ACPI_NFIT_INTERLEAVE *Interleave = NULL;
2584 ACPI_NFIT_SMBIOS *SmbiosInfo = NULL;
2585 ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
2591 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
2592 if (ACPI_FAILURE (Status))
2599 SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
2600 while (Offset < Table->Length)
2602 /* NFIT subtable header */
2604 AcpiOsPrintf ("\n");
2605 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2606 SubTable->Length, AcpiDmTableInfoNfitHdr);
2607 if (ACPI_FAILURE (Status))
2612 switch (SubTable->Type)
2614 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
2616 InfoTable = AcpiDmTableInfoNfit0;
2619 case ACPI_NFIT_TYPE_MEMORY_MAP:
2621 InfoTable = AcpiDmTableInfoNfit1;
2624 case ACPI_NFIT_TYPE_INTERLEAVE:
2626 /* Has a variable number of 32-bit values at the end */
2628 InfoTable = AcpiDmTableInfoNfit2;
2629 Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, SubTable);
2630 FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);
2633 case ACPI_NFIT_TYPE_SMBIOS:
2635 SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, SubTable);
2636 InfoTable = AcpiDmTableInfoNfit3;
2639 case ACPI_NFIT_TYPE_CONTROL_REGION:
2641 InfoTable = AcpiDmTableInfoNfit4;
2644 case ACPI_NFIT_TYPE_DATA_REGION:
2646 InfoTable = AcpiDmTableInfoNfit5;
2649 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
2651 /* Has a variable number of 64-bit addresses at the end */
2653 InfoTable = AcpiDmTableInfoNfit6;
2654 Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, SubTable);
2655 FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64);
2659 AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n", SubTable->Type);
2661 /* Attempt to continue */
2663 if (!SubTable->Length)
2665 AcpiOsPrintf ("Invalid zero length subtable\n");
2671 AcpiOsPrintf ("\n");
2672 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2673 SubTable->Length, InfoTable);
2674 if (ACPI_FAILURE (Status))
2679 /* Per-subtable variable-length fields */
2681 switch (SubTable->Type)
2683 case ACPI_NFIT_TYPE_INTERLEAVE:
2685 for (i = 0; i < Interleave->LineCount; i++)
2687 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
2688 &Interleave->LineOffset[i],
2689 sizeof (UINT32), AcpiDmTableInfoNfit2a);
2690 FieldOffset += sizeof (UINT32);
2694 case ACPI_NFIT_TYPE_SMBIOS:
2696 Length = SubTable->Length - sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
2699 Status = AcpiDmDumpTable (Table->Length,
2700 sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
2702 Length, AcpiDmTableInfoNfit3a);
2703 if (ACPI_FAILURE (Status))
2711 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
2713 for (i = 0; i < Hint->HintCount; i++)
2715 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
2716 &Hint->HintAddress[i],
2717 sizeof (UINT64), AcpiDmTableInfoNfit6a);
2718 FieldOffset += sizeof (UINT64);
2727 /* Point to next subtable */
2729 Offset += SubTable->Length;
2730 SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, SubTable, SubTable->Length);
2735 /*******************************************************************************
2737 * FUNCTION: AcpiDmDumpPcct
2739 * PARAMETERS: Table - A PCCT table
2743 * DESCRIPTION: Format the contents of a PCCT. This table type consists
2744 * of an open-ended number of subtables.
2746 ******************************************************************************/
2750 ACPI_TABLE_HEADER *Table)
2753 ACPI_PCCT_SUBSPACE *SubTable;
2754 ACPI_DMTABLE_INFO *InfoTable;
2755 UINT32 Length = Table->Length;
2756 UINT32 Offset = sizeof (ACPI_TABLE_PCCT);
2761 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
2762 if (ACPI_FAILURE (Status))
2769 SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
2770 while (Offset < Table->Length)
2772 /* Common subtable header */
2774 AcpiOsPrintf ("\n");
2775 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2776 SubTable->Header.Length, AcpiDmTableInfoPcctHdr);
2777 if (ACPI_FAILURE (Status))
2782 switch (SubTable->Header.Type)
2784 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
2786 InfoTable = AcpiDmTableInfoPcct0;
2789 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
2791 InfoTable = AcpiDmTableInfoPcct1;
2797 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
2798 SubTable->Header.Type);
2802 AcpiOsPrintf ("\n");
2803 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2804 SubTable->Header.Length, InfoTable);
2805 if (ACPI_FAILURE (Status))
2810 /* Point to next subtable */
2812 Offset += SubTable->Header.Length;
2813 SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable,
2814 SubTable->Header.Length);
2819 /*******************************************************************************
2821 * FUNCTION: AcpiDmDumpPmtt
2823 * PARAMETERS: Table - A PMTT table
2827 * DESCRIPTION: Format the contents of a PMTT. This table type consists
2828 * of an open-ended number of subtables.
2830 ******************************************************************************/
2834 ACPI_TABLE_HEADER *Table)
2837 ACPI_PMTT_HEADER *SubTable;
2838 ACPI_PMTT_HEADER *MemSubTable;
2839 ACPI_PMTT_HEADER *DimmSubTable;
2840 ACPI_PMTT_DOMAIN *DomainArray;
2841 UINT32 Length = Table->Length;
2842 UINT32 Offset = sizeof (ACPI_TABLE_PMTT);
2845 UINT32 DomainOffset;
2851 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
2852 if (ACPI_FAILURE (Status))
2859 SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
2860 while (Offset < Table->Length)
2862 /* Common subtable header */
2864 AcpiOsPrintf ("\n");
2865 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2866 SubTable->Length, AcpiDmTableInfoPmttHdr);
2867 if (ACPI_FAILURE (Status))
2872 /* Only Socket subtables are expected at this level */
2874 if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET)
2877 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2882 /* Dump the fixed-length portion of the subtable */
2884 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2885 SubTable->Length, AcpiDmTableInfoPmtt0);
2886 if (ACPI_FAILURE (Status))
2891 /* Walk the memory controller subtables */
2893 MemOffset = sizeof (ACPI_PMTT_SOCKET);
2894 MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable,
2895 sizeof (ACPI_PMTT_SOCKET));
2897 while (((Offset + MemOffset) < Table->Length) &&
2898 (MemOffset < SubTable->Length))
2900 /* Common subtable header */
2902 AcpiOsPrintf ("\n");
2903 Status = AcpiDmDumpTable (Length,
2904 Offset + MemOffset, MemSubTable,
2905 MemSubTable->Length, AcpiDmTableInfoPmttHdr);
2906 if (ACPI_FAILURE (Status))
2911 /* Only memory controller subtables are expected at this level */
2913 if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER)
2916 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2921 /* Dump the fixed-length portion of the controller subtable */
2923 Status = AcpiDmDumpTable (Length,
2924 Offset + MemOffset, MemSubTable,
2925 MemSubTable->Length, AcpiDmTableInfoPmtt1);
2926 if (ACPI_FAILURE (Status))
2931 /* Walk the variable count of proximity domains */
2933 DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount;
2934 DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
2935 DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable,
2936 sizeof (ACPI_PMTT_CONTROLLER));
2938 while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
2939 ((MemOffset + DomainOffset) < SubTable->Length) &&
2942 Status = AcpiDmDumpTable (Length,
2943 Offset + MemOffset + DomainOffset, DomainArray,
2944 sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
2945 if (ACPI_FAILURE (Status))
2950 DomainOffset += sizeof (ACPI_PMTT_DOMAIN);
2958 "\n**** DomainCount exceeds subtable length\n\n");
2961 /* Walk the physical component (DIMM) subtables */
2963 DimmOffset = DomainOffset;
2964 DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable,
2967 while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
2968 (DimmOffset < MemSubTable->Length))
2970 /* Common subtable header */
2972 AcpiOsPrintf ("\n");
2973 Status = AcpiDmDumpTable (Length,
2974 Offset + MemOffset + DimmOffset, DimmSubTable,
2975 DimmSubTable->Length, AcpiDmTableInfoPmttHdr);
2976 if (ACPI_FAILURE (Status))
2981 /* Only DIMM subtables are expected at this level */
2983 if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM)
2986 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2987 DimmSubTable->Type);
2991 /* Dump the fixed-length DIMM subtable */
2993 Status = AcpiDmDumpTable (Length,
2994 Offset + MemOffset + DimmOffset, DimmSubTable,
2995 DimmSubTable->Length, AcpiDmTableInfoPmtt2);
2996 if (ACPI_FAILURE (Status))
3001 /* Point to next DIMM subtable */
3003 DimmOffset += DimmSubTable->Length;
3004 DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
3005 DimmSubTable, DimmSubTable->Length);
3008 /* Point to next Controller subtable */
3010 MemOffset += MemSubTable->Length;
3011 MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
3012 MemSubTable, MemSubTable->Length);
3015 /* Point to next Socket subtable */
3017 Offset += SubTable->Length;
3018 SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
3019 SubTable, SubTable->Length);
3024 /*******************************************************************************
3026 * FUNCTION: AcpiDmDumpS3pt
3028 * PARAMETERS: Table - A S3PT table
3030 * RETURN: Length of the table
3032 * DESCRIPTION: Format the contents of a S3PT
3034 ******************************************************************************/
3038 ACPI_TABLE_HEADER *Tables)
3041 UINT32 Offset = sizeof (ACPI_TABLE_S3PT);
3042 ACPI_S3PT_HEADER *SubTable;
3043 ACPI_DMTABLE_INFO *InfoTable;
3044 ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
3049 Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
3050 if (ACPI_FAILURE (Status))
3055 SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, S3ptTable, Offset);
3056 while (Offset < S3ptTable->Length)
3058 /* Common subtable header */
3060 AcpiOsPrintf ("\n");
3061 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
3062 SubTable->Length, AcpiDmTableInfoS3ptHdr);
3063 if (ACPI_FAILURE (Status))
3068 switch (SubTable->Type)
3070 case ACPI_S3PT_TYPE_RESUME:
3072 InfoTable = AcpiDmTableInfoS3pt0;
3075 case ACPI_S3PT_TYPE_SUSPEND:
3077 InfoTable = AcpiDmTableInfoS3pt1;
3082 AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n", SubTable->Type);
3084 /* Attempt to continue */
3086 if (!SubTable->Length)
3088 AcpiOsPrintf ("Invalid zero length subtable\n");
3094 AcpiOsPrintf ("\n");
3095 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
3096 SubTable->Length, InfoTable);
3097 if (ACPI_FAILURE (Status))
3103 /* Point to next subtable */
3105 Offset += SubTable->Length;
3106 SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, SubTable, SubTable->Length);
3109 return (S3ptTable->Length);
3113 /*******************************************************************************
3115 * FUNCTION: AcpiDmDumpSlic
3117 * PARAMETERS: Table - A SLIC table
3121 * DESCRIPTION: Format the contents of a SLIC
3123 ******************************************************************************/
3127 ACPI_TABLE_HEADER *Table)
3129 AcpiDmDumpTable (Table->Length, sizeof (ACPI_TABLE_HEADER), Table,
3130 Table->Length - sizeof (*Table), AcpiDmTableInfoSlic);
3134 /*******************************************************************************
3136 * FUNCTION: AcpiDmDumpSlit
3138 * PARAMETERS: Table - An SLIT
3142 * DESCRIPTION: Format the contents of a SLIT
3144 ******************************************************************************/
3148 ACPI_TABLE_HEADER *Table)
3160 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit);
3161 if (ACPI_FAILURE (Status))
3166 /* Display the Locality NxN Matrix */
3168 Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount;
3169 Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]);
3170 Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry;
3172 for (i = 0; i < Localities; i++)
3174 /* Display one row of the matrix */
3176 AcpiDmLineHeader2 (Offset, Localities, "Locality", i);
3177 for (j = 0; j < Localities; j++)
3179 /* Check for beyond EOT */
3181 if (Offset >= Table->Length)
3183 AcpiOsPrintf ("\n**** Not enough room in table for all localities\n");
3187 AcpiOsPrintf ("%2.2X", Row[j]);
3190 /* Display up to 16 bytes per output row */
3192 if ((j+1) < Localities)
3196 if (j && (((j+1) % 16) == 0))
3198 AcpiOsPrintf ("\\\n"); /* With line continuation char */
3199 AcpiDmLineHeader (Offset, 0, NULL);
3204 /* Point to next row */
3206 AcpiOsPrintf ("\n");
3212 /*******************************************************************************
3214 * FUNCTION: AcpiDmDumpSrat
3216 * PARAMETERS: Table - A SRAT table
3220 * DESCRIPTION: Format the contents of a SRAT
3222 ******************************************************************************/
3226 ACPI_TABLE_HEADER *Table)
3229 UINT32 Offset = sizeof (ACPI_TABLE_SRAT);
3230 ACPI_SUBTABLE_HEADER *SubTable;
3231 ACPI_DMTABLE_INFO *InfoTable;
3236 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat);
3237 if (ACPI_FAILURE (Status))
3244 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
3245 while (Offset < Table->Length)
3247 /* Common subtable header */
3249 AcpiOsPrintf ("\n");
3250 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3251 SubTable->Length, AcpiDmTableInfoSratHdr);
3252 if (ACPI_FAILURE (Status))
3257 switch (SubTable->Type)
3259 case ACPI_SRAT_TYPE_CPU_AFFINITY:
3261 InfoTable = AcpiDmTableInfoSrat0;
3264 case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
3266 InfoTable = AcpiDmTableInfoSrat1;
3269 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
3271 InfoTable = AcpiDmTableInfoSrat2;
3274 case ACPI_SRAT_TYPE_GICC_AFFINITY:
3276 InfoTable = AcpiDmTableInfoSrat3;
3280 AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n", SubTable->Type);
3282 /* Attempt to continue */
3284 if (!SubTable->Length)
3286 AcpiOsPrintf ("Invalid zero length subtable\n");
3292 AcpiOsPrintf ("\n");
3293 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3294 SubTable->Length, InfoTable);
3295 if (ACPI_FAILURE (Status))
3301 /* Point to next subtable */
3303 Offset += SubTable->Length;
3304 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
3309 /*******************************************************************************
3311 * FUNCTION: AcpiDmDumpStao
3313 * PARAMETERS: Table - A STAO table
3317 * DESCRIPTION: Format the contents of a STAO. This is a variable-length
3318 * table that contains an open-ended number of ASCII strings
3319 * at the end of the table.
3321 ******************************************************************************/
3325 ACPI_TABLE_HEADER *Table)
3329 UINT32 Length = Table->Length;
3330 UINT32 StringLength;
3331 UINT32 Offset = sizeof (ACPI_TABLE_STAO);
3336 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoStao);
3337 if (ACPI_FAILURE (Status))
3342 /* The rest of the table consists of Namepath strings */
3344 while (Offset < Table->Length)
3346 Namepath = ACPI_ADD_PTR (char, Table, Offset);
3347 StringLength = ACPI_STRLEN (Namepath) + 1;
3349 AcpiDmLineHeader (Offset, StringLength, "Namestring");
3350 AcpiOsPrintf ("\"%s\"\n", Namepath);
3352 /* Point to next namepath */
3354 Offset += StringLength;
3359 /*******************************************************************************
3361 * FUNCTION: AcpiDmDumpVrtc
3363 * PARAMETERS: Table - A VRTC table
3367 * DESCRIPTION: Format the contents of a VRTC
3369 ******************************************************************************/
3373 ACPI_TABLE_HEADER *Table)
3376 UINT32 Offset = sizeof (ACPI_TABLE_VRTC);
3377 ACPI_VRTC_ENTRY *SubTable;
3382 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoVrtc);
3383 if (ACPI_FAILURE (Status))
3390 SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset);
3391 while (Offset < Table->Length)
3393 /* Common subtable header */
3395 AcpiOsPrintf ("\n");
3396 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3397 sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0);
3398 if (ACPI_FAILURE (Status))
3403 /* Point to next subtable */
3405 Offset += sizeof (ACPI_VRTC_ENTRY);
3406 SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, SubTable, sizeof (ACPI_VRTC_ENTRY));
3411 /*******************************************************************************
3413 * FUNCTION: AcpiDmDumpWdat
3415 * PARAMETERS: Table - A WDAT table
3419 * DESCRIPTION: Format the contents of a WDAT
3421 ******************************************************************************/
3425 ACPI_TABLE_HEADER *Table)
3428 UINT32 Offset = sizeof (ACPI_TABLE_WDAT);
3429 ACPI_WDAT_ENTRY *SubTable;
3434 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat);
3435 if (ACPI_FAILURE (Status))
3442 SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
3443 while (Offset < Table->Length)
3445 /* Common subtable header */
3447 AcpiOsPrintf ("\n");
3448 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3449 sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0);
3450 if (ACPI_FAILURE (Status))
3455 /* Point to next subtable */
3457 Offset += sizeof (ACPI_WDAT_ENTRY);
3458 SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable, sizeof (ACPI_WDAT_ENTRY));
3462 /*******************************************************************************
3464 * FUNCTION: AcpiDmDumpWpbt
3466 * PARAMETERS: Table - A WPBT table
3470 * DESCRIPTION: Format the contents of a WPBT. This table type consists
3471 * of an open-ended arguments buffer at the end of the table.
3473 ******************************************************************************/
3477 ACPI_TABLE_HEADER *Table)
3480 ACPI_TABLE_WPBT *SubTable;
3481 UINT32 Length = Table->Length;
3482 UINT16 ArgumentsLength;
3485 /* Dump the main table */
3487 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoWpbt);
3488 if (ACPI_FAILURE (Status))
3493 /* Extract the arguments buffer length from the main table */
3495 SubTable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table);
3496 ArgumentsLength = SubTable->ArgumentsLength;
3498 /* Dump the arguments buffer */
3500 AcpiDmDumpTable (Table->Length, 0, Table, ArgumentsLength,
3501 AcpiDmTableInfoWpbt0);
3502 if (ACPI_FAILURE (Status))