[U-Boot] [PATCH] ls2085a: esdhc: flush D-cache before 'mmc read'
Pantelis Antoniou
pantelis.antoniou at gmail.com
Wed Aug 12 09:19:59 CEST 2015
Hi Yangbo,
> On Jun 24, 2015, at 05:13 , Yangbo Lu <yangbo.lu at freescale.com> wrote:
>
> It needs to flush D-cache before 'mmc read' so that
> we can see the right data in DDR. And fix parameter
> for invalidate_dcache_range() after 'mmc read'.
>
> Signed-off-by: Yangbo Lu <yangbo.lu at freescale.com>
> Cc: York Sun <yorksun at freescale.com>
> ---
> drivers/mmc/fsl_esdhc.c | 21 +++++++++++++++------
> 1 file changed, 15 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c
> index c4719e6..3ca25bd 100644
> --- a/drivers/mmc/fsl_esdhc.c
> +++ b/drivers/mmc/fsl_esdhc.c
> @@ -192,6 +192,17 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
> wml_value = data->blocksize/4;
>
> if (data->flags & MMC_DATA_READ) {
> +#ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
> +#ifdef CONFIG_LS2085A
> + /*
> + * It's temporary for ls2085a so that
> + * we can see right data in DDR
> + */
> + flush_dcache_range((ulong)data->dest,
> + (ulong)data->dest+data->blocks
> + *data->blocksize);
> +#endif
> +#endif
> if (wml_value > WML_RD_WML_MAX)
> wml_value = WML_RD_WML_MAX_VAL;
>
This looks like not board/soc specific, more like whether a non-coherent architecture.
Please rework as a configuration option that’s suited for that kind of architectures.
It looks like you’re only doing this for reads? What about writes?
> @@ -278,14 +289,9 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
> static void check_and_invalidate_dcache_range
> (struct mmc_cmd *cmd,
> struct mmc_data *data) {
> -#ifdef CONFIG_LS2085A
> - unsigned start = 0;
> -#else
> - unsigned start = (unsigned)data->dest ;
> -#endif
> + unsigned start, end;
> unsigned size = roundup(ARCH_DMA_MINALIGN,
> data->blocks*data->blocksize);
> - unsigned end = start+size ;
> #ifdef CONFIG_LS2085A
> dma_addr_t addr;
>
> @@ -294,7 +300,10 @@ static void check_and_invalidate_dcache_range
> printf("Error found for upper 32 bits\n");
> else
> start = lower_32_bits(addr);
> +#else
> + start = (unsigned)data->dest;
> #endif
> + end = start + size;
> invalidate_dcache_range(start, end);
> }
> #endif
> --
> 2.1.0.27.g96db324
>
Regards
— Pantelis
More information about the U-Boot
mailing list