QEMU msi 仿真

QEMU msi emulation

我正在使用模拟 QEMU 设备来模拟 FPGA PCIe 接口。我正在使用 lev-pci 设备作为基本模板:

https://github.com/levex/kernel-qemu-pci/blob/master/qemu/hw/char/lev-pci.c

我的设备使用 MSI 中断进行通信。内核驱动模块能够启用 MSI 中断并接收它们。我修改了 lev-pci.c 以添加

msi_init(dev, 0x70, 1, false, false);

到初始化然后

msi_notify(pci_dev,0);

对"pci_levdev_read"函数进行基本测试。我可以追踪到调试器中正在生成 msi 中断,但我没有在主机上接收到中断。我是否缺少启用 MSI 中断的步骤?

解决方案是在内核模块中启用 DMA。

pci_set_dma_mask(pdev, DMA_BIT_MASK(32))
pci_set_master(pdev)