Qemu - irq 22: 'никто не заботился (попробуйте загрузиться с опцией irqpoll)' - PullRequest
2 голосов
/ 05 мая 2020

У меня есть 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); 
...