Power Capping
1. 概述
本文档介绍 MTT E300 DTS 启动时 Power Capping 相关参数的作用,以及如何修改和应用。Power Capping架构如下图所示:

功率采集
Power Capping 使用的功率来自于功率计总功耗一路电流的值,包含整个soc的功率合。
温度采集
Power Capping 使用的温度来 自于 7 个 PVT 温度传感器的最大值。
可分配功率
2. 可调参数
| 参数 | 默认值 | 可调范围 | 含义 |
|---|---|---|---|
| enable | 1 | / | 是否启用 Power Capping,1 为启用并应用 DTB 中配置的参数,0 为关闭,其余值为启用并应用默认参数 |
| tdp | 65000 | / | 最大释放功率,单位:mW |
| switch_on | 20 | [10, 30] | Power Capping 开始工作的功率,单位:W |
| control_performance | 45 | (switch_on, 60] | 电源模式为性能模式时 Power Capping 需要限制的功率,单位:W |
| cutoff | 20 | (0, 60] | 功率误差的限制,小于该值的功率误差才会被累积,单位:W |
| max | 2000 | [100, 10000] | 功率误差累积的最大值,单位:W |
| under_shoot | 100 | [10, 1000] | 当前功率小于 control 时的 Kp 参数,不建议改动 |
| over_shoot | 600 | [100, 1000] | 当前功率大于 control 时的 Kp 参数,决定了允许超过的功率大小。Kp 较小时,对刚超过设定功率时的功率限制较小,可以超过限制功率较多,使误差累计更快,更快到达稳态;Kp 较大时,会较快地使功率降低,但会使稳态到达变慢,且增加稳态震荡。参考当前标准差:1000-1500 mW |
| intergral | 80 | [10, 200] | Ki 参数,值越大则限制功率速度越快,但会使功率震荡增加。参考当前标准差:1000-1500 mW |
| control_normal | 45 | (switch_on, 60] | 电源模式为平衡或节电模式时 Power Capping 需要限制的功率,单位:W |
| temp_switch_on | 60 | [50, 90] | Power Capping 开始工作的温度,单位:°C |
| temp_control | 80 | (switch_on, 99] | Power Capping 需要限制的温度,单位:°C |
| temp_cutoff | 10 | (1, 20] | 温度误差的限制,小于该值的温度误差才会被累积,单位:°C |
| temp_max | 400 | [100, 500] | 温度误差累积的最大值,单位:°C |
| temp_under_shoot | 1 | [1, 10] | 当前温度小于 control 时的 Kp 参数,不建议改动 |
| temp_over_shoot | 3000 | [1000, 5000] | 当前温度大于 control 时的 Kp 参数,决定了允许超过的温度大小。Kp 较小时,对刚超过设定温度时的功率限制较小,可以超过限制温度较多,使误差累计更快,更快到达稳态;Kp 较大时,会较快地使温度降低,但会使稳态到达变慢,且增加稳态震荡。参考当前标准差:1000-1500 mW |
| temp_intergral | 100 | [100, 1000] | Ki 参数,值越大则限制温度速度越快,但会使功率震荡增加。参考当前标准差:1000-1500 mW |
| weightcpu0 | 2 | [1, 5] | 功率分配时,CPU cluster 0 的权重,权重越大则对该组件的功率限制越小 |
| weightcpu1 | 2 | [1, 5] | 功率分配时,CPU cluster 1 的权重,权重越大则对该组件的功率限制越小 |
| weightcpu2 | 2 | [1, 5] | 功率分配时,CPU cluster 2 的权重,权重越大则对该组件的功率限制越小 |
| weightgpu | 2 | [1, 5] | 功率分配时,GPU 的权重,权重越大则对该组件的功率限制越小 |
| weightnpu | 1 | [1, 5] | 功率分配时,NPU 的权重,权重越大则对该组件的功率限制越小 |
| weightvpu | 1 | [1, 5] | 功率分配时,VPU 的权重,权重越大则对该组件的功率限制越小 |
3. 修改参数
3.1 修改 DTS 参数
修改 /linux-mthreads/arch/arm64/boot/dts/m1000/m1000-aimodule.dts 中对应的参数:

