Написание драйвера PCI для передачи DMA на Qemu - PullRequest
0 голосов
/ 24 июня 2018

Я пишу устройство PCI на Qemu и драйвер (LKM) в гостевой ОС.В то время как Qemu предоставляет пример устройства PCI, edu ( edu.txt и edu.c ) с его дистрибутивом, у меня возникают проблемы с написанием модуля ядра для выполненияПередача DMA.Базовый драйвер был рассмотрен здесь , но он не поддерживает DMA.

Я слежу за реализацией ссылки и this .Я попытался передать буфер на устройство PCI из обработчика IRQ.Устройство может считывать данные ( pci_dma_read ), но я не получаю правильные данные, которые я должен получить.Вот сегмент кода, который выполняет передачу DMA:

static int write_to_HyPerf(void *dev, void* addr, uint32_t size)
{
    /* ----------------------------------------------------------------------------
    * PCI address 'addr':
    * addr     -> DMA source address
    * 0x40000  -> DMA destination address
    * 100      -> DMA transfer count
    * 1        -> DMA command register
    * while (DMA command register & 1)
    *--------------------------------------------------------------------------------
    */
    iowrite32((u32 *)dma_handle_to_device, mmio + IO_DMA_SRC);
    iowrite32(DMA_START, mmio + IO_DMA_DST);
    iowrite32((u32 *)size, mmio + IO_DMA_XCNT);
    iowrite32(DMA_CMD | DMA_IRQ, mmio + IO_DMA_CMD);
}

У меня также есть настройка когерентного отображения с использованием dma_alloc_coherent .

vaddr_to_device = dma_alloc_coherent(&(dev->dev), DMA_SIZE, &dma_handle_to_device, GFP_ATOMIC);

Полный код доступен здесь .Что я делаю не так?

...