LKML Archive mirror
 help / color / mirror / Atom feed
* [PATCH V2 0/2] Add partial initialization support
@ 2023-09-29 10:28 Sarthak Garg
  2023-09-29 10:28 ` [PATCH V2 1/2] mmc: core: " Sarthak Garg
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Sarthak Garg @ 2023-09-29 10:28 UTC (permalink / raw
  To: adrian.hunter, ulf.hansson
  Cc: linux-mmc, linux-kernel, linux-arm-msm, quic_rampraka,
	quic_pragalla, quic_sayalil, quic_nitirawa, quic_sachgupt,
	quic_bhaskarv, quic_narepall, Sarthak Garg

Add the ability to partially initialize the MMC device by
using device sleep/awake sequence (CMD5).
Device will be sent to sleep state during mmc runtime/system suspend
and will be woken up during mmc runtime/system resume.
By using this sequence the device doesn't need full initialization
which gives 25% time reduction in system/runtime resume path.
Also enable this feature for qualcomm controllers.

Sarthak Garg (2):
  mmc: core: Add partial initialization support
  mmc: sdhci-msm: Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers

 drivers/mmc/core/mmc.c       | 162 +++++++++++++++++++++++++++++++++--
 drivers/mmc/host/sdhci-msm.c |   1 +
 include/linux/mmc/card.h     |   4 +
 include/linux/mmc/host.h     |   2 +
 4 files changed, 160 insertions(+), 9 deletions(-)

--
2.17.1


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

* [PATCH V2 1/2] mmc: core: Add partial initialization support
  2023-09-29 10:28 [PATCH V2 0/2] Add partial initialization support Sarthak Garg
@ 2023-09-29 10:28 ` Sarthak Garg
  2023-09-29 11:53   ` kernel test robot
  2023-09-29 10:28 ` [PATCH V2 2/2] mmc: sdhci-msm: Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers Sarthak Garg
  2023-09-29 13:08 ` [PATCH V2 0/2] Add partial initialization support Bryan O'Donoghue
  2 siblings, 1 reply; 10+ messages in thread
From: Sarthak Garg @ 2023-09-29 10:28 UTC (permalink / raw
  To: adrian.hunter, ulf.hansson
  Cc: linux-mmc, linux-kernel, linux-arm-msm, quic_rampraka,
	quic_pragalla, quic_sayalil, quic_nitirawa, quic_sachgupt,
	quic_bhaskarv, quic_narepall, Sarthak Garg,
	Veerabhadrarao Badiganti

Add the ability to partially initialize the MMC device by
using device sleep/awake sequence (CMD5).
Device will be sent to sleep state during mmc runtime/system suspend
and will be woken up during mmc runtime/system resume.
By using this sequence the device doesn't need full initialization
which gives 25% time reduction in system/runtime resume path.

1) Micron eMMC (ManfID 0x13)

Partial init				Full Init

a) _mmc_resume: 			_mmc_resume :

Total time : 62ms 			Total time : 84ms
(Improvement % from full init = ~26%)

2) Kingston eMMC (ManfID 0x70)

Partial init				Full Init

a) _mmc_resume:			_mmc_resume :
Total time : 46ms			Total time : 62ms
(Improvement % from full init = ~25%).

Co-developed-by: Veerabhadrarao Badiganti <quic_vbadigan@quicinc.com>
Signed-off-by: Veerabhadrarao Badiganti <quic_vbadigan@quicinc.com>
Signed-off-by: Sarthak Garg <quic_sartgarg@quicinc.com>
---
 drivers/mmc/core/mmc.c   | 162 ++++++++++++++++++++++++++++++++++++---
 include/linux/mmc/card.h |   4 +
 include/linux/mmc/host.h |   2 +
 3 files changed, 159 insertions(+), 9 deletions(-)

diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index 89cd48fcec79..e84516717170 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1951,7 +1951,27 @@ static int mmc_sleep_busy_cb(void *cb_data, bool *busy)
 	return 0;
 }

-static int mmc_sleep(struct mmc_host *host)
+/*
+ * Returns true if card supports sleep/awake command and host can simply do
+ * sleep/awake instead of full card initialization as part of resume.
+ */
+static inline int mmc_can_sleepawake(struct mmc_host *host)
+{
+	return mmc_can_sleep(host->card) && (host->caps2 & MMC_CAP2_SLEEP_AWAKE);
+}
+
+/**
+ * mmc_sleepawake - function to sleep or awake the device
+ * @sleep: if true then sleep command is sent else awake
+ *
+ * This function first deselects the card and then sends the sleep command
+ * in case of sleep whereas in case of awake first awake command is send
+ * and then the card is selected.
+ *
+ * Returns 0 on success, non-zero value on failure
+ */
+
+static int mmc_sleepawake(struct mmc_host *host, bool sleep)
 {
 	struct mmc_command cmd = {};
 	struct mmc_card *card = host->card;
@@ -1962,14 +1982,17 @@ static int mmc_sleep(struct mmc_host *host)
 	/* Re-tuning can't be done once the card is deselected */
 	mmc_retune_hold(host);

-	err = mmc_deselect_cards(host);
-	if (err)
-		goto out_release;
+	if (sleep) {
+		err = mmc_deselect_cards(host);
+		if (err)
+			goto out_release;
+	}

 	cmd.opcode = MMC_SLEEP_AWAKE;
 	cmd.arg = card->rca << 16;
-	cmd.arg |= 1 << 15;
 	use_r1b_resp = mmc_prepare_busy_cmd(host, &cmd, timeout_ms);
+	if (sleep)
+		cmd.arg |= BIT(15);

 	err = mmc_wait_for_cmd(host, &cmd, 0);
 	if (err)
@@ -1992,6 +2015,9 @@ static int mmc_sleep(struct mmc_host *host)
 	err = __mmc_poll_for_busy(host, 0, timeout_ms, &mmc_sleep_busy_cb, host);

 out_release:
+	if (!sleep)
+		err = mmc_select_card(card);
+
 	mmc_retune_release(host);
 	return err;
 }
@@ -2089,6 +2115,73 @@ static int _mmc_flush_cache(struct mmc_host *host)
 			pr_err("%s: cache flush error %d\n",
 			       mmc_hostname(host), err);
 	}
+	return err;
+}
+
+/*
+ * Save read/write fields of ext_csd register that the sw changes
+ * as part of suspend.
+ */
+static int mmc_save_card_ext_csd(struct mmc_host *host)
+{
+	int err;
+	u8 *ext_csd;
+	struct mmc_card *card = host->card;
+
+	err = mmc_get_ext_csd(card, &ext_csd);
+	if (err || !ext_csd) {
+		pr_err("%s: %s: mmc_get_ext_csd failed (%d)\n",
+			mmc_hostname(host), __func__, err);
+		return err;
+	}
+
+	card->ext_csd.raw_ext_csd_cmdq = ext_csd[EXT_CSD_CMDQ_MODE_EN];
+	card->ext_csd.raw_ext_csd_cache_ctrl = ext_csd[EXT_CSD_CACHE_CTRL];
+	card->ext_csd.raw_ext_csd_bus_width = ext_csd[EXT_CSD_BUS_WIDTH];
+	card->ext_csd.raw_ext_csd_hs_timing = ext_csd[EXT_CSD_HS_TIMING];
+
+	kfree(ext_csd);
+
+	return 0;
+}
+
+/*
+ * Get the ext_csd register from the card post resume and compare with
+ * read/write fields of ext_csd register that the sw changes.
+ */
+static int mmc_test_awake_ext_csd(struct mmc_host *host)
+{
+	struct mmc_card *card = host->card;
+	u8 *ext_csd;
+	int err;
+
+	err = mmc_get_ext_csd(card, &ext_csd);
+	if (err) {
+		pr_err("%s: %s: mmc_get_ext_csd failed (%d)\n",
+			mmc_hostname(host), __func__, err);
+		return err;
+	}
+
+	pr_debug("%s: %s: type(cached:current) cmdq(%d:%d) cache_ctrl(%d:%d) bus_width (%d:%d) timing(%d:%d)\n",
+		mmc_hostname(host), __func__,
+		card->ext_csd.raw_ext_csd_cmdq,
+		ext_csd[EXT_CSD_CMDQ_MODE_EN],
+		card->ext_csd.raw_ext_csd_cache_ctrl,
+		ext_csd[EXT_CSD_CACHE_CTRL],
+		card->ext_csd.raw_ext_csd_bus_width,
+		ext_csd[EXT_CSD_BUS_WIDTH],
+		card->ext_csd.raw_ext_csd_hs_timing,
+		ext_csd[EXT_CSD_HS_TIMING]);
+	err = !((card->ext_csd.raw_ext_csd_cmdq ==
+			ext_csd[EXT_CSD_CMDQ_MODE_EN]) &&
+		(card->ext_csd.raw_ext_csd_cache_ctrl ==
+			ext_csd[EXT_CSD_CACHE_CTRL]) &&
+		(card->ext_csd.raw_ext_csd_bus_width ==
+			ext_csd[EXT_CSD_BUS_WIDTH]) &&
+		(card->ext_csd.raw_ext_csd_hs_timing ==
+			ext_csd[EXT_CSD_HS_TIMING]));
+
+	kfree(ext_csd);

 	return err;
 }
@@ -2112,9 +2205,15 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
 	    ((host->caps2 & MMC_CAP2_FULL_PWR_CYCLE) || !is_suspend ||
 	     (host->caps2 & MMC_CAP2_FULL_PWR_CYCLE_IN_SUSPEND)))
 		err = mmc_poweroff_notify(host->card, notify_type);
-	else if (mmc_can_sleep(host->card))
-		err = mmc_sleep(host);
-	else if (!mmc_host_is_spi(host))
+	else if (mmc_can_sleep(host->card)) {
+		if (mmc_can_sleepawake(host)) {
+			memcpy(&host->cached_ios, &host->ios, sizeof(host->cached_ios));
+			err = mmc_save_card_ext_csd(host);
+			if (err)
+				goto out;
+		}
+		err = mmc_sleepawake(host, true);
+	} else if (!mmc_host_is_spi(host))
 		err = mmc_deselect_cards(host);

 	if (!err) {
@@ -2126,6 +2225,39 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
 	return err;
 }

+static int mmc_partial_init(struct mmc_host *host)
+{
+	int err = 0;
+	struct mmc_card *card = host->card;
+
+	mmc_set_bus_width(host, host->cached_ios.bus_width);
+	mmc_set_timing(host, host->cached_ios.timing);
+	if (host->cached_ios.enhanced_strobe) {
+		host->ios.enhanced_strobe = true;
+		if (host->ops->hs400_enhanced_strobe)
+			host->ops->hs400_enhanced_strobe(host, &host->ios);
+	}
+	mmc_set_clock(host, host->cached_ios.clock);
+	mmc_set_bus_mode(host, host->cached_ios.bus_mode);
+
+	if (!mmc_card_hs400es(card) &&
+			(mmc_card_hs200(card) || mmc_card_hs400(card))) {
+		err = mmc_execute_tuning(card);
+		if (err) {
+			pr_err("%s: %s: Tuning failed (%d)\n",
+				mmc_hostname(host), __func__, err);
+			goto out;
+		}
+	}
+
+	err = mmc_test_awake_ext_csd(host);
+	if (err)
+		pr_debug("%s: %s: fail on ext_csd read (%d)\n",
+			mmc_hostname(host), __func__, err);
+out:
+	return err;
+}
+
 /*
  * Suspend callback
  */
@@ -2156,7 +2288,19 @@ static int _mmc_resume(struct mmc_host *host)
 		goto out;

 	mmc_power_up(host, host->card->ocr);
-	err = mmc_init_card(host, host->card->ocr, host->card);
+
+	if (mmc_can_sleepawake(host)) {
+		err = mmc_sleepawake(host, false);
+		if (!err)
+			err = mmc_partial_init(host);
+		else
+			pr_err("%s: %s: awake failed (%d), fallback to full init\n",
+				mmc_hostname(host), __func__, err);
+	}
+
+	if (!mmc_can_sleepawake(host) || err)
+		err = mmc_init_card(host, host->card->ocr, host->card);
+
 	mmc_card_clr_suspended(host->card);

 out:
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
index daa2f40d9ce6..fbc832ec6d57 100644
--- a/include/linux/mmc/card.h
+++ b/include/linux/mmc/card.h
@@ -86,6 +86,8 @@ struct mmc_ext_csd {
 	unsigned int            data_tag_unit_size;     /* DATA TAG UNIT size */
 	unsigned int		boot_ro_lock;		/* ro lock support */
 	bool			boot_ro_lockable;
+	u8			raw_ext_csd_cmdq;	/* 15 */
+	u8			raw_ext_csd_cache_ctrl;	/* 33 */
 	bool			ffu_capable;	/* Firmware upgrade support */
 	bool			cmdq_en;	/* Command Queue enabled */
 	bool			cmdq_support;	/* Command Queue supported */
@@ -96,7 +98,9 @@ struct mmc_ext_csd {
 	u8			raw_partition_support;	/* 160 */
 	u8			raw_rpmb_size_mult;	/* 168 */
 	u8			raw_erased_mem_count;	/* 181 */
+	u8			raw_ext_csd_bus_width;	/* 183 */
 	u8			strobe_support;		/* 184 */
+	u8			raw_ext_csd_hs_timing;	/* 185 */
 	u8			raw_ext_csd_structure;	/* 194 */
 	u8			raw_card_type;		/* 196 */
 	u8			raw_driver_strength;	/* 197 */
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 62a6847a3b6f..45ded42ad8f1 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -427,6 +427,7 @@ struct mmc_host {
 #define MMC_CAP2_CRYPTO		0
 #endif
 #define MMC_CAP2_ALT_GPT_TEGRA	(1 << 28)	/* Host with eMMC that has GPT entry at a non-standard location */
+#define MMC_CAP2_SLEEP_AWAKE	(1 << 29)	/* Use Sleep/Awake (CMD5) */

 	int			fixed_drv_type;	/* fixed driver type for non-removable media */

@@ -445,6 +446,7 @@ struct mmc_host {
 	spinlock_t		lock;		/* lock for claim and bus ops */

 	struct mmc_ios		ios;		/* current io bus settings */
+	struct mmc_ios		cached_ios;

 	/* group bitfields together to minimize padding */
 	unsigned int		use_spi_crc:1;
--
2.17.1


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

* [PATCH V2 2/2] mmc: sdhci-msm: Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers
  2023-09-29 10:28 [PATCH V2 0/2] Add partial initialization support Sarthak Garg
  2023-09-29 10:28 ` [PATCH V2 1/2] mmc: core: " Sarthak Garg
