On 2024/4/10 22:30, Jonas Karlman wrote:
The commit 2cc6cde647e2 ("mmc: rockchip_sdhci: Limit number of blocks
read in a single command") introduced a limit of number of blocks to
read to fix a Data End Bit Error on RK3568 and RK3588. This had a side
affect of significant slowing down reading FIT from eMMC.

After the commit 6de9d7b2f13c ("rockchip: rk35xx: Enable eMMC HS200 mode
by default") the limit of number of blocks to read workaround is no
longer necessary and at HS200+ a Data End Bit Error is no longer
happening using PIO mode.

Change this limitation to allow reading more than 4 blocks with a single
CMD18 command in PIO mode at HS200+ speed, keep using the 4 blocks
limitation when loadig FIT from eMMC at lower speed than HS200.

Fixes: 2cc6cde647e2 ("mmc: rockchip_sdhci: Limit number of blocks read in a single 
command")
Signed-off-by: Jonas Karlman <jo...@kwiboo.se>
Reviewed-by: Kever Yang <kever.y...@rock-chips.com>

Thanks,
- Kever
---
v2: Move cfg->b_max configuration to set_ios_post() ops

This significantly speed up FIT loading from eMMC on RK3588 boards with
a mmc-hs200 prop in the sdhci node, and boards without a mmc-hs200 prop
continue to work.
---
  drivers/mmc/rockchip_sdhci.c | 26 ++++++++++++++++----------
  1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/drivers/mmc/rockchip_sdhci.c b/drivers/mmc/rockchip_sdhci.c
index 706fb1235796..c889c7bc9855 100644
--- a/drivers/mmc/rockchip_sdhci.c
+++ b/drivers/mmc/rockchip_sdhci.c
@@ -391,6 +391,8 @@ static int rk3568_sdhci_config_dll(struct sdhci_host *host, 
u32 clock, bool enab
  static int rk3568_sdhci_set_ios_post(struct sdhci_host *host)
  {
        struct mmc *mmc = host->mmc;
+       struct rockchip_sdhc_plat *plat = dev_get_plat(mmc->dev);
+       struct mmc_config *cfg = &plat->cfg;
        u32 reg;
reg = sdhci_readw(host, SDHCI_HOST_CONTROL2);
@@ -437,6 +439,20 @@ static int rk3568_sdhci_set_ios_post(struct sdhci_host 
*host)
sdhci_writew(host, reg, DWCMSHC_EMMC_EMMC_CTRL); + /*
+        * Reading more than 4 blocks with a single CMD18 command in PIO mode
+        * triggers Data End Bit Error using a slower mode than HS200. Limit to
+        * reading max 4 blocks in one command when using PIO mode.
+        */
+       if (!(host->flags & USE_DMA)) {
+               if (mmc->selected_mode == MMC_HS_200 ||
+                   mmc->selected_mode == MMC_HS_400 ||
+                   mmc->selected_mode == MMC_HS_400_ES)
+                       cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
+               else
+                       cfg->b_max = 4;
+       }
+
        return 0;
  }
@@ -598,16 +614,6 @@ static int rockchip_sdhci_probe(struct udevice *dev)
            dev_read_bool(dev, "u-boot,spl-fifo-mode"))
                host->flags &= ~USE_DMA;
- /*
-        * Reading more than 4 blocks with a single CMD18 command in PIO mode
-        * triggers Data End Bit Error on RK3568 and RK3588. Limit to reading
-        * max 4 blocks in one command when using PIO mode.
-        */
-       if (!(host->flags & USE_DMA) &&
-           (device_is_compatible(dev, "rockchip,rk3568-dwcmshc") ||
-            device_is_compatible(dev, "rockchip,rk3588-dwcmshc")))
-               cfg->b_max = 4;
-
        return sdhci_probe(dev);
  }

Reply via email to