Enjoy with your family.
Let me confirm.
CPU
-malloc & memcpy()
DMA
-shoot_malloc & dma_memcpy()
EDMAC
-CreateMemorySuite & (not found yet)
Correct?
And now I finding address of dma_memcpy, but I can't find it yet.
nearly

for CPU copy it is better to work on cached memory (address & ~0x40000000)
whereas for (E)DMAC its important to work on uncached memory (address | 0x40000000).
so it is not important if you use malloc, alloc_dma_memory or shoot_malloc.
but whenever you work with cached/uncached you have to ensure that the caches for this areas are flushed.
so when using DMA on memories that you accessed with CPU in a cached way, you have to flush before and after CPU access.
some example code for EDMAC memcpy (didnt test it, just wrote down right now):
see wiki page Register Map for some details on EDMAC. copy size granularity for EDMAC is 4096, so sizes must be a mutiple of 4096.
in this example i chose to copy from a continuous memory block to a newly allocated memSuite buffer.
you can change it to set up two memSuites from memory blocks or whatever. its just an example.
/* pick some free (check using debug menu) EDMAC channels write: 0x00-0x06, 0x10-0x16, 0x20-0x21. read: 0x08-0x0D, 0x18-0x1D,0x28-0x2B */
dmaChannelRead = 0x19
dmaChannelWrite = 0x11
/* both channels get connected to this... lets call it service. it will just output the data it gets as input */
dmaConnection = 6
/* see wiki, register map, EDMAC what the flags mean. they are for setting up copy block size */
dmaFlags = 0x20001000
/* create a memory suite from a already existing (continuous) memory block with given size. */
struct memSuite *memSuiteSource = CreateMemorySuite(<addr>, <size>, 0);
/* allocate a memory suite that is of given size (potentially fragmented) */
struct memSuite *memSuiteDest = shoot_malloc_suite(<length>);
/* only read channel will emit a callback when reading from memory is done. write channels would just silently wrap */
PackMem_RegisterEDmacCompleteCBRForMemorySuite(dmaChannelRead, &complete_cbr, 0);
/* connect the selected channels to 6 so any data read from RAM is passed to write channel */
ConnectWriteEDmac(dmaChannelWrite, dmaConnection);
ConnectReadEDmac(dmaChannelRead, dmaConnection);
/* setup EDMAC driver to handle memory suite copy. check return codes for being zero (OK)! if !=0 then the suite size was not a multiple of 4096 */
err = PackMem_SetEDmacForMemorySuite(dmaChannelWrite, memSuiteDest , dmaFlags);
err = PackMem_SetEDmacForMemorySuite(dmaChannelRead, memSuiteSource , dmaFlags);
/* start transfer. no flags for write, 2 for read channels */
PackMem_StartEDmac(dmaChannelWrite, 0);
PackMem_StartEDmac(dmaChannelRead, 2);