MTK Android 8.1 Thermal Management 溫控策略實現mtktscpu依次使用cpu_adaptive_0和cpu_adaptive_1
MTK 默認的溫控策略,thermal zone “mtktscpu”如果設置兩個如下thermal cooler “cpu_adaptive_0”和“cpu_adaptive_1”,則溫度升高的時候,只會執行“cpu_adaptive_1”,不會執行“cpu_adaptive_0”,如圖:
當溫度逐漸升高到100度的時候,開始執行cooler“cpu_adaptive_1”,但是當溫度升高到120度的時候,並沒有執行cooler“cpu_adaptive_0”,依然執行的“cpu_adaptive_1”!!
修改如下代碼,實現溫度升高到120度的時候,執行“cpu_adaptive_0”,溫度降低到100~120度的時候,又執行“cpu_adaptive_1”:
kernel/drivers/misc/mediatek/thermal/common/coolers/mtk_cooler_atm.c
static unsigned int temp_cl_dev_adp_cpu_state = 0; //add
static int adp_cpu_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state)
{
int ttj = 117000;
cl_dev_adp_cpu_state[(cdev->type[13] - '0')] = state;
//實際測試cpu_adaptive_0和cpu_adaptive_1同時執行的時候,只有cpu_adaptive_1的策略起作用
//所以在這裏強制,當cpu_adaptive_0和cpu_adaptive_1同時執行的時候,關閉cpu_adaptive_1,讓cpu_adaptive_0起作用
//如果cpu_adaptive_0 = 1,則表示溫度已經升高到120度
if(cl_dev_adp_cpu_state[0] == 1)
{
if(temp_cl_dev_adp_cpu_state == 0)
{
//保存目前cpu_adaptive_1的狀態,這個時候cpu_adaptive_1 = 1
temp_cl_dev_adp_cpu_state = cl_dev_adp_cpu_state[1];
}
//強制將cpu_adaptive_1 = 0,則只使用cpu_adaptive_0
cl_dev_adp_cpu_state[1] = 0;
}
//如果cpu_adaptive_0 = 0,則表示溫度已經低於到120度,或者還沒有升高到120度
else
{
if(temp_cl_dev_adp_cpu_state == 1)
{
//如果之前cpu_adaptive_1 = 1,則將cpu_adaptive_1恢復
cl_dev_adp_cpu_state[1] = temp_cl_dev_adp_cpu_state;
temp_cl_dev_adp_cpu_state = 0;
}
}
//add end
//printk("cl_dev_adp_cpu_state[0]=%d, cl_dev_adp_cpu_state[1]=%d, cl_dev_adp_cpu_state[2]=%d \n",cl_dev_adp_cpu_state[0], cl_dev_adp_cpu_state[1], cl_dev_adp_cpu_state[2]);
//printk("adaptive_cpu_power_limit = %d \n", adaptive_cpu_power_limit);
/* TODO: no exit point can be obtained in mtk_ts_cpu.c */
ttj = decide_ttj();
......
return 0;
}
以上修改,就可以實現:
溫度低於100度的時候,CPU正常工作;
溫度達到100度,執行cooler“cpu_adaptive_1”;
溫度達到120度,退出“cpu_adaptive_1”,執行“cpu_adaptive_0”;
溫度降低到120度以下,退出“cpu_adaptive_0”,執行“cpu_adaptive_1”;
溫度降低到100度以下,退出“cpu_adaptive_1”,CPU正常運行!!