Rockchip Developer Guide Linux4.4 Devfreq

Rockchip-Developer-Guide-Linux4.4-Devfreq

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 25

DownloadRockchip-Developer-Guide-Linux4.4-Devfreq
Open PDF In BrowserView PDF
Devfreq

开发指南

发布版本:1.0
作者邮箱:finley.xiao@rock-chips.com
⽇期:2018.09.14
⽂档密级:公开资料

前⾔
概述
主要描述devfreq的相关概念、配置⽅法和⽤⼾态接口。
产品版本
芯⽚名称
所有芯⽚
读者对象
软件开发⼯程师
技术⽀持⼯程师
修订记录

内核版本
Linux4.4

⽇期

版本

2018-09-14

V1.0

开发指南
概述
2 代码路径

Devfreq
1

配置
配置⽅法
4.1 GPU DVFS配置⽅法
4.1.1 Clock配置
4.1.2 Regulator配置
4.1.3 OPP Table配置
4.1.3.1 增加OPP Table
4.1.3.2 删除OPP
4.1.4 根据leakage调整OPP Table
4.1.4.1 根据leakage调整电压

3 Menuconfig
4 Device Tree

作者
肖锋

修订说明
初始版本

根据PVTM调整OPP Table
根据PVTM调整电压
4.1.6 根据IR-Drop调整OPP Table
4.1.7 宽温配置
4.1.8 升降频负载配置
4.2 DMC DVFS配置⽅法
4.2.1 Clock配置
4.2.2 Regulator配置
4.2.3 OPP Table配置
4.2.3.1 增加OPP Table
4.2.3.2 删除OPP
4.2.4 根据leakage调整OPP Table
4.2.4.1 根据leakage调整电压
4.2.5 根据PVTM调整OPP Table
4.2.5.1 根据PVTM调整电压
4.2.6 根据IR-Drop调整OPP Table
4.2.7 场景变频配置
4.2.8 负载变频配置
4.2.9 根据VOP带宽变频
4.3 BUS DVFS配置⽅法
4.3.1 PLL DVFS配置
5 ⽤⼾态接口介绍
6 常⻅问题
6.1 如何查看频率电压表
6.2 如何定频
6.3 如何查看当前频率
6.4 如何查看当前电压
6.5 如何单独调频调压
6.6 如何查看当前电压的档位
6.7 如何查看leakage
6.8 如何修改电压
4.1.5

4.1.5.1

1

概述

是内核开发者定义的⼀套⽀持根据指定的governor动态调整频率和电压的框架模型,它能有效地降
低的功耗,同时兼顾性能。Devfreq类似CPUFreq,不过CPUFreq只适⽤于CPU,devfreq⽤于除了CPU外,也需
要动态调频调压的模块。Devfreq framework由governor、core、driver、event组成,软件框架如下:
Devfreq

:⽤于升降频检测,决定频率。⽬前Linux4.4内核中包含了如下⼏种governor:
simple ondemand:根据负载动态调频。
userspace:提供相应接口供⽤⼾态应⽤程序调整频率。
powersave:功耗优先,始终将频率设置在最低值。
performance:性能优先,始终将频率设置为最⾼值。
dmc ondemand:simple ondemand的基础上,增加场景变频的⽀持,DDR变频专⽤。
Devfreq core: 对devfreq governors和devfreq driver进⾏了封装和抽象,并定义了清晰的接口。
Devfreq driver:⽤于初始化设备的频率电压表,设置具体设备的频率。
Devfreq event:⽤于监控设备的负载信息。
Devfreq governor

2

代码路径

Governor

相关代码:

调频策略 */
/* performance调频策略 */
/* powersave调频策略 */
/* userspace调频策略 */

drivers/devfreq/governor_simpleondemand.c

/* simple ondemand

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

/*

drivers/devfreq/event/rockchip-nocp.c

/*

⽤于监控DDR的读写cycle数 */
⽤于监控各个模块访问DDR的字节数 */

相关代码:

Core

drivers/devfreq/devfreq.c

相关代码:

Driver

调频策略和DMC driver */

drivers/devfreq/rockchip_dmc.c

/* dmc ondemand

drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c

/* GPU driver */

drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_devfreq.c /* GPU driver */
drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c

/* GPU driver */

drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c

/* GPU driver */

drivers/devfreq/rockchip_bus.c

/* bus driver */

drivers/soc/rockchip/rockchip_opp_select.c

/*

修改电压表相关接口 */

配置

3 Menuconfig
Device Drivers

--->

[*] Generic Dynamic Voltage and Frequency Scaling (DVFS) support

--->

--- Generic Dynamic Voltage and Frequency Scaling (DVFS) support
*** DEVFREQ Governors ***
-*-

Simple Ondemand

<*>

Performance

<*>

/* devfreq governor */

Powersave
*** DEVFREQ Drivers ***

<*>

ARM ROCKCHIP BUS DEVFREQ Driver

/* bus devfreq driver */

<*>

ARM ROCKCHIP DMC DEVFREQ Driver

/* dmc devfreq driver */

[*]

DEVFREQ-Event device Support

--->

--- DEVFREQ-Event device Support
-*-

ROCKCHIP DFI DEVFREQ event Driver

/* dfi event driver */

/* nocp event driver */
<*>

ROCKCHIP NoC (Network On Chip) Probe DEVFREQ event Driver

不同的平台可根据实际情况修改配置。

配置⽅法

4 Device Tree
4.1 GPU DVFS

配置

配置⽅法

4.1.1 Clock

根据平台的实际情况,在GPU节点下增加“clock”和“clock-names”属性,⼀般在DTSI⽂件中。Clock的详细配
置说明,请参考clock相关的开发⽂档。以RK3399为例:
gpu: gpu@ff9a0000 {
compatible = "arm,malit860",
"arm,malit86x",
"arm,malit8xx",
"arm,mali-midgard";
...
clocks = <&cru ACLK_GPU>;
clock-names = "clk_mali";
...
};

