电源分配器调速器可调参数

跳变点

调速器使用以下两个被动跳变点可以最佳工作

  1. “开启”跳变点:高于此温度时,调速器控制回路开始工作。这是热区的第一个被动跳变点。

  2. “期望温度”跳变点:它应该高于“开启”跳变点。这是调速器控制的目标温度。这是热区的最后一个被动跳变点。

PID 控制器

电源分配器调速器实现了一个比例-积分-微分控制器(PID 控制器),以温度作为控制输入,以功率作为受控输出

P_max = k_p * e + k_i * err_integral + k_d * diff_err + sustainable_power

其中
  • e = desired_temperature - current_temperature

  • err_integral 是先前误差的总和

  • diff_err = e - previous_error

它类似于下图所示

                                    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

可持续功率

注册热区时,应提供可持续耗散功率的估计值(以 mW 为单位)。这估计了在期望的控制温度下可以耗散的持续功率。这是在期望的最大温度下分配的最大持续功率。实际的持续功率可能会因多种原因而变化。闭环控制器将处理诸如环境条件以及一些与硅速度等级相关的因素的变化。sustainable_power 因此只是一个估计值,可以进行调整以影响热斜坡的激进程度。作为参考,4 英寸手机的可持续功率通常为 2000mW,而 10 英寸平板电脑的可持续功率约为 4500mW(可能因屏幕尺寸而异)。可以将功率值以抽象的比例表示。可持续功率应与相关冷却设备使用的比例对齐。

如果要使用设备树,请将其作为热区的属性添加。例如

thermal-zones {
        soc_thermal {
                polling-delay = <1000>;
                polling-delay-passive = <100>;
                sustainable-power = <2500>;
                ...

相反,如果热区是从平台代码注册的,则传递一个具有 sustainable_powerthermal_zone_params。如果没有传递 thermal_zone_params,则类似以下内容就足够了

static const struct thermal_zone_params tz_params = {
        .sustainable_power = 3500,
};

然后将 tz_params 作为第 5 个参数传递给 thermal_zone_device_register()

k_po 和 k_pu

电源分配器热调速器中 PID 控制器的实现允许配置两个比例项常数:k_pok_puk_po 是在温度过冲期间(当前温度高于“期望温度”跳变点)的比例项常数。相反,k_pu 是在温度欠冲期间(当前温度低于“期望温度”跳变点)的比例项常数。

这些控制旨在作为配置系统允许的热“斜坡”的主要机制。例如,较低的 k_pu 值将提供较慢的斜坡,代价是在低温下限制可用容量。另一方面,较高的 k_pu 值将导致调速器在温度较低时授予非常高的功率,并可能导致温度过冲。

k_pu 的默认值为

2 * sustainable_power / (desired_temperature - switch_on_temp)

这意味着在 switch_on_temp 时,控制器比例项的输出将为 2 * sustainable_powerk_po 的默认值为

sustainable_power / (desired_temperature - switch_on_temp)

关注 PID 控制器方程的比例和前馈值,我们得到

P_max = k_p * e + sustainable_power

比例项与期望温度和当前温度之间的差成正比。当当前温度为期望温度时,则比例分量为零,P_max = sustainable_power。也就是说,系统应在恒定负载下在热平衡状态下运行。sustainable_power 只是一个估计值,这就是进行闭环控制的原因,例如这样。

展开 k_pu,我们得到

P_max = 2 * sustainable_power * (T_set - T) / (T_set - T_on) +
    sustainable_power

其中

  • T_set 是期望的温度

  • T 是当前温度

  • T_on 是开启温度

当当前温度为开启温度时,以上公式变为

P_max = 2 * sustainable_power * (T_set - T_on) / (T_set - T_on) +
    sustainable_power = 2 * sustainable_power + sustainable_power =
    3 * sustainable_power

因此,当温度从开启温度上升到期望温度时,仅比例项就将功率从 3 * sustainable_power 线性降低到 sustainable_power

k_i 和 integral_cutoff

k_i 配置 PID 回路的积分项常数。此项允许 PID 控制器补偿长期漂移和输出控制的量化特性:冷却设备无法设置调速器请求的确切功率。当温度误差低于 integral_cutoff 时,误差会累积在积分项中。然后将此项乘以 k_i,并将结果添加到控制器的输出中。通常,k_i 设置为较低的值(1 或 2),而 integral_cutoff 为 0。

k_d

k_d 配置 PID 回路的微分项常数。建议将其保留为默认值:0。

冷却设备功率 API

此调速器控制的冷却设备必须在其 cooling_device_ops 中提供额外的“功率”API。它由三个操作组成

  1. int get_requested_power(struct thermal_cooling_device *cdev,
                            struct thermal_zone_device *tz, u32 *power);
    
@cdev

struct thermal_cooling_device 指针

@tz

我们当前运行的热区

@power

用于存储计算功率的指针

get_requested_power() 计算设备请求的功率(以毫瓦为单位)并将其存储在 @power 中。成功时应返回 0,失败时应返回 -E*。电源分配器调速器当前使用此值来计算要分配给每个冷却设备的功率。

  1. int state2power(struct thermal_cooling_device *cdev, struct
                    thermal_zone_device *tz, unsigned long state,
                    u32 *power);
    
@cdev

struct thermal_cooling_device 指针

@tz

我们当前运行的热区

@state

冷却设备状态

@power

用于存储等效功率的指针

将冷却设备状态 @state 转换为毫瓦为单位的功耗并将其存储在 @power 中。成功时应返回 0,失败时应返回 -E*。热核当前使用此值来计算参与者可以消耗的最大功率。

  1. int power2state(struct thermal_cooling_device *cdev, u32 power,
                    unsigned long *state);
    
@cdev

struct thermal_cooling_device 指针

@power

以毫瓦为单位的功率

@state

用于存储结果状态的指针

计算一个冷却设备状态,该状态会使设备最多消耗 @power mW,并将其存储在 @state 中。成功时应返回 0,失败时应返回 -E*。热核当前使用此值来将电源分配器调速器设置的给定功率转换为冷却设备可以设置的状态。这是一个函数,因为此转换可能取决于可能会更改的外部因素,因此此函数应提供“当前情况”下的最佳转换。

冷却设备权重

权重是一种在冷却设备之间偏置分配的机制。它们表示不同冷却设备的相对功率效率。较高的权重可用于表示较高的功率效率。加权是相对的,因此如果每个冷却设备的权重均为 1,则认为它们是相等的。这在异构系统中特别有用,在这些系统中,两个冷却设备可以执行相同类型的计算,但效率不同。例如,具有两种不同类型处理器的系统。

如果热区是使用 thermal_zone_device_register()(即,平台代码)注册的,则权重作为热区的 thermal_bind_parameters 的一部分传递。如果平台是使用设备树注册的,则它们作为 cooling-maps 节点中每个映射的 contribution 属性传递。

电源分配器调速器的局限性

电源分配器调速器的 PID 控制器在有周期性节拍时效果最佳。 如果您的驱动程序重复调用 thermal_zone_device_update() (或最终调用调速器的 throttle() 函数的任何操作),则调速器的响应效果不会很好。 请注意,这并非此调速器所特有的问题,如果调用 step-wise 的 throttle() 函数的速度快于正常的热框架节拍(例如,由于中断),它也会表现不佳,因为它会过度反应。

能源模型要求

另一个重要的事情是冷却设备提供的功率值的一致比例。单个热区中的所有冷却设备都应报告以毫瓦为单位的功率值,或缩放到相同的“抽象比例”。