インテル ロゴ

intel OPAE FPGA Linux デバイス ドライバー アーキテクチャ

インテル-OPAE-FPGA-Linux-デバイス-ドライバー-アーキテクチャ-製品

OPAE インテル FPGA Linux デバイス・ドライバーのアーキテクチャー

OPAE インテル FPGA ドライバーは、ユーザー空間アプリケーションがインテル FPGA ソリューションを搭載したプラットフォームで FPGA アクセラレーターを構成、列挙、開き、アクセスするためのインターフェイスを提供し、FPGA 再構成、電源管理、仮想化などのシステムレベルの管理機能を有効にします。

ハードウェアアーキテクチャ

OSの観点から view、FPGA ハードウェアは通常の PCIe デバイスとして表示されます。 FPGA デバイス メモリは、定義済みのデータ構造 (デバイス機能リスト) を使用して編成されます。 FPGA デバイスでサポートされる機能は、次の図に示すように、これらのデータ構造を通じて公開されます。

FPGA PCIe デバイス

インテル-OPAE-FPGA-Linux-デバイス-ドライバー-アーキテクチャ-図- (1)

ドライバーは PCIe SR-IOV をサポートして、個々のアクセラレーターを仮想マシンに割り当てるために使用できる仮想機能 (VF) を作成します。

インテルコーポレーション。 全著作権所有。 Intel、Intel ロゴ、およびその他の Intel マークは、Intel Corporation またはその子会社の商標です。 インテルは、FPGA および半導体製品のパフォーマンスをインテルの標準保証に従って最新の仕様に保証しますが、予告なしにいつでも製品およびサービスを変更する権利を留保します。 インテルは、インテルが書面で明示的に同意した場合を除き、ここに記載されている情報、製品、またはサービスの適用または使用から生じる一切の責任を負わないものとします。 インテルのお客様は、公開されている情報を信頼したり、製品やサービスを注文したりする前に、最新バージョンのデバイス仕様を入手することをお勧めします。

その他の名前およびブランドは、他者の財産として主張される場合があります。

仮想化された FPGA PCIe デバイス

インテル-OPAE-FPGA-Linux-デバイス-ドライバー-アーキテクチャ-図- (2)

FPGA 管理エンジン (FME)
FPGA Management Engine は、電力と熱の管理、エラー レポート、再構成、パフォーマンス レポート、およびその他のインフラストラクチャ機能を実行します。 各 FPGA には XNUMX つの FME があり、常に物理機能 (PF) を介してアクセスされます。 ユーザー空間アプリケーションは、open() を使用して FME への排他的アクセスを取得し、特権ユーザー (root) として close() を使用して解放できます。

ポート
ポートは、スタティック FPGA ファブリック (「FPGA インターフェイス マネージャー (FIM)」) と、アクセラレータ ファンクション (AF) を含む部分的に再構成可能な領域との間のインターフェイスを表します。 ポートは、ソフトウェアからアクセラレータへの通信を制御し、リセットやデバッグなどの機能を公開します。 PCIe デバイスには複数のポートがある場合があり、各ポートは、FME デバイスで FPGA_FME_PORT_ASSIGN ioctl を使用して割り当てることにより、VF を介して公開できます。

アクセラレータ ファンクション (AF) ユニット

  • アクセラレータ ファンクション (AF) ユニットはポートに接続され、アクセラレータ固有の制御レジスタに使用される 256K MMIO 領域を公開します。
  • ユーザー空間アプリケーションは、Port デバイスで open() を使用してポートに接続された AFU への排他的アクセスを取得し、close() を使用してそれを解放できます。
  • ユーザー空間アプリケーションは、mmap() アクセラレータ MMIO 領域も使用できます。

部分的な再構成
前述のように、アクセラレータ機能 (AF) の部分的な再構成によってアクセラレータを再構成できます。 file. アクセラレータ関数 (AF) は、FPGA の正確な FIM およびターゲットの静的領域 (ポート) に対して生成されている必要があります。 そうしないと、再構成操作が失敗し、システムが不安定になる可能性があります。 この互換性は、AF ヘッダーに記載されているインターフェイス ID と、sysfs を介して FME によって公開されているインターフェイス ID を比較することで確認できます。 このチェックは通常、再構成 IOCTL を呼び出す前にユーザー空間によって行われます。

