xref: /netbsd-src/sys/external/bsd/acpica/dist/common/dmtbdump1.c (revision c7960b37466ae0fd417c32e6acbb4b956ac7a121)
1 /******************************************************************************
2  *
3  * Module Name: dmtbdump1 - 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 "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    ("dmtbdump1")
54 
55 
56 /*******************************************************************************
57  *
58  * FUNCTION:    AcpiDmDumpAest
59  *
60  * PARAMETERS:  Table               - A AEST table
61  *
62  * RETURN:      None
63  *
64  * DESCRIPTION: Format the contents of a AEST table
65  *
66  * NOTE: Assumes the following table structure:
67  *      For all AEST Error Nodes:
68  *          1) An AEST Error Node, followed immediately by:
69  *          2) Any node-specific data
70  *          3) An Interface Structure (one)
71  *          4) A list (array) of Interrupt Structures
72  *
73  * AEST - ARM Error Source table. Conforms to:
74  * ACPI for the Armv8 RAS Extensions 1.1 Platform Design Document Sep 2020
75  *
76  ******************************************************************************/
77 
78 void
79 AcpiDmDumpAest (
80     ACPI_TABLE_HEADER       *Table)
81 {
82     ACPI_STATUS             Status;
83     UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
84     ACPI_AEST_HEADER        *Subtable;
85     ACPI_AEST_HEADER        *NodeHeader;
86     ACPI_AEST_PROCESSOR     *ProcessorSubtable;
87     ACPI_DMTABLE_INFO       *InfoTable;
88     ACPI_SIZE               Length;
89     UINT8                   Type;
90     UINT8                   Revision = Table->Revision;
91     UINT32                  Count;
92     ACPI_AEST_NODE_INTERFACE_HEADER *InterfaceHeader;
93 
94 
95     /* Very small, generic main table. AEST consists of mostly subtables */
96 
97     while (Offset < Table->Length)
98     {
99         NodeHeader = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
100 
101         /* Dump the common error node (subtable) header */
102 
103         Status = AcpiDmDumpTable (Table->Length, Offset, NodeHeader,
104             NodeHeader->Length, AcpiDmTableInfoAestHdr);
105         if (ACPI_FAILURE (Status))
106         {
107             return;
108         }
109 
110         Type = NodeHeader->Type;
111 
112         /* Setup the node-specific subtable based on the header Type field */
113 
114         switch (Type)
115         {
116         case ACPI_AEST_PROCESSOR_ERROR_NODE:
117             InfoTable = AcpiDmTableInfoAestProcError;
118             Length = sizeof (ACPI_AEST_PROCESSOR);
119             break;
120 
121         case ACPI_AEST_MEMORY_ERROR_NODE:
122             InfoTable = AcpiDmTableInfoAestMemError;
123             Length = sizeof (ACPI_AEST_MEMORY);
124             break;
125 
126         case ACPI_AEST_SMMU_ERROR_NODE:
127             InfoTable = AcpiDmTableInfoAestSmmuError;
128             Length = sizeof (ACPI_AEST_SMMU);
129             break;
130 
131         case ACPI_AEST_VENDOR_ERROR_NODE:
132             switch (Revision)
133             {
134             case 1:
135                 InfoTable = AcpiDmTableInfoAestVendorError;
136                 Length = sizeof (ACPI_AEST_VENDOR);
137                 break;
138 
139             case 2:
140                 InfoTable = AcpiDmTableInfoAestVendorV2Error;
141                 Length = sizeof (ACPI_AEST_VENDOR_V2);
142                 break;
143 
144             default:
145                 AcpiOsPrintf ("\n**** Unknown AEST revision 0x%X\n", Revision);
146                 return;
147             }
148             break;
149 
150         case ACPI_AEST_GIC_ERROR_NODE:
151             InfoTable = AcpiDmTableInfoAestGicError;
152             Length = sizeof (ACPI_AEST_GIC);
153             break;
154 
155         case ACPI_AEST_PCIE_ERROR_NODE:
156             InfoTable = AcpiDmTableInfoAestPCIeError;
157             Length = sizeof (ACPI_AEST_PCIE);
158             break;
159 
160         case ACPI_AEST_PROXY_ERROR_NODE:
161             InfoTable = AcpiDmTableInfoAestProxyError;
162             Length = sizeof (ACPI_AEST_PROXY);
163             break;
164 
165         /* Error case below */
166         default:
167 
168             AcpiOsPrintf ("\n**** Unknown AEST Error Subtable type 0x%X\n",
169                 Type);
170             return;
171         }
172 
173         /* Point past the common header (to the node-specific data) */
174 
175         Offset += sizeof (ACPI_AEST_HEADER);
176         Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
177         AcpiOsPrintf ("\n");
178 
179         /* Dump the node-specific subtable */
180 
181         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length,
182             InfoTable);
183         if (ACPI_FAILURE (Status))
184         {
185             return;
186         }
187         AcpiOsPrintf ("\n");
188 
189         if (Type == ACPI_AEST_PROCESSOR_ERROR_NODE)
190         {
191             /*
192              * Special handling for PROCESSOR_ERROR_NODE subtables
193              * (to handle the Resource Substructure via the ResourceType
194              * field).
195              */
196 
197             /* Point past the node-specific data */
198 
199             Offset += Length;
200             ProcessorSubtable = ACPI_CAST_PTR (ACPI_AEST_PROCESSOR, Subtable);
201 
202             switch (ProcessorSubtable->ResourceType)
203             {
204             /* Setup the Resource Substructure subtable */
205 
206             case ACPI_AEST_CACHE_RESOURCE:
207                 InfoTable = AcpiDmTableInfoAestCacheRsrc;
208                 Length = sizeof (ACPI_AEST_PROCESSOR_CACHE);
209                 break;
210 
211             case ACPI_AEST_TLB_RESOURCE:
212                 InfoTable = AcpiDmTableInfoAestTlbRsrc;
213                 Length = sizeof (ACPI_AEST_PROCESSOR_TLB);
214                 break;
215 
216             case ACPI_AEST_GENERIC_RESOURCE:
217                 InfoTable = AcpiDmTableInfoAestGenRsrc;
218                 Length = sizeof (ACPI_AEST_PROCESSOR_GENERIC);
219                 break;
220 
221             /* Error case below */
222             default:
223                 AcpiOsPrintf ("\n**** Unknown AEST Processor Resource type 0x%X\n",
224                     ProcessorSubtable->ResourceType);
225                 return;
226             }
227 
228             ProcessorSubtable = ACPI_ADD_PTR (ACPI_AEST_PROCESSOR, Table,
229                 Offset);
230 
231             /* Dump the resource substructure subtable */
232 
233             Status = AcpiDmDumpTable (Table->Length, Offset, ProcessorSubtable,
234                 Length, InfoTable);
235             if (ACPI_FAILURE (Status))
236             {
237                 return;
238             }
239 
240             AcpiOsPrintf ("\n");
241         }
242 
243         /* Point past the resource substructure or the node-specific data */
244 
245         Offset += Length;
246 
247         /* Dump the interface structure, required to be present */
248 
249         Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
250         if (Subtable->Type >= ACPI_AEST_XFACE_RESERVED)
251         {
252             AcpiOsPrintf ("\n**** Unknown AEST Node Interface type 0x%X\n",
253                 Subtable->Type);
254             return;
255         }
256 
257         if (Revision == 1)
258         {
259             InfoTable = AcpiDmTableInfoAestXface;
260             Length = sizeof (ACPI_AEST_NODE_INTERFACE);
261         }
262         else if (Revision == 2)
263         {
264             InfoTable = AcpiDmTableInfoAestXfaceHeader;
265             Length = sizeof (ACPI_AEST_NODE_INTERFACE_HEADER);
266 
267             Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length, InfoTable);
268             if (ACPI_FAILURE (Status))
269             {
270                 return;
271             }
272 
273             Offset += Length;
274 
275             InterfaceHeader = ACPI_CAST_PTR (ACPI_AEST_NODE_INTERFACE_HEADER, Subtable);
276             switch (InterfaceHeader->GroupFormat)
277 	        {
278             case ACPI_AEST_NODE_GROUP_FORMAT_4K:
279                 InfoTable = AcpiDmTableInfoAestXface4k;
280                 Length = sizeof (ACPI_AEST_NODE_INTERFACE_4K);
281                 break;
282 
283             case ACPI_AEST_NODE_GROUP_FORMAT_16K:
284                 InfoTable = AcpiDmTableInfoAestXface16k;
285                 Length = sizeof (ACPI_AEST_NODE_INTERFACE_16K);
286                 break;
287 
288             case ACPI_AEST_NODE_GROUP_FORMAT_64K:
289                 InfoTable = AcpiDmTableInfoAestXface64k;
290                 Length = sizeof (ACPI_AEST_NODE_INTERFACE_64K);
291                 break;
292 
293             default:
294                 AcpiOsPrintf ("\n**** Unknown AEST Interface Group Format 0x%X\n",
295                     InterfaceHeader->GroupFormat);
296                 return;
297             }
298 
299             Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
300         }
301         else
302         {
303             AcpiOsPrintf ("\n**** Unknown AEST revision 0x%X\n", Revision);
304             return;
305         }
306 
307         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length, InfoTable);
308         if (ACPI_FAILURE (Status))
309         {
310             return;
311         }
312 
313         /* Point past the interface structure */
314 
315         AcpiOsPrintf ("\n");
316         Offset += Length;
317 
318         /* Dump the entire interrupt structure array, if present */
319 
320         if (NodeHeader->NodeInterruptOffset)
321         {
322             Count = NodeHeader->NodeInterruptCount;
323             Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
324 
325             while (Count)
326             {
327                 /* Dump the interrupt structure */
328 
329                 switch (Revision) {
330                 case 1:
331                     InfoTable = AcpiDmTableInfoAestXrupt;
332                     Length = sizeof (ACPI_AEST_NODE_INTERRUPT);
333                     break;
334 
335                 case 2:
336                     InfoTable = AcpiDmTableInfoAestXruptV2;
337                     Length = sizeof (ACPI_AEST_NODE_INTERRUPT_V2);
338                     break;
339                 default:
340                     AcpiOsPrintf ("\n**** Unknown AEST revision 0x%X\n",
341                         Revision);
342                     return;
343                 }
344                 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
345                     Length, InfoTable);
346                 if (ACPI_FAILURE (Status))
347                 {
348                     return;
349                 }
350 
351                 /* Point to the next interrupt structure */
352 
353                 Offset += Length;
354                 Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
355                 Count--;
356                 AcpiOsPrintf ("\n");
357             }
358         }
359     }
360 }
361 
362 /*******************************************************************************
363  *
364  * FUNCTION:    AcpiDmDumpApmt
365  *
366  * PARAMETERS:  Table               - A APMT table
367  *
368  * RETURN:      None
369  *
370  * DESCRIPTION: Format the contents of a APMT. This table type consists
371  *              of an open-ended number of subtables.
372  *
373  *
374  * APMT - ARM Performance Monitoring Unit table. Conforms to:
375  * ARM Performance Monitoring Unit Architecture 1.0 Platform Design Document
376  * ARM DEN0117 v1.0 November 25, 2021
377  *
378  ******************************************************************************/
379 
380 void
381 AcpiDmDumpApmt (
382     ACPI_TABLE_HEADER       *Table)
383 {
384     ACPI_STATUS              Status;
385     ACPI_APMT_NODE           *Subtable;
386     UINT32                   Length = Table->Length;
387     UINT32                   Offset = sizeof (ACPI_TABLE_APMT);
388     UINT32                   NodeNum = 0;
389 
390     /* There is no main table (other than the standard ACPI header) */
391 
392     /* Subtables */
393 
394     Subtable = ACPI_ADD_PTR (ACPI_APMT_NODE, Table, Offset);
395     while (Offset < Table->Length)
396     {
397         AcpiOsPrintf ("\n");
398 
399         if (Subtable->Type >= ACPI_APMT_NODE_TYPE_COUNT)
400         {
401             AcpiOsPrintf ("\n**** Unknown APMT subtable type 0x%X\n",
402                 Subtable->Type);
403             return;
404         }
405 
406         AcpiOsPrintf ("/* APMT Node-%u */\n", NodeNum++);
407 
408         Status = AcpiDmDumpTable (Length, Offset, Subtable,
409             Subtable->Length, AcpiDmTableInfoApmtNode);
410         if (ACPI_FAILURE (Status))
411         {
412             return;
413         }
414 
415         /* Point to next subtable */
416 
417         Offset += Subtable->Length;
418         Subtable = ACPI_ADD_PTR (ACPI_APMT_NODE, Subtable,
419             Subtable->Length);
420         AcpiOsPrintf ("\n");
421     }
422 }
423 
424 
425 /*******************************************************************************
426  *
427  * FUNCTION:    AcpiDmDumpAsf
428  *
429  * PARAMETERS:  Table               - A ASF table
430  *
431  * RETURN:      None
432  *
433  * DESCRIPTION: Format the contents of a ASF table
434  *
435  ******************************************************************************/
436 
437 void
438 AcpiDmDumpAsf (
439     ACPI_TABLE_HEADER       *Table)
440 {
441     ACPI_STATUS             Status;
442     UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
443     ACPI_ASF_INFO           *Subtable;
444     ACPI_DMTABLE_INFO       *InfoTable;
445     ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
446     UINT8                   *DataTable = NULL;
447     UINT32                  DataCount = 0;
448     UINT32                  DataLength = 0;
449     UINT32                  DataOffset = 0;
450     UINT32                  i;
451     UINT8                   Type;
452 
453 
454     /* No main table, only subtables */
455 
456     Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
457     while (Offset < Table->Length)
458     {
459         /* Common subtable header */
460 
461         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
462             Subtable->Header.Length, AcpiDmTableInfoAsfHdr);
463         if (ACPI_FAILURE (Status))
464         {
465             return;
466         }
467 
468         /* The actual type is the lower 7 bits of Type */
469 
470         Type = (UINT8) (Subtable->Header.Type & 0x7F);
471 
472         switch (Type)
473         {
474         case ACPI_ASF_TYPE_INFO:
475 
476             InfoTable = AcpiDmTableInfoAsf0;
477             break;
478 
479         case ACPI_ASF_TYPE_ALERT:
480 
481             InfoTable = AcpiDmTableInfoAsf1;
482             DataInfoTable = AcpiDmTableInfoAsf1a;
483             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ALERT));
484             DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->Alerts;
485             DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->DataLength;
486             DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
487             break;
488 
489         case ACPI_ASF_TYPE_CONTROL:
490 
491             InfoTable = AcpiDmTableInfoAsf2;
492             DataInfoTable = AcpiDmTableInfoAsf2a;
493             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_REMOTE));
494             DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->Controls;
495             DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->DataLength;
496             DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
497             break;
498 
499         case ACPI_ASF_TYPE_BOOT:
500 
501             InfoTable = AcpiDmTableInfoAsf3;
502             break;
503 
504         case ACPI_ASF_TYPE_ADDRESS:
505 
506             InfoTable = AcpiDmTableInfoAsf4;
507             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ADDRESS));
508             DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, Subtable)->Devices;
509             DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
510             break;
511 
512         default:
513 
514             AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n",
515                 Subtable->Header.Type);
516             return;
517         }
518 
519         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
520             Subtable->Header.Length, InfoTable);
521         if (ACPI_FAILURE (Status))
522         {
523             return;
524         }
525 
526         /* Dump variable-length extra data */
527 
528         switch (Type)
529         {
530         case ACPI_ASF_TYPE_ALERT:
531         case ACPI_ASF_TYPE_CONTROL:
532 
533             for (i = 0; i < DataCount; i++)
534             {
535                 AcpiOsPrintf ("\n");
536                 Status = AcpiDmDumpTable (Table->Length, DataOffset,
537                     DataTable, DataLength, DataInfoTable);
538                 if (ACPI_FAILURE (Status))
539                 {
540                     return;
541                 }
542 
543                 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
544                 DataOffset += DataLength;
545             }
546             break;
547 
548         case ACPI_ASF_TYPE_ADDRESS:
549 
550             for (i = 0; i < DataLength; i++)
551             {
552                 if (!(i % 16))
553                 {
554                     AcpiDmLineHeader (DataOffset, 1, "Addresses");
555                 }
556 
557                 AcpiOsPrintf ("%2.2X ", *DataTable);
558                 DataTable++;
559                 DataOffset++;
560 
561                 if (DataOffset > Table->Length)
562                 {
563                     AcpiOsPrintf (
564                         "**** ACPI table terminates in the middle of a "
565                         "data structure! (ASF! table)\n");
566                     return;
567                 }
568             }
569 
570             AcpiOsPrintf ("\n");
571             break;
572 
573         default:
574 
575             break;
576         }
577 
578         AcpiOsPrintf ("\n");
579 
580         /* Point to next subtable */
581 
582         if (!Subtable->Header.Length)
583         {
584             AcpiOsPrintf ("Invalid zero subtable header length\n");
585             return;
586         }
587 
588         Offset += Subtable->Header.Length;
589         Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Subtable,
590             Subtable->Header.Length);
591     }
592 }
593 
594 /*******************************************************************************
595  *
596  * FUNCTION:    AcpiDmDumpAspt
597  *
598  * PARAMETERS:  Table               - A ASPT table
599  *
600  * RETURN:      None
601  *
602  * DESCRIPTION: Format the contents of a ASPT table
603  *
604  ******************************************************************************/
605 
606 void
607 AcpiDmDumpAspt (
608     ACPI_TABLE_HEADER       *Table)
609 {
610     ACPI_STATUS             Status;
611     UINT32                  Offset = sizeof (ACPI_TABLE_ASPT);
612     UINT32                  Length = Table->Length;
613     ACPI_ASPT_HEADER        *Subtable;
614     ACPI_DMTABLE_INFO       *InfoTable;
615     UINT16                   Type;
616 
617     /* Main table */
618     Status = AcpiDmDumpTable(Length, 0, Table, 0, AcpiDmTableInfoAspt);
619 
620     /* Subtables */
621 
622     Subtable = ACPI_ADD_PTR (ACPI_ASPT_HEADER, Table, Offset);
623     while (Offset < Table->Length)
624     {
625         AcpiOsPrintf ("\n");
626 
627         /* Common subtable header */
628         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
629             Subtable->Length, AcpiDmTableInfoAsptHdr);
630         if (ACPI_FAILURE (Status))
631         {
632             return;
633         }
634 
635         Type = Subtable->Type;
636 
637         switch (Type)
638         {
639         case ACPI_ASPT_TYPE_GLOBAL_REGS:
640 
641             InfoTable = AcpiDmTableInfoAspt0;
642             break;
643 
644         case ACPI_ASPT_TYPE_SEV_MBOX_REGS:
645 
646             InfoTable = AcpiDmTableInfoAspt1;
647             break;
648 
649         case ACPI_ASPT_TYPE_ACPI_MBOX_REGS:
650 
651             InfoTable = AcpiDmTableInfoAspt2;
652             break;
653 
654         default:
655 
656             AcpiOsPrintf ("\n**** Unknown ASPT subtable type 0x%X\n",
657                 Subtable->Type);
658             return;
659         }
660 
661         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
662             Subtable->Length, InfoTable);
663         if (ACPI_FAILURE (Status))
664         {
665             return;
666         }
667 
668         AcpiOsPrintf ("\n");
669 
670         /* Point to next subtable */
671         if (!Subtable->Length)
672         {
673             AcpiOsPrintf ("Invalid zero subtable header length\n");
674             return;
675         }
676 
677         Offset += Subtable->Length;
678         Subtable = ACPI_ADD_PTR (ACPI_ASPT_HEADER, Subtable,
679             Subtable->Length);
680     }
681 }
682 
683 
684 /*******************************************************************************
685  *
686  * FUNCTION:    AcpiDmDumpCdat
687  *
688  * PARAMETERS:  InTable             - A CDAT table
689  *
690  * RETURN:      None
691  *
692  * DESCRIPTION: Format the contents of a CDAT. This table type consists
693  *              of an open-ended number of subtables.
694  *
695  ******************************************************************************/
696 
697 void
698 AcpiDmDumpCdat (
699     ACPI_TABLE_HEADER       *InTable)
700 {
701     ACPI_TABLE_CDAT         *Table = ACPI_CAST_PTR (ACPI_TABLE_CDAT, InTable);
702     ACPI_STATUS             Status;
703     ACPI_CDAT_HEADER        *Subtable;
704     ACPI_TABLE_CDAT         *CdatTable = ACPI_CAST_PTR (ACPI_TABLE_CDAT, Table);
705     ACPI_DMTABLE_INFO       *InfoTable;
706     UINT32                  Length = CdatTable->Length;
707     UINT32                  Offset = sizeof (ACPI_TABLE_CDAT);
708     UINT32                  SubtableLength;
709     UINT32                  SubtableType;
710     INT32                   EntriesLength;
711 
712 
713     /* Main table */
714 
715     Status = AcpiDmDumpTable (Offset, 0, CdatTable, 0,
716         AcpiDmTableInfoCdatTableHdr);
717     if (ACPI_FAILURE (Status))
718     {
719         return;
720     }
721 
722     Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, sizeof (ACPI_TABLE_CDAT));
723     while (Offset < Table->Length)
724     {
725         /* Dump the common subtable header */
726 
727         DbgPrint (ASL_DEBUG_OUTPUT, "0) HeaderOffset: %X\n", Offset);
728         AcpiOsPrintf ("\n");
729         Status = AcpiDmDumpTable (Length, Offset, Subtable,
730             sizeof (ACPI_CDAT_HEADER), AcpiDmTableInfoCdatHeader);
731         if (ACPI_FAILURE (Status))
732         {
733             return;
734         }
735 
736         /* Point past the common subtable header, decode the subtable type */
737 
738         Offset += sizeof (ACPI_CDAT_HEADER);
739         SubtableType = Subtable->Type;
740 
741         switch (Subtable->Type)
742         {
743         case ACPI_CDAT_TYPE_DSMAS:
744             Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
745             SubtableLength = sizeof (ACPI_CDAT_DSMAS);
746 
747             InfoTable = AcpiDmTableInfoCdat0;
748             break;
749 
750         case ACPI_CDAT_TYPE_DSLBIS:
751             Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
752             SubtableLength = sizeof (ACPI_CDAT_DSLBIS);
753             DbgPrint (ASL_DEBUG_OUTPUT, "1) Offset: %X\n", Offset);
754 
755             InfoTable = AcpiDmTableInfoCdat1;
756             break;
757 
758         case ACPI_CDAT_TYPE_DSMSCIS:
759             Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
760             SubtableLength = sizeof (ACPI_CDAT_DSMSCIS);
761 
762             InfoTable = AcpiDmTableInfoCdat2;
763             break;
764 
765         case ACPI_CDAT_TYPE_DSIS:
766             DbgPrint (ASL_DEBUG_OUTPUT, "2) Offset: %X ", Offset);
767             SubtableLength = sizeof (ACPI_CDAT_DSIS);
768             DbgPrint (ASL_DEBUG_OUTPUT, "1) input pointer: %p\n", Table);
769             Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
770             DbgPrint (ASL_DEBUG_OUTPUT, "1) output pointers: %p, %p, Offset: %X\n",
771                 Table, Subtable, Offset);
772             DbgPrint (ASL_DEBUG_OUTPUT, "3) Offset: %X\n", Offset);
773 
774             InfoTable = AcpiDmTableInfoCdat3;
775             break;
776 
777         case ACPI_CDAT_TYPE_DSEMTS:
778             Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
779             SubtableLength = sizeof (ACPI_CDAT_DSEMTS);
780 
781             InfoTable = AcpiDmTableInfoCdat4;
782             break;
783 
784         case ACPI_CDAT_TYPE_SSLBIS:
785             SubtableLength = Subtable->Length;
786 
787             InfoTable = AcpiDmTableInfoCdat5;
788             Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
789             break;
790 
791         default:
792             fprintf (stderr, "ERROR: Unknown SubtableType: %X\n", Subtable->Type);
793             return;
794         }
795 
796         DbgPrint (ASL_DEBUG_OUTPUT, "SubtableType: %X, Length: %X Actual "
797             "Length: %X Offset: %X tableptr: %p\n", SubtableType,
798             Subtable->Length, SubtableLength, Offset, Table);
799 
800         /*
801          * Do the subtable-specific fields
802          */
803         Status = AcpiDmDumpTable (Length, Offset, Subtable, Offset, InfoTable);
804         if (ACPI_FAILURE (Status))
805         {
806             return;
807         }
808 
809         DbgPrint (ASL_DEBUG_OUTPUT, "Subtable Type: %X, Offset: %X, SubtableLength: %X\n",
810             SubtableType, Offset, SubtableLength);
811 
812         /* Additional sub-subtables, dependent on the main subtable type */
813 
814         switch (SubtableType)
815         {
816         case ACPI_CDAT_TYPE_SSLBIS:
817             Offset += sizeof (ACPI_CDAT_SSLBIS);
818             Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table,
819                 Offset);
820 
821             DbgPrint (ASL_DEBUG_OUTPUT, "Case SSLBIS, Offset: %X, SubtableLength: %X "
822                 "Subtable->Length %X\n", Offset, SubtableLength, Subtable->Length);
823 
824             /* Generate the total length of all the SSLBE entries */
825 
826             EntriesLength = SubtableLength - sizeof (ACPI_CDAT_HEADER) -
827                 sizeof (ACPI_CDAT_SSLBIS);
828             DbgPrint (ASL_DEBUG_OUTPUT, "EntriesLength: %X, Offset: %X, Table->Length: %X\n",
829                 EntriesLength, Offset, Table->Length);
830 
831             /* Do each of the SSLBE Entries */
832 
833             while ((EntriesLength > 0) && (Offset < Table->Length))
834             {
835                 AcpiOsPrintf ("\n");
836 
837                 Status = AcpiDmDumpTable (Length, Offset, Subtable, Offset,
838                     AcpiDmTableInfoCdatEntries);
839                 if (ACPI_FAILURE (Status))
840                 {
841                     return;
842                 }
843 
844                 EntriesLength -= sizeof (ACPI_CDAT_SSLBE);
845                 Offset += sizeof (ACPI_CDAT_SSLBE);
846                 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
847             }
848 
849             SubtableLength = 0;
850             break;
851 
852         default:
853             break;
854         }
855 
856         DbgPrint (ASL_DEBUG_OUTPUT, "Offset: %X, Subtable Length: %X\n",
857             Offset, SubtableLength);
858 
859         /* Point to next subtable */
860 
861         Offset += SubtableLength;
862         Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
863     }
864 
865     return;
866 }
867 
868 
869 /*******************************************************************************
870  *
871  * FUNCTION:    AcpiDmDumpCedt
872  *
873  * PARAMETERS:  Table               - A CEDT table
874  *
875  * RETURN:      None
876  *
877  * DESCRIPTION: Format the contents of a CEDT. This table type consists
878  *              of an open-ended number of subtables.
879  *
880  ******************************************************************************/
881 
882 void
883 AcpiDmDumpCedt (
884     ACPI_TABLE_HEADER       *Table)
885 {
886     ACPI_STATUS             Status;
887     ACPI_CEDT_HEADER        *Subtable;
888     UINT32                  Length = Table->Length;
889     UINT32                  Offset = sizeof (ACPI_TABLE_CEDT);
890 
891 
892     /* There is no main table (other than the standard ACPI header) */
893 
894     Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Table, Offset);
895     while (Offset < Table->Length)
896     {
897         /* Common subtable header */
898 
899         AcpiOsPrintf ("\n");
900         Status = AcpiDmDumpTable (Length, Offset, Subtable,
901             Subtable->Length, AcpiDmTableInfoCedtHdr);
902         if (ACPI_FAILURE (Status))
903         {
904             return;
905         }
906 
907         switch (Subtable->Type)
908         {
909         case ACPI_CEDT_TYPE_CHBS:
910             Status = AcpiDmDumpTable (Length, Offset, Subtable,
911                 Subtable->Length, AcpiDmTableInfoCedt0);
912             if (ACPI_FAILURE (Status))
913             {
914                 return;
915             }
916             break;
917 
918         case ACPI_CEDT_TYPE_CFMWS:
919         {
920             ACPI_CEDT_CFMWS *ptr = (ACPI_CEDT_CFMWS *) Subtable;
921             unsigned int i, max;
922 
923             if (ptr->InterleaveWays < 8)
924                 max = 1 << (ptr->InterleaveWays);
925             else
926                 max = 3 << (ptr->InterleaveWays - 8);
927 
928 	    /* print out table with first "Interleave target" */
929 
930             Status = AcpiDmDumpTable (Length, Offset, Subtable,
931                 Subtable->Length, AcpiDmTableInfoCedt1);
932             if (ACPI_FAILURE (Status))
933             {
934                 return;
935             }
936 
937             /* Now, print out any interleave targets beyond the first. */
938 
939             for (i = 1; i < max; i++)
940             {
941                 unsigned int loc_offset = Offset + (i * 4) + ACPI_OFFSET (ACPI_CEDT_CFMWS, InterleaveTargets);
942                 unsigned int *trg = &(ptr->InterleaveTargets[i]);
943 
944                 Status = AcpiDmDumpTable (Length, loc_offset, trg,
945                         Subtable->Length, AcpiDmTableInfoCedt1_te);
946                 if (ACPI_FAILURE (Status))
947                 {
948                     return;
949                 }
950             }
951             break;
952         }
953 
954         case ACPI_CEDT_TYPE_CXIMS:
955         {
956             ACPI_CEDT_CXIMS *ptr = (ACPI_CEDT_CXIMS *) Subtable;
957             unsigned int i, max = ptr->NrXormaps;
958 
959             /* print out table with first "XOR Map" */
960 
961             Status = AcpiDmDumpTable (Length, Offset, Subtable,
962                 Subtable->Length, AcpiDmTableInfoCedt2);
963             if (ACPI_FAILURE (Status))
964             {
965                 return;
966             }
967 
968             /* Now, print out any XOR Map beyond the first. */
969 
970             for (i = 1; i < max; i++)
971             {
972                 unsigned int loc_offset = Offset + (i * 1) + ACPI_OFFSET (ACPI_CEDT_CXIMS, XormapList);
973                 UINT64 *trg = &(ptr->XormapList[i]);
974 
975                 Status = AcpiDmDumpTable (Length, loc_offset, trg,
976                         Subtable->Length, AcpiDmTableInfoCedt2_te);
977                 if (ACPI_FAILURE (Status))
978                 {
979                     return;
980                 }
981             }
982             break;
983         }
984 
985         default:
986             AcpiOsPrintf ("\n**** Unknown CEDT subtable type 0x%X\n\n",
987                 Subtable->Type);
988 
989             /* Attempt to continue */
990             if (!Subtable->Length)
991             {
992                 AcpiOsPrintf ("Invalid zero length subtable\n");
993                 return;
994             }
995         }
996 
997         /* Point to next subtable */
998         Offset += Subtable->Length;
999         Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Subtable,
1000             Subtable->Length);
1001     }
1002 }
1003 
1004 /*******************************************************************************
1005  *
1006  * FUNCTION:    AcpiDmDumpCpep
1007  *
1008  * PARAMETERS:  Table               - A CPEP table
1009  *
1010  * RETURN:      None
1011  *
1012  * DESCRIPTION: Format the contents of a CPEP. This table type consists
1013  *              of an open-ended number of subtables.
1014  *
1015  ******************************************************************************/
1016 
1017 void
1018 AcpiDmDumpCpep (
1019     ACPI_TABLE_HEADER       *Table)
1020 {
1021     ACPI_STATUS             Status;
1022     ACPI_CPEP_POLLING       *Subtable;
1023     UINT32                  Length = Table->Length;
1024     UINT32                  Offset = sizeof (ACPI_TABLE_CPEP);
1025 
1026 
1027     /* Main table */
1028 
1029     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
1030     if (ACPI_FAILURE (Status))
1031     {
1032         return;
1033     }
1034 
1035     /* Subtables */
1036 
1037     Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
1038     while (Offset < Table->Length)
1039     {
1040         AcpiOsPrintf ("\n");
1041         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1042             Subtable->Header.Length, AcpiDmTableInfoCpep0);
1043         if (ACPI_FAILURE (Status))
1044         {
1045             return;
1046         }
1047 
1048         /* Point to next subtable */
1049 
1050         Offset += Subtable->Header.Length;
1051         Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Subtable,
1052             Subtable->Header.Length);
1053     }
1054 }
1055 
1056 
1057 /*******************************************************************************
1058  *
1059  * FUNCTION:    AcpiDmDumpCsrt
1060  *
1061  * PARAMETERS:  Table               - A CSRT table
1062  *
1063  * RETURN:      None
1064  *
1065  * DESCRIPTION: Format the contents of a CSRT. This table type consists
1066  *              of an open-ended number of subtables.
1067  *
1068  ******************************************************************************/
1069 
1070 void
1071 AcpiDmDumpCsrt (
1072     ACPI_TABLE_HEADER       *Table)
1073 {
1074     ACPI_STATUS             Status;
1075     ACPI_CSRT_GROUP         *Subtable;
1076     ACPI_CSRT_SHARED_INFO   *SharedInfoTable;
1077     ACPI_CSRT_DESCRIPTOR    *SubSubtable;
1078     UINT32                  Length = Table->Length;
1079     UINT32                  Offset = sizeof (ACPI_TABLE_CSRT);
1080     UINT32                  SubOffset;
1081     UINT32                  SubSubOffset;
1082     UINT32                  InfoLength;
1083 
1084 
1085     /* The main table only contains the ACPI header, thus already handled */
1086 
1087     /* Subtables (Resource Groups) */
1088 
1089     Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
1090     while (Offset < Table->Length)
1091     {
1092         /* Resource group subtable */
1093 
1094         AcpiOsPrintf ("\n");
1095         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1096             Subtable->Length, AcpiDmTableInfoCsrt0);
1097         if (ACPI_FAILURE (Status))
1098         {
1099             return;
1100         }
1101 
1102         /* Shared info subtable (One per resource group) */
1103 
1104         SubOffset = sizeof (ACPI_CSRT_GROUP);
1105         SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,
1106             Offset + SubOffset);
1107 
1108         AcpiOsPrintf ("\n");
1109         Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
1110             sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
1111         if (ACPI_FAILURE (Status))
1112         {
1113             return;
1114         }
1115 
1116         SubOffset += Subtable->SharedInfoLength;
1117 
1118         /* Sub-Subtables (Resource Descriptors) */
1119 
1120         SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
1121             Offset + SubOffset);
1122 
1123         while ((SubOffset < Subtable->Length) &&
1124               ((Offset + SubOffset) < Table->Length))
1125         {
1126             AcpiOsPrintf ("\n");
1127             Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable,
1128                 SubSubtable->Length, AcpiDmTableInfoCsrt2);
1129             if (ACPI_FAILURE (Status))
1130             {
1131                 return;
1132             }
1133 
1134             SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
1135 
1136             /* Resource-specific info buffer */
1137 
1138             InfoLength = SubSubtable->Length - SubSubOffset;
1139             if (InfoLength)
1140             {
1141                 Status = AcpiDmDumpTable (Length,
1142                     Offset + SubOffset + SubSubOffset, Table,
1143                     InfoLength, AcpiDmTableInfoCsrt2a);
1144                 if (ACPI_FAILURE (Status))
1145                 {
1146                     return;
1147                 }
1148             }
1149 
1150             /* Point to next sub-subtable */
1151 
1152             SubOffset += SubSubtable->Length;
1153             SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable,
1154                 SubSubtable->Length);
1155         }
1156 
1157         /* Point to next subtable */
1158 
1159         Offset += Subtable->Length;
1160         Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable,
1161             Subtable->Length);
1162     }
1163 }
1164 
1165 
1166 /*******************************************************************************
1167  *
1168  * FUNCTION:    AcpiDmDumpDbg2
1169  *
1170  * PARAMETERS:  Table               - A DBG2 table
1171  *
1172  * RETURN:      None
1173  *
1174  * DESCRIPTION: Format the contents of a DBG2. This table type consists
1175  *              of an open-ended number of subtables.
1176  *
1177  ******************************************************************************/
1178 
1179 void
1180 AcpiDmDumpDbg2 (
1181     ACPI_TABLE_HEADER       *Table)
1182 {
1183     ACPI_STATUS             Status;
1184     ACPI_DBG2_DEVICE        *Subtable;
1185     UINT32                  Length = Table->Length;
1186     UINT32                  Offset = sizeof (ACPI_TABLE_DBG2);
1187     UINT32                  i;
1188     UINT32                  ArrayOffset;
1189     UINT32                  AbsoluteOffset;
1190     UINT8                   *Array;
1191 
1192 
1193     /* Main table */
1194 
1195     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
1196     if (ACPI_FAILURE (Status))
1197     {
1198         return;
1199     }
1200 
1201     /* Subtables */
1202 
1203     Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
1204     while (Offset < Table->Length)
1205     {
1206         AcpiOsPrintf ("\n");
1207         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1208             Subtable->Length, AcpiDmTableInfoDbg2Device);
1209         if (ACPI_FAILURE (Status))
1210         {
1211             return;
1212         }
1213 
1214         /* Dump the BaseAddress array */
1215 
1216         for (i = 0; i < Subtable->RegisterCount; i++)
1217         {
1218             ArrayOffset = Subtable->BaseAddressOffset +
1219                 (sizeof (ACPI_GENERIC_ADDRESS) * i);
1220             AbsoluteOffset = Offset + ArrayOffset;
1221             Array = (UINT8 *) Subtable + ArrayOffset;
1222 
1223             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
1224                 Subtable->Length, AcpiDmTableInfoDbg2Addr);
1225             if (ACPI_FAILURE (Status))
1226             {
1227                 return;
1228             }
1229         }
1230 
1231         /* Dump the AddressSize array */
1232 
1233         for (i = 0; i < Subtable->RegisterCount; i++)
1234         {
1235             ArrayOffset = Subtable->AddressSizeOffset +
1236                 (sizeof (UINT32) * i);
1237             AbsoluteOffset = Offset + ArrayOffset;
1238             Array = (UINT8 *) Subtable + ArrayOffset;
1239 
1240             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
1241                 Subtable->Length, AcpiDmTableInfoDbg2Size);
1242             if (ACPI_FAILURE (Status))
1243             {
1244                 return;
1245             }
1246         }
1247 
1248         /* Dump the Namestring (required) */
1249 
1250         AcpiOsPrintf ("\n");
1251         ArrayOffset = Subtable->NamepathOffset;
1252         AbsoluteOffset = Offset + ArrayOffset;
1253         Array = (UINT8 *) Subtable + ArrayOffset;
1254 
1255         Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
1256             Subtable->Length, AcpiDmTableInfoDbg2Name);
1257         if (ACPI_FAILURE (Status))
1258         {
1259             return;
1260         }
1261 
1262         /* Dump the OemData (optional) */
1263 
1264         if (Subtable->OemDataOffset)
1265         {
1266             Status = AcpiDmDumpTable (Length, Subtable->OemDataOffset,
1267                 Subtable, Subtable->OemDataLength,
1268                 AcpiDmTableInfoDbg2OemData);
1269             if (ACPI_FAILURE (Status))
1270             {
1271                 return;
1272             }
1273         }
1274 
1275         /* Point to next subtable */
1276 
1277         Offset += Subtable->Length;
1278         Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable,
1279             Subtable->Length);
1280     }
1281 }
1282 
1283 
1284 /*******************************************************************************
1285  *
1286  * FUNCTION:    AcpiDmDumpDmar
1287  *
1288  * PARAMETERS:  Table               - A DMAR table
1289  *
1290  * RETURN:      None
1291  *
1292  * DESCRIPTION: Format the contents of a DMAR. This table type consists
1293  *              of an open-ended number of subtables.
1294  *
1295  ******************************************************************************/
1296 
1297 void
1298 AcpiDmDumpDmar (
1299     ACPI_TABLE_HEADER       *Table)
1300 {
1301     ACPI_STATUS             Status;
1302     ACPI_DMAR_HEADER        *Subtable;
1303     UINT32                  Length = Table->Length;
1304     UINT32                  Offset = sizeof (ACPI_TABLE_DMAR);
1305     ACPI_DMTABLE_INFO       *InfoTable;
1306     ACPI_DMAR_DEVICE_SCOPE  *ScopeTable;
1307     UINT32                  ScopeOffset;
1308     UINT8                   *PciPath;
1309     UINT32                  PathOffset;
1310 
1311 
1312     /* Main table */
1313 
1314     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
1315     if (ACPI_FAILURE (Status))
1316     {
1317         return;
1318     }
1319 
1320     /* Subtables */
1321 
1322     Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
1323     while (Offset < Table->Length)
1324     {
1325         /* Common subtable header */
1326 
1327         AcpiOsPrintf ("\n");
1328         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1329             Subtable->Length, AcpiDmTableInfoDmarHdr);
1330         if (ACPI_FAILURE (Status))
1331         {
1332             return;
1333         }
1334 
1335         AcpiOsPrintf ("\n");
1336 
1337         switch (Subtable->Type)
1338         {
1339         case ACPI_DMAR_TYPE_HARDWARE_UNIT:
1340 
1341             InfoTable = AcpiDmTableInfoDmar0;
1342             ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
1343             break;
1344 
1345         case ACPI_DMAR_TYPE_RESERVED_MEMORY:
1346 
1347             InfoTable = AcpiDmTableInfoDmar1;
1348             ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
1349             break;
1350 
1351         case ACPI_DMAR_TYPE_ROOT_ATS:
1352 
1353             InfoTable = AcpiDmTableInfoDmar2;
1354             ScopeOffset = sizeof (ACPI_DMAR_ATSR);
1355             break;
1356 
1357         case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
1358 
1359             InfoTable = AcpiDmTableInfoDmar3;
1360             ScopeOffset = sizeof (ACPI_DMAR_RHSA);
1361             break;
1362 
1363         case ACPI_DMAR_TYPE_NAMESPACE:
1364 
1365             InfoTable = AcpiDmTableInfoDmar4;
1366             ScopeOffset = sizeof (ACPI_DMAR_ANDD);
1367             break;
1368 
1369         case ACPI_DMAR_TYPE_SATC:
1370 
1371             InfoTable = AcpiDmTableInfoDmar5;
1372             ScopeOffset = sizeof (ACPI_DMAR_SATC);
1373             break;
1374 
1375         default:
1376 
1377             AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",
1378                 Subtable->Type);
1379             return;
1380         }
1381 
1382         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1383             Subtable->Length, InfoTable);
1384         if (ACPI_FAILURE (Status))
1385         {
1386             return;
1387         }
1388 
1389         /*
1390          * Dump the optional device scope entries
1391          */
1392         if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
1393             (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE))
1394         {
1395             /* These types do not support device scopes */
1396 
1397             goto NextSubtable;
1398         }
1399 
1400         ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset);
1401         while (ScopeOffset < Subtable->Length)
1402         {
1403             AcpiOsPrintf ("\n");
1404             Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
1405                 ScopeTable->Length, AcpiDmTableInfoDmarScope);
1406             if (ACPI_FAILURE (Status))
1407             {
1408                 return;
1409             }
1410             AcpiOsPrintf ("\n");
1411 
1412             /* Dump the PCI Path entries for this device scope */
1413 
1414             PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
1415 
1416             PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
1417                 sizeof (ACPI_DMAR_DEVICE_SCOPE));
1418 
1419             while (PathOffset < ScopeTable->Length)
1420             {
1421                 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2,
1422                     "PCI Path");
1423                 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
1424 
1425                 /* Point to next PCI Path entry */
1426 
1427                 PathOffset += 2;
1428                 PciPath += 2;
1429                 AcpiOsPrintf ("\n");
1430             }
1431 
1432             /* Point to next device scope entry */
1433 
1434             ScopeOffset += ScopeTable->Length;
1435             ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
1436                 ScopeTable, ScopeTable->Length);
1437         }
1438 
1439 NextSubtable:
1440         /* Point to next subtable */
1441 
1442         Offset += Subtable->Length;
1443         Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable,
1444             Subtable->Length);
1445     }
1446 }
1447 
1448 
1449 /*******************************************************************************
1450  *
1451  * FUNCTION:    AcpiDmDumpDrtm
1452  *
1453  * PARAMETERS:  Table               - A DRTM table
1454  *
1455  * RETURN:      None
1456  *
1457  * DESCRIPTION: Format the contents of a DRTM.
1458  *
1459  ******************************************************************************/
1460 
1461 void
1462 AcpiDmDumpDrtm (
1463     ACPI_TABLE_HEADER       *Table)
1464 {
1465     ACPI_STATUS             Status;
1466     UINT32                  Offset;
1467     ACPI_DRTM_VTABLE_LIST   *DrtmVtl;
1468     ACPI_DRTM_RESOURCE_LIST *DrtmRl;
1469     ACPI_DRTM_DPS_ID        *DrtmDps;
1470     UINT32                  Count;
1471 
1472 
1473     /* Main table */
1474 
1475     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
1476         AcpiDmTableInfoDrtm);
1477     if (ACPI_FAILURE (Status))
1478     {
1479         return;
1480     }
1481 
1482     Offset = sizeof (ACPI_TABLE_DRTM);
1483 
1484     /* Sub-tables */
1485 
1486     /* Dump ValidatedTable length */
1487 
1488     DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
1489     AcpiOsPrintf ("\n");
1490     Status = AcpiDmDumpTable (Table->Length, Offset,
1491         DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
1492         AcpiDmTableInfoDrtm0);
1493     if (ACPI_FAILURE (Status))
1494     {
1495             return;
1496     }
1497 
1498     Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);
1499 
1500     /* Dump Validated table addresses */
1501 
1502     Count = 0;
1503     while ((Offset < Table->Length) &&
1504             (DrtmVtl->ValidatedTableCount > Count))
1505     {
1506         Status = AcpiDmDumpTable (Table->Length, Offset,
1507             ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
1508             AcpiDmTableInfoDrtm0a);
1509         if (ACPI_FAILURE (Status))
1510         {
1511             return;
1512         }
1513 
1514         Offset += sizeof (UINT64);
1515         Count++;
1516     }
1517 
1518     /* Dump ResourceList length */
1519 
1520     DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
1521     AcpiOsPrintf ("\n");
1522     Status = AcpiDmDumpTable (Table->Length, Offset,
1523         DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
1524         AcpiDmTableInfoDrtm1);
1525     if (ACPI_FAILURE (Status))
1526     {
1527         return;
1528     }
1529 
1530     Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);
1531 
1532     /* Dump the Resource List */
1533 
1534     Count = 0;
1535     while ((Offset < Table->Length) &&
1536            (DrtmRl->ResourceCount > Count))
1537     {
1538         Status = AcpiDmDumpTable (Table->Length, Offset,
1539             ACPI_ADD_PTR (void, Table, Offset),
1540             sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a);
1541         if (ACPI_FAILURE (Status))
1542         {
1543             return;
1544         }
1545 
1546         Offset += sizeof (ACPI_DRTM_RESOURCE);
1547         Count++;
1548     }
1549 
1550     /* Dump DPS */
1551 
1552     DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
1553     AcpiOsPrintf ("\n");
1554     (void) AcpiDmDumpTable (Table->Length, Offset,
1555         DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2);
1556 }
1557 
1558 
1559 /*******************************************************************************
1560  *
1561  * FUNCTION:    AcpiDmDumpEinj
1562  *
1563  * PARAMETERS:  Table               - A EINJ table
1564  *
1565  * RETURN:      None
1566  *
1567  * DESCRIPTION: Format the contents of a EINJ. This table type consists
1568  *              of an open-ended number of subtables.
1569  *
1570  ******************************************************************************/
1571 
1572 void
1573 AcpiDmDumpEinj (
1574     ACPI_TABLE_HEADER       *Table)
1575 {
1576     ACPI_STATUS             Status;
1577     ACPI_WHEA_HEADER        *Subtable;
1578     UINT32                  Length = Table->Length;
1579     UINT32                  Offset = sizeof (ACPI_TABLE_EINJ);
1580 
1581 
1582     /* Main table */
1583 
1584     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
1585     if (ACPI_FAILURE (Status))
1586     {
1587         return;
1588     }
1589 
1590     /* Subtables */
1591 
1592     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1593     while (Offset < Table->Length)
1594     {
1595         AcpiOsPrintf ("\n");
1596         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1597             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
1598         if (ACPI_FAILURE (Status))
1599         {
1600             return;
1601         }
1602 
1603         /* Point to next subtable (each subtable is of fixed length) */
1604 
1605         Offset += sizeof (ACPI_WHEA_HEADER);
1606         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
1607             sizeof (ACPI_WHEA_HEADER));
1608     }
1609 }
1610 
1611 
1612 /*******************************************************************************
1613  *
1614  * FUNCTION:    AcpiDmDumpErst
1615  *
1616  * PARAMETERS:  Table               - A ERST table
1617  *
1618  * RETURN:      None
1619  *
1620  * DESCRIPTION: Format the contents of a ERST. This table type consists
1621  *              of an open-ended number of subtables.
1622  *
1623  ******************************************************************************/
1624 
1625 void
1626 AcpiDmDumpErst (
1627     ACPI_TABLE_HEADER       *Table)
1628 {
1629     ACPI_STATUS             Status;
1630     ACPI_WHEA_HEADER        *Subtable;
1631     UINT32                  Length = Table->Length;
1632     UINT32                  Offset = sizeof (ACPI_TABLE_ERST);
1633 
1634 
1635     /* Main table */
1636 
1637     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
1638     if (ACPI_FAILURE (Status))
1639     {
1640         return;
1641     }
1642 
1643     /* Subtables */
1644 
1645     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1646     while (Offset < Table->Length)
1647     {
1648         AcpiOsPrintf ("\n");
1649         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1650             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
1651         if (ACPI_FAILURE (Status))
1652         {
1653             return;
1654         }
1655 
1656         /* Point to next subtable (each subtable is of fixed length) */
1657 
1658         Offset += sizeof (ACPI_WHEA_HEADER);
1659         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
1660             sizeof (ACPI_WHEA_HEADER));
1661     }
1662 }
1663 
1664 
1665 /*******************************************************************************
1666  *
1667  * FUNCTION:    AcpiDmDumpFpdt
1668  *
1669  * PARAMETERS:  Table               - A FPDT table
1670  *
1671  * RETURN:      None
1672  *
1673  * DESCRIPTION: Format the contents of a FPDT. This table type consists
1674  *              of an open-ended number of subtables.
1675  *
1676  ******************************************************************************/
1677 
1678 void
1679 AcpiDmDumpFpdt (
1680     ACPI_TABLE_HEADER       *Table)
1681 {
1682     ACPI_STATUS             Status;
1683     ACPI_FPDT_HEADER        *Subtable;
1684     UINT32                  Length = Table->Length;
1685     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
1686     ACPI_DMTABLE_INFO       *InfoTable;
1687 
1688 
1689     /* There is no main table (other than the standard ACPI header) */
1690 
1691     /* Subtables */
1692 
1693     Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
1694     while (Offset < Table->Length)
1695     {
1696         /* Common subtable header */
1697 
1698         AcpiOsPrintf ("\n");
1699         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1700             Subtable->Length, AcpiDmTableInfoFpdtHdr);
1701         if (ACPI_FAILURE (Status))
1702         {
1703             return;
1704         }
1705 
1706         switch (Subtable->Type)
1707         {
1708         case ACPI_FPDT_TYPE_BOOT:
1709 
1710             InfoTable = AcpiDmTableInfoFpdt0;
1711             break;
1712 
1713         case ACPI_FPDT_TYPE_S3PERF:
1714 
1715             InfoTable = AcpiDmTableInfoFpdt1;
1716             break;
1717 
1718         default:
1719 
1720             AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",
1721                 Subtable->Type);
1722 
1723             /* Attempt to continue */
1724 
1725             if (!Subtable->Length)
1726             {
1727                 AcpiOsPrintf ("Invalid zero length subtable\n");
1728                 return;
1729             }
1730             goto NextSubtable;
1731         }
1732 
1733         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1734             Subtable->Length, InfoTable);
1735         if (ACPI_FAILURE (Status))
1736         {
1737             return;
1738         }
1739 
1740 NextSubtable:
1741         /* Point to next subtable */
1742 
1743         Offset += Subtable->Length;
1744         Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable,
1745             Subtable->Length);
1746     }
1747 }
1748 
1749 
1750 /*******************************************************************************
1751  *
1752  * FUNCTION:    AcpiDmDumpGtdt
1753  *
1754  * PARAMETERS:  Table               - A GTDT table
1755  *
1756  * RETURN:      None
1757  *
1758  * DESCRIPTION: Format the contents of a GTDT. This table type consists
1759  *              of an open-ended number of subtables.
1760  *
1761  ******************************************************************************/
1762 
1763 void
1764 AcpiDmDumpGtdt (
1765     ACPI_TABLE_HEADER       *Table)
1766 {
1767     ACPI_STATUS             Status;
1768     ACPI_GTDT_HEADER        *Subtable;
1769     UINT32                  Length = Table->Length;
1770     UINT32                  Offset = sizeof (ACPI_TABLE_GTDT);
1771     ACPI_DMTABLE_INFO       *InfoTable;
1772     UINT32                  SubtableLength;
1773     UINT32                  GtCount;
1774     ACPI_GTDT_TIMER_ENTRY   *GtxTable;
1775 
1776 
1777     /* Main table */
1778 
1779     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
1780     if (ACPI_FAILURE (Status))
1781     {
1782         return;
1783     }
1784 
1785     /* Rev 3 fields */
1786 
1787     Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
1788 
1789     if (Table->Revision > 2)
1790     {
1791         SubtableLength = sizeof (ACPI_GTDT_EL2);
1792         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1793             SubtableLength, AcpiDmTableInfoGtdtEl2);
1794         if (ACPI_FAILURE (Status))
1795         {
1796             return;
1797         }
1798         Offset += SubtableLength;
1799     }
1800 
1801     Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
1802 
1803     /* Subtables */
1804 
1805     while (Offset < Table->Length)
1806     {
1807         /* Common subtable header */
1808 
1809         AcpiOsPrintf ("\n");
1810         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1811             Subtable->Length, AcpiDmTableInfoGtdtHdr);
1812         if (ACPI_FAILURE (Status))
1813         {
1814             return;
1815         }
1816 
1817         GtCount = 0;
1818         switch (Subtable->Type)
1819         {
1820         case ACPI_GTDT_TYPE_TIMER_BLOCK:
1821 
1822             SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
1823             GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
1824                 Subtable))->TimerCount;
1825 
1826             InfoTable = AcpiDmTableInfoGtdt0;
1827             break;
1828 
1829         case ACPI_GTDT_TYPE_WATCHDOG:
1830 
1831             SubtableLength = sizeof (ACPI_GTDT_WATCHDOG);
1832 
1833             InfoTable = AcpiDmTableInfoGtdt1;
1834             break;
1835 
1836         default:
1837 
1838             /* Cannot continue on unknown type - no length */
1839 
1840             AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n",
1841                 Subtable->Type);
1842             return;
1843         }
1844 
1845         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1846             Subtable->Length, InfoTable);
1847         if (ACPI_FAILURE (Status))
1848         {
1849             return;
1850         }
1851 
1852         /* Point to end of current subtable (each subtable above is of fixed length) */
1853 
1854         Offset += SubtableLength;
1855 
1856         /* If there are any Gt Timer Blocks from above, dump them now */
1857 
1858         if (GtCount)
1859         {
1860             GtxTable = ACPI_ADD_PTR (
1861                 ACPI_GTDT_TIMER_ENTRY, Subtable, SubtableLength);
1862             SubtableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
1863 
1864             while (GtCount)
1865             {
1866                 AcpiOsPrintf ("\n");
1867                 Status = AcpiDmDumpTable (Length, Offset, GtxTable,
1868                     sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
1869                 if (ACPI_FAILURE (Status))
1870                 {
1871                     return;
1872                 }
1873                 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
1874                 GtxTable++;
1875                 GtCount--;
1876             }
1877         }
1878 
1879         /* Point to next subtable */
1880 
1881         Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Subtable, SubtableLength);
1882     }
1883 }
1884 
1885 
1886 /*******************************************************************************
1887  *
1888  * FUNCTION:    AcpiDmDumpHest
1889  *
1890  * PARAMETERS:  Table               - A HEST table
1891  *
1892  * RETURN:      None
1893  *
1894  * DESCRIPTION: Format the contents of a HEST. This table type consists
1895  *              of an open-ended number of subtables.
1896  *
1897  ******************************************************************************/
1898 
1899 void
1900 AcpiDmDumpHest (
1901     ACPI_TABLE_HEADER       *Table)
1902 {
1903     ACPI_STATUS             Status;
1904     ACPI_HEST_HEADER        *Subtable;
1905     UINT32                  Length = Table->Length;
1906     UINT32                  Offset = sizeof (ACPI_TABLE_HEST);
1907     ACPI_DMTABLE_INFO       *InfoTable;
1908     UINT32                  SubtableLength;
1909     UINT32                  BankCount;
1910     ACPI_HEST_IA_ERROR_BANK *BankTable;
1911 
1912 
1913     /* Main table */
1914 
1915     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
1916     if (ACPI_FAILURE (Status))
1917     {
1918         return;
1919     }
1920 
1921     /* Subtables */
1922 
1923     Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
1924     while (Offset < Table->Length)
1925     {
1926         BankCount = 0;
1927         switch (Subtable->Type)
1928         {
1929         case ACPI_HEST_TYPE_IA32_CHECK:
1930 
1931             InfoTable = AcpiDmTableInfoHest0;
1932             SubtableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
1933             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1934                 Subtable))->NumHardwareBanks;
1935             break;
1936 
1937         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1938 
1939             InfoTable = AcpiDmTableInfoHest1;
1940             SubtableLength = sizeof (ACPI_HEST_IA_CORRECTED);
1941             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1942                 Subtable))->NumHardwareBanks;
1943             break;
1944 
1945         case ACPI_HEST_TYPE_IA32_NMI:
1946 
1947             InfoTable = AcpiDmTableInfoHest2;
1948             SubtableLength = sizeof (ACPI_HEST_IA_NMI);
1949             break;
1950 
1951         case ACPI_HEST_TYPE_AER_ROOT_PORT:
1952 
1953             InfoTable = AcpiDmTableInfoHest6;
1954             SubtableLength = sizeof (ACPI_HEST_AER_ROOT);
1955             break;
1956 
1957         case ACPI_HEST_TYPE_AER_ENDPOINT:
1958 
1959             InfoTable = AcpiDmTableInfoHest7;
1960             SubtableLength = sizeof (ACPI_HEST_AER);
1961             break;
1962 
1963         case ACPI_HEST_TYPE_AER_BRIDGE:
1964 
1965             InfoTable = AcpiDmTableInfoHest8;
1966             SubtableLength = sizeof (ACPI_HEST_AER_BRIDGE);
1967             break;
1968 
1969         case ACPI_HEST_TYPE_GENERIC_ERROR:
1970 
1971             InfoTable = AcpiDmTableInfoHest9;
1972             SubtableLength = sizeof (ACPI_HEST_GENERIC);
1973             break;
1974 
1975         case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
1976 
1977             InfoTable = AcpiDmTableInfoHest10;
1978             SubtableLength = sizeof (ACPI_HEST_GENERIC_V2);
1979             break;
1980 
1981         case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
1982 
1983             InfoTable = AcpiDmTableInfoHest11;
1984             SubtableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);
1985             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
1986                 Subtable))->NumHardwareBanks;
1987             break;
1988 
1989         default:
1990 
1991             /* Cannot continue on unknown type - no length */
1992 
1993             AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n",
1994                 Subtable->Type);
1995             return;
1996         }
1997 
1998         AcpiOsPrintf ("\n");
1999         Status = AcpiDmDumpTable (Length, Offset, Subtable,
2000             SubtableLength, InfoTable);
2001         if (ACPI_FAILURE (Status))
2002         {
2003             return;
2004         }
2005 
2006         /* Point to end of current subtable (each subtable above is of fixed length) */
2007 
2008         Offset += SubtableLength;
2009 
2010         /* If there are any (fixed-length) Error Banks from above, dump them now */
2011 
2012         if (BankCount)
2013         {
2014             BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, Subtable,
2015                 SubtableLength);
2016             SubtableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
2017 
2018             while (BankCount)
2019             {
2020                 AcpiOsPrintf ("\n");
2021                 Status = AcpiDmDumpTable (Length, Offset, BankTable,
2022                     sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
2023                 if (ACPI_FAILURE (Status))
2024                 {
2025                     return;
2026                 }
2027 
2028                 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
2029                 BankTable++;
2030                 BankCount--;
2031             }
2032         }
2033 
2034         /* Point to next subtable */
2035 
2036         Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Subtable, SubtableLength);
2037     }
2038 }
2039 
2040 
2041 /*******************************************************************************
2042  *
2043  * FUNCTION:    AcpiDmDumpHmat
2044  *
2045  * PARAMETERS:  Table               - A HMAT table
2046  *
2047  * RETURN:      None
2048  *
2049  * DESCRIPTION: Format the contents of a HMAT.
2050  *
2051  ******************************************************************************/
2052 
2053 void
2054 AcpiDmDumpHmat (
2055     ACPI_TABLE_HEADER       *Table)
2056 {
2057     ACPI_STATUS             Status;
2058     ACPI_HMAT_STRUCTURE     *HmatStruct;
2059     ACPI_HMAT_LOCALITY      *HmatLocality;
2060     ACPI_HMAT_CACHE         *HmatCache;
2061     UINT32                  Offset;
2062     UINT32                  SubtableOffset;
2063     UINT32                  Length;
2064     ACPI_DMTABLE_INFO       *InfoTable;
2065     UINT32                  i, j;
2066 
2067 
2068     /* Main table */
2069 
2070     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat);
2071     if (ACPI_FAILURE (Status))
2072     {
2073         return;
2074     }
2075     Offset = sizeof (ACPI_TABLE_HMAT);
2076 
2077     while (Offset < Table->Length)
2078     {
2079         AcpiOsPrintf ("\n");
2080 
2081         /* Dump HMAT structure header */
2082 
2083         HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset);
2084         if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE))
2085         {
2086             AcpiOsPrintf ("Invalid HMAT structure length\n");
2087             return;
2088         }
2089         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
2090             HmatStruct->Length, AcpiDmTableInfoHmatHdr);
2091         if (ACPI_FAILURE (Status))
2092         {
2093             return;
2094         }
2095 
2096         switch (HmatStruct->Type)
2097         {
2098         case ACPI_HMAT_TYPE_ADDRESS_RANGE:
2099 
2100             InfoTable = AcpiDmTableInfoHmat0;
2101             Length = sizeof (ACPI_HMAT_PROXIMITY_DOMAIN);
2102             break;
2103 
2104         case ACPI_HMAT_TYPE_LOCALITY:
2105 
2106             InfoTable = AcpiDmTableInfoHmat1;
2107             Length = sizeof (ACPI_HMAT_LOCALITY);
2108             break;
2109 
2110         case ACPI_HMAT_TYPE_CACHE:
2111 
2112             InfoTable = AcpiDmTableInfoHmat2;
2113             Length = sizeof (ACPI_HMAT_CACHE);
2114             break;
2115 
2116         default:
2117 
2118             AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n",
2119                 HmatStruct->Type);
2120 
2121             /* Attempt to continue */
2122 
2123             goto NextSubtable;
2124         }
2125 
2126         /* Dump HMAT structure body */
2127 
2128         if (HmatStruct->Length < Length)
2129         {
2130             AcpiOsPrintf ("Invalid HMAT structure length\n");
2131             return;
2132         }
2133         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
2134             HmatStruct->Length, InfoTable);
2135         if (ACPI_FAILURE (Status))
2136         {
2137             return;
2138         }
2139 
2140         /* Dump HMAT structure additional */
2141 
2142         switch (HmatStruct->Type)
2143         {
2144         case ACPI_HMAT_TYPE_LOCALITY:
2145 
2146             HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct);
2147             SubtableOffset = sizeof (ACPI_HMAT_LOCALITY);
2148 
2149             /* Dump initiator proximity domains */
2150 
2151             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
2152                 (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4))
2153             {
2154                 AcpiOsPrintf ("Invalid initiator proximity domain number\n");
2155                 return;
2156             }
2157             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
2158             {
2159                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2160                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
2161                     4, AcpiDmTableInfoHmat1a);
2162                 if (ACPI_FAILURE (Status))
2163                 {
2164                     return;
2165                 }
2166 
2167                 SubtableOffset += 4;
2168             }
2169 
2170             /* Dump target proximity domains */
2171 
2172             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
2173                 (UINT32)(HmatLocality->NumberOfTargetPDs * 4))
2174             {
2175                 AcpiOsPrintf ("Invalid target proximity domain number\n");
2176                 return;
2177             }
2178             for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++)
2179             {
2180                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2181                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
2182                     4, AcpiDmTableInfoHmat1b);
2183                 if (ACPI_FAILURE (Status))
2184                 {
2185                     return;
2186                 }
2187 
2188                 SubtableOffset += 4;
2189             }
2190 
2191             /* Dump latency/bandwidth entris */
2192 
2193             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
2194                 (UINT32)(HmatLocality->NumberOfInitiatorPDs *
2195                          HmatLocality->NumberOfTargetPDs * 2))
2196             {
2197                 AcpiOsPrintf ("Invalid latency/bandwidth entry number\n");
2198                 return;
2199             }
2200             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
2201             {
2202                 for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++)
2203                 {
2204                     Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2205                         ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
2206                         2, AcpiDmTableInfoHmat1c);
2207                     if (ACPI_FAILURE(Status))
2208                     {
2209                         return;
2210                     }
2211 
2212                     SubtableOffset += 2;
2213                 }
2214             }
2215             break;
2216 
2217         case ACPI_HMAT_TYPE_CACHE:
2218 
2219             HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct);
2220             SubtableOffset = sizeof (ACPI_HMAT_CACHE);
2221 
2222             /* Dump SMBIOS handles */
2223 
2224             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
2225                 (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2))
2226             {
2227                 AcpiOsPrintf ("Invalid SMBIOS handle number\n");
2228                 return;
2229             }
2230             for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++)
2231             {
2232                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2233                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
2234                     2, AcpiDmTableInfoHmat2a);
2235                 if (ACPI_FAILURE (Status))
2236                 {
2237                     return;
2238                 }
2239 
2240                 SubtableOffset += 2;
2241             }
2242             break;
2243 
2244         default:
2245 
2246             break;
2247         }
2248 
2249 NextSubtable:
2250         /* Point to next HMAT structure subtable */
2251 
2252         Offset += (HmatStruct->Length);
2253     }
2254 }
2255