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

From: Avri Altman
Date: Wed Oct 12 2022 - 02:29:02 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)

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
> >