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

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

8.1.1. アーキテクチャー

次の図は、MCDMA カスタムドライバーのソフトウェア・アーキテクチャー・ブロック図を示しています。

図 34. ブロック レベルのソフトウェア・アーキテクチャー

上記のブロック図で、点線はメモリーマップド I/O インターフェイスを表します。他の 2 行は、デバイスによってトリガーされる読み出し操作と書き込み操作を表します。

PCI Express 用のマルチチャネル DMA IP は、次のカーネルベースのモジュールをサポートして、デバイスをユーザー空間に公開します。
  • vfio-pci
  • UIO

これらのドライバーは、デバイス管理を実行せず、オペレーティング・システム (OS) に対して、デバイスがユーザー空間によって使用されていることを示し、OS がこれらのデバイスに対してアクション (デバイスのスキャンなど) を実行しないようにします。

vfio-pci

これは、カーネル配布によって提供されるセキュア カーネルモジュールです。このモジュールを使用すると、I/O メモリー管理ユニット (IOMMU) をプログラムできます。 IOMMU は、ユーザー空間ドライバーでメモリーの安全性を確保するのに役立つハードウェアです。場合によっては、Single Root I/O Virtualization (SR-IOV) を使用している場合は、vfio-pci をロードしてデバイスをバインドできます。

  • このモジュールは、IOMMU プログラミングと機能レベル リセット (FLR) を有効にします。
  • デバイスのベース・アドレス・レジスター (BAR) をユーザー空間に公開するために、vfio-pci は ioctl を有効にします。
  • MSI-X (Message Signal Interrupts extensions) 割り込みをサポートします。
  • カーネルバージョン >= 5.7 では、sysfs インターフェイスを使用した仮想機能の有効化がサポートされています。
5.7 より前のカーネルバージョンを使用している場合は、次の代替手段があります。
  • VF の有効化をサポートする ifc_uio を使用します。
  • カーネルにパッチを適用して、sysfs を使用して仮想機能を有効にします。カーネルの再構築が必要です。

ifc_uio

これは、IOMMU を使用しない vfio-pci の代替ドライバーです。

PCIe、sysfs、割り込みフレームワーク ユーティリティを使用することにより、このモジュールはユーザー空間がデバイスにアクセスできるように読み出します。

vfio-pci と同様に、このモジュールもゲスト VM からハイパーバイザー経由で使用できます。このドライバーにより、仮想機能の有効化/無効化が可能になります。仮想関数が作成されると、デフォルトで ifc_uio にバインドされます。要件に基づいて、バインドを解除して別のドライバーにバインドすることができます。

このモジュールを使用してサポートされる機能は次のとおりです。
  • sysfs インターフェイスを使用して、仮想機能の有効化/無効化を許可します。
  • チャネル BAR を調査して libmqdma にエクスポートします。
  • 割り込み通知/クリアをサポートします。

libmqdma

これは、アプリケーションが PCIe デバイスにアクセスするために使用するユーザー空間ライブラリです。
  • このライブラリーには、MCDMA IP デザインにアクセスするための API が含まれており、この API を使用してアプリケーションを開発できます。
  • チャネルの割り当て、解放、リセットの呼び出しを特徴としています。
  • libmqdma は、UIO または仮想機能 I/O (VFIO ) によってバインドされたデバイスへのアクセスをサポートしています。
libmqdma は、2 つのユーザー空間ドライバーをサポートします。
  • uio
  • vfio-pci

これらのオプションは、make ファイルから調整できます。

UIO の場合、ifc_uio ドライバーは、sysfs を使用して BAR レジスター情報を読み出し、eventfds を使用して MSI-X 情報をレジスターします。

VFIO の場合、ユーザー空間は IOCTL コマンドを使用して、BAR レジスター、MSIX 情報、および IOMMU テーブルのプログラミングを読み出します。

通常、アプリケーションが仮想化環境で実行されている場合、デバイスを vfio-pci モジュールにバインドすると、 libmqdma は ioctl を使用してデバイスにアクセスできます。現在、UIO と VFIO のサポートは、common.mk ファイルから切り替えることができます。UIO はデフォルトで有効になっています。

サンプル・アプリケーション

このアプリケーションは、libmqdma の API を使用し、次のコマンドライン引数を入力として受け取ります。
  • メッセージの合計サイズ/時間
  • ディスクリプターあたりのパケットサイズ
  • 読み出し/書き込み
  • 完了報告方法
  • チャネル数

DMA チャネルにアクセスするために複数のスレッドを実行します。また、パフォーマンス測定機能も備えています。使用しているスレッドの数と処理しているチャネルの数に基づいて、スレッドでキューがスケジュールされます。