]> Pileus Git - ~andy/linux/blob - kernel/power/disk.c
PM: Rename hibernation_ops to platform_hibernation_ops
[~andy/linux] / kernel / power / disk.c
1 /*
2  * kernel/power/disk.c - Suspend-to-disk support.
3  *
4  * Copyright (c) 2003 Patrick Mochel
5  * Copyright (c) 2003 Open Source Development Lab
6  * Copyright (c) 2004 Pavel Machek <pavel@suse.cz>
7  *
8  * This file is released under the GPLv2.
9  *
10  */
11
12 #include <linux/suspend.h>
13 #include <linux/syscalls.h>
14 #include <linux/reboot.h>
15 #include <linux/string.h>
16 #include <linux/device.h>
17 #include <linux/delay.h>
18 #include <linux/fs.h>
19 #include <linux/mount.h>
20 #include <linux/pm.h>
21 #include <linux/console.h>
22 #include <linux/cpu.h>
23 #include <linux/freezer.h>
24
25 #include "power.h"
26
27
28 static int noresume = 0;
29 char resume_file[256] = CONFIG_PM_STD_PARTITION;
30 dev_t swsusp_resume_device;
31 sector_t swsusp_resume_block;
32
33 enum {
34         HIBERNATION_INVALID,
35         HIBERNATION_PLATFORM,
36         HIBERNATION_TEST,
37         HIBERNATION_TESTPROC,
38         HIBERNATION_SHUTDOWN,
39         HIBERNATION_REBOOT,
40         /* keep last */
41         __HIBERNATION_AFTER_LAST
42 };
43 #define HIBERNATION_MAX (__HIBERNATION_AFTER_LAST-1)
44 #define HIBERNATION_FIRST (HIBERNATION_INVALID + 1)
45
46 static int hibernation_mode = HIBERNATION_SHUTDOWN;
47
48 static struct platform_hibernation_ops *hibernation_ops;
49
50 /**
51  * hibernation_set_ops - set the global hibernate operations
52  * @ops: the hibernation operations to use in subsequent hibernation transitions
53  */
54
55 void hibernation_set_ops(struct platform_hibernation_ops *ops)
56 {
57         if (ops && !(ops->start && ops->pre_snapshot && ops->finish
58             && ops->prepare && ops->enter && ops->pre_restore
59             && ops->restore_cleanup)) {
60                 WARN_ON(1);
61                 return;
62         }
63         mutex_lock(&pm_mutex);
64         hibernation_ops = ops;
65         if (ops)
66                 hibernation_mode = HIBERNATION_PLATFORM;
67         else if (hibernation_mode == HIBERNATION_PLATFORM)
68                 hibernation_mode = HIBERNATION_SHUTDOWN;
69
70         mutex_unlock(&pm_mutex);
71 }
72
73 /**
74  *      platform_start - tell the platform driver that we're starting
75  *      hibernation
76  */
77
78 static int platform_start(int platform_mode)
79 {
80         return (platform_mode && hibernation_ops) ?
81                 hibernation_ops->start() : 0;
82 }
83
84 /**
85  *      platform_pre_snapshot - prepare the machine for hibernation using the
86  *      platform driver if so configured and return an error code if it fails
87  */
88
89 static int platform_pre_snapshot(int platform_mode)
90 {
91         return (platform_mode && hibernation_ops) ?
92                 hibernation_ops->pre_snapshot() : 0;
93 }
94
95 /**
96  *      platform_finish - switch the machine to the normal mode of operation
97  *      using the platform driver (must be called after platform_prepare())
98  */
99
100 static void platform_finish(int platform_mode)
101 {
102         if (platform_mode && hibernation_ops)
103                 hibernation_ops->finish();
104 }
105
106 /**
107  *      platform_pre_restore - prepare the platform for the restoration from a
108  *      hibernation image.  If the restore fails after this function has been
109  *      called, platform_restore_cleanup() must be called.
110  */
111
112 static int platform_pre_restore(int platform_mode)
113 {
114         return (platform_mode && hibernation_ops) ?
115                 hibernation_ops->pre_restore() : 0;
116 }
117
118 /**
119  *      platform_restore_cleanup - switch the platform to the normal mode of
120  *      operation after a failing restore.  If platform_pre_restore() has been
121  *      called before the failing restore, this function must be called too,
122  *      regardless of the result of platform_pre_restore().
123  */
124
125 static void platform_restore_cleanup(int platform_mode)
126 {
127         if (platform_mode && hibernation_ops)
128                 hibernation_ops->restore_cleanup();
129 }
130
131 /**
132  *      hibernation_snapshot - quiesce devices and create the hibernation
133  *      snapshot image.
134  *      @platform_mode - if set, use the platform driver, if available, to
135  *                       prepare the platform frimware for the power transition.
136  *
137  *      Must be called with pm_mutex held
138  */
139
140 int hibernation_snapshot(int platform_mode)
141 {
142         int error;
143
144         /* Free memory before shutting down devices. */
145         error = swsusp_shrink_memory();
146         if (error)
147                 return error;
148
149         error = platform_start(platform_mode);
150         if (error)
151                 return error;
152
153         suspend_console();
154         error = device_suspend(PMSG_FREEZE);
155         if (error)
156                 goto Resume_console;
157
158         error = platform_pre_snapshot(platform_mode);
159         if (error)
160                 goto Resume_devices;
161
162         error = disable_nonboot_cpus();
163         if (!error) {
164                 if (hibernation_mode != HIBERNATION_TEST) {
165                         in_suspend = 1;
166                         error = swsusp_suspend();
167                         /* Control returns here after successful restore */
168                 } else {
169                         printk("swsusp debug: Waiting for 5 seconds.\n");
170                         mdelay(5000);
171                 }
172         }
173         enable_nonboot_cpus();
174  Resume_devices:
175         platform_finish(platform_mode);
176         device_resume();
177  Resume_console:
178         resume_console();
179         return error;
180 }
181
182 /**
183  *      hibernation_restore - quiesce devices and restore the hibernation
184  *      snapshot image.  If successful, control returns in hibernation_snaphot()
185  *      @platform_mode - if set, use the platform driver, if available, to
186  *                       prepare the platform frimware for the transition.
187  *
188  *      Must be called with pm_mutex held
189  */
190
191 int hibernation_restore(int platform_mode)
192 {
193         int error;
194
195         pm_prepare_console();
196         suspend_console();
197         error = device_suspend(PMSG_PRETHAW);
198         if (error)
199                 goto Finish;
200
201         error = platform_pre_restore(platform_mode);
202         if (!error) {
203                 error = disable_nonboot_cpus();
204                 if (!error)
205                         error = swsusp_resume();
206                 enable_nonboot_cpus();
207         }
208         platform_restore_cleanup(platform_mode);
209         device_resume();
210  Finish:
211         resume_console();
212         pm_restore_console();
213         return error;
214 }
215
216 /**
217  *      hibernation_platform_enter - enter the hibernation state using the
218  *      platform driver (if available)
219  */
220
221 int hibernation_platform_enter(void)
222 {
223         int error;
224
225         if (hibernation_ops) {
226                 kernel_shutdown_prepare(SYSTEM_SUSPEND_DISK);
227                 /*
228                  * We have cancelled the power transition by running
229                  * hibernation_ops->finish() before saving the image, so we
230                  * should let the firmware know that we're going to enter the
231                  * sleep state after all
232                  */
233                 error = hibernation_ops->prepare();
234                 sysdev_shutdown();
235                 if (!error)
236                         error = hibernation_ops->enter();
237         } else {
238                 error = -ENOSYS;
239         }
240         return error;
241 }
242
243 /**
244  *      power_down - Shut the machine down for hibernation.
245  *
246  *      Use the platform driver, if configured so; otherwise try
247  *      to power off or reboot.
248  */
249
250 static void power_down(void)
251 {
252         switch (hibernation_mode) {
253         case HIBERNATION_TEST:
254         case HIBERNATION_TESTPROC:
255                 break;
256         case HIBERNATION_SHUTDOWN:
257                 kernel_power_off();
258                 break;
259         case HIBERNATION_REBOOT:
260                 kernel_restart(NULL);
261                 break;
262         case HIBERNATION_PLATFORM:
263                 hibernation_platform_enter();
264         }
265         kernel_halt();
266         /*
267          * Valid image is on the disk, if we continue we risk serious data
268          * corruption after resume.
269          */
270         printk(KERN_CRIT "Please power me down manually\n");
271         while(1);
272 }
273
274 static void unprepare_processes(void)
275 {
276         thaw_processes();
277         pm_restore_console();
278 }
279
280 static int prepare_processes(void)
281 {
282         int error = 0;
283
284         pm_prepare_console();
285         if (freeze_processes()) {
286                 error = -EBUSY;
287                 unprepare_processes();
288         }
289         return error;
290 }
291
292 /**
293  *      hibernate - The granpappy of the built-in hibernation management
294  */
295
296 int hibernate(void)
297 {
298         int error;
299
300         mutex_lock(&pm_mutex);
301         /* The snapshot device should not be opened while we're running */
302         if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
303                 error = -EBUSY;
304                 goto Unlock;
305         }
306
307         error = pm_notifier_call_chain(PM_HIBERNATION_PREPARE);
308         if (error)
309                 goto Exit;
310
311         /* Allocate memory management structures */
312         error = create_basic_memory_bitmaps();
313         if (error)
314                 goto Exit;
315
316         error = prepare_processes();
317         if (error)
318                 goto Finish;
319
320         if (hibernation_mode == HIBERNATION_TESTPROC) {
321                 printk("swsusp debug: Waiting for 5 seconds.\n");
322                 mdelay(5000);
323                 goto Thaw;
324         }
325         error = hibernation_snapshot(hibernation_mode == HIBERNATION_PLATFORM);
326         if (in_suspend && !error) {
327                 unsigned int flags = 0;
328
329                 if (hibernation_mode == HIBERNATION_PLATFORM)
330                         flags |= SF_PLATFORM_MODE;
331                 pr_debug("PM: writing image.\n");
332                 error = swsusp_write(flags);
333                 swsusp_free();
334                 if (!error)
335                         power_down();
336         } else {
337                 pr_debug("PM: Image restored successfully.\n");
338                 swsusp_free();
339         }
340  Thaw:
341         unprepare_processes();
342  Finish:
343         free_basic_memory_bitmaps();
344  Exit:
345         pm_notifier_call_chain(PM_POST_HIBERNATION);
346         atomic_inc(&snapshot_device_available);
347  Unlock:
348         mutex_unlock(&pm_mutex);
349         return error;
350 }
351
352
353 /**
354  *      software_resume - Resume from a saved image.
355  *
356  *      Called as a late_initcall (so all devices are discovered and
357  *      initialized), we call swsusp to see if we have a saved image or not.
358  *      If so, we quiesce devices, the restore the saved image. We will
359  *      return above (in hibernate() ) if everything goes well.
360  *      Otherwise, we fail gracefully and return to the normally
361  *      scheduled program.
362  *
363  */
364
365 static int software_resume(void)
366 {
367         int error;
368         unsigned int flags;
369
370         mutex_lock(&pm_mutex);
371         if (!swsusp_resume_device) {
372                 if (!strlen(resume_file)) {
373                         mutex_unlock(&pm_mutex);
374                         return -ENOENT;
375                 }
376                 swsusp_resume_device = name_to_dev_t(resume_file);
377                 pr_debug("swsusp: Resume From Partition %s\n", resume_file);
378         } else {
379                 pr_debug("swsusp: Resume From Partition %d:%d\n",
380                          MAJOR(swsusp_resume_device), MINOR(swsusp_resume_device));
381         }
382
383         if (noresume) {
384                 /**
385                  * FIXME: If noresume is specified, we need to find the partition
386                  * and reset it back to normal swap space.
387                  */
388                 mutex_unlock(&pm_mutex);
389                 return 0;
390         }
391
392         pr_debug("PM: Checking swsusp image.\n");
393         error = swsusp_check();
394         if (error)
395                 goto Unlock;
396
397         /* The snapshot device should not be opened while we're running */
398         if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
399                 error = -EBUSY;
400                 goto Unlock;
401         }
402
403         error = create_basic_memory_bitmaps();
404         if (error)
405                 goto Finish;
406
407         pr_debug("PM: Preparing processes for restore.\n");
408         error = prepare_processes();
409         if (error) {
410                 swsusp_close();
411                 goto Done;
412         }
413
414         pr_debug("PM: Reading swsusp image.\n");
415
416         error = swsusp_read(&flags);
417         if (!error)
418                 hibernation_restore(flags & SF_PLATFORM_MODE);
419
420         printk(KERN_ERR "PM: Restore failed, recovering.\n");
421         swsusp_free();
422         unprepare_processes();
423  Done:
424         free_basic_memory_bitmaps();
425  Finish:
426         atomic_inc(&snapshot_device_available);
427         /* For success case, the suspend path will release the lock */
428  Unlock:
429         mutex_unlock(&pm_mutex);
430         pr_debug("PM: Resume from disk failed.\n");
431         return error;
432 }
433
434 late_initcall(software_resume);
435
436
437 static const char * const hibernation_modes[] = {
438         [HIBERNATION_PLATFORM]  = "platform",
439         [HIBERNATION_SHUTDOWN]  = "shutdown",
440         [HIBERNATION_REBOOT]    = "reboot",
441         [HIBERNATION_TEST]      = "test",
442         [HIBERNATION_TESTPROC]  = "testproc",
443 };
444
445 /**
446  *      disk - Control hibernation mode
447  *
448  *      Suspend-to-disk can be handled in several ways. We have a few options
449  *      for putting the system to sleep - using the platform driver (e.g. ACPI
450  *      or other hibernation_ops), powering off the system or rebooting the
451  *      system (for testing) as well as the two test modes.
452  *
453  *      The system can support 'platform', and that is known a priori (and
454  *      encoded by the presence of hibernation_ops). However, the user may
455  *      choose 'shutdown' or 'reboot' as alternatives, as well as one fo the
456  *      test modes, 'test' or 'testproc'.
457  *
458  *      show() will display what the mode is currently set to.
459  *      store() will accept one of
460  *
461  *      'platform'
462  *      'shutdown'
463  *      'reboot'
464  *      'test'
465  *      'testproc'
466  *
467  *      It will only change to 'platform' if the system
468  *      supports it (as determined by having hibernation_ops).
469  */
470
471 static ssize_t disk_show(struct kset *kset, char *buf)
472 {
473         int i;
474         char *start = buf;
475
476         for (i = HIBERNATION_FIRST; i <= HIBERNATION_MAX; i++) {
477                 if (!hibernation_modes[i])
478                         continue;
479                 switch (i) {
480                 case HIBERNATION_SHUTDOWN:
481                 case HIBERNATION_REBOOT:
482                 case HIBERNATION_TEST:
483                 case HIBERNATION_TESTPROC:
484                         break;
485                 case HIBERNATION_PLATFORM:
486                         if (hibernation_ops)
487                                 break;
488                         /* not a valid mode, continue with loop */
489                         continue;
490                 }
491                 if (i == hibernation_mode)
492                         buf += sprintf(buf, "[%s] ", hibernation_modes[i]);
493                 else
494                         buf += sprintf(buf, "%s ", hibernation_modes[i]);
495         }
496         buf += sprintf(buf, "\n");
497         return buf-start;
498 }
499
500
501 static ssize_t disk_store(struct kset *kset, const char *buf, size_t n)
502 {
503         int error = 0;
504         int i;
505         int len;
506         char *p;
507         int mode = HIBERNATION_INVALID;
508
509         p = memchr(buf, '\n', n);
510         len = p ? p - buf : n;
511
512         mutex_lock(&pm_mutex);
513         for (i = HIBERNATION_FIRST; i <= HIBERNATION_MAX; i++) {
514                 if (len == strlen(hibernation_modes[i])
515                     && !strncmp(buf, hibernation_modes[i], len)) {
516                         mode = i;
517                         break;
518                 }
519         }
520         if (mode != HIBERNATION_INVALID) {
521                 switch (mode) {
522                 case HIBERNATION_SHUTDOWN:
523                 case HIBERNATION_REBOOT:
524                 case HIBERNATION_TEST:
525                 case HIBERNATION_TESTPROC:
526                         hibernation_mode = mode;
527                         break;
528                 case HIBERNATION_PLATFORM:
529                         if (hibernation_ops)
530                                 hibernation_mode = mode;
531                         else
532                                 error = -EINVAL;
533                 }
534         } else
535                 error = -EINVAL;
536
537         if (!error)
538                 pr_debug("PM: suspend-to-disk mode set to '%s'\n",
539                          hibernation_modes[mode]);
540         mutex_unlock(&pm_mutex);
541         return error ? error : n;
542 }
543
544 power_attr(disk);
545
546 static ssize_t resume_show(struct kset *kset, char *buf)
547 {
548         return sprintf(buf,"%d:%d\n", MAJOR(swsusp_resume_device),
549                        MINOR(swsusp_resume_device));
550 }
551
552 static ssize_t resume_store(struct kset *kset, const char *buf, size_t n)
553 {
554         unsigned int maj, min;
555         dev_t res;
556         int ret = -EINVAL;
557
558         if (sscanf(buf, "%u:%u", &maj, &min) != 2)
559                 goto out;
560
561         res = MKDEV(maj,min);
562         if (maj != MAJOR(res) || min != MINOR(res))
563                 goto out;
564
565         mutex_lock(&pm_mutex);
566         swsusp_resume_device = res;
567         mutex_unlock(&pm_mutex);
568         printk("Attempting manual resume\n");
569         noresume = 0;
570         software_resume();
571         ret = n;
572  out:
573         return ret;
574 }
575
576 power_attr(resume);
577
578 static ssize_t image_size_show(struct kset *kset, char *buf)
579 {
580         return sprintf(buf, "%lu\n", image_size);
581 }
582
583 static ssize_t image_size_store(struct kset *kset, const char *buf, size_t n)
584 {
585         unsigned long size;
586
587         if (sscanf(buf, "%lu", &size) == 1) {
588                 image_size = size;
589                 return n;
590         }
591
592         return -EINVAL;
593 }
594
595 power_attr(image_size);
596
597 static struct attribute * g[] = {
598         &disk_attr.attr,
599         &resume_attr.attr,
600         &image_size_attr.attr,
601         NULL,
602 };
603
604
605 static struct attribute_group attr_group = {
606         .attrs = g,
607 };
608
609
610 static int __init pm_disk_init(void)
611 {
612         return sysfs_create_group(&power_subsys.kobj, &attr_group);
613 }
614
615 core_initcall(pm_disk_init);
616
617
618 static int __init resume_setup(char *str)
619 {
620         if (noresume)
621                 return 1;
622
623         strncpy( resume_file, str, 255 );
624         return 1;
625 }
626
627 static int __init resume_offset_setup(char *str)
628 {
629         unsigned long long offset;
630
631         if (noresume)
632                 return 1;
633
634         if (sscanf(str, "%llu", &offset) == 1)
635                 swsusp_resume_block = offset;
636
637         return 1;
638 }
639
640 static int __init noresume_setup(char *str)
641 {
642         noresume = 1;
643         return 1;
644 }
645
646 __setup("noresume", noresume_setup);
647 __setup("resume_offset=", resume_offset_setup);
648 __setup("resume=", resume_setup);