public inbox for linux-mmc@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
  2016-09-01 14:24 [PATCH 0/3] mmc: Check BKOPS Level On Runtime Suspend alex lemberg
@ 2016-09-01 14:24 ` alex lemberg
  2016-10-13  7:36   ` Ulf Hansson
  0 siblings, 1 reply; 20+ messages in thread
From: alex lemberg @ 2016-09-01 14:24 UTC (permalink / raw)
  To: ulf.hansson, linux-mmc; +Cc: avi.shchislowski, alex lemberg

Rescheduling Suspend in case of BKOPS Level >= 1
in order to let eMMC device to complete its internal GC.
Applicable for Runtime Suspend Only.

Signed-off-by: alex lemberg <alex.lemberg@sandisk.com>
---
 drivers/mmc/core/mmc.c  | 30 +++++++++++++++++++++++-------
 include/linux/mmc/mmc.h |  1 +
 2 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index e2e987f..c4c6326 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1904,7 +1904,8 @@ static void mmc_detect(struct mmc_host *host)
 	}
 }
 
-static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
+static int _mmc_suspend(struct mmc_host *host, bool is_suspend,
+	bool is_runtime_pm)
 {
 	int err = 0;
 	unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT :
@@ -1918,10 +1919,25 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
 	if (mmc_card_suspended(host->card))
 		goto out;
 
-	if (mmc_card_doing_bkops(host->card)) {
-		err = mmc_stop_bkops(host->card);
-		if (err)
+	if (mmc_card_doing_bkops(host->card) ||
+		host->card->ext_csd.auto_bkops_en) {
+		err = mmc_read_bkops_status(host->card);
+		if (err) {
+			pr_err("%s: error %d reading BKOPS Status\n",
+				mmc_hostname(host), err);
+			goto out;
+		}
+		if (is_runtime_pm && host->card->ext_csd.raw_bkops_status >=
+				EXT_CSD_BKOPS_LEVEL_1) {
+			pm_schedule_suspend(&host->card->dev,
+				MMC_RUNTIME_SUSPEND_DELAY_MS);
 			goto out;
+		}
+		if (mmc_card_doing_bkops(host->card)) {
+			err = mmc_stop_bkops(host->card);
+			if (err)
+				goto out;
+		}
 	}
 
 	err = mmc_flush_cache(host->card);
@@ -1952,7 +1968,7 @@ static int mmc_suspend(struct mmc_host *host)
 {
 	int err;
 
-	err = _mmc_suspend(host, true);
+	err = _mmc_suspend(host, true, false);
 	if (!err) {
 		pm_runtime_disable(&host->card->dev);
 		pm_runtime_set_suspended(&host->card->dev);
@@ -2002,7 +2018,7 @@ static int mmc_shutdown(struct mmc_host *host)
 		err = _mmc_resume(host);
 
 	if (!err)
-		err = _mmc_suspend(host, false);
+		err = _mmc_suspend(host, false, false);
 
 	return err;
 }
@@ -2026,7 +2042,7 @@ static int mmc_runtime_suspend(struct mmc_host *host)
 	if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
 		return 0;
 
-	err = _mmc_suspend(host, true);
+	err = _mmc_suspend(host, true, true);
 	if (err)
 		pr_err("%s: error %d doing aggressive suspend\n",
 			mmc_hostname(host), err);
diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h
index 0fe3908..0f08d5c 100644
--- a/include/linux/mmc/mmc.h
+++ b/include/linux/mmc/mmc.h
@@ -430,6 +430,7 @@ struct _mmc_csd {
 /*
  * BKOPS status level
  */
+#define EXT_CSD_BKOPS_LEVEL_1		0x1
 #define EXT_CSD_BKOPS_LEVEL_2		0x2
 
 /*
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
  2016-09-01 14:24 ` [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend alex lemberg
@ 2016-10-13  7:36   ` Ulf Hansson
  2016-10-31  9:53     ` Alex Lemberg
  0 siblings, 1 reply; 20+ messages in thread
From: Ulf Hansson @ 2016-10-13  7:36 UTC (permalink / raw)
  To: alex lemberg; +Cc: linux-mmc, Avi Shchislowski

On 1 September 2016 at 16:24, alex lemberg <alex.lemberg@sandisk.com> wrote:
> Rescheduling Suspend in case of BKOPS Level >= 1
> in order to let eMMC device to complete its internal GC.
> Applicable for Runtime Suspend Only.
>
> Signed-off-by: alex lemberg <alex.lemberg@sandisk.com>
> ---
>  drivers/mmc/core/mmc.c  | 30 +++++++++++++++++++++++-------
>  include/linux/mmc/mmc.h |  1 +
>  2 files changed, 24 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
> index e2e987f..c4c6326 100644
> --- a/drivers/mmc/core/mmc.c
> +++ b/drivers/mmc/core/mmc.c
> @@ -1904,7 +1904,8 @@ static void mmc_detect(struct mmc_host *host)
>         }
>  }
>
> -static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
> +static int _mmc_suspend(struct mmc_host *host, bool is_suspend,
> +       bool is_runtime_pm)
>  {
>         int err = 0;
>         unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT :
> @@ -1918,10 +1919,25 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
>         if (mmc_card_suspended(host->card))
>                 goto out;
>
> -       if (mmc_card_doing_bkops(host->card)) {
> -               err = mmc_stop_bkops(host->card);
> -               if (err)
> +       if (mmc_card_doing_bkops(host->card) ||
> +               host->card->ext_csd.auto_bkops_en) {
> +               err = mmc_read_bkops_status(host->card);
> +               if (err) {
> +                       pr_err("%s: error %d reading BKOPS Status\n",
> +                               mmc_hostname(host), err);
> +                       goto out;
> +               }

I would appreciate some simple comment of what you want to do here below.

> +               if (is_runtime_pm && host->card->ext_csd.raw_bkops_status >=
> +                               EXT_CSD_BKOPS_LEVEL_1) {
> +                       pm_schedule_suspend(&host->card->dev,
> +                               MMC_RUNTIME_SUSPEND_DELAY_MS);
>                         goto out;

If I understand correctly, you would like to abort the runtime suspend
and allow the background operations to complete. That seems
reasonable, although in such case you need to return -EBUSY from this
function.
Moreover, perhaps we should discuss at what BKOPS_LEVEL* we should
allow to abort.

> +               }
> +               if (mmc_card_doing_bkops(host->card)) {
> +                       err = mmc_stop_bkops(host->card);
> +                       if (err)
> +                               goto out;
> +               }
>         }
>
>         err = mmc_flush_cache(host->card);
> @@ -1952,7 +1968,7 @@ static int mmc_suspend(struct mmc_host *host)
>  {
>         int err;
>
> -       err = _mmc_suspend(host, true);
> +       err = _mmc_suspend(host, true, false);
>         if (!err) {
>                 pm_runtime_disable(&host->card->dev);
>                 pm_runtime_set_suspended(&host->card->dev);
> @@ -2002,7 +2018,7 @@ static int mmc_shutdown(struct mmc_host *host)
>                 err = _mmc_resume(host);
>
>         if (!err)
> -               err = _mmc_suspend(host, false);
> +               err = _mmc_suspend(host, false, false);
>
>         return err;
>  }
> @@ -2026,7 +2042,7 @@ static int mmc_runtime_suspend(struct mmc_host *host)
>         if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
>                 return 0;
>
> -       err = _mmc_suspend(host, true);
> +       err = _mmc_suspend(host, true, true);
>         if (err)
>                 pr_err("%s: error %d doing aggressive suspend\n",
>                         mmc_hostname(host), err);
> diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h
> index 0fe3908..0f08d5c 100644
> --- a/include/linux/mmc/mmc.h
> +++ b/include/linux/mmc/mmc.h
> @@ -430,6 +430,7 @@ struct _mmc_csd {
>  /*
>   * BKOPS status level
>   */
> +#define EXT_CSD_BKOPS_LEVEL_1          0x1
>  #define EXT_CSD_BKOPS_LEVEL_2          0x2
>
>  /*
> --
> 1.9.1
>

Another idea I had, was to actually make use of that we know the card
will be inactive. So instead of checking if there is an ongoing BKOPS
(mmc_card_doing_bkops()), in case of the manual BKOPS, we could
potentially check the needed BKOPS LEVEL and schedule a BKOPS to
start. In other words, do manual BKOPS when the card is idle.

Of course, one need to be able to interrupt/cancel the BKOPS if there
is a new request that needs to be managed. I am not sure how we can
achieve that, but I hope you get the idea.

Kind regards
Uffe

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
  2016-10-13  7:36   ` Ulf Hansson
@ 2016-10-31  9:53     ` Alex Lemberg
  0 siblings, 0 replies; 20+ messages in thread
From: Alex Lemberg @ 2016-10-31  9:53 UTC (permalink / raw)
  To: Ulf Hansson; +Cc: linux-mmc, Avi Shchislowski

Hi Ulf,

Thank you for reviewing the patch!

On 10/13/16, 10:36 AM, "Ulf Hansson" <ulf.hansson@linaro.org> wrote:

>On 1 September 2016 at 16:24, alex lemberg <alex.lemberg@sandisk.com> wrote:
>> Rescheduling Suspend in case of BKOPS Level >= 1
>> in order to let eMMC device to complete its internal GC.
>> Applicable for Runtime Suspend Only.
>>
>> Signed-off-by: alex lemberg <alex.lemberg@sandisk.com>
>> ---
>>  drivers/mmc/core/mmc.c  | 30 +++++++++++++++++++++++-------
>>  include/linux/mmc/mmc.h |  1 +
>>  2 files changed, 24 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
>> index e2e987f..c4c6326 100644
>> --- a/drivers/mmc/core/mmc.c
>> +++ b/drivers/mmc/core/mmc.c
>> @@ -1904,7 +1904,8 @@ static void mmc_detect(struct mmc_host *host)
>>         }
>>  }
>>
>> -static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
>> +static int _mmc_suspend(struct mmc_host *host, bool is_suspend,
>> +       bool is_runtime_pm)
>>  {
>>         int err = 0;
>>         unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT :
>> @@ -1918,10 +1919,25 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
>>         if (mmc_card_suspended(host->card))
>>                 goto out;
>>
>> -       if (mmc_card_doing_bkops(host->card)) {
>> -               err = mmc_stop_bkops(host->card);
>> -               if (err)
>> +       if (mmc_card_doing_bkops(host->card) ||
>> +               host->card->ext_csd.auto_bkops_en) {
>> +               err = mmc_read_bkops_status(host->card);
>> +               if (err) {
>> +                       pr_err("%s: error %d reading BKOPS Status\n",
>> +                               mmc_hostname(host), err);
>> +                       goto out;
>> +               }
>
>I would appreciate some simple comment of what you want to do here below.
>
>> +               if (is_runtime_pm && host->card->ext_csd.raw_bkops_status >=
>> +                               EXT_CSD_BKOPS_LEVEL_1) {
>> +                       pm_schedule_suspend(&host->card->dev,
>> +                               MMC_RUNTIME_SUSPEND_DELAY_MS);
>>                         goto out;
>
>If I understand correctly, you would like to abort the runtime suspend
>and allow the background operations to complete. That seems
>reasonable, although in such case you need to return -EBUSY from this
>function.

In my mind I wanted to reschedule runtime suspend, but your recommendation
is makes sense. I will change it and re-submit.

>Moreover, perhaps we should discuss at what BKOPS_LEVEL* we should
>allow to abort.

Agree, the BKOPS_LEVEL value is something that can be interpreted differently
by different vendors.
Should I define a default value like “BKOPS_LEVEL_TO_USE”, and 
also maybe add a sysfs entry to allow user configuration? 

>
>> +               }
>> +               if (mmc_card_doing_bkops(host->card)) {
>> +                       err = mmc_stop_bkops(host->card);
>> +                       if (err)
>> +                               goto out;
>> +               }
>>         }
>>
>>         err = mmc_flush_cache(host->card);
>> @@ -1952,7 +1968,7 @@ static int mmc_suspend(struct mmc_host *host)
>>  {
>>         int err;
>>
>> -       err = _mmc_suspend(host, true);
>> +       err = _mmc_suspend(host, true, false);
>>         if (!err) {
>>                 pm_runtime_disable(&host->card->dev);
>>                 pm_runtime_set_suspended(&host->card->dev);
>> @@ -2002,7 +2018,7 @@ static int mmc_shutdown(struct mmc_host *host)
>>                 err = _mmc_resume(host);
>>
>>         if (!err)
>> -               err = _mmc_suspend(host, false);
>> +               err = _mmc_suspend(host, false, false);
>>
>>         return err;
>>  }
>> @@ -2026,7 +2042,7 @@ static int mmc_runtime_suspend(struct mmc_host *host)
>>         if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
>>                 return 0;
>>
>> -       err = _mmc_suspend(host, true);
>> +       err = _mmc_suspend(host, true, true);
>>         if (err)
>>                 pr_err("%s: error %d doing aggressive suspend\n",
>>                         mmc_hostname(host), err);
>> diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h
>> index 0fe3908..0f08d5c 100644
>> --- a/include/linux/mmc/mmc.h
>> +++ b/include/linux/mmc/mmc.h
>> @@ -430,6 +430,7 @@ struct _mmc_csd {
>>  /*
>>   * BKOPS status level
>>   */
>> +#define EXT_CSD_BKOPS_LEVEL_1          0x1
>>  #define EXT_CSD_BKOPS_LEVEL_2          0x2
>>
>>  /*
>> --
>> 1.9.1
>>
>
>Another idea I had, was to actually make use of that we know the card
>will be inactive. So instead of checking if there is an ongoing BKOPS
>(mmc_card_doing_bkops()), in case of the manual BKOPS, we could
>potentially check the needed BKOPS LEVEL and schedule a BKOPS to
>start. In other words, do manual BKOPS when the card is idle.

If I understand correctly, the idea is to allow MANUAL_ BKOPS in 
a similar way as it done for AUTO_BKOPS during runtime suspend, right?

>
>Of course, one need to be able to interrupt/cancel the BKOPS if there
>is a new request that needs to be managed. I am not sure how we can
>achieve that, but I hope you get the idea.

Right, in case of MANUAL_BKOPS, the need the HPI to be issued
in order to stop MANUAL_BKOPS immediately on a new request.
BTW, the same challenge we had on SLEEP_NOTIFICATION…

Since the AUTO_BKOPS is more simple case and doesn’t require 
the interruption ability from the driver, may I suggest to make it 
in a separate patchset?

>
>Kind regards
>Uffe


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 0/3] Auto BKOPS PM suspend
@ 2017-01-17 12:15 Uri Yanai
  2017-01-17 12:15 ` [PATCH 1/3] mmc: replacing hardcoded value for runtime " Uri Yanai
                   ` (3 more replies)
  0 siblings, 4 replies; 20+ messages in thread
From: Uri Yanai @ 2017-01-17 12:15 UTC (permalink / raw)
  To: ulf.hansson; +Cc: linux-mmc, chris, alex.lemberg, Uri Yanai

Hi Ulf
Resubmitting three patches for approval, originally submitted by Alex Lemberg <alex.lemberg@sandisk.com>
[1/3] mmc: replacing hardcoded value for runtime PM suspend  		Message ID:<1472739890-3384-2-git-send-email-alex.lemberg@sandisk.com>
[2/3] mmc: Adding AUTO_BKOPS_EN bit set for Auto BKOPS support		Message ID:<1472739890-3384-3-git-send-email-alex.lemberg@sandisk.com>
[3/3] mmc: Checking BKOPS status prior to Suspend 			Message ID:<1472739890-3384-4-git-send-email-alex.lemberg@sandisk.com>

Thanks
Uri Yanai

Uri Yanai (3):
  mmc: replacing hardcoded value for runtime PM suspend
  mmc: Adding AUTO_BKOPS_EN bit set for Auto BKOPS support
  mmc: Checking BKOPS status prior to Suspend

 drivers/mmc/core/block.c |  3 ++-
 drivers/mmc/core/mmc.c   | 45 ++++++++++++++++++++++++++++++++++++---------
 include/linux/mmc/card.h |  1 +
 include/linux/mmc/host.h |  2 ++
 include/linux/mmc/mmc.h  |  3 +++
 5 files changed, 44 insertions(+), 10 deletions(-)

-- 
1.9.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 1/3] mmc: replacing hardcoded value for runtime PM suspend
  2017-01-17 12:15 [PATCH 0/3] Auto BKOPS PM suspend Uri Yanai
@ 2017-01-17 12:15 ` Uri Yanai
  2017-01-17 12:15 ` [PATCH 2/3] mmc: Adding AUTO_BKOPS_EN bit set for Auto BKOPS support Uri Yanai
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 20+ messages in thread
From: Uri Yanai @ 2017-01-17 12:15 UTC (permalink / raw)
  To: ulf.hansson; +Cc: linux-mmc, chris, alex.lemberg, Uri Yanai

Adds define MMC_RUNTIME_SUSPEND_DELAY_MS for setting delay
time(in milliseconds) before entering device runtime suspend.
Setting the default to 3000 milliseconds.

Change-Id: Ifab084cc01d8dff8c79606f8de0858f0821e98bc
Signed-off-by: Uri Yanai <uri.yanai@sandisk.com>
Signed-off-by: Alex Lemberg <alex.lemberg@sandisk.com>
---
 drivers/mmc/core/block.c | 3 ++-
 include/linux/mmc/host.h | 2 ++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index 6648a17..7954f15 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -2202,7 +2202,8 @@ static int mmc_blk_probe(struct mmc_card *card)
 			goto out;
 	}
 
-	pm_runtime_set_autosuspend_delay(&card->dev, 3000);
+	pm_runtime_set_autosuspend_delay(&card->dev,
+			MMC_RUNTIME_SUSPEND_DELAY_MS);
 	pm_runtime_use_autosuspend(&card->dev);
 
 	/*
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 8bc8841..4a0b30f 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -22,6 +22,8 @@
 #include <linux/mmc/mmc.h>
 #include <linux/mmc/pm.h>
 
+#define MMC_RUNTIME_SUSPEND_DELAY_MS	3000
+
 struct mmc_ios {
 	unsigned int	clock;			/* clock rate */
 	unsigned short	vdd;
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 2/3] mmc: Adding AUTO_BKOPS_EN bit set for Auto BKOPS support
  2017-01-17 12:15 [PATCH 0/3] Auto BKOPS PM suspend Uri Yanai
  2017-01-17 12:15 ` [PATCH 1/3] mmc: replacing hardcoded value for runtime " Uri Yanai
@ 2017-01-17 12:15 ` Uri Yanai
  2017-01-17 12:15 ` [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend Uri Yanai
  2017-01-18  1:53 ` [PATCH 0/3] Auto BKOPS PM suspend Shawn Lin
  3 siblings, 0 replies; 20+ messages in thread
From: Uri Yanai @ 2017-01-17 12:15 UTC (permalink / raw)
  To: ulf.hansson; +Cc: linux-mmc, chris, alex.lemberg, Uri Yanai

Read from the device EXT_CSD and set to the card->ext_csd structure

Change-Id: I940b1612f5bac078c330ad3829d7aa5f0ba0989e
Signed-off-by: Uri Yanai <uri.yanai@sandisk.com>
Signed-off-by: Alex Lemberg <alex.lemberg@sandisk.com>
---
 drivers/mmc/core/mmc.c   | 10 ++++++++--
 include/linux/mmc/card.h |  1 +
 include/linux/mmc/mmc.h  |  1 +
 3 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index c0e2507..f70f6a1 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -530,8 +530,14 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd)
 						EXT_CSD_MANUAL_BKOPS_MASK);
 			card->ext_csd.raw_bkops_status =
 				ext_csd[EXT_CSD_BKOPS_STATUS];
-			if (!card->ext_csd.man_bkops_en)
-				pr_debug("%s: MAN_BKOPS_EN bit is not set\n",
+			if (card->ext_csd.man_bkops_en)
+				pr_debug("%s: MAN_BKOPS_EN bit is set\n",
+					mmc_hostname(card->host));
+			card->ext_csd.auto_bkops_en =
+					(ext_csd[EXT_CSD_BKOPS_EN] &
+						EXT_CSD_AUTO_BKOPS_MASK);
+			if (card->ext_csd.auto_bkops_en)
+				pr_debug("%s: AUTO_BKOPS_EN bit is set\n",
 					mmc_hostname(card->host));
 		}
 
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
index 00449e5..e3f1031 100644
--- a/include/linux/mmc/card.h
+++ b/include/linux/mmc/card.h
@@ -84,6 +84,7 @@ struct mmc_ext_csd {
 	unsigned int		hpi_cmd;		/* cmd used as HPI */
 	bool			bkops;		/* background support bit */
 	bool			man_bkops_en;	/* manual bkops enable bit */
+	bool			auto_bkops_en;	/* auto bkops enable bit */
 	unsigned int            data_sector_size;       /* 512 bytes or 4KB */
 	unsigned int            data_tag_unit_size;     /* DATA TAG UNIT size */
 	unsigned int		boot_ro_lock;		/* ro lock support */
diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h
index a074082..126b8d5 100644
--- a/include/linux/mmc/mmc.h
+++ b/include/linux/mmc/mmc.h
@@ -449,6 +449,7 @@ struct _mmc_csd {
  * BKOPS modes
  */
 #define EXT_CSD_MANUAL_BKOPS_MASK	0x01
+#define EXT_CSD_AUTO_BKOPS_MASK		0x02
 
 /*
  * Command Queue
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
  2017-01-17 12:15 [PATCH 0/3] Auto BKOPS PM suspend Uri Yanai
  2017-01-17 12:15 ` [PATCH 1/3] mmc: replacing hardcoded value for runtime " Uri Yanai
  2017-01-17 12:15 ` [PATCH 2/3] mmc: Adding AUTO_BKOPS_EN bit set for Auto BKOPS support Uri Yanai
@ 2017-01-17 12:15 ` Uri Yanai
  2017-01-18  1:59   ` Shawn Lin
  2017-01-20 11:56   ` Adrian Hunter
  2017-01-18  1:53 ` [PATCH 0/3] Auto BKOPS PM suspend Shawn Lin
  3 siblings, 2 replies; 20+ messages in thread
From: Uri Yanai @ 2017-01-17 12:15 UTC (permalink / raw)
  To: ulf.hansson; +Cc: linux-mmc, chris, alex.lemberg, Uri Yanai

If asked to do device Runtime Suspend while
in BKOPS and auto BKOPS is enabled return –EBUSY

Change-Id: Ie4b38a32fe98179f0bca5b57edaaa47a02d0a389
Signed-off-by: Uri Yanai <uri.yanai@sandisk.com>
Signed-off-by: Alex Lemberg <alex.lemberg@sandisk.com>
---
 drivers/mmc/core/mmc.c  | 35 ++++++++++++++++++++++++++++-------
 include/linux/mmc/mmc.h |  2 ++
 2 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index f70f6a1..21f5851 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1942,7 +1942,8 @@ static void mmc_detect(struct mmc_host *host)
 	}
 }
 
-static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
+static int _mmc_suspend(struct mmc_host *host, bool is_suspend,
+	bool is_runtime_pm)
 {
 	int err = 0;
 	unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT :
@@ -1953,10 +1954,30 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
 	if (mmc_card_suspended(host->card))
 		goto out;
 
-	if (mmc_card_doing_bkops(host->card)) {
-		err = mmc_stop_bkops(host->card);
-		if (err)
+	if (mmc_card_doing_bkops(host->card) ||
+		host->card->ext_csd.auto_bkops_en) {
+		err = mmc_read_bkops_status(host->card);
+		if (err) {
+			pr_err("%s: error %d reading BKOPS Status\n",
+				mmc_hostname(host), err);
 			goto out;
+		}
+		if (is_runtime_pm && host->card->ext_csd.raw_bkops_status >=
+				EXT_CSD_BKOPS_LEVEL_PM_SUSPEND) {
+			/*
+			 * We don’t allow Runtime Suspend while device still
+			 * needs time to complete internal BKOPS, returning
+			 * -EBUSY while BKOPS level is above
+			 *  EXT_CSD_BKOPS_LEVEL_PM_SUSPEND
+			 */
+			err = -EBUSY;
+			goto out;
+		}
+		if (mmc_card_doing_bkops(host->card)) {
+			err = mmc_stop_bkops(host->card);
+			if (err)
+				goto out;
+		}
 	}
 
 	err = mmc_flush_cache(host->card);
@@ -1987,7 +2008,7 @@ static int mmc_suspend(struct mmc_host *host)
 {
 	int err;
 
-	err = _mmc_suspend(host, true);
+	err = _mmc_suspend(host, true, false);
 	if (!err) {
 		pm_runtime_disable(&host->card->dev);
 		pm_runtime_set_suspended(&host->card->dev);
@@ -2034,7 +2055,7 @@ static int mmc_shutdown(struct mmc_host *host)
 		err = _mmc_resume(host);
 
 	if (!err)
-		err = _mmc_suspend(host, false);
+		err = _mmc_suspend(host, false, false);
 
 	return err;
 }
@@ -2058,7 +2079,7 @@ static int mmc_runtime_suspend(struct mmc_host *host)
 	if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
 		return 0;
 
-	err = _mmc_suspend(host, true);
+	err = _mmc_suspend(host, true, true);
 	if (err)
 		pr_err("%s: error %d doing aggressive suspend\n",
 			mmc_hostname(host), err);
diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h
index 126b8d5..2633274 100644
--- a/include/linux/mmc/mmc.h
+++ b/include/linux/mmc/mmc.h
@@ -445,6 +445,8 @@ struct _mmc_csd {
  */
 #define EXT_CSD_BKOPS_LEVEL_2		0x2
 
+#define EXT_CSD_BKOPS_LEVEL_PM_SUSPEND	EXT_CSD_BKOPS_LEVEL_2
+
 /*
  * BKOPS modes
  */
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH 0/3] Auto BKOPS PM suspend
  2017-01-17 12:15 [PATCH 0/3] Auto BKOPS PM suspend Uri Yanai
                   ` (2 preceding siblings ...)
  2017-01-17 12:15 ` [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend Uri Yanai
@ 2017-01-18  1:53 ` Shawn Lin
  2017-01-18 14:12   ` Uri Yanai
  3 siblings, 1 reply; 20+ messages in thread
From: Shawn Lin @ 2017-01-18  1:53 UTC (permalink / raw)
  To: Uri Yanai; +Cc: ulf.hansson, shawn.lin, linux-mmc, chris, alex.lemberg

Hi Uri,

On 2017/1/17 20:15, Uri Yanai wrote:
> Hi Ulf
> Resubmitting three patches for approval, originally submitted by Alex Lemberg <alex.lemberg@sandisk.com>
> [1/3] mmc: replacing hardcoded value for runtime PM suspend  		Message ID:<1472739890-3384-2-git-send-email-alex.lemberg@sandisk.com>
> [2/3] mmc: Adding AUTO_BKOPS_EN bit set for Auto BKOPS support		Message ID:<1472739890-3384-3-git-send-email-alex.lemberg@sandisk.com>
> [3/3] mmc: Checking BKOPS status prior to Suspend 			Message ID:<1472739890-3384-4-git-send-email-alex.lemberg@sandisk.com>
>
> Thanks
> Uri Yanai

Firstly, the authorship isn't correct and of course the SOB path.
Then, it'd better to add a changelog since you do improve Alex's
patches, and it would help us to better understand what was changed. :)

Also you should remove Change-Id when fetching patches from your
internal code review system.

Anyway, let's talk about the patches themself, I have
a question for your patch 3/3 there.


>
> Uri Yanai (3):
>   mmc: replacing hardcoded value for runtime PM suspend
>   mmc: Adding AUTO_BKOPS_EN bit set for Auto BKOPS support
>   mmc: Checking BKOPS status prior to Suspend
>
>  drivers/mmc/core/block.c |  3 ++-
>  drivers/mmc/core/mmc.c   | 45 ++++++++++++++++++++++++++++++++++++---------
>  include/linux/mmc/card.h |  1 +
>  include/linux/mmc/host.h |  2 ++
>  include/linux/mmc/mmc.h  |  3 +++
>  5 files changed, 44 insertions(+), 10 deletions(-)
>


-- 
Best Regards
Shawn Lin


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
  2017-01-17 12:15 ` [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend Uri Yanai
@ 2017-01-18  1:59   ` Shawn Lin
  2017-01-18 15:01     ` Uri Yanai
  2017-01-20 11:56   ` Adrian Hunter
  1 sibling, 1 reply; 20+ messages in thread
From: Shawn Lin @ 2017-01-18  1:59 UTC (permalink / raw)
  To: Uri Yanai, ulf.hansson; +Cc: shawn.lin, linux-mmc, chris, alex.lemberg

On 2017/1/17 20:15, Uri Yanai wrote:
> If asked to do device Runtime Suspend while
> in BKOPS and auto BKOPS is enabled return –EBUSY
>

The commit msg isn't correct as the code just return -EBUSY
when the level of BKOPS is EXT_CSD_BKOPS_LEVEL_PM_SUSPEND.

And how do you decide that EXT_CSD_BKOPS_LEVEL_2 should be used.
 From the spec, it means "performance being impacted". It would be
good to know a bit details inside the eMMC firmware.

BTW, should we use EXT_CSD_BKOPS_LEVEL_2 directly since it looks
more strightforward?


> Change-Id: Ie4b38a32fe98179f0bca5b57edaaa47a02d0a389
> Signed-off-by: Uri Yanai <uri.yanai@sandisk.com>
> Signed-off-by: Alex Lemberg <alex.lemberg@sandisk.com>
> ---
>  drivers/mmc/core/mmc.c  | 35 ++++++++++++++++++++++++++++-------
>  include/linux/mmc/mmc.h |  2 ++
>  2 files changed, 30 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
> index f70f6a1..21f5851 100644
> --- a/drivers/mmc/core/mmc.c
> +++ b/drivers/mmc/core/mmc.c
> @@ -1942,7 +1942,8 @@ static void mmc_detect(struct mmc_host *host)
>  	}
>  }
>
> -static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
> +static int _mmc_suspend(struct mmc_host *host, bool is_suspend,
> +	bool is_runtime_pm)
>  {
>  	int err = 0;
>  	unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT :
> @@ -1953,10 +1954,30 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
>  	if (mmc_card_suspended(host->card))
>  		goto out;
>
> -	if (mmc_card_doing_bkops(host->card)) {
> -		err = mmc_stop_bkops(host->card);
> -		if (err)
> +	if (mmc_card_doing_bkops(host->card) ||
> +		host->card->ext_csd.auto_bkops_en) {
> +		err = mmc_read_bkops_status(host->card);
> +		if (err) {
> +			pr_err("%s: error %d reading BKOPS Status\n",
> +				mmc_hostname(host), err);
>  			goto out;
> +		}
> +		if (is_runtime_pm && host->card->ext_csd.raw_bkops_status >=
> +				EXT_CSD_BKOPS_LEVEL_PM_SUSPEND) {
> +			/*
> +			 * We don’t allow Runtime Suspend while device still
> +			 * needs time to complete internal BKOPS, returning
> +			 * -EBUSY while BKOPS level is above
> +			 *  EXT_CSD_BKOPS_LEVEL_PM_SUSPEND
> +			 */
> +			err = -EBUSY;
> +			goto out;
> +		}
> +		if (mmc_card_doing_bkops(host->card)) {
> +			err = mmc_stop_bkops(host->card);
> +			if (err)
> +				goto out;
> +		}
>  	}
>
>  	err = mmc_flush_cache(host->card);
> @@ -1987,7 +2008,7 @@ static int mmc_suspend(struct mmc_host *host)
>  {
>  	int err;
>
> -	err = _mmc_suspend(host, true);
> +	err = _mmc_suspend(host, true, false);
>  	if (!err) {
>  		pm_runtime_disable(&host->card->dev);
>  		pm_runtime_set_suspended(&host->card->dev);
> @@ -2034,7 +2055,7 @@ static int mmc_shutdown(struct mmc_host *host)
>  		err = _mmc_resume(host);
>
>  	if (!err)
> -		err = _mmc_suspend(host, false);
> +		err = _mmc_suspend(host, false, false);
>
>  	return err;
>  }
> @@ -2058,7 +2079,7 @@ static int mmc_runtime_suspend(struct mmc_host *host)
>  	if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
>  		return 0;
>
> -	err = _mmc_suspend(host, true);
> +	err = _mmc_suspend(host, true, true);
>  	if (err)
>  		pr_err("%s: error %d doing aggressive suspend\n",
>  			mmc_hostname(host), err);
> diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h
> index 126b8d5..2633274 100644
> --- a/include/linux/mmc/mmc.h
> +++ b/include/linux/mmc/mmc.h
> @@ -445,6 +445,8 @@ struct _mmc_csd {
>   */
>  #define EXT_CSD_BKOPS_LEVEL_2		0x2
>
> +#define EXT_CSD_BKOPS_LEVEL_PM_SUSPEND	EXT_CSD_BKOPS_LEVEL_2
> +
>  /*
>   * BKOPS modes
>   */
>


-- 
Best Regards
Shawn Lin


^ permalink raw reply	[flat|nested] 20+ messages in thread

* RE: [PATCH 0/3] Auto BKOPS PM suspend
  2017-01-18  1:53 ` [PATCH 0/3] Auto BKOPS PM suspend Shawn Lin
@ 2017-01-18 14:12   ` Uri Yanai
  0 siblings, 0 replies; 20+ messages in thread
From: Uri Yanai @ 2017-01-18 14:12 UTC (permalink / raw)
  To: Shawn Lin; +Cc: ulf.hansson@linaro.org, linux-mmc@vger.kernel.org, Alex Lemberg

Hi Shawn

Thanks for the review, As you request I will add changelog and remove the Change-Id.
I am afraid I didn't quite understand your remark about authorship and  the SOB path, appreciate if you can elaborate on this.

Thanks
Uri

-----Original Message-----
From: Shawn Lin [mailto:shawn.lin@rock-chips.com] 
Sent: Wednesday, January 18, 2017 3:54 AM
To: Uri Yanai
Cc: ulf.hansson@linaro.org; shawn.lin@rock-chips.com; linux-mmc@vger.kernel.org; chris@printf.net; Alex Lemberg
Subject: Re: [PATCH 0/3] Auto BKOPS PM suspend

Hi Uri,

On 2017/1/17 20:15, Uri Yanai wrote:
> Hi Ulf
> Resubmitting three patches for approval, originally submitted by Alex Lemberg <alex.lemberg@sandisk.com>
> [1/3] mmc: replacing hardcoded value for runtime PM suspend  		Message ID:<1472739890-3384-2-git-send-email-alex.lemberg@sandisk.com>
> [2/3] mmc: Adding AUTO_BKOPS_EN bit set for Auto BKOPS support		Message ID:<1472739890-3384-3-git-send-email-alex.lemberg@sandisk.com>
> [3/3] mmc: Checking BKOPS status prior to Suspend 			Message ID:<1472739890-3384-4-git-send-email-alex.lemberg@sandisk.com>
>
> Thanks
> Uri Yanai

Firstly, the authorship isn't correct and of course the SOB path.
Then, it'd better to add a changelog since you do improve Alex's patches, and it would help us to better understand what was changed. :)

Also you should remove Change-Id when fetching patches from your internal code review system.

Anyway, let's talk about the patches themself, I have a question for your patch 3/3 there.


>
> Uri Yanai (3):
>   mmc: replacing hardcoded value for runtime PM suspend
>   mmc: Adding AUTO_BKOPS_EN bit set for Auto BKOPS support
>   mmc: Checking BKOPS status prior to Suspend
>
>  drivers/mmc/core/block.c |  3 ++-
>  drivers/mmc/core/mmc.c   | 45 ++++++++++++++++++++++++++++++++++++---------
>  include/linux/mmc/card.h |  1 +
>  include/linux/mmc/host.h |  2 ++
>  include/linux/mmc/mmc.h  |  3 +++
>  5 files changed, 44 insertions(+), 10 deletions(-)
>


--
Best Regards
Shawn Lin


^ permalink raw reply	[flat|nested] 20+ messages in thread

* RE: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
  2017-01-18  1:59   ` Shawn Lin
@ 2017-01-18 15:01     ` Uri Yanai
  0 siblings, 0 replies; 20+ messages in thread
From: Uri Yanai @ 2017-01-18 15:01 UTC (permalink / raw)
  To: Shawn Lin, ulf.hansson@linaro.org; +Cc: linux-mmc@vger.kernel.org, Alex Lemberg

Hi Shawn

Thanks for the review.
1. As you suggested replaced EXT_CSD_BKOPS_LEVEL_PM_SUSPEND  calling EXT_CSD_BKOPS_LEVEL_2 directly.
2. Returning  -EBUSY from the point I do in the code, stops the path to enter suspend( i.e. calling  mmc_power_off() and mmc_card_set_suspended())
Did I get this wrong ?

Thanks
Uri
-----Original Message-----
From: Shawn Lin [mailto:shawn.lin@rock-chips.com] 
Sent: Wednesday, January 18, 2017 4:00 AM
To: Uri Yanai; ulf.hansson@linaro.org
Cc: shawn.lin@rock-chips.com; linux-mmc@vger.kernel.org; chris@printf.net; Alex Lemberg
Subject: Re: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend

On 2017/1/17 20:15, Uri Yanai wrote:
> If asked to do device Runtime Suspend while in BKOPS and auto BKOPS is 
> enabled return –EBUSY
>

The commit msg isn't correct as the code just return -EBUSY when the level of BKOPS is EXT_CSD_BKOPS_LEVEL_PM_SUSPEND.

And how do you decide that EXT_CSD_BKOPS_LEVEL_2 should be used.
 From the spec, it means "performance being impacted". It would be good to know a bit details inside the eMMC firmware.

BTW, should we use EXT_CSD_BKOPS_LEVEL_2 directly since it looks more strightforward?


> Change-Id: Ie4b38a32fe98179f0bca5b57edaaa47a02d0a389
> Signed-off-by: Uri Yanai <uri.yanai@sandisk.com>
> Signed-off-by: Alex Lemberg <alex.lemberg@sandisk.com>
> ---
>  drivers/mmc/core/mmc.c  | 35 ++++++++++++++++++++++++++++-------
>  include/linux/mmc/mmc.h |  2 ++
>  2 files changed, 30 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 
> f70f6a1..21f5851 100644
> --- a/drivers/mmc/core/mmc.c
> +++ b/drivers/mmc/core/mmc.c
> @@ -1942,7 +1942,8 @@ static void mmc_detect(struct mmc_host *host)
>  	}
>  }
>
> -static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
> +static int _mmc_suspend(struct mmc_host *host, bool is_suspend,
> +	bool is_runtime_pm)
>  {
>  	int err = 0;
>  	unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT :
> @@ -1953,10 +1954,30 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
>  	if (mmc_card_suspended(host->card))
>  		goto out;
>
> -	if (mmc_card_doing_bkops(host->card)) {
> -		err = mmc_stop_bkops(host->card);
> -		if (err)
> +	if (mmc_card_doing_bkops(host->card) ||
> +		host->card->ext_csd.auto_bkops_en) {
> +		err = mmc_read_bkops_status(host->card);
> +		if (err) {
> +			pr_err("%s: error %d reading BKOPS Status\n",
> +				mmc_hostname(host), err);
>  			goto out;
> +		}
> +		if (is_runtime_pm && host->card->ext_csd.raw_bkops_status >=
> +				EXT_CSD_BKOPS_LEVEL_PM_SUSPEND) {
> +			/*
> +			 * We don’t allow Runtime Suspend while device still
> +			 * needs time to complete internal BKOPS, returning
> +			 * -EBUSY while BKOPS level is above
> +			 *  EXT_CSD_BKOPS_LEVEL_PM_SUSPEND
> +			 */
> +			err = -EBUSY;
> +			goto out;
> +		}
> +		if (mmc_card_doing_bkops(host->card)) {
> +			err = mmc_stop_bkops(host->card);
> +			if (err)
> +				goto out;
> +		}
>  	}
>
>  	err = mmc_flush_cache(host->card);
> @@ -1987,7 +2008,7 @@ static int mmc_suspend(struct mmc_host *host)  {
>  	int err;
>
> -	err = _mmc_suspend(host, true);
> +	err = _mmc_suspend(host, true, false);
>  	if (!err) {
>  		pm_runtime_disable(&host->card->dev);
>  		pm_runtime_set_suspended(&host->card->dev);
> @@ -2034,7 +2055,7 @@ static int mmc_shutdown(struct mmc_host *host)
>  		err = _mmc_resume(host);
>
>  	if (!err)
> -		err = _mmc_suspend(host, false);
> +		err = _mmc_suspend(host, false, false);
>
>  	return err;
>  }
> @@ -2058,7 +2079,7 @@ static int mmc_runtime_suspend(struct mmc_host *host)
>  	if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
>  		return 0;
>
> -	err = _mmc_suspend(host, true);
> +	err = _mmc_suspend(host, true, true);
>  	if (err)
>  		pr_err("%s: error %d doing aggressive suspend\n",
>  			mmc_hostname(host), err);
> diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index 
> 126b8d5..2633274 100644
> --- a/include/linux/mmc/mmc.h
> +++ b/include/linux/mmc/mmc.h
> @@ -445,6 +445,8 @@ struct _mmc_csd {
>   */
>  #define EXT_CSD_BKOPS_LEVEL_2		0x2
>
> +#define EXT_CSD_BKOPS_LEVEL_PM_SUSPEND	EXT_CSD_BKOPS_LEVEL_2
> +
>  /*
>   * BKOPS modes
>   */
>


--
Best Regards
Shawn Lin


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
  2017-01-17 12:15 ` [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend Uri Yanai
  2017-01-18  1:59   ` Shawn Lin
@ 2017-01-20 11:56   ` Adrian Hunter
  2017-01-22 15:55     ` Uri Yanai
  1 sibling, 1 reply; 20+ messages in thread
From: Adrian Hunter @ 2017-01-20 11:56 UTC (permalink / raw)
  To: Uri Yanai, ulf.hansson; +Cc: linux-mmc, chris, alex.lemberg

On 17/01/17 14:15, Uri Yanai wrote:
> If asked to do device Runtime Suspend while
> in BKOPS and auto BKOPS is enabled return –EBUSY

The spec also says

"Before moving to Sleep state hosts may set the POWER_OFF_NOTIFICATION byte
to SLEEP_NOTIFICATION (0x04) if aware that the device is capable of
autonomously initiating background operations for possible performance
improvements."

Have you considered that?

But I wonder if we shouldn't always use SLEEP_NOTIFICATION before sleep?

> 
> Change-Id: Ie4b38a32fe98179f0bca5b57edaaa47a02d0a389
> Signed-off-by: Uri Yanai <uri.yanai@sandisk.com>
> Signed-off-by: Alex Lemberg <alex.lemberg@sandisk.com>
> ---
>  drivers/mmc/core/mmc.c  | 35 ++++++++++++++++++++++++++++-------
>  include/linux/mmc/mmc.h |  2 ++
>  2 files changed, 30 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
> index f70f6a1..21f5851 100644
> --- a/drivers/mmc/core/mmc.c
> +++ b/drivers/mmc/core/mmc.c
> @@ -1942,7 +1942,8 @@ static void mmc_detect(struct mmc_host *host)
>  	}
>  }
>  
> -static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
> +static int _mmc_suspend(struct mmc_host *host, bool is_suspend,
> +	bool is_runtime_pm)
>  {
>  	int err = 0;
>  	unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT :
> @@ -1953,10 +1954,30 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
>  	if (mmc_card_suspended(host->card))
>  		goto out;
>  
> -	if (mmc_card_doing_bkops(host->card)) {
> -		err = mmc_stop_bkops(host->card);
> -		if (err)
> +	if (mmc_card_doing_bkops(host->card) ||
> +		host->card->ext_csd.auto_bkops_en) {
> +		err = mmc_read_bkops_status(host->card);
> +		if (err) {
> +			pr_err("%s: error %d reading BKOPS Status\n",
> +				mmc_hostname(host), err);
>  			goto out;
> +		}
> +		if (is_runtime_pm && host->card->ext_csd.raw_bkops_status >=
> +				EXT_CSD_BKOPS_LEVEL_PM_SUSPEND) {
> +			/*
> +			 * We don’t allow Runtime Suspend while device still
> +			 * needs time to complete internal BKOPS, returning
> +			 * -EBUSY while BKOPS level is above
> +			 *  EXT_CSD_BKOPS_LEVEL_PM_SUSPEND
> +			 */
> +			err = -EBUSY;
> +			goto out;
> +		}
> +		if (mmc_card_doing_bkops(host->card)) {
> +			err = mmc_stop_bkops(host->card);
> +			if (err)
> +				goto out;
> +		}
>  	}
>  
>  	err = mmc_flush_cache(host->card);
> @@ -1987,7 +2008,7 @@ static int mmc_suspend(struct mmc_host *host)
>  {
>  	int err;
>  
> -	err = _mmc_suspend(host, true);
> +	err = _mmc_suspend(host, true, false);
>  	if (!err) {
>  		pm_runtime_disable(&host->card->dev);
>  		pm_runtime_set_suspended(&host->card->dev);
> @@ -2034,7 +2055,7 @@ static int mmc_shutdown(struct mmc_host *host)
>  		err = _mmc_resume(host);
>  
>  	if (!err)
> -		err = _mmc_suspend(host, false);
> +		err = _mmc_suspend(host, false, false);
>  
>  	return err;
>  }
> @@ -2058,7 +2079,7 @@ static int mmc_runtime_suspend(struct mmc_host *host)
>  	if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
>  		return 0;
>  
> -	err = _mmc_suspend(host, true);
> +	err = _mmc_suspend(host, true, true);
>  	if (err)
>  		pr_err("%s: error %d doing aggressive suspend\n",
>  			mmc_hostname(host), err);
> diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h
> index 126b8d5..2633274 100644
> --- a/include/linux/mmc/mmc.h
> +++ b/include/linux/mmc/mmc.h
> @@ -445,6 +445,8 @@ struct _mmc_csd {
>   */
>  #define EXT_CSD_BKOPS_LEVEL_2		0x2
>  
> +#define EXT_CSD_BKOPS_LEVEL_PM_SUSPEND	EXT_CSD_BKOPS_LEVEL_2
> +
>  /*
>   * BKOPS modes
>   */
> 


^ permalink raw reply	[flat|nested] 20+ messages in thread

* RE: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
  2017-01-20 11:56   ` Adrian Hunter
@ 2017-01-22 15:55     ` Uri Yanai
  2017-01-23 17:07       ` Alex Lemberg
  0 siblings, 1 reply; 20+ messages in thread
From: Uri Yanai @ 2017-01-22 15:55 UTC (permalink / raw)
  To: Adrian Hunter, ulf.hansson@linaro.org
  Cc: linux-mmc@vger.kernel.org, Alex Lemberg

Hi Adrian

Thanks for your review.
Ulf rejected our approach in the first patch submission calling pm_schedule_suspend()

" If I understand correctly, you would like to abort the runtime suspend
and allow the background operations to complete. That seems
reasonable, although in such case you need to return -EBUSY from this
function."

If I understood Ulf correctly, instead of suspending he suggest aborting the suspend altogether returning -EBUSY.

If I understood you correctly, your approach is similar to the one taken in the first patch submission.
Instead of calling pm_schedule_suspend(), you suggest calling  mmc_poweroff_notify(host->card, SLEEP_NOTIFICATION).

Regards
Uri

-----Original Message-----
From: Adrian Hunter [mailto:adrian.hunter@intel.com] 
Sent: Friday, January 20, 2017 1:56 PM
To: Uri Yanai; ulf.hansson@linaro.org
Cc: linux-mmc@vger.kernel.org; chris@printf.net; Alex Lemberg
Subject: Re: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend

On 17/01/17 14:15, Uri Yanai wrote:
> If asked to do device Runtime Suspend while in BKOPS and auto BKOPS is 
> enabled return -EBUSY

The spec also says

"Before moving to Sleep state hosts may set the POWER_OFF_NOTIFICATION byte to SLEEP_NOTIFICATION (0x04) if aware that the device is capable of autonomously initiating background operations for possible performance improvements."

Have you considered that?

But I wonder if we shouldn't always use SLEEP_NOTIFICATION before sleep?

> 
> Change-Id: Ie4b38a32fe98179f0bca5b57edaaa47a02d0a389
> Signed-off-by: Uri Yanai <uri.yanai@sandisk.com>
> Signed-off-by: Alex Lemberg <alex.lemberg@sandisk.com>
> ---
>  drivers/mmc/core/mmc.c  | 35 ++++++++++++++++++++++++++++-------
>  include/linux/mmc/mmc.h |  2 ++
>  2 files changed, 30 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 
> f70f6a1..21f5851 100644
> --- a/drivers/mmc/core/mmc.c
> +++ b/drivers/mmc/core/mmc.c
> @@ -1942,7 +1942,8 @@ static void mmc_detect(struct mmc_host *host)
>  	}
>  }
>  
> -static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
> +static int _mmc_suspend(struct mmc_host *host, bool is_suspend,
> +	bool is_runtime_pm)
>  {
>  	int err = 0;
>  	unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT :
> @@ -1953,10 +1954,30 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
>  	if (mmc_card_suspended(host->card))
>  		goto out;
>  
> -	if (mmc_card_doing_bkops(host->card)) {
> -		err = mmc_stop_bkops(host->card);
> -		if (err)
> +	if (mmc_card_doing_bkops(host->card) ||
> +		host->card->ext_csd.auto_bkops_en) {
> +		err = mmc_read_bkops_status(host->card);
> +		if (err) {
> +			pr_err("%s: error %d reading BKOPS Status\n",
> +				mmc_hostname(host), err);
>  			goto out;
> +		}
> +		if (is_runtime_pm && host->card->ext_csd.raw_bkops_status >=
> +				EXT_CSD_BKOPS_LEVEL_PM_SUSPEND) {
> +			/*
> +			 * We don't allow Runtime Suspend while device still
> +			 * needs time to complete internal BKOPS, returning
> +			 * -EBUSY while BKOPS level is above
> +			 *  EXT_CSD_BKOPS_LEVEL_PM_SUSPEND
> +			 */
> +			err = -EBUSY;
> +			goto out;
> +		}
> +		if (mmc_card_doing_bkops(host->card)) {
> +			err = mmc_stop_bkops(host->card);
> +			if (err)
> +				goto out;
> +		}
>  	}
>  
>  	err = mmc_flush_cache(host->card);
> @@ -1987,7 +2008,7 @@ static int mmc_suspend(struct mmc_host *host)  {
>  	int err;
>  
> -	err = _mmc_suspend(host, true);
> +	err = _mmc_suspend(host, true, false);
>  	if (!err) {
>  		pm_runtime_disable(&host->card->dev);
>  		pm_runtime_set_suspended(&host->card->dev);
> @@ -2034,7 +2055,7 @@ static int mmc_shutdown(struct mmc_host *host)
>  		err = _mmc_resume(host);
>  
>  	if (!err)
> -		err = _mmc_suspend(host, false);
> +		err = _mmc_suspend(host, false, false);
>  
>  	return err;
>  }
> @@ -2058,7 +2079,7 @@ static int mmc_runtime_suspend(struct mmc_host *host)
>  	if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
>  		return 0;
>  
> -	err = _mmc_suspend(host, true);
> +	err = _mmc_suspend(host, true, true);
>  	if (err)
>  		pr_err("%s: error %d doing aggressive suspend\n",
>  			mmc_hostname(host), err);
> diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index 
> 126b8d5..2633274 100644
> --- a/include/linux/mmc/mmc.h
> +++ b/include/linux/mmc/mmc.h
> @@ -445,6 +445,8 @@ struct _mmc_csd {
>   */
>  #define EXT_CSD_BKOPS_LEVEL_2		0x2
>  
> +#define EXT_CSD_BKOPS_LEVEL_PM_SUSPEND	EXT_CSD_BKOPS_LEVEL_2
> +
>  /*
>   * BKOPS modes
>   */
> 


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
  2017-01-22 15:55     ` Uri Yanai
@ 2017-01-23 17:07       ` Alex Lemberg
  2017-01-24 14:36         ` Adrian Hunter
  0 siblings, 1 reply; 20+ messages in thread
From: Alex Lemberg @ 2017-01-23 17:07 UTC (permalink / raw)
  To: Uri Yanai, Adrian Hunter, ulf.hansson@linaro.org
  Cc: linux-mmc@vger.kernel.org

Hi Adrian,

I would like to add several notes on top of Uri’s answer...
I agree with you, by the spec, PON Sleep_Notification should be
set before calling Sleep command.
As you probably remember, we have tried to implement it
in the past and even submitted a patch – “[PATCH] mmc: sleep notification”
https://www.mail-archive.com/linux-mmc@vger.kernel.org/msg30906.html
As you can see from the thread, one of the main issues in Sleep_Notification
is a SLEEP_NOTIFICATION_TIME (defined in EXT_CSD [216]), which need to be
considered in implementation…
Thus, I think postponing Sleep during suspend requires a different from current
AUTO_BKOPS implementation, and I suggest to handle it in separate
patchset, if possible.


Thanks,
Alex

On 1/22/17, 5:55 PM, "Uri Yanai" <Uri.Yanai@sandisk.com> wrote:

    Hi Adrian
    
    Thanks for your review.
    Ulf rejected our approach in the first patch submission calling pm_schedule_suspend()
    
    " If I understand correctly, you would like to abort the runtime suspend
    and allow the background operations to complete. That seems
    reasonable, although in such case you need to return -EBUSY from this
    function."
    
    If I understood Ulf correctly, instead of suspending he suggest aborting the suspend altogether returning -EBUSY.
    
    If I understood you correctly, your approach is similar to the one taken in the first patch submission.
    Instead of calling pm_schedule_suspend(), you suggest calling  mmc_poweroff_notify(host->card, SLEEP_NOTIFICATION).
    
    Regards
    Uri
    
    -----Original Message-----
    From: Adrian Hunter [mailto:adrian.hunter@intel.com] 
    Sent: Friday, January 20, 2017 1:56 PM
    To: Uri Yanai; ulf.hansson@linaro.org
    Cc: linux-mmc@vger.kernel.org; chris@printf.net; Alex Lemberg
    Subject: Re: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
    
    On 17/01/17 14:15, Uri Yanai wrote:
    > If asked to do device Runtime Suspend while in BKOPS and auto BKOPS is 
    > enabled return –EBUSY
    
    The spec also says
    
    "Before moving to Sleep state hosts may set the POWER_OFF_NOTIFICATION byte to SLEEP_NOTIFICATION (0x04) if aware that the device is capable of autonomously initiating background operations for possible performance improvements."
    
    Have you considered that?
    
    But I wonder if we shouldn't always use SLEEP_NOTIFICATION before sleep?
    
    > 
    > Change-Id: Ie4b38a32fe98179f0bca5b57edaaa47a02d0a389
    > Signed-off-by: Uri Yanai <uri.yanai@sandisk.com>
    > Signed-off-by: Alex Lemberg <alex.lemberg@sandisk.com>
    > ---
    >  drivers/mmc/core/mmc.c  | 35 ++++++++++++++++++++++++++++-------
    >  include/linux/mmc/mmc.h |  2 ++
    >  2 files changed, 30 insertions(+), 7 deletions(-)
    > 
    > diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 
    > f70f6a1..21f5851 100644
    > --- a/drivers/mmc/core/mmc.c
    > +++ b/drivers/mmc/core/mmc.c
    > @@ -1942,7 +1942,8 @@ static void mmc_detect(struct mmc_host *host)
    >  	}
    >  }
    >  
    > -static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
    > +static int _mmc_suspend(struct mmc_host *host, bool is_suspend,
    > +	bool is_runtime_pm)
    >  {
    >  	int err = 0;
    >  	unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT :
    > @@ -1953,10 +1954,30 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
    >  	if (mmc_card_suspended(host->card))
    >  		goto out;
    >  
    > -	if (mmc_card_doing_bkops(host->card)) {
    > -		err = mmc_stop_bkops(host->card);
    > -		if (err)
    > +	if (mmc_card_doing_bkops(host->card) ||
    > +		host->card->ext_csd.auto_bkops_en) {
    > +		err = mmc_read_bkops_status(host->card);
    > +		if (err) {
    > +			pr_err("%s: error %d reading BKOPS Status\n",
    > +				mmc_hostname(host), err);
    >  			goto out;
    > +		}
    > +		if (is_runtime_pm && host->card->ext_csd.raw_bkops_status >=
    > +				EXT_CSD_BKOPS_LEVEL_PM_SUSPEND) {
    > +			/*
    > +			 * We don’t allow Runtime Suspend while device still
    > +			 * needs time to complete internal BKOPS, returning
    > +			 * -EBUSY while BKOPS level is above
    > +			 *  EXT_CSD_BKOPS_LEVEL_PM_SUSPEND
    > +			 */
    > +			err = -EBUSY;
    > +			goto out;
    > +		}
    > +		if (mmc_card_doing_bkops(host->card)) {
    > +			err = mmc_stop_bkops(host->card);
    > +			if (err)
    > +				goto out;
    > +		}
    >  	}
    >  
    >  	err = mmc_flush_cache(host->card);
    > @@ -1987,7 +2008,7 @@ static int mmc_suspend(struct mmc_host *host)  {
    >  	int err;
    >  
    > -	err = _mmc_suspend(host, true);
    > +	err = _mmc_suspend(host, true, false);
    >  	if (!err) {
    >  		pm_runtime_disable(&host->card->dev);
    >  		pm_runtime_set_suspended(&host->card->dev);
    > @@ -2034,7 +2055,7 @@ static int mmc_shutdown(struct mmc_host *host)
    >  		err = _mmc_resume(host);
    >  
    >  	if (!err)
    > -		err = _mmc_suspend(host, false);
    > +		err = _mmc_suspend(host, false, false);
    >  
    >  	return err;
    >  }
    > @@ -2058,7 +2079,7 @@ static int mmc_runtime_suspend(struct mmc_host *host)
    >  	if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
    >  		return 0;
    >  
    > -	err = _mmc_suspend(host, true);
    > +	err = _mmc_suspend(host, true, true);
    >  	if (err)
    >  		pr_err("%s: error %d doing aggressive suspend\n",
    >  			mmc_hostname(host), err);
    > diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index 
    > 126b8d5..2633274 100644
    > --- a/include/linux/mmc/mmc.h
    > +++ b/include/linux/mmc/mmc.h
    > @@ -445,6 +445,8 @@ struct _mmc_csd {
    >   */
    >  #define EXT_CSD_BKOPS_LEVEL_2		0x2
    >  
    > +#define EXT_CSD_BKOPS_LEVEL_PM_SUSPEND	EXT_CSD_BKOPS_LEVEL_2
    > +
    >  /*
    >   * BKOPS modes
    >   */
    > 
    
    


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
  2017-01-23 17:07       ` Alex Lemberg
@ 2017-01-24 14:36         ` Adrian Hunter
  2017-01-25  9:48           ` Alex Lemberg
  0 siblings, 1 reply; 20+ messages in thread
From: Adrian Hunter @ 2017-01-24 14:36 UTC (permalink / raw)
  To: Alex Lemberg, Uri Yanai, ulf.hansson@linaro.org; +Cc: linux-mmc@vger.kernel.org

On 23/01/17 19:07, Alex Lemberg wrote:
> Hi Adrian,
> 
> I would like to add several notes on top of Uri’s answer...
> I agree with you, by the spec, PON Sleep_Notification should be
> set before calling Sleep command.
> As you probably remember, we have tried to implement it
> in the past and even submitted a patch – “[PATCH] mmc: sleep notification”
> https://www.mail-archive.com/linux-mmc@vger.kernel.org/msg30906.html
> As you can see from the thread, one of the main issues in Sleep_Notification
> is a SLEEP_NOTIFICATION_TIME (defined in EXT_CSD [216]), which need to be
> considered in implementation…

Does it?  I would tend to assume SLEEP_NOTIFICATION_TIME will be acceptable
during _suspend until proven otherwise.

> Thus, I think postponing Sleep during suspend requires a different from current
> AUTO_BKOPS implementation, and I suggest to handle it in separate
> patchset, if possible.

Not at all sure what you mean by "postponing Sleep"?

> 
> 
> Thanks,
> Alex
> 
> On 1/22/17, 5:55 PM, "Uri Yanai" <Uri.Yanai@sandisk.com> wrote:
> 
>     Hi Adrian
>     
>     Thanks for your review.
>     Ulf rejected our approach in the first patch submission calling pm_schedule_suspend()
>     
>     " If I understand correctly, you would like to abort the runtime suspend
>     and allow the background operations to complete. That seems
>     reasonable, although in such case you need to return -EBUSY from this
>     function."
>     
>     If I understood Ulf correctly, instead of suspending he suggest aborting the suspend altogether returning -EBUSY.
>     
>     If I understood you correctly, your approach is similar to the one taken in the first patch submission.
>     Instead of calling pm_schedule_suspend(), you suggest calling  mmc_poweroff_notify(host->card, SLEEP_NOTIFICATION).
>     
>     Regards
>     Uri
>     
>     -----Original Message-----
>     From: Adrian Hunter [mailto:adrian.hunter@intel.com] 
>     Sent: Friday, January 20, 2017 1:56 PM
>     To: Uri Yanai; ulf.hansson@linaro.org
>     Cc: linux-mmc@vger.kernel.org; chris@printf.net; Alex Lemberg
>     Subject: Re: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
>     
>     On 17/01/17 14:15, Uri Yanai wrote:
>     > If asked to do device Runtime Suspend while in BKOPS and auto BKOPS is 
>     > enabled return –EBUSY
>     
>     The spec also says
>     
>     "Before moving to Sleep state hosts may set the POWER_OFF_NOTIFICATION byte to SLEEP_NOTIFICATION (0x04) if aware that the device is capable of autonomously initiating background operations for possible performance improvements."
>     
>     Have you considered that?
>     
>     But I wonder if we shouldn't always use SLEEP_NOTIFICATION before sleep?
>     
>     > 
>     > Change-Id: Ie4b38a32fe98179f0bca5b57edaaa47a02d0a389
>     > Signed-off-by: Uri Yanai <uri.yanai@sandisk.com>
>     > Signed-off-by: Alex Lemberg <alex.lemberg@sandisk.com>
>     > ---
>     >  drivers/mmc/core/mmc.c  | 35 ++++++++++++++++++++++++++++-------
>     >  include/linux/mmc/mmc.h |  2 ++
>     >  2 files changed, 30 insertions(+), 7 deletions(-)
>     > 
>     > diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 
>     > f70f6a1..21f5851 100644
>     > --- a/drivers/mmc/core/mmc.c
>     > +++ b/drivers/mmc/core/mmc.c
>     > @@ -1942,7 +1942,8 @@ static void mmc_detect(struct mmc_host *host)
>     >  	}
>     >  }
>     >  
>     > -static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
>     > +static int _mmc_suspend(struct mmc_host *host, bool is_suspend,
>     > +	bool is_runtime_pm)
>     >  {
>     >  	int err = 0;
>     >  	unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT :
>     > @@ -1953,10 +1954,30 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
>     >  	if (mmc_card_suspended(host->card))
>     >  		goto out;
>     >  
>     > -	if (mmc_card_doing_bkops(host->card)) {
>     > -		err = mmc_stop_bkops(host->card);
>     > -		if (err)
>     > +	if (mmc_card_doing_bkops(host->card) ||
>     > +		host->card->ext_csd.auto_bkops_en) {
>     > +		err = mmc_read_bkops_status(host->card);
>     > +		if (err) {
>     > +			pr_err("%s: error %d reading BKOPS Status\n",
>     > +				mmc_hostname(host), err);
>     >  			goto out;
>     > +		}
>     > +		if (is_runtime_pm && host->card->ext_csd.raw_bkops_status >=
>     > +				EXT_CSD_BKOPS_LEVEL_PM_SUSPEND) {
>     > +			/*
>     > +			 * We don’t allow Runtime Suspend while device still
>     > +			 * needs time to complete internal BKOPS, returning
>     > +			 * -EBUSY while BKOPS level is above
>     > +			 *  EXT_CSD_BKOPS_LEVEL_PM_SUSPEND
>     > +			 */
>     > +			err = -EBUSY;
>     > +			goto out;
>     > +		}
>     > +		if (mmc_card_doing_bkops(host->card)) {
>     > +			err = mmc_stop_bkops(host->card);
>     > +			if (err)
>     > +				goto out;
>     > +		}
>     >  	}
>     >  
>     >  	err = mmc_flush_cache(host->card);
>     > @@ -1987,7 +2008,7 @@ static int mmc_suspend(struct mmc_host *host)  {
>     >  	int err;
>     >  
>     > -	err = _mmc_suspend(host, true);
>     > +	err = _mmc_suspend(host, true, false);
>     >  	if (!err) {
>     >  		pm_runtime_disable(&host->card->dev);
>     >  		pm_runtime_set_suspended(&host->card->dev);
>     > @@ -2034,7 +2055,7 @@ static int mmc_shutdown(struct mmc_host *host)
>     >  		err = _mmc_resume(host);
>     >  
>     >  	if (!err)
>     > -		err = _mmc_suspend(host, false);
>     > +		err = _mmc_suspend(host, false, false);
>     >  
>     >  	return err;
>     >  }
>     > @@ -2058,7 +2079,7 @@ static int mmc_runtime_suspend(struct mmc_host *host)
>     >  	if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
>     >  		return 0;
>     >  
>     > -	err = _mmc_suspend(host, true);
>     > +	err = _mmc_suspend(host, true, true);
>     >  	if (err)
>     >  		pr_err("%s: error %d doing aggressive suspend\n",
>     >  			mmc_hostname(host), err);
>     > diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index 
>     > 126b8d5..2633274 100644
>     > --- a/include/linux/mmc/mmc.h
>     > +++ b/include/linux/mmc/mmc.h
>     > @@ -445,6 +445,8 @@ struct _mmc_csd {
>     >   */
>     >  #define EXT_CSD_BKOPS_LEVEL_2		0x2
>     >  
>     > +#define EXT_CSD_BKOPS_LEVEL_PM_SUSPEND	EXT_CSD_BKOPS_LEVEL_2
>     > +
>     >  /*
>     >   * BKOPS modes
>     >   */
>     > 
>     
>     
> 


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
  2017-01-24 14:36         ` Adrian Hunter
@ 2017-01-25  9:48           ` Alex Lemberg
  2017-01-25 10:30             ` Adrian Hunter
  0 siblings, 1 reply; 20+ messages in thread
From: Alex Lemberg @ 2017-01-25  9:48 UTC (permalink / raw)
  To: Adrian Hunter, Uri Yanai, ulf.hansson@linaro.org
  Cc: linux-mmc@vger.kernel.org



On 1/24/17, 4:36 PM, "Adrian Hunter" <adrian.hunter@intel.com> wrote:

    On 23/01/17 19:07, Alex Lemberg wrote:
    > Hi Adrian,
    > 
    > I would like to add several notes on top of Uri’s answer...
    > I agree with you, by the spec, PON Sleep_Notification should be
    > set before calling Sleep command.
    > As you probably remember, we have tried to implement it
    > in the past and even submitted a patch – “[PATCH] mmc: sleep notification”
    > https://www.mail-archive.com/linux-mmc@vger.kernel.org/msg30906.html
    > As you can see from the thread, one of the main issues in Sleep_Notification
    > is a SLEEP_NOTIFICATION_TIME (defined in EXT_CSD [216]), which need to be
    > considered in implementation…
    
    Does it?  I would tend to assume SLEEP_NOTIFICATION_TIME will be acceptable
    during _suspend until proven otherwise.

Potentially, by the spec, the Max value of SLEEP_NOTIFICATION_TIME can be 83.88 seconds.
Can we assume that this time is acceptable during _suspend?
    
    > Thus, I think postponing Sleep during suspend requires a different from current
    > AUTO_BKOPS implementation, and I suggest to handle it in separate
    > patchset, if possible.
    
    Not at all sure what you mean by "postponing Sleep"?

I mean letting Sleep_Notification to be completed before Sleep.
 


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
  2017-01-25  9:48           ` Alex Lemberg
@ 2017-01-25 10:30             ` Adrian Hunter
  2017-01-25 12:40               ` Alex Lemberg
  0 siblings, 1 reply; 20+ messages in thread
From: Adrian Hunter @ 2017-01-25 10:30 UTC (permalink / raw)
  To: Alex Lemberg, Uri Yanai, ulf.hansson@linaro.org; +Cc: linux-mmc@vger.kernel.org

On 25/01/17 11:48, Alex Lemberg wrote:
> 
> 
> On 1/24/17, 4:36 PM, "Adrian Hunter" <adrian.hunter@intel.com> wrote:
> 
>     On 23/01/17 19:07, Alex Lemberg wrote:
>     > Hi Adrian,
>     > 
>     > I would like to add several notes on top of Uri’s answer...
>     > I agree with you, by the spec, PON Sleep_Notification should be
>     > set before calling Sleep command.
>     > As you probably remember, we have tried to implement it
>     > in the past and even submitted a patch – “[PATCH] mmc: sleep notification”
>     > https://www.mail-archive.com/linux-mmc@vger.kernel.org/msg30906.html
>     > As you can see from the thread, one of the main issues in Sleep_Notification
>     > is a SLEEP_NOTIFICATION_TIME (defined in EXT_CSD [216]), which need to be
>     > considered in implementation…
>     
>     Does it?  I would tend to assume SLEEP_NOTIFICATION_TIME will be acceptable
>     during _suspend until proven otherwise.
> 
> Potentially, by the spec, the Max value of SLEEP_NOTIFICATION_TIME can be 83.88 seconds.
> Can we assume that this time is acceptable during _suspend?

Do you know of any cards that take that long?

As I wrote, I would assume it is acceptable until we know otherwise.

>     
>     > Thus, I think postponing Sleep during suspend requires a different from current
>     > AUTO_BKOPS implementation, and I suggest to handle it in separate
>     > patchset, if possible.
>     
>     Not at all sure what you mean by "postponing Sleep"?
> 
> I mean letting Sleep_Notification to be completed before Sleep.

ook.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
  2017-01-25 10:30             ` Adrian Hunter
@ 2017-01-25 12:40               ` Alex Lemberg
  2017-01-25 12:45                 ` Adrian Hunter
  0 siblings, 1 reply; 20+ messages in thread
From: Alex Lemberg @ 2017-01-25 12:40 UTC (permalink / raw)
  To: Adrian Hunter, Uri Yanai, ulf.hansson@linaro.org
  Cc: linux-mmc@vger.kernel.org



On 1/25/17, 12:30 PM, "Adrian Hunter" <adrian.hunter@intel.com> wrote:

    On 25/01/17 11:48, Alex Lemberg wrote:
    > 
    > 
    > On 1/24/17, 4:36 PM, "Adrian Hunter" <adrian.hunter@intel.com> wrote:
    > 
    >     On 23/01/17 19:07, Alex Lemberg wrote:
    >     > Hi Adrian,
    >     > 
    >     > I would like to add several notes on top of Uri’s answer...
    >     > I agree with you, by the spec, PON Sleep_Notification should be
    >     > set before calling Sleep command.
    >     > As you probably remember, we have tried to implement it
    >     > in the past and even submitted a patch – “[PATCH] mmc: sleep notification”
    >     > https://www.mail-archive.com/linux-mmc@vger.kernel.org/msg30906.html
    >     > As you can see from the thread, one of the main issues in Sleep_Notification
    >     > is a SLEEP_NOTIFICATION_TIME (defined in EXT_CSD [216]), which need to be
    >     > considered in implementation…
    >     
    >     Does it?  I would tend to assume SLEEP_NOTIFICATION_TIME will be acceptable
    >     during _suspend until proven otherwise.
    > 
    > Potentially, by the spec, the Max value of SLEEP_NOTIFICATION_TIME can be 83.88 seconds.
    > Can we assume that this time is acceptable during _suspend?
    
    Do you know of any cards that take that long?

Yes - for some cards it can take several seconds in some corner cases.

    As I wrote, I would assume it is acceptable until we know otherwise.

I think Sleep_Notification requires more detailed review. 
Since PON Sleep_Notification is a blocking command (BUSY asserted),
in case of getting new request, driver need to send HPI command in order
to interrupt the Sleep_Notification process.
We tried to handle this case in our Sleep_Notification patchset…
Anyway, I think we need to discuss it separately, not related to
the AUTO_BKOPS support…

    >     
    >     > Thus, I think postponing Sleep during suspend requires a different from current
    >     > AUTO_BKOPS implementation, and I suggest to handle it in separate
    >     > patchset, if possible.
    >     
    >     Not at all sure what you mean by "postponing Sleep"?
    > 
    > I mean letting Sleep_Notification to be completed before Sleep.
    
    ook.
    
    


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
  2017-01-25 12:40               ` Alex Lemberg
@ 2017-01-25 12:45                 ` Adrian Hunter
  2017-01-25 13:42                   ` Alex Lemberg
  0 siblings, 1 reply; 20+ messages in thread
From: Adrian Hunter @ 2017-01-25 12:45 UTC (permalink / raw)
  To: Alex Lemberg, Uri Yanai, ulf.hansson@linaro.org; +Cc: linux-mmc@vger.kernel.org

On 25/01/17 14:40, Alex Lemberg wrote:
> 
> 
> On 1/25/17, 12:30 PM, "Adrian Hunter" <adrian.hunter@intel.com> wrote:
> 
>     On 25/01/17 11:48, Alex Lemberg wrote:
>     > 
>     > 
>     > On 1/24/17, 4:36 PM, "Adrian Hunter" <adrian.hunter@intel.com> wrote:
>     > 
>     >     On 23/01/17 19:07, Alex Lemberg wrote:
>     >     > Hi Adrian,
>     >     > 
>     >     > I would like to add several notes on top of Uri’s answer...
>     >     > I agree with you, by the spec, PON Sleep_Notification should be
>     >     > set before calling Sleep command.
>     >     > As you probably remember, we have tried to implement it
>     >     > in the past and even submitted a patch – “[PATCH] mmc: sleep notification”
>     >     > https://www.mail-archive.com/linux-mmc@vger.kernel.org/msg30906.html
>     >     > As you can see from the thread, one of the main issues in Sleep_Notification
>     >     > is a SLEEP_NOTIFICATION_TIME (defined in EXT_CSD [216]), which need to be
>     >     > considered in implementation…
>     >     
>     >     Does it?  I would tend to assume SLEEP_NOTIFICATION_TIME will be acceptable
>     >     during _suspend until proven otherwise.
>     > 
>     > Potentially, by the spec, the Max value of SLEEP_NOTIFICATION_TIME can be 83.88 seconds.
>     > Can we assume that this time is acceptable during _suspend?
>     
>     Do you know of any cards that take that long?
> 
> Yes - for some cards it can take several seconds in some corner cases.

Wouldn't that mean POWER_OFF_SHORT has the same problem since that is
preparing for *both* Vcc and Vccq to go off?

> 
>     As I wrote, I would assume it is acceptable until we know otherwise.
> 
> I think Sleep_Notification requires more detailed review. 
> Since PON Sleep_Notification is a blocking command (BUSY asserted),
> in case of getting new request, driver need to send HPI command in order
> to interrupt the Sleep_Notification process.
> We tried to handle this case in our Sleep_Notification patchset…
> Anyway, I think we need to discuss it separately, not related to
> the AUTO_BKOPS support…
> 
>     >     
>     >     > Thus, I think postponing Sleep during suspend requires a different from current
>     >     > AUTO_BKOPS implementation, and I suggest to handle it in separate
>     >     > patchset, if possible.
>     >     
>     >     Not at all sure what you mean by "postponing Sleep"?
>     > 
>     > I mean letting Sleep_Notification to be completed before Sleep.
>     
>     ook.
>     
>     
> 


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend
  2017-01-25 12:45                 ` Adrian Hunter
@ 2017-01-25 13:42                   ` Alex Lemberg
  0 siblings, 0 replies; 20+ messages in thread
From: Alex Lemberg @ 2017-01-25 13:42 UTC (permalink / raw)
  To: Adrian Hunter, Uri Yanai, ulf.hansson@linaro.org
  Cc: linux-mmc@vger.kernel.org



On 1/25/17, 2:45 PM, "linux-mmc-owner@vger.kernel.org on behalf of Adrian Hunter" <linux-mmc-owner@vger.kernel.org on behalf of adrian.hunter@intel.com> wrote:

 
    >     > Potentially, by the spec, the Max value of SLEEP_NOTIFICATION_TIME can be 83.88 seconds.
    >     > Can we assume that this time is acceptable during _suspend?
    >     
    >     Do you know of any cards that take that long?
    > 
    > Yes - for some cards it can take several seconds in some corner cases.
    
    Wouldn't that mean POWER_OFF_SHORT has the same problem since that is
    preparing for *both* Vcc and Vccq to go off?

POWER_OFF_SHORT should be completed within GENERIC_CMD6_TIME,
which is a standard Switch command time.
 
    > 
    >     As I wrote, I would assume it is acceptable until we know otherwise.
    > 
    > I think Sleep_Notification requires more detailed review. 
    > Since PON Sleep_Notification is a blocking command (BUSY asserted),
    > in case of getting new request, driver need to send HPI command in order
    > to interrupt the Sleep_Notification process.
    > We tried to handle this case in our Sleep_Notification patchset…
    > Anyway, I think we need to discuss it separately, not related to
    > the AUTO_BKOPS support…
    > 
    >     >     
    >     >     > Thus, I think postponing Sleep during suspend requires a different from current
    >     >     > AUTO_BKOPS implementation, and I suggest to handle it in separate
    >     >     > patchset, if possible.
    >     >     
    >     >     Not at all sure what you mean by "postponing Sleep"?
    >     > 
    >     > I mean letting Sleep_Notification to be completed before Sleep.
    >     
    >     ook.
    >     
    >     
    > 
    
    --
    To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at  http://vger.kernel.org/majordomo-info.html
    


^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2017-01-25 13:42 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-17 12:15 [PATCH 0/3] Auto BKOPS PM suspend Uri Yanai
2017-01-17 12:15 ` [PATCH 1/3] mmc: replacing hardcoded value for runtime " Uri Yanai
2017-01-17 12:15 ` [PATCH 2/3] mmc: Adding AUTO_BKOPS_EN bit set for Auto BKOPS support Uri Yanai
2017-01-17 12:15 ` [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend Uri Yanai
2017-01-18  1:59   ` Shawn Lin
2017-01-18 15:01     ` Uri Yanai
2017-01-20 11:56   ` Adrian Hunter
2017-01-22 15:55     ` Uri Yanai
2017-01-23 17:07       ` Alex Lemberg
2017-01-24 14:36         ` Adrian Hunter
2017-01-25  9:48           ` Alex Lemberg
2017-01-25 10:30             ` Adrian Hunter
2017-01-25 12:40               ` Alex Lemberg
2017-01-25 12:45                 ` Adrian Hunter
2017-01-25 13:42                   ` Alex Lemberg
2017-01-18  1:53 ` [PATCH 0/3] Auto BKOPS PM suspend Shawn Lin
2017-01-18 14:12   ` Uri Yanai
  -- strict thread matches above, loose matches on Subject: below --
2016-09-01 14:24 [PATCH 0/3] mmc: Check BKOPS Level On Runtime Suspend alex lemberg
2016-09-01 14:24 ` [PATCH 3/3] mmc: Checking BKOPS status prior to Suspend alex lemberg
2016-10-13  7:36   ` Ulf Hansson
2016-10-31  9:53     ` Alex Lemberg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox