diff mbox series

[2/3] scsi: ufs: Keep device power on only fWriteBoosterBufferFlushDuringHibernate == 1

Message ID 20201130181143.5739-3-huobean@gmail.com (mailing list archive)
State Superseded
Headers show
Series Three changes for UFS WriteBooster | expand

Commit Message

Bean Huo Nov. 30, 2020, 6:11 p.m. UTC
From: Bean Huo <beanhuo@micron.com>

Keep device power mode as active power mode and VCC supply only if
fWriteBoosterBufferFlushDuringHibernate setting 1 is successful.

Signed-off-by: Bean Huo <beanhuo@micron.com>
---
 drivers/scsi/ufs/ufs.h    |  2 ++
 drivers/scsi/ufs/ufshcd.c | 11 ++++++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)

Comments

Avri Altman Dec. 3, 2020, 7:27 a.m. UTC | #1
> 
> From: Bean Huo <beanhuo@micron.com>
> 
> Keep device power mode as active power mode and VCC supply only if
> fWriteBoosterBufferFlushDuringHibernate setting 1 is successful.
Why would it fail?
Since UFSHCD_CAP_WB_EN is toggled off on ufshcd_wb_probe If the device doesn't support wb,
The check ufshcd_is_wb_allowed should suffice, isn't it?

Thanks,
Avri
Bean Huo Dec. 3, 2020, 9:36 a.m. UTC | #2
On Thu, 2020-12-03 at 07:27 +0000, Avri Altman wrote:
> > 
> > From: Bean Huo <beanhuo@micron.com>
> > 
> > Keep device power mode as active power mode and VCC supply only if
> > fWriteBoosterBufferFlushDuringHibernate setting 1 is successful.
> 
Hi Avri
Thanks so much taking time reiew.

> Why would it fail?

During the reliability testing in harsh environments, such as:
EMS testing, in the high/low-temperature environment. The system would
reboot itself, there will be programming failure very likely.
If we assume failure will never hit, why we capture its result
following with dev_err(). If you keep using your phone in a harsh
environment, you will see this print message.

Of course, in a normal environment, the chance of failure likes you to
win a lottery, but the possibility still exists.

  
> Since UFSHCD_CAP_WB_EN is toggled off on ufshcd_wb_probe If the
> device doesn't support wb,
> The check ufshcd_is_wb_allowed should suffice, isn't it?
> 
Tot at all, UFSHCD_CAP_WB_EN only tells us if the platform supports WB,
doesn't tell us fWriteBoosterBufferFlushDuringHibernate status.

Thanks,
Bean
Bean Huo Dec. 3, 2020, 9:40 a.m. UTC | #3
On Thu, 2020-12-03 at 07:27 +0000, Avri Altman wrote:
> > 
> > From: Bean Huo <beanhuo@micron.com>
> > 
> > Keep device power mode as active power mode and VCC supply only if
> > fWriteBoosterBufferFlushDuringHibernate setting 1 is successful.

Hi Avri
Thanks so much taking time reiew.

> Why would it fail?

During the reliability testing in harsh environments, such as:
EMS testing, in the high/low-temperature environment. The system would
reboot itself, there will be programming failure very likely.
If we assume failure will never hit, why we capture its result
following with dev_err(). If you keep using your phone in a harsh
environment, you will see this print message.

Of course, in a normal environment, the chance of failure likes you to
win a lottery, but the possibility still exists.

  
> Since UFSHCD_CAP_WB_EN is toggled off on ufshcd_wb_probe If the
> device doesn't support wb,
> The check ufshcd_is_wb_allowed should suffice, isn't it?
> 

No, UFSHCD_CAP_WB_EN only tells us if the platform supports WB,
doesn't tell us fWriteBoosterBufferFlushDuringHibernate status.

Thanks,
Bean
Avri Altman Dec. 3, 2020, 10:46 a.m. UTC | #4
> 
> On Thu, 2020-12-03 at 07:27 +0000, Avri Altman wrote:
> > >
> > > From: Bean Huo <beanhuo@micron.com>
> > >
> > > Keep device power mode as active power mode and VCC supply only if
> > > fWriteBoosterBufferFlushDuringHibernate setting 1 is successful.
> 
> Hi Avri
> Thanks so much taking time reiew.
> 
> > Why would it fail?
> 
> During the reliability testing in harsh environments, such as:
> EMS testing, in the high/low-temperature environment. The system would
> reboot itself, there will be programming failure very likely.
> If we assume failure will never hit, why we capture its result
> following with dev_err(). If you keep using your phone in a harsh
> environment, you will see this print message.
> 
> Of course, in a normal environment, the chance of failure likes you to
> win a lottery, but the possibility still exists.
Exactly.
Hence we need-not any extra logic protecting device management command failures.

