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
55const AH_TABLE *
56AcpiAhGetTableInfo (
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
70static const char           *AcpiDmAestResourceNames[] =
71{
72    "Cache Resource",
73    "TLB Resource",
74    "Generic Resource",
75    "Unknown Resource Type"         /* Reserved */
76};
77
78static 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
88static const char           *AcpiDmAestCacheNames[] =
89{
90    "Data Cache",
91    "Instruction Cache",
92    "Unified Cache",
93    "Unknown Cache Type"            /* Reserved */
94};
95
96static const char           *AcpiDmAestGicNames[] =
97{
98    "GIC CPU",
99    "GIC Distributor",
100    "GIC Redistributor",
101    "GIC ITS",
102    "Unknown GIC Interface Type"    /* Reserved */
103};
104
105static const char           *AcpiDmAestXfaceNames[] =
106{
107    "System Register Interface",
108    "Memory Mapped Interface",
109    "Unknown Interface Type"        /* Reserved */
110};
111
112static const char           *AcpiDmAestXruptNames[] =
113{
114    "Fault Handling Interrupt",
115    "Error Recovery Interrupt",
116    "Unknown Interrupt Type"        /* Reserved */
117};
118
119static 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
129static 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
137static 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
148static const char           *AcpiDmCedtSubnames[] =
149{
150    "CXL Host Bridge Structure",
151    "CXL Fixed Memory Window Structure",
152    "Unknown Subtable Type"         /* Reserved */
153};
154
155static 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
166static 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
177static 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
192static 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
203static 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
225static 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
249static const char           *AcpiDmGtdtSubnames[] =
250{
251    "Generic Timer Block",
252    "Generic Watchdog Timer",
253    "Unknown Subtable Type"         /* Reserved */
254};
255
256static 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
273static 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
290static 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
298static 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
332static 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
343static 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
356static 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
367static 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
376static 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
389static 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
400static 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
411static 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
420static 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
431static 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
438static 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
447static 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
455static const char           *AcpiDmRgrtSubnames[] =
456{
457    "Unknown/Reserved Image Type",  /* ACPI_RGRT_TYPE_RESERVED0 */
458    "Type PNG"                      /* ACPI_RGRT_IMAGE_TYPE_PNG */
459};
460
461static 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
468static 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
480static 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
497static 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
505static 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
523static const char           *AcpiDmLpitSubnames[] =
524{
525    "Native C-state Idle Structure",
526    "Unknown Subtable Type"         /* Reserved */
527};
528
529static 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
541static 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
557static 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
567static 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
592const 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
683const ACPI_DMTABLE_DATA *
684AcpiDmGetTableData (
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
715void
716AcpiDmDumpDataTable (
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
874void
875AcpiDmLineHeader (
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
927void
928AcpiDmLineHeader2 (
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
983ACPI_STATUS
984AcpiDmDumpTable (
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