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