diff options
author | rmoore1 <rmoore1> | 2006-08-23 19:55:36 +0000 |
---|---|---|
committer | rmoore1 <rmoore1> | 2006-08-23 19:55:36 +0000 |
commit | 62300dae1961d60696162d93501bfb44c1b08f7b (patch) | |
tree | f0afe0c40d1c5a0b39894b8c1f3362a0d9b387d1 /source/components/hardware | |
parent | 23d55ffd5499f42f3afbec0dd17903c3d95ed365 (diff) | |
download | acpica-62300dae1961d60696162d93501bfb44c1b08f7b.tar.gz |
The Table Manager component has been completely redesigned and reimplemented. The new design is much simpler, and reduces the overall code and data size of the kernel-resident ACPICA by approximately 5%. Also, it is now possible to obtain the ACPI tables very early during kernel initialization, even before dynamic memory management is initialized.
Diffstat (limited to 'source/components/hardware')
-rw-r--r-- | source/components/hardware/hwacpi.c | 24 | ||||
-rw-r--r-- | source/components/hardware/hwregs.c | 56 | ||||
-rw-r--r-- | source/components/hardware/hwsleep.c | 63 | ||||
-rw-r--r-- | source/components/hardware/hwtimer.c | 8 |
4 files changed, 88 insertions, 63 deletions
diff --git a/source/components/hardware/hwacpi.c b/source/components/hardware/hwacpi.c index 6849bb032..0ccd1e42b 100644 --- a/source/components/hardware/hwacpi.c +++ b/source/components/hardware/hwacpi.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: hwacpi - ACPI Hardware Initialization/Mode Interface - * $Revision: 1.74 $ + * $Revision: 1.75 $ * *****************************************************************************/ @@ -147,14 +147,6 @@ AcpiHwInitialize ( ACPI_FUNCTION_TRACE (HwInitialize); - /* We must have the ACPI tables by the time we get here */ - - if (!AcpiGbl_FADT) - { - ACPI_ERROR ((AE_INFO, "No FADT is present")); - return_ACPI_STATUS (AE_NO_ACPI_TABLES); - } - /* Sanity check the FADT for valid values */ Status = AcpiUtValidateFadt (); @@ -194,7 +186,7 @@ AcpiHwSetMode ( * ACPI 2.0 clarified that if SMI_CMD in FADT is zero, * system does not support mode transition. */ - if (!AcpiGbl_FADT->SmiCmd) + if (!AcpiGbl_FADT.SmiCommand) { ACPI_ERROR ((AE_INFO, "No SMI_CMD in FADT, mode transition failed")); return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE); @@ -207,7 +199,7 @@ AcpiHwSetMode ( * we make sure both the numbers are zero to determine these * transitions are not supported. */ - if (!AcpiGbl_FADT->AcpiEnable && !AcpiGbl_FADT->AcpiDisable) + if (!AcpiGbl_FADT.AcpiEnable && !AcpiGbl_FADT.AcpiDisable) { ACPI_ERROR ((AE_INFO, "No ACPI mode transition supported in this system (enable/disable both zero)")); @@ -220,8 +212,8 @@ AcpiHwSetMode ( /* BIOS should have disabled ALL fixed and GP events */ - Status = AcpiOsWritePort (AcpiGbl_FADT->SmiCmd, - (UINT32) AcpiGbl_FADT->AcpiEnable, 8); + Status = AcpiOsWritePort (AcpiGbl_FADT.SmiCommand, + (UINT32) AcpiGbl_FADT.AcpiEnable, 8); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Attempting to enable ACPI mode\n")); break; @@ -231,8 +223,8 @@ AcpiHwSetMode ( * BIOS should clear all fixed status bits and restore fixed event * enable bits to default */ - Status = AcpiOsWritePort (AcpiGbl_FADT->SmiCmd, - (UINT32) AcpiGbl_FADT->AcpiDisable, 8); + Status = AcpiOsWritePort (AcpiGbl_FADT.SmiCommand, + (UINT32) AcpiGbl_FADT.AcpiDisable, 8); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Attempting to enable Legacy (non-ACPI) mode\n")); break; @@ -298,7 +290,7 @@ AcpiHwGetMode ( * ACPI 2.0 clarified that if SMI_CMD in FADT is zero, * system does not support mode transition. */ - if (!AcpiGbl_FADT->SmiCmd) + if (!AcpiGbl_FADT.SmiCommand) { return_UINT32 (ACPI_SYS_MODE_ACPI); } diff --git a/source/components/hardware/hwregs.c b/source/components/hardware/hwregs.c index 81d63f8f2..d9b60841f 100644 --- a/source/components/hardware/hwregs.c +++ b/source/components/hardware/hwregs.c @@ -3,7 +3,7 @@ * * Module Name: hwregs - Read/write access functions for the various ACPI * control and status registers. - * $Revision: 1.183 $ + * $Revision: 1.184 $ * ******************************************************************************/ @@ -154,7 +154,7 @@ AcpiHwClearAcpiStatus ( ACPI_DEBUG_PRINT ((ACPI_DB_IO, "About to write %04X to %04X\n", ACPI_BITMASK_ALL_FIXED_STATUS, - (UINT16) ACPI_GET_ADDRESS (AcpiGbl_FADT->XPm1aEvtBlk.Address))); + (UINT16) ACPI_GET_ADDRESS (AcpiGbl_FADT.XPm1aEventBlock.Address))); LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock); @@ -168,10 +168,10 @@ AcpiHwClearAcpiStatus ( /* Clear the fixed events */ - if (ACPI_VALID_ADDRESS (AcpiGbl_FADT->XPm1bEvtBlk.Address)) + if (ACPI_VALID_ADDRESS (AcpiGbl_FADT.XPm1bEventBlock.Address)) { Status = AcpiHwLowLevelWrite (16, ACPI_BITMASK_ALL_FIXED_STATUS, - &AcpiGbl_FADT->XPm1bEvtBlk); + &AcpiGbl_FADT.XPm1bEventBlock); if (ACPI_FAILURE (Status)) { goto UnlockAndExit; @@ -530,7 +530,7 @@ AcpiSetRegister ( ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM2 control: Read %X from %8.8X%8.8X\n", RegisterValue, ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS ( - AcpiGbl_FADT->XPm2CntBlk.Address)))); + AcpiGbl_FADT.XPm2ControlBlock.Address)))); ACPI_REGISTER_INSERT_VALUE (RegisterValue, BitRegInfo->BitPosition, BitRegInfo->AccessBitMask, Value); @@ -538,7 +538,7 @@ AcpiSetRegister ( ACPI_DEBUG_PRINT ((ACPI_DB_IO, "About to write %4.4X to %8.8X%8.8X\n", RegisterValue, ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS ( - AcpiGbl_FADT->XPm2CntBlk.Address)))); + AcpiGbl_FADT.XPm2ControlBlock.Address)))); Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM2_CONTROL, (UINT8) (RegisterValue)); @@ -606,7 +606,7 @@ AcpiHwRegisterRead ( { case ACPI_REGISTER_PM1_STATUS: /* 16-bit access */ - Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_FADT->XPm1aEvtBlk); + Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_FADT.XPm1aEventBlock); if (ACPI_FAILURE (Status)) { goto UnlockAndExit; @@ -614,7 +614,7 @@ AcpiHwRegisterRead ( /* PM1B is optional */ - Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_FADT->XPm1bEvtBlk); + Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_FADT.XPm1bEventBlock); Value1 |= Value2; break; @@ -636,31 +636,31 @@ AcpiHwRegisterRead ( case ACPI_REGISTER_PM1_CONTROL: /* 16-bit access */ - Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_FADT->XPm1aCntBlk); + Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_FADT.XPm1aControlBlock); if (ACPI_FAILURE (Status)) { goto UnlockAndExit; } - Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_FADT->XPm1bCntBlk); + Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_FADT.XPm1bControlBlock); Value1 |= Value2; break; case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */ - Status = AcpiHwLowLevelRead (8, &Value1, &AcpiGbl_FADT->XPm2CntBlk); + Status = AcpiHwLowLevelRead (8, &Value1, &AcpiGbl_FADT.XPm2ControlBlock); break; case ACPI_REGISTER_PM_TIMER: /* 32-bit access */ - Status = AcpiHwLowLevelRead (32, &Value1, &AcpiGbl_FADT->XPmTmrBlk); + Status = AcpiHwLowLevelRead (32, &Value1, &AcpiGbl_FADT.XPmTimerBlock); break; case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */ - Status = AcpiOsReadPort (AcpiGbl_FADT->SmiCmd, &Value1, 8); + Status = AcpiOsReadPort (AcpiGbl_FADT.SmiCommand, &Value1, 8); break; default: @@ -750,7 +750,7 @@ AcpiHwRegisterWrite ( /* Now we can write the data */ - Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1aEvtBlk); + Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1aEventBlock); if (ACPI_FAILURE (Status)) { goto UnlockAndExit; @@ -758,7 +758,7 @@ AcpiHwRegisterWrite ( /* PM1B is optional */ - Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1bEvtBlk); + Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1bEventBlock); break; @@ -796,37 +796,37 @@ AcpiHwRegisterWrite ( /* Now we can write the data */ - Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1aCntBlk); + Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1aControlBlock); if (ACPI_FAILURE (Status)) { goto UnlockAndExit; } - Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1bCntBlk); + Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1bControlBlock); break; case ACPI_REGISTER_PM1A_CONTROL: /* 16-bit access */ - Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1aCntBlk); + Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1aControlBlock); break; case ACPI_REGISTER_PM1B_CONTROL: /* 16-bit access */ - Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT->XPm1bCntBlk); + Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1bControlBlock); break; case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */ - Status = AcpiHwLowLevelWrite (8, Value, &AcpiGbl_FADT->XPm2CntBlk); + Status = AcpiHwLowLevelWrite (8, Value, &AcpiGbl_FADT.XPm2ControlBlock); break; case ACPI_REGISTER_PM_TIMER: /* 32-bit access */ - Status = AcpiHwLowLevelWrite (32, Value, &AcpiGbl_FADT->XPmTmrBlk); + Status = AcpiHwLowLevelWrite (32, Value, &AcpiGbl_FADT.XPmTimerBlock); break; @@ -834,7 +834,7 @@ AcpiHwRegisterWrite ( /* SMI_CMD is currently always in IO space */ - Status = AcpiOsWritePort (AcpiGbl_FADT->SmiCmd, Value, 8); + Status = AcpiOsWritePort (AcpiGbl_FADT.SmiCommand, Value, 8); break; @@ -903,7 +903,7 @@ AcpiHwLowLevelRead ( * Two address spaces supported: Memory or IO. * PCI_Config is not supported here because the GAS struct is insufficient */ - switch (Reg->AddressSpaceId) + switch (Reg->SpaceId) { case ACPI_ADR_SPACE_SYSTEM_MEMORY: @@ -922,7 +922,7 @@ AcpiHwLowLevelRead ( default: ACPI_ERROR ((AE_INFO, - "Unsupported address space: %X", Reg->AddressSpaceId)); + "Unsupported address space: %X", Reg->SpaceId)); return (AE_BAD_PARAMETER); } @@ -930,7 +930,7 @@ AcpiHwLowLevelRead ( "Read: %8.8X width %2d from %8.8X%8.8X (%s)\n", *Value, Width, ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (Address)), - AcpiUtGetRegionName (Reg->AddressSpaceId))); + AcpiUtGetRegionName (Reg->SpaceId))); return (Status); } @@ -985,7 +985,7 @@ AcpiHwLowLevelWrite ( * Two address spaces supported: Memory or IO. * PCI_Config is not supported here because the GAS struct is insufficient */ - switch (Reg->AddressSpaceId) + switch (Reg->SpaceId) { case ACPI_ADR_SPACE_SYSTEM_MEMORY: @@ -1004,7 +1004,7 @@ AcpiHwLowLevelWrite ( default: ACPI_ERROR ((AE_INFO, - "Unsupported address space: %X", Reg->AddressSpaceId)); + "Unsupported address space: %X", Reg->SpaceId)); return (AE_BAD_PARAMETER); } @@ -1012,7 +1012,7 @@ AcpiHwLowLevelWrite ( "Wrote: %8.8X width %2d to %8.8X%8.8X (%s)\n", Value, Width, ACPI_FORMAT_UINT64 (ACPI_GET_ADDRESS (Address)), - AcpiUtGetRegionName (Reg->AddressSpaceId))); + AcpiUtGetRegionName (Reg->SpaceId))); return (Status); } diff --git a/source/components/hardware/hwsleep.c b/source/components/hardware/hwsleep.c index 56e7783a2..bb7c5e1c2 100644 --- a/source/components/hardware/hwsleep.c +++ b/source/components/hardware/hwsleep.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Name: hwsleep.c - ACPI Hardware Sleep/Wake Interface - * $Revision: 1.82 $ + * $Revision: 1.83 $ * *****************************************************************************/ @@ -116,6 +116,7 @@ *****************************************************************************/ #include "acpi.h" +#include "actables.h" #define _COMPONENT ACPI_HARDWARE ACPI_MODULE_NAME ("hwsleep") @@ -136,23 +137,38 @@ ACPI_STATUS AcpiSetFirmwareWakingVector ( - ACPI_PHYSICAL_ADDRESS PhysicalAddress) + ACPI_PHYSICAL_ADDRESS PhysicalAddress) { + ACPI_TABLE_FACS *Facs; + ACPI_STATUS Status; + ACPI_FUNCTION_TRACE (AcpiSetFirmwareWakingVector); + /* Get the FACS */ + Status = AcpiGetTableByIndex (ACPI_TABLE_INDEX_FACS, (ACPI_TABLE_HEADER **) &Facs); + if (ACPI_FAILURE (Status)) + { + return_ACPI_STATUS (Status); + } + /* Set the vector */ - if (AcpiGbl_CommonFACS.VectorWidth == 32) + if ((Facs->Length < 32) || + (!(ACPI_GET_ADDRESS (Facs->XFirmwareWakingVector)))) { - *(ACPI_CAST_PTR (UINT32, AcpiGbl_CommonFACS.FirmwareWakingVector)) - = (UINT32) PhysicalAddress; + /* + * ACPI 1.0 FACS or short table or optional X_ field is zero + */ + Facs->FirmwareWakingVector = (UINT32) PhysicalAddress; } else { - *AcpiGbl_CommonFACS.FirmwareWakingVector - = PhysicalAddress; + /* + * ACPI 2.0 FACS with valid X_ field + */ + Facs->XFirmwareWakingVector = PhysicalAddress; } return_ACPI_STATUS (AE_OK); @@ -177,8 +193,11 @@ ACPI_EXPORT_SYMBOL (AcpiSetFirmwareWakingVector) ACPI_STATUS AcpiGetFirmwareWakingVector ( - ACPI_PHYSICAL_ADDRESS *PhysicalAddress) + ACPI_PHYSICAL_ADDRESS *PhysicalAddress) { + ACPI_TABLE_FACS *Facs; + ACPI_STATUS Status; + ACPI_FUNCTION_TRACE (AcpiGetFirmwareWakingVector); @@ -188,17 +207,31 @@ AcpiGetFirmwareWakingVector ( return_ACPI_STATUS (AE_BAD_PARAMETER); } + /* Get the FACS */ + + Status = AcpiGetTableByIndex (ACPI_TABLE_INDEX_FACS, (ACPI_TABLE_HEADER **) &Facs); + if (ACPI_FAILURE (Status)) + { + return_ACPI_STATUS (Status); + } + /* Get the vector */ - if (AcpiGbl_CommonFACS.VectorWidth == 32) + if ((Facs->Length < 32) || + (!(ACPI_GET_ADDRESS (Facs->XFirmwareWakingVector)))) { - *PhysicalAddress = (ACPI_PHYSICAL_ADDRESS) - *(ACPI_CAST_PTR (UINT32, AcpiGbl_CommonFACS.FirmwareWakingVector)); + /* + * ACPI 1.0 FACS or short table or optional X_ field is zero + */ + *PhysicalAddress = + (ACPI_PHYSICAL_ADDRESS) Facs->FirmwareWakingVector; } else { - *PhysicalAddress = - *AcpiGbl_CommonFACS.FirmwareWakingVector; + /* + * ACPI 2.0 FACS with valid X_ field + */ + *PhysicalAddress = (ACPI_PHYSICAL_ADDRESS) Facs->XFirmwareWakingVector; } return_ACPI_STATUS (AE_OK); @@ -553,8 +586,8 @@ AcpiEnterSleepStateS4bios ( ACPI_FLUSH_CPU_CACHE (); - Status = AcpiOsWritePort (AcpiGbl_FADT->SmiCmd, - (UINT32) AcpiGbl_FADT->S4BiosReq, 8); + Status = AcpiOsWritePort (AcpiGbl_FADT.SmiCommand, + (UINT32) AcpiGbl_FADT.S4BiosRequest, 8); do { AcpiOsStall(1000); diff --git a/source/components/hardware/hwtimer.c b/source/components/hardware/hwtimer.c index 827a828b8..87e6218d1 100644 --- a/source/components/hardware/hwtimer.c +++ b/source/components/hardware/hwtimer.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Name: hwtimer.c - ACPI Power Management Timer Interface - * $Revision: 1.35 $ + * $Revision: 1.36 $ * *****************************************************************************/ @@ -145,7 +145,7 @@ AcpiGetTimerResolution ( return_ACPI_STATUS (AE_BAD_PARAMETER); } - if (AcpiGbl_FADT->TmrValExt == 0) + if ((AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) == 0) { *Resolution = 24; } @@ -187,7 +187,7 @@ AcpiGetTimer ( return_ACPI_STATUS (AE_BAD_PARAMETER); } - Status = AcpiHwLowLevelRead (32, Ticks, &AcpiGbl_FADT->XPmTmrBlk); + Status = AcpiHwLowLevelRead (32, Ticks, &AcpiGbl_FADT.XPmTimerBlock); return_ACPI_STATUS (Status); } @@ -253,7 +253,7 @@ AcpiGetTimerDuration ( } else if (StartTicks > EndTicks) { - if (AcpiGbl_FADT->TmrValExt == 0) + if ((AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) == 0) { /* 24-bit Timer */ |