Go to main content
Oracle® Solaris 11.3 デバイスドライバの記述

印刷ビューの終了

更新: 2016 年 11 月
 
 

DDI 割り込み関数

Oracle Solaris OS では、割り込みの登録と登録解除を行うフレームワークが用意されており、メッセージシグナル割り込み (MSI) がサポートされています。割り込み管理インタフェースを使用して、割り込み優先順位、割り込み許可フラグ、および割り込みマスクを操作したり、中断情報を取得したりすることができます。

割り込み許可フラグ関数

次の関数を使用すると、割り込み情報を取得できます。

ddi_intr_get_navail(9F)

指定したハードウェアデバイスと割り込みタイプで使用できる割り込みの数を返します。

ddi_intr_get_nintrs(9F)

指定した割り込みタイプでデバイスがサポートしている割り込みの数を返します。

ddi_intr_get_supported_types(9F)

デバイスとホストの両方でサポートされているハードウェア割り込みのタイプを返します。

ddi_intr_get_cap(9F)

指定した割り込みの割り込み許可フラグを返します。

割り込み初期化関数と割り込み破棄関数

次の関数を使用すると、割り込みを作成および削除することができます。

ddi_intr_alloc(9F)

指定したタイプの割り込みのシステムリソースと割り込みベクターを割り当てます。

ddi_intr_free(9F)

指定した割り込みハンドルのシステムリソースと割り込みベクターを解放します。

ddi_intr_set_cap(9F)

DDI_INTR_FLAG_LEVEL および DDI_INTR_FLAG_EDGE フラグを使用して、指定した割り込みの許可フラグを設定します。

ddi_intr_add_handler(9F)

割り込みハンドラを追加します。

ddi_intr_dup_handler(9F)

MSI-X とともにのみ使用します。割り当てられた割り込みベクターのアドレスとデータのペアを、同じデバイスの未使用の割り込みベクターにコピーします。

ddi_intr_remove_handler(9F)

指定した割り込みハンドラを削除します。

ddi_intr_enable(9F)

指定した割り込みを有効にします。

ddi_intr_disable(9F)

指定した割り込みを無効にします。

ddi_intr_block_enable(9F)

MSI とともにのみ使用します。指定した範囲の割り込みを有効にします。

ddi_intr_block_disable(9F)

MSI とともにのみ使用します。指定した範囲の割り込みを無効にします。

ddi_intr_set_mask(9F)

指定した割り込みが有効になっている場合に、割り込みマスクを設定します。

ddi_intr_clr_mask(9F)

指定した割り込みが有効になっている場合に、割り込みマスクをクリアします。

ddi_intr_get_pending(9F)

割り込み中断ビットがホストブリッジまたはデバイスでサポートされている場合に、そのようなビットを読み取ります。

優先順位管理関数

次の関数を使用すると、優先順位情報を取得および設定することができます。

ddi_intr_get_pri(9F)

指定した割り込みの現在のソフトウェア優先順位設定を返します。

ddi_intr_set_pri(9F)

指定した割り込みの割り込み優先順位レベルを設定します。

ddi_intr_get_hilevel_pri(9F)

高レベルの割り込みの最小優先順位レベルを返します。

ソフト割り込み関数

次の関数を使用すると、ソフト割り込みおよびソフト割り込みハンドラを操作できます。

ddi_intr_add_softint(9F)

ソフト割り込みハンドラを追加します。

ddi_intr_trigger_softint(9F)

指定したソフト割り込みをトリガーします。

ddi_intr_remove_softint(9F)

指定したソフト割り込みハンドラを削除します。

ddi_intr_get_softint_pri(9F)

指定した割り込みのソフト割り込み優先順位を返します。

ddi_intr_set_softint_pri(9F)

指定したソフト割り込みの相対ソフト割り込み優先順位を変更します。

割り込み関数の例

このセクションでは、次のタスクの実行例を示します。

  • ソフト割り込み優先順位の変更

  • 割り込みの中断の確認

  • 割り込みマスクの設定

  • 割り込みマスクのクリア

使用例 17  ソフト割り込み優先順位の変更

ソフト割り込み優先順位を 9 に変更するときは、ddi_intr_set_softint_pri(9F) 関数を使用します。

if (ddi_intr_set_softint_pri(mydev->mydev_softint_hdl, 9) != DDI_SUCCESS)
    cmn_err (CE_WARN, "ddi_intr_set_softint_pri failed");
使用例 18  割り込みの中断の確認

割り込みが中断されているかどうか確認するときは、ddi_intr_get_pending(9F) 関数を使用します。

if (ddi_intr_get_pending(mydevp->htable[0], &pending) != DDI_SUCCESS)
    cmn_err(CE_WARN, "ddi_intr_get_pending() failed");
else if (pending)
    cmn_err(CE_NOTE, "ddi_intr_get_pending(): Interrupt pending");
使用例 19  割り込みマスクの設定

デバイスが割り込みを受信しないように割り込みマスクを設定するときは、ddi_intr_set_mask(9F) 関数を使用します。

if ((ddi_intr_set_mask(mydevp->htable[0]) != DDI_SUCCESS))
    cmn_err(CE_WARN, "ddi_intr_set_mask() failed");
使用例 20  割り込みマスクのクリア

割り込みマスクをクリアするときは、ddi_intr_clr_mask(9F) 関数を使用します。指定した割り込みが有効になっていない場合、 ddi_intr_clr_mask(9F) 関数は失敗します。ddi_intr_clr_mask(9F ) 関数が成功した場合、デバイスは割り込みの生成を開始します。

if (ddi_intr_clr_mask(mydevp->htable[0]) != DDI_SUCCESS)
    cmn_err(CE_WARN, "ddi_intr_clr_mask() failed");