次の方法で共有


パケットベース バス マスター DMA

通常、ディスプレイ ドライバーは、ミニポート ドライバーに転送要求を送信することによって DMA 操作を開始します。 パケット ベースの DMA 操作をサポートするミニポート ドライバーは、このような要求を受信すると、最初にデータ転送に関係するバッファーをロックします。 次に、ミニポート ドライバーは、ビデオ ポート ドライバーの VideoPortStartDma 関数を呼び出すことによって転送を開始します。この関数は、ミニポート ドライバーの HwVidExecuteDma コールバック ルーチンを呼び出してデータ転送を実行します。 この DMA 操作は非同期的に処理されます。 VideoPortStartDma は、ミニポート ドライバーに制御を返す前に、DMA 操作が完了することを待ちません。

転送要求のサイズとアダプターに割り当てられているシステム リソースの数によっては、ドライバーが1回の DMA 操作ですべてのデータを転送できない場合があります。 ミニポート ドライバーは、転送するデータが増えているかどうかを調べるために、実際に返される転送サイズを調べる必要があります。 DMA ハードウェアが現在の転送を完了するとすぐに、ミニポート ドライバーは、ビデオ ポート ドライバーの VideoPortCompleteDma 関数を呼び出して、現在の DMA 操作を完了する必要があります。 転送メインデータが残っている場合、ミニポート ドライバーは、ビデオ ポート ドライバーのVideoPortStartDma関数と VideoPortCompleteDma関数を呼び出すプロセスを繰り返し、データが転送されるまでメインします。 すべてのデータが転送されると、ミニポート ドライバーは、バッファーのロックを解除する必要があります。

ミニポート ドライバーは、パケットベースDMAを使用するために、以下の一連の操作を実行します。

  1. ハードウェア機能をシステムに報告し、アダプター オブジェクトを取得します。

    ミニポート ドライバーは、ビデオ ポート ドライバーの VideoPortGetDmaAdapter 関数を呼び出します。この関数は、VP_DMA_ADAPTER構造体へのポインターを返します。 これは通常、初期化時に、ミニポート ドライバーの HwVidFindAdapter ルーチン内で行われます。 ミニポート ドライバーは、後続の DMA 操作にこのポインターを使用します。

  2. ホスト メモリをロックします。

    ミニポート ドライバーは、ビデオ ポート ドライバーの VideoPortLockBuffer 関数を呼び出します。この関数はバッファーをプローブし、それらのメモリ ページを常駐させ、ロックします。

  3. DNA転送を開始します。

    ミニポート ドライバーは、ビデオ ポート ドライバーの VideoPortStartDma関数を呼び出します。この関数は、ホスト プロセッサのメモリ キャッシュをフラッシュし、散布図/収集リストを構築し、ミニポート ドライバーのHwVidExecuteDmaコールバック ルーチンを呼び出して DMA 操作を非同期的に実行します。 VideoPortStartDma は、DMA 操作の完了を待たずにミニポート ドライバーにコントロールを返します。

  4. DMA 転送を完了します。

    ミニポート ドライバーは、ハードウェアが DMA 操作を完了するとすぐに、ビデオ ポート ドライバーの VideoPortCompleteDma 関数を呼び出す必要があります。 多くのビデオ アダプターは、DMA 操作が完了すると割り込みを生成します。 たとえば、この種類のアダプターを持つシステムは、次のように割り込みに反応する可能性があります。 DMA 操作が完了したことをミニポート ドライバーに通知する割り込みをハードウェアが生成すると、ミニポート ドライバーの割り込みサービス ルーチン (ISR) は、ビデオ ポート ドライバーの VideoPortQueueDpc 関数を呼び出して、ビデオ ポート ドライバーの VideoPortCompleteDma 関数を呼び出す DPC ルーチンをキューに入れます。 このビデオ ポート ドライバー関数は IRQL DISPATCH_LEVEL以下で呼び出す必要があるため、ISR は VideoPortCompleteDmaを直接呼び出すことができません。

    VideoPortCompleteDma は、バス マスター アダプターの内部キャッシュでメインデータをフラッシュし、未使用のリソース( VideoPortStartDmaによって構築された散布図/収集リストを含む) を解放します。

    データの一部のみが転送された場合 (使用可能なマップ レジスタの数に制限があるため)、ミニポート ドライバーは、すべてのデータが転送されるまでVideoPortStartDmaおよびVideoPortCompleteDmaを繰り返し呼び出す必要があります。

  5. ホスト メモリのロックを解除します。

    すべてのデータが転送されると、ミニポート ドライバーは、ビデオ ポート ドライバーの VideoPortUnlockBuffer 関数を呼び出して、2 番目の手順で取得したデータ バッファーのロックを解除する必要があります。

  6. アダプター オブジェクトを破棄します。

    この手順は必須ではありません。 ミニポート ドライバーは、何らかの理由でその有効期間の残りの期間にそれ以上 DMA 操作がないと判断した場合は、ビデオ ポート ドライバーの VideoPortPutDmaAdapter 関数を呼び出すことによって DMA アダプター オブジェクトを破棄する必要があります。