Я пытаюсь использовать движок DMA в ядре Linux.
Моя машина представляет собой 64-битную платформу x86, и я просто хочу перенести простую операцию 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 июля 19:21. Я проверил, что канал DMA может быть найден dma_find_channel()
. Но все же мое ядро не очень хорошо работает с dma_async_memcpy_pg_to_pg
... Когда я проверяю текущий статус канала DMA с помощью dma_async_is_tx_complete
, большую часть времени он все еще находится в состоянии выполнения. Это немного странно, потому что я просто копирую одну страницу...
memcpy()
вариантом DMA. Это скорее специализированная операция, при которой копируются большие суммы. В Linux есть копирование при записи; Я не уверен, что лежит в основе мотивации. - person artless noise   schedule 07.07.2013async_memcpy
я пытаюсь использоватьasync_memcpy_pg_to_pg
, который может копировать страницы. - person cienlux   schedule 08.07.2013