RE: [PATCH] ufs: core: Disable auto h8 before ssu

From: Avri Altman
Date: Wed Oct 12 2022 - 04:13:08 EST


> >
> > Dear Avri
> > Unisoc reports resume fail on UFS(micron FS164) during suspend/resume
> > test.
> > We check host inserts auto H8 enter/exit event between SSU sleep
> > command and H8 enter command in runtime suspend .
> > Asfollows: SSU Sleep command --> auto H8 enter --> auto H8 exit -->
> > H8 enter --> idle 2ms --> VCC off.
> > However device AQL FW can’t enter LPM within 2ms after second H8
> enter
> > command.
> > FW already enter LPM after receive auto H8 enter command , Next auto
> > H8 exit command will trigger FW exit from LPM, it need take over 10ms,
> and
> > FW can’t enter
> > LPM again after second H8 enter command until device complete exit
> from
> > LPM. So disable auto h8 before ssu is a reasonable solution to solve it.
> > Hynix also has similar request.
> Is this something common to all platforms?
> If not, and you need your platform to disable h8 before ssu,
> You can implement it in your own vop - see e.g.
> commit 9561f58442e4 (scsi: ufs: mediatek: Support vops pre suspend to
> disable auto-hibern8)
Maybe to further clarify, I am not saying that your suggestion doesn't make sense.
It's just that you need, IMHO, to make it part of ufshcd_vops_suspend, which I think
Its ufshcd_system_suspend for every platform.
And you need to get an ack on that from the other platform owners (maybe except
Stanley who is doing it already).

Btw, you are not checking the pm_op so your are disabling auto-h8 for runtime-suspend
As well.

And maybe elaborate the commit log with your explanation above - making it more clear.

Thanks,
Avri
>
> Thanks,
> Avri
>
> >
> > Avri Altman <Avri.Altman@xxxxxxx> 于2022年10月11日周二 15:07写道
>
> > >
> > > > From: Ten Gao <ten.gao@xxxxxxxxxx>
> > > >
> > > > Ensure auto h8 will not hit dme h8,and there won't be two h8 in a
> > > > row after ssu.
> > > I don't think the hw should do that.
> > > Can you please share on which platform/host controller did you observe
> > this?
> > >
> > > Thanks,
> > > Avri
> > > >
> > > > Signed-off-by: Ten Gao <ten.gao@xxxxxxxxxx>
> > > > ---
> > > > drivers/ufs/core/ufshcd.c | 10 ++++++++++
> > > > 1 file changed, 10 insertions(+)
> > > >
> > > > diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> > > > index
> > > > a202d7d5240d..42f93648d796 100644
> > > > --- a/drivers/ufs/core/ufshcd.c
> > > > +++ b/drivers/ufs/core/ufshcd.c
> > > > @@ -4256,6 +4256,14 @@ void ufshcd_auto_hibern8_update(struct
> > > > ufs_hba *hba, u32 ahit) }
> > > > EXPORT_SYMBOL_GPL(ufshcd_auto_hibern8_update);
> > > >
> > > > +void ufshcd_auto_hibern8_disable(struct ufs_hba *hba) {
> > > > + if (!ufshcd_is_auto_hibern8_supported(hba))
> > > > + return;
> > > > +
> > > > + ufshcd_writel(hba, 0, REG_AUTO_HIBERNATE_IDLE_TIMER); }
> > > > +
> > > > void ufshcd_auto_hibern8_enable(struct ufs_hba *hba) {
> > > > if (!ufshcd_is_auto_hibern8_supported(hba))
> > > > @@ -9036,6 +9044,8 @@ static int __ufshcd_wl_suspend(struct
> ufs_hba
> > > > *hba, enum ufs_pm_op pm_op)
> > > > if (ret)
> > > > goto enable_scaling;
> > > >
> > > > + ufshcd_auto_hibern8_disable(hba);
> > > > +
> > > > if (req_dev_pwr_mode != hba->curr_dev_pwr_mode) {
> > > > if (pm_op != UFS_RUNTIME_PM)
> > > > /* ensure that bkops is disabled */
> > > > --
> > > > 2.17.1
> > >