英特爾標誌

英特爾 OPAE FPGA Linux 裝置驅動程式架構

intel-OPAE-FPGA-Linux-裝置驅動程式-架構-產品

OPAE Intel FPGA Linux 裝置驅動程式架構

OPAE Intel FPGA 驅動程式為用戶空間應用程式提供接口,用於在配備Intel FPGA 解決方案的平台上配置、枚舉、開啟和存取FPGA 加速器,並支援FPGA 重新配置、電源管理和虛擬化等系統級管理功能。

硬體架構

從作業系統的角度來看 view,FPGA 硬體顯示為常規 PCIe 設備。 FPGA 設備記憶體使用預先定義的資料結構(設備功能清單)進行組織。 FPGA裝置支援的特性透過這些資料結構暴露出來,如下圖所示:

FPGA PCIe 設備

intel-OPAE-FPGA-Linux-裝置驅動程式-架構-圖- (1)

此驅動程式支援 PCIe SR-IOV 建立虛擬功能 (VF),可用於將個別加速器指派給虛擬機器。

英特爾公司。 版權所有。 英特爾、英特爾標識和其他英特爾標誌是英特爾公司或其子公司的商標。 英特爾根據英特爾的標准保證保證其 FPGA 和半導體產品的性能符合當前規格,但保留隨時更改任何產品和服務的權利,恕不另行通知。 除非英特爾明確書面同意,否則英特爾不承擔因應用或使用此處描述的任何信息、產品或服務而產生的任何責任或義務。 建議英特爾客戶在依賴任何已發布的信息以及下訂單購買產品或服務之前獲取最新版本的設備規格。

其他名稱和品牌可能被聲稱為其他人的財產。

虛擬化 FPGA PCIe 設備

intel-OPAE-FPGA-Linux-裝置驅動程式-架構-圖- (2)

FPGA 管理引擎 (FME)
FPGA 管理引擎執行電源和熱管理、錯誤報告、重新配置、效能報告和其他基礎設施功能。每個 FPGA 都有一個 FME,始終透過實體功能 (PF) 存取。使用者空間應用程式可以使用 open() 來取得對 FME 的獨佔存取權限,並以特權使用者 (root) 的身份使用 close() 釋放它。

港口
連接埠代表靜態 FPGA 結構(「FPGA 介面管理器 (FIM)」)和包含加速器功能 (AF) 的部分可重配置區域之間的介面。此連接埠控制從軟體到加速器的通信,並提供重置和調試等功能。 PCIe 設備可能有多個端口,每個端口都可以透過 VF 公開,方法是使用 FME 設備上的 FPGA_FME_PORT_ASSIGN ioctl 對其進行分配。

加速器功能 (AF) 單元

  • 加速器功能 (AF) 單元連接到連接埠並公開 256K MMIO 區域,用於加速器特定的控制暫存器。
  • 使用者空間應用程式可以透過在連接埠裝置上使用 open() 來取得連接到連接埠的 AFU 的獨佔存取權,並使用 close() 來釋放它。
  • 用戶空間應用程式還可以 mmap() 加速 MMIO 區域。

部分重配置
如上所述,可以透過加速器功能(AF)的部分重新配置來重新配置加速器 file。必須為 FPGA 的精確 FIM 和目標靜態區域(連接埠)產生加速器功能 (AF);否則,重新配置操作將會失敗,並可能導致系統不穩定。可以透過將 AF 標頭中記錄的介面 ID 與 FME 透過 sysfs 公開的介面 ID 進行比較來檢查此相容性。此檢查通常由使用者空間在呼叫重新配置 IOCTL 之前完成。

筆記:
目前,任何存取 FPGA 的軟體程式(包括在虛擬化主機中執行的軟體程式)都必須在嘗試部分重新配置之前關閉。步驟是:

  1. 從 guest 卸載驅動程式
  2. 從訪客上拔下 VF 插頭
  3. 禁用 SR-IOV
  4. 執行部分重新配置
  5. 啟用 SR-IOV
  6. 將 VF 插入訪客
  7. 在來賓中載入驅動程式

