QEMU, как выделить определенный номер IRQ для устройства PCI?

Я запускаю qemu-system-x86_64 с моим новым устройством PCI. И я хочу использовать IRQ 17 (поскольку драйвер ядра прослушивает IRQ 17). Но мое устройство PCI использует IRQ 10 или 11. на основе interrupt_pin (A, B, C, E). Затем я хочу отправить irq в модуль ядра с помощью qemu_irq_pulse.

Вот как я распределяю 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

Как выделить прерывание 17 для устройства PCI в qemu?


person Nick    schedule 14.02.2021    source источник
comment
Драйверы в ядре редко были жестко запрограммированы. Скорее всего вы что-то упустили.   -  person 0andriy    schedule 22.03.2021


Ответы (1)


Я не уверен, что это правильный ответ, но мне это помогает: Добавить в 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.

person Nick    schedule 19.02.2021