Patchwork TILER: Move dma_alloc_coherent call to tiler init

login
register
mail settings
Submitter Bryan Wu
Date July 15, 2010, 3 a.m.
Message ID <1279162846-17576-1-git-send-email-bryan.wu@canonical.com>
Download mbox | patch
Permalink /patch/58960/
State Accepted
Delegated to: Tim Gardner
Headers show

Comments

Bryan Wu - July 15, 2010, 3 a.m.
From: David Sin <davidsin@ti.com>

Instead of allocating and freeing PAT page array
memory each time, allocate 128k upfront and reuse the
memory.  This will avoid the possibilty of not being
able to obtain the memory after driver initialization.

Signed-off-by: David Sin <davidsin@ti.com>
---
 drivers/media/video/tiler/tiler.c |   30 ++++++++++++++++++------------
 1 files changed, 18 insertions(+), 12 deletions(-)
Bryan Wu - July 15, 2010, 3:10 a.m.
David's already moved the dma_alloc/free into the right place, so it looks fine
to me.

Acked-by: Bryan Wu <bryan.wu@canonical.com>

Thanks,
-Bryan

On 07/15/2010 11:00 AM, Bryan Wu wrote:
> From: David Sin <davidsin@ti.com>
> 
> Instead of allocating and freeing PAT page array
> memory each time, allocate 128k upfront and reuse the
> memory.  This will avoid the possibilty of not being
> able to obtain the memory after driver initialization.
> 
> Signed-off-by: David Sin <davidsin@ti.com>
> ---
>  drivers/media/video/tiler/tiler.c |   30 ++++++++++++++++++------------
>  1 files changed, 18 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/media/video/tiler/tiler.c b/drivers/media/video/tiler/tiler.c
> index c8008b0..f5b63f1 100644
> --- a/drivers/media/video/tiler/tiler.c
> +++ b/drivers/media/video/tiler/tiler.c
> @@ -120,6 +120,8 @@ static u32 id;
>  static struct mutex mtx;
>  static struct tcm *tcm[TILER_FORMATS];
>  static struct tmm *tmm[TILER_FORMATS];
> +static u32 *dmac_va;
> +static dma_addr_t dmac_pa;
>  
>  #define TCM(fmt)        tcm[(fmt) - TILFMT_8BIT]
>  #define TCM_SS(ssptr)   TCM(TILER_GET_ACC_MODE(ssptr))
> @@ -829,34 +831,24 @@ static s32 tiler_mmap(struct file *filp, struct vm_area_struct *vma)
>  static s32 refill_pat(struct tmm *tmm, struct tcm_area *area, u32 *ptr)
>  {
>  	s32 res = 0;
> -	s32 size = tcm_sizeof(*area) * sizeof(*ptr);
> -	u32 *page;
> -	dma_addr_t page_pa;
>  	struct pat_area p_area = {0};
>  	struct tcm_area slice, area_s;
>  
> -	/* must be a 16-byte aligned physical address */
> -	page = dma_alloc_coherent(NULL, size, &page_pa, GFP_ATOMIC);
> -	if (!page)
> -		return -ENOMEM;
> -
>  	tcm_for_each_slice(slice, *area, area_s) {
>  		p_area.x0 = slice.p0.x;
>  		p_area.y0 = slice.p0.y;
>  		p_area.x1 = slice.p1.x;
>  		p_area.y1 = slice.p1.y;
>  
> -		memcpy(page, ptr, sizeof(*ptr) * tcm_sizeof(slice));
> +		memcpy(dmac_va, ptr, sizeof(*ptr) * tcm_sizeof(slice));
>  		ptr += tcm_sizeof(slice);
>  
> -		if (tmm_map(tmm, p_area, page_pa)) {
> +		if (tmm_map(tmm, p_area, dmac_pa)) {
>  			res = -EFAULT;
>  			break;
>  		}
>  	}
>  
> -	dma_free_coherent(NULL, size, page, page_pa);
> -
>  	return res;
>  }
>  
> @@ -1423,6 +1415,9 @@ static void __exit tiler_exit(void)
>  
>  	mutex_unlock(&mtx);
>  
> +	dma_free_coherent(NULL, TILER_WIDTH * TILER_HEIGHT * sizeof(*dmac_va),
> +							dmac_va, dmac_pa);
> +
>  	/* close containers only once */
>  	for (i = TILFMT_8BIT; i <= TILFMT_MAX; i++) {
>  		/* remove identical containers (tmm is unique per tcm) */
> @@ -1485,6 +1480,15 @@ static s32 __init tiler_init(void)
>  	struct tcm *sita = NULL;
>  	struct tmm *tmm_pat = NULL;
>  
> +	/**
> +	  * Array of physical pages for PAT programming, which must be a 16-byte
> +	  * aligned physical address
> +	*/
> +	dmac_va = dma_alloc_coherent(NULL, TILER_WIDTH * TILER_HEIGHT *
> +					sizeof(*dmac_va), &dmac_pa, GFP_ATOMIC);
> +	if (!dmac_va)
> +		return -ENOMEM;
> +
>  	/* Allocate tiler container manager (we share 1 on OMAP4) */
>  	div_pt.x = TILER_WIDTH;   /* hardcoded default */
>  	div_pt.y = (3 * TILER_HEIGHT) / 4;
> @@ -1551,6 +1555,8 @@ error:
>  		kfree(tiler_device);
>  		tcm_deinit(sita);
>  		tmm_deinit(tmm_pat);
> +		dma_free_coherent(NULL, TILER_WIDTH * TILER_HEIGHT *
> +					sizeof(*dmac_va), dmac_va, dmac_pa);
>  	}
>  
>  	return r;
Tim Gardner - July 15, 2010, 3:52 a.m.
On 07/14/2010 09:00 PM, Bryan Wu wrote:
> From: David Sin<davidsin@ti.com>
>
> Instead of allocating and freeing PAT page array
> memory each time, allocate 128k upfront and reuse the
> memory.  This will avoid the possibilty of not being
> able to obtain the memory after driver initialization.
>
> Signed-off-by: David Sin<davidsin@ti.com>
> ---
>   drivers/media/video/tiler/tiler.c |   30 ++++++++++++++++++------------
>   1 files changed, 18 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/media/video/tiler/tiler.c b/drivers/media/video/tiler/tiler.c
> index c8008b0..f5b63f1 100644
> --- a/drivers/media/video/tiler/tiler.c
> +++ b/drivers/media/video/tiler/tiler.c
> @@ -120,6 +120,8 @@ static u32 id;
>   static struct mutex mtx;
>   static struct tcm *tcm[TILER_FORMATS];
>   static struct tmm *tmm[TILER_FORMATS];
> +static u32 *dmac_va;
> +static dma_addr_t dmac_pa;
>
>   #define TCM(fmt)        tcm[(fmt) - TILFMT_8BIT]
>   #define TCM_SS(ssptr)   TCM(TILER_GET_ACC_MODE(ssptr))
> @@ -829,34 +831,24 @@ static s32 tiler_mmap(struct file *filp, struct vm_area_struct *vma)
>   static s32 refill_pat(struct tmm *tmm, struct tcm_area *area, u32 *ptr)
>   {
>   	s32 res = 0;
> -	s32 size = tcm_sizeof(*area) * sizeof(*ptr);
> -	u32 *page;
> -	dma_addr_t page_pa;
>   	struct pat_area p_area = {0};
>   	struct tcm_area slice, area_s;
>
> -	/* must be a 16-byte aligned physical address */
> -	page = dma_alloc_coherent(NULL, size,&page_pa, GFP_ATOMIC);
> -	if (!page)
> -		return -ENOMEM;
> -
>   	tcm_for_each_slice(slice, *area, area_s) {
>   		p_area.x0 = slice.p0.x;
>   		p_area.y0 = slice.p0.y;
>   		p_area.x1 = slice.p1.x;
>   		p_area.y1 = slice.p1.y;
>
> -		memcpy(page, ptr, sizeof(*ptr) * tcm_sizeof(slice));
> +		memcpy(dmac_va, ptr, sizeof(*ptr) * tcm_sizeof(slice));
>   		ptr += tcm_sizeof(slice);
>
> -		if (tmm_map(tmm, p_area, page_pa)) {
> +		if (tmm_map(tmm, p_area, dmac_pa)) {
>   			res = -EFAULT;
>   			break;
>   		}
>   	}
>
> -	dma_free_coherent(NULL, size, page, page_pa);
> -
>   	return res;
>   }
>
> @@ -1423,6 +1415,9 @@ static void __exit tiler_exit(void)
>
>   	mutex_unlock(&mtx);
>
> +	dma_free_coherent(NULL, TILER_WIDTH * TILER_HEIGHT * sizeof(*dmac_va),
> +							dmac_va, dmac_pa);
> +
>   	/* close containers only once */
>   	for (i = TILFMT_8BIT; i<= TILFMT_MAX; i++) {
>   		/* remove identical containers (tmm is unique per tcm) */
> @@ -1485,6 +1480,15 @@ static s32 __init tiler_init(void)
>   	struct tcm *sita = NULL;
>   	struct tmm *tmm_pat = NULL;
>
> +	/**
> +	  * Array of physical pages for PAT programming, which must be a 16-byte
> +	  * aligned physical address
> +	*/
> +	dmac_va = dma_alloc_coherent(NULL, TILER_WIDTH * TILER_HEIGHT *
> +					sizeof(*dmac_va),&dmac_pa, GFP_ATOMIC);
> +	if (!dmac_va)
> +		return -ENOMEM;
> +
>   	/* Allocate tiler container manager (we share 1 on OMAP4) */
>   	div_pt.x = TILER_WIDTH;   /* hardcoded default */
>   	div_pt.y = (3 * TILER_HEIGHT) / 4;
> @@ -1551,6 +1555,8 @@ error:
>   		kfree(tiler_device);
>   		tcm_deinit(sita);
>   		tmm_deinit(tmm_pat);
> +		dma_free_coherent(NULL, TILER_WIDTH * TILER_HEIGHT *
> +					sizeof(*dmac_va), dmac_va, dmac_pa);
>   	}
>
>   	return r;

applied

Patch

diff --git a/drivers/media/video/tiler/tiler.c b/drivers/media/video/tiler/tiler.c
index c8008b0..f5b63f1 100644
--- a/drivers/media/video/tiler/tiler.c
+++ b/drivers/media/video/tiler/tiler.c
@@ -120,6 +120,8 @@  static u32 id;
 static struct mutex mtx;
 static struct tcm *tcm[TILER_FORMATS];
 static struct tmm *tmm[TILER_FORMATS];
+static u32 *dmac_va;
+static dma_addr_t dmac_pa;
 
 #define TCM(fmt)        tcm[(fmt) - TILFMT_8BIT]
 #define TCM_SS(ssptr)   TCM(TILER_GET_ACC_MODE(ssptr))
@@ -829,34 +831,24 @@  static s32 tiler_mmap(struct file *filp, struct vm_area_struct *vma)
 static s32 refill_pat(struct tmm *tmm, struct tcm_area *area, u32 *ptr)
 {
 	s32 res = 0;
-	s32 size = tcm_sizeof(*area) * sizeof(*ptr);
-	u32 *page;
-	dma_addr_t page_pa;
 	struct pat_area p_area = {0};
 	struct tcm_area slice, area_s;
 
-	/* must be a 16-byte aligned physical address */
-	page = dma_alloc_coherent(NULL, size, &page_pa, GFP_ATOMIC);
-	if (!page)
-		return -ENOMEM;
-
 	tcm_for_each_slice(slice, *area, area_s) {
 		p_area.x0 = slice.p0.x;
 		p_area.y0 = slice.p0.y;
 		p_area.x1 = slice.p1.x;
 		p_area.y1 = slice.p1.y;
 
-		memcpy(page, ptr, sizeof(*ptr) * tcm_sizeof(slice));
+		memcpy(dmac_va, ptr, sizeof(*ptr) * tcm_sizeof(slice));
 		ptr += tcm_sizeof(slice);
 
-		if (tmm_map(tmm, p_area, page_pa)) {
+		if (tmm_map(tmm, p_area, dmac_pa)) {
 			res = -EFAULT;
 			break;
 		}
 	}
 
-	dma_free_coherent(NULL, size, page, page_pa);
-
 	return res;
 }
 
@@ -1423,6 +1415,9 @@  static void __exit tiler_exit(void)
 
 	mutex_unlock(&mtx);
 
+	dma_free_coherent(NULL, TILER_WIDTH * TILER_HEIGHT * sizeof(*dmac_va),
+							dmac_va, dmac_pa);
+
 	/* close containers only once */
 	for (i = TILFMT_8BIT; i <= TILFMT_MAX; i++) {
 		/* remove identical containers (tmm is unique per tcm) */
@@ -1485,6 +1480,15 @@  static s32 __init tiler_init(void)
 	struct tcm *sita = NULL;
 	struct tmm *tmm_pat = NULL;
 
+	/**
+	  * Array of physical pages for PAT programming, which must be a 16-byte
+	  * aligned physical address
+	*/
+	dmac_va = dma_alloc_coherent(NULL, TILER_WIDTH * TILER_HEIGHT *
+					sizeof(*dmac_va), &dmac_pa, GFP_ATOMIC);
+	if (!dmac_va)
+		return -ENOMEM;
+
 	/* Allocate tiler container manager (we share 1 on OMAP4) */
 	div_pt.x = TILER_WIDTH;   /* hardcoded default */
 	div_pt.y = (3 * TILER_HEIGHT) / 4;
@@ -1551,6 +1555,8 @@  error:
 		kfree(tiler_device);
 		tcm_deinit(sita);
 		tmm_deinit(tmm_pat);
+		dma_free_coherent(NULL, TILER_WIDTH * TILER_HEIGHT *
+					sizeof(*dmac_va), dmac_va, dmac_pa);
 	}
 
 	return r;