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", 103252279Sjkim "Set Error Type With Address", 104209746Sjkim "Unknown Action" 105209746Sjkim}; 106209746Sjkim 107209746Sjkimstatic const char *AcpiDmEinjInstructions[] = 108209746Sjkim{ 109209746Sjkim "Read Register", 110209746Sjkim "Read Register Value", 111209746Sjkim "Write Register", 112209746Sjkim "Write Register Value", 113209746Sjkim "Noop", 114252279Sjkim "Flush Cacheline", 115209746Sjkim "Unknown Instruction" 116209746Sjkim}; 117209746Sjkim 118209746Sjkimstatic const char *AcpiDmErstActions[] = 119209746Sjkim{ 120209746Sjkim "Begin Write Operation", 121209746Sjkim "Begin Read Operation", 122209746Sjkim "Begin Clear Operation", 123209746Sjkim "End Operation", 124209746Sjkim "Set Record Offset", 125209746Sjkim "Execute Operation", 126209746Sjkim "Check Busy Status", 127209746Sjkim "Get Command Status", 128209746Sjkim "Get Record Identifier", 129209746Sjkim "Set Record Identifier", 130209746Sjkim "Get Record Count", 131209746Sjkim "Begin Dummy Write", 132209746Sjkim "Unused/Unknown Action", 133209746Sjkim "Get Error Address Range", 134209746Sjkim "Get Error Address Length", 135209746Sjkim "Get Error Attributes", 136209746Sjkim "Unknown Action" 137209746Sjkim}; 138209746Sjkim 139209746Sjkimstatic const char *AcpiDmErstInstructions[] = 140209746Sjkim{ 141209746Sjkim "Read Register", 142209746Sjkim "Read Register Value", 143209746Sjkim "Write Register", 144209746Sjkim "Write Register Value", 145209746Sjkim "Noop", 146209746Sjkim "Load Var1", 147209746Sjkim "Load Var2", 148209746Sjkim "Store Var1", 149209746Sjkim "Add", 150209746Sjkim "Subtract", 151209746Sjkim "Add Value", 152209746Sjkim "Subtract Value", 153209746Sjkim "Stall", 154209746Sjkim "Stall While True", 155209746Sjkim "Skip Next If True", 156209746Sjkim "GoTo", 157209746Sjkim "Set Source Address", 158209746Sjkim "Set Destination Address", 159209746Sjkim "Move Data", 160209746Sjkim "Unknown Instruction" 161209746Sjkim}; 162209746Sjkim 163193529Sjkimstatic const char *AcpiDmHestSubnames[] = 164193529Sjkim{ 165197104Sjkim "IA-32 Machine Check Exception", 166197104Sjkim "IA-32 Corrected Machine Check", 167197104Sjkim "IA-32 Non-Maskable Interrupt", 168197104Sjkim "Unknown SubTable Type", /* 3 - Reserved */ 169197104Sjkim "Unknown SubTable Type", /* 4 - Reserved */ 170197104Sjkim "Unknown SubTable Type", /* 5 - Reserved */ 171193529Sjkim "PCI Express Root Port AER", 172193529Sjkim "PCI Express AER (AER Endpoint)", 173193529Sjkim "PCI Express/PCI-X Bridge AER", 174193529Sjkim "Generic Hardware Error Source", 175193529Sjkim "Unknown SubTable Type" /* Reserved */ 176193529Sjkim}; 177193529Sjkim 178193529Sjkimstatic const char *AcpiDmHestNotifySubnames[] = 179193529Sjkim{ 180193529Sjkim "Polled", 181193529Sjkim "External Interrupt", 182193529Sjkim "Local Interrupt", 183193529Sjkim "SCI", 184193529Sjkim "NMI", 185252279Sjkim "CMCI", /* ACPI 5.0 */ 186252279Sjkim "MCE", /* ACPI 5.0 */ 187193529Sjkim "Unknown Notify Type" /* Reserved */ 188193529Sjkim}; 189193529Sjkim 190167802Sjkimstatic const char *AcpiDmMadtSubnames[] = 191167802Sjkim{ 192167802Sjkim "Processor Local APIC", /* ACPI_MADT_TYPE_LOCAL_APIC */ 193167802Sjkim "I/O APIC", /* ACPI_MADT_TYPE_IO_APIC */ 194167802Sjkim "Interrupt Source Override", /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */ 195167802Sjkim "NMI Source", /* ACPI_MADT_TYPE_NMI_SOURCE */ 196167802Sjkim "Local APIC NMI", /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */ 197167802Sjkim "Local APIC Address Override", /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */ 198167802Sjkim "I/O SAPIC", /* ACPI_MADT_TYPE_IO_SAPIC */ 199167802Sjkim "Local SAPIC", /* ACPI_MADT_TYPE_LOCAL_SAPIC */ 200167802Sjkim "Platform Interrupt Sources", /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */ 201193529Sjkim "Processor Local x2APIC", /* ACPI_MADT_TYPE_LOCAL_X2APIC */ 202193529Sjkim "Local x2APIC NMI", /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */ 203228110Sjkim "Generic Interrupt Controller", /* ACPI_MADT_GENERIC_INTERRUPT */ 204228110Sjkim "Generic Interrupt Distributor",/* ACPI_MADT_GENERIC_DISTRIBUTOR */ 205167802Sjkim "Unknown SubTable Type" /* Reserved */ 206167802Sjkim}; 207167802Sjkim 208228110Sjkimstatic const char *AcpiDmPmttSubnames[] = 209228110Sjkim{ 210228110Sjkim "Socket", /* ACPI_PMTT_TYPE_SOCKET */ 211228110Sjkim "Memory Controller", /* ACPI_PMTT_TYPE_CONTROLLER */ 212228110Sjkim "Physical Component (DIMM)", /* ACPI_PMTT_TYPE_DIMM */ 213228110Sjkim "Unknown SubTable Type" /* Reserved */ 214228110Sjkim}; 215228110Sjkim 216219707Sjkimstatic const char *AcpiDmSlicSubnames[] = 217219707Sjkim{ 218219707Sjkim "Public Key Structure", 219219707Sjkim "Windows Marker Structure", 220219707Sjkim "Unknown SubTable Type" /* Reserved */ 221219707Sjkim}; 222219707Sjkim 223167802Sjkimstatic const char *AcpiDmSratSubnames[] = 224167802Sjkim{ 225167802Sjkim "Processor Local APIC/SAPIC Affinity", 226167802Sjkim "Memory Affinity", 227193529Sjkim "Processor Local x2APIC Affinity", 228167802Sjkim "Unknown SubTable Type" /* Reserved */ 229167802Sjkim}; 230167802Sjkim 231197104Sjkimstatic const char *AcpiDmIvrsSubnames[] = 232197104Sjkim{ 233197104Sjkim "Hardware Definition Block", 234197104Sjkim "Memory Definition Block", 235197104Sjkim "Unknown SubTable Type" /* Reserved */ 236197104Sjkim}; 237167802Sjkim 238197104Sjkim 239229989Sjkim#define ACPI_FADT_PM_RESERVED 9 240193529Sjkim 241193529Sjkimstatic const char *AcpiDmFadtProfiles[] = 242193529Sjkim{ 243193529Sjkim "Unspecified", 244193529Sjkim "Desktop", 245193529Sjkim "Mobile", 246193529Sjkim "Workstation", 247193529Sjkim "Enterprise Server", 248193529Sjkim "SOHO Server", 249193529Sjkim "Appliance PC", 250193529Sjkim "Performance Server", 251229989Sjkim "Tablet", 252193529Sjkim "Unknown Profile Type" 253193529Sjkim}; 254193529Sjkim 255216471Sjkim#define ACPI_GAS_WIDTH_RESERVED 5 256216471Sjkim 257216471Sjkimstatic const char *AcpiDmGasAccessWidth[] = 258216471Sjkim{ 259216471Sjkim "Undefined/Legacy", 260216471Sjkim "Byte Access:8", 261216471Sjkim "Word Access:16", 262216471Sjkim "DWord Access:32", 263216471Sjkim "QWord Access:64", 264216471Sjkim "Unknown Width Encoding" 265216471Sjkim}; 266216471Sjkim 267216471Sjkim 268167802Sjkim/******************************************************************************* 269167802Sjkim * 270167802Sjkim * ACPI Table Data, indexed by signature. 271167802Sjkim * 272209746Sjkim * Each entry contains: Signature, Table Info, Handler, DtHandler, 273209746Sjkim * Template, Description 274197104Sjkim * 275209746Sjkim * Simple tables have only a TableInfo structure, complex tables have a 276209746Sjkim * handler. This table must be NULL terminated. RSDP and FACS are 277209746Sjkim * special-cased elsewhere. 278167802Sjkim * 279167802Sjkim ******************************************************************************/ 280167802Sjkim 281209746SjkimACPI_DMTABLE_DATA AcpiDmTableData[] = 282167802Sjkim{ 283209746Sjkim {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf, "Alert Standard Format table"}, 284209746Sjkim {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert, "Boot Error Record Table"}, 285228110Sjkim {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt, NULL, NULL, TemplateBgrt, "Boot Graphics Resource Table"}, 286239340Sjkim {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, NULL, TemplateBoot, "Simple Boot Flag Table"}, 287209746Sjkim {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, DtCompileCpep, TemplateCpep, "Corrected Platform Error Polling table"}, 288245582Sjkim {ACPI_SIG_CSRT, NULL, AcpiDmDumpCsrt, DtCompileCsrt, TemplateCsrt, "Core System Resource Table"}, 289239340Sjkim {ACPI_SIG_DBG2, NULL, AcpiDmDumpDbg2, NULL, NULL, "Debug Port table type 2"}, 290209746Sjkim {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp, NULL, NULL, TemplateDbgp, "Debug Port table"}, 291209746Sjkim {ACPI_SIG_DMAR, NULL, AcpiDmDumpDmar, DtCompileDmar, TemplateDmar, "DMA Remapping table"}, 292209746Sjkim {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt, NULL, NULL, TemplateEcdt, "Embedded Controller Boot Resources Table"}, 293209746Sjkim {ACPI_SIG_EINJ, NULL, AcpiDmDumpEinj, DtCompileEinj, TemplateEinj, "Error Injection table"}, 294209746Sjkim {ACPI_SIG_ERST, NULL, AcpiDmDumpErst, DtCompileErst, TemplateErst, "Error Record Serialization Table"}, 295239340Sjkim {ACPI_SIG_FADT, NULL, AcpiDmDumpFadt, DtCompileFadt, TemplateFadt, "Fixed ACPI Description Table (FADT)"}, 296228110Sjkim {ACPI_SIG_FPDT, NULL, AcpiDmDumpFpdt, DtCompileFpdt, TemplateFpdt, "Firmware Performance Data Table"}, 297228110Sjkim {ACPI_SIG_GTDT, AcpiDmTableInfoGtdt, NULL, NULL, TemplateGtdt, "Generic Timer Description Table"}, 298209746Sjkim {ACPI_SIG_HEST, NULL, AcpiDmDumpHest, DtCompileHest, TemplateHest, "Hardware Error Source Table"}, 299209746Sjkim {ACPI_SIG_HPET, AcpiDmTableInfoHpet, NULL, NULL, TemplateHpet, "High Precision Event Timer table"}, 300209746Sjkim {ACPI_SIG_IVRS, NULL, AcpiDmDumpIvrs, DtCompileIvrs, TemplateIvrs, "I/O Virtualization Reporting Structure"}, 301239340Sjkim {ACPI_SIG_MADT, NULL, AcpiDmDumpMadt, DtCompileMadt, TemplateMadt, "Multiple APIC Description Table (MADT)"}, 302209746Sjkim {ACPI_SIG_MCFG, NULL, AcpiDmDumpMcfg, DtCompileMcfg, TemplateMcfg, "Memory Mapped Configuration table"}, 303209746Sjkim {ACPI_SIG_MCHI, AcpiDmTableInfoMchi, NULL, NULL, TemplateMchi, "Management Controller Host Interface table"}, 304228110Sjkim {ACPI_SIG_MPST, AcpiDmTableInfoMpst, AcpiDmDumpMpst, DtCompileMpst, TemplateMpst, "Memory Power State Table"}, 305209746Sjkim {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct, "Maximum System Characteristics Table"}, 306246849Sjkim {ACPI_SIG_MTMR, NULL, AcpiDmDumpMtmr, DtCompileMtmr, TemplateMtmr, "MID Timer Table"}, 307228110Sjkim {ACPI_SIG_PCCT, NULL, AcpiDmDumpPcct, NULL, NULL, "Platform Communications Channel Table"}, 308228110Sjkim {ACPI_SIG_PMTT, NULL, AcpiDmDumpPmtt, DtCompilePmtt, TemplatePmtt, "Platform Memory Topology Table"}, 309209746Sjkim {ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, DtCompileRsdt, TemplateRsdt, "Root System Description Table"}, 310228110Sjkim {ACPI_SIG_S3PT, NULL, NULL, NULL, TemplateS3pt, "S3 Performance Table"}, 311209746Sjkim {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, NULL, TemplateSbst, "Smart Battery Specification Table"}, 312219707Sjkim {ACPI_SIG_SLIC, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateSlic, "Software Licensing Description Table"}, 313209746Sjkim {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, DtCompileSlit, TemplateSlit, "System Locality Information Table"}, 314209746Sjkim {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, NULL, TemplateSpcr, "Serial Port Console Redirection table"}, 315209746Sjkim {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, NULL, TemplateSpmi, "Server Platform Management Interface table"}, 316209746Sjkim {ACPI_SIG_SRAT, NULL, AcpiDmDumpSrat, DtCompileSrat, TemplateSrat, "System Resource Affinity Table"}, 317209746Sjkim {ACPI_SIG_TCPA, AcpiDmTableInfoTcpa, NULL, NULL, TemplateTcpa, "Trusted Computing Platform Alliance table"}, 318245582Sjkim {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2, NULL, NULL, TemplateTpm2, "Trusted Platform Module hardware interface table"}, 319217365Sjkim {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi, "UEFI Boot Optimization Table"}, 320246849Sjkim {ACPI_SIG_VRTC, AcpiDmTableInfoVrtc, AcpiDmDumpVrtc, DtCompileVrtc, TemplateVrtc, "Virtual Real-Time Clock Table"}, 321209746Sjkim {ACPI_SIG_WAET, AcpiDmTableInfoWaet, NULL, NULL, TemplateWaet, "Windows ACPI Emulated Devices Table"}, 322209746Sjkim {ACPI_SIG_WDAT, NULL, AcpiDmDumpWdat, DtCompileWdat, TemplateWdat, "Watchdog Action Table"}, 323209746Sjkim {ACPI_SIG_WDDT, AcpiDmTableInfoWddt, NULL, NULL, TemplateWddt, "Watchdog Description Table"}, 324209746Sjkim {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt, NULL, NULL, TemplateWdrt, "Watchdog Resource Table"}, 325209746Sjkim {ACPI_SIG_XSDT, NULL, AcpiDmDumpXsdt, DtCompileXsdt, TemplateXsdt, "Extended System Description Table"}, 326209746Sjkim {NULL, NULL, NULL, NULL, NULL, NULL} 327167802Sjkim}; 328167802Sjkim 329167802Sjkim 330167802Sjkim/******************************************************************************* 331167802Sjkim * 332209746Sjkim * FUNCTION: AcpiDmGenerateChecksum 333167802Sjkim * 334209746Sjkim * PARAMETERS: Table - Pointer to table to be checksummed 335209746Sjkim * Length - Length of the table 336209746Sjkim * OriginalChecksum - Value of the checksum field 337167802Sjkim * 338167802Sjkim * RETURN: 8 bit checksum of buffer 339167802Sjkim * 340167802Sjkim * DESCRIPTION: Computes an 8 bit checksum of the table. 341167802Sjkim * 342167802Sjkim ******************************************************************************/ 343167802Sjkim 344167802SjkimUINT8 345209746SjkimAcpiDmGenerateChecksum ( 346209746Sjkim void *Table, 347209746Sjkim UINT32 Length, 348209746Sjkim UINT8 OriginalChecksum) 349167802Sjkim{ 350167802Sjkim UINT8 Checksum; 351167802Sjkim 352167802Sjkim 353167802Sjkim /* Sum the entire table as-is */ 354167802Sjkim 355209746Sjkim Checksum = AcpiTbChecksum ((UINT8 *) Table, Length); 356167802Sjkim 357167802Sjkim /* Subtract off the existing checksum value in the table */ 358167802Sjkim 359209746Sjkim Checksum = (UINT8) (Checksum - OriginalChecksum); 360167802Sjkim 361167802Sjkim /* Compute the final checksum */ 362167802Sjkim 363167802Sjkim Checksum = (UINT8) (0 - Checksum); 364167802Sjkim return (Checksum); 365167802Sjkim} 366167802Sjkim 367167802Sjkim 368167802Sjkim/******************************************************************************* 369167802Sjkim * 370167802Sjkim * FUNCTION: AcpiDmGetTableData 371167802Sjkim * 372167802Sjkim * PARAMETERS: Signature - ACPI signature (4 chars) to match 373167802Sjkim * 374167802Sjkim * RETURN: Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found. 375167802Sjkim * 376167802Sjkim * DESCRIPTION: Find a match in the global table of supported ACPI tables 377167802Sjkim * 378167802Sjkim ******************************************************************************/ 379167802Sjkim 380209746SjkimACPI_DMTABLE_DATA * 381167802SjkimAcpiDmGetTableData ( 382167802Sjkim char *Signature) 383167802Sjkim{ 384167802Sjkim ACPI_DMTABLE_DATA *TableData; 385167802Sjkim 386167802Sjkim 387167802Sjkim for (TableData = AcpiDmTableData; TableData->Signature; TableData++) 388167802Sjkim { 389167802Sjkim if (ACPI_COMPARE_NAME (Signature, TableData->Signature)) 390167802Sjkim { 391167802Sjkim return (TableData); 392167802Sjkim } 393167802Sjkim } 394167802Sjkim 395167802Sjkim return (NULL); 396167802Sjkim} 397167802Sjkim 398167802Sjkim 399167802Sjkim/******************************************************************************* 400167802Sjkim * 401167802Sjkim * FUNCTION: AcpiDmDumpDataTable 402167802Sjkim * 403167802Sjkim * PARAMETERS: Table - An ACPI table 404167802Sjkim * 405167802Sjkim * RETURN: None. 406167802Sjkim * 407167802Sjkim * DESCRIPTION: Format the contents of an ACPI data table (any table other 408167802Sjkim * than an SSDT or DSDT that does not contain executable AML code) 409167802Sjkim * 410167802Sjkim ******************************************************************************/ 411167802Sjkim 412167802Sjkimvoid 413167802SjkimAcpiDmDumpDataTable ( 414167802Sjkim ACPI_TABLE_HEADER *Table) 415167802Sjkim{ 416193529Sjkim ACPI_STATUS Status; 417167802Sjkim ACPI_DMTABLE_DATA *TableData; 418167802Sjkim UINT32 Length; 419167802Sjkim 420167802Sjkim 421167802Sjkim /* Ignore tables that contain AML */ 422167802Sjkim 423167802Sjkim if (AcpiUtIsAmlTable (Table)) 424167802Sjkim { 425241973Sjkim if (Gbl_VerboseTemplates) 426241973Sjkim { 427241973Sjkim /* Dump the raw table data */ 428241973Sjkim 429241973Sjkim Length = Table->Length; 430241973Sjkim 431241973Sjkim AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n", 432241973Sjkim ACPI_RAW_TABLE_DATA_HEADER, Length, Length); 433241973Sjkim AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table), 434241973Sjkim Length, DB_BYTE_DISPLAY, 0); 435241973Sjkim AcpiOsPrintf (" */\n"); 436241973Sjkim } 437167802Sjkim return; 438167802Sjkim } 439167802Sjkim 440167802Sjkim /* 441167802Sjkim * Handle tables that don't use the common ACPI table header structure. 442228110Sjkim * Currently, these are the FACS, RSDP, and S3PT. 443167802Sjkim */ 444167802Sjkim if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS)) 445167802Sjkim { 446167802Sjkim Length = Table->Length; 447167802Sjkim AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs); 448167802Sjkim } 449254745Sjkim else if (ACPI_VALIDATE_RSDP_SIG (Table->Signature)) 450167802Sjkim { 451167802Sjkim Length = AcpiDmDumpRsdp (Table); 452167802Sjkim } 453228110Sjkim else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT)) 454228110Sjkim { 455228110Sjkim Length = AcpiDmDumpS3pt (Table); 456228110Sjkim } 457167802Sjkim else 458167802Sjkim { 459167802Sjkim /* 460167802Sjkim * All other tables must use the common ACPI table header, dump it now 461167802Sjkim */ 462167802Sjkim Length = Table->Length; 463193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader); 464193529Sjkim if (ACPI_FAILURE (Status)) 465193529Sjkim { 466193529Sjkim return; 467193529Sjkim } 468167802Sjkim AcpiOsPrintf ("\n"); 469167802Sjkim 470167802Sjkim /* Match signature and dispatch appropriately */ 471167802Sjkim 472167802Sjkim TableData = AcpiDmGetTableData (Table->Signature); 473167802Sjkim if (!TableData) 474167802Sjkim { 475167802Sjkim if (!ACPI_STRNCMP (Table->Signature, "OEM", 3)) 476167802Sjkim { 477167802Sjkim AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n", 478167802Sjkim Table->Signature); 479167802Sjkim } 480167802Sjkim else 481167802Sjkim { 482167802Sjkim AcpiOsPrintf ("\n**** Unknown ACPI table type [%4.4s]\n\n", 483167802Sjkim Table->Signature); 484246849Sjkim fprintf (stderr, "Unknown ACPI table signature [%4.4s], decoding header only\n", 485246849Sjkim Table->Signature); 486167802Sjkim } 487167802Sjkim } 488167802Sjkim else if (TableData->TableHandler) 489167802Sjkim { 490167802Sjkim /* Complex table, has a handler */ 491167802Sjkim 492167802Sjkim TableData->TableHandler (Table); 493167802Sjkim } 494167802Sjkim else if (TableData->TableInfo) 495167802Sjkim { 496167802Sjkim /* Simple table, just walk the info table */ 497167802Sjkim 498167802Sjkim AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo); 499167802Sjkim } 500167802Sjkim } 501167802Sjkim 502209746Sjkim if (!Gbl_DoTemplates || Gbl_VerboseTemplates) 503209746Sjkim { 504209746Sjkim /* Dump the raw table data */ 505167802Sjkim 506217365Sjkim AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n", 507217365Sjkim ACPI_RAW_TABLE_DATA_HEADER, Length, Length); 508241973Sjkim AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table), 509241973Sjkim Length, DB_BYTE_DISPLAY, 0); 510209746Sjkim } 511167802Sjkim} 512167802Sjkim 513167802Sjkim 514167802Sjkim/******************************************************************************* 515167802Sjkim * 516167802Sjkim * FUNCTION: AcpiDmLineHeader 517167802Sjkim * 518167802Sjkim * PARAMETERS: Offset - Current byte offset, from table start 519167802Sjkim * ByteLength - Length of the field in bytes, 0 for flags 520167802Sjkim * Name - Name of this field 521167802Sjkim * Value - Optional value, displayed on left of ':' 522167802Sjkim * 523167802Sjkim * RETURN: None 524167802Sjkim * 525167802Sjkim * DESCRIPTION: Utility routines for formatting output lines. Displays the 526167802Sjkim * current table offset in hex and decimal, the field length, 527167802Sjkim * and the field name. 528167802Sjkim * 529167802Sjkim ******************************************************************************/ 530167802Sjkim 531167802Sjkimvoid 532167802SjkimAcpiDmLineHeader ( 533167802Sjkim UINT32 Offset, 534167802Sjkim UINT32 ByteLength, 535167802Sjkim char *Name) 536167802Sjkim{ 537167802Sjkim 538219707Sjkim /* Allow a null name for fields that span multiple lines (large buffers) */ 539219707Sjkim 540219707Sjkim if (!Name) 541219707Sjkim { 542219707Sjkim Name = ""; 543219707Sjkim } 544219707Sjkim 545209746Sjkim if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */ 546167802Sjkim { 547209746Sjkim if (ByteLength) 548209746Sjkim { 549219707Sjkim AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name); 550209746Sjkim } 551209746Sjkim else 552209746Sjkim { 553220663Sjkim if (*Name) 554220663Sjkim { 555220663Sjkim AcpiOsPrintf ("%41s : ", Name); 556220663Sjkim } 557220663Sjkim else 558220663Sjkim { 559220663Sjkim AcpiOsPrintf ("%41s ", Name); 560220663Sjkim } 561209746Sjkim } 562167802Sjkim } 563209746Sjkim else /* Normal disassembler or verbose template */ 564167802Sjkim { 565209746Sjkim if (ByteLength) 566209746Sjkim { 567219707Sjkim AcpiOsPrintf ("[%3.3Xh %4.4d% 4d] %28s : ", 568209746Sjkim Offset, Offset, ByteLength, Name); 569209746Sjkim } 570209746Sjkim else 571209746Sjkim { 572220663Sjkim if (*Name) 573220663Sjkim { 574220663Sjkim AcpiOsPrintf ("%44s : ", Name); 575220663Sjkim } 576220663Sjkim else 577220663Sjkim { 578220663Sjkim AcpiOsPrintf ("%44s ", Name); 579220663Sjkim } 580209746Sjkim } 581167802Sjkim } 582167802Sjkim} 583167802Sjkim 584167802Sjkimvoid 585167802SjkimAcpiDmLineHeader2 ( 586167802Sjkim UINT32 Offset, 587167802Sjkim UINT32 ByteLength, 588167802Sjkim char *Name, 589167802Sjkim UINT32 Value) 590167802Sjkim{ 591167802Sjkim 592209746Sjkim if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */ 593167802Sjkim { 594209746Sjkim if (ByteLength) 595209746Sjkim { 596220663Sjkim AcpiOsPrintf ("[%.4d] %30s %3d : ", 597209746Sjkim ByteLength, Name, Value); 598209746Sjkim } 599209746Sjkim else 600209746Sjkim { 601209746Sjkim AcpiOsPrintf ("%36s % 3d : ", 602209746Sjkim Name, Value); 603209746Sjkim } 604167802Sjkim } 605209746Sjkim else /* Normal disassembler or verbose template */ 606167802Sjkim { 607209746Sjkim if (ByteLength) 608209746Sjkim { 609220663Sjkim AcpiOsPrintf ("[%3.3Xh %4.4d %3d] %24s %3d : ", 610209746Sjkim Offset, Offset, ByteLength, Name, Value); 611209746Sjkim } 612209746Sjkim else 613209746Sjkim { 614220663Sjkim AcpiOsPrintf ("[%3.3Xh %4.4d ] %24s %3d : ", 615209746Sjkim Offset, Offset, Name, Value); 616209746Sjkim } 617167802Sjkim } 618167802Sjkim} 619167802Sjkim 620167802Sjkim 621167802Sjkim/******************************************************************************* 622167802Sjkim * 623167802Sjkim * FUNCTION: AcpiDmDumpTable 624167802Sjkim * 625167802Sjkim * PARAMETERS: TableLength - Length of the entire ACPI table 626167802Sjkim * TableOffset - Starting offset within the table for this 627167802Sjkim * sub-descriptor (0 if main table) 628167802Sjkim * Table - The ACPI table 629193529Sjkim * SubtableLength - Length of this sub-descriptor 630167802Sjkim * Info - Info table for this ACPI table 631167802Sjkim * 632167802Sjkim * RETURN: None 633167802Sjkim * 634167802Sjkim * DESCRIPTION: Display ACPI table contents by walking the Info table. 635167802Sjkim * 636209746Sjkim * Note: This function must remain in sync with DtGetFieldLength. 637209746Sjkim * 638167802Sjkim ******************************************************************************/ 639167802Sjkim 640193529SjkimACPI_STATUS 641167802SjkimAcpiDmDumpTable ( 642167802Sjkim UINT32 TableLength, 643167802Sjkim UINT32 TableOffset, 644167802Sjkim void *Table, 645167802Sjkim UINT32 SubtableLength, 646167802Sjkim ACPI_DMTABLE_INFO *Info) 647167802Sjkim{ 648167802Sjkim UINT8 *Target; 649167802Sjkim UINT32 CurrentOffset; 650167802Sjkim UINT32 ByteLength; 651167802Sjkim UINT8 Temp8; 652167802Sjkim UINT16 Temp16; 653167802Sjkim ACPI_DMTABLE_DATA *TableData; 654197104Sjkim const char *Name; 655193529Sjkim BOOLEAN LastOutputBlankLine = FALSE; 656197104Sjkim char RepairedName[8]; 657167802Sjkim 658167802Sjkim 659167802Sjkim if (!Info) 660167802Sjkim { 661167802Sjkim AcpiOsPrintf ("Display not implemented\n"); 662193529Sjkim return (AE_NOT_IMPLEMENTED); 663167802Sjkim } 664167802Sjkim 665167802Sjkim /* Walk entire Info table; Null name terminates */ 666167802Sjkim 667167802Sjkim for (; Info->Name; Info++) 668167802Sjkim { 669167802Sjkim /* 670167802Sjkim * Target points to the field within the ACPI Table. CurrentOffset is 671167802Sjkim * the offset of the field from the start of the main table. 672167802Sjkim */ 673167802Sjkim Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset); 674167802Sjkim CurrentOffset = TableOffset + Info->Offset; 675167802Sjkim 676167802Sjkim /* Check for beyond EOT or beyond subtable end */ 677167802Sjkim 678167802Sjkim if ((CurrentOffset >= TableLength) || 679167802Sjkim (SubtableLength && (Info->Offset >= SubtableLength))) 680167802Sjkim { 681193529Sjkim AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); 682193529Sjkim return (AE_BAD_DATA); 683167802Sjkim } 684167802Sjkim 685167802Sjkim /* Generate the byte length for this field */ 686167802Sjkim 687167802Sjkim switch (Info->Opcode) 688167802Sjkim { 689167802Sjkim case ACPI_DMT_UINT8: 690167802Sjkim case ACPI_DMT_CHKSUM: 691167802Sjkim case ACPI_DMT_SPACEID: 692216471Sjkim case ACPI_DMT_ACCWIDTH: 693197104Sjkim case ACPI_DMT_IVRS: 694167802Sjkim case ACPI_DMT_MADT: 695228110Sjkim case ACPI_DMT_PMTT: 696167802Sjkim case ACPI_DMT_SRAT: 697193529Sjkim case ACPI_DMT_ASF: 698193529Sjkim case ACPI_DMT_HESTNTYP: 699193529Sjkim case ACPI_DMT_FADTPM: 700209746Sjkim case ACPI_DMT_EINJACT: 701209746Sjkim case ACPI_DMT_EINJINST: 702209746Sjkim case ACPI_DMT_ERSTACT: 703209746Sjkim case ACPI_DMT_ERSTINST: 704250838Sjkim 705167802Sjkim ByteLength = 1; 706167802Sjkim break; 707250838Sjkim 708167802Sjkim case ACPI_DMT_UINT16: 709167802Sjkim case ACPI_DMT_DMAR: 710193529Sjkim case ACPI_DMT_HEST: 711250838Sjkim 712167802Sjkim ByteLength = 2; 713167802Sjkim break; 714250838Sjkim 715167802Sjkim case ACPI_DMT_UINT24: 716250838Sjkim 717167802Sjkim ByteLength = 3; 718167802Sjkim break; 719250838Sjkim 720167802Sjkim case ACPI_DMT_UINT32: 721167802Sjkim case ACPI_DMT_NAME4: 722167802Sjkim case ACPI_DMT_SIG: 723219707Sjkim case ACPI_DMT_SLIC: 724250838Sjkim 725167802Sjkim ByteLength = 4; 726167802Sjkim break; 727250838Sjkim 728228110Sjkim case ACPI_DMT_UINT40: 729250838Sjkim 730228110Sjkim ByteLength = 5; 731228110Sjkim break; 732250838Sjkim 733228110Sjkim case ACPI_DMT_UINT48: 734167802Sjkim case ACPI_DMT_NAME6: 735250838Sjkim 736167802Sjkim ByteLength = 6; 737167802Sjkim break; 738250838Sjkim 739167802Sjkim case ACPI_DMT_UINT56: 740218590Sjkim case ACPI_DMT_BUF7: 741250838Sjkim 742167802Sjkim ByteLength = 7; 743167802Sjkim break; 744250838Sjkim 745167802Sjkim case ACPI_DMT_UINT64: 746167802Sjkim case ACPI_DMT_NAME8: 747250838Sjkim 748167802Sjkim ByteLength = 8; 749167802Sjkim break; 750250838Sjkim 751252279Sjkim case ACPI_DMT_BUF10: 752252279Sjkim 753252279Sjkim ByteLength = 10; 754252279Sjkim break; 755252279Sjkim 756197104Sjkim case ACPI_DMT_BUF16: 757217365Sjkim case ACPI_DMT_UUID: 758250838Sjkim 759197104Sjkim ByteLength = 16; 760197104Sjkim break; 761250838Sjkim 762219707Sjkim case ACPI_DMT_BUF128: 763250838Sjkim 764219707Sjkim ByteLength = 128; 765219707Sjkim break; 766250838Sjkim 767167802Sjkim case ACPI_DMT_STRING: 768250838Sjkim 769167802Sjkim ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1; 770167802Sjkim break; 771250838Sjkim 772167802Sjkim case ACPI_DMT_GAS: 773250838Sjkim 774193529Sjkim if (!LastOutputBlankLine) 775193529Sjkim { 776193529Sjkim AcpiOsPrintf ("\n"); 777193529Sjkim LastOutputBlankLine = TRUE; 778193529Sjkim } 779167802Sjkim ByteLength = sizeof (ACPI_GENERIC_ADDRESS); 780167802Sjkim break; 781250838Sjkim 782193529Sjkim case ACPI_DMT_HESTNTFY: 783250838Sjkim 784193529Sjkim if (!LastOutputBlankLine) 785193529Sjkim { 786193529Sjkim AcpiOsPrintf ("\n"); 787193529Sjkim LastOutputBlankLine = TRUE; 788193529Sjkim } 789193529Sjkim ByteLength = sizeof (ACPI_HEST_NOTIFY); 790193529Sjkim break; 791250838Sjkim 792167802Sjkim default: 793250838Sjkim 794167802Sjkim ByteLength = 0; 795167802Sjkim break; 796167802Sjkim } 797167802Sjkim 798193529Sjkim if (CurrentOffset + ByteLength > TableLength) 799193529Sjkim { 800193529Sjkim AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); 801193529Sjkim return (AE_BAD_DATA); 802193529Sjkim } 803193529Sjkim 804228110Sjkim if (Info->Opcode == ACPI_DMT_EXTRA_TEXT) 805228110Sjkim { 806228110Sjkim AcpiOsPrintf ("%s", Info->Name); 807228110Sjkim continue; 808228110Sjkim } 809228110Sjkim 810167802Sjkim /* Start a new line and decode the opcode */ 811167802Sjkim 812167802Sjkim AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name); 813167802Sjkim 814167802Sjkim switch (Info->Opcode) 815167802Sjkim { 816167802Sjkim /* Single-bit Flag fields. Note: Opcode is the bit position */ 817167802Sjkim 818167802Sjkim case ACPI_DMT_FLAG0: 819167802Sjkim case ACPI_DMT_FLAG1: 820167802Sjkim case ACPI_DMT_FLAG2: 821167802Sjkim case ACPI_DMT_FLAG3: 822167802Sjkim case ACPI_DMT_FLAG4: 823167802Sjkim case ACPI_DMT_FLAG5: 824167802Sjkim case ACPI_DMT_FLAG6: 825167802Sjkim case ACPI_DMT_FLAG7: 826167802Sjkim 827167802Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01); 828167802Sjkim break; 829167802Sjkim 830167802Sjkim /* 2-bit Flag fields */ 831167802Sjkim 832167802Sjkim case ACPI_DMT_FLAGS0: 833167802Sjkim 834167802Sjkim AcpiOsPrintf ("%1.1X\n", *Target & 0x03); 835167802Sjkim break; 836167802Sjkim 837228110Sjkim case ACPI_DMT_FLAGS1: 838228110Sjkim 839228110Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03); 840228110Sjkim break; 841228110Sjkim 842167802Sjkim case ACPI_DMT_FLAGS2: 843167802Sjkim 844167802Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03); 845167802Sjkim break; 846167802Sjkim 847228110Sjkim case ACPI_DMT_FLAGS4: 848167802Sjkim 849228110Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03); 850167802Sjkim break; 851167802Sjkim 852228110Sjkim /* Integer Data Types */ 853228110Sjkim 854228110Sjkim case ACPI_DMT_UINT8: 855167802Sjkim case ACPI_DMT_UINT16: 856167802Sjkim case ACPI_DMT_UINT24: 857167802Sjkim case ACPI_DMT_UINT32: 858228110Sjkim case ACPI_DMT_UINT40: 859228110Sjkim case ACPI_DMT_UINT48: 860167802Sjkim case ACPI_DMT_UINT56: 861228110Sjkim case ACPI_DMT_UINT64: 862228110Sjkim /* 863228110Sjkim * Dump bytes - high byte first, low byte last. 864228110Sjkim * Note: All ACPI tables are little-endian. 865228110Sjkim */ 866228110Sjkim for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--) 867193529Sjkim { 868228110Sjkim AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]); 869193529Sjkim } 870193529Sjkim AcpiOsPrintf ("\n"); 871167802Sjkim break; 872167802Sjkim 873218590Sjkim case ACPI_DMT_BUF7: 874252279Sjkim case ACPI_DMT_BUF10: 875197104Sjkim case ACPI_DMT_BUF16: 876219707Sjkim case ACPI_DMT_BUF128: 877218590Sjkim /* 878218590Sjkim * Buffer: Size depends on the opcode and was set above. 879218590Sjkim * Each hex byte is separated with a space. 880220663Sjkim * Multiple lines are separated by line continuation char. 881218590Sjkim */ 882219707Sjkim for (Temp16 = 0; Temp16 < ByteLength; Temp16++) 883197104Sjkim { 884219707Sjkim AcpiOsPrintf ("%2.2X", Target[Temp16]); 885219707Sjkim if ((UINT32) (Temp16 + 1) < ByteLength) 886209746Sjkim { 887219707Sjkim if ((Temp16 > 0) && (!((Temp16+1) % 16))) 888219707Sjkim { 889220663Sjkim AcpiOsPrintf (" \\\n"); /* Line continuation */ 890219707Sjkim AcpiDmLineHeader (0, 0, NULL); 891219707Sjkim } 892219707Sjkim else 893219707Sjkim { 894219707Sjkim AcpiOsPrintf (" "); 895219707Sjkim } 896209746Sjkim } 897197104Sjkim } 898197104Sjkim AcpiOsPrintf ("\n"); 899197104Sjkim break; 900197104Sjkim 901217365Sjkim case ACPI_DMT_UUID: 902217365Sjkim 903217365Sjkim /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */ 904217365Sjkim 905217365Sjkim (void) AuConvertUuidToString ((char *) Target, MsgBuffer); 906217365Sjkim 907217365Sjkim AcpiOsPrintf ("%s\n", MsgBuffer); 908217365Sjkim break; 909217365Sjkim 910167802Sjkim case ACPI_DMT_STRING: 911167802Sjkim 912197104Sjkim AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target)); 913167802Sjkim break; 914167802Sjkim 915167802Sjkim /* Fixed length ASCII name fields */ 916167802Sjkim 917167802Sjkim case ACPI_DMT_SIG: 918167802Sjkim 919197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 4); 920197104Sjkim AcpiOsPrintf ("\"%.4s\" ", RepairedName); 921167802Sjkim TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target)); 922167802Sjkim if (TableData) 923167802Sjkim { 924220663Sjkim AcpiOsPrintf (STRING_FORMAT, TableData->Name); 925167802Sjkim } 926220663Sjkim else 927220663Sjkim { 928220663Sjkim AcpiOsPrintf ("\n"); 929220663Sjkim } 930167802Sjkim break; 931167802Sjkim 932167802Sjkim case ACPI_DMT_NAME4: 933167802Sjkim 934197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 4); 935197104Sjkim AcpiOsPrintf ("\"%.4s\"\n", RepairedName); 936167802Sjkim break; 937167802Sjkim 938167802Sjkim case ACPI_DMT_NAME6: 939167802Sjkim 940197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 6); 941197104Sjkim AcpiOsPrintf ("\"%.6s\"\n", RepairedName); 942167802Sjkim break; 943167802Sjkim 944167802Sjkim case ACPI_DMT_NAME8: 945167802Sjkim 946197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 8); 947197104Sjkim AcpiOsPrintf ("\"%.8s\"\n", RepairedName); 948167802Sjkim break; 949167802Sjkim 950167802Sjkim /* Special Data Types */ 951167802Sjkim 952167802Sjkim case ACPI_DMT_CHKSUM: 953167802Sjkim 954167802Sjkim /* Checksum, display and validate */ 955167802Sjkim 956167802Sjkim AcpiOsPrintf ("%2.2X", *Target); 957209746Sjkim Temp8 = AcpiDmGenerateChecksum (Table, 958209746Sjkim ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, 959209746Sjkim ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum); 960167802Sjkim if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum) 961167802Sjkim { 962167802Sjkim AcpiOsPrintf ( 963167802Sjkim " /* Incorrect checksum, should be %2.2X */", Temp8); 964167802Sjkim } 965167802Sjkim AcpiOsPrintf ("\n"); 966167802Sjkim break; 967167802Sjkim 968167802Sjkim case ACPI_DMT_SPACEID: 969167802Sjkim 970167802Sjkim /* Address Space ID */ 971167802Sjkim 972220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target)); 973167802Sjkim break; 974167802Sjkim 975216471Sjkim case ACPI_DMT_ACCWIDTH: 976216471Sjkim 977216471Sjkim /* Encoded Access Width */ 978216471Sjkim 979216471Sjkim Temp8 = *Target; 980216471Sjkim if (Temp8 > ACPI_GAS_WIDTH_RESERVED) 981216471Sjkim { 982216471Sjkim Temp8 = ACPI_GAS_WIDTH_RESERVED; 983216471Sjkim } 984216471Sjkim 985220663Sjkim AcpiOsPrintf (UINT8_FORMAT, Temp8, AcpiDmGasAccessWidth[Temp8]); 986216471Sjkim break; 987216471Sjkim 988167802Sjkim case ACPI_DMT_GAS: 989167802Sjkim 990167802Sjkim /* Generic Address Structure */ 991167802Sjkim 992220663Sjkim AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure"); 993197104Sjkim AcpiDmDumpTable (TableLength, CurrentOffset, Target, 994197104Sjkim sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas); 995193529Sjkim AcpiOsPrintf ("\n"); 996193529Sjkim LastOutputBlankLine = TRUE; 997167802Sjkim break; 998167802Sjkim 999193529Sjkim case ACPI_DMT_ASF: 1000193529Sjkim 1001193529Sjkim /* ASF subtable types */ 1002193529Sjkim 1003193529Sjkim Temp16 = (UINT16) ((*Target) & 0x7F); /* Top bit can be zero or one */ 1004193529Sjkim if (Temp16 > ACPI_ASF_TYPE_RESERVED) 1005193529Sjkim { 1006193529Sjkim Temp16 = ACPI_ASF_TYPE_RESERVED; 1007193529Sjkim } 1008193529Sjkim 1009220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]); 1010193529Sjkim break; 1011193529Sjkim 1012167802Sjkim case ACPI_DMT_DMAR: 1013167802Sjkim 1014167802Sjkim /* DMAR subtable types */ 1015167802Sjkim 1016193529Sjkim Temp16 = ACPI_GET16 (Target); 1017167802Sjkim if (Temp16 > ACPI_DMAR_TYPE_RESERVED) 1018167802Sjkim { 1019167802Sjkim Temp16 = ACPI_DMAR_TYPE_RESERVED; 1020167802Sjkim } 1021167802Sjkim 1022220663Sjkim AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]); 1023167802Sjkim break; 1024167802Sjkim 1025209746Sjkim case ACPI_DMT_EINJACT: 1026209746Sjkim 1027209746Sjkim /* EINJ Action types */ 1028209746Sjkim 1029209746Sjkim Temp8 = *Target; 1030209746Sjkim if (Temp8 > ACPI_EINJ_ACTION_RESERVED) 1031209746Sjkim { 1032209746Sjkim Temp8 = ACPI_EINJ_ACTION_RESERVED; 1033209746Sjkim } 1034209746Sjkim 1035220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjActions[Temp8]); 1036209746Sjkim break; 1037209746Sjkim 1038209746Sjkim case ACPI_DMT_EINJINST: 1039209746Sjkim 1040209746Sjkim /* EINJ Instruction types */ 1041209746Sjkim 1042209746Sjkim Temp8 = *Target; 1043209746Sjkim if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED) 1044209746Sjkim { 1045209746Sjkim Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED; 1046209746Sjkim } 1047209746Sjkim 1048220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjInstructions[Temp8]); 1049209746Sjkim break; 1050209746Sjkim 1051209746Sjkim case ACPI_DMT_ERSTACT: 1052209746Sjkim 1053209746Sjkim /* ERST Action types */ 1054209746Sjkim 1055209746Sjkim Temp8 = *Target; 1056209746Sjkim if (Temp8 > ACPI_ERST_ACTION_RESERVED) 1057209746Sjkim { 1058209746Sjkim Temp8 = ACPI_ERST_ACTION_RESERVED; 1059209746Sjkim } 1060209746Sjkim 1061220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstActions[Temp8]); 1062209746Sjkim break; 1063209746Sjkim 1064209746Sjkim case ACPI_DMT_ERSTINST: 1065209746Sjkim 1066209746Sjkim /* ERST Instruction types */ 1067209746Sjkim 1068209746Sjkim Temp8 = *Target; 1069209746Sjkim if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED) 1070209746Sjkim { 1071209746Sjkim Temp8 = ACPI_ERST_INSTRUCTION_RESERVED; 1072209746Sjkim } 1073209746Sjkim 1074220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstInstructions[Temp8]); 1075209746Sjkim break; 1076209746Sjkim 1077193529Sjkim case ACPI_DMT_HEST: 1078193529Sjkim 1079193529Sjkim /* HEST subtable types */ 1080193529Sjkim 1081193529Sjkim Temp16 = ACPI_GET16 (Target); 1082193529Sjkim if (Temp16 > ACPI_HEST_TYPE_RESERVED) 1083193529Sjkim { 1084193529Sjkim Temp16 = ACPI_HEST_TYPE_RESERVED; 1085193529Sjkim } 1086193529Sjkim 1087220663Sjkim AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]); 1088193529Sjkim break; 1089193529Sjkim 1090193529Sjkim case ACPI_DMT_HESTNTFY: 1091193529Sjkim 1092220663Sjkim AcpiOsPrintf (STRING_FORMAT, "Hardware Error Notification Structure"); 1093197104Sjkim AcpiDmDumpTable (TableLength, CurrentOffset, Target, 1094197104Sjkim sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify); 1095193529Sjkim AcpiOsPrintf ("\n"); 1096193529Sjkim LastOutputBlankLine = TRUE; 1097193529Sjkim break; 1098193529Sjkim 1099193529Sjkim case ACPI_DMT_HESTNTYP: 1100193529Sjkim 1101193529Sjkim /* HEST Notify types */ 1102193529Sjkim 1103193529Sjkim Temp8 = *Target; 1104193529Sjkim if (Temp8 > ACPI_HEST_NOTIFY_RESERVED) 1105193529Sjkim { 1106193529Sjkim Temp8 = ACPI_HEST_NOTIFY_RESERVED; 1107193529Sjkim } 1108193529Sjkim 1109220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmHestNotifySubnames[Temp8]); 1110193529Sjkim break; 1111193529Sjkim 1112167802Sjkim case ACPI_DMT_MADT: 1113167802Sjkim 1114167802Sjkim /* MADT subtable types */ 1115167802Sjkim 1116167802Sjkim Temp8 = *Target; 1117167802Sjkim if (Temp8 > ACPI_MADT_TYPE_RESERVED) 1118167802Sjkim { 1119167802Sjkim Temp8 = ACPI_MADT_TYPE_RESERVED; 1120167802Sjkim } 1121167802Sjkim 1122220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmMadtSubnames[Temp8]); 1123167802Sjkim break; 1124167802Sjkim 1125228110Sjkim case ACPI_DMT_PMTT: 1126228110Sjkim 1127228110Sjkim /* PMTT subtable types */ 1128228110Sjkim 1129228110Sjkim Temp8 = *Target; 1130228110Sjkim if (Temp8 > ACPI_PMTT_TYPE_RESERVED) 1131228110Sjkim { 1132228110Sjkim Temp8 = ACPI_PMTT_TYPE_RESERVED; 1133228110Sjkim } 1134228110Sjkim 1135228110Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmPmttSubnames[Temp8]); 1136228110Sjkim break; 1137228110Sjkim 1138219707Sjkim case ACPI_DMT_SLIC: 1139219707Sjkim 1140219707Sjkim /* SLIC subtable types */ 1141219707Sjkim 1142219707Sjkim Temp8 = *Target; 1143219707Sjkim if (Temp8 > ACPI_SLIC_TYPE_RESERVED) 1144219707Sjkim { 1145219707Sjkim Temp8 = ACPI_SLIC_TYPE_RESERVED; 1146219707Sjkim } 1147219707Sjkim 1148220663Sjkim AcpiOsPrintf (UINT32_FORMAT, *Target, AcpiDmSlicSubnames[Temp8]); 1149219707Sjkim break; 1150219707Sjkim 1151167802Sjkim case ACPI_DMT_SRAT: 1152167802Sjkim 1153167802Sjkim /* SRAT subtable types */ 1154167802Sjkim 1155167802Sjkim Temp8 = *Target; 1156167802Sjkim if (Temp8 > ACPI_SRAT_TYPE_RESERVED) 1157167802Sjkim { 1158167802Sjkim Temp8 = ACPI_SRAT_TYPE_RESERVED; 1159167802Sjkim } 1160167802Sjkim 1161220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmSratSubnames[Temp8]); 1162167802Sjkim break; 1163167802Sjkim 1164193529Sjkim case ACPI_DMT_FADTPM: 1165193529Sjkim 1166193529Sjkim /* FADT Preferred PM Profile names */ 1167193529Sjkim 1168193529Sjkim Temp8 = *Target; 1169193529Sjkim if (Temp8 > ACPI_FADT_PM_RESERVED) 1170193529Sjkim { 1171193529Sjkim Temp8 = ACPI_FADT_PM_RESERVED; 1172193529Sjkim } 1173193529Sjkim 1174220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmFadtProfiles[Temp8]); 1175193529Sjkim break; 1176193529Sjkim 1177197104Sjkim case ACPI_DMT_IVRS: 1178197104Sjkim 1179197104Sjkim /* IVRS subtable types */ 1180197104Sjkim 1181197104Sjkim Temp8 = *Target; 1182197104Sjkim switch (Temp8) 1183197104Sjkim { 1184197104Sjkim case ACPI_IVRS_TYPE_HARDWARE: 1185250838Sjkim 1186197104Sjkim Name = AcpiDmIvrsSubnames[0]; 1187197104Sjkim break; 1188197104Sjkim 1189197104Sjkim case ACPI_IVRS_TYPE_MEMORY1: 1190197104Sjkim case ACPI_IVRS_TYPE_MEMORY2: 1191197104Sjkim case ACPI_IVRS_TYPE_MEMORY3: 1192250838Sjkim 1193197104Sjkim Name = AcpiDmIvrsSubnames[1]; 1194197104Sjkim break; 1195197104Sjkim 1196197104Sjkim default: 1197250838Sjkim 1198197104Sjkim Name = AcpiDmIvrsSubnames[2]; 1199197104Sjkim break; 1200197104Sjkim } 1201197104Sjkim 1202220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, Name); 1203197104Sjkim break; 1204197104Sjkim 1205167802Sjkim case ACPI_DMT_EXIT: 1206250838Sjkim 1207193529Sjkim return (AE_OK); 1208167802Sjkim 1209167802Sjkim default: 1210250838Sjkim 1211167802Sjkim ACPI_ERROR ((AE_INFO, 1212204773Sjkim "**** Invalid table opcode [0x%X] ****\n", Info->Opcode)); 1213193529Sjkim return (AE_SUPPORT); 1214167802Sjkim } 1215167802Sjkim } 1216193529Sjkim 1217193529Sjkim if (TableOffset && !SubtableLength) 1218193529Sjkim { 1219193529Sjkim /* If this table is not the main table, subtable must have valid length */ 1220193529Sjkim 1221193529Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 1222193529Sjkim return (AE_BAD_DATA); 1223193529Sjkim } 1224193529Sjkim 1225193529Sjkim return (AE_OK); 1226167802Sjkim} 1227167802Sjkim 1228167802Sjkim 1229167802Sjkim/******************************************************************************* 1230167802Sjkim * 1231167802Sjkim * FUNCTION: AcpiDmCheckAscii 1232167802Sjkim * 1233167802Sjkim * PARAMETERS: Name - Ascii string 1234167802Sjkim * Count - Number of characters to check 1235167802Sjkim * 1236167802Sjkim * RETURN: None 1237167802Sjkim * 1238167802Sjkim * DESCRIPTION: Ensure that the requested number of characters are printable 1239167802Sjkim * Ascii characters. Sets non-printable and null chars to <space>. 1240167802Sjkim * 1241167802Sjkim ******************************************************************************/ 1242167802Sjkim 1243167802Sjkimstatic void 1244167802SjkimAcpiDmCheckAscii ( 1245167802Sjkim UINT8 *Name, 1246197104Sjkim char *RepairedName, 1247167802Sjkim UINT32 Count) 1248167802Sjkim{ 1249167802Sjkim UINT32 i; 1250167802Sjkim 1251167802Sjkim 1252167802Sjkim for (i = 0; i < Count; i++) 1253167802Sjkim { 1254198237Sjkim RepairedName[i] = (char) Name[i]; 1255197104Sjkim 1256197104Sjkim if (!Name[i]) 1257167802Sjkim { 1258197104Sjkim return; 1259167802Sjkim } 1260197104Sjkim if (!isprint (Name[i])) 1261197104Sjkim { 1262197104Sjkim RepairedName[i] = ' '; 1263197104Sjkim } 1264167802Sjkim } 1265167802Sjkim} 1266