dmtbdump2.c revision 1.1.1.11 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 EndpointEndOffset;
1390 UINT8 ConfigType = 0;
1391 UINT8 ArrayType;
1392 UINT8 MicrophoneCount;
1393 ACPI_NHLT_VENDOR_MIC_COUNT *MicCount;
1394 ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A *DevSpecific;
1395 ACPI_NHLT_FORMATS_CONFIG *FormatsConfig;
1396 ACPI_NHLT_LINUX_SPECIFIC_COUNT *Count;
1397 ACPI_NHLT_LINUX_SPECIFIC_DATA *LinuxData;
1398 ACPI_NHLT_LINUX_SPECIFIC_DATA_B *LinuxDataB;
1399
1400
1401 /* Main table */
1402
1403 AcpiOsPrintf (" /* Main table */\n");
1404
1405 Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoNhlt);
1406 if (ACPI_FAILURE (Status))
1407 {
1408 return;
1409 }
1410
1411 /* Get the Endpoint Descriptor Count */
1412
1413 InfoTable = ACPI_ADD_PTR (ACPI_TABLE_NHLT, Table, 0);
1414 EndpointCount = InfoTable->EndpointCount;
1415
1416 /* Subtables */
1417
1418 Offset = sizeof (ACPI_TABLE_NHLT);
1419
1420 while (Offset < TableLength)
1421 {
1422 /* A variable number of Endpoint Descriptors - process each */
1423
1424 for (i = 0; i < EndpointCount; i++)
1425 {
1426 /* Do the Endpoint Descriptor table */
1427
1428 Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
1429
1430 /* Check for endpoint descriptor length beyond end-of-table */
1431
1432 if (Subtable->DescriptorLength > TableLength)
1433 {
1434 Offset += 1;
1435 AcpiOsPrintf ("\n /* Endpoint Descriptor Length larger than"
1436 " table size: %X, table %X, adjusting table offset (+1) */\n",
1437 Subtable->DescriptorLength, TableLength);
1438
1439 Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
1440 }
1441
1442 AcpiOsPrintf ("\n /* Endpoint Descriptor #%u */\n", i+1);
1443 Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
1444 Subtable->DescriptorLength, AcpiDmTableInfoNhlt0);
1445 if (ACPI_FAILURE (Status))
1446 {
1447 return;
1448 }
1449
1450 EndpointEndOffset = Subtable->DescriptorLength + Offset;
1451
1452 /* Check for endpoint descriptor beyond end-of-table */
1453
1454 if (Subtable->DescriptorLength > TableLength)
1455 {
1456 AcpiOsPrintf ("\n /* Endpoint Descriptor Length larger than table size: %X, table %X */\n",
1457 Subtable->DescriptorLength, TableLength);
1458 }
1459
1460 Offset += sizeof (ACPI_NHLT_ENDPOINT);
1461 Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
1462
1463 /* Do the Device Specific table */
1464
1465 AcpiOsPrintf ("\n /* Endpoint Device_Specific_Config table */\n");
1466 DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable);
1467 CapabilitiesSize = DevSpecific->CapabilitiesSize;
1468 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1469 sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b);
1470 if (ACPI_FAILURE (Status))
1471 {
1472 return;
1473 }
1474
1475 ArrayType = 0;
1476
1477 /* Different subtables based upon capabilities_size */
1478
1479 switch (CapabilitiesSize)
1480 {
1481 case 0:
1482 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B);
1483 break;
1484
1485 case 1:
1486 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1487 sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C), AcpiDmTableInfoNhlt5c);
1488 if (ACPI_FAILURE (Status))
1489 {
1490 return;
1491 }
1492 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C);
1493 break;
1494
1495 case 2:
1496 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1497 sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt5);
1498 if (ACPI_FAILURE (Status))
1499 {
1500 return;
1501 }
1502 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG);
1503 break;
1504
1505 case 3:
1506 default:
1507 /* Extract the ConfigType and ArrayType */
1508
1509 ConfigType = DevSpecific->ConfigType;
1510 ArrayType = DevSpecific->ArrayType;
1511
1512 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1513 sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A), AcpiDmTableInfoNhlt5a);
1514 if (ACPI_FAILURE (Status))
1515 {
1516 return;
1517 }
1518
1519 /* Capabilities Size == 3 */
1520 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A);
1521 break;
1522
1523 case 7:
1524 ConfigType = DevSpecific->ConfigType;
1525 Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
1526 DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable);
1527
1528 AcpiOsPrintf ("\n /* Render Feedback Device-Specific table */\n");
1529 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1530 sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt5);
1531 if (ACPI_FAILURE (Status))
1532 {
1533 return;
1534 }
1535
1536 /* Capabilities Size = 7 */
1537 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG);
1538
1539 if (ConfigType == ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK)
1540 {
1541 Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
1542 DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable);
1543
1544 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1545 sizeof (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt6b);
1546 if (ACPI_FAILURE (Status))
1547 {
1548 return;
1549 }
1550 Offset += sizeof (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG);
1551 }
1552 break;
1553 }
1554
1555 /* Check for a vendor-defined mic array */
1556
1557 if (ConfigType == ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY)
1558 {
1559 if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_MASK) == ACPI_NHLT_VENDOR_DEFINED)
1560 {
1561 /* Vendor-defined microphone array; get the microphone count first */
1562
1563 AcpiOsPrintf ("\n /* Vendor-defined microphone count */\n");
1564 MicCount = ACPI_ADD_PTR (ACPI_NHLT_VENDOR_MIC_COUNT, Table, Offset);
1565 MicrophoneCount = MicCount->MicrophoneCount;
1566
1567 Status = AcpiDmDumpTable (TableLength, Offset, MicCount,
1568 sizeof (ACPI_NHLT_VENDOR_MIC_COUNT), AcpiDmTableInfoNhlt6a);
1569 Offset += sizeof (ACPI_NHLT_VENDOR_MIC_COUNT);
1570 if (ACPI_FAILURE (Status))
1571 {
1572 return;
1573 }
1574
1575 /* Get the vendor microphone config structure(s) */
1576
1577 for (j = 0; j < MicrophoneCount; j++)
1578 {
1579 AcpiOsPrintf ("\n /* Vendor-defined microphone array #%u*/\n", j+1);
1580 DevSpecific = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Table, Offset);
1581
1582 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1583 sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG), AcpiDmTableInfoNhlt6);
1584 if (ACPI_FAILURE (Status))
1585 {
1586 return;
1587 }
1588
1589 Offset += sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG);
1590 }
1591
1592 /* Check for Microphone SNR and sensitivity extension */
1593
1594 if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_EXT_MASK) == ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT)
1595 {
1596 AcpiOsPrintf ("\n /* Microphone SNR and sensitivity array */\n");
1597 DevSpecific = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Table, Offset);
1598
1599 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
1600 sizeof (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION), AcpiDmTableInfoNhlt9);
1601 if (ACPI_FAILURE (Status))
1602 {
1603 return;
1604 }
1605
1606 Offset += sizeof (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION);
1607 }
1608 }
1609 }
1610
1611 /* Do the Formats_Config table - starts with the FormatsCount field */
1612
1613 FormatsConfig = ACPI_ADD_PTR (ACPI_NHLT_FORMATS_CONFIG, Table, Offset);
1614 FormatsCount = FormatsConfig->FormatsCount;
1615
1616 AcpiOsPrintf ("\n /* Formats_Config table */\n");
1617
1618 /* Dump the FormatsCount value */
1619
1620 if (FormatsCount > 0)
1621 {
1622 Status = AcpiDmDumpTable (TableLength, Offset, FormatsConfig,
1623 sizeof (ACPI_NHLT_FORMATS_CONFIG), AcpiDmTableInfoNhlt4);
1624 if (ACPI_FAILURE (Status))
1625 {
1626 return;
1627 }
1628 }
1629 Offset += sizeof (ACPI_NHLT_FORMATS_CONFIG);
1630
1631 /* A variable number of Format_Config Descriptors - process each */
1632
1633 for (j = 0; j < FormatsCount; j++)
1634 {
1635 FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset);
1636 CapabilitiesSize = FormatSubtable->CapabilitySize;
1637
1638 /* Do the Wave_extensible struct */
1639
1640 AcpiOsPrintf ("\n /* Wave_Format_Extensible table #%u */\n", j+1);
1641 Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable,
1642 sizeof (ACPI_NHLT_FORMAT_CONFIG), AcpiDmTableInfoNhlt3);
1643 if (ACPI_FAILURE (Status))
1644 {
1645 return;
1646 }
1647
1648 Offset += sizeof (ACPI_NHLT_FORMAT_CONFIG);
1649
1650 if (CapabilitiesSize > 0)
1651 {
1652 FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset);
1653 /* Do the Capabilities array (of bytes) */
1654
1655 AcpiOsPrintf ("\n /* Specific_Config table #%u */\n", j+1);
1656 FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset);
1657 Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable,
1658 CapabilitiesSize, AcpiDmTableInfoNhlt3a);
1659 if (ACPI_FAILURE (Status))
1660 {
1661 return;
1662 }
1663
1664 Offset += CapabilitiesSize; // + sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B);
1665 }
1666
1667 } /* for (j = 0; j < FormatsCount; j++) */
1668
1669 /*
1670 * If we are not done with the current Endpoint yet, then there must be
1671 * some Linux-specific structure(s) yet to be processed. First, get
1672 * the count of such structure(s).
1673 */
1674 if (Offset < EndpointEndOffset)
1675 {
1676 AcpiOsPrintf ("\n /* Linux-specific structures (not part of NHLT spec) */\n");
1677 Count = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_COUNT, Table, Offset);
1678 Status = AcpiDmDumpTable (TableLength, Offset, Count,
1679 sizeof (ACPI_NHLT_LINUX_SPECIFIC_COUNT), AcpiDmTableInfoNhlt7);
1680 if (ACPI_FAILURE (Status))
1681 {
1682 return;
1683 }
1684 Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_COUNT);
1685
1686 if (Count->StructureCount > 1)
1687 {
1688 /*
1689 * We currently cannot disassemble more than one
1690 * Linux-Specific section, because we have no way of
1691 * knowing whether the "Specific Data" part is present.
1692 */
1693 Count->StructureCount = 1;
1694 fprintf (stderr, "%s %s\n", "Feature not supported:",
1695 "Cannot disassemble more than one Linux-Specific structure");
1696 return;
1697 }
1698
1699 /* Variable number of linux-specific structures */
1700
1701 for (j = 0; j < Count->StructureCount; j++)
1702 {
1703 LinuxData = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA, Table, Offset);
1704 AcpiOsPrintf ("\n /* Linux-specific structure #%u (not part of NHLT spec) */\n", j+1);
1705
1706 /*
1707 * Dump the following Linux-specific fields:
1708 * 1) Device ID
1709 * 2) Device Instance ID
1710 * 3) Device Port ID
1711 */
1712 Status = AcpiDmDumpTable (TableLength, Offset, LinuxData,
1713 sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA), AcpiDmTableInfoNhlt7a);
1714 if (ACPI_FAILURE (Status))
1715 {
1716 return;
1717 }
1718
1719 Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA);
1720
1721 /*
1722 * Check that the current offset is not beyond the end of
1723 * this endpoint descriptor. If it is not, we assume that
1724 * the "Specific Data" field is present and valid. Note:
1725 * This does not seem to be documented anywhere.
1726 */
1727 if (Offset < EndpointEndOffset)
1728 {
1729 /* Dump the linux-specific "Specific Data" field */
1730
1731 LinuxDataB = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA_B, Table, Offset);
1732 Status = AcpiDmDumpTable (TableLength, Offset, LinuxDataB,
1733 sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA_B), AcpiDmTableInfoNhlt7b);
1734 if (ACPI_FAILURE (Status))
1735 {
1736 return;
1737 }
1738
1739 Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA_B);
1740 }
1741 }
1742
1743 /* Should be at the end of the Endpoint structure. */
1744 }
1745
1746 } /* for (i = 0; i < EndpointCount; i++) */
1747
1748
1749 /*
1750 * Done with all of the Endpoint Descriptors, Emit the table terminator
1751 * (if such a legacy structure is present -- not in NHLT specification)
1752 */
1753 if (Offset == TableLength - sizeof (ACPI_NHLT_TABLE_TERMINATOR))
1754 {
1755 LinuxData = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA, Table, Offset);
1756 AcpiOsPrintf ("\n /* Table terminator structure (not part of NHLT spec) */\n");
1757
1758 Status = AcpiDmDumpTable (TableLength, Offset, LinuxData,
1759 sizeof (ACPI_NHLT_TABLE_TERMINATOR), AcpiDmTableInfoNhlt8);
1760 if (ACPI_FAILURE (Status))
1761 {
1762 return;
1763 }
1764 }
1765
1766 return;
1767 }
1768 }
1769
1770
1771 /*******************************************************************************
1772 *
1773 * FUNCTION: AcpiDmDumpPcct
1774 *
1775 * PARAMETERS: Table - A PCCT table
1776 *
1777 * RETURN: None
1778 *
1779 * DESCRIPTION: Format the contents of a PCCT. This table type consists
1780 * of an open-ended number of subtables.
1781 *
1782 ******************************************************************************/
1783
1784 void
1785 AcpiDmDumpPcct (
1786 ACPI_TABLE_HEADER *Table)
1787 {
1788 ACPI_STATUS Status;
1789 ACPI_PCCT_SUBSPACE *Subtable;
1790 ACPI_DMTABLE_INFO *InfoTable;
1791 UINT32 Length = Table->Length;
1792 UINT32 Offset = sizeof (ACPI_TABLE_PCCT);
1793
1794
1795 /* Main table */
1796
1797 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
1798 if (ACPI_FAILURE (Status))
1799 {
1800 return;
1801 }
1802
1803 /* Subtables */
1804
1805 Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
1806 while (Offset < Table->Length)
1807 {
1808 /* Common subtable header */
1809
1810 AcpiOsPrintf ("\n");
1811 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1812 Subtable->Header.Length, AcpiDmTableInfoPcctHdr);
1813 if (ACPI_FAILURE (Status))
1814 {
1815 return;
1816 }
1817
1818 switch (Subtable->Header.Type)
1819 {
1820 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
1821
1822 InfoTable = AcpiDmTableInfoPcct0;
1823 break;
1824
1825 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
1826
1827 InfoTable = AcpiDmTableInfoPcct1;
1828 break;
1829
1830 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
1831
1832 InfoTable = AcpiDmTableInfoPcct2;
1833 break;
1834
1835 case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
1836
1837 InfoTable = AcpiDmTableInfoPcct3;
1838 break;
1839
1840 case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
1841
1842 InfoTable = AcpiDmTableInfoPcct4;
1843 break;
1844
1845 case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
1846
1847 InfoTable = AcpiDmTableInfoPcct5;
1848 break;
1849
1850 default:
1851
1852 AcpiOsPrintf (
1853 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
1854 Subtable->Header.Type);
1855 return;
1856 }
1857
1858 AcpiOsPrintf ("\n");
1859 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1860 Subtable->Header.Length, InfoTable);
1861 if (ACPI_FAILURE (Status))
1862 {
1863 return;
1864 }
1865
1866 /* Point to next subtable */
1867
1868 Offset += Subtable->Header.Length;
1869 Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Subtable,
1870 Subtable->Header.Length);
1871 }
1872 }
1873
1874
1875 /*******************************************************************************
1876 *
1877 * FUNCTION: AcpiDmDumpPdtt
1878 *
1879 * PARAMETERS: Table - A PDTT table
1880 *
1881 * RETURN: None
1882 *
1883 * DESCRIPTION: Format the contents of a Pdtt. This is a variable-length
1884 * table that contains an open-ended number of IDs
1885 * at the end of the table.
1886 *
1887 ******************************************************************************/
1888
1889 void
1890 AcpiDmDumpPdtt (
1891 ACPI_TABLE_HEADER *Table)
1892 {
1893 ACPI_STATUS Status;
1894 ACPI_PDTT_CHANNEL *Subtable;
1895 UINT32 Length = Table->Length;
1896 UINT32 Offset = sizeof (ACPI_TABLE_PDTT);
1897
1898
1899 /* Main table */
1900
1901 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt);
1902 if (ACPI_FAILURE (Status))
1903 {
1904 return;
1905 }
1906
1907 /* Subtables. Currently there is only one type, but can be multiples */
1908
1909 Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset);
1910 while (Offset < Table->Length)
1911 {
1912 AcpiOsPrintf ("\n");
1913 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1914 sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0);
1915 if (ACPI_FAILURE (Status))
1916 {
1917 return;
1918 }
1919
1920 /* Point to next subtable */
1921
1922 Offset += sizeof (ACPI_PDTT_CHANNEL);
1923 Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Subtable,
1924 sizeof (ACPI_PDTT_CHANNEL));
1925 }
1926 }
1927
1928
1929 /*******************************************************************************
1930 *
1931 * FUNCTION: AcpiDmDumpPhat
1932 *
1933 * PARAMETERS: Table - A PHAT table
1934 *
1935 * RETURN: None
1936 *
1937 * DESCRIPTION: Format the contents of a PHAT.
1938 *
1939 ******************************************************************************/
1940
1941 void
1942 AcpiDmDumpPhat (
1943 ACPI_TABLE_HEADER *Table)
1944 {
1945 ACPI_STATUS Status;
1946 ACPI_DMTABLE_INFO *InfoTable;
1947 ACPI_PHAT_HEADER *Subtable;
1948 ACPI_PHAT_VERSION_DATA *VersionData;
1949 UINT32 RecordCount;
1950 UINT32 Length = Table->Length;
1951 UINT32 Offset = sizeof (ACPI_TABLE_PHAT);
1952 UINT32 SubtableLength;
1953 UINT32 PathLength;
1954 UINT32 VendorLength;
1955
1956
1957 Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT));
1958
1959 while (Offset < Table->Length)
1960 {
1961 /* Common subtable header */
1962
1963 AcpiOsPrintf ("\n");
1964 Status = AcpiDmDumpTable (Length, 0, Subtable,
1965 sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr);
1966 if (ACPI_FAILURE (Status))
1967 {
1968 return;
1969 }
1970
1971 switch (Subtable->Type)
1972 {
1973 case ACPI_PHAT_TYPE_FW_VERSION_DATA:
1974
1975 InfoTable = AcpiDmTableInfoPhat0;
1976 SubtableLength = sizeof (ACPI_PHAT_VERSION_DATA);
1977 break;
1978
1979 case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
1980
1981 InfoTable = AcpiDmTableInfoPhat1;
1982 SubtableLength = sizeof (ACPI_PHAT_HEALTH_DATA);
1983 break;
1984
1985 default:
1986
1987 AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",
1988 Subtable->Type);
1989
1990 return;
1991 }
1992
1993 Status = AcpiDmDumpTable (Length, 0, Subtable,
1994 SubtableLength, InfoTable);
1995 if (ACPI_FAILURE (Status))
1996 {
1997 return;
1998 }
1999
2000 switch (Subtable->Type)
2001 {
2002 case ACPI_PHAT_TYPE_FW_VERSION_DATA:
2003
2004 VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable);
2005 RecordCount = VersionData->ElementCount;
2006 while (RecordCount)
2007 {
2008 Status = AcpiDmDumpTable (Length, Offset,
2009 ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_VERSION_DATA)),
2010 sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a);
2011 if (ACPI_FAILURE (Status))
2012 {
2013 return;
2014 }
2015
2016 RecordCount--;
2017 }
2018
2019 break;
2020
2021 case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
2022
2023 /* account for the null terminator */
2024
2025 PathLength = strlen (ACPI_ADD_PTR (char, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA))) + 1;
2026 Status = AcpiDmDumpTable (Length, Offset,
2027 ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)),
2028 PathLength, AcpiDmTableInfoPhat1a);
2029 if (ACPI_FAILURE (Status))
2030 {
2031 return;
2032 }
2033
2034 /* Get vendor data - data length is the remaining subtable length */
2035
2036 VendorLength =
2037 Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength;
2038 Status = AcpiDmDumpTable (Length, 0,
2039 ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength),
2040 VendorLength, AcpiDmTableInfoPhat1b);
2041 if (ACPI_FAILURE (Status))
2042 {
2043 return;
2044 }
2045 break;
2046
2047 default:
2048
2049 AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",
2050 Subtable->Type);
2051 return;
2052 }
2053
2054 /* Next subtable */
2055
2056 Offset += Subtable->Length;
2057 Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable,
2058 Subtable->Length);
2059 }
2060 }
2061
2062
2063 /*******************************************************************************
2064 *
2065 * FUNCTION: AcpiDmDumpPmtt
2066 *
2067 * PARAMETERS: Table - A PMTT table
2068 *
2069 * RETURN: None
2070 *
2071 * DESCRIPTION: Format the contents of a PMTT. This table type consists
2072 * of an open-ended number of subtables.
2073 *
2074 ******************************************************************************/
2075
2076 void
2077 AcpiDmDumpPmtt (
2078 ACPI_TABLE_HEADER *Table)
2079 {
2080 ACPI_STATUS Status;
2081 ACPI_PMTT_HEADER *Subtable;
2082 UINT32 Length = Table->Length;
2083 UINT32 Offset = sizeof (ACPI_TABLE_PMTT);
2084
2085
2086 /* Main table */
2087
2088 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
2089 if (ACPI_FAILURE (Status))
2090 {
2091 return;
2092 }
2093
2094 /* Subtables */
2095
2096 Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
2097 while (Offset < Table->Length)
2098 {
2099 /* Each of the types below contain the common subtable header */
2100
2101 AcpiOsPrintf ("\n");
2102 switch (Subtable->Type)
2103 {
2104 case ACPI_PMTT_TYPE_SOCKET:
2105
2106 Status = AcpiDmDumpTable (Length, Offset, Subtable,
2107 Subtable->Length, AcpiDmTableInfoPmtt0);
2108 if (ACPI_FAILURE (Status))
2109 {
2110 return;
2111 }
2112 break;
2113
2114 case ACPI_PMTT_TYPE_CONTROLLER:
2115 Status = AcpiDmDumpTable (Length, Offset, Subtable,
2116 Subtable->Length, AcpiDmTableInfoPmtt1);
2117 if (ACPI_FAILURE (Status))
2118 {
2119 return;
2120 }
2121 break;
2122
2123 case ACPI_PMTT_TYPE_DIMM:
2124 Status = AcpiDmDumpTable (Length, Offset, Subtable,
2125 Subtable->Length, AcpiDmTableInfoPmtt2);
2126 if (ACPI_FAILURE (Status))
2127 {
2128 return;
2129 }
2130 break;
2131
2132 case ACPI_PMTT_TYPE_VENDOR:
2133 Status = AcpiDmDumpTable (Length, Offset, Subtable,
2134 Subtable->Length, AcpiDmTableInfoPmttVendor);
2135 if (ACPI_FAILURE (Status))
2136 {
2137 return;
2138 }
2139 break;
2140
2141 default:
2142 AcpiOsPrintf (
2143 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2144 Subtable->Type);
2145 return;
2146 }
2147
2148 /* Point to next subtable */
2149
2150 Offset += Subtable->Length;
2151 Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2152 Subtable, Subtable->Length);
2153 }
2154 }
2155
2156
2157 /*******************************************************************************
2158 *
2159 * FUNCTION: AcpiDmDumpPptt
2160 *
2161 * PARAMETERS: Table - A PMTT table
2162 *
2163 * RETURN: None
2164 *
2165 * DESCRIPTION: Format the contents of a PPTT. This table type consists
2166 * of an open-ended number of subtables.
2167 *
2168 ******************************************************************************/
2169
2170 void
2171 AcpiDmDumpPptt (
2172 ACPI_TABLE_HEADER *Table)
2173 {
2174 ACPI_STATUS Status;
2175 ACPI_SUBTABLE_HEADER *Subtable;
2176 ACPI_PPTT_PROCESSOR *PpttProcessor;
2177 UINT8 Length;
2178 UINT8 SubtableOffset;
2179 UINT32 Offset = sizeof (ACPI_TABLE_FPDT);
2180 ACPI_DMTABLE_INFO *InfoTable;
2181 UINT32 i;
2182
2183
2184 /* There is no main table (other than the standard ACPI header) */
2185
2186 /* Subtables */
2187
2188 Offset = sizeof (ACPI_TABLE_HEADER);
2189 while (Offset < Table->Length)
2190 {
2191 AcpiOsPrintf ("\n");
2192
2193 /* Common subtable header */
2194
2195 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
2196 if (Subtable->Length < sizeof (ACPI_SUBTABLE_HEADER))
2197 {
2198 AcpiOsPrintf ("Invalid subtable length\n");
2199 return;
2200 }
2201 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
2202 Subtable->Length, AcpiDmTableInfoPpttHdr);
2203 if (ACPI_FAILURE (Status))
2204 {
2205 return;
2206 }
2207
2208 switch (Subtable->Type)
2209 {
2210 case ACPI_PPTT_TYPE_PROCESSOR:
2211
2212 InfoTable = AcpiDmTableInfoPptt0;
2213 Length = sizeof (ACPI_PPTT_PROCESSOR);
2214 break;
2215
2216 case ACPI_PPTT_TYPE_CACHE:
2217
2218 InfoTable = AcpiDmTableInfoPptt1;
2219 Length = sizeof (ACPI_PPTT_CACHE);
2220 break;
2221
2222 case ACPI_PPTT_TYPE_ID:
2223
2224 InfoTable = AcpiDmTableInfoPptt2;
2225 Length = sizeof (ACPI_PPTT_ID);
2226 break;
2227
2228 default:
2229
2230 AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n",
2231 Subtable->Type);
2232
2233 /* Attempt to continue */
2234
2235 goto NextSubtable;
2236 }
2237
2238 if (Subtable->Length < Length)
2239 {
2240 AcpiOsPrintf ("Invalid subtable length\n");
2241 return;
2242 }
2243 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
2244 Subtable->Length, InfoTable);
2245 if (ACPI_FAILURE (Status))
2246 {
2247 return;
2248 }
2249 SubtableOffset = Length;
2250
2251 switch (Subtable->Type)
2252 {
2253 case ACPI_PPTT_TYPE_PROCESSOR:
2254
2255 PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, Subtable);
2256
2257 /* Dump SMBIOS handles */
2258
2259 if ((UINT8)(Subtable->Length - SubtableOffset) <
2260 (UINT8)(PpttProcessor->NumberOfPrivResources * 4))
2261 {
2262 AcpiOsPrintf ("Invalid private resource number\n");
2263 return;
2264 }
2265 for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++)
2266 {
2267 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2268 ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
2269 4, AcpiDmTableInfoPptt0a);
2270 if (ACPI_FAILURE (Status))
2271 {
2272 return;
2273 }
2274
2275 SubtableOffset += 4;
2276 }
2277 break;
2278
2279 case ACPI_PPTT_TYPE_CACHE:
2280
2281 if (Table->Revision < 3)
2282 {
2283 break;
2284 }
2285 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2286 ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
2287 sizeof (ACPI_PPTT_CACHE_V1), AcpiDmTableInfoPptt1a);
2288 if (ACPI_FAILURE (Status))
2289 {
2290 return;
2291 }
2292 break;
2293
2294 default:
2295
2296 break;
2297 }
2298
2299 NextSubtable:
2300 /* Point to next subtable */
2301
2302 Offset += Subtable->Length;
2303 }
2304 }
2305
2306
2307 /*******************************************************************************
2308 *
2309 * FUNCTION: AcpiDmDumpPrmt
2310 *
2311 * PARAMETERS: Table - A PRMT table
2312 *
2313 * RETURN: None
2314 *
2315 * DESCRIPTION: Format the contents of a PRMT. This table type consists
2316 * of an open-ended number of subtables.
2317 *
2318 ******************************************************************************/
2319
2320 void
2321 AcpiDmDumpPrmt (
2322 ACPI_TABLE_HEADER *Table)
2323 {
2324 UINT32 CurrentOffset = sizeof (ACPI_TABLE_HEADER);
2325 ACPI_TABLE_PRMT_HEADER *PrmtHeader;
2326 ACPI_PRMT_MODULE_INFO *PrmtModuleInfo;
2327 ACPI_PRMT_HANDLER_INFO *PrmtHandlerInfo;
2328 ACPI_STATUS Status;
2329 UINT32 i, j;
2330
2331
2332 /* Main table header */
2333
2334 PrmtHeader = ACPI_ADD_PTR (ACPI_TABLE_PRMT_HEADER, Table, CurrentOffset);
2335 Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHeader,
2336 sizeof (ACPI_TABLE_PRMT_HEADER), AcpiDmTableInfoPrmtHdr);
2337 if (ACPI_FAILURE (Status))
2338 {
2339 AcpiOsPrintf ("Invalid PRMT header\n");
2340 return;
2341 }
2342
2343 CurrentOffset += sizeof (ACPI_TABLE_PRMT_HEADER);
2344
2345 /* PRM Module Information Structure array */
2346
2347 for (i = 0; i < PrmtHeader->ModuleInfoCount; ++i)
2348 {
2349 PrmtModuleInfo = ACPI_ADD_PTR (ACPI_PRMT_MODULE_INFO, Table, CurrentOffset);
2350 Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtModuleInfo,
2351 sizeof (ACPI_PRMT_MODULE_INFO), AcpiDmTableInfoPrmtModule);
2352
2353 CurrentOffset += sizeof (ACPI_PRMT_MODULE_INFO);
2354
2355 /* PRM handler information structure array */
2356
2357 for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; ++j)
2358 {
2359 PrmtHandlerInfo = ACPI_ADD_PTR (ACPI_PRMT_HANDLER_INFO, Table, CurrentOffset);
2360 Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHandlerInfo,
2361 sizeof (ACPI_PRMT_HANDLER_INFO), AcpiDmTableInfoPrmtHandler);
2362
2363 CurrentOffset += sizeof (ACPI_PRMT_HANDLER_INFO);
2364 }
2365 }
2366 }
2367
2368
2369 /*******************************************************************************
2370 *
2371 * FUNCTION: AcpiDmDumpRgrt
2372 *
2373 * PARAMETERS: Table - A RGRT table
2374 *
2375 * RETURN: None
2376 *
2377 * DESCRIPTION: Format the contents of a RGRT
2378 *
2379 ******************************************************************************/
2380
2381 void
2382 AcpiDmDumpRgrt (
2383 ACPI_TABLE_HEADER *Table)
2384 {
2385 ACPI_STATUS Status;
2386 ACPI_TABLE_RGRT *Subtable = ACPI_CAST_PTR (ACPI_TABLE_RGRT, Table);
2387 UINT32 Offset = sizeof (ACPI_TABLE_RGRT);
2388
2389
2390 /* Main table */
2391
2392 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoRgrt);
2393 if (ACPI_FAILURE (Status))
2394 {
2395 return;
2396 }
2397
2398 /* Dump the binary image as a subtable */
2399
2400 Status = AcpiDmDumpTable (Table->Length, Offset, &Subtable->Image,
2401 Table->Length - Offset, AcpiDmTableInfoRgrt0);
2402 if (ACPI_FAILURE (Status))
2403 {
2404 return;
2405 }
2406 }
2407
2408
2409 /*******************************************************************************
2410 *
2411 * FUNCTION: AcpiDmDumpS3pt
2412 *
2413 * PARAMETERS: Table - A S3PT table
2414 *
2415 * RETURN: Length of the table
2416 *
2417 * DESCRIPTION: Format the contents of a S3PT
2418 *
2419 ******************************************************************************/
2420
2421 UINT32
2422 AcpiDmDumpS3pt (
2423 ACPI_TABLE_HEADER *Tables)
2424 {
2425 ACPI_STATUS Status;
2426 UINT32 Offset = sizeof (ACPI_TABLE_S3PT);
2427 ACPI_FPDT_HEADER *Subtable;
2428 ACPI_DMTABLE_INFO *InfoTable;
2429 ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
2430
2431
2432 /* Main table */
2433
2434 Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
2435 if (ACPI_FAILURE (Status))
2436 {
2437 return 0;
2438 }
2439
2440 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);
2441 while (Offset < S3ptTable->Length)
2442 {
2443 /* Common subtable header */
2444
2445 AcpiOsPrintf ("\n");
2446 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
2447 Subtable->Length, AcpiDmTableInfoS3ptHdr);
2448 if (ACPI_FAILURE (Status))
2449 {
2450 return 0;
2451 }
2452
2453 switch (Subtable->Type)
2454 {
2455 case ACPI_S3PT_TYPE_RESUME:
2456
2457 InfoTable = AcpiDmTableInfoS3pt0;
2458 break;
2459
2460 case ACPI_S3PT_TYPE_SUSPEND:
2461
2462 InfoTable = AcpiDmTableInfoS3pt1;
2463 break;
2464
2465 default:
2466
2467 AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n",
2468 Subtable->Type);
2469
2470 /* Attempt to continue */
2471
2472 if (!Subtable->Length)
2473 {
2474 AcpiOsPrintf ("Invalid zero length subtable\n");
2475 return 0;
2476 }
2477 goto NextSubtable;
2478 }
2479
2480 AcpiOsPrintf ("\n");
2481 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
2482 Subtable->Length, InfoTable);
2483 if (ACPI_FAILURE (Status))
2484 {
2485 return 0;
2486 }
2487
2488 NextSubtable:
2489 /* Point to next subtable */
2490
2491 Offset += Subtable->Length;
2492 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length);
2493 }
2494
2495 return (S3ptTable->Length);
2496 }
2497
2498
2499 /*******************************************************************************
2500 *
2501 * FUNCTION: AcpiDmDumpSdev
2502 *
2503 * PARAMETERS: Table - A SDEV table
2504 *
2505 * RETURN: None
2506 *
2507 * DESCRIPTION: Format the contents of a SDEV. This is a variable-length
2508 * table that contains variable strings and vendor data.
2509 *
2510 ******************************************************************************/
2511
2512 void
2513 AcpiDmDumpSdev (
2514 ACPI_TABLE_HEADER *Table)
2515 {
2516 ACPI_STATUS Status;
2517 ACPI_SDEV_HEADER *Subtable;
2518 ACPI_SDEV_PCIE *Pcie;
2519 ACPI_SDEV_NAMESPACE *Namesp;
2520 ACPI_DMTABLE_INFO *InfoTable;
2521 ACPI_DMTABLE_INFO *SecureComponentInfoTable;
2522 UINT32 Length = Table->Length;
2523 UINT32 Offset = sizeof (ACPI_TABLE_SDEV);
2524 UINT16 PathOffset;
2525 UINT16 PathLength;
2526 UINT16 VendorDataOffset;
2527 UINT16 VendorDataLength;
2528 ACPI_SDEV_SECURE_COMPONENT *SecureComponent = NULL;
2529 UINT32 CurrentOffset = 0;
2530
2531
2532 /* Main table */
2533
2534 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev);
2535 if (ACPI_FAILURE (Status))
2536 {
2537 return;
2538 }
2539
2540 /* Subtables */
2541
2542 Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset);
2543 while (Offset < Table->Length)
2544 {
2545 /* Common subtable header */
2546
2547 AcpiOsPrintf ("\n");
2548 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
2549 Subtable->Length, AcpiDmTableInfoSdevHdr);
2550 if (ACPI_FAILURE (Status))
2551 {
2552 return;
2553 }
2554
2555 switch (Subtable->Type)
2556 {
2557 case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
2558
2559 InfoTable = AcpiDmTableInfoSdev0;
2560 break;
2561
2562 case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
2563
2564 InfoTable = AcpiDmTableInfoSdev1;
2565 break;
2566
2567 default:
2568 goto NextSubtable;
2569 }
2570
2571 AcpiOsPrintf ("\n");
2572 Status = AcpiDmDumpTable (Table->Length, 0, Subtable,
2573 Subtable->Length, InfoTable);
2574 if (ACPI_FAILURE (Status))
2575 {
2576 return;
2577 }
2578
2579 switch (Subtable->Type)
2580 {
2581 case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
2582
2583 CurrentOffset = sizeof (ACPI_SDEV_NAMESPACE);
2584 if (Subtable->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
2585 {
2586 SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
2587 ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)));
2588
2589 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
2590 ACPI_ADD_PTR(UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)),
2591 sizeof (ACPI_SDEV_SECURE_COMPONENT), AcpiDmTableInfoSdev0b);
2592 if (ACPI_FAILURE (Status))
2593 {
2594 return;
2595 }
2596 CurrentOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
2597
2598 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
2599 ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
2600 sizeof (ACPI_SDEV_HEADER), AcpiDmTableInfoSdevSecCompHdr);
2601 if (ACPI_FAILURE (Status))
2602 {
2603 return;
2604 }
2605 CurrentOffset += sizeof (ACPI_SDEV_HEADER);
2606
2607 switch (Subtable->Type)
2608 {
2609 case ACPI_SDEV_TYPE_ID_COMPONENT:
2610
2611 SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
2612 break;
2613
2614 case ACPI_SDEV_TYPE_MEM_COMPONENT:
2615
2616 SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
2617 break;
2618
2619 default:
2620 goto NextSubtable;
2621 }
2622
2623 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
2624 ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
2625 SecureComponent->SecureComponentLength, SecureComponentInfoTable);
2626 CurrentOffset += SecureComponent->SecureComponentLength;
2627 }
2628
2629 /* Dump the PCIe device ID(s) */
2630
2631 Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);
2632 PathOffset = Namesp->DeviceIdOffset;
2633 PathLength = Namesp->DeviceIdLength;
2634
2635 if (PathLength)
2636 {
2637 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
2638 ACPI_ADD_PTR (UINT8, Namesp, PathOffset),
2639 PathLength, AcpiDmTableInfoSdev0a);
2640 if (ACPI_FAILURE (Status))
2641 {
2642 return;
2643 }
2644 CurrentOffset += PathLength;
2645 }
2646
2647 /* Dump the vendor-specific data */
2648
2649 VendorDataLength =
2650 Namesp->VendorDataLength;
2651 VendorDataOffset =
2652 Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
2653
2654 if (VendorDataLength)
2655 {
2656 Status = AcpiDmDumpTable (Table->Length, 0,
2657 ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset),
2658 VendorDataLength, AcpiDmTableInfoSdev1b);
2659 if (ACPI_FAILURE (Status))
2660 {
2661 return;
2662 }
2663 }
2664 break;
2665
2666 case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
2667
2668 /* PCI path substructures */
2669
2670 Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable);
2671 PathOffset = Pcie->PathOffset;
2672 PathLength = Pcie->PathLength;
2673
2674 while (PathLength)
2675 {
2676 Status = AcpiDmDumpTable (Table->Length,
2677 PathOffset + Offset,
2678 ACPI_ADD_PTR (UINT8, Pcie, PathOffset),
2679 sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a);
2680 if (ACPI_FAILURE (Status))
2681 {
2682 return;
2683 }
2684
2685 PathOffset += sizeof (ACPI_SDEV_PCIE_PATH);
2686 PathLength -= sizeof (ACPI_SDEV_PCIE_PATH);
2687 }
2688
2689 /* VendorData */
2690
2691 VendorDataLength = Pcie->VendorDataLength;
2692 VendorDataOffset = Pcie->PathOffset + Pcie->PathLength;
2693
2694 if (VendorDataLength)
2695 {
2696 Status = AcpiDmDumpTable (Table->Length, 0,
2697 ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset),
2698 VendorDataLength, AcpiDmTableInfoSdev1b);
2699 if (ACPI_FAILURE (Status))
2700 {
2701 return;
2702 }
2703 }
2704 break;
2705
2706 default:
2707 goto NextSubtable;
2708 }
2709
2710 NextSubtable:
2711 /* Point to next subtable */
2712
2713 Offset += Subtable->Length;
2714 Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable,
2715 Subtable->Length);
2716 }
2717 }
2718