Re: [RFC] clk: meson: t7: Intermittent boot instability and memory corruption on VIM4
From: Chuan Liu
Date: Wed Aug 26 2026 - 23:04:48 EST
Hi Lucas,
I checked the board schematic and suspect that the stability issue is very likely caused by voltage drops resulting from disabling the PWM clocks.
On 8/27/2026 4:04 AM, Lucas Tanure wrote:
[ EXTERNAL EMAIL ]
On 26/08/2026 18:17, Brian Masney wrote:
Hi Lucas,
On Wed, Aug 26, 2026 at 05:42:01PM +0100, Lucas Tanure wrote:
With Brian's patches, VIM4 does not turn off 4 clocks:
t7_sys_sd_emmc_b
t7_sys_sd_emmc_c
sd_emmc_b
sd_emmc_c
This is expected since I'm trying to run from an SD card. However, even with
these four clocks kept enabled, the board still hangs.
Complete list with all clocks being disabled after Brians patches:
[ 1.002247] clk: Disabled unused clock: t7_sys_pwm_ao_gh
[ 1.002898] clk: Disabled unused clock: t7_sys_pwm_ao_ef
[ 1.003560] clk: Disabled unused clock: t7_sys_pwm_ao_cd
[ 1.004220] clk: Disabled unused clock: t7_sys_pwm_ao_ab
[ 1.004972] clk: Disabled unused clock: t7_sys_pwm_ef
[ 1.005509] clk: Disabled unused clock: t7_sys_pwm_cd
[ 1.006211] clk: Disabled unused clock: t7_sys_pwm_ab
[ 1.006766] clk: Disabled unused clock: t7_sys_ts_hevc
[ 1.007434] clk: Disabled unused clock: t7_sys_ts_vpu
[ 1.008033] clk: Disabled unused clock: t7_sys_ts_nna
[ 1.008741] clk: Disabled unused clock: t7_sys_ts_gpu
[ 1.009294] clk: Disabled unused clock: t7_sys_sar_adc
[ 1.009929] clk: Disabled unused clock: t7_sys_vpu_intr
[ 1.010609] clk: Disabled unused clock: t7_sys_dspb
[ 1.011186] clk: Disabled unused clock: t7_sys_dspa
[ 1.011792] clk: Disabled unused clock: t7_sys_a73pclk_apb
[ 1.012554] clk: Disabled unused clock: t7_sys_pclk_sys_apb
[ 1.013213] clk: Disabled unused clock: t7_sys_rsa
[ 1.013811] clk: Disabled unused clock: t7_sys_mipi_isp_pclk
[ 1.014529] clk: Disabled unused clock: t7_sys_mmc_apb
[ 1.015107] clk: Disabled unused clock: t7_sys_hdmirx_pclk
[ 1.015819] clk: Disabled unused clock: t7_sys_i2c_s_a
[ 1.016429] clk: Disabled unused clock: t7_sys_hdmitx_apb
[ 1.017109] clk: Disabled unused clock: t7_sys_i2c_m_f
[ 1.017740] clk: Disabled unused clock: t7_sys_i2c_m_e
[ 1.018379] clk: Disabled unused clock: t7_sys_i2c_m_d
[ 1.019018] clk: Disabled unused clock: t7_sys_i2c_m_c
[ 1.019657] clk: Disabled unused clock: t7_sys_i2c_m_b
[ 1.020296] clk: Disabled unused clock: t7_sys_i2c_m_a
[ 1.020940] clk: Disabled unused clock: t7_sys_i2c_ao_b
[ 1.021585] clk: Disabled unused clock: t7_sys_i2c_ao_a
[ 1.022236] clk: Disabled unused clock: t7_sys_pcie_phy
[ 1.022885] clk: Disabled unused clock: t7_sys_usb
[ 1.023482] clk: Disabled unused clock: t7_sys_pcie
[ 1.024088] clk: Disabled unused clock: t7_sys_spicc1
[ 1.024723] clk: Disabled unused clock: t7_sys_spicc0
[ 1.025345] clk: Disabled unused clock: t7_sys_g2d
[ 1.025940] clk: Disabled unused clock: t7_sys_spicc5
[ 1.026569] clk: Disabled unused clock: t7_sys_ts_a53
[ 1.027197] clk: Disabled unused clock: t7_sys_ts_a73
[ 1.027825] clk: Disabled unused clock: t7_sys_spicc4
[ 1.028454] clk: Disabled unused clock: t7_sys_spicc3
[ 1.029085] clk: Disabled unused clock: t7_sys_spicc2
[ 1.029710] clk: Disabled unused clock: t7_sys_aififo
[ 1.030339] clk: Disabled unused clock: t7_sys_uart_f
[ 1.030967] clk: Disabled unused clock: t7_sys_uart_e
[ 1.031595] clk: Disabled unused clock: t7_sys_uart_d
[ 1.032224] clk: Disabled unused clock: t7_sys_uart_c
[ 1.032857] clk: Disabled unused clock: t7_sys_uart_b
[ 1.033482] clk: Disabled unused clock: t7_sys_eth
[ 1.034077] clk: Disabled unused clock: t7_sys_audio
[ 1.034694] clk: Disabled unused clock: t7_sys_ir_ctrl
[ 1.035333] clk: Disabled unused clock: t7_sys_msr_clk
[ 1.035972] clk: Disabled unused clock: t7_sys_spifc
[ 1.036596] clk: Disabled unused clock: t7_sys_acodec
[ 1.037218] clk: Disabled unused clock: t7_sys_smartcard
[ 1.037880] clk: Disabled unused clock: t7_sys_am2axi2
[ 1.038518] clk: Disabled unused clock: t7_sys_am2axi1
[ 1.039157] clk: Disabled unused clock: t7_sys_am2axi0
[ 1.039796] clk: Disabled unused clock: t7_sys_ampipe_eth
[ 1.040468] clk: Disabled unused clock: t7_sys_ampipe_nand
[ 1.041155] clk: Disabled unused clock: t7_sys_deswarp
[ 1.041790] clk: Disabled unused clock: t7_sys_gdc
[ 1.042385] clk: Disabled unused clock: t7_sys_cec
[ 1.042981] clk: Disabled unused clock: t7_sys_aucpu
[ 1.043600] clk: Disabled unused clock: t7_sys_aocpu
[ 1.044217] clk: Disabled unused clock: t7_sys_mali
[ 1.044830] clk: Disabled unused clock: t7_sys_ethphy
[ 1.045451] clk: Disabled unused clock: t7_sys_mipi_dsi_b
[ 1.046123] clk: Disabled unused clock: t7_sys_mipi_dsi_a
[ 1.046795] clk: Disabled unused clock: t7_sys_dos
[ 1.047390] clk: Disabled unused clock: t7_sys_ddr
[ 1.047991] clk: Disabled unused clock: pwm_ao_g
This is the clock of the regulator that drives the VDDDDR.
[ 1.048565] clk: Disabled unused clock: pwm_ao_f
This is for VDDNPU
[ 1.049135] clk: Disabled unused clock: pwm_ao_e
This is for VDDGPU
[ 1.049709] clk: Disabled unused clock: pwm_ao_d
This is for VDDCPU_A (for A73)
[ 1.050283] clk: Disabled unused clock: pwm_ao_b
This is for VDDCPU_B (for A53)
[ 1.050857] clk: Disabled unused clock: pwm_ao_a
This is for VDDEE
These clocks must not be disabled, otherwise the voltage may drop and cause stability issues. You can try adding CLK_IGNORE_UNUSED to these clocks and see if it improves the situation (especially for pwm_ao_a/b/d)?
I checked the DTS and found that the pwm-regulator devices corresponding to the VDD* rails mentioned above are not supported yet. If support for these pwm-regulators is added in the DTS and the corresponding clocks are properly referenced, the stability issues you are seeing may be resolved.
yes> If so, you could add a log statement, then 1 second sleep in[ 1.051454] clk: Disabled unused clock: rtc_dualdiv
[ 1.052038] clk: Disabled unused clock: rtc_duandiv_in
Also with the patches the disable happens 0.5 second later, from 0.5 seconds
after the boot to 1 second after the boot.
I am still investigating what is missing a consumer or what should be
labeled critical.
I've seen cases where a clock is modeled in Linux, but isn't actually
used by Linux, so it gets caught in the disable unused clocks sweep.
Does the board immediately crash after the disable unused clock sweep?
clk_disable_unused_subtree() and wait for the board to crash.good idea , thanks
That's what I've been doing for the past few weeks, but I'm probably
If you can't get timely help from the vendor, then you can add
CLK_IGNORE_UNUSED to all of those clocks, and slowly start taking them
off in batches and wait for the crash.
hunting down a set of clock issues, as support for this board is still
in its early stages. It's a combination of clocks, which makes it way
more time-consuming.
I went with a more localized approach:
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 2b6fae54702a..3358f4dc871f 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -1489,14 +1489,95 @@ static void clk_unprepare_unused_subtree(struct
clk_core *core,
else if (core->ops->unprepare)
core->ops->unprepare(core->hw);
trace_clk_unprepare_complete(core);
+ pr_info("clk: V Unprepared unused clock: %s\n", core- >name);
}
}
+static const char * const disable_clocks[] = {
+ "t7_sys_pwm_ao_gh",
+ "t7_sys_pwm_ao_ef",
+ "t7_sys_pwm_ef",
+ "t7_sys_pwm_cd",
+ "t7_sys_pwm_ab",
+ "t7_sys_ts_hevc",
+ "t7_sys_ts_vpu",
+ "t7_sys_ts_nna",
+ "t7_sys_ts_gpu",
+ "t7_sys_sar_adc",
+ "t7_sys_vpu_intr",
+ "t7_sys_dspb",
+ "t7_sys_dspa",
+ "t7_sys_a73pclk_apb",
+ "t7_sys_pclk_sys_apb",
+ "t7_sys_rsa",
+ "t7_sys_mipi_isp_pclk",
+ "t7_sys_mmc_apb",
+ "t7_sys_hdmirx_pclk",
+ "t7_sys_i2c_s_a",
+ "t7_sys_hdmitx_apb",
+ "t7_sys_i2c_m_f",
+ "t7_sys_i2c_m_e",
+ "t7_sys_i2c_m_d",
+ "t7_sys_i2c_m_c",
+ "t7_sys_i2c_m_b",
+ "t7_sys_i2c_m_a",
+ "t7_sys_i2c_ao_b",
+ "t7_sys_i2c_ao_a",
+ "t7_sys_pcie_phy",
+ "t7_sys_usb",
+ "t7_sys_pcie",
+ "t7_sys_spicc1",
+ "t7_sys_spicc0",
+ "t7_sys_g2d",
+ "t7_sys_spicc5",
+ "t7_sys_ts_a53",
+ "t7_sys_ts_a73",
+ "t7_sys_spicc4",
+ "t7_sys_spicc3",
+ "t7_sys_spicc2",
+ "t7_sys_aififo",
+ "t7_sys_uart_f",
+ "t7_sys_uart_e",
+ "t7_sys_uart_d",
+ "t7_sys_uart_c",
+ "t7_sys_uart_b",
+ "t7_sys_eth",
+ "t7_sys_audio",
+ "t7_sys_ir_ctrl",
+ "t7_sys_msr_clk",
+ "t7_sys_spifc",
+ "t7_sys_acodec",
+ "t7_sys_smartcard",
+ "t7_sys_am2axi2",
+ "t7_sys_am2axi1",
+ "t7_sys_am2axi0",
+ "t7_sys_ampipe_eth",
+ "t7_sys_ampipe_nand",
+ "t7_sys_deswarp",
+ "t7_sys_gdc",
+ "t7_sys_cec",
+ "t7_sys_aucpu",
+ "t7_sys_aocpu",
+ "t7_sys_mali",
+ "t7_sys_ethphy",
+ "t7_sys_mipi_dsi_b",
+ "t7_sys_mipi_dsi_a",
+ "t7_sys_dos",
+ "t7_sys_ddr",
+ "pwm_ao_g",
+ "pwm_ao_e",
+ "pwm_ao_a",
+ "rtc_dualdiv",
+ "rtc_duandiv_in",
+};
+
+
static void clk_disable_unused_subtree(struct clk_core *core,
struct device *dev)
{
struct clk_core *child;
unsigned long flags;
+ int i;
lockdep_assert_held(&prepare_lock);
@@ -1517,6 +1598,11 @@ static void clk_disable_unused_subtree(struct
clk_core *core,
if (core->flags & CLK_IGNORE_UNUSED)
goto unlock_out;
+ for (i = 0; i < ARRAY_SIZE(disable_clocks); i++) {
+ if (strcmp(core->name, disable_clocks[i]) == 0)
+ goto unlock_out;
+ }
+
/*
* some gate clocks have special needs during the disable-unused
* sequence. call .disable_unused if available, otherwise fall
@@ -1529,6 +1615,7 @@ static void clk_disable_unused_subtree(struct
clk_core *core,
else if (core->ops->disable)
core->ops->disable(core->hw);
trace_clk_disable_complete(core);
+ pr_info("clk: V Disabled unused clock: %s\n", core->name);
}
This makes it easier to let the sweep disable clocks for testing.
Thanks
Brian
Lucas
_______________________________________________
linux-amlogic mailing list
linux-amlogic@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/linux-amlogic
--
Best regards,
Chuan