У меня есть PCIdevice в Qemu.
Внутри виртуальной машины (образ ubuntu, ядро 4.15), я написал драйвер PCI для этого устройства. Я использовал request_irq для присоединения обработчика IRQ к строке 11 irq.
Я вижу свое имя прерывания с выводом прерывания '11' в /proc/interrupts.
Но когда я выполняю pci_irq_assert в Qemu.
, я получаю следующую ошибку, которую вижу в журналах dmesg.
irq 22 : 'nobody cared (try booting with the “irqpoll” option)'
Код драйвера:
pci_probe function
/* IRQ setup. */
pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &val);
pci_irq = val;
if (request_irq(pci_irq, irq_handler, IRQF_SHARED, "pci_irq_handler0", &major) < 0) {
dev_err(&(dev->dev), "request_irq\n");
goto error;
}
irq_handler function:
int devi;
irqreturn_t ret;
u32 irq_status;
devi = *(int *)dev;
if (devi == major) {
irq_status = ioread32(mmio + IO_IRQ_STATUS);
pr_info("interrupt irq = %d dev = %d irq_status = %llx\n",
irq, devi, (unsigned long long)irq_status);
/* Must do this ACK, or else the interrupts just keeps firing. */
iowrite32(irq_status, mmio + IO_IRQ_ACK);
ret = IRQ_HANDLED;
} else {
ret = IRQ_NONE;
}
return ret;`
Устройство Qemu:
pci_conf[PCI_INTERRUPT_PIN] = 0x02;
/* this device support interrupt */
d->irq = pci_allocate_irq(pci_dev);