2 * kernel/power/suspend.h
4 * Copyright (C) 2004-2007 Nigel Cunningham (nigel at suspend2 net)
6 * This file is released under the GPLv2.
8 * It contains declarations used throughout swsusp.
12 #ifndef KERNEL_POWER_SUSPEND_H
13 #define KERNEL_POWER_SUSPEND_H
15 #include <linux/delay.h>
16 #include <linux/bootmem.h>
17 #include <linux/suspend.h>
18 #include <linux/dyn_pageflags.h>
19 #include <asm/setup.h>
20 #include "pageflags.h"
22 #define SUSPEND_CORE_VERSION "2.2.9.17"
24 /* == Action states == */
35 SUSPEND_PAUSE_NEAR_PAGESET_END
,
36 SUSPEND_TEST_FILTER_SPEED
,
39 SUSPEND_PM_PREPARE_CONSOLE
,
40 SUSPEND_IGNORE_ROOTFS
,
41 SUSPEND_REPLACE_SWSUSP
,
43 SUSPEND_PAGESET2_FULL
,
44 SUSPEND_ABORT_ON_RESAVE_NEEDED
,
45 SUSPEND_NO_MULTITHREADED_IO
,
46 SUSPEND_NO_DIRECT_LOAD
,
47 SUSPEND_LATE_CPU_HOTPLUG
,
50 extern unsigned long suspend_action
;
52 #define clear_action_state(bit) (test_and_clear_bit(bit, &suspend_action))
53 #define test_action_state(bit) (test_bit(bit, &suspend_action))
55 /* == Result states == */
59 SUSPEND_ABORT_REQUESTED
,
60 SUSPEND_NOSTORAGE_AVAILABLE
,
61 SUSPEND_INSUFFICIENT_STORAGE
,
62 SUSPEND_FREEZING_FAILED
,
63 SUSPEND_UNEXPECTED_ALLOC
,
65 SUSPEND_WOULD_EAT_MEMORY
,
66 SUSPEND_UNABLE_TO_FREE_ENOUGH_MEMORY
,
67 SUSPEND_ENCRYPTION_SETUP_FAILED
,
69 SUSPEND_DEVICE_REFUSED
,
70 SUSPEND_EXTRA_PAGES_ALLOW_TOO_SMALL
,
71 SUSPEND_UNABLE_TO_PREPARE_IMAGE
,
72 SUSPEND_FAILED_MODULE_INIT
,
73 SUSPEND_FAILED_MODULE_CLEANUP
,
75 SUSPEND_OUT_OF_MEMORY
,
79 extern unsigned long suspend_result
;
81 #define set_result_state(bit) (test_and_set_bit(bit, &suspend_result))
82 #define clear_result_state(bit) (test_and_clear_bit(bit, &suspend_result))
83 #define test_result_state(bit) (test_bit(bit, &suspend_result))
85 /* == Debug sections and levels == */
87 /* debugging levels. */
106 extern unsigned long suspend_debug_state
;
108 #define set_debug_state(bit) (test_and_set_bit(bit, &suspend_debug_state))
109 #define clear_debug_state(bit) (test_and_clear_bit(bit, &suspend_debug_state))
110 #define test_debug_state(bit) (test_bit(bit, &suspend_debug_state))
112 /* == Steps in suspending == */
115 STEP_SUSPEND_PREPARE_IMAGE
,
116 STEP_SUSPEND_SAVE_IMAGE
,
117 STEP_SUSPEND_POWERDOWN
,
118 STEP_RESUME_CAN_RESUME
,
119 STEP_RESUME_LOAD_PS1
,
120 STEP_RESUME_DO_RESTORE
,
121 STEP_RESUME_READ_PS2
,
123 STEP_RESUME_ALT_IMAGE
,
126 /* == Suspend states ==
127 (see also include/linux/suspend.h) */
129 #define get_suspend_state() (suspend_state)
130 #define restore_suspend_state(saved_state) \
131 do { suspend_state = saved_state; } while(0)
133 /* == Module support == */
135 struct suspend2_core_fns
{
136 int (*post_context_save
)(void);
137 unsigned long (*get_nonconflicting_page
)(void);
138 int (*try_suspend
)(int have_pmsem
);
139 void (*try_resume
)(void);
142 extern struct suspend2_core_fns
*s2_core_fns
;
145 #define KB(x) ((x) << (PAGE_SHIFT - 10))
146 #define MB(x) ((x) >> (20 - PAGE_SHIFT))
148 extern int suspend_start_anything(int suspend_or_resume
);
149 extern void suspend_finish_anything(int suspend_or_resume
);
151 extern int save_image_part1(void);
152 extern int suspend_atomic_restore(void);
154 extern int _suspend2_try_suspend(int have_pmsem
);
155 extern void __suspend2_try_resume(void);
157 extern int __suspend_post_context_save(void);
159 extern unsigned int nr_suspends
;
160 extern char resume2_file
[256];
161 extern char poweroff_resume2
[256];
163 extern void copyback_post(void);
164 extern int suspend2_suspend(void);
165 extern int extra_pd1_pages_used
;
167 extern int suspend_io_time
[2][2];
169 #define SECTOR_SIZE 512
171 extern int suspend_early_boot_message
172 (int can_erase_image
, int default_answer
, char *warning_reason
, ...);
174 static inline int load_direct(struct page
*page
)
176 return test_action_state(SUSPEND_NO_DIRECT_LOAD
) ? 0 : PagePageset1Copy(page
);
179 extern int pre_resume_freeze(void);