Kernel Tour内核之旅

rpm (Runtime Suspemd)

Device的Suspend一共有两种情况:

两种情况都会调用device->dev_pm_ops,System Sleep使用suspend类接口,Runtime Suspend使用runtime_suspend类接口。

Runtime Suspend提供了三种状态:

Device有两种情况触发进入Runtime Suspend:

使Device进入Suspend,支持同步和异步两种方式,同步方式直接执行,异步方式通queue work执行。

Files

- /drivers/base/power/main.c		# DPM(Device Power Management)
- /drivers/base/power/runtime.c		# RPM(Device Runtime Suspend)
- /linux/pm_runtime.h			# RPM Main Interface
- /drivers/base/power/sysfs.c		# Sysfs

Functions

同步接口

同步接口(Force)

异步接口

向device->power->request写入Request,添加一个Work到WorkQueue(pm_runtime_work),判断执行Request对应流程。

初始化

pm_runtime_init

device_initialize中初始化RPM

pm_schedule_suspend

启动Device的Runtime Suspend Timer

PUT、GET

实际上就是重复调用suspend/resume,只有当usge_count为0时,才会真正触发执行。

Enable、Disable

Others

rpm_callback

因为dev的dev_pm_ops可能来源于class、type、bus、device,如果每个接口中都写一轮遍历会很冗余,所以实现了这个接口,通过名字自动选择可用的callback

Sysfs

/sys/devices/<device>/power/control

Enable / Disable Device Runtime Suspend

/sys/devices/<device>/power/runtime_active_time

设备Active时间

/sys/devices/<device>/power/runtime_suspend_time

设备Runtime Suspend时间

/sys/devices/<device>/power/runtime_status

设备Runtime Suspend状态

/sys/devices/<device>/power/autosuspend_delay_ms

设备自动Runtime Suspend时间(Idle这么久进入Runtime Suspend)

Reference

http://www.wowotech.net/pm_subsystem/rpm_overview.html

https://www.kernel.org/doc/html/v6.1/driver-api/pm/devices.html#runtime-power-management

https://www.kernel.org/doc/html/v6.1/power/runtime_pm.html