Two questions about streaming DMA flushing

Russell King - ARM Linux linux at arm.linux.org.uk
Wed Oct 31 05:08:21 EDT 2012


On Wed, Oct 31, 2012 at 10:15:04AM +0800, Li Haifeng wrote:
> Sorry to disturb you.
> 
> I have two questions for streaming DMA flushing @ arch/arm/mm/cache-v7.S.
> 
> 1.
> 332 ENTRY(v7_dma_map_area)
> 333         add     r1, r1, r0
> 334         teq     r2, #DMA_FROM_DEVICE
> 335         beq     v7_dma_inv_range
> 336         b       v7_dma_clean_range
> 337 ENDPROC(v7_dma_map_area)
> 
> The function of v7_dma_map_area will invalidate corresponding cache line
> firstly and then clean the cache for “DMA_FROM_DEVICE”. I am confused the
> sequence of the operations. IMO, the invalidate should be followed by the
> clean action. Is it right?

Wrong.  beq is not a function call.

> 2.
> 345 ENTRY(v7_dma_unmap_area)
> 346         add     r1, r1, r0
> 347         teq     r2, #DMA_TO_DEVICE
> 348         bne     v7_dma_inv_range
> 349         mov     pc, lr
> 350 ENDPROC(v7_dma_unmap_area)
> 
> v7_dma_unmap_area, will invalidate corresponding cache line for
> “DMA_FROM_DEVICE”. But, at v7_dma_map_area, the invalidate has been done.
> Why do this again?

Cache prefetching.



More information about the linux-arm-kernel mailing list