aboutsummaryrefslogtreecommitdiffstats
path: root/arch/blackfin/mach-common/smp.c
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2011-04-27 08:44:34 +0100
committerRussell King <rmk+kernel@arm.linux.org.uk>2011-04-27 08:44:34 +0100
commit167f829752f9cef51f59cc500abc0ad6ba69f5cb (patch)
treed3ec172cdd864c748bea2c014943fc13873fefc0 /arch/blackfin/mach-common/smp.c
parente04d6c53a58cee3380adaa66fe2eeffbd82d213c (diff)
parent45b146d746ea1b7f87b023a79d5186d0e87793eb (diff)
downloadkernel_samsung_smdk4412-167f829752f9cef51f59cc500abc0ad6ba69f5cb.tar.gz
kernel_samsung_smdk4412-167f829752f9cef51f59cc500abc0ad6ba69f5cb.tar.bz2
kernel_samsung_smdk4412-167f829752f9cef51f59cc500abc0ad6ba69f5cb.zip
Merge branch 'davinci-fixes' of git://gitorious.org/linux-davinci/linux-davinci into fixes
Diffstat (limited to 'arch/blackfin/mach-common/smp.c')
-rw-r--r--arch/blackfin/mach-common/smp.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/arch/blackfin/mach-common/smp.c b/arch/blackfin/mach-common/smp.c
index 6e17a265c4d..8bce5ed031e 100644
--- a/arch/blackfin/mach-common/smp.c
+++ b/arch/blackfin/mach-common/smp.c
@@ -109,10 +109,23 @@ static void ipi_flush_icache(void *info)
struct blackfin_flush_data *fdata = info;
/* Invalidate the memory holding the bounds of the flushed region. */
- invalidate_dcache_range((unsigned long)fdata,
- (unsigned long)fdata + sizeof(*fdata));
+ blackfin_dcache_invalidate_range((unsigned long)fdata,
+ (unsigned long)fdata + sizeof(*fdata));
+
+ /* Make sure all write buffers in the data side of the core
+ * are flushed before trying to invalidate the icache. This
+ * needs to be after the data flush and before the icache
+ * flush so that the SSYNC does the right thing in preventing
+ * the instruction prefetcher from hitting things in cached
+ * memory at the wrong time -- it runs much further ahead than
+ * the pipeline.
+ */
+ SSYNC();
- flush_icache_range(fdata->start, fdata->end);
+ /* ipi_flaush_icache is invoked by generic flush_icache_range,
+ * so call blackfin arch icache flush directly here.
+ */
+ blackfin_icache_flush_range(fdata->start, fdata->end);
}
static void ipi_call_function(unsigned int cpu, struct ipi_message *msg)