xref: /netbsd-src/sys/external/bsd/acpica/dist/common/dmtable.c (revision 82d56013d7b633d116a93943de88e08335357a7c)
1 /******************************************************************************
2  *
3  * Module Name: dmtable - Support for ACPI tables that contain no AML code
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2021, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #include "acpi.h"
45 #include "accommon.h"
46 #include "acdisasm.h"
47 #include "actables.h"
48 #include "aslcompiler.h"
49 
50 /* This module used for application-level code only */
51 
52 #define _COMPONENT          ACPI_CA_DISASSEMBLER
53         ACPI_MODULE_NAME    ("dmtable")
54 
55 const AH_TABLE *
56 AcpiAhGetTableInfo (
57     char                    *Signature);
58 
59 
60 /* Common format strings for commented values */
61 
62 #define UINT8_FORMAT        "%2.2X [%s]\n"
63 #define UINT16_FORMAT       "%4.4X [%s]\n"
64 #define UINT32_FORMAT       "%8.8X [%s]\n"
65 #define STRING_FORMAT       "[%s]\n"
66 
67 /* These tables map a subtable type to a description string */
68 
69 static const char           *AcpiDmAsfSubnames[] =
70 {
71     "ASF Information",
72     "ASF Alerts",
73     "ASF Remote Control",
74     "ASF RMCP Boot Options",
75     "ASF Address",
76     "Unknown Subtable Type"         /* Reserved */
77 };
78 
79 static const char           *AcpiDmCedtSubnames[] =
80 {
81     "CXL Host Bridge Structure",
82     "Unknown Subtable Type"         /* Reserved */
83 };
84 
85 static const char           *AcpiDmDmarSubnames[] =
86 {
87     "Hardware Unit Definition",
88     "Reserved Memory Region",
89     "Root Port ATS Capability",
90     "Remapping Hardware Static Affinity",
91     "ACPI Namespace Device Declaration",
92     "Unknown Subtable Type"         /* Reserved */
93 };
94 
95 static const char           *AcpiDmDmarScope[] =
96 {
97     "Reserved value",
98     "PCI Endpoint Device",
99     "PCI Bridge Device",
100     "IOAPIC Device",
101     "Message-capable HPET Device",
102     "Namespace Device",
103     "Unknown Scope Type"            /* Reserved */
104 };
105 
106 static const char           *AcpiDmEinjActions[] =
107 {
108     "Begin Operation",
109     "Get Trigger Table",
110     "Set Error Type",
111     "Get Error Type",
112     "End Operation",
113     "Execute Operation",
114     "Check Busy Status",
115     "Get Command Status",
116     "Set Error Type With Address",
117     "Get Execute Timings",
118     "Unknown Action"
119 };
120 
121 static const char           *AcpiDmEinjInstructions[] =
122 {
123     "Read Register",
124     "Read Register Value",
125     "Write Register",
126     "Write Register Value",
127     "Noop",
128     "Flush Cacheline",
129     "Unknown Instruction"
130 };
131 
132 static const char           *AcpiDmErstActions[] =
133 {
134     "Begin Write Operation",
135     "Begin Read Operation",
136     "Begin Clear Operation",
137     "End Operation",
138     "Set Record Offset",
139     "Execute Operation",
140     "Check Busy Status",
141     "Get Command Status",
142     "Get Record Identifier",
143     "Set Record Identifier",
144     "Get Record Count",
145     "Begin Dummy Write",
146     "Unused/Unknown Action",
147     "Get Error Address Range",
148     "Get Error Address Length",
149     "Get Error Attributes",
150     "Execute Timings",
151     "Unknown Action"
152 };
153 
154 static const char           *AcpiDmErstInstructions[] =
155 {
156     "Read Register",
157     "Read Register Value",
158     "Write Register",
159     "Write Register Value",
160     "Noop",
161     "Load Var1",
162     "Load Var2",
163     "Store Var1",
164     "Add",
165     "Subtract",
166     "Add Value",
167     "Subtract Value",
168     "Stall",
169     "Stall While True",
170     "Skip Next If True",
171     "GoTo",
172     "Set Source Address",
173     "Set Destination Address",
174     "Move Data",
175     "Unknown Instruction"
176 };
177 
178 static const char           *AcpiDmGtdtSubnames[] =
179 {
180     "Generic Timer Block",
181     "Generic Watchdog Timer",
182     "Unknown Subtable Type"         /* Reserved */
183 };
184 
185 static const char           *AcpiDmHestSubnames[] =
186 {
187     "IA-32 Machine Check Exception",
188     "IA-32 Corrected Machine Check",
189     "IA-32 Non-Maskable Interrupt",
190     "Unknown Subtable Type",        /* 3 - Reserved */
191     "Unknown Subtable Type",        /* 4 - Reserved */
192     "Unknown Subtable Type",        /* 5 - Reserved */
193     "PCI Express Root Port AER",
194     "PCI Express AER (AER Endpoint)",
195     "PCI Express/PCI-X Bridge AER",
196     "Generic Hardware Error Source",
197     "Generic Hardware Error Source V2",
198     "IA-32 Deferred Machine Check",
199     "Unknown Subtable Type"         /* Reserved */
200 };
201 
202 static const char           *AcpiDmHestNotifySubnames[] =
203 {
204     "Polled",
205     "External Interrupt",
206     "Local Interrupt",
207     "SCI",
208     "NMI",
209     "CMCI",                         /* ACPI 5.0 */
210     "MCE",                          /* ACPI 5.0 */
211     "GPIO",                         /* ACPI 6.0 */
212     "SEA",                          /* ACPI 6.1 */
213     "SEI",                          /* ACPI 6.1 */
214     "GSIV",                         /* ACPI 6.1 */
215     "Software Delegated Exception", /* ACPI 6.2 */
216     "Unknown Notify Type"           /* Reserved */
217 };
218 
219 static const char           *AcpiDmHmatSubnames[] =
220 {
221     "Memory Proximity Domain Attributes",
222     "System Locality Latency and Bandwidth Information",
223     "Memory Side Cache Information",
224     "Unknown Structure Type"         /* Reserved */
225 };
226 
227 static const char           *AcpiDmMadtSubnames[] =
228 {
229     "Processor Local APIC",             /* ACPI_MADT_TYPE_LOCAL_APIC */
230     "I/O APIC",                         /* ACPI_MADT_TYPE_IO_APIC */
231     "Interrupt Source Override",        /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */
232     "NMI Source",                       /* ACPI_MADT_TYPE_NMI_SOURCE */
233     "Local APIC NMI",                   /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */
234     "Local APIC Address Override",      /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */
235     "I/O SAPIC",                        /* ACPI_MADT_TYPE_IO_SAPIC */
236     "Local SAPIC",                      /* ACPI_MADT_TYPE_LOCAL_SAPIC */
237     "Platform Interrupt Sources",       /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */
238     "Processor Local x2APIC",           /* ACPI_MADT_TYPE_LOCAL_X2APIC */
239     "Local x2APIC NMI",                 /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */
240     "Generic Interrupt Controller",     /* ACPI_MADT_GENERIC_INTERRUPT */
241     "Generic Interrupt Distributor",    /* ACPI_MADT_GENERIC_DISTRIBUTOR */
242     "Generic MSI Frame",                /* ACPI_MADT_GENERIC_MSI_FRAME */
243     "Generic Interrupt Redistributor",  /* ACPI_MADT_GENERIC_REDISTRIBUTOR */
244     "Generic Interrupt Translator",     /* ACPI_MADT_GENERIC_TRANSLATOR */
245     "Unknown Subtable Type"             /* Reserved */
246 };
247 
248 static const char           *AcpiDmNfitSubnames[] =
249 {
250     "System Physical Address Range",    /* ACPI_NFIT_TYPE_SYSTEM_ADDRESS */
251     "Memory Range Map",                 /* ACPI_NFIT_TYPE_MEMORY_MAP */
252     "Interleave Info",                  /* ACPI_NFIT_TYPE_INTERLEAVE */
253     "SMBIOS Information",               /* ACPI_NFIT_TYPE_SMBIOS */
254     "NVDIMM Control Region",            /* ACPI_NFIT_TYPE_CONTROL_REGION */
255     "NVDIMM Block Data Window Region",  /* ACPI_NFIT_TYPE_DATA_REGION */
256     "Flush Hint Address",               /* ACPI_NFIT_TYPE_FLUSH_ADDRESS */
257     "Platform Capabilities",            /* ACPI_NFIT_TYPE_CAPABILITIES */
258     "Unknown Subtable Type"             /* Reserved */
259 };
260 
261 static const char           *AcpiDmPcctSubnames[] =
262 {
263     "Generic Communications Subspace",  /* ACPI_PCCT_TYPE_GENERIC_SUBSPACE */
264     "HW-Reduced Comm Subspace",         /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE */
265     "HW-Reduced Comm Subspace Type2",   /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 */
266     "Extended PCC Master Subspace",     /* ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE */
267     "Extended PCC Slave Subspace",      /* ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE */
268     "HW Registers based Comm Subspace", /* ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE */
269     "Unknown Subtable Type"             /* Reserved */
270 };
271 
272 static const char           *AcpiDmPhatSubnames[] =
273 {
274     "Firmware Version Data",        /* ACPI_PHAT_TYPE_FW_VERSION_DATA */
275     "Firmware Health Data",         /* ACPI_PHAT_TYPE_FW_HEALTH_DATA */
276     "Unknown Subtable Type"         /* Reserved */
277 };
278 
279 static const char           *AcpiDmPmttSubnames[] =
280 {
281     "Socket",                       /* ACPI_PMTT_TYPE_SOCKET */
282     "Memory Controller",            /* ACPI_PMTT_TYPE_CONTROLLER */
283     "Physical Component (DIMM)",    /* ACPI_PMTT_TYPE_DIMM */
284     "Unknown Subtable Type",        /* Reserved */
285     "Vendor Specific"               /* ACPI_PMTT_TYPE_VENDOR */
286 };
287 
288 static const char           *AcpiDmPpttSubnames[] =
289 {
290     "Processor Hierarchy Node",     /* ACPI_PPTT_TYPE_PROCESSOR */
291     "Cache Type",                   /* ACPI_PPTT_TYPE_CACHE */
292     "ID",                           /* ACPI_PPTT_TYPE_ID */
293     "Unknown Subtable Type"         /* Reserved */
294 };
295 
296 static const char           *AcpiDmSdevSubnames[] =
297 {
298     "Namespace Device",             /* ACPI_SDEV_TYPE_NAMESPACE_DEVICE */
299     "PCIe Endpoint Device",         /* ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE */
300     "Unknown Subtable Type"         /* Reserved */
301 };
302 
303 static const char           *AcpiDmSratSubnames[] =
304 {
305     "Processor Local APIC/SAPIC Affinity",
306     "Memory Affinity",
307     "Processor Local x2APIC Affinity",
308     "GICC Affinity",
309     "GIC ITS Affinity",             /* Acpi 6.2 */
310     "Generic Initiator Affinity",   /* Acpi 6.3 */
311     "Unknown Subtable Type"         /* Reserved */
312 };
313 
314 static const char           *AcpiDmTpm2Subnames[] =
315 {
316     "Illegal Start Method value",
317     "Reserved",
318     "ACPI Start Method",
319     "Reserved",
320     "Reserved",
321     "Reserved",
322     "Memory Mapped I/O",
323     "Command Response Buffer",
324     "Command Response Buffer with ACPI Start Method",
325     "Reserved",
326     "Reserved",
327     "Command Response Buffer with ARM SMC",
328     "Unknown Subtable Type"         /* Reserved */
329 };
330 
331 static const char           *AcpiDmIvrsSubnames[] =
332 {
333     "Hardware Definition Block",
334     "Memory Definition Block",
335     "Unknown Subtable Type"         /* Reserved */
336 };
337 
338 static const char           *AcpiDmLpitSubnames[] =
339 {
340     "Native C-state Idle Structure",
341     "Unknown Subtable Type"         /* Reserved */
342 };
343 
344 static const char           *AcpiDmViotSubnames[] =
345 {
346     "Unknown Subtable Type",        /* 0 -Reserved */
347     "PCI Range",
348     "MMIO Endpoint",
349     "VirtIO-PCI IOMMU",
350     "VirtIO-MMIO IOMMU",
351     "Unknown Subtable Type"         /* Reserved */
352 };
353 
354 #define ACPI_FADT_PM_RESERVED       9
355 
356 static const char           *AcpiDmFadtProfiles[] =
357 {
358     "Unspecified",
359     "Desktop",
360     "Mobile",
361     "Workstation",
362     "Enterprise Server",
363     "SOHO Server",
364     "Appliance PC",
365     "Performance Server",
366     "Tablet",
367     "Unknown Profile Type"
368 };
369 
370 #define ACPI_GAS_WIDTH_RESERVED     5
371 
372 static const char           *AcpiDmGasAccessWidth[] =
373 {
374     "Undefined/Legacy",
375     "Byte Access:8",
376     "Word Access:16",
377     "DWord Access:32",
378     "QWord Access:64",
379     "Unknown Width Encoding"
380 };
381 
382 
383 /*******************************************************************************
384  *
385  * ACPI Table Data, indexed by signature.
386  *
387  * Each entry contains: Signature, Table Info, Handler, DtHandler,
388  *  Template, Description
389  *
390  * Simple tables have only a TableInfo structure, complex tables have a
391  * handler. This table must be NULL terminated. RSDP and FACS are
392  * special-cased elsewhere.
393  *
394  * Note: Any tables added here should be duplicated within
395  * AcpiGbl_SupportedTables in the file common/ahtable.c
396  *
397  ******************************************************************************/
398 
399 const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
400 {
401     {ACPI_SIG_ASF,  NULL,                   AcpiDmDumpAsf,  DtCompileAsf,   TemplateAsf},
402     {ACPI_SIG_BERT, AcpiDmTableInfoBert,    NULL,           NULL,           TemplateBert},
403     {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt,    NULL,           NULL,           TemplateBgrt},
404     {ACPI_SIG_BOOT, AcpiDmTableInfoBoot,    NULL,           NULL,           TemplateBoot},
405     {ACPI_SIG_CEDT, NULL,                   AcpiDmDumpCedt, DtCompileCedt,  TemplateCedt},
406     {ACPI_SIG_CPEP, NULL,                   AcpiDmDumpCpep, DtCompileCpep,  TemplateCpep},
407     {ACPI_SIG_CSRT, NULL,                   AcpiDmDumpCsrt, DtCompileCsrt,  TemplateCsrt},
408     {ACPI_SIG_DBG2, AcpiDmTableInfoDbg2,    AcpiDmDumpDbg2, DtCompileDbg2,  TemplateDbg2},
409     {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp,    NULL,           NULL,           TemplateDbgp},
410     {ACPI_SIG_DMAR, NULL,                   AcpiDmDumpDmar, DtCompileDmar,  TemplateDmar},
411     {ACPI_SIG_DRTM, NULL,                   AcpiDmDumpDrtm, DtCompileDrtm,  TemplateDrtm},
412     {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt,    NULL,           NULL,           TemplateEcdt},
413     {ACPI_SIG_EINJ, NULL,                   AcpiDmDumpEinj, DtCompileEinj,  TemplateEinj},
414     {ACPI_SIG_ERST, NULL,                   AcpiDmDumpErst, DtCompileErst,  TemplateErst},
415     {ACPI_SIG_FADT, NULL,                   AcpiDmDumpFadt, DtCompileFadt,  TemplateFadt},
416     {ACPI_SIG_FPDT, NULL,                   AcpiDmDumpFpdt, DtCompileFpdt,  TemplateFpdt},
417     {ACPI_SIG_GTDT, NULL,                   AcpiDmDumpGtdt, DtCompileGtdt,  TemplateGtdt},
418     {ACPI_SIG_HEST, NULL,                   AcpiDmDumpHest, DtCompileHest,  TemplateHest},
419     {ACPI_SIG_HMAT, NULL,                   AcpiDmDumpHmat, DtCompileHmat,  TemplateHmat},
420     {ACPI_SIG_HPET, AcpiDmTableInfoHpet,    NULL,           NULL,           TemplateHpet},
421     {ACPI_SIG_IORT, NULL,                   AcpiDmDumpIort, DtCompileIort,  TemplateIort},
422     {ACPI_SIG_IVRS, NULL,                   AcpiDmDumpIvrs, DtCompileIvrs,  TemplateIvrs},
423     {ACPI_SIG_LPIT, NULL,                   AcpiDmDumpLpit, DtCompileLpit,  TemplateLpit},
424     {ACPI_SIG_MADT, NULL,                   AcpiDmDumpMadt, DtCompileMadt,  TemplateMadt},
425     {ACPI_SIG_MCFG, NULL,                   AcpiDmDumpMcfg, DtCompileMcfg,  TemplateMcfg},
426     {ACPI_SIG_MCHI, AcpiDmTableInfoMchi,    NULL,           NULL,           TemplateMchi},
427     {ACPI_SIG_MPST, AcpiDmTableInfoMpst,    AcpiDmDumpMpst, DtCompileMpst,  TemplateMpst},
428     {ACPI_SIG_MSCT, NULL,                   AcpiDmDumpMsct, DtCompileMsct,  TemplateMsct},
429     {ACPI_SIG_MSDM, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateMsdm},
430     {ACPI_SIG_NFIT, AcpiDmTableInfoNfit,    AcpiDmDumpNfit, DtCompileNfit,  TemplateNfit},
431     {ACPI_SIG_PCCT, AcpiDmTableInfoPcct,    AcpiDmDumpPcct, DtCompilePcct,  TemplatePcct},
432     {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt,    AcpiDmDumpPdtt, DtCompilePdtt,  TemplatePdtt},
433     {ACPI_SIG_PHAT, NULL,                   AcpiDmDumpPhat, DtCompilePhat,  TemplatePhat},
434     {ACPI_SIG_PMTT, NULL,                   AcpiDmDumpPmtt, DtCompilePmtt,  TemplatePmtt},
435     {ACPI_SIG_PPTT, NULL,                   AcpiDmDumpPptt, DtCompilePptt,  TemplatePptt},
436     {ACPI_SIG_RASF, AcpiDmTableInfoRasf,    NULL,           NULL,           TemplateRasf},
437     {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, DtCompileRsdt,  TemplateRsdt},
438     {ACPI_SIG_S3PT, NULL,                   NULL,           NULL,           TemplateS3pt},
439     {ACPI_SIG_SBST, AcpiDmTableInfoSbst,    NULL,           NULL,           TemplateSbst},
440     {ACPI_SIG_SDEI, AcpiDmTableInfoSdei,    NULL,           NULL,           TemplateSdei},
441     {ACPI_SIG_SDEV, AcpiDmTableInfoSdev,    AcpiDmDumpSdev, DtCompileSdev,  TemplateSdev},
442     {ACPI_SIG_SLIC, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateSlic},
443     {ACPI_SIG_SLIT, NULL,                   AcpiDmDumpSlit, DtCompileSlit,  TemplateSlit},
444     {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr,    NULL,           NULL,           TemplateSpcr},
445     {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi,    NULL,           NULL,           TemplateSpmi},
446     {ACPI_SIG_SRAT, NULL,                   AcpiDmDumpSrat, DtCompileSrat,  TemplateSrat},
447     {ACPI_SIG_STAO, NULL,                   AcpiDmDumpStao, DtCompileStao,  TemplateStao},
448     {ACPI_SIG_TCPA, NULL,                   AcpiDmDumpTcpa, DtCompileTcpa,  TemplateTcpa},
449     {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2,    AcpiDmDumpTpm2, DtCompileTpm2,  TemplateTpm2},
450     {ACPI_SIG_UEFI, AcpiDmTableInfoUefi,    NULL,           DtCompileUefi,  TemplateUefi},
451     {ACPI_SIG_VIOT, AcpiDmTableInfoViot,    AcpiDmDumpViot, DtCompileViot,  TemplateViot},
452     {ACPI_SIG_WAET, AcpiDmTableInfoWaet,    NULL,           NULL,           TemplateWaet},
453     {ACPI_SIG_WDAT, NULL,                   AcpiDmDumpWdat, DtCompileWdat,  TemplateWdat},
454     {ACPI_SIG_WDDT, AcpiDmTableInfoWddt,    NULL,           NULL,           TemplateWddt},
455     {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt,    NULL,           NULL,           TemplateWdrt},
456     {ACPI_SIG_WPBT, NULL,                   AcpiDmDumpWpbt, DtCompileWpbt,  TemplateWpbt},
457     {ACPI_SIG_WSMT, AcpiDmTableInfoWsmt,    NULL,           NULL,           TemplateWsmt},
458     {ACPI_SIG_XENV, AcpiDmTableInfoXenv,    NULL,           NULL,           TemplateXenv},
459     {ACPI_SIG_XSDT, NULL,                   AcpiDmDumpXsdt, DtCompileXsdt,  TemplateXsdt},
460     {NULL,          NULL,                   NULL,           NULL,           NULL}
461 };
462 
463 
464 /*******************************************************************************
465  *
466  * FUNCTION:    AcpiDmGenerateChecksum
467  *
468  * PARAMETERS:  Table               - Pointer to table to be checksummed
469  *              Length              - Length of the table
470  *              OriginalChecksum    - Value of the checksum field
471  *
472  * RETURN:      8 bit checksum of buffer
473  *
474  * DESCRIPTION: Computes an 8 bit checksum of the table.
475  *
476  ******************************************************************************/
477 
478 UINT8
479 AcpiDmGenerateChecksum (
480     void                    *Table,
481     UINT32                  Length,
482     UINT8                   OriginalChecksum)
483 {
484     UINT8                   Checksum;
485 
486 
487     /* Sum the entire table as-is */
488 
489     Checksum = AcpiTbChecksum ((UINT8 *) Table, Length);
490 
491     /* Subtract off the existing checksum value in the table */
492 
493     Checksum = (UINT8) (Checksum - OriginalChecksum);
494 
495     /* Compute the final checksum */
496 
497     Checksum = (UINT8) (0 - Checksum);
498     return (Checksum);
499 }
500 
501 
502 /*******************************************************************************
503  *
504  * FUNCTION:    AcpiDmGetTableData
505  *
506  * PARAMETERS:  Signature           - ACPI signature (4 chars) to match
507  *
508  * RETURN:      Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
509  *
510  * DESCRIPTION: Find a match in the global table of supported ACPI tables
511  *
512  ******************************************************************************/
513 
514 const ACPI_DMTABLE_DATA *
515 AcpiDmGetTableData (
516     char                    *Signature)
517 {
518     const ACPI_DMTABLE_DATA *Info;
519 
520 
521     for (Info = AcpiDmTableData; Info->Signature; Info++)
522     {
523         if (ACPI_COMPARE_NAMESEG (Signature, Info->Signature))
524         {
525             return (Info);
526         }
527     }
528 
529     return (NULL);
530 }
531 
532 
533 /*******************************************************************************
534  *
535  * FUNCTION:    AcpiDmDumpDataTable
536  *
537  * PARAMETERS:  Table               - An ACPI table
538  *
539  * RETURN:      None.
540  *
541  * DESCRIPTION: Format the contents of an ACPI data table (any table other
542  *              than an SSDT or DSDT that does not contain executable AML code)
543  *
544  ******************************************************************************/
545 
546 void
547 AcpiDmDumpDataTable (
548     ACPI_TABLE_HEADER       *Table)
549 {
550     ACPI_STATUS             Status;
551     const ACPI_DMTABLE_DATA *TableData;
552     UINT32                  Length;
553 
554 
555     /* Ignore tables that contain AML */
556 
557     if (AcpiUtIsAmlTable (Table))
558     {
559         if (AslGbl_VerboseTemplates)
560         {
561             /* Dump the raw table data */
562 
563             Length = Table->Length;
564 
565             AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n",
566                 ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
567             AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
568                 Length, DB_BYTE_DISPLAY, 0);
569             AcpiOsPrintf (" */\n");
570         }
571         return;
572     }
573 
574     /*
575      * Handle tables that don't use the common ACPI table header structure.
576      * Currently, these are the FACS, RSDP, and S3PT.
577      */
578     if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS))
579     {
580         Length = Table->Length;
581         Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
582         if (ACPI_FAILURE (Status))
583         {
584             return;
585         }
586     }
587     else if (ACPI_VALIDATE_RSDP_SIG (Table->Signature))
588     {
589         Length = AcpiDmDumpRsdp (Table);
590     }
591     else if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_S3PT))
592     {
593         Length = AcpiDmDumpS3pt (Table);
594     }
595     else
596     {
597         /*
598          * All other tables must use the common ACPI table header, dump it now
599          */
600         Length = Table->Length;
601         Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
602         if (ACPI_FAILURE (Status))
603         {
604             return;
605         }
606         AcpiOsPrintf ("\n");
607 
608         /* Match signature and dispatch appropriately */
609 
610         TableData = AcpiDmGetTableData (Table->Signature);
611         if (!TableData)
612         {
613             if (!strncmp (Table->Signature, "OEM", 3))
614             {
615                 AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
616                     Table->Signature);
617             }
618             else
619             {
620                 AcpiOsPrintf ("\n**** Unknown ACPI table signature [%4.4s]\n\n",
621                     Table->Signature);
622 
623                 fprintf (stderr, "Unknown ACPI table signature [%4.4s], ",
624                     Table->Signature);
625 
626                 if (!AcpiGbl_ForceAmlDisassembly)
627                 {
628                     fprintf (stderr, "decoding ACPI table header only\n");
629                 }
630                 else
631                 {
632                     fprintf (stderr, "assuming table contains valid AML code\n");
633                 }
634             }
635         }
636         else if (TableData->TableHandler)
637         {
638             /* Complex table, has a handler */
639 
640             TableData->TableHandler (Table);
641         }
642         else if (TableData->TableInfo)
643         {
644             /* Simple table, just walk the info table */
645 
646             Status = AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
647             if (ACPI_FAILURE (Status))
648             {
649                 return;
650             }
651         }
652     }
653 
654     if (!AslGbl_DoTemplates || AslGbl_VerboseTemplates)
655     {
656         /* Dump the raw table data */
657 
658         AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
659             ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
660         AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
661             Length, DB_BYTE_DISPLAY, 0);
662     }
663 }
664 
665 
666 /*******************************************************************************
667  *
668  * FUNCTION:    AcpiDmLineHeader
669  *
670  * PARAMETERS:  Offset              - Current byte offset, from table start
671  *              ByteLength          - Length of the field in bytes, 0 for flags
672  *              Name                - Name of this field
673  *
674  * RETURN:      None
675  *
676  * DESCRIPTION: Utility routines for formatting output lines. Displays the
677  *              current table offset in hex and decimal, the field length,
678  *              and the field name.
679  *
680  ******************************************************************************/
681 
682 void
683 AcpiDmLineHeader (
684     UINT32                  Offset,
685     UINT32                  ByteLength,
686     char                    *Name)
687 {
688 
689     /* Allow a null name for fields that span multiple lines (large buffers) */
690 
691     if (!Name)
692     {
693         Name = "";
694     }
695 
696     if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */
697     {
698         if (ByteLength)
699         {
700             AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name);
701         }
702         else
703         {
704             if (*Name)
705             {
706                 AcpiOsPrintf ("%41s : ", Name);
707             }
708             else
709             {
710                 AcpiOsPrintf ("%41s   ", Name);
711             }
712         }
713     }
714     else /* Normal disassembler or verbose template */
715     {
716         if (ByteLength)
717         {
718             AcpiOsPrintf ("[%3.3Xh %4.4d% 4d] %28s : ",
719                 Offset, Offset, ByteLength, Name);
720         }
721         else
722         {
723             if (*Name)
724             {
725                 AcpiOsPrintf ("%44s : ", Name);
726             }
727             else
728             {
729                 AcpiOsPrintf ("%44s   ", Name);
730             }
731         }
732     }
733 }
734 
735 void
736 AcpiDmLineHeader2 (
737     UINT32                  Offset,
738     UINT32                  ByteLength,
739     char                    *Name,
740     UINT32                  Value)
741 {
742 
743     if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */
744     {
745         if (ByteLength)
746         {
747             AcpiOsPrintf ("[%.4d] %30s %3d : ",
748                 ByteLength, Name, Value);
749         }
750         else
751         {
752             AcpiOsPrintf ("%36s % 3d : ",
753                 Name, Value);
754         }
755     }
756     else /* Normal disassembler or verbose template */
757     {
758         if (ByteLength)
759         {
760             AcpiOsPrintf ("[%3.3Xh %4.4d %3d] %24s %3d : ",
761                 Offset, Offset, ByteLength, Name, Value);
762         }
763         else
764         {
765             AcpiOsPrintf ("[%3.3Xh %4.4d   ] %24s %3d : ",
766                 Offset, Offset, Name, Value);
767         }
768     }
769 }
770 
771 
772 /*******************************************************************************
773  *
774  * FUNCTION:    AcpiDmDumpTable
775  *
776  * PARAMETERS:  TableLength         - Length of the entire ACPI table
777  *              TableOffset         - Starting offset within the table for this
778  *                                    sub-descriptor (0 if main table)
779  *              Table               - The ACPI table
780  *              SubtableLength      - Length of this sub-descriptor
781  *              Info                - Info table for this ACPI table
782  *
783  * RETURN:      Status
784  *
785  * DESCRIPTION: Display ACPI table contents by walking the Info table.
786  *
787  * Note: This function must remain in sync with DtGetFieldLength.
788  *
789  ******************************************************************************/
790 
791 ACPI_STATUS
792 AcpiDmDumpTable (
793     UINT32                  TableLength,
794     UINT32                  TableOffset,
795     void                    *Table,
796     UINT32                  SubtableLength,
797     ACPI_DMTABLE_INFO       *Info)
798 {
799     UINT8                   *Target;
800     UINT32                  CurrentOffset;
801     UINT32                  ByteLength;
802     UINT8                   Temp8;
803     UINT16                  Temp16;
804     UINT32                  Temp32;
805     UINT64                  Value;
806     const AH_TABLE          *TableData;
807     const char              *Name;
808     BOOLEAN                 LastOutputBlankLine = FALSE;
809     ACPI_STATUS             Status;
810     char                    RepairedName[8];
811 
812 
813     if (!Info)
814     {
815         AcpiOsPrintf ("Display not implemented\n");
816         return (AE_NOT_IMPLEMENTED);
817     }
818 
819     /* Walk entire Info table; Null name terminates */
820 
821     for (; Info->Name; Info++)
822     {
823         /*
824          * Target points to the field within the ACPI Table. CurrentOffset is
825          * the offset of the field from the start of the main table.
826          */
827         Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
828         CurrentOffset = TableOffset + Info->Offset;
829 
830         /* Check for beyond subtable end or (worse) beyond EOT */
831 
832         if (SubtableLength && (Info->Offset >= SubtableLength))
833         {
834             AcpiOsPrintf (
835                 "/**** ACPI subtable terminates early - "
836                 "may be older version (dump table) */\n");
837 
838             /* Move on to next subtable */
839 
840             return (AE_OK);
841         }
842 
843         if (CurrentOffset >= TableLength)
844         {
845             AcpiOsPrintf (
846                 "/**** ACPI table terminates "
847                 "in the middle of a data structure! (dump table) */\n");
848             return (AE_BAD_DATA);
849         }
850 
851         /* Generate the byte length for this field */
852 
853         switch (Info->Opcode)
854         {
855         case ACPI_DMT_UINT8:
856         case ACPI_DMT_CHKSUM:
857         case ACPI_DMT_SPACEID:
858         case ACPI_DMT_ACCWIDTH:
859         case ACPI_DMT_CEDT:
860         case ACPI_DMT_IVRS:
861         case ACPI_DMT_GTDT:
862         case ACPI_DMT_MADT:
863         case ACPI_DMT_PCCT:
864         case ACPI_DMT_PMTT:
865         case ACPI_DMT_PPTT:
866         case ACPI_DMT_SDEV:
867         case ACPI_DMT_SRAT:
868         case ACPI_DMT_ASF:
869         case ACPI_DMT_HESTNTYP:
870         case ACPI_DMT_FADTPM:
871         case ACPI_DMT_EINJACT:
872         case ACPI_DMT_EINJINST:
873         case ACPI_DMT_ERSTACT:
874         case ACPI_DMT_ERSTINST:
875         case ACPI_DMT_DMAR_SCOPE:
876         case ACPI_DMT_VIOT:
877 
878             ByteLength = 1;
879             break;
880 
881         case ACPI_DMT_UINT16:
882         case ACPI_DMT_DMAR:
883         case ACPI_DMT_HEST:
884         case ACPI_DMT_HMAT:
885         case ACPI_DMT_NFIT:
886         case ACPI_DMT_PHAT:
887 
888             ByteLength = 2;
889             break;
890 
891         case ACPI_DMT_UINT24:
892 
893             ByteLength = 3;
894             break;
895 
896         case ACPI_DMT_UINT32:
897         case ACPI_DMT_NAME4:
898         case ACPI_DMT_SIG:
899         case ACPI_DMT_LPIT:
900         case ACPI_DMT_TPM2:
901 
902             ByteLength = 4;
903             break;
904 
905         case ACPI_DMT_UINT40:
906 
907             ByteLength = 5;
908             break;
909 
910         case ACPI_DMT_UINT48:
911         case ACPI_DMT_NAME6:
912 
913             ByteLength = 6;
914             break;
915 
916         case ACPI_DMT_UINT56:
917         case ACPI_DMT_BUF7:
918 
919             ByteLength = 7;
920             break;
921 
922         case ACPI_DMT_UINT64:
923         case ACPI_DMT_NAME8:
924 
925             ByteLength = 8;
926             break;
927 
928         case ACPI_DMT_BUF10:
929 
930             ByteLength = 10;
931             break;
932 
933         case ACPI_DMT_BUF12:
934 
935             ByteLength = 12;
936             break;
937 
938         case ACPI_DMT_BUF16:
939         case ACPI_DMT_UUID:
940 
941             ByteLength = 16;
942             break;
943 
944         case ACPI_DMT_BUF128:
945 
946             ByteLength = 128;
947             break;
948 
949         case ACPI_DMT_UNICODE:
950         case ACPI_DMT_BUFFER:
951         case ACPI_DMT_RAW_BUFFER:
952 
953             ByteLength = SubtableLength;
954             break;
955 
956         case ACPI_DMT_PMTT_VENDOR:
957             /*
958              * Calculate the length of the vendor data for the PMTT table:
959              * Length = (Current Subtable ptr + Subtable length) -
960              *          Start of the vendor data (Target)
961              */
962             ByteLength = ((ACPI_CAST_PTR (char, Table) +
963                             (ACPI_CAST_PTR (ACPI_PMTT_HEADER, Table)->Length)) -
964                             ACPI_CAST_PTR (char, Target));
965             break;
966 
967         case ACPI_DMT_STRING:
968 
969             ByteLength = strlen (ACPI_CAST_PTR (char, Target)) + 1;
970             break;
971 
972         case ACPI_DMT_GAS:
973 
974             if (!LastOutputBlankLine)
975             {
976                 AcpiOsPrintf ("\n");
977                 LastOutputBlankLine = TRUE;
978             }
979 
980             ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
981             break;
982 
983         case ACPI_DMT_HESTNTFY:
984 
985             if (!LastOutputBlankLine)
986             {
987                 AcpiOsPrintf ("\n");
988                 LastOutputBlankLine = TRUE;
989             }
990 
991             ByteLength = sizeof (ACPI_HEST_NOTIFY);
992             break;
993 
994         case ACPI_DMT_IORTMEM:
995 
996             if (!LastOutputBlankLine)
997             {
998                 LastOutputBlankLine = FALSE;
999             }
1000 
1001             ByteLength = sizeof (ACPI_IORT_MEMORY_ACCESS);
1002             break;
1003 
1004         default:
1005 
1006             ByteLength = 0;
1007             break;
1008         }
1009 
1010         /* Check if we are beyond a subtable, or (worse) beyond EOT */
1011 
1012         if (CurrentOffset + ByteLength > TableLength)
1013         {
1014             if (SubtableLength)
1015             {
1016                 AcpiOsPrintf (
1017                     "/**** ACPI subtable terminates early - "
1018                     "may be older version (dump table) */\n");
1019 
1020                 /* Move on to next subtable */
1021 
1022                 return (AE_OK);
1023             }
1024 
1025             AcpiOsPrintf (
1026                 "/**** ACPI table terminates "
1027                 "in the middle of a data structure! */\n");
1028             return (AE_BAD_DATA);
1029         }
1030 
1031         if (Info->Opcode == ACPI_DMT_EXTRA_TEXT)
1032         {
1033             AcpiOsPrintf ("%s", Info->Name);
1034             continue;
1035         }
1036 
1037         /* Start a new line and decode the opcode */
1038 
1039         AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
1040 
1041         switch (Info->Opcode)
1042         {
1043         /* Single-bit Flag fields. Note: Opcode is the bit position */
1044 
1045         case ACPI_DMT_FLAG0:
1046         case ACPI_DMT_FLAG1:
1047         case ACPI_DMT_FLAG2:
1048         case ACPI_DMT_FLAG3:
1049         case ACPI_DMT_FLAG4:
1050         case ACPI_DMT_FLAG5:
1051         case ACPI_DMT_FLAG6:
1052         case ACPI_DMT_FLAG7:
1053 
1054             AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
1055             break;
1056 
1057         /* 2-bit Flag fields */
1058 
1059         case ACPI_DMT_FLAGS0:
1060 
1061             AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
1062             break;
1063 
1064         case ACPI_DMT_FLAGS1:
1065 
1066             AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03);
1067             break;
1068 
1069         case ACPI_DMT_FLAGS2:
1070 
1071             AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
1072             break;
1073 
1074         case ACPI_DMT_FLAGS4:
1075 
1076             AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03);
1077             break;
1078 
1079         case ACPI_DMT_FLAGS4_0:
1080 
1081             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target) & 0x0F);
1082             break;
1083 
1084         case ACPI_DMT_FLAGS4_4:
1085 
1086             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 4) & 0x0F);
1087             break;
1088 
1089         case ACPI_DMT_FLAGS4_8:
1090 
1091             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 8) & 0x0F);
1092             break;
1093 
1094         case ACPI_DMT_FLAGS4_12:
1095 
1096             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 12) & 0x0F);
1097             break;
1098 
1099         case ACPI_DMT_FLAGS16_16:
1100 
1101             AcpiOsPrintf ("%4.4X\n", (*(UINT32 *)Target >> 16) & 0xFFFF);
1102             break;
1103 
1104         /* Integer Data Types */
1105 
1106         case ACPI_DMT_UINT8:
1107         case ACPI_DMT_UINT16:
1108         case ACPI_DMT_UINT24:
1109         case ACPI_DMT_UINT32:
1110         case ACPI_DMT_UINT40:
1111         case ACPI_DMT_UINT48:
1112         case ACPI_DMT_UINT56:
1113         case ACPI_DMT_UINT64:
1114             /*
1115              * Dump bytes - high byte first, low byte last.
1116              * Note: All ACPI tables are little-endian.
1117              */
1118             Value = 0;
1119             for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--)
1120             {
1121                 AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]);
1122                 Value |= Target[Temp8 - 1];
1123                 Value <<= 8;
1124             }
1125 
1126             if (!Value && (Info->Flags & DT_DESCRIBES_OPTIONAL))
1127             {
1128                 AcpiOsPrintf (" [Optional field not present]");
1129             }
1130 
1131             AcpiOsPrintf ("\n");
1132             break;
1133 
1134         case ACPI_DMT_BUF7:
1135         case ACPI_DMT_BUF10:
1136         case ACPI_DMT_BUF12:
1137         case ACPI_DMT_BUF16:
1138         case ACPI_DMT_BUF128:
1139             /*
1140              * Buffer: Size depends on the opcode and was set above.
1141              * Each hex byte is separated with a space.
1142              * Multiple lines are separated by line continuation char.
1143              */
1144             for (Temp16 = 0; Temp16 < ByteLength; Temp16++)
1145             {
1146                 AcpiOsPrintf ("%2.2X", Target[Temp16]);
1147                 if ((UINT32) (Temp16 + 1) < ByteLength)
1148                 {
1149                     if ((Temp16 > 0) && (!((Temp16+1) % 16)))
1150                     {
1151                         AcpiOsPrintf (" \\\n"); /* Line continuation */
1152                         AcpiDmLineHeader (0, 0, NULL);
1153                     }
1154                     else
1155                     {
1156                         AcpiOsPrintf (" ");
1157                     }
1158                 }
1159             }
1160 
1161             AcpiOsPrintf ("\n");
1162             break;
1163 
1164         case ACPI_DMT_UUID:
1165 
1166             /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */
1167 
1168             (void) AuConvertUuidToString ((char *) Target, AslGbl_MsgBuffer);
1169 
1170             AcpiOsPrintf ("%s\n", AslGbl_MsgBuffer);
1171             break;
1172 
1173         case ACPI_DMT_STRING:
1174 
1175             AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target));
1176             break;
1177 
1178         /* Fixed length ASCII name fields */
1179 
1180         case ACPI_DMT_SIG:
1181 
1182             AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
1183             AcpiOsPrintf ("\"%.4s\"    ", RepairedName);
1184 
1185             TableData = AcpiAhGetTableInfo (ACPI_CAST_PTR (char, Target));
1186             if (TableData)
1187             {
1188                 AcpiOsPrintf (STRING_FORMAT, TableData->Description);
1189             }
1190             else
1191             {
1192                 AcpiOsPrintf ("\n");
1193             }
1194             break;
1195 
1196         case ACPI_DMT_NAME4:
1197 
1198             AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
1199             AcpiOsPrintf ("\"%.4s\"\n", RepairedName);
1200             break;
1201 
1202         case ACPI_DMT_NAME6:
1203 
1204             AcpiUtCheckAndRepairAscii (Target, RepairedName, 6);
1205             AcpiOsPrintf ("\"%.6s\"\n", RepairedName);
1206             break;
1207 
1208         case ACPI_DMT_NAME8:
1209 
1210             AcpiUtCheckAndRepairAscii (Target, RepairedName, 8);
1211             AcpiOsPrintf ("\"%.8s\"\n", RepairedName);
1212             break;
1213 
1214         /* Special Data Types */
1215 
1216         case ACPI_DMT_CHKSUM:
1217 
1218             /* Checksum, display and validate */
1219 
1220             AcpiOsPrintf ("%2.2X", *Target);
1221             Temp8 = AcpiDmGenerateChecksum (Table,
1222                 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
1223                 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
1224 
1225             if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
1226             {
1227                 AcpiOsPrintf (
1228                     "     /* Incorrect checksum, should be %2.2X */", Temp8);
1229             }
1230 
1231             AcpiOsPrintf ("\n");
1232             break;
1233 
1234         case ACPI_DMT_SPACEID:
1235 
1236             /* Address Space ID */
1237 
1238             AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target));
1239             break;
1240 
1241         case ACPI_DMT_ACCWIDTH:
1242 
1243             /* Encoded Access Width */
1244 
1245             Temp8 = *Target;
1246             if (Temp8 > ACPI_GAS_WIDTH_RESERVED)
1247             {
1248                 Temp8 = ACPI_GAS_WIDTH_RESERVED;
1249             }
1250 
1251             AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmGasAccessWidth[Temp8]);
1252             break;
1253 
1254         case ACPI_DMT_GAS:
1255 
1256             /* Generic Address Structure */
1257 
1258             AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure");
1259             Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1260                 sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas);
1261             if (ACPI_FAILURE (Status))
1262             {
1263                 return (Status);
1264             }
1265 
1266             AcpiOsPrintf ("\n");
1267             LastOutputBlankLine = TRUE;
1268             break;
1269 
1270         case ACPI_DMT_ASF:
1271 
1272             /* ASF subtable types */
1273 
1274             Temp16 = (UINT16) ((*Target) & 0x7F);  /* Top bit can be zero or one */
1275             if (Temp16 > ACPI_ASF_TYPE_RESERVED)
1276             {
1277                 Temp16 = ACPI_ASF_TYPE_RESERVED;
1278             }
1279 
1280             AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]);
1281             break;
1282 
1283         case ACPI_DMT_CEDT:
1284 
1285             /* CEDT subtable types */
1286 
1287             Temp8 = *Target;
1288             if (Temp8 > ACPI_CEDT_TYPE_RESERVED)
1289             {
1290                 Temp8 = ACPI_CEDT_TYPE_RESERVED;
1291             }
1292 
1293             AcpiOsPrintf (UINT8_FORMAT, *Target,
1294                 AcpiDmCedtSubnames[Temp8]);
1295             break;
1296 
1297         case ACPI_DMT_DMAR:
1298 
1299             /* DMAR subtable types */
1300 
1301             Temp16 = ACPI_GET16 (Target);
1302             if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
1303             {
1304                 Temp16 = ACPI_DMAR_TYPE_RESERVED;
1305             }
1306 
1307             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1308                 AcpiDmDmarSubnames[Temp16]);
1309             break;
1310 
1311         case ACPI_DMT_DMAR_SCOPE:
1312 
1313             /* DMAR device scope types */
1314 
1315             Temp8 = *Target;
1316             if (Temp8 > ACPI_DMAR_SCOPE_TYPE_RESERVED)
1317             {
1318                 Temp8 = ACPI_DMAR_SCOPE_TYPE_RESERVED;
1319             }
1320 
1321             AcpiOsPrintf (UINT8_FORMAT, *Target,
1322                 AcpiDmDmarScope[Temp8]);
1323             break;
1324 
1325         case ACPI_DMT_EINJACT:
1326 
1327             /* EINJ Action types */
1328 
1329             Temp8 = *Target;
1330             if (Temp8 > ACPI_EINJ_ACTION_RESERVED)
1331             {
1332                 Temp8 = ACPI_EINJ_ACTION_RESERVED;
1333             }
1334 
1335             AcpiOsPrintf (UINT8_FORMAT, *Target,
1336                 AcpiDmEinjActions[Temp8]);
1337             break;
1338 
1339         case ACPI_DMT_EINJINST:
1340 
1341             /* EINJ Instruction types */
1342 
1343             Temp8 = *Target;
1344             if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED)
1345             {
1346                 Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
1347             }
1348 
1349             AcpiOsPrintf (UINT8_FORMAT, *Target,
1350                 AcpiDmEinjInstructions[Temp8]);
1351             break;
1352 
1353         case ACPI_DMT_ERSTACT:
1354 
1355             /* ERST Action types */
1356 
1357             Temp8 = *Target;
1358             if (Temp8 > ACPI_ERST_ACTION_RESERVED)
1359             {
1360                 Temp8 = ACPI_ERST_ACTION_RESERVED;
1361             }
1362 
1363             AcpiOsPrintf (UINT8_FORMAT, *Target,
1364                 AcpiDmErstActions[Temp8]);
1365             break;
1366 
1367         case ACPI_DMT_ERSTINST:
1368 
1369             /* ERST Instruction types */
1370 
1371             Temp8 = *Target;
1372             if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED)
1373             {
1374                 Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
1375             }
1376 
1377             AcpiOsPrintf (UINT8_FORMAT, *Target,
1378                 AcpiDmErstInstructions[Temp8]);
1379             break;
1380 
1381         case ACPI_DMT_GTDT:
1382 
1383             /* GTDT subtable types */
1384 
1385             Temp8 = *Target;
1386             if (Temp8 > ACPI_GTDT_TYPE_RESERVED)
1387             {
1388                 Temp8 = ACPI_GTDT_TYPE_RESERVED;
1389             }
1390 
1391             AcpiOsPrintf (UINT8_FORMAT, *Target,
1392                 AcpiDmGtdtSubnames[Temp8]);
1393             break;
1394 
1395         case ACPI_DMT_HEST:
1396 
1397             /* HEST subtable types */
1398 
1399             Temp16 = ACPI_GET16 (Target);
1400             if (Temp16 > ACPI_HEST_TYPE_RESERVED)
1401             {
1402                 Temp16 = ACPI_HEST_TYPE_RESERVED;
1403             }
1404 
1405             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1406                 AcpiDmHestSubnames[Temp16]);
1407             break;
1408 
1409         case ACPI_DMT_HESTNTFY:
1410 
1411             AcpiOsPrintf (STRING_FORMAT,
1412                 "Hardware Error Notification Structure");
1413 
1414             Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1415                 sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
1416             if (ACPI_FAILURE (Status))
1417             {
1418                 return (Status);
1419             }
1420 
1421             AcpiOsPrintf ("\n");
1422             LastOutputBlankLine = TRUE;
1423             break;
1424 
1425         case ACPI_DMT_HESTNTYP:
1426 
1427             /* HEST Notify types */
1428 
1429             Temp8 = *Target;
1430             if (Temp8 > ACPI_HEST_NOTIFY_RESERVED)
1431             {
1432                 Temp8 = ACPI_HEST_NOTIFY_RESERVED;
1433             }
1434 
1435             AcpiOsPrintf (UINT8_FORMAT, *Target,
1436                 AcpiDmHestNotifySubnames[Temp8]);
1437             break;
1438 
1439         case ACPI_DMT_HMAT:
1440 
1441             /* HMAT subtable types */
1442 
1443             Temp16 = *Target;
1444             if (Temp16 > ACPI_HMAT_TYPE_RESERVED)
1445             {
1446                 Temp16 = ACPI_HMAT_TYPE_RESERVED;
1447             }
1448 
1449             AcpiOsPrintf (UINT16_FORMAT, *Target,
1450                 AcpiDmHmatSubnames[Temp16]);
1451             break;
1452 
1453         case ACPI_DMT_IORTMEM:
1454 
1455             AcpiOsPrintf (STRING_FORMAT,
1456                 "IORT Memory Access Properties");
1457 
1458             Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1459                 sizeof (ACPI_IORT_MEMORY_ACCESS), AcpiDmTableInfoIortAcc);
1460             if (ACPI_FAILURE (Status))
1461             {
1462                 return (Status);
1463             }
1464 
1465             LastOutputBlankLine = TRUE;
1466             break;
1467 
1468         case ACPI_DMT_MADT:
1469 
1470             /* MADT subtable types */
1471 
1472             Temp8 = *Target;
1473             if (Temp8 > ACPI_MADT_TYPE_RESERVED)
1474             {
1475                 Temp8 = ACPI_MADT_TYPE_RESERVED;
1476             }
1477 
1478             AcpiOsPrintf (UINT8_FORMAT, *Target,
1479                 AcpiDmMadtSubnames[Temp8]);
1480             break;
1481 
1482         case ACPI_DMT_NFIT:
1483 
1484             /* NFIT subtable types */
1485 
1486             Temp16 = ACPI_GET16 (Target);
1487             if (Temp16 > ACPI_NFIT_TYPE_RESERVED)
1488             {
1489                 Temp16 = ACPI_NFIT_TYPE_RESERVED;
1490             }
1491 
1492             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1493                 AcpiDmNfitSubnames[Temp16]);
1494             break;
1495 
1496         case ACPI_DMT_PCCT:
1497 
1498             /* PCCT subtable types */
1499 
1500             Temp8 = *Target;
1501             if (Temp8 > ACPI_PCCT_TYPE_RESERVED)
1502             {
1503                 Temp8 = ACPI_PCCT_TYPE_RESERVED;
1504             }
1505 
1506             AcpiOsPrintf (UINT8_FORMAT, *Target,
1507                 AcpiDmPcctSubnames[Temp8]);
1508             break;
1509 
1510         case ACPI_DMT_PHAT:
1511 
1512             /* PMTT subtable types */
1513 
1514             Temp16 = *Target;
1515             if (Temp16 > ACPI_PHAT_TYPE_RESERVED)
1516             {
1517                 Temp16 = ACPI_PHAT_TYPE_RESERVED;
1518             }
1519 
1520             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16(Target),
1521                 AcpiDmPhatSubnames[Temp16]);
1522             break;
1523 
1524         case ACPI_DMT_PMTT:
1525 
1526             /* PMTT subtable types */
1527 
1528             Temp8 = *Target;
1529             if (Temp8 == ACPI_PMTT_TYPE_VENDOR)
1530             {
1531                 Temp8 = ACPI_PMTT_TYPE_RESERVED + 1;
1532             }
1533             else if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
1534             {
1535                 Temp8 = ACPI_PMTT_TYPE_RESERVED;
1536             }
1537             AcpiOsPrintf (UINT8_FORMAT, *Target,
1538                 AcpiDmPmttSubnames[Temp8]);
1539             break;
1540 
1541         case ACPI_DMT_PPTT:
1542 
1543             /* PPTT subtable types */
1544 
1545             Temp8 = *Target;
1546             if (Temp8 > ACPI_PPTT_TYPE_RESERVED)
1547             {
1548                 Temp8 = ACPI_PPTT_TYPE_RESERVED;
1549             }
1550 
1551             AcpiOsPrintf (UINT8_FORMAT, *Target,
1552                 AcpiDmPpttSubnames[Temp8]);
1553             break;
1554 
1555         case ACPI_DMT_UNICODE:
1556 
1557             if (ByteLength == 0)
1558             {
1559                 AcpiOsPrintf ("/* Zero-length Data */\n");
1560                 break;
1561             }
1562 
1563             AcpiDmDumpUnicode (Table, CurrentOffset, ByteLength);
1564             break;
1565 
1566         case ACPI_DMT_RAW_BUFFER:
1567         case ACPI_DMT_BUFFER:
1568         case ACPI_DMT_PMTT_VENDOR:
1569 
1570             if (ByteLength == 0)
1571             {
1572                 AcpiOsPrintf ("/* Zero-length Data */\n");
1573                 break;
1574             }
1575 
1576             AcpiDmDumpBuffer (Target, 0, ByteLength, 0, NULL);
1577             break;
1578 
1579         case ACPI_DMT_SDEV:
1580 
1581             /* SDEV subtable types */
1582 
1583             Temp8 = *Target;
1584             if (Temp8 > ACPI_SDEV_TYPE_RESERVED)
1585             {
1586                 Temp8 = ACPI_SDEV_TYPE_RESERVED;
1587             }
1588 
1589             AcpiOsPrintf (UINT8_FORMAT, *Target,
1590                 AcpiDmSdevSubnames[Temp8]);
1591             break;
1592 
1593         case ACPI_DMT_SRAT:
1594 
1595             /* SRAT subtable types */
1596 
1597             Temp8 = *Target;
1598             if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
1599             {
1600                 Temp8 = ACPI_SRAT_TYPE_RESERVED;
1601             }
1602 
1603             AcpiOsPrintf (UINT8_FORMAT, *Target,
1604                 AcpiDmSratSubnames[Temp8]);
1605             break;
1606 
1607         case ACPI_DMT_TPM2:
1608 
1609             /* TPM2 Start Method types */
1610 
1611             Temp8 = *Target;
1612             if (Temp8 > ACPI_TPM2_RESERVED)
1613             {
1614                 Temp8 = ACPI_TPM2_RESERVED;
1615             }
1616 
1617             AcpiOsPrintf (UINT8_FORMAT, *Target,
1618                 AcpiDmTpm2Subnames[Temp8]);
1619             break;
1620 
1621 
1622         case ACPI_DMT_FADTPM:
1623 
1624             /* FADT Preferred PM Profile names */
1625 
1626             Temp8 = *Target;
1627             if (Temp8 > ACPI_FADT_PM_RESERVED)
1628             {
1629                 Temp8 = ACPI_FADT_PM_RESERVED;
1630             }
1631 
1632             AcpiOsPrintf (UINT8_FORMAT, *Target,
1633                 AcpiDmFadtProfiles[Temp8]);
1634             break;
1635 
1636         case ACPI_DMT_IVRS:
1637 
1638             /* IVRS subtable types */
1639 
1640             Temp8 = *Target;
1641             switch (Temp8)
1642             {
1643             case ACPI_IVRS_TYPE_HARDWARE1:
1644             case ACPI_IVRS_TYPE_HARDWARE2:
1645             case ACPI_IVRS_TYPE_HARDWARE3:
1646 
1647                 Name = AcpiDmIvrsSubnames[0];
1648                 break;
1649 
1650             case ACPI_IVRS_TYPE_MEMORY1:
1651             case ACPI_IVRS_TYPE_MEMORY2:
1652             case ACPI_IVRS_TYPE_MEMORY3:
1653 
1654                 Name = AcpiDmIvrsSubnames[1];
1655                 break;
1656 
1657             default:
1658 
1659                 Name = AcpiDmIvrsSubnames[2];
1660                 break;
1661             }
1662 
1663             AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
1664             break;
1665 
1666         case ACPI_DMT_LPIT:
1667 
1668             /* LPIT subtable types */
1669 
1670             Temp32 = ACPI_GET32 (Target);
1671             if (Temp32 > ACPI_LPIT_TYPE_RESERVED)
1672             {
1673                 Temp32 = ACPI_LPIT_TYPE_RESERVED;
1674             }
1675 
1676             AcpiOsPrintf (UINT32_FORMAT, ACPI_GET32 (Target),
1677                 AcpiDmLpitSubnames[Temp32]);
1678             break;
1679 
1680         case ACPI_DMT_VIOT:
1681 
1682             /* VIOT subtable types */
1683 
1684             Temp8 = *Target;
1685             if (Temp8 > ACPI_VIOT_RESERVED)
1686             {
1687                 Temp8 = ACPI_VIOT_RESERVED;
1688             }
1689 
1690             AcpiOsPrintf (UINT8_FORMAT, *Target,
1691                 AcpiDmViotSubnames[Temp8]);
1692             break;
1693 
1694         case ACPI_DMT_EXIT:
1695 
1696             return (AE_OK);
1697 
1698         default:
1699 
1700             ACPI_ERROR ((AE_INFO,
1701                 "**** Invalid table opcode [0x%X] ****\n", Info->Opcode));
1702             return (AE_SUPPORT);
1703         }
1704     }
1705 
1706     if (TableOffset && !SubtableLength)
1707     {
1708         /*
1709          * If this table is not the main table, the subtable must have a
1710          * valid length
1711          */
1712         AcpiOsPrintf ("Invalid zero length subtable\n");
1713         return (AE_BAD_DATA);
1714     }
1715 
1716     return (AE_OK);
1717 }
1718