xref: /OK3568_Linux_fs/kernel/Documentation/power/userland-swsusp.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun=====================================================
2*4882a593SmuzhiyunDocumentation for userland software suspend interface
3*4882a593Smuzhiyun=====================================================
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun	(C) 2006 Rafael J. Wysocki <rjw@sisk.pl>
6*4882a593Smuzhiyun
7*4882a593SmuzhiyunFirst, the warnings at the beginning of swsusp.txt still apply.
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunSecond, you should read the FAQ in swsusp.txt _now_ if you have not
10*4882a593Smuzhiyundone it already.
11*4882a593Smuzhiyun
12*4882a593SmuzhiyunNow, to use the userland interface for software suspend you need special
13*4882a593Smuzhiyunutilities that will read/write the system memory snapshot from/to the
14*4882a593Smuzhiyunkernel.  Such utilities are available, for example, from
15*4882a593Smuzhiyun<http://suspend.sourceforge.net>.  You may want to have a look at them if you
16*4882a593Smuzhiyunare going to develop your own suspend/resume utilities.
17*4882a593Smuzhiyun
18*4882a593SmuzhiyunThe interface consists of a character device providing the open(),
19*4882a593Smuzhiyunrelease(), read(), and write() operations as well as several ioctl()
20*4882a593Smuzhiyuncommands defined in include/linux/suspend_ioctls.h .  The major and minor
21*4882a593Smuzhiyunnumbers of the device are, respectively, 10 and 231, and they can
22*4882a593Smuzhiyunbe read from /sys/class/misc/snapshot/dev.
23*4882a593Smuzhiyun
24*4882a593SmuzhiyunThe device can be open either for reading or for writing.  If open for
25*4882a593Smuzhiyunreading, it is considered to be in the suspend mode.  Otherwise it is
26*4882a593Smuzhiyunassumed to be in the resume mode.  The device cannot be open for simultaneous
27*4882a593Smuzhiyunreading and writing.  It is also impossible to have the device open more than
28*4882a593Smuzhiyunonce at a time.
29*4882a593Smuzhiyun
30*4882a593SmuzhiyunEven opening the device has side effects. Data structures are
31*4882a593Smuzhiyunallocated, and PM_HIBERNATION_PREPARE / PM_RESTORE_PREPARE chains are
32*4882a593Smuzhiyuncalled.
33*4882a593Smuzhiyun
34*4882a593SmuzhiyunThe ioctl() commands recognized by the device are:
35*4882a593Smuzhiyun
36*4882a593SmuzhiyunSNAPSHOT_FREEZE
37*4882a593Smuzhiyun	freeze user space processes (the current process is
38*4882a593Smuzhiyun	not frozen); this is required for SNAPSHOT_CREATE_IMAGE
39*4882a593Smuzhiyun	and SNAPSHOT_ATOMIC_RESTORE to succeed
40*4882a593Smuzhiyun
41*4882a593SmuzhiyunSNAPSHOT_UNFREEZE
42*4882a593Smuzhiyun	thaw user space processes frozen by SNAPSHOT_FREEZE
43*4882a593Smuzhiyun
44*4882a593SmuzhiyunSNAPSHOT_CREATE_IMAGE
45*4882a593Smuzhiyun	create a snapshot of the system memory; the
46*4882a593Smuzhiyun	last argument of ioctl() should be a pointer to an int variable,
47*4882a593Smuzhiyun	the value of which will indicate whether the call returned after
48*4882a593Smuzhiyun	creating the snapshot (1) or after restoring the system memory state
49*4882a593Smuzhiyun	from it (0) (after resume the system finds itself finishing the
50*4882a593Smuzhiyun	SNAPSHOT_CREATE_IMAGE ioctl() again); after the snapshot
51*4882a593Smuzhiyun	has been created the read() operation can be used to transfer
52*4882a593Smuzhiyun	it out of the kernel
53*4882a593Smuzhiyun
54*4882a593SmuzhiyunSNAPSHOT_ATOMIC_RESTORE
55*4882a593Smuzhiyun	restore the system memory state from the
56*4882a593Smuzhiyun	uploaded snapshot image; before calling it you should transfer
57*4882a593Smuzhiyun	the system memory snapshot back to the kernel using the write()
58*4882a593Smuzhiyun	operation; this call will not succeed if the snapshot
59*4882a593Smuzhiyun	image is not available to the kernel
60*4882a593Smuzhiyun
61*4882a593SmuzhiyunSNAPSHOT_FREE
62*4882a593Smuzhiyun	free memory allocated for the snapshot image
63*4882a593Smuzhiyun
64*4882a593SmuzhiyunSNAPSHOT_PREF_IMAGE_SIZE
65*4882a593Smuzhiyun	set the preferred maximum size of the image
66*4882a593Smuzhiyun	(the kernel will do its best to ensure the image size will not exceed
67*4882a593Smuzhiyun	this number, but if it turns out to be impossible, the kernel will
68*4882a593Smuzhiyun	create the smallest image possible)
69*4882a593Smuzhiyun
70*4882a593SmuzhiyunSNAPSHOT_GET_IMAGE_SIZE
71*4882a593Smuzhiyun	return the actual size of the hibernation image
72*4882a593Smuzhiyun	(the last argument should be a pointer to a loff_t variable that
73*4882a593Smuzhiyun	will contain the result if the call is successful)
74*4882a593Smuzhiyun
75*4882a593SmuzhiyunSNAPSHOT_AVAIL_SWAP_SIZE
76*4882a593Smuzhiyun	return the amount of available swap in bytes
77*4882a593Smuzhiyun	(the last argument should be a pointer to a loff_t variable that
78*4882a593Smuzhiyun	will contain the result if the call is successful)
79*4882a593Smuzhiyun
80*4882a593SmuzhiyunSNAPSHOT_ALLOC_SWAP_PAGE
81*4882a593Smuzhiyun	allocate a swap page from the resume partition
82*4882a593Smuzhiyun	(the last argument should be a pointer to a loff_t variable that
83*4882a593Smuzhiyun	will contain the swap page offset if the call is successful)
84*4882a593Smuzhiyun
85*4882a593SmuzhiyunSNAPSHOT_FREE_SWAP_PAGES
86*4882a593Smuzhiyun	free all swap pages allocated by
87*4882a593Smuzhiyun	SNAPSHOT_ALLOC_SWAP_PAGE
88*4882a593Smuzhiyun
89*4882a593SmuzhiyunSNAPSHOT_SET_SWAP_AREA
90*4882a593Smuzhiyun	set the resume partition and the offset (in <PAGE_SIZE>
91*4882a593Smuzhiyun	units) from the beginning of the partition at which the swap header is
92*4882a593Smuzhiyun	located (the last ioctl() argument should point to a struct
93*4882a593Smuzhiyun	resume_swap_area, as defined in kernel/power/suspend_ioctls.h,
94*4882a593Smuzhiyun	containing the resume device specification and the offset); for swap
95*4882a593Smuzhiyun	partitions the offset is always 0, but it is different from zero for
96*4882a593Smuzhiyun	swap files (see Documentation/power/swsusp-and-swap-files.rst for
97*4882a593Smuzhiyun	details).
98*4882a593Smuzhiyun
99*4882a593SmuzhiyunSNAPSHOT_PLATFORM_SUPPORT
100*4882a593Smuzhiyun	enable/disable the hibernation platform support,
101*4882a593Smuzhiyun	depending on the argument value (enable, if the argument is nonzero)
102*4882a593Smuzhiyun
103*4882a593SmuzhiyunSNAPSHOT_POWER_OFF
104*4882a593Smuzhiyun	make the kernel transition the system to the hibernation
105*4882a593Smuzhiyun	state (eg. ACPI S4) using the platform (eg. ACPI) driver
106*4882a593Smuzhiyun
107*4882a593SmuzhiyunSNAPSHOT_S2RAM
108*4882a593Smuzhiyun	suspend to RAM; using this call causes the kernel to
109*4882a593Smuzhiyun	immediately enter the suspend-to-RAM state, so this call must always
110*4882a593Smuzhiyun	be preceded by the SNAPSHOT_FREEZE call and it is also necessary
111*4882a593Smuzhiyun	to use the SNAPSHOT_UNFREEZE call after the system wakes up.  This call
112*4882a593Smuzhiyun	is needed to implement the suspend-to-both mechanism in which the
113*4882a593Smuzhiyun	suspend image is first created, as though the system had been suspended
114*4882a593Smuzhiyun	to disk, and then the system is suspended to RAM (this makes it possible
115*4882a593Smuzhiyun	to resume the system from RAM if there's enough battery power or restore
116*4882a593Smuzhiyun	its state on the basis of the saved suspend image otherwise)
117*4882a593Smuzhiyun
118*4882a593SmuzhiyunThe device's read() operation can be used to transfer the snapshot image from
119*4882a593Smuzhiyunthe kernel.  It has the following limitations:
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun- you cannot read() more than one virtual memory page at a time
122*4882a593Smuzhiyun- read()s across page boundaries are impossible (ie. if you read() 1/2 of
123*4882a593Smuzhiyun  a page in the previous call, you will only be able to read()
124*4882a593Smuzhiyun  **at most** 1/2 of the page in the next call)
125*4882a593Smuzhiyun
126*4882a593SmuzhiyunThe device's write() operation is used for uploading the system memory snapshot
127*4882a593Smuzhiyuninto the kernel.  It has the same limitations as the read() operation.
128*4882a593Smuzhiyun
129*4882a593SmuzhiyunThe release() operation frees all memory allocated for the snapshot image
130*4882a593Smuzhiyunand all swap pages allocated with SNAPSHOT_ALLOC_SWAP_PAGE (if any).
131*4882a593SmuzhiyunThus it is not necessary to use either SNAPSHOT_FREE or
132*4882a593SmuzhiyunSNAPSHOT_FREE_SWAP_PAGES before closing the device (in fact it will also
133*4882a593Smuzhiyununfreeze user space processes frozen by SNAPSHOT_UNFREEZE if they are
134*4882a593Smuzhiyunstill frozen when the device is being closed).
135*4882a593Smuzhiyun
136*4882a593SmuzhiyunCurrently it is assumed that the userland utilities reading/writing the
137*4882a593Smuzhiyunsnapshot image from/to the kernel will use a swap partition, called the resume
138*4882a593Smuzhiyunpartition, or a swap file as storage space (if a swap file is used, the resume
139*4882a593Smuzhiyunpartition is the partition that holds this file).  However, this is not really
140*4882a593Smuzhiyunrequired, as they can use, for example, a special (blank) suspend partition or
141*4882a593Smuzhiyuna file on a partition that is unmounted before SNAPSHOT_CREATE_IMAGE and
142*4882a593Smuzhiyunmounted afterwards.
143*4882a593Smuzhiyun
144*4882a593SmuzhiyunThese utilities MUST NOT make any assumptions regarding the ordering of
145*4882a593Smuzhiyundata within the snapshot image.  The contents of the image are entirely owned
146*4882a593Smuzhiyunby the kernel and its structure may be changed in future kernel releases.
147*4882a593Smuzhiyun
148*4882a593SmuzhiyunThe snapshot image MUST be written to the kernel unaltered (ie. all of the image
149*4882a593Smuzhiyundata, metadata and header MUST be written in _exactly_ the same amount, form
150*4882a593Smuzhiyunand order in which they have been read).  Otherwise, the behavior of the
151*4882a593Smuzhiyunresumed system may be totally unpredictable.
152*4882a593Smuzhiyun
153*4882a593SmuzhiyunWhile executing SNAPSHOT_ATOMIC_RESTORE the kernel checks if the
154*4882a593Smuzhiyunstructure of the snapshot image is consistent with the information stored
155*4882a593Smuzhiyunin the image header.  If any inconsistencies are detected,
156*4882a593SmuzhiyunSNAPSHOT_ATOMIC_RESTORE will not succeed.  Still, this is not a fool-proof
157*4882a593Smuzhiyunmechanism and the userland utilities using the interface SHOULD use additional
158*4882a593Smuzhiyunmeans, such as checksums, to ensure the integrity of the snapshot image.
159*4882a593Smuzhiyun
160*4882a593SmuzhiyunThe suspending and resuming utilities MUST lock themselves in memory,
161*4882a593Smuzhiyunpreferably using mlockall(), before calling SNAPSHOT_FREEZE.
162*4882a593Smuzhiyun
163*4882a593SmuzhiyunThe suspending utility MUST check the value stored by SNAPSHOT_CREATE_IMAGE
164*4882a593Smuzhiyunin the memory location pointed to by the last argument of ioctl() and proceed
165*4882a593Smuzhiyunin accordance with it:
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun1. 	If the value is 1 (ie. the system memory snapshot has just been
168*4882a593Smuzhiyun	created and the system is ready for saving it):
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun	(a)	The suspending utility MUST NOT close the snapshot device
171*4882a593Smuzhiyun		_unless_ the whole suspend procedure is to be cancelled, in
172*4882a593Smuzhiyun		which case, if the snapshot image has already been saved, the
173*4882a593Smuzhiyun		suspending utility SHOULD destroy it, preferably by zapping
174*4882a593Smuzhiyun		its header.  If the suspend is not to be cancelled, the
175*4882a593Smuzhiyun		system MUST be powered off or rebooted after the snapshot
176*4882a593Smuzhiyun		image has been saved.
177*4882a593Smuzhiyun	(b)	The suspending utility SHOULD NOT attempt to perform any
178*4882a593Smuzhiyun		file system operations (including reads) on the file systems
179*4882a593Smuzhiyun		that were mounted before SNAPSHOT_CREATE_IMAGE has been
180*4882a593Smuzhiyun		called.  However, it MAY mount a file system that was not
181*4882a593Smuzhiyun		mounted at that time and perform some operations on it (eg.
182*4882a593Smuzhiyun		use it for saving the image).
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun2.	If the value is 0 (ie. the system state has just been restored from
185*4882a593Smuzhiyun	the snapshot image), the suspending utility MUST close the snapshot
186*4882a593Smuzhiyun	device.  Afterwards it will be treated as a regular userland process,
187*4882a593Smuzhiyun	so it need not exit.
188*4882a593Smuzhiyun
189*4882a593SmuzhiyunThe resuming utility SHOULD NOT attempt to mount any file systems that could
190*4882a593Smuzhiyunbe mounted before suspend and SHOULD NOT attempt to perform any operations
191*4882a593Smuzhiyuninvolving such file systems.
192*4882a593Smuzhiyun
193*4882a593SmuzhiyunFor details, please refer to the source code.
194