1167802Sjkim/****************************************************************************** 2167802Sjkim * 3167802Sjkim * Module Name: dmtable - Support for ACPI tables that contain no AML code 4167802Sjkim * 5167802Sjkim *****************************************************************************/ 6167802Sjkim 7217365Sjkim/* 8217365Sjkim * Copyright (C) 2000 - 2011, 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 */ 199167802Sjkim "Unknown SubTable Type" /* Reserved */ 200167802Sjkim}; 201167802Sjkim 202219707Sjkimstatic const char *AcpiDmSlicSubnames[] = 203219707Sjkim{ 204219707Sjkim "Public Key Structure", 205219707Sjkim "Windows Marker Structure", 206219707Sjkim "Unknown SubTable Type" /* Reserved */ 207219707Sjkim}; 208219707Sjkim 209167802Sjkimstatic const char *AcpiDmSratSubnames[] = 210167802Sjkim{ 211167802Sjkim "Processor Local APIC/SAPIC Affinity", 212167802Sjkim "Memory Affinity", 213193529Sjkim "Processor Local x2APIC Affinity", 214167802Sjkim "Unknown SubTable Type" /* Reserved */ 215167802Sjkim}; 216167802Sjkim 217197104Sjkimstatic const char *AcpiDmIvrsSubnames[] = 218197104Sjkim{ 219197104Sjkim "Hardware Definition Block", 220197104Sjkim "Memory Definition Block", 221197104Sjkim "Unknown SubTable Type" /* Reserved */ 222197104Sjkim}; 223167802Sjkim 224197104Sjkim 225193529Sjkim#define ACPI_FADT_PM_RESERVED 8 226193529Sjkim 227193529Sjkimstatic const char *AcpiDmFadtProfiles[] = 228193529Sjkim{ 229193529Sjkim "Unspecified", 230193529Sjkim "Desktop", 231193529Sjkim "Mobile", 232193529Sjkim "Workstation", 233193529Sjkim "Enterprise Server", 234193529Sjkim "SOHO Server", 235193529Sjkim "Appliance PC", 236193529Sjkim "Performance Server", 237193529Sjkim "Unknown Profile Type" 238193529Sjkim}; 239193529Sjkim 240216471Sjkim#define ACPI_GAS_WIDTH_RESERVED 5 241216471Sjkim 242216471Sjkimstatic const char *AcpiDmGasAccessWidth[] = 243216471Sjkim{ 244216471Sjkim "Undefined/Legacy", 245216471Sjkim "Byte Access:8", 246216471Sjkim "Word Access:16", 247216471Sjkim "DWord Access:32", 248216471Sjkim "QWord Access:64", 249216471Sjkim "Unknown Width Encoding" 250216471Sjkim}; 251216471Sjkim 252216471Sjkim 253167802Sjkim/******************************************************************************* 254167802Sjkim * 255167802Sjkim * ACPI Table Data, indexed by signature. 256167802Sjkim * 257209746Sjkim * Each entry contains: Signature, Table Info, Handler, DtHandler, 258209746Sjkim * Template, Description 259197104Sjkim * 260209746Sjkim * Simple tables have only a TableInfo structure, complex tables have a 261209746Sjkim * handler. This table must be NULL terminated. RSDP and FACS are 262209746Sjkim * special-cased elsewhere. 263167802Sjkim * 264167802Sjkim ******************************************************************************/ 265167802Sjkim 266209746SjkimACPI_DMTABLE_DATA AcpiDmTableData[] = 267167802Sjkim{ 268209746Sjkim {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf, "Alert Standard Format table"}, 269209746Sjkim {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, NULL, TemplateBoot, "Simple Boot Flag Table"}, 270209746Sjkim {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert, "Boot Error Record Table"}, 271209746Sjkim {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, DtCompileCpep, TemplateCpep, "Corrected Platform Error Polling table"}, 272209746Sjkim {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp, NULL, NULL, TemplateDbgp, "Debug Port table"}, 273209746Sjkim {ACPI_SIG_DMAR, NULL, AcpiDmDumpDmar, DtCompileDmar, TemplateDmar, "DMA Remapping table"}, 274209746Sjkim {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt, NULL, NULL, TemplateEcdt, "Embedded Controller Boot Resources Table"}, 275209746Sjkim {ACPI_SIG_EINJ, NULL, AcpiDmDumpEinj, DtCompileEinj, TemplateEinj, "Error Injection table"}, 276209746Sjkim {ACPI_SIG_ERST, NULL, AcpiDmDumpErst, DtCompileErst, TemplateErst, "Error Record Serialization Table"}, 277209746Sjkim {ACPI_SIG_FADT, NULL, AcpiDmDumpFadt, DtCompileFadt, TemplateFadt, "Fixed ACPI Description Table"}, 278209746Sjkim {ACPI_SIG_HEST, NULL, AcpiDmDumpHest, DtCompileHest, TemplateHest, "Hardware Error Source Table"}, 279209746Sjkim {ACPI_SIG_HPET, AcpiDmTableInfoHpet, NULL, NULL, TemplateHpet, "High Precision Event Timer table"}, 280209746Sjkim {ACPI_SIG_IVRS, NULL, AcpiDmDumpIvrs, DtCompileIvrs, TemplateIvrs, "I/O Virtualization Reporting Structure"}, 281209746Sjkim {ACPI_SIG_MADT, NULL, AcpiDmDumpMadt, DtCompileMadt, TemplateMadt, "Multiple APIC Description Table"}, 282209746Sjkim {ACPI_SIG_MCFG, NULL, AcpiDmDumpMcfg, DtCompileMcfg, TemplateMcfg, "Memory Mapped Configuration table"}, 283209746Sjkim {ACPI_SIG_MCHI, AcpiDmTableInfoMchi, NULL, NULL, TemplateMchi, "Management Controller Host Interface table"}, 284209746Sjkim {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct, "Maximum System Characteristics Table"}, 285209746Sjkim {ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, DtCompileRsdt, TemplateRsdt, "Root System Description Table"}, 286209746Sjkim {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, NULL, TemplateSbst, "Smart Battery Specification Table"}, 287219707Sjkim {ACPI_SIG_SLIC, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateSlic, "Software Licensing Description Table"}, 288209746Sjkim {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, DtCompileSlit, TemplateSlit, "System Locality Information Table"}, 289209746Sjkim {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, NULL, TemplateSpcr, "Serial Port Console Redirection table"}, 290209746Sjkim {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, NULL, TemplateSpmi, "Server Platform Management Interface table"}, 291209746Sjkim {ACPI_SIG_SRAT, NULL, AcpiDmDumpSrat, DtCompileSrat, TemplateSrat, "System Resource Affinity Table"}, 292209746Sjkim {ACPI_SIG_TCPA, AcpiDmTableInfoTcpa, NULL, NULL, TemplateTcpa, "Trusted Computing Platform Alliance table"}, 293217365Sjkim {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi, "UEFI Boot Optimization Table"}, 294209746Sjkim {ACPI_SIG_WAET, AcpiDmTableInfoWaet, NULL, NULL, TemplateWaet, "Windows ACPI Emulated Devices Table"}, 295209746Sjkim {ACPI_SIG_WDAT, NULL, AcpiDmDumpWdat, DtCompileWdat, TemplateWdat, "Watchdog Action Table"}, 296209746Sjkim {ACPI_SIG_WDDT, AcpiDmTableInfoWddt, NULL, NULL, TemplateWddt, "Watchdog Description Table"}, 297209746Sjkim {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt, NULL, NULL, TemplateWdrt, "Watchdog Resource Table"}, 298209746Sjkim {ACPI_SIG_XSDT, NULL, AcpiDmDumpXsdt, DtCompileXsdt, TemplateXsdt, "Extended System Description Table"}, 299209746Sjkim {NULL, NULL, NULL, NULL, NULL, NULL} 300167802Sjkim}; 301167802Sjkim 302167802Sjkim 303167802Sjkim/******************************************************************************* 304167802Sjkim * 305209746Sjkim * FUNCTION: AcpiDmGenerateChecksum 306167802Sjkim * 307209746Sjkim * PARAMETERS: Table - Pointer to table to be checksummed 308209746Sjkim * Length - Length of the table 309209746Sjkim * OriginalChecksum - Value of the checksum field 310167802Sjkim * 311167802Sjkim * RETURN: 8 bit checksum of buffer 312167802Sjkim * 313167802Sjkim * DESCRIPTION: Computes an 8 bit checksum of the table. 314167802Sjkim * 315167802Sjkim ******************************************************************************/ 316167802Sjkim 317167802SjkimUINT8 318209746SjkimAcpiDmGenerateChecksum ( 319209746Sjkim void *Table, 320209746Sjkim UINT32 Length, 321209746Sjkim UINT8 OriginalChecksum) 322167802Sjkim{ 323167802Sjkim UINT8 Checksum; 324167802Sjkim 325167802Sjkim 326167802Sjkim /* Sum the entire table as-is */ 327167802Sjkim 328209746Sjkim Checksum = AcpiTbChecksum ((UINT8 *) Table, Length); 329167802Sjkim 330167802Sjkim /* Subtract off the existing checksum value in the table */ 331167802Sjkim 332209746Sjkim Checksum = (UINT8) (Checksum - OriginalChecksum); 333167802Sjkim 334167802Sjkim /* Compute the final checksum */ 335167802Sjkim 336167802Sjkim Checksum = (UINT8) (0 - Checksum); 337167802Sjkim return (Checksum); 338167802Sjkim} 339167802Sjkim 340167802Sjkim 341167802Sjkim/******************************************************************************* 342167802Sjkim * 343167802Sjkim * FUNCTION: AcpiDmGetTableData 344167802Sjkim * 345167802Sjkim * PARAMETERS: Signature - ACPI signature (4 chars) to match 346167802Sjkim * 347167802Sjkim * RETURN: Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found. 348167802Sjkim * 349167802Sjkim * DESCRIPTION: Find a match in the global table of supported ACPI tables 350167802Sjkim * 351167802Sjkim ******************************************************************************/ 352167802Sjkim 353209746SjkimACPI_DMTABLE_DATA * 354167802SjkimAcpiDmGetTableData ( 355167802Sjkim char *Signature) 356167802Sjkim{ 357167802Sjkim ACPI_DMTABLE_DATA *TableData; 358167802Sjkim 359167802Sjkim 360167802Sjkim for (TableData = AcpiDmTableData; TableData->Signature; TableData++) 361167802Sjkim { 362167802Sjkim if (ACPI_COMPARE_NAME (Signature, TableData->Signature)) 363167802Sjkim { 364167802Sjkim return (TableData); 365167802Sjkim } 366167802Sjkim } 367167802Sjkim 368167802Sjkim return (NULL); 369167802Sjkim} 370167802Sjkim 371167802Sjkim 372167802Sjkim/******************************************************************************* 373167802Sjkim * 374167802Sjkim * FUNCTION: AcpiDmDumpDataTable 375167802Sjkim * 376167802Sjkim * PARAMETERS: Table - An ACPI table 377167802Sjkim * 378167802Sjkim * RETURN: None. 379167802Sjkim * 380167802Sjkim * DESCRIPTION: Format the contents of an ACPI data table (any table other 381167802Sjkim * than an SSDT or DSDT that does not contain executable AML code) 382167802Sjkim * 383167802Sjkim ******************************************************************************/ 384167802Sjkim 385167802Sjkimvoid 386167802SjkimAcpiDmDumpDataTable ( 387167802Sjkim ACPI_TABLE_HEADER *Table) 388167802Sjkim{ 389193529Sjkim ACPI_STATUS Status; 390167802Sjkim ACPI_DMTABLE_DATA *TableData; 391167802Sjkim UINT32 Length; 392167802Sjkim 393167802Sjkim 394167802Sjkim /* Ignore tables that contain AML */ 395167802Sjkim 396167802Sjkim if (AcpiUtIsAmlTable (Table)) 397167802Sjkim { 398167802Sjkim return; 399167802Sjkim } 400167802Sjkim 401167802Sjkim /* 402167802Sjkim * Handle tables that don't use the common ACPI table header structure. 403167802Sjkim * Currently, these are the FACS and RSDP. 404167802Sjkim */ 405167802Sjkim if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS)) 406167802Sjkim { 407167802Sjkim Length = Table->Length; 408167802Sjkim AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs); 409167802Sjkim } 410167802Sjkim else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_RSDP)) 411167802Sjkim { 412167802Sjkim Length = AcpiDmDumpRsdp (Table); 413167802Sjkim } 414167802Sjkim else 415167802Sjkim { 416167802Sjkim /* 417167802Sjkim * All other tables must use the common ACPI table header, dump it now 418167802Sjkim */ 419167802Sjkim Length = Table->Length; 420193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader); 421193529Sjkim if (ACPI_FAILURE (Status)) 422193529Sjkim { 423193529Sjkim return; 424193529Sjkim } 425167802Sjkim AcpiOsPrintf ("\n"); 426167802Sjkim 427167802Sjkim /* Match signature and dispatch appropriately */ 428167802Sjkim 429167802Sjkim TableData = AcpiDmGetTableData (Table->Signature); 430167802Sjkim if (!TableData) 431167802Sjkim { 432167802Sjkim if (!ACPI_STRNCMP (Table->Signature, "OEM", 3)) 433167802Sjkim { 434167802Sjkim AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n", 435167802Sjkim Table->Signature); 436167802Sjkim } 437167802Sjkim else 438167802Sjkim { 439167802Sjkim AcpiOsPrintf ("\n**** Unknown ACPI table type [%4.4s]\n\n", 440167802Sjkim Table->Signature); 441167802Sjkim } 442167802Sjkim } 443167802Sjkim else if (TableData->TableHandler) 444167802Sjkim { 445167802Sjkim /* Complex table, has a handler */ 446167802Sjkim 447167802Sjkim TableData->TableHandler (Table); 448167802Sjkim } 449167802Sjkim else if (TableData->TableInfo) 450167802Sjkim { 451167802Sjkim /* Simple table, just walk the info table */ 452167802Sjkim 453167802Sjkim AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo); 454167802Sjkim } 455167802Sjkim } 456167802Sjkim 457209746Sjkim if (!Gbl_DoTemplates || Gbl_VerboseTemplates) 458209746Sjkim { 459209746Sjkim /* Dump the raw table data */ 460167802Sjkim 461217365Sjkim AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n", 462217365Sjkim ACPI_RAW_TABLE_DATA_HEADER, Length, Length); 463209746Sjkim AcpiUtDumpBuffer2 (ACPI_CAST_PTR (UINT8, Table), Length, DB_BYTE_DISPLAY); 464209746Sjkim } 465167802Sjkim} 466167802Sjkim 467167802Sjkim 468167802Sjkim/******************************************************************************* 469167802Sjkim * 470167802Sjkim * FUNCTION: AcpiDmLineHeader 471167802Sjkim * 472167802Sjkim * PARAMETERS: Offset - Current byte offset, from table start 473167802Sjkim * ByteLength - Length of the field in bytes, 0 for flags 474167802Sjkim * Name - Name of this field 475167802Sjkim * Value - Optional value, displayed on left of ':' 476167802Sjkim * 477167802Sjkim * RETURN: None 478167802Sjkim * 479167802Sjkim * DESCRIPTION: Utility routines for formatting output lines. Displays the 480167802Sjkim * current table offset in hex and decimal, the field length, 481167802Sjkim * and the field name. 482167802Sjkim * 483167802Sjkim ******************************************************************************/ 484167802Sjkim 485167802Sjkimvoid 486167802SjkimAcpiDmLineHeader ( 487167802Sjkim UINT32 Offset, 488167802Sjkim UINT32 ByteLength, 489167802Sjkim char *Name) 490167802Sjkim{ 491167802Sjkim 492219707Sjkim /* Allow a null name for fields that span multiple lines (large buffers) */ 493219707Sjkim 494219707Sjkim if (!Name) 495219707Sjkim { 496219707Sjkim Name = ""; 497219707Sjkim } 498219707Sjkim 499209746Sjkim if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */ 500167802Sjkim { 501209746Sjkim if (ByteLength) 502209746Sjkim { 503219707Sjkim AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name); 504209746Sjkim } 505209746Sjkim else 506209746Sjkim { 507220663Sjkim if (*Name) 508220663Sjkim { 509220663Sjkim AcpiOsPrintf ("%41s : ", Name); 510220663Sjkim } 511220663Sjkim else 512220663Sjkim { 513220663Sjkim AcpiOsPrintf ("%41s ", Name); 514220663Sjkim } 515209746Sjkim } 516167802Sjkim } 517209746Sjkim else /* Normal disassembler or verbose template */ 518167802Sjkim { 519209746Sjkim if (ByteLength) 520209746Sjkim { 521219707Sjkim AcpiOsPrintf ("[%3.3Xh %4.4d% 4d] %28s : ", 522209746Sjkim Offset, Offset, ByteLength, Name); 523209746Sjkim } 524209746Sjkim else 525209746Sjkim { 526220663Sjkim if (*Name) 527220663Sjkim { 528220663Sjkim AcpiOsPrintf ("%44s : ", Name); 529220663Sjkim } 530220663Sjkim else 531220663Sjkim { 532220663Sjkim AcpiOsPrintf ("%44s ", Name); 533220663Sjkim } 534209746Sjkim } 535167802Sjkim } 536167802Sjkim} 537167802Sjkim 538167802Sjkimvoid 539167802SjkimAcpiDmLineHeader2 ( 540167802Sjkim UINT32 Offset, 541167802Sjkim UINT32 ByteLength, 542167802Sjkim char *Name, 543167802Sjkim UINT32 Value) 544167802Sjkim{ 545167802Sjkim 546209746Sjkim if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */ 547167802Sjkim { 548209746Sjkim if (ByteLength) 549209746Sjkim { 550220663Sjkim AcpiOsPrintf ("[%.4d] %30s %3d : ", 551209746Sjkim ByteLength, Name, Value); 552209746Sjkim } 553209746Sjkim else 554209746Sjkim { 555209746Sjkim AcpiOsPrintf ("%36s % 3d : ", 556209746Sjkim Name, Value); 557209746Sjkim } 558167802Sjkim } 559209746Sjkim else /* Normal disassembler or verbose template */ 560167802Sjkim { 561209746Sjkim if (ByteLength) 562209746Sjkim { 563220663Sjkim AcpiOsPrintf ("[%3.3Xh %4.4d %3d] %24s %3d : ", 564209746Sjkim Offset, Offset, ByteLength, Name, Value); 565209746Sjkim } 566209746Sjkim else 567209746Sjkim { 568220663Sjkim AcpiOsPrintf ("[%3.3Xh %4.4d ] %24s %3d : ", 569209746Sjkim Offset, Offset, Name, Value); 570209746Sjkim } 571167802Sjkim } 572167802Sjkim} 573167802Sjkim 574167802Sjkim 575167802Sjkim/******************************************************************************* 576167802Sjkim * 577167802Sjkim * FUNCTION: AcpiDmDumpTable 578167802Sjkim * 579167802Sjkim * PARAMETERS: TableLength - Length of the entire ACPI table 580167802Sjkim * TableOffset - Starting offset within the table for this 581167802Sjkim * sub-descriptor (0 if main table) 582167802Sjkim * Table - The ACPI table 583193529Sjkim * SubtableLength - Length of this sub-descriptor 584167802Sjkim * Info - Info table for this ACPI table 585167802Sjkim * 586167802Sjkim * RETURN: None 587167802Sjkim * 588167802Sjkim * DESCRIPTION: Display ACPI table contents by walking the Info table. 589167802Sjkim * 590209746Sjkim * Note: This function must remain in sync with DtGetFieldLength. 591209746Sjkim * 592167802Sjkim ******************************************************************************/ 593167802Sjkim 594193529SjkimACPI_STATUS 595167802SjkimAcpiDmDumpTable ( 596167802Sjkim UINT32 TableLength, 597167802Sjkim UINT32 TableOffset, 598167802Sjkim void *Table, 599167802Sjkim UINT32 SubtableLength, 600167802Sjkim ACPI_DMTABLE_INFO *Info) 601167802Sjkim{ 602167802Sjkim UINT8 *Target; 603167802Sjkim UINT32 CurrentOffset; 604167802Sjkim UINT32 ByteLength; 605167802Sjkim UINT8 Temp8; 606167802Sjkim UINT16 Temp16; 607167802Sjkim ACPI_DMTABLE_DATA *TableData; 608197104Sjkim const char *Name; 609193529Sjkim BOOLEAN LastOutputBlankLine = FALSE; 610197104Sjkim char RepairedName[8]; 611167802Sjkim 612167802Sjkim 613167802Sjkim if (!Info) 614167802Sjkim { 615167802Sjkim AcpiOsPrintf ("Display not implemented\n"); 616193529Sjkim return (AE_NOT_IMPLEMENTED); 617167802Sjkim } 618167802Sjkim 619167802Sjkim /* Walk entire Info table; Null name terminates */ 620167802Sjkim 621167802Sjkim for (; Info->Name; Info++) 622167802Sjkim { 623167802Sjkim /* 624167802Sjkim * Target points to the field within the ACPI Table. CurrentOffset is 625167802Sjkim * the offset of the field from the start of the main table. 626167802Sjkim */ 627167802Sjkim Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset); 628167802Sjkim CurrentOffset = TableOffset + Info->Offset; 629167802Sjkim 630167802Sjkim /* Check for beyond EOT or beyond subtable end */ 631167802Sjkim 632167802Sjkim if ((CurrentOffset >= TableLength) || 633167802Sjkim (SubtableLength && (Info->Offset >= SubtableLength))) 634167802Sjkim { 635193529Sjkim AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); 636193529Sjkim return (AE_BAD_DATA); 637167802Sjkim } 638167802Sjkim 639167802Sjkim /* Generate the byte length for this field */ 640167802Sjkim 641167802Sjkim switch (Info->Opcode) 642167802Sjkim { 643167802Sjkim case ACPI_DMT_UINT8: 644167802Sjkim case ACPI_DMT_CHKSUM: 645167802Sjkim case ACPI_DMT_SPACEID: 646216471Sjkim case ACPI_DMT_ACCWIDTH: 647197104Sjkim case ACPI_DMT_IVRS: 648167802Sjkim case ACPI_DMT_MADT: 649167802Sjkim case ACPI_DMT_SRAT: 650193529Sjkim case ACPI_DMT_ASF: 651193529Sjkim case ACPI_DMT_HESTNTYP: 652193529Sjkim case ACPI_DMT_FADTPM: 653209746Sjkim case ACPI_DMT_EINJACT: 654209746Sjkim case ACPI_DMT_EINJINST: 655209746Sjkim case ACPI_DMT_ERSTACT: 656209746Sjkim case ACPI_DMT_ERSTINST: 657167802Sjkim ByteLength = 1; 658167802Sjkim break; 659167802Sjkim case ACPI_DMT_UINT16: 660167802Sjkim case ACPI_DMT_DMAR: 661193529Sjkim case ACPI_DMT_HEST: 662167802Sjkim ByteLength = 2; 663167802Sjkim break; 664167802Sjkim case ACPI_DMT_UINT24: 665167802Sjkim ByteLength = 3; 666167802Sjkim break; 667167802Sjkim case ACPI_DMT_UINT32: 668167802Sjkim case ACPI_DMT_NAME4: 669167802Sjkim case ACPI_DMT_SIG: 670219707Sjkim case ACPI_DMT_SLIC: 671167802Sjkim ByteLength = 4; 672167802Sjkim break; 673167802Sjkim case ACPI_DMT_NAME6: 674167802Sjkim ByteLength = 6; 675167802Sjkim break; 676167802Sjkim case ACPI_DMT_UINT56: 677218590Sjkim case ACPI_DMT_BUF7: 678167802Sjkim ByteLength = 7; 679167802Sjkim break; 680167802Sjkim case ACPI_DMT_UINT64: 681167802Sjkim case ACPI_DMT_NAME8: 682167802Sjkim ByteLength = 8; 683167802Sjkim break; 684197104Sjkim case ACPI_DMT_BUF16: 685217365Sjkim case ACPI_DMT_UUID: 686197104Sjkim ByteLength = 16; 687197104Sjkim break; 688219707Sjkim case ACPI_DMT_BUF128: 689219707Sjkim ByteLength = 128; 690219707Sjkim break; 691167802Sjkim case ACPI_DMT_STRING: 692167802Sjkim ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1; 693167802Sjkim break; 694167802Sjkim case ACPI_DMT_GAS: 695193529Sjkim if (!LastOutputBlankLine) 696193529Sjkim { 697193529Sjkim AcpiOsPrintf ("\n"); 698193529Sjkim LastOutputBlankLine = TRUE; 699193529Sjkim } 700167802Sjkim ByteLength = sizeof (ACPI_GENERIC_ADDRESS); 701167802Sjkim break; 702193529Sjkim case ACPI_DMT_HESTNTFY: 703193529Sjkim if (!LastOutputBlankLine) 704193529Sjkim { 705193529Sjkim AcpiOsPrintf ("\n"); 706193529Sjkim LastOutputBlankLine = TRUE; 707193529Sjkim } 708193529Sjkim ByteLength = sizeof (ACPI_HEST_NOTIFY); 709193529Sjkim break; 710167802Sjkim default: 711167802Sjkim ByteLength = 0; 712167802Sjkim break; 713167802Sjkim } 714167802Sjkim 715193529Sjkim if (CurrentOffset + ByteLength > TableLength) 716193529Sjkim { 717193529Sjkim AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); 718193529Sjkim return (AE_BAD_DATA); 719193529Sjkim } 720193529Sjkim 721167802Sjkim /* Start a new line and decode the opcode */ 722167802Sjkim 723167802Sjkim AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name); 724167802Sjkim 725167802Sjkim switch (Info->Opcode) 726167802Sjkim { 727167802Sjkim /* Single-bit Flag fields. Note: Opcode is the bit position */ 728167802Sjkim 729167802Sjkim case ACPI_DMT_FLAG0: 730167802Sjkim case ACPI_DMT_FLAG1: 731167802Sjkim case ACPI_DMT_FLAG2: 732167802Sjkim case ACPI_DMT_FLAG3: 733167802Sjkim case ACPI_DMT_FLAG4: 734167802Sjkim case ACPI_DMT_FLAG5: 735167802Sjkim case ACPI_DMT_FLAG6: 736167802Sjkim case ACPI_DMT_FLAG7: 737167802Sjkim 738167802Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01); 739167802Sjkim break; 740167802Sjkim 741167802Sjkim /* 2-bit Flag fields */ 742167802Sjkim 743167802Sjkim case ACPI_DMT_FLAGS0: 744167802Sjkim 745167802Sjkim AcpiOsPrintf ("%1.1X\n", *Target & 0x03); 746167802Sjkim break; 747167802Sjkim 748167802Sjkim case ACPI_DMT_FLAGS2: 749167802Sjkim 750167802Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03); 751167802Sjkim break; 752167802Sjkim 753167802Sjkim /* Standard Data Types */ 754167802Sjkim 755167802Sjkim case ACPI_DMT_UINT8: 756167802Sjkim 757167802Sjkim AcpiOsPrintf ("%2.2X\n", *Target); 758167802Sjkim break; 759167802Sjkim 760167802Sjkim case ACPI_DMT_UINT16: 761167802Sjkim 762167802Sjkim AcpiOsPrintf ("%4.4X\n", ACPI_GET16 (Target)); 763167802Sjkim break; 764167802Sjkim 765167802Sjkim case ACPI_DMT_UINT24: 766167802Sjkim 767167802Sjkim AcpiOsPrintf ("%2.2X%2.2X%2.2X\n", 768167802Sjkim *Target, *(Target + 1), *(Target + 2)); 769167802Sjkim break; 770167802Sjkim 771167802Sjkim case ACPI_DMT_UINT32: 772167802Sjkim 773167802Sjkim AcpiOsPrintf ("%8.8X\n", ACPI_GET32 (Target)); 774167802Sjkim break; 775167802Sjkim 776167802Sjkim case ACPI_DMT_UINT56: 777167802Sjkim 778193529Sjkim for (Temp8 = 0; Temp8 < 7; Temp8++) 779193529Sjkim { 780193529Sjkim AcpiOsPrintf ("%2.2X", Target[Temp8]); 781193529Sjkim } 782193529Sjkim AcpiOsPrintf ("\n"); 783167802Sjkim break; 784167802Sjkim 785167802Sjkim case ACPI_DMT_UINT64: 786167802Sjkim 787167802Sjkim AcpiOsPrintf ("%8.8X%8.8X\n", 788167802Sjkim ACPI_FORMAT_UINT64 (ACPI_GET64 (Target))); 789167802Sjkim break; 790167802Sjkim 791218590Sjkim case ACPI_DMT_BUF7: 792197104Sjkim case ACPI_DMT_BUF16: 793219707Sjkim case ACPI_DMT_BUF128: 794197104Sjkim 795218590Sjkim /* 796218590Sjkim * Buffer: Size depends on the opcode and was set above. 797218590Sjkim * Each hex byte is separated with a space. 798220663Sjkim * Multiple lines are separated by line continuation char. 799218590Sjkim */ 800219707Sjkim for (Temp16 = 0; Temp16 < ByteLength; Temp16++) 801197104Sjkim { 802219707Sjkim AcpiOsPrintf ("%2.2X", Target[Temp16]); 803219707Sjkim if ((UINT32) (Temp16 + 1) < ByteLength) 804209746Sjkim { 805219707Sjkim if ((Temp16 > 0) && (!((Temp16+1) % 16))) 806219707Sjkim { 807220663Sjkim AcpiOsPrintf (" \\\n"); /* Line continuation */ 808219707Sjkim AcpiDmLineHeader (0, 0, NULL); 809219707Sjkim } 810219707Sjkim else 811219707Sjkim { 812219707Sjkim AcpiOsPrintf (" "); 813219707Sjkim } 814209746Sjkim } 815197104Sjkim } 816197104Sjkim AcpiOsPrintf ("\n"); 817197104Sjkim break; 818197104Sjkim 819217365Sjkim case ACPI_DMT_UUID: 820217365Sjkim 821217365Sjkim /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */ 822217365Sjkim 823217365Sjkim (void) AuConvertUuidToString ((char *) Target, MsgBuffer); 824217365Sjkim 825217365Sjkim AcpiOsPrintf ("%s\n", MsgBuffer); 826217365Sjkim break; 827217365Sjkim 828167802Sjkim case ACPI_DMT_STRING: 829167802Sjkim 830197104Sjkim AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target)); 831167802Sjkim break; 832167802Sjkim 833167802Sjkim /* Fixed length ASCII name fields */ 834167802Sjkim 835167802Sjkim case ACPI_DMT_SIG: 836167802Sjkim 837197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 4); 838197104Sjkim AcpiOsPrintf ("\"%.4s\" ", RepairedName); 839167802Sjkim TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target)); 840167802Sjkim if (TableData) 841167802Sjkim { 842220663Sjkim AcpiOsPrintf (STRING_FORMAT, TableData->Name); 843167802Sjkim } 844220663Sjkim else 845220663Sjkim { 846220663Sjkim AcpiOsPrintf ("\n"); 847220663Sjkim } 848167802Sjkim break; 849167802Sjkim 850167802Sjkim case ACPI_DMT_NAME4: 851167802Sjkim 852197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 4); 853197104Sjkim AcpiOsPrintf ("\"%.4s\"\n", RepairedName); 854167802Sjkim break; 855167802Sjkim 856167802Sjkim case ACPI_DMT_NAME6: 857167802Sjkim 858197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 6); 859197104Sjkim AcpiOsPrintf ("\"%.6s\"\n", RepairedName); 860167802Sjkim break; 861167802Sjkim 862167802Sjkim case ACPI_DMT_NAME8: 863167802Sjkim 864197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 8); 865197104Sjkim AcpiOsPrintf ("\"%.8s\"\n", RepairedName); 866167802Sjkim break; 867167802Sjkim 868167802Sjkim /* Special Data Types */ 869167802Sjkim 870167802Sjkim case ACPI_DMT_CHKSUM: 871167802Sjkim 872167802Sjkim /* Checksum, display and validate */ 873167802Sjkim 874167802Sjkim AcpiOsPrintf ("%2.2X", *Target); 875209746Sjkim Temp8 = AcpiDmGenerateChecksum (Table, 876209746Sjkim ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, 877209746Sjkim ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum); 878167802Sjkim if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum) 879167802Sjkim { 880167802Sjkim AcpiOsPrintf ( 881167802Sjkim " /* Incorrect checksum, should be %2.2X */", Temp8); 882167802Sjkim } 883167802Sjkim AcpiOsPrintf ("\n"); 884167802Sjkim break; 885167802Sjkim 886167802Sjkim case ACPI_DMT_SPACEID: 887167802Sjkim 888167802Sjkim /* Address Space ID */ 889167802Sjkim 890220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target)); 891167802Sjkim break; 892167802Sjkim 893216471Sjkim case ACPI_DMT_ACCWIDTH: 894216471Sjkim 895216471Sjkim /* Encoded Access Width */ 896216471Sjkim 897216471Sjkim Temp8 = *Target; 898216471Sjkim if (Temp8 > ACPI_GAS_WIDTH_RESERVED) 899216471Sjkim { 900216471Sjkim Temp8 = ACPI_GAS_WIDTH_RESERVED; 901216471Sjkim } 902216471Sjkim 903220663Sjkim AcpiOsPrintf (UINT8_FORMAT, Temp8, AcpiDmGasAccessWidth[Temp8]); 904216471Sjkim break; 905216471Sjkim 906167802Sjkim case ACPI_DMT_GAS: 907167802Sjkim 908167802Sjkim /* Generic Address Structure */ 909167802Sjkim 910220663Sjkim AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure"); 911197104Sjkim AcpiDmDumpTable (TableLength, CurrentOffset, Target, 912197104Sjkim sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas); 913193529Sjkim AcpiOsPrintf ("\n"); 914193529Sjkim LastOutputBlankLine = TRUE; 915167802Sjkim break; 916167802Sjkim 917193529Sjkim case ACPI_DMT_ASF: 918193529Sjkim 919193529Sjkim /* ASF subtable types */ 920193529Sjkim 921193529Sjkim Temp16 = (UINT16) ((*Target) & 0x7F); /* Top bit can be zero or one */ 922193529Sjkim if (Temp16 > ACPI_ASF_TYPE_RESERVED) 923193529Sjkim { 924193529Sjkim Temp16 = ACPI_ASF_TYPE_RESERVED; 925193529Sjkim } 926193529Sjkim 927220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]); 928193529Sjkim break; 929193529Sjkim 930167802Sjkim case ACPI_DMT_DMAR: 931167802Sjkim 932167802Sjkim /* DMAR subtable types */ 933167802Sjkim 934193529Sjkim Temp16 = ACPI_GET16 (Target); 935167802Sjkim if (Temp16 > ACPI_DMAR_TYPE_RESERVED) 936167802Sjkim { 937167802Sjkim Temp16 = ACPI_DMAR_TYPE_RESERVED; 938167802Sjkim } 939167802Sjkim 940220663Sjkim AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]); 941167802Sjkim break; 942167802Sjkim 943209746Sjkim case ACPI_DMT_EINJACT: 944209746Sjkim 945209746Sjkim /* EINJ Action types */ 946209746Sjkim 947209746Sjkim Temp8 = *Target; 948209746Sjkim if (Temp8 > ACPI_EINJ_ACTION_RESERVED) 949209746Sjkim { 950209746Sjkim Temp8 = ACPI_EINJ_ACTION_RESERVED; 951209746Sjkim } 952209746Sjkim 953220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjActions[Temp8]); 954209746Sjkim break; 955209746Sjkim 956209746Sjkim case ACPI_DMT_EINJINST: 957209746Sjkim 958209746Sjkim /* EINJ Instruction types */ 959209746Sjkim 960209746Sjkim Temp8 = *Target; 961209746Sjkim if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED) 962209746Sjkim { 963209746Sjkim Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED; 964209746Sjkim } 965209746Sjkim 966220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjInstructions[Temp8]); 967209746Sjkim break; 968209746Sjkim 969209746Sjkim case ACPI_DMT_ERSTACT: 970209746Sjkim 971209746Sjkim /* ERST Action types */ 972209746Sjkim 973209746Sjkim Temp8 = *Target; 974209746Sjkim if (Temp8 > ACPI_ERST_ACTION_RESERVED) 975209746Sjkim { 976209746Sjkim Temp8 = ACPI_ERST_ACTION_RESERVED; 977209746Sjkim } 978209746Sjkim 979220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstActions[Temp8]); 980209746Sjkim break; 981209746Sjkim 982209746Sjkim case ACPI_DMT_ERSTINST: 983209746Sjkim 984209746Sjkim /* ERST Instruction types */ 985209746Sjkim 986209746Sjkim Temp8 = *Target; 987209746Sjkim if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED) 988209746Sjkim { 989209746Sjkim Temp8 = ACPI_ERST_INSTRUCTION_RESERVED; 990209746Sjkim } 991209746Sjkim 992220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstInstructions[Temp8]); 993209746Sjkim break; 994209746Sjkim 995193529Sjkim case ACPI_DMT_HEST: 996193529Sjkim 997193529Sjkim /* HEST subtable types */ 998193529Sjkim 999193529Sjkim Temp16 = ACPI_GET16 (Target); 1000193529Sjkim if (Temp16 > ACPI_HEST_TYPE_RESERVED) 1001193529Sjkim { 1002193529Sjkim Temp16 = ACPI_HEST_TYPE_RESERVED; 1003193529Sjkim } 1004193529Sjkim 1005220663Sjkim AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]); 1006193529Sjkim break; 1007193529Sjkim 1008193529Sjkim case ACPI_DMT_HESTNTFY: 1009193529Sjkim 1010220663Sjkim AcpiOsPrintf (STRING_FORMAT, "Hardware Error Notification Structure"); 1011197104Sjkim AcpiDmDumpTable (TableLength, CurrentOffset, Target, 1012197104Sjkim sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify); 1013193529Sjkim AcpiOsPrintf ("\n"); 1014193529Sjkim LastOutputBlankLine = TRUE; 1015193529Sjkim break; 1016193529Sjkim 1017193529Sjkim case ACPI_DMT_HESTNTYP: 1018193529Sjkim 1019193529Sjkim /* HEST Notify types */ 1020193529Sjkim 1021193529Sjkim Temp8 = *Target; 1022193529Sjkim if (Temp8 > ACPI_HEST_NOTIFY_RESERVED) 1023193529Sjkim { 1024193529Sjkim Temp8 = ACPI_HEST_NOTIFY_RESERVED; 1025193529Sjkim } 1026193529Sjkim 1027220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmHestNotifySubnames[Temp8]); 1028193529Sjkim break; 1029193529Sjkim 1030167802Sjkim case ACPI_DMT_MADT: 1031167802Sjkim 1032167802Sjkim /* MADT subtable types */ 1033167802Sjkim 1034167802Sjkim Temp8 = *Target; 1035167802Sjkim if (Temp8 > ACPI_MADT_TYPE_RESERVED) 1036167802Sjkim { 1037167802Sjkim Temp8 = ACPI_MADT_TYPE_RESERVED; 1038167802Sjkim } 1039167802Sjkim 1040220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmMadtSubnames[Temp8]); 1041167802Sjkim break; 1042167802Sjkim 1043219707Sjkim case ACPI_DMT_SLIC: 1044219707Sjkim 1045219707Sjkim /* SLIC subtable types */ 1046219707Sjkim 1047219707Sjkim Temp8 = *Target; 1048219707Sjkim if (Temp8 > ACPI_SLIC_TYPE_RESERVED) 1049219707Sjkim { 1050219707Sjkim Temp8 = ACPI_SLIC_TYPE_RESERVED; 1051219707Sjkim } 1052219707Sjkim 1053220663Sjkim AcpiOsPrintf (UINT32_FORMAT, *Target, AcpiDmSlicSubnames[Temp8]); 1054219707Sjkim break; 1055219707Sjkim 1056167802Sjkim case ACPI_DMT_SRAT: 1057167802Sjkim 1058167802Sjkim /* SRAT subtable types */ 1059167802Sjkim 1060167802Sjkim Temp8 = *Target; 1061167802Sjkim if (Temp8 > ACPI_SRAT_TYPE_RESERVED) 1062167802Sjkim { 1063167802Sjkim Temp8 = ACPI_SRAT_TYPE_RESERVED; 1064167802Sjkim } 1065167802Sjkim 1066220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmSratSubnames[Temp8]); 1067167802Sjkim break; 1068167802Sjkim 1069193529Sjkim case ACPI_DMT_FADTPM: 1070193529Sjkim 1071193529Sjkim /* FADT Preferred PM Profile names */ 1072193529Sjkim 1073193529Sjkim Temp8 = *Target; 1074193529Sjkim if (Temp8 > ACPI_FADT_PM_RESERVED) 1075193529Sjkim { 1076193529Sjkim Temp8 = ACPI_FADT_PM_RESERVED; 1077193529Sjkim } 1078193529Sjkim 1079220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmFadtProfiles[Temp8]); 1080193529Sjkim break; 1081193529Sjkim 1082197104Sjkim case ACPI_DMT_IVRS: 1083197104Sjkim 1084197104Sjkim /* IVRS subtable types */ 1085197104Sjkim 1086197104Sjkim Temp8 = *Target; 1087197104Sjkim switch (Temp8) 1088197104Sjkim { 1089197104Sjkim case ACPI_IVRS_TYPE_HARDWARE: 1090197104Sjkim Name = AcpiDmIvrsSubnames[0]; 1091197104Sjkim break; 1092197104Sjkim 1093197104Sjkim case ACPI_IVRS_TYPE_MEMORY1: 1094197104Sjkim case ACPI_IVRS_TYPE_MEMORY2: 1095197104Sjkim case ACPI_IVRS_TYPE_MEMORY3: 1096197104Sjkim Name = AcpiDmIvrsSubnames[1]; 1097197104Sjkim break; 1098197104Sjkim 1099197104Sjkim default: 1100197104Sjkim Name = AcpiDmIvrsSubnames[2]; 1101197104Sjkim break; 1102197104Sjkim } 1103197104Sjkim 1104220663Sjkim AcpiOsPrintf (UINT8_FORMAT, *Target, Name); 1105197104Sjkim break; 1106197104Sjkim 1107167802Sjkim case ACPI_DMT_EXIT: 1108193529Sjkim return (AE_OK); 1109167802Sjkim 1110167802Sjkim default: 1111167802Sjkim ACPI_ERROR ((AE_INFO, 1112204773Sjkim "**** Invalid table opcode [0x%X] ****\n", Info->Opcode)); 1113193529Sjkim return (AE_SUPPORT); 1114167802Sjkim } 1115167802Sjkim } 1116193529Sjkim 1117193529Sjkim if (TableOffset && !SubtableLength) 1118193529Sjkim { 1119193529Sjkim /* If this table is not the main table, subtable must have valid length */ 1120193529Sjkim 1121193529Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 1122193529Sjkim return (AE_BAD_DATA); 1123193529Sjkim } 1124193529Sjkim 1125193529Sjkim return (AE_OK); 1126167802Sjkim} 1127167802Sjkim 1128167802Sjkim 1129167802Sjkim/******************************************************************************* 1130167802Sjkim * 1131167802Sjkim * FUNCTION: AcpiDmCheckAscii 1132167802Sjkim * 1133167802Sjkim * PARAMETERS: Name - Ascii string 1134167802Sjkim * Count - Number of characters to check 1135167802Sjkim * 1136167802Sjkim * RETURN: None 1137167802Sjkim * 1138167802Sjkim * DESCRIPTION: Ensure that the requested number of characters are printable 1139167802Sjkim * Ascii characters. Sets non-printable and null chars to <space>. 1140167802Sjkim * 1141167802Sjkim ******************************************************************************/ 1142167802Sjkim 1143167802Sjkimstatic void 1144167802SjkimAcpiDmCheckAscii ( 1145167802Sjkim UINT8 *Name, 1146197104Sjkim char *RepairedName, 1147167802Sjkim UINT32 Count) 1148167802Sjkim{ 1149167802Sjkim UINT32 i; 1150167802Sjkim 1151167802Sjkim 1152167802Sjkim for (i = 0; i < Count; i++) 1153167802Sjkim { 1154198237Sjkim RepairedName[i] = (char) Name[i]; 1155197104Sjkim 1156197104Sjkim if (!Name[i]) 1157167802Sjkim { 1158197104Sjkim return; 1159167802Sjkim } 1160197104Sjkim if (!isprint (Name[i])) 1161197104Sjkim { 1162197104Sjkim RepairedName[i] = ' '; 1163197104Sjkim } 1164167802Sjkim } 1165167802Sjkim} 1166