diff options
Diffstat (limited to 'tables/tbxface.c')
| -rw-r--r-- | tables/tbxface.c | 230 |
1 files changed, 153 insertions, 77 deletions
diff --git a/tables/tbxface.c b/tables/tbxface.c index aad890c9e08ad..4c12916c5ac3d 100644 --- a/tables/tbxface.c +++ b/tables/tbxface.c @@ -2,7 +2,6 @@ * * Module Name: tbxface - Public interfaces to the ACPI subsystem * ACPI table oriented interfaces - * $Revision: 1.86 $ * *****************************************************************************/ @@ -10,7 +9,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 @@ -118,6 +117,7 @@ #define __TBXFACE_C__ #include "acpi.h" +#include "accommon.h" #include "acnamesp.h" #include "actables.h" @@ -213,7 +213,7 @@ AcpiInitializeTables ( /* Root Table Array has been statically allocated by the host */ ACPI_MEMSET (InitialTableArray, 0, - InitialTableCount * sizeof (ACPI_TABLE_DESC)); + (ACPI_SIZE) InitialTableCount * sizeof (ACPI_TABLE_DESC)); AcpiGbl_RootTableList.Tables = InitialTableArray; AcpiGbl_RootTableList.Size = InitialTableCount; @@ -237,7 +237,7 @@ AcpiInitializeTables ( * Root Table Array. This array contains the information of the RSDT/XSDT * in a common, more useable format. */ - Status = AcpiTbParseRootTable (RsdpAddress, ACPI_TABLE_ORIGIN_MAPPED); + Status = AcpiTbParseRootTable (RsdpAddress); return_ACPI_STATUS (Status); } @@ -279,7 +279,8 @@ AcpiReallocateRootTable ( return_ACPI_STATUS (AE_SUPPORT); } - NewSize = (AcpiGbl_RootTableList.Count + ACPI_ROOT_TABLE_SIZE_INCREMENT) * + NewSize = ((ACPI_SIZE) AcpiGbl_RootTableList.Count + + ACPI_ROOT_TABLE_SIZE_INCREMENT) * sizeof (ACPI_TABLE_DESC); /* Create new array and copy the old array */ @@ -303,7 +304,7 @@ AcpiReallocateRootTable ( ACPI_EXPORT_SYMBOL (AcpiReallocateRootTable) -/****************************************************************************** +/******************************************************************************* * * FUNCTION: AcpiGetTableHeader * @@ -318,16 +319,16 @@ ACPI_EXPORT_SYMBOL (AcpiReallocateRootTable) * NOTE: Caller is responsible in unmapping the header with * AcpiOsUnmapMemory * - *****************************************************************************/ + ******************************************************************************/ ACPI_STATUS AcpiGetTableHeader ( char *Signature, - ACPI_NATIVE_UINT Instance, + UINT32 Instance, ACPI_TABLE_HEADER *OutTableHeader) { - ACPI_NATIVE_UINT i; - ACPI_NATIVE_UINT j; + UINT32 i; + UINT32 j; ACPI_TABLE_HEADER *Header; @@ -338,9 +339,8 @@ AcpiGetTableHeader ( return (AE_BAD_PARAMETER); } - /* - * Walk the root table list - */ + /* Walk the root table list */ + for (i = 0, j = 0; i < AcpiGbl_RootTableList.Count; i++) { if (!ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature), @@ -356,10 +356,12 @@ AcpiGetTableHeader ( if (!AcpiGbl_RootTableList.Tables[i].Pointer) { - if ((AcpiGbl_RootTableList.Tables[i].Flags & ACPI_TABLE_ORIGIN_MASK) == + if ((AcpiGbl_RootTableList.Tables[i].Flags & + ACPI_TABLE_ORIGIN_MASK) == ACPI_TABLE_ORIGIN_MAPPED) { - Header = AcpiOsMapMemory (AcpiGbl_RootTableList.Tables[i].Address, + Header = AcpiOsMapMemory ( + AcpiGbl_RootTableList.Tables[i].Address, sizeof (ACPI_TABLE_HEADER)); if (!Header) { @@ -369,16 +371,15 @@ AcpiGetTableHeader ( ACPI_MEMCPY (OutTableHeader, Header, sizeof(ACPI_TABLE_HEADER)); AcpiOsUnmapMemory (Header, sizeof(ACPI_TABLE_HEADER)); } - else { return AE_NOT_FOUND; } } - else { - ACPI_MEMCPY (OutTableHeader, AcpiGbl_RootTableList.Tables[i].Pointer, + ACPI_MEMCPY (OutTableHeader, + AcpiGbl_RootTableList.Tables[i].Pointer, sizeof(ACPI_TABLE_HEADER)); } @@ -391,7 +392,7 @@ AcpiGetTableHeader ( ACPI_EXPORT_SYMBOL (AcpiGetTableHeader) -/****************************************************************************** +/******************************************************************************* * * FUNCTION: AcpiGetTable * @@ -403,16 +404,16 @@ ACPI_EXPORT_SYMBOL (AcpiGetTableHeader) * * DESCRIPTION: Finds and verifies an ACPI table. * - *****************************************************************************/ + ******************************************************************************/ ACPI_STATUS AcpiGetTable ( char *Signature, - ACPI_NATIVE_UINT Instance, + UINT32 Instance, ACPI_TABLE_HEADER **OutTable) { - ACPI_NATIVE_UINT i; - ACPI_NATIVE_UINT j; + UINT32 i; + UINT32 j; ACPI_STATUS Status; @@ -423,9 +424,8 @@ AcpiGetTable ( return (AE_BAD_PARAMETER); } - /* - * Walk the root table list - */ + /* Walk the root table list */ + for (i = 0, j = 0; i < AcpiGbl_RootTableList.Count; i++) { if (!ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature), @@ -469,7 +469,7 @@ ACPI_EXPORT_SYMBOL (AcpiGetTable) ACPI_STATUS AcpiGetTableByIndex ( - ACPI_NATIVE_UINT TableIndex, + UINT32 TableIndex, ACPI_TABLE_HEADER **Table) { ACPI_STATUS Status; @@ -533,9 +533,7 @@ AcpiTbLoadNamespace ( void) { ACPI_STATUS Status; - ACPI_TABLE_HEADER *Table; - ACPI_NATIVE_UINT i; - BOOLEAN DsdtOverriden; + UINT32 i; ACPI_FUNCTION_TRACE (TbLoadNamespace); @@ -548,76 +546,48 @@ AcpiTbLoadNamespace ( * are optional. */ if (!AcpiGbl_RootTableList.Count || - !ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Signature), - ACPI_SIG_DSDT) || - ACPI_FAILURE (AcpiTbVerifyTable(&AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT]))) + !ACPI_COMPARE_NAME ( + &(AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Signature), + ACPI_SIG_DSDT) || + ACPI_FAILURE (AcpiTbVerifyTable ( + &AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT]))) { Status = AE_NO_ACPI_TABLES; goto UnlockAndExit; } - /* - * Find DSDT table - */ - DsdtOverriden = FALSE; - Status = AcpiOsTableOverride ( - AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Pointer, &Table); - if (ACPI_SUCCESS (Status) && Table) - { - /* - * DSDT table has been found - */ - AcpiTbDeleteTable (&AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT]); - AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Pointer = Table; - AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Length = Table->Length; - AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Flags = ACPI_TABLE_ORIGIN_UNKNOWN; - DsdtOverriden = TRUE; + /* A valid DSDT is required */ - ACPI_INFO ((AE_INFO, "Table DSDT replaced by host OS")); - AcpiTbPrintTableHeader (0, Table); - } - - Status = AcpiTbVerifyTable (&AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT]); + Status = AcpiTbVerifyTable ( + &AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT]); if (ACPI_FAILURE (Status)) { - /* A valid DSDT is required */ - Status = AE_NO_ACPI_TABLES; goto UnlockAndExit; } (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES); - /* - * Load and parse tables. - */ + /* Load and parse tables */ + Status = AcpiNsLoadTable (ACPI_TABLE_INDEX_DSDT, AcpiGbl_RootNode); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } - /* - * Load any SSDT or PSDT tables. Note: Loop leaves tables locked - */ + /* Load any SSDT or PSDT tables. Note: Loop leaves tables locked */ + (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES); - for (i = 2; i < AcpiGbl_RootTableList.Count; ++i) + for (i = 0; i < AcpiGbl_RootTableList.Count; ++i) { if ((!ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature), ACPI_SIG_SSDT) && !ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature), ACPI_SIG_PSDT)) || - ACPI_FAILURE (AcpiTbVerifyTable (&AcpiGbl_RootTableList.Tables[i]))) - { - continue; - } - - /* Delete SSDT when DSDT is overriden */ - - if (ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature), - ACPI_SIG_SSDT) && DsdtOverriden) + ACPI_FAILURE (AcpiTbVerifyTable ( + &AcpiGbl_RootTableList.Tables[i]))) { - AcpiTbDeleteTable (&AcpiGbl_RootTableList.Tables[i]); continue; } @@ -658,13 +628,13 @@ AcpiLoadTables ( ACPI_FUNCTION_TRACE (AcpiLoadTables); - /* - * Load the namespace from the tables - */ + /* Load the namespace from the tables */ + Status = AcpiTbLoadNamespace (); if (ACPI_FAILURE (Status)) { - ACPI_EXCEPTION ((AE_INFO, Status, "While loading namespace from ACPI tables")); + ACPI_EXCEPTION ((AE_INFO, Status, + "While loading namespace from ACPI tables")); } return_ACPI_STATUS (Status); @@ -672,3 +642,109 @@ AcpiLoadTables ( ACPI_EXPORT_SYMBOL (AcpiLoadTables) + +/******************************************************************************* + * + * FUNCTION: AcpiInstallTableHandler + * + * PARAMETERS: Handler - Table event handler + * Context - Value passed to the handler on each event + * + * RETURN: Status + * + * DESCRIPTION: Install table event handler + * + ******************************************************************************/ + +ACPI_STATUS +AcpiInstallTableHandler ( + ACPI_TABLE_HANDLER Handler, + void *Context) +{ + ACPI_STATUS Status; + + + ACPI_FUNCTION_TRACE (AcpiInstallTableHandler); + + + if (!Handler) + { + return_ACPI_STATUS (AE_BAD_PARAMETER); + } + + Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS); + if (ACPI_FAILURE (Status)) + { + return_ACPI_STATUS (Status); + } + + /* Don't allow more than one handler */ + + if (AcpiGbl_TableHandler) + { + Status = AE_ALREADY_EXISTS; + goto Cleanup; + } + + /* Install the handler */ + + AcpiGbl_TableHandler = Handler; + AcpiGbl_TableHandlerContext = Context; + +Cleanup: + (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS); + return_ACPI_STATUS (Status); +} + +ACPI_EXPORT_SYMBOL (AcpiInstallTableHandler) + + +/******************************************************************************* + * + * FUNCTION: AcpiRemoveTableHandler + * + * PARAMETERS: Handler - Table event handler that was installed + * previously. + * + * RETURN: Status + * + * DESCRIPTION: Remove table event handler + * + ******************************************************************************/ + +ACPI_STATUS +AcpiRemoveTableHandler ( + ACPI_TABLE_HANDLER Handler) +{ + ACPI_STATUS Status; + + + ACPI_FUNCTION_TRACE (AcpiRemoveTableHandler); + + + Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS); + if (ACPI_FAILURE (Status)) + { + return_ACPI_STATUS (Status); + } + + /* Make sure that the installed handler is the same */ + + if (!Handler || + Handler != AcpiGbl_TableHandler) + { + Status = AE_BAD_PARAMETER; + goto Cleanup; + } + + /* Remove the handler */ + + AcpiGbl_TableHandler = NULL; + +Cleanup: + (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS); + return_ACPI_STATUS (Status); +} + +ACPI_EXPORT_SYMBOL (AcpiRemoveTableHandler) + |
