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