title: Is it possible to do memory-to-memory DMA transfers in Linux? If so, what function invokes the DMA to begin a transfer?
body: <p>My friend and I are attempting to write a device driver for a virtual device (read: not PCI or USB) for an advanced operating systems class. We are using Ubuntu 16.04. Our task is to invoke the IOCTL in our driver and give it a source buffer full of RGB values (an array of integers), an empty destination buffer, and a length. We are to invoke the DMA controller to transfer the contents of the source buffer into the destination buffer, then apply a linear transformation to the values in place in the destination buffer.</p>
  
  <p>We have successfully done the transformations without DMA and we have successfully allocated a DMA channel to our device. The issue we're having is that we can't seem to find a function <strong>anywhere</strong> that describes initiating a transfer using the DMA. We want to have it raise an interrupt upon completion (the driver shouldn't spin waiting for the transfer to finish).</p>
  
  <p>To be clear with what we're asking, we would just like to know where we can find definitions for functions describing this process. We're not asking for code or an exact method for completing this task; we would simply like to know what functions can be used and/or what header file to find them in. We have looked through linux/dma-mapping.h seemingly ad nauseam. We have also looked at LDD3 for a while, but it seems to go thoroughly through the process of setting up the DMA without giving much information on what functions should be used to actually begin the DMA transfer.</p>