インテルのみ表示可能 — GUID: wuz1589498866220
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: wuz1589498866220
Ixiasoft
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 に進みます。チャネルがビジーであるかディスクリプター・リングがフルの場合、スレッドは転送を再試行します。
ステップ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 を更新します。