[PATCH] mxs/dma: Enlarge the CCW descriptor area to 4 pages

Vinod Koul vkoul at infradead.org
Thu Sep 13 23:06:39 EDT 2012


On Tue, 2012-09-04 at 06:04 +0200, Marek Vasut wrote:
> In case of a large SPI flash, the amount of DMA descriptors
> available to the DMA driver is not large enough anymore. For
> example 8MB SPI flash now needs 129 descriptors to be transfered
> in one long read. There are currently 53 descriptors available in
> one PAGE_SIZE-big block. Enlarge the allocated descriptor area to
> four PAGE_SIZE blocks to fulfill such requirements.
> 
> Signed-off-by: Marek Vasut <marex at denx.de>
> Cc: Dan Williams <djbw at fb.com>
> Cc: Fabio Estevam <fabio.estevam at freescale.com>
> Cc: Shawn Guo <shawn.guo at linaro.org>
Applied thanks
> ---
>  drivers/dma/mxs-dma.c |   14 ++++++++------
>  1 file changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/dma/mxs-dma.c b/drivers/dma/mxs-dma.c
> index 7f41b25..e269325 100644
> --- a/drivers/dma/mxs-dma.c
> +++ b/drivers/dma/mxs-dma.c
> @@ -101,7 +101,8 @@ struct mxs_dma_ccw {
>  	u32		pio_words[MXS_PIO_WORDS];
>  };
>  
> -#define NUM_CCW	(int)(PAGE_SIZE / sizeof(struct mxs_dma_ccw))
> +#define CCW_BLOCK_SIZE	(4 * PAGE_SIZE)
> +#define NUM_CCW	(int)(CCW_BLOCK_SIZE / sizeof(struct mxs_dma_ccw))
>  
>  struct mxs_dma_chan {
>  	struct mxs_dma_engine		*mxs_dma;
> @@ -354,14 +355,15 @@ static int mxs_dma_alloc_chan_resources(struct dma_chan *chan)
>  
>  	mxs_chan->chan_irq = data->chan_irq;
>  
> -	mxs_chan->ccw = dma_alloc_coherent(mxs_dma->dma_device.dev, PAGE_SIZE,
> -				&mxs_chan->ccw_phys, GFP_KERNEL);
> +	mxs_chan->ccw = dma_alloc_coherent(mxs_dma->dma_device.dev,
> +				CCW_BLOCK_SIZE, &mxs_chan->ccw_phys,
> +				GFP_KERNEL);
>  	if (!mxs_chan->ccw) {
>  		ret = -ENOMEM;
>  		goto err_alloc;
>  	}
>  
> -	memset(mxs_chan->ccw, 0, PAGE_SIZE);
> +	memset(mxs_chan->ccw, 0, CCW_BLOCK_SIZE);
>  
>  	if (mxs_chan->chan_irq != NO_IRQ) {
>  		ret = request_irq(mxs_chan->chan_irq, mxs_dma_int_handler,
> @@ -387,7 +389,7 @@ static int mxs_dma_alloc_chan_resources(struct dma_chan *chan)
>  err_clk:
>  	free_irq(mxs_chan->chan_irq, mxs_dma);
>  err_irq:
> -	dma_free_coherent(mxs_dma->dma_device.dev, PAGE_SIZE,
> +	dma_free_coherent(mxs_dma->dma_device.dev, CCW_BLOCK_SIZE,
>  			mxs_chan->ccw, mxs_chan->ccw_phys);
>  err_alloc:
>  	return ret;
> @@ -402,7 +404,7 @@ static void mxs_dma_free_chan_resources(struct dma_chan *chan)
>  
>  	free_irq(mxs_chan->chan_irq, mxs_dma);
>  
> -	dma_free_coherent(mxs_dma->dma_device.dev, PAGE_SIZE,
> +	dma_free_coherent(mxs_dma->dma_device.dev, CCW_BLOCK_SIZE,
>  			mxs_chan->ccw, mxs_chan->ccw_phys);
>  
>  	clk_disable_unprepare(mxs_dma->clk);






More information about the linux-arm-kernel mailing list