FPGA虛擬化
若要允許從虛擬機器中執行的應用程式存取加速器,需要使用下列步驟將對應 AFU 的連接埠指派給 VF:

  1. 預設情況下,PF 擁有所有 AFU 連接埠。任何需要重新分配給 VF 的連接埠必須先透過 FME 設備上的 FPGA_FME_PORT_RELEASE ioctl 從 PF 釋放。
  2. 一旦 N 連接埠從 PF 釋放,以下命令可用於啟用 SRIOV 和 VF。每個VF僅擁有一個具有AFU的連接埠。回顯 N > PCI_DEVICE_PATH/sriov_numvfs
  3. 透過 VF 到 VM。
  4. VF 下的 AFU 可從 VM 中的應用程式存取(使用 VF 內的相同驅動程式)。

筆記:
FME 無法指派給 VF,因此 PR 和其他管理功能只能透過 PF 實現。

司機組織

PCIe 模組裝置驅動程式

司機組織

intel-OPAE-FPGA-Linux-裝置驅動程式-架構-圖- (3)

FPGA 設備顯示為常規 PCIe 設備;因此,一旦偵測到 FPGA PCIe PF 或 VF,總是先載入 FPGA PCIe 裝置驅動程式 (intel-FPGA-PCI.ko)。此驅動程式在驅動程式體系結構中扮演基礎設施的角色。它:

  • 建立 FPGA 容器設備作為功能設備的父級。
  • 遍歷在 PCIe 裝置 BAR 記憶體中實現的裝置功能列表,以發現功能裝置及其子功能,並在容器裝置下為它們建立平台裝置。
  • 支援SR-IOV。
  • 引入功能設備基礎設施,它抽象化了子功能的操作並將公共功能公開給功能設備驅動程式。

PCIe 模組裝置驅動程式函數

  • 包含 PCIe 發現、裝置枚舉和功能發現。
  • 為父設備、FPGA 管理引擎 (FME) 和連接埠建立 sysfs 目錄。
  • 建立平台驅動程式實例,使 Linux 核心載入各自的平台模組驅動程式。

FME平台模組設備驅動程式

  • 電源和熱管理、錯誤報告、效能報告和其他基礎設施功能。您可以透過 FME 驅動程式公開的 sysfs 介面存取這些函數。
  • 部分重新配置。 FME驅動程式在PR子功能初始化期間註冊FPGA管理器;一旦它收到您發送的 FPGA_FME_PORT_PR ioctl,它就會呼叫 FPGA Manager 中的通用介面函數來完成位​​元流到給定連接埠的部分重新配置。
  • 虛擬化的連接埠管理。 FME驅動程式引入了兩個ioctl,FPGA_FME_PORT_RELEASE,它從PF中釋放給定的連接埠; FPGA_FME_PORT_ASSIGN,將連接埠分配回 PF。一旦Port從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 的英特爾至強® 處理器的加速堆疊支援。

連接埠平台模組設備驅動程式功能

  • 建立連接埠字元設備節點。
  • 建立連接埠 sysfs files 並實作連接埠 sysfs file 訪問器。
  • 實作連接埠私有功能子驅動程式。
  • 埠私有功能子驅動:
    • 連接埠標頭
    • 阿福
    • 連接埠錯誤
    • UMsg(2)
    • 訊號接頭

應用程式 FPGA 設備枚舉
本節介紹應用程式如何從 /sys/class/fpga 下的 sysfs 層次結構列舉 FPGA 設備。在前amp如下圖所示,主機中安裝了兩台 Intel FPGA 設備。每個 FPGA 裝置都有一個 FME 和兩個連接埠 (AFU)。對於每個 FPGA 設備,都會在 /sys/class/fpga 下建立一個設備目錄:

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

