RK35xx cpu无法调频的可能原因

RK35xx cpu无法调频的可能原因

  • 1、开发环境
  • 2、问题描述
  • 3、问题解析
    • 3.1 收集log信息
    • 3.2 分析问题
  • 4、验证
  • 5、结论

1、开发环境

芯片型号:rk3568
kernel版本:linux4.19

2、问题描述

用户想动态调控CPU的频率,正常来说,在系统目录/sys/devices/system/cpu/cpu0/cpufreq/下是可以进行动态调频的;不正常的情况下就是没有/sys/devices/system/cpu/cpux/的目录。相当于CPU动态调整这部分在驱动加载过程中失败了。

3、问题解析

3.1 收集log信息

以下是kernel启动过程中截取相关错误的打印信息:

[    2.030053] cpu cpu0: leakage=26
[    2.030135] cpu cpu0: pvtm = 89290, from nvmem
[    2.030172] cpu cpu0: pvtm-volt-sel=1
[    2.030548] cpu cpu0: Looking up cpu-supply from device tree
[    2.030548] cpu cpu0: Looking up cpu-supply from device tree
[    2.030548] cpu cpu0: Looking up cpu-supply from device tree
[    2.030548] cpu cpu0: Looking up cpu-supply from device tree
[    2.030548] cpu cpu0: Looking up cpu-supply from device tree

正常情况下kernel过程中截取的打印信息
正常的打印信息:

[    2.076682] cpu cpu0: leakage=33
[    2.076763] cpu cpu0: pvtm = 90440, from nvmem
[    2.076799] cpu cpu0: pvtm-volt-sel=1
[    2.077177] cpu cpu0: Looking up cpu-supply from device tree
[    2.077766] cpu cpu0: Linked as a consumer to regulator.14
[    2.077861] cpu cpu0: Dropping the link to regulator.14
[    2.078029] cpu cpu0: Looking up cpu-supply from device tree
[    2.078617] cpu cpu0: Linked as a consumer to regulator.14
[    2.079749] cpu cpu0: avs=0
[    2.079879] cpu cpu0: l=0 h=2147483647 hyst=5000 l_limit=0 h_limit=0 h_table=0

从上述的两段打印信息可以看出,无法加载cpu调频的打印信息一直打印Looking up cpu-supply from device tree,初步怀疑是cpu-supply节点有问题。

3.2 分析问题

带着上面的怀疑点,查看对应设备树配置文件相关的内容信息,如下

&i2c0 {
	status = "okay";
	vdd_cpu: rk8600@40 {
	  compatible = "rockchip,rk8600";
	  reg = <0x40>;
	  vin-supply = <&vcc5v0_sys>;
	  regulator-compatible = "rk860x-reg";
	  regulator-name = "vdd_cpu";
	  regulator-min-microvolt = <712500>;
	  regulator-max-microvolt = <1390000>;
	  regulator-init-microvolt = <900000>;
	  regulator-ramp-delay = <2300>;
	  rockchip,suspend-voltage-selector = <1>;
	  regulator-boot-on;
	  regulator-always-on;
	  regulator-state-mem {
	  		regulator-off-in-suspend;
	  }
	};

&cpu0 {
	cpu-supply = <&vdd_cpu>;
};

检测了一遍,发现没有什么错误,接下来只好从驱动代码上去追查是哪里的问题了,相关代码追踪如下

#kernel/drivers/
rockchip_cpufreq_driver_init() (rockchip-cpufreq.c)
	rockchip_cpufreq_cluster_init()	(rockchip-cpufreq.c)	
		rockchip_get_scale_volt_sel() (rockchip_opp_select.c)
	dt_cpufreq_probe()	(cpufreq-dt.c)
		resources_available()	(cpufreq-dt.c)
			find_supply_name()	(cpufreq-dt.c)
			regulator_get_optional()	(regulator/core.c)
				_regulator_get()	(regulator/core.c)
				device_link_add() (base/core.c)				
	cpufreq_init() (cpufreq-dt.c)
		find_supply_name()	(cpufreq-dt.c)
			regulator_get_optional()	(regulator/core.c)
				_regulator_get()	(regulator/core.c)
				device_link_add()	 (base/core.c)
		rockchip_cpufreq_adjust_power_scale()	(rockchip-cpufreq.c)
			rockchip_adjust_power_scale()	(rockchip_opp_select.c)
vdd_cpu: tcs4525@1c {
		compatible = "tcs,tcs452x";
		reg = <0x1c>;
		vin-supply = <&vcc5v0_sys>;
		regulator-compatible = "fan53555-reg";
		regulator-name = "vdd_cpu";
		regulator-min-microvolt = <712500>;
		regulator-max-microvolt = <1390000>;
		regulator-ramp-delay = <2300>;
		fcs,suspend-voltage-selector = <1>;
		regulator-boot-on;
		regulator-always-on;
		regulator-state-mem {
			regulator-off-in-suspend;
		};
	};

追踪了一圈,又回到了cpu-supply的节点上,再通过追问硬件相关人员,才知道电源芯片更换了其他芯片了。
把设备树相关节点vdd_cpu节点改成现用的电源芯片型号,外加对应的驱动即可。

&i2c0 {
	status = "okay";
	vdd_cpu: tcs4525@1c {
		compatible = "tcs,tcs452x";
		reg = <0x1c>;
		vin-supply = <&vcc5v0_sys>;
		regulator-compatible = "fan53555-reg";
		regulator-name = "vdd_cpu";
		regulator-min-microvolt = <712500>;
		regulator-max-microvolt = <1390000>;
		regulator-ramp-delay = <2300>;
		fcs,suspend-voltage-selector = <1>;
		regulator-boot-on;
		regulator-always-on;
		regulator-state-mem {
			regulator-off-in-suspend;
		};
	};

&cpu0 {
	cpu-supply = <&vdd_cpu>;
};

内核配置文件rk3568_defconfig新增

CONFIG_REGULATOR_FAN53555=y

4、验证

输入以下指令可以查看CPU支持哪些频率。

# cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies
408000 600000 816000 1104000 1416000 1608000 1800000 1992000
//设置为用户模式,手动设置频率
# echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 
//设置为性能模式,默认为最高频率
# echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# cat /sys/kernel/debug/opp/opp_summary

5、结论

如果无法成功加载到电源芯片,电源芯片会输出默认值,只是无法调试频率而已。

你可能感兴趣的:(RK35xx cpu无法调频的可能原因)