私はドライバプログラマではなく、Linuxがpcieデバイスにirq番号を割り当てる方法を知りません。
NICドライバの例では、Linuxは「プローブ」または「開く」機能を実行する前にどのirq番号を使用する必要があるかを既に知っているようです。
エラー= ixgbe_request_irq(アダプタ);
ixgbeは 'adapter'変数のデータを使用してirq番号を取得できます。これは、irq値がすでにアダプター構造にあり、生成された番号ではなく既に存在する値であることを意味します。
pci/pcie 設定空間から読み込んだ場合、他のデバイスと簡単に衝突しないでしょうか。
カーネルによって生成/予約されている場合、irq番号がすでに「アダプタ」変数にあるのはなぜですか? (またはBIOSで指定しますか?)
MSI割り込みはカーネルによって生成されるようです。
-
私が理解しているように、irq番号はPCIe構成スペースの割り込みラインレジスタ(オフセット3Ch)から読み取る必要があります。これは、kerenlがすでにどのirq番号を使用する必要があるのかを知っていて、BIOSで割り込みラインレジスタを更新する必要がある理由のようです。 (私の推測では)起動中にまだ仮想IRQがあり(lspciに-bがない場合)、MSIに別のIRQ(?)があるようです。メモリなどの共通リソースを予約する必要がありますか?
答え1
レガシー割り込みの場合、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.
*/