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