Commit | Line | Data |
---|---|---|
6fa3eb70 S |
1 | /* |
2 | * kernel/power/tuxonice.h | |
3 | * | |
4 | * Copyright (C) 2004-2010 Nigel Cunningham (nigel at tuxonice net) | |
5 | * | |
6 | * This file is released under the GPLv2. | |
7 | * | |
8 | * It contains declarations used throughout swsusp. | |
9 | * | |
10 | */ | |
11 | ||
12 | #ifndef KERNEL_POWER_TOI_H | |
13 | #define KERNEL_POWER_TOI_H | |
14 | ||
15 | #include <linux/delay.h> | |
16 | #include <linux/bootmem.h> | |
17 | #include <linux/suspend.h> | |
18 | #include <linux/fs.h> | |
19 | #include <linux/module.h> | |
20 | #include <asm/setup.h> | |
21 | #include "tuxonice_pageflags.h" | |
22 | #include "power.h" | |
23 | ||
24 | #define TOI_CORE_VERSION "3.3" | |
25 | #define TOI_HEADER_VERSION 3 | |
26 | #define MY_BOOT_KERNEL_DATA_VERSION 4 | |
27 | ||
28 | #define HIB_TOI_DEBUG 1 | |
29 | #define _TAG_HIB_M "HIB/TOI" | |
30 | #if (HIB_TOI_DEBUG) | |
31 | #undef hib_log | |
32 | #define hib_log(fmt, ...) pr_warn("[%s] [%s()]" fmt, _TAG_HIB_M, __func__, ##__VA_ARGS__); | |
33 | #else | |
34 | #define hib_log(fmt, ...) | |
35 | #endif | |
36 | #undef hib_warn | |
37 | #define hib_warn(fmt, ...) pr_warn("[%s] [%s()]" fmt, _TAG_HIB_M, __func__, ##__VA_ARGS__); | |
38 | #undef hib_err | |
39 | #define hib_err(fmt, ...) pr_err("[%s] [%s()]" fmt, _TAG_HIB_M, __func__, ##__VA_ARGS__); | |
40 | ||
41 | #ifdef CONFIG_TOI_FIXUP | |
42 | #define HIB_SHOW_MEMINFO() \ | |
43 | do { \ | |
44 | hib_warn("%d MEMINFO ---\n", __LINE__); \ | |
45 | show_mem(SHOW_MEM_FILTER_NODES|SHOW_MEM_FILTER_PAGE_COUNT); \ | |
46 | } while (0) | |
47 | #endif | |
48 | ||
49 | struct toi_boot_kernel_data { | |
50 | int version; | |
51 | int size; | |
52 | unsigned long toi_action; | |
53 | unsigned long toi_debug_state; | |
54 | u32 toi_default_console_level; | |
55 | int toi_io_time[2][2]; | |
56 | char toi_nosave_commandline[COMMAND_LINE_SIZE]; | |
57 | unsigned long pages_used[33]; | |
58 | unsigned long incremental_bytes_in; | |
59 | unsigned long incremental_bytes_out; | |
60 | unsigned long compress_bytes_in; | |
61 | unsigned long compress_bytes_out; | |
62 | unsigned long pruned_pages; | |
63 | }; | |
64 | ||
65 | extern struct toi_boot_kernel_data toi_bkd; | |
66 | ||
67 | /* Location of book kernel data struct in kernel being resumed */ | |
68 | extern unsigned long boot_kernel_data_buffer; | |
69 | ||
70 | /* == Action states == */ | |
71 | ||
72 | enum { | |
73 | TOI_REBOOT, | |
74 | TOI_PAUSE, | |
75 | TOI_LOGALL, | |
76 | TOI_CAN_CANCEL, | |
77 | TOI_KEEP_IMAGE, | |
78 | TOI_FREEZER_TEST, | |
79 | TOI_SINGLESTEP, | |
80 | TOI_PAUSE_NEAR_PAGESET_END, | |
81 | TOI_TEST_FILTER_SPEED, | |
82 | TOI_TEST_BIO, | |
83 | TOI_NO_PAGESET2, | |
84 | TOI_IGNORE_ROOTFS, | |
85 | TOI_REPLACE_SWSUSP, | |
86 | TOI_PAGESET2_FULL, | |
87 | TOI_ABORT_ON_RESAVE_NEEDED, | |
88 | TOI_NO_MULTITHREADED_IO, | |
89 | TOI_NO_DIRECT_LOAD, /* Obsolete */ | |
90 | TOI_LATE_CPU_HOTPLUG, | |
91 | TOI_GET_MAX_MEM_ALLOCD, | |
92 | TOI_NO_FLUSHER_THREAD, | |
93 | TOI_NO_PS2_IF_UNNEEDED, | |
94 | TOI_POST_RESUME_BREAKPOINT, | |
95 | TOI_NO_READAHEAD, | |
96 | }; | |
97 | ||
98 | extern unsigned long toi_bootflags_mask; | |
99 | ||
100 | #define clear_action_state(bit) (test_and_clear_bit(bit, &toi_bkd.toi_action)) | |
101 | ||
102 | /* == Result states == */ | |
103 | ||
104 | enum { | |
105 | TOI_ABORTED, | |
106 | TOI_ABORT_REQUESTED, | |
107 | TOI_NOSTORAGE_AVAILABLE, | |
108 | TOI_INSUFFICIENT_STORAGE, | |
109 | TOI_FREEZING_FAILED, | |
110 | TOI_KEPT_IMAGE, | |
111 | TOI_WOULD_EAT_MEMORY, | |
112 | TOI_UNABLE_TO_FREE_ENOUGH_MEMORY, | |
113 | TOI_PM_SEM, | |
114 | TOI_DEVICE_REFUSED, | |
115 | TOI_SYSDEV_REFUSED, | |
116 | TOI_EXTRA_PAGES_ALLOW_TOO_SMALL, | |
117 | TOI_UNABLE_TO_PREPARE_IMAGE, | |
118 | TOI_FAILED_MODULE_INIT, | |
119 | TOI_FAILED_MODULE_CLEANUP, | |
120 | TOI_FAILED_IO, | |
121 | TOI_OUT_OF_MEMORY, | |
122 | TOI_IMAGE_ERROR, | |
123 | TOI_PLATFORM_PREP_FAILED, | |
124 | TOI_CPU_HOTPLUG_FAILED, | |
125 | TOI_ARCH_PREPARE_FAILED, /* Removed Linux-3.0 */ | |
126 | TOI_RESAVE_NEEDED, | |
127 | TOI_CANT_SUSPEND, | |
128 | TOI_NOTIFIERS_PREPARE_FAILED, | |
129 | TOI_PRE_SNAPSHOT_FAILED, | |
130 | TOI_PRE_RESTORE_FAILED, | |
131 | TOI_USERMODE_HELPERS_ERR, | |
132 | TOI_CANT_USE_ALT_RESUME, | |
133 | TOI_HEADER_TOO_BIG, | |
134 | TOI_WAKEUP_EVENT, | |
135 | TOI_SYSCORE_REFUSED, | |
136 | TOI_DPM_PREPARE_FAILED, | |
137 | #ifdef CONFIG_TOI_FIXUP | |
138 | /* TOI_DPM_PREPARE_FAILED will exceed the # of bit when set_abort_result(TOI_DPM_SUSPEND_FAILED) is called!!! */ | |
139 | TOI_DPM_SUSPEND_FAILED = TOI_DPM_PREPARE_FAILED, | |
140 | #else | |
141 | TOI_DPM_SUSPEND_FAILED, | |
142 | #endif | |
143 | TOI_NUM_RESULT_STATES /* Used in printing debug info only */ | |
144 | }; | |
145 | ||
146 | extern unsigned long toi_result; | |
147 | ||
148 | #define set_result_state(bit) (test_and_set_bit(bit, &toi_result)) | |
149 | #define set_abort_result(bit) (test_and_set_bit(TOI_ABORTED, &toi_result), \ | |
150 | test_and_set_bit(bit, &toi_result)) | |
151 | #define clear_result_state(bit) (test_and_clear_bit(bit, &toi_result)) | |
152 | #define test_result_state(bit) (test_bit(bit, &toi_result)) | |
153 | ||
154 | /* == Debug sections and levels == */ | |
155 | ||
156 | /* debugging levels. */ | |
157 | enum { | |
158 | TOI_STATUS = 0, | |
159 | TOI_ERROR = 2, | |
160 | TOI_LOW, | |
161 | TOI_MEDIUM, | |
162 | TOI_HIGH, | |
163 | TOI_VERBOSE, | |
164 | }; | |
165 | ||
166 | enum { | |
167 | TOI_ANY_SECTION, | |
168 | TOI_EAT_MEMORY, | |
169 | TOI_IO, | |
170 | TOI_HEADER, | |
171 | TOI_WRITER, | |
172 | TOI_MEMORY, | |
173 | TOI_PAGEDIR, | |
174 | TOI_COMPRESS, | |
175 | TOI_BIO, | |
176 | }; | |
177 | ||
178 | #define set_debug_state(bit) (test_and_set_bit(bit, &toi_bkd.toi_debug_state)) | |
179 | #define clear_debug_state(bit) \ | |
180 | (test_and_clear_bit(bit, &toi_bkd.toi_debug_state)) | |
181 | #define test_debug_state(bit) (test_bit(bit, &toi_bkd.toi_debug_state)) | |
182 | ||
183 | /* == Steps in hibernating == */ | |
184 | ||
185 | enum { | |
186 | STEP_HIBERNATE_PREPARE_IMAGE, | |
187 | STEP_HIBERNATE_SAVE_IMAGE, | |
188 | STEP_HIBERNATE_POWERDOWN, | |
189 | STEP_RESUME_CAN_RESUME, | |
190 | STEP_RESUME_LOAD_PS1, | |
191 | STEP_RESUME_DO_RESTORE, | |
192 | STEP_RESUME_READ_PS2, | |
193 | STEP_RESUME_GO, | |
194 | STEP_RESUME_ALT_IMAGE, | |
195 | STEP_CLEANUP, | |
196 | STEP_QUIET_CLEANUP | |
197 | }; | |
198 | ||
199 | /* == TuxOnIce states == | |
200 | (see also include/linux/suspend.h) */ | |
201 | ||
202 | #define get_toi_state() (toi_state) | |
203 | #define restore_toi_state(saved_state) \ | |
204 | do { toi_state = saved_state; } while (0) | |
205 | ||
206 | /* == Module support == */ | |
207 | ||
208 | struct toi_core_fns { | |
209 | int (*post_context_save) (void); | |
210 | unsigned long (*get_nonconflicting_page) (void); | |
211 | int (*try_hibernate) (void); | |
212 | void (*try_resume) (void); | |
213 | }; | |
214 | ||
215 | extern struct toi_core_fns *toi_core_fns; | |
216 | ||
217 | /* == All else == */ | |
218 | #undef KB | |
219 | #undef MB | |
220 | #define KB(x) ((x) << (PAGE_SHIFT - 10)) | |
221 | #define MB(x) ((x) >> (20 - PAGE_SHIFT)) | |
222 | ||
223 | extern int toi_start_anything(int toi_or_resume); | |
224 | extern void toi_finish_anything(int toi_or_resume); | |
225 | ||
226 | extern int save_image_part1(void); | |
227 | extern int toi_atomic_restore(void); | |
228 | ||
229 | extern int toi_try_hibernate(void); | |
230 | extern void toi_try_resume(void); | |
231 | ||
232 | extern int __toi_post_context_save(void); | |
233 | ||
234 | extern unsigned int nr_hibernates; | |
235 | extern char alt_resume_param[256]; | |
236 | ||
237 | extern void copyback_post(void); | |
238 | extern int toi_hibernate(void); | |
239 | extern unsigned long extra_pd1_pages_used; | |
240 | ||
241 | #define SECTOR_SIZE 512 | |
242 | ||
243 | extern void toi_early_boot_message(int can_erase_image, int default_answer, | |
244 | char *warning_reason, ...); | |
245 | ||
246 | extern int do_check_can_resume(void); | |
247 | extern int do_toi_step(int step); | |
248 | extern int toi_launch_userspace_program(char *command, int channel_no, int wait, int debug); | |
249 | ||
250 | extern char tuxonice_signature[9]; | |
251 | ||
252 | extern int toi_start_other_threads(void); | |
253 | extern void toi_stop_other_threads(void); | |
254 | ||
255 | #ifdef CONFIG_TOI_ENHANCE | |
256 | extern int toi_ignore_late_initcall(void); | |
257 | #endif /* CONFIG_TOI_ENHANCE */ | |
258 | ||
259 | #endif |