summaryrefslogtreecommitdiffstats
path: root/sys/contrib/dev/acpica/hwregs.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/dev/acpica/hwregs.c')
-rw-r--r--sys/contrib/dev/acpica/hwregs.c196
1 files changed, 96 insertions, 100 deletions
diff --git a/sys/contrib/dev/acpica/hwregs.c b/sys/contrib/dev/acpica/hwregs.c
index c06cbbf..19cdb81 100644
--- a/sys/contrib/dev/acpica/hwregs.c
+++ b/sys/contrib/dev/acpica/hwregs.c
@@ -3,7 +3,7 @@
*
* Module Name: hwregs - Read/write access functions for the various ACPI
* control and status registers.
- * $Revision: 142 $
+ * $Revision: 149 $
*
******************************************************************************/
@@ -120,6 +120,7 @@
#include "acpi.h"
#include "acnamesp.h"
+#include "acevents.h"
#define _COMPONENT ACPI_HARDWARE
ACPI_MODULE_NAME ("hwregs")
@@ -129,7 +130,7 @@
*
* FUNCTION: AcpiHwClearAcpiStatus
*
- * PARAMETERS: none
+ * PARAMETERS: Flags - Lock the hardware or not
*
* RETURN: none
*
@@ -138,11 +139,10 @@
******************************************************************************/
ACPI_STATUS
-AcpiHwClearAcpiStatus (void)
+AcpiHwClearAcpiStatus (
+ UINT32 Flags)
{
- ACPI_NATIVE_UINT i;
ACPI_STATUS Status;
- ACPI_GPE_BLOCK_INFO *GpeBlock;
ACPI_FUNCTION_TRACE ("HwClearAcpiStatus");
@@ -152,11 +152,13 @@ AcpiHwClearAcpiStatus (void)
ACPI_BITMASK_ALL_FIXED_STATUS,
(UINT16) ACPI_GET_ADDRESS (AcpiGbl_FADT->XPm1aEvtBlk.Address)));
-
- Status = AcpiUtAcquireMutex (ACPI_MTX_HARDWARE);
- if (ACPI_FAILURE (Status))
+ if (Flags & ACPI_MTX_LOCK)
{
- return_ACPI_STATUS (Status);
+ Status = AcpiUtAcquireMutex (ACPI_MTX_HARDWARE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
}
Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_STATUS,
@@ -171,7 +173,7 @@ AcpiHwClearAcpiStatus (void)
if (ACPI_VALID_ADDRESS (AcpiGbl_FADT->XPm1bEvtBlk.Address))
{
Status = AcpiHwLowLevelWrite (16, ACPI_BITMASK_ALL_FIXED_STATUS,
- &AcpiGbl_FADT->XPm1bEvtBlk, 0);
+ &AcpiGbl_FADT->XPm1bEvtBlk);
if (ACPI_FAILURE (Status))
{
goto UnlockAndExit;
@@ -180,24 +182,13 @@ AcpiHwClearAcpiStatus (void)
/* Clear the GPE Bits in all GPE registers in all GPE blocks */
- GpeBlock = AcpiGbl_GpeBlockListHead;
- while (GpeBlock)
- {
- for (i = 0; i < GpeBlock->RegisterCount; i++)
- {
- Status = AcpiHwLowLevelWrite (8, 0xFF,
- &GpeBlock->RegisterInfo[i].StatusAddress, (UINT32) 0);
- if (ACPI_FAILURE (Status))
- {
- goto UnlockAndExit;
- }
- }
-
- GpeBlock = GpeBlock->Next;
- }
+ Status = AcpiEvWalkGpeList (AcpiHwClearGpeBlock);
UnlockAndExit:
- (void) AcpiUtReleaseMutex (ACPI_MTX_HARDWARE);
+ if (Flags & ACPI_MTX_LOCK)
+ {
+ (void) AcpiUtReleaseMutex (ACPI_MTX_HARDWARE);
+ }
return_ACPI_STATUS (Status);
}
@@ -339,8 +330,9 @@ AcpiHwGetBitRegisterInfo (
*
* FUNCTION: AcpiGetRegister
*
- * PARAMETERS: RegisterId - Index of ACPI Register to access
- * UseLock - Lock the hardware
+ * PARAMETERS: RegisterId - ID of ACPI BitRegister to access
+ * ReturnValue - Value that was read from the register
+ * Flags - Lock the hardware or not
*
* RETURN: Value is read from specified Register. Value returned is
* normalized to bit0 (is shifted all the way right)
@@ -397,7 +389,8 @@ AcpiGetRegister (
*ReturnValue = RegisterValue;
- ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Read value %X\n", RegisterValue));
+ ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Read value %8.8X register %X\n",
+ RegisterValue, BitRegInfo->ParentRegister));
}
return_ACPI_STATUS (Status);
@@ -510,8 +503,8 @@ AcpiSetRegister (
ACPI_REGISTER_INSERT_VALUE (RegisterValue, BitRegInfo->BitPosition,
BitRegInfo->AccessBitMask, Value);
- Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,
- ACPI_REGISTER_PM1_CONTROL, (UINT16) RegisterValue);
+ Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, RegisterId,
+ (UINT16) RegisterValue);
break;
@@ -558,7 +551,8 @@ UnlockAndExit:
ACPI_DEBUG_EXEC (RegisterValue = ((RegisterValue & BitRegInfo->AccessBitMask) >> BitRegInfo->BitPosition));
- ACPI_DEBUG_PRINT ((ACPI_DB_IO, "ACPI Register Write actual %X\n", RegisterValue));
+ ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Set bits: %8.8X actual %8.8X register %X\n",
+ Value, RegisterValue, BitRegInfo->ParentRegister));
return_ACPI_STATUS (Status);
}
@@ -585,7 +579,6 @@ AcpiHwRegisterRead (
{
UINT32 Value1 = 0;
UINT32 Value2 = 0;
- UINT32 BankOffset;
ACPI_STATUS Status;
@@ -605,53 +598,56 @@ AcpiHwRegisterRead (
{
case ACPI_REGISTER_PM1_STATUS: /* 16-bit access */
- Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_FADT->XPm1aEvtBlk, 0);
+ Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_FADT->XPm1aEvtBlk);
if (ACPI_FAILURE (Status))
{
goto UnlockAndExit;
}
- Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_FADT->XPm1bEvtBlk, 0);
+ /* PM1B is optional */
+
+ Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_FADT->XPm1bEvtBlk);
Value1 |= Value2;
break;
- case ACPI_REGISTER_PM1_ENABLE: /* 16-bit access*/
+ case ACPI_REGISTER_PM1_ENABLE: /* 16-bit access */
- BankOffset = ACPI_DIV_2 (AcpiGbl_FADT->Pm1EvtLen);
- Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_FADT->XPm1aEvtBlk, BankOffset);
+ Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_XPm1aEnable);
if (ACPI_FAILURE (Status))
{
goto UnlockAndExit;
}
- Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_FADT->XPm1bEvtBlk, BankOffset);
+ /* PM1B is optional */
+
+ Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_XPm1bEnable);
Value1 |= Value2;
break;
case ACPI_REGISTER_PM1_CONTROL: /* 16-bit access */
- Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_FADT->XPm1aCntBlk, 0);
+ Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_FADT->XPm1aCntBlk);
if (ACPI_FAILURE (Status))
{
goto UnlockAndExit;
}
- Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_FADT->XPm1bCntBlk, 0);
+ Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_FADT->XPm1bCntBlk);
Value1 |= Value2;
break;
case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */
- Status = AcpiHwLowLevelRead (8, &Value1, &AcpiGbl_FADT->XPm2CntBlk, 0);
+ Status = AcpiHwLowLevelRead (8, &Value1, &AcpiGbl_FADT->XPm2CntBlk);
break;
case ACPI_REGISTER_PM_TIMER: /* 32-bit access */
- Status = AcpiHwLowLevelRead (32, &Value1, &AcpiGbl_FADT->XPmTmrBlk, 0);
+ Status = AcpiHwLowLevelRead (32, &Value1, &AcpiGbl_FADT->XPmTmrBlk);
break;
case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */
@@ -700,7 +696,6 @@ AcpiHwRegisterWrite (
UINT32 RegisterId,
UINT32 Value)
{
- UINT32 BankOffset;
ACPI_STATUS Status;
@@ -720,62 +715,65 @@ AcpiHwRegisterWrite (
{
case ACPI_REGISTER_PM1_STATUS: /* 16-bit access */
- Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1aEvtBlk, 0);
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1aEvtBlk);
if (ACPI_FAILURE (Status))
{
goto UnlockAndExit;
}
- Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1bEvtBlk, 0);
+ /* PM1B is optional */
+
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1bEvtBlk);
break;
case ACPI_REGISTER_PM1_ENABLE: /* 16-bit access*/
- BankOffset = ACPI_DIV_2 (AcpiGbl_FADT->Pm1EvtLen);
- Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1aEvtBlk, BankOffset);
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_XPm1aEnable);
if (ACPI_FAILURE (Status))
{
goto UnlockAndExit;
}
- Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1bEvtBlk, BankOffset);
+ /* PM1B is optional */
+
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_XPm1bEnable);
break;
case ACPI_REGISTER_PM1_CONTROL: /* 16-bit access */
- Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1aCntBlk, 0);
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1aCntBlk);
if (ACPI_FAILURE (Status))
{
goto UnlockAndExit;
}
- Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1bCntBlk, 0);
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1bCntBlk);
break;
case ACPI_REGISTER_PM1A_CONTROL: /* 16-bit access */
- Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1aCntBlk, 0);
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1aCntBlk);
break;
case ACPI_REGISTER_PM1B_CONTROL: /* 16-bit access */
- Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1bCntBlk, 0);
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1bCntBlk);
break;
case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */
- Status = AcpiHwLowLevelWrite (8, Value, &AcpiGbl_FADT->XPm2CntBlk, 0);
+ Status = AcpiHwLowLevelWrite (8, Value, &AcpiGbl_FADT->XPm2CntBlk);
break;
case ACPI_REGISTER_PM_TIMER: /* 32-bit access */
- Status = AcpiHwLowLevelWrite (32, Value, &AcpiGbl_FADT->XPmTmrBlk, 0);
+ Status = AcpiHwLowLevelWrite (32, Value, &AcpiGbl_FADT->XPmTmrBlk);
break;
@@ -783,7 +781,7 @@ AcpiHwRegisterWrite (
/* SMI_CMD is currently always in IO space */
- Status = AcpiOsWritePort (AcpiGbl_FADT->SmiCmd, (ACPI_INTEGER) Value, 8);
+ Status = AcpiOsWritePort (AcpiGbl_FADT->SmiCmd, Value, 8);
break;
@@ -806,11 +804,11 @@ UnlockAndExit:
*
* FUNCTION: AcpiHwLowLevelRead
*
- * PARAMETERS: Register - GAS register structure
- * Offset - Offset from the base address in the GAS
- * Width - 8, 16, or 32
+ * PARAMETERS: Width - 8, 16, or 32
+ * Value - Where the value is returned
+ * Register - GAS register structure
*
- * RETURN: Value read
+ * RETURN: Status
*
* DESCRIPTION: Read from either memory, IO, or PCI config space.
*
@@ -820,11 +818,8 @@ ACPI_STATUS
AcpiHwLowLevelRead (
UINT32 Width,
UINT32 *Value,
- ACPI_GENERIC_ADDRESS *Reg,
- UINT32 Offset)
+ ACPI_GENERIC_ADDRESS *Reg)
{
- ACPI_PHYSICAL_ADDRESS MemAddress;
- ACPI_IO_ADDRESS IoAddress;
ACPI_PCI_ID PciId;
UINT16 PciRegister;
ACPI_STATUS Status;
@@ -853,19 +848,16 @@ AcpiHwLowLevelRead (
{
case ACPI_ADR_SPACE_SYSTEM_MEMORY:
- MemAddress = (ACPI_GET_ADDRESS (Reg->Address)
- + (ACPI_PHYSICAL_ADDRESS) Offset);
-
- Status = AcpiOsReadMemory (MemAddress, Value, Width);
+ Status = AcpiOsReadMemory (
+ (ACPI_PHYSICAL_ADDRESS) ACPI_GET_ADDRESS (Reg->Address),
+ Value, Width);
break;
case ACPI_ADR_SPACE_SYSTEM_IO:
- IoAddress = (ACPI_IO_ADDRESS) (ACPI_GET_ADDRESS (Reg->Address)
- + (ACPI_PHYSICAL_ADDRESS) Offset);
-
- Status = AcpiOsReadPort (IoAddress, Value, Width);
+ Status = AcpiOsReadPort ((ACPI_IO_ADDRESS) ACPI_GET_ADDRESS (Reg->Address),
+ Value, Width);
break;
@@ -875,19 +867,25 @@ AcpiHwLowLevelRead (
PciId.Bus = 0;
PciId.Device = ACPI_PCI_DEVICE (ACPI_GET_ADDRESS (Reg->Address));
PciId.Function = ACPI_PCI_FUNCTION (ACPI_GET_ADDRESS (Reg->Address));
- PciRegister = (UINT16) (ACPI_PCI_REGISTER (ACPI_GET_ADDRESS (Reg->Address))
- + Offset);
+ PciRegister = (UINT16) ACPI_PCI_REGISTER (ACPI_GET_ADDRESS (Reg->Address));
- Status = AcpiOsReadPciConfiguration (&PciId, PciRegister, Value, Width);
+ Status = AcpiOsReadPciConfiguration (&PciId, PciRegister,
+ Value, Width);
break;
default:
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unsupported address space: %X\n", Reg->AddressSpaceId));
- Status = AE_BAD_PARAMETER;
- break;
+ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
+ "Unsupported address space: %X\n", Reg->AddressSpaceId));
+ return (AE_BAD_PARAMETER);
}
+ ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Read: %8.8X width %2d from %8.8X%8.8X (%s)\n",
+ *Value, Width,
+ ACPI_HIDWORD (ACPI_GET_ADDRESS (Reg->Address)),
+ ACPI_LODWORD (ACPI_GET_ADDRESS (Reg->Address)),
+ AcpiUtGetRegionName (Reg->AddressSpaceId)));
+
return (Status);
}
@@ -899,12 +897,10 @@ AcpiHwLowLevelRead (
* PARAMETERS: Width - 8, 16, or 32
* Value - To be written
* Register - GAS register structure
- * Offset - Offset from the base address in the GAS
*
+ * RETURN: Status
*
- * RETURN: Value read
- *
- * DESCRIPTION: Read from either memory, IO, or PCI config space.
+ * DESCRIPTION: Write to either memory, IO, or PCI config space.
*
******************************************************************************/
@@ -912,11 +908,8 @@ ACPI_STATUS
AcpiHwLowLevelWrite (
UINT32 Width,
UINT32 Value,
- ACPI_GENERIC_ADDRESS *Reg,
- UINT32 Offset)
+ ACPI_GENERIC_ADDRESS *Reg)
{
- ACPI_PHYSICAL_ADDRESS MemAddress;
- ACPI_IO_ADDRESS IoAddress;
ACPI_PCI_ID PciId;
UINT16 PciRegister;
ACPI_STATUS Status;
@@ -943,19 +936,16 @@ AcpiHwLowLevelWrite (
{
case ACPI_ADR_SPACE_SYSTEM_MEMORY:
- MemAddress = (ACPI_GET_ADDRESS (Reg->Address)
- + (ACPI_PHYSICAL_ADDRESS) Offset);
-
- Status = AcpiOsWriteMemory (MemAddress, (ACPI_INTEGER) Value, Width);
+ Status = AcpiOsWriteMemory (
+ (ACPI_PHYSICAL_ADDRESS) ACPI_GET_ADDRESS (Reg->Address),
+ Value, Width);
break;
case ACPI_ADR_SPACE_SYSTEM_IO:
- IoAddress = (ACPI_IO_ADDRESS) (ACPI_GET_ADDRESS (Reg->Address)
- + (ACPI_PHYSICAL_ADDRESS) Offset);
-
- Status = AcpiOsWritePort (IoAddress, (ACPI_INTEGER) Value, Width);
+ Status = AcpiOsWritePort ((ACPI_IO_ADDRESS) ACPI_GET_ADDRESS (Reg->Address),
+ Value, Width);
break;
@@ -965,18 +955,24 @@ AcpiHwLowLevelWrite (
PciId.Bus = 0;
PciId.Device = ACPI_PCI_DEVICE (ACPI_GET_ADDRESS (Reg->Address));
PciId.Function = ACPI_PCI_FUNCTION (ACPI_GET_ADDRESS (Reg->Address));
- PciRegister = (UINT16) (ACPI_PCI_REGISTER (ACPI_GET_ADDRESS (Reg->Address))
- + Offset);
+ PciRegister = (UINT16) ACPI_PCI_REGISTER (ACPI_GET_ADDRESS (Reg->Address));
- Status = AcpiOsWritePciConfiguration (&PciId, PciRegister, (ACPI_INTEGER) Value, Width);
+ Status = AcpiOsWritePciConfiguration (&PciId, PciRegister,
+ (ACPI_INTEGER) Value, Width);
break;
default:
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unsupported address space: %X\n", Reg->AddressSpaceId));
- Status = AE_BAD_PARAMETER;
- break;
+ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
+ "Unsupported address space: %X\n", Reg->AddressSpaceId));
+ return (AE_BAD_PARAMETER);
}
+ ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Wrote: %8.8X width %2d to %8.8X%8.8X (%s)\n",
+ Value, Width,
+ ACPI_HIDWORD (ACPI_GET_ADDRESS (Reg->Address)),
+ ACPI_LODWORD (ACPI_GET_ADDRESS (Reg->Address)),
+ AcpiUtGetRegionName (Reg->AddressSpaceId)));
+
return (Status);
}
OpenPOWER on IntegriCloud