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