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