Oracle® Solaris 11.2 デバイスドライバの記述

印刷ビューの終了

更新: 2014 年 9 月
 
 

標準メッセージシグナル割り込みと拡張メッセージシグナル割り込み

標準メッセージシグナル割り込み (MSI) と拡張メッセージシグナル割り込み (MSI-X) の両方が、帯域内メッセージとして実装されます。メッセージシグナル割り込みは、ソフトウェアによって指定されたアドレスと値を持つ書き込みとして送信されます。

MSI 割り込み

従来の PCI 仕様には、オプションのサポートとしてメッセージシグナル割り込み (MSI) が含まれています。MSI は、送信される書き込みとして実装される帯域内メッセージです。MSI のアドレスとデータはソフトウェアによって指定され、ホストブリッジに固有です。メッセージは帯域内にあるため、メッセージの受信は、割り込みに関連付けられたデータの「プッシュ」に使用できます。定義上、MSI 割り込みは共有されません。デバイスに割り当てられた各 MSI メッセージは、システム内で一意のメッセージであることが保証されています。PCI 関数は、1、2、4、8、16、または 32 個の MSI メッセージを要求できます。システムソフトウェアは、関数の要求より少ない数の MSI メッセージを関数に割り当てることができます。ホストブリッジは、デバイスに割り当てられた一意の MSI メッセージの数で制限できます。

MSI-X 割り込み

MSI-X 割り込みは MSI 割り込みの拡張バージョンであり、MSI 割り込みと同じ機能を持っていますが、次のような主な違いがあります。

  • デバイスごとに最大 2048 個の MSI-X 割り込みベクターがサポートされている。

  • アドレスとデータのエントリが割り込みベクターごとに一意である。

  • MSI-X は、関数ごとのマスキングとベクターごとのマスキングをサポートしている。

MSI-X 割り込みでは、デバイスの未割り当ての割り込みベクターは、前に追加または初期化された MSI-X 割り込みベクターを使用して、同じベクターアドレス、ベクターデータ、割り込みハンドラ、およびハンドラ引数を共有できます。 ddi_intr_dup_handler(9F) 関数を使用すると、関連付けられたデバイスの未割り当ての割り込みベクターに対して、Oracle Solaris OS から提供されるリソースに別名を付けることができます。たとえば、2 つの MSI-X 割り込みがドライバに割り当てられ、32 個の割り込みがデバイスでサポートされている場合、そのドライバは ddi_intr_dup_handler() を使用して、デバイスの 30 個の追加割り込みに対して、受信した 2 つの割り込みに別名を付けることができます。

ddi_intr_dup_handler() 関数は、ddi_intr_add_handler(9F) を使って追加された、または ddi_intr_enable(9F) を使って初期化された割り込みを複製できます。

複製された割り込みは、最初は無効になっています。複製された割り込みを有効にするには、ddi_intr_enable () を使用します。元の MSI-X 割り込みハンドラは、この元の割り込みハンドラに関連付けられているすべての複製された割り込みハンドラが削除されるまで削除できません。複製された割り込みハンドラを削除するには、まず ddi_intr_disable(9F) を呼び出し、次にddi_intr_free (9F) を呼び出します。元の割り込みハンドラに関連付けられているすべての複製された割り込みハンドラが削除されたら、ddi_intr_remove_handler(9F) を使用して元の MSI-X 割り込みハンドラを削除できます。例については、ddi_intr_dup_handler (9F) のマニュアルページを参照してください。