hwsleep.c revision 7b1019a6d29ccb7999dc76cba3dde1c627e8e609
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/******************************************************************************
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Name: hwsleep.c - ACPI Hardware Sleep/Wake Support functions for the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *****************************************************************************/
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright (C) 2000 - 2016, Intel Corp.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Redistribution and use in source and binary forms, with or without
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * modification, are permitted provided that the following conditions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * 1. Redistributions of source code must retain the above copyright
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * notice, this list of conditions, and the following disclaimer,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * without modification.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * 2. Redistributions in binary form must reproduce at minimum a disclaimer
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * substantially similar to the "NO WARRANTY" disclaimer below
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * ("Disclaimer") and any redistribution must be conditioned upon
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * including a substantially similar Disclaimer requirement for further
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * binary redistribution.
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * 3. Neither the names of the above-listed copyright holders nor the names
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * of any contributors may be used to endorse or promote products derived
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * from this software without specific prior written permission.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Alternatively, this software may be distributed under the terms of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * GNU General Public License ("GPL") version 2 as published by the Free
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Software Foundation.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * NO WARRANTY
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * POSSIBILITY OF SUCH DAMAGES.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*******************************************************************************
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * FUNCTION: AcpiHwLegacySleep
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * PARAMETERS: SleepState - Which sleep state to enter
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * RETURN: Status
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DESCRIPTION: Enter a system sleep state via the legacy FADT PM registers
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ******************************************************************************/
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor SleepTypeRegInfo = AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_TYPE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SleepEnableRegInfo = AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_ENABLE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Clear wake status */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Status = AcpiWriteBitRegister (ACPI_BITREG_WAKE_STATUS,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Clear all fixed and general purpose status bits */
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor * 1) Disable/Clear all GPEs
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * 2) Enable all wakeup GPEs
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Get current value of PM1A control */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Status = AcpiHwRegisterRead (ACPI_REGISTER_PM1_CONTROL,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Clear the SLP_EN and SLP_TYP fields */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1aControl &= ~(SleepTypeRegInfo->AccessBitMask |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Insert the SLP_TYP bits */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1aControl |= (AcpiGbl_SleepTypeA << SleepTypeRegInfo->BitPosition);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1bControl |= (AcpiGbl_SleepTypeB << SleepTypeRegInfo->BitPosition);
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor * We split the writes of SLP_TYP and SLP_EN to workaround
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * poorly implemented hardware.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Write #1: write the SLP_TYP data to the PM1 Control registers */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Status = AcpiHwWritePm1Control (Pm1aControl, Pm1bControl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Insert the sleep enable (SLP_EN) bit */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1aControl |= SleepEnableRegInfo->AccessBitMask;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1bControl |= SleepEnableRegInfo->AccessBitMask;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Flush caches, as per ACPI specification */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Write #2: Write both SLP_TYP + SLP_EN */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Status = AcpiHwWritePm1Control (Pm1aControl, Pm1bControl);
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor * We wanted to sleep > S3, but it didn't happen (by virtue of the
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor * fact that we are still executing!)
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor * Wait ten seconds, then try again. This is to get S4/S5 to work on
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor * all machines.
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor * We wait so long to allow chipsets that poll this reg very slowly
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor * to still read the right value. Ideally, this block would go
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor * away entirely.
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor Status = AcpiHwRegisterWrite (ACPI_REGISTER_PM1_CONTROL,
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor /* Wait for transition back to Working State */
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor Status = AcpiReadBitRegister (ACPI_BITREG_WAKE_STATUS, &InValue);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*******************************************************************************
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * FUNCTION: AcpiHwLegacyWakePrep
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * PARAMETERS: SleepState - Which sleep state we just exited
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * RETURN: Status
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor * DESCRIPTION: Perform the first state of OS-independent ACPI cleanup after a
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Called with interrupts ENABLED.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ******************************************************************************/
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Set SLP_TYPE and SLP_EN to state S0.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This is unclear from the ACPI Spec, but it is required
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * by some machines.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_TYPE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_ENABLE);
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor /* Get current value of PM1A control */
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor Status = AcpiHwRegisterRead (ACPI_REGISTER_PM1_CONTROL,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Clear the SLP_EN and SLP_TYP fields */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1aControl &= ~(SleepTypeRegInfo->AccessBitMask |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Insert the SLP_TYP bits */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Write the control registers and ignore any errors */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) AcpiHwWritePm1Control (Pm1aControl, Pm1bControl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*******************************************************************************
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * FUNCTION: AcpiHwLegacyWake
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * PARAMETERS: SleepState - Which sleep state we just exited
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * RETURN: Status
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Called with interrupts ENABLED.
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor ******************************************************************************/
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Ensure EnterSleepStatePrep -> EnterSleepState ordering */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WAKING);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * GPEs must be enabled before _WAK is called as GPEs
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * might get fired there
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Restore the GPEs:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * 1) Disable/Clear all GPEs
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * 2) Enable all runtime GPEs
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Now we can execute _WAK, etc. Some machines require that the GPEs
dd9e16da4243358c2e9251a4ca5d50f56e0adc68agiri * are enabled before the wake methods are executed.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiHwExecuteSleepMethod (METHOD_PATHNAME__WAK, SleepState);
dd9e16da4243358c2e9251a4ca5d50f56e0adc68agiri * Some BIOS code assumes that WAK_STS will be cleared on resume
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and use it to determine whether the system is rebooting or
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * resuming. Clear WAK_STS for compatibility.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) AcpiWriteBitRegister (ACPI_BITREG_WAKE_STATUS,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Enable power button */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].EnableRegisterId,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].StatusRegisterId,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WORKING);
dd9e16da4243358c2e9251a4ca5d50f56e0adc68agiri#endif /* !ACPI_REDUCED_HARDWARE */