08 Aug, 2016

1 commit


04 Jun, 2016

1 commit


06 Jan, 2016

1 commit


18 Dec, 2015

1 commit

  • The two API function can cover most, if not all current APIs used to
    request a channel. With minimal effort dmaengine drivers, platforms and
    dmaengine user drivers can be converted to use the two function.

    struct dma_chan *dma_request_chan_by_mask(const dma_cap_mask_t *mask);

    To request any channel matching with the requested capabilities, can be
    used to request channel for memcpy, memset, xor, etc where no hardware
    synchronization is needed.

    struct dma_chan *dma_request_chan(struct device *dev, const char *name);
    To request a slave channel. The dma_request_chan() will try to find the
    channel via DT, ACPI or in case if the kernel booted in non DT/ACPI mode
    it will use a filter lookup table and retrieves the needed information from
    the dma_slave_map provided by the DMA drivers.
    This legacy mode needs changes in platform code, in dmaengine drivers and
    finally the dmaengine user drivers can be converted:

    For each dmaengine driver an array of DMA device, slave and the parameter
    for the filter function needs to be added:

    static const struct dma_slave_map da830_edma_map[] = {
    { "davinci-mcasp.0", "rx", EDMA_FILTER_PARAM(0, 0) },
    { "davinci-mcasp.0", "tx", EDMA_FILTER_PARAM(0, 1) },
    { "davinci-mcasp.1", "rx", EDMA_FILTER_PARAM(0, 2) },
    { "davinci-mcasp.1", "tx", EDMA_FILTER_PARAM(0, 3) },
    { "davinci-mcasp.2", "rx", EDMA_FILTER_PARAM(0, 4) },
    { "davinci-mcasp.2", "tx", EDMA_FILTER_PARAM(0, 5) },
    { "spi_davinci.0", "rx", EDMA_FILTER_PARAM(0, 14) },
    { "spi_davinci.0", "tx", EDMA_FILTER_PARAM(0, 15) },
    { "da830-mmc.0", "rx", EDMA_FILTER_PARAM(0, 16) },
    { "da830-mmc.0", "tx", EDMA_FILTER_PARAM(0, 17) },
    { "spi_davinci.1", "rx", EDMA_FILTER_PARAM(0, 18) },
    { "spi_davinci.1", "tx", EDMA_FILTER_PARAM(0, 19) },
    };

    This information is going to be needed by the dmaengine driver, so
    modification to the platform_data is needed, and the driver map should be
    added to the pdata of the DMA driver:

    da8xx_edma0_pdata.slave_map = da830_edma_map;
    da8xx_edma0_pdata.slavecnt = ARRAY_SIZE(da830_edma_map);

    The DMA driver then needs to configure the needed device -> filter_fn
    mapping before it registers with dma_async_device_register() :

    ecc->dma_slave.filter_map.map = info->slave_map;
    ecc->dma_slave.filter_map.mapcnt = info->slavecnt;
    ecc->dma_slave.filter_map.fn = edma_filter_fn;

    When neither DT or ACPI lookup is available the dma_request_chan() will
    try to match the requester's device name with the filter_map's list of
    device names, when a match found it will use the information from the
    dma_slave_map to get the channel with the dma_get_channel() internal
    function.

    Signed-off-by: Peter Ujfalusi
    Reviewed-by: Arnd Bergmann
    Signed-off-by: Vinod Koul

    Peter Ujfalusi
     

16 Nov, 2015

