[U-Boot] [PATCH RFC] fsl_esdhc: flush cache after non-read operation
Marek Vasut
marex at denx.de
Sat Mar 29 04:45:15 CET 2014
On Friday, March 28, 2014 at 03:36:42 PM, Eric Nelson wrote:
> Hi Hector,
>
> On 03/28/2014 06:49 AM, Fabio Estevam wrote:
> > On Fri, Mar 28, 2014 at 7:15 AM, Hector Palacios
> >
> > <hector.palacios at digi.com> wrote:
> >> Cache was invalidated on the read operation, but it should
> >> also be flushed otherwise.
> >>
> >> Signed-off-by: Hector Palacios <hector.palacios at digi.com>
> >
> > Thanks, Hector.
> >
> > Adding Marek on Cc as well.
> >
> >> ---
> >>
> >> Notes:
> >> After enabling L2 cache on i.MX6 I found out that many times
> >> when running the 'gpt' command to partition a uSD card, the
> >> data was not written at all, or was badly written to the media.
> >>
> >> This patch seems to solve it but I'm not sure if that's the
> >> right place to flush the cache. Could someone please comment?
> >>
> >> Thank you.
> >>
> >> drivers/mmc/fsl_esdhc.c | 12 ++++++++++++
> >> 1 file changed, 12 insertions(+)
> >>
> >> diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c
> >> index e945c0a470ca..5ef575eb0272 100644
> >> --- a/drivers/mmc/fsl_esdhc.c
> >> +++ b/drivers/mmc/fsl_esdhc.c
> >> @@ -253,6 +253,16 @@ static int esdhc_setup_data(struct mmc *mmc, struct
> >> mmc_data *data)
> >>
> >> return 0;
> >>
> >> }
> >>
> >> +static void check_and_flush_dcache_range
> >> + (struct mmc_cmd *cmd,
> >> + struct mmc_data *data) {
> >> + unsigned start = (unsigned)data->dest ;
> >> + unsigned size = roundup(ARCH_DMA_MINALIGN,
> >> + data->blocks*data->blocksize);
> >> + unsigned end = start+size ;
> >> + flush_dcache_range(start, end);
> >> +}
> >> +
> >>
> >> static void check_and_invalidate_dcache_range
> >>
> >> (struct mmc_cmd *cmd,
> >>
> >> struct mmc_data *data) {
> >>
> >> @@ -401,6 +411,8 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
> >> struct mmc_data *data)
> >>
> >> #endif
> >>
> >> if (data->flags & MMC_DATA_READ)
> >>
> >> check_and_invalidate_dcache_range(cmd, data);
> >>
> >> + else
> >> + check_and_flush_dcache_range(cmd, data);
> >>
> >> }
>
> Since this comes after the wait for completion, this is
> clearly not the right fix.
ACK
> If this patch is fixing the problem, the issue must be somewhere else.
>
> Can you verify that the call to flush_dcache_range() in the
> esdhc_setup_data routine is being called prior to esdhc_send_command?
More information about the U-Boot
mailing list