New: AcpiRead and AcpiWrite public interfaces.

Changed the HwLowLevelRead and HwLowLevelWrite functions to the public
AcpiRead and AcpiWrite to allow direct access to ACPI registers.
Removed the "width" parameter since the width can be obtained from the
input GAS structure. Updated the FADT initialization to setup the GAS
structures with the proper widths. Some widths are still hardcoded
because many FADTs have incorrect register lengths.
This commit is contained in:
Robert Moore 2008-11-19 12:22:13 -08:00 committed by Ming M. Lin
parent 73b9a81c06
commit 8ce404a262
9 changed files with 106 additions and 79 deletions

View File

@ -542,8 +542,7 @@ AcpiEvGpeDetect (
/* Read the Status Register */
Status = AcpiHwLowLevelRead (ACPI_GPE_REGISTER_WIDTH, &StatusReg,
&GpeRegisterInfo->StatusAddress);
Status = AcpiRead (&StatusReg, &GpeRegisterInfo->StatusAddress);
if (ACPI_FAILURE (Status))
{
goto UnlockAndExit;
@ -551,8 +550,7 @@ AcpiEvGpeDetect (
/* Read the Enable Register */
Status = AcpiHwLowLevelRead (ACPI_GPE_REGISTER_WIDTH, &EnableReg,
&GpeRegisterInfo->EnableAddress);
Status = AcpiRead (&EnableReg, &GpeRegisterInfo->EnableAddress);
if (ACPI_FAILURE (Status))
{
goto UnlockAndExit;

View File

@ -972,8 +972,8 @@ AcpiEvCreateGpeInfoBlocks (
ThisRegister->EnableAddress.SpaceId = GpeBlock->BlockAddress.SpaceId;
ThisRegister->StatusAddress.BitWidth = ACPI_GPE_REGISTER_WIDTH;
ThisRegister->EnableAddress.BitWidth = ACPI_GPE_REGISTER_WIDTH;
ThisRegister->StatusAddress.BitOffset = ACPI_GPE_REGISTER_WIDTH;
ThisRegister->EnableAddress.BitOffset = ACPI_GPE_REGISTER_WIDTH;
ThisRegister->StatusAddress.BitOffset = 0;
ThisRegister->EnableAddress.BitOffset = 0;
/* Init the EventInfo for each GPE within this register */
@ -986,8 +986,7 @@ AcpiEvCreateGpeInfoBlocks (
/* Disable all GPEs within this register */
Status = AcpiHwLowLevelWrite (ACPI_GPE_REGISTER_WIDTH, 0x00,
&ThisRegister->EnableAddress);
Status = AcpiWrite (0x00, &ThisRegister->EnableAddress);
if (ACPI_FAILURE (Status))
{
goto ErrorExit;
@ -995,8 +994,7 @@ AcpiEvCreateGpeInfoBlocks (
/* Clear any pending GPE events within this register */
Status = AcpiHwLowLevelWrite (ACPI_GPE_REGISTER_WIDTH, 0xFF,
&ThisRegister->StatusAddress);
Status = AcpiWrite (0xFF, &ThisRegister->StatusAddress);
if (ACPI_FAILURE (Status))
{
goto ErrorExit;

View File

@ -161,8 +161,7 @@ AcpiHwLowDisableGpe (
/* Get current value of the enable register that contains this GPE */
Status = AcpiHwLowLevelRead (ACPI_GPE_REGISTER_WIDTH, &EnableMask,
&GpeRegisterInfo->EnableAddress);
Status = AcpiRead (&EnableMask, &GpeRegisterInfo->EnableAddress);
if (ACPI_FAILURE (Status))
{
return (Status);
@ -176,9 +175,7 @@ AcpiHwLowDisableGpe (
/* Write the updated enable mask */
Status = AcpiHwLowLevelWrite (ACPI_GPE_REGISTER_WIDTH, EnableMask,
&GpeRegisterInfo->EnableAddress);
Status = AcpiWrite (EnableMask, &GpeRegisterInfo->EnableAddress);
return (Status);
}
@ -218,7 +215,7 @@ AcpiHwWriteGpeEnableReg (
/* Write the entire GPE (runtime) enable register */
Status = AcpiHwLowLevelWrite (8, GpeRegisterInfo->EnableForRun,
Status = AcpiWrite (GpeRegisterInfo->EnableForRun,
&GpeRegisterInfo->EnableAddress);
return (Status);
@ -255,7 +252,7 @@ AcpiHwClearGpe (
* Write a one to the appropriate bit in the status register to
* clear this GPE.
*/
Status = AcpiHwLowLevelWrite (8, RegisterBit,
Status = AcpiWrite (RegisterBit,
&GpeEventInfo->RegisterInfo->StatusAddress);
return (Status);
@ -320,7 +317,7 @@ AcpiHwGetGpeStatus (
/* GPE currently active (status bit == 1)? */
Status = AcpiHwLowLevelRead (8, &InByte, &GpeRegisterInfo->StatusAddress);
Status = AcpiRead (&InByte, &GpeRegisterInfo->StatusAddress);
if (ACPI_FAILURE (Status))
{
goto UnlockAndExit;
@ -370,8 +367,7 @@ AcpiHwDisableGpeBlock (
{
/* Disable all GPEs in this register */
Status = AcpiHwLowLevelWrite (8, 0x00,
&GpeBlock->RegisterInfo[i].EnableAddress);
Status = AcpiWrite (0x00, &GpeBlock->RegisterInfo[i].EnableAddress);
if (ACPI_FAILURE (Status))
{
return (Status);
@ -411,8 +407,7 @@ AcpiHwClearGpeBlock (
{
/* Clear status on all GPEs in this register */
Status = AcpiHwLowLevelWrite (8, 0xFF,
&GpeBlock->RegisterInfo[i].StatusAddress);
Status = AcpiWrite (0xFF, &GpeBlock->RegisterInfo[i].StatusAddress);
if (ACPI_FAILURE (Status))
{
return (Status);
@ -460,7 +455,7 @@ AcpiHwEnableRuntimeGpeBlock (
/* Enable all "runtime" GPEs in this register */
Status = AcpiHwLowLevelWrite (8, GpeBlock->RegisterInfo[i].EnableForRun,
Status = AcpiWrite (GpeBlock->RegisterInfo[i].EnableForRun,
&GpeBlock->RegisterInfo[i].EnableAddress);
if (ACPI_FAILURE (Status))
{
@ -507,8 +502,7 @@ AcpiHwEnableWakeupGpeBlock (
/* Enable all "wake" GPEs in this register */
Status = AcpiHwLowLevelWrite (8,
GpeBlock->RegisterInfo[i].EnableForWake,
Status = AcpiWrite (GpeBlock->RegisterInfo[i].EnableForWake,
&GpeBlock->RegisterInfo[i].EnableAddress);
if (ACPI_FAILURE (Status))
{

View File

@ -167,7 +167,7 @@ AcpiHwClearAcpiStatus (
if (AcpiGbl_FADT.XPm1bEventBlock.Address)
{
Status = AcpiHwLowLevelWrite (16, ACPI_BITMASK_ALL_FIXED_STATUS,
Status = AcpiWrite (ACPI_BITMASK_ALL_FIXED_STATUS,
&AcpiGbl_FADT.XPm1bEventBlock);
if (ACPI_FAILURE (Status))
{
@ -400,6 +400,8 @@ AcpiGetRegisterUnlocked (
return_ACPI_STATUS (Status);
}
ACPI_EXPORT_SYMBOL (AcpiGetRegisterUnlocked)
/*******************************************************************************
*
@ -616,7 +618,7 @@ AcpiHwRegisterRead (
{
case ACPI_REGISTER_PM1_STATUS: /* 16-bit access */
Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_FADT.XPm1aEventBlock);
Status = AcpiRead (&Value1, &AcpiGbl_FADT.XPm1aEventBlock);
if (ACPI_FAILURE (Status))
{
goto Exit;
@ -624,14 +626,14 @@ AcpiHwRegisterRead (
/* PM1B is optional */
Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_FADT.XPm1bEventBlock);
Status = AcpiRead (&Value2, &AcpiGbl_FADT.XPm1bEventBlock);
Value1 |= Value2;
break;
case ACPI_REGISTER_PM1_ENABLE: /* 16-bit access */
Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_XPm1aEnable);
Status = AcpiRead (&Value1, &AcpiGbl_XPm1aEnable);
if (ACPI_FAILURE (Status))
{
goto Exit;
@ -639,33 +641,33 @@ AcpiHwRegisterRead (
/* PM1B is optional */
Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_XPm1bEnable);
Status = AcpiRead (&Value2, &AcpiGbl_XPm1bEnable);
Value1 |= Value2;
break;
case ACPI_REGISTER_PM1_CONTROL: /* 16-bit access */
Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_FADT.XPm1aControlBlock);
Status = AcpiRead (&Value1, &AcpiGbl_FADT.XPm1aControlBlock);
if (ACPI_FAILURE (Status))
{
goto Exit;
}
Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_FADT.XPm1bControlBlock);
Status = AcpiRead (&Value2, &AcpiGbl_FADT.XPm1bControlBlock);
Value1 |= Value2;
break;
case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */
Status = AcpiHwLowLevelRead (8, &Value1, &AcpiGbl_FADT.XPm2ControlBlock);
Status = AcpiRead (&Value1, &AcpiGbl_FADT.XPm2ControlBlock);
break;
case ACPI_REGISTER_PM_TIMER: /* 32-bit access */
Status = AcpiHwLowLevelRead (32, &Value1, &AcpiGbl_FADT.XPmTimerBlock);
Status = AcpiRead (&Value1, &AcpiGbl_FADT.XPmTimerBlock);
break;
case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */
@ -747,7 +749,7 @@ AcpiHwRegisterWrite (
/* Now we can write the data */
Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1aEventBlock);
Status = AcpiWrite (Value, &AcpiGbl_FADT.XPm1aEventBlock);
if (ACPI_FAILURE (Status))
{
goto Exit;
@ -755,13 +757,13 @@ AcpiHwRegisterWrite (
/* PM1B is optional */
Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1bEventBlock);
Status = AcpiWrite (Value, &AcpiGbl_FADT.XPm1bEventBlock);
break;
case ACPI_REGISTER_PM1_ENABLE: /* 16-bit access */
Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_XPm1aEnable);
Status = AcpiWrite (Value, &AcpiGbl_XPm1aEnable);
if (ACPI_FAILURE (Status))
{
goto Exit;
@ -769,7 +771,7 @@ AcpiHwRegisterWrite (
/* PM1B is optional */
Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_XPm1bEnable);
Status = AcpiWrite (Value, &AcpiGbl_XPm1bEnable);
break;
@ -793,37 +795,37 @@ AcpiHwRegisterWrite (
/* Now we can write the data */
Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1aControlBlock);
Status = AcpiWrite (Value, &AcpiGbl_FADT.XPm1aControlBlock);
if (ACPI_FAILURE (Status))
{
goto Exit;
}
Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1bControlBlock);
Status = AcpiWrite (Value, &AcpiGbl_FADT.XPm1bControlBlock);
break;
case ACPI_REGISTER_PM1A_CONTROL: /* 16-bit access */
Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1aControlBlock);
Status = AcpiWrite (Value, &AcpiGbl_FADT.XPm1aControlBlock);
break;
case ACPI_REGISTER_PM1B_CONTROL: /* 16-bit access */
Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1bControlBlock);
Status = AcpiWrite (Value, &AcpiGbl_FADT.XPm1bControlBlock);
break;
case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */
Status = AcpiHwLowLevelWrite (8, Value, &AcpiGbl_FADT.XPm2ControlBlock);
Status = AcpiWrite (Value, &AcpiGbl_FADT.XPm2ControlBlock);
break;
case ACPI_REGISTER_PM_TIMER: /* 32-bit access */
Status = AcpiHwLowLevelWrite (32, Value, &AcpiGbl_FADT.XPmTimerBlock);
Status = AcpiWrite (Value, &AcpiGbl_FADT.XPmTimerBlock);
break;
@ -847,10 +849,9 @@ Exit:
/******************************************************************************
*
* FUNCTION: AcpiHwLowLevelRead
* FUNCTION: AcpiRead
*
* PARAMETERS: Width - 8, 16, or 32
* Value - Where the value is returned
* PARAMETERS: Value - Where the value is returned
* Reg - GAS register structure
*
* RETURN: Status
@ -860,16 +861,16 @@ Exit:
******************************************************************************/
ACPI_STATUS
AcpiHwLowLevelRead (
UINT32 Width,
AcpiRead (
UINT32 *Value,
ACPI_GENERIC_ADDRESS *Reg)
{
UINT32 Width;
UINT64 Address;
ACPI_STATUS Status;
ACPI_FUNCTION_NAME (HwLowLevelRead);
ACPI_FUNCTION_NAME (AcpiRead);
/*
@ -889,6 +890,17 @@ AcpiHwLowLevelRead (
{
return (AE_OK);
}
/* Supported widths are 8/16/32 */
Width = Reg->BitWidth;
if ((Width != 8) && (Width != 16) && (Width != 32))
{
return (AE_SUPPORT);
}
/* Initialize entire 32-bit return value to zero */
*Value = 0;
/*
@ -924,13 +936,14 @@ AcpiHwLowLevelRead (
return (Status);
}
ACPI_EXPORT_SYMBOL (AcpiRead)
/******************************************************************************
*
* FUNCTION: AcpiHwLowLevelWrite
* FUNCTION: AcpiWrite
*
* PARAMETERS: Width - 8, 16, or 32
* Value - To be written
* PARAMETERS: Value - To be written
* Reg - GAS register structure
*
* RETURN: Status
@ -940,16 +953,16 @@ AcpiHwLowLevelRead (
******************************************************************************/
ACPI_STATUS
AcpiHwLowLevelWrite (
UINT32 Width,
AcpiWrite (
UINT32 Value,
ACPI_GENERIC_ADDRESS *Reg)
{
UINT32 Width;
UINT64 Address;
ACPI_STATUS Status;
ACPI_FUNCTION_NAME (HwLowLevelWrite);
ACPI_FUNCTION_NAME (AcpiWrite);
/*
@ -970,6 +983,14 @@ AcpiHwLowLevelWrite (
return (AE_OK);
}
/* Supported widths are 8/16/32 */
Width = Reg->BitWidth;
if ((Width != 8) && (Width != 16) && (Width != 32))
{
return (AE_SUPPORT);
}
/*
* Two address spaces supported: Memory or IO.
* PCI_Config is not supported here because the GAS struct is insufficient
@ -1003,3 +1024,5 @@ AcpiHwLowLevelWrite (
return (Status);
}
ACPI_EXPORT_SYMBOL (AcpiWrite)

View File

@ -187,7 +187,7 @@ AcpiGetTimer (
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
Status = AcpiHwLowLevelRead (32, Ticks, &AcpiGbl_FADT.XPmTimerBlock);
Status = AcpiRead (Ticks, &AcpiGbl_FADT.XPmTimerBlock);
return_ACPI_STATUS (Status);
}

View File

@ -127,7 +127,7 @@
static inline void
AcpiTbInitGenericAddress (
ACPI_GENERIC_ADDRESS *GenericAddress,
UINT8 BitWidth,
UINT8 ByteWidth,
UINT64 Address);
static void
@ -197,7 +197,7 @@ static ACPI_FADT_INFO FadtInfoTable[] =
* FUNCTION: AcpiTbInitGenericAddress
*
* PARAMETERS: GenericAddress - GAS struct to be initialized
* BitWidth - Width of this register
* ByteWidth - Width of this register, in bytes
* Address - Address of the register
*
* RETURN: None
@ -211,7 +211,7 @@ static ACPI_FADT_INFO FadtInfoTable[] =
static inline void
AcpiTbInitGenericAddress (
ACPI_GENERIC_ADDRESS *GenericAddress,
UINT8 BitWidth,
UINT8 ByteWidth,
UINT64 Address)
{
@ -224,7 +224,7 @@ AcpiTbInitGenericAddress (
/* All other fields are byte-wide */
GenericAddress->SpaceId = ACPI_ADR_SPACE_SYSTEM_IO;
GenericAddress->BitWidth = BitWidth;
GenericAddress->BitWidth = (UINT8) (ByteWidth * 8);
GenericAddress->BitOffset = 0;
GenericAddress->AccessWidth = 0;
}
@ -474,6 +474,20 @@ AcpiTbConvertFadt (
AcpiTbInitGenericAddress (&AcpiGbl_XPm1bEnable, Pm1RegisterLength,
(AcpiGbl_FADT.XPm1bEventBlock.Address + Pm1RegisterLength));
}
/*
* Adjust register lengths so they are useful. Sizes of the PM event
* and control registers are hardcoded here since many FADTs are incorrect
* (especially the ControlBlock length.)
*
* Note: XPm1aEventBlock and XPm1bEventBlock are used to access the PM1
* status registers. The PM1 enable registers are created above.
*/
AcpiGbl_FADT.XPm1aEventBlock.BitWidth = ACPI_PM1_REGISTER_WIDTH;
AcpiGbl_FADT.XPm1bEventBlock.BitWidth = ACPI_PM1_REGISTER_WIDTH;
AcpiGbl_FADT.XPm1aControlBlock.BitWidth = ACPI_PM1_REGISTER_WIDTH;
AcpiGbl_FADT.XPm1bControlBlock.BitWidth = ACPI_PM1_REGISTER_WIDTH;
AcpiGbl_FADT.XPm2ControlBlock.BitWidth = ACPI_PM2_REGISTER_WIDTH;
}

View File

@ -155,18 +155,6 @@ AcpiHwRegisterWrite (
UINT32 RegisterId,
UINT32 Value);
ACPI_STATUS
AcpiHwLowLevelRead (
UINT32 Width,
UINT32 *Value,
ACPI_GENERIC_ADDRESS *Reg);
ACPI_STATUS
AcpiHwLowLevelWrite (
UINT32 Width,
UINT32 Value,
ACPI_GENERIC_ADDRESS *Reg);
ACPI_STATUS
AcpiHwClearAcpiStatus (
void);

View File

@ -196,11 +196,6 @@ ACPI_STATUS
AcpiPurgeCachedObjects (
void);
ACPI_STATUS
AcpiInstallInitializationHandler (
ACPI_INIT_HANDLER Handler,
UINT32 Function);
/*
* ACPI Memory managment
@ -358,9 +353,14 @@ AcpiGetParent (
/*
* Event handler interfaces
* Handler interfaces
*/
ACPI_STATUS
AcpiInstallInitializationHandler (
ACPI_INIT_HANDLER Handler,
UINT32 Function);
ACPI_STATUS
AcpiInstallFixedEventHandler (
UINT32 AcpiEvent,
ACPI_EVENT_HANDLER Handler,
@ -574,6 +574,16 @@ AcpiSetRegister (
UINT32 RegisterId,
UINT32 Value);
ACPI_STATUS
AcpiRead (
UINT32 *Value,
ACPI_GENERIC_ADDRESS *Register);
ACPI_STATUS
AcpiWrite (
UINT32 Value,
ACPI_GENERIC_ADDRESS *Register);
ACPI_STATUS
AcpiSetFirmwareWakingVector (
UINT32 PhysicalAddress);

View File

@ -390,6 +390,8 @@ typedef UINT32 ACPI_PHYSICAL_ADDRESS;
#define ACPI_MAX_GPE_BLOCKS 2
#define ACPI_GPE_REGISTER_WIDTH 8
#define ACPI_PM1_REGISTER_WIDTH 16
#define ACPI_PM2_REGISTER_WIDTH 8
/* Names within the namespace are 4 bytes long */