我不是驱动程序程序员,我不清楚linux如何为pcie设备分配irq号。
从NIC驱动程序的例子来看,Linux似乎已经知道在执行“probe”或“open”函数之前应该使用哪个irq号。
错误= ixgbe_request_irq(适配器);
ixgbe可以通过使用'adapter'变量的数据来获取irq号,这意味着irq值已经在adapter结构中,它不是一个生成的数字,而是一个已经存在的值。
如果是从pci/pcie配置空间读取的话,不是很容易和其他设备冲突吗?
如果它是由内核生成/安排的,那么 irq 号如何已经在“适配器”变量中? (或者是BIOS指定的?)
对于 MSI 的中断,它似乎是由内核生成的?
--
根据我的理解,irq号应该从PCIe配置空间中的中断线寄存器(偏移3Ch)读取,我想这就是为什么kerenl已经知道应该使用哪个irq号,并且中断线寄存器应该由BIOS更新(我的猜测)在启动过程中,但仍然有一个虚拟IRQ(当lspci没有-b时),并且似乎MSI还有另一个IRQ(?),它们是要安排的内存等公共资源吗?
答案1
对于legacy中断,irq值是从配置空间读取的,然而,irq值大部分是由BIOS分配的。
这部分的更多信息: http://tldp.org/HOWTO/Plug-and-Play-HOWTO-7.html
对于MSI/MSI-X中断,是通过分配来完成的。
例如:pci_alloc_irq_vectors() https://www.kernel.org/doc/Documentation/PCI/MSI-HOWTO.txt
答案2
这在很大程度上取决于我们所讨论的机器......在当今的 PC 上,设备在配置时会动态分配 IRQ 编号。
要深入了解该主题,请查看《Linux 设备驱动程序》(是的,它已经相当过时了,但它所说的大部分内容仍然适用)。
答案3
对于 MSI-X,请参阅 acpi_pci_irq_check_entry() 中的注释。
/*
* Type 1: Dynamic
* ---------------
* The 'source' field specifies the PCI interrupt link device used to
* configure the IRQ assigned to this slot|dev|pin. The 'source_index'
* indicates which resource descriptor in the resource template (of
* the link device) this interrupt is allocated from.
*
* NOTE: Don't query the Link Device for IRQ information at this time
* because Link Device enumeration may not have occurred yet
* (e.g. exists somewhere 'below' this _PRT entry in the ACPI
* namespace).
*/
/*
* Type 2: Static
* --------------
* The 'source' field is NULL, and the 'source_index' field specifies
* the IRQ value, which is hardwired to specific interrupt inputs on
* the interrupt controller.
*/