]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
dmaengine: fsl-edma: fix channel parameter config for fixed channel requests
authorJoy Zou <joy.zou@nxp.com>
Wed, 17 Sep 2025 09:53:42 +0000 (17:53 +0800)
committerVinod Koul <vkoul@kernel.org>
Wed, 25 Feb 2026 09:25:10 +0000 (14:55 +0530)
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>
Link: https://patch.msgid.link/20250917-b4-edma-chanconf-v1-1-886486e02e91@nxp.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/fsl-edma-main.c

index dbcdd1e68319005dfab85a6c28b4e3f929f29132..b596baa0a182e3067a5e7847727656c802d40482 100644 (file)
@@ -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;
 }