xref: /freebsd/sys/contrib/dev/acpica/components/hardware/hwxfsleep.c (revision a159c266a93c3c4f229864954c5f963acd8f60f2)
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