Skip to main content

Rockchip Linux Power Load Test

:::info 文档信息

文档标识:RK-SM-YF-385 · 发布版本:V1.0.1 · 发布日期:2021-11-8 · 页数:8 · 语言:英文

原始文档:Rockchip_Introduction_Linux_PLT_CN.pdf

:::

章节大纲​

  • Rockchip Linux Power Load Test(P1)
    • 系统场景功耗分析(P4)
      • Buildroot 系统场景功耗(P4)
      • Debian 9 系统场景功耗(P4)
    • 系统功耗优化(P5)
      • 功耗初步排查步骤(P5)
        • 对比总功耗(P5)
        • 分解各路功耗(P5)
        • Clock 的检查(P6)
        • Power domain (PD) 的检查(P6)
      • 功耗初步优化步骤(P7)
        • 修改默认背光值(P7)
        • 降低刷新率(P7)
        • 关闭ISP(P7)
        • 修改调频策略(P8)
        • 调整 target load(P8)

在线预览​

若预览无法显示,请直接下载 PDF 后用本地阅读器打开。


1. 系统场景功耗分析​

RK3399测试条件主要如下:

CPU: 4xA53+2xA72, 频率最高1.8GHz DDR: 最高频率856MHz GPU: 最高频率800MHz

以下主要介绍Buidroot/Debian9 Linux 系统中静态桌面、视频播放、压力测试和深度休眠的功耗数据。

1.1 Buildroot 系统场景功耗​

从上面数据分析来看:屏幕的功耗在Pd=2.3W,静态桌面下的功耗Pui=10.8W,1080P视频的功耗Pl= 11.86W,4K@30fps视频的功耗Pb=12.1W,图形压力测试glmark2的功耗Pg= 11.98W,系统压力测试Ps=15.72W

静态桌面下Soc端的功耗Psui=1.88W 1080P视频Soc端的功耗Psl=2.34W 4K视频Soc端的功耗Psb=2.39W Glmark2的Soc端的功耗Psg=2.41W压力测试下的Soc端功耗Pss=4.13W深度休眠下的Soc端功耗Ps2=120.5mW

1.2 Debian 9 系统场景功耗​

从上面数据分析来看:屏幕的功耗在Pd=2.4W,静态桌面下的功耗Pui=10.84W,1080P视频的功耗Pl=11.43W,4K@30fps视频的功耗Pb=11.96W,图形压力测试glmark2的功耗Pg=11.97W,系统压力测试Ps=15.95W

静态桌面下Soc端的功耗Psui=1.89W 1080P视频Soc端的功耗Psl=2.23W 4K视频Soc端的功耗Psb=2.38W Glmark2的Soc端的功耗Psg=2.34W压力测试下的Soc端功耗Pss=4.06W深度休眠下的Soc端功耗Ps2=111.6mW

2. 系统功耗优化​

2.1 功耗初步排查步骤​

2.1.1 对比总功耗​

首先,对比同一场景下的总功耗,初步确认板子功耗是否正常。可参考上面章节各种场景的总功耗数据。假如客户板子总功耗和 RK 提供的 SDK 板参考数据差异较大,建议进一步分解功耗。

注意:测试功耗数据时,确保只有硬件差异,其他测试条件一致。例如对比 1080P/4K 视频播放场景的功耗数据、需视频片源相同、去除 edp 屏和 hdmi 显示等。

2.1.2 分解各路功耗​

为了详细分解功耗,熟悉项目 Power Tree 也是需要的。下图是 RK3399 挖掘机 Power Tree。在项目功耗优化过程中,可以根据硬件原理图列出 Power Tree,然后在对应电路上串一定阻值的电阻(一般推荐串20mR 电阻),测量出对应电路的电流。RK3399 挖掘机分解了以下几路功耗:VCC3V3_SYS、VDD_CPU_B、VDD_CPU_L、VDD_GPU、VDD_LOG、VDD_0V9、VDD_CENTER、VCC_DDR、VCC_1V8。

分解功耗后,对比数据。先对比 CPU 大小核、GPU、DDR 功耗是否正常,确认 CPU 变频、GPU 变频、DDR 变频是否正常。假如有抬电压,确认抬的电压是否为 12.5mv 的整数倍。变频策略正常的情况下,则需要进一步对比分析其他外设功耗。

2.1.3 Clock 的检查​

查看各个子系统 clock 状态,可以看到时钟频率、enable_count、prepare_count、父子时钟关系等。常用的 clock 命令如下(以 saradc 为例):查询 Clock Tree 命令:

# 获取总的Clock状态:

cat /sys/kernel/debug//clk/clk_summary

# 设置频率(单位 HZ):

echo 24000000 > /sys/kernel/debug/clk_saradc/clk_rate

# 获取频率:

