diff mbox

[U-Boot,v3] nios2: convert dma_alloc_coherent to use memalign

Message ID 1444390262-15804-1-git-send-email-thomas@wytron.com.tw
State Superseded
Delegated to: Thomas Chou
Headers show

Commit Message

Thomas Chou Oct. 9, 2015, 11:31 a.m. UTC
Convert dma_alloc_coherent to use memalign.

Signed-off-by: Thomas Chou <thomas@wytron.com.tw>
---
v2
  use memalign.
v3
  check memalign() return for out of memory.

 arch/nios2/include/asm/dma-mapping.h | 23 ++++++++++-------------
 1 file changed, 10 insertions(+), 13 deletions(-)

Comments

Marek Vasut Oct. 9, 2015, 2:49 p.m. UTC | #1
On Friday, October 09, 2015 at 01:31:02 PM, Thomas Chou wrote:
> Convert dma_alloc_coherent to use memalign.
> 
> Signed-off-by: Thomas Chou <thomas@wytron.com.tw>
> ---
> v2
>   use memalign.
> v3
>   check memalign() return for out of memory.
> 
>  arch/nios2/include/asm/dma-mapping.h | 23 ++++++++++-------------
>  1 file changed, 10 insertions(+), 13 deletions(-)
> 
> diff --git a/arch/nios2/include/asm/dma-mapping.h
> b/arch/nios2/include/asm/dma-mapping.h index 1350e3b..0618dc2 100644
> --- a/arch/nios2/include/asm/dma-mapping.h
> +++ b/arch/nios2/include/asm/dma-mapping.h
> @@ -1,23 +1,20 @@
>  #ifndef __ASM_NIOS2_DMA_MAPPING_H
>  #define __ASM_NIOS2_DMA_MAPPING_H
> 
> -/* dma_alloc_coherent() return cache-line aligned allocation which is
> mapped +#include <asm/io.h>
> +
> +/*
> + * dma_alloc_coherent() return cache-line aligned allocation which is
> mapped * to uncached io region.
> - *
> - * IO_REGION_BASE should be defined in board config header file
> - *   0x80000000 for nommu, 0xe0000000 for mmu
>   */
> -
>  static inline void *dma_alloc_coherent(size_t len, unsigned long *handle)
>  {
> -	void *addr = malloc(len + CONFIG_SYS_DCACHELINE_SIZE);
> -	if (!addr)
> -		return 0;
> -	flush_dcache((unsigned long)addr, len + CONFIG_SYS_DCACHELINE_SIZE);
> -	*handle = ((unsigned long)addr +
> -		   (CONFIG_SYS_DCACHELINE_SIZE - 1)) &
> -		~(CONFIG_SYS_DCACHELINE_SIZE - 1) & ~(IO_REGION_BASE);
> -	return (void *)(*handle | IO_REGION_BASE);
> +	*handle = (unsigned long)memalign(ARCH_DMA_MINALIGN, len);

This still modifies the handle in both cases (failure and success).
We really want to modify external variables in case of failure, no?

> +	if (!*handle)
> +		return NULL;
> +	flush_dcache_range(*handle, *handle + len);
> +
> +	return ioremap(*handle, len);
>  }
> 
>  #endif /* __ASM_NIOS2_DMA_MAPPING_H */

Best regards,
Marek Vasut
Thomas Chou Oct. 10, 2015, 5:33 a.m. UTC | #2
Hi Marek,

On 10/09/2015 10:49 PM, Marek Vasut wrote:
>> +	*handle = (unsigned long)memalign(ARCH_DMA_MINALIGN, len);
>
> This still modifies the handle in both cases (failure and success).
> We really want to modify external variables in case of failure, no?

The *handle return a DMA address, and the function itself return a 
virtual address. Both of them should be set to NULL in case of failure. 
It might be wrong to keep DMA address looks alive but actually dead.

Best regards,
Thomas Chou
Marek Vasut Oct. 10, 2015, 6:19 p.m. UTC | #3
On Saturday, October 10, 2015 at 07:33:06 AM, Thomas Chou wrote:
> Hi Marek,

Hi!

> On 10/09/2015 10:49 PM, Marek Vasut wrote:
> >> +	*handle = (unsigned long)memalign(ARCH_DMA_MINALIGN, len);
> > 
> > This still modifies the handle in both cases (failure and success).
> > We really want to modify external variables in case of failure, no?
> 
> The *handle return a DMA address, and the function itself return a
> virtual address. Both of them should be set to NULL in case of failure.

So you depend on this property of memalign(), ok, I see. Thanks for clarifying!

> It might be wrong to keep DMA address looks alive but actually dead.

I don't quite understand this sentence, can you please rephrase it ?

Best regards,
Marek Vasut
Thomas Chou Oct. 11, 2015, 1:48 a.m. UTC | #4
Hi Marek,

On 10/11/2015 02:19 AM, Marek Vasut wrote:
> It might be wrong to keep DMA address looks alive but actually dead.
>
> I don't quite understand this sentence, can you please rephrase it ?

Sorry. I meant the *handle, which is the DMA address, should be 
invalidated to NULL when the allocation failed.

Best regards,
Thomas
Marek Vasut Oct. 11, 2015, 12:15 p.m. UTC | #5
On Sunday, October 11, 2015 at 03:48:58 AM, Thomas Chou wrote:
> Hi Marek,

Hi,

> On 10/11/2015 02:19 AM, Marek Vasut wrote:
> > It might be wrong to keep DMA address looks alive but actually dead.
> > 
> > I don't quite understand this sentence, can you please rephrase it ?
> 
> Sorry. I meant the *handle, which is the DMA address, should be
> invalidated to NULL when the allocation failed.

OK

Best regards,
Marek Vasut
diff mbox

Patch

diff --git a/arch/nios2/include/asm/dma-mapping.h b/arch/nios2/include/asm/dma-mapping.h
index 1350e3b..0618dc2 100644
--- a/arch/nios2/include/asm/dma-mapping.h
+++ b/arch/nios2/include/asm/dma-mapping.h
@@ -1,23 +1,20 @@ 
 #ifndef __ASM_NIOS2_DMA_MAPPING_H
 #define __ASM_NIOS2_DMA_MAPPING_H
 
-/* dma_alloc_coherent() return cache-line aligned allocation which is mapped
+#include <asm/io.h>
+
+/*
+ * dma_alloc_coherent() return cache-line aligned allocation which is mapped
  * to uncached io region.
- *
- * IO_REGION_BASE should be defined in board config header file
- *   0x80000000 for nommu, 0xe0000000 for mmu
  */
-
 static inline void *dma_alloc_coherent(size_t len, unsigned long *handle)
 {
-	void *addr = malloc(len + CONFIG_SYS_DCACHELINE_SIZE);
-	if (!addr)
-		return 0;
-	flush_dcache((unsigned long)addr, len + CONFIG_SYS_DCACHELINE_SIZE);
-	*handle = ((unsigned long)addr +
-		   (CONFIG_SYS_DCACHELINE_SIZE - 1)) &
-		~(CONFIG_SYS_DCACHELINE_SIZE - 1) & ~(IO_REGION_BASE);
-	return (void *)(*handle | IO_REGION_BASE);
+	*handle = (unsigned long)memalign(ARCH_DMA_MINALIGN, len);
+	if (!*handle)
+		return NULL;
+	flush_dcache_range(*handle, *handle + len);
+
+	return ioremap(*handle, len);
 }
 
 #endif /* __ASM_NIOS2_DMA_MAPPING_H */