root/kernel/power/main.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. lock_system_sleep
  2. unlock_system_sleep
  3. ksys_sync_helper
  4. register_pm_notifier
  5. unregister_pm_notifier
  6. __pm_notifier_call_chain
  7. pm_notifier_call_chain
  8. pm_async_show
  9. pm_async_store
  10. mem_sleep_show
  11. decode_suspend_state
  12. mem_sleep_store
  13. pm_test_show
  14. pm_test_store
  15. suspend_step_name
  16. last_failed_dev_show
  17. last_failed_errno_show
  18. last_failed_step_show
  19. suspend_stats_show
  20. pm_debugfs_init
  21. pm_print_times_show
  22. pm_print_times_store
  23. pm_print_times_init
  24. pm_wakeup_irq_show
  25. pm_debug_messages_show
  26. pm_debug_messages_store
  27. __pm_pr_dbg
  28. pm_print_times_init
  29. state_show
  30. decode_state
  31. state_store
  32. wakeup_count_show
  33. wakeup_count_store
  34. autosleep_show
  35. autosleep_store
  36. wake_lock_show
  37. wake_lock_store
  38. wake_unlock_show
  39. wake_unlock_store
  40. pm_trace_show
  41. pm_trace_store
  42. pm_trace_dev_match_show
  43. pm_freeze_timeout_show
  44. pm_freeze_timeout_store
  45. pm_start_workqueue
  46. pm_init

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * kernel/power/main.c - PM subsystem core functionality.
   4  *
   5  * Copyright (c) 2003 Patrick Mochel
   6  * Copyright (c) 2003 Open Source Development Lab
   7  */
   8 
   9 #include <linux/export.h>
  10 #include <linux/kobject.h>
  11 #include <linux/string.h>
  12 #include <linux/pm-trace.h>
  13 #include <linux/workqueue.h>
  14 #include <linux/debugfs.h>
  15 #include <linux/seq_file.h>
  16 #include <linux/suspend.h>
  17 #include <linux/syscalls.h>
  18 #include <linux/pm_runtime.h>
  19 
  20 #include "power.h"
  21 
  22 #ifdef CONFIG_PM_SLEEP
  23 
  24 void lock_system_sleep(void)
  25 {
  26         current->flags |= PF_FREEZER_SKIP;
  27         mutex_lock(&system_transition_mutex);
  28 }
  29 EXPORT_SYMBOL_GPL(lock_system_sleep);
  30 
  31 void unlock_system_sleep(void)
  32 {
  33         /*
  34          * Don't use freezer_count() because we don't want the call to
  35          * try_to_freeze() here.
  36          *
  37          * Reason:
  38          * Fundamentally, we just don't need it, because freezing condition
  39          * doesn't come into effect until we release the
  40          * system_transition_mutex lock, since the freezer always works with
  41          * system_transition_mutex held.
  42          *
  43          * More importantly, in the case of hibernation,
  44          * unlock_system_sleep() gets called in snapshot_read() and
  45          * snapshot_write() when the freezing condition is still in effect.
  46          * Which means, if we use try_to_freeze() here, it would make them
  47          * enter the refrigerator, thus causing hibernation to lockup.
  48          */
  49         current->flags &= ~PF_FREEZER_SKIP;
  50         mutex_unlock(&system_transition_mutex);
  51 }
  52 EXPORT_SYMBOL_GPL(unlock_system_sleep);
  53 
  54 void ksys_sync_helper(void)
  55 {
  56         ktime_t start;
  57         long elapsed_msecs;
  58 
  59         start = ktime_get();
  60         ksys_sync();
  61         elapsed_msecs = ktime_to_ms(ktime_sub(ktime_get(), start));
  62         pr_info("Filesystems sync: %ld.%03ld seconds\n",
  63                 elapsed_msecs / MSEC_PER_SEC, elapsed_msecs % MSEC_PER_SEC);
  64 }
  65 EXPORT_SYMBOL_GPL(ksys_sync_helper);
  66 
  67 /* Routines for PM-transition notifications */
  68 
  69 static BLOCKING_NOTIFIER_HEAD(pm_chain_head);
  70 
  71 int register_pm_notifier(struct notifier_block *nb)
  72 {
  73         return blocking_notifier_chain_register(&pm_chain_head, nb);
  74 }
  75 EXPORT_SYMBOL_GPL(register_pm_notifier);
  76 
  77 int unregister_pm_notifier(struct notifier_block *nb)
  78 {
  79         return blocking_notifier_chain_unregister(&pm_chain_head, nb);
  80 }
  81 EXPORT_SYMBOL_GPL(unregister_pm_notifier);
  82 
  83 int __pm_notifier_call_chain(unsigned long val, int nr_to_call, int *nr_calls)
  84 {
  85         int ret;
  86 
  87         ret = __blocking_notifier_call_chain(&pm_chain_head, val, NULL,
  88                                                 nr_to_call, nr_calls);
  89 
  90         return notifier_to_errno(ret);
  91 }
  92 int pm_notifier_call_chain(unsigned long val)
  93 {
  94         return __pm_notifier_call_chain(val, -1, NULL);
  95 }
  96 
  97 /* If set, devices may be suspended and resumed asynchronously. */
  98 int pm_async_enabled = 1;
  99 
 100 static ssize_t pm_async_show(struct kobject *kobj, struct kobj_attribute *attr,
 101                              char *buf)
 102 {
 103         return sprintf(buf, "%d\n", pm_async_enabled);
 104 }
 105 
 106 static ssize_t pm_async_store(struct kobject *kobj, struct kobj_attribute *attr,
 107                               const char *buf, size_t n)
 108 {
 109         unsigned long val;
 110 
 111         if (kstrtoul(buf, 10, &val))
 112                 return -EINVAL;
 113 
 114         if (val > 1)
 115                 return -EINVAL;
 116 
 117         pm_async_enabled = val;
 118         return n;
 119 }
 120 
 121 power_attr(pm_async);
 122 
 123 #ifdef CONFIG_SUSPEND
 124 static ssize_t mem_sleep_show(struct kobject *kobj, struct kobj_attribute *attr,
 125                               char *buf)
 126 {
 127         char *s = buf;
 128         suspend_state_t i;
 129 
 130         for (i = PM_SUSPEND_MIN; i < PM_SUSPEND_MAX; i++)
 131                 if (mem_sleep_states[i]) {
 132                         const char *label = mem_sleep_states[i];
 133 
 134                         if (mem_sleep_current == i)
 135                                 s += sprintf(s, "[%s] ", label);
 136                         else
 137                                 s += sprintf(s, "%s ", label);
 138                 }
 139 
 140         /* Convert the last space to a newline if needed. */
 141         if (s != buf)
 142                 *(s-1) = '\n';
 143 
 144         return (s - buf);
 145 }
 146 
 147 static suspend_state_t decode_suspend_state(const char *buf, size_t n)
 148 {
 149         suspend_state_t state;
 150         char *p;
 151         int len;
 152 
 153         p = memchr(buf, '\n', n);
 154         len = p ? p - buf : n;
 155 
 156         for (state = PM_SUSPEND_MIN; state < PM_SUSPEND_MAX; state++) {
 157                 const char *label = mem_sleep_states[state];
 158 
 159                 if (label && len == strlen(label) && !strncmp(buf, label, len))
 160                         return state;
 161         }
 162 
 163         return PM_SUSPEND_ON;
 164 }
 165 
 166 static ssize_t mem_sleep_store(struct kobject *kobj, struct kobj_attribute *attr,
 167                                const char *buf, size_t n)
 168 {
 169         suspend_state_t state;
 170         int error;
 171 
 172         error = pm_autosleep_lock();
 173         if (error)
 174                 return error;
 175 
 176         if (pm_autosleep_state() > PM_SUSPEND_ON) {
 177                 error = -EBUSY;
 178                 goto out;
 179         }
 180 
 181         state = decode_suspend_state(buf, n);
 182         if (state < PM_SUSPEND_MAX && state > PM_SUSPEND_ON)
 183                 mem_sleep_current = state;
 184         else
 185                 error = -EINVAL;
 186 
 187  out:
 188         pm_autosleep_unlock();
 189         return error ? error : n;
 190 }
 191 
 192 power_attr(mem_sleep);
 193 #endif /* CONFIG_SUSPEND */
 194 
 195 #ifdef CONFIG_PM_SLEEP_DEBUG
 196 int pm_test_level = TEST_NONE;
 197 
 198 static const char * const pm_tests[__TEST_AFTER_LAST] = {
 199         [TEST_NONE] = "none",
 200         [TEST_CORE] = "core",
 201         [TEST_CPUS] = "processors",
 202         [TEST_PLATFORM] = "platform",
 203         [TEST_DEVICES] = "devices",
 204         [TEST_FREEZER] = "freezer",
 205 };
 206 
 207 static ssize_t pm_test_show(struct kobject *kobj, struct kobj_attribute *attr,
 208                                 char *buf)
 209 {
 210         char *s = buf;
 211         int level;
 212 
 213         for (level = TEST_FIRST; level <= TEST_MAX; level++)
 214                 if (pm_tests[level]) {
 215                         if (level == pm_test_level)
 216                                 s += sprintf(s, "[%s] ", pm_tests[level]);
 217                         else
 218                                 s += sprintf(s, "%s ", pm_tests[level]);
 219                 }
 220 
 221         if (s != buf)
 222                 /* convert the last space to a newline */
 223                 *(s-1) = '\n';
 224 
 225         return (s - buf);
 226 }
 227 
 228 static ssize_t pm_test_store(struct kobject *kobj, struct kobj_attribute *attr,
 229                                 const char *buf, size_t n)
 230 {
 231         const char * const *s;
 232         int level;
 233         char *p;
 234         int len;
 235         int error = -EINVAL;
 236 
 237         p = memchr(buf, '\n', n);
 238         len = p ? p - buf : n;
 239 
 240         lock_system_sleep();
 241 
 242         level = TEST_FIRST;
 243         for (s = &pm_tests[level]; level <= TEST_MAX; s++, level++)
 244                 if (*s && len == strlen(*s) && !strncmp(buf, *s, len)) {
 245                         pm_test_level = level;
 246                         error = 0;
 247                         break;
 248                 }
 249 
 250         unlock_system_sleep();
 251 
 252         return error ? error : n;
 253 }
 254 
 255 power_attr(pm_test);
 256 #endif /* CONFIG_PM_SLEEP_DEBUG */
 257 
 258 static char *suspend_step_name(enum suspend_stat_step step)
 259 {
 260         switch (step) {
 261         case SUSPEND_FREEZE:
 262                 return "freeze";
 263         case SUSPEND_PREPARE:
 264                 return "prepare";
 265         case SUSPEND_SUSPEND:
 266                 return "suspend";
 267         case SUSPEND_SUSPEND_NOIRQ:
 268                 return "suspend_noirq";
 269         case SUSPEND_RESUME_NOIRQ:
 270                 return "resume_noirq";
 271         case SUSPEND_RESUME:
 272                 return "resume";
 273         default:
 274                 return "";
 275         }
 276 }
 277 
 278 #define suspend_attr(_name)                                     \
 279 static ssize_t _name##_show(struct kobject *kobj,               \
 280                 struct kobj_attribute *attr, char *buf)         \
 281 {                                                               \
 282         return sprintf(buf, "%d\n", suspend_stats._name);       \
 283 }                                                               \
 284 static struct kobj_attribute _name = __ATTR_RO(_name)
 285 
 286 suspend_attr(success);
 287 suspend_attr(fail);
 288 suspend_attr(failed_freeze);
 289 suspend_attr(failed_prepare);
 290 suspend_attr(failed_suspend);
 291 suspend_attr(failed_suspend_late);
 292 suspend_attr(failed_suspend_noirq);
 293 suspend_attr(failed_resume);
 294 suspend_attr(failed_resume_early);
 295 suspend_attr(failed_resume_noirq);
 296 
 297 static ssize_t last_failed_dev_show(struct kobject *kobj,
 298                 struct kobj_attribute *attr, char *buf)
 299 {
 300         int index;
 301         char *last_failed_dev = NULL;
 302 
 303         index = suspend_stats.last_failed_dev + REC_FAILED_NUM - 1;
 304         index %= REC_FAILED_NUM;
 305         last_failed_dev = suspend_stats.failed_devs[index];
 306 
 307         return sprintf(buf, "%s\n", last_failed_dev);
 308 }
 309 static struct kobj_attribute last_failed_dev = __ATTR_RO(last_failed_dev);
 310 
 311 static ssize_t last_failed_errno_show(struct kobject *kobj,
 312                 struct kobj_attribute *attr, char *buf)
 313 {
 314         int index;
 315         int last_failed_errno;
 316 
 317         index = suspend_stats.last_failed_errno + REC_FAILED_NUM - 1;
 318         index %= REC_FAILED_NUM;
 319         last_failed_errno = suspend_stats.errno[index];
 320 
 321         return sprintf(buf, "%d\n", last_failed_errno);
 322 }
 323 static struct kobj_attribute last_failed_errno = __ATTR_RO(last_failed_errno);
 324 
 325 static ssize_t last_failed_step_show(struct kobject *kobj,
 326                 struct kobj_attribute *attr, char *buf)
 327 {
 328         int index;
 329         enum suspend_stat_step step;
 330         char *last_failed_step = NULL;
 331 
 332         index = suspend_stats.last_failed_step + REC_FAILED_NUM - 1;
 333         index %= REC_FAILED_NUM;
 334         step = suspend_stats.failed_steps[index];
 335         last_failed_step = suspend_step_name(step);
 336 
 337         return sprintf(buf, "%s\n", last_failed_step);
 338 }
 339 static struct kobj_attribute last_failed_step = __ATTR_RO(last_failed_step);
 340 
 341 static struct attribute *suspend_attrs[] = {
 342         &success.attr,
 343         &fail.attr,
 344         &failed_freeze.attr,
 345         &failed_prepare.attr,
 346         &failed_suspend.attr,
 347         &failed_suspend_late.attr,
 348         &failed_suspend_noirq.attr,
 349         &failed_resume.attr,
 350         &failed_resume_early.attr,
 351         &failed_resume_noirq.attr,
 352         &last_failed_dev.attr,
 353         &last_failed_errno.attr,
 354         &last_failed_step.attr,
 355         NULL,
 356 };
 357 
 358 static struct attribute_group suspend_attr_group = {
 359         .name = "suspend_stats",
 360         .attrs = suspend_attrs,
 361 };
 362 
 363 #ifdef CONFIG_DEBUG_FS
 364 static int suspend_stats_show(struct seq_file *s, void *unused)
 365 {
 366         int i, index, last_dev, last_errno, last_step;
 367 
 368         last_dev = suspend_stats.last_failed_dev + REC_FAILED_NUM - 1;
 369         last_dev %= REC_FAILED_NUM;
 370         last_errno = suspend_stats.last_failed_errno + REC_FAILED_NUM - 1;
 371         last_errno %= REC_FAILED_NUM;
 372         last_step = suspend_stats.last_failed_step + REC_FAILED_NUM - 1;
 373         last_step %= REC_FAILED_NUM;
 374         seq_printf(s, "%s: %d\n%s: %d\n%s: %d\n%s: %d\n%s: %d\n"
 375                         "%s: %d\n%s: %d\n%s: %d\n%s: %d\n%s: %d\n",
 376                         "success", suspend_stats.success,
 377                         "fail", suspend_stats.fail,
 378                         "failed_freeze", suspend_stats.failed_freeze,
 379                         "failed_prepare", suspend_stats.failed_prepare,
 380                         "failed_suspend", suspend_stats.failed_suspend,
 381                         "failed_suspend_late",
 382                                 suspend_stats.failed_suspend_late,
 383                         "failed_suspend_noirq",
 384                                 suspend_stats.failed_suspend_noirq,
 385                         "failed_resume", suspend_stats.failed_resume,
 386                         "failed_resume_early",
 387                                 suspend_stats.failed_resume_early,
 388                         "failed_resume_noirq",
 389                                 suspend_stats.failed_resume_noirq);
 390         seq_printf(s,   "failures:\n  last_failed_dev:\t%-s\n",
 391                         suspend_stats.failed_devs[last_dev]);
 392         for (i = 1; i < REC_FAILED_NUM; i++) {
 393                 index = last_dev + REC_FAILED_NUM - i;
 394                 index %= REC_FAILED_NUM;
 395                 seq_printf(s, "\t\t\t%-s\n",
 396                         suspend_stats.failed_devs[index]);
 397         }
 398         seq_printf(s,   "  last_failed_errno:\t%-d\n",
 399                         suspend_stats.errno[last_errno]);
 400         for (i = 1; i < REC_FAILED_NUM; i++) {
 401                 index = last_errno + REC_FAILED_NUM - i;
 402                 index %= REC_FAILED_NUM;
 403                 seq_printf(s, "\t\t\t%-d\n",
 404                         suspend_stats.errno[index]);
 405         }
 406         seq_printf(s,   "  last_failed_step:\t%-s\n",
 407                         suspend_step_name(
 408                                 suspend_stats.failed_steps[last_step]));
 409         for (i = 1; i < REC_FAILED_NUM; i++) {
 410                 index = last_step + REC_FAILED_NUM - i;
 411                 index %= REC_FAILED_NUM;
 412                 seq_printf(s, "\t\t\t%-s\n",
 413                         suspend_step_name(
 414                                 suspend_stats.failed_steps[index]));
 415         }
 416 
 417         return 0;
 418 }
 419 DEFINE_SHOW_ATTRIBUTE(suspend_stats);
 420 
 421 static int __init pm_debugfs_init(void)
 422 {
 423         debugfs_create_file("suspend_stats", S_IFREG | S_IRUGO,
 424                         NULL, NULL, &suspend_stats_fops);
 425         return 0;
 426 }
 427 
 428 late_initcall(pm_debugfs_init);
 429 #endif /* CONFIG_DEBUG_FS */
 430 
 431 #endif /* CONFIG_PM_SLEEP */
 432 
 433 #ifdef CONFIG_PM_SLEEP_DEBUG
 434 /*
 435  * pm_print_times: print time taken by devices to suspend and resume.
 436  *
 437  * show() returns whether printing of suspend and resume times is enabled.
 438  * store() accepts 0 or 1.  0 disables printing and 1 enables it.
 439  */
 440 bool pm_print_times_enabled;
 441 
 442 static ssize_t pm_print_times_show(struct kobject *kobj,
 443                                    struct kobj_attribute *attr, char *buf)
 444 {
 445         return sprintf(buf, "%d\n", pm_print_times_enabled);
 446 }
 447 
 448 static ssize_t pm_print_times_store(struct kobject *kobj,
 449                                     struct kobj_attribute *attr,
 450                                     const char *buf, size_t n)
 451 {
 452         unsigned long val;
 453 
 454         if (kstrtoul(buf, 10, &val))
 455                 return -EINVAL;
 456 
 457         if (val > 1)
 458                 return -EINVAL;
 459 
 460         pm_print_times_enabled = !!val;
 461         return n;
 462 }
 463 
 464 power_attr(pm_print_times);
 465 
 466 static inline void pm_print_times_init(void)
 467 {
 468         pm_print_times_enabled = !!initcall_debug;
 469 }
 470 
 471 static ssize_t pm_wakeup_irq_show(struct kobject *kobj,
 472                                         struct kobj_attribute *attr,
 473                                         char *buf)
 474 {
 475         return pm_wakeup_irq ? sprintf(buf, "%u\n", pm_wakeup_irq) : -ENODATA;
 476 }
 477 
 478 power_attr_ro(pm_wakeup_irq);
 479 
 480 bool pm_debug_messages_on __read_mostly;
 481 
 482 static ssize_t pm_debug_messages_show(struct kobject *kobj,
 483                                       struct kobj_attribute *attr, char *buf)
 484 {
 485         return sprintf(buf, "%d\n", pm_debug_messages_on);
 486 }
 487 
 488 static ssize_t pm_debug_messages_store(struct kobject *kobj,
 489                                        struct kobj_attribute *attr,
 490                                        const char *buf, size_t n)
 491 {
 492         unsigned long val;
 493 
 494         if (kstrtoul(buf, 10, &val))
 495                 return -EINVAL;
 496 
 497         if (val > 1)
 498                 return -EINVAL;
 499 
 500         pm_debug_messages_on = !!val;
 501         return n;
 502 }
 503 
 504 power_attr(pm_debug_messages);
 505 
 506 /**
 507  * __pm_pr_dbg - Print a suspend debug message to the kernel log.
 508  * @defer: Whether or not to use printk_deferred() to print the message.
 509  * @fmt: Message format.
 510  *
 511  * The message will be emitted if enabled through the pm_debug_messages
 512  * sysfs attribute.
 513  */
 514 void __pm_pr_dbg(bool defer, const char *fmt, ...)
 515 {
 516         struct va_format vaf;
 517         va_list args;
 518 
 519         if (!pm_debug_messages_on)
 520                 return;
 521 
 522         va_start(args, fmt);
 523 
 524         vaf.fmt = fmt;
 525         vaf.va = &args;
 526 
 527         if (defer)
 528                 printk_deferred(KERN_DEBUG "PM: %pV", &vaf);
 529         else
 530                 printk(KERN_DEBUG "PM: %pV", &vaf);
 531 
 532         va_end(args);
 533 }
 534 
 535 #else /* !CONFIG_PM_SLEEP_DEBUG */
 536 static inline void pm_print_times_init(void) {}
 537 #endif /* CONFIG_PM_SLEEP_DEBUG */
 538 
 539 struct kobject *power_kobj;
 540 
 541 /**
 542  * state - control system sleep states.
 543  *
 544  * show() returns available sleep state labels, which may be "mem", "standby",
 545  * "freeze" and "disk" (hibernation).
 546  * See Documentation/admin-guide/pm/sleep-states.rst for a description of
 547  * what they mean.
 548  *
 549  * store() accepts one of those strings, translates it into the proper
 550  * enumerated value, and initiates a suspend transition.
 551  */
 552 static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr,
 553                           char *buf)
 554 {
 555         char *s = buf;
 556 #ifdef CONFIG_SUSPEND
 557         suspend_state_t i;
 558 
 559         for (i = PM_SUSPEND_MIN; i < PM_SUSPEND_MAX; i++)
 560                 if (pm_states[i])
 561                         s += sprintf(s,"%s ", pm_states[i]);
 562 
 563 #endif
 564         if (hibernation_available())
 565                 s += sprintf(s, "disk ");
 566         if (s != buf)
 567                 /* convert the last space to a newline */
 568                 *(s-1) = '\n';
 569         return (s - buf);
 570 }
 571 
 572 static suspend_state_t decode_state(const char *buf, size_t n)
 573 {
 574 #ifdef CONFIG_SUSPEND
 575         suspend_state_t state;
 576 #endif
 577         char *p;
 578         int len;
 579 
 580         p = memchr(buf, '\n', n);
 581         len = p ? p - buf : n;
 582 
 583         /* Check hibernation first. */
 584         if (len == 4 && str_has_prefix(buf, "disk"))
 585                 return PM_SUSPEND_MAX;
 586 
 587 #ifdef CONFIG_SUSPEND
 588         for (state = PM_SUSPEND_MIN; state < PM_SUSPEND_MAX; state++) {
 589                 const char *label = pm_states[state];
 590 
 591                 if (label && len == strlen(label) && !strncmp(buf, label, len))
 592                         return state;
 593         }
 594 #endif
 595 
 596         return PM_SUSPEND_ON;
 597 }
 598 
 599 static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
 600                            const char *buf, size_t n)
 601 {
 602         suspend_state_t state;
 603         int error;
 604 
 605         error = pm_autosleep_lock();
 606         if (error)
 607                 return error;
 608 
 609         if (pm_autosleep_state() > PM_SUSPEND_ON) {
 610                 error = -EBUSY;
 611                 goto out;
 612         }
 613 
 614         state = decode_state(buf, n);
 615         if (state < PM_SUSPEND_MAX) {
 616                 if (state == PM_SUSPEND_MEM)
 617                         state = mem_sleep_current;
 618 
 619                 error = pm_suspend(state);
 620         } else if (state == PM_SUSPEND_MAX) {
 621                 error = hibernate();
 622         } else {
 623                 error = -EINVAL;
 624         }
 625 
 626  out:
 627         pm_autosleep_unlock();
 628         return error ? error : n;
 629 }
 630 
 631 power_attr(state);
 632 
 633 #ifdef CONFIG_PM_SLEEP
 634 /*
 635  * The 'wakeup_count' attribute, along with the functions defined in
 636  * drivers/base/power/wakeup.c, provides a means by which wakeup events can be
 637  * handled in a non-racy way.
 638  *
 639  * If a wakeup event occurs when the system is in a sleep state, it simply is
 640  * woken up.  In turn, if an event that would wake the system up from a sleep
 641  * state occurs when it is undergoing a transition to that sleep state, the
 642  * transition should be aborted.  Moreover, if such an event occurs when the
 643  * system is in the working state, an attempt to start a transition to the
 644  * given sleep state should fail during certain period after the detection of
 645  * the event.  Using the 'state' attribute alone is not sufficient to satisfy
 646  * these requirements, because a wakeup event may occur exactly when 'state'
 647  * is being written to and may be delivered to user space right before it is
 648  * frozen, so the event will remain only partially processed until the system is
 649  * woken up by another event.  In particular, it won't cause the transition to
 650  * a sleep state to be aborted.
 651  *
 652  * This difficulty may be overcome if user space uses 'wakeup_count' before
 653  * writing to 'state'.  It first should read from 'wakeup_count' and store
 654  * the read value.  Then, after carrying out its own preparations for the system
 655  * transition to a sleep state, it should write the stored value to
 656  * 'wakeup_count'.  If that fails, at least one wakeup event has occurred since
 657  * 'wakeup_count' was read and 'state' should not be written to.  Otherwise, it
 658  * is allowed to write to 'state', but the transition will be aborted if there
 659  * are any wakeup events detected after 'wakeup_count' was written to.
 660  */
 661 
 662 static ssize_t wakeup_count_show(struct kobject *kobj,
 663                                 struct kobj_attribute *attr,
 664                                 char *buf)
 665 {
 666         unsigned int val;
 667 
 668         return pm_get_wakeup_count(&val, true) ?
 669                 sprintf(buf, "%u\n", val) : -EINTR;
 670 }
 671 
 672 static ssize_t wakeup_count_store(struct kobject *kobj,
 673                                 struct kobj_attribute *attr,
 674                                 const char *buf, size_t n)
 675 {
 676         unsigned int val;
 677         int error;
 678 
 679         error = pm_autosleep_lock();
 680         if (error)
 681                 return error;
 682 
 683         if (pm_autosleep_state() > PM_SUSPEND_ON) {
 684                 error = -EBUSY;
 685                 goto out;
 686         }
 687 
 688         error = -EINVAL;
 689         if (sscanf(buf, "%u", &val) == 1) {
 690                 if (pm_save_wakeup_count(val))
 691                         error = n;
 692                 else
 693                         pm_print_active_wakeup_sources();
 694         }
 695 
 696  out:
 697         pm_autosleep_unlock();
 698         return error;
 699 }
 700 
 701 power_attr(wakeup_count);
 702 
 703 #ifdef CONFIG_PM_AUTOSLEEP
 704 static ssize_t autosleep_show(struct kobject *kobj,
 705                               struct kobj_attribute *attr,
 706                               char *buf)
 707 {
 708         suspend_state_t state = pm_autosleep_state();
 709 
 710         if (state == PM_SUSPEND_ON)
 711                 return sprintf(buf, "off\n");
 712 
 713 #ifdef CONFIG_SUSPEND
 714         if (state < PM_SUSPEND_MAX)
 715                 return sprintf(buf, "%s\n", pm_states[state] ?
 716                                         pm_states[state] : "error");
 717 #endif
 718 #ifdef CONFIG_HIBERNATION
 719         return sprintf(buf, "disk\n");
 720 #else
 721         return sprintf(buf, "error");
 722 #endif
 723 }
 724 
 725 static ssize_t autosleep_store(struct kobject *kobj,
 726                                struct kobj_attribute *attr,
 727                                const char *buf, size_t n)
 728 {
 729         suspend_state_t state = decode_state(buf, n);
 730         int error;
 731 
 732         if (state == PM_SUSPEND_ON
 733             && strcmp(buf, "off") && strcmp(buf, "off\n"))
 734                 return -EINVAL;
 735 
 736         if (state == PM_SUSPEND_MEM)
 737                 state = mem_sleep_current;
 738 
 739         error = pm_autosleep_set_state(state);
 740         return error ? error : n;
 741 }
 742 
 743 power_attr(autosleep);
 744 #endif /* CONFIG_PM_AUTOSLEEP */
 745 
 746 #ifdef CONFIG_PM_WAKELOCKS
 747 static ssize_t wake_lock_show(struct kobject *kobj,
 748                               struct kobj_attribute *attr,
 749                               char *buf)
 750 {
 751         return pm_show_wakelocks(buf, true);
 752 }
 753 
 754 static ssize_t wake_lock_store(struct kobject *kobj,
 755                                struct kobj_attribute *attr,
 756                                const char *buf, size_t n)
 757 {
 758         int error = pm_wake_lock(buf);
 759         return error ? error : n;
 760 }
 761 
 762 power_attr(wake_lock);
 763 
 764 static ssize_t wake_unlock_show(struct kobject *kobj,
 765                                 struct kobj_attribute *attr,
 766                                 char *buf)
 767 {
 768         return pm_show_wakelocks(buf, false);
 769 }
 770 
 771 static ssize_t wake_unlock_store(struct kobject *kobj,
 772                                  struct kobj_attribute *attr,
 773                                  const char *buf, size_t n)
 774 {
 775         int error = pm_wake_unlock(buf);
 776         return error ? error : n;
 777 }
 778 
 779 power_attr(wake_unlock);
 780 
 781 #endif /* CONFIG_PM_WAKELOCKS */
 782 #endif /* CONFIG_PM_SLEEP */
 783 
 784 #ifdef CONFIG_PM_TRACE
 785 int pm_trace_enabled;
 786 
 787 static ssize_t pm_trace_show(struct kobject *kobj, struct kobj_attribute *attr,
 788                              char *buf)
 789 {
 790         return sprintf(buf, "%d\n", pm_trace_enabled);
 791 }
 792 
 793 static ssize_t
 794 pm_trace_store(struct kobject *kobj, struct kobj_attribute *attr,
 795                const char *buf, size_t n)
 796 {
 797         int val;
 798 
 799         if (sscanf(buf, "%d", &val) == 1) {
 800                 pm_trace_enabled = !!val;
 801                 if (pm_trace_enabled) {
 802                         pr_warn("PM: Enabling pm_trace changes system date and time during resume.\n"
 803                                 "PM: Correct system time has to be restored manually after resume.\n");
 804                 }
 805                 return n;
 806         }
 807         return -EINVAL;
 808 }
 809 
 810 power_attr(pm_trace);
 811 
 812 static ssize_t pm_trace_dev_match_show(struct kobject *kobj,
 813                                        struct kobj_attribute *attr,
 814                                        char *buf)
 815 {
 816         return show_trace_dev_match(buf, PAGE_SIZE);
 817 }
 818 
 819 power_attr_ro(pm_trace_dev_match);
 820 
 821 #endif /* CONFIG_PM_TRACE */
 822 
 823 #ifdef CONFIG_FREEZER
 824 static ssize_t pm_freeze_timeout_show(struct kobject *kobj,
 825                                       struct kobj_attribute *attr, char *buf)
 826 {
 827         return sprintf(buf, "%u\n", freeze_timeout_msecs);
 828 }
 829 
 830 static ssize_t pm_freeze_timeout_store(struct kobject *kobj,
 831                                        struct kobj_attribute *attr,
 832                                        const char *buf, size_t n)
 833 {
 834         unsigned long val;
 835 
 836         if (kstrtoul(buf, 10, &val))
 837                 return -EINVAL;
 838 
 839         freeze_timeout_msecs = val;
 840         return n;
 841 }
 842 
 843 power_attr(pm_freeze_timeout);
 844 
 845 #endif  /* CONFIG_FREEZER*/
 846 
 847 static struct attribute * g[] = {
 848         &state_attr.attr,
 849 #ifdef CONFIG_PM_TRACE
 850         &pm_trace_attr.attr,
 851         &pm_trace_dev_match_attr.attr,
 852 #endif
 853 #ifdef CONFIG_PM_SLEEP
 854         &pm_async_attr.attr,
 855         &wakeup_count_attr.attr,
 856 #ifdef CONFIG_SUSPEND
 857         &mem_sleep_attr.attr,
 858 #endif
 859 #ifdef CONFIG_PM_AUTOSLEEP
 860         &autosleep_attr.attr,
 861 #endif
 862 #ifdef CONFIG_PM_WAKELOCKS
 863         &wake_lock_attr.attr,
 864         &wake_unlock_attr.attr,
 865 #endif
 866 #ifdef CONFIG_PM_SLEEP_DEBUG
 867         &pm_test_attr.attr,
 868         &pm_print_times_attr.attr,
 869         &pm_wakeup_irq_attr.attr,
 870         &pm_debug_messages_attr.attr,
 871 #endif
 872 #endif
 873 #ifdef CONFIG_FREEZER
 874         &pm_freeze_timeout_attr.attr,
 875 #endif
 876         NULL,
 877 };
 878 
 879 static const struct attribute_group attr_group = {
 880         .attrs = g,
 881 };
 882 
 883 static const struct attribute_group *attr_groups[] = {
 884         &attr_group,
 885 #ifdef CONFIG_PM_SLEEP
 886         &suspend_attr_group,
 887 #endif
 888         NULL,
 889 };
 890 
 891 struct workqueue_struct *pm_wq;
 892 EXPORT_SYMBOL_GPL(pm_wq);
 893 
 894 static int __init pm_start_workqueue(void)
 895 {
 896         pm_wq = alloc_workqueue("pm", WQ_FREEZABLE, 0);
 897 
 898         return pm_wq ? 0 : -ENOMEM;
 899 }
 900 
 901 static int __init pm_init(void)
 902 {
 903         int error = pm_start_workqueue();
 904         if (error)
 905                 return error;
 906         hibernate_image_size_init();
 907         hibernate_reserved_size_init();
 908         pm_states_init();
 909         power_kobj = kobject_create_and_add("power", NULL);
 910         if (!power_kobj)
 911                 return -ENOMEM;
 912         error = sysfs_create_groups(power_kobj, attr_groups);
 913         if (error)
 914                 return error;
 915         pm_print_times_init();
 916         return pm_autosleep_init();
 917 }
 918 
 919 core_initcall(pm_init);

/* [<][>][^][v][top][bottom][index][help] */