Blame view

include/linux/suspend.h 17.1 KB
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
1
2
  #ifndef _LINUX_SUSPEND_H
  #define _LINUX_SUSPEND_H
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
5
  #include <linux/swap.h>
  #include <linux/notifier.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
  #include <linux/init.h>
  #include <linux/pm.h>
7be982349   Rafael J. Wysocki   swsusp: use inlin...
8
  #include <linux/mm.h>
33e638b90   Srivatsa S. Bhat   PM / Sleep: Use t...
9
  #include <linux/freezer.h>
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
10
  #include <asm/errno.h>
37cce26b3   H Hartley Sweeten   PM / VT: Cleanup ...
11
  #ifdef CONFIG_VT
b6f448e99   Andres Salomon   PM/gxfb: add hook...
12
  extern void pm_set_vt_switch(int);
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
13
  #else
b6f448e99   Andres Salomon   PM/gxfb: add hook...
14
15
16
  static inline void pm_set_vt_switch(int do_switch)
  {
  }
37cce26b3   H Hartley Sweeten   PM / VT: Cleanup ...
17
  #endif
b6f448e99   Andres Salomon   PM/gxfb: add hook...
18

37cce26b3   H Hartley Sweeten   PM / VT: Cleanup ...
19
20
21
22
  #ifdef CONFIG_VT_CONSOLE_SLEEP
  extern int pm_prepare_console(void);
  extern void pm_restore_console(void);
  #else
b6f448e99   Andres Salomon   PM/gxfb: add hook...
23
24
25
26
27
28
29
30
  static inline int pm_prepare_console(void)
  {
  	return 0;
  }
  
  static inline void pm_restore_console(void)
  {
  }
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
31
32
33
34
35
  #endif
  
  typedef int __bitwise suspend_state_t;
  
  #define PM_SUSPEND_ON		((__force suspend_state_t) 0)
7e73c5ae6   Zhang Rui   PM: Introduce sus...
36
37
  #define PM_SUSPEND_FREEZE	((__force suspend_state_t) 1)
  #define PM_SUSPEND_STANDBY	((__force suspend_state_t) 2)
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
38
  #define PM_SUSPEND_MEM		((__force suspend_state_t) 3)
7e73c5ae6   Zhang Rui   PM: Introduce sus...
39
  #define PM_SUSPEND_MIN		PM_SUSPEND_FREEZE
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
40
  #define PM_SUSPEND_MAX		((__force suspend_state_t) 4)
