我正在尝试开发PCI设备,我需要实现遗留中断(不是MSI或MSIX)。我按照edu.c
的例子,但是当我加载我的驱动程序时仍然会引发IRQ。
我试着看其他设备,但没有运气。这是我的代码:
static void xxx_pci_realize(...)
{
// ....
pci_config_set_interrupt_pin(pci_conf, 1);
pci_set_irq(pdev, 0);
// ....
}
有没有人知道什么是不正确的?谢谢 !
你根本不应该试图在你的实现方法中弄乱PCI线的状态。该方法是创建设备的地方,并且在模拟开始时仅发生一次。应该提升和降低中断线以响应系统运行时发生的事情 - 通常客户端写入一个寄存器,这会导致您执行某些操作,然后再引发中断。然后客人得到那个中断,并告诉设备“好的,我现在已经处理过了”,然后设备降低了中断。你可以在你提到的'edu.c'设备中看到这种模式。
似乎中断不是从我的设备发出的:我已经读过某些地方,在传统的IRQ上,设备被连接在IRQ引脚10和11上。所以CPU /内核无法说出哪一个发出了IRQ。
如果我理解得很清楚,当发出IRQ时,每个具有遗留中断的设备都必须说明中断是否来自他。它是通过设置将由能够处理IRQ的驱动程序读取的寄存器来完成的。然后列表中跟随他的设备也会这样做。
由于我已经调整了我的QEMU PCI设备以返回0表示设备是否已发出IRQ的寄存器,因此IRQ通过并在此之后被禁用。所以我认为这是因为IRQ是由其他设备发布的。
如果有人认为这不是真正的原因,我会很高兴知道是否还有其他可能性:)
再次感谢@ peter-maydell的帮助!