diff options
author | Jesper Nilsson <jesper.nilsson@axis.com> | 2007-11-14 20:01:27 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-11-14 21:45:47 -0500 |
commit | 57c230a873b9d82ae88d6b6736127b5485024699 (patch) | |
tree | c269b27965def19b45436f9e0a8946b6e53dba51 /arch/cris/arch-v32/kernel/cacheflush.S | |
parent | d8e5219f9f5ca7518eb820db9f3d287a1d46fcf5 (diff) |
CRISv32: add cache flush operations
These are needed due to a cache bug, and can be used to make sure that the
DMA descriptors are flushed to memory and can be safely handled by DMA.
flush_dma_descr - Flush one DMA descriptor.
flush_dma_list - Flush a complete list of DMA descriptors.
cris_flush_cache - Flush the complete cache.
cris_flush_cache_range - Flush only the specified range
Signed-off-by: Jesper Nilsson <jesper.nilsson@axis.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/cris/arch-v32/kernel/cacheflush.S')
-rw-r--r-- | arch/cris/arch-v32/kernel/cacheflush.S | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/arch/cris/arch-v32/kernel/cacheflush.S b/arch/cris/arch-v32/kernel/cacheflush.S new file mode 100644 index 000000000000..956e8fb82f01 --- /dev/null +++ b/arch/cris/arch-v32/kernel/cacheflush.S | |||
@@ -0,0 +1,94 @@ | |||
1 | .global cris_flush_cache_range | ||
2 | cris_flush_cache_range: | ||
3 | move.d 1024, $r12 | ||
4 | cmp.d $r11, $r12 | ||
5 | bhi cris_flush_1KB | ||
6 | nop | ||
7 | add.d $r10, $r11 | ||
8 | ftagd [$r10] | ||
9 | cris_flush_last: | ||
10 | addq 32, $r10 | ||
11 | cmp.d $r11, $r10 | ||
12 | blt cris_flush_last | ||
13 | ftagd [$r10] | ||
14 | ret | ||
15 | nop | ||
16 | cris_flush_1KB: | ||
17 | ftagd [$r10] | ||
18 | addq 32, $r10 | ||
19 | ftagd [$r10] | ||
20 | addq 32, $r10 | ||
21 | ftagd [$r10] | ||
22 | addq 32, $r10 | ||
23 | ftagd [$r10] | ||
24 | addq 32, $r10 | ||
25 | ftagd [$r10] | ||
26 | addq 32, $r10 | ||
27 | ftagd [$r10] | ||
28 | addq 32, $r10 | ||
29 | ftagd [$r10] | ||
30 | addq 32, $r10 | ||
31 | ftagd [$r10] | ||
32 | addq 32, $r10 | ||
33 | ftagd [$r10] | ||
34 | addq 32, $r10 | ||
35 | ftagd [$r10] | ||
36 | addq 32, $r10 | ||
37 | ftagd [$r10] | ||
38 | addq 32, $r10 | ||
39 | ftagd [$r10] | ||
40 | addq 32, $r10 | ||
41 | ftagd [$r10] | ||
42 | addq 32, $r10 | ||
43 | ftagd [$r10] | ||
44 | addq 32, $r10 | ||
45 | ftagd [$r10] | ||
46 | addq 32, $r10 | ||
47 | ftagd [$r10] | ||
48 | addq 32, $r10 | ||
49 | ftagd [$r10] | ||
50 | addq 32, $r10 | ||
51 | ftagd [$r10] | ||
52 | addq 32, $r10 | ||
53 | ftagd [$r10] | ||
54 | addq 32, $r10 | ||
55 | ftagd [$r10] | ||
56 | addq 32, $r10 | ||
57 | ftagd [$r10] | ||
58 | addq 32, $r10 | ||
59 | ftagd [$r10] | ||
60 | addq 32, $r10 | ||
61 | ftagd [$r10] | ||
62 | addq 32, $r10 | ||
63 | ftagd [$r10] | ||
64 | addq 32, $r10 | ||
65 | ftagd [$r10] | ||
66 | addq 32, $r10 | ||
67 | ftagd [$r10] | ||
68 | addq 32, $r10 | ||
69 | ftagd [$r10] | ||
70 | addq 32, $r10 | ||
71 | ftagd [$r10] | ||
72 | addq 32, $r10 | ||
73 | ftagd [$r10] | ||
74 | addq 32, $r10 | ||
75 | ftagd [$r10] | ||
76 | addq 32, $r10 | ||
77 | ftagd [$r10] | ||
78 | addq 32, $r10 | ||
79 | ftagd [$r10] | ||
80 | addq 32, $r10 | ||
81 | ba cris_flush_cache_range | ||
82 | sub.d $r12, $r11 | ||
83 | |||
84 | .global cris_flush_cache | ||
85 | cris_flush_cache: | ||
86 | moveq 0, $r10 | ||
87 | cris_flush_line: | ||
88 | move.d 16*1024, $r11 | ||
89 | addq 16, $r10 | ||
90 | cmp.d $r10, $r11 | ||
91 | blt cris_flush_line | ||
92 | fidxd [$r10] | ||
93 | ret | ||
94 | nop | ||