web-dev-qa-db-ja.com

Linuxはどのirq番号を使用すべきかをどのように知っていますか?

私はドライバープログラマーではありません。LinuxがPCIeデバイスにirq番号を割り当てる方法を明確に把握していません。

NICドライバーの例から、Linuxは、「プローブ」または「オープン」の関数が実行される前に、どのirq番号を使用する必要があるかをすでに知っているようです。

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

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(?)があるようですが、それらは配置されるメモリのような共通のリソースですか?

1
Mark

レガシー割り込みの場合、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

1
Mark

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.
 */
0
wenjianhn

それは私たちが話しているマシンに大きく依存します...最近のPCでは、デバイスは構成時にその場でIRQ番号を割り当てます。

このトピックを掘り下げるには、 "Linux Device Drivers" を覗いてみてください(はい、かなり古いですが、言わなければならないことの多くはまだ当てはまります)。

0
vonbrand