1#include <linux/suspend.h>
2#include <linux/suspend_ioctls.h>
3#include <linux/utsname.h>
4#include <linux/freezer.h>
5
6struct swsusp_info {
7 struct new_utsname uts;
8 u32 version_code;
9 unsigned long num_physpages;
10 int cpus;
11 unsigned long image_pages;
12 unsigned long pages;
13 unsigned long size;
14} __attribute__((aligned(PAGE_SIZE)));
15
16#ifdef CONFIG_HIBERNATION
17#ifdef CONFIG_ARCH_HIBERNATION_HEADER
18
19#define MAX_ARCH_HEADER_SIZE (sizeof(struct new_utsname) + 4)
20
21extern int arch_hibernation_header_save(void *addr, unsigned int max_size);
22extern int arch_hibernation_header_restore(void *addr);
23
24static inline int init_header_complete(struct swsusp_info *info)
25{
26 return arch_hibernation_header_save(info, MAX_ARCH_HEADER_SIZE);
27}
28
29static inline char *check_image_kernel(struct swsusp_info *info)
30{
31 return arch_hibernation_header_restore(info) ?
32 "architecture specific data" : NULL;
33}
34#endif
35
36
37
38
39
40#define PAGES_FOR_IO ((4096 * 1024) >> PAGE_SHIFT)
41
42
43
44
45
46#define SPARE_PAGES ((1024 * 1024) >> PAGE_SHIFT)
47
48
49extern int hibernation_snapshot(int platform_mode);
50extern int hibernation_restore(int platform_mode);
51extern int hibernation_platform_enter(void);
52#endif
53
54extern int pfn_is_nosave(unsigned long);
55
56#define power_attr(_name) \
57static struct kobj_attribute _name##_attr = { \
58 .attr = { \
59 .name = __stringify(_name), \
60 .mode = 0644, \
61 }, \
62 .show = _name##_show, \
63 .store = _name##_store, \
64}
65
66
67extern unsigned long image_size;
68extern int in_suspend;
69extern dev_t swsusp_resume_device;
70extern sector_t swsusp_resume_block;
71
72extern asmlinkage int swsusp_arch_suspend(void);
73extern asmlinkage int swsusp_arch_resume(void);
74
75extern int create_basic_memory_bitmaps(void);
76extern void free_basic_memory_bitmaps(void);
77extern unsigned int count_data_pages(void);
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99struct snapshot_handle {
100 loff_t offset;
101
102
103 unsigned int cur;
104
105
106 unsigned int cur_offset;
107
108
109 unsigned int prev;
110
111
112 void *buffer;
113
114
115 unsigned int buf_offset;
116
117
118 int sync_read;
119
120
121
122};
123
124
125
126
127
128#define data_of(handle) ((handle).buffer + (handle).buf_offset)
129
130extern unsigned int snapshot_additional_pages(struct zone *zone);
131extern unsigned long snapshot_get_image_size(void);
132extern int snapshot_read_next(struct snapshot_handle *handle, size_t count);
133extern int snapshot_write_next(struct snapshot_handle *handle, size_t count);
134extern void snapshot_write_finalize(struct snapshot_handle *handle);
135extern int snapshot_image_loaded(struct snapshot_handle *handle);
136
137
138extern atomic_t snapshot_device_available;
139
140extern sector_t alloc_swapdev_block(int swap);
141extern void free_all_swap_pages(int swap);
142extern int swsusp_swap_in_use(void);
143
144
145
146
147
148#define SF_PLATFORM_MODE 1
149
150
151extern int swsusp_check(void);
152extern int swsusp_shrink_memory(void);
153extern void swsusp_free(void);
154extern int swsusp_read(unsigned int *flags_p);
155extern int swsusp_write(unsigned int flags);
156extern void swsusp_close(void);
157
158struct timeval;
159
160extern void swsusp_show_speed(struct timeval *, struct timeval *,
161 unsigned int, char *);
162
163#ifdef CONFIG_SUSPEND
164
165extern int suspend_devices_and_enter(suspend_state_t state);
166#else
167static inline int suspend_devices_and_enter(suspend_state_t state)
168{
169 return -ENOSYS;
170}
171#endif
172
173#ifdef CONFIG_PM_SLEEP
174
175extern int pm_notifier_call_chain(unsigned long val);
176#endif
177
178#ifdef CONFIG_HIGHMEM
179unsigned int count_highmem_pages(void);
180int restore_highmem(void);
181#else
182static inline unsigned int count_highmem_pages(void) { return 0; }
183static inline int restore_highmem(void) { return 0; }
184#endif
185
186
187
188
189enum {
190
191 TEST_NONE,
192 TEST_CORE,
193 TEST_CPUS,
194 TEST_PLATFORM,
195 TEST_DEVICES,
196 TEST_FREEZER,
197
198 __TEST_AFTER_LAST
199};
200
201#define TEST_FIRST TEST_NONE
202#define TEST_MAX (__TEST_AFTER_LAST - 1)
203
204extern int pm_test_level;
205
206#ifdef CONFIG_SUSPEND_FREEZER
207static inline int suspend_freeze_processes(void)
208{
209 return freeze_processes();
210}
211
212static inline void suspend_thaw_processes(void)
213{
214 thaw_processes();
215}
216#else
217static inline int suspend_freeze_processes(void)
218{
219 return 0;
220}
221
222static inline void suspend_thaw_processes(void)
223{
224}
225#endif
226