diff mbox series

[07/11] powerpc: make dma_cache_sync a no-op

Message ID 20171003104311.10058-8-hch@lst.de (mailing list archive)
State Not Applicable
Headers show
Series [01/11] floppy: consolidate the dummy fd_cacheflush definition | expand

Commit Message

Christoph Hellwig Oct. 3, 2017, 10:43 a.m. UTC
powerpc does not implement DMA_ATTR_NON_CONSISTENT allocations, so it
doesn't make any sense to do any work in dma_cache_sync given that it
must be a no-op when dma_alloc_attrs returns coherent memory.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 arch/powerpc/include/asm/dma-mapping.h | 2 --
 1 file changed, 2 deletions(-)

Comments

Christophe Leroy Oct. 3, 2017, 11:24 a.m. UTC | #1
Le 03/10/2017 à 12:43, Christoph Hellwig a écrit :
> powerpc does not implement DMA_ATTR_NON_CONSISTENT allocations, so it
> doesn't make any sense to do any work in dma_cache_sync given that it
> must be a no-op when dma_alloc_attrs returns coherent memory.
What about arch/powerpc/mm/dma-noncoherent.c ?

Powerpc 8xx doesn't have coherent memory.

Christophe

> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>   arch/powerpc/include/asm/dma-mapping.h | 2 --
>   1 file changed, 2 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h
> index eaece3d3e225..320846442bfb 100644
> --- a/arch/powerpc/include/asm/dma-mapping.h
> +++ b/arch/powerpc/include/asm/dma-mapping.h
> @@ -144,8 +144,6 @@ static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr)
>   static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
>   		enum dma_data_direction direction)
>   {
> -	BUG_ON(direction == DMA_NONE);
> -	__dma_sync(vaddr, size, (int)direction);
>   }
>   
>   #endif /* __KERNEL__ */
>
Robin Murphy Oct. 3, 2017, 11:43 a.m. UTC | #2
On 03/10/17 12:24, Christophe LEROY wrote:
> 
> 
> Le 03/10/2017 à 12:43, Christoph Hellwig a écrit :
>> powerpc does not implement DMA_ATTR_NON_CONSISTENT allocations, so it
>> doesn't make any sense to do any work in dma_cache_sync given that it
>> must be a no-op when dma_alloc_attrs returns coherent memory.
> What about arch/powerpc/mm/dma-noncoherent.c ?

AFAICS, just like the ARM code from which it is derived, that will
always return a non-cacheable remap of the allocation, which should thus
not require explicit maintenance after CPU accesses. dma_cache_sync()
would only matter if dma_alloc_attrs(..., DMA_ATTR_NON_CONSISTENT) got
special treatment and was allowed to return a cacheable address, but PPC
doesn't even propagate the attrs to its internal __dma_alloc_coherent()
implementations.

Robin.

> Powerpc 8xx doesn't have coherent memory.
> 
> Christophe
> 
>>
>> Signed-off-by: Christoph Hellwig <hch@lst.de>
>> ---
>>   arch/powerpc/include/asm/dma-mapping.h | 2 --
>>   1 file changed, 2 deletions(-)
>>
>> diff --git a/arch/powerpc/include/asm/dma-mapping.h
>> b/arch/powerpc/include/asm/dma-mapping.h
>> index eaece3d3e225..320846442bfb 100644
>> --- a/arch/powerpc/include/asm/dma-mapping.h
>> +++ b/arch/powerpc/include/asm/dma-mapping.h
>> @@ -144,8 +144,6 @@ static inline phys_addr_t dma_to_phys(struct
>> device *dev, dma_addr_t daddr)
>>   static inline void dma_cache_sync(struct device *dev, void *vaddr,
>> size_t size,
>>           enum dma_data_direction direction)
>>   {
>> -    BUG_ON(direction == DMA_NONE);
>> -    __dma_sync(vaddr, size, (int)direction);
>>   }
>>     #endif /* __KERNEL__ */
>>
Christoph Hellwig Oct. 3, 2017, 11:43 a.m. UTC | #3
On Tue, Oct 03, 2017 at 01:24:57PM +0200, Christophe LEROY wrote:
>> powerpc does not implement DMA_ATTR_NON_CONSISTENT allocations, so it
>> doesn't make any sense to do any work in dma_cache_sync given that it
>> must be a no-op when dma_alloc_attrs returns coherent memory.
> What about arch/powerpc/mm/dma-noncoherent.c ?
>
> Powerpc 8xx doesn't have coherent memory.

It doesn't implement the DMA_ATTR_NON_CONSISTENT interface either,
so if it really doesn't have a way to provide dma coherent allocation
(although the code in __dma_alloc_coherent suggests it does provide
dma coherent allocations) I have no idea how it could ever have
worked.
Christophe Leroy Oct. 4, 2017, 8:29 a.m. UTC | #4
Le 03/10/2017 à 13:43, Christoph Hellwig a écrit :
> On Tue, Oct 03, 2017 at 01:24:57PM +0200, Christophe LEROY wrote:
>>> powerpc does not implement DMA_ATTR_NON_CONSISTENT allocations, so it
>>> doesn't make any sense to do any work in dma_cache_sync given that it
>>> must be a no-op when dma_alloc_attrs returns coherent memory.
>> What about arch/powerpc/mm/dma-noncoherent.c ?
>>
>> Powerpc 8xx doesn't have coherent memory.
> 
> It doesn't implement the DMA_ATTR_NON_CONSISTENT interface either,
> so if it really doesn't have a way to provide dma coherent allocation
> (although the code in __dma_alloc_coherent suggests it does provide
> dma coherent allocations) I have no idea how it could ever have
> worked.
> 

Yes indeed it provides coherent memory by allocation non cached memory.

And drivers aiming at using non coherent memory do it by using kmalloc() 
with GFP_DMA then dma_map_single().
Then they use dma_sync_single_for_xxx(), which calls __dma_sync() on the 
8xx and is a nop on other powerpcs.

Christophe
diff mbox series

Patch

diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h
index eaece3d3e225..320846442bfb 100644
--- a/arch/powerpc/include/asm/dma-mapping.h
+++ b/arch/powerpc/include/asm/dma-mapping.h
@@ -144,8 +144,6 @@  static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr)
 static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
 		enum dma_data_direction direction)
 {
-	BUG_ON(direction == DMA_NONE);
-	__dma_sync(vaddr, size, (int)direction);
 }
 
 #endif /* __KERNEL__ */