if reading the configuration pass correctly, and UFSHCD_CAP_WB_EN is set,
one should expect that any other functionality would work.

Otherwise, any non-standard behavior should be added with a quirk.

Thanks,
Avri
> 
> 
> > Since UFSHCD_CAP_WB_EN is toggled off on ufshcd_wb_probe If the
> > device doesn't support wb,
> > The check ufshcd_is_wb_allowed should suffice, isn't it?
> >
> 
> No, UFSHCD_CAP_WB_EN only tells us if the platform supports WB,
> doesn't tell us fWriteBoosterBufferFlushDuringHibernate status.
> 
> Thanks,
> Bean
>
Bean Huo Dec. 3, 2020, 11:45 a.m. UTC | #5
On Thu, 2020-12-03 at 10:46 +0000, Avri Altman wrote:
> > > > From: Bean Huo <beanhuo@micron.com>
> > > > 
> > > > Keep device power mode as active power mode and VCC supply only
> > > > if
> > > > fWriteBoosterBufferFlushDuringHibernate setting 1 is
> > > > successful.
> > 
> > Hi Avri
> > Thanks so much taking time reiew.
> > 
> > > Why would it fail?
> > 
> > During the reliability testing in harsh environments, such as:
> > EMS testing, in the high/low-temperature environment. The system
> > would
> > reboot itself, there will be programming failure very likely.
> > If we assume failure will never hit, why we capture its result
> > following with dev_err(). If you keep using your phone in a harsh
> > environment, you will see this print message.
> > 
> > Of course, in a normal environment, the chance of failure likes you
> > to
> > win a lottery, but the possibility still exists.
> 
> Exactly.

so, you agree the possiblity of failure  exists.

> Hence we need-not any extra logic protecting device management
> command failures.

what extra logic? 

> 
> if reading the configuration pass correctly, and UFSHCD_CAP_WB_EN is
> set,


UFSHCD_CAP_WB_EN set is DRAM level. still in the cache.

> one should expect that any other functionality would work.
> 
No,  The programming will consume more power than reading, the
later setting will more possbile fail than reading.

> Otherwise, any non-standard behavior should be added with a quirk.
> 

NO, this is not what is standard or non-standard. This is independent
of UFS device/controller. It is a software design. IMO, we didn't deal
with programming status that is a potential bug. If having to impose to
a component, do you think should be controller or device? Instead of
addin a quirk, I prefer dropping this patch.




> Thanks,
> Avri
> > 
> > 
> > > Since UFSHCD_CAP_WB_EN is toggled off on ufshcd_wb_probe If the
> > > device doesn't support wb,
> > > The check ufshcd_is_wb_allowed should suffice, isn't it?
> > > 
> > 
> > No, UFSHCD_CAP_WB_EN only tells us if the platform supports WB,
> > doesn't tell us fWriteBoosterBufferFlushDuringHibernate status.
> > 
> > Thanks,
> > Bean
Avri Altman Dec. 3, 2020, 12:15 p.m. UTC | #6
> On Thu, 2020-12-03 at 10:46 +0000, Avri Altman wrote:
> > > > > From: Bean Huo <beanhuo@micron.com>
> > > > >
> > > > > Keep device power mode as active power mode and VCC supply only
> > > > > if
> > > > > fWriteBoosterBufferFlushDuringHibernate setting 1 is
> > > > > successful.
> > >
> > > Hi Avri
> > > Thanks so much taking time reiew.
> > >
> > > > Why would it fail?
> > >
> > > During the reliability testing in harsh environments, such as:
> > > EMS testing, in the high/low-temperature environment. The system
> > > would
> > > reboot itself, there will be programming failure very likely.
> > > If we assume failure will never hit, why we capture its result
> > > following with dev_err(). If you keep using your phone in a harsh
> > > environment, you will see this print message.
> > >
> > > Of course, in a normal environment, the chance of failure likes you
> > > to
> > > win a lottery, but the possibility still exists.
> >
> > Exactly.
> 
> so, you agree the possiblity of failure  exists.
I was more relating to the lottery part.

