私はドライバープログラマーではありません。LinuxがPCIeデバイスにirq番号を割り当てる方法を明確に把握していません。
NICドライバーの例から、Linuxは、「プローブ」または「オープン」の関数が実行される前に、どのirq番号を使用する必要があるかをすでに知っているようです。
err = ixgbe_request_irq(adapter);
ixgbeは、「adapter」変数のデータを使用してirq番号を取得できます。これは、アダプター構造内にすでにあるirq値を意味し、生成された番号ではなく、既存の値です。
それがpci/pcie構成スペースから読み取られた場合、他のデバイスと競合するのは非常に簡単ではありませんでしたか?
カーネルによって生成/配置されている場合、「アダプタ」変数内にすでにあるirq番号はどのようになっていますか? (またはBIOSによって割り当てられますか?)
MSIの割り込みの場合、カーネルによって生成されたようです??
-
私の理解では、irq番号はPCIe構成スペースの割り込みラインレジスタ(オフセット3Ch)から読み取る必要があります。そのため、kerenlはどのirq番号を使用する必要があるかをすでに知っており、割り込みラインレジスタはBIOSによって更新する必要があります(私の推測)起動中ですが、仮想IRQがまだあり(-bなしのlspciの場合)、MSIには別のirq(?)があるようですが、それらは配置されるメモリのような共通のリソースですか?
レガシー割り込みの場合、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
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.
*/
それは私たちが話しているマシンに大きく依存します...最近のPCでは、デバイスは構成時にその場でIRQ番号を割り当てます。
このトピックを掘り下げるには、 "Linux Device Drivers" を覗いてみてください(はい、かなり古いですが、言わなければならないことの多くはまだ当てはまります)。