2a77c46de   ShuoX Liu   PM / Suspend: Add...
41
42
43
44
  enum suspend_stat_step {
  	SUSPEND_FREEZE = 1,
  	SUSPEND_PREPARE,
  	SUSPEND_SUSPEND,
cf579dfb8   Rafael J. Wysocki   PM / Sleep: Intro...
45
  	SUSPEND_SUSPEND_LATE,
2a77c46de   ShuoX Liu   PM / Suspend: Add...
46
47
  	SUSPEND_SUSPEND_NOIRQ,
  	SUSPEND_RESUME_NOIRQ,
cf579dfb8   Rafael J. Wysocki   PM / Sleep: Intro...
48
  	SUSPEND_RESUME_EARLY,
2a77c46de   ShuoX Liu   PM / Suspend: Add...
49
50
51
52
53
54
55
56
57
  	SUSPEND_RESUME
  };
  
  struct suspend_stats {
  	int	success;
  	int	fail;
  	int	failed_freeze;
  	int	failed_prepare;
  	int	failed_suspend;
cf579dfb8   Rafael J. Wysocki   PM / Sleep: Intro...
58
  	int	failed_suspend_late;
2a77c46de   ShuoX Liu   PM / Suspend: Add...
59
60
  	int	failed_suspend_noirq;
  	int	failed_resume;
cf579dfb8   Rafael J. Wysocki   PM / Sleep: Intro...
61
  	int	failed_resume_early;
2a77c46de   ShuoX Liu   PM / Suspend: Add...
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
  	int	failed_resume_noirq;
  #define	REC_FAILED_NUM	2
  	int	last_failed_dev;
  	char	failed_devs[REC_FAILED_NUM][40];
  	int	last_failed_errno;
  	int	errno[REC_FAILED_NUM];
  	int	last_failed_step;
  	enum suspend_stat_step	failed_steps[REC_FAILED_NUM];
  };
  
  extern struct suspend_stats suspend_stats;
  
  static inline void dpm_save_failed_dev(const char *name)
  {
  	strlcpy(suspend_stats.failed_devs[suspend_stats.last_failed_dev],
  		name,
  		sizeof(suspend_stats.failed_devs[0]));
  	suspend_stats.last_failed_dev++;
  	suspend_stats.last_failed_dev %= REC_FAILED_NUM;
  }
  
  static inline void dpm_save_failed_errno(int err)
  {
  	suspend_stats.errno[suspend_stats.last_failed_errno] = err;
  	suspend_stats.last_failed_errno++;
  	suspend_stats.last_failed_errno %= REC_FAILED_NUM;
  }
  
  static inline void dpm_save_failed_step(enum suspend_stat_step step)
  {
  	suspend_stats.failed_steps[suspend_stats.last_failed_step] = step;
  	suspend_stats.last_failed_step++;
  	suspend_stats.last_failed_step %= REC_FAILED_NUM;
  }
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
96
  /**
26398a70e   Rafael J. Wysocki   PM: Rename struct...
97
98
   * struct platform_suspend_ops - Callbacks for managing platform dependent
   *	system sleep states.
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
99
100
101
102
103
104
   *
   * @valid: Callback to determine if given system sleep state is supported by
   *	the platform.
   *	Valid (ie. supported) states are advertised in /sys/power/state.  Note
   *	that it still may be impossible to enter given system sleep state if the
   *	conditions aren't right.
26398a70e   Rafael J. Wysocki   PM: Rename struct...
105
106
   *	There is the %suspend_valid_only_mem function available that can be
   *	assigned to this if the platform only supports mem sleep.
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
107
   *
c697eeceb   Rafael J. Wysocki   Suspend: Introduc...
108
109
110
111
   * @begin: Initialise a transition to given system sleep state.
   *	@begin() is executed right prior to suspending devices.  The information
   *	conveyed to the platform code by @begin() should be disregarded by it as
   *	soon as @end() is executed.  If @begin() fails (ie. returns nonzero),
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
112
113
   *	@prepare(), @enter() and @finish() will not be called by the PM core.
   *	This callback is optional.  However, if it is implemented, the argument
c697eeceb   Rafael J. Wysocki   Suspend: Introduc...
114
   *	passed to @enter() is redundant and should be ignored.
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
115
116
   *
   * @prepare: Prepare the platform for entering the system sleep state indicated
c697eeceb   Rafael J. Wysocki   Suspend: Introduc...
117
   *	by @begin().
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
118
119
   *	@prepare() is called right after devices have been suspended (ie. the
   *	appropriate .suspend() method has been executed for each device) and
6a7c7eaf7   Rafael J. Wysocki   PM/Suspend: Intro...
120
121
122
   *	before device drivers' late suspend callbacks are executed.  It returns
   *	0 on success or a negative error code otherwise, in which case the
   *	system cannot enter the desired sleep state (@prepare_late(), @enter(),
ce4410116   Rafael J. Wysocki   PM / Suspend: Fix...
123
   *	and @wake() will not be called in that case).
6a7c7eaf7   Rafael J. Wysocki   PM/Suspend: Intro...
124
125
126
127
128
129
   *
   * @prepare_late: Finish preparing the platform for entering the system sleep
   *	state indicated by @begin().
   *	@prepare_late is called before disabling nonboot CPUs and after
   *	device drivers' late suspend callbacks have been executed.  It returns
   *	0 on success or a negative error code otherwise, in which case the
ce4410116   Rafael J. Wysocki   PM / Suspend: Fix...
130
131
   *	system cannot enter the desired sleep state (@enter() will not be
   *	executed).
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
132
   *
c697eeceb   Rafael J. Wysocki   Suspend: Introduc...
133
134
   * @enter: Enter the system sleep state indicated by @begin() or represented by
   *	the argument if @begin() is not implemented.
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
135
136
137
138
   *	This callback is mandatory.  It returns 0 on success or a negative
   *	error code otherwise, in which case the system cannot enter the desired
   *	sleep state.
   *
6a7c7eaf7   Rafael J. Wysocki   PM/Suspend: Intro...
139
140
141
142
143
   * @wake: Called when the system has just left a sleep state, right after
   *	the nonboot CPUs have been enabled and before device drivers' early
   *	resume callbacks are executed.
   *	This callback is optional, but should be implemented by the platforms
   *	that implement @prepare_late().  If implemented, it is always called
ce4410116   Rafael J. Wysocki   PM / Suspend: Fix...
144
   *	after @prepare_late and @enter(), even if one of them fails.
6a7c7eaf7   Rafael J. Wysocki   PM/Suspend: Intro...
145
146
147
148
   *
   * @finish: Finish wake-up of the platform.
   *	@finish is called right prior to calling device drivers' regular suspend
   *	callbacks.
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
149
150
   *	This callback is optional, but should be implemented by the platforms
   *	that implement @prepare().  If implemented, it is always called after
ce4410116   Rafael J. Wysocki   PM / Suspend: Fix...
151
152
   *	@enter() and @wake(), even if any of them fails.  It is executed after
   *	a failing @prepare.
c697eeceb   Rafael J. Wysocki   Suspend: Introduc...
153
   *
3b5fe8525   MyungJoo Ham   PM / Suspend: Add...
154
155
156
157
158
159
160
   * @suspend_again: Returns whether the system should suspend again (true) or
   *	not (false). If the platform wants to poll sensors or execute some
   *	code during suspended without invoking userspace and most of devices,
   *	suspend_again callback is the place assuming that periodic-wakeup or
   *	alarm-wakeup is already setup. This allows to execute some codes while
   *	being kept suspended in the view of userland and devices.
   *
c697eeceb   Rafael J. Wysocki   Suspend: Introduc...
161
162
163
164
   * @end: Called by the PM core right after resuming devices, to indicate to
   *	the platform that the system has returned to the working state or
   *	the transition to the sleep state has been aborted.
   *	This callback is optional, but should be implemented by the platforms
6a7c7eaf7   Rafael J. Wysocki   PM/Suspend: Intro...
165
166
   *	that implement @begin().  Accordingly, platforms implementing @begin()
   *	should also provide a @end() which cleans up transitions aborted before
c697eeceb   Rafael J. Wysocki   Suspend: Introduc...
167
   *	@enter().
d8f3de0d2   Rafael J. Wysocki   Suspend-related p...
168
169
170
171
172
   *
   * @recover: Recover the platform from a suspend failure.
   *	Called by the PM core if the suspending of devices fails.
   *	This callback is optional and should only be implemented by platforms
   *	which require special recovery actions in that situation.
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
173
   */
