aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeonid Yegoshin <Leonid.Yegoshin@imgtec.com>2014-01-21 04:48:48 -0500
committerRalf Baechle <ralf@linux-mips.org>2014-03-26 18:09:19 -0400
commit4676f9359fa5190ee6f42bbf2c27d28beb14d26a (patch)
treed509258e6c14b290235e816eecc0e9237163bf7d
parent80ca69f40f26fb016e6d863b48fe1a1abdae8840 (diff)
MIPS: mm: c-r4k: Flush scache to avoid cache aliases
There is a chance for the secondary cache to have memory aliases. This can happen if the bootloader is in a non-EVA mode (or even in EVA mode but with different mapping from the kernel) and the kernel switching to EVA afterwards. It's best to flush the icache to avoid having the secondary CPUs fetching stale data from it. Signed-off-by: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com> Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
-rw-r--r--arch/mips/mm/c-r4k.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c
index 9b223e07f784..8fc713f1d139 100644
--- a/arch/mips/mm/c-r4k.c
+++ b/arch/mips/mm/c-r4k.c
@@ -640,6 +640,17 @@ static inline void local_r4k_flush_icache_range(unsigned long start, unsigned lo
640 break; 640 break;
641 } 641 }
642 } 642 }
643#ifdef CONFIG_EVA
644 /*
645 * Due to all possible segment mappings, there might cache aliases
646 * caused by the bootloader being in non-EVA mode, and the CPU switching
647 * to EVA during early kernel init. It's best to flush the scache
648 * to avoid having secondary cores fetching stale data and lead to
649 * kernel crashes.
650 */
651 bc_wback_inv(start, (end - start));
652 __sync();
653#endif
643} 654}
644 655
645static inline void local_r4k_flush_icache_range_ipi(void *args) 656static inline void local_r4k_flush_icache_range_ipi(void *args)