跳到主要内容

Devfreq 开发指南

本文档基于瑞芯微官方文档 Rockchip_Developer_Guide_Devfreq_CN.pdf(V1.1.1, 2021-01-21)整理,介绍 Rockchip 平台 Devfreq(设备动态调频调压)的概念、配置方法和用户态接口。

适用范围
  • 芯片平台:所有 Rockchip 芯片
  • 内核版本:Kernel 4.4 / Kernel 4.19
  • 读者对象:技术支持工程师、软件开发工程师

一、概述​

Devfreq 是 Linux 内核定义的一套框架,用于除 CPU 外其他需要动态调频调压的设备模块(如 GPU、DDR、BUS 等)。与 CPUFreq 类似,根据 governor 动态调整频率和电压,降低功耗的同时兼顾性能。

1.1 Devfreq 框架组成​

组件说明
Governor调频策略,决定频率
Core封装抽象 governor 和 driver
Driver初始化设备频率电压表,设置具体频率
Event监控设备负载信息

1.2 Governor 种类​

Governor说明
simple ondemand根据负载动态调频
userspace用户态控制频率
powersave功耗优先,始终最低频
performance性能优先,始终最高频
dmc ondemandsimple ondemand 基础上增加场景变频,DDR 变频专用

二、代码路径​

Governor 相关​

drivers/devfreq/governor_simpleondemand.c
drivers/devfreq/governor_performance.c
drivers/devfreq/governor_powersave.c
drivers/devfreq/governor_userspace.c

Event 相关​

drivers/devfreq/devfreq-event.c
drivers/devfreq/event/rockchip-dfi.c # 监控 DDR 读写 cycle 数
drivers/devfreq/event/rockchip-nocp.c # 监控各模块访问 DDR 的字节数

Core 相关​

drivers/devfreq/devfreq.c

Driver 相关​

drivers/devfreq/rockchip_dmc.c          # DMC driver + dmc ondemand governor
drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c # Mali Midgard GPU
drivers/gpu/arm/bifrost/.../mali_kbase_devfreq.c # Mali Bifrost GPU
drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c # Mali400 GPU
drivers/devfreq/rockchip_bus.c # Bus devfreq driver
drivers/soc/rockchip/rockchip_opp_select.c # 电压调整接口

三、Menuconfig 配置​

Device Drivers --->
[*] Generic Dynamic Voltage and Frequency Scaling (DVFS) support --->
*** DEVFREQ Governors ***
-*- Simple Ondemand
<*> Performance
<*> Powersave
*** DEVFREQ Drivers ***
<*> ARM ROCKCHIP BUS DEVFREQ Driver
<*> ARM ROCKCHIP DMC DEVFREQ Driver
[*] DEVFREQ-Event device Support --->
-*- ROCKCHIP DFI DEVFREQ event Driver
<*> ROCKCHIP NoC Probe DEVFREQ event Driver

四、Device Tree 配置方法​

4.1 GPU DVFS 配置​

4.1.1 Clock 配置​

在 GPU 节点下增加 clocks 和 clock-names 属性:

gpu: gpu@ff9a0000 {
compatible = "arm,malit860", ...;
...
clocks = <&cru ACLK_GPU>;
clock-names = "clk_mali";
...
};

4.1.2 Regulator 配置​

在 GPU 节点下增加 mali-supply 属性:

&gpu {
status = "okay";
mali-supply = <&vdd_gpu>;
};

4.1.3 OPP Table 配置​

增加 OPP Table​
&gpu {
operating-points-v2 = <&gpu_opp_table>;
};

gpu_opp_table: opp-table2 {
compatible = "operating-points-v2";

opp-200000000 {
opp-hz = /bits/ 64 <200000000>; // 单位 Hz
opp-microvolt = <800000>; // 单位 uV
};
...
opp-800000000 {
opp-hz = /bits/ 64 <800000000>;
opp-microvolt = <1100000>;
};
};
删除 OPP​