每個節點都有一個 FME 和兩個連接埠 (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,
連接埠號,
FPGA_ID_MAX
};
靜態結構 idr fpga_ids[FPGA_ID_MAX];
結構fpga_chardev_info {
const char *名稱;
dev_t 開發;
};
結構 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 device_id;
結構設備*fme_dev;
結構體互斥鎖;
結構list_head port_dev_list;
intreleased_port_num;
結構列表頭區域;
};
結構build_feature_devs_info {
結構 pci_dev *pdev;
無效 __iomem *ioaddr;
無效 __iomem *ioend;
int 目前欄;
無效 __iomem *pfme_hdr;
結構設備*parent_dev;
結構平台_裝置*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()
    • 分配一個struct build_feature_devs_info,並初始化它。
      .parent_dev 設定為包含 FME 和連接埠 sysfs 目錄的父 sysfs 目錄 (intel-fpga-dev.id)。
  • 解析特徵列表()
    • 瀏覽 BAR0 設備功能清單以發現 FME、連接埠及其私有功能。
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • 當遇到 FME 時:
  • 建構資訊建立_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 中指派結構體資源陣列。
  • 分配一個struct feature_platform_data,初始化它,並在feature_dev.dev.platform_data中儲存一個指針
    • 建立_feature_instance() 建置_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()
    • 當遇到連接埠時:
  • 建構資訊建立_dev()
    • 為Port分配一個平台設備,儲存在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中分配一個結構體資源數組。
    • 分配一個struct feature_platform_data,初始化它,並在feature_dev.dev.platform_data中儲存一個指針
  • 建置資訊提交_dev()
    • 將連接埠的 struct feature_platform_data.node 新增至 struct cci_drvdata.port_dev_list 中的連接埠列表
  • 建立_feature_instance() 建置_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 時:
  • 建立_feature_instance() 建置_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 私有特性時:
  • 建立_feature_instance() 建置_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()
    • 如果驅動程式載入在實體功能 (PF) 上,則:
  • 在 FME 標頭中描述的每個連接埠上執行 parse_feature_list() 流。
  • 使用標頭中每個連接埠條目中提到的 BAR。

FME平台設備初始化
本節給出了view intel-fpga-fme.ko 執行的 FME 裝置初始化的程式碼流程。主要資料結構和函數都突出顯示。最好在以下情況下遵循本節: view隨附的源代碼(fme-main.c)。

FME 平台設備資料結構

結構體功能操作{
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,
無符號 int cmd、無符號長 arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
結構特徵{
const char *名稱;
int 資源索引;
無效 __iomem *ioaddr;
結構feature_ops *操作;
};
結構feature_platform_data {
結構list_head節點;
結構體互斥鎖;
無符號長 dev_status;
結構體cdev cdev;
結構平台_裝置 *dev;
無符號整數disable_count;
無效*私有;
int 數字;
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];
};
結構體 perf_object {
整數ID;
const struct attribute_group **attr_groups;
結構設備*fme_dev;
結構list_head節點;
struct list_head 子節點;
結構體 kobject kobj;
};
結構fpga_fme {
u8 埠號;
u64 pr_err;
結構裝置*dev_err;
結構 perf_object *perf_dev;
結構feature_platform_data *pdata;
};

FME平台設備初始化流程

FME初始化流程intel-OPAE-FPGA-Linux-裝置驅動程式-架構-圖- (4)

  • fme_probe() fme_dev_init()
    • 初始化一個struct fpga_fme並將其儲存在feature_platform_data.private欄位中。
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • 將每個填充功能的 struct feature_ops 儲存到 feature_platform_data.features 中。
    • 從結構中呼叫測試函數(如果有)。
    • 從結構體中呼叫 init 函數。
  • fme_probe() fpga_register_dev_ops()
    • 建立FME字元設備節點,註冊一個結構體 file_營運.

連接埠平台設備初始化
本節給出了view intel-fpga-afu.ko 執行的連接埠裝置初始化的程式碼流程。重點介紹了主要的資料結構和功能。最好在以下情況下遵循本節: view荷蘭國際集團隨附的源代碼(afu.c)。

連接埠平台設備資料結構

結構體功能操作{
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,
無符號 int cmd、無符號長 arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
結構特徵{
const char *名稱;
int 資源索引;
無效 __iomem *ioaddr;
結構feature_ops *操作;
};
結構feature_platform_data {
結構list_head節點;
結構體互斥鎖;
無符號長 dev_status;
結構體cdev cdev;
結構平台_裝置 *dev;
無符號整數disable_count;
無效*私有;
int 數字;
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];
};
結構fpga_afu_region {
u32索引;
u32 標誌;
u64尺寸;
u64 偏移量;
u64 物理;
結構list_head節點;
};
結構fpga_afu_dma_region {
u64 使用者地址;
u64長度;
u64 iova;
結構頁面**頁面;
struct rb_node 節點;
布爾在使用;
};
結構fpga_afu {
u64region_cur_offset;
int num_regions;
u8 num_umsgs;
結構列表頭區域;
結構體 rb_root dma_regions;
結構feature_platform_data *pdata;
};

連接埠平台設備初始化流程

連接埠初始化流程intel-OPAE-FPGA-Linux-裝置驅動程式-架構-圖- (5)

  • afu_probe() afu_dev_init()
    • 初始化一個struct fpga_afu並將其儲存在feature_platform_data.private欄位中。
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • 將每個填充功能的 struct feature_ops 儲存到 feature_platform_data.features 中。
    • 從結構中呼叫測試函數(如果有)。
    • 從結構體中呼叫 init 函數。
  • afu_probe() fpga_register_dev_ops()
    • 建立Port字元設備節點,註冊一個結構體 file_營運.

FME IOCTL
在開放環境中調用的 IOCTL file /dev/intel-fpga-fme.j FPGA_GET_API_VERSION 的描述子 — 以整數形式傳回目前版本,從 0 開始。

FPGA_CHECK_EXTENSION—目前不支援。

FPGA_FME_PORT_RELEASE—arg 是指向下列內容的指標:

結構fpga_fme_port_release {
__u32 argsz; // in: sizeof(struct fpga_fme_port_release)
__u32 標誌; // in: 必須為 0
__u32 埠號; // in:要釋放的連接埠ID(從0開始)。
};

FPGA_FME_PORT_ASSIGN—arg 是指向 a 的指標:

結構fpga_fme_port_assign {
__u32 argsz; // in: sizeof(struct fpga_fme_port_assign)
__u32 標誌; // in: 必須為 0
__u32 埠號; // in:要指派的連接埠 ID(從 0 開始)。 (一定是
之前由 FPGA_FME_PORT_RELEASE 發布)
};

