linux - QEMU msi 仿真

标签 linux qemu pci pci-e irq

我正在研究一个模拟 QEMU 设备来模拟 FPGA PCIe 接口(interface)。我使用 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)

关于linux - QEMU msi 仿真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34582755/

相关文章:

html - Sendmail插入!电子邮件中间 990 个字符后的符号

regex - 用 sed 替换一行但保留原始行

linux - 如何在 QEMU 上构建和运行 Linux 内核模块?

embedded - 用于嵌入式系统的 PCI Express 驱动程序

windows - Windows 中的 lshw 等价物是什么,它可以像 lshw 在 Linux 上那样给我一个硬件树结构?

linux - PCI/PCIe 设备如何在 Linux 内核中初始化/注册自己?

regex - txt文件删除url到最后 "/"得到文件

Android studio 运行模拟器截图

macos - 如何在qemu中明确解决 "Specify the ' raw'格式以消除限制。”

mysql - 当我的 Sphinx 搜索服务器预热时发生了什么?