Patch "dmaengine: dw: Activate FIFO-mode for memory peripherals only" has been added to the 5.8-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    dmaengine: dw: Activate FIFO-mode for memory peripherals only

to the 5.8-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     dmaengine-dw-activate-fifo-mode-for-memory-periphera.patch
and it can be found in the queue-5.8 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 3c89fb1680b91b4360e6595521da08a34263677c
Author: Serge Semin <Sergey.Semin@xxxxxxxxxxxxxxxxxxxx>
Date:   Fri Jul 31 23:08:23 2020 +0300

    dmaengine: dw: Activate FIFO-mode for memory peripherals only
    
    [ Upstream commit 6d9459d04081c796fc67c2bb771f4e4ebb5744c4 ]
    
    CFGx.FIFO_MODE field controls a DMA-controller "FIFO readiness" criterion.
    In other words it determines when to start pushing data out of a DW
    DMAC channel FIFO to a destination peripheral or from a source
    peripheral to the DW DMAC channel FIFO. Currently FIFO-mode is set to one
    for all DW DMAC channels. It means they are tuned to flush data out of
    FIFO (to a memory peripheral or by accepting the burst transaction
    requests) when FIFO is at least half-full (except at the end of the block
    transfer, when FIFO-flush mode is activated) and are configured to get
    data to the FIFO when it's at least half-empty.
    
    Such configuration is a good choice when there is no slave device involved
    in the DMA transfers. In that case the number of bursts per block is less
    than when CFGx.FIFO_MODE = 0 and, hence, the bus utilization will improve.
    But the latency of DMA transfers may increase when CFGx.FIFO_MODE = 1,
    since DW DMAC will wait for the channel FIFO contents to be either
    half-full or half-empty depending on having the destination or the source
    transfers. Such latencies might be dangerous in case if the DMA transfers
    are expected to be performed from/to a slave device. Since normally
    peripheral devices keep data in internal FIFOs, any latency at some
    critical moment may cause one being overflown and consequently losing
    data. This especially concerns a case when either a peripheral device is
    relatively fast or the DW DMAC engine is relatively slow with respect to
    the incoming data pace.
    
    In order to solve problems, which might be caused by the latencies
    described above, let's enable the FIFO half-full/half-empty "FIFO
    readiness" criterion only for DMA transfers with no slave device involved.
    Thanks to the commit 99ba8b9b0d97 ("dmaengine: dw: Initialize channel
    before each transfer") we can freely do that in the generic
    dw_dma_initialize_chan() method.
    
    Signed-off-by: Serge Semin <Sergey.Semin@xxxxxxxxxxxxxxxxxxxx>
    Reviewed-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20200731200826.9292-3-Sergey.Semin@xxxxxxxxxxxxxxxxxxxx
    Signed-off-by: Vinod Koul <vkoul@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/dma/dw/dw.c b/drivers/dma/dw/dw.c
index 7a085b3c1854c..d9810980920a1 100644
--- a/drivers/dma/dw/dw.c
+++ b/drivers/dma/dw/dw.c
@@ -14,7 +14,7 @@
 static void dw_dma_initialize_chan(struct dw_dma_chan *dwc)
 {
 	struct dw_dma *dw = to_dw_dma(dwc->chan.device);
-	u32 cfghi = DWC_CFGH_FIFO_MODE;
+	u32 cfghi = is_slave_direction(dwc->direction) ? 0 : DWC_CFGH_FIFO_MODE;
 	u32 cfglo = DWC_CFGL_CH_PRIOR(dwc->priority);
 	bool hs_polarity = dwc->dws.hs_polarity;
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux