On Fri, Jan 09, 2026 at 11:44:48AM +0100, Konrad Dybcio wrote: > On 1/9/26 9:38 AM, yuanjie yang wrote: > > From: Yuanjie Yang <[email protected]> > > > > During DPU runtime suspend, calling dev_pm_opp_set_rate(dev, 0) drops > > the MMCX rail to MIN_SVS while the core clock frequency remains at its > > original (highest) rate. When runtime resume re-enables the clock, this > > may result in a mismatch between the rail voltage and the clock rate. > > > > For example, in the DPU bind path, the sequence could be: > > cpu0: dev_sync_state -> rpmhpd_sync_state > > cpu1: dpu_kms_hw_init > > timeline 0 ------------------------------------------------> t > > > > After rpmhpd_sync_state, the voltage performance is no longer guaranteed > > to stay at the highest level. During dpu_kms_hw_init, calling > > dev_pm_opp_set_rate(dev, 0) drops the voltage, causing the MMCX rail to > > fall to MIN_SVS while the core clock is still at its maximum frequency. > > When the power is re-enabled, only the clock is enabled, leading to a > > situation where the MMCX rail is at MIN_SVS but the core clock is at its > > highest rate. In this state, the rail cannot sustain the clock rate, > > which may cause instability or system crash. > > So what this message essentially says is that dev_pm_opp_set_rate(dev, 0) > doesn't actually set the rate of "0" (or any other rate, unless opp-level > is at play), nor does it disable the clock. > > Seems like a couple of our drivers make this oversight.. > > I see that originally calling dev_pm_opp_set_rate(dev, 0) was forbidden, > up until Commit cd7ea582866f ("opp: Make dev_pm_opp_set_rate() handle freq > = 0 to drop performance votes").. > > In fact, > > $ rg 'dev_pm_opp_set_rate\(.*, 0\)' > > returns exclusively Qualcomm drivers where I believe the intention is always > to disable the clock.. perhaps we should just do that instead. We don't have > to worry about setting F_MIN beforehand, because a disabled clock won't be > eating up power and when enabling it back up, calling opp_set_rate with a > non-zero frequency will bring back the rails to a suitable level
Yes, calling opp_set_rate with a non-zero frequency will bring back the rails to a suitable level. The other steps are unnecessary. And here I just choose the highest freq, because I see dpu binding patch: dpu_kms_init(struct drm_device *ddev) use highest freq to do initialization. I want to keep it consistent with the previous initialization logic. Thanks, Yuanjie > > Konrad
