1167802Sjkim/******************************************************************************
2167802Sjkim *
3167802Sjkim * Module Name: dmtable - Support for ACPI tables that contain no AML code
4167802Sjkim *
5167802Sjkim *****************************************************************************/
6167802Sjkim
7217365Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp.
9167802Sjkim * All rights reserved.
10167802Sjkim *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25167802Sjkim *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29167802Sjkim *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43167802Sjkim
44193529Sjkim#include <contrib/dev/acpica/include/acpi.h>
45193529Sjkim#include <contrib/dev/acpica/include/accommon.h>
46193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
47193529Sjkim#include <contrib/dev/acpica/include/actables.h>
48209746Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
49209746Sjkim#include <contrib/dev/acpica/compiler/dtcompiler.h>
50167802Sjkim
51167802Sjkim/* This module used for application-level code only */
52167802Sjkim
53167802Sjkim#define _COMPONENT          ACPI_CA_DISASSEMBLER
54167802Sjkim        ACPI_MODULE_NAME    ("dmtable")
55167802Sjkim
56284460Sjkimconst AH_TABLE *
57284460SjkimAcpiAhGetTableInfo (
58284460Sjkim    char                    *Signature);
59284460Sjkim
60284460Sjkim
61220663Sjkim/* Common format strings for commented values */
62220663Sjkim
63220663Sjkim#define UINT8_FORMAT        "%2.2X [%s]\n"
64220663Sjkim#define UINT16_FORMAT       "%4.4X [%s]\n"
65220663Sjkim#define UINT32_FORMAT       "%8.8X [%s]\n"
66220663Sjkim#define STRING_FORMAT       "[%s]\n"
67220663Sjkim
68167802Sjkim/* These tables map a subtable type to a description string */
69167802Sjkim
70193529Sjkimstatic const char           *AcpiDmAsfSubnames[] =
71193529Sjkim{
72193529Sjkim    "ASF Information",
73193529Sjkim    "ASF Alerts",
74193529Sjkim    "ASF Remote Control",
75193529Sjkim    "ASF RMCP Boot Options",
76193529Sjkim    "ASF Address",
77284460Sjkim    "Unknown Subtable Type"         /* Reserved */
78193529Sjkim};
79193529Sjkim
80167802Sjkimstatic const char           *AcpiDmDmarSubnames[] =
81167802Sjkim{
82167802Sjkim    "Hardware Unit Definition",
83167802Sjkim    "Reserved Memory Region",
84193529Sjkim    "Root Port ATS Capability",
85197104Sjkim    "Remapping Hardware Static Affinity",
86281075Sdim    "ACPI Namespace Device Declaration",
87284460Sjkim    "Unknown Subtable Type"         /* Reserved */
88167802Sjkim};
89167802Sjkim
90281075Sdimstatic const char           *AcpiDmDmarScope[] =
91281075Sdim{
92281075Sdim    "Reserved value",
93281075Sdim    "PCI Endpoint Device",
94281075Sdim    "PCI Bridge Device",
95281075Sdim    "IOAPIC Device",
96281075Sdim    "Message-capable HPET Device",
97281075Sdim    "Namespace Device",
98281075Sdim    "Unknown Scope Type"            /* Reserved */
99281075Sdim};
100281075Sdim
101209746Sjkimstatic const char           *AcpiDmEinjActions[] =
102209746Sjkim{
103209746Sjkim    "Begin Operation",
104209746Sjkim    "Get Trigger Table",
105209746Sjkim    "Set Error Type",
106209746Sjkim    "Get Error Type",
107209746Sjkim    "End Operation",
108209746Sjkim    "Execute Operation",
109209746Sjkim    "Check Busy Status",
110209746Sjkim    "Get Command Status",
111252279Sjkim    "Set Error Type With Address",
112306536Sjkim    "Get Execute Timings",
113209746Sjkim    "Unknown Action"
114209746Sjkim};
115209746Sjkim
116209746Sjkimstatic const char           *AcpiDmEinjInstructions[] =
117209746Sjkim{
118209746Sjkim    "Read Register",
119209746Sjkim    "Read Register Value",
120209746Sjkim    "Write Register",
121209746Sjkim    "Write Register Value",
122209746Sjkim    "Noop",
123252279Sjkim    "Flush Cacheline",
124209746Sjkim    "Unknown Instruction"
125209746Sjkim};
126209746Sjkim
127209746Sjkimstatic const char           *AcpiDmErstActions[] =
128209746Sjkim{
129209746Sjkim    "Begin Write Operation",
130209746Sjkim    "Begin Read Operation",
131209746Sjkim    "Begin Clear Operation",
132209746Sjkim    "End Operation",
133209746Sjkim    "Set Record Offset",
134209746Sjkim    "Execute Operation",
135209746Sjkim    "Check Busy Status",
136209746Sjkim    "Get Command Status",
137209746Sjkim    "Get Record Identifier",
138209746Sjkim    "Set Record Identifier",
139209746Sjkim    "Get Record Count",
140209746Sjkim    "Begin Dummy Write",
141209746Sjkim    "Unused/Unknown Action",
142209746Sjkim    "Get Error Address Range",
143209746Sjkim    "Get Error Address Length",
144209746Sjkim    "Get Error Attributes",
145306536Sjkim    "Execute Timings",
146209746Sjkim    "Unknown Action"
147209746Sjkim};
148209746Sjkim
149209746Sjkimstatic const char           *AcpiDmErstInstructions[] =
150209746Sjkim{
151209746Sjkim    "Read Register",
152209746Sjkim    "Read Register Value",
153209746Sjkim    "Write Register",
154209746Sjkim    "Write Register Value",
155209746Sjkim    "Noop",
156209746Sjkim    "Load Var1",
157209746Sjkim    "Load Var2",
158209746Sjkim    "Store Var1",
159209746Sjkim    "Add",
160209746Sjkim    "Subtract",
161209746Sjkim    "Add Value",
162209746Sjkim    "Subtract Value",
163209746Sjkim    "Stall",
164209746Sjkim    "Stall While True",
165209746Sjkim    "Skip Next If True",
166209746Sjkim    "GoTo",
167209746Sjkim    "Set Source Address",
168209746Sjkim    "Set Destination Address",
169209746Sjkim    "Move Data",
170209746Sjkim    "Unknown Instruction"
171209746Sjkim};
172209746Sjkim
173281075Sdimstatic const char           *AcpiDmGtdtSubnames[] =
174281075Sdim{
175281075Sdim    "Generic Timer Block",
176281075Sdim    "Generic Watchdog Timer",
177284460Sjkim    "Unknown Subtable Type"         /* Reserved */
178281075Sdim};
179281075Sdim
180193529Sjkimstatic const char           *AcpiDmHestSubnames[] =
181193529Sjkim{
182197104Sjkim    "IA-32 Machine Check Exception",
183197104Sjkim    "IA-32 Corrected Machine Check",
184197104Sjkim    "IA-32 Non-Maskable Interrupt",
185197104Sjkim    "Unknown SubTable Type",        /* 3 - Reserved */
186197104Sjkim    "Unknown SubTable Type",        /* 4 - Reserved */
187197104Sjkim    "Unknown SubTable Type",        /* 5 - Reserved */
188193529Sjkim    "PCI Express Root Port AER",
189193529Sjkim    "PCI Express AER (AER Endpoint)",
190193529Sjkim    "PCI Express/PCI-X Bridge AER",
191193529Sjkim    "Generic Hardware Error Source",
192306536Sjkim    "Generic Hardware Error Source V2",
193284460Sjkim    "Unknown Subtable Type"         /* Reserved */
194193529Sjkim};
195193529Sjkim
196193529Sjkimstatic const char           *AcpiDmHestNotifySubnames[] =
197193529Sjkim{
198193529Sjkim    "Polled",
199193529Sjkim    "External Interrupt",
200193529Sjkim    "Local Interrupt",
201193529Sjkim    "SCI",
202193529Sjkim    "NMI",
203252279Sjkim    "CMCI",                         /* ACPI 5.0 */
204252279Sjkim    "MCE",                          /* ACPI 5.0 */
205306536Sjkim    "GPIO",                         /* ACPI 6.0 */
206306536Sjkim    "SEA",                          /* ACPI 6.1 */
207306536Sjkim    "SEI",                          /* ACPI 6.1 */
208306536Sjkim    "GSIV",                         /* ACPI 6.1 */
209193529Sjkim    "Unknown Notify Type"           /* Reserved */
210193529Sjkim};
211193529Sjkim
212167802Sjkimstatic const char           *AcpiDmMadtSubnames[] =
213167802Sjkim{
214281075Sdim    "Processor Local APIC",             /* ACPI_MADT_TYPE_LOCAL_APIC */
215281075Sdim    "I/O APIC",                         /* ACPI_MADT_TYPE_IO_APIC */
216281075Sdim    "Interrupt Source Override",        /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */
217281075Sdim    "NMI Source",                       /* ACPI_MADT_TYPE_NMI_SOURCE */
218281075Sdim    "Local APIC NMI",                   /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */
219281075Sdim    "Local APIC Address Override",      /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */
220281075Sdim    "I/O SAPIC",                        /* ACPI_MADT_TYPE_IO_SAPIC */
221281075Sdim    "Local SAPIC",                      /* ACPI_MADT_TYPE_LOCAL_SAPIC */
222281075Sdim    "Platform Interrupt Sources",       /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */
223281075Sdim    "Processor Local x2APIC",           /* ACPI_MADT_TYPE_LOCAL_X2APIC */
224281075Sdim    "Local x2APIC NMI",                 /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */
225281075Sdim    "Generic Interrupt Controller",     /* ACPI_MADT_GENERIC_INTERRUPT */
226281075Sdim    "Generic Interrupt Distributor",    /* ACPI_MADT_GENERIC_DISTRIBUTOR */
227281075Sdim    "Generic MSI Frame",                /* ACPI_MADT_GENERIC_MSI_FRAME */
228281075Sdim    "Generic Interrupt Redistributor",  /* ACPI_MADT_GENERIC_REDISTRIBUTOR */
229284460Sjkim    "Generic Interrupt Translator",     /* ACPI_MADT_GENERIC_TRANSLATOR */
230284460Sjkim    "Unknown Subtable Type"             /* Reserved */
231167802Sjkim};
232167802Sjkim
233284460Sjkimstatic const char           *AcpiDmNfitSubnames[] =
234284460Sjkim{
235284460Sjkim    "System Physical Address Range",    /* ACPI_NFIT_TYPE_SYSTEM_ADDRESS */
236284460Sjkim    "Memory Range Map",                 /* ACPI_NFIT_TYPE_MEMORY_MAP */
237284460Sjkim    "Interleave Info",                  /* ACPI_NFIT_TYPE_INTERLEAVE */
238284460Sjkim    "SMBIOS Information",               /* ACPI_NFIT_TYPE_SMBIOS */
239284460Sjkim    "NVDIMM Control Region",            /* ACPI_NFIT_TYPE_CONTROL_REGION */
240284460Sjkim    "NVDIMM Block Data Window Region",  /* ACPI_NFIT_TYPE_DATA_REGION */
241284460Sjkim    "Flush Hint Address",               /* ACPI_NFIT_TYPE_FLUSH_ADDRESS */
242284460Sjkim    "Unknown Subtable Type"             /* Reserved */
243284460Sjkim};
244284460Sjkim
245281075Sdimstatic const char           *AcpiDmPcctSubnames[] =
246281075Sdim{
247281075Sdim    "Generic Communications Subspace",  /* ACPI_PCCT_TYPE_GENERIC_SUBSPACE */
248284460Sjkim    "HW-Reduced Comm Subspace",         /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE */
249306536Sjkim    "HW-Reduced Comm Subspace Type2",   /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 */
250284460Sjkim    "Unknown Subtable Type"             /* Reserved */
251281075Sdim};
252281075Sdim
253228110Sjkimstatic const char           *AcpiDmPmttSubnames[] =
254228110Sjkim{
255228110Sjkim    "Socket",                       /* ACPI_PMTT_TYPE_SOCKET */
256228110Sjkim    "Memory Controller",            /* ACPI_PMTT_TYPE_CONTROLLER */
257228110Sjkim    "Physical Component (DIMM)",    /* ACPI_PMTT_TYPE_DIMM  */
258284460Sjkim    "Unknown Subtable Type"         /* Reserved */
259228110Sjkim};
260228110Sjkim
261167802Sjkimstatic const char           *AcpiDmSratSubnames[] =
262167802Sjkim{
263167802Sjkim    "Processor Local APIC/SAPIC Affinity",
264167802Sjkim    "Memory Affinity",
265193529Sjkim    "Processor Local x2APIC Affinity",
266281075Sdim    "GICC Affinity",
267284460Sjkim    "Unknown Subtable Type"         /* Reserved */
268167802Sjkim};
269167802Sjkim
270197104Sjkimstatic const char           *AcpiDmIvrsSubnames[] =
271197104Sjkim{
272197104Sjkim    "Hardware Definition Block",
273197104Sjkim    "Memory Definition Block",
274284460Sjkim    "Unknown Subtable Type"         /* Reserved */
275197104Sjkim};
276167802Sjkim
277281075Sdimstatic const char           *AcpiDmLpitSubnames[] =
278281075Sdim{
279281075Sdim    "Native C-state Idle Structure",
280284460Sjkim    "Unknown Subtable Type"         /* Reserved */
281281075Sdim};
282197104Sjkim
283229989Sjkim#define ACPI_FADT_PM_RESERVED       9
284193529Sjkim
285193529Sjkimstatic const char           *AcpiDmFadtProfiles[] =
286193529Sjkim{
287193529Sjkim    "Unspecified",
288193529Sjkim    "Desktop",
289193529Sjkim    "Mobile",
290193529Sjkim    "Workstation",
291193529Sjkim    "Enterprise Server",
292193529Sjkim    "SOHO Server",
293193529Sjkim    "Appliance PC",
294193529Sjkim    "Performance Server",
295229989Sjkim    "Tablet",
296193529Sjkim    "Unknown Profile Type"
297193529Sjkim};
298193529Sjkim
299216471Sjkim#define ACPI_GAS_WIDTH_RESERVED     5
300216471Sjkim
301216471Sjkimstatic const char           *AcpiDmGasAccessWidth[] =
302216471Sjkim{
303216471Sjkim    "Undefined/Legacy",
304216471Sjkim    "Byte Access:8",
305216471Sjkim    "Word Access:16",
306216471Sjkim    "DWord Access:32",
307216471Sjkim    "QWord Access:64",
308216471Sjkim    "Unknown Width Encoding"
309216471Sjkim};
310216471Sjkim
311216471Sjkim
312167802Sjkim/*******************************************************************************
313167802Sjkim *
314167802Sjkim * ACPI Table Data, indexed by signature.
315167802Sjkim *
316209746Sjkim * Each entry contains: Signature, Table Info, Handler, DtHandler,
317209746Sjkim *  Template, Description
318197104Sjkim *
319209746Sjkim * Simple tables have only a TableInfo structure, complex tables have a
320209746Sjkim * handler. This table must be NULL terminated. RSDP and FACS are
321209746Sjkim * special-cased elsewhere.
322167802Sjkim *
323284460Sjkim * Note: Any tables added here should be duplicated within AcpiSupportedTables
324284460Sjkim * in the file common/ahtable.c
325284460Sjkim *
326167802Sjkim ******************************************************************************/
327167802Sjkim
328284460Sjkimconst ACPI_DMTABLE_DATA     AcpiDmTableData[] =
329167802Sjkim{
330284460Sjkim    {ACPI_SIG_ASF,  NULL,                   AcpiDmDumpAsf,  DtCompileAsf,   TemplateAsf},
331284460Sjkim    {ACPI_SIG_BERT, AcpiDmTableInfoBert,    NULL,           NULL,           TemplateBert},
332284460Sjkim    {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt,    NULL,           NULL,           TemplateBgrt},
333284460Sjkim    {ACPI_SIG_BOOT, AcpiDmTableInfoBoot,    NULL,           NULL,           TemplateBoot},
334284460Sjkim    {ACPI_SIG_CPEP, NULL,                   AcpiDmDumpCpep, DtCompileCpep,  TemplateCpep},
335284460Sjkim    {ACPI_SIG_CSRT, NULL,                   AcpiDmDumpCsrt, DtCompileCsrt,  TemplateCsrt},
336284460Sjkim    {ACPI_SIG_DBG2, AcpiDmTableInfoDbg2,    AcpiDmDumpDbg2, DtCompileDbg2,  TemplateDbg2},
337284460Sjkim    {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp,    NULL,           NULL,           TemplateDbgp},
338284460Sjkim    {ACPI_SIG_DMAR, NULL,                   AcpiDmDumpDmar, DtCompileDmar,  TemplateDmar},
339284460Sjkim    {ACPI_SIG_DRTM, NULL,                   AcpiDmDumpDrtm, DtCompileDrtm,  TemplateDrtm},
340284460Sjkim    {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt,    NULL,           NULL,           TemplateEcdt},
341284460Sjkim    {ACPI_SIG_EINJ, NULL,                   AcpiDmDumpEinj, DtCompileEinj,  TemplateEinj},
342284460Sjkim    {ACPI_SIG_ERST, NULL,                   AcpiDmDumpErst, DtCompileErst,  TemplateErst},
343284460Sjkim    {ACPI_SIG_FADT, NULL,                   AcpiDmDumpFadt, DtCompileFadt,  TemplateFadt},
344284460Sjkim    {ACPI_SIG_FPDT, NULL,                   AcpiDmDumpFpdt, DtCompileFpdt,  TemplateFpdt},
345284460Sjkim    {ACPI_SIG_GTDT, NULL,                   AcpiDmDumpGtdt, DtCompileGtdt,  TemplateGtdt},
346284460Sjkim    {ACPI_SIG_HEST, NULL,                   AcpiDmDumpHest, DtCompileHest,  TemplateHest},
347284460Sjkim    {ACPI_SIG_HPET, AcpiDmTableInfoHpet,    NULL,           NULL,           TemplateHpet},
348284460Sjkim    {ACPI_SIG_IORT, NULL,                   AcpiDmDumpIort, DtCompileIort,  TemplateIort},
349284460Sjkim    {ACPI_SIG_IVRS, NULL,                   AcpiDmDumpIvrs, DtCompileIvrs,  TemplateIvrs},
350284460Sjkim    {ACPI_SIG_LPIT, NULL,                   AcpiDmDumpLpit, DtCompileLpit,  TemplateLpit},
351284460Sjkim    {ACPI_SIG_MADT, NULL,                   AcpiDmDumpMadt, DtCompileMadt,  TemplateMadt},
352284460Sjkim    {ACPI_SIG_MCFG, NULL,                   AcpiDmDumpMcfg, DtCompileMcfg,  TemplateMcfg},
353284460Sjkim    {ACPI_SIG_MCHI, AcpiDmTableInfoMchi,    NULL,           NULL,           TemplateMchi},
354284460Sjkim    {ACPI_SIG_MPST, AcpiDmTableInfoMpst,    AcpiDmDumpMpst, DtCompileMpst,  TemplateMpst},
355284460Sjkim    {ACPI_SIG_MSCT, NULL,                   AcpiDmDumpMsct, DtCompileMsct,  TemplateMsct},
356284460Sjkim    {ACPI_SIG_MSDM, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateMsdm},
357284460Sjkim    {ACPI_SIG_MTMR, NULL,                   AcpiDmDumpMtmr, DtCompileMtmr,  TemplateMtmr},
358284460Sjkim    {ACPI_SIG_NFIT, AcpiDmTableInfoNfit,    AcpiDmDumpNfit, DtCompileNfit,  TemplateNfit},
359284460Sjkim    {ACPI_SIG_PCCT, AcpiDmTableInfoPcct,    AcpiDmDumpPcct, DtCompilePcct,  TemplatePcct},
360284460Sjkim    {ACPI_SIG_PMTT, NULL,                   AcpiDmDumpPmtt, DtCompilePmtt,  TemplatePmtt},
361284460Sjkim    {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, DtCompileRsdt,  TemplateRsdt},
362284460Sjkim    {ACPI_SIG_S3PT, NULL,                   NULL,           NULL,           TemplateS3pt},
363284460Sjkim    {ACPI_SIG_SBST, AcpiDmTableInfoSbst,    NULL,           NULL,           TemplateSbst},
364284460Sjkim    {ACPI_SIG_SLIC, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateSlic},
365284460Sjkim    {ACPI_SIG_SLIT, NULL,                   AcpiDmDumpSlit, DtCompileSlit,  TemplateSlit},
366284460Sjkim    {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr,    NULL,           NULL,           TemplateSpcr},
367284460Sjkim    {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi,    NULL,           NULL,           TemplateSpmi},
368284460Sjkim    {ACPI_SIG_SRAT, NULL,                   AcpiDmDumpSrat, DtCompileSrat,  TemplateSrat},
369284460Sjkim    {ACPI_SIG_STAO, NULL,                   AcpiDmDumpStao, DtCompileStao,  TemplateStao},
370306536Sjkim    {ACPI_SIG_TCPA, NULL,                   AcpiDmDumpTcpa, DtCompileTcpa,  TemplateTcpa},
371284460Sjkim    {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2,    NULL,           NULL,           TemplateTpm2},
372284460Sjkim    {ACPI_SIG_UEFI, AcpiDmTableInfoUefi,    NULL,           DtCompileUefi,  TemplateUefi},
373284460Sjkim    {ACPI_SIG_VRTC, AcpiDmTableInfoVrtc,    AcpiDmDumpVrtc, DtCompileVrtc,  TemplateVrtc},
374284460Sjkim    {ACPI_SIG_WAET, AcpiDmTableInfoWaet,    NULL,           NULL,           TemplateWaet},
375284460Sjkim    {ACPI_SIG_WDAT, NULL,                   AcpiDmDumpWdat, DtCompileWdat,  TemplateWdat},
376284460Sjkim    {ACPI_SIG_WDDT, AcpiDmTableInfoWddt,    NULL,           NULL,           TemplateWddt},
377284460Sjkim    {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt,    NULL,           NULL,           TemplateWdrt},
378284460Sjkim    {ACPI_SIG_WPBT, NULL,                   AcpiDmDumpWpbt, DtCompileWpbt,  TemplateWpbt},
379284460Sjkim    {ACPI_SIG_XENV, AcpiDmTableInfoXenv,    NULL,           NULL,           TemplateXenv},
380284460Sjkim    {ACPI_SIG_XSDT, NULL,                   AcpiDmDumpXsdt, DtCompileXsdt,  TemplateXsdt},
381284460Sjkim    {NULL,          NULL,                   NULL,           NULL,           NULL}
382167802Sjkim};
383167802Sjkim
384167802Sjkim
385167802Sjkim/*******************************************************************************
386167802Sjkim *
387209746Sjkim * FUNCTION:    AcpiDmGenerateChecksum
388167802Sjkim *
389209746Sjkim * PARAMETERS:  Table               - Pointer to table to be checksummed
390209746Sjkim *              Length              - Length of the table
391209746Sjkim *              OriginalChecksum    - Value of the checksum field
392167802Sjkim *
393167802Sjkim * RETURN:      8 bit checksum of buffer
394167802Sjkim *
395167802Sjkim * DESCRIPTION: Computes an 8 bit checksum of the table.
396167802Sjkim *
397167802Sjkim ******************************************************************************/
398167802Sjkim
399167802SjkimUINT8
400209746SjkimAcpiDmGenerateChecksum (
401209746Sjkim    void                    *Table,
402209746Sjkim    UINT32                  Length,
403209746Sjkim    UINT8                   OriginalChecksum)
404167802Sjkim{
405167802Sjkim    UINT8                   Checksum;
406167802Sjkim
407167802Sjkim
408167802Sjkim    /* Sum the entire table as-is */
409167802Sjkim
410209746Sjkim    Checksum = AcpiTbChecksum ((UINT8 *) Table, Length);
411167802Sjkim
412167802Sjkim    /* Subtract off the existing checksum value in the table */
413167802Sjkim
414209746Sjkim    Checksum = (UINT8) (Checksum - OriginalChecksum);
415167802Sjkim
416167802Sjkim    /* Compute the final checksum */
417167802Sjkim
418167802Sjkim    Checksum = (UINT8) (0 - Checksum);
419167802Sjkim    return (Checksum);
420167802Sjkim}
421167802Sjkim
422167802Sjkim
423167802Sjkim/*******************************************************************************
424167802Sjkim *
425167802Sjkim * FUNCTION:    AcpiDmGetTableData
426167802Sjkim *
427167802Sjkim * PARAMETERS:  Signature           - ACPI signature (4 chars) to match
428167802Sjkim *
429167802Sjkim * RETURN:      Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
430167802Sjkim *
431167802Sjkim * DESCRIPTION: Find a match in the global table of supported ACPI tables
432167802Sjkim *
433167802Sjkim ******************************************************************************/
434167802Sjkim
435284460Sjkimconst ACPI_DMTABLE_DATA *
436167802SjkimAcpiDmGetTableData (
437167802Sjkim    char                    *Signature)
438167802Sjkim{
439284460Sjkim    const ACPI_DMTABLE_DATA *Info;
440167802Sjkim
441167802Sjkim
442284460Sjkim    for (Info = AcpiDmTableData; Info->Signature; Info++)
443167802Sjkim    {
444284460Sjkim        if (ACPI_COMPARE_NAME (Signature, Info->Signature))
445167802Sjkim        {
446284460Sjkim            return (Info);
447167802Sjkim        }
448167802Sjkim    }
449167802Sjkim
450167802Sjkim    return (NULL);
451167802Sjkim}
452167802Sjkim
453167802Sjkim
454167802Sjkim/*******************************************************************************
455167802Sjkim *
456167802Sjkim * FUNCTION:    AcpiDmDumpDataTable
457167802Sjkim *
458167802Sjkim * PARAMETERS:  Table               - An ACPI table
459167802Sjkim *
460167802Sjkim * RETURN:      None.
461167802Sjkim *
462167802Sjkim * DESCRIPTION: Format the contents of an ACPI data table (any table other
463167802Sjkim *              than an SSDT or DSDT that does not contain executable AML code)
464167802Sjkim *
465167802Sjkim ******************************************************************************/
466167802Sjkim
467167802Sjkimvoid
468167802SjkimAcpiDmDumpDataTable (
469167802Sjkim    ACPI_TABLE_HEADER       *Table)
470167802Sjkim{
471193529Sjkim    ACPI_STATUS             Status;
472284460Sjkim    const ACPI_DMTABLE_DATA *TableData;
473167802Sjkim    UINT32                  Length;
474167802Sjkim
475167802Sjkim
476167802Sjkim    /* Ignore tables that contain AML */
477167802Sjkim
478167802Sjkim    if (AcpiUtIsAmlTable (Table))
479167802Sjkim    {
480241973Sjkim        if (Gbl_VerboseTemplates)
481241973Sjkim        {
482241973Sjkim            /* Dump the raw table data */
483241973Sjkim
484241973Sjkim            Length = Table->Length;
485241973Sjkim
486241973Sjkim            AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n",
487241973Sjkim                ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
488241973Sjkim            AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
489241973Sjkim                Length, DB_BYTE_DISPLAY, 0);
490241973Sjkim            AcpiOsPrintf (" */\n");
491241973Sjkim        }
492167802Sjkim        return;
493167802Sjkim    }
494167802Sjkim
495167802Sjkim    /*
496167802Sjkim     * Handle tables that don't use the common ACPI table header structure.
497228110Sjkim     * Currently, these are the FACS, RSDP, and S3PT.
498167802Sjkim     */
499167802Sjkim    if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS))
500167802Sjkim    {
501167802Sjkim        Length = Table->Length;
502306536Sjkim        Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
503306536Sjkim        if (ACPI_FAILURE (Status))
504306536Sjkim        {
505306536Sjkim            return;
506306536Sjkim        }
507167802Sjkim    }
508254745Sjkim    else if (ACPI_VALIDATE_RSDP_SIG (Table->Signature))
509167802Sjkim    {
510167802Sjkim        Length = AcpiDmDumpRsdp (Table);
511167802Sjkim    }
512228110Sjkim    else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT))
513228110Sjkim    {
514228110Sjkim        Length = AcpiDmDumpS3pt (Table);
515228110Sjkim    }
516167802Sjkim    else
517167802Sjkim    {
518167802Sjkim        /*
519167802Sjkim         * All other tables must use the common ACPI table header, dump it now
520167802Sjkim         */
521167802Sjkim        Length = Table->Length;
522193529Sjkim        Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
523193529Sjkim        if (ACPI_FAILURE (Status))
524193529Sjkim        {
525193529Sjkim            return;
526193529Sjkim        }
527167802Sjkim        AcpiOsPrintf ("\n");
528167802Sjkim
529167802Sjkim        /* Match signature and dispatch appropriately */
530167802Sjkim
531167802Sjkim        TableData = AcpiDmGetTableData (Table->Signature);
532167802Sjkim        if (!TableData)
533167802Sjkim        {
534306536Sjkim            if (!strncmp (Table->Signature, "OEM", 3))
535167802Sjkim            {
536167802Sjkim                AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
537167802Sjkim                    Table->Signature);
538167802Sjkim            }
539167802Sjkim            else
540167802Sjkim            {
541281687Sjkim                AcpiOsPrintf ("\n**** Unknown ACPI table signature [%4.4s]\n\n",
542167802Sjkim                    Table->Signature);
543281687Sjkim
544281687Sjkim                fprintf (stderr, "Unknown ACPI table signature [%4.4s], ",
545246849Sjkim                    Table->Signature);
546281687Sjkim
547281687Sjkim                if (!AcpiGbl_ForceAmlDisassembly)
548281687Sjkim                {
549281687Sjkim                    fprintf (stderr, "decoding ACPI table header only\n");
550281687Sjkim                }
551281687Sjkim                else
552281687Sjkim                {
553281687Sjkim                    fprintf (stderr, "assuming table contains valid AML code\n");
554281687Sjkim                }
555167802Sjkim            }
556167802Sjkim        }
557167802Sjkim        else if (TableData->TableHandler)
558167802Sjkim        {
559167802Sjkim            /* Complex table, has a handler */
560167802Sjkim
561167802Sjkim            TableData->TableHandler (Table);
562167802Sjkim        }
563167802Sjkim        else if (TableData->TableInfo)
564167802Sjkim        {
565167802Sjkim            /* Simple table, just walk the info table */
566167802Sjkim
567306536Sjkim            Status = AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
568306536Sjkim            if (ACPI_FAILURE (Status))
569306536Sjkim            {
570306536Sjkim                return;
571306536Sjkim            }
572167802Sjkim        }
573167802Sjkim    }
574167802Sjkim
575209746Sjkim    if (!Gbl_DoTemplates || Gbl_VerboseTemplates)
576209746Sjkim    {
577209746Sjkim        /* Dump the raw table data */
578167802Sjkim
579217365Sjkim        AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
580217365Sjkim            ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
581241973Sjkim        AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
582241973Sjkim            Length, DB_BYTE_DISPLAY, 0);
583209746Sjkim    }
584167802Sjkim}
585167802Sjkim
586167802Sjkim
587167802Sjkim/*******************************************************************************
588167802Sjkim *
589167802Sjkim * FUNCTION:    AcpiDmLineHeader
590167802Sjkim *
591167802Sjkim * PARAMETERS:  Offset              - Current byte offset, from table start
592167802Sjkim *              ByteLength          - Length of the field in bytes, 0 for flags
593167802Sjkim *              Name                - Name of this field
594167802Sjkim *
595167802Sjkim * RETURN:      None
596167802Sjkim *
597167802Sjkim * DESCRIPTION: Utility routines for formatting output lines. Displays the
598167802Sjkim *              current table offset in hex and decimal, the field length,
599167802Sjkim *              and the field name.
600167802Sjkim *
601167802Sjkim ******************************************************************************/
602167802Sjkim
603167802Sjkimvoid
604167802SjkimAcpiDmLineHeader (
605167802Sjkim    UINT32                  Offset,
606167802Sjkim    UINT32                  ByteLength,
607167802Sjkim    char                    *Name)
608167802Sjkim{
609167802Sjkim
610219707Sjkim    /* Allow a null name for fields that span multiple lines (large buffers) */
611219707Sjkim
612219707Sjkim    if (!Name)
613219707Sjkim    {
614219707Sjkim        Name = "";
615219707Sjkim    }
616219707Sjkim
617209746Sjkim    if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */
618167802Sjkim    {
619209746Sjkim        if (ByteLength)
620209746Sjkim        {
621219707Sjkim            AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name);
622209746Sjkim        }
623209746Sjkim        else
624209746Sjkim        {
625220663Sjkim            if (*Name)
626220663Sjkim            {
627220663Sjkim                AcpiOsPrintf ("%41s : ", Name);
628220663Sjkim            }
629220663Sjkim            else
630220663Sjkim            {
631220663Sjkim                AcpiOsPrintf ("%41s   ", Name);
632220663Sjkim            }
633209746Sjkim        }
634167802Sjkim    }
635209746Sjkim    else /* Normal disassembler or verbose template */
636167802Sjkim    {
637209746Sjkim        if (ByteLength)
638209746Sjkim        {
639219707Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d% 4d] %28s : ",
640209746Sjkim                Offset, Offset, ByteLength, Name);
641209746Sjkim        }
642209746Sjkim        else
643209746Sjkim        {
644220663Sjkim            if (*Name)
645220663Sjkim            {
646220663Sjkim                AcpiOsPrintf ("%44s : ", Name);
647220663Sjkim            }
648220663Sjkim            else
649220663Sjkim            {
650220663Sjkim                AcpiOsPrintf ("%44s   ", Name);
651220663Sjkim            }
652209746Sjkim        }
653167802Sjkim    }
654167802Sjkim}
655167802Sjkim
656167802Sjkimvoid
657167802SjkimAcpiDmLineHeader2 (
658167802Sjkim    UINT32                  Offset,
659167802Sjkim    UINT32                  ByteLength,
660167802Sjkim    char                    *Name,
661167802Sjkim    UINT32                  Value)
662167802Sjkim{
663167802Sjkim
664209746Sjkim    if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */
665167802Sjkim    {
666209746Sjkim        if (ByteLength)
667209746Sjkim        {
668220663Sjkim            AcpiOsPrintf ("[%.4d] %30s %3d : ",
669209746Sjkim                ByteLength, Name, Value);
670209746Sjkim        }
671209746Sjkim        else
672209746Sjkim        {
673209746Sjkim            AcpiOsPrintf ("%36s % 3d : ",
674209746Sjkim                Name, Value);
675209746Sjkim        }
676167802Sjkim    }
677209746Sjkim    else /* Normal disassembler or verbose template */
678167802Sjkim    {
679209746Sjkim        if (ByteLength)
680209746Sjkim        {
681220663Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d %3d] %24s %3d : ",
682209746Sjkim                Offset, Offset, ByteLength, Name, Value);
683209746Sjkim        }
684209746Sjkim        else
685209746Sjkim        {
686220663Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d   ] %24s %3d : ",
687209746Sjkim                Offset, Offset, Name, Value);
688209746Sjkim        }
689167802Sjkim    }
690167802Sjkim}
691167802Sjkim
692167802Sjkim
693167802Sjkim/*******************************************************************************
694167802Sjkim *
695167802Sjkim * FUNCTION:    AcpiDmDumpTable
696167802Sjkim *
697167802Sjkim * PARAMETERS:  TableLength         - Length of the entire ACPI table
698167802Sjkim *              TableOffset         - Starting offset within the table for this
699167802Sjkim *                                    sub-descriptor (0 if main table)
700167802Sjkim *              Table               - The ACPI table
701193529Sjkim *              SubtableLength      - Length of this sub-descriptor
702167802Sjkim *              Info                - Info table for this ACPI table
703167802Sjkim *
704306536Sjkim * RETURN:      Status
705167802Sjkim *
706167802Sjkim * DESCRIPTION: Display ACPI table contents by walking the Info table.
707167802Sjkim *
708209746Sjkim * Note: This function must remain in sync with DtGetFieldLength.
709209746Sjkim *
710167802Sjkim ******************************************************************************/
711167802Sjkim
712193529SjkimACPI_STATUS
713167802SjkimAcpiDmDumpTable (
714167802Sjkim    UINT32                  TableLength,
715167802Sjkim    UINT32                  TableOffset,
716167802Sjkim    void                    *Table,
717167802Sjkim    UINT32                  SubtableLength,
718167802Sjkim    ACPI_DMTABLE_INFO       *Info)
719167802Sjkim{
720167802Sjkim    UINT8                   *Target;
721167802Sjkim    UINT32                  CurrentOffset;
722167802Sjkim    UINT32                  ByteLength;
723167802Sjkim    UINT8                   Temp8;
724167802Sjkim    UINT16                  Temp16;
725281687Sjkim    UINT32                  Temp32;
726281075Sdim    UINT64                  Value;
727284460Sjkim    const AH_TABLE          *TableData;
728197104Sjkim    const char              *Name;
729193529Sjkim    BOOLEAN                 LastOutputBlankLine = FALSE;
730306536Sjkim    ACPI_STATUS             Status;
731197104Sjkim    char                    RepairedName[8];
732167802Sjkim
733167802Sjkim
734167802Sjkim    if (!Info)
735167802Sjkim    {
736167802Sjkim        AcpiOsPrintf ("Display not implemented\n");
737193529Sjkim        return (AE_NOT_IMPLEMENTED);
738167802Sjkim    }
739167802Sjkim
740167802Sjkim    /* Walk entire Info table; Null name terminates */
741167802Sjkim
742167802Sjkim    for (; Info->Name; Info++)
743167802Sjkim    {
744167802Sjkim        /*
745167802Sjkim         * Target points to the field within the ACPI Table. CurrentOffset is
746167802Sjkim         * the offset of the field from the start of the main table.
747167802Sjkim         */
748167802Sjkim        Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
749167802Sjkim        CurrentOffset = TableOffset + Info->Offset;
750167802Sjkim
751284460Sjkim        /* Check for beyond subtable end or (worse) beyond EOT */
752167802Sjkim
753284460Sjkim        if (SubtableLength && (Info->Offset >= SubtableLength))
754167802Sjkim        {
755281687Sjkim            AcpiOsPrintf (
756284460Sjkim                "/**** ACPI subtable terminates early - "
757284460Sjkim                "may be older version (dump table) */\n");
758284460Sjkim
759284460Sjkim            /* Move on to next subtable */
760284460Sjkim
761284460Sjkim            return (AE_OK);
762284460Sjkim        }
763284460Sjkim
764284460Sjkim        if (CurrentOffset >= TableLength)
765284460Sjkim        {
766284460Sjkim            AcpiOsPrintf (
767284460Sjkim                "/**** ACPI table terminates "
768284460Sjkim                "in the middle of a data structure! (dump table) */\n");
769193529Sjkim            return (AE_BAD_DATA);
770167802Sjkim        }
771167802Sjkim
772167802Sjkim        /* Generate the byte length for this field */
773167802Sjkim
774167802Sjkim        switch (Info->Opcode)
775167802Sjkim        {
776167802Sjkim        case ACPI_DMT_UINT8:
777167802Sjkim        case ACPI_DMT_CHKSUM:
778167802Sjkim        case ACPI_DMT_SPACEID:
779216471Sjkim        case ACPI_DMT_ACCWIDTH:
780197104Sjkim        case ACPI_DMT_IVRS:
781281075Sdim        case ACPI_DMT_GTDT:
782167802Sjkim        case ACPI_DMT_MADT:
783281075Sdim        case ACPI_DMT_PCCT:
784228110Sjkim        case ACPI_DMT_PMTT:
785167802Sjkim        case ACPI_DMT_SRAT:
786193529Sjkim        case ACPI_DMT_ASF:
787193529Sjkim        case ACPI_DMT_HESTNTYP:
788193529Sjkim        case ACPI_DMT_FADTPM:
789209746Sjkim        case ACPI_DMT_EINJACT:
790209746Sjkim        case ACPI_DMT_EINJINST:
791209746Sjkim        case ACPI_DMT_ERSTACT:
792209746Sjkim        case ACPI_DMT_ERSTINST:
793281075Sdim        case ACPI_DMT_DMAR_SCOPE:
794250838Sjkim
795167802Sjkim            ByteLength = 1;
796167802Sjkim            break;
797250838Sjkim
798167802Sjkim        case ACPI_DMT_UINT16:
799167802Sjkim        case ACPI_DMT_DMAR:
800193529Sjkim        case ACPI_DMT_HEST:
801284460Sjkim        case ACPI_DMT_NFIT:
802250838Sjkim
803167802Sjkim            ByteLength = 2;
804167802Sjkim            break;
805250838Sjkim
806167802Sjkim        case ACPI_DMT_UINT24:
807250838Sjkim
808167802Sjkim            ByteLength = 3;
809167802Sjkim            break;
810250838Sjkim
811167802Sjkim        case ACPI_DMT_UINT32:
812167802Sjkim        case ACPI_DMT_NAME4:
813167802Sjkim        case ACPI_DMT_SIG:
814281075Sdim        case ACPI_DMT_LPIT:
815250838Sjkim
816167802Sjkim            ByteLength = 4;
817167802Sjkim            break;
818250838Sjkim
819228110Sjkim        case ACPI_DMT_UINT40:
820250838Sjkim
821228110Sjkim            ByteLength = 5;
822228110Sjkim            break;
823250838Sjkim
824228110Sjkim        case ACPI_DMT_UINT48:
825167802Sjkim        case ACPI_DMT_NAME6:
826250838Sjkim
827167802Sjkim            ByteLength = 6;
828167802Sjkim            break;
829250838Sjkim
830167802Sjkim        case ACPI_DMT_UINT56:
831218590Sjkim        case ACPI_DMT_BUF7:
832250838Sjkim
833167802Sjkim            ByteLength = 7;
834167802Sjkim            break;
835250838Sjkim
836167802Sjkim        case ACPI_DMT_UINT64:
837167802Sjkim        case ACPI_DMT_NAME8:
838250838Sjkim
839167802Sjkim            ByteLength = 8;
840167802Sjkim            break;
841250838Sjkim
842252279Sjkim        case ACPI_DMT_BUF10:
843252279Sjkim
844252279Sjkim            ByteLength = 10;
845252279Sjkim            break;
846252279Sjkim
847197104Sjkim        case ACPI_DMT_BUF16:
848217365Sjkim        case ACPI_DMT_UUID:
849250838Sjkim
850197104Sjkim            ByteLength = 16;
851197104Sjkim            break;
852250838Sjkim
853219707Sjkim        case ACPI_DMT_BUF128:
854250838Sjkim
855219707Sjkim            ByteLength = 128;
856219707Sjkim            break;
857250838Sjkim
858284460Sjkim        case ACPI_DMT_UNICODE:
859281687Sjkim        case ACPI_DMT_BUFFER:
860281687Sjkim        case ACPI_DMT_RAW_BUFFER:
861281687Sjkim
862281687Sjkim            ByteLength = SubtableLength;
863281687Sjkim            break;
864281687Sjkim
865167802Sjkim        case ACPI_DMT_STRING:
866250838Sjkim
867306536Sjkim            ByteLength = strlen (ACPI_CAST_PTR (char, Target)) + 1;
868167802Sjkim            break;
869250838Sjkim
870167802Sjkim        case ACPI_DMT_GAS:
871250838Sjkim
872193529Sjkim            if (!LastOutputBlankLine)
873193529Sjkim            {
874193529Sjkim                AcpiOsPrintf ("\n");
875193529Sjkim                LastOutputBlankLine = TRUE;
876193529Sjkim            }
877306536Sjkim
878167802Sjkim            ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
879167802Sjkim            break;
880250838Sjkim
881193529Sjkim        case ACPI_DMT_HESTNTFY:
882250838Sjkim
883193529Sjkim            if (!LastOutputBlankLine)
884193529Sjkim            {
885193529Sjkim                AcpiOsPrintf ("\n");
886193529Sjkim                LastOutputBlankLine = TRUE;
887193529Sjkim            }
888306536Sjkim
889193529Sjkim            ByteLength = sizeof (ACPI_HEST_NOTIFY);
890193529Sjkim            break;
891250838Sjkim
892284460Sjkim        case ACPI_DMT_IORTMEM:
893284460Sjkim
894284460Sjkim            if (!LastOutputBlankLine)
895284460Sjkim            {
896284460Sjkim                LastOutputBlankLine = FALSE;
897284460Sjkim            }
898306536Sjkim
899284460Sjkim            ByteLength = sizeof (ACPI_IORT_MEMORY_ACCESS);
900284460Sjkim            break;
901284460Sjkim
902167802Sjkim        default:
903250838Sjkim
904167802Sjkim            ByteLength = 0;
905167802Sjkim            break;
906167802Sjkim        }
907167802Sjkim
908284460Sjkim        /* Check if we are beyond a subtable, or (worse) beyond EOT */
909284460Sjkim
910193529Sjkim        if (CurrentOffset + ByteLength > TableLength)
911193529Sjkim        {
912284460Sjkim            if (SubtableLength)
913284460Sjkim            {
914284460Sjkim                AcpiOsPrintf (
915284460Sjkim                    "/**** ACPI subtable terminates early - "
916284460Sjkim                    "may be older version (dump table) */\n");
917284460Sjkim
918284460Sjkim                /* Move on to next subtable */
919284460Sjkim
920284460Sjkim                return (AE_OK);
921284460Sjkim            }
922284460Sjkim
923281687Sjkim            AcpiOsPrintf (
924284460Sjkim                "/**** ACPI table terminates "
925284460Sjkim                "in the middle of a data structure! */\n");
926193529Sjkim            return (AE_BAD_DATA);
927193529Sjkim        }
928193529Sjkim
929228110Sjkim        if (Info->Opcode == ACPI_DMT_EXTRA_TEXT)
930228110Sjkim        {
931228110Sjkim            AcpiOsPrintf ("%s", Info->Name);
932228110Sjkim            continue;
933228110Sjkim        }
934228110Sjkim
935167802Sjkim        /* Start a new line and decode the opcode */
936167802Sjkim
937167802Sjkim        AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
938167802Sjkim
939167802Sjkim        switch (Info->Opcode)
940167802Sjkim        {
941167802Sjkim        /* Single-bit Flag fields. Note: Opcode is the bit position */
942167802Sjkim
943167802Sjkim        case ACPI_DMT_FLAG0:
944167802Sjkim        case ACPI_DMT_FLAG1:
945167802Sjkim        case ACPI_DMT_FLAG2:
946167802Sjkim        case ACPI_DMT_FLAG3:
947167802Sjkim        case ACPI_DMT_FLAG4:
948167802Sjkim        case ACPI_DMT_FLAG5:
949167802Sjkim        case ACPI_DMT_FLAG6:
950167802Sjkim        case ACPI_DMT_FLAG7:
951167802Sjkim
952167802Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
953167802Sjkim            break;
954167802Sjkim
955167802Sjkim        /* 2-bit Flag fields */
956167802Sjkim
957167802Sjkim        case ACPI_DMT_FLAGS0:
958167802Sjkim
959167802Sjkim            AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
960167802Sjkim            break;
961167802Sjkim
962228110Sjkim        case ACPI_DMT_FLAGS1:
963228110Sjkim
964228110Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03);
965228110Sjkim            break;
966228110Sjkim
967167802Sjkim        case ACPI_DMT_FLAGS2:
968167802Sjkim
969167802Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
970167802Sjkim            break;
971167802Sjkim
972228110Sjkim        case ACPI_DMT_FLAGS4:
973167802Sjkim
974228110Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03);
975167802Sjkim            break;
976167802Sjkim
977228110Sjkim        /* Integer Data Types */
978228110Sjkim
979228110Sjkim        case ACPI_DMT_UINT8:
980167802Sjkim        case ACPI_DMT_UINT16:
981167802Sjkim        case ACPI_DMT_UINT24:
982167802Sjkim        case ACPI_DMT_UINT32:
983228110Sjkim        case ACPI_DMT_UINT40:
984228110Sjkim        case ACPI_DMT_UINT48:
985167802Sjkim        case ACPI_DMT_UINT56:
986228110Sjkim        case ACPI_DMT_UINT64:
987228110Sjkim            /*
988228110Sjkim             * Dump bytes - high byte first, low byte last.
989228110Sjkim             * Note: All ACPI tables are little-endian.
990228110Sjkim             */
991281075Sdim            Value = 0;
992228110Sjkim            for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--)
993193529Sjkim            {
994228110Sjkim                AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]);
995281075Sdim                Value |= Target[Temp8 - 1];
996281075Sdim                Value <<= 8;
997193529Sjkim            }
998281075Sdim
999281075Sdim            if (!Value && (Info->Flags & DT_DESCRIBES_OPTIONAL))
1000281075Sdim            {
1001281075Sdim                AcpiOsPrintf (" [Optional field not present]");
1002281075Sdim            }
1003281075Sdim
1004193529Sjkim            AcpiOsPrintf ("\n");
1005167802Sjkim            break;
1006167802Sjkim
1007218590Sjkim        case ACPI_DMT_BUF7:
1008252279Sjkim        case ACPI_DMT_BUF10:
1009197104Sjkim        case ACPI_DMT_BUF16:
1010219707Sjkim        case ACPI_DMT_BUF128:
1011218590Sjkim            /*
1012218590Sjkim             * Buffer: Size depends on the opcode and was set above.
1013218590Sjkim             * Each hex byte is separated with a space.
1014220663Sjkim             * Multiple lines are separated by line continuation char.
1015218590Sjkim             */
1016219707Sjkim            for (Temp16 = 0; Temp16 < ByteLength; Temp16++)
1017197104Sjkim            {
1018219707Sjkim                AcpiOsPrintf ("%2.2X", Target[Temp16]);
1019219707Sjkim                if ((UINT32) (Temp16 + 1) < ByteLength)
1020209746Sjkim                {
1021219707Sjkim                    if ((Temp16 > 0) && (!((Temp16+1) % 16)))
1022219707Sjkim                    {
1023220663Sjkim                        AcpiOsPrintf (" \\\n"); /* Line continuation */
1024219707Sjkim                        AcpiDmLineHeader (0, 0, NULL);
1025219707Sjkim                    }
1026219707Sjkim                    else
1027219707Sjkim                    {
1028219707Sjkim                        AcpiOsPrintf (" ");
1029219707Sjkim                    }
1030209746Sjkim                }
1031197104Sjkim            }
1032306536Sjkim
1033197104Sjkim            AcpiOsPrintf ("\n");
1034197104Sjkim            break;
1035197104Sjkim
1036217365Sjkim        case ACPI_DMT_UUID:
1037217365Sjkim
1038217365Sjkim            /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */
1039217365Sjkim
1040217365Sjkim            (void) AuConvertUuidToString ((char *) Target, MsgBuffer);
1041217365Sjkim
1042217365Sjkim            AcpiOsPrintf ("%s\n", MsgBuffer);
1043217365Sjkim            break;
1044217365Sjkim
1045167802Sjkim        case ACPI_DMT_STRING:
1046167802Sjkim
1047197104Sjkim            AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target));
1048167802Sjkim            break;
1049167802Sjkim
1050167802Sjkim        /* Fixed length ASCII name fields */
1051167802Sjkim
1052167802Sjkim        case ACPI_DMT_SIG:
1053167802Sjkim
1054306536Sjkim            AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
1055197104Sjkim            AcpiOsPrintf ("\"%.4s\"    ", RepairedName);
1056306536Sjkim
1057284460Sjkim            TableData = AcpiAhGetTableInfo (ACPI_CAST_PTR (char, Target));
1058167802Sjkim            if (TableData)
1059167802Sjkim            {
1060284460Sjkim                AcpiOsPrintf (STRING_FORMAT, TableData->Description);
1061167802Sjkim            }
1062220663Sjkim            else
1063220663Sjkim            {
1064220663Sjkim                AcpiOsPrintf ("\n");
1065220663Sjkim            }
1066167802Sjkim            break;
1067167802Sjkim
1068167802Sjkim        case ACPI_DMT_NAME4:
1069167802Sjkim
1070306536Sjkim            AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
1071197104Sjkim            AcpiOsPrintf ("\"%.4s\"\n", RepairedName);
1072167802Sjkim            break;
1073167802Sjkim
1074167802Sjkim        case ACPI_DMT_NAME6:
1075167802Sjkim
1076306536Sjkim            AcpiUtCheckAndRepairAscii (Target, RepairedName, 6);
1077197104Sjkim            AcpiOsPrintf ("\"%.6s\"\n", RepairedName);
1078167802Sjkim            break;
1079167802Sjkim
1080167802Sjkim        case ACPI_DMT_NAME8:
1081167802Sjkim
1082306536Sjkim            AcpiUtCheckAndRepairAscii (Target, RepairedName, 8);
1083197104Sjkim            AcpiOsPrintf ("\"%.8s\"\n", RepairedName);
1084167802Sjkim            break;
1085167802Sjkim
1086167802Sjkim        /* Special Data Types */
1087167802Sjkim
1088167802Sjkim        case ACPI_DMT_CHKSUM:
1089167802Sjkim
1090167802Sjkim            /* Checksum, display and validate */
1091167802Sjkim
1092167802Sjkim            AcpiOsPrintf ("%2.2X", *Target);
1093209746Sjkim            Temp8 = AcpiDmGenerateChecksum (Table,
1094281687Sjkim                ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
1095281687Sjkim                ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
1096281687Sjkim
1097167802Sjkim            if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
1098167802Sjkim            {
1099167802Sjkim                AcpiOsPrintf (
1100167802Sjkim                    "     /* Incorrect checksum, should be %2.2X */", Temp8);
1101167802Sjkim            }
1102306536Sjkim
1103167802Sjkim            AcpiOsPrintf ("\n");
1104167802Sjkim            break;
1105167802Sjkim
1106167802Sjkim        case ACPI_DMT_SPACEID:
1107167802Sjkim
1108167802Sjkim            /* Address Space ID */
1109167802Sjkim
1110220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target));
1111167802Sjkim            break;
1112167802Sjkim
1113216471Sjkim        case ACPI_DMT_ACCWIDTH:
1114216471Sjkim
1115216471Sjkim            /* Encoded Access Width */
1116216471Sjkim
1117216471Sjkim            Temp8 = *Target;
1118216471Sjkim            if (Temp8 > ACPI_GAS_WIDTH_RESERVED)
1119216471Sjkim            {
1120216471Sjkim                Temp8 = ACPI_GAS_WIDTH_RESERVED;
1121216471Sjkim            }
1122216471Sjkim
1123281687Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmGasAccessWidth[Temp8]);
1124216471Sjkim            break;
1125216471Sjkim
1126167802Sjkim        case ACPI_DMT_GAS:
1127167802Sjkim
1128167802Sjkim            /* Generic Address Structure */
1129167802Sjkim
1130220663Sjkim            AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure");
1131306536Sjkim            Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1132197104Sjkim                sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas);
1133306536Sjkim            if (ACPI_FAILURE (Status))
1134306536Sjkim            {
1135306536Sjkim                return (Status);
1136306536Sjkim            }
1137306536Sjkim
1138193529Sjkim            AcpiOsPrintf ("\n");
1139193529Sjkim            LastOutputBlankLine = TRUE;
1140167802Sjkim            break;
1141167802Sjkim
1142193529Sjkim        case ACPI_DMT_ASF:
1143193529Sjkim
1144193529Sjkim            /* ASF subtable types */
1145193529Sjkim
1146193529Sjkim            Temp16 = (UINT16) ((*Target) & 0x7F);  /* Top bit can be zero or one */
1147193529Sjkim            if (Temp16 > ACPI_ASF_TYPE_RESERVED)
1148193529Sjkim            {
1149193529Sjkim                Temp16 = ACPI_ASF_TYPE_RESERVED;
1150193529Sjkim            }
1151193529Sjkim
1152220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]);
1153193529Sjkim            break;
1154193529Sjkim
1155167802Sjkim        case ACPI_DMT_DMAR:
1156167802Sjkim
1157167802Sjkim            /* DMAR subtable types */
1158167802Sjkim
1159193529Sjkim            Temp16 = ACPI_GET16 (Target);
1160167802Sjkim            if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
1161167802Sjkim            {
1162167802Sjkim                Temp16 = ACPI_DMAR_TYPE_RESERVED;
1163167802Sjkim            }
1164167802Sjkim
1165281687Sjkim            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1166281687Sjkim                AcpiDmDmarSubnames[Temp16]);
1167167802Sjkim            break;
1168167802Sjkim
1169281075Sdim        case ACPI_DMT_DMAR_SCOPE:
1170281075Sdim
1171281075Sdim            /* DMAR device scope types */
1172281075Sdim
1173281075Sdim            Temp8 = *Target;
1174281075Sdim            if (Temp8 > ACPI_DMAR_SCOPE_TYPE_RESERVED)
1175281075Sdim            {
1176281075Sdim                Temp8 = ACPI_DMAR_SCOPE_TYPE_RESERVED;
1177281075Sdim            }
1178281075Sdim
1179281687Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target,
1180281687Sjkim                AcpiDmDmarScope[Temp8]);
1181281075Sdim            break;
1182281075Sdim
1183209746Sjkim        case ACPI_DMT_EINJACT:
1184209746Sjkim
1185209746Sjkim            /* EINJ Action types */
1186209746Sjkim
1187209746Sjkim            Temp8 = *Target;
1188209746Sjkim            if (Temp8 > ACPI_EINJ_ACTION_RESERVED)
1189209746Sjkim            {
1190209746Sjkim                Temp8 = ACPI_EINJ_ACTION_RESERVED;
1191209746Sjkim            }
1192209746Sjkim
1193281687Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target,
1194281687Sjkim                AcpiDmEinjActions[Temp8]);
1195209746Sjkim            break;
1196209746Sjkim
1197209746Sjkim        case ACPI_DMT_EINJINST:
1198209746Sjkim
1199209746Sjkim            /* EINJ Instruction types */
1200209746Sjkim
1201209746Sjkim            Temp8 = *Target;
1202209746Sjkim            if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED)
1203209746Sjkim            {
1204209746Sjkim                Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
1205209746Sjkim            }
1206209746Sjkim
1207281687Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target,
1208281687Sjkim                AcpiDmEinjInstructions[Temp8]);
1209209746Sjkim            break;
1210209746Sjkim
1211209746Sjkim        case ACPI_DMT_ERSTACT:
1212209746Sjkim
1213209746Sjkim            /* ERST Action types */
1214209746Sjkim
1215209746Sjkim            Temp8 = *Target;
1216209746Sjkim            if (Temp8 > ACPI_ERST_ACTION_RESERVED)
1217209746Sjkim            {
1218209746Sjkim                Temp8 = ACPI_ERST_ACTION_RESERVED;
1219209746Sjkim            }
1220209746Sjkim
1221281687Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target,
1222281687Sjkim                AcpiDmErstActions[Temp8]);
1223209746Sjkim            break;
1224209746Sjkim
1225209746Sjkim        case ACPI_DMT_ERSTINST:
1226209746Sjkim
1227209746Sjkim            /* ERST Instruction types */
1228209746Sjkim
1229209746Sjkim            Temp8 = *Target;
1230209746Sjkim            if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED)
1231209746Sjkim            {
1232209746Sjkim                Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
1233209746Sjkim            }
1234209746Sjkim
1235281687Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target,
1236281687Sjkim                AcpiDmErstInstructions[Temp8]);
1237209746Sjkim            break;
1238209746Sjkim
1239281075Sdim        case ACPI_DMT_GTDT:
1240281075Sdim
1241281075Sdim            /* GTDT subtable types */
1242281075Sdim
1243281075Sdim            Temp8 = *Target;
1244281075Sdim            if (Temp8 > ACPI_GTDT_TYPE_RESERVED)
1245281075Sdim            {
1246281075Sdim                Temp8 = ACPI_GTDT_TYPE_RESERVED;
1247281075Sdim            }
1248281075Sdim
1249281687Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target,
1250281687Sjkim                AcpiDmGtdtSubnames[Temp8]);
1251281075Sdim            break;
1252281075Sdim
1253193529Sjkim        case ACPI_DMT_HEST:
1254193529Sjkim
1255193529Sjkim            /* HEST subtable types */
1256193529Sjkim
1257193529Sjkim            Temp16 = ACPI_GET16 (Target);
1258193529Sjkim            if (Temp16 > ACPI_HEST_TYPE_RESERVED)
1259193529Sjkim            {
1260193529Sjkim                Temp16 = ACPI_HEST_TYPE_RESERVED;
1261193529Sjkim            }
1262193529Sjkim
1263281687Sjkim            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1264281687Sjkim                AcpiDmHestSubnames[Temp16]);
1265193529Sjkim            break;
1266193529Sjkim
1267193529Sjkim        case ACPI_DMT_HESTNTFY:
1268193529Sjkim
1269281687Sjkim            AcpiOsPrintf (STRING_FORMAT,
1270281687Sjkim                "Hardware Error Notification Structure");
1271281687Sjkim
1272306536Sjkim            Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1273197104Sjkim                sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
1274306536Sjkim            if (ACPI_FAILURE (Status))
1275306536Sjkim            {
1276306536Sjkim                return (Status);
1277306536Sjkim            }
1278306536Sjkim
1279193529Sjkim            AcpiOsPrintf ("\n");
1280193529Sjkim            LastOutputBlankLine = TRUE;
1281193529Sjkim            break;
1282193529Sjkim
1283193529Sjkim        case ACPI_DMT_HESTNTYP:
1284193529Sjkim
1285193529Sjkim            /* HEST Notify types */
1286193529Sjkim
1287193529Sjkim            Temp8 = *Target;
1288193529Sjkim            if (Temp8 > ACPI_HEST_NOTIFY_RESERVED)
1289193529Sjkim            {
1290193529Sjkim                Temp8 = ACPI_HEST_NOTIFY_RESERVED;
1291193529Sjkim            }
1292193529Sjkim
1293281687Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target,
1294281687Sjkim                AcpiDmHestNotifySubnames[Temp8]);
1295193529Sjkim            break;
1296193529Sjkim
1297284460Sjkim        case ACPI_DMT_IORTMEM:
1298284460Sjkim
1299284460Sjkim            AcpiOsPrintf (STRING_FORMAT,
1300284460Sjkim                "IORT Memory Access Properties");
1301284460Sjkim
1302306536Sjkim            Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1303284460Sjkim                sizeof (ACPI_IORT_MEMORY_ACCESS), AcpiDmTableInfoIortAcc);
1304306536Sjkim            if (ACPI_FAILURE (Status))
1305306536Sjkim            {
1306306536Sjkim                return (Status);
1307306536Sjkim            }
1308306536Sjkim
1309284460Sjkim            LastOutputBlankLine = TRUE;
1310284460Sjkim            break;
1311284460Sjkim
1312167802Sjkim        case ACPI_DMT_MADT:
1313167802Sjkim
1314167802Sjkim            /* MADT subtable types */
1315167802Sjkim
1316167802Sjkim            Temp8 = *Target;
1317167802Sjkim            if (Temp8 > ACPI_MADT_TYPE_RESERVED)
1318167802Sjkim            {
1319167802Sjkim                Temp8 = ACPI_MADT_TYPE_RESERVED;
1320167802Sjkim            }
1321167802Sjkim
1322281687Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target,
1323281687Sjkim                AcpiDmMadtSubnames[Temp8]);
1324167802Sjkim            break;
1325167802Sjkim
1326284460Sjkim        case ACPI_DMT_NFIT:
1327284460Sjkim
1328284460Sjkim            /* NFIT subtable types */
1329284460Sjkim
1330284460Sjkim            Temp16 = ACPI_GET16 (Target);
1331284460Sjkim            if (Temp16 > ACPI_NFIT_TYPE_RESERVED)
1332284460Sjkim            {
1333284460Sjkim                Temp16 = ACPI_NFIT_TYPE_RESERVED;
1334284460Sjkim            }
1335284460Sjkim
1336284460Sjkim            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1337284460Sjkim                AcpiDmNfitSubnames[Temp16]);
1338284460Sjkim            break;
1339284460Sjkim
1340281075Sdim        case ACPI_DMT_PCCT:
1341281075Sdim
1342281075Sdim            /* PCCT subtable types */
1343281075Sdim
1344281075Sdim            Temp8 = *Target;
1345281075Sdim            if (Temp8 > ACPI_PCCT_TYPE_RESERVED)
1346281075Sdim            {
1347281075Sdim                Temp8 = ACPI_PCCT_TYPE_RESERVED;
1348281075Sdim            }
1349281075Sdim
1350281687Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target,
1351281687Sjkim                AcpiDmPcctSubnames[Temp8]);
1352281075Sdim            break;
1353281075Sdim
1354228110Sjkim        case ACPI_DMT_PMTT:
1355228110Sjkim
1356228110Sjkim            /* PMTT subtable types */
1357228110Sjkim
1358228110Sjkim            Temp8 = *Target;
1359228110Sjkim            if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
1360228110Sjkim            {
1361228110Sjkim                Temp8 = ACPI_PMTT_TYPE_RESERVED;
1362228110Sjkim            }
1363228110Sjkim
1364281687Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target,
1365281687Sjkim                AcpiDmPmttSubnames[Temp8]);
1366228110Sjkim            break;
1367228110Sjkim
1368284460Sjkim        case ACPI_DMT_UNICODE:
1369284460Sjkim
1370284460Sjkim            if (ByteLength == 0)
1371284460Sjkim            {
1372284460Sjkim                AcpiOsPrintf ("/* Zero-length Data */\n");
1373284460Sjkim                break;
1374284460Sjkim            }
1375284460Sjkim
1376284460Sjkim            AcpiDmDumpUnicode (Table, CurrentOffset, ByteLength);
1377284460Sjkim            break;
1378284460Sjkim
1379281687Sjkim        case ACPI_DMT_RAW_BUFFER:
1380219707Sjkim
1381284460Sjkim            if (ByteLength == 0)
1382284460Sjkim            {
1383284460Sjkim                AcpiOsPrintf ("/* Zero-length Data */\n");
1384284460Sjkim                break;
1385284460Sjkim            }
1386284460Sjkim
1387284460Sjkim            AcpiDmDumpBuffer (Table, CurrentOffset, ByteLength,
1388284460Sjkim                CurrentOffset, NULL);
1389219707Sjkim            break;
1390219707Sjkim
1391167802Sjkim        case ACPI_DMT_SRAT:
1392167802Sjkim
1393167802Sjkim            /* SRAT subtable types */
1394167802Sjkim
1395167802Sjkim            Temp8 = *Target;
1396167802Sjkim            if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
1397167802Sjkim            {
1398167802Sjkim                Temp8 = ACPI_SRAT_TYPE_RESERVED;
1399167802Sjkim            }
1400167802Sjkim
1401281687Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target,
1402281687Sjkim                AcpiDmSratSubnames[Temp8]);
1403167802Sjkim            break;
1404167802Sjkim
1405193529Sjkim        case ACPI_DMT_FADTPM:
1406193529Sjkim
1407193529Sjkim            /* FADT Preferred PM Profile names */
1408193529Sjkim
1409193529Sjkim            Temp8 = *Target;
1410193529Sjkim            if (Temp8 > ACPI_FADT_PM_RESERVED)
1411193529Sjkim            {
1412193529Sjkim                Temp8 = ACPI_FADT_PM_RESERVED;
1413193529Sjkim            }
1414193529Sjkim
1415281687Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target,
1416281687Sjkim                AcpiDmFadtProfiles[Temp8]);
1417193529Sjkim            break;
1418193529Sjkim
1419197104Sjkim        case ACPI_DMT_IVRS:
1420197104Sjkim
1421197104Sjkim            /* IVRS subtable types */
1422197104Sjkim
1423197104Sjkim            Temp8 = *Target;
1424197104Sjkim            switch (Temp8)
1425197104Sjkim            {
1426197104Sjkim            case ACPI_IVRS_TYPE_HARDWARE:
1427250838Sjkim
1428197104Sjkim                Name = AcpiDmIvrsSubnames[0];
1429197104Sjkim                break;
1430197104Sjkim
1431197104Sjkim            case ACPI_IVRS_TYPE_MEMORY1:
1432197104Sjkim            case ACPI_IVRS_TYPE_MEMORY2:
1433197104Sjkim            case ACPI_IVRS_TYPE_MEMORY3:
1434250838Sjkim
1435197104Sjkim                Name = AcpiDmIvrsSubnames[1];
1436197104Sjkim                break;
1437197104Sjkim
1438197104Sjkim            default:
1439250838Sjkim
1440197104Sjkim                Name = AcpiDmIvrsSubnames[2];
1441197104Sjkim                break;
1442197104Sjkim            }
1443197104Sjkim
1444220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
1445197104Sjkim            break;
1446197104Sjkim
1447281075Sdim        case ACPI_DMT_LPIT:
1448281075Sdim
1449281075Sdim            /* LPIT subtable types */
1450281075Sdim
1451281687Sjkim            Temp32 = ACPI_GET32 (Target);
1452281687Sjkim            if (Temp32 > ACPI_LPIT_TYPE_RESERVED)
1453281075Sdim            {
1454281687Sjkim                Temp32 = ACPI_LPIT_TYPE_RESERVED;
1455281075Sdim            }
1456281075Sdim
1457281687Sjkim            AcpiOsPrintf (UINT32_FORMAT, ACPI_GET32 (Target),
1458281687Sjkim                AcpiDmLpitSubnames[Temp32]);
1459281075Sdim            break;
1460281075Sdim
1461167802Sjkim        case ACPI_DMT_EXIT:
1462250838Sjkim
1463193529Sjkim            return (AE_OK);
1464167802Sjkim
1465167802Sjkim        default:
1466250838Sjkim
1467167802Sjkim            ACPI_ERROR ((AE_INFO,
1468204773Sjkim                "**** Invalid table opcode [0x%X] ****\n", Info->Opcode));
1469193529Sjkim            return (AE_SUPPORT);
1470167802Sjkim        }
1471167802Sjkim    }
1472193529Sjkim
1473193529Sjkim    if (TableOffset && !SubtableLength)
1474193529Sjkim    {
1475281687Sjkim        /*
1476281687Sjkim         * If this table is not the main table, the subtable must have a
1477281687Sjkim         * valid length
1478281687Sjkim         */
1479193529Sjkim        AcpiOsPrintf ("Invalid zero length subtable\n");
1480193529Sjkim        return (AE_BAD_DATA);
1481193529Sjkim    }
1482193529Sjkim
1483193529Sjkim    return (AE_OK);
1484167802Sjkim}
1485