thermal子系统概述

thermal子系统是内核提供的温控管理框架,一套软件温度解决方案,配合ic内部温度传感器,对ic温度进行管控,保证系统稳定性。
thermal系统多用于对ic内部的重点发热模块的功能管控,如cpu、gpu。
thermal sensor驱动负责读取硬件温度sensor的温度,并传给thermal 子系统,thermal子系统将根据调控对象的温度,决定是否触发对应的冷却措施,如限制CPU最大工作频率,以及CPU打开的核数等,从而实现对系统的冷却。

  • thermal zone
    Thermal zone代表一个温控管理区间,可以将其看做一个虚拟意义上的温度Sensor, 需要有对应的物理Sensor与其关联再能发挥作用。
    一个Thermal Zone最多可以关联一个Sensor,但该Sensor可以是多个硬件Sensor的混合。

  • Trip Point
    即触发点,由Thermal Zone维护。每个thermal zone可以维护多个trip point。Trip Point包含以下信息:
    temp:触发温度,当温度到达触发温度则该trip point被触发。
    type:trip point类型,沿袭PC散热方式,分为四种类型—passive、active、hot、critical。
    cooling device绑定信息:
    记录在thermal_instance结构体中,描述trip point与cooling device的绑定关系,即当trip point触发后由那个cooling device去实施冷却措施。每个trip point必须与一个cooling device绑定,才有实际意义。

  • cooling device
    实际对系统实施冷却措施的驱动,温控的执行者。cooling device 维护一个cooling等级,即state,一般state越高即系统的冷却需求越高。cooling device根据不同等级的冷却需求进行冷却行为。
    cooling device只根据state进行冷却操作,是实施者,而state的计算由thermal governor完成。

thermal软件框架

要实现一个温度控制的需求,试想一下我们是不是最少要有获取温度的设备和控制温度的设备这两个最基本的东西?当然附带的也会产生一些使用温度控制设备的策略。

那上面这些东西在 Linux Thermal 框架中怎么体现呢?通过阅读源码我们发现代码中对上面的东西进行了一些抽象。

获取温度的设备:在 Thermal 框架中被抽象为 Thermal Zone Device;
控制温度的设备:在 Thermal 框架中被抽象为 Thermal Cooling Device;
控制温度策略:在 Thermal 框架中被抽象为 Thermal Governor;

thermal zone

dts里的配置如下:

thermal-zones{cpu_thermal_zone{polling-delay-passive = <1000>; //超过阀值轮询时间polling-delay = <2000>; //未超阀值轮询时间thermal-sensors = <&ths_combine0 0>;trips{cpu_trip0:t0{temperature = <70>;type = "passive";hysteresis = <0>;};cpu_trip1:t1{temperature = <90>;type = "passive";hysteresis = <0>;};cpu_trip2:t2{temperature = <100>;type = "passive";hysteresis = <0>;};cpu_trip3:t3{temperature = <105>;type = "passive";hysteresis = <0>;};cpu_trip4:t4{temperature = <110>;type = "passive";hysteresis = <0>;};crt_trip0:t5{temperature = <115>;type = "critical";hysteresis = <0>;};};cooling-maps{bind0{contribution = <0>;trip = <&cpu_trip0>;cooling-device = <&cpu_budget_cooling 1 1>;};bind1{contribution = <0>;trip = <&cpu_trip1>;cooling-device = <&cpu_budget_cooling 2 2>;};bind2{contribution = <0>;trip = <&cpu_trip2>;cooling-device = <&cpu_budget_cooling 3 3>;};bind3{contribution = <0>;trip = <&cpu_trip3>;cooling-device = <&cpu_budget_cooling 4 5>;};bind4{contribution = <0>;trip = <&cpu_trip4>;cooling-device = <&cpu_budget_cooling 6 6>;};};};

内核使用thermal_zone_device 抽象获取温度的device.

struct thermal_zone_device {int id;char type[THERMAL_NAME_LENGTH];struct device device;struct thermal_attr *trip_temp_attrs;struct thermal_attr *trip_type_attrs;struct thermal_attr *trip_hyst_attrs;void *devdata;int trips;int passive_delay;int polling_delay;int temperature;int last_temperature;int emul_temperature;int passive;unsigned int forced_passive;struct thermal_zone_device_ops *ops;const struct thermal_zone_params *tzp;struct thermal_governor *governor;struct list_head thermal_instances;struct idr idr;struct mutex lock; /* protect thermal_instances list */struct list_head node;struct delayed_work poll_queue;
}struct thermal_zone_device_ops {int (*bind) (struct thermal_zone_device *,struct thermal_cooling_device *);int (*unbind) (struct thermal_zone_device *,struct thermal_cooling_device *);int (*get_temp) (struct thermal_zone_device *, int *);int (*get_mode) (struct thermal_zone_device *,enum thermal_device_mode *);int (*set_mode) (struct thermal_zone_device *,enum thermal_device_mode);int (*get_trip_type) (struct thermal_zone_device *, int,enum thermal_trip_type *);int (*get_trip_temp) (struct thermal_zone_device *, int,int *);int (*set_trip_temp) (struct thermal_zone_device *, int,int);int (*get_trip_hyst) (struct thermal_zone_device *, int,int *);int (*set_trip_hyst) (struct thermal_zone_device *, int,int);int (*get_crit_temp) (struct thermal_zone_device *, int *);int (*set_emul_temp) (struct thermal_zone_device *, int);int (*get_trend) (struct thermal_zone_device *, int,enum thermal_trend *);int (*notify) (struct thermal_zone_device *, int,enum thermal_trip_type);
}

thermal governal

降温策略一个抽象,与cpufreq的governal概念类似。
内核已经实现了一些策略,step_wise, user_space, power_allocator, bang_bang 。我们常用step_wise。

/*** struct thermal_governor - structure that holds thermal governor information* @name:       name of the governor* @throttle:   callback called for every trip point even if temperature is*              below the trip point temperature* @governor_list:      node in thermal_governor_list (in thermal_core.c)*/
struct thermal_governor {char name[THERMAL_NAME_LENGTH];/* 策略函数 */int (*throttle)(struct thermal_zone_device *tz, int trip);struct list_head        governor_list;
};

thermal cooling device

Thermal Cooling Device 是可以降温设备的抽象,能降温的设备比如风扇,这些好理解,但是想 CPU,GPU 这些 Cooling devices 怎么理解呢?

其实降温可以从两方面来理解,一个是加快散热,另外一个就是降低产热量。风扇,散热片这些是用来加快散热,CPU,GPU 这些 Cooling devices 是通过降低产热来降温。

struct thermal_cooling_device {int id;char type[THERMAL_NAME_LENGTH];struct device device;struct device_node *np;void *devdata;/* cooling device 操作函数 */const struct thermal_cooling_device_ops *ops;bool updated; /* true if the cooling device does not need update */struct mutex lock; /* protect thermal_instances list */struct list_head thermal_instances;struct list_head node;
};struct thermal_cooling_device_ops {int (*get_max_state) (struct thermal_cooling_device *, unsigned long *);int (*get_cur_state) (struct thermal_cooling_device *, unsigned long *);/* 设定等级 */int (*set_cur_state) (struct thermal_cooling_device *, unsigned long);
};

thermal core

Thermal Core作为中枢注册Governor,注册Thermal类,并且基于Device Tree注册Thermal Zone;提供Thermal Zone注册函数、Cooling Device注册函数、提供将Cooling设备绑定到Zone的函数,一个Thermal Zone可以有多个Cooling设备;同时还提供一个核心函数thermal_zone_device_update作为Thermal中断处理函数和轮询函数,轮询时间会根据不同Trip Delay调节。
模块流程图如下:

操作时序图如下:

Linux电源管理(五)thermal相关推荐

  1. Linux电源管理(10)_autosleep

    Linux电源管理(10)_autosleep 作者:wowo 发布于:2014-9-18 23:42 分类:电源管理子系统 1. 前言 Autosleep也是从Android wakelocks补丁 ...

  2. linux系统电源时钟,linux电源管理的一些梳理

    由于项目产品需要过能源之星3.0,所以最近做了一些电源管理低功耗方面的工作,抽个时间正好梳理一下. 其实Linux 电源管理非常复杂,牵扯到很多方面,比如系统级的待机.频率电压变换.系统空闲时的处理以 ...

  3. linux 电源管理 Generic PM之Suspend功能

    Linux电源管理(6)_Generic PM之Suspend功能 作者:wowo 发布于:2014-8-22 21:40 分类:电源管理子系统 1. 前言 Linux内核提供了三种Suspend: ...

  4. Linux电源管理(一)电源管理系统架构

    概述 Linux 电源管理非常复杂,牵扯到系统级的待机.频率电压变换.系统空闲时的处理以及每个设备驱动对于系统待机的支持和每个设备的运行时电源管理,可以说和系统中的每个设备驱动都息息相关. 对于消费电 ...

  5. linux 电源管理 regulator,Linux内核电源管理综述

    资料: http://blog.csdn.net/bingqingsuimeng/article/category/1228414 http://os.chinaunix.net/a2006/0519 ...

  6. Linux电源管理(5)_Hibernate和Sleep功能介绍【转】

    本文转载自:http://www.wowotech.net/pm_subsystem/std_str_func.html 1. 前言 Hibernate和Sleep两个功能是Linux Generic ...

  7. linux 电池管理软件,Linux电源管理(2)_Generic PM之基本概念和软件架构

    Linux电源管理(2)_Generic PM之基本概念和软件架构 作者:wowo 发布于:2014-5-13 19:24 分类:电源管理子系统 1. 前言 这里的Generic PM,是蜗蜗自己起的 ...

  8. Linux电源管理(2)_Generic PM之基本概念和软件架构(蜗窝科技,www.wowotech.net)

    1. 前言 这里的Generic PM,是蜗蜗自己起的名字,指Linux系统中那些常规的电源管理手段,包括关机(Power off).待机(Standby or Hibernate).重启(Reboo ...

  9. 九万字图文讲透彻 Linux 电源管理及实例分析

    九万字图文讲透彻 Linux 电源管理及实例分析. 计算机运行在物理世界中,物理世界中的一切活动都需要消耗能量.能量的形式有很多种,如热能.核能.化学能等.计算机消耗的是电能,其来源是电池或者外电源. ...

  10. Linux电源管理(1)_整体架构 -- wowo

    1. 前言 在这个世界中,任何系统的运转都需要能量.如树木依靠光能生长,如马儿依靠食物奔跑,如计算机系统依靠电能运行.而能量的获取是有成本的,因此如果能在保证系统运转的基础上,尽量节省对能量的消耗,就 ...

最新文章

  1. MySQL - 多版本控制 MVCC 机制初探
  2. 经典小游戏--推箱子
  3. Effective Java之避免使用终结方法(七)
  4. python flask上传文件_Python-Flask-文件上传
  5. cocos creator粒子不变色_隐秘的物理粒子系统与渲染 !Cocos Creator LiquidFun !
  6. Active MQ 传输 ObjectMessage 异常
  7. [原创]如何在Windows XP 中利用监视计算机中的资源使用情况
  8. MembershipUserProvider For ScrewTurn 3.0
  9. js控制的动画,显示隐藏(元素,动画,显示隐藏)
  10. HttpClient RestTemplate
  11. 商用咖啡机 推荐.html,商用咖啡机推荐,半自动咖啡机如何使用?
  12. 微信小程序:uni-app页面Page和组件Component生命周期执行的先后顺序
  13. 【踩坑专栏】feign.codec.EncodeException: Error converting request body
  14. 想健身该怎么做?要练出肌肉需要多久?
  15. 【OpenCV人脸识别入门教程之二】人脸检测
  16. 【记录】Tom猫——用Animation-list逐帧动画实现
  17. 杰理之实验现象【篇】
  18. Redis是什么、特点、优势
  19. 云队友丨如何成为解决问题的高手?
  20. Jetty 源码分析

热门文章

  1. Word 重复引用同一个脚注
  2. 项目5—中断控制LED下降沿有效与低电平触发
  3. 阿里云服务器续费坑啊早知道不买了
  4. JS怎么唤起百度地图
  5. 【笔记】操作系统题目整理
  6. chloe.mysql 源码_AceFx-基于Nfine的Chloe官网及后台源码
  7. 重新起航,研究生生涯开始了。
  8. java 键盘 映射 控制游戏_如何运用JAVA程序设计进行键盘控制游戏
  9. 工作,到底意味着什么
  10. (黎活明老师讲学)Android学习(一)---从网络获取图片