FPGA_FME_PORT_PR—arg 是指向 a 的指標:

結構fpga_fme_port_pr {
__u32 argsz; // in: sizeof(struct fpga_fme_port_pr)
__u32 標誌; // in: 必須為 0
__u32 埠號; // in:連接埠ID(從0開始)
__u32 緩衝區大小; // in:位元流緩衝區的大小(以位元組為單位)。必須是 4 位元組
對齊。
__u64 緩衝區位址; // in: 位元流緩衝區的行程位址
__u64 狀態; // 輸出:錯誤狀態(位元遮罩)
};

端口 IOCTL
在開放環境中調用的 IOCTL file /dev/intel-fpga-port.k 的描述子 FPGA_GET_API_VERSION — 以整數形式傳回目前版本,從 0 開始。

FPGA_PORT_GET_INFO—arg 是指向下列內容的指標:

結構fpga_port_info {
__u32 argsz; // in: sizeof(struct fpga_port_info)
__u32 標誌; //輸出:回傳0
__u32 num_regions; // out: MMIO 區域的數量,2(1 表示 AFU,1 表示
直通車)
__u32 num_umsgs; // out: 硬體支援的 UMsg 數量
};

FPGA_PORT_GET_REGION_INFO—arg 是指向下列內容的指標:

結構fpga_port_region_info {
__u32 argsz; // in: sizeof(struct fpga_port_region_info)
__u32 標誌; // 輸出: (位元遮罩) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 索引; // 在:FPGA_PORT_INDEX_UAFU 或 FPGA_PORT_INDEX_STP 中
__u32 填充; // in: 必須為 0
__u64 大小; // out: MMIO 區域的大小(以位元組為單位)
__u64 偏移量; // out: MMIO 區域相對於裝置 fd 開頭的偏移量
};