注記:
現在、FPGA にアクセスするすべてのソフトウェア プログラム (仮想化されたホストで実行されているものを含む) は、パーシャル リコンフィギュレーションを試みる前に閉じる必要があります。 手順は次のとおりです。

  1. ゲストからドライバーをアンロードする
  2. ゲストから VF を取り外します
  3. SR-IOV を無効にする
  4. 部分的な再構成を実行する
  5. SR-IOV を有効にする
  6. VF をゲストに接続する
  7. ゲストにドライバーをロードする

FPGA 仮想化
VM で実行されているアプリケーションからアクセラレーターにアクセスできるようにするには、次の手順を使用して、それぞれの AFU のポートを VF に割り当てる必要があります。

  1. デフォルトでは、PF はすべての AFU ポートを所有します。 VF に再割り当てする必要があるポートは、最初に FME デバイスの FPGA_FME_PORT_RELEASE ioctl を介して PF から解放する必要があります。
  2. N 個のポートが PF から解放されると、次のコマンドを使用して SRIOV と VF を有効にできます。 各 VF は、AFU で XNUMX つのポートのみを所有します。 echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. VF を経由して VM に渡します。
  4. VF の下の AFU は、VM 内のアプリケーションからアクセスできます (VF 内の同じドライバーを使用)。

注記:
FME を VF に割り当てることはできないため、PR およびその他の管理機能は PF を介してのみ利用できます。

ドライバー組織

PCIe モジュール デバイス ドライバー

ドライバー組織

インテル-OPAE-FPGA-Linux-デバイス-ドライバー-アーキテクチャ-図- (3)

FPGA デバイスは通常の PCIe デバイスとして表示されます。 したがって、FPGA PCIe PF または VF が検出されると、FPGA PCIe デバイス ドライバー (intel-FPGA-PCI.ko) が常に最初にロードされます。 このドライバーは、ドライバー アーキテクチャでインフラストラクチャの役割を果たします。 これ:

  • フィーチャー デバイスの親として FPGA コンテナー デバイスを作成します。
  • PCIe デバイス BAR メモリに実装されているデバイス機能リストをウォークスルーして、機能デバイスとそのサブ機能を検出し、コンテナー デバイスの下にそれらのプラットフォーム デバイスを作成します。
  • SR-IOV をサポートします。
  • サブ機能の操作を抽象化し、一般的な機能を機能デバイス ドライバーに公開する、機能デバイス インフラストラクチャを導入します。

PCIe モジュール デバイス ドライバ関数

  • PCIe 検出、デバイス列挙、および機能検出が含まれます。
  • 親デバイス、FPGA Management Engine (FME)、およびポートの sysfs ディレクトリを作成します。
  • プラットフォーム ドライバー インスタンスを作成し、Linux カーネルがそれぞれのプラットフォーム モジュール ドライバーをロードするようにします。

FME プラットフォーム モジュール デバイス ドライバー

  • 電力と熱の管理、エラー報告、パフォーマンス報告、およびその他のインフラストラクチャ機能。 これらの機能には、FME ドライバーによって公開される sysfs インターフェースを介してアクセスできます。
  • 部分的な再構成。 FME ドライバーは、PR サブ機能の初期化中に FPGA マネージャーを登録します。 FPGA_FME_PORT_PR ioctl を受け取ると、FPGA Manager から共通インターフェイス関数を呼び出して、指定されたポートへのビットストリームの部分的な再構成を完了します。
  • 仮想化のためのポート管理。 FME ドライバーは、PF から特定のポートを解放する XNUMX つの ioctl、FPGA_FME_PORT_RELEASE を導入します。 FPGA_FME_PORT_ASSIGN は、ポートを PF に割り当てます。 ポートが PF から解放されると、PCIe ドライバーによって提供される SR-IOV インターフェイスを介して VF に割り当てることができます。 詳細については、「FPGA 仮想化」を参照してください。

FME プラットフォーム モジュール デバイス ドライバー関数

  • FME キャラクター デバイス ノードを作成します。
  • FME sysfs を作成します files および FME sysfs を実装します file アクセサー。
  • FME プライベート機能サブドライバーを実装します。
  • FME プライベート機能サブドライバー:
    • FME ヘッダー
    • 熱管理
    • 電源管理
    • グローバル エラー
    • 部分的な再構成
    • グローバルパフォーマンス

