Как я могу использовать DMA в ядре Linux?

Я пытаюсь использовать движок 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");
*/
  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, чтобы проверить, завершена ли операция копирования

Отредактировано 7 июля 19:21. Я проверил, что канал DMA может быть найден dma_find_channel(). Но все же мое ядро ​​не очень хорошо работает с dma_async_memcpy_pg_to_pg ... Когда я проверяю текущий статус канала DMA с помощью dma_async_is_tx_complete, большую часть времени он все еще находится в состоянии выполнения. Это немного странно, потому что я просто копирую одну страницу...


person cienlux    schedule 06.07.2013    source источник
comment
Да, я читал эту ветку, но в ней нет информации о том, как активировать DMA...   -  person cienlux    schedule 06.07.2013
comment
Извините, прошло 10 лет с тех пор, как я имел дело с dma в linux, но: мне кажется, что async_memcpy выделяет собственный канал DMA. Возможно, вы мешаете работе async_memcpy, выделяя единственный канал dma. В любом случае, я не думаю, что вам нужно что-то делать, чтобы активировать архитектуру движка DMA, но у вас может не быть базового оборудования.   -  person Speed8ump    schedule 07.07.2013
comment
Итак, у вас есть I/OAT на вашей машине?   -  person CL.    schedule 07.07.2013
comment
Одна проблема заключается в том, что DMA использует физическую память и избегает кэша ЦП. Это может быть полезно в зависимости от приложения; Нецелесообразно заменять традиционный memcpy() вариантом DMA. Это скорее специализированная операция, при которой копируются большие суммы. В Linux есть копирование при записи; Я не уверен, что лежит в основе мотивации.   -  person artless noise    schedule 07.07.2013
comment
На моей машине есть двигатель I/OAT и DMA. (Проверено из lspci) Я пытаюсь скопировать большое количество страниц (8 ~ 32 страницы) с помощью прямого доступа к памяти, не загрязняя кэши данных. Вместо использования async_memcpy я пытаюсь использовать async_memcpy_pg_to_pg, который может копировать страницы.   -  person cienlux    schedule 08.07.2013