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正常运行!!