aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh/mm/flush-sh4.c
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2009-08-04 05:06:01 -0400
committerPaul Mundt <lethal@linux-sh.org>2009-08-04 05:06:01 -0400
commit817425275271f2514f0dc6952182aa057ce80973 (patch)
tree09c32a42c4700bc0cf7ea31a232a17c45d1e0824 /arch/sh/mm/flush-sh4.c
parentd14d751ff9234595639a16e53b3cf0c575946bde (diff)
sh: Split out SH-4 __flush_xxx_region() ops.
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>
Diffstat (limited to 'arch/sh/mm/flush-sh4.c')
-rw-r--r--arch/sh/mm/flush-sh4.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/arch/sh/mm/flush-sh4.c b/arch/sh/mm/flush-sh4.c
new file mode 100644
index 000000000000..e6d918f6ec0b
--- /dev/null
+++ b/arch/sh/mm/flush-sh4.c
@@ -0,0 +1,63 @@
1#include <linux/mm.h>
2#include <asm/mmu_context.h>
3#include <asm/cacheflush.h>
4
5/*
6 * Write back the dirty D-caches, but not invalidate them.
7 *
8 * START: Virtual Address (U0, P1, or P3)
9 * SIZE: Size of the region.
10 */
11void __weak __flush_wback_region(void *start, int size)
12{
13 unsigned long v;
14 unsigned long begin, end;
15
16 begin = (unsigned long)start & ~(L1_CACHE_BYTES-1);
17 end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
18 & ~(L1_CACHE_BYTES-1);
19 for (v = begin; v < end; v+=L1_CACHE_BYTES) {
20 asm volatile("ocbwb %0"
21 : /* no output */
22 : "m" (__m(v)));
23 }
24}
25
26/*
27 * Write back the dirty D-caches and invalidate them.
28 *
29 * START: Virtual Address (U0, P1, or P3)
30 * SIZE: Size of the region.
31 */
32void __weak __flush_purge_region(void *start, int size)
33{
34 unsigned long v;
35 unsigned long begin, end;
36
37 begin = (unsigned long)start & ~(L1_CACHE_BYTES-1);
38 end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
39 & ~(L1_CACHE_BYTES-1);
40 for (v = begin; v < end; v+=L1_CACHE_BYTES) {
41 asm volatile("ocbp %0"
42 : /* no output */
43 : "m" (__m(v)));
44 }
45}
46
47/*
48 * No write back please
49 */
50void __weak __flush_invalidate_region(void *start, int size)
51{
52 unsigned long v;
53 unsigned long begin, end;
54
55 begin = (unsigned long)start & ~(L1_CACHE_BYTES-1);
56 end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
57 & ~(L1_CACHE_BYTES-1);
58 for (v = begin; v < end; v+=L1_CACHE_BYTES) {
59 asm volatile("ocbi %0"
60 : /* no output */
61 : "m" (__m(v)));
62 }
63}