avr32: migrate cache functions

Unfortunately the avr32 cache implementation has another API than the one
described in common.h. Migrate the flush/invalidate dcache functions to the
common API to be usable in device drivers.

Signed-off-by: Andreas Bießmann <andreas.devel@googlemail.com>
CC: Josh Wu <josh.wu@atmel.com>
This commit is contained in:
Andreas Bießmann 2014-06-12 22:07:52 +02:00
parent 0a26e1d6c3
commit 0e05543576
4 changed files with 16 additions and 16 deletions

View File

@ -24,31 +24,31 @@ void dcache_clean_range(volatile void *start, size_t size)
sync_write_buffer();
}
void dcache_invalidate_range(volatile void *start, size_t size)
void invalidate_dcache_range(unsigned long start, unsigned long stop)
{
unsigned long v, begin, end, linesz;
unsigned long v, linesz;
linesz = CONFIG_SYS_DCACHE_LINESZ;
/* You asked for it, you got it */
begin = (unsigned long)start & ~(linesz - 1);
end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1);
start = start & ~(linesz - 1);
stop = (stop + linesz - 1) & ~(linesz - 1);
for (v = begin; v < end; v += linesz)
for (v = start; v < stop; v += linesz)
dcache_invalidate_line((void *)v);
}
void dcache_flush_range(volatile void *start, size_t size)
void flush_dcache_range(unsigned long start, unsigned long stop)
{
unsigned long v, begin, end, linesz;
unsigned long v, linesz;
linesz = CONFIG_SYS_DCACHE_LINESZ;
/* You asked for it, you got it */
begin = (unsigned long)start & ~(linesz - 1);
end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1);
start = start & ~(linesz - 1);
stop = (stop + linesz - 1) & ~(linesz - 1);
for (v = begin; v < end; v += linesz)
for (v = start; v < stop; v += linesz)
dcache_flush_line((void *)v);
sync_write_buffer();

View File

@ -49,9 +49,7 @@ static inline void icache_invalidate_line(volatile void *vaddr)
* Applies the above functions on all lines that are touched by the
* specified virtual address range.
*/
void dcache_invalidate_range(volatile void *start, size_t len);
void dcache_clean_range(volatile void *start, size_t len);
void dcache_flush_range(volatile void *start, size_t len);
void icache_invalidate_range(volatile void *start, size_t len);
static inline void dcache_flush_unlocked(void)

View File

@ -23,13 +23,15 @@ static inline unsigned long dma_map_single(volatile void *vaddr, size_t len,
switch (dir) {
case DMA_BIDIRECTIONAL:
dcache_flush_range(vaddr, len);
flush_dcache_range((unsigned long)vaddr,
(unsigned long)vaddr + len);
break;
case DMA_TO_DEVICE:
dcache_clean_range(vaddr, len);
break;
case DMA_FROM_DEVICE:
dcache_invalidate_range(vaddr, len);
invalidate_dcache_range((unsigned long)vaddr,
(unsigned long)vaddr + len);
break;
default:
/* This will cause a linker error */

View File

@ -65,8 +65,8 @@ static void dma_alloc_init(void)
printf("DMA: Using memory from 0x%08lx to 0x%08lx\n",
dma_alloc_start, dma_alloc_end);
dcache_invalidate_range(cached(dma_alloc_start),
dma_alloc_end - dma_alloc_start);
invalidate_dcache_range((unsigned long)cached(dma_alloc_start),
dma_alloc_end);
}
void *dma_alloc_coherent(size_t len, unsigned long *handle)