From 8ce404a262f4eccf8ef484ef7e9a8f3604e031da Mon Sep 17 00:00:00 2001 From: Robert Moore Date: Wed, 19 Nov 2008 12:22:13 -0800 Subject: [PATCH] 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. --- source/components/events/evgpe.c | 6 +- source/components/events/evgpeblk.c | 10 ++-- source/components/hardware/hwgpe.c | 24 +++----- source/components/hardware/hwregs.c | 85 ++++++++++++++++++---------- source/components/hardware/hwtimer.c | 2 +- source/components/tables/tbfadt.c | 22 +++++-- source/include/achware.h | 12 ---- source/include/acpixf.h | 22 +++++-- source/include/actypes.h | 2 + 9 files changed, 106 insertions(+), 79 deletions(-) diff --git a/source/components/events/evgpe.c b/source/components/events/evgpe.c index b043db032..613bee6a9 100644 --- a/source/components/events/evgpe.c +++ b/source/components/events/evgpe.c @@ -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; diff --git a/source/components/events/evgpeblk.c b/source/components/events/evgpeblk.c index ca57d6383..84fd6d8cc 100644 --- a/source/components/events/evgpeblk.c +++ b/source/components/events/evgpeblk.c @@ -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; diff --git a/source/components/hardware/hwgpe.c b/source/components/hardware/hwgpe.c index f7dd4be8e..65e59da3e 100644 --- a/source/components/hardware/hwgpe.c +++ b/source/components/hardware/hwgpe.c @@ -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)) { diff --git a/source/components/hardware/hwregs.c b/source/components/hardware/hwregs.c index e4ec1b3c4..803b6956c 100644 --- a/source/components/hardware/hwregs.c +++ b/source/components/hardware/hwregs.c @@ -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) diff --git a/source/components/hardware/hwtimer.c b/source/components/hardware/hwtimer.c index 11edcfee2..682d34838 100644 --- a/source/components/hardware/hwtimer.c +++ b/source/components/hardware/hwtimer.c @@ -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); } diff --git a/source/components/tables/tbfadt.c b/source/components/tables/tbfadt.c index 43458b6a0..4ba5cf59c 100644 --- a/source/components/tables/tbfadt.c +++ b/source/components/tables/tbfadt.c @@ -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; } diff --git a/source/include/achware.h b/source/include/achware.h index 07bfb12cd..37bf7cf73 100644 --- a/source/include/achware.h +++ b/source/include/achware.h @@ -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); diff --git a/source/include/acpixf.h b/source/include/acpixf.h index 9bed27d3c..cd00e55b6 100644 --- a/source/include/acpixf.h +++ b/source/include/acpixf.h @@ -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); diff --git a/source/include/actypes.h b/source/include/actypes.h index 809e6a2e6..99f2909db 100644 --- a/source/include/actypes.h +++ b/source/include/actypes.h @@ -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 */