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

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

8.1.4. デザインのソフトウェア・フロー

図 35. マルチチャネル DMA IP for PCI Express ソフトウェアの操作フロー

ステップ1

  • アプリケーションは、チャネルの必要なポートに基づいてスレッドを作成します。
  • スレッドを生成した後、スレッドは使用可能なチャネルのポートを取得しようとします。すべてのチャネル ポートがビジー状態の場合、スレッドはポーリング・モードで待機します。
  • スレッドのコンテキストでは、libqdma はホストにディスクリプター・バッファー・メモリーを割り当てます。
  • libqdma は、キューに関連付けられた QCSR の次のレジスターを初期化します。これには、ディスクリプターの開始アドレス、キュー サイズ、Consumed Head のライトバック・アドレス、D2H ディスクリプターのペイロードサイズが含まれます。次に、チャネルを有効にします。
QCSR レジスター:
  • Q_RESET (offset 8’h48)
  • Q_TAIL_POINTER (offset 8’h14) Set 0
  • Q_START_ADDR_L (Offset 8’h08)
  • Q_START_ADDR_H (Offset 8’h0C)
  • Q_SIZE (Offset 8’h10)
  • Q_CONSUMED_HEAD_ADDR_L (Offset 8’h20)
  • Q_CONSUMED_HEAD_ADDR_H (Offset 8’h24)
  • Q_BATCH_DELAY (Offset 8’h28)
  • Set q_en, q_wb/intr_en bits Q_CTRL (Offset 8’h00)
  • (Q_PYLD_COUNT) (Offset 8'h44)
GCSR レジスター:
  • WB_INTR_DELAY (Offset 8’h08)

ステップ2

  • スレッドは継続的にデータの送受信を試行し、ライブラリはチャネルがビジーかどうか、またはディスクリプター・リングがいっぱいかどうかをチェックし続けます。
  • チャネルがビジーではなく、ディスクリプター・リングがフルでない場合は、ステップ 3 に進みます。チャネルがビジーであるかディスクリプター・リングがフルの場合、スレッドは転送を再試行します。
ディスクリプター・リングがいっぱいであることは、Consumed Head および Tail ポインタ レジスターをチェックすることによって識別されます。

ステップ3

新しいディスクリプターのスレッド要求を送信して要求を送信し、必要なフィールド (ディスクリプター・インデックス、SOF、EOF、ペイロード、MSI-X 有効化、ライトバック有効化) を更新します。

ステップ4

ディスクリプター・リング・バッファーを初期化した後、libqdma はディスクリプター更新の数を QCSR 領域のテールレジスターに書き込みます。ディスクリプターが更新されるたびに、テールポインターが 1 ずつ増加します。

QCSR tail pointer register: Q_TAIL_POINTER (Offset 8’h14)

ステップ5

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

ステップ6

ディスクリプターの処理が完了すると、IP は各ディスクリプターで有効にできる次のメソッドに基づいて完了ステータスを通知します。
  • いずれかのMSI-X Interruptに基づく : PCI Express 用のマルチチャネル DMA IP は、Q_CTRL で有効になっている場合、MSI-X 割り込みをホストに送信します。
  • ライトバック: Q_CTRL でライトバックが有効になっている場合、PCI Express IP のマルチチャネル DMA は Q_CONSUMED_HEAD_ADDR_L/H を更新します。