dmtbdump2.c revision 1.1.1.10 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 #include "aslcompiler.h"
49
50 /* This module used for application-level code only */
51
52 #define _COMPONENT ACPI_CA_DISASSEMBLER
53 ACPI_MODULE_NAME ("dmtbdump2")
54
55
56 /*******************************************************************************
57 *
58 * FUNCTION: AcpiDmDumpIort
59 *
60 * PARAMETERS: Table - A IORT table
61 *
62 * RETURN: None
63 *
64 * DESCRIPTION: Format the contents of a IORT
65 *
66 ******************************************************************************/
67
68 void
69 AcpiDmDumpIort (
70 ACPI_TABLE_HEADER *Table)
71 {
72 ACPI_STATUS Status;
73 ACPI_TABLE_IORT *Iort;
74 ACPI_IORT_NODE *IortNode;
75 ACPI_IORT_ITS_GROUP *IortItsGroup = NULL;
76 ACPI_IORT_SMMU *IortSmmu = NULL;
77 ACPI_IORT_RMR *IortRmr = NULL;
78 UINT32 Offset;
79 UINT32 NodeOffset;
80 UINT32 Length;
81 ACPI_DMTABLE_INFO *InfoTable;
82 char *String;
83 UINT32 i;
84 UINT32 MappingByteLength;
85 UINT8 Revision;
86
87
88 /* Main table */
89
90 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort);
91 if (ACPI_FAILURE (Status))
92 {
93 return;
94 }
95
96 Revision = Table->Revision;
97
98 /* Both IORT Rev E and E.a have known issues and are not supported */
99
100 if (Revision == 1 || Revision == 2)
101 {
102 AcpiOsPrintf ("\n**** Unsupported IORT revision 0x%X\n",
103 Revision);
104 return;
105 }
106
107 Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);
108 Offset = sizeof (ACPI_TABLE_IORT);
109
110 /* Dump the OptionalPadding (optional) */
111
112 if (Iort->NodeOffset > Offset)
113 {
114 Status = AcpiDmDumpTable (Table->Length, Offset, Table,
115 Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad);
116 if (ACPI_FAILURE (Status))
117 {
118 return;
119 }
120 }
121
122 Offset = Iort->NodeOffset;
123 while (Offset < Table->Length)
124 {
125 /* Common subtable header */
126
127 IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
128 AcpiOsPrintf ("\n");
129 Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
130
131 if (Revision == 0)
132 {
133 Status = AcpiDmDumpTable (Table->Length, Offset,
134 IortNode, Length, AcpiDmTableInfoIortHdr);
135 }
136 else if (Revision >= 3)
137 {
138 Status = AcpiDmDumpTable (Table->Length, Offset,
139 IortNode, Length, AcpiDmTableInfoIortHdr3);
140 }
141
142 if (ACPI_FAILURE (Status))
143 {
144 return;
145 }
146
147 NodeOffset = Length;
148
149 switch (IortNode->Type)
150 {
151 case ACPI_IORT_NODE_ITS_GROUP:
152
153 InfoTable = AcpiDmTableInfoIort0;
154 Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers);
155 IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset);
156 break;
157
158 case ACPI_IORT_NODE_NAMED_COMPONENT:
159
160 InfoTable = AcpiDmTableInfoIort1;
161 Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName);
162 String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length);
163 Length += strlen (String) + 1;
164 break;
165
166 case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
167
168 InfoTable = AcpiDmTableInfoIort2;
169 Length = IortNode->Length - NodeOffset;
170 break;
171
172 case ACPI_IORT_NODE_SMMU:
173
174 InfoTable = AcpiDmTableInfoIort3;
175 Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts);
176 IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset);
177 break;
178
179 case ACPI_IORT_NODE_SMMU_V3:
180
181 InfoTable = AcpiDmTableInfoIort4;
182 Length = IortNode->Length - NodeOffset;
183 break;
184
185 case ACPI_IORT_NODE_PMCG:
186
187 InfoTable = AcpiDmTableInfoIort5;
188 Length = IortNode->Length - NodeOffset;
189 break;
190
191 case ACPI_IORT_NODE_RMR:
192
193 InfoTable = AcpiDmTableInfoIort6;
194 Length = IortNode->Length - NodeOffset;
195 IortRmr = ACPI_ADD_PTR (ACPI_IORT_RMR, IortNode, NodeOffset);
196 break;
197
198 default:
199
200 AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",
201 IortNode->Type);
202
203 /* Attempt to continue */
204
205 if (!IortNode->Length)
206 {
207 AcpiOsPrintf ("Invalid zero length IORT node\n");
208 return;
209 }
210 goto NextSubtable;
211 }
212
213 /* Dump the node subtable header */
214
215 AcpiOsPrintf ("\n");
216 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
217 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
218 Length, InfoTable);
219 if (ACPI_FAILURE (Status))
220 {
221 return;
222 }
223
224 NodeOffset += Length;
225
226 /* Dump the node specific data */
227
228 switch (IortNode->Type)
229 {
230 case ACPI_IORT_NODE_ITS_GROUP:
231
232 /* Validate IortItsGroup to avoid compiler warnings */
233
234 if (IortItsGroup)
235 {
236 for (i = 0; i < IortItsGroup->ItsCount; i++)
237 {
238 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
239 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
240 4, AcpiDmTableInfoIort0a);
241 if (ACPI_FAILURE (Status))
242 {
243 return;
244 }
245
246 NodeOffset += 4;
247 }
248 }
249 break;
250
251 case ACPI_IORT_NODE_NAMED_COMPONENT:
252
253 /* Dump the Padding (optional) */
254
255 if (IortNode->Length > NodeOffset)
256 {
257 MappingByteLength =
258 IortNode->MappingCount * sizeof (ACPI_IORT_ID_MAPPING);
259 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
260 Table, IortNode->Length - NodeOffset - MappingByteLength,
261 AcpiDmTableInfoIort1a);
262 if (ACPI_FAILURE (Status))
263 {
264 return;
265 }
266 }
267 break;
268
269 case ACPI_IORT_NODE_SMMU:
270
271 AcpiOsPrintf ("\n");
272
273 /* Validate IortSmmu to avoid compiler warnings */
274
275 if (IortSmmu)
276 {
277 Length = 2 * sizeof (UINT64);
278 NodeOffset = IortSmmu->GlobalInterruptOffset;
279 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
280 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
281 Length, AcpiDmTableInfoIort3a);
282 if (ACPI_FAILURE (Status))
283 {
284 return;
285 }
286
287 NodeOffset = IortSmmu->ContextInterruptOffset;
288 for (i = 0; i < IortSmmu->ContextInterruptCount; i++)
289 {
290 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
291 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
292 8, AcpiDmTableInfoIort3b);
293 if (ACPI_FAILURE (Status))
294 {
295 return;
296 }
297
298 NodeOffset += 8;
299 }
300
301 NodeOffset = IortSmmu->PmuInterruptOffset;
302 for (i = 0; i < IortSmmu->PmuInterruptCount; i++)
303 {
304 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
305 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
306 8, AcpiDmTableInfoIort3c);
307 if (ACPI_FAILURE (Status))
308 {
309 return;
310 }
311
312 NodeOffset += 8;
313 }
314 }
315 break;
316
317 case ACPI_IORT_NODE_RMR:
318
319 /* Validate IortRmr to avoid compiler warnings */
320 if (IortRmr)
321 {
322 NodeOffset = IortRmr->RmrOffset;
323 Length = sizeof (ACPI_IORT_RMR_DESC);
324 for (i = 0; i < IortRmr->RmrCount; i++)
325 {
326 AcpiOsPrintf ("\n");
327 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
328 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
329 Length, AcpiDmTableInfoIort6a);
330 if (ACPI_FAILURE (Status))
331 {
332 return;
333 }
334
335 NodeOffset += Length;
336 }
337 }
338 break;
339
340 default:
341
342 break;
343 }
344
345 /* Dump the ID mappings */
346
347 NodeOffset = IortNode->MappingOffset;
348 for (i = 0; i < IortNode->MappingCount; i++)
349 {
350 AcpiOsPrintf ("\n");
351 Length = sizeof (ACPI_IORT_ID_MAPPING);
352 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
353 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
354 Length, AcpiDmTableInfoIortMap);
355 if (ACPI_FAILURE (Status))
356 {
357 return;
358 }
359
360 NodeOffset += Length;
361 }
362
363 NextSubtable:
364 /* Point to next node subtable */
365
366 Offset += IortNode->Length;
367 }
368 }
369
370
371 /*******************************************************************************
372 *
373 * FUNCTION: AcpiDmDumpIvrs
374 *
375 * PARAMETERS: Table - A IVRS table
376 *
377 * RETURN: None
378 *
379 * DESCRIPTION: Format the contents of a IVRS. Notes:
380 * The IVRS is essentially a flat table, with the following
381 * structure:
382 * <Main ACPI Table Header>
383 * <Main subtable - virtualization info>
384 * <IVHD>
385 * <Device Entries>
386 * ...
387 * <IVHD>
388 * <Device Entries>
389 * <IVMD>
390 * ...
391 *
392 ******************************************************************************/
393
394 void
395 AcpiDmDumpIvrs (
396 ACPI_TABLE_HEADER *Table)
397 {
398 ACPI_STATUS Status;
399 UINT32 Offset = sizeof (ACPI_TABLE_IVRS);
400 UINT32 EntryOffset;
401 UINT32 EntryLength;
402 UINT32 EntryType;
403 ACPI_IVRS_DEVICE_HID *HidSubtable;
404 ACPI_IVRS_DE_HEADER *DeviceEntry;
405 ACPI_IVRS_HEADER *Subtable;
406 ACPI_DMTABLE_INFO *InfoTable;
407
408
409 /* Main table */
410
411 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
412 if (ACPI_FAILURE (Status))
413 {
414 return;
415 }
416
417 /* Subtables */
418
419 Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
420
421 while (Offset < Table->Length)
422 {
423 switch (Subtable->Type)
424 {
425 /* Type 10h, IVHD (I/O Virtualization Hardware Definition) */
426
427 case ACPI_IVRS_TYPE_HARDWARE1:
428
429 AcpiOsPrintf ("\n");
430 InfoTable = AcpiDmTableInfoIvrsHware1;
431 break;
432
433 /* Types 11h, 40h, IVHD (I/O Virtualization Hardware Definition) */
434
435 case ACPI_IVRS_TYPE_HARDWARE2:
436 case ACPI_IVRS_TYPE_HARDWARE3:
437
438 AcpiOsPrintf ("\n");
439 InfoTable = AcpiDmTableInfoIvrsHware23;
440 break;
441
442 /* Types 20h-22h, IVMD (I/O Virtualization Memory Definition Block) */
443
444 case ACPI_IVRS_TYPE_MEMORY1:
445 case ACPI_IVRS_TYPE_MEMORY2:
446 case ACPI_IVRS_TYPE_MEMORY3:
447
448 AcpiOsPrintf ("\n");
449 InfoTable = AcpiDmTableInfoIvrsMemory;
450 break;
451
452 default:
453
454 AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n",
455 Subtable->Type);
456
457 /* Attempt to continue */
458
459 if (!Subtable->Length)
460 {
461 AcpiOsPrintf ("Invalid zero length subtable\n");
462 return;
463 }
464 goto NextSubtable;
465 }
466
467 /* Dump the subtable */
468
469 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
470 Subtable->Length, InfoTable);
471 if (ACPI_FAILURE (Status))
472 {
473 return;
474 }
475
476 /* The hardware subtables (IVHD) can contain multiple device entries */
477
478 if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1 ||
479 Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2 ||
480 Subtable->Type == ACPI_IVRS_TYPE_HARDWARE3)
481 {
482 if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1)
483 {
484 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE1);
485 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
486 sizeof (ACPI_IVRS_HARDWARE1));
487 }
488 else
489 {
490 /* ACPI_IVRS_TYPE_HARDWARE2, HARDWARE3 subtable types */
491
492 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE2);
493 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
494 sizeof (ACPI_IVRS_HARDWARE2));
495 }
496
497 /* Process all of the Device Entries */
498
499 while (EntryOffset < (Offset + Subtable->Length))
500 {
501 AcpiOsPrintf ("\n");
502
503 /*
504 * Upper 2 bits of Type encode the length of the device entry
505 *
506 * 00 = 4 byte
507 * 01 = 8 byte
508 * 1x = variable length
509 */
510 EntryType = DeviceEntry->Type;
511 EntryLength = EntryType >> 6 == 1 ? 8 : 4;
512
513 switch (EntryType)
514 {
515 /* 4-byte device entries */
516
517 case ACPI_IVRS_TYPE_PAD4:
518 case ACPI_IVRS_TYPE_ALL:
519 case ACPI_IVRS_TYPE_SELECT:
520 case ACPI_IVRS_TYPE_START:
521 case ACPI_IVRS_TYPE_END:
522
523 InfoTable = AcpiDmTableInfoIvrs4;
524 break;
525
526 /* 8-byte entries, type A */
527
528 case ACPI_IVRS_TYPE_ALIAS_SELECT:
529 case ACPI_IVRS_TYPE_ALIAS_START:
530
531 InfoTable = AcpiDmTableInfoIvrs8a;
532 break;
533
534 /* 8-byte entries, type B */
535
536 case ACPI_IVRS_TYPE_PAD8:
537 case ACPI_IVRS_TYPE_EXT_SELECT:
538 case ACPI_IVRS_TYPE_EXT_START:
539
540 InfoTable = AcpiDmTableInfoIvrs8b;
541 break;
542
543 /* 8-byte entries, type C */
544
545 case ACPI_IVRS_TYPE_SPECIAL:
546
547 InfoTable = AcpiDmTableInfoIvrs8c;
548 break;
549
550 /* Variable-length entries */
551
552 case ACPI_IVRS_TYPE_HID:
553
554 EntryLength = 4;
555 InfoTable = AcpiDmTableInfoIvrsHid;
556 break;
557
558 default:
559 InfoTable = AcpiDmTableInfoIvrs4;
560 AcpiOsPrintf (
561 "\n**** Unknown IVRS device entry type/length: "
562 "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
563 EntryType, EntryLength, EntryOffset);
564 break;
565 }
566
567 /* Dump the Device Entry */
568
569 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
570 DeviceEntry, EntryLength, InfoTable);
571 if (ACPI_FAILURE (Status))
572 {
573 return;
574 }
575
576 HidSubtable = ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, DeviceEntry);
577 EntryOffset += EntryLength;
578 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, HidSubtable,
579 EntryLength);
580
581 if (EntryType == ACPI_IVRS_TYPE_HID)
582 {
583 /*
584 * Determine if the HID is an integer or a string.
585 * An integer is defined to be 32 bits, with the upper 32 bits
586 * set to zero. (from the ACPI Spec): "The HID can be a 32-bit
587 * integer or a character string. If an integer, the lower
588 * 4 bytes of the field contain the integer and the upper
589 * 4 bytes are padded with 0".
590 */
591 if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiHid))
592 {
593 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
594 &HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidInteger);
595 }
596 else
597 {
598 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
599 &HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidString);
600 }
601 if (ACPI_FAILURE (Status))
602 {
603 return;
604 }
605
606 EntryOffset += 8;
607
608 /*
609 * Determine if the CID is an integer or a string. The format
610 * of the CID is the same as the HID above. From ACPI Spec:
611 * "If present, CID must be a single Compatible Device ID
612 * following the same format as the HID field."
613 */
614 if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiCid))
615 {
616 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
617 &HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidInteger);
618 }
619 else
620 {
621 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
622 &HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidString);
623 }
624 if (ACPI_FAILURE (Status))
625 {
626 return;
627 }
628
629 EntryOffset += 8;
630 EntryLength = HidSubtable->UidLength;
631
632 if (EntryLength > ACPI_IVRS_UID_NOT_PRESENT)
633 {
634 /* Dump the UID based upon the UidType field (String or Integer) */
635
636 if (HidSubtable->UidType == ACPI_IVRS_UID_IS_STRING)
637 {
638 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
639 &HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidString);
640 if (ACPI_FAILURE (Status))
641 {
642 return;
643 }
644 }
645 else /* ACPI_IVRS_UID_IS_INTEGER */
646 {
647 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
648 &HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidInteger);
649 if (ACPI_FAILURE (Status))
650 {
651 return;
652 }
653 }
654 }
655
656 EntryOffset += EntryLength+2;
657 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER,
658 Table, EntryOffset);
659 }
660 }
661 }
662
663 NextSubtable:
664 /* Point to next subtable */
665
666 Offset += Subtable->Length;
667 Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, Subtable->Length);
668 }
669 }
670
671
672 /*******************************************************************************
673 *
674 * FUNCTION: AcpiDmDumpLpit
675 *
676 * PARAMETERS: Table - A LPIT table
677 *
678 * RETURN: None
679 *
680 * DESCRIPTION: Format the contents of a LPIT. This table type consists
681 * of an open-ended number of subtables. Note: There are no
682 * entries in the main table. An LPIT consists of the table
683 * header and then subtables only.
684 *
685 ******************************************************************************/
686
687 void
688 AcpiDmDumpLpit (
689 ACPI_TABLE_HEADER *Table)
690 {
691 ACPI_STATUS Status;
692 ACPI_LPIT_HEADER *Subtable;
693 UINT32 Length = Table->Length;
694 UINT32 Offset = sizeof (ACPI_TABLE_LPIT);
695 ACPI_DMTABLE_INFO *InfoTable;
696 UINT32 SubtableLength;
697
698
699 /* Subtables */
700
701 Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
702 while (Offset < Table->Length)
703 {
704 /* Common subtable header */
705
706 Status = AcpiDmDumpTable (Length, Offset, Subtable,
707 sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);
708 if (ACPI_FAILURE (Status))
709 {
710 return;
711 }
712
713 switch (Subtable->Type)
714 {
715 case ACPI_LPIT_TYPE_NATIVE_CSTATE:
716
717 InfoTable = AcpiDmTableInfoLpit0;
718 SubtableLength = sizeof (ACPI_LPIT_NATIVE);
719 break;
720
721 default:
722
723 /* Cannot continue on unknown type - no length */
724
725 AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n",
726 Subtable->Type);
727 return;
728 }
729
730 Status = AcpiDmDumpTable (Length, Offset, Subtable,
731 SubtableLength, InfoTable);
732 if (ACPI_FAILURE (Status))
733 {
734 return;
735 }
736
737 AcpiOsPrintf ("\n");
738
739 /* Point to next subtable */
740
741 Offset += SubtableLength;
742 Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Subtable, SubtableLength);
743 }
744 }
745
746
747 /*******************************************************************************
748 *
749 * FUNCTION: AcpiDmDumpMadt
750 *
751 * PARAMETERS: Table - A MADT table
752 *
753 * RETURN: None
754 *
755 * DESCRIPTION: Format the contents of a MADT. This table type consists
756 * of an open-ended number of subtables.
757 *
758 ******************************************************************************/
759
760 void
761 AcpiDmDumpMadt (
762 ACPI_TABLE_HEADER *Table)
763 {
764 ACPI_STATUS Status;
765 ACPI_SUBTABLE_HEADER *Subtable;
766 UINT32 Length = Table->Length;
767 UINT32 Offset = sizeof (ACPI_TABLE_MADT);
768 ACPI_DMTABLE_INFO *InfoTable;
769
770
771 /* Main table */
772
773 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
774 if (ACPI_FAILURE (Status))
775 {
776 return;
777 }
778
779 /* Subtables */
780
781 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
782 while (Offset < Table->Length)
783 {
784 /* Common subtable header */
785
786 AcpiOsPrintf ("\n");
787 Status = AcpiDmDumpTable (Length, Offset, Subtable,
788 Subtable->Length, AcpiDmTableInfoMadtHdr);
789 if (ACPI_FAILURE (Status))
790 {
791 return;
792 }
793
794 switch (Subtable->Type)
795 {
796 case ACPI_MADT_TYPE_LOCAL_APIC:
797
798 InfoTable = AcpiDmTableInfoMadt0;
799 break;
800
801 case ACPI_MADT_TYPE_IO_APIC:
802
803 InfoTable = AcpiDmTableInfoMadt1;
804 break;
805
806 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
807
808 InfoTable = AcpiDmTableInfoMadt2;
809 break;
810
811 case ACPI_MADT_TYPE_NMI_SOURCE:
812
813 InfoTable = AcpiDmTableInfoMadt3;
814 break;
815
816 case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
817
818 InfoTable = AcpiDmTableInfoMadt4;
819 break;
820
821 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
822
823 InfoTable = AcpiDmTableInfoMadt5;
824 break;
825
826 case ACPI_MADT_TYPE_IO_SAPIC:
827
828 InfoTable = AcpiDmTableInfoMadt6;
829 break;
830
831 case ACPI_MADT_TYPE_LOCAL_SAPIC:
832
833 InfoTable = AcpiDmTableInfoMadt7;
834 break;
835
836 case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
837
838 InfoTable = AcpiDmTableInfoMadt8;
839 break;
840
841 case ACPI_MADT_TYPE_LOCAL_X2APIC:
842
843 InfoTable = AcpiDmTableInfoMadt9;
844 break;
845
846 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
847
848 InfoTable = AcpiDmTableInfoMadt10;
849 break;
850
851 case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
852
853 InfoTable = AcpiDmTableInfoMadt11;
854 break;
855
856 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
857
858 InfoTable = AcpiDmTableInfoMadt12;
859 break;
860
861 case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
862
863 InfoTable = AcpiDmTableInfoMadt13;
864 break;
865
866 case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
867
868 InfoTable = AcpiDmTableInfoMadt14;
869 break;
870
871 case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
872
873 InfoTable = AcpiDmTableInfoMadt15;
874 break;
875
876 case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
877
878 InfoTable = AcpiDmTableInfoMadt16;
879 break;
880
881 default:
882
883 AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",
884 Subtable->Type);
885
886 /* Attempt to continue */
887
888 if (!Subtable->Length)
889 {
890 AcpiOsPrintf ("Invalid zero length subtable\n");
891 return;
892 }
893
894 goto NextSubtable;
895 }
896
897 Status = AcpiDmDumpTable (Length, Offset, Subtable,
898 Subtable->Length, InfoTable);
899 if (ACPI_FAILURE (Status))
900 {
901 return;
902 }
903
904 NextSubtable:
905 /* Point to next subtable */
906
907 Offset += Subtable->Length;
908 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable,
909 Subtable->Length);
910 }
911 }
912
913
914 /*******************************************************************************
915 *
916 * FUNCTION: AcpiDmDumpMcfg
917 *
918 * PARAMETERS: Table - A MCFG Table
919 *
920 * RETURN: None
921 *
922 * DESCRIPTION: Format the contents of a MCFG table
923 *
924 ******************************************************************************/
925
926 void
927 AcpiDmDumpMcfg (
928 ACPI_TABLE_HEADER *Table)
929 {
930 ACPI_STATUS Status;
931 UINT32 Offset = sizeof (ACPI_TABLE_MCFG);
932 ACPI_MCFG_ALLOCATION *Subtable;
933
934
935 /* Main table */
936
937 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
938 if (ACPI_FAILURE (Status))
939 {
940 return;
941 }
942
943 /* Subtables */
944
945 Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
946 while (Offset < Table->Length)
947 {
948 if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
949 {
950 AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
951 (UINT32) sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
952 return;
953 }
954
955 AcpiOsPrintf ("\n");
956 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
957 sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
958 if (ACPI_FAILURE (Status))
959 {
960 return;
961 }
962
963 /* Point to next subtable (each subtable is of fixed length) */
964
965 Offset += sizeof (ACPI_MCFG_ALLOCATION);
966 Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Subtable,
967 sizeof (ACPI_MCFG_ALLOCATION));
968 }
969 }
970
971
972 /*******************************************************************************
973 *
974 * FUNCTION: AcpiDmDumpMpst
975 *
976 * PARAMETERS: Table - A MPST Table
977 *
978 * RETURN: None
979 *
980 * DESCRIPTION: Format the contents of a MPST table
981 *
982 ******************************************************************************/
983
984 void
985 AcpiDmDumpMpst (
986 ACPI_TABLE_HEADER *Table)
987 {
988 ACPI_STATUS Status;
989 UINT32 Offset = sizeof (ACPI_TABLE_MPST);
990 ACPI_MPST_POWER_NODE *Subtable0;
991 ACPI_MPST_POWER_STATE *Subtable0A;
992 ACPI_MPST_COMPONENT *Subtable0B;
993 ACPI_MPST_DATA_HDR *Subtable1;
994 ACPI_MPST_POWER_DATA *Subtable2;
995 UINT16 SubtableCount;
996 UINT32 PowerStateCount;
997 UINT32 ComponentCount;
998
999
1000 /* Main table */
1001
1002 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
1003 if (ACPI_FAILURE (Status))
1004 {
1005 return;
1006 }
1007
1008 /* Subtable: Memory Power Node(s) */
1009
1010 SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
1011 Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
1012
1013 while ((Offset < Table->Length) && SubtableCount)
1014 {
1015 AcpiOsPrintf ("\n");
1016 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0,
1017 sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
1018 if (ACPI_FAILURE (Status))
1019 {
1020 return;
1021 }
1022
1023 /* Extract the sub-subtable counts */
1024
1025 PowerStateCount = Subtable0->NumPowerStates;
1026 ComponentCount = Subtable0->NumPhysicalComponents;
1027 Offset += sizeof (ACPI_MPST_POWER_NODE);
1028
1029 /* Sub-subtables - Memory Power State Structure(s) */
1030
1031 Subtable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, Subtable0,
1032 sizeof (ACPI_MPST_POWER_NODE));
1033
1034 while (PowerStateCount)
1035 {
1036 AcpiOsPrintf ("\n");
1037 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A,
1038 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
1039 if (ACPI_FAILURE (Status))
1040 {
1041 return;
1042 }
1043
1044 Subtable0A++;
1045 PowerStateCount--;
1046 Offset += sizeof (ACPI_MPST_POWER_STATE);
1047 }
1048
1049 /* Sub-subtables - Physical Component ID Structure(s) */
1050
1051 Subtable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, Subtable0A);
1052
1053 if (ComponentCount)
1054 {
1055 AcpiOsPrintf ("\n");
1056 }
1057
1058 while (ComponentCount)
1059 {
1060 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B,
1061 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
1062 if (ACPI_FAILURE (Status))
1063 {
1064 return;
1065 }
1066
1067 Subtable0B++;
1068 ComponentCount--;
1069 Offset += sizeof (ACPI_MPST_COMPONENT);
1070 }
1071
1072 /* Point to next Memory Power Node subtable */
1073
1074 SubtableCount--;
1075 Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Subtable0,
1076 sizeof (ACPI_MPST_POWER_NODE) +
1077 (sizeof (ACPI_MPST_POWER_STATE) * Subtable0->NumPowerStates) +
1078 (sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents));
1079 }
1080
1081 /* Subtable: Count of Memory Power State Characteristic structures */
1082
1083 AcpiOsPrintf ("\n");
1084 Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0);
1085 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1,
1086 sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
1087 if (ACPI_FAILURE (Status))
1088 {
1089 return;
1090 }
1091
1092 SubtableCount = Subtable1->CharacteristicsCount;
1093 Offset += sizeof (ACPI_MPST_DATA_HDR);
1094
1095 /* Subtable: Memory Power State Characteristics structure(s) */
1096
1097 Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1,
1098 sizeof (ACPI_MPST_DATA_HDR));
1099
1100 while ((Offset < Table->Length) && SubtableCount)
1101 {
1102 AcpiOsPrintf ("\n");
1103 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2,
1104 sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
1105 if (ACPI_FAILURE (Status))
1106 {
1107 return;
1108 }
1109
1110 Subtable2++;
1111 SubtableCount--;
1112 Offset += sizeof (ACPI_MPST_POWER_DATA);
1113 }
1114 }
1115
1116
1117 /*******************************************************************************
1118 *
1119 * FUNCTION: AcpiDmDumpMsct
1120 *
1121 * PARAMETERS: Table - A MSCT table
1122 *
1123 * RETURN: None
1124 *
1125 * DESCRIPTION: Format the contents of a MSCT
1126 *
1127 ******************************************************************************/
1128
1129 void
1130 AcpiDmDumpMsct (
1131 ACPI_TABLE_HEADER *Table)
1132 {
1133 ACPI_STATUS Status;
1134 UINT32 Offset = sizeof (ACPI_TABLE_MSCT);
1135 ACPI_MSCT_PROXIMITY *Subtable;
1136
1137
1138 /* Main table */
1139
1140 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
1141 if (ACPI_FAILURE (Status))
1142 {
1143 return;
1144 }
1145
1146 /* Subtables */
1147
1148 Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
1149 while (Offset < Table->Length)
1150 {
1151 /* Common subtable header */
1152
1153 AcpiOsPrintf ("\n");
1154 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1155 sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
1156 if (ACPI_FAILURE (Status))
1157 {
1158 return;
1159 }
1160
1161 /* Point to next subtable */
1162
1163 Offset += sizeof (ACPI_MSCT_PROXIMITY);
1164 Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Subtable,
1165 sizeof (ACPI_MSCT_PROXIMITY));
1166 }
1167 }
1168
1169
1170 /*******************************************************************************
1171 *
1172 * FUNCTION: AcpiDmDumpNfit
1173 *
1174 * PARAMETERS: Table - A NFIT table
1175 *
1176 * RETURN: None
1177 *
1178 * DESCRIPTION: Format the contents of an NFIT.
1179 *
1180 ******************************************************************************/
1181
1182 void
1183 AcpiDmDumpNfit (
1184 ACPI_TABLE_HEADER *Table)
1185 {
1186 ACPI_STATUS Status;
1187 UINT32 Offset = sizeof (ACPI_TABLE_NFIT);
1188 UINT32 FieldOffset = 0;
1189 UINT32 Length;
1190 ACPI_NFIT_HEADER *Subtable;
1191 ACPI_DMTABLE_INFO *InfoTable;
1192 ACPI_NFIT_INTERLEAVE *Interleave = NULL;
1193 ACPI_NFIT_SMBIOS *SmbiosInfo = NULL;
1194 ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
1195 UINT32 i;
1196
1197
1198 /* Main table */
1199
1200 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
1201 if (ACPI_FAILURE (Status))
1202 {
1203 return;
1204 }
1205
1206 /* Subtables */
1207
1208 Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
1209 while (Offset < Table->Length)
1210 {
1211 /* NFIT subtable header */
1212
1213 AcpiOsPrintf ("\n");
1214 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1215 Subtable->Length, AcpiDmTableInfoNfitHdr);
1216 if (ACPI_FAILURE (Status))
1217 {
1218 return;
1219 }
1220
1221 switch (Subtable->Type)
1222 {
1223 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
1224
1225 InfoTable = AcpiDmTableInfoNfit0;
1226 break;
1227
1228 case ACPI_NFIT_TYPE_MEMORY_MAP:
1229
1230 InfoTable = AcpiDmTableInfoNfit1;
1231 break;
1232
1233 case ACPI_NFIT_TYPE_INTERLEAVE:
1234
1235 /* Has a variable number of 32-bit values at the end */
1236
1237 InfoTable = AcpiDmTableInfoNfit2;
1238 FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);
1239 break;
1240
1241 case ACPI_NFIT_TYPE_SMBIOS:
1242
1243 SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, Subtable);
1244 InfoTable = AcpiDmTableInfoNfit3;
1245 break;
1246
1247 case ACPI_NFIT_TYPE_CONTROL_REGION:
1248
1249 InfoTable = AcpiDmTableInfoNfit4;
1250 break;
1251
1252 case ACPI_NFIT_TYPE_DATA_REGION:
1253
1254 InfoTable = AcpiDmTableInfoNfit5;
1255 break;
1256
1257 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
1258
1259 /* Has a variable number of 64-bit addresses at the end */
1260
1261 InfoTable = AcpiDmTableInfoNfit6;
1262 FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64);
1263 break;
1264
1265 case ACPI_NFIT_TYPE_CAPABILITIES: /* ACPI 6.0A */
1266
1267 InfoTable = AcpiDmTableInfoNfit7;
1268 break;
1269
1270 default:
1271 AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
1272 Subtable->Type);
1273
1274 /* Attempt to continue */
1275
1276 if (!Subtable->Length)
1277 {
1278 AcpiOsPrintf ("Invalid zero length subtable\n");
1279 return;
1280 }
1281 goto NextSubtable;
1282 }
1283
1284 AcpiOsPrintf ("\n");
1285 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
1286 Subtable->Length, InfoTable);
1287 if (ACPI_FAILURE (Status))
1288 {
1289 return;
1290 }
1291
1292 /* Per-subtable variable-length fields */
1293
1294 switch (Subtable->Type)
1295 {
1296 case ACPI_NFIT_TYPE_INTERLEAVE:
1297
1298 Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable);
1299 for (i = 0; i < Interleave->LineCount; i++)
1300 {
1301 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
1302 &Interleave->LineOffset[i],
1303 sizeof (UINT32), AcpiDmTableInfoNfit2a);
1304 if (ACPI_FAILURE (Status))
1305 {
1306 return;
1307 }
1308
1309 FieldOffset += sizeof (UINT32);
1310 }
1311 break;
1312
1313 case ACPI_NFIT_TYPE_SMBIOS:
1314
1315 Length = Subtable->Length -
1316 sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
1317
1318 if (Length)
1319 {
1320 Status = AcpiDmDumpTable (Table->Length,
1321 sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
1322 SmbiosInfo,
1323 Length, AcpiDmTableInfoNfit3a);
1324 if (ACPI_FAILURE (Status))
1325 {
1326 return;
1327 }
1328 }
1329
1330 break;
1331
1332 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
1333
1334 Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable);
1335 for (i = 0; i < Hint->HintCount; i++)
1336 {
1337 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
1338 &Hint->HintAddress[i],
1339 sizeof (UINT64), AcpiDmTableInfoNfit6a);
1340 if (ACPI_FAILURE (Status))
1341 {
1342 return;
1343 }
1344
1345 FieldOffset += sizeof (UINT64);
1346 }
1347 break;
1348
1349 default:
1350 break;
1351 }
1352
1353 NextSubtable:
1354 /* Point to next subtable */
1355
1356 Offset += Subtable->Length;
1357 Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length);
1358 }
1359 }
1360
1361
1362 /*******************************************************************************
1363 *
1364 * FUNCTION: AcpiDmDumpNhlt
1365 *
1366 * PARAMETERS: Table - A NHLT table
1367 *
1368 * RETURN: None
1369 *
1370 * DESCRIPTION: Format the contents of an NHLT.
1371 *
1372 ******************************************************************************/
1373
1374 void
1375 AcpiDmDumpNhlt (
1376 ACPI_TABLE_HEADER *Table)
1377 {
1378 ACPI_STATUS Status;
1379 UINT32 Offset;
1380 UINT32 TableLength = Table->Length;
1381 UINT32 EndpointCount;
1382 UINT8 FormatsCount;
1383 ACPI_NHLT_ENDPOINT *Subtable;
1384 ACPI_NHLT_FORMAT_CONFIG *FormatSubtable;
1385 ACPI_TABLE_NHLT *InfoTable;
1386 UINT32 CapabilitiesSize;
1387 UINT32 i;
1388 UINT32 j;
1389 UINT32 k;
1390 UINT32 EndpointEndOffset;
1391 UINT8 ConfigType = 0;
1392 UINT8 ArrayType;
1393 ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A *DevSpecific;
1394 ACPI_NHLT_FORMATS_CONFIG *FormatsConfig;
1395 ACPI_NHLT_LINUX_SPECIFIC_COUNT *Count;
1396 ACPI_NHLT_LINUX_SPECIFIC_DATA *LinuxData;
1397
1398
1399 /* Main table */
1400
1401 AcpiOsPrintf ("/* Main table */\n");
1402
1403 Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoNhlt);
1404 if (ACPI_FAILURE (Status))
1405 {
1406 return;
1407 }
1408
1409 /* Get the Endpoint Descriptor Count */
1410
1411 InfoTable = ACPI_ADD_PTR (ACPI_TABLE_NHLT, Table, 0);
1412 EndpointCount = InfoTable->EndpointCount;
1413
1414 /* Subtables */
1415
1416 Offset = sizeof (ACPI_TABLE_NHLT);
1417
1418 while (Offset < TableLength)
1419 {
1420 /* A variable number of Endpoint Descriptors - process each */
1421
1422 for (i = 0; i < EndpointCount; i++)
1423 {
1424 /* Do the Endpoint Descriptor table */
1425
1426 Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
1427 if (Subtable->DescriptorLength > TableLength)
1428 {
1429 Offset += 1;
1430 AcpiOsPrintf ("\n/* Endpoint Descriptor Length larger than"
1431 " table size: %X, table %X, adjusting table offset (+1) */\n",
1432 Subtable->DescriptorLength, TableLength);
1433
1434 Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
1435 }
1436
1437 AcpiOsPrintf ("\n/* Endpoint Descriptor #%u */\n", i+1);
1438 Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
1439 Subtable->DescriptorLength, AcpiDmTableInfoNhlt0);
1440 if (ACPI_FAILURE (Status))
1441 {
1442 return;
1443 }
1444 EndpointEndOffset = Subtable->DescriptorLength + Offset;
1445
1446 /* Check for endpoint descriptor beyond end-of-table */
1447
1448 if (Subtable->DescriptorLength > TableLength)
1449 {
1450 AcpiOsPrintf ("\n/* Endpoint Descriptor Length larger than table size: %X, table %X */\n",
1451 Subtable->DescriptorLength, TableLength);
1452 }
1453 Offset += sizeof (ACPI_NHLT_ENDPOINT);
1454 Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
1455
1456 /* Do the Device Specific table */
1457
1458 AcpiOsPrintf ("\n/* Endpoint Device_Specific_Config table */\n");
1459 DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable);
1460 CapabilitiesSize = DevSpecific->CapabilitiesSize;
1461
1462 /* Different subtables based upon capabilities_size */
1463
1464 switch (CapabilitiesSize)
1465 {
1466 case 0:
1467 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1468 sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b);
1469 if (ACPI_FAILURE (Status))
1470 {
1471 return;
1472 }
1473 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B);
1474 break;
1475
1476 case 1:
1477 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1478 sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C), AcpiDmTableInfoNhlt5c);
1479 if (ACPI_FAILURE (Status))
1480 {
1481 return;
1482 }
1483 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C);
1484 break;
1485
1486 case 2:
1487 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1488 sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt5);
1489 if (ACPI_FAILURE (Status))
1490 {
1491 return;
1492 }
1493 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG);
1494 break;
1495
1496 case 3:
1497 ConfigType = DevSpecific->ConfigType;
1498 ArrayType = DevSpecific->ArrayType;
1499
1500 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1501 sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A), AcpiDmTableInfoNhlt5a);
1502 if (ACPI_FAILURE (Status))
1503 {
1504 return;
1505 }
1506
1507 /* Capabilities Size == 3 */
1508 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A);
1509
1510 /* Check for a vendor-defined mic array */
1511
1512 if ((ConfigType == ACPI_NHLT_TYPE_MIC_ARRAY) && ((ArrayType & ARRAY_TYPE_MASK) == VENDOR_DEFINED))
1513 {
1514 /* Vendor-defined microphone array */
1515
1516 AcpiOsPrintf ("\n/* Vendor-defined microphone array */\n");
1517
1518 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1519 sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG), AcpiDmTableInfoNhlt6);
1520 if (ACPI_FAILURE (Status))
1521 {
1522 return;
1523 }
1524 Offset += sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG);
1525 }
1526 break;
1527
1528 default:
1529 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1530 sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b);
1531 if (ACPI_FAILURE (Status))
1532 {
1533 return;
1534 }
1535
1536 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B);
1537 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1538 CapabilitiesSize, AcpiDmTableInfoNhlt3a);
1539 if (ACPI_FAILURE (Status))
1540 {
1541 return;
1542 }
1543 Offset += CapabilitiesSize;
1544 break;
1545 }
1546
1547 /* Do the Formats_Config table */
1548
1549 FormatsConfig = ACPI_ADD_PTR (ACPI_NHLT_FORMATS_CONFIG, Table, Offset);
1550 FormatsCount = FormatsConfig->FormatsCount;
1551
1552 AcpiOsPrintf ("\n/* Formats_Config table */\n");
1553
1554 Status = AcpiDmDumpTable (TableLength, Offset, FormatsConfig,
1555 sizeof (ACPI_NHLT_FORMATS_CONFIG), AcpiDmTableInfoNhlt4);
1556 if (ACPI_FAILURE (Status))
1557 {
1558 return;
1559 }
1560 Offset += sizeof (ACPI_NHLT_FORMATS_CONFIG);
1561
1562 /* A variable number of Format_Config Descriptors - process each */
1563
1564 for (j = 0; j < FormatsCount; j++)
1565 {
1566 FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset);
1567 CapabilitiesSize = FormatSubtable->CapabilitySize;
1568
1569 /* Do the Wave_extensible struct */
1570
1571 AcpiOsPrintf ("\n/* Wave_Format_Extensible table #%u */\n", j+1);
1572 Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable,
1573 sizeof (ACPI_NHLT_FORMAT_CONFIG), AcpiDmTableInfoNhlt3);
1574 if (ACPI_FAILURE (Status))
1575 {
1576 return;
1577 }
1578 Offset += sizeof (ACPI_NHLT_WAVE_EXTENSIBLE);
1579
1580 /* Do the Capabilities array */
1581
1582 Offset += sizeof (UINT32);
1583 AcpiOsPrintf ("\n/* Specific_Config table #%u */\n", j+1);
1584 FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset);
1585 Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable,
1586 CapabilitiesSize, AcpiDmTableInfoNhlt3a);
1587 if (ACPI_FAILURE (Status))
1588 {
1589 return;
1590 }
1591 Offset += CapabilitiesSize;
1592 }
1593
1594 /*
1595 * If we are not done with the Endpoint(s) yet, then there must be
1596 * some Linux-specific structure(s) yet to be processed.
1597 */
1598 if (Offset < EndpointEndOffset)
1599 {
1600 AcpiOsPrintf ("\n");
1601 Count = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_COUNT, Table, Offset);
1602 Status = AcpiDmDumpTable (TableLength, Offset, Count,
1603 sizeof (ACPI_NHLT_LINUX_SPECIFIC_COUNT), AcpiDmTableInfoNhlt7);
1604 if (ACPI_FAILURE (Status))
1605 {
1606 return;
1607 }
1608 Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_COUNT);
1609
1610 /* Variable number of linux-specific structures */
1611
1612 for (k = 0; k < Count->StructureCount; k++)
1613 {
1614 LinuxData = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA, Table, Offset);
1615
1616 AcpiOsPrintf ("\n/* Linux-specific structure #%u */\n", k+1);
1617
1618 Status = AcpiDmDumpTable (TableLength, Offset, LinuxData,
1619 sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA), AcpiDmTableInfoNhlt7a);
1620 if (ACPI_FAILURE (Status))
1621 {
1622 return;
1623 }
1624
1625 Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA);
1626 }
1627
1628 /* Should be at the end of the Endpoint structure. Skip any extra bytes */
1629
1630 if (Offset < EndpointEndOffset)
1631 {
1632 AcpiOsPrintf ("\n/* Endpoint descriptor ended before endpoint size was reached. "
1633 "skipped %X input bytes, current offset: %X, Endpoint End Offset: %X */\n",
1634 EndpointEndOffset - Offset, Offset, EndpointEndOffset);
1635 AcpiUtDumpBuffer (((UINT8 *)Table)+Offset,
1636 EndpointEndOffset - Offset, DB_BYTE_DISPLAY, Offset);
1637 Offset = EndpointEndOffset;
1638 }
1639 }
1640 }
1641
1642 /* Emit the table terminator (if present) */
1643
1644 if (Offset == TableLength - sizeof (ACPI_NHLT_TABLE_TERMINATOR))
1645 {
1646 LinuxData = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA, Table, Offset);
1647 AcpiOsPrintf ("\n/* Table terminator structure */\n");
1648
1649 Status = AcpiDmDumpTable (TableLength, Offset, LinuxData,
1650 sizeof (ACPI_NHLT_TABLE_TERMINATOR), AcpiDmTableInfoNhlt8);
1651 if (ACPI_FAILURE (Status))
1652 {
1653 return;
1654 }
1655 }
1656
1657 return;
1658 }
1659 }
1660
1661
1662 /*******************************************************************************
1663 *
1664 * FUNCTION: AcpiDmDumpPcct
1665 *
1666 * PARAMETERS: Table - A PCCT table
1667 *
1668 * RETURN: None
1669 *
1670 * DESCRIPTION: Format the contents of a PCCT. This table type consists
1671 * of an open-ended number of subtables.
1672 *
1673 ******************************************************************************/
1674
1675 void
1676 AcpiDmDumpPcct (
1677 ACPI_TABLE_HEADER *Table)
1678 {
1679 ACPI_STATUS Status;
1680 ACPI_PCCT_SUBSPACE *Subtable;
1681 ACPI_DMTABLE_INFO *InfoTable;
1682 UINT32 Length = Table->Length;
1683 UINT32 Offset = sizeof (ACPI_TABLE_PCCT);
1684
1685
1686 /* Main table */
1687
1688 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
1689 if (ACPI_FAILURE (Status))
1690 {
1691 return;
1692 }
1693
1694 /* Subtables */
1695
1696 Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
1697 while (Offset < Table->Length)
1698 {
1699 /* Common subtable header */
1700
1701 AcpiOsPrintf ("\n");
1702 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1703 Subtable->Header.Length, AcpiDmTableInfoPcctHdr);
1704 if (ACPI_FAILURE (Status))
1705 {
1706 return;
1707 }
1708
1709 switch (Subtable->Header.Type)
1710 {
1711 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
1712
1713 InfoTable = AcpiDmTableInfoPcct0;
1714 break;
1715
1716 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
1717
1718 InfoTable = AcpiDmTableInfoPcct1;
1719 break;
1720
1721 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
1722
1723 InfoTable = AcpiDmTableInfoPcct2;
1724 break;
1725
1726 case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
1727
1728 InfoTable = AcpiDmTableInfoPcct3;
1729 break;
1730
1731 case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
1732
1733 InfoTable = AcpiDmTableInfoPcct4;
1734 break;
1735
1736 case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
1737
1738 InfoTable = AcpiDmTableInfoPcct5;
1739 break;
1740
1741 default:
1742
1743 AcpiOsPrintf (
1744 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
1745 Subtable->Header.Type);
1746 return;
1747 }
1748
1749 AcpiOsPrintf ("\n");
1750 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1751 Subtable->Header.Length, InfoTable);
1752 if (ACPI_FAILURE (Status))
1753 {
1754 return;
1755 }
1756
1757 /* Point to next subtable */
1758
1759 Offset += Subtable->Header.Length;
1760 Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Subtable,
1761 Subtable->Header.Length);
1762 }
1763 }
1764
1765
1766 /*******************************************************************************
1767 *
1768 * FUNCTION: AcpiDmDumpPdtt
1769 *
1770 * PARAMETERS: Table - A PDTT table
1771 *
1772 * RETURN: None
1773 *
1774 * DESCRIPTION: Format the contents of a Pdtt. This is a variable-length
1775 * table that contains an open-ended number of IDs
1776 * at the end of the table.
1777 *
1778 ******************************************************************************/
1779
1780 void
1781 AcpiDmDumpPdtt (
1782 ACPI_TABLE_HEADER *Table)
1783 {
1784 ACPI_STATUS Status;
1785 ACPI_PDTT_CHANNEL *Subtable;
1786 UINT32 Length = Table->Length;
1787 UINT32 Offset = sizeof (ACPI_TABLE_PDTT);
1788
1789
1790 /* Main table */
1791
1792 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt);
1793 if (ACPI_FAILURE (Status))
1794 {
1795 return;
1796 }
1797
1798 /* Subtables. Currently there is only one type, but can be multiples */
1799
1800 Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset);
1801 while (Offset < Table->Length)
1802 {
1803 AcpiOsPrintf ("\n");
1804 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1805 sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0);
1806 if (ACPI_FAILURE (Status))
1807 {
1808 return;
1809 }
1810
1811 /* Point to next subtable */
1812
1813 Offset += sizeof (ACPI_PDTT_CHANNEL);
1814 Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Subtable,
1815 sizeof (ACPI_PDTT_CHANNEL));
1816 }
1817 }
1818
1819
1820 /*******************************************************************************
1821 *
1822 * FUNCTION: AcpiDmDumpPhat
1823 *
1824 * PARAMETERS: Table - A PHAT table
1825 *
1826 * RETURN: None
1827 *
1828 * DESCRIPTION: Format the contents of a PHAT.
1829 *
1830 ******************************************************************************/
1831
1832 void
1833 AcpiDmDumpPhat (
1834 ACPI_TABLE_HEADER *Table)
1835 {
1836 ACPI_STATUS Status;
1837 ACPI_DMTABLE_INFO *InfoTable;
1838 ACPI_PHAT_HEADER *Subtable;
1839 ACPI_PHAT_VERSION_DATA *VersionData;
1840 UINT32 RecordCount;
1841 UINT32 Length = Table->Length;
1842 UINT32 Offset = sizeof (ACPI_TABLE_PHAT);
1843 UINT32 SubtableLength;
1844 UINT32 PathLength;
1845 UINT32 VendorLength;
1846
1847
1848 Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT));
1849
1850 while (Offset < Table->Length)
1851 {
1852 /* Common subtable header */
1853
1854 AcpiOsPrintf ("\n");
1855 Status = AcpiDmDumpTable (Length, 0, Subtable,
1856 sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr);
1857 if (ACPI_FAILURE (Status))
1858 {
1859 return;
1860 }
1861
1862 switch (Subtable->Type)
1863 {
1864 case ACPI_PHAT_TYPE_FW_VERSION_DATA:
1865
1866 InfoTable = AcpiDmTableInfoPhat0;
1867 SubtableLength = sizeof (ACPI_PHAT_VERSION_DATA);
1868 break;
1869
1870 case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
1871
1872 InfoTable = AcpiDmTableInfoPhat1;
1873 SubtableLength = sizeof (ACPI_PHAT_HEALTH_DATA);
1874 break;
1875
1876 default:
1877
1878 AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",
1879 Subtable->Type);
1880
1881 return;
1882 }
1883
1884 Status = AcpiDmDumpTable (Length, 0, Subtable,
1885 SubtableLength, InfoTable);
1886 if (ACPI_FAILURE (Status))
1887 {
1888 return;
1889 }
1890
1891 switch (Subtable->Type)
1892 {
1893 case ACPI_PHAT_TYPE_FW_VERSION_DATA:
1894
1895 VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable);
1896 RecordCount = VersionData->ElementCount;
1897 while (RecordCount)
1898 {
1899 Status = AcpiDmDumpTable (Length, Offset,
1900 ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_VERSION_DATA)),
1901 sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a);
1902 if (ACPI_FAILURE (Status))
1903 {
1904 return;
1905 }
1906
1907 RecordCount--;
1908 }
1909
1910 break;
1911
1912 case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
1913
1914 /* account for the null terminator */
1915
1916 PathLength = strlen (ACPI_ADD_PTR (char, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA))) + 1;
1917 Status = AcpiDmDumpTable (Length, Offset,
1918 ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)),
1919 PathLength, AcpiDmTableInfoPhat1a);
1920 if (ACPI_FAILURE (Status))
1921 {
1922 return;
1923 }
1924
1925 /* Get vendor data - data length is the remaining subtable length */
1926
1927 VendorLength =
1928 Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength;
1929 Status = AcpiDmDumpTable (Length, 0,
1930 ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength),
1931 VendorLength, AcpiDmTableInfoPhat1b);
1932 if (ACPI_FAILURE (Status))
1933 {
1934 return;
1935 }
1936 break;
1937
1938 default:
1939
1940 AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",
1941 Subtable->Type);
1942 return;
1943 }
1944
1945 /* Next subtable */
1946
1947 Offset += Subtable->Length;
1948 Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable,
1949 Subtable->Length);
1950 }
1951 }
1952
1953
1954 /*******************************************************************************
1955 *
1956 * FUNCTION: AcpiDmDumpPmtt
1957 *
1958 * PARAMETERS: Table - A PMTT table
1959 *
1960 * RETURN: None
1961 *
1962 * DESCRIPTION: Format the contents of a PMTT. This table type consists
1963 * of an open-ended number of subtables.
1964 *
1965 ******************************************************************************/
1966
1967 void
1968 AcpiDmDumpPmtt (
1969 ACPI_TABLE_HEADER *Table)
1970 {
1971 ACPI_STATUS Status;
1972 ACPI_PMTT_HEADER *Subtable;
1973 UINT32 Length = Table->Length;
1974 UINT32 Offset = sizeof (ACPI_TABLE_PMTT);
1975
1976
1977 /* Main table */
1978
1979 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
1980 if (ACPI_FAILURE (Status))
1981 {
1982 return;
1983 }
1984
1985 /* Subtables */
1986
1987 Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
1988 while (Offset < Table->Length)
1989 {
1990 /* Each of the types below contain the common subtable header */
1991
1992 AcpiOsPrintf ("\n");
1993 switch (Subtable->Type)
1994 {
1995 case ACPI_PMTT_TYPE_SOCKET:
1996
1997 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1998 Subtable->Length, AcpiDmTableInfoPmtt0);
1999 if (ACPI_FAILURE (Status))
2000 {
2001 return;
2002 }
2003 break;
2004
2005 case ACPI_PMTT_TYPE_CONTROLLER:
2006 Status = AcpiDmDumpTable (Length, Offset, Subtable,
2007 Subtable->Length, AcpiDmTableInfoPmtt1);
2008 if (ACPI_FAILURE (Status))
2009 {
2010 return;
2011 }
2012 break;
2013
2014 case ACPI_PMTT_TYPE_DIMM:
2015 Status = AcpiDmDumpTable (Length, Offset, Subtable,
2016 Subtable->Length, AcpiDmTableInfoPmtt2);
2017 if (ACPI_FAILURE (Status))
2018 {
2019 return;
2020 }
2021 break;
2022
2023 case ACPI_PMTT_TYPE_VENDOR:
2024 Status = AcpiDmDumpTable (Length, Offset, Subtable,
2025 Subtable->Length, AcpiDmTableInfoPmttVendor);
2026 if (ACPI_FAILURE (Status))
2027 {
2028 return;
2029 }
2030 break;
2031
2032 default:
2033 AcpiOsPrintf (
2034 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2035 Subtable->Type);
2036 return;
2037 }
2038
2039 /* Point to next subtable */
2040
2041 Offset += Subtable->Length;
2042 Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2043 Subtable, Subtable->Length);
2044 }
2045 }
2046
2047
2048 /*******************************************************************************
2049 *
2050 * FUNCTION: AcpiDmDumpPptt
2051 *
2052 * PARAMETERS: Table - A PMTT table
2053 *
2054 * RETURN: None
2055 *
2056 * DESCRIPTION: Format the contents of a PPTT. This table type consists
2057 * of an open-ended number of subtables.
2058 *
2059 ******************************************************************************/
2060
2061 void
2062 AcpiDmDumpPptt (
2063 ACPI_TABLE_HEADER *Table)
2064 {
2065 ACPI_STATUS Status;
2066 ACPI_SUBTABLE_HEADER *Subtable;
2067 ACPI_PPTT_PROCESSOR *PpttProcessor;
2068 UINT8 Length;
2069 UINT8 SubtableOffset;
2070 UINT32 Offset = sizeof (ACPI_TABLE_FPDT);
2071 ACPI_DMTABLE_INFO *InfoTable;
2072 UINT32 i;
2073
2074
2075 /* There is no main table (other than the standard ACPI header) */
2076
2077 /* Subtables */
2078
2079 Offset = sizeof (ACPI_TABLE_HEADER);
2080 while (Offset < Table->Length)
2081 {
2082 AcpiOsPrintf ("\n");
2083
2084 /* Common subtable header */
2085
2086 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
2087 if (Subtable->Length < sizeof (ACPI_SUBTABLE_HEADER))
2088 {
2089 AcpiOsPrintf ("Invalid subtable length\n");
2090 return;
2091 }
2092 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
2093 Subtable->Length, AcpiDmTableInfoPpttHdr);
2094 if (ACPI_FAILURE (Status))
2095 {
2096 return;
2097 }
2098
2099 switch (Subtable->Type)
2100 {
2101 case ACPI_PPTT_TYPE_PROCESSOR:
2102
2103 InfoTable = AcpiDmTableInfoPptt0;
2104 Length = sizeof (ACPI_PPTT_PROCESSOR);
2105 break;
2106
2107 case ACPI_PPTT_TYPE_CACHE:
2108
2109 InfoTable = AcpiDmTableInfoPptt1;
2110 Length = sizeof (ACPI_PPTT_CACHE);
2111 break;
2112
2113 case ACPI_PPTT_TYPE_ID:
2114
2115 InfoTable = AcpiDmTableInfoPptt2;
2116 Length = sizeof (ACPI_PPTT_ID);
2117 break;
2118
2119 default:
2120
2121 AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n",
2122 Subtable->Type);
2123
2124 /* Attempt to continue */
2125
2126 goto NextSubtable;
2127 }
2128
2129 if (Subtable->Length < Length)
2130 {
2131 AcpiOsPrintf ("Invalid subtable length\n");
2132 return;
2133 }
2134 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
2135 Subtable->Length, InfoTable);
2136 if (ACPI_FAILURE (Status))
2137 {
2138 return;
2139 }
2140 SubtableOffset = Length;
2141
2142 switch (Subtable->Type)
2143 {
2144 case ACPI_PPTT_TYPE_PROCESSOR:
2145
2146 PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, Subtable);
2147
2148 /* Dump SMBIOS handles */
2149
2150 if ((UINT8)(Subtable->Length - SubtableOffset) <
2151 (UINT8)(PpttProcessor->NumberOfPrivResources * 4))
2152 {
2153 AcpiOsPrintf ("Invalid private resource number\n");
2154 return;
2155 }
2156 for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++)
2157 {
2158 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2159 ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
2160 4, AcpiDmTableInfoPptt0a);
2161 if (ACPI_FAILURE (Status))
2162 {
2163 return;
2164 }
2165
2166 SubtableOffset += 4;
2167 }
2168 break;
2169
2170 case ACPI_PPTT_TYPE_CACHE:
2171
2172 if (Table->Revision < 3)
2173 {
2174 break;
2175 }
2176 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2177 ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
2178 sizeof (ACPI_PPTT_CACHE_V1), AcpiDmTableInfoPptt1a);
2179 if (ACPI_FAILURE (Status))
2180 {
2181 return;
2182 }
2183 break;
2184
2185 default:
2186
2187 break;
2188 }
2189
2190 NextSubtable:
2191 /* Point to next subtable */
2192
2193 Offset += Subtable->Length;
2194 }
2195 }
2196
2197
2198 /*******************************************************************************
2199 *
2200 * FUNCTION: AcpiDmDumpPrmt
2201 *
2202 * PARAMETERS: Table - A PRMT table
2203 *
2204 * RETURN: None
2205 *
2206 * DESCRIPTION: Format the contents of a PRMT. This table type consists
2207 * of an open-ended number of subtables.
2208 *
2209 ******************************************************************************/
2210
2211 void
2212 AcpiDmDumpPrmt (
2213 ACPI_TABLE_HEADER *Table)
2214 {
2215 UINT32 CurrentOffset = sizeof (ACPI_TABLE_HEADER);
2216 ACPI_TABLE_PRMT_HEADER *PrmtHeader;
2217 ACPI_PRMT_MODULE_INFO *PrmtModuleInfo;
2218 ACPI_PRMT_HANDLER_INFO *PrmtHandlerInfo;
2219 ACPI_STATUS Status;
2220 UINT32 i, j;
2221
2222
2223 /* Main table header */
2224
2225 PrmtHeader = ACPI_ADD_PTR (ACPI_TABLE_PRMT_HEADER, Table, CurrentOffset);
2226 Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHeader,
2227 sizeof (ACPI_TABLE_PRMT_HEADER), AcpiDmTableInfoPrmtHdr);
2228 if (ACPI_FAILURE (Status))
2229 {
2230 AcpiOsPrintf ("Invalid PRMT header\n");
2231 return;
2232 }
2233
2234 CurrentOffset += sizeof (ACPI_TABLE_PRMT_HEADER);
2235
2236 /* PRM Module Information Structure array */
2237
2238 for (i = 0; i < PrmtHeader->ModuleInfoCount; ++i)
2239 {
2240 PrmtModuleInfo = ACPI_ADD_PTR (ACPI_PRMT_MODULE_INFO, Table, CurrentOffset);
2241 Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtModuleInfo,
2242 sizeof (ACPI_PRMT_MODULE_INFO), AcpiDmTableInfoPrmtModule);
2243
2244 CurrentOffset += sizeof (ACPI_PRMT_MODULE_INFO);
2245
2246 /* PRM handler information structure array */
2247
2248 for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; ++j)
2249 {
2250 PrmtHandlerInfo = ACPI_ADD_PTR (ACPI_PRMT_HANDLER_INFO, Table, CurrentOffset);
2251 Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHandlerInfo,
2252 sizeof (ACPI_PRMT_HANDLER_INFO), AcpiDmTableInfoPrmtHandler);
2253
2254 CurrentOffset += sizeof (ACPI_PRMT_HANDLER_INFO);
2255 }
2256 }
2257 }
2258
2259
2260 /*******************************************************************************
2261 *
2262 * FUNCTION: AcpiDmDumpRgrt
2263 *
2264 * PARAMETERS: Table - A RGRT table
2265 *
2266 * RETURN: None
2267 *
2268 * DESCRIPTION: Format the contents of a RGRT
2269 *
2270 ******************************************************************************/
2271
2272 void
2273 AcpiDmDumpRgrt (
2274 ACPI_TABLE_HEADER *Table)
2275 {
2276 ACPI_STATUS Status;
2277 ACPI_TABLE_RGRT *Subtable = ACPI_CAST_PTR (ACPI_TABLE_RGRT, Table);
2278 UINT32 Offset = sizeof (ACPI_TABLE_RGRT);
2279
2280
2281 /* Main table */
2282
2283 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoRgrt);
2284 if (ACPI_FAILURE (Status))
2285 {
2286 return;
2287 }
2288
2289 /* Dump the binary image as a subtable */
2290
2291 Status = AcpiDmDumpTable (Table->Length, Offset, &Subtable->Image,
2292 Table->Length - Offset, AcpiDmTableInfoRgrt0);
2293 if (ACPI_FAILURE (Status))
2294 {
2295 return;
2296 }
2297 }
2298
2299
2300 /*******************************************************************************
2301 *
2302 * FUNCTION: AcpiDmDumpS3pt
2303 *
2304 * PARAMETERS: Table - A S3PT table
2305 *
2306 * RETURN: Length of the table
2307 *
2308 * DESCRIPTION: Format the contents of a S3PT
2309 *
2310 ******************************************************************************/
2311
2312 UINT32
2313 AcpiDmDumpS3pt (
2314 ACPI_TABLE_HEADER *Tables)
2315 {
2316 ACPI_STATUS Status;
2317 UINT32 Offset = sizeof (ACPI_TABLE_S3PT);
2318 ACPI_FPDT_HEADER *Subtable;
2319 ACPI_DMTABLE_INFO *InfoTable;
2320 ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
2321
2322
2323 /* Main table */
2324
2325 Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
2326 if (ACPI_FAILURE (Status))
2327 {
2328 return 0;
2329 }
2330
2331 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);
2332 while (Offset < S3ptTable->Length)
2333 {
2334 /* Common subtable header */
2335
2336 AcpiOsPrintf ("\n");
2337 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
2338 Subtable->Length, AcpiDmTableInfoS3ptHdr);
2339 if (ACPI_FAILURE (Status))
2340 {
2341 return 0;
2342 }
2343
2344 switch (Subtable->Type)
2345 {
2346 case ACPI_S3PT_TYPE_RESUME:
2347
2348 InfoTable = AcpiDmTableInfoS3pt0;
2349 break;
2350
2351 case ACPI_S3PT_TYPE_SUSPEND:
2352
2353 InfoTable = AcpiDmTableInfoS3pt1;
2354 break;
2355
2356 default:
2357
2358 AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n",
2359 Subtable->Type);
2360
2361 /* Attempt to continue */
2362
2363 if (!Subtable->Length)
2364 {
2365 AcpiOsPrintf ("Invalid zero length subtable\n");
2366 return 0;
2367 }
2368 goto NextSubtable;
2369 }
2370
2371 AcpiOsPrintf ("\n");
2372 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
2373 Subtable->Length, InfoTable);
2374 if (ACPI_FAILURE (Status))
2375 {
2376 return 0;
2377 }
2378
2379 NextSubtable:
2380 /* Point to next subtable */
2381
2382 Offset += Subtable->Length;
2383 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length);
2384 }
2385
2386 return (S3ptTable->Length);
2387 }
2388
2389
2390 /*******************************************************************************
2391 *
2392 * FUNCTION: AcpiDmDumpSdev
2393 *
2394 * PARAMETERS: Table - A SDEV table
2395 *
2396 * RETURN: None
2397 *
2398 * DESCRIPTION: Format the contents of a SDEV. This is a variable-length
2399 * table that contains variable strings and vendor data.
2400 *
2401 ******************************************************************************/
2402
2403 void
2404 AcpiDmDumpSdev (
2405 ACPI_TABLE_HEADER *Table)
2406 {
2407 ACPI_STATUS Status;
2408 ACPI_SDEV_HEADER *Subtable;
2409 ACPI_SDEV_PCIE *Pcie;
2410 ACPI_SDEV_NAMESPACE *Namesp;
2411 ACPI_DMTABLE_INFO *InfoTable;
2412 ACPI_DMTABLE_INFO *SecureComponentInfoTable;
2413 UINT32 Length = Table->Length;
2414 UINT32 Offset = sizeof (ACPI_TABLE_SDEV);
2415 UINT16 PathOffset;
2416 UINT16 PathLength;
2417 UINT16 VendorDataOffset;
2418 UINT16 VendorDataLength;
2419 ACPI_SDEV_SECURE_COMPONENT *SecureComponent = NULL;
2420 UINT32 CurrentOffset = 0;
2421
2422
2423 /* Main table */
2424
2425 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev);
2426 if (ACPI_FAILURE (Status))
2427 {
2428 return;
2429 }
2430
2431 /* Subtables */
2432
2433 Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset);
2434 while (Offset < Table->Length)
2435 {
2436 /* Common subtable header */
2437
2438 AcpiOsPrintf ("\n");
2439 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
2440 Subtable->Length, AcpiDmTableInfoSdevHdr);
2441 if (ACPI_FAILURE (Status))
2442 {
2443 return;
2444 }
2445
2446 switch (Subtable->Type)
2447 {
2448 case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
2449
2450 InfoTable = AcpiDmTableInfoSdev0;
2451 break;
2452
2453 case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
2454
2455 InfoTable = AcpiDmTableInfoSdev1;
2456 break;
2457
2458 default:
2459 goto NextSubtable;
2460 }
2461
2462 AcpiOsPrintf ("\n");
2463 Status = AcpiDmDumpTable (Table->Length, 0, Subtable,
2464 Subtable->Length, InfoTable);
2465 if (ACPI_FAILURE (Status))
2466 {
2467 return;
2468 }
2469
2470 switch (Subtable->Type)
2471 {
2472 case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
2473
2474 CurrentOffset = sizeof (ACPI_SDEV_NAMESPACE);
2475 if (Subtable->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
2476 {
2477 SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
2478 ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)));
2479
2480 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
2481 ACPI_ADD_PTR(UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)),
2482 sizeof (ACPI_SDEV_SECURE_COMPONENT), AcpiDmTableInfoSdev0b);
2483 if (ACPI_FAILURE (Status))
2484 {
2485 return;
2486 }
2487 CurrentOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
2488
2489 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
2490 ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
2491 sizeof (ACPI_SDEV_HEADER), AcpiDmTableInfoSdevSecCompHdr);
2492 if (ACPI_FAILURE (Status))
2493 {
2494 return;
2495 }
2496 CurrentOffset += sizeof (ACPI_SDEV_HEADER);
2497
2498 switch (Subtable->Type)
2499 {
2500 case ACPI_SDEV_TYPE_ID_COMPONENT:
2501
2502 SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
2503 break;
2504
2505 case ACPI_SDEV_TYPE_MEM_COMPONENT:
2506
2507 SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
2508 break;
2509
2510 default:
2511 goto NextSubtable;
2512 }
2513
2514 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
2515 ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
2516 SecureComponent->SecureComponentLength, SecureComponentInfoTable);
2517 CurrentOffset += SecureComponent->SecureComponentLength;
2518 }
2519
2520 /* Dump the PCIe device ID(s) */
2521
2522 Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);
2523 PathOffset = Namesp->DeviceIdOffset;
2524 PathLength = Namesp->DeviceIdLength;
2525
2526 if (PathLength)
2527 {
2528 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
2529 ACPI_ADD_PTR (UINT8, Namesp, PathOffset),
2530 PathLength, AcpiDmTableInfoSdev0a);
2531 if (ACPI_FAILURE (Status))
2532 {
2533 return;
2534 }
2535 CurrentOffset += PathLength;
2536 }
2537
2538 /* Dump the vendor-specific data */
2539
2540 VendorDataLength =
2541 Namesp->VendorDataLength;
2542 VendorDataOffset =
2543 Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
2544
2545 if (VendorDataLength)
2546 {
2547 Status = AcpiDmDumpTable (Table->Length, 0,
2548 ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset),
2549 VendorDataLength, AcpiDmTableInfoSdev1b);
2550 if (ACPI_FAILURE (Status))
2551 {
2552 return;
2553 }
2554 }
2555 break;
2556
2557 case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
2558
2559 /* PCI path substructures */
2560
2561 Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable);
2562 PathOffset = Pcie->PathOffset;
2563 PathLength = Pcie->PathLength;
2564
2565 while (PathLength)
2566 {
2567 Status = AcpiDmDumpTable (Table->Length,
2568 PathOffset + Offset,
2569 ACPI_ADD_PTR (UINT8, Pcie, PathOffset),
2570 sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a);
2571 if (ACPI_FAILURE (Status))
2572 {
2573 return;
2574 }
2575
2576 PathOffset += sizeof (ACPI_SDEV_PCIE_PATH);
2577 PathLength -= sizeof (ACPI_SDEV_PCIE_PATH);
2578 }
2579
2580 /* VendorData */
2581
2582 VendorDataLength = Pcie->VendorDataLength;
2583 VendorDataOffset = Pcie->PathOffset + Pcie->PathLength;
2584
2585 if (VendorDataLength)
2586 {
2587 Status = AcpiDmDumpTable (Table->Length, 0,
2588 ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset),
2589 VendorDataLength, AcpiDmTableInfoSdev1b);
2590 if (ACPI_FAILURE (Status))
2591 {
2592 return;
2593 }
2594 }
2595 break;
2596
2597 default:
2598 goto NextSubtable;
2599 }
2600
2601 NextSubtable:
2602 /* Point to next subtable */
2603
2604 Offset += Subtable->Length;
2605 Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable,
2606 Subtable->Length);
2607 }
2608 }
2609