diff mbox series

[v2] mmc: rockchip_sdhci: Fix 4 blocks PIO mode read limit for RK35xx

Message ID 20240410143052.227908-1-jonas@kwiboo.se
State Accepted
Delegated to: Kever Yang
Headers show
Series [v2] mmc: rockchip_sdhci: Fix 4 blocks PIO mode read limit for RK35xx | expand

Commit Message

Jonas Karlman April 10, 2024, 2:30 p.m. UTC
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 <jonas@kwiboo.se>
---
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(-)

Comments

Dragan Simic April 15, 2024, 9:19 a.m. UTC | #1
On 2024-04-10 16: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 <jonas@kwiboo.se>

Looking good to me.  Thanks for peforming this dynamically, based
on the actual MMC interface speed/mode.

Reviewed-by: Dragan Simic <dsimic@manjaro.org>

> ---
> 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);
>  }
Kever Yang April 22, 2024, 8:39 a.m. UTC | #2
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 <jonas@kwiboo.se>
Reviewed-by: Kever Yang <kever.yang@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);
>   }
>
diff mbox series

Patch

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);
 }