0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #define pr_fmt(fmt) "PM: " fmt
0011
0012 #include <linux/string.h>
0013 #include <linux/delay.h>
0014 #include <linux/errno.h>
0015 #include <linux/init.h>
0016 #include <linux/console.h>
0017 #include <linux/cpu.h>
0018 #include <linux/cpuidle.h>
0019 #include <linux/gfp.h>
0020 #include <linux/io.h>
0021 #include <linux/kernel.h>
0022 #include <linux/list.h>
0023 #include <linux/mm.h>
0024 #include <linux/slab.h>
0025 #include <linux/export.h>
0026 #include <linux/suspend.h>
0027 #include <linux/syscore_ops.h>
0028 #include <linux/swait.h>
0029 #include <linux/ftrace.h>
0030 #include <trace/events/power.h>
0031 #include <linux/compiler.h>
0032 #include <linux/moduleparam.h>
0033
0034 #include "power.h"
0035
0036 const char * const pm_labels[] = {
0037 [PM_SUSPEND_TO_IDLE] = "freeze",
0038 [PM_SUSPEND_STANDBY] = "standby",
0039 [PM_SUSPEND_MEM] = "mem",
0040 };
0041 const char *pm_states[PM_SUSPEND_MAX];
0042 static const char * const mem_sleep_labels[] = {
0043 [PM_SUSPEND_TO_IDLE] = "s2idle",
0044 [PM_SUSPEND_STANDBY] = "shallow",
0045 [PM_SUSPEND_MEM] = "deep",
0046 };
0047 const char *mem_sleep_states[PM_SUSPEND_MAX];
0048
0049 suspend_state_t mem_sleep_current = PM_SUSPEND_TO_IDLE;
0050 suspend_state_t mem_sleep_default = PM_SUSPEND_MAX;
0051 suspend_state_t pm_suspend_target_state;
0052 EXPORT_SYMBOL_GPL(pm_suspend_target_state);
0053
0054 unsigned int pm_suspend_global_flags;
0055 EXPORT_SYMBOL_GPL(pm_suspend_global_flags);
0056
0057 static const struct platform_suspend_ops *suspend_ops;
0058 static const struct platform_s2idle_ops *s2idle_ops;
0059 static DECLARE_SWAIT_QUEUE_HEAD(s2idle_wait_head);
0060
0061 enum s2idle_states __read_mostly s2idle_state;
0062 static DEFINE_RAW_SPINLOCK(s2idle_lock);
0063
0064
0065
0066
0067
0068
0069
0070 bool pm_suspend_default_s2idle(void)
0071 {
0072 return mem_sleep_current == PM_SUSPEND_TO_IDLE;
0073 }
0074 EXPORT_SYMBOL_GPL(pm_suspend_default_s2idle);
0075
0076 void s2idle_set_ops(const struct platform_s2idle_ops *ops)
0077 {
0078 lock_system_sleep();
0079 s2idle_ops = ops;
0080 unlock_system_sleep();
0081 }
0082
0083 static void s2idle_begin(void)
0084 {
0085 s2idle_state = S2IDLE_STATE_NONE;
0086 }
0087
0088 static void s2idle_enter(void)
0089 {
0090 trace_suspend_resume(TPS("machine_suspend"), PM_SUSPEND_TO_IDLE, true);
0091
0092 raw_spin_lock_irq(&s2idle_lock);
0093 if (pm_wakeup_pending())
0094 goto out;
0095
0096 s2idle_state = S2IDLE_STATE_ENTER;
0097 raw_spin_unlock_irq(&s2idle_lock);
0098
0099 cpus_read_lock();
0100
0101
0102 wake_up_all_idle_cpus();
0103
0104 swait_event_exclusive(s2idle_wait_head,
0105 s2idle_state == S2IDLE_STATE_WAKE);
0106
0107 cpus_read_unlock();
0108
0109 raw_spin_lock_irq(&s2idle_lock);
0110
0111 out:
0112 s2idle_state = S2IDLE_STATE_NONE;
0113 raw_spin_unlock_irq(&s2idle_lock);
0114
0115 trace_suspend_resume(TPS("machine_suspend"), PM_SUSPEND_TO_IDLE, false);
0116 }
0117
0118 static void s2idle_loop(void)
0119 {
0120 pm_pr_dbg("suspend-to-idle\n");
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131 for (;;) {
0132 if (s2idle_ops && s2idle_ops->wake) {
0133 if (s2idle_ops->wake())
0134 break;
0135 } else if (pm_wakeup_pending()) {
0136 break;
0137 }
0138
0139 s2idle_enter();
0140 }
0141
0142 pm_pr_dbg("resume from suspend-to-idle\n");
0143 }
0144
0145 void s2idle_wake(void)
0146 {
0147 unsigned long flags;
0148
0149 raw_spin_lock_irqsave(&s2idle_lock, flags);
0150 if (s2idle_state > S2IDLE_STATE_NONE) {
0151 s2idle_state = S2IDLE_STATE_WAKE;
0152 swake_up_one(&s2idle_wait_head);
0153 }
0154 raw_spin_unlock_irqrestore(&s2idle_lock, flags);
0155 }
0156 EXPORT_SYMBOL_GPL(s2idle_wake);
0157
0158 static bool valid_state(suspend_state_t state)
0159 {
0160
0161
0162
0163
0164
0165
0166 return suspend_ops && suspend_ops->valid && suspend_ops->valid(state) &&
0167 suspend_ops->enter;
0168 }
0169
0170 void __init pm_states_init(void)
0171 {
0172
0173 pm_states[PM_SUSPEND_MEM] = pm_labels[PM_SUSPEND_MEM];
0174 pm_states[PM_SUSPEND_TO_IDLE] = pm_labels[PM_SUSPEND_TO_IDLE];
0175
0176
0177
0178
0179 mem_sleep_states[PM_SUSPEND_TO_IDLE] = mem_sleep_labels[PM_SUSPEND_TO_IDLE];
0180 }
0181
0182 static int __init mem_sleep_default_setup(char *str)
0183 {
0184 suspend_state_t state;
0185
0186 for (state = PM_SUSPEND_TO_IDLE; state <= PM_SUSPEND_MEM; state++)
0187 if (mem_sleep_labels[state] &&
0188 !strcmp(str, mem_sleep_labels[state])) {
0189 mem_sleep_default = state;
0190 break;
0191 }
0192
0193 return 1;
0194 }
0195 __setup("mem_sleep_default=", mem_sleep_default_setup);
0196
0197
0198
0199
0200
0201 void suspend_set_ops(const struct platform_suspend_ops *ops)
0202 {
0203 lock_system_sleep();
0204
0205 suspend_ops = ops;
0206
0207 if (valid_state(PM_SUSPEND_STANDBY)) {
0208 mem_sleep_states[PM_SUSPEND_STANDBY] = mem_sleep_labels[PM_SUSPEND_STANDBY];
0209 pm_states[PM_SUSPEND_STANDBY] = pm_labels[PM_SUSPEND_STANDBY];
0210 if (mem_sleep_default == PM_SUSPEND_STANDBY)
0211 mem_sleep_current = PM_SUSPEND_STANDBY;
0212 }
0213 if (valid_state(PM_SUSPEND_MEM)) {
0214 mem_sleep_states[PM_SUSPEND_MEM] = mem_sleep_labels[PM_SUSPEND_MEM];
0215 if (mem_sleep_default >= PM_SUSPEND_MEM)
0216 mem_sleep_current = PM_SUSPEND_MEM;
0217 }
0218
0219 unlock_system_sleep();
0220 }
0221 EXPORT_SYMBOL_GPL(suspend_set_ops);
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231 int suspend_valid_only_mem(suspend_state_t state)
0232 {
0233 return state == PM_SUSPEND_MEM;
0234 }
0235 EXPORT_SYMBOL_GPL(suspend_valid_only_mem);
0236
0237 static bool sleep_state_supported(suspend_state_t state)
0238 {
0239 return state == PM_SUSPEND_TO_IDLE ||
0240 (valid_state(state) && !cxl_mem_active());
0241 }
0242
0243 static int platform_suspend_prepare(suspend_state_t state)
0244 {
0245 return state != PM_SUSPEND_TO_IDLE && suspend_ops->prepare ?
0246 suspend_ops->prepare() : 0;
0247 }
0248
0249 static int platform_suspend_prepare_late(suspend_state_t state)
0250 {
0251 return state == PM_SUSPEND_TO_IDLE && s2idle_ops && s2idle_ops->prepare ?
0252 s2idle_ops->prepare() : 0;
0253 }
0254
0255 static int platform_suspend_prepare_noirq(suspend_state_t state)
0256 {
0257 if (state == PM_SUSPEND_TO_IDLE)
0258 return s2idle_ops && s2idle_ops->prepare_late ?
0259 s2idle_ops->prepare_late() : 0;
0260
0261 return suspend_ops->prepare_late ? suspend_ops->prepare_late() : 0;
0262 }
0263
0264 static void platform_resume_noirq(suspend_state_t state)
0265 {
0266 if (state == PM_SUSPEND_TO_IDLE) {
0267 if (s2idle_ops && s2idle_ops->restore_early)
0268 s2idle_ops->restore_early();
0269 } else if (suspend_ops->wake) {
0270 suspend_ops->wake();
0271 }
0272 }
0273
0274 static void platform_resume_early(suspend_state_t state)
0275 {
0276 if (state == PM_SUSPEND_TO_IDLE && s2idle_ops && s2idle_ops->restore)
0277 s2idle_ops->restore();
0278 }
0279
0280 static void platform_resume_finish(suspend_state_t state)
0281 {
0282 if (state != PM_SUSPEND_TO_IDLE && suspend_ops->finish)
0283 suspend_ops->finish();
0284 }
0285
0286 static int platform_suspend_begin(suspend_state_t state)
0287 {
0288 if (state == PM_SUSPEND_TO_IDLE && s2idle_ops && s2idle_ops->begin)
0289 return s2idle_ops->begin();
0290 else if (suspend_ops && suspend_ops->begin)
0291 return suspend_ops->begin(state);
0292 else
0293 return 0;
0294 }
0295
0296 static void platform_resume_end(suspend_state_t state)
0297 {
0298 if (state == PM_SUSPEND_TO_IDLE && s2idle_ops && s2idle_ops->end)
0299 s2idle_ops->end();
0300 else if (suspend_ops && suspend_ops->end)
0301 suspend_ops->end();
0302 }
0303
0304 static void platform_recover(suspend_state_t state)
0305 {
0306 if (state != PM_SUSPEND_TO_IDLE && suspend_ops->recover)
0307 suspend_ops->recover();
0308 }
0309
0310 static bool platform_suspend_again(suspend_state_t state)
0311 {
0312 return state != PM_SUSPEND_TO_IDLE && suspend_ops->suspend_again ?
0313 suspend_ops->suspend_again() : false;
0314 }
0315
0316 #ifdef CONFIG_PM_DEBUG
0317 static unsigned int pm_test_delay = 5;
0318 module_param(pm_test_delay, uint, 0644);
0319 MODULE_PARM_DESC(pm_test_delay,
0320 "Number of seconds to wait before resuming from suspend test");
0321 #endif
0322
0323 static int suspend_test(int level)
0324 {
0325 #ifdef CONFIG_PM_DEBUG
0326 if (pm_test_level == level) {
0327 pr_info("suspend debug: Waiting for %d second(s).\n",
0328 pm_test_delay);
0329 mdelay(pm_test_delay * 1000);
0330 return 1;
0331 }
0332 #endif
0333 return 0;
0334 }
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344 static int suspend_prepare(suspend_state_t state)
0345 {
0346 int error;
0347
0348 if (!sleep_state_supported(state))
0349 return -EPERM;
0350
0351 pm_prepare_console();
0352
0353 error = pm_notifier_call_chain_robust(PM_SUSPEND_PREPARE, PM_POST_SUSPEND);
0354 if (error)
0355 goto Restore;
0356
0357 trace_suspend_resume(TPS("freeze_processes"), 0, true);
0358 error = suspend_freeze_processes();
0359 trace_suspend_resume(TPS("freeze_processes"), 0, false);
0360 if (!error)
0361 return 0;
0362
0363 suspend_stats.failed_freeze++;
0364 dpm_save_failed_step(SUSPEND_FREEZE);
0365 pm_notifier_call_chain(PM_POST_SUSPEND);
0366 Restore:
0367 pm_restore_console();
0368 return error;
0369 }
0370
0371
0372 void __weak arch_suspend_disable_irqs(void)
0373 {
0374 local_irq_disable();
0375 }
0376
0377
0378 void __weak arch_suspend_enable_irqs(void)
0379 {
0380 local_irq_enable();
0381 }
0382
0383
0384
0385
0386
0387
0388
0389
0390 static int suspend_enter(suspend_state_t state, bool *wakeup)
0391 {
0392 int error;
0393
0394 error = platform_suspend_prepare(state);
0395 if (error)
0396 goto Platform_finish;
0397
0398 error = dpm_suspend_late(PMSG_SUSPEND);
0399 if (error) {
0400 pr_err("late suspend of devices failed\n");
0401 goto Platform_finish;
0402 }
0403 error = platform_suspend_prepare_late(state);
0404 if (error)
0405 goto Devices_early_resume;
0406
0407 error = dpm_suspend_noirq(PMSG_SUSPEND);
0408 if (error) {
0409 pr_err("noirq suspend of devices failed\n");
0410 goto Platform_early_resume;
0411 }
0412 error = platform_suspend_prepare_noirq(state);
0413 if (error)
0414 goto Platform_wake;
0415
0416 if (suspend_test(TEST_PLATFORM))
0417 goto Platform_wake;
0418
0419 if (state == PM_SUSPEND_TO_IDLE) {
0420 s2idle_loop();
0421 goto Platform_wake;
0422 }
0423
0424 error = pm_sleep_disable_secondary_cpus();
0425 if (error || suspend_test(TEST_CPUS))
0426 goto Enable_cpus;
0427
0428 arch_suspend_disable_irqs();
0429 BUG_ON(!irqs_disabled());
0430
0431 system_state = SYSTEM_SUSPEND;
0432
0433 error = syscore_suspend();
0434 if (!error) {
0435 *wakeup = pm_wakeup_pending();
0436 if (!(suspend_test(TEST_CORE) || *wakeup)) {
0437 trace_suspend_resume(TPS("machine_suspend"),
0438 state, true);
0439 error = suspend_ops->enter(state);
0440 trace_suspend_resume(TPS("machine_suspend"),
0441 state, false);
0442 } else if (*wakeup) {
0443 error = -EBUSY;
0444 }
0445 syscore_resume();
0446 }
0447
0448 system_state = SYSTEM_RUNNING;
0449
0450 arch_suspend_enable_irqs();
0451 BUG_ON(irqs_disabled());
0452
0453 Enable_cpus:
0454 pm_sleep_enable_secondary_cpus();
0455
0456 Platform_wake:
0457 platform_resume_noirq(state);
0458 dpm_resume_noirq(PMSG_RESUME);
0459
0460 Platform_early_resume:
0461 platform_resume_early(state);
0462
0463 Devices_early_resume:
0464 dpm_resume_early(PMSG_RESUME);
0465
0466 Platform_finish:
0467 platform_resume_finish(state);
0468 return error;
0469 }
0470
0471
0472
0473
0474
0475 int suspend_devices_and_enter(suspend_state_t state)
0476 {
0477 int error;
0478 bool wakeup = false;
0479
0480 if (!sleep_state_supported(state))
0481 return -ENOSYS;
0482
0483 pm_suspend_target_state = state;
0484
0485 if (state == PM_SUSPEND_TO_IDLE)
0486 pm_set_suspend_no_platform();
0487
0488 error = platform_suspend_begin(state);
0489 if (error)
0490 goto Close;
0491
0492 suspend_console();
0493 suspend_test_start();
0494 error = dpm_suspend_start(PMSG_SUSPEND);
0495 if (error) {
0496 pr_err("Some devices failed to suspend, or early wake event detected\n");
0497 goto Recover_platform;
0498 }
0499 suspend_test_finish("suspend devices");
0500 if (suspend_test(TEST_DEVICES))
0501 goto Recover_platform;
0502
0503 do {
0504 error = suspend_enter(state, &wakeup);
0505 } while (!error && !wakeup && platform_suspend_again(state));
0506
0507 Resume_devices:
0508 suspend_test_start();
0509 dpm_resume_end(PMSG_RESUME);
0510 suspend_test_finish("resume devices");
0511 trace_suspend_resume(TPS("resume_console"), state, true);
0512 resume_console();
0513 trace_suspend_resume(TPS("resume_console"), state, false);
0514
0515 Close:
0516 platform_resume_end(state);
0517 pm_suspend_target_state = PM_SUSPEND_ON;
0518 return error;
0519
0520 Recover_platform:
0521 platform_recover(state);
0522 goto Resume_devices;
0523 }
0524
0525
0526
0527
0528
0529
0530
0531 static void suspend_finish(void)
0532 {
0533 suspend_thaw_processes();
0534 pm_notifier_call_chain(PM_POST_SUSPEND);
0535 pm_restore_console();
0536 }
0537
0538
0539
0540
0541
0542
0543
0544
0545
0546 static int enter_state(suspend_state_t state)
0547 {
0548 int error;
0549
0550 trace_suspend_resume(TPS("suspend_enter"), state, true);
0551 if (state == PM_SUSPEND_TO_IDLE) {
0552 #ifdef CONFIG_PM_DEBUG
0553 if (pm_test_level != TEST_NONE && pm_test_level <= TEST_CPUS) {
0554 pr_warn("Unsupported test mode for suspend to idle, please choose none/freezer/devices/platform.\n");
0555 return -EAGAIN;
0556 }
0557 #endif
0558 } else if (!valid_state(state)) {
0559 return -EINVAL;
0560 }
0561 if (!mutex_trylock(&system_transition_mutex))
0562 return -EBUSY;
0563
0564 if (state == PM_SUSPEND_TO_IDLE)
0565 s2idle_begin();
0566
0567 if (sync_on_suspend_enabled) {
0568 trace_suspend_resume(TPS("sync_filesystems"), 0, true);
0569 ksys_sync_helper();
0570 trace_suspend_resume(TPS("sync_filesystems"), 0, false);
0571 }
0572
0573 pm_pr_dbg("Preparing system for sleep (%s)\n", mem_sleep_labels[state]);
0574 pm_suspend_clear_flags();
0575 error = suspend_prepare(state);
0576 if (error)
0577 goto Unlock;
0578
0579 if (suspend_test(TEST_FREEZER))
0580 goto Finish;
0581
0582 trace_suspend_resume(TPS("suspend_enter"), state, false);
0583 pm_pr_dbg("Suspending system (%s)\n", mem_sleep_labels[state]);
0584 pm_restrict_gfp_mask();
0585 error = suspend_devices_and_enter(state);
0586 pm_restore_gfp_mask();
0587
0588 Finish:
0589 events_check_enabled = false;
0590 pm_pr_dbg("Finishing wakeup.\n");
0591 suspend_finish();
0592 Unlock:
0593 mutex_unlock(&system_transition_mutex);
0594 return error;
0595 }
0596
0597
0598
0599
0600
0601
0602
0603
0604 int pm_suspend(suspend_state_t state)
0605 {
0606 int error;
0607
0608 if (state <= PM_SUSPEND_ON || state >= PM_SUSPEND_MAX)
0609 return -EINVAL;
0610
0611 pr_info("suspend entry (%s)\n", mem_sleep_labels[state]);
0612 error = enter_state(state);
0613 if (error) {
0614 suspend_stats.fail++;
0615 dpm_save_failed_errno(error);
0616 } else {
0617 suspend_stats.success++;
0618 }
0619 pr_info("suspend exit\n");
0620 return error;
0621 }
0622 EXPORT_SYMBOL(pm_suspend);