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