26398a70e   Rafael J. Wysocki   PM: Rename struct...
174
  struct platform_suspend_ops {
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
175
  	int (*valid)(suspend_state_t state);
c697eeceb   Rafael J. Wysocki   Suspend: Introduc...
176
  	int (*begin)(suspend_state_t state);
e6c5eb954   Rafael J. Wysocki   PM: Rework struct...
177
  	int (*prepare)(void);
6a7c7eaf7   Rafael J. Wysocki   PM/Suspend: Intro...
178
  	int (*prepare_late)(void);
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
179
  	int (*enter)(suspend_state_t state);
6a7c7eaf7   Rafael J. Wysocki   PM/Suspend: Intro...
180
  	void (*wake)(void);
e6c5eb954   Rafael J. Wysocki   PM: Rework struct...
181
  	void (*finish)(void);
3b5fe8525   MyungJoo Ham   PM / Suspend: Add...
182
  	bool (*suspend_again)(void);
c697eeceb   Rafael J. Wysocki   Suspend: Introduc...
183
  	void (*end)(void);
d8f3de0d2   Rafael J. Wysocki   Suspend-related p...
184
  	void (*recover)(void);
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
185
  };
1f0b63866   Rafael J. Wysocki   ACPI / PM: Hold A...
186
187
  struct platform_freeze_ops {
  	int (*begin)(void);
a8d46b9e4   Rafael J. Wysocki   ACPI / sleep: Rew...
188
189
  	int (*prepare)(void);
  	void (*restore)(void);
1f0b63866   Rafael J. Wysocki   ACPI / PM: Hold A...
190
191
  	void (*end)(void);
  };
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
192
  #ifdef CONFIG_SUSPEND
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
193
  /**
26398a70e   Rafael J. Wysocki   PM: Rename struct...
194
195
   * suspend_set_ops - set platform dependent suspend operations
   * @ops: The new suspend operations to set.
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
196
   */
