linux-PM PM QoS

###1. linux PM QOS PM QOS表示linux 的电源管理服务质量 linux使用 suspned/resume 机制在系统不使用的时候, 整体进入休眠状态,以节省电源,后面又引入更细粒度的runtime PM, 在设备不使用时, 单独suspend一个设备 不管是generic PM还是runtime PM, 都是在设备不被使用的情况下, suspend设备以达到节省电源的目的,我们知道,系统能够根据负载来调节CPU的频率,以取得功耗和性能的平衡,很多设备在运行时, 也能够在功耗和性能之间作出倾斜, 例如, 以手机上的sensor为例,加快采样频率能够使得更加灵敏, 但同时耗电量也会增加, 降低采样频率则正好相反,在不同的场景下(例如正常使用和游戏时), 对精度的要求不同, 应该根据需要, 将设备调节到刚好够用,以达到最大程度的省电 linux PM QOS正是为了定义了这样一套框架, 满足系统中各个实体(例如用户进程, 设备驱动)对Qos的期望 将Qos量化,可能会觉得难以理解 ###2. PM Qos简述 在PM Qos中, 有两种实体: Dependents...

linux-PM runtime PM

###1. runtime PM runtime PM用于动态电源管理, 在设备不需要工作时, 进入低功耗状态, 相较于传统的电源管理方式只能让所有的设备同时suspend,同时resume, runtime PM可以单独控制device, 粒度更为精细 runtime PM只是提供了机制, 具体何时动态调节设备进入低功耗状态, 则由driver自己决定 runtime PM的实现代码在“drivers/base/power/runtime.c”中 ###2. runtime PM回调 linux RPM 定义了设备的几个状态 enum rpm_status { RPM_ACTIVE = 0, RPM_RESUMING, RPM_SUSPENDED, RPM_SUSPENDING, }; device的RPM状态会被初始化为RPM_SUSPENDED状态, 因此, driver需要根据device的实际状态调用相关api设置为正确的值 在dev_pm_ops中需要提供3个回调: struct dev_pm_ops {...

linux-PM autosleep

###1. autosleep autosleep 基于wakeup source实现, 用于取代android wakelock中的自动休眠功能 autosleep实现代码位于“kernel/power/autosleep.c” 编译内核时, 必须配置CONFIG_PM_AUTOSLEEP选项才能enable autosleep ###2. /sys/power/autosleep autosleep在sysfs中提供了一个属性文件“/sys/power/autosleep”用以配置autosleep, 类似于“/sys/power/state”文件可以控制suspend到不同的状态, autosleep也可配置不同的状态: freeze : auto freeze standby : auto standby mem : auto mem disk : auto disk off : disable autosleep 向“/sys/power/autosleep”写入以上5个值的任意一个可将autosleep切换到指定的状态,一旦写入非“off”值, autosleep就开始运行 读取“/sys/power/autosleep”可以获得当前的状态, 特别的,...

linux-PM wakelock

###1. wakelock wakelocks最初出现在Android为linux kernel打的一个补丁集上,该补丁集实现了一个名称为“wakelocks”的系统调用,该系统调用允许调用者阻止系统进入低功耗模式(如idle、suspend等)。同时,该补丁集更改了Linux kernel原生的电源管理执行过程(kernel/power/main.c中的state_show和state_store),转而执行自定义的state_show、state_store kernel的开发者可是有原则的,死活不让这种机制合并到kernel分支(换谁也不让啊),直到kernel自身的wakeup events framework成熟后,这种僵局才被打破。因为Android开发者想到了一个坏点子:不让合并就不让合并呗,我用你的机制(wakeup source),再实现一个就是了。至此,全新的wakelocks出现了 wakelock实现代码位于 “kernel/power/wakelock.c” ###2. 新旧wakelock的对比 Android实现的旧式wakelock: 一个sysfs文件:/sys/power/wake_lock,用户程序向文件写入一个字符串,即可创建一个wakelock,该字符串就是wakelock的名字。该wakelock可以阻止系统进入低功耗模式 一个sysfs文件::/sys/power/wake_unlock,用户程序向文件写入相同的字符串,即可注销一个wakelock 当系统中所有的wakelock都注销后,系统可以自动进入低功耗状态(PowerManagerService中写触发/sys/power/state) 向内核其它driver也提供了wakelock的创建和注销接口,允许driver创建wakelock以阻止睡眠、注销wakelock以允许睡眠 void wake_lock_init(struct wake_lock *lock, int type, const char *name); void wake_lock_destroy(struct wake_lock *lock); void wake_lock(struct wake_lock *lock); void wake_lock_timeout(struct wake_lock *lock, long...

linux-PM wakeup count

###1. wakeup count wakeup count的实现存在于(drivers/base/power/wakeup.c),实现了两个功能: 判断系统当前正在处理的wakeup event 计数(wakeup events in progress)是否为空, 并且返回系统中已处理完成的wakeup event的计数(registered wakeup events) 保存系统中当前已经处理完成的wakeup event的计数(registered wakeup events)到saved_count中 ###2. wakeup count 接口 对应这两个功能,提供了两个kernel API 以及一个sysfs属性文件: bool pm_get_wakeup_count(unsigned int *count, bool block); 当系统中无正在处理的wakeup event(wakeup events in progress计数为0)时, 返回true, 否则返回false count携带系统中已经处理完的wakeup...