diff options
Diffstat (limited to 'sys/contrib/dev/acpica/hwsleep.c')
-rw-r--r-- | sys/contrib/dev/acpica/hwsleep.c | 132 |
1 files changed, 84 insertions, 48 deletions
diff --git a/sys/contrib/dev/acpica/hwsleep.c b/sys/contrib/dev/acpica/hwsleep.c index fc07c05..a617eea 100644 --- a/sys/contrib/dev/acpica/hwsleep.c +++ b/sys/contrib/dev/acpica/hwsleep.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Name: hwsleep.c - ACPI Hardware Sleep/Wake Interface - * $Revision: 70 $ + * $Revision: 1.87 $ * *****************************************************************************/ @@ -10,7 +10,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2005, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp. * All rights reserved. * * 2. License @@ -116,6 +116,7 @@ *****************************************************************************/ #include <contrib/dev/acpica/acpi.h> +#include <contrib/dev/acpica/actables.h> #define _COMPONENT ACPI_HARDWARE ACPI_MODULE_NAME ("hwsleep") @@ -136,28 +137,45 @@ ACPI_STATUS AcpiSetFirmwareWakingVector ( - ACPI_PHYSICAL_ADDRESS PhysicalAddress) + ACPI_PHYSICAL_ADDRESS PhysicalAddress) { + ACPI_TABLE_FACS *Facs; + ACPI_STATUS Status; + - ACPI_FUNCTION_TRACE ("AcpiSetFirmwareWakingVector"); + 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) || + (!(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); } +ACPI_EXPORT_SYMBOL (AcpiSetFirmwareWakingVector) + /******************************************************************************* * @@ -175,10 +193,13 @@ AcpiSetFirmwareWakingVector ( ACPI_STATUS AcpiGetFirmwareWakingVector ( - ACPI_PHYSICAL_ADDRESS *PhysicalAddress) + ACPI_PHYSICAL_ADDRESS *PhysicalAddress) { + ACPI_TABLE_FACS *Facs; + ACPI_STATUS Status; + - ACPI_FUNCTION_TRACE ("AcpiGetFirmwareWakingVector"); + ACPI_FUNCTION_TRACE (AcpiGetFirmwareWakingVector); if (!PhysicalAddress) @@ -186,22 +207,38 @@ 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) || + (!(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); } +ACPI_EXPORT_SYMBOL (AcpiGetFirmwareWakingVector) + /******************************************************************************* * @@ -227,7 +264,7 @@ AcpiEnterSleepStatePrep ( ACPI_OBJECT Arg; - ACPI_FUNCTION_TRACE ("AcpiEnterSleepStatePrep"); + ACPI_FUNCTION_TRACE (AcpiEnterSleepStatePrep); /* @@ -290,13 +327,14 @@ AcpiEnterSleepStatePrep ( Status = AcpiEvaluateObject (NULL, METHOD_NAME__SST, &ArgList, NULL); if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) { - ACPI_REPORT_ERROR (("Method _SST failed, %s\n", - AcpiFormatException (Status))); + ACPI_EXCEPTION ((AE_INFO, Status, "While executing method _SST")); } return_ACPI_STATUS (AE_OK); } +ACPI_EXPORT_SYMBOL (AcpiEnterSleepStatePrep) + /******************************************************************************* * @@ -324,13 +362,13 @@ AcpiEnterSleepState ( ACPI_STATUS Status; - ACPI_FUNCTION_TRACE ("AcpiEnterSleepState"); + ACPI_FUNCTION_TRACE (AcpiEnterSleepState); if ((AcpiGbl_SleepTypeA > ACPI_SLEEP_TYPE_MAX) || (AcpiGbl_SleepTypeB > ACPI_SLEEP_TYPE_MAX)) { - ACPI_REPORT_ERROR (("Sleep values out of range: A=%X B=%X\n", + ACPI_ERROR ((AE_INFO, "Sleep values out of range: A=%X B=%X", AcpiGbl_SleepTypeA, AcpiGbl_SleepTypeB)); return_ACPI_STATUS (AE_AML_OPERAND_VALUE); } @@ -340,7 +378,7 @@ AcpiEnterSleepState ( /* Clear wake status */ - Status = AcpiSetRegister (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK); + Status = AcpiSetRegister (ACPI_BITREG_WAKE_STATUS, 1); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); @@ -348,7 +386,7 @@ AcpiEnterSleepState ( /* Clear all fixed and general purpose status bits */ - Status = AcpiHwClearAcpiStatus (ACPI_MTX_DO_NOT_LOCK); + Status = AcpiHwClearAcpiStatus (); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); @@ -358,8 +396,7 @@ AcpiEnterSleepState ( { /* Disable BM arbitration */ - Status = AcpiSetRegister (ACPI_BITREG_ARB_DISABLE, - 1, ACPI_MTX_DO_NOT_LOCK); + Status = AcpiSetRegister (ACPI_BITREG_ARB_DISABLE, 1); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); @@ -478,8 +515,7 @@ AcpiEnterSleepState ( Retry = 1000; do { - Status = AcpiGetRegister (ACPI_BITREG_WAKE_STATUS, &InValue, - ACPI_MTX_DO_NOT_LOCK); + Status = AcpiGetRegister (ACPI_BITREG_WAKE_STATUS, &InValue); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); @@ -501,6 +537,8 @@ AcpiEnterSleepState ( return_ACPI_STATUS (AE_OK); } +ACPI_EXPORT_SYMBOL (AcpiEnterSleepState) + /******************************************************************************* * @@ -523,16 +561,16 @@ AcpiEnterSleepStateS4bios ( ACPI_STATUS Status; - ACPI_FUNCTION_TRACE ("AcpiEnterSleepStateS4bios"); + ACPI_FUNCTION_TRACE (AcpiEnterSleepStateS4bios); - Status = AcpiSetRegister (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK); + Status = AcpiSetRegister (ACPI_BITREG_WAKE_STATUS, 1); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } - Status = AcpiHwClearAcpiStatus (ACPI_MTX_DO_NOT_LOCK); + Status = AcpiHwClearAcpiStatus (); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); @@ -557,13 +595,12 @@ 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); - Status = AcpiGetRegister (ACPI_BITREG_WAKE_STATUS, &InValue, - ACPI_MTX_DO_NOT_LOCK); + Status = AcpiGetRegister (ACPI_BITREG_WAKE_STATUS, &InValue); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); @@ -573,6 +610,8 @@ AcpiEnterSleepStateS4bios ( return_ACPI_STATUS (AE_OK); } +ACPI_EXPORT_SYMBOL (AcpiEnterSleepStateS4bios) + /******************************************************************************* * @@ -600,7 +639,7 @@ AcpiLeaveSleepState ( UINT32 PM1BControl; - ACPI_FUNCTION_TRACE ("AcpiLeaveSleepState"); + ACPI_FUNCTION_TRACE (AcpiLeaveSleepState); /* @@ -657,23 +696,20 @@ AcpiLeaveSleepState ( Status = AcpiEvaluateObject (NULL, METHOD_NAME__SST, &ArgList, NULL); if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) { - ACPI_REPORT_ERROR (("Method _SST failed, %s\n", - AcpiFormatException (Status))); + ACPI_EXCEPTION ((AE_INFO, Status, "During Method _SST")); } Arg.Integer.Value = SleepState; Status = AcpiEvaluateObject (NULL, METHOD_NAME__BFS, &ArgList, NULL); if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) { - ACPI_REPORT_ERROR (("Method _BFS failed, %s\n", - AcpiFormatException (Status))); + ACPI_EXCEPTION ((AE_INFO, Status, "During Method _BFS")); } Status = AcpiEvaluateObject (NULL, METHOD_NAME__WAK, &ArgList, NULL); if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) { - ACPI_REPORT_ERROR (("Method _WAK failed, %s\n", - AcpiFormatException (Status))); + ACPI_EXCEPTION ((AE_INFO, Status, "During Method _WAK")); } /* TBD: _WAK "sometimes" returns stuff - do we want to look at it? */ @@ -698,16 +734,14 @@ AcpiLeaveSleepState ( /* Enable power button */ (void) AcpiSetRegister( - AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].EnableRegisterId, - 1, ACPI_MTX_DO_NOT_LOCK); + AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].EnableRegisterId, 1); (void) AcpiSetRegister( - AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].StatusRegisterId, - 1, ACPI_MTX_DO_NOT_LOCK); + AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].StatusRegisterId, 1); /* Enable BM arbitration */ - Status = AcpiSetRegister (ACPI_BITREG_ARB_DISABLE, 0, ACPI_MTX_LOCK); + Status = AcpiSetRegister (ACPI_BITREG_ARB_DISABLE, 0); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); @@ -717,9 +751,11 @@ AcpiLeaveSleepState ( Status = AcpiEvaluateObject (NULL, METHOD_NAME__SST, &ArgList, NULL); if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) { - ACPI_REPORT_ERROR (("Method _SST failed, %s\n", - AcpiFormatException (Status))); + ACPI_EXCEPTION ((AE_INFO, Status, "During Method _SST")); } return_ACPI_STATUS (Status); } + +ACPI_EXPORT_SYMBOL (AcpiLeaveSleepState) + |