4.1.2 Regulator

配置

根据实际产品硬件使⽤的电源⽅案,在GPU节点下增加“mali-supply”属性,⼀般在板级DTS⽂件中。
Regulator的详细配置说明,请参考regulator和PMIC相关的开发⽂档。以RK3399为例:
&i2c0 {
...
vdd_gpu: syr828@41 {
compatible = "silergy,syr828";
reg = <0x41>;
vin-supply = <&vcc5v0_sys>;
regulator-compatible = "fan53555-reg";
pinctrl-0 = <&vsel2_gpio>;
vsel-gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>;
regulator-name = "vdd_gpu";
regulator-min-microvolt = <712500>;
regulator-max-microvolt = <1500000>;
regulator-ramp-delay = <1000>;
fcs,suspend-voltage-selector = <1>;
regulator-always-on;
regulator-boot-on;
regulator-initial-state = <3>;
regulator-state-mem {
regulator-off-in-suspend;
};
};
};
&gpu {
status = "okay";

mali-supply = <&vdd_gpu>;
};

配置

4.1.3 OPP Table

内核将频率、电压相关的配置放在了devicetree中,我们将这些配置信息组成的节点,称之为
OPP Table。OPP Table节点包含描述频率和电压的OPP节点、leaakge相关配置属性、PVTM相关配置属性等。
OPP的详细配置说明,可以参考如下⽂档:
Linux4.4

Documentation/devicetree/bindings/opp/opp.txt
Documentation/power/opp.txt

增加OPP Table
根据平台的实际情况,增加⼀个OPP Table节点,并在GPU节点下增加“operating-points-v2”属性,⼀般在
DTSI⽂件中。以RK3399为例:
4.1.3.1

