dmtable.c revision 250838
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: 700250838Sjkim 701167802Sjkim ByteLength = 1; 702167802Sjkim break; 703250838Sjkim 704167802Sjkim case ACPI_DMT_UINT16: 705167802Sjkim case ACPI_DMT_DMAR: 706193529Sjkim case ACPI_DMT_HEST: 707250838Sjkim 708167802Sjkim ByteLength = 2; 709167802Sjkim break; 710250838Sjkim 711167802Sjkim case ACPI_DMT_UINT24: 712250838Sjkim 713167802Sjkim ByteLength = 3; 714167802Sjkim break; 715250838Sjkim 716167802Sjkim case ACPI_DMT_UINT32: 717167802Sjkim case ACPI_DMT_NAME4: 718167802Sjkim case ACPI_DMT_SIG: 719219707Sjkim case ACPI_DMT_SLIC: 720250838Sjkim 721167802Sjkim ByteLength = 4; 722167802Sjkim break; 723250838Sjkim 724228110Sjkim case ACPI_DMT_UINT40: 725250838Sjkim 726228110Sjkim ByteLength = 5; 727228110Sjkim break; 728250838Sjkim 729228110Sjkim case ACPI_DMT_UINT48: 730167802Sjkim case ACPI_DMT_NAME6: 731250838Sjkim 732167802Sjkim ByteLength = 6; 733167802Sjkim break; 734250838Sjkim 735167802Sjkim case ACPI_DMT_UINT56: 736218590Sjkim case ACPI_DMT_BUF7: 737250838Sjkim 738167802Sjkim ByteLength = 7; 739167802Sjkim break; 740250838Sjkim 741167802Sjkim case ACPI_DMT_UINT64: 742167802Sjkim case ACPI_DMT_NAME8: 743250838Sjkim 744167802Sjkim ByteLength = 8; 745167802Sjkim break; 746250838Sjkim 747197104Sjkim case ACPI_DMT_BUF16: 748217365Sjkim case ACPI_DMT_UUID: 749250838Sjkim 750197104Sjkim ByteLength = 16; 751197104Sjkim break; 752250838Sjkim 753219707Sjkim case ACPI_DMT_BUF128: 754250838Sjkim 755219707Sjkim ByteLength = 128; 756219707Sjkim break; 757250838Sjkim 758167802Sjkim case ACPI_DMT_STRING: 759250838Sjkim 760167802Sjkim ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1; 761167802Sjkim break; 762250838Sjkim 763167802Sjkim case ACPI_DMT_GAS: 764250838Sjkim 765193529Sjkim if (!LastOutputBlankLine) 766193529Sjkim { 767193529Sjkim AcpiOsPrintf ("\n"); 768193529Sjkim LastOutputBlankLine = TRUE; 769193529Sjkim } 770167802Sjkim ByteLength = sizeof (ACPI_GENERIC_ADDRESS); 771167802Sjkim break; 772250838Sjkim 773193529Sjkim case ACPI_DMT_HESTNTFY: 774250838Sjkim 775193529Sjkim if (!LastOutputBlankLine) 776193529Sjkim { 777193529Sjkim AcpiOsPrintf ("\n"); 778193529Sjkim LastOutputBlankLine = TRUE; 779193529Sjkim } 780193529Sjkim ByteLength = sizeof (ACPI_HEST_NOTIFY); 781193529Sjkim break; 782250838Sjkim 783167802Sjkim default: 784250838Sjkim 785167802Sjkim ByteLength = 0; 786167802Sjkim break; 787167802Sjkim } 788167802Sjkim 789193529Sjkim if (CurrentOffset + ByteLength > TableLength) 790193529Sjkim { 791193529Sjkim AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); 792193529Sjkim return (AE_BAD_DATA); 793193529Sjkim } 794193529Sjkim 795228110Sjkim if (Info->Opcode == ACPI_DMT_EXTRA_TEXT) 796228110Sjkim { 797228110Sjkim AcpiOsPrintf ("%s", Info->Name); 798228110Sjkim continue; 799228110Sjkim } 800228110Sjkim 801167802Sjkim /* Start a new line and decode the opcode */ 802167802Sjkim 803167802Sjkim AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name); 804167802Sjkim 805167802Sjkim switch (Info->Opcode) 806167802Sjkim { 807167802Sjkim /* Single-bit Flag fields. Note: Opcode is the bit position */ 808167802Sjkim 809167802Sjkim case ACPI_DMT_FLAG0: 810167802Sjkim case ACPI_DMT_FLAG1: 811167802Sjkim case ACPI_DMT_FLAG2: 812167802Sjkim case ACPI_DMT_FLAG3: 813167802Sjkim case ACPI_DMT_FLAG4: 814167802Sjkim case ACPI_DMT_FLAG5: 815167802Sjkim case ACPI_DMT_FLAG6: 816167802Sjkim case ACPI_DMT_FLAG7: 817167802Sjkim 818167802Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01); 819167802Sjkim break; 820167802Sjkim 821167802Sjkim /* 2-bit Flag fields */ 822167802Sjkim 823167802Sjkim case ACPI_DMT_FLAGS0: 824167802Sjkim 825167802Sjkim AcpiOsPrintf ("%1.1X\n", *Target & 0x03); 826167802Sjkim break; 827167802Sjkim 828228110Sjkim case ACPI_DMT_FLAGS1: 829228110Sjkim 830228110Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03); 831228110Sjkim break; 832228110Sjkim 833167802Sjkim case ACPI_DMT_FLAGS2: 834167802Sjkim 835167802Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03); 836167802Sjkim break; 837167802Sjkim 838228110Sjkim case ACPI_DMT_FLAGS4: 839167802Sjkim 840228110Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03); 841167802Sjkim break; 842167802Sjkim 843228110Sjkim /* Integer Data Types */ 844228110Sjkim 845228110Sjkim case ACPI_DMT_UINT8: 846167802Sjkim case ACPI_DMT_UINT16: 847167802Sjkim case ACPI_DMT_UINT24: 848167802Sjkim case ACPI_DMT_UINT32: 849228110Sjkim case ACPI_DMT_UINT40: 850228110Sjkim case ACPI_DMT_UINT48: 851167802Sjkim case ACPI_DMT_UINT56: 852228110Sjkim case ACPI_DMT_UINT64: 853228110Sjkim /* 854228110Sjkim * Dump bytes - high byte first, low byte last. 855228110Sjkim * Note: All ACPI tables are little-endian. 856228110Sjkim */ 857228110Sjkim for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--) 858193529Sjkim { 859228110Sjkim AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]); 860193529Sjkim } 861193529Sjkim AcpiOsPrintf ("\n"); 862167802Sjkim break; 863167802Sjkim 864218590Sjkim case ACPI_DMT_BUF7: 865197104Sjkim case ACPI_DMT_BUF16: 866219707Sjkim case ACPI_DMT_BUF128: 867218590Sjkim /* 868218590Sjkim * Buffer: Size depends on the opcode and was set above. 869218590Sjkim * Each hex byte is separated with a space. 870220663Sjkim * Multiple lines are separated by line continuation char. 871218590Sjkim */ 872219707Sjkim for (Temp16 = 0; Temp16 < ByteLength; Temp16++) 873197104Sjkim { 874219707Sjkim AcpiOsPrintf ("%2.2X", Target[Temp16]); 875219707Sjkim if ((UINT32) (Temp16 + 1) < ByteLength) 876209746Sjkim { 877219707Sjkim if ((Temp16 > 0) && (!((Temp16+1) % 16))) 878219707Sjkim { 879220663Sjkim AcpiOsPrintf (" \\\n"); /* Line continuation */ 880219707Sjkim AcpiDmLineHeader (0, 0, NULL); 881219707Sjkim } 882219707Sjkim else 883219707Sjkim { 884219707Sjkim AcpiOsPrintf (" "); 885219707Sjkim } 886209746Sjkim } 887197104Sjkim } 888197104Sjkim AcpiOsPrintf ("\n"); 889197104Sjkim break; 890197104Sjkim 891217365Sjkim case ACPI_DMT_UUID: 892217365Sjkim 893217365Sjkim /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */ 894217365Sjkim 895217365Sjkim (void) AuConvertUuidToString ((char *) Target, MsgBuffer); 896217365Sjkim 897217365Sjkim AcpiOsPrintf ("%s\n", MsgBuffer); 898217365Sjkim break; 899217365Sjkim 900167802Sjkim case ACPI_DMT_STRING: 901167802Sjkim 902197104Sjkim AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target)); 903167802Sjkim break; 904167802Sjkim 905167802Sjkim /* Fixed length ASCII name fields */ 906167802Sjkim 907167802Sjkim case ACPI_DMT_SIG: 908167802Sjkim 909197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 4); 910197104Sjkim AcpiOsPrintf ("\"%.4s\" ", RepairedName); 911167802Sjkim TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target)); 912167802Sjkim if (TableData) 913167802Sjkim { 914220663Sjkim AcpiOsPrintf (STRING_FORMAT, TableData->Name); 915167802Sjkim } 916220663Sjkim else 917220663Sjkim { 918220663Sjkim AcpiOsPrintf ("\n"); 919220663Sjkim } 920167802Sjkim break; 921167802Sjkim 922167802Sjkim case ACPI_DMT_NAME4: 923167802Sjkim 924197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 4); 925197104Sjkim AcpiOsPrintf ("\"%.4s\"\n", RepairedName); 926167802Sjkim break; 927167802Sjkim 928167802Sjkim case ACPI_DMT_NAME6: 929167802Sjkim 930197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 6); 931197104Sjkim AcpiOsPrintf ("\"%.6s\"\n", RepairedName); 932167802Sjkim break; 933167802Sjkim 934167802Sjkim case ACPI_DMT_NAME8: 935167802Sjkim 936197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 8); 937197104Sjkim AcpiOsPrintf ("\"%.8s\"\n", RepairedName); 938167802Sjkim break; 939167802Sjkim 940167802Sjkim /* Special Data Types */ 941167802Sjkim 942167802Sjkim case ACPI_DMT_CHKSUM: 943167802Sjkim 944167802Sjkim /* Checksum, display and validate */ 945167802Sjkim 946167802Sjkim AcpiOsPrintf ("%2.2X", *Target); 947209746Sjkim Temp8 = AcpiDmGenerateChecksum (Table, 948209746Sjkim ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, 949209746Sjkim ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum); 950167802Sjkim if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum) 951167802Sjkim { 952167802Sjkim AcpiOsPrintf ( 953167802Sjkim " /* Incorrect checksum, should be %2.2X */", Temp8); 954167802Sjkim } 955167802Sjkim AcpiOsPrintf ("\n"); 956167802Sjkim break; 957167802Sjkim 958167802Sjkim case ACPI_DMT_SPACEID: 959167802Sjkim 960167802Sjkim /* Address Space ID */ 961167802Sjkim 962220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target)); 963167802Sjkim break; 964167802Sjkim 965216471Sjkim case ACPI_DMT_ACCWIDTH: 966216471Sjkim 967216471Sjkim /* Encoded Access Width */ 968216471Sjkim 969216471Sjkim Temp8 = *Target; 970216471Sjkim if (Temp8 > ACPI_GAS_WIDTH_RESERVED) 971216471Sjkim { 972216471Sjkim Temp8 = ACPI_GAS_WIDTH_RESERVED; 973216471Sjkim } 974216471Sjkim 975220663Sjkim AcpiOsPrintf (UINT8_FORMAT, Temp8, AcpiDmGasAccessWidth[Temp8]); 976216471Sjkim break; 977216471Sjkim 978167802Sjkim case ACPI_DMT_GAS: 979167802Sjkim 980167802Sjkim /* Generic Address Structure */ 981167802Sjkim 982220663Sjkim AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure"); 983197104Sjkim AcpiDmDumpTable (TableLength, CurrentOffset, Target, 984197104Sjkim sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas); 985193529Sjkim AcpiOsPrintf ("\n"); 986193529Sjkim LastOutputBlankLine = TRUE; 987167802Sjkim break; 988167802Sjkim 989193529Sjkim case ACPI_DMT_ASF: 990193529Sjkim 991193529Sjkim /* ASF subtable types */ 992193529Sjkim 993193529Sjkim Temp16 = (UINT16) ((*Target) & 0x7F); /* Top bit can be zero or one */ 994193529Sjkim if (Temp16 > ACPI_ASF_TYPE_RESERVED) 995193529Sjkim { 996193529Sjkim Temp16 = ACPI_ASF_TYPE_RESERVED; 997193529Sjkim } 998193529Sjkim 999220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]); 1000193529Sjkim break; 1001193529Sjkim 1002167802Sjkim case ACPI_DMT_DMAR: 1003167802Sjkim 1004167802Sjkim /* DMAR subtable types */ 1005167802Sjkim 1006193529Sjkim Temp16 = ACPI_GET16 (Target); 1007167802Sjkim if (Temp16 > ACPI_DMAR_TYPE_RESERVED) 1008167802Sjkim { 1009167802Sjkim Temp16 = ACPI_DMAR_TYPE_RESERVED; 1010167802Sjkim } 1011167802Sjkim 1012220663Sjkim AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]); 1013167802Sjkim break; 1014167802Sjkim 1015209746Sjkim case ACPI_DMT_EINJACT: 1016209746Sjkim 1017209746Sjkim /* EINJ Action types */ 1018209746Sjkim 1019209746Sjkim Temp8 = *Target; 1020209746Sjkim if (Temp8 > ACPI_EINJ_ACTION_RESERVED) 1021209746Sjkim { 1022209746Sjkim Temp8 = ACPI_EINJ_ACTION_RESERVED; 1023209746Sjkim } 1024209746Sjkim 1025220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjActions[Temp8]); 1026209746Sjkim break; 1027209746Sjkim 1028209746Sjkim case ACPI_DMT_EINJINST: 1029209746Sjkim 1030209746Sjkim /* EINJ Instruction types */ 1031209746Sjkim 1032209746Sjkim Temp8 = *Target; 1033209746Sjkim if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED) 1034209746Sjkim { 1035209746Sjkim Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED; 1036209746Sjkim } 1037209746Sjkim 1038220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjInstructions[Temp8]); 1039209746Sjkim break; 1040209746Sjkim 1041209746Sjkim case ACPI_DMT_ERSTACT: 1042209746Sjkim 1043209746Sjkim /* ERST Action types */ 1044209746Sjkim 1045209746Sjkim Temp8 = *Target; 1046209746Sjkim if (Temp8 > ACPI_ERST_ACTION_RESERVED) 1047209746Sjkim { 1048209746Sjkim Temp8 = ACPI_ERST_ACTION_RESERVED; 1049209746Sjkim } 1050209746Sjkim 1051220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstActions[Temp8]); 1052209746Sjkim break; 1053209746Sjkim 1054209746Sjkim case ACPI_DMT_ERSTINST: 1055209746Sjkim 1056209746Sjkim /* ERST Instruction types */ 1057209746Sjkim 1058209746Sjkim Temp8 = *Target; 1059209746Sjkim if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED) 1060209746Sjkim { 1061209746Sjkim Temp8 = ACPI_ERST_INSTRUCTION_RESERVED; 1062209746Sjkim } 1063209746Sjkim 1064220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstInstructions[Temp8]); 1065209746Sjkim break; 1066209746Sjkim 1067193529Sjkim case ACPI_DMT_HEST: 1068193529Sjkim 1069193529Sjkim /* HEST subtable types */ 1070193529Sjkim 1071193529Sjkim Temp16 = ACPI_GET16 (Target); 1072193529Sjkim if (Temp16 > ACPI_HEST_TYPE_RESERVED) 1073193529Sjkim { 1074193529Sjkim Temp16 = ACPI_HEST_TYPE_RESERVED; 1075193529Sjkim } 1076193529Sjkim 1077220663Sjkim AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]); 1078193529Sjkim break; 1079193529Sjkim 1080193529Sjkim case ACPI_DMT_HESTNTFY: 1081193529Sjkim 1082220663Sjkim AcpiOsPrintf (STRING_FORMAT, "Hardware Error Notification Structure"); 1083197104Sjkim AcpiDmDumpTable (TableLength, CurrentOffset, Target, 1084197104Sjkim sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify); 1085193529Sjkim AcpiOsPrintf ("\n"); 1086193529Sjkim LastOutputBlankLine = TRUE; 1087193529Sjkim break; 1088193529Sjkim 1089193529Sjkim case ACPI_DMT_HESTNTYP: 1090193529Sjkim 1091193529Sjkim /* HEST Notify types */ 1092193529Sjkim 1093193529Sjkim Temp8 = *Target; 1094193529Sjkim if (Temp8 > ACPI_HEST_NOTIFY_RESERVED) 1095193529Sjkim { 1096193529Sjkim Temp8 = ACPI_HEST_NOTIFY_RESERVED; 1097193529Sjkim } 1098193529Sjkim 1099220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmHestNotifySubnames[Temp8]); 1100193529Sjkim break; 1101193529Sjkim 1102167802Sjkim case ACPI_DMT_MADT: 1103167802Sjkim 1104167802Sjkim /* MADT subtable types */ 1105167802Sjkim 1106167802Sjkim Temp8 = *Target; 1107167802Sjkim if (Temp8 > ACPI_MADT_TYPE_RESERVED) 1108167802Sjkim { 1109167802Sjkim Temp8 = ACPI_MADT_TYPE_RESERVED; 1110167802Sjkim } 1111167802Sjkim 1112220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmMadtSubnames[Temp8]); 1113167802Sjkim break; 1114167802Sjkim 1115228110Sjkim case ACPI_DMT_PMTT: 1116228110Sjkim 1117228110Sjkim /* PMTT subtable types */ 1118228110Sjkim 1119228110Sjkim Temp8 = *Target; 1120228110Sjkim if (Temp8 > ACPI_PMTT_TYPE_RESERVED) 1121228110Sjkim { 1122228110Sjkim Temp8 = ACPI_PMTT_TYPE_RESERVED; 1123228110Sjkim } 1124228110Sjkim 1125228110Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmPmttSubnames[Temp8]); 1126228110Sjkim break; 1127228110Sjkim 1128219707Sjkim case ACPI_DMT_SLIC: 1129219707Sjkim 1130219707Sjkim /* SLIC subtable types */ 1131219707Sjkim 1132219707Sjkim Temp8 = *Target; 1133219707Sjkim if (Temp8 > ACPI_SLIC_TYPE_RESERVED) 1134219707Sjkim { 1135219707Sjkim Temp8 = ACPI_SLIC_TYPE_RESERVED; 1136219707Sjkim } 1137219707Sjkim 1138220663Sjkim AcpiOsPrintf (UINT32_FORMAT, *Target, AcpiDmSlicSubnames[Temp8]); 1139219707Sjkim break; 1140219707Sjkim 1141167802Sjkim case ACPI_DMT_SRAT: 1142167802Sjkim 1143167802Sjkim /* SRAT subtable types */ 1144167802Sjkim 1145167802Sjkim Temp8 = *Target; 1146167802Sjkim if (Temp8 > ACPI_SRAT_TYPE_RESERVED) 1147167802Sjkim { 1148167802Sjkim Temp8 = ACPI_SRAT_TYPE_RESERVED; 1149167802Sjkim } 1150167802Sjkim 1151220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmSratSubnames[Temp8]); 1152167802Sjkim break; 1153167802Sjkim 1154193529Sjkim case ACPI_DMT_FADTPM: 1155193529Sjkim 1156193529Sjkim /* FADT Preferred PM Profile names */ 1157193529Sjkim 1158193529Sjkim Temp8 = *Target; 1159193529Sjkim if (Temp8 > ACPI_FADT_PM_RESERVED) 1160193529Sjkim { 1161193529Sjkim Temp8 = ACPI_FADT_PM_RESERVED; 1162193529Sjkim } 1163193529Sjkim 1164220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmFadtProfiles[Temp8]); 1165193529Sjkim break; 1166193529Sjkim 1167197104Sjkim case ACPI_DMT_IVRS: 1168197104Sjkim 1169197104Sjkim /* IVRS subtable types */ 1170197104Sjkim 1171197104Sjkim Temp8 = *Target; 1172197104Sjkim switch (Temp8) 1173197104Sjkim { 1174197104Sjkim case ACPI_IVRS_TYPE_HARDWARE: 1175250838Sjkim 1176197104Sjkim Name = AcpiDmIvrsSubnames[0]; 1177197104Sjkim break; 1178197104Sjkim 1179197104Sjkim case ACPI_IVRS_TYPE_MEMORY1: 1180197104Sjkim case ACPI_IVRS_TYPE_MEMORY2: 1181197104Sjkim case ACPI_IVRS_TYPE_MEMORY3: 1182250838Sjkim 1183197104Sjkim Name = AcpiDmIvrsSubnames[1]; 1184197104Sjkim break; 1185197104Sjkim 1186197104Sjkim default: 1187250838Sjkim 1188197104Sjkim Name = AcpiDmIvrsSubnames[2]; 1189197104Sjkim break; 1190197104Sjkim } 1191197104Sjkim 1192220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, Name); 1193197104Sjkim break; 1194197104Sjkim 1195167802Sjkim case ACPI_DMT_EXIT: 1196250838Sjkim 1197193529Sjkim return (AE_OK); 1198167802Sjkim 1199167802Sjkim default: 1200250838Sjkim 1201167802Sjkim ACPI_ERROR ((AE_INFO, 1202204773Sjkim "**** Invalid table opcode [0x%X] ****\n", Info->Opcode)); 1203193529Sjkim return (AE_SUPPORT); 1204167802Sjkim } 1205167802Sjkim } 1206193529Sjkim 1207193529Sjkim if (TableOffset && !SubtableLength) 1208193529Sjkim { 1209193529Sjkim /* If this table is not the main table, subtable must have valid length */ 1210193529Sjkim 1211193529Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 1212193529Sjkim return (AE_BAD_DATA); 1213193529Sjkim } 1214193529Sjkim 1215193529Sjkim return (AE_OK); 1216167802Sjkim} 1217167802Sjkim 1218167802Sjkim 1219167802Sjkim/******************************************************************************* 1220167802Sjkim * 1221167802Sjkim * FUNCTION: AcpiDmCheckAscii 1222167802Sjkim * 1223167802Sjkim * PARAMETERS: Name - Ascii string 1224167802Sjkim * Count - Number of characters to check 1225167802Sjkim * 1226167802Sjkim * RETURN: None 1227167802Sjkim * 1228167802Sjkim * DESCRIPTION: Ensure that the requested number of characters are printable 1229167802Sjkim * Ascii characters. Sets non-printable and null chars to <space>. 1230167802Sjkim * 1231167802Sjkim ******************************************************************************/ 1232167802Sjkim 1233167802Sjkimstatic void 1234167802SjkimAcpiDmCheckAscii ( 1235167802Sjkim UINT8 *Name, 1236197104Sjkim char *RepairedName, 1237167802Sjkim UINT32 Count) 1238167802Sjkim{ 1239167802Sjkim UINT32 i; 1240167802Sjkim 1241167802Sjkim 1242167802Sjkim for (i = 0; i < Count; i++) 1243167802Sjkim { 1244198237Sjkim RepairedName[i] = (char) Name[i]; 1245197104Sjkim 1246197104Sjkim if (!Name[i]) 1247167802Sjkim { 1248197104Sjkim return; 1249167802Sjkim } 1250197104Sjkim if (!isprint (Name[i])) 1251197104Sjkim { 1252197104Sjkim RepairedName[i] = ' '; 1253197104Sjkim } 1254167802Sjkim } 1255167802Sjkim} 1256