diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2007-04-30 18:09:53 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-04-30 19:40:40 -0400 |
commit | 11d77d0c01b80e44c7aceb21928508dafce774f9 (patch) | |
tree | 4952f15df4ea2fcdba824aec5689ee9c0c7ceb90 | |
parent | fe0c935a6cbf25d72a27c7a345df8a2151de0b74 (diff) |
power management: remove firmware disk mode
This patch removes the firmware disk suspend mode which is the wrong approach,
it is supposed to be used for implementing firmware-based disk suspend but
cannot actually be used for that.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Acked-by: Pavel Machek <pavel@ucw.cz>
Cc: <linux-pm@lists.linux-foundation.org>
Cc: David Brownell <david-b@pacbell.net>
Cc: Len Brown <lenb@kernel.org>
Acked-by: Russell King <rmk@arm.linux.org.uk>
Cc: Greg KH <greg@kroah.com>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Paul Mundt <lethal@linux-sh.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | Documentation/power/interface.txt | 21 | ||||
-rw-r--r-- | Documentation/power/states.txt | 13 | ||||
-rw-r--r-- | Documentation/power/swsusp.txt | 14 | ||||
-rw-r--r-- | include/linux/pm.h | 13 | ||||
-rw-r--r-- | kernel/power/disk.c | 27 |
5 files changed, 34 insertions, 54 deletions
diff --git a/Documentation/power/interface.txt b/Documentation/power/interface.txt index 74311d7e0f3c..8c5b41bf3f36 100644 --- a/Documentation/power/interface.txt +++ b/Documentation/power/interface.txt | |||
@@ -18,17 +18,10 @@ states. | |||
18 | 18 | ||
19 | 19 | ||
20 | /sys/power/disk controls the operating mode of the suspend-to-disk | 20 | /sys/power/disk controls the operating mode of the suspend-to-disk |
21 | mechanism. Suspend-to-disk can be handled in several ways. The | 21 | mechanism. Suspend-to-disk can be handled in several ways. We have a |
22 | greatest distinction is who writes memory to disk - the firmware or | 22 | few options for putting the system to sleep - using the platform driver |
23 | the kernel. If the firmware does it, we assume that it also handles | 23 | (e.g. ACPI or other pm_ops), powering off the system or rebooting the |
24 | suspending the system. | 24 | system (for testing). |
25 | |||
26 | If the kernel does it, then we have three options for putting the system | ||
27 | to sleep - using the platform driver (e.g. ACPI or other PM | ||
28 | registers), powering off the system or rebooting the system (for | ||
29 | testing). The system will support either 'firmware' or 'platform', and | ||
30 | that is known a priori. But, the user may choose 'shutdown' or | ||
31 | 'reboot' as alternatives. | ||
32 | 25 | ||
33 | Additionally, /sys/power/disk can be used to turn on one of the two testing | 26 | Additionally, /sys/power/disk can be used to turn on one of the two testing |
34 | modes of the suspend-to-disk mechanism: 'testproc' or 'test'. If the | 27 | modes of the suspend-to-disk mechanism: 'testproc' or 'test'. If the |
@@ -44,16 +37,12 @@ is being slow and which device drivers are misbehaving. | |||
44 | Reading from this file will display what the mode is currently set | 37 | Reading from this file will display what the mode is currently set |
45 | to. Writing to this file will accept one of | 38 | to. Writing to this file will accept one of |
46 | 39 | ||
47 | 'firmware' | 40 | 'platform' (only if the platform supports it) |
48 | 'platform' | ||
49 | 'shutdown' | 41 | 'shutdown' |
50 | 'reboot' | 42 | 'reboot' |
51 | 'testproc' | 43 | 'testproc' |
52 | 'test' | 44 | 'test' |
53 | 45 | ||
54 | It will only change to 'firmware' or 'platform' if the system supports | ||
55 | it. | ||
56 | |||
57 | /sys/power/image_size controls the size of the image created by | 46 | /sys/power/image_size controls the size of the image created by |
58 | the suspend-to-disk mechanism. It can be written a string | 47 | the suspend-to-disk mechanism. It can be written a string |
59 | representing a non-negative integer that will be used as an upper | 48 | representing a non-negative integer that will be used as an upper |
diff --git a/Documentation/power/states.txt b/Documentation/power/states.txt index 0931a330d362..34800cc521bf 100644 --- a/Documentation/power/states.txt +++ b/Documentation/power/states.txt | |||
@@ -62,17 +62,18 @@ setup via another operating system for it to use. Despite the | |||
62 | inconvenience, this method requires minimal work by the kernel, since | 62 | inconvenience, this method requires minimal work by the kernel, since |
63 | the firmware will also handle restoring memory contents on resume. | 63 | the firmware will also handle restoring memory contents on resume. |
64 | 64 | ||
65 | If the kernel is responsible for persistently saving state, a mechanism | 65 | For suspend-to-disk, a mechanism called swsusp called 'swsusp' (Swap |
66 | called 'swsusp' (Swap Suspend) is used to write memory contents to | 66 | Suspend) is used to write memory contents to free swap space. |
67 | free swap space. swsusp has some restrictive requirements, but should | 67 | swsusp has some restrictive requirements, but should work in most |
68 | work in most cases. Some, albeit outdated, documentation can be found | 68 | cases. Some, albeit outdated, documentation can be found in |
69 | in Documentation/power/swsusp.txt. | 69 | Documentation/power/swsusp.txt. Alternatively, userspace can do most |
70 | of the actual suspend to disk work, see userland-swsusp.txt. | ||
70 | 71 | ||
71 | Once memory state is written to disk, the system may either enter a | 72 | Once memory state is written to disk, the system may either enter a |
72 | low-power state (like ACPI S4), or it may simply power down. Powering | 73 | low-power state (like ACPI S4), or it may simply power down. Powering |
73 | down offers greater savings, and allows this mechanism to work on any | 74 | down offers greater savings, and allows this mechanism to work on any |
74 | system. However, entering a real low-power state allows the user to | 75 | system. However, entering a real low-power state allows the user to |
75 | trigger wake up events (e.g. pressing a key or opening a laptop lid). | 76 | trigger wake up events (e.g. pressing a key or opening a laptop lid). |
76 | 77 | ||
77 | A transition from Suspend-to-Disk to the On state should take about 30 | 78 | A transition from Suspend-to-Disk to the On state should take about 30 |
78 | seconds, though it's typically a bit more with the current | 79 | seconds, though it's typically a bit more with the current |
diff --git a/Documentation/power/swsusp.txt b/Documentation/power/swsusp.txt index 0761ff6c57ed..c55bd5079b90 100644 --- a/Documentation/power/swsusp.txt +++ b/Documentation/power/swsusp.txt | |||
@@ -156,8 +156,7 @@ instead set the PF_NOFREEZE process flag when creating the thread (and | |||
156 | be very careful). | 156 | be very careful). |
157 | 157 | ||
158 | 158 | ||
159 | Q: What is the difference between "platform", "shutdown" and | 159 | Q: What is the difference between "platform" and "shutdown"? |
160 | "firmware" in /sys/power/disk? | ||
161 | 160 | ||
162 | A: | 161 | A: |
163 | 162 | ||
@@ -166,11 +165,8 @@ shutdown: save state in linux, then tell bios to powerdown | |||
166 | platform: save state in linux, then tell bios to powerdown and blink | 165 | platform: save state in linux, then tell bios to powerdown and blink |
167 | "suspended led" | 166 | "suspended led" |
168 | 167 | ||
169 | firmware: tell bios to save state itself [needs BIOS-specific suspend | 168 | "platform" is actually right thing to do where supported, but |
170 | partition, and has very little to do with swsusp] | 169 | "shutdown" is most reliable (except on ACPI systems). |
171 | |||
172 | "platform" is actually right thing to do, but "shutdown" is most | ||
173 | reliable. | ||
174 | 170 | ||
175 | Q: I do not understand why you have such strong objections to idea of | 171 | Q: I do not understand why you have such strong objections to idea of |
176 | selective suspend. | 172 | selective suspend. |
@@ -388,8 +384,8 @@ while the system is asleep, maintaining the connection, using true sleep | |||
388 | modes like "suspend-to-RAM" or "standby". (Don't write "disk" to the | 384 | modes like "suspend-to-RAM" or "standby". (Don't write "disk" to the |
389 | /sys/power/state file; write "standby" or "mem".) We've not seen any | 385 | /sys/power/state file; write "standby" or "mem".) We've not seen any |
390 | hardware that can use these modes through software suspend, although in | 386 | hardware that can use these modes through software suspend, although in |
391 | theory some systems might support "platform" or "firmware" modes that | 387 | theory some systems might support "platform" modes that won't break the |
392 | won't break the USB connections. | 388 | USB connections. |
393 | 389 | ||
394 | Remember that it's always a bad idea to unplug a disk drive containing a | 390 | Remember that it's always a bad idea to unplug a disk drive containing a |
395 | mounted filesystem. That's true even when your system is asleep! The | 391 | mounted filesystem. That's true even when your system is asleep! The |
diff --git a/include/linux/pm.h b/include/linux/pm.h index dfced9188bdc..c2a55f94c29a 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h | |||
@@ -114,13 +114,12 @@ typedef int __bitwise suspend_disk_method_t; | |||
114 | 114 | ||
115 | /* invalid must be 0 so struct pm_ops initialisers can leave it out */ | 115 | /* invalid must be 0 so struct pm_ops initialisers can leave it out */ |
116 | #define PM_DISK_INVALID ((__force suspend_disk_method_t) 0) | 116 | #define PM_DISK_INVALID ((__force suspend_disk_method_t) 0) |
117 | #define PM_DISK_FIRMWARE ((__force suspend_disk_method_t) 1) | 117 | #define PM_DISK_PLATFORM ((__force suspend_disk_method_t) 1) |
118 | #define PM_DISK_PLATFORM ((__force suspend_disk_method_t) 2) | 118 | #define PM_DISK_SHUTDOWN ((__force suspend_disk_method_t) 2) |
119 | #define PM_DISK_SHUTDOWN ((__force suspend_disk_method_t) 3) | 119 | #define PM_DISK_REBOOT ((__force suspend_disk_method_t) 3) |
120 | #define PM_DISK_REBOOT ((__force suspend_disk_method_t) 4) | 120 | #define PM_DISK_TEST ((__force suspend_disk_method_t) 4) |
121 | #define PM_DISK_TEST ((__force suspend_disk_method_t) 5) | 121 | #define PM_DISK_TESTPROC ((__force suspend_disk_method_t) 5) |
122 | #define PM_DISK_TESTPROC ((__force suspend_disk_method_t) 6) | 122 | #define PM_DISK_MAX ((__force suspend_disk_method_t) 6) |
123 | #define PM_DISK_MAX ((__force suspend_disk_method_t) 7) | ||
124 | 123 | ||
125 | /** | 124 | /** |
126 | * struct pm_ops - Callbacks for managing platform dependent suspend states. | 125 | * struct pm_ops - Callbacks for managing platform dependent suspend states. |
diff --git a/kernel/power/disk.c b/kernel/power/disk.c index 4de2f69fe095..02e4fb69111a 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c | |||
@@ -122,8 +122,6 @@ static int prepare_processes(void) | |||
122 | /** | 122 | /** |
123 | * pm_suspend_disk - The granpappy of hibernation power management. | 123 | * pm_suspend_disk - The granpappy of hibernation power management. |
124 | * | 124 | * |
125 | * If we're going through the firmware, then get it over with quickly. | ||
126 | * | ||
127 | * If not, then call swsusp to do its thing, then figure out how | 125 | * If not, then call swsusp to do its thing, then figure out how |
128 | * to power down the system. | 126 | * to power down the system. |
129 | */ | 127 | */ |
@@ -292,7 +290,6 @@ late_initcall(software_resume); | |||
292 | 290 | ||
293 | 291 | ||
294 | static const char * const pm_disk_modes[] = { | 292 | static const char * const pm_disk_modes[] = { |
295 | [PM_DISK_FIRMWARE] = "firmware", | ||
296 | [PM_DISK_PLATFORM] = "platform", | 293 | [PM_DISK_PLATFORM] = "platform", |
297 | [PM_DISK_SHUTDOWN] = "shutdown", | 294 | [PM_DISK_SHUTDOWN] = "shutdown", |
298 | [PM_DISK_REBOOT] = "reboot", | 295 | [PM_DISK_REBOOT] = "reboot", |
@@ -303,27 +300,25 @@ static const char * const pm_disk_modes[] = { | |||
303 | /** | 300 | /** |
304 | * disk - Control suspend-to-disk mode | 301 | * disk - Control suspend-to-disk mode |
305 | * | 302 | * |
306 | * Suspend-to-disk can be handled in several ways. The greatest | 303 | * Suspend-to-disk can be handled in several ways. We have a few options |
307 | * distinction is who writes memory to disk - the firmware or the OS. | 304 | * for putting the system to sleep - using the platform driver (e.g. ACPI |
308 | * If the firmware does it, we assume that it also handles suspending | 305 | * or other pm_ops), powering off the system or rebooting the system |
309 | * the system. | 306 | * (for testing) as well as the two test modes. |
310 | * If the OS does it, then we have three options for putting the system | ||
311 | * to sleep - using the platform driver (e.g. ACPI or other PM registers), | ||
312 | * powering off the system or rebooting the system (for testing). | ||
313 | * | 307 | * |
314 | * The system will support either 'firmware' or 'platform', and that is | 308 | * The system can support 'platform', and that is known a priori (and |
315 | * known a priori (and encoded in pm_ops). But, the user may choose | 309 | * encoded in pm_ops). However, the user may choose 'shutdown' or 'reboot' |
316 | * 'shutdown' or 'reboot' as alternatives. | 310 | * as alternatives, as well as the test modes 'test' and 'testproc'. |
317 | * | 311 | * |
318 | * show() will display what the mode is currently set to. | 312 | * show() will display what the mode is currently set to. |
319 | * store() will accept one of | 313 | * store() will accept one of |
320 | * | 314 | * |
321 | * 'firmware' | ||
322 | * 'platform' | 315 | * 'platform' |
323 | * 'shutdown' | 316 | * 'shutdown' |
324 | * 'reboot' | 317 | * 'reboot' |
318 | * 'test' | ||
319 | * 'testproc' | ||
325 | * | 320 | * |
326 | * It will only change to 'firmware' or 'platform' if the system | 321 | * It will only change to 'platform' if the system |
327 | * supports it (as determined from pm_ops->pm_disk_mode). | 322 | * supports it (as determined from pm_ops->pm_disk_mode). |
328 | */ | 323 | */ |
329 | 324 | ||
@@ -345,7 +340,7 @@ static ssize_t disk_store(struct subsystem * s, const char * buf, size_t n) | |||
345 | len = p ? p - buf : n; | 340 | len = p ? p - buf : n; |
346 | 341 | ||
347 | mutex_lock(&pm_mutex); | 342 | mutex_lock(&pm_mutex); |
348 | for (i = PM_DISK_FIRMWARE; i < PM_DISK_MAX; i++) { | 343 | for (i = PM_DISK_PLATFORM; i < PM_DISK_MAX; i++) { |
349 | if (!strncmp(buf, pm_disk_modes[i], len)) { | 344 | if (!strncmp(buf, pm_disk_modes[i], len)) { |
350 | mode = i; | 345 | mode = i; |
351 | break; | 346 | break; |