S1J0
S1J0

Reputation: 199

How to transfer data via DMA from RAM to RAM?

I want to write a kernel module that can transfer data via DMA from RAM to RAM. There are some posts that discuss this, but I don't really get it. Some say it is possible others say it isn’t.

If I understood ldd3 right, RAM to RAM copying isn‘t possible with the DMA API of linux, but the driver/dma/dmaengine.c provides a flag DMA_MEMCPY for a "DMA Transfer Type", so there should be a way.

Is this correct, can I use a dma engine to transfer data from one ram address to another?

If it is hardware dependent, how can I determine if my system supports dma memcpy?

Upvotes: 2

Views: 2179

Answers (1)

Sam Protsenko
Sam Protsenko

Reputation: 14743

As you correctly pointed out, DMA_MEMCPY should be used to perform RAM-to-RAM copy. It is described in Documentation/dmaengine/provider.txt. Here is just a related excerpt, please see the whole file for more details:

Supported transaction types

The next thing you need is to set which transaction types your device (and driver) supports.

Our dma_device structure has a field called cap_mask that holds the various types of transaction supported, and you need to modify this mask using the dma_cap_set function, with various flags depending on transaction types you support as an argument.

All those capabilities are defined in the dma_transaction_type enum, in include/linux/dmaengine.h

Currently, the types available are:

  • DMA_MEMCPY
    • The device is able to do memory to memory copies

Just to summarize:

  • It depends on your DMA controller. Some are able to do RAM-to-RAM transaction, some aren't.

  • For example, for OMAP-based SoCs, DMA controller does this (drivers/dma/omap-dma.c file, in omap_dma_probe() function):

     dma_cap_set(DMA_MEMCPY, od->ddev.cap_mask);
    
  • This way you can later check it (if your DMA controller is capable of RAM-to-RAM transactions) in your driver. See how it's done in drivers/dma/dmatest.c, in dmatest_add_channel() function:

     if (dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask)) {
    

If you need an example on how to use DMA API to perform RAM-to-RAM transaction, please see drivers/dma/dmatest.c.

Upvotes: 4

Related Questions