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:
parent
0a26e1d6c3
commit
0e05543576
@ -24,31 +24,31 @@ void dcache_clean_range(volatile void *start, size_t size)
|
|||||||
sync_write_buffer();
|
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;
|
linesz = CONFIG_SYS_DCACHE_LINESZ;
|
||||||
|
|
||||||
/* You asked for it, you got it */
|
/* You asked for it, you got it */
|
||||||
begin = (unsigned long)start & ~(linesz - 1);
|
start = start & ~(linesz - 1);
|
||||||
end = ((unsigned long)start + size + linesz - 1) & ~(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);
|
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;
|
linesz = CONFIG_SYS_DCACHE_LINESZ;
|
||||||
|
|
||||||
/* You asked for it, you got it */
|
/* You asked for it, you got it */
|
||||||
begin = (unsigned long)start & ~(linesz - 1);
|
start = start & ~(linesz - 1);
|
||||||
end = ((unsigned long)start + size + linesz - 1) & ~(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);
|
dcache_flush_line((void *)v);
|
||||||
|
|
||||||
sync_write_buffer();
|
sync_write_buffer();
|
||||||
|
@ -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
|
* Applies the above functions on all lines that are touched by the
|
||||||
* specified virtual address range.
|
* 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_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);
|
void icache_invalidate_range(volatile void *start, size_t len);
|
||||||
|
|
||||||
static inline void dcache_flush_unlocked(void)
|
static inline void dcache_flush_unlocked(void)
|
||||||
|
@ -23,13 +23,15 @@ static inline unsigned long dma_map_single(volatile void *vaddr, size_t len,
|
|||||||
|
|
||||||
switch (dir) {
|
switch (dir) {
|
||||||
case DMA_BIDIRECTIONAL:
|
case DMA_BIDIRECTIONAL:
|
||||||
dcache_flush_range(vaddr, len);
|
flush_dcache_range((unsigned long)vaddr,
|
||||||
|
(unsigned long)vaddr + len);
|
||||||
break;
|
break;
|
||||||
case DMA_TO_DEVICE:
|
case DMA_TO_DEVICE:
|
||||||
dcache_clean_range(vaddr, len);
|
dcache_clean_range(vaddr, len);
|
||||||
break;
|
break;
|
||||||
case DMA_FROM_DEVICE:
|
case DMA_FROM_DEVICE:
|
||||||
dcache_invalidate_range(vaddr, len);
|
invalidate_dcache_range((unsigned long)vaddr,
|
||||||
|
(unsigned long)vaddr + len);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* This will cause a linker error */
|
/* This will cause a linker error */
|
||||||
|
@ -65,8 +65,8 @@ static void dma_alloc_init(void)
|
|||||||
printf("DMA: Using memory from 0x%08lx to 0x%08lx\n",
|
printf("DMA: Using memory from 0x%08lx to 0x%08lx\n",
|
||||||
dma_alloc_start, dma_alloc_end);
|
dma_alloc_start, dma_alloc_end);
|
||||||
|
|
||||||
dcache_invalidate_range(cached(dma_alloc_start),
|
invalidate_dcache_range((unsigned long)cached(dma_alloc_start),
|
||||||
dma_alloc_end - dma_alloc_start);
|
dma_alloc_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *dma_alloc_coherent(size_t len, unsigned long *handle)
|
void *dma_alloc_coherent(size_t len, unsigned long *handle)
|
||||||
|
Loading…
Reference in New Issue
Block a user