1 commit

  • The DMAengine API has a long standing race condition that is inherent to
    the API itself. Calling dmaengine_terminate_all() is supposed to stop and
    abort any pending or active transfers that have previously been submitted.
    Unfortunately it is possible that this operation races against a currently
    running (or with some drivers also scheduled) completion callback.

    Since the API allows dmaengine_terminate_all() to be called from atomic
    context as well as from within a completion callback it is not possible to
    synchronize to the execution of the completion callback from within
    dmaengine_terminate_all() itself.

    This means that a user of the DMAengine API does not know when it is safe
    to free resources used in the completion callback, which can result in a
    use-after-free race condition.

    This patch addresses the issue by introducing an explicit synchronization
    primitive to the DMAengine API called dmaengine_synchronize().

    The existing dmaengine_terminate_all() is deprecated in favor of
    dmaengine_terminate_sync() and dmaengine_terminate_async(). The former
    aborts all pending and active transfers and synchronizes to the current
    context, meaning it will wait until all running completion callbacks have
    finished. This means it is only possible to call this function from
    non-atomic context. The later function does not synchronize, but can still
    be used in atomic context or from within a complete callback. It has to be
    followed up by dmaengine_synchronize() before a client can free the
    resources used in a completion callback.

    In addition to this the semantics of the device_terminate_all() callback
    are slightly relaxed by this patch. It is now OK for a driver to only
    schedule the termination of the active transfer, but does not necessarily
    have to wait until the DMA controller has completely stopped. The driver
    must ensure though that the controller has stopped and no longer accesses
    any memory when the device_synchronize() callback returns.

    This was in part done since most drivers do not pay attention to this
    anyway at the moment and to emphasize that this needs to be done when the
    device_synchronize() callback is implemented. But it also helps with
    implementing support for devices where stopping the controller can require
    operations that may sleep.

    Signed-off-by: Lars-Peter Clausen
    Signed-off-by: Vinod Koul

    Lars-Peter Clausen
     

17 Aug, 2015

2 commits


25 Jun, 2015

1 commit


18 Jun, 2015

1 commit


26 May, 2015

1 commit


19 Feb, 2015

1 commit

  • Pull dmaengine updates from Vinod Koul:
    "This update brings:

    - the big cleanup up by Maxime for device control and slave
    capabilities. This makes the API much cleaner.

    - new IMG MDC driver by Andrew

    - new Renesas R-Car Gen2 DMA Controller driver by Laurent along with
    bunch of fixes on rcar drivers

    - odd fixes and updates spread over driver"

    * 'for-linus' of git://git.infradead.org/users/vkoul/slave-dma: (130 commits)
    dmaengine: pl330: add DMA_PAUSE feature
    dmaengine: pl330: improve pl330_tx_status() function
    dmaengine: rcar-dmac: Disable channel 0 when using IOMMU
    dmaengine: rcar-dmac: Work around descriptor mode IOMMU errata
    dmaengine: rcar-dmac: Allocate hardware descriptors with DMAC device
    dmaengine: rcar-dmac: Fix oops due to unintialized list in error ISR
    dmaengine: rcar-dmac: Fix spinlock issues in interrupt
    dmaenegine: edma: fix sparse warnings
    dmaengine: rcar-dmac: Fix uninitialized variable usage
    dmaengine: shdmac: extend PM methods
    dmaengine: shdmac: use SET_RUNTIME_PM_OPS()
    dmaengine: pl330: fix bug that cause start the same descs in cyclic
    dmaengine: at_xdmac: allow muliple dwidths when doing slave transfers
    dmaengine: at_xdmac: simplify channel configuration stuff
    dmaengine: at_xdmac: introduce save_cc field
    dmaengine: at_xdmac: wait for in-progress transaction to complete after pausing a channel
    ioat: fail self-test if wait_for_completion times out
    dmaengine: dw: define DW_DMA_MAX_NR_MASTERS
    dmaengine: dw: amend description of dma_dev field
    dmatest: move src_off, dst_off, len inside loop
    ...

    Linus Torvalds
     

30 Dec, 2014

1 commit

  • - client.txt was moved by f36d2e67 (dmaengine: Move the current doc to a
    folder of its own)
    - dmatmest.txt was moved by 935cdb56 (dmanegine: move dmatest.txt to
    dmaengine folder)
    - provider.txt was added by c4d2ae967 (Documentation: dmaengine: Add a
    documentation for the dma controller API).

    Cc: Maxime Ripard
    Cc: Vinod Koul
    Cc: Jonathan Corbet
    Cc: dmaengine@vger.kernel.org
    Cc: linux-doc@vger.kernel.org
    Signed-off-by: Henrik Austad
    Signed-off-by: Jonathan Corbet

    Henrik Austad
     

22 Dec, 2014

2 commits


06 Nov, 2014

3 commits