3.2 编译 DTB
dts=/linux-mthreads/arch/arm64/boot/dts/m1000/m1000-aimodule.dts
cpp -nostdinc -I ~/sources/linux-mthreads/include \
-I ~/sources/linux-mthreads/arch \
-undef -x assembler-with-cpp \
$dts \
m1000-aimodule.preprocessed
dtc -I dts -O dtb -o m1000-aimodule.dtb m1000-aimodule.preprocessed
3.3 更新 DTB
# 查看是否包含 boot 分区
lsblk
# 包含 boot 分区的 rootfs
sudo mount /dev/nvme0n1p1 /mnt
sudo cp m1000-aimodule.dtb /mnt/
sudo umount /mnt
# 不含 boot 分区的 rootfs
sudo cp m1000-aimodule.dtb /usr/lib/linux-image-6.6.10/m1000/
# 复位后生效
sudo reboot
4. 系统接口
4.1 DTS接口
# 查询power capping对应的接口
cat sys/class/hwmon/hwmon*/name
# 若sys/class/hwmon/hwmon1/name是ina3221-mt,则以下命令都使用hwmon1
# 开启或关闭power capping
echo 1 > /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon1/powercapping_disable # 关闭
echo 0 > /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon1/powercapping_disable # 开启
# 调整功率阈值,单位mW
echo 50000 > /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon1/power_cap_limit
# 查询温度
cat /sys/devices/virtual/thermal/thermal_zone0/temp
cat /sys/devices/virtual/thermal/thermal_zone1/temp
cat /sys/devices/virtual/thermal/thermal_zone2/temp
cat /sys/devices/virtual/thermal/thermal_zone3/temp
cat /sys/devices/virtual/thermal/thermal_zone4/temp
cat /sys/devices/virtual/thermal/thermal_zone5/temp
cat /sys/devices/virtual/thermal/thermal_zone6/temp
# 查询功率
cat /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon0/power_all
cat /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon0/power_others
cat /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon0/power_cpu
cat /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon0/power_gpu
4.2 ACPI接口
# 开启或关闭power capping
echo 1 > /sys/devices/LNXSYSTM:00/LNXSYBUS:00/MI2C0001:18/ACPI000D:00/powercapping_disable # 关闭
echo 0 > /sys/devices/LNXSYSTM:00/LNXSYBUS:00/MI2C0001:18/ACPI000D:00/powercapping_disable # 开启
# 调整功率阈值,单位mW
echo 50000 > /sys/devices/LNXSYSTM:00/LNXSYBUS:00/MI2C0001:18/ACPI000D:00/power_cap_limit
# 查询温度
cat /sys/class/thermal/thermal_zone0/temp
cat /sys/class/thermal/thermal_zone1/temp
cat /sys/class/thermal/thermal_zone2/temp
cat /sys/class/thermal/thermal_zone3/temp
cat /sys/class/thermal/thermal_zone4/temp
cat /sys/class/thermal/thermal_zone5/temp
cat /sys/class/thermal/thermal_zone6/temp
# 查询功率
cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/MI2C0001:18/ACPI000D:00/power1_average # others
cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/MI2C0001:18/ACPI000D:01/power1_average # CPU
cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/MI2C0001:18/ACPI000D:02/power1_average # GPU
5. 寄存器分布
# PowerMeter区域
0x280FD290 # PowerAll
0x280FD294 # PowerOther
0x280FD298 # PowerCPU
0x280FD29C # PowerGPU
0x280FD2A0 # PowerLimit
0x280FD2A4 # PowerMode (0 性能 1平衡 2节电)
# 利用率区域
0x280FD2A8 # CPU_clus0
0x280FD2AC # CPU_clus1
0x280FD2B0 # CPU_clus2
0x280FD2B4 # GPU
0x280FD2B8 # NPU
0x280FD2BC # VPU
# UpdateBaseAddr 区域
0x280FD2C0 # ScpPowerCappingEnable
0x280FD2C4 # PowerCappingTdp
# 0x280FD2C8 - 0x280FD2E3 PowerPidControlAddr 区域 (28 bytes)
0x280FD2C8 # PowerCappingSwitchOn
0x280FD2CC # PowerCappingControlPerformance
0x280FD2D0 # PowerCappingCutoff
0x280FD2D4 # PowerCappingMax
0x280FD2D8 # PowerCappingUndershoot
0x280FD2DC # PowerCappingOvershoot
0x280FD2E0 # PowerCappingIntegral
0x280FD2EC # PowerCappingControlNormal
# 0x280FD2F0 - 0x280FD30B TempPidControlAddr 区域 (24 bytes)
0x280FD2F0 # PowerCappingTempSwitchOn
0x280FD2F4 # PowerCappingTempControl
0x280FD2F8 # PowerCappingTempCutoff
0x280FD2FC # PowerCappingTempMax
0x280FD300 # PowerCappingTempUndershoot
0x280FD304 # PowerCappingTempOvershoot
0x280FD308 # PowerCappingTempIntegral
# 0x280FD30C - 0x280F313 WeightBaseAddr 区域 (8 bytes)
0x280FD30C # PowerCappingWeightcpu0
0x280FD30D # PowerCappingWeightcpu1
0x280FD30E # PowerCappingWeightcpu2
0x280FD30F # PowerCappingWeightgpu
0x280FD310 # PowerCappingWeightnpu
0x280FD311 # PowerCappingWeightvpu