2f55ac072   Lionel Debroux   suspend: constify...
197
  extern void suspend_set_ops(const struct platform_suspend_ops *ops);
26398a70e   Rafael J. Wysocki   PM: Rename struct...
198
  extern int suspend_valid_only_mem(suspend_state_t state);
381063133   Rafael J. Wysocki   PM / sleep: Re-im...
199
200
201
202
203
204
205
206
207
208
209
210
211
212
  
  /* Suspend-to-idle state machnine. */
  enum freeze_state {
  	FREEZE_STATE_NONE,      /* Not suspended/suspending. */
  	FREEZE_STATE_ENTER,     /* Enter suspend-to-idle. */
  	FREEZE_STATE_WAKE,      /* Wake up from suspend-to-idle. */
  };
  
  extern enum freeze_state __read_mostly suspend_freeze_state;
  
  static inline bool idle_should_freeze(void)
  {
  	return unlikely(suspend_freeze_state == FREEZE_STATE_ENTER);
  }
1f0b63866   Rafael J. Wysocki   ACPI / PM: Hold A...
213
  extern void freeze_set_ops(const struct platform_freeze_ops *ops);
7e73c5ae6   Zhang Rui   PM: Introduce sus...
214
  extern void freeze_wake(void);
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
  
  /**
   * arch_suspend_disable_irqs - disable IRQs for suspend
   *
   * Disables IRQs (in the default case). This is a weak symbol in the common
   * code and thus allows architectures to override it if more needs to be
   * done. Not called for suspend to disk.
   */
  extern void arch_suspend_disable_irqs(void);
  
  /**
   * arch_suspend_enable_irqs - enable IRQs after suspend
   *
   * Enables IRQs (in the default case). This is a weak symbol in the common
   * code and thus allows architectures to override it if more needs to be
   * done. Not called for suspend to disk.
   */
  extern void arch_suspend_enable_irqs(void);
  
  extern int pm_suspend(suspend_state_t state);
  #else /* !CONFIG_SUSPEND */
  #define suspend_valid_only_mem	NULL
2f55ac072   Lionel Debroux   suspend: constify...
237
  static inline void suspend_set_ops(const struct platform_suspend_ops *ops) {}
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
238
  static inline int pm_suspend(suspend_state_t state) { return -ENOSYS; }
381063133   Rafael J. Wysocki   PM / sleep: Re-im...
239
  static inline bool idle_should_freeze(void) { return false; }
1f0b63866   Rafael J. Wysocki   ACPI / PM: Hold A...
240
  static inline void freeze_set_ops(const struct platform_freeze_ops *ops) {}
7e73c5ae6   Zhang Rui   PM: Introduce sus...
241
  static inline void freeze_wake(void) {}
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
242
  #endif /* !CONFIG_SUSPEND */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
243

8357376d3   Rafael J. Wysocki   [PATCH] swsusp: I...
244
245
246
247
  /* struct pbe is used for creating lists of pages that should be restored
   * atomically during the resume from disk, because the page frames they have
   * occupied before the suspend are in use.
   */