ポート プラットフォーム モジュール デバイス ドライバー
FME ドライバーと同様に、ポート プラットフォーム デバイスが作成されると、FPGA ポート (および AFU) ドライバー (intel-fpga-afu.ko) がプローブされます。 このモジュールの主な機能は、ポートの基本的なリセット制御、AFU MMIO 領域のエクスポート、DMA バッファ マッピング サービス、UMsg(1) 通知、リモート デバッグ機能など、個々のアクセラレータにアクセスするためのユーザー空間アプリケーション用のインターフェイスを提供することです (上記を参照)。

UMsg は、統合 FPGA を搭載したインテル Xeon® プロセッサーのアクセラレーション スタックを介してのみサポートされます。

ポート プラットフォーム モジュール デバイス ドライバー関数

  • ポート キャラクター デバイス ノードを作成します。
  • ポート sysfs を作成します files および Port sysfs を実装します file アクセサー。
  • ポート プライベート機能のサブドライバーを実装します。
  • ポート プライベート機能サブドライバー:
    • ポート ヘッダー
    • オーストラリア連邦
    • ポート エラー
    • UMsg(2)
    • シグナルタップ

アプリケーション FPGA デバイスの列挙
このセクションでは、アプリケーションが /sys/class/fpga の下の sysfs 階層から FPGA デバイスを列挙する方法を紹介します。 元ではamp以下のファイルでは、XNUMX つの Intel FPGA デバイスがホストにインストールされています。 各 FPGA デバイスには、XNUMX つの FME と XNUMX つのポート (AFU) があります。 FPGA デバイスごとに、/sys/class/fpga の下にデバイス ディレクトリが作成されます。

/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1

各ノードには、子デバイスとして XNUMX つの FME と XNUMX つのポート (AFU) があります。
/sys/class/fpga/intel-fpga-dev.0/intel-fpga-fme.0
/sys/class/fpga/intel-fpga-dev.0/intel-fpga-port.0
/sys/class/fpga/intel-fpga-dev.0/intel-fpga-port.1
/sys/class/fpga/intel-fpga-dev.1/intel-fpga-fme.1
/sys/class/fpga/intel-fpga-dev.1/intel-fpga-port.2
/sys/class/fpga/intel-fpga-dev.1/intel-fpga-port.3

一般に、FME/Port sysfs インターフェースは次のように命名されます。
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

I はすべてのコンテナ デバイスに連続して番号を付け、j は FME に連続して番号を付け、k はすべてのポートに連続して番号を付けます。

ioctl() および mmap() に使用されるデバイス ノードは、次の方法で参照できます。
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

PCIe ドライバーの列挙
このセクションはオーバーを与えますview intel-fpga-pci.ko によって実行されるデバイス列挙のコード フロー。 主なデータ構造と機能が強調表示されています。 このセクションは、次の場合に最適です。 view付属のソース コード (pcie.c) を参照してください。

列挙データ構造

列挙 fpga_id_type {
PARENT_ID、
FME_ID、
ポート_ID、
FPGA_ID_MAX
};
静的構造体 idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char * name;
dev_t 開発者;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
静的構造体クラス *fpga_class;
静的構造体 pci_device_id cci_pcie_id_tbl[] = {
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_MCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_MCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_SKX_P),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_SKX_P),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_DCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_DCP),},
{0,}
};
静的構造体 pci_driver cci_pci_driver = {
.name = DRV_NAME、
.id_table = cci_pcie_id_tbl,
.probe = cci_pci_probe、
.remove = cci_pci_remove、
.sriov_configure = cci_pci_sriov_configure
};
構造体 cci_drvdata {
int デバイス ID;
構造体デバイス *fme_dev;
struct ミューテックス ロック;
struct list_head port_dev_list;
int release_port_num;
struct list_head 領域;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int current_bar;
void __iomem *pfme_hdr;
構造体デバイス *parent_dev;
struct platform_device *feature_dev;
};

