隨著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調節。
函式 |
作用 |
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 |
通知函式。 |
圖表 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。
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流程圖:
1.1.3 Thermal Cooling
在嵌入式平臺中Cooling裝置主要通過改變頻率電壓,來達到改變功耗的目的。所以只要可以修改頻率電壓都可以作為Cooling裝置,比如CPU、GPU等。
1.1.3.1 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 |
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硬體配置資訊:
thermal-zones的配置資訊:
1.1.5 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 |
測試前認為IPA應該優於StepWise,Performance優於Interactive。
從上面的資料可以看出,Performance不一定優於Interactive;但是IPA應該是優於StepWise。
(PS:是否需要更多測試,以及影響測試結果的條件是否考慮完備。)
c) 關於UX的分數懸殊是沒有預料到的,需要進一步分析。
(UX結果分析)
下面是四組測試的柱狀圖: