图表 1 Thermal框架

随着SoC性能的快速提升,功耗也极大提高,带来的负面影响是SoC的温度提高很快,甚至有可能造成物理损坏。同时功耗浪费也降低了电池寿命。

从上图可知,Thermal框架可以分为Thermal Core、Thermal Governor、Thermal Cooling、Thermal Driver以及Thermal Device Tree五大部分。

Thermal Core作为User Space和Kernel的接口,同时也是Thermal框架的中枢。Thermal Driver负责为整个框架读取温度作为输入,同时从DT中读取参数注册设备,一般一个Thermal Driver对应一个Thermal Zone。Thermal Governor提供多种可选Governor:Power Allocator、Step Wise、User Space等。Thermal Cooling是作为Thermal框架的输出,在PC上可能有风扇作为Cooling设备,但是在移动设备主要是通过降频降压来实现降低功耗,作为Cooling设备;目前Cooling设备可以是CPU、devfreq、clock等。从中我们可以看到的是,Thermal Driver作为输入设备,Cooling设备作为输出设备,两个都是跟SoC相关的。

Thermal相关Feature内核配置:

# CONFIG_SENSORS_ACPI_POWER is not set

CONFIG_THERMAL=y

CONFIG_THERMAL_HWMON=y

CONFIG_THERMAL_OF=y

CONFIG_THERMAL_WRITABLE_TRIPS=y

# CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE is not set

# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set

# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set

CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y

# CONFIG_THERMAL_GOV_FAIR_SHARE is not set

CONFIG_THERMAL_GOV_STEP_WISE=y

# CONFIG_THERMAL_GOV_BANG_BANG is not set

CONFIG_THERMAL_GOV_USER_SPACE=y

CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y

CONFIG_CPU_THERMAL=y

CONFIG_CLOCK_THERMAL=y

# CONFIG_THERMAL_EMULATION is not set

CONFIG_HISI_THERMAL=y

# CONFIG_IMX_THERMAL is not set

Thermal代码位于:

drivers/thermal/

Thermal相关sysfs节点位于:

/sys/class/thermal

1.1.1 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调节。

图表 2 Thermal Core Init

函数

作用

thermal_zone_device_register

thermal_zone_device_unregister

thermal_zone_get_temp

thermal_zone_device_update

thermal_zone_get_zone_by_name

Thermal Zone的注册函数,也包括获取Zone温度,根据温度设备状态以及进行Cooling。

thermal_cooling_device_register

thermal_of_cooling_device_register

thermal_cooling_device_unregister

Cooling Device的注册函数。

thermal_zone_bind_cooling_device

thermal_zone_unbind_cooling_device

将Cooling Device绑定到Zone的函数,这样Thermal Zone变得有效。

thermal_notify_framework

thermal_generate_netlink_event

通知函数。

图表 3 Thermal Core API

图表 4 thermal_zone_device_register

thermal_zone_device_check是thermal的核心函数,读取thermal温度;然后根据trip类型执行critical或者non critical响应操作。critical则直接调用orderly_poweroff;non critical则调用governor的throttle函数,此处即power_allocator_throttle。在power_allocator_throttle中进行power的分配。

1.1.2 Thermal Governor

Thermal Governor作为Thermal框架的决策核心,都被注册到thermal_governor_list上,def_governor指向当前使用的governor。

图表 5 struct thermal_governor

thermal_governor结构体用来表示一个Thermal Governor;name是名称,bind_to_tz用于将Governor绑定到Thermal Zone,unbind_from_tz用于去绑定, throttle主要被handle_thermal_trip调用,然后根据trip参数和Governor算法调用Cooling设备操作函数去设置set_cur_state。

下面重点分析Power Allocator和Step Wise两种Governor。

1.1.2.1 IPA(Intelligent Power Allocator)

参照文档:Android/Linux Thermal Governor之IPA分析与使用

1.1.2.2 Step Wise

static struct thermal_governor thermal_gov_step_wise = {

.name = "step_wise",

.throttle = step_wise_throttle,

};

Step Wise的核心是根据当前温度的趋势(上升、下降、平稳)和与当前Trip温度对比,来决定CPU下一次的Cooling状态。然后调用thermal_cdev_update进行Cooling设备的set_cur_state。两个核心函数是:get_tz_trend和get_target_state。

thermal的温度趋势有:

enum thermal_trend {

THERMAL_TREND_STABLE, /* temperature is stable */

THERMAL_TREND_RAISING, /* temperature is raising */

THERMAL_TREND_DROPPING, /* temperature is dropping */

THERMAL_TREND_RAISE_FULL, /* apply highest cooling action */

THERMAL_TREND_DROP_FULL, /* apply lowest cooling action */

};

get_target_state流程图:

图表 6 get_target_state流程图

1.1.3 Thermal Cooling