列挙フロー

  • ccidrv_init()
    • idr_init() を使用して fpga_ids を初期化します。
    • alloc_chrdev_region() を使用して fpga_chrdevs[i].devt を初期化します。
    • class_create() を使用して fpga_class を初期化します。
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • PCI デバイスを有効にし、その領域へのアクセスを要求し、PCI マスター モードを設定し、DMA を構成します。
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • 構造体 build_feature_devs_info を割り当て、初期化します。
      .parent_dev は、FME およびポート sysfs ディレクトリを含む親 sysfs ディレクトリ (intel-fpga-dev.id) に設定されます。
  • parse_feature_list()
    • BAR0 デバイス機能リストを調べて、FME、ポート、およびそれらのプライベート機能を見つけます。
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • FME が発生した場合:
  • build_info_create_dev()
    • FME にプラットフォーム デバイスを割り当て、build_feature_devs_info.feature_dev に保存します。
    • feature_dev.id は idr_alloc(fpga_ids[FME_ID],
    • feature_dev.parent は build_feature_devs_info.parent_dev に設定されます。
    • feature_dev.resource で構造体リソースの配列を割り当てます。
  • 構造体 feature_platform_data を割り当てて初期化し、ポインターを feature_dev.dev.platform_data に格納します
    • create_feature_instance() build_info_add_sub_feature()
    • feature_dev.resource[FME_FEATURE_ID_HEADER] を初期化します。
    • feature_platform_data_add()
    • feature_platform_data.features[FME_FEATURE_ID_HEADER]、.fops 以外のすべてを初期化します。
  • parse_feature() parse_feature_afus() parse_feature_port()
    • ポートが検出された場合:
  • build_info_create_dev()
    • ポートにプラットフォーム デバイスを割り当て、build_feature_devs_info.feature_dev に保存します。
    • feature_dev.id は idr_alloc(fpga_ids[PORT_ID],
    • feature_dev.parent は build_feature_devs_info.parent_dev に設定されます。
    • feature_dev.resource で構造体リソースの配列を割り当てます。
    • 構造体 feature_platform_data を割り当てて初期化し、ポインターを feature_dev.dev.platform_data に格納します
  • build_info_commit_dev()
    • ポートの構造体 feature_platform_data.node を構造体 cci_drvdata.port_dev_list のポートのリストに追加します。
  • create_feature_instance() build_info_add_sub_feature()
    • feature_dev.resource[PORT_FEATURE_ID_HEADER] を初期化します。
  • feature_platform_data_add()
    • feature_platform_data.features[PORT_FEATURE_ID_HEADER]、.fops 以外のすべてを初期化します。
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • AFU が発生した場合:
  • create_feature_instance() build_info_add_sub_feature()
    • feature_dev.resource[PORT_FEATURE_ID_UAFU] を初期化します。
  • feature_platform_data_add()
    • feature_platform_data.features[PORT_FEATURE_ID_UAFU]、.fops 以外のすべてを初期化します。
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • FME プライベート機能が検出された場合:
  • create_feature_instance() build_info_add_sub_feature()
    • feature_dev.resource[id] を初期化します。
  • feature_platform_data_add()
    • feature_platform_data.features[id]、.fops 以外のすべてを初期化します。
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • ポート プライベート機能が検出された場合: * create_feature_instance() build_info_add_sub_feature() * feature_dev.resource[id] を初期化します。 * feature_platform_data_add() feature_platform_data.features[id]、.fops 以外のすべてを初期化します。
  • parse_ports_from_fme()
    • ドライバーが Physical Function (PF) にロードされている場合は、次のようになります。
  • FME ヘッダーに記述されている各ポートで parse_feature_list() フローを実行します。
  • ヘッダーの各ポート エントリに記載されている BAR を使用します。

FME プラットフォーム デバイスの初期化
このセクションはオーバーを与えますview intel-fpga-fme.ko によって実行される FME デバイスの初期化のコード フロー。 主なデータ構造と機能が強調表示されています。 このセクションは、次の場合に最適です。 view付属のソース コード (fme-main.c) を参照してください。

FME プラットフォーム デバイスのデータ構造

構造体 feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
long (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd、unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
構造体機能 {
const char * name;
int リソースインデックス;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head ノード;
struct ミューテックス ロック;
unsigned long dev_status;
構造体 cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
ボイド *プライベート;
整数 数値;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *)); 構造体
機能機能[0];
};
struct perf_object {
整数 ID;
const structattribute_group **attr_groups;
構造体デバイス *fme_dev;
struct list_head ノード;
構造体 list_head の子;
構造体 kobject kobj;
};
構造体 fpga_fme {
u8 ポート ID;
u64 エラー;
構造体デバイス *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};

FME プラットフォーム デバイスの初期化フロー

FME 初期化フローインテル-OPAE-FPGA-Linux-デバイス-ドライバー-アーキテクチャ-図- (4)

  • fme_probe() fme_dev_init()
    • 構造体 fpga_fme を初期化し、それを feature_platform_data.private フィールドに格納します。
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • 読み込まれた機能ごとに、構造体 feature_ops を feature_platform_data.features に保存します。
    • テスト関数があれば、構造体から呼び出します。
    • 構造体から init 関数を呼び出します。
  • fme_probe() fpga_register_dev_ops()
    • FME キャラクター デバイス ノードを作成し、構造体を登録します。 file_オペレーション。

ポート プラットフォーム デバイスの初期化
このセクションはオーバーを与えますview intel-fpga-afu.ko によって実行されるポート デバイスの初期化のコード フロー。 主なデータ構造と機能が強調表示されています。 このセクションは、次の場合に最適です。 view付属のソース コード (afu.c) を参照してください。

ポート プラットフォーム デバイスのデータ構造

構造体 feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
long (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd、unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
構造体機能 {
const char * name;
int リソースインデックス;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head ノード;
struct ミューテックス ロック;
unsigned long dev_status;
構造体 cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
ボイド *プライベート;
整数 数値;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *));
構造体機能機能 [0];
};
struct fpga_afu_region {
u32 インデックス;
u32 フラグ;
u64サイズ;
u64 オフセット;
u64物理;
struct list_head ノード;
};
構造体 fpga_afu_dma_region {
u64 ユーザーアドレス;
u64 長さ;
u64 iova;
構造体ページ **ページ;
struct rb_node ノード;
bool in_use;
};
構造体 fpga_afu {
u64 領域_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head 領域;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};

