インテルのみ表示可能 — GUID: tps1626229393676
Ixiasoft
4.1. ポートリスト
4.2. クロック
4.3. リセット
4.4. マルチ・チャネルDMA
4.5. バーストAvalon Master (BAM) インターフェイズ
4.6. バースト Avalon-MM スレーブ (BAS) インターフェイス
4.7. Config Slaveのインターフェイス (RP のみ)
4.8. ハードIPリコンフィグレーション・インターフェイス
4.9. Config TLのインターフェイス
4.10. Configuration Interceptのインターフェイス (EP のみ)
4.11. ユーザーのFunctional Level Reset (FLR)
4.12. ユーザー イベント MSI-X 要求インターフェイス
4.13. データ・ムーバー・インターフェイス
4.14. ハードIPステータス・インターフェイス
8.1.6.1. ifc_api_start
8.1.6.2. ifc_mcdma_port_by_name
8.1.6.3. ifc_qdma_device_get
8.1.6.4. ifc_num_channels_get
8.1.6.5. ifc_qdma_channel_get
8.1.6.6. ifc_qdma_acquire_channels
8.1.6.7. ifc_qdma_release_all_channels
8.1.6.8. ifc_qdma_device_put
8.1.6.9. ifc_qdma_channel_put
8.1.6.10. ifc_qdma_completion_poll
8.1.6.11. ifc_qdma_request_start
8.1.6.12. ifc_qdma_request_prepare
8.1.6.13. ifc_qdma_descq_queue_batch_load
8.1.6.14. ifc_qdma_request_submit
8.1.6.15. ifc_qdma_pio_read32
8.1.6.16. ifc_qdma_pio_write32
8.1.6.17. ifc_qdma_pio_read64
8.1.6.18. ifc_qdma_pio_write64
8.1.6.19. ifc_qdma_pio_read128
8.1.6.20. ifc_qdma_pio_write128
8.1.6.21. ifc_qdma_pio_read256
8.1.6.22. ifc_qdma_pio_write256
8.1.6.23. ifc_request_malloc
8.1.6.24. ifc_request_free
8.1.6.25. ifc_app_stop
8.1.6.26. ifc_qdma_poll_init
8.1.6.27. ifc_qdma_poll_add
8.1.6.28. ifc_qdma_poll_wait
8.1.6.29. ifc_mcdma_port_by_name
インテルのみ表示可能 — GUID: tps1626229393676
Ixiasoft
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 を介してアプリケーションに渡します。