> 
> > Hence we need-not any extra logic protecting device management
> > command failures.
> 
> what extra logic?
> 
> >
> > if reading the configuration pass correctly, and UFSHCD_CAP_WB_EN is
> > set,
> 
> 
> UFSHCD_CAP_WB_EN set is DRAM level. still in the cache.
> 
> > one should expect that any other functionality would work.
> >
> No,  The programming will consume more power than reading, the
> later setting will more possbile fail than reading.
> 
> > Otherwise, any non-standard behavior should be added with a quirk.
> >
> 
> NO, this is not what is standard or non-standard. This is independent
> of UFS device/controller. It is a software design. IMO, we didn't deal
> with programming status that is a potential bug. If having to impose to
> a component, do you think should be controller or device? Instead of
> addin a quirk, I prefer dropping this patch.
It seems you are adding some special treatment in case some device management command failed,
A vanishingly unlikely event but a one that has significant impact over power consumption.
If a device is not responding properly to some specific device management command,
It should be treated accordingly.

Thanks,
Avri

> 
> 
> 
> 
> > Thanks,
> > Avri
> > >
> > >
> > > > Since UFSHCD_CAP_WB_EN is toggled off on ufshcd_wb_probe If the
> > > > device doesn't support wb,
> > > > The check ufshcd_is_wb_allowed should suffice, isn't it?
> > > >
> > >
> > > No, UFSHCD_CAP_WB_EN only tells us if the platform supports WB,
> > > doesn't tell us fWriteBoosterBufferFlushDuringHibernate status.
> > >
> > > Thanks,
> > > Bean
Bean Huo Dec. 3, 2020, 12:31 p.m. UTC | #7
On Thu, 2020-12-03 at 12:15 +0000, Avri Altman wrote:
> > so, you agree the possiblity of failure  exists.
> 
> I was more relating to the lottery part.
It doesn't matter. even the possibility of winning a lottery is very
low, but still there is.
> > 
> > > Hence we need-not any extra logic protecting device management
> > > command failures.
> > 
> > what extra logic?
> > 
> > > 
> > > if reading the configuration pass correctly, and UFSHCD_CAP_WB_EN
> > > is
> > > set,
> > 
> > 
> > UFSHCD_CAP_WB_EN set is DRAM level. still in the cache.
> > 
> > > one should expect that any other functionality would work.
> > > 
> > 
> > No,  The programming will consume more power than reading, the
> > later setting will more possbile fail than reading.
> > 
> > > Otherwise, any non-standard behavior should be added with a
> > > quirk.
> > > 
> > 
> > NO, this is not what is standard or non-standard. This is
> > independent
> > of UFS device/controller. It is a software design. IMO, we didn't
> > deal
> > with programming status that is a potential bug. If having to
> > impose to
> > a component, do you think should be controller or device? Instead
> > of
> > addin a quirk, I prefer dropping this patch.
> 
> It seems you are adding some special treatment in case some device
> management command failed,
> A vanishingly unlikely event but a one that has significant impact
> over power consumption.

again, there is nothing with device. Obviously, you didn't do system
reliability testing in harsh environment. you don't believe this is WB
driver bug. I will send my next version patch with a fix-tag. even It
cannot merge. but I want to highlight it is a bug.

Thanks,
Bean
Can Guo Dec. 4, 2020, 3:26 a.m. UTC | #8
On 2020-12-01 02:11, Bean Huo wrote:
> From: Bean Huo <beanhuo@micron.com>
> 
> Keep device power mode as active power mode and VCC supply only if
> fWriteBoosterBufferFlushDuringHibernate setting 1 is successful.
> 
> Signed-off-by: Bean Huo <beanhuo@micron.com>
> ---
>  drivers/scsi/ufs/ufs.h    |  2 ++
>  drivers/scsi/ufs/ufshcd.c | 11 ++++++++++-
>  2 files changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/scsi/ufs/ufs.h b/drivers/scsi/ufs/ufs.h
> index d593edb48767..311d5f7a024d 100644
> --- a/drivers/scsi/ufs/ufs.h
> +++ b/drivers/scsi/ufs/ufs.h
> @@ -530,6 +530,8 @@ struct ufs_dev_info {
>  	bool f_power_on_wp_en;
>  	/* Keeps information if any of the LU is power on write protected */
>  	bool is_lu_power_on_wp;
> +	/* Indicates if flush WB buffer during hibern8 successfully enabled 
> */
> +	bool is_hibern8_wb_flush;
>  	/* Maximum number of general LU supported by the UFS device */
>  	u8 max_lu_supported;
>  	u8 wb_dedicated_lu;
> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> index 639ba9d1ccbb..eb7a2534b072 100644
> --- a/drivers/scsi/ufs/ufshcd.c
> +++ b/drivers/scsi/ufs/ufshcd.c
> @@ -285,10 +285,16 @@ static inline void ufshcd_wb_config(struct 
> ufs_hba *hba)
>  		dev_err(hba->dev, "%s: Enable WB failed: %d\n", __func__, ret);
>  	else
>  		dev_info(hba->dev, "%s: Write Booster Configured\n", __func__);
> +
>  	ret = ufshcd_wb_toggle_flush_during_h8(hba, true);
> -	if (ret)
> +	if (ret) {
>  		dev_err(hba->dev, "%s: En WB flush during H8: failed: %d\n",
>  			__func__, ret);
> +		hba->dev_info.is_hibern8_wb_flush = false;
> +	} else {
> +		hba->dev_info.is_hibern8_wb_flush = true;
> +	}
> +
>  	ufshcd_wb_toggle_flush(hba, true);
>  }
> 
> @@ -5440,6 +5446,9 @@ static bool ufshcd_wb_need_flush(struct ufs_hba 
> *hba)
> 
>  	if (!ufshcd_is_wb_allowed(hba))
>  		return false;
> +
> +	if (!hba->dev_info.is_hibern8_wb_flush)
> +		return false;