ポート プラットフォーム デバイスの初期化フロー

ポートの初期化フローインテル-OPAE-FPGA-Linux-デバイス-ドライバー-アーキテクチャ-図- (5)

  • afu_probe() afu_dev_init()
    • 構造体 fpga_afu を初期化し、それを feature_platform_data.private フィールドに格納します。
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • 読み込まれた機能ごとに、構造体 feature_ops を feature_platform_data.features に保存します。
    • テスト関数があれば、構造体から呼び出します。
    • 構造体から init 関数を呼び出します。
  • afu_probe() fpga_register_dev_ops()
    • ポート キャラクター デバイス ノードを作成し、構造体を登録します。 file_オペレーション。

FME IOCTL
オープン時に呼び出される IOCTL file /dev/intel-fpga-fme.j FPGA_GET_API_VERSION の記述子 — 現在のバージョンを 0 から始まる整数として返します。

FPGA_CHECK_EXTENSION—現在サポートされていません。

FPGA_FME_PORT_RELEASE—arg は次へのポインタです。

struct fpga_fme_port_release {
__u32 argsz; // 内: sizeof(struct fpga_fme_port_release)
__u32 フラグ; // in: 0 でなければなりません
__u32 ポート ID; // in: 解放するポート ID (0 から)。
};

FPGA_FME_PORT_ASSIGN—arg は次へのポインタです。

struct fpga_fme_port_assign {
__u32 argsz; // 内: sizeof(struct fpga_fme_port_assign)
__u32 フラグ; // in: 0 でなければなりません
__u32 ポート ID; // in: 割り当てるポート ID (0 から)。 (されている必要があります
FPGA_FME_PORT_RELEASE によって以前にリリースされた)
};

FPGA_FME_PORT_PR—arg は次へのポインタです。

struct fpga_fme_port_pr {
__u32 argsz; // 内: sizeof(struct fpga_fme_port_pr)
__u32 フラグ; // in: 0 でなければなりません
__u32 ポート ID; // in: ポート ID (0 から)
__u32 バッファサイズ; // in: ビットストリーム バッファのサイズ (バイト単位)。 4 バイトでなければなりません
整列しました。
__u64 buffer_address; // in: ビットストリーム バッファのプロセス アドレス
__u64 ステータス; // out: エラーステータス (ビットマスク)
};

ポート IOCTL
オープン時に呼び出される IOCTL file /dev/intel-fpga-port.k の記述子 FPGA_GET_API_VERSION — 現在のバージョンを 0 から始まる整数として返します。 FPGA_CHECK_EXTENSION — 現在サポートされていません。

FPGA_PORT_GET_INFO—arg は次へのポインタです。

struct fpga_port_info {
__u32 argsz; // 内: sizeof(struct fpga_port_info)
__u32 フラグ; // 出力: 0 を返します
__u32 num_regions; // out: MMIO 領域の数、2 (AFU に 1、AFU に 1)
STP)
__u32 num_umsgs; // out: ハードウェアがサポートする UMsg の数
};

FPGA_PORT_GET_REGION_INFO—arg は次へのポインタです。

struct fpga_port_region_info {
__u32 argsz; // 内: sizeof(struct fpga_port_region_info)
__u32 フラグ; // out: (ビットマスク) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 インデックス; // in: FPGA_PORT_INDEX_UAFU または FPGA_PORT_INDEX_STP
__u32 パディング; // in: 0 でなければなりません
__u64 サイズ; // out: MMIO 領域のサイズ (バイト単位)
__u64 オフセット; // out: デバイス fd の先頭からの MMIO 領域のオフセット
};

FPGA_PORT_DMA_MAP—arg は次へのポインタです。
struct fpga_port_dma_map {
__u32 argsz; // 内: sizeof(struct fpga_port_dma_map)
__u32 フラグ; // in: 0 でなければなりません __u64 user_addr; // in: プロセス仮想
住所。 ページを揃える必要があります。
__u64 長さ; // in: マッピングの長さ (バイト単位)。 ページの倍数である必要があります
サイズ。
__u64 iova; // out: IO 仮想アドレス };

FPGA_PORT_DMA_UNMAP—arg は次へのポインタです。
struct fpga_port_dma_unmap {
__u32 argsz; // 内: sizeof(struct fpga_port_dma_unmap)
__u32 フラグ; // in: 0 でなければなりません
__u64 iova; // in: 前の関数によって返された IO 仮想アドレス
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—arg は NULL でなければなりません。
  • FPGA_PORT_UMSG_ENABLE—arg は NULL でなければなりません。
  • FPGA_PORT_UMSG_DISABLE—args は NULL でなければなりません。

FPGA_PORT_UMSG_SET_MODE—arg は次へのポインタです。

struct fpga_port_umsg_cfg {
__u32 argsz; // 内: sizeof(struct fpga_port_umsg_cfg)
__u32 フラグ; // in: 0 でなければなりません
__u32 ヒント_ビットマップ; // in: UMsg ヒント モード ビットマップ。 どの UMsg かを示します
有効になりました。
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • この ioctl を発行する前に、UMsg を無効にする必要があります。
  • iova フィールドは、すべての UMsg (num_umsgs * PAGE_SIZE) に対して十分な大きさのバッファー用でなければなりません。
    • バッファーは、ドライバーのバッファー管理によって「使用中」としてマークされます。
    • iova が NULL の場合、以前のリージョンは「使用中」としてマークされていません。
  • arg は次へのポインタです。
    struct fpga_port_umsg_base_addr {
    • u32 argsz; // 内: sizeof(struct fpga_port_umsg_base_addr)
    • u32 フラグ; // in: 0 でなければなりません
    • u64 iova; // in: FPGA_PORT_DMA_MAP からの IO 仮想アドレス。 };

注記:

