diff options
Diffstat (limited to 'arch/csky/mm/cachev2.c')
| -rw-r--r-- | arch/csky/mm/cachev2.c | 45 | 
1 files changed, 22 insertions, 23 deletions
diff --git a/arch/csky/mm/cachev2.c b/arch/csky/mm/cachev2.c index b61be6518e21..bc419f8039d3 100644 --- a/arch/csky/mm/cachev2.c +++ b/arch/csky/mm/cachev2.c @@ -3,15 +3,25 @@  #include <linux/spinlock.h>  #include <linux/smp.h> +#include <linux/mm.h>  #include <asm/cache.h>  #include <asm/barrier.h> -inline void dcache_wb_line(unsigned long start) +#define INS_CACHE		(1 << 0) +#define CACHE_INV		(1 << 4) + +void local_icache_inv_all(void *priv)  { -	asm volatile("dcache.cval1 %0\n"::"r"(start):"memory"); +	mtcr("cr17", INS_CACHE|CACHE_INV);  	sync_is();  } +void icache_inv_all(void) +{ +	on_each_cpu(local_icache_inv_all, NULL, 1); +} + +#ifdef CONFIG_CPU_HAS_ICACHE_INS  void icache_inv_range(unsigned long start, unsigned long end)  {  	unsigned long i = start & ~(L1_CACHE_BYTES - 1); @@ -20,43 +30,32 @@ void icache_inv_range(unsigned long start, unsigned long end)  		asm volatile("icache.iva %0\n"::"r"(i):"memory");  	sync_is();  } - -void icache_inv_all(void) +#else +void icache_inv_range(unsigned long start, unsigned long end)  { -	asm volatile("icache.ialls\n":::"memory"); -	sync_is(); +	icache_inv_all();  } +#endif -void dcache_wb_range(unsigned long start, unsigned long end) +inline void dcache_wb_line(unsigned long start)  { -	unsigned long i = start & ~(L1_CACHE_BYTES - 1); - -	for (; i < end; i += L1_CACHE_BYTES) -		asm volatile("dcache.cval1 %0\n"::"r"(i):"memory"); +	asm volatile("dcache.cval1 %0\n"::"r"(start):"memory");  	sync_is();  } -void dcache_inv_range(unsigned long start, unsigned long end) +void dcache_wb_range(unsigned long start, unsigned long end)  {  	unsigned long i = start & ~(L1_CACHE_BYTES - 1);  	for (; i < end; i += L1_CACHE_BYTES) -		asm volatile("dcache.civa %0\n"::"r"(i):"memory"); +		asm volatile("dcache.cval1 %0\n"::"r"(i):"memory");  	sync_is();  }  void cache_wbinv_range(unsigned long start, unsigned long end)  { -	unsigned long i = start & ~(L1_CACHE_BYTES - 1); - -	for (; i < end; i += L1_CACHE_BYTES) -		asm volatile("dcache.cval1 %0\n"::"r"(i):"memory"); -	sync_is(); - -	i = start & ~(L1_CACHE_BYTES - 1); -	for (; i < end; i += L1_CACHE_BYTES) -		asm volatile("icache.iva %0\n"::"r"(i):"memory"); -	sync_is(); +	dcache_wb_range(start, end); +	icache_inv_range(start, end);  }  EXPORT_SYMBOL(cache_wbinv_range);  |