1 /******************************************************************************
2  *
3  * Module Name: dmtable - Support for ACPI tables that contain no AML code
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2022, 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    ("dmtable")
54 
55 const AH_TABLE *
56 AcpiAhGetTableInfo (
57     char                    *Signature);
58 
59 
60 /* Common format strings for commented values */
61 
62 #define UINT8_FORMAT            "%2.2X [%s]\n"
63 #define UINT8_FORMAT_NO_NEWLINE "%2.2X [%s]"
64 #define UINT16_FORMAT           "%4.4X [%s]\n"
65 #define UINT32_FORMAT           "%8.8X [%s]\n"
66 #define STRING_FORMAT           "[%s]\n"
67 
68 /* These tables map a subtable type to a description string */
69 
70 static const char           *AcpiDmAestResourceNames[] =
71 {
72     "Cache Resource",
73     "TLB Resource",
74     "Generic Resource",
75     "Unknown Resource Type"         /* Reserved */
76 };
77 
78 static const char           *AcpiDmAestSubnames[] =
79 {
80     "Processor Error Node",
81     "Memory Error Node",
82     "SMMU Error Node",
83     "Vendor-defined Error Node",
84     "GIC Error Node",
85     "Unknown Subtable Type"         /* Reserved */
86 };
87 
88 static const char           *AcpiDmAestCacheNames[] =
89 {
90     "Data Cache",
91     "Instruction Cache",
92     "Unified Cache",
93     "Unknown Cache Type"            /* Reserved */
94 };
95 
96 static const char           *AcpiDmAestGicNames[] =
97 {
98     "GIC CPU",
99     "GIC Distributor",
100     "GIC Redistributor",
101     "GIC ITS",
102     "Unknown GIC Interface Type"    /* Reserved */
103 };
104 
105 static const char           *AcpiDmAestXfaceNames[] =
106 {
107     "System Register Interface",
108     "Memory Mapped Interface",
109     "Unknown Interface Type"        /* Reserved */
110 };
111 
112 static const char           *AcpiDmAestXruptNames[] =
113 {
114     "Fault Handling Interrupt",
115     "Error Recovery Interrupt",
116     "Unknown Interrupt Type"        /* Reserved */
117 };
118 
119 static const char           *AcpiDmAsfSubnames[] =
120 {
121     "ASF Information",
122     "ASF Alerts",
123     "ASF Remote Control",
124     "ASF RMCP Boot Options",
125     "ASF Address",
126     "Unknown Subtable Type"         /* Reserved */
127 };
128 
129 static const char           *AcpiDmCdatSubnames[] =
130 {
131     "Device Scoped Memory Affinity Structure (DSMAS)",
132     "Device scoped Latency and Bandwidth Information Structure (DSLBIS)",
133     "Device Scoped Memory Side Cache Information Structure (DSMSCIS)",
134     "Device Scoped Initiator Structure (DSIS)",
135     "Device Scoped EFI Memory Type Structure (DSEMTS)",
136     "Switch Scoped Latency and Bandwidth Information Structure (SSLBIS)",
137     "Unknown Subtable Type"         /* Reserved */
138 };
139 
140 static const char           *AcpiDmCedtSubnames[] =
141 {
142     "CXL Host Bridge Structure",
143     "CXL Fixed Memory Window Structure",
144     "Unknown Subtable Type"         /* Reserved */
145 };
146 
147 static const char           *AcpiDmDmarSubnames[] =
148 {
149     "Hardware Unit Definition",
150     "Reserved Memory Region",
151     "Root Port ATS Capability",
152     "Remapping Hardware Static Affinity",
153     "ACPI Namespace Device Declaration",
154     "SoC Integrated Address Translation Cache",
155     "Unknown Subtable Type"         /* Reserved */
156 };
157 
158 static const char           *AcpiDmDmarScope[] =
159 {
160     "Reserved value",
161     "PCI Endpoint Device",
162     "PCI Bridge Device",
163     "IOAPIC Device",
164     "Message-capable HPET Device",
165     "Namespace Device",
166     "Unknown Scope Type"            /* Reserved */
167 };
168 
169 static const char           *AcpiDmEinjActions[] =
170 {
171     "Begin Operation",
172     "Get Trigger Table",
173     "Set Error Type",
174     "Get Error Type",
175     "End Operation",
176     "Execute Operation",
177     "Check Busy Status",
178     "Get Command Status",
179     "Set Error Type With Address",
180     "Get Execute Timings",
181     "Unknown Action"
182 };
183 
184 static const char           *AcpiDmEinjInstructions[] =
185 {
186     "Read Register",
187     "Read Register Value",
188     "Write Register",
189     "Write Register Value",
190     "Noop",
191     "Flush Cacheline",
192     "Unknown Instruction"
193 };
194 
195 static const char           *AcpiDmErstActions[] =
196 {
197     "Begin Write Operation",
198     "Begin Read Operation",
199     "Begin Clear Operation",
200     "End Operation",
201     "Set Record Offset",
202     "Execute Operation",
203     "Check Busy Status",
204     "Get Command Status",
205     "Get Record Identifier",
206     "Set Record Identifier",
207     "Get Record Count",
208     "Begin Dummy Write",
209     "Unused/Unknown Action",
210     "Get Error Address Range",
211     "Get Error Address Length",
212     "Get Error Attributes",
213     "Execute Timings",
214     "Unknown Action"
215 };
216 
217 static const char           *AcpiDmErstInstructions[] =
218 {
219     "Read Register",
220     "Read Register Value",
221     "Write Register",
222     "Write Register Value",
223     "Noop",
224     "Load Var1",
225     "Load Var2",
226     "Store Var1",
227     "Add",
228     "Subtract",
229     "Add Value",
230     "Subtract Value",
231     "Stall",
232     "Stall While True",
233     "Skip Next If True",
234     "GoTo",
235     "Set Source Address",
236     "Set Destination Address",
237     "Move Data",
238     "Unknown Instruction"
239 };
240 
241 static const char           *AcpiDmGtdtSubnames[] =
242 {
243     "Generic Timer Block",
244     "Generic Watchdog Timer",
245     "Unknown Subtable Type"         /* Reserved */
246 };
247 
248 static const char           *AcpiDmHestSubnames[] =
249 {
250     "IA-32 Machine Check Exception",
251     "IA-32 Corrected Machine Check",
252     "IA-32 Non-Maskable Interrupt",
253     "Unknown Subtable Type",        /* 3 - Reserved */
254     "Unknown Subtable Type",        /* 4 - Reserved */
255     "Unknown Subtable Type",        /* 5 - Reserved */
256     "PCI Express Root Port AER",
257     "PCI Express AER (AER Endpoint)",
258     "PCI Express/PCI-X Bridge AER",
259     "Generic Hardware Error Source",
260     "Generic Hardware Error Source V2",
261     "IA-32 Deferred Machine Check",
262     "Unknown Subtable Type"         /* Reserved */
263 };
264 
265 static const char           *AcpiDmHestNotifySubnames[] =
266 {
267     "Polled",
268     "External Interrupt",
269     "Local Interrupt",
270     "SCI",
271     "NMI",
272     "CMCI",                         /* ACPI 5.0 */
273     "MCE",                          /* ACPI 5.0 */
274     "GPIO",                         /* ACPI 6.0 */
275     "SEA",                          /* ACPI 6.1 */
276     "SEI",                          /* ACPI 6.1 */
277     "GSIV",                         /* ACPI 6.1 */
278     "Software Delegated Exception", /* ACPI 6.2 */
279     "Unknown Notify Type"           /* Reserved */
280 };
281 
282 static const char           *AcpiDmHmatSubnames[] =
283 {
284     "Memory Proximity Domain Attributes",
285     "System Locality Latency and Bandwidth Information",
286     "Memory Side Cache Information",
287     "Unknown Structure Type"         /* Reserved */
288 };
289 
290 static const char           *AcpiDmMadtSubnames[] =
291 {
292     "Processor Local APIC",             /* ACPI_MADT_TYPE_LOCAL_APIC */
293     "I/O APIC",                         /* ACPI_MADT_TYPE_IO_APIC */
294     "Interrupt Source Override",        /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */
295     "NMI Source",                       /* ACPI_MADT_TYPE_NMI_SOURCE */
296     "Local APIC NMI",                   /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */
297     "Local APIC Address Override",      /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */
298     "I/O SAPIC",                        /* ACPI_MADT_TYPE_IO_SAPIC */
299     "Local SAPIC",                      /* ACPI_MADT_TYPE_LOCAL_SAPIC */
300     "Platform Interrupt Sources",       /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */
301     "Processor Local x2APIC",           /* ACPI_MADT_TYPE_LOCAL_X2APIC */
302     "Local x2APIC NMI",                 /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */
303     "Generic Interrupt Controller",     /* ACPI_MADT_GENERIC_INTERRUPT */
304     "Generic Interrupt Distributor",    /* ACPI_MADT_GENERIC_DISTRIBUTOR */
305     "Generic MSI Frame",                /* ACPI_MADT_GENERIC_MSI_FRAME */
306     "Generic Interrupt Redistributor",  /* ACPI_MADT_GENERIC_REDISTRIBUTOR */
307     "Generic Interrupt Translator",     /* ACPI_MADT_GENERIC_TRANSLATOR */
308     "Mutiprocessor Wakeup",             /* ACPI_MADT_TYPE_MULTIPROC_WAKEUP */
309     "CPU Core Interrupt Controller",    /* ACPI_MADT_TYPE_CORE_PIC */
310     "Legacy I/O Interrupt Controller",  /* ACPI_MADT_TYPE_LIO_PIC */
311     "HT Interrupt Controller",          /* ACPI_MADT_TYPE_HT_PIC */
312     "Extend I/O Interrupt Controller",  /* ACPI_MADT_TYPE_EIO_PIC */
313     "MSI Interrupt Controller",         /* ACPI_MADT_TYPE_MSI_PIC */
314     "Bridge I/O Interrupt Controller",  /* ACPI_MADT_TYPE_BIO_PIC */
315     "LPC Interrupt Controller",         /* ACPI_MADT_TYPE_LPC_PIC */
316     "Unknown Subtable Type",            /* Reserved */
317     "Types 80-FF are used for OEM data" /* Reserved for OEM data */
318 };
319 
320 static const char           *AcpiDmNfitSubnames[] =
321 {
322     "System Physical Address Range",    /* ACPI_NFIT_TYPE_SYSTEM_ADDRESS */
323     "Memory Range Map",                 /* ACPI_NFIT_TYPE_MEMORY_MAP */
324     "Interleave Info",                  /* ACPI_NFIT_TYPE_INTERLEAVE */
325     "SMBIOS Information",               /* ACPI_NFIT_TYPE_SMBIOS */
326     "NVDIMM Control Region",            /* ACPI_NFIT_TYPE_CONTROL_REGION */
327     "NVDIMM Block Data Window Region",  /* ACPI_NFIT_TYPE_DATA_REGION */
328     "Flush Hint Address",               /* ACPI_NFIT_TYPE_FLUSH_ADDRESS */
329     "Platform Capabilities",            /* ACPI_NFIT_TYPE_CAPABILITIES */
330     "Unknown Subtable Type"             /* Reserved */
331 };
332 
333 static const char           *AcpiDmNhltLinkTypeNames[] =
334 {
335     "Reserved for HD-Audio",            /* ACPI_NHLT_RESERVED_HD_AUDIO */
336     "Reserved for DSP",                 /* ACPI_NHLT_RESERVED_DSP */
337     "Type PDM",                         /* ACPI_NHLT_PDM */
338     "Type SSP",                         /* ACPI_NHLT_SSP */
339     "Reserved for SlimBus",             /* ACPI_NHLT_RESERVED_SLIMBUS */
340     "Reserved for SoundWire",           /* ACPI_NHLT_RESERVED_SOUNDWIRE */
341     "Unknown Link Type"                 /* Reserved */
342 };
343 
344 static const char           *AcpiDmNhltDirectionNames[] =
345 {
346     "Render",                           /* ACPI_NHLT_DIR_RENDER */
347     "Capture",                          /* ACPI_NHLT_DIR_CAPTURE */
348     "Render with Loopback",             /* ACPI_NHLT_DIR_RENDER_LOOPBACK */
349     "Feedback for Render",              /* ACPI_NHLT_DIR_RENDER_FEEDBACK */
350     "Unknown Direction"                 /* Reserved */
351 };
352 
353 static const char           *AcpiDmNhltMicTypeNames[] =
354 {
355     "Omnidirectional",                  /* ACPI_NHLT_MIC_OMNIDIRECTIONAL */
356     "Subcardioid",                      /* ACPI_NHLT_MIC_SUBCARDIOID */
357     "Cardioid",                         /* ACPI_NHLT_MIC_CARDIOID */
358     "SuperCardioid",                    /* ACPI_NHLT_MIC_SUPER_CARDIOID */
359     "HyperCardioid",                    /* ACPI_NHLT_MIC_HYPER_CARDIOID */
360     "8 Shaped",                         /* ACPI_NHLT_MIC_8_SHAPED */
361     "Reserved Mic Type",                /* Reserved */
362     "Vendor Defined",                   /* ACPI_NHLT_MIC_VENDOR_DEFINED */
363     "Unknown Mic Type"                  /* ACPI_NHLT_MIC_RESERVED */
364 };
365 
366 static const char           *AcpiDmNhltMicPositionNames[] =
367 {
368     "Top",                              /* ACPI_NHLT_MIC_POSITION_TOP */
369     "Bottom",                           /* ACPI_NHLT_MIC_POSITION_BOTTOM */
370     "Left",                             /* ACPI_NHLT_MIC_POSITION_LEFT */
371     "Right",                            /* ACPI_NHLT_MIC_POSITION_RIGHT */
372     "Front",                            /* ACPI_NHLT_MIC_POSITION_FRONT */
373     "Back",                             /* ACPI_NHLT_MIC_POSITION_BACK */
374     "Unknown Mic Position"              /* 6 and above are reserved */
375 };
376 
377 static const char           *AcpiDmNhltMicArrayTypeNames[] =
378 {
379     "Unknown Array Type",               /* ACPI_NHLT_ARRAY_TYPE_RESERVED */
380     "Small Linear 2-element",           /* ACPI_NHLT_SMALL_LINEAR_2ELEMENT */
381     "Big Linear 2-element",             /* ACPI_NHLT_BIG_LINEAR_2ELEMENT */
382     "Linear 4-element 1st Geometry",    /* ACPI_NHLT_FIRST_GEOMETRY_LINEAR_4ELEMENT */
383     "Planar L-shaped 4-element",        /* ACPI_NHLT_PLANAR_LSHAPED_4ELEMENT */
384     "Linear 4-element 2nd Geometry",    /* ACPI_NHLT_SECOND_GEOMETRY_LINEAR_4ELEMENT */
385     "Vendor Defined"                    /* ACPI_NHLT_VENDOR_DEFINED */
386 };
387 
388 static const char           *AcpiDmNhltConfigTypeNames[] =
389 {
390     "Generic Type",                     /* ACPI_NHLT_CONFIG_TYPE_GENERIC */
391     "Microphone Array",                 /* ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY */
392     "Reserved",                         /* ACPI_NHLT_CONFIG_TYPE_RESERVED */
393     "Render Feedback",                  /* ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK */
394     "Unknown Config Type"               /* ACPI_NHLT_CONFIG_TYPE_RESERVED */
395 };
396 
397 static const char           *AcpiDmPcctSubnames[] =
398 {
399     "Generic Communications Subspace",  /* ACPI_PCCT_TYPE_GENERIC_SUBSPACE */
400     "HW-Reduced Comm Subspace",         /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE */
401     "HW-Reduced Comm Subspace Type2",   /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 */
402     "Extended PCC Master Subspace",     /* ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE */
403     "Extended PCC Slave Subspace",      /* ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE */
404     "HW Registers based Comm Subspace", /* ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE */
405     "Unknown Subtable Type"             /* Reserved */
406 };
407 
408 static const char           *AcpiDmPhatSubnames[] =
409 {
410     "Firmware Version Data",        /* ACPI_PHAT_TYPE_FW_VERSION_DATA */
411     "Firmware Health Data",         /* ACPI_PHAT_TYPE_FW_HEALTH_DATA */
412     "Unknown Subtable Type"         /* Reserved */
413 };
414 
415 static const char           *AcpiDmPmttSubnames[] =
416 {
417     "Socket",                       /* ACPI_PMTT_TYPE_SOCKET */
418     "Memory Controller",            /* ACPI_PMTT_TYPE_CONTROLLER */
419     "Physical Component (DIMM)",    /* ACPI_PMTT_TYPE_DIMM */
420     "Unknown Subtable Type",        /* Reserved */
421     "Vendor Specific"               /* ACPI_PMTT_TYPE_VENDOR */
422 };
423 
424 static const char           *AcpiDmPpttSubnames[] =
425 {
426     "Processor Hierarchy Node",     /* ACPI_PPTT_TYPE_PROCESSOR */
427     "Cache Type",                   /* ACPI_PPTT_TYPE_CACHE */
428     "ID",                           /* ACPI_PPTT_TYPE_ID */
429     "Unknown Subtable Type"         /* Reserved */
430 };
431 
432 static const char           *AcpiDmRgrtSubnames[] =
433 {
434     "Unknown/Reserved Image Type",  /* ACPI_RGRT_TYPE_RESERVED0 */
435     "Type PNG"                      /* ACPI_RGRT_IMAGE_TYPE_PNG */
436 };
437 
438 static const char           *AcpiDmSdevSubnames[] =
439 {
440     "Namespace Device",             /* ACPI_SDEV_TYPE_NAMESPACE_DEVICE */
441     "PCIe Endpoint Device",         /* ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE */
442     "Unknown Subtable Type"         /* Reserved */
443 };
444 
445 static const char           *AcpiDmSratSubnames[] =
446 {
447     "Processor Local APIC/SAPIC Affinity",
448     "Memory Affinity",
449     "Processor Local x2APIC Affinity",
450     "GICC Affinity",
451     "GIC ITS Affinity",             /* Acpi 6.2 */
452     "Generic Initiator Affinity",   /* Acpi 6.3 */
453     "Generic Port Affinity",        /* Acpi 6.4 */
454     "Unknown Subtable Type"         /* Reserved */
455 };
456 
457 static const char           *AcpiDmTpm2Subnames[] =
458 {
459     "Illegal Start Method value",
460     "Reserved",
461     "ACPI Start Method",
462     "Reserved",
463     "Reserved",
464     "Reserved",
465     "Memory Mapped I/O",
466     "Command Response Buffer",
467     "Command Response Buffer with ACPI Start Method",
468     "Reserved",
469     "Reserved",
470     "Command Response Buffer with ARM SMC",
471     "Unknown Subtable Type"         /* Reserved */
472 };
473 
474 static const char           *AcpiDmIvrsSubnames[] =
475 {
476     "Hardware Definition Block (IVHD)",
477     "Hardware Definition Block - Mixed Format (IVHD)",
478     "Memory Definition Block (IVMD)",
479     "Unknown/Reserved Subtable Type"            /* Reserved */
480 };
481 
482 static const char           *AcpiDmIvrsDevEntryNames[] =
483 {
484     "Unknown/Reserved Device Entry Type",       /* 0- Reserved */
485     "Device Entry: Select All Devices",         /* 1 */
486     "Device Entry: Select One Device",          /* 2 */
487     "Device Entry: Start of Range",             /* 3 */
488     "Device Entry: End of Range",               /* 4 */
489     "Device Entry: Alias Select",               /* 66 */
490     "Device Entry: Alias Start of Range",       /* 67 */
491     "Unknown/Reserved Device Entry Type",       /* 68- Reserved */
492     "Unknown/Reserved Device Entry Type",       /* 69- Reserved */
493     "Device Entry: Extended Select",            /* 70 */
494     "Device Entry: Extended Start of Range",    /* 71 */
495     "Device Entry: Special Device",             /* 72 */
496     "Device Entry: ACPI HID Named Device",      /* 240 */
497     "Unknown/Reserved Device Entry Type"        /* Reserved */
498 };
499 
500 static const char           *AcpiDmLpitSubnames[] =
501 {
502     "Native C-state Idle Structure",
503     "Unknown Subtable Type"         /* Reserved */
504 };
505 
506 static const char           *AcpiDmViotSubnames[] =
507 {
508     "Unknown Subtable Type",        /* 0 -Reserved */
509     "PCI Range",
510     "MMIO Endpoint",
511     "VirtIO-PCI IOMMU",
512     "VirtIO-MMIO IOMMU",
513     "Unknown Subtable Type"         /* Reserved */
514 };
515 
516 #define ACPI_FADT_PM_RESERVED       9
517 
518 static const char           *AcpiDmFadtProfiles[] =
519 {
520     "Unspecified",
521     "Desktop",
522     "Mobile",
523     "Workstation",
524     "Enterprise Server",
525     "SOHO Server",
526     "Appliance PC",
527     "Performance Server",
528     "Tablet",
529     "Unknown Profile Type"
530 };
531 
532 #define ACPI_GAS_WIDTH_RESERVED     5
533 
534 static const char           *AcpiDmGasAccessWidth[] =
535 {
536     "Undefined/Legacy",
537     "Byte Access:8",
538     "Word Access:16",
539     "DWord Access:32",
540     "QWord Access:64",
541     "Unknown Width Encoding"
542 };
543 
544 
545 /*******************************************************************************
546  *
547  * ACPI Table Data, indexed by signature.
548  *
549  * Each entry contains: Signature, Table Info, Handler, DtHandler,
550  *  Template, Description
551  *
552  * Simple tables have only a TableInfo structure, complex tables have a
553  * handler. This table must be NULL terminated. RSDP and FACS are
554  * special-cased elsewhere.
555  *
556  * Note: Any tables added here should be duplicated within
557  * AcpiGbl_SupportedTables in the file common/ahtable.c
558  *
559  ******************************************************************************/
560 
561 const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
562 {
563     {ACPI_SIG_AEST, NULL,                   AcpiDmDumpAest, DtCompileAest,  TemplateAest},
564     {ACPI_SIG_AGDI, AcpiDmTableInfoAgdi,    NULL,           NULL,           TemplateAgdi},
565     {ACPI_SIG_APMT, NULL,                   AcpiDmDumpApmt, DtCompileApmt,  TemplateApmt},
566     {ACPI_SIG_ASF,  NULL,                   AcpiDmDumpAsf,  DtCompileAsf,   TemplateAsf},
567     {ACPI_SIG_BDAT, AcpiDmTableInfoBdat,    NULL,           NULL,           TemplateBdat},
568     {ACPI_SIG_BERT, AcpiDmTableInfoBert,    NULL,           NULL,           TemplateBert},
569     {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt,    NULL,           NULL,           TemplateBgrt},
570     {ACPI_SIG_BOOT, AcpiDmTableInfoBoot,    NULL,           NULL,           TemplateBoot},
571     {ACPI_SIG_CCEL, AcpiDmTableInfoCcel,    NULL,           NULL,           TemplateCcel},
572     {ACPI_SIG_CDAT, NULL,                   AcpiDmDumpCdat, NULL,           TemplateCdat},
573     {ACPI_SIG_CEDT, NULL,                   AcpiDmDumpCedt, DtCompileCedt,  TemplateCedt},
574     {ACPI_SIG_CPEP, NULL,                   AcpiDmDumpCpep, DtCompileCpep,  TemplateCpep},
575     {ACPI_SIG_CSRT, NULL,                   AcpiDmDumpCsrt, DtCompileCsrt,  TemplateCsrt},
576     {ACPI_SIG_DBG2, AcpiDmTableInfoDbg2,    AcpiDmDumpDbg2, DtCompileDbg2,  TemplateDbg2},
577     {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp,    NULL,           NULL,           TemplateDbgp},
578     {ACPI_SIG_DMAR, NULL,                   AcpiDmDumpDmar, DtCompileDmar,  TemplateDmar},
579     {ACPI_SIG_DRTM, NULL,                   AcpiDmDumpDrtm, DtCompileDrtm,  TemplateDrtm},
580     {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt,    NULL,           NULL,           TemplateEcdt},
581     {ACPI_SIG_EINJ, NULL,                   AcpiDmDumpEinj, DtCompileEinj,  TemplateEinj},
582     {ACPI_SIG_ERST, NULL,                   AcpiDmDumpErst, DtCompileErst,  TemplateErst},
583     {ACPI_SIG_FADT, NULL,                   AcpiDmDumpFadt, DtCompileFadt,  TemplateFadt},
584     {ACPI_SIG_FPDT, NULL,                   AcpiDmDumpFpdt, DtCompileFpdt,  TemplateFpdt},
585     {ACPI_SIG_GTDT, NULL,                   AcpiDmDumpGtdt, DtCompileGtdt,  TemplateGtdt},
586     {ACPI_SIG_HEST, NULL,                   AcpiDmDumpHest, DtCompileHest,  TemplateHest},
587     {ACPI_SIG_HMAT, NULL,                   AcpiDmDumpHmat, DtCompileHmat,  TemplateHmat},
588     {ACPI_SIG_HPET, AcpiDmTableInfoHpet,    NULL,           NULL,           TemplateHpet},
589     {ACPI_SIG_IORT, NULL,                   AcpiDmDumpIort, DtCompileIort,  TemplateIort},
590     {ACPI_SIG_IVRS, NULL,                   AcpiDmDumpIvrs, DtCompileIvrs,  TemplateIvrs},
591     {ACPI_SIG_LPIT, NULL,                   AcpiDmDumpLpit, DtCompileLpit,  TemplateLpit},
592     {ACPI_SIG_MADT, NULL,                   AcpiDmDumpMadt, DtCompileMadt,  TemplateMadt},
593     {ACPI_SIG_MCFG, NULL,                   AcpiDmDumpMcfg, DtCompileMcfg,  TemplateMcfg},
594     {ACPI_SIG_MCHI, AcpiDmTableInfoMchi,    NULL,           NULL,           TemplateMchi},
595     {ACPI_SIG_MPST, AcpiDmTableInfoMpst,    AcpiDmDumpMpst, DtCompileMpst,  TemplateMpst},
596     {ACPI_SIG_MSCT, NULL,                   AcpiDmDumpMsct, DtCompileMsct,  TemplateMsct},
597     {ACPI_SIG_MSDM, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateMsdm},
598     {ACPI_SIG_NFIT, AcpiDmTableInfoNfit,    AcpiDmDumpNfit, DtCompileNfit,  TemplateNfit},
599     {ACPI_SIG_NHLT, AcpiDmTableInfoNhlt,    AcpiDmDumpNhlt, DtCompileNhlt,  TemplateNhlt},
600     {ACPI_SIG_PCCT, AcpiDmTableInfoPcct,    AcpiDmDumpPcct, DtCompilePcct,  TemplatePcct},
601     {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt,    AcpiDmDumpPdtt, DtCompilePdtt,  TemplatePdtt},
602     {ACPI_SIG_PHAT, NULL,                   AcpiDmDumpPhat, DtCompilePhat,  TemplatePhat},
603     {ACPI_SIG_PMTT, NULL,                   AcpiDmDumpPmtt, DtCompilePmtt,  TemplatePmtt},
604     {ACPI_SIG_PPTT, NULL,                   AcpiDmDumpPptt, DtCompilePptt,  TemplatePptt},
605     {ACPI_SIG_PRMT, NULL,                   AcpiDmDumpPrmt, DtCompilePrmt,  TemplatePrmt},
606     {ACPI_SIG_RASF, AcpiDmTableInfoRasf,    NULL,           NULL,           TemplateRasf},
607     {ACPI_SIG_RGRT, NULL,                   AcpiDmDumpRgrt, DtCompileRgrt,  TemplateRgrt},
608     {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, DtCompileRsdt,  TemplateRsdt},
609     {ACPI_SIG_S3PT, NULL,                   NULL,           NULL,           TemplateS3pt},
610     {ACPI_SIG_SBST, AcpiDmTableInfoSbst,    NULL,           NULL,           TemplateSbst},
611     {ACPI_SIG_SDEI, AcpiDmTableInfoSdei,    NULL,           NULL,           TemplateSdei},
612     {ACPI_SIG_SDEV, AcpiDmTableInfoSdev,    AcpiDmDumpSdev, DtCompileSdev,  TemplateSdev},
613     {ACPI_SIG_SLIC, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateSlic},
614     {ACPI_SIG_SLIT, NULL,                   AcpiDmDumpSlit, DtCompileSlit,  TemplateSlit},
615     {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr,    NULL,           NULL,           TemplateSpcr},
616     {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi,    NULL,           NULL,           TemplateSpmi},
617     {ACPI_SIG_SRAT, NULL,                   AcpiDmDumpSrat, DtCompileSrat,  TemplateSrat},
618     {ACPI_SIG_STAO, NULL,                   AcpiDmDumpStao, DtCompileStao,  TemplateStao},
619     {ACPI_SIG_SVKL, AcpiDmTableInfoSvkl,    AcpiDmDumpSvkl, DtCompileSvkl,  TemplateSvkl},
620     {ACPI_SIG_TCPA, NULL,                   AcpiDmDumpTcpa, DtCompileTcpa,  TemplateTcpa},
621     {ACPI_SIG_TDEL, AcpiDmTableInfoTdel,    NULL,           NULL,           TemplateTdel},
622     {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2,    AcpiDmDumpTpm2, DtCompileTpm2,  TemplateTpm2},
623     {ACPI_SIG_UEFI, AcpiDmTableInfoUefi,    NULL,           DtCompileUefi,  TemplateUefi},
624     {ACPI_SIG_VIOT, AcpiDmTableInfoViot,    AcpiDmDumpViot, DtCompileViot,  TemplateViot},
625     {ACPI_SIG_WAET, AcpiDmTableInfoWaet,    NULL,           NULL,           TemplateWaet},
626     {ACPI_SIG_WDAT, NULL,                   AcpiDmDumpWdat, DtCompileWdat,  TemplateWdat},
627     {ACPI_SIG_WDDT, AcpiDmTableInfoWddt,    NULL,           NULL,           TemplateWddt},
628     {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt,    NULL,           NULL,           TemplateWdrt},
629     {ACPI_SIG_WPBT, NULL,                   AcpiDmDumpWpbt, DtCompileWpbt,  TemplateWpbt},
630     {ACPI_SIG_WSMT, AcpiDmTableInfoWsmt,    NULL,           NULL,           TemplateWsmt},
631     {ACPI_SIG_XENV, AcpiDmTableInfoXenv,    NULL,           NULL,           TemplateXenv},
632     {ACPI_SIG_XSDT, NULL,                   AcpiDmDumpXsdt, DtCompileXsdt,  TemplateXsdt},
633     {NULL,          NULL,                   NULL,           NULL,           NULL}
634 };
635 
636 
637 /*******************************************************************************
638  *
639  * FUNCTION:    AcpiDmGetTableData
640  *
641  * PARAMETERS:  Signature           - ACPI signature (4 chars) to match
642  *
643  * RETURN:      Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
644  *
645  * DESCRIPTION: Find a match in the global table of supported ACPI tables
646  *
647  ******************************************************************************/
648 
649 const ACPI_DMTABLE_DATA *
AcpiDmGetTableData(char * Signature)650 AcpiDmGetTableData (
651     char                    *Signature)
652 {
653     const ACPI_DMTABLE_DATA *Info;
654 
655 
656     for (Info = AcpiDmTableData; Info->Signature; Info++)
657     {
658         if (ACPI_COMPARE_NAMESEG (Signature, Info->Signature))
659         {
660             return (Info);
661         }
662     }
663 
664     return (NULL);
665 }
666 
667 
668 /*******************************************************************************
669  *
670  * FUNCTION:    AcpiDmDumpDataTable
671  *
672  * PARAMETERS:  Table               - An ACPI table
673  *
674  * RETURN:      None.
675  *
676  * DESCRIPTION: Format the contents of an ACPI data table (any table other
677  *              than an SSDT or DSDT that does not contain executable AML code)
678  *
679  ******************************************************************************/
680 
681 void
AcpiDmDumpDataTable(ACPI_TABLE_HEADER * Table)682 AcpiDmDumpDataTable (
683     ACPI_TABLE_HEADER       *Table)
684 {
685     ACPI_STATUS             Status;
686     const ACPI_DMTABLE_DATA *TableData;
687     UINT32                  Length;
688 
689 
690     /* Ignore tables that contain AML */
691 
692     if (AcpiUtIsAmlTable (Table))
693     {
694         if (AslGbl_VerboseTemplates)
695         {
696             /* Dump the raw table data */
697 
698             Length = Table->Length;
699 
700             AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n",
701                 ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
702             AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
703                 Length, DB_BYTE_DISPLAY, 0);
704             AcpiOsPrintf (" */\n");
705         }
706         return;
707     }
708 
709     /*
710      * Handle tables that don't use the common ACPI table header structure.
711      * Currently, these are the FACS, RSDP, S3PT and CDAT.
712      */
713     if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS))
714     {
715         Length = Table->Length;
716         Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
717         if (ACPI_FAILURE (Status))
718         {
719             return;
720         }
721     }
722     else if (ACPI_VALIDATE_RSDP_SIG (ACPI_CAST_PTR (ACPI_TABLE_RSDP,
723         Table)->Signature))
724     {
725         Length = AcpiDmDumpRsdp (Table);
726     }
727     else if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_S3PT))
728     {
729         Length = AcpiDmDumpS3pt (Table);
730     }
731     else if (!AcpiUtValidNameseg (Table->Signature))
732     {
733         /*
734          * For CDAT we are assuming that there should be at least one non-ASCII
735          * byte in the (normally) 4-character Signature field (at least the
736          * high-order byte should be zero).
737          */
738         if (AcpiGbl_CDAT)
739         {
740             /*
741              * Invalid signature and <-ds CDAT> was specified on the command line.
742              * Therefore, we have a CDAT table.
743              */
744             AcpiDmDumpCdat (Table);
745         }
746         else
747         {
748             fprintf (stderr, "Table has an invalid signature\n");
749         }
750 
751         return;
752     }
753     else
754     {
755         /*
756          * All other tables must use the common ACPI table header, dump it now
757          */
758         Length = Table->Length;
759         Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
760         if (ACPI_FAILURE (Status))
761         {
762             return;
763         }
764         AcpiOsPrintf ("\n");
765 
766         /* Match signature and dispatch appropriately */
767 
768         TableData = AcpiDmGetTableData (Table->Signature);
769         if (!TableData)
770         {
771             if (!strncmp (Table->Signature, "OEM", 3))
772             {
773                 AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
774                     Table->Signature);
775             }
776             else
777             {
778                 AcpiOsPrintf ("\n**** Unknown ACPI table signature [%4.4s]\n\n",
779                     Table->Signature);
780 
781                 fprintf (stderr, "Unknown ACPI table signature [%4.4s], ",
782                     Table->Signature);
783 
784                 if (!AcpiGbl_ForceAmlDisassembly)
785                 {
786                     fprintf (stderr, "decoding ACPI table header only\n");
787                 }
788                 else
789                 {
790                     fprintf (stderr, "assuming table contains valid AML code\n");
791                 }
792             }
793         }
794         else if (TableData->TableHandler)
795         {
796             /* Complex table, has a handler */
797 
798             TableData->TableHandler (Table);
799         }
800         else if (TableData->TableInfo)
801         {
802             /* Simple table, just walk the info table */
803 
804             Status = AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
805             if (ACPI_FAILURE (Status))
806             {
807                 return;
808             }
809         }
810     }
811 
812     if (!AslGbl_DoTemplates || AslGbl_VerboseTemplates)
813     {
814         /* Dump the raw table data */
815 
816         AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
817             ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
818         AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
819             Length, DB_BYTE_DISPLAY, 0);
820     }
821 }
822 
823 
824 /*******************************************************************************
825  *
826  * FUNCTION:    AcpiDmLineHeader
827  *
828  * PARAMETERS:  Offset              - Current byte offset, from table start
829  *              ByteLength          - Length of the field in bytes, 0 for flags
830  *              Name                - Name of this field
831  *
832  * RETURN:      None
833  *
834  * DESCRIPTION: Utility routines for formatting output lines. Displays the
835  *              current table offset in hex and decimal, the field length,
836  *              and the field name.
837  *
838  ******************************************************************************/
839 
840 void
AcpiDmLineHeader(UINT32 Offset,UINT32 ByteLength,char * Name)841 AcpiDmLineHeader (
842     UINT32                  Offset,
843     UINT32                  ByteLength,
844     char                    *Name)
845 {
846 
847     /* Allow a null name for fields that span multiple lines (large buffers) */
848 
849     if (!Name)
850     {
851         Name = "";
852     }
853 
854     if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */
855     {
856         if (ByteLength)
857         {
858             AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name);
859         }
860         else
861         {
862             if (*Name)
863             {
864                 AcpiOsPrintf ("%41s : ", Name);
865             }
866             else
867             {
868                 AcpiOsPrintf ("%41s   ", Name);
869             }
870         }
871     }
872     else /* Normal disassembler or verbose template */
873     {
874         if (ByteLength)
875         {
876             AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %27s : ",
877                 Offset, Offset, ByteLength, Name);
878         }
879         else
880         {
881             if (*Name)
882             {
883                 AcpiOsPrintf ("%44s : ", Name);
884             }
885             else
886             {
887                 AcpiOsPrintf ("%44s   ", Name);
888             }
889         }
890     }
891 }
892 
893 void
AcpiDmLineHeader2(UINT32 Offset,UINT32 ByteLength,char * Name,UINT32 Value)894 AcpiDmLineHeader2 (
895     UINT32                  Offset,
896     UINT32                  ByteLength,
897     char                    *Name,
898     UINT32                  Value)
899 {
900 
901     if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */
902     {
903         if (ByteLength)
904         {
905             AcpiOsPrintf ("[%.4d] %30s %3d : ",
906                 ByteLength, Name, Value);
907         }
908         else
909         {
910             AcpiOsPrintf ("%36s % 3d : ",
911                 Name, Value);
912         }
913     }
914     else /* Normal disassembler or verbose template */
915     {
916         if (ByteLength)
917         {
918             AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %24s %3d : ",
919                 Offset, Offset, ByteLength, Name, Value);
920         }
921         else
922         {
923             AcpiOsPrintf ("[%3.3Xh %4.4u   ] %24s %3d : ",
924                 Offset, Offset, Name, Value);
925         }
926     }
927 }
928 
929 
930 /*******************************************************************************
931  *
932  * FUNCTION:    AcpiDmDumpTable
933  *
934  * PARAMETERS:  TableLength         - Length of the entire ACPI table
935  *              TableOffset         - Starting offset within the table for this
936  *                                    sub-descriptor (0 if main table)
937  *              Table               - The ACPI table
938  *              SubtableLength      - Length of this sub-descriptor
939  *              Info                - Info table for this ACPI table
940  *
941  * RETURN:      Status
942  *
943  * DESCRIPTION: Display ACPI table contents by walking the Info table.
944  *
945  * Note: This function must remain in sync with DtGetFieldLength.
946  *
947  ******************************************************************************/
948 
949 ACPI_STATUS
AcpiDmDumpTable(UINT32 TableLength,UINT32 TableOffset,void * Table,UINT32 SubtableLength,ACPI_DMTABLE_INFO * Info)950 AcpiDmDumpTable (
951     UINT32                  TableLength,
952     UINT32                  TableOffset,
953     void                    *Table,
954     UINT32                  SubtableLength,
955     ACPI_DMTABLE_INFO       *Info)
956 {
957     UINT8                   *Target;
958     UINT32                  CurrentOffset;
959     UINT32                  ByteLength;
960     UINT8                   Temp8;
961     UINT16                  Temp16;
962     UINT32                  Temp32;
963     UINT64                  Value;
964     const AH_TABLE          *TableData;
965     const char              *Name;
966     BOOLEAN                 LastOutputBlankLine = FALSE;
967     ACPI_STATUS             Status;
968     char                    RepairedName[8];
969 
970 
971     if (!Info)
972     {
973         AcpiOsPrintf ("Display not implemented\n");
974         return (AE_NOT_IMPLEMENTED);
975     }
976 
977     /* Walk entire Info table; Null name terminates */
978 
979     for (; Info->Name; Info++)
980     {
981         /*
982          * Target points to the field within the ACPI Table. CurrentOffset is
983          * the offset of the field from the start of the main table.
984          */
985         Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
986         CurrentOffset = TableOffset + Info->Offset;
987 
988         /* Check for beyond subtable end or (worse) beyond EOT */
989 
990         if (SubtableLength && (Info->Offset > SubtableLength))
991         {
992             AcpiOsPrintf (
993                 "/**** ACPI subtable terminates early (Len %u) - "
994                 "may be older version (dump table) */\n", SubtableLength);
995 
996             /* Move on to next subtable */
997 
998             return (AE_OK);
999         }
1000 
1001         if (CurrentOffset >= TableLength)
1002         {
1003             AcpiOsPrintf (
1004                 "/**** ACPI table terminates "
1005                 "in the middle of a data structure! (dump table) \n"
1006                 "CurrentOffset: %X, TableLength: %X ***/", CurrentOffset, TableLength);
1007             return (AE_BAD_DATA);
1008         }
1009 
1010         /* Generate the byte length for this field */
1011 
1012         switch (Info->Opcode)
1013         {
1014         case ACPI_DMT_UINT8:
1015         case ACPI_DMT_CHKSUM:
1016         case ACPI_DMT_SPACEID:
1017         case ACPI_DMT_ACCWIDTH:
1018         case ACPI_DMT_CEDT:
1019         case ACPI_DMT_IVRS:
1020         case ACPI_DMT_IVRS_DE:
1021         case ACPI_DMT_GTDT:
1022         case ACPI_DMT_MADT:
1023         case ACPI_DMT_NHLT1:
1024         case ACPI_DMT_NHLT1a:
1025         case ACPI_DMT_NHLT1b:
1026         case ACPI_DMT_NHLT1c:
1027         case ACPI_DMT_NHLT1d:
1028         case ACPI_DMT_NHLT1f:
1029         case ACPI_DMT_PCCT:
1030         case ACPI_DMT_PMTT:
1031         case ACPI_DMT_PPTT:
1032         case ACPI_DMT_RGRT:
1033         case ACPI_DMT_SDEV:
1034         case ACPI_DMT_SRAT:
1035         case ACPI_DMT_AEST:
1036         case ACPI_DMT_AEST_RES:
1037         case ACPI_DMT_AEST_XFACE:
1038         case ACPI_DMT_AEST_XRUPT:
1039         case ACPI_DMT_ASF:
1040         case ACPI_DMT_CDAT:
1041         case ACPI_DMT_HESTNTYP:
1042         case ACPI_DMT_FADTPM:
1043         case ACPI_DMT_EINJACT:
1044         case ACPI_DMT_EINJINST:
1045         case ACPI_DMT_ERSTACT:
1046         case ACPI_DMT_ERSTINST:
1047         case ACPI_DMT_DMAR_SCOPE:
1048         case ACPI_DMT_VIOT:
1049 
1050             ByteLength = 1;
1051             break;
1052 
1053         case ACPI_DMT_UINT16:
1054         case ACPI_DMT_DMAR:
1055         case ACPI_DMT_HEST:
1056         case ACPI_DMT_HMAT:
1057         case ACPI_DMT_NFIT:
1058         case ACPI_DMT_NHLT1e:
1059         case ACPI_DMT_PHAT:
1060 
1061             ByteLength = 2;
1062             break;
1063 
1064         case ACPI_DMT_UINT24:
1065 
1066             ByteLength = 3;
1067             break;
1068 
1069         case ACPI_DMT_UINT32:
1070         case ACPI_DMT_AEST_CACHE:
1071         case ACPI_DMT_AEST_GIC:
1072         case ACPI_DMT_NAME4:
1073         case ACPI_DMT_SIG:
1074         case ACPI_DMT_LPIT:
1075         case ACPI_DMT_TPM2:
1076 
1077             ByteLength = 4;
1078             break;
1079 
1080         case ACPI_DMT_UINT40:
1081 
1082             ByteLength = 5;
1083             break;
1084 
1085         case ACPI_DMT_UINT48:
1086         case ACPI_DMT_NAME6:
1087 
1088             ByteLength = 6;
1089             break;
1090 
1091         case ACPI_DMT_UINT56:
1092         case ACPI_DMT_BUF7:
1093 
1094             ByteLength = 7;
1095             break;
1096 
1097         case ACPI_DMT_UINT64:
1098         case ACPI_DMT_NAME8:
1099 
1100             ByteLength = 8;
1101             break;
1102 
1103         case ACPI_DMT_BUF10:
1104 
1105             ByteLength = 10;
1106             break;
1107 
1108         case ACPI_DMT_BUF12:
1109 
1110             ByteLength = 12;
1111             break;
1112 
1113         case ACPI_DMT_BUF16:
1114         case ACPI_DMT_UUID:
1115 
1116             ByteLength = 16;
1117             break;
1118 
1119         case ACPI_DMT_BUF18:
1120 
1121             ByteLength = 18;
1122             break;
1123 
1124         case ACPI_DMT_BUF128:
1125 
1126             ByteLength = 128;
1127             break;
1128 
1129         case ACPI_DMT_WPBT_UNICODE:
1130 
1131             ByteLength = SubtableLength;
1132             CurrentOffset = sizeof (ACPI_TABLE_WPBT);
1133             break;
1134 
1135         case ACPI_DMT_UNICODE:
1136         case ACPI_DMT_BUFFER:
1137         case ACPI_DMT_RAW_BUFFER:
1138 
1139             ByteLength = SubtableLength;
1140             break;
1141 
1142         case ACPI_DMT_PMTT_VENDOR:
1143             /*
1144              * Calculate the length of the vendor data for the PMTT table:
1145              * Length = (Current Subtable ptr + Subtable length) -
1146              *          Start of the vendor data (Target)
1147              */
1148             ByteLength = ((ACPI_CAST_PTR (char, Table) +
1149                             (ACPI_CAST_PTR (ACPI_PMTT_HEADER, Table)->Length)) -
1150                             ACPI_CAST_PTR (char, Target));
1151             break;
1152 
1153         case ACPI_DMT_STRING:
1154 
1155             ByteLength = strlen (ACPI_CAST_PTR (char, Target)) + 1;
1156             break;
1157 
1158         case ACPI_DMT_IVRS_UNTERMINATED_STRING:
1159 
1160             ByteLength = ((ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, Target) -1)->UidLength);
1161             break;
1162 
1163         case ACPI_DMT_GAS:
1164 
1165             if (!LastOutputBlankLine)
1166             {
1167                 AcpiOsPrintf ("\n");
1168                 LastOutputBlankLine = TRUE;
1169             }
1170 
1171             ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
1172             break;
1173 
1174         case ACPI_DMT_HESTNTFY:
1175 
1176             if (!LastOutputBlankLine)
1177             {
1178                 AcpiOsPrintf ("\n");
1179                 LastOutputBlankLine = TRUE;
1180             }
1181 
1182             ByteLength = sizeof (ACPI_HEST_NOTIFY);
1183             break;
1184 
1185         case ACPI_DMT_IORTMEM:
1186 
1187             if (!LastOutputBlankLine)
1188             {
1189                 LastOutputBlankLine = FALSE;
1190             }
1191 
1192             ByteLength = sizeof (ACPI_IORT_MEMORY_ACCESS);
1193             break;
1194 
1195         default:
1196 
1197             ByteLength = 0;
1198             break;
1199         }
1200 
1201         /* Check if we are beyond a subtable, or (worse) beyond EOT */
1202 
1203         if (CurrentOffset + ByteLength > TableLength)
1204         {
1205             if (SubtableLength)
1206             {
1207                 AcpiOsPrintf (
1208                     "/**** ACPI subtable terminates early - "
1209                     "may be older version (dump table) */\n");
1210 
1211                 /* Move on to next subtable */
1212 
1213                 return (AE_OK);
1214             }
1215 
1216             AcpiOsPrintf (
1217                 "/**** ACPI table terminates "
1218                 "in the middle of a data structure! */\n");
1219             return (AE_BAD_DATA);
1220         }
1221 
1222         if (Info->Opcode == ACPI_DMT_EXTRA_TEXT)
1223         {
1224             AcpiOsPrintf ("%s", Info->Name);
1225             continue;
1226         }
1227 
1228         /* Start a new line and decode the opcode */
1229 
1230         AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
1231 
1232         switch (Info->Opcode)
1233         {
1234         /* Single-bit Flag fields. Note: Opcode is the bit position */
1235 
1236         case ACPI_DMT_FLAG0:
1237         case ACPI_DMT_FLAG1:
1238         case ACPI_DMT_FLAG2:
1239         case ACPI_DMT_FLAG3:
1240         case ACPI_DMT_FLAG4:
1241         case ACPI_DMT_FLAG5:
1242         case ACPI_DMT_FLAG6:
1243         case ACPI_DMT_FLAG7:
1244 
1245             AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
1246             break;
1247 
1248         /* 2-bit Flag fields */
1249 
1250         case ACPI_DMT_FLAGS0:
1251 
1252             AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
1253             break;
1254 
1255         case ACPI_DMT_FLAGS1:
1256 
1257             AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03);
1258             break;
1259 
1260         case ACPI_DMT_FLAGS2:
1261 
1262             AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
1263             break;
1264 
1265         case ACPI_DMT_FLAGS8_2:
1266 
1267             AcpiOsPrintf ("%2.2X\n", (*Target >> 2) & 0xFF);
1268             break;
1269 
1270 	case ACPI_DMT_FLAGS4:
1271 
1272             AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03);
1273             break;
1274 
1275         case ACPI_DMT_FLAGS4_0:
1276 
1277             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target) & 0x0F);
1278             break;
1279 
1280         case ACPI_DMT_FLAGS4_4:
1281 
1282             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 4) & 0x0F);
1283             break;
1284 
1285         case ACPI_DMT_FLAGS4_8:
1286 
1287             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 8) & 0x0F);
1288             break;
1289 
1290         case ACPI_DMT_FLAGS4_12:
1291 
1292             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 12) & 0x0F);
1293             break;
1294 
1295         case ACPI_DMT_FLAGS16_16:
1296 
1297             AcpiOsPrintf ("%4.4X\n", (*(UINT32 *)Target >> 16) & 0xFFFF);
1298             break;
1299 
1300         /* Integer Data Types */
1301 
1302         case ACPI_DMT_UINT8:
1303         case ACPI_DMT_UINT16:
1304         case ACPI_DMT_UINT24:
1305         case ACPI_DMT_UINT32:
1306         case ACPI_DMT_UINT40:
1307         case ACPI_DMT_UINT48:
1308         case ACPI_DMT_UINT56:
1309         case ACPI_DMT_UINT64:
1310             /*
1311              * Dump bytes - high byte first, low byte last.
1312              * Note: All ACPI tables are little-endian.
1313              */
1314             Value = 0;
1315             for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--)
1316             {
1317                 AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]);
1318                 Value |= Target[Temp8 - 1];
1319                 Value <<= 8;
1320             }
1321 
1322             if (!Value && (Info->Flags & DT_DESCRIBES_OPTIONAL))
1323             {
1324                 AcpiOsPrintf (" [Optional field not present]");
1325             }
1326 
1327             AcpiOsPrintf ("\n");
1328             break;
1329 
1330         case ACPI_DMT_BUF7:
1331         case ACPI_DMT_BUF10:
1332         case ACPI_DMT_BUF12:
1333         case ACPI_DMT_BUF16:
1334         case ACPI_DMT_BUF18:
1335         case ACPI_DMT_BUF128:
1336             /*
1337              * Buffer: Size depends on the opcode and was set above.
1338              * Each hex byte is separated with a space.
1339              * Multiple lines are separated by line continuation char.
1340              */
1341             for (Temp16 = 0; Temp16 < ByteLength; Temp16++)
1342             {
1343                 AcpiOsPrintf ("%2.2X", Target[Temp16]);
1344                 if ((UINT32) (Temp16 + 1) < ByteLength)
1345                 {
1346                     if ((Temp16 > 0) && (!((Temp16+1) % 16)))
1347                     {
1348                         AcpiOsPrintf (" \\\n"); /* Line continuation */
1349                         AcpiDmLineHeader (0, 0, NULL);
1350                     }
1351                     else
1352                     {
1353                         AcpiOsPrintf (" ");
1354                     }
1355                 }
1356             }
1357 
1358             AcpiOsPrintf ("\n");
1359             break;
1360 
1361         case ACPI_DMT_UUID:
1362 
1363             /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */
1364 
1365             (void) AcpiUtConvertUuidToString ((char *) Target, AslGbl_MsgBuffer);
1366 
1367             AcpiOsPrintf ("%s\n", AslGbl_MsgBuffer);
1368             break;
1369 
1370         case ACPI_DMT_STRING:
1371 
1372             AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target));
1373             break;
1374 
1375         case ACPI_DMT_IVRS_UNTERMINATED_STRING:
1376 
1377             AcpiOsPrintf ("\"%.*s\"\n", ByteLength, ACPI_CAST_PTR (char, Target));
1378             break;
1379 
1380         /* Fixed length ASCII name fields */
1381 
1382         case ACPI_DMT_SIG:
1383 
1384             AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
1385             AcpiOsPrintf ("\"%.4s\"    ", RepairedName);
1386 
1387             TableData = AcpiAhGetTableInfo (ACPI_CAST_PTR (char, Target));
1388             if (TableData)
1389             {
1390                 AcpiOsPrintf (STRING_FORMAT, TableData->Description);
1391             }
1392             else
1393             {
1394                 AcpiOsPrintf ("\n");
1395             }
1396             break;
1397 
1398         case ACPI_DMT_NAME4:
1399 
1400             AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
1401             AcpiOsPrintf ("\"%.4s\"\n", RepairedName);
1402             break;
1403 
1404         case ACPI_DMT_NAME6:
1405 
1406             AcpiUtCheckAndRepairAscii (Target, RepairedName, 6);
1407             AcpiOsPrintf ("\"%.6s\"\n", RepairedName);
1408             break;
1409 
1410         case ACPI_DMT_NAME8:
1411 
1412             AcpiUtCheckAndRepairAscii (Target, RepairedName, 8);
1413             AcpiOsPrintf ("\"%.8s\"\n", RepairedName);
1414             break;
1415 
1416         /* Special Data Types */
1417 
1418         case ACPI_DMT_CHKSUM:
1419 
1420             /* Checksum, display and validate */
1421 
1422             AcpiOsPrintf ("%2.2X", *Target);
1423             Temp8 = AcpiUtGenerateChecksum (Table,
1424                 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
1425                 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
1426 
1427             if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
1428             {
1429                 AcpiOsPrintf (
1430                     "     /* Incorrect checksum, should be %2.2X */", Temp8);
1431             }
1432 
1433             AcpiOsPrintf ("\n");
1434             break;
1435 
1436         case ACPI_DMT_SPACEID:
1437 
1438             /* Address Space ID */
1439 
1440             AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target));
1441             break;
1442 
1443         case ACPI_DMT_ACCWIDTH:
1444 
1445             /* Encoded Access Width */
1446 
1447             Temp8 = *Target;
1448             if (Temp8 > ACPI_GAS_WIDTH_RESERVED)
1449             {
1450                 Temp8 = ACPI_GAS_WIDTH_RESERVED;
1451             }
1452 
1453             AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmGasAccessWidth[Temp8]);
1454             break;
1455 
1456         case ACPI_DMT_GAS:
1457 
1458             /* Generic Address Structure */
1459 
1460             AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure");
1461             Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1462                 sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas);
1463             if (ACPI_FAILURE (Status))
1464             {
1465                 return (Status);
1466             }
1467 
1468             AcpiOsPrintf ("\n");
1469             LastOutputBlankLine = TRUE;
1470             break;
1471 
1472         case ACPI_DMT_AEST:
1473 
1474             /* AEST subtable types */
1475 
1476             Temp8 = *Target;
1477             if (Temp8 > ACPI_AEST_NODE_TYPE_RESERVED)
1478             {
1479                 Temp8 = ACPI_AEST_NODE_TYPE_RESERVED;
1480             }
1481 
1482             AcpiOsPrintf (UINT8_FORMAT, *Target,
1483                 AcpiDmAestSubnames[Temp8]);
1484             break;
1485 
1486         case ACPI_DMT_AEST_CACHE:
1487 
1488             /* AEST cache resource subtable */
1489 
1490             Temp32 = *Target;
1491             if (Temp32 > ACPI_AEST_CACHE_RESERVED)
1492             {
1493                 Temp32 = ACPI_AEST_CACHE_RESERVED;
1494             }
1495 
1496             AcpiOsPrintf (UINT32_FORMAT, *Target,
1497                 AcpiDmAestCacheNames[Temp32]);
1498             break;
1499 
1500         case ACPI_DMT_AEST_GIC:
1501 
1502             /* AEST GIC error subtable */
1503 
1504             Temp32 = *Target;
1505             if (Temp32 > ACPI_AEST_GIC_RESERVED)
1506             {
1507                 Temp32 = ACPI_AEST_GIC_RESERVED;
1508             }
1509 
1510             AcpiOsPrintf (UINT32_FORMAT, *Target,
1511                 AcpiDmAestGicNames[Temp32]);
1512             break;
1513 
1514         case ACPI_DMT_AEST_RES:
1515 
1516             /* AEST resource type subtable */
1517 
1518             Temp8 = *Target;
1519             if (Temp8 > ACPI_AEST_RESOURCE_RESERVED)
1520             {
1521                 Temp8 = ACPI_AEST_RESOURCE_RESERVED;
1522             }
1523 
1524             AcpiOsPrintf (UINT8_FORMAT, *Target,
1525                 AcpiDmAestResourceNames[Temp8]);
1526             break;
1527 
1528         case ACPI_DMT_AEST_XFACE:
1529 
1530             /* AEST interface structure types */
1531 
1532             Temp8 = *Target;
1533             if (Temp8 > ACPI_AEST_XFACE_RESERVED)
1534             {
1535                 Temp8 = ACPI_AEST_XFACE_RESERVED;
1536             }
1537 
1538             AcpiOsPrintf (UINT8_FORMAT, *Target,
1539                 AcpiDmAestXfaceNames[Temp8]);
1540             break;
1541 
1542         case ACPI_DMT_AEST_XRUPT:
1543 
1544             /* AEST interrupt structure types */
1545 
1546             Temp8 = *Target;
1547             if (Temp8 > ACPI_AEST_XRUPT_RESERVED)
1548             {
1549                 Temp8 = ACPI_AEST_XRUPT_RESERVED;
1550             }
1551 
1552             AcpiOsPrintf (UINT8_FORMAT, *Target,
1553                 AcpiDmAestXruptNames[Temp8]);
1554             break;
1555 
1556         case ACPI_DMT_ASF:
1557 
1558             /* ASF subtable types */
1559 
1560             Temp16 = (UINT16) ((*Target) & 0x7F);  /* Top bit can be zero or one */
1561             if (Temp16 > ACPI_ASF_TYPE_RESERVED)
1562             {
1563                 Temp16 = ACPI_ASF_TYPE_RESERVED;
1564             }
1565 
1566             AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]);
1567             break;
1568 
1569         case ACPI_DMT_CDAT:
1570 
1571             /* CDAT subtable types */
1572 
1573             Temp8 = *Target;
1574             if (Temp8 > ACPI_CDAT_TYPE_RESERVED)
1575             {
1576                 Temp8 = ACPI_CDAT_TYPE_RESERVED;
1577             }
1578 
1579             AcpiOsPrintf (UINT8_FORMAT, *Target,
1580                 AcpiDmCdatSubnames[Temp8]);
1581             break;
1582 
1583         case ACPI_DMT_CEDT:
1584 
1585             /* CEDT subtable types */
1586 
1587             Temp8 = *Target;
1588             if (Temp8 > ACPI_CEDT_TYPE_RESERVED)
1589             {
1590                 Temp8 = ACPI_CEDT_TYPE_RESERVED;
1591             }
1592 
1593             AcpiOsPrintf (UINT8_FORMAT, *Target,
1594                 AcpiDmCedtSubnames[Temp8]);
1595             break;
1596 
1597         case ACPI_DMT_DMAR:
1598 
1599             /* DMAR subtable types */
1600 
1601             Temp16 = ACPI_GET16 (Target);
1602             if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
1603             {
1604                 Temp16 = ACPI_DMAR_TYPE_RESERVED;
1605             }
1606 
1607             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1608                 AcpiDmDmarSubnames[Temp16]);
1609             break;
1610 
1611         case ACPI_DMT_DMAR_SCOPE:
1612 
1613             /* DMAR device scope types */
1614 
1615             Temp8 = *Target;
1616             if (Temp8 > ACPI_DMAR_SCOPE_TYPE_RESERVED)
1617             {
1618                 Temp8 = ACPI_DMAR_SCOPE_TYPE_RESERVED;
1619             }
1620 
1621             AcpiOsPrintf (UINT8_FORMAT, *Target,
1622                 AcpiDmDmarScope[Temp8]);
1623             break;
1624 
1625         case ACPI_DMT_EINJACT:
1626 
1627             /* EINJ Action types */
1628 
1629             Temp8 = *Target;
1630             if (Temp8 > ACPI_EINJ_ACTION_RESERVED)
1631             {
1632                 Temp8 = ACPI_EINJ_ACTION_RESERVED;
1633             }
1634 
1635             AcpiOsPrintf (UINT8_FORMAT, *Target,
1636                 AcpiDmEinjActions[Temp8]);
1637             break;
1638 
1639         case ACPI_DMT_EINJINST:
1640 
1641             /* EINJ Instruction types */
1642 
1643             Temp8 = *Target;
1644             if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED)
1645             {
1646                 Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
1647             }
1648 
1649             AcpiOsPrintf (UINT8_FORMAT, *Target,
1650                 AcpiDmEinjInstructions[Temp8]);
1651             break;
1652 
1653         case ACPI_DMT_ERSTACT:
1654 
1655             /* ERST Action types */
1656 
1657             Temp8 = *Target;
1658             if (Temp8 > ACPI_ERST_ACTION_RESERVED)
1659             {
1660                 Temp8 = ACPI_ERST_ACTION_RESERVED;
1661             }
1662 
1663             AcpiOsPrintf (UINT8_FORMAT, *Target,
1664                 AcpiDmErstActions[Temp8]);
1665             break;
1666 
1667         case ACPI_DMT_ERSTINST:
1668 
1669             /* ERST Instruction types */
1670 
1671             Temp8 = *Target;
1672             if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED)
1673             {
1674                 Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
1675             }
1676 
1677             AcpiOsPrintf (UINT8_FORMAT, *Target,
1678                 AcpiDmErstInstructions[Temp8]);
1679             break;
1680 
1681         case ACPI_DMT_GTDT:
1682 
1683             /* GTDT subtable types */
1684 
1685             Temp8 = *Target;
1686             if (Temp8 > ACPI_GTDT_TYPE_RESERVED)
1687             {
1688                 Temp8 = ACPI_GTDT_TYPE_RESERVED;
1689             }
1690 
1691             AcpiOsPrintf (UINT8_FORMAT, *Target,
1692                 AcpiDmGtdtSubnames[Temp8]);
1693             break;
1694 
1695         case ACPI_DMT_HEST:
1696 
1697             /* HEST subtable types */
1698 
1699             Temp16 = ACPI_GET16 (Target);
1700             if (Temp16 > ACPI_HEST_TYPE_RESERVED)
1701             {
1702                 Temp16 = ACPI_HEST_TYPE_RESERVED;
1703             }
1704 
1705             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1706                 AcpiDmHestSubnames[Temp16]);
1707             break;
1708 
1709         case ACPI_DMT_HESTNTFY:
1710 
1711             AcpiOsPrintf (STRING_FORMAT,
1712                 "Hardware Error Notification Structure");
1713 
1714             Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1715                 sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
1716             if (ACPI_FAILURE (Status))
1717             {
1718                 return (Status);
1719             }
1720 
1721             AcpiOsPrintf ("\n");
1722             LastOutputBlankLine = TRUE;
1723             break;
1724 
1725         case ACPI_DMT_HESTNTYP:
1726 
1727             /* HEST Notify types */
1728 
1729             Temp8 = *Target;
1730             if (Temp8 > ACPI_HEST_NOTIFY_RESERVED)
1731             {
1732                 Temp8 = ACPI_HEST_NOTIFY_RESERVED;
1733             }
1734 
1735             AcpiOsPrintf (UINT8_FORMAT, *Target,
1736                 AcpiDmHestNotifySubnames[Temp8]);
1737             break;
1738 
1739         case ACPI_DMT_HMAT:
1740 
1741             /* HMAT subtable types */
1742 
1743             Temp16 = *Target;
1744             if (Temp16 > ACPI_HMAT_TYPE_RESERVED)
1745             {
1746                 Temp16 = ACPI_HMAT_TYPE_RESERVED;
1747             }
1748 
1749             AcpiOsPrintf (UINT16_FORMAT, *Target,
1750                 AcpiDmHmatSubnames[Temp16]);
1751             break;
1752 
1753         case ACPI_DMT_IORTMEM:
1754 
1755             AcpiOsPrintf (STRING_FORMAT,
1756                 "IORT Memory Access Properties");
1757 
1758             Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1759                 sizeof (ACPI_IORT_MEMORY_ACCESS), AcpiDmTableInfoIortAcc);
1760             if (ACPI_FAILURE (Status))
1761             {
1762                 return (Status);
1763             }
1764 
1765             LastOutputBlankLine = TRUE;
1766             break;
1767 
1768         case ACPI_DMT_MADT:
1769 
1770             /* MADT subtable types */
1771 
1772             Temp8 = *Target;
1773             if ((Temp8 >= ACPI_MADT_TYPE_RESERVED) && (Temp8 < ACPI_MADT_TYPE_OEM_RESERVED))
1774             {
1775                 Temp8 = ACPI_MADT_TYPE_RESERVED;
1776             }
1777             else if (Temp8 >= ACPI_MADT_TYPE_OEM_RESERVED)
1778             {
1779                 Temp8 = ACPI_MADT_TYPE_RESERVED + 1;
1780             }
1781             AcpiOsPrintf (UINT8_FORMAT, *Target,
1782                 AcpiDmMadtSubnames[Temp8]);
1783             break;
1784 
1785         case ACPI_DMT_NFIT:
1786 
1787             /* NFIT subtable types */
1788 
1789             Temp16 = ACPI_GET16 (Target);
1790             if (Temp16 > ACPI_NFIT_TYPE_RESERVED)
1791             {
1792                 Temp16 = ACPI_NFIT_TYPE_RESERVED;
1793             }
1794 
1795             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1796                 AcpiDmNfitSubnames[Temp16]);
1797             break;
1798 
1799         case ACPI_DMT_NHLT1:
1800 
1801             /* NHLT link types */
1802 
1803             Temp8 = *Target;
1804             if (Temp8 > ACPI_NHLT_TYPE_RESERVED)
1805             {
1806                 Temp8 = ACPI_NHLT_TYPE_RESERVED;
1807             }
1808 
1809             AcpiOsPrintf (UINT8_FORMAT, *Target,
1810                 AcpiDmNhltLinkTypeNames[Temp8]);
1811             break;
1812 
1813         case ACPI_DMT_NHLT1a:
1814 
1815             /* NHLT direction */
1816 
1817             Temp8 = *Target;
1818             if (Temp8 > ACPI_NHLT_DIR_RESERVED)
1819             {
1820                 Temp8 = ACPI_NHLT_DIR_RESERVED;
1821             }
1822 
1823             AcpiOsPrintf (UINT8_FORMAT, *Target,
1824                 AcpiDmNhltDirectionNames[Temp8]);
1825             break;
1826 
1827         case ACPI_DMT_NHLT1b:
1828 
1829             /* NHLT microphone type */
1830 
1831             Temp8 = *Target;
1832             if (Temp8 > ACPI_NHLT_MIC_RESERVED)
1833             {
1834                 Temp8 = ACPI_NHLT_MIC_RESERVED;
1835             }
1836 
1837             AcpiOsPrintf (UINT8_FORMAT, *Target,
1838                 AcpiDmNhltMicTypeNames[Temp8]);
1839             break;
1840 
1841         case ACPI_DMT_NHLT1c:
1842 
1843             /* NHLT microphone position */
1844 
1845             Temp8 = *Target;
1846             if (Temp8 > ACPI_NHLT_MIC_POSITION_RESERVED)
1847             {
1848                 Temp8 = ACPI_NHLT_MIC_POSITION_RESERVED;
1849             }
1850 
1851             AcpiOsPrintf (UINT8_FORMAT, *Target,
1852                 AcpiDmNhltMicPositionNames[Temp8]);
1853             break;
1854 
1855         case ACPI_DMT_NHLT1d:
1856 
1857             /* NHLT microphone array type */
1858 
1859             Temp8 = *Target & ACPI_NHLT_ARRAY_TYPE_MASK;
1860             if (Temp8 < ACPI_NHLT_ARRAY_TYPE_RESERVED)
1861             {
1862                 Temp8 = ACPI_NHLT_ARRAY_TYPE_RESERVED;
1863             }
1864 
1865             AcpiOsPrintf (UINT8_FORMAT_NO_NEWLINE, *Target,
1866                 AcpiDmNhltMicArrayTypeNames[Temp8 - ACPI_NHLT_ARRAY_TYPE_RESERVED]);
1867 
1868             Temp8 = *Target;
1869             if (Temp8 & ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT)
1870             {
1871                 AcpiOsPrintf (" [%s]", "SNR and Sensitivity");
1872             }
1873 
1874             AcpiOsPrintf ("\n");
1875             break;
1876 
1877         case ACPI_DMT_NHLT1e:
1878 
1879             /* NHLT Endpoint Device ID */
1880 
1881             Temp16 = ACPI_GET16 (Target);
1882             if (Temp16 == 0xAE20)
1883             {
1884                 Name = "PDM DMIC";
1885             }
1886             else if (Temp16 == 0xAE30)
1887             {
1888                 Name = "BT Sideband";
1889             }
1890             else if (Temp16 == 0xAE34)
1891             {
1892                 Name = "I2S/TDM Codecs";
1893             }
1894             else
1895             {
1896                 Name = "Unknown Device ID";
1897             }
1898 
1899             AcpiOsPrintf (UINT16_FORMAT, Temp16, Name);
1900             break;
1901 
1902         case ACPI_DMT_NHLT1f:
1903 
1904             /* NHLT ConfigType field */
1905 
1906             Temp8 = *Target;
1907             if (Temp8 > ACPI_NHLT_CONFIG_TYPE_RESERVED)
1908             {
1909                 Temp8 = ACPI_NHLT_CONFIG_TYPE_RESERVED;
1910             }
1911 
1912             AcpiOsPrintf (UINT8_FORMAT, *Target,
1913                 AcpiDmNhltConfigTypeNames[Temp8]);
1914             break;
1915 
1916         case ACPI_DMT_PCCT:
1917 
1918             /* PCCT subtable types */
1919 
1920             Temp8 = *Target;
1921             if (Temp8 > ACPI_PCCT_TYPE_RESERVED)
1922             {
1923                 Temp8 = ACPI_PCCT_TYPE_RESERVED;
1924             }
1925 
1926             AcpiOsPrintf (UINT8_FORMAT, *Target,
1927                 AcpiDmPcctSubnames[Temp8]);
1928             break;
1929 
1930         case ACPI_DMT_PHAT:
1931 
1932             /* PHAT subtable types */
1933 
1934             Temp16 = ACPI_GET16 (Target);
1935             if (Temp16 > ACPI_PHAT_TYPE_RESERVED)
1936             {
1937                 Temp16 = ACPI_PHAT_TYPE_RESERVED;
1938             }
1939 
1940             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1941                 AcpiDmPhatSubnames[Temp16]);
1942             break;
1943 
1944         case ACPI_DMT_PMTT:
1945 
1946             /* PMTT subtable types */
1947 
1948             Temp8 = *Target;
1949             if (Temp8 == ACPI_PMTT_TYPE_VENDOR)
1950             {
1951                 Temp8 = ACPI_PMTT_TYPE_RESERVED + 1;
1952             }
1953             else if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
1954             {
1955                 Temp8 = ACPI_PMTT_TYPE_RESERVED;
1956             }
1957             AcpiOsPrintf (UINT8_FORMAT, *Target,
1958                 AcpiDmPmttSubnames[Temp8]);
1959             break;
1960 
1961         case ACPI_DMT_PPTT:
1962 
1963             /* PPTT subtable types */
1964 
1965             Temp8 = *Target;
1966             if (Temp8 > ACPI_PPTT_TYPE_RESERVED)
1967             {
1968                 Temp8 = ACPI_PPTT_TYPE_RESERVED;
1969             }
1970 
1971             AcpiOsPrintf (UINT8_FORMAT, *Target,
1972                 AcpiDmPpttSubnames[Temp8]);
1973             break;
1974 
1975         case ACPI_DMT_UNICODE:
1976         case ACPI_DMT_WPBT_UNICODE:
1977 
1978             if (ByteLength == 0)
1979             {
1980                 AcpiOsPrintf ("/* Zero-length Data */\n");
1981                 break;
1982             }
1983 
1984             AcpiDmDumpUnicode (Table, 0, ByteLength);
1985             break;
1986 
1987         case ACPI_DMT_RAW_BUFFER:
1988         case ACPI_DMT_BUFFER:
1989         case ACPI_DMT_PMTT_VENDOR:
1990 
1991             if (ByteLength == 0)
1992             {
1993                 AcpiOsPrintf ("/* Zero-length Data */\n");
1994                 break;
1995             }
1996 
1997             AcpiDmDumpBuffer (Target, 0, ByteLength, CurrentOffset, NULL);
1998             break;
1999 
2000         case ACPI_DMT_RGRT:
2001 
2002             /* RGRT subtable types */
2003 
2004             Temp8 = *Target;
2005             if (Temp8 >= ACPI_RGRT_TYPE_RESERVED)
2006             {
2007                 Temp8 = ACPI_RGRT_TYPE_RESERVED0;
2008             }
2009 
2010             AcpiOsPrintf (UINT8_FORMAT, *Target,
2011                 AcpiDmRgrtSubnames[Temp8]);
2012             break;
2013 
2014         case ACPI_DMT_SDEV:
2015 
2016             /* SDEV subtable types */
2017 
2018             Temp8 = *Target;
2019             if (Temp8 > ACPI_SDEV_TYPE_RESERVED)
2020             {
2021                 Temp8 = ACPI_SDEV_TYPE_RESERVED;
2022             }
2023 
2024             AcpiOsPrintf (UINT8_FORMAT, *Target,
2025                 AcpiDmSdevSubnames[Temp8]);
2026             break;
2027 
2028         case ACPI_DMT_SRAT:
2029 
2030             /* SRAT subtable types */
2031 
2032             Temp8 = *Target;
2033             if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
2034             {
2035                 Temp8 = ACPI_SRAT_TYPE_RESERVED;
2036             }
2037 
2038             AcpiOsPrintf (UINT8_FORMAT, *Target,
2039                 AcpiDmSratSubnames[Temp8]);
2040             break;
2041 
2042         case ACPI_DMT_TPM2:
2043 
2044             /* TPM2 Start Method types */
2045 
2046             Temp8 = *Target;
2047             if (Temp8 > ACPI_TPM2_RESERVED)
2048             {
2049                 Temp8 = ACPI_TPM2_RESERVED;
2050             }
2051 
2052             AcpiOsPrintf (UINT8_FORMAT, *Target,
2053                 AcpiDmTpm2Subnames[Temp8]);
2054             break;
2055 
2056 
2057         case ACPI_DMT_FADTPM:
2058 
2059             /* FADT Preferred PM Profile names */
2060 
2061             Temp8 = *Target;
2062             if (Temp8 > ACPI_FADT_PM_RESERVED)
2063             {
2064                 Temp8 = ACPI_FADT_PM_RESERVED;
2065             }
2066 
2067             AcpiOsPrintf (UINT8_FORMAT, *Target,
2068                 AcpiDmFadtProfiles[Temp8]);
2069             break;
2070 
2071         case ACPI_DMT_IVRS:
2072 
2073             /* IVRS subtable types */
2074 
2075             Temp8 = *Target;
2076             switch (Temp8)
2077             {
2078             case ACPI_IVRS_TYPE_HARDWARE1:
2079             case ACPI_IVRS_TYPE_HARDWARE2:
2080 
2081                 Name = AcpiDmIvrsSubnames[0];
2082                 break;
2083 
2084             case ACPI_IVRS_TYPE_HARDWARE3:
2085 
2086                 Name = AcpiDmIvrsSubnames[1];
2087                 break;
2088 
2089             case ACPI_IVRS_TYPE_MEMORY1:
2090             case ACPI_IVRS_TYPE_MEMORY2:
2091             case ACPI_IVRS_TYPE_MEMORY3:
2092 
2093                 Name = AcpiDmIvrsSubnames[2];
2094                 break;
2095 
2096             default:
2097 
2098                 Name = AcpiDmIvrsSubnames[3];
2099                 break;
2100             }
2101 
2102             AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
2103             break;
2104 
2105         case ACPI_DMT_IVRS_DE:
2106 
2107             /* IVRS device entry types */
2108 
2109             Temp8 = *Target;
2110             switch (Temp8)
2111             {
2112             case ACPI_IVRS_TYPE_ALL:
2113             case ACPI_IVRS_TYPE_SELECT:
2114             case ACPI_IVRS_TYPE_START:
2115             case ACPI_IVRS_TYPE_END:
2116 
2117                 Name = AcpiDmIvrsDevEntryNames[Temp8];
2118                 break;
2119 
2120             case ACPI_IVRS_TYPE_ALIAS_SELECT:
2121             case ACPI_IVRS_TYPE_ALIAS_START:
2122             case ACPI_IVRS_TYPE_EXT_SELECT:
2123             case ACPI_IVRS_TYPE_EXT_START:
2124             case ACPI_IVRS_TYPE_SPECIAL:
2125 
2126                 Name = AcpiDmIvrsDevEntryNames[Temp8 - 61];
2127                 break;
2128 
2129             case ACPI_IVRS_TYPE_HID:
2130 
2131                 Name = AcpiDmIvrsDevEntryNames[Temp8 - 228];
2132                 break;
2133 
2134             default:
2135                 Name = AcpiDmIvrsDevEntryNames[0];  /* Unknown/Reserved */
2136                 break;
2137             }
2138 
2139             AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
2140             break;
2141 
2142         case ACPI_DMT_LPIT:
2143 
2144             /* LPIT subtable types */
2145 
2146             Temp32 = ACPI_GET32 (Target);
2147             if (Temp32 > ACPI_LPIT_TYPE_RESERVED)
2148             {
2149                 Temp32 = ACPI_LPIT_TYPE_RESERVED;
2150             }
2151 
2152             AcpiOsPrintf (UINT32_FORMAT, ACPI_GET32 (Target),
2153                 AcpiDmLpitSubnames[Temp32]);
2154             break;
2155 
2156         case ACPI_DMT_VIOT:
2157 
2158             /* VIOT subtable types */
2159 
2160             Temp8 = *Target;
2161             if (Temp8 > ACPI_VIOT_RESERVED)
2162             {
2163                 Temp8 = ACPI_VIOT_RESERVED;
2164             }
2165 
2166             AcpiOsPrintf (UINT8_FORMAT, *Target,
2167                 AcpiDmViotSubnames[Temp8]);
2168             break;
2169 
2170         case ACPI_DMT_EXIT:
2171 
2172             return (AE_OK);
2173 
2174         default:
2175 
2176             ACPI_ERROR ((AE_INFO,
2177                 "**** Invalid table opcode [0x%X] ****\n", Info->Opcode));
2178             return (AE_SUPPORT);
2179         }
2180     }
2181 
2182     if (TableOffset && !SubtableLength)
2183     {
2184         /*
2185          * If this table is not the main table, the subtable must have a
2186          * valid length
2187          */
2188         AcpiOsPrintf ("Invalid zero length subtable\n");
2189         return (AE_BAD_DATA);
2190     }
2191 
2192     return (AE_OK);
2193 }
2194