From 0986a89d1a073e650a2d2aa727a1c3b5970b1113 Mon Sep 17 00:00:00 2001 From: Parth Pancholi Date: Wed, 8 Nov 2023 12:53:59 +0100 Subject: 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 Signed-off-by: Rafael Beims Signed-off-by: Parth Pancholi --- ...rk-MMC_QUIRK_BROKEN_CACHE_FLUSH-for-Micro.patch | 115 +++++++++++++++++++++ recipes-kernel/linux/linux-toradex-mainline_git.bb | 1 + 2 files changed, 116 insertions(+) create mode 100644 recipes-kernel/linux/linux-toradex-mainline-git/0001-mmc-Add-quirk-MMC_QUIRK_BROKEN_CACHE_FLUSH-for-Micro.patch 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 +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 +Signed-off-by: Rafael Beims +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/20231030224809.59245-1-beanhuo@iokpp.de +Signed-off-by: Ulf Hansson +--- + 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" -- cgit v1.2.3