diff options
author | Paul Mundt <lethal@linux-sh.org> | 2009-08-04 05:06:01 -0400 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2009-08-04 05:06:01 -0400 |
commit | 817425275271f2514f0dc6952182aa057ce80973 (patch) | |
tree | 09c32a42c4700bc0cf7ea31a232a17c45d1e0824 /arch/sh/mm/flush-sh4.c | |
parent | d14d751ff9234595639a16e53b3cf0c575946bde (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.c | 63 |
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 | */ | ||
11 | void __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 | */ | ||
32 | void __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 | */ | ||
50 | void __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 | } | ||