diff options
Diffstat (limited to 'arch/mips/mm/c-r4k.c')
| -rw-r--r-- | arch/mips/mm/c-r4k.c | 18 | 
1 files changed, 14 insertions, 4 deletions
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index e12dfa48b478..a9ef057c79fe 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c @@ -830,12 +830,13 @@ static void r4k_flush_icache_user_range(unsigned long start, unsigned long end)  	return __r4k_flush_icache_range(start, end, true);  } -#if defined(CONFIG_DMA_NONCOHERENT) || defined(CONFIG_DMA_MAYBE_COHERENT) +#ifdef CONFIG_DMA_NONCOHERENT  static void r4k_dma_cache_wback_inv(unsigned long addr, unsigned long size)  {  	/* Catch bad driver code */ -	BUG_ON(size == 0); +	if (WARN_ON(size == 0)) +		return;  	preempt_disable();  	if (cpu_has_inclusive_pcaches) { @@ -871,7 +872,8 @@ static void r4k_dma_cache_wback_inv(unsigned long addr, unsigned long size)  static void r4k_dma_cache_inv(unsigned long addr, unsigned long size)  {  	/* Catch bad driver code */ -	BUG_ON(size == 0); +	if (WARN_ON(size == 0)) +		return;  	preempt_disable();  	if (cpu_has_inclusive_pcaches) { @@ -904,7 +906,7 @@ static void r4k_dma_cache_inv(unsigned long addr, unsigned long size)  	bc_inv(addr, size);  	__sync();  } -#endif /* CONFIG_DMA_NONCOHERENT || CONFIG_DMA_MAYBE_COHERENT */ +#endif /* CONFIG_DMA_NONCOHERENT */  struct flush_cache_sigtramp_args {  	struct mm_struct *mm; @@ -1505,6 +1507,14 @@ static void probe_pcache(void)  	if (c->dcache.flags & MIPS_CACHE_PINDEX)  		c->dcache.flags &= ~MIPS_CACHE_ALIASES; +	/* +	 * In systems with CM the icache fills from L2 or closer caches, and +	 * thus sees remote stores without needing to write them back any +	 * further than that. +	 */ +	if (mips_cm_present()) +		c->icache.flags |= MIPS_IC_SNOOPS_REMOTE; +  	switch (current_cpu_type()) {  	case CPU_20KC:  		/*  | 
