aboutsummaryrefslogtreecommitdiff
path: root/tables/tbxface.c
diff options
context:
space:
mode:
Diffstat (limited to 'tables/tbxface.c')
-rw-r--r--tables/tbxface.c230
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)
+