Skip to content
Snippets Groups Projects
Commit 05b75e48 authored by Mike Frysinger's avatar Mike Frysinger
Browse files

Blackfin: fix dcache handling when doing dma memcpy's


Our dcache invalidate function doesn't just invalidate, it also flushes.
So rename the function accordingly and fix the dma_memcpy() function so it
doesn't inadvertently corrupt the data destination.

Signed-off-by: default avatarMike Frysinger <vapier@gentoo.org>
parent 68e56324
No related branches found
No related tags found
No related merge requests found
...@@ -39,7 +39,7 @@ ENTRY(_blackfin_dcache_flush_range) ...@@ -39,7 +39,7 @@ ENTRY(_blackfin_dcache_flush_range)
RTS; RTS;
ENDPROC(_blackfin_dcache_flush_range) ENDPROC(_blackfin_dcache_flush_range)
ENTRY(_blackfin_dcache_invalidate_range) ENTRY(_blackfin_dcache_flush_invalidate_range)
R2 = -32; R2 = -32;
R2 = R0 & R2; R2 = R0 & R2;
P0 = R2; P0 = R2;
...@@ -58,4 +58,4 @@ ENTRY(_blackfin_dcache_invalidate_range) ...@@ -58,4 +58,4 @@ ENTRY(_blackfin_dcache_invalidate_range)
FLUSHINV[P0]; FLUSHINV[P0];
SSYNC; SSYNC;
RTS; RTS;
ENDPROC(_blackfin_dcache_invalidate_range) ENDPROC(_blackfin_dcache_flush_invalidate_range)
...@@ -58,7 +58,7 @@ extern u_long get_sclk(void); ...@@ -58,7 +58,7 @@ extern u_long get_sclk(void);
extern void blackfin_icache_flush_range(const void *, const void *); extern void blackfin_icache_flush_range(const void *, const void *);
extern void blackfin_dcache_flush_range(const void *, const void *); extern void blackfin_dcache_flush_range(const void *, const void *);
extern void blackfin_dcache_invalidate_range(const void *, const void *); extern void blackfin_dcache_flush_invalidate_range(const void *, const void *);
/* Use DMA to move data from on chip to external memory. While this is /* Use DMA to move data from on chip to external memory. While this is
* required for only L1 instruction (it is not directly readable by the * required for only L1 instruction (it is not directly readable by the
......
...@@ -175,19 +175,22 @@ void dma_memcpy_nocache(void *dst, const void *src, size_t count) ...@@ -175,19 +175,22 @@ void dma_memcpy_nocache(void *dst, const void *src, size_t count)
bfin_write_MDMA_D0_CONFIG(0); bfin_write_MDMA_D0_CONFIG(0);
bfin_write_MDMA_S0_CONFIG(0); bfin_write_MDMA_S0_CONFIG(0);
} }
/* We should do a dcache invalidate on the destination after the dma, but since
* we lack such hardware capability, we'll flush/invalidate the destination
* before the dma and bank on the idea that u-boot is single threaded.
*/
void *dma_memcpy(void *dst, const void *src, size_t count) void *dma_memcpy(void *dst, const void *src, size_t count)
{ {
if (dcache_status()) if (dcache_status()) {
blackfin_dcache_flush_range(src, src + count); blackfin_dcache_flush_range(src, src + count);
blackfin_dcache_flush_invalidate_range(dst, dst + count);
}
dma_memcpy_nocache(dst, src, count); dma_memcpy_nocache(dst, src, count);
if (icache_status()) if (icache_status())
blackfin_icache_flush_range(dst, dst + count); blackfin_icache_flush_range(dst, dst + count);
if (dcache_status())
blackfin_dcache_invalidate_range(dst, dst + count);
return dst; return dst;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment