DMA from memory to local bus
From: Hommel, Thomas (GE EntSol,
Intelligent Platforms) <hidden>
Date: 2008-11-28 14:13:15
2 messages, 2 authors, 2008-12-01 · open the first message on its own page
From: Hommel, Thomas (GE EntSol,
Intelligent Platforms) <hidden>
Date: 2008-11-28 14:13:15
Hi all, I'm currently developing a driver and want to make use of the DMA offload engine. Data has to be transferred from memory to a device on the local bus and vice versa. At a first look, the function dma_async_memcpy_buf_to_buf() seemed to be suitable, but it does not translate addresses correctly. Both addresses are treated as if they were in memory. In my configuration, the buffer is located in memory, but the device's I/O space is mapped into vmalloc space via ioremap(). How can I access the I/O space corectly from the DMA controller? I also checked the return of virt_to_phys() and this does not deliver the correct physical address. The board is based on MPC8641D and I'm using the on-chip DMA engine. Thanks for your help Thomas
From: Ira Snyder <hidden>
Date: 2008-12-01 17:04:58
On Fri, Nov 28, 2008 at 03:04:04PM +0100, Hommel, Thomas (GE EntSol, Intelligent Platforms) wrote:
Hi all, I'm currently developing a driver and want to make use of the DMA offload engine. Data has to be transferred from memory to a device on the local bus and vice versa. At a first look, the function dma_async_memcpy_buf_to_buf() seemed to be suitable, but it does not translate addresses correctly. Both addresses are treated as if they were in memory. In my configuration, the buffer is located in memory, but the device's I/O space is mapped into vmalloc space via ioremap(). How can I access the I/O space corectly from the DMA controller? I also checked the return of virt_to_phys() and this does not deliver the correct physical address. The board is based on MPC8641D and I'm using the on-chip DMA engine.
Check out my PCINet driver, posted here previously. It does something similar. It uses the PowerPC DMA controller to transfer all of the data around. You probably need to use dma_map_single() to get the physical address of your memory to give it to the DMA controller. Ira