intel OPAE FPGA Linux デバイス ドライバー アーキテクチャ
OPAE インテル FPGA Linux デバイス・ドライバーのアーキテクチャー
OPAE インテル FPGA ドライバーは、ユーザー空間アプリケーションがインテル FPGA ソリューションを搭載したプラットフォームで FPGA アクセラレーターを構成、列挙、開き、アクセスするためのインターフェイスを提供し、FPGA 再構成、電源管理、仮想化などのシステムレベルの管理機能を有効にします。
ハードウェアアーキテクチャ
OSの観点から view、FPGA ハードウェアは通常の PCIe デバイスとして表示されます。 FPGA デバイス メモリは、定義済みのデータ構造 (デバイス機能リスト) を使用して編成されます。 FPGA デバイスでサポートされる機能は、次の図に示すように、これらのデータ構造を通じて公開されます。
FPGA PCIe デバイス
ドライバーは PCIe SR-IOV をサポートして、個々のアクセラレーターを仮想マシンに割り当てるために使用できる仮想機能 (VF) を作成します。
インテルコーポレーション。 全著作権所有。 Intel、Intel ロゴ、およびその他の Intel マークは、Intel Corporation またはその子会社の商標です。 インテルは、FPGA および半導体製品のパフォーマンスをインテルの標準保証に従って最新の仕様に保証しますが、予告なしにいつでも製品およびサービスを変更する権利を留保します。 インテルは、インテルが書面で明示的に同意した場合を除き、ここに記載されている情報、製品、またはサービスの適用または使用から生じる一切の責任を負わないものとします。 インテルのお客様は、公開されている情報を信頼したり、製品やサービスを注文したりする前に、最新バージョンのデバイス仕様を入手することをお勧めします。
その他の名前およびブランドは、他者の財産として主張される場合があります。
仮想化された FPGA PCIe デバイス
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 にアクセスするすべてのソフトウェア プログラム (仮想化されたホストで実行されているものを含む) は、パーシャル リコンフィギュレーションを試みる前に閉じる必要があります。 手順は次のとおりです。
- ゲストからドライバーをアンロードする
- ゲストから VF を取り外します
- SR-IOV を無効にする
- 部分的な再構成を実行する
- SR-IOV を有効にする
- VF をゲストに接続する
- ゲストにドライバーをロードする
FPGA 仮想化
VM で実行されているアプリケーションからアクセラレーターにアクセスできるようにするには、次の手順を使用して、それぞれの AFU のポートを VF に割り当てる必要があります。
- デフォルトでは、PF はすべての AFU ポートを所有します。 VF に再割り当てする必要があるポートは、最初に FME デバイスの FPGA_FME_PORT_RELEASE ioctl を介して PF から解放する必要があります。
- N 個のポートが PF から解放されると、次のコマンドを使用して SRIOV と VF を有効にできます。 各 VF は、AFU で XNUMX つのポートのみを所有します。 echo N > PCI_DEVICE_PATH/sriov_numvfs
- VF を経由して VM に渡します。
- VF の下の AFU は、VM 内のアプリケーションからアクセスできます (VF 内の同じドライバーを使用)。
注記:
FME を VF に割り当てることはできないため、PR およびその他の管理機能は PF を介してのみ利用できます。
ドライバー組織
PCIe モジュール デバイス ドライバー
ドライバー組織
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) に設定されます。
- 構造体 build_feature_devs_info を割り当て、初期化します。
- 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 初期化フロー
- 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;
};
ポート プラットフォーム デバイスの初期化フロー
ポートの初期化フロー
- 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 デバイス ドライバー アーキテクチャ, ドライバー アーキテクチャ, アーキテクチャ |