aboutsummaryrefslogtreecommitdiffstats
path: root/arch/cris/arch-v32/kernel/cache.c
diff options
context:
space:
mode:
authorJesper Nilsson <jesper.nilsson@axis.com>2007-11-14 20:01:27 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-11-14 21:45:47 -0500
commit57c230a873b9d82ae88d6b6736127b5485024699 (patch)
treec269b27965def19b45436f9e0a8946b6e53dba51 /arch/cris/arch-v32/kernel/cache.c
parentd8e5219f9f5ca7518eb820db9f3d287a1d46fcf5 (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/cache.c')
-rw-r--r--arch/cris/arch-v32/kernel/cache.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/arch/cris/arch-v32/kernel/cache.c b/arch/cris/arch-v32/kernel/cache.c
new file mode 100644
index 000000000000..80da7b88a72b
--- /dev/null
+++ b/arch/cris/arch-v32/kernel/cache.c
@@ -0,0 +1,33 @@
1#include <linux/module.h>
2#include <asm/io.h>
3#include <asm/arch/cache.h>
4#include <asm/arch/hwregs/dma.h>
5
6/* This file is used to workaround a cache bug, Guinness TR 106. */
7
8inline void flush_dma_descr(struct dma_descr_data *descr, int flush_buf)
9{
10 /* Flush descriptor to make sure we get correct in_eop and after. */
11 asm volatile ("ftagd [%0]" :: "r" (descr));
12 /* Flush buffer pointed out by descriptor. */
13 if (flush_buf)
14 cris_flush_cache_range(phys_to_virt((unsigned)descr->buf),
15 (unsigned)(descr->after - descr->buf));
16}
17EXPORT_SYMBOL(flush_dma_descr);
18
19void flush_dma_list(struct dma_descr_data *descr)
20{
21 while (1) {
22 flush_dma_descr(descr, 1);
23 if (descr->eol)
24 break;
25 descr = phys_to_virt((unsigned)descr->next);
26 }
27}
28EXPORT_SYMBOL(flush_dma_list);
29
30/* From cacheflush.S */
31EXPORT_SYMBOL(cris_flush_cache);
32/* From cacheflush.S */
33EXPORT_SYMBOL(cris_flush_cache_range);