2 * kernel/power/tuxonice.h
4 * Copyright (C) 2004-2010 Nigel Cunningham (nigel at tuxonice net)
6 * This file is released under the GPLv2.
8 * It contains declarations used throughout swsusp.
12 #ifndef KERNEL_POWER_TOI_H
13 #define KERNEL_POWER_TOI_H
15 #include <linux/delay.h>
16 #include <linux/bootmem.h>
17 #include <linux/suspend.h>
19 #include <linux/module.h>
20 #include <asm/setup.h>
21 #include "tuxonice_pageflags.h"
24 #define TOI_CORE_VERSION "3.3"
25 #define TOI_HEADER_VERSION 3
26 #define MY_BOOT_KERNEL_DATA_VERSION 4
28 #define HIB_TOI_DEBUG 1
29 #define _TAG_HIB_M "HIB/TOI"
32 #define hib_log(fmt, ...) pr_warn("[%s] [%s()]" fmt, _TAG_HIB_M, __func__, ##__VA_ARGS__);
34 #define hib_log(fmt, ...)
37 #define hib_warn(fmt, ...) pr_warn("[%s] [%s()]" fmt, _TAG_HIB_M, __func__, ##__VA_ARGS__);
39 #define hib_err(fmt, ...) pr_err("[%s] [%s()]" fmt, _TAG_HIB_M, __func__, ##__VA_ARGS__);
41 #ifdef CONFIG_TOI_FIXUP
42 #define HIB_SHOW_MEMINFO() \
44 hib_warn("%d MEMINFO ---\n", __LINE__); \
45 show_mem(SHOW_MEM_FILTER_NODES|SHOW_MEM_FILTER_PAGE_COUNT); \
49 struct toi_boot_kernel_data
{
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
;
65 extern struct toi_boot_kernel_data toi_bkd
;
67 /* Location of book kernel data struct in kernel being resumed */
68 extern unsigned long boot_kernel_data_buffer
;
70 /* == Action states == */
80 TOI_PAUSE_NEAR_PAGESET_END
,
81 TOI_TEST_FILTER_SPEED
,
87 TOI_ABORT_ON_RESAVE_NEEDED
,
88 TOI_NO_MULTITHREADED_IO
,
89 TOI_NO_DIRECT_LOAD
, /* Obsolete */
91 TOI_GET_MAX_MEM_ALLOCD
,
92 TOI_NO_FLUSHER_THREAD
,
93 TOI_NO_PS2_IF_UNNEEDED
,
94 TOI_POST_RESUME_BREAKPOINT
,
98 extern unsigned long toi_bootflags_mask
;
100 #define clear_action_state(bit) (test_and_clear_bit(bit, &toi_bkd.toi_action))
102 /* == Result states == */
107 TOI_NOSTORAGE_AVAILABLE
,
108 TOI_INSUFFICIENT_STORAGE
,
111 TOI_WOULD_EAT_MEMORY
,
112 TOI_UNABLE_TO_FREE_ENOUGH_MEMORY
,
116 TOI_EXTRA_PAGES_ALLOW_TOO_SMALL
,
117 TOI_UNABLE_TO_PREPARE_IMAGE
,
118 TOI_FAILED_MODULE_INIT
,
119 TOI_FAILED_MODULE_CLEANUP
,
123 TOI_PLATFORM_PREP_FAILED
,
124 TOI_CPU_HOTPLUG_FAILED
,
125 TOI_ARCH_PREPARE_FAILED
, /* Removed Linux-3.0 */
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
,
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
,
141 TOI_DPM_SUSPEND_FAILED
,
143 TOI_NUM_RESULT_STATES
/* Used in printing debug info only */
146 extern unsigned long toi_result
;
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))
154 /* == Debug sections and levels == */
156 /* debugging levels. */
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))
183 /* == Steps in hibernating == */
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
,
194 STEP_RESUME_ALT_IMAGE
,
199 /* == TuxOnIce states ==
200 (see also include/linux/suspend.h) */
202 #define get_toi_state() (toi_state)
203 #define restore_toi_state(saved_state) \
204 do { toi_state = saved_state; } while (0)
206 /* == Module support == */
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);
215 extern struct toi_core_fns
*toi_core_fns
;
220 #define KB(x) ((x) << (PAGE_SHIFT - 10))
221 #define MB(x) ((x) >> (20 - PAGE_SHIFT))
223 extern int toi_start_anything(int toi_or_resume
);
224 extern void toi_finish_anything(int toi_or_resume
);
226 extern int save_image_part1(void);
227 extern int toi_atomic_restore(void);
229 extern int toi_try_hibernate(void);
230 extern void toi_try_resume(void);
232 extern int __toi_post_context_save(void);
234 extern unsigned int nr_hibernates
;
235 extern char alt_resume_param
[256];
237 extern void copyback_post(void);
238 extern int toi_hibernate(void);
239 extern unsigned long extra_pd1_pages_used
;
241 #define SECTOR_SIZE 512
243 extern void toi_early_boot_message(int can_erase_image
, int default_answer
,
244 char *warning_reason
, ...);
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
);
250 extern char tuxonice_signature
[9];
252 extern int toi_start_other_threads(void);
253 extern void toi_stop_other_threads(void);
255 #ifdef CONFIG_TOI_ENHANCE
256 extern int toi_ignore_late_initcall(void);
257 #endif /* CONFIG_TOI_ENHANCE */