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