blob: e6d918f6ec0ba79b45ed9f3ec2e26ded9296368b [file] [log] [blame]
Paul Mundt81742522009-08-04 18:06:01 +09001#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}