QEMU 如何为 PCI 设备分配特定的 IRQ 编号?

问题描述

我正在使用我的新 pci 设备运行 qemu-system-x86_64。我想使用 IRQ 17(因为内核驱动程序监听 IRQ 17)。但是我的 PCI 设备采用 IRQ 10 或 11。基于interrupt_pin(A,B,C,E)。 然后我想通过 q​​emu_irq_pulse 将 irq 发送到内核模块。

这就是我分配 irq 的方式:

pci_config_set_interrupt_pin(pci_dev->config,1);
d->irq = pci_allocate_irq(pci_dev)


root@hostname:~# cat /proc/interrupts 
           CPU0       
  0:         48   IO-APIC   2-edge      timer
  1:          9   IO-APIC   1-edge      i8042
  4:       1440   IO-APIC   4-edge      ttyS0
  8:          1   IO-APIC   8-edge      rtc0
  9:          0   IO-APIC   9-fasteoi   acpi
 12:        125   IO-APIC  12-edge      i8042
 24:        773   PCI-MSI 512000-edge      ahci[0000:00:1f.2]
 25:        355   PCI-MSI 32768-edge      eth0-rx-0
 26:        160   PCI-MSI 32769-edge      eth0-tx-0
 27:          1   PCI-MSI 32770-edge      eth0

lspci -nk -vv:
00:1f.3 0880: 10de:0101 (rev 01)
    Subsystem: 1af4:1100
    Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
    Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Interrupt: pin A routed to IRQ 10
    Capabilities: [80] MSI: Enable- Count=1/1 Maskable- 64bit+
        Address: 0000000000000000  Data: 0000

内核驱动程序未能请求 irq,因为它试图附加到 IRQ 17。我不想更改内核端。

This is what i want to see:
root@hostname:~# cat /proc/interrupts 
           CPU0       
  0:       2213   IO-APIC   
 17:          0   IO-APIC  17-fasteoi   some_kernel_driver_name

如何在qemu中为PCI设备分配中断17?

解决方法

我不确定这是正确答案,但对我来说它有帮助: 添加到 ACPI:

irqs = 17;
aml_append(crs,aml_interrupt(AML_CONSUMER,AML_EDGE,AML_ACTIVE_HIGH,AML_SHARED,&irqs,1));

此外,PCI 中断号似乎也取决于 PCI vendor_id 和 device_id。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...