Linux Runtime PM介绍【转】
转自: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在深入了解的机制
一:runtime机构简介 何为runtime机制?也就是系统在非睡眠状态,设备在空暇时能够进入runtime suspend状态同一时候不依赖系统wake_lock机制.非空暇时运行runtime ...
- linux驱动程序之电源管理之Run-time PM 详解(4)
Run-time PM. 每个device或者bus都会向run-time PM core注册3个callback struct dev_pm_ops { ... int (*runtime_su ...
- Runtime PM 处理不当导致的 external abort on non-linefetch 案例分享
硬件平台:某ARM SoC 软件平台:Linux 1 Runtime PM 简介 在介绍 Runtime PM 之前,不妨先看看传统的电源管理.传统的电源管理机制,称之为 System PM(Syst ...
- Linux实战教学笔记07:Linux系统目录结构介绍
第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...
- Linux的简单介绍和常用命令的介绍
Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...
- Linux性能工具介绍
l Linux性能工具介绍 p CPU高 p 磁盘I/O p 网络 p 内存 p 应用程序跟踪 l 操作系统与应用程序的关系比喻为“唇亡齿寒”一点不为过 l 应用程序的性能问题/功能问 ...
- Linux core 文件介绍
Linux core 文件介绍 http://www.cnblogs.com/dongzhiquan/archive/2012/01/20/2328355.html 1. core文件的简单介绍在一个 ...
- Linux 启动参数介绍
Linux 启动参数介绍 取自2.6.18 kernel Documentation/i386/boot.txt 文件中介绍 vga= 这里的不是一个整数(在C语言表示法中,应是十进制,八进制或者十六 ...
- Linux系统启动过程介绍
Linux系统启动过程介绍 学习操作系统有必要了解一下系统的启动过程,这样在面对各种系统故障的时候能快速定位解决问题,下面以Centos来分析linux系统的启动过程. 1.BIOS自检:当开机的时候 ...
随机推荐
- 阿里云数据库实例的一个db被开发人员删除了 如何恢复
1没有 逻辑备份的话. 如下操作即可 可以将那个临时实例的需要导的db用逻辑备份出来恢复到主实例就行了 好多朋友都在问,RDS中把数据恢复到7天内任意时间点的功能在哪里啊? 其实挺简单的,只需要五步操 ...
- python_如何建立包
步骤: (1)包的名称为drawing (2)drawing中建立模块color和shape 视图: 备注: (1) E:/python_script/已经加入到系统变量path中 (2) 建立包时, ...
- [转载]Oracle修改表空间大小
Oracle修改表空间大小 使用Oracle10g建立数据库后,向数据库中导入了部分数据,第二天继续向数据库中导入数据表时发生错误: 查了很多资料发现原来是Oracle表空间限制,导致无法继续导入数据 ...
- js实现svg图形转存为图片下载
我们知道canvas画布可以很方便的js原生支持转为图片格式并下载,但是svg矢量图形则并没有这方面原生的支持.研究过HighChart的svg图形的图片下载机制,其实现原理大体是浏览器端收集SVG代 ...
- Windows Security 学习笔记
对于Windows 在 Security 方面的学习. 纯兴趣. UNIX 的另外开一条路线学习. 话说今天查gpedit.msc的资料的时候发现 M$ 官网上怎么连个文档都没有. 后来才点了 gpe ...
- Unable to instantiate Action...............
当时找了好久都没搞明白,出现这样的问题,可能不是代码错了.将新添加的action不要添加在末尾,这样可能导致这样的问题出现,所以新添加的action最好放置在struts配置文件中间.
- SQL Server Index详解
最近在进行数据库调优,对索引的使用和其内部的运转一知半解.在园子里看到一篇相关文章非常好.留下印记以便日常查找. http://www.cnblogs.com/xwdreamer/archive/20 ...
- Make Rules
target: components ls TAB rule main:main.o mytool1.o mytool2.o gcc -o main main.o mytool1.o mytool2. ...
- 有关于break,continue,return的区别和代码分析
今天,用代码和结果直接解释break,continue,return的区别 1.break代码 public static void breakTest() { //break的讲解 for(int ...
- 1.Spring Web MVC有什么
Spring Web MVC使用了MVC架构模式的思想,将web层进行职责解耦. 同样也是基于请求驱动的,也就是使用请求-响应模型.它主要包含如下组件: DispatcherServlet :前端控制 ...