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