summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorParth Pancholi <parth.pancholi@toradex.com>2023-11-08 12:53:59 +0100
committerParth Pancholi <parth.pancholi@toradex.com>2023-11-14 07:28:35 +0000
commit0986a89d1a073e650a2d2aa727a1c3b5970b1113 (patch)
tree08733923605aff7baeed6ed6331ea4ee86c4139b
parent266bdf4d7b1ce31bcbc35dd92f52ca45c60eadba (diff)
linux-toradex-mainline: patch: fix bootup issue with Micron Q2J54A EMMC
Micron MTFC4GACAJCN eMMC supports cache but requires that flush cache operation be allowed only after a write has occurred. Otherwise, the cache flush command or subsequent commands will time out. This patch has been merged in mainline with commit ed9009ad300c. Related-to: ELB-5386 Signed-off-by: Bean Huo <beanhuo@micron.com> Signed-off-by: Rafael Beims <rafael.beims@toradex.com> Signed-off-by: Parth Pancholi <parth.pancholi@toradex.com>
-rw-r--r--recipes-kernel/linux/linux-toradex-mainline-git/0001-mmc-Add-quirk-MMC_QUIRK_BROKEN_CACHE_FLUSH-for-Micro.patch115
-rw-r--r--recipes-kernel/linux/linux-toradex-mainline_git.bb1
2 files changed, 116 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-toradex-mainline-git/0001-mmc-Add-quirk-MMC_QUIRK_BROKEN_CACHE_FLUSH-for-Micro.patch b/recipes-kernel/linux/linux-toradex-mainline-git/0001-mmc-Add-quirk-MMC_QUIRK_BROKEN_CACHE_FLUSH-for-Micro.patch
new file mode 100644
index 0000000..f49f953
--- /dev/null
+++ b/recipes-kernel/linux/linux-toradex-mainline-git/0001-mmc-Add-quirk-MMC_QUIRK_BROKEN_CACHE_FLUSH-for-Micro.patch
@@ -0,0 +1,115 @@
+From e433e473498da8ee1c8d86b03eb38fbde9a2fb06 Mon Sep 17 00:00:00 2001
+From: Bean Huo <beanhuo@micron.com>
+Date: Mon, 30 Oct 2023 23:48:09 +0100
+Subject: [PATCH] mmc: Add quirk MMC_QUIRK_BROKEN_CACHE_FLUSH for Micron eMMC
+ Q2J54A
+
+Micron MTFC4GACAJCN eMMC supports cache but requires that flush cache
+operation be allowed only after a write has occurred. Otherwise, the
+cache flush command or subsequent commands will time out.
+
+Upstream-Status: Backport [ed9009ad300c0f15a3ecfe9613547b1962bde02c]
+
+Signed-off-by: Bean Huo <beanhuo@micron.com>
+Signed-off-by: Rafael Beims <rafael.beims@toradex.com>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/r/20231030224809.59245-1-beanhuo@iokpp.de
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+---
+ drivers/mmc/core/block.c | 4 +++-
+ drivers/mmc/core/card.h | 4 ++++
+ drivers/mmc/core/mmc.c | 8 ++++++--
+ drivers/mmc/core/quirks.h | 7 ++++---
+ include/linux/mmc/card.h | 2 ++
+ 5 files changed, 19 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
+index cdd7f126d4ae..17487807dbc4 100644
+--- a/drivers/mmc/core/block.c
++++ b/drivers/mmc/core/block.c
+@@ -2380,8 +2380,10 @@ enum mmc_issued mmc_blk_mq_issue_rq(struct mmc_queue *mq, struct request *req)
+ }
+ ret = mmc_blk_cqe_issue_flush(mq, req);
+ break;
+- case REQ_OP_READ:
+ case REQ_OP_WRITE:
++ card->written_flag = true;
++ fallthrough;
++ case REQ_OP_READ:
+ if (host->cqe_enabled)
+ ret = mmc_blk_cqe_issue_rw_rq(mq, req);
+ else
+diff --git a/drivers/mmc/core/card.h b/drivers/mmc/core/card.h
+index 4edf9057fa79..b7754a1b8d97 100644
+--- a/drivers/mmc/core/card.h
++++ b/drivers/mmc/core/card.h
+@@ -280,4 +280,8 @@ static inline int mmc_card_broken_sd_cache(const struct mmc_card *c)
+ return c->quirks & MMC_QUIRK_BROKEN_SD_CACHE;
+ }
+
++static inline int mmc_card_broken_cache_flush(const struct mmc_card *c)
++{
++ return c->quirks & MMC_QUIRK_BROKEN_CACHE_FLUSH;
++}
+ #endif
+diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
+index 4a4bab9aa726..6bcc323c1f4e 100644
+--- a/drivers/mmc/core/mmc.c
++++ b/drivers/mmc/core/mmc.c
+@@ -2081,13 +2081,17 @@ static int _mmc_flush_cache(struct mmc_host *host)
+ {
+ int err = 0;
+
++ if (mmc_card_broken_cache_flush(host->card) && !host->card->written_flag)
++ return 0;
++
+ if (_mmc_cache_enabled(host)) {
+ err = mmc_switch(host->card, EXT_CSD_CMD_SET_NORMAL,
+ EXT_CSD_FLUSH_CACHE, 1,
+ CACHE_FLUSH_TIMEOUT_MS);
+ if (err)
+- pr_err("%s: cache flush error %d\n",
+- mmc_hostname(host), err);
++ pr_err("%s: cache flush error %d\n", mmc_hostname(host), err);
++ else
++ host->card->written_flag = false;
+ }
+
+ return err;
+diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h
+index 857315f185fc..ec760ac0b397 100644
+--- a/drivers/mmc/core/quirks.h
++++ b/drivers/mmc/core/quirks.h
+@@ -117,11 +117,12 @@ static const struct mmc_fixup __maybe_unused mmc_blk_fixups[] = {
+ MMC_QUIRK_TRIM_BROKEN),
+
+ /*
+- * Micron MTFC4GACAJCN-1M advertises TRIM but it does not seems to
+- * support being used to offload WRITE_ZEROES.
++ * Micron MTFC4GACAJCN-1M supports TRIM but does not appear to support
++ * WRITE_ZEROES offloading. It also supports caching, but the cache can
++ * only be flushed after a write has occurred.
+ */
+ MMC_FIXUP("Q2J54A", CID_MANFID_MICRON, 0x014e, add_quirk_mmc,
+- MMC_QUIRK_TRIM_BROKEN),
++ MMC_QUIRK_TRIM_BROKEN | MMC_QUIRK_BROKEN_CACHE_FLUSH),
+
+ /*
+ * Some SD cards reports discard support while they don't
+diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
+index daa2f40d9ce6..7b12eebc5586 100644
+--- a/include/linux/mmc/card.h
++++ b/include/linux/mmc/card.h
+@@ -295,7 +295,9 @@ struct mmc_card {
+ #define MMC_QUIRK_BROKEN_HPI (1<<13) /* Disable broken HPI support */
+ #define MMC_QUIRK_BROKEN_SD_DISCARD (1<<14) /* Disable broken SD discard support */
+ #define MMC_QUIRK_BROKEN_SD_CACHE (1<<15) /* Disable broken SD cache support */
++#define MMC_QUIRK_BROKEN_CACHE_FLUSH (1<<16) /* Don't flush cache until the write has occurred */
+
++ bool written_flag; /* Indicates eMMC has been written since power on */
+ bool reenable_cmdq; /* Re-enable Command Queue */
+
+ unsigned int erase_size; /* erase size in sectors */
+--
+2.34.1
+
diff --git a/recipes-kernel/linux/linux-toradex-mainline_git.bb b/recipes-kernel/linux/linux-toradex-mainline_git.bb
index 2ee41c5..7f6852d 100644
--- a/recipes-kernel/linux/linux-toradex-mainline_git.bb
+++ b/recipes-kernel/linux/linux-toradex-mainline_git.bb
@@ -49,6 +49,7 @@ SRC_URI:append = " \
file://0003-dt-bindings-power-reset-gpio-poweroff-Add-priority-p.patch \
file://0004-power-reset-gpio-poweroff-make-sys-handler-priority-.patch \
file://0001-ARM-dts-imx6q-apalis-add-can-power-up-delay-on-ixora.patch \
+ file://0001-mmc-Add-quirk-MMC_QUIRK_BROKEN_CACHE_FLUSH-for-Micro.patch \
"
LINUX_VERSION ?= "6.1.60"