diff options
Diffstat (limited to 'arch/mips/mm/c-r4k.c')
| -rw-r--r-- | arch/mips/mm/c-r4k.c | 35 | 
1 files changed, 35 insertions, 0 deletions
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index b9aabb998a3..a79fe9aa772 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c @@ -722,6 +722,39 @@ static void r4k_flush_icache_all(void)  		r4k_blast_icache();  } +struct flush_kernel_vmap_range_args { +	unsigned long	vaddr; +	int		size; +}; + +static inline void local_r4k_flush_kernel_vmap_range(void *args) +{ +	struct flush_kernel_vmap_range_args *vmra = args; +	unsigned long vaddr = vmra->vaddr; +	int size = vmra->size; + +	/* +	 * Aliases only affect the primary caches so don't bother with +	 * S-caches or T-caches. +	 */ +	if (cpu_has_safe_index_cacheops && size >= dcache_size) +		r4k_blast_dcache(); +	else { +		R4600_HIT_CACHEOP_WAR_IMPL; +		blast_dcache_range(vaddr, vaddr + size); +	} +} + +static void r4k_flush_kernel_vmap_range(unsigned long vaddr, int size) +{ +	struct flush_kernel_vmap_range_args args; + +	args.vaddr = (unsigned long) vaddr; +	args.size = size; + +	r4k_on_each_cpu(local_r4k_flush_kernel_vmap_range, &args); +} +  static inline void rm7k_erratum31(void)  {  	const unsigned long ic_lsize = 32; @@ -1403,6 +1436,8 @@ void __cpuinit r4k_cache_init(void)  	flush_cache_page	= r4k_flush_cache_page;  	flush_cache_range	= r4k_flush_cache_range; +	__flush_kernel_vmap_range = r4k_flush_kernel_vmap_range; +  	flush_cache_sigtramp	= r4k_flush_cache_sigtramp;  	flush_icache_all	= r4k_flush_icache_all;  	local_flush_data_cache_page	= local_r4k_flush_data_cache_page;  |