cat /sys/kernel/debug/clk_saradc/clk_rate
# 打开 clock:
echo 1 > /sys/kernel/debug/clk_saradc/clk_enable_count
# 关闭 clock:
echo 0 > /sys/kernel/debug/clk_saradc/clk_enable_count

注意:引用计数 enable_count,是驱动主动申请开启时钟后(clk_enable)引用计数就会+1。但是有一些默认常开的时钟,引用计数可能是 1 也可能是 0,这种查功耗可以不用太关心。主要关心没有使用的设备的 CLK 的 enable_cnt 是否为 0,如果不为 0,可以手动用关闭 CLK 的命令去关闭调试。

2.1.4 Power domain (PD) 的检查​

确认各个 PD 当前状态,没有使用的模块,其状态要是 suspend,并且在 PD 下面所有的devices 都suspend 后,这个 PD 就会关闭,详细如下:

查询 PD summary 命令:

# cat /sys/kernel/debug/pm_genpd/pm_genpd_summary
domain                         status         slaves
/device                                             runtime status
----------------------------------------------------------------------
pd_vopl                         on
/devices/platform/ff8f3f00.iommu                   active
/devices/platform/ff8f0000.vop                     active
pd_vopb                         off
/devices/platform/ff903f00.iommu                   suspended
/devices/platform/ff900000.vop                     suspended
pd_vo                           on             pd_vopb, pd_vopl
pd_tcpc1                       on
/devices/platform/ff800000.phy                     active
pd_tcpc0                       on
/devices/platform/ff7c0000.phy                     active
pd_isp1                         on
/devices/platform/ff924000.iommu                   active
/devices/platform/ff920000.rkisp1                   suspended
pd_isp0                         on
/devices/platform/ff914000.iommu                   active
/devices/platform/ff910000.rkisp1                   suspended
pd_hdcp                         on
/devices/platform/ff940000.hdmi                     active

DTS 配置(以 vopb 为例):

vopb: vop@ff900000 {
power-domains = <&power RK3399_PD_VOPB>;
};

注意:如果 DTS 节点中没有引用 PD,这个 PD 认为没有 devices 使用,开机后会被框架关闭。如果上面DTS 节点中,增加了 PD 的引用,但是 vop 驱动没有 runtime 的操作,这个 PD 是常开的(因为认为这个device 是不支持的 runtime,状态会变成 unsupported)。如果 DTS 节点中增加 PD 引用,驱动中也有runtime 操作,那么这个 PD 的状态就是看驱动主动申请是开还是关。降低运行功耗总结:查询 pd summary 和 clk tree,要求没有使用的模块,PD 和 CLK 需要关闭,避免内部 MOS 管的漏电。

2.2 功耗初步优化步骤​

2.2.1 修改默认背光值​

[root@rk3399:/]# cat /sys/class/backlight/backlight/brightness

默认有0-255值可以设置,越大约亮,可以设置到100,

echo 100 > /sys/class/backlight/backlight/brightness

当然可以结合实际再降低。

2.2.2 降低刷新率​

结合使用场景,实际GPU刷新率只有30fps以下,可以改dsi的刷新率:

native-mode = <&mipi_1280x800>;
mipi_1280x800: mipi-1280x800 {
-clock-frequency = <76000000>;
+ clock-frequency = <60000000>;//45fps
hactive = <800>;
vactive = <1280>;
hsync-len = <10>;

2.2.3 关闭ISP​

在dts里面关闭一些没用到的模块,假如是USB camera,可以关闭ISP:

+&isp0 {
+       status = "disabled";
+};
+
+&isp1 {
+       status = "disabled";
+};
+
+&isp0_mmu {
+       status = "disabled";
+};
+
+&isp1_mmu {
+       status = "disabled";
+};

2.2.4 修改调频策略​

--- a/arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi
@@ -50,6 +50,8 @@
rockchip,temp-hysteresis = <5000>;
rockchip,low-temp = <10000>;
rockchip,low-temp-min-volt = <900000>;
+               rockchip,high-temp = <45000>;
+               rockchip,high-temp-max-volt = <1000000>;
nvmem-cells = <&cpul_leakage>, <&specification_serial_number>;
nvmem-cell-names = "cpu_leakage",
@@ -141,6 +143,8 @@
rockchip,temp-hysteresis = <5000>;
rockchip,low-temp = <10000>;
rockchip,low-temp-min-volt = <900000>;
+               rockchip,high-temp = <45000>;
+               rockchip,high-temp-max-volt = <1025000>;
nvmem-cells = <&cpub_leakage>, <&specification_serial_number>;
nvmem-cell-names = "cpu_leakage",

2.2.5 调整 target load​

默认load是90:

[root@rk3399:/sys/devices/system/cpu/cpufreq/policy4/interactive]# cat
target_loads

可以修改为:

[root@rk3399:/sys/devices/system/cpu/cpufreq/policy4/interactive]# cat
target_loads
65 1008000:70 1200000:75 1416000:80 1608000:90