Я пишу устройство 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);
Полный код доступен здесь .Что я делаю не так?