Эмуляция MSI QEMU

Я работаю над эмулированным устройством 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?


person John    schedule 03.01.2016    source источник


Ответы (1)


Решением было включить DMA в модуле ядра.

pci_set_dma_mask(pdev, DMA_BIT_MASK(32))
pci_set_master(pdev)
person John    schedule 04.01.2016
comment
Если вопрос решен, отметьте свой вопрос как ответ. - person randrade86; 05.01.2016
comment
Ваш ответ ОЧЕНЬ ПОМОГАЕТ, что спасает меня от ада. Эта проблема блокируется на пару дней на прошлой неделе. Я отправил эту проблему в список рассылки QEMU-devel, но ответа нет. - person Douglas Su; 26.10.2020
comment
Рад, что это было полезно. У меня была эта проблема, потому что в моем старом тестовом стенде не было IOMMU, поэтому он работал на оборудовании, но не на QEMU. Сводил меня с ума около недели. - person John; 28.10.2020