Linux Runtime PM介绍
来源:互联网 发布:android精品源码 编辑:程序博客网 时间:2024/05/22 05:32
from : http://blog.csdn.net/wlwl0071986/article/details/42677403
一、Runtime PM引言
1. 背景
(1)display的需求
(2)系统整机动态功耗优化的需求
(3)upstream
2. 解决方案
(1)引入debounce
(2)使用统一的workqueue来管理任务
(3)实时地关闭不需要工作的device
(4)当device作为parent时,所有的child不工作时,关闭该device
(5)引入pm_rutime
3. 性能指标
(1)快速开关屏场景,亮屏速度提升
(2)动态功耗,更为稳定;唤醒而不亮屏的场景,功耗更低
(3)有助于降低系统整机动态功耗
二、Runtime PM框架
1. Runtime PM层次结构
2. Runtime PM状态
3. Runtime PM控制流程
每个设备或者子系统都会向Runtime PM core注册3个callback。
在struct dev_pm_ops结构体中,定义了这三个callback:
struct dev_pm_ops {
...
int (*runtime_suspend)(struct device *dev);
int (*runtime_resume)(struct device *dev);
int (*runtime_idle)(struct device *dev);
.suspend
.resume
};
注:引入runtime之后,suspend 接口需和runtime接口放在同一个数据结构内;
4. rpm_status(include\Linux\pm.h)
enum rpm_status {
RPM_ACTIVE = 0, /* 表示runtime_resume()被成功执行 */
RPM_RESUMING, /* 表示runtime_resume()正在被执行 */
RPM_SUSPENDED, /* 表示runtime_suspend()被成功执行 */
RPM_SUSPENDING, /* 表示runtime_suspend()正在被执行 */
};
5. rpm_request(include\linux\pm.h)
enum rpm_request {
RPM_REQ_NONE = 0,RPM_REQ_IDLE, /* 执行runtime_idle() */
RPM_REQ_SUSPEND, /* 执行runtime_suspend () */
RPM_REQ_AUTOSUSPEND, /* 延迟autosuspend_delay后执行runtime_suspend() */
RPM_REQ_RESUME, /* 执行runtime_resume() */
};
请求的类型(设置request_pending才有效)。
6. Idle Reference API
pm_runtime_put_noidle: only put
pm_runtime_idle
pm_request_idle:async
pm_runtime_put: put + async
pm_runtime_put_sync
7. Suspend Reference API
pm_schedule_suspend
pm_runtime_suspend:
pm_runtime_put_sync_suspend: put
pm_runtime_autosuspend: auto
pm_request_autosuspend:async + auto
pm_runtime_put_autosuspend: put + async + auto
pm_runtime_put_sync_autosuspend: put + auto
8. Resume Reference API
pm_runtime_get_noresume
pm_runtime_resume
pm_request_resume: async
pm_runtime_get: get + async
pm_runtime_get_sync: get
9. Device Runtime suspend 流程
触发:
pm_schedule_suspend
pm_runtime_suspend:
pm_runtime_put_sync_suspend: put
pm_runtime_autosuspend: auto
pm_request_autosuspend:async + auto
pm_runtime_put_autosuspend: put + async + auto
pm_runtime_put_sync_autosuspend: put + auto
suspend的条件:
usage_cnt= 0;
disable_depth = 0;
runtime_status = RPM_ACTIVE
10. Device Runtime PM idle流程
idle的触发:
pm_runtime_put_noidle: only put
pm_runtime_idle
pm_request_idle:async
pm_runtime_put: put + async
pm_runtime_put_sync
idle的条件:
usage_cnt= 0;
disable_depth = 0;
runtime_status = RPM_ACTIVE
11. Device Runtime PM resume流程
触发:
pm_runtime_get_noresume
pm_runtime_resume
pm_request_resume: async
pm_runtime_get: get + async
pm_runtime_get_sync: get
条件:
disable_depth = 0
runtime_status != RPM_ACTIVE
三、Runtime PM和设备模型
1. Device Runtime PM 初始化
(1)设备模型完成pm_runtime 的初始化;
(2)对pm_runtime 状态的改变,需在device_register 之后实现;
(3)设备模型,在调用drv probe, remove, shutdown 等接口时,
可以保证pm_runtime 处于disable 状态,或其他约定状态;
void pm_runtime_init(struct device *dev)
{
dev->power.runtime_status = RPM_SUSPENDED;
dev->power.idle_notification = false;
dev->power.disable_depth = 1;
atomic_set(&dev->power.usage_count, 0);
dev->power.runtime_error = 0;
atomic_set(&dev->power.child_count, 0);
pm_suspend_ignore_children(dev, false);
dev->power.runtime_auto = true;
dev->power.request_pending = false;
dev->power.request = RPM_REQ_NONE;
dev->power.deferred_resume = false;
dev->power.accounting_timestamp = jiffies;
INIT_WORK(&dev->power.work, pm_runtime_work);
dev->power.timer_expires = 0;
setup_timer(&dev->power.suspend_timer, pm_suspend_timer_fn, (unsigned long)dev);
init_waitqueue_head(&dev->power.wait_queue);
}
platform_device_register(&platform_disp_device);
pm_runtime_set_active(&platform_disp_device.dev);
pm_runtime_get_noresume(&platform_disp_device.dev);
pm_runtime_enable(&platform_disp_device.dev);
pm_runtime_set_autosuspend_delay(&platform_disp_device.dev, 5000);
pm_runtime_use_autosuspend(&platform_disp_device.dev);
platform_driver_register(&disp_driver);
2. Device Runtime PM remove流程
3. Device Runtime PM shutdown流程
四、Runtime PM和电源管理
1. system sleep flow
2. system sleep flow: resume
3. system sleep flow: suspend
五、Runtime PM实例分析
- Linux Runtime PM介绍
- Linux Runtime PM介绍
- Linux Runtime PM介绍
- linux pm runtime
- linux pm runtime
- linux pm runtime
- Linux电源管理-Runtime PM
- Linux电源管理-Runtime PM
- pm runtime
- linux runtime pm机制的深入理解
- linux runtime pm机制的深入理解
- linux runtime pm机制的深入理解
- linux runtime pm机制的深入理解
- pm runtime management
- adb pm 指令介绍
- RunTime介绍
- Linux PM QoS framework(
- Linux PM QoS framework
- ngnix反向代理tomcat,动静态分离
- ubuntu16.04环境下部署jdk
- struts2校验(2)
- redis的配置(安装、启动、本机与虚拟机的redis的连接)
- Qt实现读取显示obj文件——绘制数据
- Linux Runtime PM介绍
- 有关DBLINK操作的语句执行机制及优化方式
- R 语言中的S3系统(笔记)
- 2016 年崛起的 JS 项目
- JavaScript使用filter方法实现100以内素数的快速筛选
- 前端根据后端返回的列表数据设变量自己排序
- 【CSS3】使用:not(:last-of-type)简化你的css代码
- javascript基础扎实了,但是很多逻辑性的功能还是不会写?
- php 运算符