在嵌入式平台中Cooling设备主要通过改变频率电压,来达到改变功耗的目的。所以只要可以修改频率电压都可以作为Cooling设备,比如CPU、GPU等。

1.1.3.1 Cooling设备之cpufreq框架介绍

图表 7 Cooling设备cpufreq框架

核心结构体cpufreq_cooling_device作为thermal_cooling_device的扩展,最主要两个成员是dyn_power_table和cool_dev->ops,即cpufreq_cooling_ops。

1.1.3.1.1 dyn_power_table

由power = (u64) capacitance * freq_mhz * voltage_mv * voltage_mv;计算可得到一组平率和功耗表格。这就用到OPP(Operating Performance Point),也即一组平率电压组合。

由上述OPP参数,可计算的如下dyn_power_table。

Capacitance

Frequency

Voltage_mv

Power

Power

max_allocatable_power

311

208

1040

69

69.9665408

552

432

1040

145

145.3151232

1160

729

1090

269

269.3648439

2152

960

1180

415

415.714944

3320

1200

1330

660

660.15348

5280

图表 8 dyn_power_table

1.1.3.1.2 cpufreq_cooling_ops

cpufreq_cooling_ops主要包含六个操作函数:

cpufreq_get_max_state:获取最高cooling状态的回调函数,这里指的是208M所对应的状态。

cpufreq_get_cur_state:获取当前cooling状态的回调函数。

cpufreq_set_cur_state:这是根据coolingstate执行cpufreq的回调函数,是执行操作的实体。

cpufreq_get_requested_power:获取当前CPU的功耗值,包括dynamic功耗和static功耗。中间需要用到dyn_power_table进行转换。

cpufreq_state2power:将CPU cooling状态转换成需要消耗的功耗值。

cpufreq_power2state:将CPU所能获取的最大功耗值转换成cooling状态。

1.1.4 Thermal Driver

hisi_thermal驱动主要获取内存映射、中断资源、时钟信息等,注册中断处理函数,并且添加thermal sensor到thermal zone。中断处理线程函数会更新thermal的温度,同时每个thermal zone都有work queue去轮询读取温度,这一系列操作的核心是hisi_of_thermal_ops。用于读取thermal zone的核心函数是hisi_thermal_get_temp。

1.1.4.1 DTS配置

thermal sensor硬件配置信息:

图表 9 Thermal Sensor DTS

thermal-zones的配置信息:

1.1.5 Driver

图表 10 hisi_thermal_driver

thermal zone的注册在thermal_init中完成,这要比thermal driver早完成。也正是因为此,才可以在thermal driver中将thermal sensor和thermal zone绑定。这样每个thermal zone就有对应的thermal sensor操作函数,可以读取温度值。thermal_init是fs_initcall,而hisi_thermal_driver是module_init。

1.1.6 Thermal Device Tree

Thermal相关的DTS位于:

arch/arm64/boot/dts/hisilicon/hi6220.dtsi

主要包括Thermal Sensor和Thermal Zones两部分。

1.1.7 Intelligent Power Allocator和Step Wise的比较
1.1.7.1 测试环境

l Kernel:4.4.14

l Android:6.0.1

l 硬件环境:HiKey 2GB RAM+8GB ROM,分辨率1024*768

l 测试工具:Antutu 6.1.9 + WA 2.5.0

1.1.7.2 结果分析

由于没有测量Power仪器,只能分析Performance。

A、B、C、D四组测试的总分以及分类平均值比较如下:

 

A

B

C

D

Overall_Score

32416.5

33094

32350.5

32594.5

3D_Score

2447.25

2439.75

2449.75

2437.25

UX_Score

13141.5

13703.25

13211.5

13512.75

CPU_Score

12538.25

12628.25

12390.25

12312.75

RAM_Score

4289.5

4322.75

4299

4331.75

图表 11 Thermal Governor和cpufreq Governor比较测试

从上面数据可以看出:

a) Thermal、cpufreq governor对于3D和RAM测试项的影响很小。考虑到测试中的误差,基本可以认为对于3D和RAM没有影响。PS:目前的Thermal governor也没有将GPU纳入考虑。

b) 下面重点分析CPU测试项:

 

IPA

StepWise

IPA-StepWise

Interactive

12538.25

12390.25

148

Performance

12628.25

12312.75

315.5

Interactive-Performance

-90

77.5

 

图表 12 Governors均分比较

测试前认为IPA应该优于StepWise,Performance优于Interactive。

从上面的数据可以看出,Performance不一定优于Interactive;但是IPA应该是优于StepWise。

(PS:是否需要更多测试,以及影响测试结果的条件是否考虑完备。)

c) 关于UX的分数悬殊是没有预料到的,需要进一步分析。

(UX结果分析)

下面是四组测试的柱状图:

图表 13 Governors比较图