FPGA_PORT_DMA_MAP—arg 是指向下列內容的指標:
結構fpga_port_dma_map {
__u32 argsz; // in: sizeof(struct fpga_port_dma_map)
__u32 標誌; // in: 必須為 0 __u64 user_addr; // in: 虛擬行程
地址。必須頁面對齊。
__u64 長度; // in:映射的長度(以位元組為單位)。必須是頁面的倍數
尺寸。
__u64 iova; // out: IO 虛擬位址 };

FPGA_PORT_DMA_UNMAP—arg 是指向下列內容的指標:
結構fpga_port_dma_unmap {
__u32 argsz; // in: 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—參數必須為 NULL。

FPGA_PORT_UMSG_SET_MODE—arg 是指向下列內容的指標:

結構fpga_port_umsg_cfg {
__u32 argsz; // in: 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 是一個指向 a 的指標:
    結構fpga_port_umsg_base_addr {
    • u32 argsz; // in: sizeof(struct fpga_port_umsg_base_addr)
    • u32 標誌; // in: 必須為 0
    • u64 iova; // 在:來自 FPGA_PORT_DMA_MAP 的 IO 虛擬位址。 };

筆記:

  • 若要清除連接埠錯誤,您必須寫入目前錯誤的確切位元遮罩,例如ample, cat 錯誤 > 清除
  • 僅透過具有整合 FPGA 的英特爾至強處理器的加速堆疊支援 UMsg。

系統檔案系統 Files

FME 標頭 sysfs files
英特爾-fpga-dev.i/英特爾-fpga-fme.j/

系統檔案系統 file 毫米波場 類型 使用權
連接埠號 fme_header.capability.num_ports 十進制整數 只讀
快取大小 fme_header.capability.cache_size 十進制整數 只讀
版本 fme_header.capability.fabric_verid 十進制整數 只讀
套接字編號 fme_header.capability.socket_id 十進制整數 只讀
比特流ID fme_header.bitstream_id 十六進位 uint64_t 只讀
比特流元數據 fme_header.bitstream_md 十六進位 uint64_t 只讀

FME 熱管理 sysfs files
英特爾-fpga-dev.i/英特爾-fpga-fme.j/ Thermal_mgmt/

系統檔案系統 file 毫米波場 類型 使用權
閾值1 熱閾值.tmp_thshold1 十進制整數 使用者:唯讀 根:讀寫
閾值2 熱閾值.tmp_thshold2 十進制整數 使用者:唯讀 根:讀寫
閾值行程 熱閾值.therm_trip_thshold 十進制整數 只讀
達到閾值1 熱閾值.thshold1_status 十進制整數 只讀
達到閾值2 熱閾值.thshold2_status 十進制整數 只讀
閾值1_策略 熱的。閾值.thshold_policy 十進制整數 使用者:唯讀 根:讀寫
溫度 熱.rdsensor_fm1.fpga_temp 十進制整數 只讀

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

系統檔案系統 file 毫米波場 類型 使用權
消耗的 power.status.pwr_consumed 十六進位 uint64_t 只讀
閾值1 功率.閾值.閾值1 十六進位 uint64_t 使用者:唯讀 根:讀寫
閾值2 功率.閾值.閾值2 十六進位 uint64_t 使用者:唯讀 根:讀寫
閾值1_狀態 power.threshold.threshold1_status 無符號十進制 只讀
閾值2_狀態 power.threshold.threshold2_status 無符號十進制 只讀
右邊界 電源狀態.fpga_latency_report 無符號十進制 只讀

FME 全域錯誤 sysfs files
英特爾-fpga-dev.i/英特爾-fpga-fme.j/錯誤/

系統檔案系統 file 毫米波場 類型 使用權
PCIE0_錯誤 gerror.pcie0_err 十六進位 uint64_t 可讀寫
PCIE1_錯誤 gerror.pcie1_err 十六進位 uint64_t 可讀寫
注入錯誤 gerror.ras_error_inj 十六進位 uint64_t 可讀寫

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

系統檔案系統 file 毫米波場 類型 使用權
錯誤 gerror.fme_err 十六進位 uint64_t 只讀
第一個錯誤 gerror.fme_first_err.err_reg_status 十六進位 uint64_t 只讀
下一個錯誤 gerror.fme_next_err.err_reg_status 十六進位 uint64_t 只讀
清除 清除錯誤、first_error、next_error 各種 uint64_t 只寫

筆記:
若要清除 FME 錯誤,您必須寫入目前錯誤的確切位元遮罩,例如amp勒貓錯誤>清除。

FME 部分重新配置 sysfs files
英特爾-fpga-dev.i/英特爾-fpga-fme.j/pr/

系統檔案系統 file 毫米波場 類型 使用權
介面ID pr.fme_pr_intfc_id0_h、pr.fme_pre_intfc_id0_l 十六進位 16 位元組 只讀

FME 全域效能 sysfs files
英特爾-fpga-dev.i/英特爾-fpga-fme.j/dperf/時鐘

系統檔案系統 file 毫米波場 類型 使用權
gperf.clk.afu_interf_clock 十六進位 uint64_t 只讀

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/(對於具有 FPGA 的 Intel Xeon CPU 的加速堆疊無效)

系統檔案系統 file 毫米波場 類型 使用權
凍結 gperf.ch_ctl.freeze 十進制整數 可讀寫
讀命中 gperf.CACHE_RD_HIT 十六進位 uint64_t 只讀
讀未命中 gperf.CACHE_RD_MISS 十六進位 uint64_t 只讀
寫命中 gperf.CACHE_WR_HIT 十六進位 uint64_t 只讀
寫未命中 gperf.CACHE_WR_MISS 十六進位 uint64_t 只讀
保留請求 gperf.CACHE_HOLD_REQ 十六進位 uint64_t 只讀
tx_req_stall gperf.CACHE_TX_REQ_STALL 十六進位 uint64_t 只讀
系統檔案系統 file 毫米波場 類型 使用權
rx_req_stall gperf.CACHE_RX_REQ_STALL 十六進位 uint64_t 只讀
資料寫入連接埠爭用 gperf.CACHE_DATA_WR_PORT_CONTEN 十六進位 uint64_t 只讀
tag_write_port_contention gperf.CACHE_TAG_WR_PORT_CONTEN 十六進位 uint64_t 只讀

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/(對於具有 FPGA 的 Intel Xeon CPU 的加速堆疊無效)

系統檔案系統 file 毫米波場 類型 使用權
凍結 gperf.vtd_ctl.freeze 十進制整數 使用者:唯讀 根:讀寫

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/(對於具有 FPGA 的 Intel Xeon CPU 的加速堆疊無效)

系統檔案系統 file 毫米波場 類型 使用權
讀事務 gperf.VTD_AFU0_MEM_RD_TRANS 十六進位 uint64_t 只讀
寫交易 gperf.VTD_AFU0_MEM_WR_TRANS 十六進位 uint64_t 只讀
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT 十六進位 uint64_t 只讀
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT 十六進位 uint64_t 只讀

英特爾-fpga-dev.i/英特爾-fpga-fme.j/dperf/fabric/

系統檔案系統 file 毫米波場 類型 使用權
使能夠 gperf.fab_ctl。 十進制整數 使用者:唯讀 根:讀寫
凍結 gperf.fab_ctl.freeze 十進制整數 使用者:唯讀 根:讀寫
PCIE0_讀 gperf.FAB_PCIE0_RD 十六進位 uint64_t 只讀
PCIE0_寫 gperf.FAB_PCIE0_WR 十六進位 uint64_t 只讀
PCIE1_讀 gperf.FAB_PCIE1_RD 十六進位 uint64_t 只讀
PCIE1_寫 gperf.FAB_PCIE1_WR 十六進位 uint64_t 只讀
upi_read gperf.FAB_UPI_RD 十六進位 uint64_t 只讀
upi_write gperf.FAB_UPI_WR 十六進位 uint64_t 只讀

英特爾-fpga-ev.i/英特爾-fpga/fme.j/dperf/fabric/portk/

系統檔案系統 file 毫米波場 類型 使用權
PCIE0_讀 gperf.FAB_PCIE0_RD 十六進位 uint64_t 只讀
PCIE0_寫 gperf.FAB_PCIE0_WR 十六進位 uint64_t 只讀
PCIE1_讀 gperf.FAB_PCIE1_RD 十六進位 uint64_t 只讀
PCIE1_寫 gperf.FAB_PCIE1_WR 十六進位 uint64_t 只讀
upi_read gperf.FAB_UPI_RD 十六進位 uint64_t 只讀
upi_write gperf.FAB_UPI_WR 十六進位 uint64_t 只讀

連接埠頭 sysfs files
英特爾-fpga-dev.i/英特爾-fpga-port.k/

系統檔案系統 file 毫米波場 類型 使用權
id port_header.capability.port_number 十進制整數 只讀
左轉 port_header.control.latency_tolerance 十進制整數 只讀

連接埠 AFU 標頭 sysfs files
英特爾-fpga-dev.i/英特爾-fpga-port.k/

系統檔案系統 file 毫米波場 類型 使用權
afu_id afu_header.guid 十六進位 16 位元組 只讀

連接埠錯誤 sysfs files
英特爾-fpga-dev.i/英特爾-fpga-port.k/錯誤/

系統檔案系統 file 毫米波場 類型 使用權
錯誤 perror.port_error 十六進位 uint64_t 只讀
第一個錯誤 perror.port_first_error 十六進位 uint64_t 只讀
第一個格式錯誤的請求 錯誤請求 十六進位 16 位元組 只讀
清除 perror.(所有錯誤) 各種 uint64_t 只寫

筆記:
若要清除連接埠錯誤,您必須寫入目前錯誤的確切位元遮罩,例如amp勒貓錯誤>清除。

修訂歷史

檔案版本 變化
2017.10.02 初始版本。

OPAE Intel FPGA Linux 裝置驅動程式架構指南

文件/資源

英特爾 OPAE FPGA Linux 裝置驅動程式架構 [pdf] 使用者指南
OPAE FPGA Linux 裝置驅動程式架構、OPAE FPGA、Linux 裝置驅動程式架構、驅動程式架構、架構

參考

發表評論

您的電子郵件地址不會被公開。 必填欄位已標記 *