Power allocator governor 分析
PID控制算法原理图
k_d
|
current_temp |
| v
| +----------+ +---+
| +----->| diff_err |-->| X |------+
| | +----------+ +---+ |
| | | tdp actor
| | k_i | | get_requested_power()
| | | | | | |
| | | | | | | ...
v | v v v v v
+---+ | +-------+ +---+ +---+ +---+ +----------+
| S |-------+----->| sum e |----->| X |--->| S |-->| S |-->|power |
+---+ | +-------+ +---+ +---+ +---+ |allocation|
^ | ^ +----------+
| | | | |
| | +---+ | | |
| +------->| X |-------------------+ v v
| +---+ granted performance
desired_temperature ^
|
|
k_po/k_pu
PID Controller
The power allocator governor implements a
Proportional-Integral-Derivative controller (PID controller) with
temperature as the control input and power as the controlled output:
P_max = k_p * e + k_i * err_integral + k_d * diff_err + sustainable_power
温控驱动策略层主要提供API:
static struct thermal_governor thermal_gov_power_allocator = {
.name = "power_allocator",
.bind_to_tz = power_allocator_bind,
.unbind_from_tz = power_allocator_unbind,
.throttle = power_allocator_throttle,
};
解析bind_to_tz接口细节:
power_allocator_bind
|
|
v
get_governor_trips
| 1:获取的到第一个passive温度值,当作switch on temp
| 2:获取最后一个passive温度值, 当作max_desired temp
v
estimate_pid_constants
| 1:temperature_threshold = control_temp - switch_on_temp
| 2:k_po = int_to_frac(sustainable_power)/ temperature_threshold
| 3:k_pu = int_to_frac(2 * sustainable_power) /
temperature_threshold
| 4:k_i = int_to_frac(10) / 1000; = 10
| 5:此函数将k_p, k_i初始化, k_d 默认为0
v
reset_pid_controller
| err_inegral设为0, prev_err设为0
v
tz->governor_data = params 将策略里面使用到的参数记录到tz
解析throttle接口代码细节:
power_allocator_throttle
|
v
allocate_power
| 1:输入参数为tz与control_temp
| 2:通过insttanse获取所有cooling dev的weight
| 3:通过instanse 获取到所有需求功率,最大可以持续功率,以及加权后的需求功率
|
v
pid_controller
| 1:输入tz, 可持续最大功率,control_temp
| 2: sustainable power 从tz dts获取
| 3:err = control_temp - current_temp(tz->temp) << 10, err即是目标温度与当前温度差值
| 4:p = (k_po or k_pu) * err >> 10
| 5:i = k_i * err_integral >> 10
| 6:params->err_integral += err err_integral 是所有前序err的
| 7:d = (k_d * (err - prev_err)) / passive_delay diff_err是本次err减上次err
| 8: power_range = p + i + d + ssustainable
v
divvy_up_power
| 1:根据weight power 权重分配可用功率
v
power_actor_set_power
| 1:设置各个 cooling dev的功率