dmaengine: xilinx: xdma: Fix synchronization issue
authorLouis Chauvet <louis.chauvet@bootlin.com>
Wed, 27 Mar 2024 09:58:49 +0000 (10:58 +0100)
committerVinod Koul <vkoul@kernel.org>
Sun, 7 Apr 2024 11:38:45 +0000 (17:08 +0530)
commit6a40fb8245965b481b4dcce011cd63f20bf91ee0
tree37a89351bc223a7024cdb464dc31413e23272bbd
parent5b9706bfc094314c600ab810a61208a7cbaa4cb3
dmaengine: xilinx: xdma: Fix synchronization issue

The current xdma_synchronize method does not properly wait for the last
transfer to be done. Due to limitations of the XMDA engine, it is not
possible to stop a transfer in the middle of a descriptor. Said
otherwise, if a stop is requested at the end of descriptor "N" and the OS
is fast enough, the DMA controller will effectively stop immediately.
However, if the OS is slightly too slow to request the stop and the DMA
engine starts descriptor "N+1", the N+1 transfer will be performed until
its end. This means that after a terminate_all, the last descriptor must
remain valid and the synchronization must wait for this last descriptor to
be terminated.

Fixes: 855c2e1d1842 ("dmaengine: xilinx: xdma: Rework xdma_terminate_all()")
Fixes: f5c392d106e7 ("dmaengine: xilinx: xdma: Add terminate_all/synchronize callbacks")
Cc: stable@vger.kernel.org
Suggested-by: Miquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Link: https://lore.kernel.org/r/20240327-digigram-xdma-fixes-v1-2-45f4a52c0283@bootlin.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/xilinx/xdma-regs.h
drivers/dma/xilinx/xdma.c