1 /* 2 * kernel/power/suspend.c - Suspend to RAM and standby functionality. 3 * 4 * Copyright (c) 2003 Patrick Mochel 5 * Copyright (c) 2003 Open Source Development Lab 6 * Copyright (c) 2009 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc. 7 * 8 * This file is released under the GPLv2. 9 */ 10 11 #include <linux/string.h> 12 #include <linux/delay.h> 13 #include <linux/errno.h> 14 #include <linux/init.h> 15 #include <linux/console.h> 16 #include <linux/cpu.h> 17 #include <linux/cpuidle.h> 18 #include <linux/syscalls.h> 19 #include <linux/gfp.h> 20 #include <linux/io.h> 21 #include <linux/kernel.h> 22 #include <linux/list.h> 23 #include <linux/mm.h> 24 #include <linux/slab.h> 25 #include <linux/export.h> 26 #include <linux/suspend.h> 27 #include <linux/syscore_ops.h> 28 #include <linux/ftrace.h> 29 #include <trace/events/power.h> 30 #include <linux/compiler.h> 31 32 #include "power.h" 33 34 static const char *pm_labels[] = { "mem", "standby", "freeze", }; 35 const char *pm_states[PM_SUSPEND_MAX]; 36 37 static const struct platform_suspend_ops *suspend_ops; 38 static const struct platform_freeze_ops *freeze_ops; 39 static DECLARE_WAIT_QUEUE_HEAD(suspend_freeze_wait_head); 40 static bool suspend_freeze_wake; 41 42 void freeze_set_ops(const struct platform_freeze_ops *ops) 43 { 44 lock_system_sleep(); 45 freeze_ops = ops; 46 unlock_system_sleep(); 47 } 48 49 static void freeze_begin(void) 50 { 51 suspend_freeze_wake = false; 52 } 53 54 static void freeze_enter(void) 55 { 56 cpuidle_use_deepest_state(true); 57 cpuidle_resume(); 58 wait_event(suspend_freeze_wait_head, suspend_freeze_wake); 59 cpuidle_pause(); 60 cpuidle_use_deepest_state(false); 61 } 62 63 void freeze_wake(void) 64 { 65 suspend_freeze_wake = true; 66 wake_up(&suspend_freeze_wait_head); 67 } 68 EXPORT_SYMBOL_GPL(freeze_wake); 69 70 static bool valid_state(suspend_state_t state) 71 { 72 /* 73 * PM_SUSPEND_STANDBY and PM_SUSPEND_MEM states need low level 74 * support and need to be valid to the low level 75 * implementation, no valid callback implies that none are valid. 76 */ 77 return suspend_ops && suspend_ops->valid && suspend_ops->valid(state); 78 } 79 80 /* 81 * If this is set, the "mem" label always corresponds to the deepest sleep state 82 * available, the "standby" label corresponds to the second deepest sleep state 83 * available (if any), and the "freeze" label corresponds to the remaining 84 * available sleep state (if there is one). 85 */ 86 static bool relative_states; 87 88 static int __init sleep_states_setup(char *str) 89 { 90 relative_states = !strncmp(str, "1", 1); 91 pm_states[PM_SUSPEND_FREEZE] = pm_labels[relative_states ? 0 : 2]; 92 return 1; 93 } 94 95 __setup("relative_sleep_states=", sleep_states_setup); 96 97 /** 98 * suspend_set_ops - Set the global suspend method table. 99 * @ops: Suspend operations to use. 100 */ 101 void suspend_set_ops(const struct platform_suspend_ops *ops) 102 { 103 suspend_state_t i; 104 int j = 0; 105 106 lock_system_sleep(); 107 108 suspend_ops = ops; 109 for (i = PM_SUSPEND_MEM; i >= PM_SUSPEND_STANDBY; i--) 110 if (valid_state(i)) { 111 pm_states[i] = pm_labels[j++]; 112 } else if (!relative_states) { 113 pm_states[i] = NULL; 114 j++; 115 } 116 117 pm_states[PM_SUSPEND_FREEZE] = pm_labels[j]; 118 119 unlock_system_sleep(); 120 } 121 EXPORT_SYMBOL_GPL(suspend_set_ops); 122 123 /** 124 * suspend_valid_only_mem - Generic memory-only valid callback. 125 * 126 * Platform drivers that implement mem suspend only and only need to check for 127 * that in their .valid() callback can use this instead of rolling their own 128 * .valid() callback. 129 */ 130 int suspend_valid_only_mem(suspend_state_t state) 131 { 132 return state == PM_SUSPEND_MEM; 133 } 134 EXPORT_SYMBOL_GPL(suspend_valid_only_mem); 135 136 static bool sleep_state_supported(suspend_state_t state) 137 { 138 return state == PM_SUSPEND_FREEZE || (suspend_ops && suspend_ops->enter); 139 } 140 141 static int platform_suspend_prepare(suspend_state_t state) 142 { 143 return state != PM_SUSPEND_FREEZE && suspend_ops->prepare ? 144 suspend_ops->prepare() : 0; 145 } 146 147 static int platform_suspend_prepare_late(suspend_state_t state) 148 { 149 return state != PM_SUSPEND_FREEZE && suspend_ops->prepare_late ? 150 suspend_ops->prepare_late() : 0; 151 } 152 153 static void platform_suspend_wake(suspend_state_t state) 154 { 155 if (state != PM_SUSPEND_FREEZE && suspend_ops->wake) 156 suspend_ops->wake(); 157 } 158 159 static void platform_suspend_finish(suspend_state_t state) 160 { 161 if (state != PM_SUSPEND_FREEZE && suspend_ops->finish) 162 suspend_ops->finish(); 163 } 164 165 static int platform_suspend_begin(suspend_state_t state) 166 { 167 if (state == PM_SUSPEND_FREEZE && freeze_ops && freeze_ops->begin) 168 return freeze_ops->begin(); 169 else if (suspend_ops->begin) 170 return suspend_ops->begin(state); 171 else 172 return 0; 173 } 174 175 static void platform_suspend_end(suspend_state_t state) 176 { 177 if (state == PM_SUSPEND_FREEZE && freeze_ops && freeze_ops->end) 178 freeze_ops->end(); 179 else if (suspend_ops->end) 180 suspend_ops->end(); 181 } 182 183 static void platform_suspend_recover(suspend_state_t state) 184 { 185 if (state != PM_SUSPEND_FREEZE && suspend_ops->recover) 186 suspend_ops->recover(); 187 } 188 189 static bool platform_suspend_again(suspend_state_t state) 190 { 191 return state != PM_SUSPEND_FREEZE && suspend_ops->suspend_again ? 192 suspend_ops->suspend_again() : false; 193 } 194 195 static int suspend_test(int level) 196 { 197 #ifdef CONFIG_PM_DEBUG 198 if (pm_test_level == level) { 199 printk(KERN_INFO "suspend debug: Waiting for 5 seconds.\n"); 200 mdelay(5000); 201 return 1; 202 } 203 #endif /* !CONFIG_PM_DEBUG */ 204 return 0; 205 } 206 207 /** 208 * suspend_prepare - Prepare for entering system sleep state. 209 * 210 * Common code run for every system sleep state that can be entered (except for 211 * hibernation). Run suspend notifiers, allocate the "suspend" console and 212 * freeze processes. 213 */ 214 static int suspend_prepare(suspend_state_t state) 215 { 216 int error; 217 218 if (!sleep_state_supported(state)) 219 return -EPERM; 220 221 pm_prepare_console(); 222 223 error = pm_notifier_call_chain(PM_SUSPEND_PREPARE); 224 if (error) 225 goto Finish; 226 227 trace_suspend_resume(TPS("freeze_processes"), 0, true); 228 error = suspend_freeze_processes(); 229 trace_suspend_resume(TPS("freeze_processes"), 0, false); 230 if (!error) 231 return 0; 232 233 suspend_stats.failed_freeze++; 234 dpm_save_failed_step(SUSPEND_FREEZE); 235 Finish: 236 pm_notifier_call_chain(PM_POST_SUSPEND); 237 pm_restore_console(); 238 return error; 239 } 240 241 /* default implementation */ 242 void __weak arch_suspend_disable_irqs(void) 243 { 244 local_irq_disable(); 245 } 246 247 /* default implementation */ 248 void __weak arch_suspend_enable_irqs(void) 249 { 250 local_irq_enable(); 251 } 252 253 /** 254 * suspend_enter - Make the system enter the given sleep state. 255 * @state: System sleep state to enter. 256 * @wakeup: Returns information that the sleep state should not be re-entered. 257 * 258 * This function should be called after devices have been suspended. 259 */ 260 static int suspend_enter(suspend_state_t state, bool *wakeup) 261 { 262 int error; 263 264 error = platform_suspend_prepare(state); 265 if (error) 266 goto Platform_finish; 267 268 error = dpm_suspend_end(PMSG_SUSPEND); 269 if (error) { 270 printk(KERN_ERR "PM: Some devices failed to power down\n"); 271 goto Platform_finish; 272 } 273 error = platform_suspend_prepare_late(state); 274 if (error) 275 goto Platform_wake; 276 277 if (suspend_test(TEST_PLATFORM)) 278 goto Platform_wake; 279 280 /* 281 * PM_SUSPEND_FREEZE equals 282 * frozen processes + suspended devices + idle processors. 283 * Thus we should invoke freeze_enter() soon after 284 * all the devices are suspended. 285 */ 286 if (state == PM_SUSPEND_FREEZE) { 287 trace_suspend_resume(TPS("machine_suspend"), state, true); 288 freeze_enter(); 289 trace_suspend_resume(TPS("machine_suspend"), state, false); 290 goto Platform_wake; 291 } 292 293 error = disable_nonboot_cpus(); 294 if (error || suspend_test(TEST_CPUS)) 295 goto Enable_cpus; 296 297 arch_suspend_disable_irqs(); 298 BUG_ON(!irqs_disabled()); 299 300 error = syscore_suspend(); 301 if (!error) { 302 *wakeup = pm_wakeup_pending(); 303 if (!(suspend_test(TEST_CORE) || *wakeup)) { 304 trace_suspend_resume(TPS("machine_suspend"), 305 state, true); 306 error = suspend_ops->enter(state); 307 trace_suspend_resume(TPS("machine_suspend"), 308 state, false); 309 events_check_enabled = false; 310 } 311 syscore_resume(); 312 } 313 314 arch_suspend_enable_irqs(); 315 BUG_ON(irqs_disabled()); 316 317 Enable_cpus: 318 enable_nonboot_cpus(); 319 320 Platform_wake: 321 platform_suspend_wake(state); 322 dpm_resume_start(PMSG_RESUME); 323 324 Platform_finish: 325 platform_suspend_finish(state); 326 return error; 327 } 328 329 /** 330 * suspend_devices_and_enter - Suspend devices and enter system sleep state. 331 * @state: System sleep state to enter. 332 */ 333 int suspend_devices_and_enter(suspend_state_t state) 334 { 335 int error; 336 bool wakeup = false; 337 338 if (!sleep_state_supported(state)) 339 return -ENOSYS; 340 341 error = platform_suspend_begin(state); 342 if (error) 343 goto Close; 344 345 suspend_console(); 346 suspend_test_start(); 347 error = dpm_suspend_start(PMSG_SUSPEND); 348 if (error) { 349 pr_err("PM: Some devices failed to suspend, or early wake event detected\n"); 350 goto Recover_platform; 351 } 352 suspend_test_finish("suspend devices"); 353 if (suspend_test(TEST_DEVICES)) 354 goto Recover_platform; 355 356 do { 357 error = suspend_enter(state, &wakeup); 358 } while (!error && !wakeup && platform_suspend_again(state)); 359 360 Resume_devices: 361 suspend_test_start(); 362 dpm_resume_end(PMSG_RESUME); 363 suspend_test_finish("resume devices"); 364 resume_console(); 365 366 Close: 367 platform_suspend_end(state); 368 return error; 369 370 Recover_platform: 371 platform_suspend_recover(state); 372 goto Resume_devices; 373 } 374 375 /** 376 * suspend_finish - Clean up before finishing the suspend sequence. 377 * 378 * Call platform code to clean up, restart processes, and free the console that 379 * we've allocated. This routine is not called for hibernation. 380 */ 381 static void suspend_finish(void) 382 { 383 suspend_thaw_processes(); 384 pm_notifier_call_chain(PM_POST_SUSPEND); 385 pm_restore_console(); 386 } 387 388 /** 389 * enter_state - Do common work needed to enter system sleep state. 390 * @state: System sleep state to enter. 391 * 392 * Make sure that no one else is trying to put the system into a sleep state. 393 * Fail if that's not the case. Otherwise, prepare for system suspend, make the 394 * system enter the given sleep state and clean up after wakeup. 395 */ 396 static int enter_state(suspend_state_t state) 397 { 398 int error; 399 400 trace_suspend_resume(TPS("suspend_enter"), state, true); 401 if (state == PM_SUSPEND_FREEZE) { 402 #ifdef CONFIG_PM_DEBUG 403 if (pm_test_level != TEST_NONE && pm_test_level <= TEST_CPUS) { 404 pr_warning("PM: Unsupported test mode for freeze state," 405 "please choose none/freezer/devices/platform.\n"); 406 return -EAGAIN; 407 } 408 #endif 409 } else if (!valid_state(state)) { 410 return -EINVAL; 411 } 412 if (!mutex_trylock(&pm_mutex)) 413 return -EBUSY; 414 415 if (state == PM_SUSPEND_FREEZE) 416 freeze_begin(); 417 418 trace_suspend_resume(TPS("sync_filesystems"), 0, true); 419 printk(KERN_INFO "PM: Syncing filesystems ... "); 420 sys_sync(); 421 printk("done.\n"); 422 trace_suspend_resume(TPS("sync_filesystems"), 0, false); 423 424 pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]); 425 error = suspend_prepare(state); 426 if (error) 427 goto Unlock; 428 429 if (suspend_test(TEST_FREEZER)) 430 goto Finish; 431 432 trace_suspend_resume(TPS("suspend_enter"), state, false); 433 pr_debug("PM: Entering %s sleep\n", pm_states[state]); 434 pm_restrict_gfp_mask(); 435 error = suspend_devices_and_enter(state); 436 pm_restore_gfp_mask(); 437 438 Finish: 439 pr_debug("PM: Finishing wakeup.\n"); 440 suspend_finish(); 441 Unlock: 442 mutex_unlock(&pm_mutex); 443 return error; 444 } 445 446 /** 447 * pm_suspend - Externally visible function for suspending the system. 448 * @state: System sleep state to enter. 449 * 450 * Check if the value of @state represents one of the supported states, 451 * execute enter_state() and update system suspend statistics. 452 */ 453 int pm_suspend(suspend_state_t state) 454 { 455 int error; 456 457 if (state <= PM_SUSPEND_ON || state >= PM_SUSPEND_MAX) 458 return -EINVAL; 459 460 error = enter_state(state); 461 if (error) { 462 suspend_stats.fail++; 463 dpm_save_failed_errno(error); 464 } else { 465 suspend_stats.success++; 466 } 467 return error; 468 } 469 EXPORT_SYMBOL(pm_suspend); 470