1

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");
*/
  1. でdmaengineを入手dmaengine_get
  2. でチャンネルをリクエストdma_request_channel(mask, fn, fn_param)
  3. dma_async_memcpy_pg_to_pgページからページへの memcpy 操作を行うために使用します
  4. dma_async_is_tx_completeコピー操作が完了したかどうかを確認するために使用します

Edited 7/7 19:21PM で DMA チャネルが見つかることを確認しましたdma_find_channel()。しかし、それでも私のカーネルはうまく動作しませんdma_async_memcpy_pg_to_pg... で DMA チャネルの現在のステータスを確認するとdma_async_is_tx_complete、ほとんどの場合、まだ進行中のステータスです。1ページだけコピーしているだけなので、これはちょっと変です...

4

0 に答える 0