Convert hardware mutex to a spinlock, since code is used at xrupt level

This commit is contained in:
rmoore1 2006-06-02 21:24:57 +00:00
parent caea6bf655
commit 65ec4b8914
4 changed files with 52 additions and 44 deletions

View File

@ -3,7 +3,7 @@
*
* Module Name: hwregs - Read/write access functions for the various ACPI
* control and status registers.
* $Revision: 1.179 $
* $Revision: 1.180 $
*
******************************************************************************/
@ -144,6 +144,7 @@ AcpiHwClearAcpiStatus (
UINT32 Flags)
{
ACPI_STATUS Status;
ACPI_CPU_FLAGS LockFlags = 0;
ACPI_FUNCTION_TRACE (HwClearAcpiStatus);
@ -155,11 +156,7 @@ AcpiHwClearAcpiStatus (
if (Flags & ACPI_MTX_LOCK)
{
Status = AcpiUtAcquireMutex (ACPI_MTX_HARDWARE);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock);
}
Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,
@ -189,7 +186,7 @@ AcpiHwClearAcpiStatus (
UnlockAndExit:
if (Flags & ACPI_MTX_LOCK)
{
(void) AcpiUtReleaseMutex (ACPI_MTX_HARDWARE);
AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);
}
return_ACPI_STATUS (Status);
}
@ -378,6 +375,7 @@ AcpiGetRegister (
UINT32 RegisterValue = 0;
ACPI_BIT_REGISTER_INFO *BitRegInfo;
ACPI_STATUS Status;
ACPI_CPU_FLAGS LockFlags = 0;
ACPI_FUNCTION_TRACE (AcpiGetRegister);
@ -393,11 +391,7 @@ AcpiGetRegister (
if (Flags & ACPI_MTX_LOCK)
{
Status = AcpiUtAcquireMutex (ACPI_MTX_HARDWARE);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock);
}
/* Read from the register */
@ -407,7 +401,7 @@ AcpiGetRegister (
if (Flags & ACPI_MTX_LOCK)
{
(void) AcpiUtReleaseMutex (ACPI_MTX_HARDWARE);
AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);
}
if (ACPI_SUCCESS (Status))
@ -453,6 +447,7 @@ AcpiSetRegister (
UINT32 RegisterValue = 0;
ACPI_BIT_REGISTER_INFO *BitRegInfo;
ACPI_STATUS Status;
ACPI_CPU_FLAGS LockFlags = 0;
ACPI_FUNCTION_TRACE_U32 (AcpiSetRegister, RegisterId);
@ -469,11 +464,7 @@ AcpiSetRegister (
if (Flags & ACPI_MTX_LOCK)
{
Status = AcpiUtAcquireMutex (ACPI_MTX_HARDWARE);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock);
}
/* Always do a register read first so we can insert the new bits */
@ -576,7 +567,7 @@ UnlockAndExit:
if (Flags & ACPI_MTX_LOCK)
{
(void) AcpiUtReleaseMutex (ACPI_MTX_HARDWARE);
AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);
}
/* Normalize the value that was read */
@ -617,6 +608,7 @@ AcpiHwRegisterRead (
UINT32 Value1 = 0;
UINT32 Value2 = 0;
ACPI_STATUS Status;
ACPI_CPU_FLAGS LockFlags = 0;
ACPI_FUNCTION_TRACE (HwRegisterRead);
@ -624,11 +616,7 @@ AcpiHwRegisterRead (
if (ACPI_MTX_LOCK == UseLock)
{
Status = AcpiUtAcquireMutex (ACPI_MTX_HARDWARE);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock);
}
switch (RegisterId)
@ -702,7 +690,7 @@ AcpiHwRegisterRead (
UnlockAndExit:
if (ACPI_MTX_LOCK == UseLock)
{
(void) AcpiUtReleaseMutex (ACPI_MTX_HARDWARE);
AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);
}
if (ACPI_SUCCESS (Status))
@ -736,6 +724,7 @@ AcpiHwRegisterWrite (
UINT32 Value)
{
ACPI_STATUS Status;
ACPI_CPU_FLAGS LockFlags = 0;
ACPI_FUNCTION_TRACE (HwRegisterWrite);
@ -743,11 +732,7 @@ AcpiHwRegisterWrite (
if (ACPI_MTX_LOCK == UseLock)
{
Status = AcpiUtAcquireMutex (ACPI_MTX_HARDWARE);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock);
}
switch (RegisterId)
@ -832,7 +817,7 @@ AcpiHwRegisterWrite (
UnlockAndExit:
if (ACPI_MTX_LOCK == UseLock)
{
(void) AcpiUtReleaseMutex (ACPI_MTX_HARDWARE);
AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);
}
return_ACPI_STATUS (Status);

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: utmutex - local mutex support
* $Revision: 1.9 $
* $Revision: 1.10 $
*
******************************************************************************/
@ -168,7 +168,15 @@ AcpiUtMutexInitialize (
}
}
/* Create the spinlocks for use at interrupt level */
Status = AcpiOsCreateLock (&AcpiGbl_GpeLock);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
Status = AcpiOsCreateLock (&AcpiGbl_HardwareLock);
return_ACPI_STATUS (Status);
}
@ -203,7 +211,10 @@ AcpiUtMutexTerminate (
(void) AcpiUtDeleteMutex (i);
}
/* Delete the spinlocks */
AcpiOsDeleteLock (AcpiGbl_GpeLock);
AcpiOsDeleteLock (AcpiGbl_HardwareLock);
return_VOID;
}

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: acglobal.h - Declarations for global variables
* $Revision: 1.181 $
* $Revision: 1.182 $
*
*****************************************************************************/
@ -393,7 +393,11 @@ extern ACPI_FIXED_EVENT_INFO AcpiGbl_FixedEventInfo[ACPI_NUM_FIXED_EV
ACPI_EXTERN ACPI_FIXED_EVENT_HANDLER AcpiGbl_FixedEventHandlers[ACPI_NUM_FIXED_EVENTS];
ACPI_EXTERN ACPI_GPE_XRUPT_INFO *AcpiGbl_GpeXruptListHead;
ACPI_EXTERN ACPI_GPE_BLOCK_INFO *AcpiGbl_GpeFadtBlocks[ACPI_MAX_GPE_BLOCKS];
/* Spinlocks */
ACPI_EXTERN ACPI_HANDLE AcpiGbl_GpeLock;
ACPI_EXTERN ACPI_HANDLE AcpiGbl_HardwareLock;
/*****************************************************************************

View File

@ -1,7 +1,7 @@
/******************************************************************************
*
* Name: aclocal.h - Internal data types used across the ACPI subsystem
* $Revision: 1.231 $
* $Revision: 1.232 $
*
*****************************************************************************/
@ -156,24 +156,22 @@ union acpi_parse_object;
* table below also!
*/
#define ACPI_MTX_INTERPRETER 0 /* AML Interpreter, main lock */
#define ACPI_MTX_CONTROL_METHOD 1 /* Control method termination */
#define ACPI_MTX_CONTROL_METHOD 1 /* Control method termination [TBD: may no longer be necessary] */
#define ACPI_MTX_TABLES 2 /* Data for ACPI tables */
#define ACPI_MTX_NAMESPACE 3 /* ACPI Namespace */
#define ACPI_MTX_EVENTS 4 /* Data for ACPI events */
#define ACPI_MTX_HARDWARE 5 /* ACPI registers */
#define ACPI_MTX_CACHES 6 /* Internal caches, general purposes */
#define ACPI_MTX_MEMORY 7 /* Debug memory tracking lists */
#define ACPI_MTX_DEBUG_CMD_COMPLETE 8 /* AML debugger */
#define ACPI_MTX_DEBUG_CMD_READY 9 /* AML debugger */
#define ACPI_MTX_CACHES 5 /* Internal caches, general purposes */
#define ACPI_MTX_MEMORY 6 /* Debug memory tracking lists */
#define ACPI_MTX_DEBUG_CMD_COMPLETE 7 /* AML debugger */
#define ACPI_MTX_DEBUG_CMD_READY 8 /* AML debugger */
#define ACPI_MAX_MUTEX 9
#define ACPI_MAX_MUTEX 8
#define ACPI_NUM_MUTEX ACPI_MAX_MUTEX+1
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
#ifdef DEFINE_ACPI_GLOBALS
/* Names for the mutexes used in the subsystem */
/* Debug names for the mutexes above */
static char *AcpiGbl_MutexNames[ACPI_NUM_MUTEX] =
{
@ -182,7 +180,6 @@ static char *AcpiGbl_MutexNames[ACPI_NUM_MUTEX] =
"ACPI_MTX_Tables",
"ACPI_MTX_Namespace",
"ACPI_MTX_Events",
"ACPI_MTX_Hardware",
"ACPI_MTX_Caches",
"ACPI_MTX_Memory",
"ACPI_MTX_DebugCmdComplete",
@ -193,6 +190,17 @@ static char *AcpiGbl_MutexNames[ACPI_NUM_MUTEX] =
#endif
/*
* Predefined handles for spinlocks used within the subsystem.
* These spinlocks are created by AcpiUtMutexInitialize
*/
#define ACPI_LOCK_GPES 0
#define ACPI_LOCK_HARDWARE 1
#define ACPI_MAX_LOCK 1
#define ACPI_NUM_LOCK ACPI_MAX_LOCK+1
/* Owner IDs are used to track namespace nodes for selective deletion */
typedef UINT8 ACPI_OWNER_ID;