dmtable.c revision 246849
1167802Sjkim/****************************************************************************** 2167802Sjkim * 3167802Sjkim * Module Name: dmtable - Support for ACPI tables that contain no AML code 4167802Sjkim * 5167802Sjkim *****************************************************************************/ 6167802Sjkim 7217365Sjkim/* 8245582Sjkim * Copyright (C) 2000 - 2013, Intel Corp. 9167802Sjkim * All rights reserved. 10167802Sjkim * 11217365Sjkim * Redistribution and use in source and binary forms, with or without 12217365Sjkim * modification, are permitted provided that the following conditions 13217365Sjkim * are met: 14217365Sjkim * 1. Redistributions of source code must retain the above copyright 15217365Sjkim * notice, this list of conditions, and the following disclaimer, 16217365Sjkim * without modification. 17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217365Sjkim * including a substantially similar Disclaimer requirement for further 21217365Sjkim * binary redistribution. 22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217365Sjkim * of any contributors may be used to endorse or promote products derived 24217365Sjkim * from this software without specific prior written permission. 25167802Sjkim * 26217365Sjkim * Alternatively, this software may be distributed under the terms of the 27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217365Sjkim * Software Foundation. 29167802Sjkim * 30217365Sjkim * NO WARRANTY 31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217365Sjkim */ 43167802Sjkim 44193529Sjkim#include <contrib/dev/acpica/include/acpi.h> 45193529Sjkim#include <contrib/dev/acpica/include/accommon.h> 46193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h> 47193529Sjkim#include <contrib/dev/acpica/include/actables.h> 48209746Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 49209746Sjkim#include <contrib/dev/acpica/compiler/dtcompiler.h> 50167802Sjkim 51167802Sjkim/* This module used for application-level code only */ 52167802Sjkim 53167802Sjkim#define _COMPONENT ACPI_CA_DISASSEMBLER 54167802Sjkim ACPI_MODULE_NAME ("dmtable") 55167802Sjkim 56167802Sjkim/* Local Prototypes */ 57167802Sjkim 58167802Sjkimstatic void 59167802SjkimAcpiDmCheckAscii ( 60167802Sjkim UINT8 *Target, 61197104Sjkim char *RepairedName, 62167802Sjkim UINT32 Count); 63167802Sjkim 64167802Sjkim 65220663Sjkim/* Common format strings for commented values */ 66220663Sjkim 67220663Sjkim#define UINT8_FORMAT "%2.2X [%s]\n" 68220663Sjkim#define UINT16_FORMAT "%4.4X [%s]\n" 69220663Sjkim#define UINT32_FORMAT "%8.8X [%s]\n" 70220663Sjkim#define STRING_FORMAT "[%s]\n" 71220663Sjkim 72167802Sjkim/* These tables map a subtable type to a description string */ 73167802Sjkim 74193529Sjkimstatic const char *AcpiDmAsfSubnames[] = 75193529Sjkim{ 76193529Sjkim "ASF Information", 77193529Sjkim "ASF Alerts", 78193529Sjkim "ASF Remote Control", 79193529Sjkim "ASF RMCP Boot Options", 80193529Sjkim "ASF Address", 81193529Sjkim "Unknown SubTable Type" /* Reserved */ 82193529Sjkim}; 83193529Sjkim 84167802Sjkimstatic const char *AcpiDmDmarSubnames[] = 85167802Sjkim{ 86167802Sjkim "Hardware Unit Definition", 87167802Sjkim "Reserved Memory Region", 88193529Sjkim "Root Port ATS Capability", 89197104Sjkim "Remapping Hardware Static Affinity", 90167802Sjkim "Unknown SubTable Type" /* Reserved */ 91167802Sjkim}; 92167802Sjkim 93209746Sjkimstatic const char *AcpiDmEinjActions[] = 94209746Sjkim{ 95209746Sjkim "Begin Operation", 96209746Sjkim "Get Trigger Table", 97209746Sjkim "Set Error Type", 98209746Sjkim "Get Error Type", 99209746Sjkim "End Operation", 100209746Sjkim "Execute Operation", 101209746Sjkim "Check Busy Status", 102209746Sjkim "Get Command Status", 103209746Sjkim "Unknown Action" 104209746Sjkim}; 105209746Sjkim 106209746Sjkimstatic const char *AcpiDmEinjInstructions[] = 107209746Sjkim{ 108209746Sjkim "Read Register", 109209746Sjkim "Read Register Value", 110209746Sjkim "Write Register", 111209746Sjkim "Write Register Value", 112209746Sjkim "Noop", 113209746Sjkim "Unknown Instruction" 114209746Sjkim}; 115209746Sjkim 116209746Sjkimstatic const char *AcpiDmErstActions[] = 117209746Sjkim{ 118209746Sjkim "Begin Write Operation", 119209746Sjkim "Begin Read Operation", 120209746Sjkim "Begin Clear Operation", 121209746Sjkim "End Operation", 122209746Sjkim "Set Record Offset", 123209746Sjkim "Execute Operation", 124209746Sjkim "Check Busy Status", 125209746Sjkim "Get Command Status", 126209746Sjkim "Get Record Identifier", 127209746Sjkim "Set Record Identifier", 128209746Sjkim "Get Record Count", 129209746Sjkim "Begin Dummy Write", 130209746Sjkim "Unused/Unknown Action", 131209746Sjkim "Get Error Address Range", 132209746Sjkim "Get Error Address Length", 133209746Sjkim "Get Error Attributes", 134209746Sjkim "Unknown Action" 135209746Sjkim}; 136209746Sjkim 137209746Sjkimstatic const char *AcpiDmErstInstructions[] = 138209746Sjkim{ 139209746Sjkim "Read Register", 140209746Sjkim "Read Register Value", 141209746Sjkim "Write Register", 142209746Sjkim "Write Register Value", 143209746Sjkim "Noop", 144209746Sjkim "Load Var1", 145209746Sjkim "Load Var2", 146209746Sjkim "Store Var1", 147209746Sjkim "Add", 148209746Sjkim "Subtract", 149209746Sjkim "Add Value", 150209746Sjkim "Subtract Value", 151209746Sjkim "Stall", 152209746Sjkim "Stall While True", 153209746Sjkim "Skip Next If True", 154209746Sjkim "GoTo", 155209746Sjkim "Set Source Address", 156209746Sjkim "Set Destination Address", 157209746Sjkim "Move Data", 158209746Sjkim "Unknown Instruction" 159209746Sjkim}; 160209746Sjkim 161193529Sjkimstatic const char *AcpiDmHestSubnames[] = 162193529Sjkim{ 163197104Sjkim "IA-32 Machine Check Exception", 164197104Sjkim "IA-32 Corrected Machine Check", 165197104Sjkim "IA-32 Non-Maskable Interrupt", 166197104Sjkim "Unknown SubTable Type", /* 3 - Reserved */ 167197104Sjkim "Unknown SubTable Type", /* 4 - Reserved */ 168197104Sjkim "Unknown SubTable Type", /* 5 - Reserved */ 169193529Sjkim "PCI Express Root Port AER", 170193529Sjkim "PCI Express AER (AER Endpoint)", 171193529Sjkim "PCI Express/PCI-X Bridge AER", 172193529Sjkim "Generic Hardware Error Source", 173193529Sjkim "Unknown SubTable Type" /* Reserved */ 174193529Sjkim}; 175193529Sjkim 176193529Sjkimstatic const char *AcpiDmHestNotifySubnames[] = 177193529Sjkim{ 178193529Sjkim "Polled", 179193529Sjkim "External Interrupt", 180193529Sjkim "Local Interrupt", 181193529Sjkim "SCI", 182193529Sjkim "NMI", 183193529Sjkim "Unknown Notify Type" /* Reserved */ 184193529Sjkim}; 185193529Sjkim 186167802Sjkimstatic const char *AcpiDmMadtSubnames[] = 187167802Sjkim{ 188167802Sjkim "Processor Local APIC", /* ACPI_MADT_TYPE_LOCAL_APIC */ 189167802Sjkim "I/O APIC", /* ACPI_MADT_TYPE_IO_APIC */ 190167802Sjkim "Interrupt Source Override", /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */ 191167802Sjkim "NMI Source", /* ACPI_MADT_TYPE_NMI_SOURCE */ 192167802Sjkim "Local APIC NMI", /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */ 193167802Sjkim "Local APIC Address Override", /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */ 194167802Sjkim "I/O SAPIC", /* ACPI_MADT_TYPE_IO_SAPIC */ 195167802Sjkim "Local SAPIC", /* ACPI_MADT_TYPE_LOCAL_SAPIC */ 196167802Sjkim "Platform Interrupt Sources", /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */ 197193529Sjkim "Processor Local x2APIC", /* ACPI_MADT_TYPE_LOCAL_X2APIC */ 198193529Sjkim "Local x2APIC NMI", /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */ 199228110Sjkim "Generic Interrupt Controller", /* ACPI_MADT_GENERIC_INTERRUPT */ 200228110Sjkim "Generic Interrupt Distributor",/* ACPI_MADT_GENERIC_DISTRIBUTOR */ 201167802Sjkim "Unknown SubTable Type" /* Reserved */ 202167802Sjkim}; 203167802Sjkim 204228110Sjkimstatic const char *AcpiDmPmttSubnames[] = 205228110Sjkim{ 206228110Sjkim "Socket", /* ACPI_PMTT_TYPE_SOCKET */ 207228110Sjkim "Memory Controller", /* ACPI_PMTT_TYPE_CONTROLLER */ 208228110Sjkim "Physical Component (DIMM)", /* ACPI_PMTT_TYPE_DIMM */ 209228110Sjkim "Unknown SubTable Type" /* Reserved */ 210228110Sjkim}; 211228110Sjkim 212219707Sjkimstatic const char *AcpiDmSlicSubnames[] = 213219707Sjkim{ 214219707Sjkim "Public Key Structure", 215219707Sjkim "Windows Marker Structure", 216219707Sjkim "Unknown SubTable Type" /* Reserved */ 217219707Sjkim}; 218219707Sjkim 219167802Sjkimstatic const char *AcpiDmSratSubnames[] = 220167802Sjkim{ 221167802Sjkim "Processor Local APIC/SAPIC Affinity", 222167802Sjkim "Memory Affinity", 223193529Sjkim "Processor Local x2APIC Affinity", 224167802Sjkim "Unknown SubTable Type" /* Reserved */ 225167802Sjkim}; 226167802Sjkim 227197104Sjkimstatic const char *AcpiDmIvrsSubnames[] = 228197104Sjkim{ 229197104Sjkim "Hardware Definition Block", 230197104Sjkim "Memory Definition Block", 231197104Sjkim "Unknown SubTable Type" /* Reserved */ 232197104Sjkim}; 233167802Sjkim 234197104Sjkim 235229989Sjkim#define ACPI_FADT_PM_RESERVED 9 236193529Sjkim 237193529Sjkimstatic const char *AcpiDmFadtProfiles[] = 238193529Sjkim{ 239193529Sjkim "Unspecified", 240193529Sjkim "Desktop", 241193529Sjkim "Mobile", 242193529Sjkim "Workstation", 243193529Sjkim "Enterprise Server", 244193529Sjkim "SOHO Server", 245193529Sjkim "Appliance PC", 246193529Sjkim "Performance Server", 247229989Sjkim "Tablet", 248193529Sjkim "Unknown Profile Type" 249193529Sjkim}; 250193529Sjkim 251216471Sjkim#define ACPI_GAS_WIDTH_RESERVED 5 252216471Sjkim 253216471Sjkimstatic const char *AcpiDmGasAccessWidth[] = 254216471Sjkim{ 255216471Sjkim "Undefined/Legacy", 256216471Sjkim "Byte Access:8", 257216471Sjkim "Word Access:16", 258216471Sjkim "DWord Access:32", 259216471Sjkim "QWord Access:64", 260216471Sjkim "Unknown Width Encoding" 261216471Sjkim}; 262216471Sjkim 263216471Sjkim 264167802Sjkim/******************************************************************************* 265167802Sjkim * 266167802Sjkim * ACPI Table Data, indexed by signature. 267167802Sjkim * 268209746Sjkim * Each entry contains: Signature, Table Info, Handler, DtHandler, 269209746Sjkim * Template, Description 270197104Sjkim * 271209746Sjkim * Simple tables have only a TableInfo structure, complex tables have a 272209746Sjkim * handler. This table must be NULL terminated. RSDP and FACS are 273209746Sjkim * special-cased elsewhere. 274167802Sjkim * 275167802Sjkim ******************************************************************************/ 276167802Sjkim 277209746SjkimACPI_DMTABLE_DATA AcpiDmTableData[] = 278167802Sjkim{ 279209746Sjkim {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf, "Alert Standard Format table"}, 280209746Sjkim {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert, "Boot Error Record Table"}, 281228110Sjkim {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt, NULL, NULL, TemplateBgrt, "Boot Graphics Resource Table"}, 282239340Sjkim {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, NULL, TemplateBoot, "Simple Boot Flag Table"}, 283209746Sjkim {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, DtCompileCpep, TemplateCpep, "Corrected Platform Error Polling table"}, 284245582Sjkim {ACPI_SIG_CSRT, NULL, AcpiDmDumpCsrt, DtCompileCsrt, TemplateCsrt, "Core System Resource Table"}, 285239340Sjkim {ACPI_SIG_DBG2, NULL, AcpiDmDumpDbg2, NULL, NULL, "Debug Port table type 2"}, 286209746Sjkim {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp, NULL, NULL, TemplateDbgp, "Debug Port table"}, 287209746Sjkim {ACPI_SIG_DMAR, NULL, AcpiDmDumpDmar, DtCompileDmar, TemplateDmar, "DMA Remapping table"}, 288209746Sjkim {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt, NULL, NULL, TemplateEcdt, "Embedded Controller Boot Resources Table"}, 289209746Sjkim {ACPI_SIG_EINJ, NULL, AcpiDmDumpEinj, DtCompileEinj, TemplateEinj, "Error Injection table"}, 290209746Sjkim {ACPI_SIG_ERST, NULL, AcpiDmDumpErst, DtCompileErst, TemplateErst, "Error Record Serialization Table"}, 291239340Sjkim {ACPI_SIG_FADT, NULL, AcpiDmDumpFadt, DtCompileFadt, TemplateFadt, "Fixed ACPI Description Table (FADT)"}, 292228110Sjkim {ACPI_SIG_FPDT, NULL, AcpiDmDumpFpdt, DtCompileFpdt, TemplateFpdt, "Firmware Performance Data Table"}, 293228110Sjkim {ACPI_SIG_GTDT, AcpiDmTableInfoGtdt, NULL, NULL, TemplateGtdt, "Generic Timer Description Table"}, 294209746Sjkim {ACPI_SIG_HEST, NULL, AcpiDmDumpHest, DtCompileHest, TemplateHest, "Hardware Error Source Table"}, 295209746Sjkim {ACPI_SIG_HPET, AcpiDmTableInfoHpet, NULL, NULL, TemplateHpet, "High Precision Event Timer table"}, 296209746Sjkim {ACPI_SIG_IVRS, NULL, AcpiDmDumpIvrs, DtCompileIvrs, TemplateIvrs, "I/O Virtualization Reporting Structure"}, 297239340Sjkim {ACPI_SIG_MADT, NULL, AcpiDmDumpMadt, DtCompileMadt, TemplateMadt, "Multiple APIC Description Table (MADT)"}, 298209746Sjkim {ACPI_SIG_MCFG, NULL, AcpiDmDumpMcfg, DtCompileMcfg, TemplateMcfg, "Memory Mapped Configuration table"}, 299209746Sjkim {ACPI_SIG_MCHI, AcpiDmTableInfoMchi, NULL, NULL, TemplateMchi, "Management Controller Host Interface table"}, 300228110Sjkim {ACPI_SIG_MPST, AcpiDmTableInfoMpst, AcpiDmDumpMpst, DtCompileMpst, TemplateMpst, "Memory Power State Table"}, 301209746Sjkim {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct, "Maximum System Characteristics Table"}, 302246849Sjkim {ACPI_SIG_MTMR, NULL, AcpiDmDumpMtmr, DtCompileMtmr, TemplateMtmr, "MID Timer Table"}, 303228110Sjkim {ACPI_SIG_PCCT, NULL, AcpiDmDumpPcct, NULL, NULL, "Platform Communications Channel Table"}, 304228110Sjkim {ACPI_SIG_PMTT, NULL, AcpiDmDumpPmtt, DtCompilePmtt, TemplatePmtt, "Platform Memory Topology Table"}, 305209746Sjkim {ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, DtCompileRsdt, TemplateRsdt, "Root System Description Table"}, 306228110Sjkim {ACPI_SIG_S3PT, NULL, NULL, NULL, TemplateS3pt, "S3 Performance Table"}, 307209746Sjkim {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, NULL, TemplateSbst, "Smart Battery Specification Table"}, 308219707Sjkim {ACPI_SIG_SLIC, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateSlic, "Software Licensing Description Table"}, 309209746Sjkim {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, DtCompileSlit, TemplateSlit, "System Locality Information Table"}, 310209746Sjkim {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, NULL, TemplateSpcr, "Serial Port Console Redirection table"}, 311209746Sjkim {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, NULL, TemplateSpmi, "Server Platform Management Interface table"}, 312209746Sjkim {ACPI_SIG_SRAT, NULL, AcpiDmDumpSrat, DtCompileSrat, TemplateSrat, "System Resource Affinity Table"}, 313209746Sjkim {ACPI_SIG_TCPA, AcpiDmTableInfoTcpa, NULL, NULL, TemplateTcpa, "Trusted Computing Platform Alliance table"}, 314245582Sjkim {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2, NULL, NULL, TemplateTpm2, "Trusted Platform Module hardware interface table"}, 315217365Sjkim {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi, "UEFI Boot Optimization Table"}, 316246849Sjkim {ACPI_SIG_VRTC, AcpiDmTableInfoVrtc, AcpiDmDumpVrtc, DtCompileVrtc, TemplateVrtc, "Virtual Real-Time Clock Table"}, 317209746Sjkim {ACPI_SIG_WAET, AcpiDmTableInfoWaet, NULL, NULL, TemplateWaet, "Windows ACPI Emulated Devices Table"}, 318209746Sjkim {ACPI_SIG_WDAT, NULL, AcpiDmDumpWdat, DtCompileWdat, TemplateWdat, "Watchdog Action Table"}, 319209746Sjkim {ACPI_SIG_WDDT, AcpiDmTableInfoWddt, NULL, NULL, TemplateWddt, "Watchdog Description Table"}, 320209746Sjkim {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt, NULL, NULL, TemplateWdrt, "Watchdog Resource Table"}, 321209746Sjkim {ACPI_SIG_XSDT, NULL, AcpiDmDumpXsdt, DtCompileXsdt, TemplateXsdt, "Extended System Description Table"}, 322209746Sjkim {NULL, NULL, NULL, NULL, NULL, NULL} 323167802Sjkim}; 324167802Sjkim 325167802Sjkim 326167802Sjkim/******************************************************************************* 327167802Sjkim * 328209746Sjkim * FUNCTION: AcpiDmGenerateChecksum 329167802Sjkim * 330209746Sjkim * PARAMETERS: Table - Pointer to table to be checksummed 331209746Sjkim * Length - Length of the table 332209746Sjkim * OriginalChecksum - Value of the checksum field 333167802Sjkim * 334167802Sjkim * RETURN: 8 bit checksum of buffer 335167802Sjkim * 336167802Sjkim * DESCRIPTION: Computes an 8 bit checksum of the table. 337167802Sjkim * 338167802Sjkim ******************************************************************************/ 339167802Sjkim 340167802SjkimUINT8 341209746SjkimAcpiDmGenerateChecksum ( 342209746Sjkim void *Table, 343209746Sjkim UINT32 Length, 344209746Sjkim UINT8 OriginalChecksum) 345167802Sjkim{ 346167802Sjkim UINT8 Checksum; 347167802Sjkim 348167802Sjkim 349167802Sjkim /* Sum the entire table as-is */ 350167802Sjkim 351209746Sjkim Checksum = AcpiTbChecksum ((UINT8 *) Table, Length); 352167802Sjkim 353167802Sjkim /* Subtract off the existing checksum value in the table */ 354167802Sjkim 355209746Sjkim Checksum = (UINT8) (Checksum - OriginalChecksum); 356167802Sjkim 357167802Sjkim /* Compute the final checksum */ 358167802Sjkim 359167802Sjkim Checksum = (UINT8) (0 - Checksum); 360167802Sjkim return (Checksum); 361167802Sjkim} 362167802Sjkim 363167802Sjkim 364167802Sjkim/******************************************************************************* 365167802Sjkim * 366167802Sjkim * FUNCTION: AcpiDmGetTableData 367167802Sjkim * 368167802Sjkim * PARAMETERS: Signature - ACPI signature (4 chars) to match 369167802Sjkim * 370167802Sjkim * RETURN: Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found. 371167802Sjkim * 372167802Sjkim * DESCRIPTION: Find a match in the global table of supported ACPI tables 373167802Sjkim * 374167802Sjkim ******************************************************************************/ 375167802Sjkim 376209746SjkimACPI_DMTABLE_DATA * 377167802SjkimAcpiDmGetTableData ( 378167802Sjkim char *Signature) 379167802Sjkim{ 380167802Sjkim ACPI_DMTABLE_DATA *TableData; 381167802Sjkim 382167802Sjkim 383167802Sjkim for (TableData = AcpiDmTableData; TableData->Signature; TableData++) 384167802Sjkim { 385167802Sjkim if (ACPI_COMPARE_NAME (Signature, TableData->Signature)) 386167802Sjkim { 387167802Sjkim return (TableData); 388167802Sjkim } 389167802Sjkim } 390167802Sjkim 391167802Sjkim return (NULL); 392167802Sjkim} 393167802Sjkim 394167802Sjkim 395167802Sjkim/******************************************************************************* 396167802Sjkim * 397167802Sjkim * FUNCTION: AcpiDmDumpDataTable 398167802Sjkim * 399167802Sjkim * PARAMETERS: Table - An ACPI table 400167802Sjkim * 401167802Sjkim * RETURN: None. 402167802Sjkim * 403167802Sjkim * DESCRIPTION: Format the contents of an ACPI data table (any table other 404167802Sjkim * than an SSDT or DSDT that does not contain executable AML code) 405167802Sjkim * 406167802Sjkim ******************************************************************************/ 407167802Sjkim 408167802Sjkimvoid 409167802SjkimAcpiDmDumpDataTable ( 410167802Sjkim ACPI_TABLE_HEADER *Table) 411167802Sjkim{ 412193529Sjkim ACPI_STATUS Status; 413167802Sjkim ACPI_DMTABLE_DATA *TableData; 414167802Sjkim UINT32 Length; 415167802Sjkim 416167802Sjkim 417167802Sjkim /* Ignore tables that contain AML */ 418167802Sjkim 419167802Sjkim if (AcpiUtIsAmlTable (Table)) 420167802Sjkim { 421241973Sjkim if (Gbl_VerboseTemplates) 422241973Sjkim { 423241973Sjkim /* Dump the raw table data */ 424241973Sjkim 425241973Sjkim Length = Table->Length; 426241973Sjkim 427241973Sjkim AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n", 428241973Sjkim ACPI_RAW_TABLE_DATA_HEADER, Length, Length); 429241973Sjkim AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table), 430241973Sjkim Length, DB_BYTE_DISPLAY, 0); 431241973Sjkim AcpiOsPrintf (" */\n"); 432241973Sjkim } 433167802Sjkim return; 434167802Sjkim } 435167802Sjkim 436167802Sjkim /* 437167802Sjkim * Handle tables that don't use the common ACPI table header structure. 438228110Sjkim * Currently, these are the FACS, RSDP, and S3PT. 439167802Sjkim */ 440167802Sjkim if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS)) 441167802Sjkim { 442167802Sjkim Length = Table->Length; 443167802Sjkim AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs); 444167802Sjkim } 445167802Sjkim else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_RSDP)) 446167802Sjkim { 447167802Sjkim Length = AcpiDmDumpRsdp (Table); 448167802Sjkim } 449228110Sjkim else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT)) 450228110Sjkim { 451228110Sjkim Length = AcpiDmDumpS3pt (Table); 452228110Sjkim } 453167802Sjkim else 454167802Sjkim { 455167802Sjkim /* 456167802Sjkim * All other tables must use the common ACPI table header, dump it now 457167802Sjkim */ 458167802Sjkim Length = Table->Length; 459193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader); 460193529Sjkim if (ACPI_FAILURE (Status)) 461193529Sjkim { 462193529Sjkim return; 463193529Sjkim } 464167802Sjkim AcpiOsPrintf ("\n"); 465167802Sjkim 466167802Sjkim /* Match signature and dispatch appropriately */ 467167802Sjkim 468167802Sjkim TableData = AcpiDmGetTableData (Table->Signature); 469167802Sjkim if (!TableData) 470167802Sjkim { 471167802Sjkim if (!ACPI_STRNCMP (Table->Signature, "OEM", 3)) 472167802Sjkim { 473167802Sjkim AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n", 474167802Sjkim Table->Signature); 475167802Sjkim } 476167802Sjkim else 477167802Sjkim { 478167802Sjkim AcpiOsPrintf ("\n**** Unknown ACPI table type [%4.4s]\n\n", 479167802Sjkim Table->Signature); 480246849Sjkim fprintf (stderr, "Unknown ACPI table signature [%4.4s], decoding header only\n", 481246849Sjkim Table->Signature); 482167802Sjkim } 483167802Sjkim } 484167802Sjkim else if (TableData->TableHandler) 485167802Sjkim { 486167802Sjkim /* Complex table, has a handler */ 487167802Sjkim 488167802Sjkim TableData->TableHandler (Table); 489167802Sjkim } 490167802Sjkim else if (TableData->TableInfo) 491167802Sjkim { 492167802Sjkim /* Simple table, just walk the info table */ 493167802Sjkim 494167802Sjkim AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo); 495167802Sjkim } 496167802Sjkim } 497167802Sjkim 498209746Sjkim if (!Gbl_DoTemplates || Gbl_VerboseTemplates) 499209746Sjkim { 500209746Sjkim /* Dump the raw table data */ 501167802Sjkim 502217365Sjkim AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n", 503217365Sjkim ACPI_RAW_TABLE_DATA_HEADER, Length, Length); 504241973Sjkim AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table), 505241973Sjkim Length, DB_BYTE_DISPLAY, 0); 506209746Sjkim } 507167802Sjkim} 508167802Sjkim 509167802Sjkim 510167802Sjkim/******************************************************************************* 511167802Sjkim * 512167802Sjkim * FUNCTION: AcpiDmLineHeader 513167802Sjkim * 514167802Sjkim * PARAMETERS: Offset - Current byte offset, from table start 515167802Sjkim * ByteLength - Length of the field in bytes, 0 for flags 516167802Sjkim * Name - Name of this field 517167802Sjkim * Value - Optional value, displayed on left of ':' 518167802Sjkim * 519167802Sjkim * RETURN: None 520167802Sjkim * 521167802Sjkim * DESCRIPTION: Utility routines for formatting output lines. Displays the 522167802Sjkim * current table offset in hex and decimal, the field length, 523167802Sjkim * and the field name. 524167802Sjkim * 525167802Sjkim ******************************************************************************/ 526167802Sjkim 527167802Sjkimvoid 528167802SjkimAcpiDmLineHeader ( 529167802Sjkim UINT32 Offset, 530167802Sjkim UINT32 ByteLength, 531167802Sjkim char *Name) 532167802Sjkim{ 533167802Sjkim 534219707Sjkim /* Allow a null name for fields that span multiple lines (large buffers) */ 535219707Sjkim 536219707Sjkim if (!Name) 537219707Sjkim { 538219707Sjkim Name = ""; 539219707Sjkim } 540219707Sjkim 541209746Sjkim if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */ 542167802Sjkim { 543209746Sjkim if (ByteLength) 544209746Sjkim { 545219707Sjkim AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name); 546209746Sjkim } 547209746Sjkim else 548209746Sjkim { 549220663Sjkim if (*Name) 550220663Sjkim { 551220663Sjkim AcpiOsPrintf ("%41s : ", Name); 552220663Sjkim } 553220663Sjkim else 554220663Sjkim { 555220663Sjkim AcpiOsPrintf ("%41s ", Name); 556220663Sjkim } 557209746Sjkim } 558167802Sjkim } 559209746Sjkim else /* Normal disassembler or verbose template */ 560167802Sjkim { 561209746Sjkim if (ByteLength) 562209746Sjkim { 563219707Sjkim AcpiOsPrintf ("[%3.3Xh %4.4d% 4d] %28s : ", 564209746Sjkim Offset, Offset, ByteLength, Name); 565209746Sjkim } 566209746Sjkim else 567209746Sjkim { 568220663Sjkim if (*Name) 569220663Sjkim { 570220663Sjkim AcpiOsPrintf ("%44s : ", Name); 571220663Sjkim } 572220663Sjkim else 573220663Sjkim { 574220663Sjkim AcpiOsPrintf ("%44s ", Name); 575220663Sjkim } 576209746Sjkim } 577167802Sjkim } 578167802Sjkim} 579167802Sjkim 580167802Sjkimvoid 581167802SjkimAcpiDmLineHeader2 ( 582167802Sjkim UINT32 Offset, 583167802Sjkim UINT32 ByteLength, 584167802Sjkim char *Name, 585167802Sjkim UINT32 Value) 586167802Sjkim{ 587167802Sjkim 588209746Sjkim if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */ 589167802Sjkim { 590209746Sjkim if (ByteLength) 591209746Sjkim { 592220663Sjkim AcpiOsPrintf ("[%.4d] %30s %3d : ", 593209746Sjkim ByteLength, Name, Value); 594209746Sjkim } 595209746Sjkim else 596209746Sjkim { 597209746Sjkim AcpiOsPrintf ("%36s % 3d : ", 598209746Sjkim Name, Value); 599209746Sjkim } 600167802Sjkim } 601209746Sjkim else /* Normal disassembler or verbose template */ 602167802Sjkim { 603209746Sjkim if (ByteLength) 604209746Sjkim { 605220663Sjkim AcpiOsPrintf ("[%3.3Xh %4.4d %3d] %24s %3d : ", 606209746Sjkim Offset, Offset, ByteLength, Name, Value); 607209746Sjkim } 608209746Sjkim else 609209746Sjkim { 610220663Sjkim AcpiOsPrintf ("[%3.3Xh %4.4d ] %24s %3d : ", 611209746Sjkim Offset, Offset, Name, Value); 612209746Sjkim } 613167802Sjkim } 614167802Sjkim} 615167802Sjkim 616167802Sjkim 617167802Sjkim/******************************************************************************* 618167802Sjkim * 619167802Sjkim * FUNCTION: AcpiDmDumpTable 620167802Sjkim * 621167802Sjkim * PARAMETERS: TableLength - Length of the entire ACPI table 622167802Sjkim * TableOffset - Starting offset within the table for this 623167802Sjkim * sub-descriptor (0 if main table) 624167802Sjkim * Table - The ACPI table 625193529Sjkim * SubtableLength - Length of this sub-descriptor 626167802Sjkim * Info - Info table for this ACPI table 627167802Sjkim * 628167802Sjkim * RETURN: None 629167802Sjkim * 630167802Sjkim * DESCRIPTION: Display ACPI table contents by walking the Info table. 631167802Sjkim * 632209746Sjkim * Note: This function must remain in sync with DtGetFieldLength. 633209746Sjkim * 634167802Sjkim ******************************************************************************/ 635167802Sjkim 636193529SjkimACPI_STATUS 637167802SjkimAcpiDmDumpTable ( 638167802Sjkim UINT32 TableLength, 639167802Sjkim UINT32 TableOffset, 640167802Sjkim void *Table, 641167802Sjkim UINT32 SubtableLength, 642167802Sjkim ACPI_DMTABLE_INFO *Info) 643167802Sjkim{ 644167802Sjkim UINT8 *Target; 645167802Sjkim UINT32 CurrentOffset; 646167802Sjkim UINT32 ByteLength; 647167802Sjkim UINT8 Temp8; 648167802Sjkim UINT16 Temp16; 649167802Sjkim ACPI_DMTABLE_DATA *TableData; 650197104Sjkim const char *Name; 651193529Sjkim BOOLEAN LastOutputBlankLine = FALSE; 652197104Sjkim char RepairedName[8]; 653167802Sjkim 654167802Sjkim 655167802Sjkim if (!Info) 656167802Sjkim { 657167802Sjkim AcpiOsPrintf ("Display not implemented\n"); 658193529Sjkim return (AE_NOT_IMPLEMENTED); 659167802Sjkim } 660167802Sjkim 661167802Sjkim /* Walk entire Info table; Null name terminates */ 662167802Sjkim 663167802Sjkim for (; Info->Name; Info++) 664167802Sjkim { 665167802Sjkim /* 666167802Sjkim * Target points to the field within the ACPI Table. CurrentOffset is 667167802Sjkim * the offset of the field from the start of the main table. 668167802Sjkim */ 669167802Sjkim Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset); 670167802Sjkim CurrentOffset = TableOffset + Info->Offset; 671167802Sjkim 672167802Sjkim /* Check for beyond EOT or beyond subtable end */ 673167802Sjkim 674167802Sjkim if ((CurrentOffset >= TableLength) || 675167802Sjkim (SubtableLength && (Info->Offset >= SubtableLength))) 676167802Sjkim { 677193529Sjkim AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); 678193529Sjkim return (AE_BAD_DATA); 679167802Sjkim } 680167802Sjkim 681167802Sjkim /* Generate the byte length for this field */ 682167802Sjkim 683167802Sjkim switch (Info->Opcode) 684167802Sjkim { 685167802Sjkim case ACPI_DMT_UINT8: 686167802Sjkim case ACPI_DMT_CHKSUM: 687167802Sjkim case ACPI_DMT_SPACEID: 688216471Sjkim case ACPI_DMT_ACCWIDTH: 689197104Sjkim case ACPI_DMT_IVRS: 690167802Sjkim case ACPI_DMT_MADT: 691228110Sjkim case ACPI_DMT_PMTT: 692167802Sjkim case ACPI_DMT_SRAT: 693193529Sjkim case ACPI_DMT_ASF: 694193529Sjkim case ACPI_DMT_HESTNTYP: 695193529Sjkim case ACPI_DMT_FADTPM: 696209746Sjkim case ACPI_DMT_EINJACT: 697209746Sjkim case ACPI_DMT_EINJINST: 698209746Sjkim case ACPI_DMT_ERSTACT: 699209746Sjkim case ACPI_DMT_ERSTINST: 700167802Sjkim ByteLength = 1; 701167802Sjkim break; 702167802Sjkim case ACPI_DMT_UINT16: 703167802Sjkim case ACPI_DMT_DMAR: 704193529Sjkim case ACPI_DMT_HEST: 705167802Sjkim ByteLength = 2; 706167802Sjkim break; 707167802Sjkim case ACPI_DMT_UINT24: 708167802Sjkim ByteLength = 3; 709167802Sjkim break; 710167802Sjkim case ACPI_DMT_UINT32: 711167802Sjkim case ACPI_DMT_NAME4: 712167802Sjkim case ACPI_DMT_SIG: 713219707Sjkim case ACPI_DMT_SLIC: 714167802Sjkim ByteLength = 4; 715167802Sjkim break; 716228110Sjkim case ACPI_DMT_UINT40: 717228110Sjkim ByteLength = 5; 718228110Sjkim break; 719228110Sjkim case ACPI_DMT_UINT48: 720167802Sjkim case ACPI_DMT_NAME6: 721167802Sjkim ByteLength = 6; 722167802Sjkim break; 723167802Sjkim case ACPI_DMT_UINT56: 724218590Sjkim case ACPI_DMT_BUF7: 725167802Sjkim ByteLength = 7; 726167802Sjkim break; 727167802Sjkim case ACPI_DMT_UINT64: 728167802Sjkim case ACPI_DMT_NAME8: 729167802Sjkim ByteLength = 8; 730167802Sjkim break; 731197104Sjkim case ACPI_DMT_BUF16: 732217365Sjkim case ACPI_DMT_UUID: 733197104Sjkim ByteLength = 16; 734197104Sjkim break; 735219707Sjkim case ACPI_DMT_BUF128: 736219707Sjkim ByteLength = 128; 737219707Sjkim break; 738167802Sjkim case ACPI_DMT_STRING: 739167802Sjkim ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1; 740167802Sjkim break; 741167802Sjkim case ACPI_DMT_GAS: 742193529Sjkim if (!LastOutputBlankLine) 743193529Sjkim { 744193529Sjkim AcpiOsPrintf ("\n"); 745193529Sjkim LastOutputBlankLine = TRUE; 746193529Sjkim } 747167802Sjkim ByteLength = sizeof (ACPI_GENERIC_ADDRESS); 748167802Sjkim break; 749193529Sjkim case ACPI_DMT_HESTNTFY: 750193529Sjkim if (!LastOutputBlankLine) 751193529Sjkim { 752193529Sjkim AcpiOsPrintf ("\n"); 753193529Sjkim LastOutputBlankLine = TRUE; 754193529Sjkim } 755193529Sjkim ByteLength = sizeof (ACPI_HEST_NOTIFY); 756193529Sjkim break; 757167802Sjkim default: 758167802Sjkim ByteLength = 0; 759167802Sjkim break; 760167802Sjkim } 761167802Sjkim 762193529Sjkim if (CurrentOffset + ByteLength > TableLength) 763193529Sjkim { 764193529Sjkim AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); 765193529Sjkim return (AE_BAD_DATA); 766193529Sjkim } 767193529Sjkim 768228110Sjkim if (Info->Opcode == ACPI_DMT_EXTRA_TEXT) 769228110Sjkim { 770228110Sjkim AcpiOsPrintf ("%s", Info->Name); 771228110Sjkim continue; 772228110Sjkim } 773228110Sjkim 774167802Sjkim /* Start a new line and decode the opcode */ 775167802Sjkim 776167802Sjkim AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name); 777167802Sjkim 778167802Sjkim switch (Info->Opcode) 779167802Sjkim { 780167802Sjkim /* Single-bit Flag fields. Note: Opcode is the bit position */ 781167802Sjkim 782167802Sjkim case ACPI_DMT_FLAG0: 783167802Sjkim case ACPI_DMT_FLAG1: 784167802Sjkim case ACPI_DMT_FLAG2: 785167802Sjkim case ACPI_DMT_FLAG3: 786167802Sjkim case ACPI_DMT_FLAG4: 787167802Sjkim case ACPI_DMT_FLAG5: 788167802Sjkim case ACPI_DMT_FLAG6: 789167802Sjkim case ACPI_DMT_FLAG7: 790167802Sjkim 791167802Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01); 792167802Sjkim break; 793167802Sjkim 794167802Sjkim /* 2-bit Flag fields */ 795167802Sjkim 796167802Sjkim case ACPI_DMT_FLAGS0: 797167802Sjkim 798167802Sjkim AcpiOsPrintf ("%1.1X\n", *Target & 0x03); 799167802Sjkim break; 800167802Sjkim 801228110Sjkim case ACPI_DMT_FLAGS1: 802228110Sjkim 803228110Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03); 804228110Sjkim break; 805228110Sjkim 806167802Sjkim case ACPI_DMT_FLAGS2: 807167802Sjkim 808167802Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03); 809167802Sjkim break; 810167802Sjkim 811228110Sjkim case ACPI_DMT_FLAGS4: 812167802Sjkim 813228110Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03); 814167802Sjkim break; 815167802Sjkim 816228110Sjkim /* Integer Data Types */ 817228110Sjkim 818228110Sjkim case ACPI_DMT_UINT8: 819167802Sjkim case ACPI_DMT_UINT16: 820167802Sjkim case ACPI_DMT_UINT24: 821167802Sjkim case ACPI_DMT_UINT32: 822228110Sjkim case ACPI_DMT_UINT40: 823228110Sjkim case ACPI_DMT_UINT48: 824167802Sjkim case ACPI_DMT_UINT56: 825228110Sjkim case ACPI_DMT_UINT64: 826228110Sjkim /* 827228110Sjkim * Dump bytes - high byte first, low byte last. 828228110Sjkim * Note: All ACPI tables are little-endian. 829228110Sjkim */ 830228110Sjkim for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--) 831193529Sjkim { 832228110Sjkim AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]); 833193529Sjkim } 834193529Sjkim AcpiOsPrintf ("\n"); 835167802Sjkim break; 836167802Sjkim 837218590Sjkim case ACPI_DMT_BUF7: 838197104Sjkim case ACPI_DMT_BUF16: 839219707Sjkim case ACPI_DMT_BUF128: 840197104Sjkim 841218590Sjkim /* 842218590Sjkim * Buffer: Size depends on the opcode and was set above. 843218590Sjkim * Each hex byte is separated with a space. 844220663Sjkim * Multiple lines are separated by line continuation char. 845218590Sjkim */ 846219707Sjkim for (Temp16 = 0; Temp16 < ByteLength; Temp16++) 847197104Sjkim { 848219707Sjkim AcpiOsPrintf ("%2.2X", Target[Temp16]); 849219707Sjkim if ((UINT32) (Temp16 + 1) < ByteLength) 850209746Sjkim { 851219707Sjkim if ((Temp16 > 0) && (!((Temp16+1) % 16))) 852219707Sjkim { 853220663Sjkim AcpiOsPrintf (" \\\n"); /* Line continuation */ 854219707Sjkim AcpiDmLineHeader (0, 0, NULL); 855219707Sjkim } 856219707Sjkim else 857219707Sjkim { 858219707Sjkim AcpiOsPrintf (" "); 859219707Sjkim } 860209746Sjkim } 861197104Sjkim } 862197104Sjkim AcpiOsPrintf ("\n"); 863197104Sjkim break; 864197104Sjkim 865217365Sjkim case ACPI_DMT_UUID: 866217365Sjkim 867217365Sjkim /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */ 868217365Sjkim 869217365Sjkim (void) AuConvertUuidToString ((char *) Target, MsgBuffer); 870217365Sjkim 871217365Sjkim AcpiOsPrintf ("%s\n", MsgBuffer); 872217365Sjkim break; 873217365Sjkim 874167802Sjkim case ACPI_DMT_STRING: 875167802Sjkim 876197104Sjkim AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target)); 877167802Sjkim break; 878167802Sjkim 879167802Sjkim /* Fixed length ASCII name fields */ 880167802Sjkim 881167802Sjkim case ACPI_DMT_SIG: 882167802Sjkim 883197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 4); 884197104Sjkim AcpiOsPrintf ("\"%.4s\" ", RepairedName); 885167802Sjkim TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target)); 886167802Sjkim if (TableData) 887167802Sjkim { 888220663Sjkim AcpiOsPrintf (STRING_FORMAT, TableData->Name); 889167802Sjkim } 890220663Sjkim else 891220663Sjkim { 892220663Sjkim AcpiOsPrintf ("\n"); 893220663Sjkim } 894167802Sjkim break; 895167802Sjkim 896167802Sjkim case ACPI_DMT_NAME4: 897167802Sjkim 898197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 4); 899197104Sjkim AcpiOsPrintf ("\"%.4s\"\n", RepairedName); 900167802Sjkim break; 901167802Sjkim 902167802Sjkim case ACPI_DMT_NAME6: 903167802Sjkim 904197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 6); 905197104Sjkim AcpiOsPrintf ("\"%.6s\"\n", RepairedName); 906167802Sjkim break; 907167802Sjkim 908167802Sjkim case ACPI_DMT_NAME8: 909167802Sjkim 910197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 8); 911197104Sjkim AcpiOsPrintf ("\"%.8s\"\n", RepairedName); 912167802Sjkim break; 913167802Sjkim 914167802Sjkim /* Special Data Types */ 915167802Sjkim 916167802Sjkim case ACPI_DMT_CHKSUM: 917167802Sjkim 918167802Sjkim /* Checksum, display and validate */ 919167802Sjkim 920167802Sjkim AcpiOsPrintf ("%2.2X", *Target); 921209746Sjkim Temp8 = AcpiDmGenerateChecksum (Table, 922209746Sjkim ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, 923209746Sjkim ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum); 924167802Sjkim if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum) 925167802Sjkim { 926167802Sjkim AcpiOsPrintf ( 927167802Sjkim " /* Incorrect checksum, should be %2.2X */", Temp8); 928167802Sjkim } 929167802Sjkim AcpiOsPrintf ("\n"); 930167802Sjkim break; 931167802Sjkim 932167802Sjkim case ACPI_DMT_SPACEID: 933167802Sjkim 934167802Sjkim /* Address Space ID */ 935167802Sjkim 936220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target)); 937167802Sjkim break; 938167802Sjkim 939216471Sjkim case ACPI_DMT_ACCWIDTH: 940216471Sjkim 941216471Sjkim /* Encoded Access Width */ 942216471Sjkim 943216471Sjkim Temp8 = *Target; 944216471Sjkim if (Temp8 > ACPI_GAS_WIDTH_RESERVED) 945216471Sjkim { 946216471Sjkim Temp8 = ACPI_GAS_WIDTH_RESERVED; 947216471Sjkim } 948216471Sjkim 949220663Sjkim AcpiOsPrintf (UINT8_FORMAT, Temp8, AcpiDmGasAccessWidth[Temp8]); 950216471Sjkim break; 951216471Sjkim 952167802Sjkim case ACPI_DMT_GAS: 953167802Sjkim 954167802Sjkim /* Generic Address Structure */ 955167802Sjkim 956220663Sjkim AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure"); 957197104Sjkim AcpiDmDumpTable (TableLength, CurrentOffset, Target, 958197104Sjkim sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas); 959193529Sjkim AcpiOsPrintf ("\n"); 960193529Sjkim LastOutputBlankLine = TRUE; 961167802Sjkim break; 962167802Sjkim 963193529Sjkim case ACPI_DMT_ASF: 964193529Sjkim 965193529Sjkim /* ASF subtable types */ 966193529Sjkim 967193529Sjkim Temp16 = (UINT16) ((*Target) & 0x7F); /* Top bit can be zero or one */ 968193529Sjkim if (Temp16 > ACPI_ASF_TYPE_RESERVED) 969193529Sjkim { 970193529Sjkim Temp16 = ACPI_ASF_TYPE_RESERVED; 971193529Sjkim } 972193529Sjkim 973220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]); 974193529Sjkim break; 975193529Sjkim 976167802Sjkim case ACPI_DMT_DMAR: 977167802Sjkim 978167802Sjkim /* DMAR subtable types */ 979167802Sjkim 980193529Sjkim Temp16 = ACPI_GET16 (Target); 981167802Sjkim if (Temp16 > ACPI_DMAR_TYPE_RESERVED) 982167802Sjkim { 983167802Sjkim Temp16 = ACPI_DMAR_TYPE_RESERVED; 984167802Sjkim } 985167802Sjkim 986220663Sjkim AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]); 987167802Sjkim break; 988167802Sjkim 989209746Sjkim case ACPI_DMT_EINJACT: 990209746Sjkim 991209746Sjkim /* EINJ Action types */ 992209746Sjkim 993209746Sjkim Temp8 = *Target; 994209746Sjkim if (Temp8 > ACPI_EINJ_ACTION_RESERVED) 995209746Sjkim { 996209746Sjkim Temp8 = ACPI_EINJ_ACTION_RESERVED; 997209746Sjkim } 998209746Sjkim 999220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjActions[Temp8]); 1000209746Sjkim break; 1001209746Sjkim 1002209746Sjkim case ACPI_DMT_EINJINST: 1003209746Sjkim 1004209746Sjkim /* EINJ Instruction types */ 1005209746Sjkim 1006209746Sjkim Temp8 = *Target; 1007209746Sjkim if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED) 1008209746Sjkim { 1009209746Sjkim Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED; 1010209746Sjkim } 1011209746Sjkim 1012220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjInstructions[Temp8]); 1013209746Sjkim break; 1014209746Sjkim 1015209746Sjkim case ACPI_DMT_ERSTACT: 1016209746Sjkim 1017209746Sjkim /* ERST Action types */ 1018209746Sjkim 1019209746Sjkim Temp8 = *Target; 1020209746Sjkim if (Temp8 > ACPI_ERST_ACTION_RESERVED) 1021209746Sjkim { 1022209746Sjkim Temp8 = ACPI_ERST_ACTION_RESERVED; 1023209746Sjkim } 1024209746Sjkim 1025220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstActions[Temp8]); 1026209746Sjkim break; 1027209746Sjkim 1028209746Sjkim case ACPI_DMT_ERSTINST: 1029209746Sjkim 1030209746Sjkim /* ERST Instruction types */ 1031209746Sjkim 1032209746Sjkim Temp8 = *Target; 1033209746Sjkim if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED) 1034209746Sjkim { 1035209746Sjkim Temp8 = ACPI_ERST_INSTRUCTION_RESERVED; 1036209746Sjkim } 1037209746Sjkim 1038220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstInstructions[Temp8]); 1039209746Sjkim break; 1040209746Sjkim 1041193529Sjkim case ACPI_DMT_HEST: 1042193529Sjkim 1043193529Sjkim /* HEST subtable types */ 1044193529Sjkim 1045193529Sjkim Temp16 = ACPI_GET16 (Target); 1046193529Sjkim if (Temp16 > ACPI_HEST_TYPE_RESERVED) 1047193529Sjkim { 1048193529Sjkim Temp16 = ACPI_HEST_TYPE_RESERVED; 1049193529Sjkim } 1050193529Sjkim 1051220663Sjkim AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]); 1052193529Sjkim break; 1053193529Sjkim 1054193529Sjkim case ACPI_DMT_HESTNTFY: 1055193529Sjkim 1056220663Sjkim AcpiOsPrintf (STRING_FORMAT, "Hardware Error Notification Structure"); 1057197104Sjkim AcpiDmDumpTable (TableLength, CurrentOffset, Target, 1058197104Sjkim sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify); 1059193529Sjkim AcpiOsPrintf ("\n"); 1060193529Sjkim LastOutputBlankLine = TRUE; 1061193529Sjkim break; 1062193529Sjkim 1063193529Sjkim case ACPI_DMT_HESTNTYP: 1064193529Sjkim 1065193529Sjkim /* HEST Notify types */ 1066193529Sjkim 1067193529Sjkim Temp8 = *Target; 1068193529Sjkim if (Temp8 > ACPI_HEST_NOTIFY_RESERVED) 1069193529Sjkim { 1070193529Sjkim Temp8 = ACPI_HEST_NOTIFY_RESERVED; 1071193529Sjkim } 1072193529Sjkim 1073220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmHestNotifySubnames[Temp8]); 1074193529Sjkim break; 1075193529Sjkim 1076167802Sjkim case ACPI_DMT_MADT: 1077167802Sjkim 1078167802Sjkim /* MADT subtable types */ 1079167802Sjkim 1080167802Sjkim Temp8 = *Target; 1081167802Sjkim if (Temp8 > ACPI_MADT_TYPE_RESERVED) 1082167802Sjkim { 1083167802Sjkim Temp8 = ACPI_MADT_TYPE_RESERVED; 1084167802Sjkim } 1085167802Sjkim 1086220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmMadtSubnames[Temp8]); 1087167802Sjkim break; 1088167802Sjkim 1089228110Sjkim case ACPI_DMT_PMTT: 1090228110Sjkim 1091228110Sjkim /* PMTT subtable types */ 1092228110Sjkim 1093228110Sjkim Temp8 = *Target; 1094228110Sjkim if (Temp8 > ACPI_PMTT_TYPE_RESERVED) 1095228110Sjkim { 1096228110Sjkim Temp8 = ACPI_PMTT_TYPE_RESERVED; 1097228110Sjkim } 1098228110Sjkim 1099228110Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmPmttSubnames[Temp8]); 1100228110Sjkim break; 1101228110Sjkim 1102219707Sjkim case ACPI_DMT_SLIC: 1103219707Sjkim 1104219707Sjkim /* SLIC subtable types */ 1105219707Sjkim 1106219707Sjkim Temp8 = *Target; 1107219707Sjkim if (Temp8 > ACPI_SLIC_TYPE_RESERVED) 1108219707Sjkim { 1109219707Sjkim Temp8 = ACPI_SLIC_TYPE_RESERVED; 1110219707Sjkim } 1111219707Sjkim 1112220663Sjkim AcpiOsPrintf (UINT32_FORMAT, *Target, AcpiDmSlicSubnames[Temp8]); 1113219707Sjkim break; 1114219707Sjkim 1115167802Sjkim case ACPI_DMT_SRAT: 1116167802Sjkim 1117167802Sjkim /* SRAT subtable types */ 1118167802Sjkim 1119167802Sjkim Temp8 = *Target; 1120167802Sjkim if (Temp8 > ACPI_SRAT_TYPE_RESERVED) 1121167802Sjkim { 1122167802Sjkim Temp8 = ACPI_SRAT_TYPE_RESERVED; 1123167802Sjkim } 1124167802Sjkim 1125220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmSratSubnames[Temp8]); 1126167802Sjkim break; 1127167802Sjkim 1128193529Sjkim case ACPI_DMT_FADTPM: 1129193529Sjkim 1130193529Sjkim /* FADT Preferred PM Profile names */ 1131193529Sjkim 1132193529Sjkim Temp8 = *Target; 1133193529Sjkim if (Temp8 > ACPI_FADT_PM_RESERVED) 1134193529Sjkim { 1135193529Sjkim Temp8 = ACPI_FADT_PM_RESERVED; 1136193529Sjkim } 1137193529Sjkim 1138220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmFadtProfiles[Temp8]); 1139193529Sjkim break; 1140193529Sjkim 1141197104Sjkim case ACPI_DMT_IVRS: 1142197104Sjkim 1143197104Sjkim /* IVRS subtable types */ 1144197104Sjkim 1145197104Sjkim Temp8 = *Target; 1146197104Sjkim switch (Temp8) 1147197104Sjkim { 1148197104Sjkim case ACPI_IVRS_TYPE_HARDWARE: 1149197104Sjkim Name = AcpiDmIvrsSubnames[0]; 1150197104Sjkim break; 1151197104Sjkim 1152197104Sjkim case ACPI_IVRS_TYPE_MEMORY1: 1153197104Sjkim case ACPI_IVRS_TYPE_MEMORY2: 1154197104Sjkim case ACPI_IVRS_TYPE_MEMORY3: 1155197104Sjkim Name = AcpiDmIvrsSubnames[1]; 1156197104Sjkim break; 1157197104Sjkim 1158197104Sjkim default: 1159197104Sjkim Name = AcpiDmIvrsSubnames[2]; 1160197104Sjkim break; 1161197104Sjkim } 1162197104Sjkim 1163220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, Name); 1164197104Sjkim break; 1165197104Sjkim 1166167802Sjkim case ACPI_DMT_EXIT: 1167193529Sjkim return (AE_OK); 1168167802Sjkim 1169167802Sjkim default: 1170167802Sjkim ACPI_ERROR ((AE_INFO, 1171204773Sjkim "**** Invalid table opcode [0x%X] ****\n", Info->Opcode)); 1172193529Sjkim return (AE_SUPPORT); 1173167802Sjkim } 1174167802Sjkim } 1175193529Sjkim 1176193529Sjkim if (TableOffset && !SubtableLength) 1177193529Sjkim { 1178193529Sjkim /* If this table is not the main table, subtable must have valid length */ 1179193529Sjkim 1180193529Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 1181193529Sjkim return (AE_BAD_DATA); 1182193529Sjkim } 1183193529Sjkim 1184193529Sjkim return (AE_OK); 1185167802Sjkim} 1186167802Sjkim 1187167802Sjkim 1188167802Sjkim/******************************************************************************* 1189167802Sjkim * 1190167802Sjkim * FUNCTION: AcpiDmCheckAscii 1191167802Sjkim * 1192167802Sjkim * PARAMETERS: Name - Ascii string 1193167802Sjkim * Count - Number of characters to check 1194167802Sjkim * 1195167802Sjkim * RETURN: None 1196167802Sjkim * 1197167802Sjkim * DESCRIPTION: Ensure that the requested number of characters are printable 1198167802Sjkim * Ascii characters. Sets non-printable and null chars to <space>. 1199167802Sjkim * 1200167802Sjkim ******************************************************************************/ 1201167802Sjkim 1202167802Sjkimstatic void 1203167802SjkimAcpiDmCheckAscii ( 1204167802Sjkim UINT8 *Name, 1205197104Sjkim char *RepairedName, 1206167802Sjkim UINT32 Count) 1207167802Sjkim{ 1208167802Sjkim UINT32 i; 1209167802Sjkim 1210167802Sjkim 1211167802Sjkim for (i = 0; i < Count; i++) 1212167802Sjkim { 1213198237Sjkim RepairedName[i] = (char) Name[i]; 1214197104Sjkim 1215197104Sjkim if (!Name[i]) 1216167802Sjkim { 1217197104Sjkim return; 1218167802Sjkim } 1219197104Sjkim if (!isprint (Name[i])) 1220197104Sjkim { 1221197104Sjkim RepairedName[i] = ' '; 1222197104Sjkim } 1223167802Sjkim } 1224167802Sjkim} 1225