[PATCH] TILER: Move dma_alloc_coherent call to tiler init

Bryan Wu bryan.wu at canonical.com
Thu Jul 15 03:10:53 UTC 2010


David's already moved the dma_alloc/free into the right place, so it looks fine
to me.

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

Thanks,
-Bryan

On 07/15/2010 11:00 AM, Bryan Wu wrote:
> From: David Sin <davidsin at 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 at 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;






More information about the kernel-team mailing list