tuxonice.h 6.4 KB

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