@ 2023-09-29 10:28 ` Sarthak Garg
  2023-09-29 11:47   ` Konrad Dybcio
  2023-10-08  2:22   ` Wenchao Chen
  2023-09-29 13:08 ` [PATCH V2 0/2] Add partial initialization support Bryan O'Donoghue
  2 siblings, 2 replies; 10+ messages in thread
From: Sarthak Garg @ 2023-09-29 10:28 UTC (permalink / raw
  To: adrian.hunter, ulf.hansson
  Cc: linux-mmc, linux-kernel, linux-arm-msm, quic_rampraka,
	quic_pragalla, quic_sayalil, quic_nitirawa, quic_sachgupt,
	quic_bhaskarv, quic_narepall, Sarthak Garg, Andy Gross,
	Bjorn Andersson, Konrad Dybcio

Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers to let them use
sleep/awake functionality for faster eMMC resume instead of
doing full initialization.

Signed-off-by: Sarthak Garg <quic_sartgarg@quicinc.com>
---
 drivers/mmc/host/sdhci-msm.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
index 668e0aceeeba..be44a6851fc9 100644
--- a/drivers/mmc/host/sdhci-msm.c
+++ b/drivers/mmc/host/sdhci-msm.c
@@ -2627,6 +2627,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)
 	}

 	msm_host->mmc->caps |= MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_NEED_RSP_BUSY;
