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: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
parent
68e5632494
commit
05b75e4883
|
@ -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)
|
||||||
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);
|
||||||
|
|
||||||
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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue