[U-Boot] [PATCH] 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 patch is required to apply 'net: macb: enable dcache in macb' [1] without build errors. The patch is currently only compile tested, runtime tests pending.
[1] http://patchwork.ozlabs.org/patch/352786/
arch/avr32/cpu/cache.c | 20 ++++++++++---------- arch/avr32/include/asm/arch-at32ap700x/cacheflush.h | 2 -- arch/avr32/include/asm/dma-mapping.h | 6 ++++-- arch/avr32/lib/board.c | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/arch/avr32/cpu/cache.c b/arch/avr32/cpu/cache.c index ab0374e..b3ffc33 100644 --- a/arch/avr32/cpu/cache.c +++ b/arch/avr32/cpu/cache.c @@ -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(); diff --git a/arch/avr32/include/asm/arch-at32ap700x/cacheflush.h b/arch/avr32/include/asm/arch-at32ap700x/cacheflush.h index 13d6d3a..e08cd9d 100644 --- a/arch/avr32/include/asm/arch-at32ap700x/cacheflush.h +++ b/arch/avr32/include/asm/arch-at32ap700x/cacheflush.h @@ -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) diff --git a/arch/avr32/include/asm/dma-mapping.h b/arch/avr32/include/asm/dma-mapping.h index 95ea81f..dbdd2fe 100644 --- a/arch/avr32/include/asm/dma-mapping.h +++ b/arch/avr32/include/asm/dma-mapping.h @@ -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 */ diff --git a/arch/avr32/lib/board.c b/arch/avr32/lib/board.c index 7680102..bf0997f 100644 --- a/arch/avr32/lib/board.c +++ b/arch/avr32/lib/board.c @@ -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)

Dear Andreas Bießmann,
On 12.06.2014 22:07, Andreas Bießmann wrote:
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 patch is required to apply 'net: macb: enable dcache in macb' [1] without build errors. The patch is currently only compile tested, runtime tests pending.
runtime tested on grasshopper board and atngw100mkii board.
Best regards
Andreas Bießmann

Dear Andreas Devel,
Andreas Devel andreas.devel@googlemail.com writes:
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 patch is required to apply 'net: macb: enable dcache in macb' [1] without build errors. The patch is currently only compile tested, runtime tests pending.
[1] http://patchwork.ozlabs.org/patch/352786/
arch/avr32/cpu/cache.c | 20 ++++++++++---------- arch/avr32/include/asm/arch-at32ap700x/cacheflush.h | 2 -- arch/avr32/include/asm/dma-mapping.h | 6 ++++-- arch/avr32/lib/board.c | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-)
applied to u-boot-atmel/master, thanks!
Best regards, Andreas Bießmann
participants (1)
-
Andreas Bießmann