drivers/dma/fsl-edma-main.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-)
Configure only the requested channel when a fixed channel is specified
to avoid modifying other channels unintentionally.
Fix parameter configuration when a fixed DMA channel is requested on
i.MX9 AON domain and i.MX8QM/QXP/DXL platforms. When a client requests
a fixed channel (e.g., channel 6), the driver traverses channels 0-5
and may unintentionally modify their configuration if they are unused.
This leads to issues such as setting the `is_multi_fifo` flag unexpectedly,
causing memcpy tests to fail when using the dmatest tool.
Only affect edma memcpy test when the channel is fixed.
Fixes: 72f5801a4e2b ("dmaengine: fsl-edma: integrate v3 support")
Signed-off-by: Joy Zou <joy.zou@nxp.com>
Cc: stable@vger.kernel.org
---
drivers/dma/fsl-edma-main.c | 26 +++++++++++---------------
1 file changed, 11 insertions(+), 15 deletions(-)
diff --git a/drivers/dma/fsl-edma-main.c b/drivers/dma/fsl-edma-main.c
index 97583c7d51a2e8e7a50c7eb4f5ff0582ac95798d..f0c1a2a3fd26e663b3f0b918ff979a68af510fbf 100644
--- a/drivers/dma/fsl-edma-main.c
+++ b/drivers/dma/fsl-edma-main.c
@@ -317,10 +317,8 @@ static struct dma_chan *fsl_edma3_xlate(struct of_phandle_args *dma_spec,
return NULL;
i = fsl_chan - fsl_edma->chans;
- fsl_chan->priority = dma_spec->args[1];
- fsl_chan->is_rxchan = dma_spec->args[2] & FSL_EDMA_RX;
- fsl_chan->is_remote = dma_spec->args[2] & FSL_EDMA_REMOTE;
- fsl_chan->is_multi_fifo = dma_spec->args[2] & FSL_EDMA_MULTI_FIFO;
+ if (!b_chmux && i != dma_spec->args[0])
+ continue;
if ((dma_spec->args[2] & FSL_EDMA_EVEN_CH) && (i & 0x1))
continue;
@@ -328,17 +326,15 @@ static struct dma_chan *fsl_edma3_xlate(struct of_phandle_args *dma_spec,
if ((dma_spec->args[2] & FSL_EDMA_ODD_CH) && !(i & 0x1))
continue;
- if (!b_chmux && i == dma_spec->args[0]) {
- chan = dma_get_slave_channel(chan);
- chan->device->privatecnt++;
- return chan;
- } else if (b_chmux && !fsl_chan->srcid) {
- /* if controller support channel mux, choose a free channel */
- chan = dma_get_slave_channel(chan);
- chan->device->privatecnt++;
- fsl_chan->srcid = dma_spec->args[0];
- return chan;
- }
+ fsl_chan->srcid = dma_spec->args[0];
+ fsl_chan->priority = dma_spec->args[1];
+ fsl_chan->is_rxchan = dma_spec->args[2] & FSL_EDMA_RX;
+ fsl_chan->is_remote = dma_spec->args[2] & FSL_EDMA_REMOTE;
+ fsl_chan->is_multi_fifo = dma_spec->args[2] & FSL_EDMA_MULTI_FIFO;
+
+ chan = dma_get_slave_channel(chan);
+ chan->device->privatecnt++;
+ return chan;
}
return NULL;
}
---
base-commit: 05af764719214d6568adb55c8749dec295228da8
change-id: 20250917-b4-edma-chanconf-da616503f29f
Best regards,
--
Joy Zou <joy.zou@nxp.com>
On Wed, Sep 17, 2025 at 05:53:42PM +0800, Joy Zou wrote: > Configure only the requested channel when a fixed channel is specified > to avoid modifying other channels unintentionally. > > Fix parameter configuration when a fixed DMA channel is requested on > i.MX9 AON domain and i.MX8QM/QXP/DXL platforms. When a client requests > a fixed channel (e.g., channel 6), the driver traverses channels 0-5 > and may unintentionally modify their configuration if they are unused. > > This leads to issues such as setting the `is_multi_fifo` flag unexpectedly, > causing memcpy tests to fail when using the dmatest tool. > > Only affect edma memcpy test when the channel is fixed. > > Fixes: 72f5801a4e2b ("dmaengine: fsl-edma: integrate v3 support") > Signed-off-by: Joy Zou <joy.zou@nxp.com> > Cc: stable@vger.kernel.org Reviewed-by: Frank Li <Frank.Li@nxp.com> > --- > drivers/dma/fsl-edma-main.c | 26 +++++++++++--------------- > 1 file changed, 11 insertions(+), 15 deletions(-) > > diff --git a/drivers/dma/fsl-edma-main.c b/drivers/dma/fsl-edma-main.c > index 97583c7d51a2e8e7a50c7eb4f5ff0582ac95798d..f0c1a2a3fd26e663b3f0b918ff979a68af510fbf 100644 > --- a/drivers/dma/fsl-edma-main.c > +++ b/drivers/dma/fsl-edma-main.c > @@ -317,10 +317,8 @@ static struct dma_chan *fsl_edma3_xlate(struct of_phandle_args *dma_spec, > return NULL; > i = fsl_chan - fsl_edma->chans; > > - fsl_chan->priority = dma_spec->args[1]; > - fsl_chan->is_rxchan = dma_spec->args[2] & FSL_EDMA_RX; > - fsl_chan->is_remote = dma_spec->args[2] & FSL_EDMA_REMOTE; > - fsl_chan->is_multi_fifo = dma_spec->args[2] & FSL_EDMA_MULTI_FIFO; > + if (!b_chmux && i != dma_spec->args[0]) > + continue; > > if ((dma_spec->args[2] & FSL_EDMA_EVEN_CH) && (i & 0x1)) > continue; > @@ -328,17 +326,15 @@ static struct dma_chan *fsl_edma3_xlate(struct of_phandle_args *dma_spec, > if ((dma_spec->args[2] & FSL_EDMA_ODD_CH) && !(i & 0x1)) > continue; > > - if (!b_chmux && i == dma_spec->args[0]) { > - chan = dma_get_slave_channel(chan); > - chan->device->privatecnt++; > - return chan; > - } else if (b_chmux && !fsl_chan->srcid) { > - /* if controller support channel mux, choose a free channel */ > - chan = dma_get_slave_channel(chan); > - chan->device->privatecnt++; > - fsl_chan->srcid = dma_spec->args[0]; > - return chan; > - } > + fsl_chan->srcid = dma_spec->args[0]; > + fsl_chan->priority = dma_spec->args[1]; > + fsl_chan->is_rxchan = dma_spec->args[2] & FSL_EDMA_RX; > + fsl_chan->is_remote = dma_spec->args[2] & FSL_EDMA_REMOTE; > + fsl_chan->is_multi_fifo = dma_spec->args[2] & FSL_EDMA_MULTI_FIFO; > + > + chan = dma_get_slave_channel(chan); > + chan->device->privatecnt++; > + return chan; > } > return NULL; > } > > --- > base-commit: 05af764719214d6568adb55c8749dec295228da8 > change-id: 20250917-b4-edma-chanconf-da616503f29f > > Best regards, > -- > Joy Zou <joy.zou@nxp.com> >
© 2016 - 2025 Red Hat, Inc.