PCI Expressのマルチチャネル DMA インテル® FPGA IPユーザー ガイド

ID 683821
日付 4/20/2022
Public
ドキュメント目次

8.3.5. ソフトウェア・フロー

図 46. カーネルモードのドライバー・ソフトウェア・フロー

ステップ1

  • アプリケーションはLibmcmem ライブラリを初期化し、ライブラリ API を使用して DMA メモリーを受け取ります。
  • libmcmem は、初期化の一部として巨大なページを割り当て、それらを小さなチャンクに設定します。これらのチャンクは、要求に従ってアプリケーションに割り当てられます。

ステップ2

  • キャラクター・デバイスを介したチャネルのアプリケーション要求。カーネル・モジュール・ドライバーは要求を受信し、使用可能なチャネルを割り当てます。すべてのチャネルがビジーの場合、リクエストは処理されません。
  • 初期化の一部としてのアプリケーションは、制御メッセージを使用して、カーネルドライバーに eventfds、ディスクリプターごとのペイロードサイズ、およびファイルサイズ (オプション) も提供します。
  • eventfds は、DMA 要求の完了に関してアプリケーションに通知するためにドライバーによって使用されます。
  • カーネルドライバーは、チャネル初期化の一部として、ディスクリプターの開始アドレス、キュー サイズ、消費されたヘッドのライト・バック・アドレス、D2H ディスクリプターのペイロードサイズを含む次のレジスターを初期化します。
  • QCSR レジスター:
    • Q_RESET (オフセット 8'h48)
    • Q_TAIL_POINTER (オフセット 8'h14) セット 0
    • Q_START_ADDR_L (オフセット 8'h08)
    • Q_START_ADDR_H (オフセット 8'h0C)
    • Q_SIZE (オフセット 8'h10)
    • Q_CONSUMED_HEAD_ADDR_L (オフセット 8'h20)
    • Q_CONSUMED_HEAD_ADDR_H (オフセット 8'h24)
    • Q_BATCH_DELAY (オフセット 8'h28)
    • q_en、q_wb/intr_en ビット、Q_CTRL を設定 (オフセット 8'h00)
    • (Q_PYLD_COUNT) (オフセット 8'h44)
  • GCSR レジスター:
    • WB_INTR_DELAY (オフセット 8'h08)
  • また、MSIX シグナルを処理するための割り込みハンドラー、完了イベントをアプリケーションに転送するための eventfds もセットアップします。
  • アプリケーションは、読み出し/書き込み API を介してドライバーに DMA 転送要求を送信します。

ステップ3

  • ハードウェアは、リクエストを送信するためのリクエストディスクリプターをサポートしています。カーネルモジュールは、リクエスト送信用のディスクリプターのリングを管理します。
  • アプリケーションから受信した各リクエストはディスクリプターに変換され、ディスクリプター・リングにプッシュされます
  • ディスクリプターには、ステップ 1 で割り当てられた DMA バッファーの開始物理アドレスが含まれます。
  • チャネルがビジーではなく、ディスクリプター・リングがいっぱいでない場合は、ステップ 3 に進みます。
  • チャネルがビジーであるか、ディスクリプター・リングがいっぱいの場合、スレッドは転送の開始を再試行します。

ステップ4

  • ディスクリプターの送信は、FPGA ロジックのテールポインター FIFO の更新によって行われます。
  • QCSR テールポインター レジスター Q_TAIL_POINTER (オフセット 8'h14) が 1 更新されます。

ステップ5

  • テールポインターの書き込みが発生すると、QDMA IP はプログラムされた Q_START_ADDR_L/H アドレスからホストメモリーからディスクリプターをフェッチします。
  • QDMA IPはディスクリプターの内容を解析して、ソース、デスティネーション・アドレス、およびディスクリプターからのデータの長さを見つけ、DMA 操作を開始します。

ステップ6

  • ディスクリプターの処理が完了すると、IP は以下の方法で完了ステータスを通知します。
  • 以下は、各ディスクリプターで有効にできる完了ステータス表示の 2 つの異なる方法です。
    • MSI-X 割り込みに基づくいずれか: Q_CTRL で有効になっている場合、QDMA IP は MSI-X 割り込みをホストに送信します。
    • Writeback: Q_CTRL でライトバックが有効になっている場合、QDMA IP は Q_CONSUMED_HEAD_ADDR_L/H を更新します。

ステップ7

  • MSI-X 割り込みの場合、カーネルドライバーの割り込みハンドラーがシグナルを処理し、完了した要求のカウントを eventfds 経由でアプリケーションに渡します。
  • Writeback の場合、アプリケーションはキャラクター・デバイスをポーリングして、完了した要求を確認します。ドライバーは、完了した要求の数を eventfds を介してアプリケーションに渡します。