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