diff options
Diffstat (limited to 'sys/contrib/dev/acpica/hwacpi.c')
-rw-r--r-- | sys/contrib/dev/acpica/hwacpi.c | 63 |
1 files changed, 46 insertions, 17 deletions
diff --git a/sys/contrib/dev/acpica/hwacpi.c b/sys/contrib/dev/acpica/hwacpi.c index e73367f4008a..8391e55302f8 100644 --- a/sys/contrib/dev/acpica/hwacpi.c +++ b/sys/contrib/dev/acpica/hwacpi.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: hwacpi - ACPI Hardware Initialization/Mode Interface - * $Revision: 53 $ + * $Revision: 58 $ * *****************************************************************************/ @@ -118,7 +118,6 @@ #define __HWACPI_C__ #include "acpi.h" -#include "achware.h" #define _COMPONENT ACPI_HARDWARE @@ -185,38 +184,60 @@ AcpiHwSetMode ( UINT32 Mode) { - ACPI_STATUS Status = AE_NO_HARDWARE_RESPONSE; + ACPI_STATUS Status; + UINT32 Retry; ACPI_FUNCTION_TRACE ("HwSetMode"); - - if (Mode == ACPI_SYS_MODE_ACPI) + switch (Mode) { + case ACPI_SYS_MODE_ACPI: + /* BIOS should have disabled ALL fixed and GP events */ - AcpiOsWritePort (AcpiGbl_FADT->SmiCmd, AcpiGbl_FADT->AcpiEnable, 8); + Status = AcpiOsWritePort (AcpiGbl_FADT->SmiCmd, + (ACPI_INTEGER) AcpiGbl_FADT->AcpiEnable, 8); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Attempting to enable ACPI mode\n")); - } - else if (Mode == ACPI_SYS_MODE_LEGACY) - { + break; + + case ACPI_SYS_MODE_LEGACY: + /* * BIOS should clear all fixed status bits and restore fixed event * enable bits to default */ - AcpiOsWritePort (AcpiGbl_FADT->SmiCmd, AcpiGbl_FADT->AcpiDisable, 8); + Status = AcpiOsWritePort (AcpiGbl_FADT->SmiCmd, + (ACPI_INTEGER) AcpiGbl_FADT->AcpiDisable, 8); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Attempting to enable Legacy (non-ACPI) mode\n")); - } + break; - /* Give the platform some time to react */ + default: + return_ACPI_STATUS (AE_BAD_PARAMETER); + } - AcpiOsStall (20000); + if (ACPI_FAILURE (Status)) + { + return_ACPI_STATUS (Status); + } - if (AcpiHwGetMode () == Mode) + /* + * Some hardware takes a LONG time to switch modes. Give them 3 sec to + * do so, but allow faster systems to proceed more quickly. + */ + Retry = 3000; + while (Retry) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Mode %X successfully enabled\n", Mode)); - Status = AE_OK; + Status = AE_NO_HARDWARE_RESPONSE; + + if (AcpiHwGetMode() == Mode) { + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Mode %X successfully enabled\n", Mode)); + Status = AE_OK; + break; + } + AcpiOsStall(1000); + Retry--; } return_ACPI_STATUS (Status); @@ -239,11 +260,19 @@ AcpiHwSetMode ( UINT32 AcpiHwGetMode (void) { + ACPI_STATUS Status; + UINT32 Value; + ACPI_FUNCTION_TRACE ("HwGetMode"); + Status = AcpiGetRegister (ACPI_BITREG_SCI_ENABLE, &Value, ACPI_MTX_LOCK); + if (ACPI_FAILURE (Status)) + { + return_VALUE (ACPI_SYS_MODE_LEGACY); + } - if (AcpiHwBitRegisterRead (ACPI_BITREG_SCI_ENABLE, ACPI_MTX_LOCK)) + if (Value) { return_VALUE (ACPI_SYS_MODE_ACPI); } |