linux/include/linux/suspend.h
<<
>>
Prefs
   1#ifndef _LINUX_SUSPEND_H
   2#define _LINUX_SUSPEND_H
   3
   4#include <linux/swap.h>
   5#include <linux/notifier.h>
   6#include <linux/init.h>
   7#include <linux/pm.h>
   8#include <linux/mm.h>
   9#include <asm/errno.h>
  10
  11#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_VT) && defined(CONFIG_VT_CONSOLE)
  12extern void pm_set_vt_switch(int);
  13extern int pm_prepare_console(void);
  14extern void pm_restore_console(void);
  15#else
  16static inline void pm_set_vt_switch(int do_switch)
  17{
  18}
  19
  20static inline int pm_prepare_console(void)
  21{
  22        return 0;
  23}
  24
  25static inline void pm_restore_console(void)
  26{
  27}
  28#endif
  29
  30typedef int __bitwise suspend_state_t;
  31
  32#define PM_SUSPEND_ON           ((__force suspend_state_t) 0)
  33#define PM_SUSPEND_STANDBY      ((__force suspend_state_t) 1)
  34#define PM_SUSPEND_MEM          ((__force suspend_state_t) 3)
  35#define PM_SUSPEND_MAX          ((__force suspend_state_t) 4)
  36
  37/**
  38 * struct platform_suspend_ops - Callbacks for managing platform dependent
  39 *      system sleep states.
  40 *
  41 * @valid: Callback to determine if given system sleep state is supported by
  42 *      the platform.
  43 *      Valid (ie. supported) states are advertised in /sys/power/state.  Note
  44 *      that it still may be impossible to enter given system sleep state if the
  45 *      conditions aren't right.
  46 *      There is the %suspend_valid_only_mem function available that can be
  47 *      assigned to this if the platform only supports mem sleep.
  48 *
  49 * @begin: Initialise a transition to given system sleep state.
  50 *      @begin() is executed right prior to suspending devices.  The information
  51 *      conveyed to the platform code by @begin() should be disregarded by it as
  52 *      soon as @end() is executed.  If @begin() fails (ie. returns nonzero),
  53 *      @prepare(), @enter() and @finish() will not be called by the PM core.
  54 *      This callback is optional.  However, if it is implemented, the argument
  55 *      passed to @enter() is redundant and should be ignored.
  56 *
  57 * @prepare: Prepare the platform for entering the system sleep state indicated
  58 *      by @begin().
  59 *      @prepare() is called right after devices have been suspended (ie. the
  60 *      appropriate .suspend() method has been executed for each device) and
  61 *      before device drivers' late suspend callbacks are executed.  It returns
  62 *      0 on success or a negative error code otherwise, in which case the
  63 *      system cannot enter the desired sleep state (@prepare_late(), @enter(),
  64 *      @wake(), and @finish() will not be called in that case).
  65 *
  66 * @prepare_late: Finish preparing the platform for entering the system sleep
  67 *      state indicated by @begin().
  68 *      @prepare_late is called before disabling nonboot CPUs and after
  69 *      device drivers' late suspend callbacks have been executed.  It returns
  70 *      0 on success or a negative error code otherwise, in which case the
  71 *      system cannot enter the desired sleep state (@enter() and @wake()).
  72 *
  73 * @enter: Enter the system sleep state indicated by @begin() or represented by
  74 *      the argument if @begin() is not implemented.
  75 *      This callback is mandatory.  It returns 0 on success or a negative
  76 *      error code otherwise, in which case the system cannot enter the desired
  77 *      sleep state.
  78 *
  79 * @wake: Called when the system has just left a sleep state, right after
  80 *      the nonboot CPUs have been enabled and before device drivers' early
  81 *      resume callbacks are executed.
  82 *      This callback is optional, but should be implemented by the platforms
  83 *      that implement @prepare_late().  If implemented, it is always called
  84 *      after @enter(), even if @enter() fails.
  85 *
  86 * @finish: Finish wake-up of the platform.
  87 *      @finish is called right prior to calling device drivers' regular suspend
  88 *      callbacks.
  89 *      This callback is optional, but should be implemented by the platforms
  90 *      that implement @prepare().  If implemented, it is always called after
  91 *      @enter() and @wake(), if implemented, even if any of them fails.
  92 *
  93 * @end: Called by the PM core right after resuming devices, to indicate to
  94 *      the platform that the system has returned to the working state or
  95 *      the transition to the sleep state has been aborted.
  96 *      This callback is optional, but should be implemented by the platforms
  97 *      that implement @begin().  Accordingly, platforms implementing @begin()
  98 *      should also provide a @end() which cleans up transitions aborted before
  99 *      @enter().
 100 *
 101 * @recover: Recover the platform from a suspend failure.
 102 *      Called by the PM core if the suspending of devices fails.
 103 *      This callback is optional and should only be implemented by platforms
 104 *      which require special recovery actions in that situation.
 105 */
 106struct platform_suspend_ops {
 107        int (*valid)(suspend_state_t state);
 108        int (*begin)(suspend_state_t state);
 109        int (*prepare)(void);
 110        int (*prepare_late)(void);
 111        int (*enter)(suspend_state_t state);
 112        void (*wake)(void);
 113        void (*finish)(void);
 114        void (*end)(void);
 115        void (*recover)(void);
 116};
 117
 118#ifdef CONFIG_SUSPEND
 119/**
 120 * suspend_set_ops - set platform dependent suspend operations
 121 * @ops: The new suspend operations to set.
 122 */
 123extern void suspend_set_ops(struct platform_suspend_ops *ops);
 124extern int suspend_valid_only_mem(suspend_state_t state);
 125
 126/**
 127 * arch_suspend_disable_irqs - disable IRQs for suspend
 128 *
 129 * Disables IRQs (in the default case). This is a weak symbol in the common
 130 * code and thus allows architectures to override it if more needs to be
 131 * done. Not called for suspend to disk.
 132 */
 133extern void arch_suspend_disable_irqs(void);
 134
 135/**
 136 * arch_suspend_enable_irqs - enable IRQs after suspend
 137 *
 138 * Enables IRQs (in the default case). This is a weak symbol in the common
 139 * code and thus allows architectures to override it if more needs to be
 140 * done. Not called for suspend to disk.
 141 */
 142extern void arch_suspend_enable_irqs(void);
 143
 144extern int pm_suspend(suspend_state_t state);
 145#else /* !CONFIG_SUSPEND */
 146#define suspend_valid_only_mem  NULL
 147
 148static inline void suspend_set_ops(struct platform_suspend_ops *ops) {}
 149static inline int pm_suspend(suspend_state_t state) { return -ENOSYS; }
 150#endif /* !CONFIG_SUSPEND */
 151
 152/* struct pbe is used for creating lists of pages that should be restored
 153 * atomically during the resume from disk, because the page frames they have
 154 * occupied before the suspend are in use.
 155 */
 156struct pbe {
 157        void *address;          /* address of the copy */
 158        void *orig_address;     /* original address of a page */
 159        struct pbe *next;
 160};
 161
 162/* mm/page_alloc.c */
 163extern void mark_free_pages(struct zone *zone);
 164
 165/**
 166 * struct platform_hibernation_ops - hibernation platform support
 167 *
 168 * The methods in this structure allow a platform to carry out special
 169 * operations required by it during a hibernation transition.
 170 *
 171 * All the methods below, except for @recover(), must be implemented.
 172 *
 173 * @begin: Tell the platform driver that we're starting hibernation.
 174 *      Called right after shrinking memory and before freezing devices.
 175 *
 176 * @end: Called by the PM core right after resuming devices, to indicate to
 177 *      the platform that the system has returned to the working state.
 178 *
 179 * @pre_snapshot: Prepare the platform for creating the hibernation image.
 180 *      Called right after devices have been frozen and before the nonboot
 181 *      CPUs are disabled (runs with IRQs on).
 182 *
 183 * @finish: Restore the previous state of the platform after the hibernation
 184 *      image has been created *or* put the platform into the normal operation
 185 *      mode after the hibernation (the same method is executed in both cases).
 186 *      Called right after the nonboot CPUs have been enabled and before
 187 *      thawing devices (runs with IRQs on).
 188 *
 189 * @prepare: Prepare the platform for entering the low power state.
 190 *      Called right after the hibernation image has been saved and before
 191 *      devices are prepared for entering the low power state.
 192 *
 193 * @enter: Put the system into the low power state after the hibernation image
 194 *      has been saved to disk.
 195 *      Called after the nonboot CPUs have been disabled and all of the low
 196 *      level devices have been shut down (runs with IRQs off).
 197 *
 198 * @leave: Perform the first stage of the cleanup after the system sleep state
 199 *      indicated by @set_target() has been left.
 200 *      Called right after the control has been passed from the boot kernel to
 201 *      the image kernel, before the nonboot CPUs are enabled and before devices
 202 *      are resumed.  Executed with interrupts disabled.
 203 *
 204 * @pre_restore: Prepare system for the restoration from a hibernation image.
 205 *      Called right after devices have been frozen and before the nonboot
 206 *      CPUs are disabled (runs with IRQs on).
 207 *
 208 * @restore_cleanup: Clean up after a failing image restoration.
 209 *      Called right after the nonboot CPUs have been enabled and before
 210 *      thawing devices (runs with IRQs on).
 211 *
 212 * @recover: Recover the platform from a failure to suspend devices.
 213 *      Called by the PM core if the suspending of devices during hibernation
 214 *      fails.  This callback is optional and should only be implemented by
 215 *      platforms which require special recovery actions in that situation.
 216 */
 217struct platform_hibernation_ops {
 218        int (*begin)(void);
 219        void (*end)(void);
 220        int (*pre_snapshot)(void);
 221        void (*finish)(void);
 222        int (*prepare)(void);
 223        int (*enter)(void);
 224        void (*leave)(void);
 225        int (*pre_restore)(void);
 226        void (*restore_cleanup)(void);
 227        void (*recover)(void);
 228};
 229
 230#ifdef CONFIG_HIBERNATION
 231/* kernel/power/snapshot.c */
 232extern void __register_nosave_region(unsigned long b, unsigned long e, int km);
 233static inline void __init register_nosave_region(unsigned long b, unsigned long e)
 234{
 235        __register_nosave_region(b, e, 0);
 236}
 237static inline void __init register_nosave_region_late(unsigned long b, unsigned long e)
 238{
 239        __register_nosave_region(b, e, 1);
 240}
 241extern int swsusp_page_is_forbidden(struct page *);
 242extern void swsusp_set_page_free(struct page *);
 243extern void swsusp_unset_page_free(struct page *);
 244extern unsigned long get_safe_page(gfp_t gfp_mask);
 245
 246extern void hibernation_set_ops(struct platform_hibernation_ops *ops);
 247extern int hibernate(void);
 248extern bool system_entering_hibernation(void);
 249#else /* CONFIG_HIBERNATION */
 250static inline int swsusp_page_is_forbidden(struct page *p) { return 0; }
 251static inline void swsusp_set_page_free(struct page *p) {}
 252static inline void swsusp_unset_page_free(struct page *p) {}
 253
 254static inline void hibernation_set_ops(struct platform_hibernation_ops *ops) {}
 255static inline int hibernate(void) { return -ENOSYS; }
 256static inline bool system_entering_hibernation(void) { return false; }
 257#endif /* CONFIG_HIBERNATION */
 258
 259#ifdef CONFIG_HIBERNATION_NVS
 260extern int hibernate_nvs_register(unsigned long start, unsigned long size);
 261extern int hibernate_nvs_alloc(void);
 262extern void hibernate_nvs_free(void);
 263extern void hibernate_nvs_save(void);
 264extern void hibernate_nvs_restore(void);
 265#else /* CONFIG_HIBERNATION_NVS */
 266static inline int hibernate_nvs_register(unsigned long a, unsigned long b)
 267{
 268        return 0;
 269}
 270static inline int hibernate_nvs_alloc(void) { return 0; }
 271static inline void hibernate_nvs_free(void) {}
 272static inline void hibernate_nvs_save(void) {}
 273static inline void hibernate_nvs_restore(void) {}
 274#endif /* CONFIG_HIBERNATION_NVS */
 275
 276#ifdef CONFIG_PM_SLEEP
 277void save_processor_state(void);
 278void restore_processor_state(void);
 279
 280/* kernel/power/main.c */
 281extern int register_pm_notifier(struct notifier_block *nb);
 282extern int unregister_pm_notifier(struct notifier_block *nb);
 283
 284#define pm_notifier(fn, pri) {                          \
 285        static struct notifier_block fn##_nb =                  \
 286                { .notifier_call = fn, .priority = pri };       \
 287        register_pm_notifier(&fn##_nb);                 \
 288}
 289#else /* !CONFIG_PM_SLEEP */
 290
 291static inline int register_pm_notifier(struct notifier_block *nb)
 292{
 293        return 0;
 294}
 295
 296static inline int unregister_pm_notifier(struct notifier_block *nb)
 297{
 298        return 0;
 299}
 300
 301#define pm_notifier(fn, pri)    do { (void)(fn); } while (0)
 302#endif /* !CONFIG_PM_SLEEP */
 303
 304extern struct mutex pm_mutex;
 305
 306#ifndef CONFIG_HIBERNATION
 307static inline void register_nosave_region(unsigned long b, unsigned long e)
 308{
 309}
 310static inline void register_nosave_region_late(unsigned long b, unsigned long e)
 311{
 312}
 313
 314static inline void lock_system_sleep(void) {}
 315static inline void unlock_system_sleep(void) {}
 316
 317#else
 318
 319/* Let some subsystems like memory hotadd exclude hibernation */
 320
 321static inline void lock_system_sleep(void)
 322{
 323        mutex_lock(&pm_mutex);
 324}
 325
 326static inline void unlock_system_sleep(void)
 327{
 328        mutex_unlock(&pm_mutex);
 329}
 330#endif
 331
 332#endif /* _LINUX_SUSPEND_H */
 333