Android/Linux Thermal框架分析及其Governor對比

weixin_33896726發表於2017-02-10

image

圖表 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調節。

image

圖表 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

image

圖表 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。

image

圖表 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流程圖:

image

圖表 6 get_target_state流程圖

1.1.3 Thermal Cooling

在嵌入式平臺中Cooling裝置主要通過改變頻率電壓,來達到改變功耗的目的。所以只要可以修改頻率電壓都可以作為Cooling裝置,比如CPU、GPU等。

1.1.3.1 Cooling裝置之cpufreq框架介紹

image

圖表 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),也即一組平率電壓組合。

image

由上述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硬體配置資訊:

image

圖表 9 Thermal Sensor DTS

thermal-zones的配置資訊:

image
1.1.5 Driver

image

圖表 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結果分析)

下面是四組測試的柱狀圖:

image

圖表 13 Governors比較圖

相關文章