OSDN Git Service

sh: Split out SH-4 __flush_xxx_region() ops.
authorPaul Mundt <lethal@linux-sh.org>
Tue, 4 Aug 2009 09:06:01 +0000 (18:06 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Tue, 4 Aug 2009 09:06:01 +0000 (18:06 +0900)
This splits out the SH-4 __flush_xxx_region() functions and defines them
as weak symbols. This allows us to provide optimized versions without
having to ifdef cache-sh4.c to death.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/mm/Makefile_32
arch/sh/mm/cache-sh4.c
arch/sh/mm/flush-sh4.c [new file with mode: 0644]

index 62e2807..17b0252 100644 (file)
@@ -8,7 +8,7 @@ ifndef CONFIG_CACHE_OFF
 cache-$(CONFIG_CPU_SH2)                := cache-sh2.o
 cache-$(CONFIG_CPU_SH2A)       := cache-sh2a.o
 cache-$(CONFIG_CPU_SH3)                := cache-sh3.o
-cache-$(CONFIG_CPU_SH4)                := cache-sh4.o
+cache-$(CONFIG_CPU_SH4)                := cache-sh4.o flush-sh4.o
 cache-$(CONFIG_SH7705_CACHE_32KB)      += cache-sh7705.o
 endif
 
index c3a09b2..dfc1d03 100644 (file)
@@ -119,66 +119,6 @@ void __init p3_cache_init(void)
 }
 
 /*
- * Write back the dirty D-caches, but not invalidate them.
- *
- * START: Virtual Address (U0, P1, or P3)
- * SIZE: Size of the region.
- */
-void __flush_wback_region(void *start, int size)
-{
-       unsigned long v;
-       unsigned long begin, end;
-
-       begin = (unsigned long)start & ~(L1_CACHE_BYTES-1);
-       end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
-               & ~(L1_CACHE_BYTES-1);
-       for (v = begin; v < end; v+=L1_CACHE_BYTES) {
-               asm volatile("ocbwb     %0"
-                            : /* no output */
-                            : "m" (__m(v)));
-       }
-}
-
-/*
- * Write back the dirty D-caches and invalidate them.
- *
- * START: Virtual Address (U0, P1, or P3)
- * SIZE: Size of the region.
- */
-void __flush_purge_region(void *start, int size)
-{
-       unsigned long v;
-       unsigned long begin, end;
-
-       begin = (unsigned long)start & ~(L1_CACHE_BYTES-1);
-       end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
-               & ~(L1_CACHE_BYTES-1);
-       for (v = begin; v < end; v+=L1_CACHE_BYTES) {
-               asm volatile("ocbp      %0"
-                            : /* no output */
-                            : "m" (__m(v)));
-       }
-}
-
-/*
- * No write back please
- */
-void __flush_invalidate_region(void *start, int size)
-{
-       unsigned long v;
-       unsigned long begin, end;
-
-       begin = (unsigned long)start & ~(L1_CACHE_BYTES-1);
-       end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
-               & ~(L1_CACHE_BYTES-1);
-       for (v = begin; v < end; v+=L1_CACHE_BYTES) {
-               asm volatile("ocbi      %0"
-                            : /* no output */
-                            : "m" (__m(v)));
-       }
-}
-
-/*
  * Write back the range of D-cache, and purge the I-cache.
  *
  * Called from kernel/module.c:sys_init_module and routine for a.out format,
diff --git a/arch/sh/mm/flush-sh4.c b/arch/sh/mm/flush-sh4.c
new file mode 100644 (file)
index 0000000..e6d918f
--- /dev/null
@@ -0,0 +1,63 @@
+#include <linux/mm.h>
+#include <asm/mmu_context.h>
+#include <asm/cacheflush.h>
+
+/*
+ * Write back the dirty D-caches, but not invalidate them.
+ *
+ * START: Virtual Address (U0, P1, or P3)
+ * SIZE: Size of the region.
+ */
+void __weak __flush_wback_region(void *start, int size)
+{
+       unsigned long v;
+       unsigned long begin, end;
+
+       begin = (unsigned long)start & ~(L1_CACHE_BYTES-1);
+       end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
+               & ~(L1_CACHE_BYTES-1);
+       for (v = begin; v < end; v+=L1_CACHE_BYTES) {
+               asm volatile("ocbwb     %0"
+                            : /* no output */
+                            : "m" (__m(v)));
+       }
+}
+
+/*
+ * Write back the dirty D-caches and invalidate them.
+ *
+ * START: Virtual Address (U0, P1, or P3)
+ * SIZE: Size of the region.
+ */
+void __weak __flush_purge_region(void *start, int size)
+{
+       unsigned long v;
+       unsigned long begin, end;
+
+       begin = (unsigned long)start & ~(L1_CACHE_BYTES-1);
+       end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
+               & ~(L1_CACHE_BYTES-1);
+       for (v = begin; v < end; v+=L1_CACHE_BYTES) {
+               asm volatile("ocbp      %0"
+                            : /* no output */
+                            : "m" (__m(v)));
+       }
+}
+
+/*
+ * No write back please
+ */
+void __weak __flush_invalidate_region(void *start, int size)
+{
+       unsigned long v;
+       unsigned long begin, end;
+
+       begin = (unsigned long)start & ~(L1_CACHE_BYTES-1);
+       end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
+               & ~(L1_CACHE_BYTES-1);
+       for (v = begin; v < end; v+=L1_CACHE_BYTES) {
+               asm volatile("ocbi      %0"
+                            : /* no output */
+                            : "m" (__m(v)));
+       }
+}