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/cache.c | |
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/cache.c')
-rw-r--r-- | arch/cris/arch-v32/kernel/cache.c | 33 |
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 | |||
8 | inline 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 | } | ||
17 | EXPORT_SYMBOL(flush_dma_descr); | ||
18 | |||
19 | void 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 | } | ||
28 | EXPORT_SYMBOL(flush_dma_list); | ||
29 | |||
30 | /* From cacheflush.S */ | ||
31 | EXPORT_SYMBOL(cris_flush_cache); | ||
32 | /* From cacheflush.S */ | ||
33 | EXPORT_SYMBOL(cris_flush_cache_range); | ||