Title: [6629] trunk/arch/blackfin: Fix bug[#5213] Add blackfin_invalidate_entire_icache to SMP kernel.
- Revision
- 6629
- Author
- sonicz
- Date
- 2009-06-10 03:57:08 -0500 (Wed, 10 Jun 2009)
Log Message
Fix bug[#5213] Add blackfin_invalidate_entire_icache to SMP kernel.
Modified Paths
Diff
Modified: trunk/arch/blackfin/include/asm/cache.h (6628 => 6629)
--- trunk/arch/blackfin/include/asm/cache.h 2009-06-10 08:45:41 UTC (rev 6628)
+++ trunk/arch/blackfin/include/asm/cache.h 2009-06-10 08:57:08 UTC (rev 6629)
@@ -34,9 +34,13 @@
#define L1_CACHE_SHIFT_MAX 5
#if defined(CONFIG_SMP) && \
- !defined(CONFIG_BFIN_CACHE_COHERENT) && \
- defined(CONFIG_BFIN_DCACHE)
-#define __ARCH_SYNC_CORE_DCACHE
+ !defined(CONFIG_BFIN_CACHE_COHERENT)
+# if defined(CONFIG_BFIN_ICACHE)
+# define __ARCH_SYNC_CORE_ICACHE
+# endif
+# if defined(CONFIG_BFIN_DCACHE)
+# define __ARCH_SYNC_CORE_DCACHE
+# endif
#ifndef __ASSEMBLY__
asmlinkage void __raw_smp_mark_barrier_asm(void);
asmlinkage void __raw_smp_check_barrier_asm(void);
@@ -51,6 +55,7 @@
}
void resync_core_dcache(void);
+void resync_core_icache(void);
#endif
#endif
Modified: trunk/arch/blackfin/include/asm/cacheflush.h (6628 => 6629)
--- trunk/arch/blackfin/include/asm/cacheflush.h 2009-06-10 08:45:41 UTC (rev 6628)
+++ trunk/arch/blackfin/include/asm/cacheflush.h 2009-06-10 08:57:08 UTC (rev 6629)
@@ -37,6 +37,7 @@
extern void blackfin_dcache_invalidate_range(unsigned long start_address, unsigned long end_address);
extern void blackfin_dflush_page(void *page);
extern void blackfin_invalidate_entire_dcache(void);
+extern void blackfin_invalidate_entire_icache(void);
#define flush_dcache_mmap_lock(mapping) do { } while (0)
#define flush_dcache_mmap_unlock(mapping) do { } while (0)
Modified: trunk/arch/blackfin/include/asm/cpu.h (6628 => 6629)
--- trunk/arch/blackfin/include/asm/cpu.h 2009-06-10 08:45:41 UTC (rev 6628)
+++ trunk/arch/blackfin/include/asm/cpu.h 2009-06-10 08:57:08 UTC (rev 6629)
@@ -34,6 +34,7 @@
unsigned int dmemctl;
unsigned long loops_per_jiffy;
unsigned long dcache_invld_count;
+ unsigned long icache_invld_count;
};
DECLARE_PER_CPU(struct blackfin_cpudata, cpu_data);
Modified: trunk/arch/blackfin/kernel/setup.c (6628 => 6629)
--- trunk/arch/blackfin/kernel/setup.c 2009-06-10 08:45:41 UTC (rev 6628)
+++ trunk/arch/blackfin/kernel/setup.c 2009-06-10 08:57:08 UTC (rev 6629)
@@ -1181,6 +1181,9 @@
#ifdef __ARCH_SYNC_CORE_DCACHE
seq_printf(m, "SMP Dcache Flushes\t: %lu\n\n", cpudata->dcache_invld_count);
#endif
+#ifdef __ARCH_SYNC_CORE_ICACHE
+ seq_printf(m, "SMP Icache Flushes\t: %lu\n\n", cpudata->icache_invld_count);
+#endif
#ifdef CONFIG_BFIN_ICACHE_LOCK
switch ((cpudata->imemctl >> 3) & WAYALL_L) {
case WAY0_L:
Modified: trunk/arch/blackfin/mach-common/cache-c.c (6628 => 6629)
--- trunk/arch/blackfin/mach-common/cache-c.c 2009-06-10 08:45:41 UTC (rev 6628)
+++ trunk/arch/blackfin/mach-common/cache-c.c 2009-06-10 08:57:08 UTC (rev 6629)
@@ -16,9 +16,21 @@
void blackfin_invalidate_entire_dcache(void)
{
u32 dmem = bfin_read_DMEM_CONTROL();
- SSYNC();
bfin_write_DMEM_CONTROL(dmem & ~0xc);
SSYNC();
bfin_write_DMEM_CONTROL(dmem);
SSYNC();
}
+
+/* Invalidate the Entire Instruction cache by
+ * clearing IMC bit
+ */
+void blackfin_invalidate_entire_icache(void)
+{
+ u32 imem = bfin_read_IMEM_CONTROL();
+ bfin_write_IMEM_CONTROL(imem & ~0x4);
+ SSYNC();
+ bfin_write_IMEM_CONTROL(imem);
+ SSYNC();
+}
+
Modified: trunk/arch/blackfin/mach-common/smp.c (6628 => 6629)
--- trunk/arch/blackfin/mach-common/smp.c 2009-06-10 08:45:41 UTC (rev 6628)
+++ trunk/arch/blackfin/mach-common/smp.c 2009-06-10 08:57:08 UTC (rev 6629)
@@ -469,6 +469,17 @@
}
EXPORT_SYMBOL_GPL(smp_icache_flush_range_others);
+#ifdef __ARCH_SYNC_CORE_ICACHE
+void resync_core_icache(void)
+{
+ unsigned int cpu = get_cpu();
+ blackfin_invalidate_entire_icache();
+ ++per_cpu(cpu_data, cpu).icache_invld_count;
+ put_cpu();
+}
+EXPORT_SYMBOL(resync_core_icache);
+#endif
+
#ifdef __ARCH_SYNC_CORE_DCACHE
unsigned long barrier_mask __attribute__ ((__section__(".l2.bss")));
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits