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