  • ポート エラーをクリアするには、現在のエラーの正確なビットマスクを書き込む必要があります。ample, cat エラー > クリア
  • UMsg は、FPGA が統合された Intel Xeon プロセッサのアクセラレーション スタックでのみサポートされます。

sysfs Files

FME ヘッダー sysfs files
インテル-fpga-dev.i/インテル-fpga-fme.j/

sysfs file mmio フィールド タイプ アクセス
ポート番号 fme_header.capability.num_ports XNUMX 進整数 読み取り専用
キャッシュサイズ fme_header.capability.cache_size XNUMX 進整数 読み取り専用
バージョン fme_header.capability.fabric_verid XNUMX 進整数 読み取り専用
ソケットID fme_header.capability.socket_id XNUMX 進整数 読み取り専用
ビットストリームID fme_header.bitstream_id 64 進 uintXNUMX_t 読み取り専用
ビットストリーム_メタデータ fme_header.bitstream_md 64 進 uintXNUMX_t 読み取り専用

FME 熱管理 sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file mmio フィールド タイプ アクセス
閾値1 Thermal.threshold.tmp_thshold1 XNUMX 進整数 ユーザー: 読み取り専用 ルート: 読み書き可能
閾値2 Thermal.threshold.tmp_thshold2 XNUMX 進整数 ユーザー: 読み取り専用 ルート: 読み書き可能
しきい値トリップ Thermal.threshold.therm_trip_thshold XNUMX 進整数 読み取り専用
しきい値1_到達 Thermal.threshold.thshold1_status XNUMX 進整数 読み取り専用
しきい値2_到達 Thermal.threshold.thshold2_status XNUMX 進整数 読み取り専用
しきい値1_ポリシー 熱の。 しきい値.thshold_policy XNUMX 進整数 ユーザー: 読み取り専用 ルート: 読み書き可能
温度 Thermal.rdsensor_fm1.fpga_temp XNUMX 進整数 読み取り専用

FME 電源管理 sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

sysfs file mmio フィールド タイプ アクセス
消費された power.status.pwr_consumed 64 進 uintXNUMX_t 読み取り専用
閾値1 電力.しきい値.しきい値1 64 進 uintXNUMX_t ユーザー: 読み取り専用 ルート: 読み書き可能
閾値2 電力.しきい値.しきい値2 64 進 uintXNUMX_t ユーザー: 読み取り専用 ルート: 読み書き可能
しきい値1_ステータス power.threshold.threshold1_status XNUMX 進符号なし 読み取り専用
しきい値2_ステータス power.threshold.threshold2_status XNUMX 進符号なし 読み取り専用
rtl power.status.fpga_latency_report XNUMX 進符号なし 読み取り専用

FME グローバル エラー sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/

sysfs file mmio フィールド タイプ アクセス
pcie0_errors gerror.pcie0_err 64 進 uintXNUMX_t 読み書き
pcie1_errors gerror.pcie1_err 64 進 uintXNUMX_t 読み書き
注入_エラー gerror.ras_error_inj 64 進 uintXNUMX_t 読み書き

intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/

sysfs file mmio フィールド タイプ アクセス
エラー gerror.fme_err 64 進 uintXNUMX_t 読み取り専用
最初のエラー gerror.fme_first_err.err_reg_status 64 進 uintXNUMX_t 読み取り専用
next_error gerror.fme_next_err.err_reg_status 64 進 uintXNUMX_t 読み取り専用
クリア エラーをクリアします、first_error、next_error さまざまな uint64_t 書き込み専用

注記:
FME エラーをクリアするには、現在のエラーの正確なビットマスクを書き込む必要があります。ample cat エラー > クリア。

FME パーシャル リコンフィギュレーション sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file mmio フィールド タイプ アクセス
インターフェースID pr.fme_pr_intfc_id0_h、pr.fme_pre_intfc_id0_l 16 進 XNUMX バイト 読み取り専用

FME グローバル パフォーマンス sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/クロック

sysfs file mmio フィールド タイプ アクセス
クロック gperf.clk.afu_interf_lock 64 進 uintXNUMX_t 読み取り専用

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (FPGA を搭載した Intel Xeon CPU のアクセラレーション スタックには無効)

sysfs file mmio フィールド タイプ アクセス
凍結する gperf.ch_ctl.freeze XNUMX 進整数 読み書き
読み取りヒット gperf.CACHE_RD_HIT 64 進 uintXNUMX_t 読み取り専用
読み逃した gperf.CACHE_RD_MISS 64 進 uintXNUMX_t 読み取り専用
書き込みヒット gperf.CACHE_WR_HIT 64 進 uintXNUMX_t 読み取り専用
書き込みミス gperf.CACHE_WR_MISS 64 進 uintXNUMX_t 読み取り専用
ホールドリクエスト gperf.CACHE_HOLD_REQ 64 進 uintXNUMX_t 読み取り専用
tx_req_stall gperf.CACHE_TX_REQ_STALL 64 進 uintXNUMX_t 読み取り専用
sysfs file mmio フィールド タイプ アクセス
rx_req_stall gperf.CACHE_RX_REQ_STALL 64 進 uintXNUMX_t 読み取り専用
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN 64 進 uintXNUMX_t 読み取り専用
tag_write_port_競合 gperf.CACHE_TAG_WR_PORT_CONTEN 64 進 uintXNUMX_t 読み取り専用

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (FPGA を搭載した Intel Xeon CPU のアクセラレーション スタックには無効)

sysfs file mmio フィールド タイプ アクセス
凍結する gperf.vtd_ctl.freeze XNUMX 進整数 ユーザー: 読み取り専用 ルート: 読み書き可能

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (FPGA を搭載した Intel Xeon CPU のアクセラレーション スタックには無効)

sysfs file mmio フィールド タイプ アクセス
読み取りトランザクション gperf.VTD_AFU0_MEM_RD_TRANS 64 進 uintXNUMX_t 読み取り専用
write_transaction gperf.VTD_AFU0_MEM_WR_TRANS 64 進 uintXNUMX_t 読み取り専用
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT 64 進 uintXNUMX_t 読み取り専用
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT 64 進 uintXNUMX_t 読み取り専用

intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/

sysfs file mmio フィールド タイプ アクセス
有効にする gperf.fab_ctl.(有効) XNUMX 進整数 ユーザー: 読み取り専用 ルート: 読み書き可能
凍結する gperf.fab_ctl.freeze XNUMX 進整数 ユーザー: 読み取り専用 ルート: 読み書き可能
pcie0_read gperf.FAB_PCIE0_RD 64 進 uintXNUMX_t 読み取り専用
pcie0_write gperf.FAB_PCIE0_WR 64 進 uintXNUMX_t 読み取り専用
pcie1_read gperf.FAB_PCIE1_RD 64 進 uintXNUMX_t 読み取り専用
pcie1_write gperf.FAB_PCIE1_WR 64 進 uintXNUMX_t 読み取り専用
upi_read gperf.FAB_UPI_RD 64 進 uintXNUMX_t 読み取り専用
upi_write gperf.FAB_UPI_WR 64 進 uintXNUMX_t 読み取り専用

intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/

sysfs file mmio フィールド タイプ アクセス
pcie0_read gperf.FAB_PCIE0_RD 64 進 uintXNUMX_t 読み取り専用
pcie0_write gperf.FAB_PCIE0_WR 64 進 uintXNUMX_t 読み取り専用
pcie1_read gperf.FAB_PCIE1_RD 64 進 uintXNUMX_t 読み取り専用
pcie1_write gperf.FAB_PCIE1_WR 64 進 uintXNUMX_t 読み取り専用
upi_read gperf.FAB_UPI_RD 64 進 uintXNUMX_t 読み取り専用
upi_write gperf.FAB_UPI_WR 64 進 uintXNUMX_t 読み取り専用

ポート ヘッダー sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file mmio フィールド タイプ アクセス
id port_header.capability.port_number XNUMX 進整数 読み取り専用
ltr port_header.control.latency_tolerance XNUMX 進整数 読み取り専用

ポート AFU ヘッダー sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file mmio フィールド タイプ アクセス
afu_id afu_header.guid 16 進 XNUMX バイト 読み取り専用

ポート エラー sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/

sysfs file mmio フィールド タイプ アクセス
エラー エラー.ポートエラー 64 進 uintXNUMX_t 読み取り専用
最初のエラー perror.port_first_error 64 進 uintXNUMX_t 読み取り専用
first_malformed_req エラー.不正な要求 16 進 XNUMX バイト 読み取り専用
クリア perror.(すべてのエラー) さまざまな uint64_t 書き込み専用

注記:
ポート エラーをクリアするには、現在のエラーの正確なビットマスクを書き込む必要があります。ample cat エラー > クリア。

改訂履歴

ドキュメントバージョン 変更点
2017.10.02 初回リリース。

OPAE インテル FPGA Linux デバイス・ドライバー・アーキテクチャー・ガイド

ドキュメント / リソース

intel OPAE FPGA Linux デバイス ドライバー アーキテクチャ [pdf] ユーザーガイド
OPAE FPGA Linux デバイス ドライバー アーキテクチャ, OPAE FPGA, Linux デバイス ドライバー アーキテクチャ, ドライバー アーキテクチャ, アーキ​​テクチャ

参考文献

コメントを残す

あなたのメールアドレスは公開されません。 必須項目はマークされています *