dmtbdump2.c revision 1.1.1.5 1 /******************************************************************************
2 *
3 * Module Name: dmtbdump2 - Dump ACPI data tables that contain no AML code
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2019, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
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.
25 *
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.
29 *
30 * NO WARRANTY
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.
42 */
43
44 #include "acpi.h"
45 #include "accommon.h"
46 #include "acdisasm.h"
47 #include "actables.h"
48
49 /* This module used for application-level code only */
50
51 #define _COMPONENT ACPI_CA_DISASSEMBLER
52 ACPI_MODULE_NAME ("dmtbdump2")
53
54
55 /*******************************************************************************
56 *
57 * FUNCTION: AcpiDmDumpIort
58 *
59 * PARAMETERS: Table - A IORT table
60 *
61 * RETURN: None
62 *
63 * DESCRIPTION: Format the contents of a IORT
64 *
65 ******************************************************************************/
66
67 void
68 AcpiDmDumpIort (
69 ACPI_TABLE_HEADER *Table)
70 {
71 ACPI_STATUS Status;
72 ACPI_TABLE_IORT *Iort;
73 ACPI_IORT_NODE *IortNode;
74 ACPI_IORT_ITS_GROUP *IortItsGroup = NULL;
75 ACPI_IORT_SMMU *IortSmmu = NULL;
76 UINT32 Offset;
77 UINT32 NodeOffset;
78 UINT32 Length;
79 ACPI_DMTABLE_INFO *InfoTable;
80 char *String;
81 UINT32 i;
82 UINT32 MappingByteLength;
83
84
85 /* Main table */
86
87 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort);
88 if (ACPI_FAILURE (Status))
89 {
90 return;
91 }
92
93 Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);
94 Offset = sizeof (ACPI_TABLE_IORT);
95
96 /* Dump the OptionalPadding (optional) */
97
98 if (Iort->NodeOffset > Offset)
99 {
100 Status = AcpiDmDumpTable (Table->Length, Offset, Table,
101 Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad);
102 if (ACPI_FAILURE (Status))
103 {
104 return;
105 }
106 }
107
108 Offset = Iort->NodeOffset;
109 while (Offset < Table->Length)
110 {
111 /* Common subtable header */
112
113 IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
114 AcpiOsPrintf ("\n");
115 Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
116 Status = AcpiDmDumpTable (Table->Length, Offset,
117 IortNode, Length, AcpiDmTableInfoIortHdr);
118 if (ACPI_FAILURE (Status))
119 {
120 return;
121 }
122
123 NodeOffset = Length;
124
125 switch (IortNode->Type)
126 {
127 case ACPI_IORT_NODE_ITS_GROUP:
128
129 InfoTable = AcpiDmTableInfoIort0;
130 Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers);
131 IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset);
132 break;
133
134 case ACPI_IORT_NODE_NAMED_COMPONENT:
135
136 InfoTable = AcpiDmTableInfoIort1;
137 Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName);
138 String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length);
139 Length += strlen (String) + 1;
140 break;
141
142 case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
143
144 InfoTable = AcpiDmTableInfoIort2;
145 Length = IortNode->Length - NodeOffset;
146 break;
147
148 case ACPI_IORT_NODE_SMMU:
149
150 InfoTable = AcpiDmTableInfoIort3;
151 Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts);
152 IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset);
153 break;
154
155 case ACPI_IORT_NODE_SMMU_V3:
156
157 InfoTable = AcpiDmTableInfoIort4;
158 Length = IortNode->Length - NodeOffset;
159 break;
160
161 case ACPI_IORT_NODE_PMCG:
162
163 InfoTable = AcpiDmTableInfoIort5;
164 Length = IortNode->Length - NodeOffset;
165 break;
166
167 default:
168
169 AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",
170 IortNode->Type);
171
172 /* Attempt to continue */
173
174 if (!IortNode->Length)
175 {
176 AcpiOsPrintf ("Invalid zero length IORT node\n");
177 return;
178 }
179 goto NextSubtable;
180 }
181
182 /* Dump the node subtable header */
183
184 AcpiOsPrintf ("\n");
185 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
186 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
187 Length, InfoTable);
188 if (ACPI_FAILURE (Status))
189 {
190 return;
191 }
192
193 NodeOffset += Length;
194
195 /* Dump the node specific data */
196
197 switch (IortNode->Type)
198 {
199 case ACPI_IORT_NODE_ITS_GROUP:
200
201 /* Validate IortItsGroup to avoid compiler warnings */
202
203 if (IortItsGroup)
204 {
205 for (i = 0; i < IortItsGroup->ItsCount; i++)
206 {
207 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
208 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
209 4, AcpiDmTableInfoIort0a);
210 if (ACPI_FAILURE (Status))
211 {
212 return;
213 }
214
215 NodeOffset += 4;
216 }
217 }
218 break;
219
220 case ACPI_IORT_NODE_NAMED_COMPONENT:
221
222 /* Dump the Padding (optional) */
223
224 if (IortNode->Length > NodeOffset)
225 {
226 MappingByteLength =
227 IortNode->MappingCount * sizeof (ACPI_IORT_ID_MAPPING);
228 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
229 Table, IortNode->Length - NodeOffset - MappingByteLength,
230 AcpiDmTableInfoIort1a);
231 if (ACPI_FAILURE (Status))
232 {
233 return;
234 }
235 }
236 break;
237
238 case ACPI_IORT_NODE_SMMU:
239
240 AcpiOsPrintf ("\n");
241
242 /* Validate IortSmmu to avoid compiler warnings */
243
244 if (IortSmmu)
245 {
246 Length = 2 * sizeof (UINT64);
247 NodeOffset = IortSmmu->GlobalInterruptOffset;
248 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
249 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
250 Length, AcpiDmTableInfoIort3a);
251 if (ACPI_FAILURE (Status))
252 {
253 return;
254 }
255
256 NodeOffset = IortSmmu->ContextInterruptOffset;
257 for (i = 0; i < IortSmmu->ContextInterruptCount; i++)
258 {
259 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
260 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
261 8, AcpiDmTableInfoIort3b);
262 if (ACPI_FAILURE (Status))
263 {
264 return;
265 }
266
267 NodeOffset += 8;
268 }
269
270 NodeOffset = IortSmmu->PmuInterruptOffset;
271 for (i = 0; i < IortSmmu->PmuInterruptCount; i++)
272 {
273 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
274 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
275 8, AcpiDmTableInfoIort3c);
276 if (ACPI_FAILURE (Status))
277 {
278 return;
279 }
280
281 NodeOffset += 8;
282 }
283 }
284 break;
285
286 default:
287
288 break;
289 }
290
291 /* Dump the ID mappings */
292
293 NodeOffset = IortNode->MappingOffset;
294 for (i = 0; i < IortNode->MappingCount; i++)
295 {
296 AcpiOsPrintf ("\n");
297 Length = sizeof (ACPI_IORT_ID_MAPPING);
298 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
299 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
300 Length, AcpiDmTableInfoIortMap);
301 if (ACPI_FAILURE (Status))
302 {
303 return;
304 }
305
306 NodeOffset += Length;
307 }
308
309 NextSubtable:
310 /* Point to next node subtable */
311
312 Offset += IortNode->Length;
313 }
314 }
315
316
317 /*******************************************************************************
318 *
319 * FUNCTION: AcpiDmDumpIvrs
320 *
321 * PARAMETERS: Table - A IVRS table
322 *
323 * RETURN: None
324 *
325 * DESCRIPTION: Format the contents of a IVRS
326 *
327 ******************************************************************************/
328
329 static UINT8 EntrySizes[] = {4,8,16,32};
330
331 void
332 AcpiDmDumpIvrs (
333 ACPI_TABLE_HEADER *Table)
334 {
335 ACPI_STATUS Status;
336 UINT32 Offset = sizeof (ACPI_TABLE_IVRS);
337 UINT32 EntryOffset;
338 UINT32 EntryLength;
339 UINT32 EntryType;
340 ACPI_IVRS_DE_HEADER *DeviceEntry;
341 ACPI_IVRS_HEADER *Subtable;
342 ACPI_DMTABLE_INFO *InfoTable;
343
344
345 /* Main table */
346
347 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
348 if (ACPI_FAILURE (Status))
349 {
350 return;
351 }
352
353 /* Subtables */
354
355 Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
356 while (Offset < Table->Length)
357 {
358 /* Common subtable header */
359
360 AcpiOsPrintf ("\n");
361 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
362 Subtable->Length, AcpiDmTableInfoIvrsHdr);
363 if (ACPI_FAILURE (Status))
364 {
365 return;
366 }
367
368 switch (Subtable->Type)
369 {
370 case ACPI_IVRS_TYPE_HARDWARE:
371
372 InfoTable = AcpiDmTableInfoIvrs0;
373 break;
374
375 case ACPI_IVRS_TYPE_MEMORY1:
376 case ACPI_IVRS_TYPE_MEMORY2:
377 case ACPI_IVRS_TYPE_MEMORY3:
378
379 InfoTable = AcpiDmTableInfoIvrs1;
380 break;
381
382 default:
383
384 AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n",
385 Subtable->Type);
386
387 /* Attempt to continue */
388
389 if (!Subtable->Length)
390 {
391 AcpiOsPrintf ("Invalid zero length subtable\n");
392 return;
393 }
394 goto NextSubtable;
395 }
396
397 /* Dump the subtable */
398
399 AcpiOsPrintf ("\n");
400 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
401 Subtable->Length, InfoTable);
402 if (ACPI_FAILURE (Status))
403 {
404 return;
405 }
406
407 /* The hardware subtable can contain multiple device entries */
408
409 if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE)
410 {
411 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE);
412 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
413 sizeof (ACPI_IVRS_HARDWARE));
414
415 while (EntryOffset < (Offset + Subtable->Length))
416 {
417 AcpiOsPrintf ("\n");
418 /*
419 * Upper 2 bits of Type encode the length of the device entry
420 *
421 * 00 = 4 byte
422 * 01 = 8 byte
423 * 10 = 16 byte - currently no entries defined
424 * 11 = 32 byte - currently no entries defined
425 */
426 EntryType = DeviceEntry->Type;
427 EntryLength = EntrySizes [EntryType >> 6];
428
429 switch (EntryType)
430 {
431 /* 4-byte device entries */
432
433 case ACPI_IVRS_TYPE_PAD4:
434 case ACPI_IVRS_TYPE_ALL:
435 case ACPI_IVRS_TYPE_SELECT:
436 case ACPI_IVRS_TYPE_START:
437 case ACPI_IVRS_TYPE_END:
438
439 InfoTable = AcpiDmTableInfoIvrs4;
440 break;
441
442 /* 8-byte entries, type A */
443
444 case ACPI_IVRS_TYPE_ALIAS_SELECT:
445 case ACPI_IVRS_TYPE_ALIAS_START:
446
447 InfoTable = AcpiDmTableInfoIvrs8a;
448 break;
449
450 /* 8-byte entries, type B */
451
452 case ACPI_IVRS_TYPE_PAD8:
453 case ACPI_IVRS_TYPE_EXT_SELECT:
454 case ACPI_IVRS_TYPE_EXT_START:
455
456 InfoTable = AcpiDmTableInfoIvrs8b;
457 break;
458
459 /* 8-byte entries, type C */
460
461 case ACPI_IVRS_TYPE_SPECIAL:
462
463 InfoTable = AcpiDmTableInfoIvrs8c;
464 break;
465
466 default:
467 InfoTable = AcpiDmTableInfoIvrs4;
468 AcpiOsPrintf (
469 "\n**** Unknown IVRS device entry type/length: "
470 "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
471 EntryType, EntryLength, EntryOffset);
472 break;
473 }
474
475 /* Dump the Device Entry */
476
477 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
478 DeviceEntry, EntryLength, InfoTable);
479 if (ACPI_FAILURE (Status))
480 {
481 return;
482 }
483
484 EntryOffset += EntryLength;
485 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
486 EntryLength);
487 }
488 }
489
490 NextSubtable:
491 /* Point to next subtable */
492
493 Offset += Subtable->Length;
494 Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, Subtable->Length);
495 }
496 }
497
498
499 /*******************************************************************************
500 *
501 * FUNCTION: AcpiDmDumpLpit
502 *
503 * PARAMETERS: Table - A LPIT table
504 *
505 * RETURN: None
506 *
507 * DESCRIPTION: Format the contents of a LPIT. This table type consists
508 * of an open-ended number of subtables. Note: There are no
509 * entries in the main table. An LPIT consists of the table
510 * header and then subtables only.
511 *
512 ******************************************************************************/
513
514 void
515 AcpiDmDumpLpit (
516 ACPI_TABLE_HEADER *Table)
517 {
518 ACPI_STATUS Status;
519 ACPI_LPIT_HEADER *Subtable;
520 UINT32 Length = Table->Length;
521 UINT32 Offset = sizeof (ACPI_TABLE_LPIT);
522 ACPI_DMTABLE_INFO *InfoTable;
523 UINT32 SubtableLength;
524
525
526 /* Subtables */
527
528 Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
529 while (Offset < Table->Length)
530 {
531 /* Common subtable header */
532
533 Status = AcpiDmDumpTable (Length, Offset, Subtable,
534 sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);
535 if (ACPI_FAILURE (Status))
536 {
537 return;
538 }
539
540 switch (Subtable->Type)
541 {
542 case ACPI_LPIT_TYPE_NATIVE_CSTATE:
543
544 InfoTable = AcpiDmTableInfoLpit0;
545 SubtableLength = sizeof (ACPI_LPIT_NATIVE);
546 break;
547
548 default:
549
550 /* Cannot continue on unknown type - no length */
551
552 AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n",
553 Subtable->Type);
554 return;
555 }
556
557 Status = AcpiDmDumpTable (Length, Offset, Subtable,
558 SubtableLength, InfoTable);
559 if (ACPI_FAILURE (Status))
560 {
561 return;
562 }
563
564 AcpiOsPrintf ("\n");
565
566 /* Point to next subtable */
567
568 Offset += SubtableLength;
569 Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Subtable, SubtableLength);
570 }
571 }
572
573
574 /*******************************************************************************
575 *
576 * FUNCTION: AcpiDmDumpMadt
577 *
578 * PARAMETERS: Table - A MADT table
579 *
580 * RETURN: None
581 *
582 * DESCRIPTION: Format the contents of a MADT. This table type consists
583 * of an open-ended number of subtables.
584 *
585 ******************************************************************************/
586
587 void
588 AcpiDmDumpMadt (
589 ACPI_TABLE_HEADER *Table)
590 {
591 ACPI_STATUS Status;
592 ACPI_SUBTABLE_HEADER *Subtable;
593 UINT32 Length = Table->Length;
594 UINT32 Offset = sizeof (ACPI_TABLE_MADT);
595 ACPI_DMTABLE_INFO *InfoTable;
596
597
598 /* Main table */
599
600 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
601 if (ACPI_FAILURE (Status))
602 {
603 return;
604 }
605
606 /* Subtables */
607
608 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
609 while (Offset < Table->Length)
610 {
611 /* Common subtable header */
612
613 AcpiOsPrintf ("\n");
614 Status = AcpiDmDumpTable (Length, Offset, Subtable,
615 Subtable->Length, AcpiDmTableInfoMadtHdr);
616 if (ACPI_FAILURE (Status))
617 {
618 return;
619 }
620
621 switch (Subtable->Type)
622 {
623 case ACPI_MADT_TYPE_LOCAL_APIC:
624
625 InfoTable = AcpiDmTableInfoMadt0;
626 break;
627
628 case ACPI_MADT_TYPE_IO_APIC:
629
630 InfoTable = AcpiDmTableInfoMadt1;
631 break;
632
633 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
634
635 InfoTable = AcpiDmTableInfoMadt2;
636 break;
637
638 case ACPI_MADT_TYPE_NMI_SOURCE:
639
640 InfoTable = AcpiDmTableInfoMadt3;
641 break;
642
643 case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
644
645 InfoTable = AcpiDmTableInfoMadt4;
646 break;
647
648 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
649
650 InfoTable = AcpiDmTableInfoMadt5;
651 break;
652
653 case ACPI_MADT_TYPE_IO_SAPIC:
654
655 InfoTable = AcpiDmTableInfoMadt6;
656 break;
657
658 case ACPI_MADT_TYPE_LOCAL_SAPIC:
659
660 InfoTable = AcpiDmTableInfoMadt7;
661 break;
662
663 case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
664
665 InfoTable = AcpiDmTableInfoMadt8;
666 break;
667
668 case ACPI_MADT_TYPE_LOCAL_X2APIC:
669
670 InfoTable = AcpiDmTableInfoMadt9;
671 break;
672
673 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
674
675 InfoTable = AcpiDmTableInfoMadt10;
676 break;
677
678 case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
679
680 InfoTable = AcpiDmTableInfoMadt11;
681 break;
682
683 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
684
685 InfoTable = AcpiDmTableInfoMadt12;
686 break;
687
688 case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
689
690 InfoTable = AcpiDmTableInfoMadt13;
691 break;
692
693 case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
694
695 InfoTable = AcpiDmTableInfoMadt14;
696 break;
697
698 case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
699
700 InfoTable = AcpiDmTableInfoMadt15;
701 break;
702
703 default:
704
705 AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",
706 Subtable->Type);
707
708 /* Attempt to continue */
709
710 if (!Subtable->Length)
711 {
712 AcpiOsPrintf ("Invalid zero length subtable\n");
713 return;
714 }
715
716 goto NextSubtable;
717 }
718
719 Status = AcpiDmDumpTable (Length, Offset, Subtable,
720 Subtable->Length, InfoTable);
721 if (ACPI_FAILURE (Status))
722 {
723 return;
724 }
725
726 NextSubtable:
727 /* Point to next subtable */
728
729 Offset += Subtable->Length;
730 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable,
731 Subtable->Length);
732 }
733 }
734
735
736 /*******************************************************************************
737 *
738 * FUNCTION: AcpiDmDumpMcfg
739 *
740 * PARAMETERS: Table - A MCFG Table
741 *
742 * RETURN: None
743 *
744 * DESCRIPTION: Format the contents of a MCFG table
745 *
746 ******************************************************************************/
747
748 void
749 AcpiDmDumpMcfg (
750 ACPI_TABLE_HEADER *Table)
751 {
752 ACPI_STATUS Status;
753 UINT32 Offset = sizeof (ACPI_TABLE_MCFG);
754 ACPI_MCFG_ALLOCATION *Subtable;
755
756
757 /* Main table */
758
759 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
760 if (ACPI_FAILURE (Status))
761 {
762 return;
763 }
764
765 /* Subtables */
766
767 Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
768 while (Offset < Table->Length)
769 {
770 if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
771 {
772 AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
773 (UINT32) sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
774 return;
775 }
776
777 AcpiOsPrintf ("\n");
778 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
779 sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
780 if (ACPI_FAILURE (Status))
781 {
782 return;
783 }
784
785 /* Point to next subtable (each subtable is of fixed length) */
786
787 Offset += sizeof (ACPI_MCFG_ALLOCATION);
788 Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Subtable,
789 sizeof (ACPI_MCFG_ALLOCATION));
790 }
791 }
792
793
794 /*******************************************************************************
795 *
796 * FUNCTION: AcpiDmDumpMpst
797 *
798 * PARAMETERS: Table - A MPST Table
799 *
800 * RETURN: None
801 *
802 * DESCRIPTION: Format the contents of a MPST table
803 *
804 ******************************************************************************/
805
806 void
807 AcpiDmDumpMpst (
808 ACPI_TABLE_HEADER *Table)
809 {
810 ACPI_STATUS Status;
811 UINT32 Offset = sizeof (ACPI_TABLE_MPST);
812 ACPI_MPST_POWER_NODE *Subtable0;
813 ACPI_MPST_POWER_STATE *Subtable0A;
814 ACPI_MPST_COMPONENT *Subtable0B;
815 ACPI_MPST_DATA_HDR *Subtable1;
816 ACPI_MPST_POWER_DATA *Subtable2;
817 UINT16 SubtableCount;
818 UINT32 PowerStateCount;
819 UINT32 ComponentCount;
820
821
822 /* Main table */
823
824 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
825 if (ACPI_FAILURE (Status))
826 {
827 return;
828 }
829
830 /* Subtable: Memory Power Node(s) */
831
832 SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
833 Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
834
835 while ((Offset < Table->Length) && SubtableCount)
836 {
837 AcpiOsPrintf ("\n");
838 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0,
839 sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
840 if (ACPI_FAILURE (Status))
841 {
842 return;
843 }
844
845 /* Extract the sub-subtable counts */
846
847 PowerStateCount = Subtable0->NumPowerStates;
848 ComponentCount = Subtable0->NumPhysicalComponents;
849 Offset += sizeof (ACPI_MPST_POWER_NODE);
850
851 /* Sub-subtables - Memory Power State Structure(s) */
852
853 Subtable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, Subtable0,
854 sizeof (ACPI_MPST_POWER_NODE));
855
856 while (PowerStateCount)
857 {
858 AcpiOsPrintf ("\n");
859 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A,
860 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
861 if (ACPI_FAILURE (Status))
862 {
863 return;
864 }
865
866 Subtable0A++;
867 PowerStateCount--;
868 Offset += sizeof (ACPI_MPST_POWER_STATE);
869 }
870
871 /* Sub-subtables - Physical Component ID Structure(s) */
872
873 Subtable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, Subtable0A);
874
875 if (ComponentCount)
876 {
877 AcpiOsPrintf ("\n");
878 }
879
880 while (ComponentCount)
881 {
882 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B,
883 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
884 if (ACPI_FAILURE (Status))
885 {
886 return;
887 }
888
889 Subtable0B++;
890 ComponentCount--;
891 Offset += sizeof (ACPI_MPST_COMPONENT);
892 }
893
894 /* Point to next Memory Power Node subtable */
895
896 SubtableCount--;
897 Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Subtable0,
898 sizeof (ACPI_MPST_POWER_NODE) +
899 (sizeof (ACPI_MPST_POWER_STATE) * Subtable0->NumPowerStates) +
900 (sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents));
901 }
902
903 /* Subtable: Count of Memory Power State Characteristic structures */
904
905 AcpiOsPrintf ("\n");
906 Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0);
907 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1,
908 sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
909 if (ACPI_FAILURE (Status))
910 {
911 return;
912 }
913
914 SubtableCount = Subtable1->CharacteristicsCount;
915 Offset += sizeof (ACPI_MPST_DATA_HDR);
916
917 /* Subtable: Memory Power State Characteristics structure(s) */
918
919 Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1,
920 sizeof (ACPI_MPST_DATA_HDR));
921
922 while ((Offset < Table->Length) && SubtableCount)
923 {
924 AcpiOsPrintf ("\n");
925 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2,
926 sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
927 if (ACPI_FAILURE (Status))
928 {
929 return;
930 }
931
932 Subtable2++;
933 SubtableCount--;
934 Offset += sizeof (ACPI_MPST_POWER_DATA);
935 }
936 }
937
938
939 /*******************************************************************************
940 *
941 * FUNCTION: AcpiDmDumpMsct
942 *
943 * PARAMETERS: Table - A MSCT table
944 *
945 * RETURN: None
946 *
947 * DESCRIPTION: Format the contents of a MSCT
948 *
949 ******************************************************************************/
950
951 void
952 AcpiDmDumpMsct (
953 ACPI_TABLE_HEADER *Table)
954 {
955 ACPI_STATUS Status;
956 UINT32 Offset = sizeof (ACPI_TABLE_MSCT);
957 ACPI_MSCT_PROXIMITY *Subtable;
958
959
960 /* Main table */
961
962 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
963 if (ACPI_FAILURE (Status))
964 {
965 return;
966 }
967
968 /* Subtables */
969
970 Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
971 while (Offset < Table->Length)
972 {
973 /* Common subtable header */
974
975 AcpiOsPrintf ("\n");
976 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
977 sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
978 if (ACPI_FAILURE (Status))
979 {
980 return;
981 }
982
983 /* Point to next subtable */
984
985 Offset += sizeof (ACPI_MSCT_PROXIMITY);
986 Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Subtable,
987 sizeof (ACPI_MSCT_PROXIMITY));
988 }
989 }
990
991
992 /*******************************************************************************
993 *
994 * FUNCTION: AcpiDmDumpMtmr
995 *
996 * PARAMETERS: Table - A MTMR table
997 *
998 * RETURN: None
999 *
1000 * DESCRIPTION: Format the contents of a MTMR
1001 *
1002 ******************************************************************************/
1003
1004 void
1005 AcpiDmDumpMtmr (
1006 ACPI_TABLE_HEADER *Table)
1007 {
1008 ACPI_STATUS Status;
1009 UINT32 Offset = sizeof (ACPI_TABLE_MTMR);
1010 ACPI_MTMR_ENTRY *Subtable;
1011
1012
1013 /* Main table */
1014
1015 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMtmr);
1016 if (ACPI_FAILURE (Status))
1017 {
1018 return;
1019 }
1020
1021 /* Subtables */
1022
1023 Subtable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset);
1024 while (Offset < Table->Length)
1025 {
1026 /* Common subtable header */
1027
1028 AcpiOsPrintf ("\n");
1029 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1030 sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0);
1031 if (ACPI_FAILURE (Status))
1032 {
1033 return;
1034 }
1035
1036 /* Point to next subtable */
1037
1038 Offset += sizeof (ACPI_MTMR_ENTRY);
1039 Subtable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Subtable,
1040 sizeof (ACPI_MTMR_ENTRY));
1041 }
1042 }
1043
1044
1045 /*******************************************************************************
1046 *
1047 * FUNCTION: AcpiDmDumpNfit
1048 *
1049 * PARAMETERS: Table - A NFIT table
1050 *
1051 * RETURN: None
1052 *
1053 * DESCRIPTION: Format the contents of an NFIT.
1054 *
1055 ******************************************************************************/
1056
1057 void
1058 AcpiDmDumpNfit (
1059 ACPI_TABLE_HEADER *Table)
1060 {
1061 ACPI_STATUS Status;
1062 UINT32 Offset = sizeof (ACPI_TABLE_NFIT);
1063 UINT32 FieldOffset = 0;
1064 UINT32 Length;
1065 ACPI_NFIT_HEADER *Subtable;
1066 ACPI_DMTABLE_INFO *InfoTable;
1067 ACPI_NFIT_INTERLEAVE *Interleave = NULL;
1068 ACPI_NFIT_SMBIOS *SmbiosInfo = NULL;
1069 ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
1070 UINT32 i;
1071
1072
1073 /* Main table */
1074
1075 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
1076 if (ACPI_FAILURE (Status))
1077 {
1078 return;
1079 }
1080
1081 /* Subtables */
1082
1083 Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
1084 while (Offset < Table->Length)
1085 {
1086 /* NFIT subtable header */
1087
1088 AcpiOsPrintf ("\n");
1089 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1090 Subtable->Length, AcpiDmTableInfoNfitHdr);
1091 if (ACPI_FAILURE (Status))
1092 {
1093 return;
1094 }
1095
1096 switch (Subtable->Type)
1097 {
1098 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
1099
1100 InfoTable = AcpiDmTableInfoNfit0;
1101 break;
1102
1103 case ACPI_NFIT_TYPE_MEMORY_MAP:
1104
1105 InfoTable = AcpiDmTableInfoNfit1;
1106 break;
1107
1108 case ACPI_NFIT_TYPE_INTERLEAVE:
1109
1110 /* Has a variable number of 32-bit values at the end */
1111
1112 InfoTable = AcpiDmTableInfoNfit2;
1113 FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);
1114 break;
1115
1116 case ACPI_NFIT_TYPE_SMBIOS:
1117
1118 SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, Subtable);
1119 InfoTable = AcpiDmTableInfoNfit3;
1120 break;
1121
1122 case ACPI_NFIT_TYPE_CONTROL_REGION:
1123
1124 InfoTable = AcpiDmTableInfoNfit4;
1125 break;
1126
1127 case ACPI_NFIT_TYPE_DATA_REGION:
1128
1129 InfoTable = AcpiDmTableInfoNfit5;
1130 break;
1131
1132 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
1133
1134 /* Has a variable number of 64-bit addresses at the end */
1135
1136 InfoTable = AcpiDmTableInfoNfit6;
1137 FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64);
1138 break;
1139
1140 case ACPI_NFIT_TYPE_CAPABILITIES: /* ACPI 6.0A */
1141
1142 InfoTable = AcpiDmTableInfoNfit7;
1143 break;
1144
1145 default:
1146 AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
1147 Subtable->Type);
1148
1149 /* Attempt to continue */
1150
1151 if (!Subtable->Length)
1152 {
1153 AcpiOsPrintf ("Invalid zero length subtable\n");
1154 return;
1155 }
1156 goto NextSubtable;
1157 }
1158
1159 AcpiOsPrintf ("\n");
1160 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1161 Subtable->Length, InfoTable);
1162 if (ACPI_FAILURE (Status))
1163 {
1164 return;
1165 }
1166
1167 /* Per-subtable variable-length fields */
1168
1169 switch (Subtable->Type)
1170 {
1171 case ACPI_NFIT_TYPE_INTERLEAVE:
1172
1173 Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable);
1174 for (i = 0; i < Interleave->LineCount; i++)
1175 {
1176 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
1177 &Interleave->LineOffset[i],
1178 sizeof (UINT32), AcpiDmTableInfoNfit2a);
1179 if (ACPI_FAILURE (Status))
1180 {
1181 return;
1182 }
1183
1184 FieldOffset += sizeof (UINT32);
1185 }
1186 break;
1187
1188 case ACPI_NFIT_TYPE_SMBIOS:
1189
1190 Length = Subtable->Length -
1191 sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
1192
1193 if (Length)
1194 {
1195 Status = AcpiDmDumpTable (Table->Length,
1196 sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
1197 SmbiosInfo,
1198 Length, AcpiDmTableInfoNfit3a);
1199 if (ACPI_FAILURE (Status))
1200 {
1201 return;
1202 }
1203 }
1204
1205 break;
1206
1207 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
1208
1209 Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable);
1210 for (i = 0; i < Hint->HintCount; i++)
1211 {
1212 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
1213 &Hint->HintAddress[i],
1214 sizeof (UINT64), AcpiDmTableInfoNfit6a);
1215 if (ACPI_FAILURE (Status))
1216 {
1217 return;
1218 }
1219
1220 FieldOffset += sizeof (UINT64);
1221 }
1222 break;
1223
1224 default:
1225 break;
1226 }
1227
1228 NextSubtable:
1229 /* Point to next subtable */
1230
1231 Offset += Subtable->Length;
1232 Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length);
1233 }
1234 }
1235
1236
1237 /*******************************************************************************
1238 *
1239 * FUNCTION: AcpiDmDumpPcct
1240 *
1241 * PARAMETERS: Table - A PCCT table
1242 *
1243 * RETURN: None
1244 *
1245 * DESCRIPTION: Format the contents of a PCCT. This table type consists
1246 * of an open-ended number of subtables.
1247 *
1248 ******************************************************************************/
1249
1250 void
1251 AcpiDmDumpPcct (
1252 ACPI_TABLE_HEADER *Table)
1253 {
1254 ACPI_STATUS Status;
1255 ACPI_PCCT_SUBSPACE *Subtable;
1256 ACPI_DMTABLE_INFO *InfoTable;
1257 UINT32 Length = Table->Length;
1258 UINT32 Offset = sizeof (ACPI_TABLE_PCCT);
1259
1260
1261 /* Main table */
1262
1263 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
1264 if (ACPI_FAILURE (Status))
1265 {
1266 return;
1267 }
1268
1269 /* Subtables */
1270
1271 Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
1272 while (Offset < Table->Length)
1273 {
1274 /* Common subtable header */
1275
1276 AcpiOsPrintf ("\n");
1277 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1278 Subtable->Header.Length, AcpiDmTableInfoPcctHdr);
1279 if (ACPI_FAILURE (Status))
1280 {
1281 return;
1282 }
1283
1284 switch (Subtable->Header.Type)
1285 {
1286 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
1287
1288 InfoTable = AcpiDmTableInfoPcct0;
1289 break;
1290
1291 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
1292
1293 InfoTable = AcpiDmTableInfoPcct1;
1294 break;
1295
1296 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
1297
1298 InfoTable = AcpiDmTableInfoPcct2;
1299 break;
1300
1301 case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
1302
1303 InfoTable = AcpiDmTableInfoPcct3;
1304 break;
1305
1306 case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
1307
1308 InfoTable = AcpiDmTableInfoPcct4;
1309 break;
1310
1311 default:
1312
1313 AcpiOsPrintf (
1314 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
1315 Subtable->Header.Type);
1316 return;
1317 }
1318
1319 AcpiOsPrintf ("\n");
1320 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1321 Subtable->Header.Length, InfoTable);
1322 if (ACPI_FAILURE (Status))
1323 {
1324 return;
1325 }
1326
1327 /* Point to next subtable */
1328
1329 Offset += Subtable->Header.Length;
1330 Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Subtable,
1331 Subtable->Header.Length);
1332 }
1333 }
1334
1335
1336 /*******************************************************************************
1337 *
1338 * FUNCTION: AcpiDmDumpPdtt
1339 *
1340 * PARAMETERS: Table - A PDTT table
1341 *
1342 * RETURN: None
1343 *
1344 * DESCRIPTION: Format the contents of a Pdtt. This is a variable-length
1345 * table that contains an open-ended number of IDs
1346 * at the end of the table.
1347 *
1348 ******************************************************************************/
1349
1350 void
1351 AcpiDmDumpPdtt (
1352 ACPI_TABLE_HEADER *Table)
1353 {
1354 ACPI_STATUS Status;
1355 ACPI_PDTT_CHANNEL *Subtable;
1356 UINT32 Length = Table->Length;
1357 UINT32 Offset = sizeof (ACPI_TABLE_PDTT);
1358
1359
1360 /* Main table */
1361
1362 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt);
1363 if (ACPI_FAILURE (Status))
1364 {
1365 return;
1366 }
1367
1368 /* Subtables. Currently there is only one type, but can be multiples */
1369
1370 Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset);
1371 while (Offset < Table->Length)
1372 {
1373 AcpiOsPrintf ("\n");
1374 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1375 sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0);
1376 if (ACPI_FAILURE (Status))
1377 {
1378 return;
1379 }
1380
1381 /* Point to next subtable */
1382
1383 Offset += sizeof (ACPI_PDTT_CHANNEL);
1384 Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Subtable,
1385 sizeof (ACPI_PDTT_CHANNEL));
1386 }
1387 }
1388
1389
1390 /*******************************************************************************
1391 *
1392 * FUNCTION: AcpiDmDumpPmtt
1393 *
1394 * PARAMETERS: Table - A PMTT table
1395 *
1396 * RETURN: None
1397 *
1398 * DESCRIPTION: Format the contents of a PMTT. This table type consists
1399 * of an open-ended number of subtables.
1400 *
1401 ******************************************************************************/
1402
1403 void
1404 AcpiDmDumpPmtt (
1405 ACPI_TABLE_HEADER *Table)
1406 {
1407 ACPI_STATUS Status;
1408 ACPI_PMTT_HEADER *Subtable;
1409 ACPI_PMTT_HEADER *MemSubtable;
1410 ACPI_PMTT_HEADER *DimmSubtable;
1411 ACPI_PMTT_DOMAIN *DomainArray;
1412 UINT32 Length = Table->Length;
1413 UINT32 Offset = sizeof (ACPI_TABLE_PMTT);
1414 UINT32 MemOffset;
1415 UINT32 DimmOffset;
1416 UINT32 DomainOffset;
1417 UINT32 DomainCount;
1418
1419
1420 /* Main table */
1421
1422 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
1423 if (ACPI_FAILURE (Status))
1424 {
1425 return;
1426 }
1427
1428 /* Subtables */
1429
1430 Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
1431 while (Offset < Table->Length)
1432 {
1433 /* Common subtable header */
1434
1435 AcpiOsPrintf ("\n");
1436 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1437 Subtable->Length, AcpiDmTableInfoPmttHdr);
1438 if (ACPI_FAILURE (Status))
1439 {
1440 return;
1441 }
1442
1443 /* Only Socket subtables are expected at this level */
1444
1445 if (Subtable->Type != ACPI_PMTT_TYPE_SOCKET)
1446 {
1447 AcpiOsPrintf (
1448 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
1449 Subtable->Type);
1450 return;
1451 }
1452
1453 /* Dump the fixed-length portion of the subtable */
1454
1455 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1456 Subtable->Length, AcpiDmTableInfoPmtt0);
1457 if (ACPI_FAILURE (Status))
1458 {
1459 return;
1460 }
1461
1462 /* Walk the memory controller subtables */
1463
1464 MemOffset = sizeof (ACPI_PMTT_SOCKET);
1465 MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Subtable,
1466 sizeof (ACPI_PMTT_SOCKET));
1467
1468 while (((Offset + MemOffset) < Table->Length) &&
1469 (MemOffset < Subtable->Length))
1470 {
1471 /* Common subtable header */
1472
1473 AcpiOsPrintf ("\n");
1474 Status = AcpiDmDumpTable (Length,
1475 Offset + MemOffset, MemSubtable,
1476 MemSubtable->Length, AcpiDmTableInfoPmttHdr);
1477 if (ACPI_FAILURE (Status))
1478 {
1479 return;
1480 }
1481
1482 /* Only memory controller subtables are expected at this level */
1483
1484 if (MemSubtable->Type != ACPI_PMTT_TYPE_CONTROLLER)
1485 {
1486 AcpiOsPrintf (
1487 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
1488 MemSubtable->Type);
1489 return;
1490 }
1491
1492 /* Dump the fixed-length portion of the controller subtable */
1493
1494 Status = AcpiDmDumpTable (Length,
1495 Offset + MemOffset, MemSubtable,
1496 MemSubtable->Length, AcpiDmTableInfoPmtt1);
1497 if (ACPI_FAILURE (Status))
1498 {
1499 return;
1500 }
1501
1502 /* Walk the variable count of proximity domains */
1503
1504 DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubtable)->DomainCount;
1505 DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
1506 DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubtable,
1507 sizeof (ACPI_PMTT_CONTROLLER));
1508
1509 while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
1510 ((MemOffset + DomainOffset) < Subtable->Length) &&
1511 DomainCount)
1512 {
1513 Status = AcpiDmDumpTable (Length,
1514 Offset + MemOffset + DomainOffset, DomainArray,
1515 sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
1516 if (ACPI_FAILURE (Status))
1517 {
1518 return;
1519 }
1520
1521 DomainOffset += sizeof (ACPI_PMTT_DOMAIN);
1522 DomainArray++;
1523 DomainCount--;
1524 }
1525
1526 if (DomainCount)
1527 {
1528 AcpiOsPrintf (
1529 "\n**** DomainCount exceeds subtable length\n\n");
1530 }
1531
1532 /* Walk the physical component (DIMM) subtables */
1533
1534 DimmOffset = DomainOffset;
1535 DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubtable,
1536 DomainOffset);
1537
1538 while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
1539 (DimmOffset < MemSubtable->Length))
1540 {
1541 /* Common subtable header */
1542
1543 AcpiOsPrintf ("\n");
1544 Status = AcpiDmDumpTable (Length,
1545 Offset + MemOffset + DimmOffset, DimmSubtable,
1546 DimmSubtable->Length, AcpiDmTableInfoPmttHdr);
1547 if (ACPI_FAILURE (Status))
1548 {
1549 return;
1550 }
1551
1552 /* Only DIMM subtables are expected at this level */
1553
1554 if (DimmSubtable->Type != ACPI_PMTT_TYPE_DIMM)
1555 {
1556 AcpiOsPrintf (
1557 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
1558 DimmSubtable->Type);
1559 return;
1560 }
1561
1562 /* Dump the fixed-length DIMM subtable */
1563
1564 Status = AcpiDmDumpTable (Length,
1565 Offset + MemOffset + DimmOffset, DimmSubtable,
1566 DimmSubtable->Length, AcpiDmTableInfoPmtt2);
1567 if (ACPI_FAILURE (Status))
1568 {
1569 return;
1570 }
1571
1572 /* Point to next DIMM subtable */
1573
1574 DimmOffset += DimmSubtable->Length;
1575 DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
1576 DimmSubtable, DimmSubtable->Length);
1577 }
1578
1579 /* Point to next Controller subtable */
1580
1581 MemOffset += MemSubtable->Length;
1582 MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
1583 MemSubtable, MemSubtable->Length);
1584 }
1585
1586 /* Point to next Socket subtable */
1587
1588 Offset += Subtable->Length;
1589 Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
1590 Subtable, Subtable->Length);
1591 }
1592 }
1593
1594
1595 /*******************************************************************************
1596 *
1597 * FUNCTION: AcpiDmDumpPptt
1598 *
1599 * PARAMETERS: Table - A PMTT table
1600 *
1601 * RETURN: None
1602 *
1603 * DESCRIPTION: Format the contents of a PPTT. This table type consists
1604 * of an open-ended number of subtables.
1605 *
1606 ******************************************************************************/
1607
1608 void
1609 AcpiDmDumpPptt (
1610 ACPI_TABLE_HEADER *Table)
1611 {
1612 ACPI_STATUS Status;
1613 ACPI_SUBTABLE_HEADER *Subtable;
1614 ACPI_PPTT_PROCESSOR *PpttProcessor;
1615 UINT8 Length;
1616 UINT8 SubtableOffset;
1617 UINT32 Offset = sizeof (ACPI_TABLE_FPDT);
1618 ACPI_DMTABLE_INFO *InfoTable;
1619 UINT32 i;
1620
1621
1622 /* There is no main table (other than the standard ACPI header) */
1623
1624 /* Subtables */
1625
1626 Offset = sizeof (ACPI_TABLE_HEADER);
1627 while (Offset < Table->Length)
1628 {
1629 AcpiOsPrintf ("\n");
1630
1631 /* Common subtable header */
1632
1633 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
1634 if (Subtable->Length < sizeof (ACPI_SUBTABLE_HEADER))
1635 {
1636 AcpiOsPrintf ("Invalid subtable length\n");
1637 return;
1638 }
1639 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1640 Subtable->Length, AcpiDmTableInfoPpttHdr);
1641 if (ACPI_FAILURE (Status))
1642 {
1643 return;
1644 }
1645
1646 switch (Subtable->Type)
1647 {
1648 case ACPI_PPTT_TYPE_PROCESSOR:
1649
1650 InfoTable = AcpiDmTableInfoPptt0;
1651 Length = sizeof (ACPI_PPTT_PROCESSOR);
1652 break;
1653
1654 case ACPI_PPTT_TYPE_CACHE:
1655
1656 InfoTable = AcpiDmTableInfoPptt1;
1657 Length = sizeof (ACPI_PPTT_CACHE);
1658 break;
1659
1660 case ACPI_PPTT_TYPE_ID:
1661
1662 InfoTable = AcpiDmTableInfoPptt2;
1663 Length = sizeof (ACPI_PPTT_ID);
1664 break;
1665
1666 default:
1667
1668 AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n",
1669 Subtable->Type);
1670
1671 /* Attempt to continue */
1672
1673 goto NextSubtable;
1674 }
1675
1676 if (Subtable->Length < Length)
1677 {
1678 AcpiOsPrintf ("Invalid subtable length\n");
1679 return;
1680 }
1681 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1682 Subtable->Length, InfoTable);
1683 if (ACPI_FAILURE (Status))
1684 {
1685 return;
1686 }
1687 SubtableOffset = Length;
1688
1689 switch (Subtable->Type)
1690 {
1691 case ACPI_PPTT_TYPE_PROCESSOR:
1692
1693 PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, Subtable);
1694
1695 /* Dump SMBIOS handles */
1696
1697 if ((UINT8)(Subtable->Length - SubtableOffset) <
1698 (UINT8)(PpttProcessor->NumberOfPrivResources * 4))
1699 {
1700 AcpiOsPrintf ("Invalid private resource number\n");
1701 return;
1702 }
1703 for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++)
1704 {
1705 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
1706 ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
1707 4, AcpiDmTableInfoPptt0a);
1708 if (ACPI_FAILURE (Status))
1709 {
1710 return;
1711 }
1712
1713 SubtableOffset += 4;
1714 }
1715 break;
1716
1717 default:
1718
1719 break;
1720 }
1721
1722 NextSubtable:
1723 /* Point to next subtable */
1724
1725 Offset += Subtable->Length;
1726 }
1727 }
1728
1729
1730 /*******************************************************************************
1731 *
1732 * FUNCTION: AcpiDmDumpS3pt
1733 *
1734 * PARAMETERS: Table - A S3PT table
1735 *
1736 * RETURN: Length of the table
1737 *
1738 * DESCRIPTION: Format the contents of a S3PT
1739 *
1740 ******************************************************************************/
1741
1742 UINT32
1743 AcpiDmDumpS3pt (
1744 ACPI_TABLE_HEADER *Tables)
1745 {
1746 ACPI_STATUS Status;
1747 UINT32 Offset = sizeof (ACPI_TABLE_S3PT);
1748 ACPI_FPDT_HEADER *Subtable;
1749 ACPI_DMTABLE_INFO *InfoTable;
1750 ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
1751
1752
1753 /* Main table */
1754
1755 Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
1756 if (ACPI_FAILURE (Status))
1757 {
1758 return 0;
1759 }
1760
1761 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);
1762 while (Offset < S3ptTable->Length)
1763 {
1764 /* Common subtable header */
1765
1766 AcpiOsPrintf ("\n");
1767 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
1768 Subtable->Length, AcpiDmTableInfoS3ptHdr);
1769 if (ACPI_FAILURE (Status))
1770 {
1771 return 0;
1772 }
1773
1774 switch (Subtable->Type)
1775 {
1776 case ACPI_S3PT_TYPE_RESUME:
1777
1778 InfoTable = AcpiDmTableInfoS3pt0;
1779 break;
1780
1781 case ACPI_S3PT_TYPE_SUSPEND:
1782
1783 InfoTable = AcpiDmTableInfoS3pt1;
1784 break;
1785
1786 default:
1787
1788 AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n",
1789 Subtable->Type);
1790
1791 /* Attempt to continue */
1792
1793 if (!Subtable->Length)
1794 {
1795 AcpiOsPrintf ("Invalid zero length subtable\n");
1796 return 0;
1797 }
1798 goto NextSubtable;
1799 }
1800
1801 AcpiOsPrintf ("\n");
1802 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
1803 Subtable->Length, InfoTable);
1804 if (ACPI_FAILURE (Status))
1805 {
1806 return 0;
1807 }
1808
1809 NextSubtable:
1810 /* Point to next subtable */
1811
1812 Offset += Subtable->Length;
1813 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length);
1814 }
1815
1816 return (S3ptTable->Length);
1817 }
1818
1819
1820 /*******************************************************************************
1821 *
1822 * FUNCTION: AcpiDmDumpSdev
1823 *
1824 * PARAMETERS: Table - A SDEV table
1825 *
1826 * RETURN: None
1827 *
1828 * DESCRIPTION: Format the contents of a SDEV. This is a variable-length
1829 * table that contains variable strings and vendor data.
1830 *
1831 ******************************************************************************/
1832
1833 void
1834 AcpiDmDumpSdev (
1835 ACPI_TABLE_HEADER *Table)
1836 {
1837 ACPI_STATUS Status;
1838 ACPI_SDEV_HEADER *Subtable;
1839 ACPI_SDEV_PCIE *Pcie;
1840 ACPI_SDEV_NAMESPACE *Namesp;
1841 ACPI_DMTABLE_INFO *InfoTable;
1842 UINT32 Length = Table->Length;
1843 UINT32 Offset = sizeof (ACPI_TABLE_SDEV);
1844 UINT16 PathOffset;
1845 UINT16 PathLength;
1846 UINT16 VendorDataOffset;
1847 UINT16 VendorDataLength;
1848
1849
1850 /* Main table */
1851
1852 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev);
1853 if (ACPI_FAILURE (Status))
1854 {
1855 return;
1856 }
1857
1858 /* Subtables */
1859
1860 Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset);
1861 while (Offset < Table->Length)
1862 {
1863 /* Common subtable header */
1864
1865 AcpiOsPrintf ("\n");
1866 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1867 Subtable->Length, AcpiDmTableInfoSdevHdr);
1868 if (ACPI_FAILURE (Status))
1869 {
1870 return;
1871 }
1872
1873 switch (Subtable->Type)
1874 {
1875 case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
1876
1877 InfoTable = AcpiDmTableInfoSdev0;
1878 break;
1879
1880 case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
1881
1882 InfoTable = AcpiDmTableInfoSdev1;
1883 break;
1884
1885 default:
1886 goto NextSubtable;
1887 }
1888
1889 AcpiOsPrintf ("\n");
1890 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1891 Subtable->Length, InfoTable);
1892 if (ACPI_FAILURE (Status))
1893 {
1894 return;
1895 }
1896
1897 switch (Subtable->Type)
1898 {
1899 case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
1900
1901 /* Dump the PCIe device ID(s) */
1902
1903 Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);
1904 PathOffset = Namesp->DeviceIdOffset;
1905 PathLength = Namesp->DeviceIdLength;
1906
1907 if (PathLength)
1908 {
1909 Status = AcpiDmDumpTable (Table->Length, 0,
1910 ACPI_ADD_PTR (UINT8, Namesp, PathOffset),
1911 PathLength, AcpiDmTableInfoSdev0a);
1912 if (ACPI_FAILURE (Status))
1913 {
1914 return;
1915 }
1916 }
1917
1918 /* Dump the vendor-specific data */
1919
1920 VendorDataLength =
1921 Namesp->VendorDataLength;
1922 VendorDataOffset =
1923 Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
1924
1925 if (VendorDataLength)
1926 {
1927 Status = AcpiDmDumpTable (Table->Length, 0,
1928 ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset),
1929 VendorDataLength, AcpiDmTableInfoSdev1b);
1930 if (ACPI_FAILURE (Status))
1931 {
1932 return;
1933 }
1934 }
1935 break;
1936
1937 case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
1938
1939 /* PCI path substructures */
1940
1941 Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable);
1942 PathOffset = Pcie->PathOffset;
1943 PathLength = Pcie->PathLength;
1944
1945 while (PathLength)
1946 {
1947 Status = AcpiDmDumpTable (Table->Length,
1948 PathOffset + Offset,
1949 ACPI_ADD_PTR (UINT8, Pcie, PathOffset),
1950 sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a);
1951 if (ACPI_FAILURE (Status))
1952 {
1953 return;
1954 }
1955
1956 PathOffset += sizeof (ACPI_SDEV_PCIE_PATH);
1957 PathLength -= sizeof (ACPI_SDEV_PCIE_PATH);
1958 }
1959
1960 /* VendorData */
1961
1962 VendorDataLength = Pcie->VendorDataLength;
1963 VendorDataOffset = Pcie->PathOffset + Pcie->PathLength;
1964
1965 if (VendorDataLength)
1966 {
1967 Status = AcpiDmDumpTable (Table->Length, 0,
1968 ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset),
1969 VendorDataLength, AcpiDmTableInfoSdev1b);
1970 if (ACPI_FAILURE (Status))
1971 {
1972 return;
1973 }
1974 }
1975 break;
1976
1977 default:
1978 goto NextSubtable;
1979 }
1980
1981 NextSubtable:
1982 /* Point to next subtable */
1983
1984 Offset += Subtable->Length;
1985 Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable,
1986 Subtable->Length);
1987 }
1988 }
1989