hwsleep.c revision 7b1019a6d29ccb7999dc76cba3dde1c627e8e609
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/******************************************************************************
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Name: hwsleep.c - ACPI Hardware Sleep/Wake Support functions for the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * original/legacy sleep/PM registers.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *****************************************************************************/
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright (C) 2000 - 2016, Intel Corp.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
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 * are met:
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 *
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 *
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
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "acpi.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "accommon.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor#define _COMPONENT ACPI_HARDWARE
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ACPI_MODULE_NAME ("hwsleep")
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#if (!ACPI_REDUCED_HARDWARE) /* Entire module */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*******************************************************************************
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * FUNCTION: AcpiHwLegacySleep
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * PARAMETERS: SleepState - Which sleep state to enter
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * RETURN: Status
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
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 *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ******************************************************************************/
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorACPI_STATUS
17a2b317610f531d565bf4e940433aab2d9e6985Bill TaylorAcpiHwLegacySleep (
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor UINT8 SleepState)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ACPI_BIT_REGISTER_INFO *SleepTypeRegInfo;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ACPI_BIT_REGISTER_INFO *SleepEnableRegInfo;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor UINT32 Pm1aControl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor UINT32 Pm1bControl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor UINT32 InValue;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ACPI_STATUS Status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ACPI_FUNCTION_TRACE (HwLegacySleep);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor SleepTypeRegInfo = AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_TYPE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SleepEnableRegInfo = AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_ENABLE);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Clear wake status */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Status = AcpiWriteBitRegister (ACPI_BITREG_WAKE_STATUS,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ACPI_CLEAR_STATUS);
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor if (ACPI_FAILURE (Status))
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return_ACPI_STATUS (Status);
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Clear all fixed and general purpose status bits */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Status = AcpiHwClearAcpiStatus ();
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (ACPI_FAILURE (Status))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return_ACPI_STATUS (Status);
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor }
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor /*
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor * 1) Disable/Clear all GPEs
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * 2) Enable all wakeup GPEs
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Status = AcpiHwDisableAllGpes ();
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ACPI_FAILURE (Status))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return_ACPI_STATUS (Status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiGbl_SystemAwakeAndRunning = FALSE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Status = AcpiHwEnableAllWakeupGpes ();
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ACPI_FAILURE (Status))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return_ACPI_STATUS (Status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Get current value of PM1A control */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Status = AcpiHwRegisterRead (ACPI_REGISTER_PM1_CONTROL,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &Pm1aControl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ACPI_FAILURE (Status))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return_ACPI_STATUS (Status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "Entering sleep state [S%u]\n", SleepState));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Clear the SLP_EN and SLP_TYP fields */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1aControl &= ~(SleepTypeRegInfo->AccessBitMask |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SleepEnableRegInfo->AccessBitMask);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1bControl = Pm1aControl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Insert the SLP_TYP bits */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1aControl |= (AcpiGbl_SleepTypeA << SleepTypeRegInfo->BitPosition);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1bControl |= (AcpiGbl_SleepTypeB << SleepTypeRegInfo->BitPosition);
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor /*
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor * We split the writes of SLP_TYP and SLP_EN to workaround
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * poorly implemented hardware.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Write #1: write the SLP_TYP data to the PM1 Control registers */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Status = AcpiHwWritePm1Control (Pm1aControl, Pm1bControl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ACPI_FAILURE (Status))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return_ACPI_STATUS (Status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Insert the sleep enable (SLP_EN) bit */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1aControl |= SleepEnableRegInfo->AccessBitMask;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1bControl |= SleepEnableRegInfo->AccessBitMask;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Flush caches, as per ACPI specification */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ACPI_FLUSH_CPU_CACHE ();
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Write #2: Write both SLP_TYP + SLP_EN */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Status = AcpiHwWritePm1Control (Pm1aControl, Pm1bControl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ACPI_FAILURE (Status))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return_ACPI_STATUS (Status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor if (SleepState > ACPI_STATE_S3)
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor {
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor /*
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 *
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor * Wait ten seconds, then try again. This is to get S4/S5 to work on
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor * all machines.
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor *
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 */
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor AcpiOsStall (10 * ACPI_USEC_PER_SEC);
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor Status = AcpiHwRegisterWrite (ACPI_REGISTER_PM1_CONTROL,
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor SleepEnableRegInfo->AccessBitMask);
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor if (ACPI_FAILURE (Status))
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor {
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor return_ACPI_STATUS (Status);
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor }
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor }
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor /* Wait for transition back to Working State */
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor do
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor {
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor Status = AcpiReadBitRegister (ACPI_BITREG_WAKE_STATUS, &InValue);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ACPI_FAILURE (Status))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor {
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor return_ACPI_STATUS (Status);
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor }
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor } while (!InValue);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return_ACPI_STATUS (AE_OK);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*******************************************************************************
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * FUNCTION: AcpiHwLegacyWakePrep
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * PARAMETERS: SleepState - Which sleep state we just exited
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * RETURN: Status
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor * DESCRIPTION: Perform the first state of OS-independent ACPI cleanup after a
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * sleep.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Called with interrupts ENABLED.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ******************************************************************************/
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorACPI_STATUS
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorAcpiHwLegacyWakePrep (
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor UINT8 SleepState)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ACPI_STATUS Status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ACPI_BIT_REGISTER_INFO *SleepTypeRegInfo;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ACPI_BIT_REGISTER_INFO *SleepEnableRegInfo;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor UINT32 Pm1aControl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor UINT32 Pm1bControl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ACPI_FUNCTION_TRACE (HwLegacyWakePrep);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
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 */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Status = AcpiGetSleepTypeData (ACPI_STATE_S0,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &AcpiGbl_SleepTypeA, &AcpiGbl_SleepTypeB);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ACPI_SUCCESS (Status))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SleepTypeRegInfo =
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_TYPE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SleepEnableRegInfo =
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_ENABLE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor /* Get current value of PM1A control */
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor Status = AcpiHwRegisterRead (ACPI_REGISTER_PM1_CONTROL,
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor &Pm1aControl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ACPI_SUCCESS (Status))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Clear the SLP_EN and SLP_TYP fields */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1aControl &= ~(SleepTypeRegInfo->AccessBitMask |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SleepEnableRegInfo->AccessBitMask);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1bControl = Pm1aControl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Insert the SLP_TYP bits */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1aControl |= (AcpiGbl_SleepTypeA <<
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SleepTypeRegInfo->BitPosition);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Pm1bControl |= (AcpiGbl_SleepTypeB <<
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SleepTypeRegInfo->BitPosition);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Write the control registers and ignore any errors */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) AcpiHwWritePm1Control (Pm1aControl, Pm1bControl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
dd9e16da4243358c2e9251a4ca5d50f56e0adc68agiri return_ACPI_STATUS (Status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*******************************************************************************
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * FUNCTION: AcpiHwLegacyWake
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * PARAMETERS: SleepState - Which sleep state we just exited
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * RETURN: Status
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Called with interrupts ENABLED.
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor *
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor ******************************************************************************/
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill TaylorACPI_STATUS
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorAcpiHwLegacyWake (
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor UINT8 SleepState)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ACPI_STATUS Status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ACPI_FUNCTION_TRACE (HwLegacyWake);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Ensure EnterSleepStatePrep -> EnterSleepState ordering */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
dd9e16da4243358c2e9251a4ca5d50f56e0adc68agiri AcpiGbl_SleepTypeA = ACPI_SLEEP_TYPE_INVALID;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WAKING);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * GPEs must be enabled before _WAK is called as GPEs
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * might get fired there
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Restore the GPEs:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * 1) Disable/Clear all GPEs
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * 2) Enable all runtime GPEs
dd9e16da4243358c2e9251a4ca5d50f56e0adc68agiri */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Status = AcpiHwDisableAllGpes ();
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ACPI_FAILURE (Status))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return_ACPI_STATUS (Status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor Status = AcpiHwEnableAllRuntimeGpes ();
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ACPI_FAILURE (Status))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return_ACPI_STATUS (Status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Now we can execute _WAK, etc. Some machines require that the GPEs
dd9e16da4243358c2e9251a4ca5d50f56e0adc68agiri * are enabled before the wake methods are executed.
dd9e16da4243358c2e9251a4ca5d50f56e0adc68agiri */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiHwExecuteSleepMethod (METHOD_PATHNAME__WAK, SleepState);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
dd9e16da4243358c2e9251a4ca5d50f56e0adc68agiri /*
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.
dd9e16da4243358c2e9251a4ca5d50f56e0adc68agiri */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) AcpiWriteBitRegister (ACPI_BITREG_WAKE_STATUS,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ACPI_CLEAR_STATUS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiGbl_SystemAwakeAndRunning = TRUE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Enable power button */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) AcpiWriteBitRegister(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].EnableRegisterId,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ACPI_ENABLE_EVENT);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) AcpiWriteBitRegister(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].StatusRegisterId,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ACPI_CLEAR_STATUS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WORKING);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return_ACPI_STATUS (Status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
dd9e16da4243358c2e9251a4ca5d50f56e0adc68agiri#endif /* !ACPI_REDUCED_HARDWARE */
dd9e16da4243358c2e9251a4ca5d50f56e0adc68agiri