隨着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結果分析)
下面是四組測試的柱狀圖:











