diff options
Diffstat (limited to 'Documentation/power')
-rw-r--r-- | Documentation/power/runtime_pm.txt | 190 |
1 files changed, 183 insertions, 7 deletions
diff --git a/Documentation/power/runtime_pm.txt b/Documentation/power/runtime_pm.txt index 9ba49b21ac86..489e9bacd165 100644 --- a/Documentation/power/runtime_pm.txt +++ b/Documentation/power/runtime_pm.txt | |||
@@ -158,7 +158,8 @@ rules: | |||
158 | to execute it, the other callbacks will not be executed for the same device. | 158 | to execute it, the other callbacks will not be executed for the same device. |
159 | 159 | ||
160 | * A request to execute ->runtime_resume() will cancel any pending or | 160 | * A request to execute ->runtime_resume() will cancel any pending or |
161 | scheduled requests to execute the other callbacks for the same device. | 161 | scheduled requests to execute the other callbacks for the same device, |
162 | except for scheduled autosuspends. | ||
162 | 163 | ||
163 | 3. Run-time PM Device Fields | 164 | 3. Run-time PM Device Fields |
164 | 165 | ||
@@ -166,7 +167,7 @@ The following device run-time PM fields are present in 'struct dev_pm_info', as | |||
166 | defined in include/linux/pm.h: | 167 | defined in include/linux/pm.h: |
167 | 168 | ||
168 | struct timer_list suspend_timer; | 169 | struct timer_list suspend_timer; |
169 | - timer used for scheduling (delayed) suspend request | 170 | - timer used for scheduling (delayed) suspend and autosuspend requests |
170 | 171 | ||
171 | unsigned long timer_expires; | 172 | unsigned long timer_expires; |
172 | - timer expiration time, in jiffies (if this is different from zero, the | 173 | - timer expiration time, in jiffies (if this is different from zero, the |
@@ -236,6 +237,23 @@ defined in include/linux/pm.h: | |||
236 | Section 8); it may be modified only by the pm_runtime_no_callbacks() | 237 | Section 8); it may be modified only by the pm_runtime_no_callbacks() |
237 | helper function | 238 | helper function |
238 | 239 | ||
240 | unsigned int use_autosuspend; | ||
241 | - indicates that the device's driver supports delayed autosuspend (see | ||
242 | Section 9); it may be modified only by the | ||
243 | pm_runtime{_dont}_use_autosuspend() helper functions | ||
244 | |||
245 | unsigned int timer_autosuspends; | ||
246 | - indicates that the PM core should attempt to carry out an autosuspend | ||
247 | when the timer expires rather than a normal suspend | ||
248 | |||
249 | int autosuspend_delay; | ||
250 | - the delay time (in milliseconds) to be used for autosuspend | ||
251 | |||
252 | unsigned long last_busy; | ||
253 | - the time (in jiffies) when the pm_runtime_mark_last_busy() helper | ||
254 | function was last called for this device; used in calculating inactivity | ||
255 | periods for autosuspend | ||
256 | |||
239 | All of the above fields are members of the 'power' member of 'struct device'. | 257 | All of the above fields are members of the 'power' member of 'struct device'. |
240 | 258 | ||
241 | 4. Run-time PM Device Helper Functions | 259 | 4. Run-time PM Device Helper Functions |
@@ -261,6 +279,12 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h: | |||
261 | error code on failure, where -EAGAIN or -EBUSY means it is safe to attempt | 279 | error code on failure, where -EAGAIN or -EBUSY means it is safe to attempt |
262 | to suspend the device again in future | 280 | to suspend the device again in future |
263 | 281 | ||
282 | int pm_runtime_autosuspend(struct device *dev); | ||
283 | - same as pm_runtime_suspend() except that the autosuspend delay is taken | ||
284 | into account; if pm_runtime_autosuspend_expiration() says the delay has | ||
285 | not yet expired then an autosuspend is scheduled for the appropriate time | ||
286 | and 0 is returned | ||
287 | |||
264 | int pm_runtime_resume(struct device *dev); | 288 | int pm_runtime_resume(struct device *dev); |
265 | - execute the subsystem-level resume callback for the device; returns 0 on | 289 | - execute the subsystem-level resume callback for the device; returns 0 on |
266 | success, 1 if the device's run-time PM status was already 'active' or | 290 | success, 1 if the device's run-time PM status was already 'active' or |
@@ -273,6 +297,11 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h: | |||
273 | device (the request is represented by a work item in pm_wq); returns 0 on | 297 | device (the request is represented by a work item in pm_wq); returns 0 on |
274 | success or error code if the request has not been queued up | 298 | success or error code if the request has not been queued up |
275 | 299 | ||
300 | int pm_request_autosuspend(struct device *dev); | ||
301 | - schedule the execution of the subsystem-level suspend callback for the | ||
302 | device when the autosuspend delay has expired; if the delay has already | ||
303 | expired then the work item is queued up immediately | ||
304 | |||
276 | int pm_schedule_suspend(struct device *dev, unsigned int delay); | 305 | int pm_schedule_suspend(struct device *dev, unsigned int delay); |
277 | - schedule the execution of the subsystem-level suspend callback for the | 306 | - schedule the execution of the subsystem-level suspend callback for the |
278 | device in future, where 'delay' is the time to wait before queuing up a | 307 | device in future, where 'delay' is the time to wait before queuing up a |
@@ -304,12 +333,20 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h: | |||
304 | - decrement the device's usage counter | 333 | - decrement the device's usage counter |
305 | 334 | ||
306 | int pm_runtime_put(struct device *dev); | 335 | int pm_runtime_put(struct device *dev); |
307 | - decrement the device's usage counter, run pm_request_idle(dev) and return | 336 | - decrement the device's usage counter; if the result is 0 then run |
308 | its result | 337 | pm_request_idle(dev) and return its result |
338 | |||
339 | int pm_runtime_put_autosuspend(struct device *dev); | ||
340 | - decrement the device's usage counter; if the result is 0 then run | ||
341 | pm_request_autosuspend(dev) and return its result | ||
309 | 342 | ||
310 | int pm_runtime_put_sync(struct device *dev); | 343 | int pm_runtime_put_sync(struct device *dev); |
311 | - decrement the device's usage counter, run pm_runtime_idle(dev) and return | 344 | - decrement the device's usage counter; if the result is 0 then run |
312 | its result | 345 | pm_runtime_idle(dev) and return its result |
346 | |||
347 | int pm_runtime_put_sync_autosuspend(struct device *dev); | ||
348 | - decrement the device's usage counter; if the result is 0 then run | ||
349 | pm_runtime_autosuspend(dev) and return its result | ||
313 | 350 | ||
314 | void pm_runtime_enable(struct device *dev); | 351 | void pm_runtime_enable(struct device *dev); |
315 | - enable the run-time PM helper functions to run the device bus type's | 352 | - enable the run-time PM helper functions to run the device bus type's |
@@ -360,19 +397,46 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h: | |||
360 | PM attributes from /sys/devices/.../power (or prevent them from being | 397 | PM attributes from /sys/devices/.../power (or prevent them from being |
361 | added when the device is registered) | 398 | added when the device is registered) |
362 | 399 | ||
400 | void pm_runtime_mark_last_busy(struct device *dev); | ||
401 | - set the power.last_busy field to the current time | ||
402 | |||
403 | void pm_runtime_use_autosuspend(struct device *dev); | ||
404 | - set the power.use_autosuspend flag, enabling autosuspend delays | ||
405 | |||
406 | void pm_runtime_dont_use_autosuspend(struct device *dev); | ||
407 | - clear the power.use_autosuspend flag, disabling autosuspend delays | ||
408 | |||
409 | void pm_runtime_set_autosuspend_delay(struct device *dev, int delay); | ||
410 | - set the power.autosuspend_delay value to 'delay' (expressed in | ||
411 | milliseconds); if 'delay' is negative then run-time suspends are | ||
412 | prevented | ||
413 | |||
414 | unsigned long pm_runtime_autosuspend_expiration(struct device *dev); | ||
415 | - calculate the time when the current autosuspend delay period will expire, | ||
416 | based on power.last_busy and power.autosuspend_delay; if the delay time | ||
417 | is 1000 ms or larger then the expiration time is rounded up to the | ||
418 | nearest second; returns 0 if the delay period has already expired or | ||
419 | power.use_autosuspend isn't set, otherwise returns the expiration time | ||
420 | in jiffies | ||
421 | |||
363 | It is safe to execute the following helper functions from interrupt context: | 422 | It is safe to execute the following helper functions from interrupt context: |
364 | 423 | ||
365 | pm_request_idle() | 424 | pm_request_idle() |
425 | pm_request_autosuspend() | ||
366 | pm_schedule_suspend() | 426 | pm_schedule_suspend() |
367 | pm_request_resume() | 427 | pm_request_resume() |
368 | pm_runtime_get_noresume() | 428 | pm_runtime_get_noresume() |
369 | pm_runtime_get() | 429 | pm_runtime_get() |
370 | pm_runtime_put_noidle() | 430 | pm_runtime_put_noidle() |
371 | pm_runtime_put() | 431 | pm_runtime_put() |
432 | pm_runtime_put_autosuspend() | ||
433 | pm_runtime_enable() | ||
372 | pm_suspend_ignore_children() | 434 | pm_suspend_ignore_children() |
373 | pm_runtime_set_active() | 435 | pm_runtime_set_active() |
374 | pm_runtime_set_suspended() | 436 | pm_runtime_set_suspended() |
375 | pm_runtime_enable() | 437 | pm_runtime_suspended() |
438 | pm_runtime_mark_last_busy() | ||
439 | pm_runtime_autosuspend_expiration() | ||
376 | 440 | ||
377 | 5. Run-time PM Initialization, Device Probing and Removal | 441 | 5. Run-time PM Initialization, Device Probing and Removal |
378 | 442 | ||
@@ -561,3 +625,115 @@ As a consequence, the PM core will never directly inform the device's subsystem | |||
561 | or driver about run-time power changes. Instead, the driver for the device's | 625 | or driver about run-time power changes. Instead, the driver for the device's |
562 | parent must take responsibility for telling the device's driver when the | 626 | parent must take responsibility for telling the device's driver when the |
563 | parent's power state changes. | 627 | parent's power state changes. |
628 | |||
629 | 9. Autosuspend, or automatically-delayed suspends | ||
630 | |||
631 | Changing a device's power state isn't free; it requires both time and energy. | ||
632 | A device should be put in a low-power state only when there's some reason to | ||
633 | think it will remain in that state for a substantial time. A common heuristic | ||
634 | says that a device which hasn't been used for a while is liable to remain | ||
635 | unused; following this advice, drivers should not allow devices to be suspended | ||
636 | at run-time until they have been inactive for some minimum period. Even when | ||
637 | the heuristic ends up being non-optimal, it will still prevent devices from | ||
638 | "bouncing" too rapidly between low-power and full-power states. | ||
639 | |||
640 | The term "autosuspend" is an historical remnant. It doesn't mean that the | ||
641 | device is automatically suspended (the subsystem or driver still has to call | ||
642 | the appropriate PM routines); rather it means that run-time suspends will | ||
643 | automatically be delayed until the desired period of inactivity has elapsed. | ||
644 | |||
645 | Inactivity is determined based on the power.last_busy field. Drivers should | ||
646 | call pm_runtime_mark_last_busy() to update this field after carrying out I/O, | ||
647 | typically just before calling pm_runtime_put_autosuspend(). The desired length | ||
648 | of the inactivity period is a matter of policy. Subsystems can set this length | ||
649 | initially by calling pm_runtime_set_autosuspend_delay(), but after device | ||
650 | registration the length should be controlled by user space, using the | ||
651 | /sys/devices/.../power/autosuspend_delay_ms attribute. | ||
652 | |||
653 | In order to use autosuspend, subsystems or drivers must call | ||
654 | pm_runtime_use_autosuspend() (preferably before registering the device), and | ||
655 | thereafter they should use the various *_autosuspend() helper functions instead | ||
656 | of the non-autosuspend counterparts: | ||
657 | |||
658 | Instead of: pm_runtime_suspend use: pm_runtime_autosuspend; | ||
659 | Instead of: pm_schedule_suspend use: pm_request_autosuspend; | ||
660 | Instead of: pm_runtime_put use: pm_runtime_put_autosuspend; | ||
661 | Instead of: pm_runtime_put_sync use: pm_runtime_put_sync_autosuspend. | ||
662 | |||
663 | Drivers may also continue to use the non-autosuspend helper functions; they | ||
664 | will behave normally, not taking the autosuspend delay into account. | ||
665 | Similarly, if the power.use_autosuspend field isn't set then the autosuspend | ||
666 | helper functions will behave just like the non-autosuspend counterparts. | ||
667 | |||
668 | The implementation is well suited for asynchronous use in interrupt contexts. | ||
669 | However such use inevitably involves races, because the PM core can't | ||
670 | synchronize ->runtime_suspend() callbacks with the arrival of I/O requests. | ||
671 | This synchronization must be handled by the driver, using its private lock. | ||
672 | Here is a schematic pseudo-code example: | ||
673 | |||
674 | foo_read_or_write(struct foo_priv *foo, void *data) | ||
675 | { | ||
676 | lock(&foo->private_lock); | ||
677 | add_request_to_io_queue(foo, data); | ||
678 | if (foo->num_pending_requests++ == 0) | ||
679 | pm_runtime_get(&foo->dev); | ||
680 | if (!foo->is_suspended) | ||
681 | foo_process_next_request(foo); | ||
682 | unlock(&foo->private_lock); | ||
683 | } | ||
684 | |||
685 | foo_io_completion(struct foo_priv *foo, void *req) | ||
686 | { | ||
687 | lock(&foo->private_lock); | ||
688 | if (--foo->num_pending_requests == 0) { | ||
689 | pm_runtime_mark_last_busy(&foo->dev); | ||
690 | pm_runtime_put_autosuspend(&foo->dev); | ||
691 | } else { | ||
692 | foo_process_next_request(foo); | ||
693 | } | ||
694 | unlock(&foo->private_lock); | ||
695 | /* Send req result back to the user ... */ | ||
696 | } | ||
697 | |||
698 | int foo_runtime_suspend(struct device *dev) | ||
699 | { | ||
700 | struct foo_priv foo = container_of(dev, ...); | ||
701 | int ret = 0; | ||
702 | |||
703 | lock(&foo->private_lock); | ||
704 | if (foo->num_pending_requests > 0) { | ||
705 | ret = -EBUSY; | ||
706 | } else { | ||
707 | /* ... suspend the device ... */ | ||
708 | foo->is_suspended = 1; | ||
709 | } | ||
710 | unlock(&foo->private_lock); | ||
711 | return ret; | ||
712 | } | ||
713 | |||
714 | int foo_runtime_resume(struct device *dev) | ||
715 | { | ||
716 | struct foo_priv foo = container_of(dev, ...); | ||
717 | |||
718 | lock(&foo->private_lock); | ||
719 | /* ... resume the device ... */ | ||
720 | foo->is_suspended = 0; | ||
721 | pm_runtime_mark_last_busy(&foo->dev); | ||
722 | if (foo->num_pending_requests > 0) | ||
723 | foo_process_requests(foo); | ||
724 | unlock(&foo->private_lock); | ||
725 | return 0; | ||
726 | } | ||
727 | |||
728 | The important point is that after foo_io_completion() asks for an autosuspend, | ||
729 | the foo_runtime_suspend() callback may race with foo_read_or_write(). | ||
730 | Therefore foo_runtime_suspend() has to check whether there are any pending I/O | ||
731 | requests (while holding the private lock) before allowing the suspend to | ||
732 | proceed. | ||
733 | |||
734 | In addition, the power.autosuspend_delay field can be changed by user space at | ||
735 | any time. If a driver cares about this, it can call | ||
736 | pm_runtime_autosuspend_expiration() from within the ->runtime_suspend() | ||
737 | callback while holding its private lock. If the function returns a nonzero | ||
738 | value then the delay has not yet expired and the callback should return | ||
739 | -EAGAIN. | ||