aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm/cache-v7.S
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2009-10-31 12:52:16 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2010-02-15 10:22:25 -0500
commit2ffe2da3e71652d4f4cae19539b5c78c2a239136 (patch)
tree1b69404360a47369c858e54643bab6836015ddbd /arch/arm/mm/cache-v7.S
parent702b94bff3c50542a6e4ab9a4f4cef093262fe65 (diff)
ARM: dma-mapping: fix for speculative prefetching
ARMv6 and ARMv7 CPUs can perform speculative prefetching, which makes DMA cache coherency handling slightly more interesting. Rather than being able to rely upon the CPU not accessing the DMA buffer until DMA has completed, we now must expect that the cache could be loaded with possibly stale data from the DMA buffer. Where DMA involves data being transferred to the device, we clean the cache before handing it over for DMA, otherwise we invalidate the buffer to get rid of potential writebacks. On DMA Completion, if data was transferred from the device, we invalidate the buffer to get rid of any stale speculative prefetches. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Tested-By: Santosh Shilimkar <santosh.shilimkar@ti.com>
Diffstat (limited to 'arch/arm/mm/cache-v7.S')
-rw-r--r--arch/arm/mm/cache-v7.S10
1 files changed, 6 insertions, 4 deletions
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S
index b1cd0fd91207..bcd64f265870 100644
--- a/arch/arm/mm/cache-v7.S
+++ b/arch/arm/mm/cache-v7.S
@@ -279,10 +279,9 @@ ENDPROC(v7_dma_flush_range)
279 */ 279 */
280ENTRY(v7_dma_map_area) 280ENTRY(v7_dma_map_area)
281 add r1, r1, r0 281 add r1, r1, r0
282 cmp r2, #DMA_TO_DEVICE 282 teq r2, #DMA_FROM_DEVICE
283 beq v7_dma_clean_range 283 beq v7_dma_inv_range
284 bcs v7_dma_inv_range 284 b v7_dma_clean_range
285 b v7_dma_flush_range
286ENDPROC(v7_dma_map_area) 285ENDPROC(v7_dma_map_area)
287 286
288/* 287/*
@@ -292,6 +291,9 @@ ENDPROC(v7_dma_map_area)
292 * - dir - DMA direction 291 * - dir - DMA direction
293 */ 292 */
294ENTRY(v7_dma_unmap_area) 293ENTRY(v7_dma_unmap_area)
294 add r1, r1, r0
295 teq r2, #DMA_TO_DEVICE
296 bne v7_dma_inv_range
295 mov pc, lr 297 mov pc, lr
296ENDPROC(v7_dma_unmap_area) 298ENDPROC(v7_dma_unmap_area)
297 299