+	msm_host->mmc->caps2 |= MMC_CAP2_SLEEP_AWAKE;

 	/* Set the timeout value to max possible */
 	host->max_timeout_count = 0xF;
--
2.17.1


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

* Re: [PATCH V2 2/2] mmc: sdhci-msm: Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers
  2023-09-29 10:28 ` [PATCH V2 2/2] mmc: sdhci-msm: Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers Sarthak Garg
@ 2023-09-29 11:47   ` Konrad Dybcio
  2023-10-04 10:53     ` Sarthak Garg
  2023-10-08  2:22   ` Wenchao Chen
  1 sibling, 1 reply; 10+ messages in thread
From: Konrad Dybcio @ 2023-09-29 11:47 UTC (permalink / raw
  To: Sarthak Garg, adrian.hunter, ulf.hansson
  Cc: linux-mmc, linux-kernel, linux-arm-msm, quic_rampraka,
	quic_pragalla, quic_sayalil, quic_nitirawa, quic_sachgupt,
	quic_bhaskarv, quic_narepall, Andy Gross, Bjorn Andersson

On 29.09.2023 12:28, Sarthak Garg wrote:
> Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers to let them use
> sleep/awake functionality for faster eMMC resume instead of
> doing full initialization.
> 
> Signed-off-by: Sarthak Garg <quic_sartgarg@quicinc.com>
> ---
Will this work on all SoCs from MSM8974 to SM8550 inclusive?

Such changes affect all users of this driver.

Konrad

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

* Re: [PATCH V2 1/2] mmc: core: Add partial initialization support
  2023-09-29 10:28 ` [PATCH V2 1/2] mmc: core: " Sarthak Garg
@ 2023-09-29 11:53   ` kernel test robot
  0 siblings, 0 replies; 10+ messages in thread
From: kernel test robot @ 2023-09-29 11:53 UTC (permalink / raw
  To: Sarthak Garg, adrian.hunter, ulf.hansson
  Cc: oe-kbuild-all, linux-mmc, linux-kernel, linux-arm-msm,
	quic_rampraka, quic_pragalla, quic_sayalil, quic_nitirawa,
	quic_sachgupt, quic_bhaskarv, quic_narepall, Sarthak Garg,
	Veerabhadrarao Badiganti

Hi Sarthak,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linus/master]
[also build test WARNING on ulf-hansson-mmc-mirror/next v6.6-rc3 next-20230929]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Sarthak-Garg/mmc-core-Add-partial-initialization-support/20230929-183238
base:   linus/master
patch link:    https://lore.kernel.org/r/20230929102831.9702-2-quic_sartgarg%40quicinc.com
patch subject: [PATCH V2 1/2] mmc: core: Add partial initialization support
config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20230929/202309291907.0fApmbb7-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230929/202309291907.0fApmbb7-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202309291907.0fApmbb7-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/mmc/core/mmc.c:1975: warning: Function parameter or member 'host' not described in 'mmc_sleepawake'


vim +1975 drivers/mmc/core/mmc.c

8786b9922e6b87 Sarthak Garg    2023-09-29  1962  
8786b9922e6b87 Sarthak Garg    2023-09-29  1963  /**
8786b9922e6b87 Sarthak Garg    2023-09-29  1964   * mmc_sleepawake - function to sleep or awake the device
8786b9922e6b87 Sarthak Garg    2023-09-29  1965   * @sleep: if true then sleep command is sent else awake
8786b9922e6b87 Sarthak Garg    2023-09-29  1966   *
8786b9922e6b87 Sarthak Garg    2023-09-29  1967   * This function first deselects the card and then sends the sleep command
8786b9922e6b87 Sarthak Garg    2023-09-29  1968   * in case of sleep whereas in case of awake first awake command is send
8786b9922e6b87 Sarthak Garg    2023-09-29  1969   * and then the card is selected.
8786b9922e6b87 Sarthak Garg    2023-09-29  1970   *
8786b9922e6b87 Sarthak Garg    2023-09-29  1971   * Returns 0 on success, non-zero value on failure
8786b9922e6b87 Sarthak Garg    2023-09-29  1972   */
8786b9922e6b87 Sarthak Garg    2023-09-29  1973  
8786b9922e6b87 Sarthak Garg    2023-09-29  1974  static int mmc_sleepawake(struct mmc_host *host, bool sleep)
07a682160866e3 Ulf Hansson     2013-04-19 @1975  {
c7836d1593b87c Masahiro Yamada 2016-12-19  1976  	struct mmc_command cmd = {};
07a682160866e3 Ulf Hansson     2013-04-19  1977  	struct mmc_card *card = host->card;
cb962e04b04fb6 Ulf Hansson     2014-01-14  1978  	unsigned int timeout_ms = DIV_ROUND_UP(card->ext_csd.sa_timeout, 10000);
e62f1e0b2384e2 Ulf Hansson     2021-05-04  1979  	bool use_r1b_resp;
07a682160866e3 Ulf Hansson     2013-04-19  1980  	int err;
07a682160866e3 Ulf Hansson     2013-04-19  1981  
436f8daa6f5a29 Adrian Hunter   2015-05-07  1982  	/* Re-tuning can't be done once the card is deselected */
436f8daa6f5a29 Adrian Hunter   2015-05-07  1983  	mmc_retune_hold(host);
436f8daa6f5a29 Adrian Hunter   2015-05-07  1984  
8786b9922e6b87 Sarthak Garg    2023-09-29  1985  	if (sleep) {
07a682160866e3 Ulf Hansson     2013-04-19  1986  		err = mmc_deselect_cards(host);
07a682160866e3 Ulf Hansson     2013-04-19  1987  		if (err)
436f8daa6f5a29 Adrian Hunter   2015-05-07  1988  			goto out_release;
8786b9922e6b87 Sarthak Garg    2023-09-29  1989  	}
07a682160866e3 Ulf Hansson     2013-04-19  1990  
07a682160866e3 Ulf Hansson     2013-04-19  1991  	cmd.opcode = MMC_SLEEP_AWAKE;
07a682160866e3 Ulf Hansson     2013-04-19  1992  	cmd.arg = card->rca << 16;
e62f1e0b2384e2 Ulf Hansson     2021-05-04  1993  	use_r1b_resp = mmc_prepare_busy_cmd(host, &cmd, timeout_ms);
8786b9922e6b87 Sarthak Garg    2023-09-29  1994  	if (sleep)
8786b9922e6b87 Sarthak Garg    2023-09-29  1995  		cmd.arg |= BIT(15);
cb962e04b04fb6 Ulf Hansson     2014-01-14  1996  
07a682160866e3 Ulf Hansson     2013-04-19  1997  	err = mmc_wait_for_cmd(host, &cmd, 0);
07a682160866e3 Ulf Hansson     2013-04-19  1998  	if (err)
436f8daa6f5a29 Adrian Hunter   2015-05-07  1999  		goto out_release;
07a682160866e3 Ulf Hansson     2013-04-19  2000  
07a682160866e3 Ulf Hansson     2013-04-19  2001  	/*
6fa79651cc808f Ulf Hansson     2021-05-04  2002  	 * If the host does not wait while the card signals busy, then we can
6fa79651cc808f Ulf Hansson     2021-05-04  2003  	 * try to poll, but only if the host supports HW polling, as the
6fa79651cc808f Ulf Hansson     2021-05-04  2004  	 * SEND_STATUS cmd is not allowed. If we can't poll, then we simply need
6fa79651cc808f Ulf Hansson     2021-05-04  2005  	 * to wait the sleep/awake timeout.
07a682160866e3 Ulf Hansson     2013-04-19  2006  	 */
6fa79651cc808f Ulf Hansson     2021-05-04  2007  	if (host->caps & MMC_CAP_WAIT_WHILE_BUSY && use_r1b_resp)
6fa79651cc808f Ulf Hansson     2021-05-04  2008  		goto out_release;
6fa79651cc808f Ulf Hansson     2021-05-04  2009  
6fa79651cc808f Ulf Hansson     2021-05-04  2010  	if (!host->ops->card_busy) {
cb962e04b04fb6 Ulf Hansson     2014-01-14  2011  		mmc_delay(timeout_ms);
6fa79651cc808f Ulf Hansson     2021-05-04  2012  		goto out_release;
6fa79651cc808f Ulf Hansson     2021-05-04  2013  	}
6fa79651cc808f Ulf Hansson     2021-05-04  2014  
1760fdb6fe9f79 Ulf Hansson     2022-03-04  2015  	err = __mmc_poll_for_busy(host, 0, timeout_ms, &mmc_sleep_busy_cb, host);
07a682160866e3 Ulf Hansson     2013-04-19  2016  
436f8daa6f5a29 Adrian Hunter   2015-05-07  2017  out_release:
8786b9922e6b87 Sarthak Garg    2023-09-29  2018  	if (!sleep)
8786b9922e6b87 Sarthak Garg    2023-09-29  2019  		err = mmc_select_card(card);
8786b9922e6b87 Sarthak Garg    2023-09-29  2020  
436f8daa6f5a29 Adrian Hunter   2015-05-07  2021  	mmc_retune_release(host);
07a682160866e3 Ulf Hansson     2013-04-19  2022  	return err;
07a682160866e3 Ulf Hansson     2013-04-19  2023  }
07a682160866e3 Ulf Hansson     2013-04-19  2024  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

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

* Re: [PATCH V2 0/2] Add partial initialization support
  2023-09-29 10:28 [PATCH V2 0/2] Add partial initialization support Sarthak Garg
  2023-09-29 10:28 ` [PATCH V2 1/2] mmc: core: " Sarthak Garg
  2023-09-29 10:28 ` [PATCH V2 2/2] mmc: sdhci-msm: Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers Sarthak Garg
@ 2023-09-29 13:08 ` Bryan O'Donoghue
  2023-10-04 10:58   ` Sarthak Garg
  2 siblings, 1 reply; 10+ messages in thread
From: Bryan O'Donoghue @ 2023-09-29 13:08 UTC (permalink / raw
  To: Sarthak Garg, adrian.hunter, ulf.hansson
  Cc: linux-mmc, linux-kernel, linux-arm-msm, quic_rampraka,
	quic_pragalla, quic_sayalil, quic_nitirawa, quic_sachgupt,
	quic_bhaskarv, quic_narepall

On 29/09/2023 11:28, Sarthak Garg wrote:
> Add the ability to partially initialize the MMC device by
> using device sleep/awake sequence (CMD5).
> Device will be sent to sleep state during mmc runtime/system suspend
> and will be woken up during mmc runtime/system resume.
> By using this sequence the device doesn't need full initialization
> which gives 25% time reduction in system/runtime resume path.
> Also enable this feature for qualcomm controllers.
> 
> Sarthak Garg (2):
>    mmc: core: Add partial initialization support
>    mmc: sdhci-msm: Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers
> 
>   drivers/mmc/core/mmc.c       | 162 +++++++++++++++++++++++++++++++++--
>   drivers/mmc/host/sdhci-msm.c |   1 +
>   include/linux/mmc/card.h     |   4 +
>   include/linux/mmc/host.h     |   2 +
>   4 files changed, 160 insertions(+), 9 deletions(-)
> 
> --
> 2.17.1
> 

A terrible nit pick on my part however, you should include the name of 
the subsystem/driver in the title of the series.

"mmc: Do this awesome new thing"

---
bod

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

* Re: [PATCH V2 2/2] mmc: sdhci-msm: Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers
  2023-09-29 11:47   ` Konrad Dybcio
@ 2023-10-04 10:53     ` Sarthak Garg
  0 siblings, 0 replies; 10+ messages in thread
From: Sarthak Garg @ 2023-10-04 10:53 UTC (permalink / raw
  To: Konrad Dybcio, adrian.hunter, ulf.hansson
  Cc: linux-mmc, linux-kernel, linux-arm-msm, quic_rampraka,
	quic_pragalla, quic_sayalil, quic_nitirawa, quic_sachgupt,
	quic_bhaskarv, quic_narepall, Andy Gross, Bjorn Andersson


On 9/29/2023 5:17 PM, Konrad Dybcio wrote:
> On 29.09.2023 12:28, Sarthak Garg wrote:
>> Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers to let them use
>> sleep/awake functionality for faster eMMC resume instead of
>> doing full initialization.
>>
>> Signed-off-by: Sarthak Garg <quic_sartgarg@quicinc.com>
>> ---
> Will this work on all SoCs from MSM8974 to SM8550 inclusive?
>
> Such changes affect all users of this driver.
>
> Konrad


Yes it will work on all SOC's as its an eMMC card specific feature and 
where the underlying eMMC card supports sleep/awake commands.



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

* Re: [PATCH V2 0/2] Add partial initialization support
  2023-09-29 13:08 ` [PATCH V2 0/2] Add partial initialization support Bryan O'Donoghue
@ 2023-10-04 10:58   ` Sarthak Garg
  0 siblings, 0 replies; 10+ messages in thread
From: Sarthak Garg @ 2023-10-04 10:58 UTC (permalink / raw
  To: Bryan O'Donoghue, adrian.hunter, ulf.hansson
  Cc: linux-mmc, linux-kernel, linux-arm-msm, quic_rampraka,
	quic_pragalla, quic_sayalil, quic_nitirawa, quic_sachgupt,
	quic_bhaskarv, quic_narepall


On 9/29/2023 6:38 PM, Bryan O'Donoghue wrote:
> On 29/09/2023 11:28, Sarthak Garg wrote:
>> Add the ability to partially initialize the MMC device by
>> using device sleep/awake sequence (CMD5).
>> Device will be sent to sleep state during mmc runtime/system suspend
>> and will be woken up during mmc runtime/system resume.
>> By using this sequence the device doesn't need full initialization
>> which gives 25% time reduction in system/runtime resume path.
>> Also enable this feature for qualcomm controllers.
>>
>> Sarthak Garg (2):
>>    mmc: core: Add partial initialization support
>>    mmc: sdhci-msm: Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers
>>
>>   drivers/mmc/core/mmc.c       | 162 +++++++++++++++++++++++++++++++++--
>>   drivers/mmc/host/sdhci-msm.c |   1 +
>>   include/linux/mmc/card.h     |   4 +
>>   include/linux/mmc/host.h     |   2 +
>>   4 files changed, 160 insertions(+), 9 deletions(-)
>>
>> -- 
>> 2.17.1
>>
>
> A terrible nit pick on my part however, you should include the name of 
> the subsystem/driver in the title of the series.
>
> "mmc: Do this awesome new thing"
>
> ---
> bod


Thanks for the comment will take care in V3.

Thanks,
Sarthak




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

* Re: [PATCH V2 2/2] mmc: sdhci-msm: Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers
  2023-09-29 10:28 ` [PATCH V2 2/2] mmc: sdhci-msm: Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers Sarthak Garg
  2023-09-29 11:47   ` Konrad Dybcio
@ 2023-10-08  2:22   ` Wenchao Chen
  2023-10-16  9:56     ` Sarthak Garg
  1 sibling, 1 reply; 10+ messages in thread
From: Wenchao Chen @ 2023-10-08  2:22 UTC (permalink / raw
  To: Sarthak Garg
  Cc: adrian.hunter, ulf.hansson, linux-mmc, linux-kernel,
	linux-arm-msm, quic_rampraka, quic_pragalla, quic_sayalil,
	quic_nitirawa, quic_sachgupt, quic_bhaskarv, quic_narepall,
	Andy Gross, Bjorn Andersson, Konrad Dybcio

On Fri, 29 Sept 2023 at 22:44, Sarthak Garg <quic_sartgarg@quicinc.com> wrote:
>
> Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers to let them use
> sleep/awake functionality for faster eMMC resume instead of
> doing full initialization.
>
> Signed-off-by: Sarthak Garg <quic_sartgarg@quicinc.com>
> ---
>  drivers/mmc/host/sdhci-msm.c | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
> index 668e0aceeeba..be44a6851fc9 100644
> --- a/drivers/mmc/host/sdhci-msm.c
> +++ b/drivers/mmc/host/sdhci-msm.c
> @@ -2627,6 +2627,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)
>         }
>
>         msm_host->mmc->caps |= MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_NEED_RSP_BUSY;
> +       msm_host->mmc->caps2 |= MMC_CAP2_SLEEP_AWAKE;
>

Need "MMC_CAP_AGGRESSIVE_PM"?
/*
 * Callback for runtime_suspend.
 */
static int mmc_runtime_suspend(struct mmc_host *host)
{
int err;

if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
return 0;

err = _mmc_suspend(host, true);
if (err)
pr_err("%s: error %d doing aggressive suspend\n",
mmc_hostname(host), err);

return err;
}



>         /* Set the timeout value to max possible */
>         host->max_timeout_count = 0xF;
> --
> 2.17.1
>

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

* Re: [PATCH V2 2/2] mmc: sdhci-msm: Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers
  2023-10-08  2:22   ` Wenchao Chen
@ 2023-10-16  9:56     ` Sarthak Garg
  0 siblings, 0 replies; 10+ messages in thread
From: Sarthak Garg @ 2023-10-16  9:56 UTC (permalink / raw
  To: Wenchao Chen
  Cc: adrian.hunter, ulf.hansson, linux-mmc, linux-kernel,
	linux-arm-msm, quic_rampraka, quic_pragalla, quic_sayalil,
	quic_nitirawa, quic_sachgupt, quic_bhaskarv, quic_narepall,
	Andy Gross, Bjorn Andersson, Konrad Dybcio



On 10/8/2023 7:52 AM, Wenchao Chen wrote:
> On Fri, 29 Sept 2023 at 22:44, Sarthak Garg <quic_sartgarg@quicinc.com> wrote:
>>
>> Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers to let them use
>> sleep/awake functionality for faster eMMC resume instead of
>> doing full initialization.
>>
>> Signed-off-by: Sarthak Garg <quic_sartgarg@quicinc.com>
>> ---
>>   drivers/mmc/host/sdhci-msm.c | 1 +
>>   1 file changed, 1 insertion(+)
>>
>> diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
>> index 668e0aceeeba..be44a6851fc9 100644
>> --- a/drivers/mmc/host/sdhci-msm.c
>> +++ b/drivers/mmc/host/sdhci-msm.c
>> @@ -2627,6 +2627,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)
>>          }
>>
>>          msm_host->mmc->caps |= MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_NEED_RSP_BUSY;
>> +       msm_host->mmc->caps2 |= MMC_CAP2_SLEEP_AWAKE;
>>
> 
> Need "MMC_CAP_AGGRESSIVE_PM"?
> /*
>   * Callback for runtime_suspend.
>   */
> static int mmc_runtime_suspend(struct mmc_host *host)
> {
> int err;
> 
> if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))
> return 0;
> 
> err = _mmc_suspend(host, true);
> if (err)
> pr_err("%s: error %d doing aggressive suspend\n",
> mmc_hostname(host), err);
> 
> return err;
> }
> 
> 
>


Thanks for pointing .. yes this is needed and missed to push this. Will 
push in V3.

Thanks,
Sarthak


>>          /* Set the timeout value to max possible */
>>          host->max_timeout_count = 0xF;
>> --
>> 2.17.1
>>

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

end of thread, other threads:[~2023-10-16  9:58 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-29 10:28 [PATCH V2 0/2] Add partial initialization support Sarthak Garg
2023-09-29 10:28 ` [PATCH V2 1/2] mmc: core: " Sarthak Garg
2023-09-29 11:53   ` kernel test robot
2023-09-29 10:28 ` [PATCH V2 2/2] mmc: sdhci-msm: Enable MMC_CAP2_SLEEP_AWAKE for Qualcomm controllers Sarthak Garg
2023-09-29 11:47   ` Konrad Dybcio
2023-10-04 10:53     ` Sarthak Garg
2023-10-08  2:22   ` Wenchao Chen
2023-10-16  9:56     ` Sarthak Garg
2023-09-29 13:08 ` [PATCH V2 0/2] Add partial initialization support Bryan O'Donoghue
2023-10-04 10:58   ` Sarthak Garg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).