FPGA 裝置特性列表 (DFL) 框架概述

作者

裝置特性列表 (DFL) FPGA 框架(以及符合此框架的驅動程式)隱藏了底層硬體的諸多細節,併為使用者空間提供了統一的介面。應用程式可以使用這些介面來配置、列舉、開啟和訪問在裝置記憶體中實現 DFL 的平臺上的 FPGA 加速器。除此之外,DFL 框架還支援系統級管理功能,例如 FPGA 重新配置。

裝置特性列表 (DFL) 概述

裝置特性列表 (DFL) 在裝置 MMIO 空間內定義了一個特性頭部的連結串列,以提供一種可擴充套件的方式來新增特性。軟體可以遍歷這些預定義的資料結構來列舉 FPGA 特性:FPGA 介面單元 (FIU)、加速功能單元 (AFU) 和私有特性,如下圖所示

   Header            Header            Header            Header
+----------+  +-->+----------+  +-->+----------+  +-->+----------+
|   Type   |  |   |  Type    |  |   |  Type    |  |   |  Type    |
|   FIU    |  |   | Private  |  |   | Private  |  |   | Private  |
+----------+  |   | Feature  |  |   | Feature  |  |   | Feature  |
| Next_DFH |--+   +----------+  |   +----------+  |   +----------+
+----------+      | Next_DFH |--+   | Next_DFH |--+   | Next_DFH |--> NULL
|    ID    |      +----------+      +----------+      +----------+
+----------+      |    ID    |      |    ID    |      |    ID    |
| Next_AFU |--+   +----------+      +----------+      +----------+
+----------+  |   | Feature  |      | Feature  |      | Feature  |
|  Header  |  |   | Register |      | Register |      | Register |
| Register |  |   |   Set    |      |   Set    |      |   Set    |
|   Set    |  |   +----------+      +----------+      +----------+
+----------+  |      Header
              +-->+----------+
                  |   Type   |
                  |   AFU    |
                  +----------+
                  | Next_DFH |--> NULL
                  +----------+
                  |   GUID   |
                  +----------+
                  |  Header  |
                  | Register |
                  |   Set    |
                  +----------+

FPGA 介面單元 (FIU) 表示一個獨立的、用於與 FPGA 介面的功能單元,例如 FPGA 管理引擎 (FME) 和埠(在後續章節中將更詳細地介紹 FME 和埠)。

加速功能單元 (AFU) 表示一個 FPGA 可程式設計區域,並且始終作為子項連線到 FIU(例如,埠),如上圖所示。

私有特性表示 FIU 和 AFU 的子特性。它們可以是具有不同 ID 的各種功能塊,但是屬於同一 FIU 或 AFU 的所有私有特性必須透過下一個裝置特性頭部 (Next_DFH) 指標連結到一個列表。

每個 FIU、AFU 和私有特性都可以實現其自己的功能暫存器。FIU 和 AFU 的功能暫存器集被稱為頭部暫存器集,例如 FME 頭部暫存器集;私有特性的功能暫存器集被稱為特性暫存器集,例如 FME 部分重新配置特性暫存器集。

此裝置特性列表提供了一種將特性連結在一起的方式,方便軟體透過遍歷此列表來定位每個特性,並且可以在任何 FPGA 裝置的暫存器區域中實現。

裝置特性頭部 - 版本 0

版本 0 (DFHv0) 是裝置特性頭部的原始版本。DFHv0 中的所有多位元組數量均為小端位元組序。DFHv0 的格式如下所示

+-----------------------------------------------------------------------+
|63 Type 60|59 DFH VER 52|51 Rsvd 41|40 EOL|39 Next 16|15 REV 12|11 ID 0| 0x00
+-----------------------------------------------------------------------+
|63                                 GUID_L                             0| 0x08
+-----------------------------------------------------------------------+
|63                                 GUID_H                             0| 0x10
+-----------------------------------------------------------------------+
  • 偏移量 0x00

    • 型別 - DFH 的型別(例如 FME、AFU 或私有特性)。

    • DFH VER - DFH 的版本。

    • Rsvd - 當前未使用。

    • EOL - 如果 DFH 是裝置特性列表 (DFL) 的結尾,則設定此項。

    • Next - DFL 中下一個 DFH 的位元組偏移量(從 DFH 開始計算),並且 DFH 的起始地址必須與 8 位元組邊界對齊。如果設定了 EOL,則 Next 是列表中最後一個特性的 MMIO 大小。

    • REV - 與此頭部關聯的特性的修訂號。

    • ID - 如果型別為私有特性,則為特性 ID。

  • 偏移量 0x08

    • GUID_L - 128 位全域性唯一識別符號的最低有效 64 位(僅當型別為 FME 或 AFU 時才存在)。

  • 偏移量 0x10

    • GUID_H - 128 位全域性唯一識別符號的最高有效 64 位(僅當型別為 FME 或 AFU 時才存在)。

裝置特性頭部 - 版本 1

裝置特性頭部的版本 1 (DFHv1) 添加了以下功能

  • 為特性提供了一種標準化機制,用於向軟體描述引數/功能。

  • 標準化了所有 DFHv1 型別使用 GUID 的方式。

  • 將 DFH 位置與特性本身的暫存器空間分離。

DFHv1 中的所有多位元組數量均為小端位元組序。裝置特性頭部 (DFH) 版本 1 的格式如下所示

+-----------------------------------------------------------------------+
|63 Type 60|59 DFH VER 52|51 Rsvd 41|40 EOL|39 Next 16|15 REV 12|11 ID 0| 0x00
+-----------------------------------------------------------------------+
|63                                 GUID_L                             0| 0x08
+-----------------------------------------------------------------------+
|63                                 GUID_H                             0| 0x10
+-----------------------------------------------------------------------+
|63                   Reg Address/Offset                      1|  Rel  0| 0x18
+-----------------------------------------------------------------------+
|63        Reg Size       32|Params 31|30 Group    16|15 Instance      0| 0x20
+-----------------------------------------------------------------------+
|63 Next    35|34RSV33|EOP32|31 Param Version 16|15 Param ID           0| 0x28
+-----------------------------------------------------------------------+
|63                 Parameter Data                                     0| 0x30
+-----------------------------------------------------------------------+

                              ...

+-----------------------------------------------------------------------+
|63 Next    35|34RSV33|EOP32|31 Param Version 16|15 Param ID           0|
+-----------------------------------------------------------------------+
|63                 Parameter Data                                     0|
+-----------------------------------------------------------------------+
  • 偏移量 0x00

    • 型別 - DFH 的型別(例如 FME、AFU 或私有特性)。

    • DFH VER - DFH 的版本。

    • Rsvd - 當前未使用。

    • EOL - 如果 DFH 是裝置特性列表 (DFL) 的結尾,則設定此項。

    • Next - DFL 中下一個 DFH 的位元組偏移量(從 DFH 開始計算),並且 DFH 的起始地址必須與 8 位元組邊界對齊。如果設定了 EOL,則 Next 是列表中最後一個特性的 MMIO 大小。

    • REV - 與此頭部關聯的特性的修訂號。

    • ID - 如果型別為私有特性,則為特性 ID。

  • 偏移量 0x08

    • GUID_L - 128 位全域性唯一識別符號的最低有效 64 位。

  • 偏移量 0x10

    • GUID_H - 128 位全域性唯一識別符號的最高有效 64 位。

  • 偏移量 0x18

    • Reg Address/Offset - 如果設定了 Rel 位,則該值是特性暫存器的 16 位對齊絕對地址的高 63 位。否則,該值是特性暫存器相對於 DFH 起始位置的偏移量。

  • 偏移量 0x20

    • Reg Size - 特性暫存器集的大小(以位元組為單位)。

    • Params - 如果 DFH 具有引數塊列表,則設定此項。

    • Group - 如果特性是組的一部分,則為組的 ID。

    • Instance - 組內特性例項的 ID。

  • 偏移量 0x28 (如果特性具有引數)

    • Next - 下一個引數塊的偏移量,以 8 位元組為單位。如果設定了 EOP,則為最後一個引數的大小,以 8 位元組為單位。

    • Param Version - Param ID 的版本。

    • Param ID - 引數的 ID。

  • 偏移量 0x30

    • Parameter Data - 引數資料,其大小和格式由引數的版本和 ID 定義。

FIU - FME (FPGA 管理引擎)

FPGA 管理引擎執行重新配置和其他基礎設施功能。每個 FPGA 裝置只有一個 FME。

使用者空間應用程式可以使用 open() 獲取 FME 的獨佔訪問許可權,並使用 close() 釋放它。

以下函式透過 ioctl 公開

  • 獲取驅動 API 版本 (DFL_FPGA_GET_API_VERSION)

  • 檢查擴充套件 (DFL_FPGA_CHECK_EXTENSION)

  • 程式設計位元流 (DFL_FPGA_FME_PORT_PR)

  • 將埠分配給 PF (DFL_FPGA_FME_PORT_ASSIGN)

  • 從 PF 釋放埠 (DFL_FPGA_FME_PORT_RELEASE)

  • 獲取 FME 全域性錯誤的 irq 數量 (DFL_FPGA_FME_ERR_GET_IRQ_NUM)

  • 設定 FME 錯誤的 interrupts 觸發 (DFL_FPGA_FME_ERR_SET_IRQ)

更多函式透過 sysfs 公開 (/sys/class/fpga_region/regionX/dfl-fme.n/)

讀取位元流 ID (bitstream_id)

bitstream_id 指示靜態 FPGA 區域的版本。

讀取位元流元資料 (bitstream_metadata)

bitstream_metadata 包含靜態 FPGA 區域的詳細資訊,例如合成日期和種子。

讀取埠數量 (ports_num)

一個 FPGA 裝置可能具有多個埠,此 sysfs 介面指示 FPGA 裝置具有多少個埠。

全域性錯誤報告管理 (errors/)

錯誤報告 sysfs 介面允許使用者讀取硬體檢測到的錯誤,並清除記錄的錯誤。

電源管理 (dfl_fme_power hwmon)

電源管理 hwmon sysfs 介面允許使用者讀取電源管理資訊(功耗、閾值、閾值狀態、限制等),並配置不同節流級別的電源閾值。

熱管理 (dfl_fme_thermal hwmon)

熱管理 hwmon sysfs 介面允許使用者讀取熱管理資訊(當前溫度、閾值、閾值狀態等)。

效能報告

效能計數器透過 perf PMU API 公開。標準 perf 工具可用於監視所有可用的 perf 事件。請參閱下面的效能計數器部分以獲取更多詳細資訊。

FIU - 埠

埠表示靜態 FPGA 結構和包含 AFU 的部分可重新配置區域之間的介面。它控制從 SW 到加速器的通訊,並公開重置和除錯等功能。每個 FPGA 裝置可以有多個埠,但每個埠始終只有一個 AFU。

AFU

AFU 連線到埠 FIU,並公開一個固定長度的 MMIO 區域,用於特定於加速器的控制暫存器。

使用者空間應用程式可以透過在埠裝置節點上使用 open() 來獲取連線到埠的 AFU 的獨佔訪問許可權,並使用 close() 釋放它。

以下函式透過 ioctl 公開

  • 獲取驅動 API 版本 (DFL_FPGA_GET_API_VERSION)

  • 檢查擴充套件 (DFL_FPGA_CHECK_EXTENSION)

  • 獲取埠資訊 (DFL_FPGA_PORT_GET_INFO)

  • 獲取 MMIO 區域資訊 (DFL_FPGA_PORT_GET_REGION_INFO)

  • 對映 DMA 緩衝區 (DFL_FPGA_PORT_DMA_MAP)

  • 取消對映 DMA 緩衝區 (DFL_FPGA_PORT_DMA_UNMAP)

  • 重置 AFU (DFL_FPGA_PORT_RESET)

  • 獲取埠錯誤的 irq 數量 (DFL_FPGA_PORT_ERR_GET_IRQ_NUM)

  • 設定埠錯誤的 interrupts 觸發 (DFL_FPGA_PORT_ERR_SET_IRQ)

  • 獲取 UINT 的 irq 數量 (DFL_FPGA_PORT_UINT_GET_IRQ_NUM)

  • 設定 UINT 的 interrupts 觸發 (DFL_FPGA_PORT_UINT_SET_IRQ)

DFL_FPGA_PORT_RESET

重置 FPGA 埠及其 AFU。使用者空間可以隨時執行埠重置,例如在 DMA 或部分重新配置期間。但是,它絕不應導致任何系統級問題,只會導致功能故障(例如,DMA 或 PR 操作失敗),並且可以從故障中恢復。

使用者空間應用程式還可以 mmap() 加速器 MMIO 區域。

更多函式透過 sysfs 公開:(/sys/class/fpga_region/<regionX>/<dfl-port.m>/)

讀取加速器 GUID (afu_id)

afu_id 指示已程式設計到此 AFU 的 PR 位元流。

錯誤報告 (errors/)

錯誤報告 sysfs 介面允許使用者讀取硬體檢測到的埠/afu 錯誤,並清除記錄的錯誤。

DFL 框架概述

       +----------+    +--------+ +--------+ +--------+
       |   FME    |    |  AFU   | |  AFU   | |  AFU   |
       |  Module  |    | Module | | Module | | Module |
       +----------+    +--------+ +--------+ +--------+
               +-----------------------+
               | FPGA Container Device |    Device Feature List
               |  (FPGA Base Region)   |         Framework
               +-----------------------+
------------------------------------------------------------------
             +----------------------------+
             |   FPGA DFL Device Module   |
             | (e.g. PCIE/Platform Device)|
             +----------------------------+
               +------------------------+
               |  FPGA Hardware Device  |
               +------------------------+

核心中的 DFL 框架提供了通用介面來建立容器裝置(FPGA 基本區域),從給定的裝置特性列表發現特性裝置及其私有特性,並使用相關資源在容器裝置下為特性裝置(例如,FME、埠和 AFU)建立平臺裝置。它還抽象了私有特性的操作,並向特性裝置驅動程式公開通用操作。

FPGA DFL 裝置可以是不同的硬體,例如 PCIe 裝置、平臺裝置等。一旦系統建立裝置,其驅動程式模組始終首先載入。此驅動程式在驅動程式體系結構中起著基礎設施作用。它定位裝置記憶體中的 DFL,將它們及其相關資源傳遞給 DFL 框架的通用介面以進行列舉。(有關詳細的列舉 API,請參閱 drivers/fpga/dfl.c)。

FPGA 管理引擎 (FME) 驅動程式是一個平臺驅動程式,在從 DFL 裝置模組建立 FME 平臺裝置後會自動載入。它為 FPGA 管理提供關鍵特性,包括

  1. 公開靜態 FPGA 區域資訊,例如版本和元資料。使用者可以透過 FME 驅動程式公開的 sysfs 介面讀取相關資訊。

  2. 部分重新配置。FME 驅動程式在 PR 子特性初始化期間建立 FPGA 管理器、FPGA 橋接器和 FPGA 區域。一旦它從使用者收到 DFL_FPGA_FME_PORT_PR ioctl,它就會呼叫 FPGA 區域的通用介面函式來完成 PR 位元流到給定埠的部分重新配置。

與 FME 驅動程式類似,一旦建立 AFU 平臺裝置,FPGA 加速功能單元 (AFU) 驅動程式就會被探測。此模組的主要功能是為使用者空間應用程式提供訪問各個加速器的介面,包括埠上的基本重置控制、AFU MMIO 區域匯出、DMA 緩衝區對映服務函式。

建立特性平臺裝置後,會自動載入匹配的平臺驅動程式來處理不同的功能。有關已在此 DFL 框架下實現的各個功能單元的詳細資訊,請參閱下一節。

部分重新配置

如上所述,可以透過 PR 位元流檔案的部分重新配置來重新配置加速器。PR 位元流檔案必須是為 FPGA 的確切靜態 FPGA 區域和目標可重新配置區域(埠)生成的,否則,重新配置操作將失敗並可能導致系統不穩定。可以透過比較 PR 位元流檔案頭部中記錄的相容性 ID 與目標 FPGA 區域公開的 compat_id 來檢查此相容性。此檢查通常由使用者空間在呼叫重新配置 IOCTL 之前完成。

FPGA 虛擬化 - PCIe SRIOV

本節介紹基於 DFL 的 FPGA 裝置上的虛擬化支援,以允許從虛擬機器 (VM) 中執行的應用程式訪問加速器。本節僅介紹具有 SRIOV 支援的基於 PCIe 的 FPGA 裝置。

特定 FPGA 裝置支援的特性透過裝置特性列表公開,如下圖所示

  +-------------------------------+  +-------------+
  |              PF               |  |     VF      |
  +-------------------------------+  +-------------+
      ^            ^         ^              ^
      |            |         |              |
+-----|------------|---------|--------------|-------+
|     |            |         |              |       |
|  +-----+     +-------+ +-------+      +-------+   |
|  | FME |     | Port0 | | Port1 |      | Port2 |   |
|  +-----+     +-------+ +-------+      +-------+   |
|                  ^         ^              ^       |
|                  |         |              |       |
|              +-------+ +------+       +-------+   |
|              |  AFU  | |  AFU |       |  AFU  |   |
|              +-------+ +------+       +-------+   |
|                                                   |
|            DFL based FPGA PCIe Device             |
+---------------------------------------------------+

始終透過物理功能 (PF) 訪問 FME。

埠(以及相關的 AFU)預設透過 PF 訪問,但可以透過 PCIe SRIOV 透過虛擬功能 (VF) 裝置公開。每個 VF 僅包含 1 個埠和 1 個 AFU 以進行隔離。使用者可以將透過 PCIe SRIOV 介面建立的各個 VF(加速器)分配給虛擬機器。

虛擬化情況下的驅動程式組織如下圖所示

 +-------++------++------+             |
 | FME   || FME  || FME  |             |
 | FPGA  || FPGA || FPGA |             |
 |Manager||Bridge||Region|             |
 +-------++------++------+             |
 +-----------------------+  +--------+ |             +--------+
 |          FME          |  |  AFU   | |             |  AFU   |
 |         Module        |  | Module | |             | Module |
 +-----------------------+  +--------+ |             +--------+
       +-----------------------+       |       +-----------------------+
       | FPGA Container Device |       |       | FPGA Container Device |
       |  (FPGA Base Region)   |       |       |  (FPGA Base Region)   |
       +-----------------------+       |       +-----------------------+
         +------------------+          |         +------------------+
         | FPGA PCIE Module |          | Virtual | FPGA PCIE Module |
         +------------------+   Host   | Machine +------------------+
-------------------------------------- | ------------------------------
          +---------------+            |          +---------------+
          | PCI PF Device |            |          | PCI VF Device |
          +---------------+            |          +---------------+

一旦檢測到 FPGA PCIe PF 或 VF 裝置,FPGA PCIe 裝置驅動程式始終首先載入。

  • 使用 DFL 框架的通用介面完成 FPGA PCIe PF 和 VF 裝置上的列舉。

  • 支援 SRIOV。

FME 裝置驅動程式在此驅動程式體系結構中起著管理作用,它提供 ioctl 來從 PF 釋放埠並將埠分配給 PF。從 PF 釋放埠後,透過 PCIe SRIOV sysfs 介面透過 VF 公開此埠是安全的。

要允許從 VM 中執行的應用程式訪問加速器,需要使用以下步驟將各個 AFU 的埠分配給 VF

  1. 預設情況下,PF 擁有所有 AFU 埠。任何需要重新分配給 VF 的埠必須首先透過 FME 裝置上的 DFL_FPGA_FME_PORT_RELEASE ioctl 釋放。

  2. 一旦從 PF 釋放了 N 個埠,使用者就可以使用下面的命令來啟用 SRIOV 和 VF。每個 VF 僅擁有一個帶有 AFU 的埠。

    echo N > $PCI_DEVICE_PATH/sriov_numvfs
    
  3. 將 VF 傳遞給 VM

  4. VF 下的 AFU 可以從 VM 中的應用程式訪問(在 VF 中使用相同的驅動程式)。

請注意,FME 不能分配給 VF,因此 PR 和其他管理功能只能透過 PF 使用。

裝置列舉

本節介紹應用程式如何從 /sys/class/fpga_region 下的 sysfs 層次結構中列舉 fpga 裝置。

在下面的示例中,主機中安裝了兩個基於 DFL 的 FPGA 裝置。每個 fpga 裝置都有一個 FME 和兩個埠 (AFU)。

FPGA 區域在 /sys/class/fpga_region/ 下建立

/sys/class/fpga_region/region0
/sys/class/fpga_region/region1
/sys/class/fpga_region/region2
...

應用程式需要搜尋每個 regionX 資料夾,如果找到特性裝置(例如找到“dfl-port.n”或“dfl-fme.m”),則它是表示 FPGA 裝置的基本 fpga 區域。

每個基本區域都有一個 FME 和兩個埠 (AFU) 作為子裝置

/sys/class/fpga_region/region0/dfl-fme.0
/sys/class/fpga_region/region0/dfl-port.0
/sys/class/fpga_region/region0/dfl-port.1
...

/sys/class/fpga_region/region3/dfl-fme.1
/sys/class/fpga_region/region3/dfl-port.2
/sys/class/fpga_region/region3/dfl-port.3
...

通常,FME/AFU sysfs 介面的命名如下

/sys/class/fpga_region/<regionX>/<dfl-fme.n>/
/sys/class/fpga_region/<regionX>/<dfl-port.m>/

其中“n”連續編號所有 FME,“m”連續編號所有埠。

用於 ioctl() 或 mmap() 的裝置節點可以透過以下方式引用

/sys/class/fpga_region/<regionX>/<dfl-fme.n>/dev
/sys/class/fpga_region/<regionX>/<dfl-port.n>/dev

效能計數器

效能報告是在 FME 中實現的一個私有特性。它可以在硬體中支援多個獨立的、系統範圍的裝置計數器集,以監視和計數效能事件,包括“basic”、“cache”、“fabric”、“vtd”和“vtd_sip”計數器。使用者可以使用標準 perf 工具來監視 FPGA 快取命中/未命中率、事務數量、AFU 的介面時鐘計數器和其他 FPGA 效能事件。

不同的 FPGA 裝置可能具有不同的計數器集,具體取決於硬體實現。例如,某些獨立 FPGA 卡沒有任何快取。使用者可以使用“perf list”來檢查目標硬體支援哪些 perf 事件。

為了允許使用者使用標準 perf API 來訪問這些效能計數器,驅動程式建立了一個 perf PMU,並在 /sys/bus/event_source/devices/dfl_fme* 中建立了相關的 sysfs 介面來描述可用的 perf 事件和配置選項。

“format”目錄描述了 struct perf_event_attr 的 config 欄位的格式。config 有 3 個位域:“evtype”定義 perf 事件所屬的型別;“event”是其類別中事件的標識;引入“portid”來決定要監視 FPGA 總體資料或特定埠的計數器集。

“events”目錄描述了可直接與 perf 工具一起使用的所有可用事件的配置模板。例如,fab_mmio_read 具有配置“event=0x06,evtype=0x02,portid=0xff”,這表明此事件屬於 fabric 型別 (0x02),本地事件 ID 為 0x06,並且它用於總體監視 (portid=0xff)。

perf 的示例用法

$# perf list |grep dfl_fme

dfl_fme0/fab_mmio_read/                              [Kernel PMU event]
<...>
dfl_fme0/fab_port_mmio_read,portid=?/                [Kernel PMU event]
<...>

$# perf stat -a -e dfl_fme0/fab_mmio_read/ <command>
or
$# perf stat -a -e dfl_fme0/event=0x06,evtype=0x02,portid=0xff/ <command>
or
$# perf stat -a -e dfl_fme0/config=0xff2006/ <command>

另一個示例,fab_port_mmio_read 監視特定埠的 mmio 讀取。因此其配置模板為“event=0x06,evtype=0x01,portid=?”。應顯式設定 portid。

其 perf 用法

$# perf stat -a -e dfl_fme0/fab_port_mmio_read,portid=0x0/ <command>
or
$# perf stat -a -e dfl_fme0/event=0x06,evtype=0x02,portid=0x0/ <command>
or
$# perf stat -a -e dfl_fme0/config=0x2006/ <command>

請注意,對於 fabric 計數器,總體 perf 事件 (fab_*) 和埠 perf 事件 (fab_port_*) 實際上在硬體中共享一組計數器,因此它們不能同時監視。如果將此計數器集配置為監視總體資料,則不支援每個埠的 perf 資料。請參見以下示例

$# perf stat -e dfl_fme0/fab_mmio_read/,dfl_fme0/fab_port_mmio_write,\
                                                  portid=0/ sleep 1

Performance counter stats for 'system wide':

               3      dfl_fme0/fab_mmio_read/
 <not supported>      dfl_fme0/fab_port_mmio_write,portid=0x0/

     1.001750904 seconds time elapsed

驅動程式還提供了一個“cpumask”sysfs 屬性,其中僅包含用於訪問這些 perf 事件的一個 CPU id。不允許在多個 CPU 上進行計數,因為它們是 FPGA 裝置上的系統範圍的計數器。

當前的驅動程式不支援取樣。因此不支援“perf record”。

中斷支援

某些 FME 和 AFU 私有特效能夠生成中斷。如上所述,使用者可以呼叫 ioctl (DFL_FPGA_*_GET_IRQ_NUM) 來了解此私有特性是否支援中斷或支援多少箇中斷。驅動程式還為使用者實現了一個基於 eventfd 的中斷處理機制,以便在發生中斷時收到通知。使用者可以透過 ioctl (DFL_FPGA_*_SET_IRQ) 將 eventfds 設定為驅動程式,然後在這些 eventfds 上輪詢/選擇以等待通知。在當前的 DFL 中,3 個子特性(埠錯誤、FME 全域性錯誤和 AFU 中斷)支援中斷。

新增新 FIU 支援

開發人員可能在此 DFL 框架下製作了一些新的功能塊 (FIU),那麼需要為新特性裝置 (FIU) 開發新的平臺裝置驅動程式,其方式與現有特性裝置驅動程式(例如 FME 和埠/AFU 平臺裝置驅動程式)相同。除此之外,它還需要修改 DFL 框架列舉程式碼,以進行新的 FIU 型別檢測和相關的平臺裝置建立。

新增新的私有特性支援

在某些情況下,我們可能需要向現有 FIU(例如 FME 或埠)新增一些新的私有特性。開發人員無需修改 DFL 框架中的列舉程式碼,因為每個私有特性都會自動解析,並且可以在 DFL 框架建立的 FIU 平臺裝置下找到相關的 mmio 資源。開發人員只需要提供一個具有匹配特性 ID 的子特性驅動程式。FME 部分重新配置子特性驅動程式(請參閱 drivers/fpga/dfl-fme-pr.c)可以作為參考。

請參閱下面的連結,以獲取現有特性 ID 表和新特性 ID 應用程式的指南。 https://github.com/OPAE/dfl-feature-id

PCI 裝置上 DFL 的位置

在 PCI 裝置上查詢 DFL 的原始方法假定第一個 DFL 的起始位置是 bar 0 的偏移量 0。如果 DFL 的第一個節點是 FME,則在 FME 頭部暫存器中指定埠中的進一步 DFL。或者,可以使用 PCIe 供應商特定功能結構來指定裝置上所有 DFL 的位置,從而為 DFL 中的起始節點型別提供靈活性。Intel 為此目的保留了 VSEC ID 0x43。供應商特定資料以 4 位元組供應商特定暫存器開始,用於表示 DFL 的數量,然後是每個 DFL 的 4 位元組偏移量/BIR 供應商特定暫存器。偏移量/BIR 暫存器的位 2:0 指示 BAR,位 31:3 形成 8 位元組對齊的偏移量,其中位 2:0 為零。

+----------------------------+
|31     Number of DFLS      0|
+----------------------------+
|31     Offset     3|2 BIR  0|
+----------------------------+
              . . .
+----------------------------+
|31     Offset     3|2 BIR  0|
+----------------------------+

已經考慮過能夠為每個 BAR 指定多個 DFL,但是確定該用例沒有提供價值。為每個 BAR 指定單個 DFL 簡化了實現並允許進行額外的錯誤檢查。

DFL 裝置的使用者空間驅動程式支援

FPGA 的目的是使用新開發的硬體元件進行重新程式設計。新硬體可以在 DFL 中例項化一個新的私有特性,然後在系統中呈現 DFL 裝置。在某些情況下,使用者可能需要 DFL 裝置的使用者空間驅動程式

  • 使用者可能需要為其硬體執行一些診斷測試。

  • 使用者可以在使用者空間中原型化核心驅動程式。

  • 某些硬體是為特定目的而設計的,並且不適合標準核心子系統之一。

這需要從使用者空間直接訪問 MMIO 空間和中斷處理。uio_dfl 模組為此目的公開了 UIO 裝置介面。

當前,uio_dfl 驅動程式僅支援 Ether Group 子特性,該子特性在硬體中沒有 irq。因此,此驅動程式中未新增中斷處理。

應選擇 UIO_DFL 以啟用 uio_dfl 模組驅動程式。要透過 UIO 直接訪問來支援新的 DFL 特性,應將其特性 ID 新增到驅動程式的 id_table 中。

公開討論

FME 驅動程式現在匯出一個 ioctl (DFL_FPGA_FME_PORT_PR) 用於部分重新配置給使用者。將來,如果添加了統一的重新配置使用者介面,則 FME 驅動程式應從 ioctl 介面切換到它們。