在遇到死机问题时,比较大的可能性是由于某个模块关闭了CLK或者PD,而软件驱动又去访问对应的模块寄存器,因此可以通过修改PD常开与CLK常开进行测试排查。PD、CLK常开也是遇到死机等问题的常用debug手段。以下说明一下如何打开。
1. 直接修改驱动代码
按照如下直接修改即可:
diff --git a/drivers/clk/clk-gate.c b/drivers/clk/clk-gate.c
index 573c9ac4c454..f0a94fcd341f 100644
--- a/drivers/clk/clk-gate.c
+++ b/drivers/clk/clk-gate.c
@@ -16,7 +16,7 @@
#include <linux/err.h>
#include <linux/string.h>
-static bool clk_always_on;
+static bool clk_always_on = 1;
module_param_named(always_on, clk_always_on, bool, 0644);
MODULE_PARM_DESC(always_on, "Always keep clks on except for system suspend.");
diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c
index d5cc4f05dcc5..e788458d308a 100644
--- a/drivers/soc/rockchip/pm_domains.c
+++ b/drivers/soc/rockchip/pm_domains.c
@@ -103,7 +103,7 @@ struct rockchip_pmu {
};
static struct rockchip_pmu *g_pmu;
-static bool pm_domain_always_on;
+static bool pm_domain_always_on = 1;
module_param_named(always_on, pm_domain_always_on, bool, 0644);
MODULE_PARM_DESC(always_on,
比较旧的代码可能没有上述标志位,可以直接按照如下修改:
diff --git a/drivers/clk/clk-gate.c b/drivers/clk/clk-gate.c
old mode 100644
new mode 100755
index 5a0d5b23a3bf..aa5da70d36b3
--- a/drivers/clk/clk-gate.c
+++ b/drivers/clk/clk-gate.c
@@ -46,6 +46,9 @@ static void clk_gate_endisable(struct clk_hw *hw, int enable)
unsigned long uninitialized_var(flags);
u32 reg;
+ if (enable == 0)
+ return 0;
+
set ^= enable;
if (gate->lock)
diff --git a/drivers/soc/rockchip/pm_domains.c
b/drivers/soc/rockchip/pm_domains.c
old mode 100644
new mode 100755
index 862bc3ee0331..ccb365226e79
--- a/drivers/soc/rockchip/pm_domains.c
+++ b/drivers/soc/rockchip/pm_domains.c
@@ -457,6 +457,9 @@ static int rockchip_pd_power(struct rockchip_pm_domain *pd,
bool power_on)
int ret = 0;
struct generic_pm_domain *genpd = &pd->genpd;
+ if (power_on == 0)
+ return 0;
+
rockchip_pmu_lock(pd);
if (rockchip_pmu_domain_is_on(pd) != power_on) {
2.DTS配置打开
可以在dts添加如下配置打开
diff --git a/arch/arm64/boot/dts/rockchip/rk3588-android.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-android.dtsi
index 9996bae70aba1..b97a086af5549 100644
--- a/arch/arm64/boot/dts/rockchip/rk3588-android.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3588-android.dtsi
@@ -6,7 +6,7 @@
/ {
chosen: chosen {
- bootargs = "earlycon=uart8250,mmio32,0xfeb50000 console=ttyFIQ0 irqchip.gicv3_pseudo_nmi=0";
+ bootargs = "earlycon=uart8250,mmio32,0xfeb50000 console=ttyFIQ0 irqchip.gicv3_pseudo_nmi=0 clk_gate.always_on=1 pm_domains.always_on=1";
};
3.使用命令方式打开
也可以使用设置节点的命令方式打开:
echo 1 > /sys/module/pm_domains/parameters/always_on
echo 1 > /sys/module/clk_gate/parameters/always_on