linux 如何知道应该使用哪个 irq 号?

linux 如何知道应该使用哪个 irq 号?

我不是驱动程序程序员,我不清楚linux如何为pcie设备分配irq号。

从NIC驱动程序的例子来看,Linux似乎已经知道在执行“probe”或“open”函数之前应该使用哪个irq号。

前任:https://github.com/torvalds/linux/blob/4608f064532c28c0ea3c03fe26a3a5909852811a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c#L6608

错误= 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.
 */

相关内容