From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marek Vasut Date: Mon, 2 Apr 2012 18:29:45 +0200 Subject: [U-Boot] [PATCH V3 1/4] ARM1136: add cache flush and invalidate operations In-Reply-To: <1333383480-16028-1-git-send-email-sbabic@denx.de> References: <1333286581-27939-1-git-send-email-sbabic@denx.de> <1333383480-16028-1-git-send-email-sbabic@denx.de> Message-ID: <201204021829.46104.marex@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Dear Stefano Babic, > From: Anatolij Gustschin > > Since commit 5c1ad3e6f8ae578bbe30e09652f1531e9bc22031 > (net: fec_mxc: allow use with cache enabled) the FEC_MXC > driver uses flush_dcache_range() and invalidate_dcache_range() > functions. This driver is also configured for ARM1136 based > 'flea3' and 'mx35pdk' boards which currently do not build > as there are no ARM1136 specific flush_dcache_range() and > invalidate_dcache_range() functions. Add various ARM1136 > cache functions to fix building for 'flea3' and 'mx35pdk'. > > Signed-off-by: Anatolij Gustschin > Signed-off-by: Stefano Babic > Cc: Fabio Estevam > CC: Mike Frysinger > CC: Marek Vasut > --- > arch/arm/cpu/arm1136/cpu.c | 95 > ++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 95 > insertions(+), 0 deletions(-) > > Changes since V2: > - use debug instead of printf in case of misalignment (M. Frysinger, M. > Vasut) > > Changes since V1: > > - use the same routine as in ARM926ejs to check range to easy detect > misalignment (S. Babic) - cache are still disable - add enable_caches (S. > Babic) Acked-by: Marek Vasut > > diff --git a/arch/arm/cpu/arm1136/cpu.c b/arch/arm/cpu/arm1136/cpu.c > index 2b91631..f2e30b5 100644 > --- a/arch/arm/cpu/arm1136/cpu.c > +++ b/arch/arm/cpu/arm1136/cpu.c > @@ -75,3 +75,98 @@ static void cache_flush(void) > asm ("mcr p15, 0, %0, c7, c7, 0": :"r" (i)); /* invalidate both caches > and flush btb */ asm ("mcr p15, 0, %0, c7, c10, 4": :"r" (i)); /* mem > barrier to sync things */ } > + > +#ifndef CONFIG_SYS_DCACHE_OFF > + > +#ifndef CONFIG_SYS_CACHELINE_SIZE > +#define CONFIG_SYS_CACHELINE_SIZE 32 > +#endif > + > +void invalidate_dcache_all(void) > +{ > + asm ("mcr p15, 0, %0, c7, c6, 0" : : "r" (0)); > +} > + > +void flush_dcache_all(void) > +{ > + asm ("mcr p15, 0, %0, c7, c10, 0" : : "r" (0)); > + asm ("mcr p15, 0, %0, c7, c10, 4" : : "r" (0)); > +} > + > +static inline int bad_cache_range(unsigned long start, unsigned long stop) > +{ > + int ok = 1; > + > + if (start & (CONFIG_SYS_CACHELINE_SIZE - 1)) > + ok = 0; > + > + if (stop & (CONFIG_SYS_CACHELINE_SIZE - 1)) > + ok = 0; > + > + if (!ok) > + debug("CACHE: Misaligned operation at range [%08lx, %08lx]\n", > + start, stop); > + > + return ok; > +} > + > +void invalidate_dcache_range(unsigned long start, unsigned long stop) > +{ > + if (bad_cache_range(start, stop)) > + return; > + > + while (start < stop) { > + asm ("mcr p15, 0, %0, c7, c6, 1" : : "r" (start)); > + start += CONFIG_SYS_CACHELINE_SIZE; > + } > +} > + > +void flush_dcache_range(unsigned long start, unsigned long stop) > +{ > + if (bad_cache_range(start, stop)) > + return; > + > + while (start < stop) { > + asm ("mcr p15, 0, %0, c7, c14, 1" : : "r" (start)); > + start += CONFIG_SYS_CACHELINE_SIZE; > + } > + > + asm ("mcr p15, 0, %0, c7, c10, 4" : : "r" (0)); > +} > + > +void flush_cache(unsigned long start, unsigned long size) > +{ > + flush_dcache_range(start, start + size); > +} > + > +void enable_caches(void) > +{ > +#ifndef CONFIG_SYS_ICACHE_OFF > + icache_enable(); > +#endif > +#ifndef CONFIG_SYS_DCACHE_OFF > + dcache_enable(); > +#endif > +} > + > +#else /* #ifndef CONFIG_SYS_DCACHE_OFF */ > +void invalidate_dcache_all(void) > +{ > +} > + > +void flush_dcache_all(void) > +{ > +} > + > +void invalidate_dcache_range(unsigned long start, unsigned long stop) > +{ > +} > + > +void flush_dcache_range(unsigned long start, unsigned long stop) > +{ > +} > + > +void flush_cache(unsigned long start, unsigned long size) > +{ > +} > +#endif /* #ifndef CONFIG_SYS_DCACHE_OFF */