summaryrefslogtreecommitdiffstats
path: root/sys/contrib/dev/acpica/hwacpi.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/dev/acpica/hwacpi.c')
-rw-r--r--sys/contrib/dev/acpica/hwacpi.c63
1 files changed, 46 insertions, 17 deletions
diff --git a/sys/contrib/dev/acpica/hwacpi.c b/sys/contrib/dev/acpica/hwacpi.c
index e73367f..8391e55 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);
}
OpenPOWER on IntegriCloud