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