[RFC] clk: meson: t7: Intermittent boot instability and memory corruption on VIM4
Chuan Liu
chuan.liu at amlogic.com
Wed Aug 26 20:04:30 PDT 2026
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.
>>> [ 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?
> yes> If so, you could add a log statement, then 1 second sleep in
>> clk_disable_unused_subtree() and wait for the board to crash.
> good idea , thanks
>>
>> 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.
> That's what I've been doing for the past few weeks, but I'm probably
> 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.
>
>>
>> Brian
>>
> Thanks
> Lucas
>
>
> _______________________________________________
> linux-amlogic mailing list
> linux-amlogic at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-amlogic
--
Best regards,
Chuan
More information about the linux-amlogic
mailing list