我正在尝试在 linux 内核中使用 DMA 引擎。
我的机器是 x86 64 位平台,我只想将简单的 memcpy 操作卸载到 DMA 引擎。我想知道以下序列是否适合活动 DMA 引擎并使其执行 memcpy 操作。
dmaengine_get();
dma_cap_zero(mask);
dma_cap_set(DMA_MEMCPY,mask);
chan = dma_request_channel(mask,NULL,NULL);
if(chan)
printk(KERN_ALERT "dma channel %s\n", dma_chan_name(ptr_DP->chan));
cookie_temp = dma_async_memcpy_pg_to_pg(chan, dest_pg, 0, src_pg, 0, 0x1000);
if(cookie_temp)
printk(KERN_ALERT "copy pass?\n")
.....
.....
curr_stat = dma_async_is_tx_complete(chan, cookie_temp, NULL, NULL);
printk(KERN_ALERT "check DMA stat (%d)\n", curr_stat);
/*
tx=async_memcpy(pages, pages, 0, 0, 4096, NULL);
printk(KERN_ALERT "DMA descriptor = %p\n",tx);
if(tx)
printk(KERN_ALERT "Working!\n");
else
printk(KERN_ALERT "No luck...\n");
*/
- 使用 dmaengine 获取
dmaengine_get
- 请求频道
dma_request_channel(mask, fn, fn_param)
- 用于
dma_async_memcpy_pg_to_pg
进行页面到页面的 memcpy 操作 - 用于
dma_async_is_tx_complete
检查复制操作是否完成
编辑 7/7 7:21PM 我检查了 DMA 通道可以通过dma_find_channel()
. 但是我的内核仍然不能很好地工作dma_async_memcpy_pg_to_pg
......当我检查 DMA 通道的当前状态时dma_async_is_tx_complete
,大部分时间它仍然处于进行中状态。这有点奇怪,因为我只是复制一页......