From: "Gupta, Suraj" <suraj.gupta2@amd.com>
To: Alex Bereza <alex@bereza.email>, Vinod Koul <vkoul@kernel.org>,
Frank Li <Frank.Li@kernel.org>,
Michal Simek <michal.simek@amd.com>,
Kedareswara rao Appana <appana.durga.rao@xilinx.com>
Cc: dmaengine@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] dmaengine: xilinx_dma: Fix hardware buffer descriptor chain after cyclic DMA
Date: Sun, 23 Aug 2026 16:43:10 +0530 [thread overview]
Message-ID: <a59b49bb-74cb-4855-88d9-dfe5870135f4@amd.com> (raw)
In-Reply-To: <20260818-fix-hw-buf-desc-after-cyclic-mode-v2-1-530ff44c6a81@bereza.email>
On 8/18/2026 1:06 PM, Alex Bereza wrote:
> Using the DMA in cyclic mode modifies the hardware buffer descriptor
> chain in xilinx_dma_prep_dma_cyclic so that the last descriptor used by
> the cyclic transfer points back to the first descriptor, but it never
> restores the original descriptor ring. This breaks using non-cyclic mode
> after cyclic mode with an error like:
>
> xilinx-vdma 86000000.dma: Channel 00000000354d5c8d has errors 100, cdr 6de40000 tdr 6de40400
>
> The only way to get out of this error state is to rebuild the hardware
> buffer descriptor ring by releasing and re-acquiring the channel.
>
> Fix using non-cyclic mode after cyclic mode by always restoring the
> original buffer descriptor ring in the same manner as it is set up by
> xilinx_dma_alloc_chan_resources().
>
> Fixes: 23059408b6a3 ("dmaengine: xilinx_dma: Fix race condition in the driver for multiple descriptor scenario")
> Signed-off-by: Alex Bereza <alex@bereza.email>
Reviewed-by: Suraj Gupta <suraj.gupta2@amd.com>
Thanks,
Suraj
> ---
> Changes in v2:
> - Use pointer arithmetic instead of potential 64 bit division in
> xilinx_dma_clean_hw_desc() as suggested by Frank Li
> <Frank.Li@kernel.org> and sashiko-bot - Thanks!
> - Link to v1: https://patch.msgid.link/20260817-fix-hw-buf-desc-after-cyclic-mode-v1-1-1fe47e701d6c@bereza.email
>
> To: Vinod Koul <vkoul@kernel.org>
> To: Frank Li <Frank.Li@kernel.org>
> To: Michal Simek <michal.simek@amd.com>
> To: Kedareswara rao Appana <appana.durga.rao@xilinx.com>
> Cc: dmaengine@vger.kernel.org
> Cc: linux-arm-kernel@lists.infradead.org
> Cc: linux-kernel@vger.kernel.org
> ---
> drivers/dma/xilinx/xilinx_dma.c | 24 +++++++++++++++++-------
> 1 file changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c
> index bef2b031dba1..650e078fcdb7 100644
> --- a/drivers/dma/xilinx/xilinx_dma.c
> +++ b/drivers/dma/xilinx/xilinx_dma.c
> @@ -756,15 +756,25 @@ xilinx_aximcdma_alloc_tx_segment(struct xilinx_dma_chan *chan)
> return segment;
> }
>
> -static void xilinx_dma_clean_hw_desc(struct xilinx_axidma_desc_hw *hw)
> +static void xilinx_dma_clean_hw_desc(struct xilinx_dma_chan *chan,
> + struct xilinx_axidma_tx_segment *segment)
> {
> - u32 next_desc = hw->next_desc;
> - u32 next_desc_msb = hw->next_desc_msb;
> + dma_addr_t next;
> + u32 i;
>
> - memset(hw, 0, sizeof(struct xilinx_axidma_desc_hw));
> + /*
> + * Restore the buffer descriptor's next descriptor pointer to the value
> + * set up in xilinx_dma_alloc_chan_resources(). Otherwise using the DMA
> + * in cyclic mode leaves the next descriptor pointer altered and
> + * prevents subsequent non-cyclic transfers.
> + */
> + i = segment - chan->seg_v;
> + next = chan->seg_p +
> + sizeof(*chan->seg_v) * ((i + 1) % XILINX_DMA_NUM_DESCS);
>
> - hw->next_desc = next_desc;
> - hw->next_desc_msb = next_desc_msb;
> + memset(&segment->hw, 0, sizeof(segment->hw));
> + segment->hw.next_desc = lower_32_bits(next);
> + segment->hw.next_desc_msb = upper_32_bits(next);
> }
>
> static void xilinx_mcdma_clean_hw_desc(struct xilinx_aximcdma_desc_hw *hw)
> @@ -786,7 +796,7 @@ static void xilinx_mcdma_clean_hw_desc(struct xilinx_aximcdma_desc_hw *hw)
> static void xilinx_dma_free_tx_segment(struct xilinx_dma_chan *chan,
> struct xilinx_axidma_tx_segment *segment)
> {
> - xilinx_dma_clean_hw_desc(&segment->hw);
> + xilinx_dma_clean_hw_desc(chan, segment);
>
> list_add_tail(&segment->node, &chan->free_seg_list);
> }
>
> ---
> base-commit: 0d995da5fb97e8c312834575604d4423eb6225b7
> change-id: 20260817-fix-hw-buf-desc-after-cyclic-mode-cf0a7834ab50
>
> Best regards,
> --
> Alex Bereza <alex@bereza.email>
prev parent reply other threads:[~2026-08-23 11:13 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-18 7:36 [PATCH v2] dmaengine: xilinx_dma: Fix hardware buffer descriptor chain after cyclic DMA Alex Bereza
2026-08-18 7:55 ` sashiko-bot
2026-08-23 11:13 ` Gupta, Suraj [this message]
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=a59b49bb-74cb-4855-88d9-dfe5870135f4@amd.com \
--to=suraj.gupta2@amd.com \
--cc=Frank.Li@kernel.org \
--cc=alex@bereza.email \
--cc=appana.durga.rao@xilinx.com \
--cc=dmaengine@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=michal.simek@amd.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.