[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