方法一:在 OPP 节点内禁用:

opp-800000000 {
opp-hz = /bits/ 64 <800000000>;
opp-microvolt = <1100000>;
status = "disabled";
};

方法二:在板级 DTS 中引用后禁用:

&gpu_opp_table {
opp-800000000 {
status = "disabled";
};
};

4.1.4 根据 leakage 调整 OPP Table​

根据 leakage 调整电压​

根据芯片实际漏电值自动调整电压。

4.1.5 根据 PVTM 调整 OPP Table​

根据 PVTM 调整电压​

PVTM 监测工艺/电压/温度,动态调整。

4.1.6 根据 IR-Drop 调整 OPP Table​

考虑电源压降。

4.1.7 宽温配置​

支持高低温下的稳定运行。

4.1.8 升降频负载配置​

配置 governor 升频/降频的负载阈值。

4.2 DMC DVFS 配置​

4.2.1 Clock 配置​

4.2.2 Regulator 配置​

4.2.3 OPP Table 配置​

增加 OPP Table​
删除 OPP​

4.2.4 根据 leakage 调整 OPP Table​

4.2.5 根据 PVTM 调整 OPP Table​

4.2.6 根据 IR-Drop 调整 OPP Table​

4.2.7 场景变频配置​

DMC 支持根据不同使用场景(如播放视频、待机等)设置不同的 DDR 频率。

4.2.8 负载变频配置​

根据 DDR 实际访问负载动态调整频率。

4.2.9 根据 VOP 带宽变频​

根据显示通路(VOP)所需的带宽动态调整 DDR 频率,确保显示流畅。

4.3 BUS DVFS 配置​

4.3.1 PLL DVFS 配置​

BUS 总线频率动态调整。


五、用户态接口介绍​

Devfreq 在 sysfs 中的接口:

/sys/class/devfreq/
├── devfreq0/ # 第一个 devfreq 设备(如 DMC)
│ ├── available_governors # 可用 governor
│ ├── governor # 当前 governor
│ ├── cur_freq # 当前频率
│ ├── min_freq # 最小频率
│ ├── max_freq # 最大频率
│ ├── target_freq # 目标频率
│ ├── stats/ # 统计信息
│ │ ├── time_in_state # 各频率停留时间
│ │ └── total_trans # 变频总次数
│ └── ...
├── devfreq1/ # 第二个 devfreq 设备(如 GPU)
└── ...

六、常见问题​

6.1 如何查看频率电压表​

cat /sys/class/devfreq/devfreq0/available_frequencies

6.2 如何定频​

# 设置为 performance governor(固定最高频)
echo performance > /sys/class/devfreq/devfreq0/governor

# 设置为 userspace 并指定频率
echo userspace > /sys/class/devfreq/devfreq0/governor
echo <freq> > /sys/class/devfreq/devfreq0/target_freq

# 限制调频范围
echo <min_freq> > /sys/class/devfreq/devfreq0/min_freq
echo <max_freq> > /sys/class/devfreq/devfreq0/max_freq

6.3 如何查看当前频率​

cat /sys/class/devfreq/devfreq0/cur_freq

6.4 如何查看当前电压​

查看对应 regulator 的电压:

cat /sys/class/regulator/regulator.x/microvolts

6.5 如何单独调频调压​

userspace 模式下通过 sysfs 接口设置。

6.6 如何查看当前电压的档位​

查看 regulator 信息。

6.7 如何查看 leakage​

cat /sys/devices/platform/rockchip-opp-sel/gpu-leakage
# 或 dmc-leakage

6.8 如何修改电压​

修改 DTS 中 OPP 节点的 opp-microvolt 属性。


参考资料​

  • 原始文档:Rockchip_Developer_Guide_Devfreq_CN.pdf V1.1.1
  • 《Rockchip_Developer_Guide_CPUFreq_CN.pdf》
  • 《Documentation/devicetree/bindings/opp/opp.txt》
  • 瑞芯微官网:www.rock-chips.com