Skip to content

Commit 794a0f7

Browse files
fancerbjorn-helgaas
authored andcommitted
dmaengine: dw-edma: Drop dma_slave_config.direction field usage
The dma_slave_config.direction field usage in the DW eDMA driver was introduced by bd96f1b ("dmaengine: dw-edma: support local dma device transfer semantics"). Mainly the change introduced there was correct (indeed DEV_TO_MEM means using RD-channel and MEM_TO_DEV - WR-channel for the case of having eDMA accessed locally from CPU/Application side), but providing an additional MEM_TO_MEM/DEV_TO_DEV-based semantics was quite redundant if not to say potentially harmful (when it comes to removing the denoted field). First of all since the dma_slave_config.direction field has been marked as obsolete (see [1] and the struct dma_slave_config [2]) and will be discarded in future, using it especially in a non-standard way is discouraged. Secondly in accordance with the commit denoted above the default dw_edma_device_transfer() semantics has been changed despite what its message said. So claiming that the method was left backward compatible was wrong. Fix the problems denoted above and simplify the dw_edma_device_transfer() method by dropping the parsing of the DMA-channel direction field. Instead of having that implicit dma_slave_config.direction field semantic, use the recently added DW_EDMA_CHIP_LOCAL flag to distinguish between the local and remote DW eDMA setups thus preserving support for both cases. Add an ASCII figure to clarify the situation. [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/driver-api/dmaengine/provider.rst?id=v5.18#n478 [2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/dmaengine.h?id=v5.18#n389 [bhelgaas: convert references to specific URLs] Co-developed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> Link: https://lore.kernel.org/r/20220524152159.2370739-6-Frank.Li@nxp.com Tested-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru> Signed-off-by: Frank Li <Frank.Li@nxp.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-By: Vinod Koul <vkoul@kernel.org>
1 parent 6951ee9 commit 794a0f7

1 file changed

Lines changed: 34 additions & 15 deletions

File tree

drivers/dma/dw-edma/dw-edma-core.c

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -339,21 +339,40 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer)
339339
if (!chan->configured)
340340
return NULL;
341341

342-
switch (chan->config.direction) {
343-
case DMA_DEV_TO_MEM: /* local DMA */
344-
if (dir == DMA_DEV_TO_MEM && chan->dir == EDMA_DIR_READ)
345-
break;
346-
return NULL;
347-
case DMA_MEM_TO_DEV: /* local DMA */
348-
if (dir == DMA_MEM_TO_DEV && chan->dir == EDMA_DIR_WRITE)
349-
break;
350-
return NULL;
351-
default: /* remote DMA */
352-
if (dir == DMA_MEM_TO_DEV && chan->dir == EDMA_DIR_READ)
353-
break;
354-
if (dir == DMA_DEV_TO_MEM && chan->dir == EDMA_DIR_WRITE)
355-
break;
356-
return NULL;
342+
/*
343+
* Local Root Port/End-point Remote End-point
344+
* +-----------------------+ PCIe bus +----------------------+
345+
* | | +-+ | |
346+
* | DEV_TO_MEM Rx Ch <----+ +---+ Tx Ch DEV_TO_MEM |
347+
* | | | | | |
348+
* | MEM_TO_DEV Tx Ch +----+ +---> Rx Ch MEM_TO_DEV |
349+
* | | +-+ | |
350+
* +-----------------------+ +----------------------+
351+
*
352+
* 1. Normal logic:
353+
* If eDMA is embedded into the DW PCIe RP/EP and controlled from the
354+
* CPU/Application side, the Rx channel (EDMA_DIR_READ) will be used
355+
* for the device read operations (DEV_TO_MEM) and the Tx channel
356+
* (EDMA_DIR_WRITE) - for the write operations (MEM_TO_DEV).
357+
*
358+
* 2. Inverted logic:
359+
* If eDMA is embedded into a Remote PCIe EP and is controlled by the
360+
* MWr/MRd TLPs sent from the CPU's PCIe host controller, the Tx
361+
* channel (EDMA_DIR_WRITE) will be used for the device read operations
362+
* (DEV_TO_MEM) and the Rx channel (EDMA_DIR_READ) - for the write
363+
* operations (MEM_TO_DEV).
364+
*
365+
* It is the client driver responsibility to choose a proper channel
366+
* for the DMA transfers.
367+
*/
368+
if (chan->dw->chip->flags & DW_EDMA_CHIP_LOCAL) {
369+
if ((chan->dir == EDMA_DIR_READ && dir != DMA_DEV_TO_MEM) ||
370+
(chan->dir == EDMA_DIR_WRITE && dir != DMA_MEM_TO_DEV))
371+
return NULL;
372+
} else {
373+
if ((chan->dir == EDMA_DIR_WRITE && dir != DMA_DEV_TO_MEM) ||
374+
(chan->dir == EDMA_DIR_READ && dir != DMA_MEM_TO_DEV))
375+
return NULL;
357376
}
358377

359378
if (xfer->type == EDMA_XFER_CYCLIC) {

0 commit comments

Comments
 (0)