The check is in the wrong place - even if say
fWriteBoosterBufferFlushDuringHibernate is failed to be enabled,
ufshcd_wb_need_flush() still needs to reflect the fact that whether
the wb buffer needs to be flushed or not - it should not be decided
by the flag.

Thanks,

Can Guo.

>  	/*
>  	 * The ufs device needs the vcc to be ON to flush.
>  	 * With user-space reduction enabled, it's enough to enable flush
Bean Huo Dec. 4, 2020, 8:28 a.m. UTC | #9
On Fri, 2020-12-04 at 11:26 +0800, Can Guo wrote:
> > 
> >        if (!ufshcd_is_wb_allowed(hba))
> >                return false;
> > +
> > +     if (!hba->dev_info.is_hibern8_wb_flush)
> > +             return false;
> 
> The check is in the wrong place - even if say
> fWriteBoosterBufferFlushDuringHibernate is failed to be enabled,
> ufshcd_wb_need_flush() still needs to reflect the fact that whether
> the wb buffer needs to be flushed or not - it should not be decided
> by the flag.
> 
Can,
you are right, let me take it out from this function, and see if
acceptable.

Thanks,
Bean

> Thanks,
> 
> Can Guo.
diff mbox series

Patch

diff --git a/drivers/scsi/ufs/ufs.h b/drivers/scsi/ufs/ufs.h
index d593edb48767..311d5f7a024d 100644
--- a/drivers/scsi/ufs/ufs.h
+++ b/drivers/scsi/ufs/ufs.h
@@ -530,6 +530,8 @@  struct ufs_dev_info {
 	bool f_power_on_wp_en;
 	/* Keeps information if any of the LU is power on write protected */
 	bool is_lu_power_on_wp;
+	/* Indicates if flush WB buffer during hibern8 successfully enabled */
+	bool is_hibern8_wb_flush;
 	/* Maximum number of general LU supported by the UFS device */
 	u8 max_lu_supported;
 	u8 wb_dedicated_lu;
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 639ba9d1ccbb..eb7a2534b072 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -285,10 +285,16 @@  static inline void ufshcd_wb_config(struct ufs_hba *hba)
 		dev_err(hba->dev, "%s: Enable WB failed: %d\n", __func__, ret);
 	else
 		dev_info(hba->dev, "%s: Write Booster Configured\n", __func__);
+
 	ret = ufshcd_wb_toggle_flush_during_h8(hba, true);
-	if (ret)
+	if (ret) {
 		dev_err(hba->dev, "%s: En WB flush during H8: failed: %d\n",
 			__func__, ret);
+		hba->dev_info.is_hibern8_wb_flush = false;
+	} else {
+		hba->dev_info.is_hibern8_wb_flush = true;
+	}
+
 	ufshcd_wb_toggle_flush(hba, true);
 }
 
@@ -5440,6 +5446,9 @@  static bool ufshcd_wb_need_flush(struct ufs_hba *hba)
 
 	if (!ufshcd_is_wb_allowed(hba))
 		return false;
+
+	if (!hba->dev_info.is_hibern8_wb_flush)
+		return false;
 	/*
 	 * The ufs device needs the vcc to be ON to flush.
 	 * With user-space reduction enabled, it's enough to enable flush