1*385cc6b4SJerry Jelinek /****************************************************************************** 2*385cc6b4SJerry Jelinek * 3*385cc6b4SJerry Jelinek * Name: hwxfsleep.c - ACPI Hardware Sleep/Wake External Interfaces 4*385cc6b4SJerry Jelinek * 5*385cc6b4SJerry Jelinek *****************************************************************************/ 6*385cc6b4SJerry Jelinek 7*385cc6b4SJerry Jelinek /* 8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp. 9*385cc6b4SJerry Jelinek * All rights reserved. 10*385cc6b4SJerry Jelinek * 11*385cc6b4SJerry Jelinek * Redistribution and use in source and binary forms, with or without 12*385cc6b4SJerry Jelinek * modification, are permitted provided that the following conditions 13*385cc6b4SJerry Jelinek * are met: 14*385cc6b4SJerry Jelinek * 1. Redistributions of source code must retain the above copyright 15*385cc6b4SJerry Jelinek * notice, this list of conditions, and the following disclaimer, 16*385cc6b4SJerry Jelinek * without modification. 17*385cc6b4SJerry Jelinek * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*385cc6b4SJerry Jelinek * substantially similar to the "NO WARRANTY" disclaimer below 19*385cc6b4SJerry Jelinek * ("Disclaimer") and any redistribution must be conditioned upon 20*385cc6b4SJerry Jelinek * including a substantially similar Disclaimer requirement for further 21*385cc6b4SJerry Jelinek * binary redistribution. 22*385cc6b4SJerry Jelinek * 3. Neither the names of the above-listed copyright holders nor the names 23*385cc6b4SJerry Jelinek * of any contributors may be used to endorse or promote products derived 24*385cc6b4SJerry Jelinek * from this software without specific prior written permission. 25*385cc6b4SJerry Jelinek * 26*385cc6b4SJerry Jelinek * Alternatively, this software may be distributed under the terms of the 27*385cc6b4SJerry Jelinek * GNU General Public License ("GPL") version 2 as published by the Free 28*385cc6b4SJerry Jelinek * Software Foundation. 29*385cc6b4SJerry Jelinek * 30*385cc6b4SJerry Jelinek * NO WARRANTY 31*385cc6b4SJerry Jelinek * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*385cc6b4SJerry Jelinek * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*385cc6b4SJerry Jelinek * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*385cc6b4SJerry Jelinek * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*385cc6b4SJerry Jelinek * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*385cc6b4SJerry Jelinek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*385cc6b4SJerry Jelinek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*385cc6b4SJerry Jelinek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*385cc6b4SJerry Jelinek * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*385cc6b4SJerry Jelinek * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*385cc6b4SJerry Jelinek * POSSIBILITY OF SUCH DAMAGES. 42*385cc6b4SJerry Jelinek */ 43*385cc6b4SJerry Jelinek 44*385cc6b4SJerry Jelinek #define EXPORT_ACPI_INTERFACES 45*385cc6b4SJerry Jelinek 46*385cc6b4SJerry Jelinek #include "acpi.h" 47*385cc6b4SJerry Jelinek #include "accommon.h" 48*385cc6b4SJerry Jelinek 49*385cc6b4SJerry Jelinek #define _COMPONENT ACPI_HARDWARE 50*385cc6b4SJerry Jelinek ACPI_MODULE_NAME ("hwxfsleep") 51*385cc6b4SJerry Jelinek 52*385cc6b4SJerry Jelinek /* Local prototypes */ 53*385cc6b4SJerry Jelinek 54*385cc6b4SJerry Jelinek #if (!ACPI_REDUCED_HARDWARE) 55*385cc6b4SJerry Jelinek static ACPI_STATUS 56*385cc6b4SJerry Jelinek AcpiHwSetFirmwareWakingVector ( 57*385cc6b4SJerry Jelinek ACPI_TABLE_FACS *Facs, 58*385cc6b4SJerry Jelinek ACPI_PHYSICAL_ADDRESS PhysicalAddress, 59*385cc6b4SJerry Jelinek ACPI_PHYSICAL_ADDRESS PhysicalAddress64); 60*385cc6b4SJerry Jelinek #endif 61*385cc6b4SJerry Jelinek 62*385cc6b4SJerry Jelinek static ACPI_STATUS 63*385cc6b4SJerry Jelinek AcpiHwSleepDispatch ( 64*385cc6b4SJerry Jelinek UINT8 SleepState, 65*385cc6b4SJerry Jelinek UINT32 FunctionId); 66*385cc6b4SJerry Jelinek 67*385cc6b4SJerry Jelinek /* 68*385cc6b4SJerry Jelinek * Dispatch table used to efficiently branch to the various sleep 69*385cc6b4SJerry Jelinek * functions. 70*385cc6b4SJerry Jelinek */ 71*385cc6b4SJerry Jelinek #define ACPI_SLEEP_FUNCTION_ID 0 72*385cc6b4SJerry Jelinek #define ACPI_WAKE_PREP_FUNCTION_ID 1 73*385cc6b4SJerry Jelinek #define ACPI_WAKE_FUNCTION_ID 2 74*385cc6b4SJerry Jelinek 75*385cc6b4SJerry Jelinek /* Legacy functions are optional, based upon ACPI_REDUCED_HARDWARE */ 76*385cc6b4SJerry Jelinek 77*385cc6b4SJerry Jelinek static ACPI_SLEEP_FUNCTIONS AcpiSleepDispatch[] = 78*385cc6b4SJerry Jelinek { 79*385cc6b4SJerry Jelinek {ACPI_HW_OPTIONAL_FUNCTION (AcpiHwLegacySleep), AcpiHwExtendedSleep}, 80*385cc6b4SJerry Jelinek {ACPI_HW_OPTIONAL_FUNCTION (AcpiHwLegacyWakePrep), AcpiHwExtendedWakePrep}, 81*385cc6b4SJerry Jelinek {ACPI_HW_OPTIONAL_FUNCTION (AcpiHwLegacyWake), AcpiHwExtendedWake} 82*385cc6b4SJerry Jelinek }; 83*385cc6b4SJerry Jelinek 84*385cc6b4SJerry Jelinek 85*385cc6b4SJerry Jelinek /* 86*385cc6b4SJerry Jelinek * These functions are removed for the ACPI_REDUCED_HARDWARE case: 87*385cc6b4SJerry Jelinek * AcpiSetFirmwareWakingVector 88*385cc6b4SJerry Jelinek * AcpiEnterSleepStateS4bios 89*385cc6b4SJerry Jelinek */ 90*385cc6b4SJerry Jelinek 91*385cc6b4SJerry Jelinek #if (!ACPI_REDUCED_HARDWARE) 92*385cc6b4SJerry Jelinek /******************************************************************************* 93*385cc6b4SJerry Jelinek * 94*385cc6b4SJerry Jelinek * FUNCTION: AcpiHwSetFirmwareWakingVector 95*385cc6b4SJerry Jelinek * 96*385cc6b4SJerry Jelinek * PARAMETERS: Facs - Pointer to FACS table 97*385cc6b4SJerry Jelinek * PhysicalAddress - 32-bit physical address of ACPI real mode 98*385cc6b4SJerry Jelinek * entry point 99*385cc6b4SJerry Jelinek * PhysicalAddress64 - 64-bit physical address of ACPI protected 100*385cc6b4SJerry Jelinek * mode entry point 101*385cc6b4SJerry Jelinek * 102*385cc6b4SJerry Jelinek * RETURN: Status 103*385cc6b4SJerry Jelinek * 104*385cc6b4SJerry Jelinek * DESCRIPTION: Sets the FirmwareWakingVector fields of the FACS 105*385cc6b4SJerry Jelinek * 106*385cc6b4SJerry Jelinek ******************************************************************************/ 107*385cc6b4SJerry Jelinek 108*385cc6b4SJerry Jelinek static ACPI_STATUS 109*385cc6b4SJerry Jelinek AcpiHwSetFirmwareWakingVector ( 110*385cc6b4SJerry Jelinek ACPI_TABLE_FACS *Facs, 111*385cc6b4SJerry Jelinek ACPI_PHYSICAL_ADDRESS PhysicalAddress, 112*385cc6b4SJerry Jelinek ACPI_PHYSICAL_ADDRESS PhysicalAddress64) 113*385cc6b4SJerry Jelinek { 114*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (AcpiHwSetFirmwareWakingVector); 115*385cc6b4SJerry Jelinek 116*385cc6b4SJerry Jelinek 117*385cc6b4SJerry Jelinek /* 118*385cc6b4SJerry Jelinek * According to the ACPI specification 2.0c and later, the 64-bit 119*385cc6b4SJerry Jelinek * waking vector should be cleared and the 32-bit waking vector should 120*385cc6b4SJerry Jelinek * be used, unless we want the wake-up code to be called by the BIOS in 121*385cc6b4SJerry Jelinek * Protected Mode. Some systems (for example HP dv5-1004nr) are known 122*385cc6b4SJerry Jelinek * to fail to resume if the 64-bit vector is used. 123*385cc6b4SJerry Jelinek */ 124*385cc6b4SJerry Jelinek 125*385cc6b4SJerry Jelinek /* Set the 32-bit vector */ 126*385cc6b4SJerry Jelinek 127*385cc6b4SJerry Jelinek Facs->FirmwareWakingVector = (UINT32) PhysicalAddress; 128*385cc6b4SJerry Jelinek 129*385cc6b4SJerry Jelinek if (Facs->Length > 32) 130*385cc6b4SJerry Jelinek { 131*385cc6b4SJerry Jelinek if (Facs->Version >= 1) 132*385cc6b4SJerry Jelinek { 133*385cc6b4SJerry Jelinek /* Set the 64-bit vector */ 134*385cc6b4SJerry Jelinek 135*385cc6b4SJerry Jelinek Facs->XFirmwareWakingVector = PhysicalAddress64; 136*385cc6b4SJerry Jelinek } 137*385cc6b4SJerry Jelinek else 138*385cc6b4SJerry Jelinek { 139*385cc6b4SJerry Jelinek /* Clear the 64-bit vector if it exists */ 140*385cc6b4SJerry Jelinek 141*385cc6b4SJerry Jelinek Facs->XFirmwareWakingVector = 0; 142*385cc6b4SJerry Jelinek } 143*385cc6b4SJerry Jelinek } 144*385cc6b4SJerry Jelinek 145*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_OK); 146*385cc6b4SJerry Jelinek } 147*385cc6b4SJerry Jelinek 148*385cc6b4SJerry Jelinek 149*385cc6b4SJerry Jelinek /******************************************************************************* 150*385cc6b4SJerry Jelinek * 151*385cc6b4SJerry Jelinek * FUNCTION: AcpiSetFirmwareWakingVector 152*385cc6b4SJerry Jelinek * 153*385cc6b4SJerry Jelinek * PARAMETERS: PhysicalAddress - 32-bit physical address of ACPI real mode 154*385cc6b4SJerry Jelinek * entry point 155*385cc6b4SJerry Jelinek * PhysicalAddress64 - 64-bit physical address of ACPI protected 156*385cc6b4SJerry Jelinek * mode entry point 157*385cc6b4SJerry Jelinek * 158*385cc6b4SJerry Jelinek * RETURN: Status 159*385cc6b4SJerry Jelinek * 160*385cc6b4SJerry Jelinek * DESCRIPTION: Sets the FirmwareWakingVector fields of the FACS 161*385cc6b4SJerry Jelinek * 162*385cc6b4SJerry Jelinek ******************************************************************************/ 163*385cc6b4SJerry Jelinek 164*385cc6b4SJerry Jelinek ACPI_STATUS 165*385cc6b4SJerry Jelinek AcpiSetFirmwareWakingVector ( 166*385cc6b4SJerry Jelinek ACPI_PHYSICAL_ADDRESS PhysicalAddress, 167*385cc6b4SJerry Jelinek ACPI_PHYSICAL_ADDRESS PhysicalAddress64) 168*385cc6b4SJerry Jelinek { 169*385cc6b4SJerry Jelinek 170*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (AcpiSetFirmwareWakingVector); 171*385cc6b4SJerry Jelinek 172*385cc6b4SJerry Jelinek if (AcpiGbl_FACS) 173*385cc6b4SJerry Jelinek { 174*385cc6b4SJerry Jelinek (void) AcpiHwSetFirmwareWakingVector (AcpiGbl_FACS, 175*385cc6b4SJerry Jelinek PhysicalAddress, PhysicalAddress64); 176*385cc6b4SJerry Jelinek } 177*385cc6b4SJerry Jelinek 178*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_OK); 179*385cc6b4SJerry Jelinek } 180*385cc6b4SJerry Jelinek 181*385cc6b4SJerry Jelinek ACPI_EXPORT_SYMBOL (AcpiSetFirmwareWakingVector) 182*385cc6b4SJerry Jelinek 183*385cc6b4SJerry Jelinek 184*385cc6b4SJerry Jelinek /******************************************************************************* 185*385cc6b4SJerry Jelinek * 186*385cc6b4SJerry Jelinek * FUNCTION: AcpiEnterSleepStateS4bios 187*385cc6b4SJerry Jelinek * 188*385cc6b4SJerry Jelinek * PARAMETERS: None 189*385cc6b4SJerry Jelinek * 190*385cc6b4SJerry Jelinek * RETURN: Status 191*385cc6b4SJerry Jelinek * 192*385cc6b4SJerry Jelinek * DESCRIPTION: Perform a S4 bios request. 193*385cc6b4SJerry Jelinek * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED 194*385cc6b4SJerry Jelinek * 195*385cc6b4SJerry Jelinek ******************************************************************************/ 196*385cc6b4SJerry Jelinek 197*385cc6b4SJerry Jelinek ACPI_STATUS 198*385cc6b4SJerry Jelinek AcpiEnterSleepStateS4bios ( 199*385cc6b4SJerry Jelinek void) 200*385cc6b4SJerry Jelinek { 201*385cc6b4SJerry Jelinek UINT32 InValue; 202*385cc6b4SJerry Jelinek ACPI_STATUS Status; 203*385cc6b4SJerry Jelinek 204*385cc6b4SJerry Jelinek 205*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (AcpiEnterSleepStateS4bios); 206*385cc6b4SJerry Jelinek 207*385cc6b4SJerry Jelinek 208*385cc6b4SJerry Jelinek /* Clear the wake status bit (PM1) */ 209*385cc6b4SJerry Jelinek 210*385cc6b4SJerry Jelinek Status = AcpiWriteBitRegister (ACPI_BITREG_WAKE_STATUS, ACPI_CLEAR_STATUS); 211*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status)) 212*385cc6b4SJerry Jelinek { 213*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 214*385cc6b4SJerry Jelinek } 215*385cc6b4SJerry Jelinek 216*385cc6b4SJerry Jelinek Status = AcpiHwClearAcpiStatus (); 217*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status)) 218*385cc6b4SJerry Jelinek { 219*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 220*385cc6b4SJerry Jelinek } 221*385cc6b4SJerry Jelinek 222*385cc6b4SJerry Jelinek /* 223*385cc6b4SJerry Jelinek * 1) Disable/Clear all GPEs 224*385cc6b4SJerry Jelinek * 2) Enable all wakeup GPEs 225*385cc6b4SJerry Jelinek */ 226*385cc6b4SJerry Jelinek Status = AcpiHwDisableAllGpes (); 227*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status)) 228*385cc6b4SJerry Jelinek { 229*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 230*385cc6b4SJerry Jelinek } 231*385cc6b4SJerry Jelinek AcpiGbl_SystemAwakeAndRunning = FALSE; 232*385cc6b4SJerry Jelinek 233*385cc6b4SJerry Jelinek Status = AcpiHwEnableAllWakeupGpes (); 234*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status)) 235*385cc6b4SJerry Jelinek { 236*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 237*385cc6b4SJerry Jelinek } 238*385cc6b4SJerry Jelinek 239*385cc6b4SJerry Jelinek ACPI_FLUSH_CPU_CACHE (); 240*385cc6b4SJerry Jelinek 241*385cc6b4SJerry Jelinek Status = AcpiHwWritePort (AcpiGbl_FADT.SmiCommand, 242*385cc6b4SJerry Jelinek (UINT32) AcpiGbl_FADT.S4BiosRequest, 8); 243*385cc6b4SJerry Jelinek 244*385cc6b4SJerry Jelinek do { 245*385cc6b4SJerry Jelinek AcpiOsStall (ACPI_USEC_PER_MSEC); 246*385cc6b4SJerry Jelinek Status = AcpiReadBitRegister (ACPI_BITREG_WAKE_STATUS, &InValue); 247*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status)) 248*385cc6b4SJerry Jelinek { 249*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 250*385cc6b4SJerry Jelinek } 251*385cc6b4SJerry Jelinek 252*385cc6b4SJerry Jelinek } while (!InValue); 253*385cc6b4SJerry Jelinek 254*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_OK); 255*385cc6b4SJerry Jelinek } 256*385cc6b4SJerry Jelinek 257*385cc6b4SJerry Jelinek ACPI_EXPORT_SYMBOL (AcpiEnterSleepStateS4bios) 258*385cc6b4SJerry Jelinek 259*385cc6b4SJerry Jelinek #endif /* !ACPI_REDUCED_HARDWARE */ 260*385cc6b4SJerry Jelinek 261*385cc6b4SJerry Jelinek 262*385cc6b4SJerry Jelinek /******************************************************************************* 263*385cc6b4SJerry Jelinek * 264*385cc6b4SJerry Jelinek * FUNCTION: AcpiHwSleepDispatch 265*385cc6b4SJerry Jelinek * 266*385cc6b4SJerry Jelinek * PARAMETERS: SleepState - Which sleep state to enter/exit 267*385cc6b4SJerry Jelinek * FunctionId - Sleep, WakePrep, or Wake 268*385cc6b4SJerry Jelinek * 269*385cc6b4SJerry Jelinek * RETURN: Status from the invoked sleep handling function. 270*385cc6b4SJerry Jelinek * 271*385cc6b4SJerry Jelinek * DESCRIPTION: Dispatch a sleep/wake request to the appropriate handling 272*385cc6b4SJerry Jelinek * function. 273*385cc6b4SJerry Jelinek * 274*385cc6b4SJerry Jelinek ******************************************************************************/ 275*385cc6b4SJerry Jelinek 276*385cc6b4SJerry Jelinek static ACPI_STATUS 277*385cc6b4SJerry Jelinek AcpiHwSleepDispatch ( 278*385cc6b4SJerry Jelinek UINT8 SleepState, 279*385cc6b4SJerry Jelinek UINT32 FunctionId) 280*385cc6b4SJerry Jelinek { 281*385cc6b4SJerry Jelinek ACPI_STATUS Status; 282*385cc6b4SJerry Jelinek ACPI_SLEEP_FUNCTIONS *SleepFunctions = &AcpiSleepDispatch[FunctionId]; 283*385cc6b4SJerry Jelinek 284*385cc6b4SJerry Jelinek 285*385cc6b4SJerry Jelinek #if (!ACPI_REDUCED_HARDWARE) 286*385cc6b4SJerry Jelinek /* 287*385cc6b4SJerry Jelinek * If the Hardware Reduced flag is set (from the FADT), we must 288*385cc6b4SJerry Jelinek * use the extended sleep registers (FADT). Note: As per the ACPI 289*385cc6b4SJerry Jelinek * specification, these extended registers are to be used for HW-reduced 290*385cc6b4SJerry Jelinek * platforms only. They are not general-purpose replacements for the 291*385cc6b4SJerry Jelinek * legacy PM register sleep support. 292*385cc6b4SJerry Jelinek */ 293*385cc6b4SJerry Jelinek if (AcpiGbl_ReducedHardware) 294*385cc6b4SJerry Jelinek { 295*385cc6b4SJerry Jelinek Status = SleepFunctions->ExtendedFunction (SleepState); 296*385cc6b4SJerry Jelinek } 297*385cc6b4SJerry Jelinek else 298*385cc6b4SJerry Jelinek { 299*385cc6b4SJerry Jelinek /* Legacy sleep */ 300*385cc6b4SJerry Jelinek 301*385cc6b4SJerry Jelinek Status = SleepFunctions->LegacyFunction (SleepState); 302*385cc6b4SJerry Jelinek } 303*385cc6b4SJerry Jelinek 304*385cc6b4SJerry Jelinek return (Status); 305*385cc6b4SJerry Jelinek 306*385cc6b4SJerry Jelinek #else 307*385cc6b4SJerry Jelinek /* 308*385cc6b4SJerry Jelinek * For the case where reduced-hardware-only code is being generated, 309*385cc6b4SJerry Jelinek * we know that only the extended sleep registers are available 310*385cc6b4SJerry Jelinek */ 311*385cc6b4SJerry Jelinek Status = SleepFunctions->ExtendedFunction (SleepState); 312*385cc6b4SJerry Jelinek return (Status); 313*385cc6b4SJerry Jelinek 314*385cc6b4SJerry Jelinek #endif /* !ACPI_REDUCED_HARDWARE */ 315*385cc6b4SJerry Jelinek } 316*385cc6b4SJerry Jelinek 317*385cc6b4SJerry Jelinek 318*385cc6b4SJerry Jelinek /******************************************************************************* 319*385cc6b4SJerry Jelinek * 320*385cc6b4SJerry Jelinek * FUNCTION: AcpiEnterSleepStatePrep 321*385cc6b4SJerry Jelinek * 322*385cc6b4SJerry Jelinek * PARAMETERS: SleepState - Which sleep state to enter 323*385cc6b4SJerry Jelinek * 324*385cc6b4SJerry Jelinek * RETURN: Status 325*385cc6b4SJerry Jelinek * 326*385cc6b4SJerry Jelinek * DESCRIPTION: Prepare to enter a system sleep state. 327*385cc6b4SJerry Jelinek * This function must execute with interrupts enabled. 328*385cc6b4SJerry Jelinek * We break sleeping into 2 stages so that OSPM can handle 329*385cc6b4SJerry Jelinek * various OS-specific tasks between the two steps. 330*385cc6b4SJerry Jelinek * 331*385cc6b4SJerry Jelinek ******************************************************************************/ 332*385cc6b4SJerry Jelinek 333*385cc6b4SJerry Jelinek ACPI_STATUS 334*385cc6b4SJerry Jelinek AcpiEnterSleepStatePrep ( 335*385cc6b4SJerry Jelinek UINT8 SleepState) 336*385cc6b4SJerry Jelinek { 337*385cc6b4SJerry Jelinek ACPI_STATUS Status; 338*385cc6b4SJerry Jelinek ACPI_OBJECT_LIST ArgList; 339*385cc6b4SJerry Jelinek ACPI_OBJECT Arg; 340*385cc6b4SJerry Jelinek UINT32 SstValue; 341*385cc6b4SJerry Jelinek 342*385cc6b4SJerry Jelinek 343*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (AcpiEnterSleepStatePrep); 344*385cc6b4SJerry Jelinek 345*385cc6b4SJerry Jelinek 346*385cc6b4SJerry Jelinek Status = AcpiGetSleepTypeData (SleepState, 347*385cc6b4SJerry Jelinek &AcpiGbl_SleepTypeA, &AcpiGbl_SleepTypeB); 348*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status)) 349*385cc6b4SJerry Jelinek { 350*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 351*385cc6b4SJerry Jelinek } 352*385cc6b4SJerry Jelinek 353*385cc6b4SJerry Jelinek /* Execute the _PTS method (Prepare To Sleep) */ 354*385cc6b4SJerry Jelinek 355*385cc6b4SJerry Jelinek ArgList.Count = 1; 356*385cc6b4SJerry Jelinek ArgList.Pointer = &Arg; 357*385cc6b4SJerry Jelinek Arg.Type = ACPI_TYPE_INTEGER; 358*385cc6b4SJerry Jelinek Arg.Integer.Value = SleepState; 359*385cc6b4SJerry Jelinek 360*385cc6b4SJerry Jelinek Status = AcpiEvaluateObject (NULL, METHOD_PATHNAME__PTS, &ArgList, NULL); 361*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 362*385cc6b4SJerry Jelinek { 363*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 364*385cc6b4SJerry Jelinek } 365*385cc6b4SJerry Jelinek 366*385cc6b4SJerry Jelinek /* Setup the argument to the _SST method (System STatus) */ 367*385cc6b4SJerry Jelinek 368*385cc6b4SJerry Jelinek switch (SleepState) 369*385cc6b4SJerry Jelinek { 370*385cc6b4SJerry Jelinek case ACPI_STATE_S0: 371*385cc6b4SJerry Jelinek 372*385cc6b4SJerry Jelinek SstValue = ACPI_SST_WORKING; 373*385cc6b4SJerry Jelinek break; 374*385cc6b4SJerry Jelinek 375*385cc6b4SJerry Jelinek case ACPI_STATE_S1: 376*385cc6b4SJerry Jelinek case ACPI_STATE_S2: 377*385cc6b4SJerry Jelinek case ACPI_STATE_S3: 378*385cc6b4SJerry Jelinek 379*385cc6b4SJerry Jelinek SstValue = ACPI_SST_SLEEPING; 380*385cc6b4SJerry Jelinek break; 381*385cc6b4SJerry Jelinek 382*385cc6b4SJerry Jelinek case ACPI_STATE_S4: 383*385cc6b4SJerry Jelinek 384*385cc6b4SJerry Jelinek SstValue = ACPI_SST_SLEEP_CONTEXT; 385*385cc6b4SJerry Jelinek break; 386*385cc6b4SJerry Jelinek 387*385cc6b4SJerry Jelinek default: 388*385cc6b4SJerry Jelinek 389*385cc6b4SJerry Jelinek SstValue = ACPI_SST_INDICATOR_OFF; /* Default is off */ 390*385cc6b4SJerry Jelinek break; 391*385cc6b4SJerry Jelinek } 392*385cc6b4SJerry Jelinek 393*385cc6b4SJerry Jelinek /* 394*385cc6b4SJerry Jelinek * Set the system indicators to show the desired sleep state. 395*385cc6b4SJerry Jelinek * _SST is an optional method (return no error if not found) 396*385cc6b4SJerry Jelinek */ 397*385cc6b4SJerry Jelinek AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, SstValue); 398*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_OK); 399*385cc6b4SJerry Jelinek } 400*385cc6b4SJerry Jelinek 401*385cc6b4SJerry Jelinek ACPI_EXPORT_SYMBOL (AcpiEnterSleepStatePrep) 402*385cc6b4SJerry Jelinek 403*385cc6b4SJerry Jelinek 404*385cc6b4SJerry Jelinek /******************************************************************************* 405*385cc6b4SJerry Jelinek * 406*385cc6b4SJerry Jelinek * FUNCTION: AcpiEnterSleepState 407*385cc6b4SJerry Jelinek * 408*385cc6b4SJerry Jelinek * PARAMETERS: SleepState - Which sleep state to enter 409*385cc6b4SJerry Jelinek * 410*385cc6b4SJerry Jelinek * RETURN: Status 411*385cc6b4SJerry Jelinek * 412*385cc6b4SJerry Jelinek * DESCRIPTION: Enter a system sleep state 413*385cc6b4SJerry Jelinek * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED 414*385cc6b4SJerry Jelinek * 415*385cc6b4SJerry Jelinek ******************************************************************************/ 416*385cc6b4SJerry Jelinek 417*385cc6b4SJerry Jelinek ACPI_STATUS 418*385cc6b4SJerry Jelinek AcpiEnterSleepState ( 419*385cc6b4SJerry Jelinek UINT8 SleepState) 420*385cc6b4SJerry Jelinek { 421*385cc6b4SJerry Jelinek ACPI_STATUS Status; 422*385cc6b4SJerry Jelinek 423*385cc6b4SJerry Jelinek 424*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (AcpiEnterSleepState); 425*385cc6b4SJerry Jelinek 426*385cc6b4SJerry Jelinek 427*385cc6b4SJerry Jelinek if ((AcpiGbl_SleepTypeA > ACPI_SLEEP_TYPE_MAX) || 428*385cc6b4SJerry Jelinek (AcpiGbl_SleepTypeB > ACPI_SLEEP_TYPE_MAX)) 429*385cc6b4SJerry Jelinek { 430*385cc6b4SJerry Jelinek ACPI_ERROR ((AE_INFO, "Sleep values out of range: A=0x%X B=0x%X", 431*385cc6b4SJerry Jelinek AcpiGbl_SleepTypeA, AcpiGbl_SleepTypeB)); 432*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_AML_OPERAND_VALUE); 433*385cc6b4SJerry Jelinek } 434*385cc6b4SJerry Jelinek 435*385cc6b4SJerry Jelinek Status = AcpiHwSleepDispatch (SleepState, ACPI_SLEEP_FUNCTION_ID); 436*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 437*385cc6b4SJerry Jelinek } 438*385cc6b4SJerry Jelinek 439*385cc6b4SJerry Jelinek ACPI_EXPORT_SYMBOL (AcpiEnterSleepState) 440*385cc6b4SJerry Jelinek 441*385cc6b4SJerry Jelinek 442*385cc6b4SJerry Jelinek /******************************************************************************* 443*385cc6b4SJerry Jelinek * 444*385cc6b4SJerry Jelinek * FUNCTION: AcpiLeaveSleepStatePrep 445*385cc6b4SJerry Jelinek * 446*385cc6b4SJerry Jelinek * PARAMETERS: SleepState - Which sleep state we are exiting 447*385cc6b4SJerry Jelinek * 448*385cc6b4SJerry Jelinek * RETURN: Status 449*385cc6b4SJerry Jelinek * 450*385cc6b4SJerry Jelinek * DESCRIPTION: Perform the first state of OS-independent ACPI cleanup after a 451*385cc6b4SJerry Jelinek * sleep. Called with interrupts DISABLED. 452*385cc6b4SJerry Jelinek * We break wake/resume into 2 stages so that OSPM can handle 453*385cc6b4SJerry Jelinek * various OS-specific tasks between the two steps. 454*385cc6b4SJerry Jelinek * 455*385cc6b4SJerry Jelinek ******************************************************************************/ 456*385cc6b4SJerry Jelinek 457*385cc6b4SJerry Jelinek ACPI_STATUS 458*385cc6b4SJerry Jelinek AcpiLeaveSleepStatePrep ( 459*385cc6b4SJerry Jelinek UINT8 SleepState) 460*385cc6b4SJerry Jelinek { 461*385cc6b4SJerry Jelinek ACPI_STATUS Status; 462*385cc6b4SJerry Jelinek 463*385cc6b4SJerry Jelinek 464*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (AcpiLeaveSleepStatePrep); 465*385cc6b4SJerry Jelinek 466*385cc6b4SJerry Jelinek 467*385cc6b4SJerry Jelinek Status = AcpiHwSleepDispatch (SleepState, ACPI_WAKE_PREP_FUNCTION_ID); 468*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 469*385cc6b4SJerry Jelinek } 470*385cc6b4SJerry Jelinek 471*385cc6b4SJerry Jelinek ACPI_EXPORT_SYMBOL (AcpiLeaveSleepStatePrep) 472*385cc6b4SJerry Jelinek 473*385cc6b4SJerry Jelinek 474*385cc6b4SJerry Jelinek /******************************************************************************* 475*385cc6b4SJerry Jelinek * 476*385cc6b4SJerry Jelinek * FUNCTION: AcpiLeaveSleepState 477*385cc6b4SJerry Jelinek * 478*385cc6b4SJerry Jelinek * PARAMETERS: SleepState - Which sleep state we are exiting 479*385cc6b4SJerry Jelinek * 480*385cc6b4SJerry Jelinek * RETURN: Status 481*385cc6b4SJerry Jelinek * 482*385cc6b4SJerry Jelinek * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep 483*385cc6b4SJerry Jelinek * Called with interrupts ENABLED. 484*385cc6b4SJerry Jelinek * 485*385cc6b4SJerry Jelinek ******************************************************************************/ 486*385cc6b4SJerry Jelinek 487*385cc6b4SJerry Jelinek ACPI_STATUS 488*385cc6b4SJerry Jelinek AcpiLeaveSleepState ( 489*385cc6b4SJerry Jelinek UINT8 SleepState) 490*385cc6b4SJerry Jelinek { 491*385cc6b4SJerry Jelinek ACPI_STATUS Status; 492*385cc6b4SJerry Jelinek 493*385cc6b4SJerry Jelinek 494*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (AcpiLeaveSleepState); 495*385cc6b4SJerry Jelinek 496*385cc6b4SJerry Jelinek 497*385cc6b4SJerry Jelinek Status = AcpiHwSleepDispatch (SleepState, ACPI_WAKE_FUNCTION_ID); 498*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 499*385cc6b4SJerry Jelinek } 500*385cc6b4SJerry Jelinek 501*385cc6b4SJerry Jelinek ACPI_EXPORT_SYMBOL (AcpiLeaveSleepState) 502