Android/Linux Thermal框架分析及其Governor对比的更多相关文章

  1. Linux Thermal Framework分析及实施

    关键词:Zone.Cooling.Governor.Step Wise.Fair Share.trip等等. Linux Thermal的目的是控制系统运行过程中采样点温度,避免温度过高造成器件损坏, ...

  2. Android/Linux Thermal Governor之IPA分析与使用

    IPA(Intelligent Power Allocator)模型的核心是利用PID控制器,Thermal Zone的温度作为输入,可分配功耗值作为输出,调节Allocator的频率和电压值. 由P ...

  3. Android/Linux boot time分析优化

    如果需要优化boot time,就需要一个量化的工具来分析每个阶段的时间消耗.这种类型的优化特别适合使用基于timeline的图表,有着明显的时间顺序.要求不但能给出整个流程消耗的时间,还要能对流程进 ...

  4. 【原创】Linux v4l2框架分析

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  5. Android : Camera2/HAL3 框架分析

    一.Android O上的Treble机制: 在 Android O 中,系统启动时,会启动一个 CameraProvider 服务,它是从 cameraserver 进程中分离出来,作为一个独立进程 ...

  6. 12.2 linux USB框架分析(详细注册match匹配过程)

     首先我们先来简单说一说USB的框架,之后在来具体分析源码,以便加深理解!其实USB的框架比较像“平台总线.设备.驱动”的框架,也分为总线.设备.驱动三大块.其中总线驱动是已经由内核完成的,一旦接入u ...

  7. Linux Netfilter框架分析

    目录 Netfilter框架 Netfilter的5个hook点 netfilter协议栈数据流分析 连接跟踪conntrack conntrack连接跟踪表条目 连接跟踪表大小 管理连接跟踪表 ip ...

  8. Android/Linux下CGroup框架分析及其使用

    1 cgroup介绍 CGroup是control group的简称,它为Linux kernel提供一种任务聚集和划分的机制,可以限制.记录.隔离进程组(process groups)所使用的资源( ...

  9. Android 核心分析 之六 IPC框架分析 Binder,Service,Service manager

    IPC框架分析 Binder,Service,Service manager 我首先从宏观的角度观察Binder,Service,Service Manager,并阐述各自的概念.从Linux的概念空 ...

随机推荐

  1. 环境与工具3:从打字开始 | vim | sublime

    作为程序员,最不爽的一件事是被亲戚叫去修电脑. "喂,怎么跟你们讲,我是写代码的,不是修电脑的!什么?代码是什么?!" 小白:为什么程序员就不能修电脑了? 小程:会不会修都有可能, ...

  2. LeetCode专题-Python实现之第9题:Palindrome Number

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  3. 打造自己的.NET Core项目模板

    前言 每个人都有自己习惯的项目结构,有人的喜欢在项目里面建解决方案文件夹:有的人喜欢传统的三层命名:有的人喜欢单一,简单的项目一个csproj就搞定.. 反正就是萝卜青菜,各有所爱. 可能不同的公司对 ...

  4. 什么是平衡二叉树(AVL)

    前言 Wiki:在计算机科学中,AVL树是最早被发明的自平衡二叉查找树.在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度都 ...

  5. KVO原理解析

    KVO在我们项目开发中,经常被用到,但很少会被人关注,但如果面试一些大公司,针对KVO的面试题可能如下: 知道KVO嘛,底层是怎么实现的? 如何动态的生成一个类? 今天我们围绕上面几个问题,我们先看K ...

  6. sqlserver数据库发送邮箱

    Exec [msdb].dbo.sp_send_dbmail @profile_name='SQLMailConfig', @recipients = @email,    //需要发送的邮箱 @su ...

  7. CentOS 7下用firewall-cmd

    一 .控制端口/服务 可以通过两种方式控制端口的开放,一种是指定端口号另一种是指定服务名.虽然开放http服务就是开放了80端口,但是还是不能通过端口号来关闭,也就是说通过指定服务名开放的就要通过指定 ...

  8. 命令别名设置: alias, unalias

    别名命令:alias 命令别名是一个很有趣的东西,特别是你的惯用指令特别长的时候!还有, 增设默认的选项在一些惯用的指令上面,可以预防一些不小心误杀文件的情况发生的时候! 举个例子来说,如果你要查询隐 ...

  9. C# 程序异常关闭时的捕获

    本文主要以一个简单的小例子,描述C# Winform程序异常关闭时,如何进行捕获,并记录日志. 概述 有时在界面的事件中,明明有try... catch 进行捕获异常,但是还是会有异常关闭的情况,所以 ...

  10. JS截取数字

    Math是javascript的一个内部对象,该对象的方法主要是一些数学计算方法floor:下退 Math.floor(12.9999) = 12ceil:上进 Math.ceil(12.1) = 1 ...