From: Michal Simek <michal.simek@xilinx.com>
To: Matthias Fend <matthias.fend@wolfvision.net>,
linux-arm-kernel@lists.infradead.org
Cc: dmaengine@vger.kernel.org,
Harini Katakam <harini.katakam@xilinx.com>,
vkoul@kernel.org,
Radhey Shyam Pandey <radhey.shyam.pandey@xilinx.com>,
michal.simek@xilinx.com
Subject: Re: [PATCH] dmaengine: zynqmp_dma: fix burst length configuration
Date: Fri, 10 Jan 2020 09:48:15 +0100 [thread overview]
Message-ID: <137545d8-466d-e2f6-1e3e-8879dcee423d@xilinx.com> (raw)
In-Reply-To: <20200110082607.25353-1-matthias.fend@wolfvision.net>
+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@wolfvision.net>
> ---
> 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
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-01-10 8:48 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-10 8:26 [PATCH] dmaengine: zynqmp_dma: fix burst length configuration Matthias Fend
2020-01-10 8:48 ` Michal Simek [this message]
2020-01-15 5:41 ` Harini Katakam
2020-01-21 9:18 ` Vinod Koul
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=137545d8-466d-e2f6-1e3e-8879dcee423d@xilinx.com \
--to=michal.simek@xilinx.com \
--cc=dmaengine@vger.kernel.org \
--cc=harini.katakam@xilinx.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=matthias.fend@wolfvision.net \
--cc=radhey.shyam.pandey@xilinx.com \
--cc=vkoul@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).