diff options
Diffstat (limited to 'sys/contrib/dev/acpica/common/dmtable.c')
-rw-r--r-- | sys/contrib/dev/acpica/common/dmtable.c | 215 |
1 files changed, 192 insertions, 23 deletions
diff --git a/sys/contrib/dev/acpica/common/dmtable.c b/sys/contrib/dev/acpica/common/dmtable.c index ce4b5f9..d0b26f2 100644 --- a/sys/contrib/dev/acpica/common/dmtable.c +++ b/sys/contrib/dev/acpica/common/dmtable.c @@ -1,7 +1,6 @@ /****************************************************************************** * * Module Name: dmtable - Support for ACPI tables that contain no AML code - * $Revision: 1.12 $ * *****************************************************************************/ @@ -9,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. * All rights reserved. * * 2. License @@ -114,9 +113,10 @@ * *****************************************************************************/ -#include <contrib/dev/acpica/acpi.h> -#include <contrib/dev/acpica/acdisasm.h> -#include <contrib/dev/acpica/actables.h> +#include <contrib/dev/acpica/include/acpi.h> +#include <contrib/dev/acpica/include/accommon.h> +#include <contrib/dev/acpica/include/acdisasm.h> +#include <contrib/dev/acpica/include/actables.h> /* This module used for application-level code only */ @@ -134,16 +134,56 @@ AcpiDmCheckAscii ( UINT8 *Target, UINT32 Count); +UINT8 +AcpiTbGenerateChecksum ( + ACPI_TABLE_HEADER *Table); + /* These tables map a subtable type to a description string */ +static const char *AcpiDmAsfSubnames[] = +{ + "ASF Information", + "ASF Alerts", + "ASF Remote Control", + "ASF RMCP Boot Options", + "ASF Address", + "Unknown SubTable Type" /* Reserved */ +}; + static const char *AcpiDmDmarSubnames[] = { "Hardware Unit Definition", "Reserved Memory Region", + "Root Port ATS Capability", + "Unknown SubTable Type" /* Reserved */ +}; + +static const char *AcpiDmHestSubnames[] = +{ + "XPF Machine Check Exception", + "XPF Corrected Machine Check", + "NOT USED???", + "XPF Non-Maskable Interrupt", + "IPF Corrected Machine Check", + "IPF Corrected Platform Error", + "PCI Express Root Port AER", + "PCI Express AER (AER Endpoint)", + "PCI Express/PCI-X Bridge AER", + "Generic Hardware Error Source", "Unknown SubTable Type" /* Reserved */ }; +static const char *AcpiDmHestNotifySubnames[] = +{ + "Polled", + "External Interrupt", + "Local Interrupt", + "SCI", + "NMI", + "Unknown Notify Type" /* Reserved */ +}; + static const char *AcpiDmMadtSubnames[] = { "Processor Local APIC", /* ACPI_MADT_TYPE_LOCAL_APIC */ @@ -155,6 +195,8 @@ static const char *AcpiDmMadtSubnames[] = "I/O SAPIC", /* ACPI_MADT_TYPE_IO_SAPIC */ "Local SAPIC", /* ACPI_MADT_TYPE_LOCAL_SAPIC */ "Platform Interrupt Sources", /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */ + "Processor Local x2APIC", /* ACPI_MADT_TYPE_LOCAL_X2APIC */ + "Local x2APIC NMI", /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */ "Unknown SubTable Type" /* Reserved */ }; @@ -162,10 +204,27 @@ static const char *AcpiDmSratSubnames[] = { "Processor Local APIC/SAPIC Affinity", "Memory Affinity", + "Processor Local x2APIC Affinity", "Unknown SubTable Type" /* Reserved */ }; +#define ACPI_FADT_PM_RESERVED 8 + +static const char *AcpiDmFadtProfiles[] = +{ + "Unspecified", + "Desktop", + "Mobile", + "Workstation", + "Enterprise Server", + "SOHO Server", + "Appliance PC", + "Performance Server", + "Unknown Profile Type" +}; + + /******************************************************************************* * * ACPI Table Data, indexed by signature. @@ -180,16 +239,21 @@ static ACPI_DMTABLE_DATA AcpiDmTableData[] = { {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, "Alert Standard Format table"}, {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, "Simple Boot Flag Table"}, + {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, "Boot Error Record Table"}, {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, "Corrected Platform Error Polling table"}, {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp, NULL, "Debug Port table"}, {ACPI_SIG_DMAR, NULL, AcpiDmDumpDmar, "DMA Remapping table"}, {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt, NULL, "Embedded Controller Boot Resources Table"}, + {ACPI_SIG_EINJ, NULL, AcpiDmDumpEinj, "Error Injection table"}, + {ACPI_SIG_ERST, NULL, AcpiDmDumpErst, "Error Record Serialization Table"}, {ACPI_SIG_FADT, NULL, AcpiDmDumpFadt, "Fixed ACPI Description Table"}, + {ACPI_SIG_HEST, NULL, AcpiDmDumpHest, "Hardware Error Source Table"}, {ACPI_SIG_HPET, AcpiDmTableInfoHpet, NULL, "High Precision Event Timer table"}, {ACPI_SIG_MADT, NULL, AcpiDmDumpMadt, "Multiple APIC Description Table"}, {ACPI_SIG_MCFG, NULL, AcpiDmDumpMcfg, "Memory Mapped Configuration table"}, {ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, "Root System Description Table"}, {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, "Smart Battery Specification Table"}, + {ACPI_SIG_SLIC, AcpiDmTableInfoSlic, NULL, "Software Licensing Description Table"}, {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, "System Locality Information Table"}, {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, "Serial Port Console Redirection table"}, {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, "Server Platform Management Interface table"}, @@ -284,6 +348,7 @@ void AcpiDmDumpDataTable ( ACPI_TABLE_HEADER *Table) { + ACPI_STATUS Status; ACPI_DMTABLE_DATA *TableData; UINT32 Length; @@ -314,7 +379,11 @@ AcpiDmDumpDataTable ( * All other tables must use the common ACPI table header, dump it now */ Length = Table->Length; - AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader); + Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader); + if (ACPI_FAILURE (Status)) + { + return; + } AcpiOsPrintf ("\n"); /* Match signature and dispatch appropriately */ @@ -380,12 +449,12 @@ AcpiDmLineHeader ( if (ByteLength) { - AcpiOsPrintf ("[%3.3Xh %3.3d% 3d] %28s : ", + AcpiOsPrintf ("[%3.3Xh %4.4d% 3d] %28s : ", Offset, Offset, ByteLength, Name); } else { - AcpiOsPrintf ("%42s : ", + AcpiOsPrintf ("%43s : ", Name); } } @@ -400,12 +469,12 @@ AcpiDmLineHeader2 ( if (ByteLength) { - AcpiOsPrintf ("[%3.3Xh %3.3d% 3d] %24s % 3d : ", + AcpiOsPrintf ("[%3.3Xh %4.4d% 3d] %24s % 3d : ", Offset, Offset, ByteLength, Name, Value); } else { - AcpiOsPrintf ("[%3.3Xh %3.3d ] %24s % 3d : ", + AcpiOsPrintf ("[%3.3Xh %4.4d ] %24s % 3d : ", Offset, Offset, Name, Value); } } @@ -419,7 +488,7 @@ AcpiDmLineHeader2 ( * TableOffset - Starting offset within the table for this * sub-descriptor (0 if main table) * Table - The ACPI table - * SubtableLength - Lenghth of this sub-descriptor + * SubtableLength - Length of this sub-descriptor * Info - Info table for this ACPI table * * RETURN: None @@ -428,7 +497,7 @@ AcpiDmLineHeader2 ( * ******************************************************************************/ -void +ACPI_STATUS AcpiDmDumpTable ( UINT32 TableLength, UINT32 TableOffset, @@ -442,12 +511,13 @@ AcpiDmDumpTable ( UINT8 Temp8; UINT16 Temp16; ACPI_DMTABLE_DATA *TableData; + BOOLEAN LastOutputBlankLine = FALSE; if (!Info) { AcpiOsPrintf ("Display not implemented\n"); - return; + return (AE_NOT_IMPLEMENTED); } /* Walk entire Info table; Null name terminates */ @@ -466,7 +536,8 @@ AcpiDmDumpTable ( if ((CurrentOffset >= TableLength) || (SubtableLength && (Info->Offset >= SubtableLength))) { - return; + AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); + return (AE_BAD_DATA); } /* Generate the byte length for this field */ @@ -478,10 +549,14 @@ AcpiDmDumpTable ( case ACPI_DMT_SPACEID: case ACPI_DMT_MADT: case ACPI_DMT_SRAT: + case ACPI_DMT_ASF: + case ACPI_DMT_HESTNTYP: + case ACPI_DMT_FADTPM: ByteLength = 1; break; case ACPI_DMT_UINT16: case ACPI_DMT_DMAR: + case ACPI_DMT_HEST: ByteLength = 2; break; case ACPI_DMT_UINT24: @@ -506,14 +581,32 @@ AcpiDmDumpTable ( ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1; break; case ACPI_DMT_GAS: - AcpiOsPrintf ("\n"); + if (!LastOutputBlankLine) + { + AcpiOsPrintf ("\n"); + LastOutputBlankLine = TRUE; + } ByteLength = sizeof (ACPI_GENERIC_ADDRESS); break; + case ACPI_DMT_HESTNTFY: + if (!LastOutputBlankLine) + { + AcpiOsPrintf ("\n"); + LastOutputBlankLine = TRUE; + } + ByteLength = sizeof (ACPI_HEST_NOTIFY); + break; default: ByteLength = 0; break; } + if (CurrentOffset + ByteLength > TableLength) + { + AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); + return (AE_BAD_DATA); + } + /* Start a new line and decode the opcode */ AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name); @@ -571,9 +664,11 @@ AcpiDmDumpTable ( case ACPI_DMT_UINT56: - AcpiOsPrintf ("%6.6X%8.8X\n", - ACPI_HIDWORD (ACPI_GET64 (Target)) & 0x00FFFFFF, - ACPI_LODWORD (ACPI_GET64 (Target))); + for (Temp8 = 0; Temp8 < 7; Temp8++) + { + AcpiOsPrintf ("%2.2X", Target[Temp8]); + } + AcpiOsPrintf ("\n"); break; case ACPI_DMT_UINT64: @@ -648,22 +743,73 @@ AcpiDmDumpTable ( AcpiOsPrintf ("<Generic Address Structure>\n"); AcpiDmDumpTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, - CurrentOffset, Target, 0, AcpiDmTableInfoGas); + CurrentOffset, Target, sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas); + AcpiOsPrintf ("\n"); + LastOutputBlankLine = TRUE; + break; + + case ACPI_DMT_ASF: + + /* ASF subtable types */ + + Temp16 = (UINT16) ((*Target) & 0x7F); /* Top bit can be zero or one */ + if (Temp16 > ACPI_ASF_TYPE_RESERVED) + { + Temp16 = ACPI_ASF_TYPE_RESERVED; + } + + AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmAsfSubnames[Temp16]); break; case ACPI_DMT_DMAR: /* DMAR subtable types */ - Temp16 = *Target; + Temp16 = ACPI_GET16 (Target); if (Temp16 > ACPI_DMAR_TYPE_RESERVED) { Temp16 = ACPI_DMAR_TYPE_RESERVED; } - AcpiOsPrintf ("%4.4X <%s>\n", *Target, AcpiDmDmarSubnames[Temp16]); + AcpiOsPrintf ("%4.4X <%s>\n", ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]); + break; + + case ACPI_DMT_HEST: + + /* HEST subtable types */ + + Temp16 = ACPI_GET16 (Target); + if (Temp16 > ACPI_HEST_TYPE_RESERVED) + { + Temp16 = ACPI_HEST_TYPE_RESERVED; + } + + AcpiOsPrintf ("%4.4X (%s)\n", ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]); + break; + + case ACPI_DMT_HESTNTFY: + + AcpiOsPrintf ("<Hardware Error Notification Structure>\n"); + AcpiDmDumpTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, + CurrentOffset, Target, sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify); + AcpiOsPrintf ("\n"); + LastOutputBlankLine = TRUE; + break; + + case ACPI_DMT_HESTNTYP: + + /* HEST Notify types */ + + Temp8 = *Target; + if (Temp8 > ACPI_HEST_NOTIFY_RESERVED) + { + Temp8 = ACPI_HEST_NOTIFY_RESERVED; + } + + AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmHestNotifySubnames[Temp8]); break; + case ACPI_DMT_MADT: /* MADT subtable types */ @@ -690,15 +836,38 @@ AcpiDmDumpTable ( AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmSratSubnames[Temp8]); break; + case ACPI_DMT_FADTPM: + + /* FADT Preferred PM Profile names */ + + Temp8 = *Target; + if (Temp8 > ACPI_FADT_PM_RESERVED) + { + Temp8 = ACPI_FADT_PM_RESERVED; + } + + AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmFadtProfiles[Temp8]); + break; + case ACPI_DMT_EXIT: - return; + return (AE_OK); default: ACPI_ERROR ((AE_INFO, "**** Invalid table opcode [%X] ****\n", Info->Opcode)); - return; + return (AE_SUPPORT); } } + + if (TableOffset && !SubtableLength) + { + /* If this table is not the main table, subtable must have valid length */ + + AcpiOsPrintf ("Invalid zero length subtable\n"); + return (AE_BAD_DATA); + } + + return (AE_OK); } |