&gpu {
operating-points-v2 = <&gpu_opp_table>;
};
gpu_opp_table: opp-table2 {
compatible = "operating-points-v2";
opp-200000000 {
opp-hz = /bits/ 64 <200000000>;
opp-microvolt = <800000>;

单位Hz */
/* 单位uV */

/*

};
...
opp-800000000 {
opp-hz = /bits/ 64 <800000000>;
opp-microvolt = <1100000>;
};
}

删除OPP
如果开发者需要删除某些频点,可以使⽤如下⽅法。
⽅法⼀:直接在对应OPP节点下增加“status = "disabeld";”,⽐如:

4.1.3.2

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

};
...

opp-hz = /bits/ 64 <200000000>;

/*

opp-microvolt = <800000>;

/*

单位Hz */
单位uV */

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

⽅法⼆:在板级DTSI中重新引⽤OPP Table节点,并在对应OPP节点下增加“status = "disabeld";”,⽐如:
&gpu_opp_table {
opp-800000000 {
status = "disabled";

;

}
};

4.1.4

根据leakage调整OPP Table

集成电路静⽌电流,指CMOS电路静态时从电源获取的电
流,我们也称之为leakage。GPU的leakage指给GPU提供特定的电压,测得的静态电流值,如果GPU在VD logic
下,GPU的leakage等同于logic的leakage,即给logic提供特定的电压,测得的静态电流值。在芯⽚⽣产过程中,
会将leakage写到eFuse或者OTP中。
4.1.4.1 根据leakage调整电压
背景:通过测试芯⽚的Vmin,发现相同频率下,小leakage的芯⽚Vmin⽐较⼤,⼤leakage的芯⽚Vmin⽐较
小,通过这⼀特性可以根据leakage值降低⼤leakage芯⽚的电压,以降低功耗和提⾼性能。
功能说明:从eFuse或OTP中获取该芯⽚的GPU leakage值,通过查表得到对应的档位,然后在每个OPP中选
择对应档位的电压,作为该频点的电压。
配置⽅法:⾸先需要增加eFuse或者OTP的⽀持,具体⽅法请参考eFuse和OTP的相关⽂档。然后在OPP
Table节点增加“rockchip,leakage-voltage-sel”、“nvmem-cells”和“nvmem-cell-names”三个属性,同时OPP节点
根据实际情况增加“opp-microvolt-”属性,这些配置⼀般都在DTSI⽂件中。以RK3328为例:
IDDQ(Integrated Circuit Quiescent Current)

gpu_opp_table: gpu-opp-table {
compatible = "operating-points-v2";
/*
*

从eFuse或OTP中获取GPU leakage值

*/
nvmem-cells = <&gpu_leakage>;
nvmem-cell-names = "gpu_leakage";
/*

值为1mA-10mA的芯⽚,使⽤opp-microvolt-L0指定的电压
* leakage值为11mA-254mA的芯⽚,使⽤opp-microvolt-L1指定的电压
* leakage
*
*

如果删除rockchip,leakage-voltage-sell属性或者leakage值不在该属性指定的范围内,

*

则使⽤opp-microvolt指定的电压。

*/
rockchip,leakage-voltage-sel = <
1

10

0

11

254

1

>;
opp-200000000 {
opp-hz = /bits/ 64 <200000000>;
opp-microvolt = <950000>;
opp-microvolt-L0 = <950000>;
opp-microvolt-L1 = <950000>;
};
...
opp-500000000 {
opp-hz = /bits/ 64 <500000000>;
opp-microvolt = <1150000>;
opp-microvolt-L0 = <1150000>;
opp-microvolt-L1 = <1100000>;
};
};

如需关闭该项功能,可以删除“rockchip,leakage-voltage-sel”属性,这时使⽤opp-microvolt指定的电压。
4.1.5

根据PVTM调整OPP Table

是⼀个位于GPU附近,能反应出不同芯⽚之间性能差异

GPU PVTM(Process-Voltage-Temperature Monitor)

的模块,它受⼯艺、电压、温度的影响。
4.1.5.1 根据PVTM调整电压
背景:通过测试芯⽚的Vmin,发现相同频率和电压下,PVTM值小的芯⽚Vmin⽐较⼤,PVTM值⼤的芯⽚
Vmin⽐较小,通过这⼀特性可以根据PVTM值降低⼤PVTM芯⽚的电压,以降低功耗和提⾼性能。
功能说明:在指定的电压和频率下获取PVTM值,并转换成参考温度下的PVTM值,然后查表得到对应的档
位,最后在每个OPP中选择对应档位的电压,作为该频点的电压。
配置⽅法:⾸先需要先增加PVTM的⽀持,具体⽅法请参考PVTM的相关⽂档。然后在OPP Table节点增加
“rockchip,pvtm-voltage-sel”、“rockchip,thermal-zone”和“rockchip,pvtm-”属性,多种⼯艺的情况还需要
增加“nvmem-cells”和“nvmem-cell-names”属性,OPP节点根据实际情况增加“opp-microvolt-”属性。这
些配置⼀般都在DTSI⽂件中。以RK3399为例:
gpu_opp_table: opp-table2 {
compatible = "operating-points-v2";
/*

值为0-121000的芯⽚,使⽤opp-microvolt-L0指定的电压;
* PVTM值为121001-125500的芯⽚,使⽤opp-microvolt-L1指定的电压;
* PVTM值为125501-128500的芯⽚,使⽤opp-microvolt-L2指定的电压;
* PVTM

值为128501-999999的芯⽚,使⽤opp-microvolt-L3指定的电压;

* PVTM
*
*
*

如果删除rockchip,pvtm-voltage-sel属性或者PVTM值不在该属性指定的范围内,
则使⽤opp-microvolt指定的电压。

*/
rockchip,pvtm-voltage-sel = <
0

121000

0

121001

125500

1

125501

128500

2

128501

999999

3

>;

获取PVTM值前,需要先设置GPU频率,单位Khz */
获取PVTM值前,需要先设置GPU电压,单位uV */
rockchip,pvtm-ch = <3 0>;
/* PVTM通道,格式<通道序号 sel的序号> */
rockchip,pvtm-sample-time = <1000>;
/* PVTM采样时间,单位us */
rockchip,pvtm-number = <10>;
/* PVTM采样个数 */
rockchip,pvtm-error = <1000>;
/* 允许采样数据之间的误差 */
rockchip,pvtm-ref-temp = <41>;
/* 参考温度 */
/* PVTM随温度变化的⽐例系数,格式 <小于参考温度的⽐例系数 ⼤于参考温度的⽐例系数> */
rockchip,pvtm-freq = <200000>;

/*

rockchip,pvtm-volt = <900000>;

/*

rockchip,pvtm-temp-prop = <46 12>;
rockchip,thermal-zone = "gpu-thermal";

/*

通过哪个thermal-zone获取温度 */

opp-200000000 {
opp-hz = /bits/ 64 <200000000>;
opp-microvolt = <800000>;
opp-microvolt-L0 = <800000>;
opp-microvolt-L1 = <800000>;
opp-microvolt-L2 = <800000>;
opp-microvolt-L3 = <800000>;
};
...
opp-800000000 {
opp-hz = /bits/ 64 <800000000>;
opp-microvolt = <1100000>;
opp-microvolt-L0 = <1100000>;
opp-microvolt-L1 = <1075000>;
opp-microvolt-L2 = <1050000>;
opp-microvolt-L3 = <1025000>;
};
};

如需关闭该项功能,可以删除“rockchip,pvtm-voltage-sel”属性,这时使⽤opp-microvolt指定的电压。
4.1.6

根据IR-Drop调整OPP Table

是指出现在集成电路中电源和地⽹络上电压下降或升⾼的⼀种现象。在这⾥我们理解为由于电源纹、
电路板布线等因素导致的压降。
背景:实测发现有些客⼾的板⼦电源纹波⽐较差,使⽤和EVB板相同的电压表,某些频点的电压偏低,导致系
统运⾏不稳定,这种情况需要根据IR-Drop调整调整OPP Ttable。
功能说明:将样机板每个频点的纹波减去EVB板的纹波,得到的差值就是该频点所需要增加的电压,如果最终
IR-Drop

电压超过了允许设置的最⾼电压,该频点将会被删除。
配置⽅法:需要在OPP Table节点增加“rockchip,max-volt ”、“rockchip,evb-irdrop”和
“rockchip,board-irdrop”属性,其中“rockchip,board-irdrop”⼀般在板级DTS⽂件中配置,其他在DTSI⽂件中配
置。以RK3326为例,DTSI中配置如下:
gpu_opp_table: gpu-opp-table {
compatible = "operating-points-v2";

允许设置的最⾼电压,单位uV */

/*

rockchip,max-volt = <1175000>;

板或者SDK板的电源纹波 */

rockchip,evb-irdrop = <25000>;/* EVB
...
}

板级DTS⽂件中配置如下:
&gpu_opp_table {
/*
* max IR-drop values on different freq condition for this board!
*/
/*
*

实际产品硬件,不同频率下的电源纹波情况:
,电源纹波为50000uV,最终电压会增加25000uV(50000-25000(EVB板纹波))

* 200Mhz-520MHz
*/

rockchip,board-irdrop = <
/* MHz

MHz uV */

200

520 50000

>;
};

如需关闭该项功能,可以删除“rockchip,board-irdrop”属性。
4.1.7

宽温配置

宽温通常指环境温度为-40~85℃。
背景:实测发现某些平台在低温环境下,运⾏不稳定,对某些频点抬压后可以稳定运⾏,这种情况需要根据
温度调整电压表。
功能说明:当系统检测到温度低于⼀定程度后,对各个频点进⾏抬压。
配置⽅法:在OPP Table节点增加“rockchip,temp-hysteresis”、“rockchip,low-temp“、
”rockchip,low-temp-min-volt“、“rockchip,low-temp-adjust-volt”、“rockchip,max-volt”属性。这些配置⼀般都在
DTSI⽂件中,以RK3399为例:
gpu_opp_table: opp-table2 {
compatible = "operating-points-v2";

/*

迟滞参数,单位millicelsius,防⽌频繁进⼊低温或者⾼温
* ⽐如小于0度进⼊低温,⼤于0+5度恢复常温,⼤于85度进⼊⾼温,低于85-5度恢复常温
*

*/
rockchip,temp-hysteresis = <5000>;
rockchip,low-temp = <0>;

/*

rockchip,low-temp-min-volt = <900000>;

/*

低温阀值,单位millicelsius*/
低温下最低电压,单位uV */

/*

低温下,0-800MHz内的频点,电压增加25mV */

/*

最⾼电压不超过该值 */

rockchip,low-temp-adjust-volt = <
/* MHz

MHz

uV */

0

800

25000

>;
rockchip,max-volt = <1150000>;
...
}

4.1.8

升降频负载配置

背景:Simple ondemand调频策略有两个参数可以配置upthreshold和downdifferential,默认值分别是90
和5。当负载超过90%时,调到最⾼频,当负载小于90%且⼤于90%-5%是维持当前频率,当负载小于90%-5%,会
调到⼀个频率,使得负载差不多为90%-5%/2。使⽤默认的配置,某些平台在某些场景下会出现GPU提频不及时或
不提频,导致丢帧,所以需要⽀持修改配置。
配置⽅法:在GPU节点增加“upthreshold”、downdifferential“属性,这些配置⼀般都在DTSI⽂件中,以
RK3288为例:
gpu: gpu@ffa30000 {
compatible = "arm,malit764",
"arm,malit76x",
"arm,malit7xx",
"arm,mali-midgard";
reg = <0x0 0xffa30000 0x0 0x10000>;
upthreshold = <75>;
downdifferential = <10>;
...
}

4.2 DMC DVFS

配置⽅法

(Dynamic Memory Controller) DVFS,即DDR变频。

DMC

配置

4.2.1 Clock

根据平台的实际情况,在DMC节点下增加“clock”属性,⼀般在DTSI⽂件中。Clock的详细配置说明,请参考
clock相关的开发⽂档。以RK3399为例:

dmc: dmc {
compatible = "rockchip,rk3399-dmc";
...
clocks = <&cru SCLK_DDRCLK>;
clock-names = "dmc_clk";
...
};

4.2.2 Regulator

配置

根据实际产品硬件使⽤的电源⽅案,在DMC节点下增加“center-supply”属性,⼀般在板级DTS⽂件中。
Regulator的详细配置说明,请参考regulator和PMIC相关的开发⽂档。以RK3399为例:
&i2c0 {
...
rk808: pmic@1b {
...
regulators {
vdd_center: DCDC_REG1 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <750000>;
regulator-max-microvolt = <1350000>;
regulator-ramp-delay = <6001>;
regulator-name = "vdd_center";
regulator-state-mem {
regulator-off-in-suspend;
};
};
};
};
};
&dmc {
status = "okay";
center-supply = <&vdd_center>;
};

配置

4.2.3 OPP Table

内核将频率、电压相关的配置放在了devicetree中,我们将这些配置信息组成的节点,称之为
OPP Table。OPP Table节点包含描述频率和电压的OPP节点、leaakge相关配置属性、PVTM相关配置属性等。
OPP的详细配置说明,可以参考如下⽂档:
Linux4.4

Documentation/devicetree/bindings/opp/opp.txt
Documentation/power/opp.txt

4.2.3.1

增加OPP Table

根据平台的实际情况,增加⼀个OPP Table节点,并在每个DMC节点下增加“operating-points-v2”属性,
⼀般在DTSI⽂件中。以RK3399为例:
&dmc {
operating-points-v2 = <&dmc_opp_table>;
};
dmc_opp_table: opp-table3 {
compatible = "operating-points-v2";
opp-200000000 {
opp-hz = /bits/ 64 <200000000>;
opp-microvolt = <900000>;

单位Hz */
/* 单位uV */

/*

};
...
opp-800000000 {
opp-hz = /bits/ 64 <800000000>;
opp-microvolt = <900000>;
};
};

删除OPP
如果开发者需要删除某些频点,可以使⽤如下⽅法。
⽅法⼀:直接在对应OPP节点下增加“status = "disabeld";”,⽐如:

4.2.3.2

dmc_opp_table: opp-table3 {
compatible = "operating-points-v2";
opp-200000000 {
opp-hz = /bits/ 64 <200000000>;

/*

opp-microvolt = <800000>;

/*

单位Hz */
单位uV */

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

⽅法⼆:在板级DTS中重新引⽤OPP Table节点,并在对应OPP节点下增加“status = "disabeld";”,⽐如:
&dmc_opp_table {
opp-800000000 {

;

}
};

status = "disabled";

4.2.4

根据leakage调整OPP Table

集成电路静⽌电流,指CMOS电路静态时从电源获取的电
流,我们也称之为leakage。DDR的leakage指给ddr提供特定的电压,测得的静态电流值,如果DDR在VD logic
下,DDR的leakage等同于logic的leakage,即给logic提供特定的电压,测得的静态电流值。在芯⽚⽣产过程中,
会将leakage写到eFuse或者OTP中。
4.2.4.1 根据leakage调整电压
背景:通过测试芯⽚的Vmin,发现相同频率下,小leakage的芯⽚Vmin⽐较⼤,⼤leakage的芯⽚Vmin⽐较
小,通过这⼀特性可以根据leakage值降低⼤leakage芯⽚的电压,以降低功耗和提⾼性能。
功能说明:从eFuse或OTP中获取该芯⽚的DDR leakage值,通过查表得到对应的档位,然后在每个OPP中选
择对应档位的电压,作为该频点的电压。
配置⽅法:⾸先需要增加eFuse或者OTP的⽀持,具体⽅法请参考eFuse和OTP的相关⽂档。然后在OPP
Table节点增加“rockchip,leakage-voltage-sel”、“nvmem-cells”和“nvmem-cell-names”三个属性,同时OPP节点
根据实际情况增加“opp-microvolt-”属性,这些配置⼀般都在DTSI⽂件中。以RK3328为例:
IDDQ(Integrated Circuit Quiescent Current)

dmc_opp_table: dmc-opp-table {
compatible = "operating-points-v2";
/*
*

从eFuse或OTP中获取DDR leakage值

*/
nvmem-cells = <&logic_leakage>;
nvmem-cell-names = "ddr_leakage";
/*

值为1mA-10mA的芯⽚,使⽤opp-microvolt-L0指定的电压
* leakage值为11mA-254mA的芯⽚,使⽤opp-microvolt-L1指定的电压
* leakage
*
*
*

如果删除rockchip,leakage-voltage-sell属性或者leakage值不在该属性指定的范围内,
则使⽤opp-microvolt指定的电压。

*/
rockchip,leakage-voltage-sel = <
1

10

0

11

254

1

>;
opp-400000000 {
opp-hz = /bits/ 64 <400000000>;
opp-microvolt = <950000>;
opp-microvolt-L0 = <950000>;
opp-microvolt-L1 = <950000>;
};
...
opp-1066000000 {
opp-hz = /bits/ 64 <1066000000>;

opp-microvolt = <1175000>;
opp-microvolt-L0 = <1175000>;
opp-microvolt-L1 = <1150000>;
};
};

如需关闭该项功能,可以删除“rockchip,leakage-voltage-sel”属性,这时使⽤opp-microvolt指定的电压。
4.2.5

根据PVTM调整OPP Table

根据PVTM调整电压
背景:通过测试芯⽚的Vmin,发现相同频率和电压下,PVTM值小的芯⽚Vmin⽐较⼤,PVTM值⼤的芯⽚
Vmin⽐较小,通过这⼀特性可以根据PVTM值降低⼤PVTM芯⽚的电压,以降低功耗和提⾼性能。
功能说明:在指定的电压和频率下获取PVTM值,并转换成参考温度下的PVTM值,然后查表得到对应的档
位,最后在每个OPP中选择对应档位的电压,作为该频点的电压。
配置⽅法:⾸先需要先增加PVTM的⽀持,具体⽅法请参考PVTM的相关⽂档。然后在OPP Table节点增加
“rockchip,pvtm-voltage-sel”、“rockchip,thermal-zone”和“rockchip,pvtm-”属性,多种⼯艺的情况还需要
增加“nvmem-cells”和“nvmem-cell-names”属性,OPP节点根据实际情况增加“opp-microvolt-”属性。这
些配置⼀般都在DTSI⽂件中。以PX30为例:
4.2.5.1

dmc_opp_table: dmc-opp-table {
compatible = "operating-points-v2";
/*

值为0-50000的芯⽚,使⽤opp-microvolt-L0指定的电压;
值为50001-54000的芯⽚,使⽤opp-microvolt-L1指定的电压;
* PVTM值为54001-60000的芯⽚,使⽤opp-microvolt-L2指定的电压;
* PVTM值为60001-99999的芯⽚,使⽤opp-microvolt-L3指定的电压;
* PVTM
* PVTM

*

如果删除rockchip,pvtm-voltage-sel属性或者PVTM值不在该属性指定的范围内,
* 则使⽤opp-microvolt指定的电压。
*

*/
rockchip,pvtm-voltage-sel = <
0

50000

0

50001

54000

1

54001

60000

2

60001

99999

3

>;
rockchip,pvtm-ch = <0 0>; /*

延⽤CPU的PVTM值 */

opp-194000000 {
opp-hz = /bits/ 64 <194000000>;
opp-microvolt = <950000>;
opp-microvolt-L0 = <950000>;
opp-microvolt-L1 = <950000>;
opp-microvolt-L2 = <950000>;
opp-microvolt-L3 = <950000>;

};
...
opp-786000000 {
opp-hz = /bits/ 64 <786000000>;
opp-microvolt = <1100000>;
opp-microvolt-L0 = <1100000>;
opp-microvolt-L1 = <1050000>;
opp-microvolt-L2 = <1025000>;
opp-microvolt-L3 = <1000000>;
status = "disabled";
};
};

如需关闭该项功能,可以删除“rockchip,pvtm-voltage-sel”属性,这时使⽤opp-microvolt指定的电压。
4.2.6

根据IR-Drop调整OPP Table

是指出现在集成电路中电源和地⽹络上电压下降或升⾼的⼀种现象。在这⾥我们理解为由于电源纹、
电路板布线等因素导致的压降。
背景:实测发现有些客⼾的板⼦电源纹波⽐较差,使⽤和EVB板相同的电压表,某些频点的电压偏低,导致系
统运⾏不稳定,这种情况需要根据IR-Drop调整调整OPP Table。
功能说明:将样机板每个频点的纹波减去EVB板的纹波,得到的差值就是该频点所需要增加的电压,如果最终
电压超过了允许设置的最⾼电压,该频点将会被删除。
配置⽅法:需要在OPP Table节点增加“rockchip,max-volt ”、“rockchip,evb-irdrop”和“rockchip,boardirdrop”属性,其中“rockchip,board-irdrop”⼀般在板级DTS⽂件中配置,其他在DTSI⽂件中配置。以RK3326为
例,DTSI中配置如下:
IR-Drop

dmc_opp_table: dmc-opp-table {
compatible = "operating-points-v2";
/*

允许设置的最⾼电压,单位uV */

rockchip,max-volt = <1150000>;

板或者SDK板的电源纹波 */

rockchip,evb-irdrop = <25000>;/* EVB
...
}

板级DTS⽂件中配置如下:

&dmc_opp_table {
/*
* max IR-drop values on different freq condition for this board!
*/
/*
*

实际产品硬件,不同频率下的电源纹波情况:
,电源纹波为75000uV,最终电压会增加50000uV(75000-25000(EVB板纹波))

* 451Mhz-800MHz
*/

rockchip,board-irdrop = <
/* MHz

MHz uV */

451

800 75000

>;
};

如需关闭该项功能,可以删除“rockchip,board-irdrop”属性。
4.2.7

场景变频配置

背景:如果DDR固定频率,频率⾼了,功耗⼤,频率低了,性能差,很难满⾜产品需求。针对某些对DDR的
需求⽐较明确的场景,⽐如跑分,视频,待机等,动态提⾼或者降低DDR频率,可以满⾜他们对性能或者功耗的
不同需求。
功能说明:当系统进⼊某些特殊的场景时,将DDR频率调整到该场景指定的频率,如果同时进⼊多个场景,
最终频率取最⼤值,需要注意的是在SYS_STATUS_DUALVIEW和SYS_STATUS_DUALVIEW场景下,不⽀持DDR变
频,所以进⼊这两个场景后,即使再进⼊更⾼DDR频率的场景,DDR频率依然不变,直达退出这两个场景。
配置⽅法:在DMC节点增加“system-status-freq ”属性,以RK3399为例:
&dmc {
status = "okay";
...
system-status-freq = <
/* system status

freq(KHz) */

SYS_STATUS_NORMAL

800000

SYS_STATUS_REBOOT

528000

SYS_STATUS_SUSPEND

200000

SYS_STATUS_VIDEO_1080P

200000

SYS_STATUS_VIDEO_4K

600000

SYS_STATUS_VIDEO_4K_10B 800000
SYS_STATUS_PERFORMANCE

800000

SYS_STATUS_BOOST

400000

SYS_STATUS_DUALVIEW

600000

SYS_STATUS_ISP

600000

除了以下定义的场景,其他场景都⽤该频率 */
场景,在reboot前设置DDR频率 */
/* ⼀级待机场景,灭屏后设置DDR频率 */
/* 1080视频场景,播放视频前设置DDR频率 */
/* 4k视频场景,播放视频前设置DDR频率 */
/* 4k 10bit视频场景,播放视频前设置DDR频率 */
/* 跑分场景,启动软件时前设置DDR频率 */
/* 触屏场景,需开启负载变频,触屏后修改DDR频率最小值 */
/* 双屏显⽰场景,第⼆个屏显⽰前固定DDR频率 */
/* 拍照场景,启动ISP前固定DDR频率 */
/*

/* reboot

>;
}

4.2.8

负载变频配置

背景:场景变频只能覆盖很少⼀部分场景,除此之外的场景需要根据DDR的利⽤率动态调整DDR频率,以优

化性能和功耗。
功能说明:定时检测DDR的利⽤率,根据simple ondeman的算法选择⼀个⽬标频率,并考虑特定场景对
DDR带宽的需求,最终选择⼀个最⼤值。需要注意的是,和场景变频⼀样,SYS_STATUS_DUALVIEW和
SYS_STATUS_ISP场景下DDR频率是固定的。
配置⽅法:在DMC节点增加“devfreq-events ”,“upthreshold”,“downdifferential”,
“system-status-freq”,“auto-min-freq”和“auto-freq-en”属性,以RK3399为例:
&dmc {
status = "okay";
...
devfreq-events = <&dfi>;

/*

通过dfi监控DDR的利⽤率 */

/*

调频阀值:
* 当利⽤率超过40%时,调到最⾼频,
* 当负载小于40%且⼤于40%-20%是维持当前频率
* 当负载小于40%-20%,会调到⼀个频率,使得负载差不多为40%-2%/2。
*

*/
upthreshold = <40>;
downdifferential = <20>;
system-status-freq = <
/* system status

freq(KHz) */

SYS_STATUS_NORMAL

800000

SYS_STATUS_REBOOT

528000

SYS_STATUS_SUSPEND

200000

SYS_STATUS_VIDEO_1080P

200000

SYS_STATUS_VIDEO_4K

600000

SYS_STATUS_VIDEO_4K_10B 800000

>;
/*

SYS_STATUS_PERFORMANCE

800000

SYS_STATUS_BOOST

400000

SYS_STATUS_DUALVIEW

600000

SYS_STATUS_ISP

600000

启动负载变频后,该场景⽆效 */
场景,在reboot前修改DDR频率的最低值 */
/* ⼀级待机场景,灭屏后修改DDR频率的最低值 */
/* 1080视频场景,播放视频前修改DDR频率的最低值 */
/* 4k视频场景,播放视频前修改DDR频率的最低值 */
/* 4k 10bit视频场景,播放视频前修改DDR频率的最低值 */
/* 跑分场景,启动软件时前修改DDR频率的最低值 */
/* 触屏场景,需开启负载变频,触屏后修改DDR频率最低值 */
/* 双屏显⽰场景,第⼆个屏显⽰前固定DDR的频率 */
/* 拍照场景,启动ISP前固定DDR的频率 */
/*

/* reboot

除了以上定义的场景,其他场景下DDR频率的最低值,防⽌提频不及时导致闪屏 */

auto-min-freq = <400000>;
auto-freq-en = <1>;

/*

负载变频开关,1为开启,0为关闭 */

};

4.2.9

根据VOP带宽变频

背景:开启负载变频后,需要增加“auto-min-freq”属性限制最低频率,防⽌某些场景下提频不及导致闪屏,
所以这些场景的功耗仍然有优化的空间,因此引⼊根据VOP带宽调整DDR频率。
功能说明:每⼀帧显⽰之前,VOP驱动先计算出这⼀帧的DDR带宽需求,然后根据带宽需求修改DDR频率的
最低值。
配置⽅法:在DMC节点增加"vop-bw-dmc-freq"属性,以RK3399为例:
&dmc {

status = "okay";
...
/*

带宽需求为0-577MB/s,DDR频率最低值为200MHz,
带宽需求为578-1701MB/s,DDR频率最低值为300MHz,
* VOP带宽需求为1702-99999MB/s,DDR频率最低值为400MHz,
* VOP
* VOP
*/

vop-bw-dmc-freq = <
/* min_bw(MB/s) max_bw(MB/s) freq(KHz) */
0

577

200000

578

1701

300000

1702

99999

400000

>;
/*
*
*

除了定义的场景,其他场景下DDR频率的最低值
加⼊VOP带宽统计后,可将该值改成⽐较低的频率。

*/
auto-min-freq = <200000>;
};

4.3 BUS DVFS

配置⽅法

除了GPU、DMC外,还有⼀些模块也需要动态调频调压,⽐如PLL、CCI等,我们将他们统⼀归类到BUS
DVFS。
4.3.1 PLL DVFS

配置

背景:在某些平台发现PLL的频率超过⼀定值后,PLL所在的电压域需要提⾼电压,因此需要根据PLL的频率调
整电压。
功能说明:通过注册clock notifier,监控PLL频率的变化,如果PLL是升频,先抬压再提频,如果PLL是降频,
先降频再降压。
配置⽅法:需要增加”rockchip,busfreq-policy“、”clocks“、”clock-names“、”operating-points-v2“和
“bus-supply”属性。
以PX30为例,DTSI⽂件配置如下:
bus_apll: bus-apll {
compatible = "rockchip,px30-bus";
/*
*
*

使⽤clkfreq调频调压策略,通过注册clock notifier,监控PLL频率的变化,
如果PLL是升频,先抬压再提频,如果PLL是降频,先降频再降压.

*/
rockchip,busfreq-policy = "clkfreq";
clocks = <&cru PLL_APLL>;
clock-names = "bus";

/*

时钟配置 */
配置 */

operating-points-v2 = <&bus_apll_opp_table>; /* OPP Table
status = "disabled";

};
bus_apll_opp_table: bus-apll-opp-table {
compatible = "operating-points-v2";
opp-shared;

频率小于等于1008MHz,电压950mV,⼤于1008MHz,电压1000mV */

/* PLL

opp-1512000000 {
opp-hz = /bits/ 64 <1512000000>;
opp-microvolt = <1000000>;
opp-1008000000 {
opp-hz = /bits/ 64 <1008000000>;
opp-microvolt = <950000>;
};
};

板级配置如下:
&i2c0 {
status = "okay";
rk809: pmic@20 {
compatible = "rockchip,rk809";
reg = <0x20>;
...
regulators {
vdd_logic: DCDC_REG1 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <950000>;
regulator-max-microvolt = <1350000>;
regulator-ramp-delay = <6001>;
regulator-initial-mode = <0x2>;
regulator-name = "vdd_logic";
regulator-state-mem {
regulator-on-in-suspend;
regulator-suspend-microvolt = <950000>;
};
};
}
}
}
&bus_apll {

配置,根据实际产品硬件使⽤的电源⽅案修改 */

bus-supply = <&vdd_logic>; /* regulator
status = "okay";
};

5

⽤⼾态接口介绍

设备成功注册devfreq后,会在/sys/class/devfreq/⽬录下⽣成⼀个包含⽤⼾态接口的⼦⽬录,⽐如

ff9a0000.gpu

,通过⽤⼾态接口可以切换governor,查看当前频率,修改频率等,具体如下:
系统⽀持的频率 */
系统⽀持的变频策略 */
/* 当前频率 */
/* 当前使⽤的变频策略 */
/* 当前负载 */
/* 软件上限制的最⾼频率 */
/* 软件上限制的最低频率 */
/* 检测负载的间隔时间 */
/* 软件上最后⼀次设置的频率 */
/* 每个频率上的变频次数和运⾏时间 */

available_frequencies

/*

available_governors

/*

cur_freq
governor
load
max_freq
min_freq
polling_interval
target_freq
trans_stat

6

常⻅问题

6.1

如何查看频率电压表

执⾏如下命令:

cat /sys/kernel/debug/opp/opp_summary

以PX30为例:
device

rate(Hz)

target(uV)

min(uV)

max(uV)

------------------------------------------------------------------platform-dmc
194000000

950000

950000

950000

328000000

950000

950000

950000

450000000

950000

950000

950000

528000000

975000

975000

975000

666000000

1000000

1000000

1000000

200000000

950000

950000

950000

300000000

950000

950000

950000

400000000

1025000

1025000

1025000

480000000

1100000

1100000

1100000

platform-ff400000.gpu

platform-bus-apll

6.2

1008000000

950000

950000

950000

1512000000

1000000

1000000

1000000

如何定频

⽅法⼀:将OPP Table中不想要的频率全部disable掉,只留⼀个想要的频率即可。以PX30为例,GPU定频
400MHz的配置如下:
gpu_opp_table: gpu-opp-table {

compatible = "operating-points-v2";
...
opp-200000000 {
opp-hz = /bits/ 64 <200000000>;
opp-microvolt = <950000>;
opp-microvolt-L0 = <950000>;
opp-microvolt-L1 = <950000>;
opp-microvolt-L2 = <950000>;
opp-microvolt-L3 = <950000>;
status = "disabled";
};
opp-300000000 {
opp-hz = /bits/ 64 <300000000>;
opp-microvolt = <975000>;
opp-microvolt-L0 = <975000>;
opp-microvolt-L1 = <950000>;
opp-microvolt-L2 = <950000>;
opp-microvolt-L3 = <950000>;
status = "disabled";
};
opp-400000000 {
opp-hz = /bits/ 64 <400000000>;
opp-microvolt = <1050000>;
opp-microvolt-L0 = <1050000>;
opp-microvolt-L1 = <1025000>;
opp-microvolt-L2 = <975000>;
opp-microvolt-L3 = <950000>;
};
opp-480000000 {
opp-hz = /bits/ 64 <480000000>;
opp-microvolt = <1125000>;
opp-microvolt-L0 = <1125000>;
opp-microvolt-L1 = <1100000>;
opp-microvolt-L2 = <1050000>;
opp-microvolt-L3 = <1000000>;
status = "disabled";
};
};

⽅法⼆:开机后通过命令定频。以PX30为例,GPU定频400MHz的命令如下:
/*

切换到userspace,不⼀定是ff400000.gpu,根据不同的平台修改 */

echo userspace > /sys/class/devfreq/ff400000.gpu/governor
/*

设置400MHz */

echo 400000000 > /sys/class/devfreq/ff400000.gpu/userspace/set_freq
/*

查看当前频率 */

cat /sys/class/devfreq/ff400000.gpu/cur_freq

6.3

如何查看当前频率

可以通过devfreq的⽤⼾接口和clock的debug接口两种⽅法查看频率。以PX30为例,查看GPU的频率,命

令如下:
/*

⽅法⼀:devfreq的⽤⼾态接口,不⼀定是ff400000.gpu,根据不同的平台修改 */

cat /sys/class/devfreq/ff400000.gpu/cur_freq
/*

⽅法⼆:clock debug接口,不⼀定是aclk_gpu,根据实际的clock配置修改 */

cat /sys/kernel/debug/clk/aclk_gpu/clk_rate

6.4

如何查看当前电压

可以通过regulator的debug接口查看电压。以PX30为例,查看GPU的电压,命令如下:
/*

不⼀定是vdd_logic,根据实际的regulator配置修改 */

cat /sys/kernel/debug/regulator/vdd_logic/voltage

6.5

如何单独调频调压

以PX30 GPU为例,设置频率为400MHz,电压1000mV。
/*

关闭⾃动变频,不⼀定是ff400000.gpu,根据不同的平台修改 */

echo userspace > /sys/class/devfreq/ff400000.gpu/governor
/*

调频,不⼀定是aclk_gpu,根据实际的clock配置修改 */

echo 400000000 > /sys/kernel/debug/clk/aclk_gpu/clk_rate
cat /sys/kernel/debug/clk/aclk_gpu/clk_rate
/*

调压,不⼀定是vdd_logic,根据实际的regulator配置修改 */

echo 1000000 > /sys/kernel/debug/regulator/vdd_logic/voltage
cat /sys/kernel/debug/regulator/vdd_logic/voltage

注意:升频的时候,先升压再升频;降频的时候,先降频再降压。
6.6

如何查看当前电压的档位

如果是通过PVTM调压,执⾏如下命令
dmesg | grep pvtm

以RK3399 GPU为例,会打印出如下信息:

[

0.669456] cpu cpu0: temp=22222, pvtm=138792 (140977 + -2185)

[

0.670601] cpu cpu0: pvtm-volt-sel=0

[

0.683008] cpu cpu4: temp=22222, pvtm=148761 (150110 + -1349)

[

0.683109] cpu cpu4: pvtm-volt-sel=0

[

1.495247] rockchip-dmc dmc: Failed to get pvtm

[

3.366028] mali ff9a0000.gpu: temp=22777, pvtm=120824 (121698 + -874)

,说明当前芯⽚GPU⽤的是opp-microvolt-L0对应的电压 */

/* pvtm-volt-sel=0
[

3.366915] mali ff9a0000.gpu: pvtm-volt-sel=0

同理如果是通过leakage调压,则执⾏如下命令,也有类似打印输出。
dmesg | grep leakage

6.7

如何查看leakage

执⾏如下命令

dmesg | grep leakage

以RK3399 GPU为例,会有如下打印:
[

0.656175] cpu cpu0: leakage=10

[

0.671092] cpu cpu4: leakage=20

[

1.492769] rockchip-dmc dmc: Failed to get leakage

,说明当前芯⽚GPU的leakage是15mA */

/* leakage=15
[

6.8

3.341084] mali ff9a0000.gpu: leakage=15

如何修改电压

⽅法⼀:直接修改电压表,以GPU 200MHz抬压25000uV为例。
假设默认200MHz的OPP节点如下:
opp-200000000 {
opp-hz = /bits/ 64 <200000000>;
opp-microvolt = <800000>;
opp-microvolt-L0 = <800000>;
opp-microvolt-L1 = <800000>;
opp-microvolt-L2 = <800000>;
opp-microvolt-L3 = <800000>;
};

修改后:

opp-200000000 {
opp-hz = /bits/ 64 <200000000>;

每个档位都要加25000uV */

/*

opp-microvolt = <825000>;
opp-microvolt-L0 = <825000>;
opp-microvolt-L1 = <825000>;
opp-microvolt-L2 = <825000>;
opp-microvolt-L3 = <825000>;
};

⽅法⼆:通过修改IR-Drop的配置,调整电压。以GPU 200MHz抬压25000uV为例。
假设IR-Drop默认配置如下:
&gpu_opp_table {
/*
* max IR-drop values on different freq condition for this board!
*/
/*
*

实际产品硬件,不同频率下的电源纹波情况:
,电源纹波为50000uV,最终电压会增加25000uV(50000-25000(EVB板纹波))

* 200Mhz-520MHz
*/

rockchip,board-irdrop = <
/* MHz

MHz uV */

200

520 50000

>;
};

修改后如下:
&gpu_opp_table {
/*
* max IR-drop values on different freq condition for this board!
*/
/*

实际产品硬件,不同频率下的电源纹波情况:
,电源纹波为75000uV,最终电压会增加50000uV(75000-25000(EVB板纹波))
* 300Mhz-520MHz,电源纹波为50000uV,最终电压会增加25000uV(50000-25000(EVB板纹波))
*

* 200Mhz-299MHz
*/

rockchip,board-irdrop = <

>;
};

/* MHz

MHz uV */

200

299 75000

300

520 50000

从之前的50000改成了75000 */

/* 200MHz-299MHz



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.4
Linearized                      : No
Creator                         : Typora
Producer                        : Typora
Create Date                     : 2018:12:11 14:26:21
Modify Date                     : 2018:12:11 14:26:21
Page Count                      : 25
Page Mode                       : UseOutlines
Warning                         : [Minor] Ignored duplicate Info dictionary
EXIF Metadata provided by EXIF.tools

Navigation menu