Re: [PATCH] dmaengine: zynqmp_dma: fix burst length configuration

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



+Radhey and Harini

On 10. 01. 20 9:26, Matthias Fend wrote:
> Since the dma engine expects the burst length register content as
> power of 2 value, the burst length needs to be converted first.
> Additionally add a burst length range check to avoid corrupting unrelated
> register bits.
> 
> Signed-off-by: Matthias Fend <matthias.fend@xxxxxxxxxxxxxx>
> ---
>  drivers/dma/xilinx/zynqmp_dma.c | 24 +++++++++++++++---------
>  1 file changed, 15 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/dma/xilinx/zynqmp_dma.c b/drivers/dma/xilinx/zynqmp_dma.c
> index 9c845c07b107..aa4de6c6688a 100644
> --- a/drivers/dma/xilinx/zynqmp_dma.c
> +++ b/drivers/dma/xilinx/zynqmp_dma.c
> @@ -123,10 +123,12 @@
>  /* Max transfer size per descriptor */
>  #define ZYNQMP_DMA_MAX_TRANS_LEN	0x40000000
>  
> +/* Max burst lengths */
> +#define ZYNQMP_DMA_MAX_DST_BURST_LEN    16
> +#define ZYNQMP_DMA_MAX_SRC_BURST_LEN    16
> +
>  /* Reset values for data attributes */
>  #define ZYNQMP_DMA_AXCACHE_VAL		0xF
> -#define ZYNQMP_DMA_ARLEN_RST_VAL	0xF
> -#define ZYNQMP_DMA_AWLEN_RST_VAL	0xF
>  
>  #define ZYNQMP_DMA_SRC_ISSUE_RST_VAL	0x1F
>  
> @@ -534,17 +536,19 @@ static void zynqmp_dma_handle_ovfl_int(struct zynqmp_dma_chan *chan, u32 status)
>  
>  static void zynqmp_dma_config(struct zynqmp_dma_chan *chan)
>  {
> -	u32 val;
> +	u32 val, burst_val;
>  
>  	val = readl(chan->regs + ZYNQMP_DMA_CTRL0);
>  	val |= ZYNQMP_DMA_POINT_TYPE_SG;
>  	writel(val, chan->regs + ZYNQMP_DMA_CTRL0);
>  
>  	val = readl(chan->regs + ZYNQMP_DMA_DATA_ATTR);
> +	burst_val = __ilog2_u32(chan->src_burst_len);
>  	val = (val & ~ZYNQMP_DMA_ARLEN) |
> -		(chan->src_burst_len << ZYNQMP_DMA_ARLEN_OFST);
> +		(burst_val << ZYNQMP_DMA_ARLEN_OFST);
> +	burst_val = __ilog2_u32(chan->dst_burst_len);
>  	val = (val & ~ZYNQMP_DMA_AWLEN) |
> -		(chan->dst_burst_len << ZYNQMP_DMA_AWLEN_OFST);
> +		(burst_val << ZYNQMP_DMA_AWLEN_OFST);
>  	writel(val, chan->regs + ZYNQMP_DMA_DATA_ATTR);
>  }
>  
> @@ -560,8 +564,10 @@ static int zynqmp_dma_device_config(struct dma_chan *dchan,
>  {
>  	struct zynqmp_dma_chan *chan = to_chan(dchan);
>  
> -	chan->src_burst_len = config->src_maxburst;
> -	chan->dst_burst_len = config->dst_maxburst;
> +	chan->src_burst_len = clamp(config->src_maxburst, 1U,
> +		(u32) ZYNQMP_DMA_MAX_SRC_BURST_LEN);
> +	chan->dst_burst_len = clamp(config->dst_maxburst, 1U,
> +		(u32) ZYNQMP_DMA_MAX_DST_BURST_LEN);
>  
>  	return 0;
>  }
> @@ -887,8 +893,8 @@ static int zynqmp_dma_chan_probe(struct zynqmp_dma_device *zdev,
>  		return PTR_ERR(chan->regs);
>  
>  	chan->bus_width = ZYNQMP_DMA_BUS_WIDTH_64;
> -	chan->dst_burst_len = ZYNQMP_DMA_AWLEN_RST_VAL;
> -	chan->src_burst_len = ZYNQMP_DMA_ARLEN_RST_VAL;
> +	chan->dst_burst_len = ZYNQMP_DMA_MAX_DST_BURST_LEN;
> +	chan->src_burst_len = ZYNQMP_DMA_MAX_SRC_BURST_LEN;
>  	err = of_property_read_u32(node, "xlnx,bus-width", &chan->bus_width);
>  	if (err < 0) {
>  		dev_err(&pdev->dev, "missing xlnx,bus-width property\n");
> 

M




[Index of Archives]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux PCI]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux