From: "Benoît Monin" <benoit.monin@bootlin.com>
To: Frank Li <Frank.li@nxp.com>
Cc: Vinod Koul <vkoul@kernel.org>,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
Frank Li <Frank.Li@kernel.org>,
imx@lists.linux.dev, dmaengine@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 2/2] dmaengine: fsl-edma: Support dynamic scatter/gather chaining
Date: Tue, 12 May 2026 17:50:06 +0200 [thread overview]
Message-ID: <Unndqc1KRZGMMQbK0XrAyw@bootlin.com> (raw)
In-Reply-To: <agIr7wqV3jIFp-dC@lizhi-Precision-Tower-5810>
On Monday, 11 May 2026 at 21:20:15 CEST, Frank Li wrote:
> On Mon, May 11, 2026 at 03:57:20PM +0200, Benoît Monin wrote:
> > Implement dynamic linking of scatter/gather transfers to enable
> > chaining multiple DMA descriptors without stopping the channel.
> > This avoids waiting for the channel to go idle if there is another
> > transaction already issued.
> >
> > Add fsl_edma_link_sg() to dynamically link the last TCD of a previously
> > submitted descriptor to the first TCD of a new descriptor by setting
> > the scatter/gather address and the E_SG flag, and keeping the channel
> > active by clearing the DREQ bit.
> >
> > Linking is done when the transaction is submitted by fsl_edma_tx_submit().
> > To do so, the .tx_submit() callback is overridden for non-cyclic
> > transactions prepared by fsl_edma_prep_peripheral_dma_vec() and
> > fsl_edma_prep_slave_sg(). This ensures that transactions are linked
> > in the order they are submitted.
> >
> > Update fsl_edma_xfer_desc() to avoid re-initializing the hardware when a
> > transfer is already in progress, allowing seamless chaining of descriptors.
> >
> > Modify the transfer completion handler to check the DONE flag in the
> > channel CSR before marking the transfer complete. Since this flag is
> > only available on SoC with the split registers layout, we only link
> > transactions for DMA controllers flagged with FSL_EDMA_DRV_SPLIT_REG.
> >
> > Add trace event for scatter/gather linking operations.
> >
> > Signed-off-by: Benoît Monin <benoit.monin@bootlin.com>
> > ---
> > drivers/dma/fsl-edma-common.c | 90 +++++++++++++++++++++++++++++++++++++++----
> > drivers/dma/fsl-edma-trace.h | 5 +++
> > 2 files changed, 88 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/dma/fsl-edma-common.c b/drivers/dma/fsl-edma-common.c
> > index c10190164926..b83d1b91dca2 100644
> > --- a/drivers/dma/fsl-edma-common.c
> > +++ b/drivers/dma/fsl-edma-common.c
> > @@ -58,7 +58,10 @@ void fsl_edma_tx_chan_handler(struct fsl_edma_chan *fsl_chan)
> > list_del(&fsl_chan->edesc->vdesc.node);
> > vchan_cookie_complete(&fsl_chan->edesc->vdesc);
> > fsl_chan->edesc = NULL;
> > - fsl_chan->status = DMA_COMPLETE;
> > + if (!(fsl_edma_drvflags(fsl_chan) & FSL_EDMA_DRV_SPLIT_REG) ||
> > + (edma_readl_chreg(fsl_chan, ch_csr) & EDMA_V3_CH_CSR_DONE)) {
> > + fsl_chan->status = DMA_COMPLETE;
>
> Does fsl_edma_desc_residue() needs to update?
>
I don't think so. Computing the residue of one vdesc is not modified by the
fact that is it linked to another transaction.
> > + }
> > } else {
> > vchan_cyclic_callback(&fsl_chan->edesc->vdesc);
> > }
> > @@ -673,6 +676,68 @@ struct dma_async_tx_descriptor *fsl_edma_prep_dma_cyclic(
> > return vchan_tx_prep(&fsl_chan->vchan, &fsl_desc->vdesc, flags);
> > }
> >
> > +static void fsl_edma_link_sg(struct fsl_edma_chan *fsl_chan, struct fsl_edma_desc *fsl_desc)
> > +{
> > + u32 flags = fsl_edma_drvflags(fsl_chan);
> > + struct fsl_edma_hw_tcd *last_tcd;
> > + struct fsl_edma_desc *prev_desc;
> > + struct virt_dma_desc *vdesc;
> > + u16 csr;
> > +
> > + lockdep_assert_held(&fsl_chan->vchan.lock);
> > +
> > + if (!(flags & FSL_EDMA_DRV_SPLIT_REG))
> > + return;
> > +
> > + vdesc = list_last_entry_or_null(&fsl_chan->vchan.desc_issued,
> > + struct virt_dma_desc, node);
> > + if (!vdesc)
> > + vdesc = list_last_entry_or_null(&fsl_chan->vchan.desc_submitted,
> > + struct virt_dma_desc, node);
> > + if (!vdesc)
> > + return;
>
> Suppose you only check submit queue,
>
> issue transfer will move submit queue to issue queue.
>
Right, It's the other way around. I should first look for the last submitted
entry, then check the issued list. Will fix.
Best regards,
--
Benoît Monin, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
next prev parent reply other threads:[~2026-05-12 15:50 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-11 13:57 [PATCH v3 0/2] dmaengine: fsl-edma: Scatter/gather improvements Benoît Monin
2026-05-11 13:57 ` [PATCH v3 1/2] dmaengine: fsl-edma: Implement device_prep_peripheral_dma_vec Benoît Monin
2026-05-11 19:13 ` Frank Li
2026-05-12 5:06 ` sashiko-bot
2026-05-11 13:57 ` [PATCH v3 2/2] dmaengine: fsl-edma: Support dynamic scatter/gather chaining Benoît Monin
2026-05-11 19:20 ` Frank Li
2026-05-12 15:50 ` Benoît Monin [this message]
2026-05-12 5:49 ` sashiko-bot
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=Unndqc1KRZGMMQbK0XrAyw@bootlin.com \
--to=benoit.monin@bootlin.com \
--cc=Frank.Li@kernel.org \
--cc=Frank.li@nxp.com \
--cc=dmaengine@vger.kernel.org \
--cc=imx@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=thomas.petazzoni@bootlin.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.