dcbb5a54f   Rafael J. Wysocki   [PATCH] swsusp: c...
248
  struct pbe {
8357376d3   Rafael J. Wysocki   [PATCH] swsusp: I...
249
250
  	void *address;		/* address of the copy */
  	void *orig_address;	/* original address of a page */
7088a5c00   Rafael J. Wysocki   [PATCH] swsusp: i...
251
  	struct pbe *next;
dcbb5a54f   Rafael J. Wysocki   [PATCH] swsusp: c...
252
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
253

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
254
  /* mm/page_alloc.c */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255
  extern void mark_free_pages(struct zone *zone);
a3d25c275   Rafael J. Wysocki   PM: Separate hibe...
256
  /**
b3dac3b30   Rafael J. Wysocki   PM: Rename hibern...
257
   * struct platform_hibernation_ops - hibernation platform support
a3d25c275   Rafael J. Wysocki   PM: Separate hibe...
258
   *
caea99ef3   Rafael J. Wysocki   Hibernation: Intr...
259
260
   * The methods in this structure allow a platform to carry out special
   * operations required by it during a hibernation transition.
a3d25c275   Rafael J. Wysocki   PM: Separate hibe...
261
   *
d8f3de0d2   Rafael J. Wysocki   Suspend-related p...
262
   * All the methods below, except for @recover(), must be implemented.
a3d25c275   Rafael J. Wysocki   PM: Separate hibe...
263
   *
caea99ef3   Rafael J. Wysocki   Hibernation: Intr...
264
   * @begin: Tell the platform driver that we're starting hibernation.
74f270af0   Rafael J. Wysocki   PM: Rework struct...
265
266
   *	Called right after shrinking memory and before freezing devices.
   *
caea99ef3   Rafael J. Wysocki   Hibernation: Intr...
267
268
269
   * @end: Called by the PM core right after resuming devices, to indicate to
   *	the platform that the system has returned to the working state.
   *
74f270af0   Rafael J. Wysocki   PM: Rework struct...
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
   * @pre_snapshot: Prepare the platform for creating the hibernation image.
   *	Called right after devices have been frozen and before the nonboot
   *	CPUs are disabled (runs with IRQs on).
   *
   * @finish: Restore the previous state of the platform after the hibernation
   *	image has been created *or* put the platform into the normal operation
   *	mode after the hibernation (the same method is executed in both cases).
   *	Called right after the nonboot CPUs have been enabled and before
   *	thawing devices (runs with IRQs on).
   *
   * @prepare: Prepare the platform for entering the low power state.
   *	Called right after the hibernation image has been saved and before
   *	devices are prepared for entering the low power state.
   *
   * @enter: Put the system into the low power state after the hibernation image
   *	has been saved to disk.
   *	Called after the nonboot CPUs have been disabled and all of the low
   *	level devices have been shut down (runs with IRQs off).
   *
c7e0831d3   Rafael J. Wysocki   Hibernation: Chec...
289
290
291
292
293
294
   * @leave: Perform the first stage of the cleanup after the system sleep state
   *	indicated by @set_target() has been left.
   *	Called right after the control has been passed from the boot kernel to
   *	the image kernel, before the nonboot CPUs are enabled and before devices
   *	are resumed.  Executed with interrupts disabled.
   *
74f270af0   Rafael J. Wysocki   PM: Rework struct...
295
296
297
298
299
300
301
   * @pre_restore: Prepare system for the restoration from a hibernation image.
   *	Called right after devices have been frozen and before the nonboot
   *	CPUs are disabled (runs with IRQs on).
   *
   * @restore_cleanup: Clean up after a failing image restoration.
   *	Called right after the nonboot CPUs have been enabled and before
   *	thawing devices (runs with IRQs on).
d8f3de0d2   Rafael J. Wysocki   Suspend-related p...
302
303
304
305
306
   *
   * @recover: Recover the platform from a failure to suspend devices.
   *	Called by the PM core if the suspending of devices during hibernation
   *	fails.  This callback is optional and should only be implemented by
   *	platforms which require special recovery actions in that situation.
a3d25c275   Rafael J. Wysocki   PM: Separate hibe...
307
   */
b3dac3b30   Rafael J. Wysocki   PM: Rename hibern...
308
  struct platform_hibernation_ops {
caea99ef3   Rafael J. Wysocki   Hibernation: Intr...
309
310
  	int (*begin)(void);
  	void (*end)(void);
74f270af0   Rafael J. Wysocki   PM: Rework struct...
311
312
  	int (*pre_snapshot)(void);
  	void (*finish)(void);
a3d25c275   Rafael J. Wysocki   PM: Separate hibe...
313
314
  	int (*prepare)(void);
  	int (*enter)(void);
c7e0831d3   Rafael J. Wysocki   Hibernation: Chec...
315
  	void (*leave)(void);
a634cc101   Rafael J. Wysocki   swsusp: introduce...
316
317
  	int (*pre_restore)(void);
  	void (*restore_cleanup)(void);
d8f3de0d2   Rafael J. Wysocki   Suspend-related p...
318
  	void (*recover)(void);
a3d25c275   Rafael J. Wysocki   PM: Separate hibe...
319
  };
b0cb1a19d   Rafael J. Wysocki   Replace CONFIG_SO...
320
  #ifdef CONFIG_HIBERNATION
74dfd666d   Rafael J. Wysocki   swsusp: do not us...
321
  /* kernel/power/snapshot.c */
940d67f6b   Johannes Berg   [POWERPC] swsusp:...
322
  extern void __register_nosave_region(unsigned long b, unsigned long e, int km);
ce289e897   Marcin Slusarz   suspend: fix sect...
323
  static inline void __init register_nosave_region(unsigned long b, unsigned long e)
940d67f6b   Johannes Berg   [POWERPC] swsusp:...
324
325
326
  {
  	__register_nosave_region(b, e, 0);
  }
ce289e897   Marcin Slusarz   suspend: fix sect...
327
  static inline void __init register_nosave_region_late(unsigned long b, unsigned long e)
940d67f6b   Johannes Berg   [POWERPC] swsusp:...
328
329
330
  {
  	__register_nosave_region(b, e, 1);
  }
74dfd666d   Rafael J. Wysocki   swsusp: do not us...
331
332
333
334
  extern int swsusp_page_is_forbidden(struct page *);
  extern void swsusp_set_page_free(struct page *);
  extern void swsusp_unset_page_free(struct page *);
  extern unsigned long get_safe_page(gfp_t gfp_mask);
a3d25c275   Rafael J. Wysocki   PM: Separate hibe...
335

073ef1f6e   Lionel Debroux   hibernation: cons...
336
  extern void hibernation_set_ops(const struct platform_hibernation_ops *ops);
a3d25c275   Rafael J. Wysocki   PM: Separate hibe...
337
  extern int hibernate(void);
abfe2d7b9   Rafael J. Wysocki   Hibernation: Intr...
338
  extern bool system_entering_hibernation(void);
a6e15a390   Kees Cook   PM / hibernate: i...
339
  extern bool hibernation_available(void);
603fb42a6   Sebastian Capella   ARM: 8011/1: ARM ...
340
341
  asmlinkage int swsusp_save(void);
  extern struct pbe *restore_pblist;
b0cb1a19d   Rafael J. Wysocki   Replace CONFIG_SO...
342
  #else /* CONFIG_HIBERNATION */
1f112cee0   Rafael J. Wysocki   PM / Hibernate: I...
343
344
  static inline void register_nosave_region(unsigned long b, unsigned long e) {}
  static inline void register_nosave_region_late(unsigned long b, unsigned long e) {}
74dfd666d   Rafael J. Wysocki   swsusp: do not us...
345
346
347
  static inline int swsusp_page_is_forbidden(struct page *p) { return 0; }
  static inline void swsusp_set_page_free(struct page *p) {}
  static inline void swsusp_unset_page_free(struct page *p) {}
a3d25c275   Rafael J. Wysocki   PM: Separate hibe...
348

073ef1f6e   Lionel Debroux   hibernation: cons...
349
  static inline void hibernation_set_ops(const struct platform_hibernation_ops *ops) {}
a3d25c275   Rafael J. Wysocki   PM: Separate hibe...
350
  static inline int hibernate(void) { return -ENOSYS; }
fce2b111f   Cornelia Huck   PM/Hibernate: Mov...
351
  static inline bool system_entering_hibernation(void) { return false; }
a6e15a390   Kees Cook   PM / hibernate: i...
352
  static inline bool hibernation_available(void) { return false; }
fce2b111f   Cornelia Huck   PM/Hibernate: Mov...
353
  #endif /* CONFIG_HIBERNATION */
35eb6db11   Amerigo Wang   notifiers: pm: mo...
354
355
356
357
358
359
360
  /* Hibernation and suspend events */
  #define PM_HIBERNATION_PREPARE	0x0001 /* Going to hibernate */
  #define PM_POST_HIBERNATION	0x0002 /* Hibernation finished */
  #define PM_SUSPEND_PREPARE	0x0003 /* Going to suspend the system */
  #define PM_POST_SUSPEND		0x0004 /* Suspend finished */
  #define PM_RESTORE_PREPARE	0x0005 /* Going to restore a saved image */
  #define PM_POST_RESTORE		0x0006 /* Restore failed */
9b6fc5dc8   Srivatsa S. Bhat   PM / Sleep: Make ...
361
  extern struct mutex pm_mutex;
296699de6   Rafael J. Wysocki   Introduce CONFIG_...
362
  #ifdef CONFIG_PM_SLEEP
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
363
364
  void save_processor_state(void);
  void restore_processor_state(void);
25761b6eb   Rafael J. Wysocki   [PATCH] swsusp: m...
365

b10d91174   Rafael J. Wysocki   PM: introduce hib...
366
  /* kernel/power/main.c */
825257569   Alan Stern   PM: Convert PM no...
367
368
  extern int register_pm_notifier(struct notifier_block *nb);
  extern int unregister_pm_notifier(struct notifier_block *nb);
b10d91174   Rafael J. Wysocki   PM: introduce hib...
369
370
371
372
373
374
  
  #define pm_notifier(fn, pri) {				\
  	static struct notifier_block fn##_nb =			\
  		{ .notifier_call = fn, .priority = pri };	\
  	register_pm_notifier(&fn##_nb);			\
  }
c125e96f0   Rafael J. Wysocki   PM: Make it possi...
375
376
377
  
  /* drivers/base/power/wakeup.c */
  extern bool events_check_enabled;
a2867e08c   Rafael J. Wysocki   PM / Wakeup: Repl...
378
  extern bool pm_wakeup_pending(void);
068765ba7   Rafael J. Wysocki   PM / sleep: Mecha...
379
380
  extern void pm_system_wakeup(void);
  extern void pm_wakeup_clear(void);
7483b4a4d   Rafael J. Wysocki   PM / Sleep: Imple...
381
  extern bool pm_get_wakeup_count(unsigned int *count, bool block);
074037ec7   Rafael J. Wysocki   PM / Wakeup: Intr...
382
  extern bool pm_save_wakeup_count(unsigned int count);
55850945e   Rafael J. Wysocki   PM / Sleep: Add "...
383
  extern void pm_wakep_autosleep_enabled(bool set);
bb177fedd   Julius Werner   PM / Sleep: Print...
384
  extern void pm_print_active_wakeup_sources(void);
9b6fc5dc8   Srivatsa S. Bhat   PM / Sleep: Make ...
385
386
387
  
  static inline void lock_system_sleep(void)
  {
72081624d   Srivatsa S. Bhat   PM / Hibernate: R...
388
  	current->flags |= PF_FREEZER_SKIP;
9b6fc5dc8   Srivatsa S. Bhat   PM / Sleep: Make ...
389
390
391
392
393
  	mutex_lock(&pm_mutex);
  }
  
  static inline void unlock_system_sleep(void)
  {
72081624d   Srivatsa S. Bhat   PM / Hibernate: R...
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
  	/*
  	 * Don't use freezer_count() because we don't want the call to
  	 * try_to_freeze() here.
  	 *
  	 * Reason:
  	 * Fundamentally, we just don't need it, because freezing condition
  	 * doesn't come into effect until we release the pm_mutex lock,
  	 * since the freezer always works with pm_mutex held.
  	 *
  	 * More importantly, in the case of hibernation,
  	 * unlock_system_sleep() gets called in snapshot_read() and
  	 * snapshot_write() when the freezing condition is still in effect.
  	 * Which means, if we use try_to_freeze() here, it would make them
  	 * enter the refrigerator, thus causing hibernation to lockup.
  	 */
  	current->flags &= ~PF_FREEZER_SKIP;
9b6fc5dc8   Srivatsa S. Bhat   PM / Sleep: Make ...
410
  	mutex_unlock(&pm_mutex);
9b6fc5dc8   Srivatsa S. Bhat   PM / Sleep: Make ...
411
  }
296699de6   Rafael J. Wysocki   Introduce CONFIG_...
412
  #else /* !CONFIG_PM_SLEEP */
b10d91174   Rafael J. Wysocki   PM: introduce hib...
413
414
415
416
417
418
419
420
421
422
423
424
  
  static inline int register_pm_notifier(struct notifier_block *nb)
  {
  	return 0;
  }
  
  static inline int unregister_pm_notifier(struct notifier_block *nb)
  {
  	return 0;
  }
  
  #define pm_notifier(fn, pri)	do { (void)(fn); } while (0)
dbeeec5fe   Rafael J. Wysocki   PM: Allow wakeup ...
425

a2867e08c   Rafael J. Wysocki   PM / Wakeup: Repl...
426
  static inline bool pm_wakeup_pending(void) { return false; }
068765ba7   Rafael J. Wysocki   PM / sleep: Mecha...
427
428
  static inline void pm_system_wakeup(void) {}
  static inline void pm_wakeup_clear(void) {}
6ad696d2c   Andi Kleen   mm: allow memory ...
429

6ad696d2c   Andi Kleen   mm: allow memory ...
430
431
  static inline void lock_system_sleep(void) {}
  static inline void unlock_system_sleep(void) {}
9b6fc5dc8   Srivatsa S. Bhat   PM / Sleep: Make ...
432
  #endif /* !CONFIG_PM_SLEEP */
89081d17f   Huang Ying   kexec jump: save/...
433

b2df1d4f8   Rafael J. Wysocki   PM / Sleep: Separ...
434
435
436
437
438
  #ifdef CONFIG_PM_SLEEP_DEBUG
  extern bool pm_print_times_enabled;
  #else
  #define pm_print_times_enabled	(false)
  #endif
7483b4a4d   Rafael J. Wysocki   PM / Sleep: Imple...
439
440
441
442
443
444
445
446
447
448
  #ifdef CONFIG_PM_AUTOSLEEP
  
  /* kernel/power/autosleep.c */
  void queue_up_suspend_work(void);
  
  #else /* !CONFIG_PM_AUTOSLEEP */
  
  static inline void queue_up_suspend_work(void) {}
  
  #endif /* !CONFIG_PM_AUTOSLEEP */
85055dd80   Martin Schwidefsky   PM / Hibernate: I...
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
  #ifdef CONFIG_ARCH_SAVE_PAGE_KEYS
  /*
   * The ARCH_SAVE_PAGE_KEYS functions can be used by an architecture
   * to save/restore additional information to/from the array of page
   * frame numbers in the hibernation image. For s390 this is used to
   * save and restore the storage key for each page that is included
   * in the hibernation image.
   */
  unsigned long page_key_additional_pages(unsigned long pages);
  int page_key_alloc(unsigned long pages);
  void page_key_free(void);
  void page_key_read(unsigned long *pfn);
  void page_key_memorize(unsigned long *pfn);
  void page_key_write(void *address);
  
  #else /* !CONFIG_ARCH_SAVE_PAGE_KEYS */
  
  static inline unsigned long page_key_additional_pages(unsigned long pages)
  {
  	return 0;
  }
  
  static inline int  page_key_alloc(unsigned long pages)
  {
  	return 0;
  }
  
  static inline void page_key_free(void) {}
  static inline void page_key_read(unsigned long *pfn) {}
  static inline void page_key_memorize(unsigned long *pfn) {}
  static inline void page_key_write(void *address) {}
  
  #endif /* !CONFIG_ARCH_SAVE_PAGE_KEYS */
95d9ffbe0   Rafael J. Wysocki   PM: Move definiti...
482
  #endif /* _LINUX_SUSPEND_H */