英語

OpenCAPI (開放一致性加速器處理器介面)

OpenCAPI 是處理器和加速器之間的介面。 它的目標是低延遲和高頻寬。

該規範由 OpenCAPI 聯盟開發,現在可從 Compute Express Link 聯盟獲得。

它允許加速器(可以是 FPGA、ASIC 等)使用虛擬地址一致地訪問主機記憶體。 OpenCAPI 裝置還可以託管自己的記憶體,可以從主機訪問。

OpenCAPI 在 Linux 中被稱為“ocxl”,它是“cxl”(IBM CAPI powerpc 介面的驅動程式)的開放的、與處理器無關的演進版本,之所以這樣命名是為了避免與 ISDN CAPI 子系統混淆。

高層檢視

OpenCAPI 定義了資料鏈路層 (DL) 和事務層 (TL),它們將在物理鏈路之上實現。 任何實現 DL 和 TL 的處理器或裝置都可以開始共享記憶體。

+-----------+                         +-------------+
|           |                         |             |
|           |                         | Accelerated |
| Processor |                         |  Function   |
|           |  +--------+             |    Unit     |  +--------+
|           |--| Memory |             |    (AFU)    |--| Memory |
|           |  +--------+             |             |  +--------+
+-----------+                         +-------------+
     |                                       |
+-----------+                         +-------------+
|    TL     |                         |    TLX      |
+-----------+                         +-------------+
     |                                       |
+-----------+                         +-------------+
|    DL     |                         |    DLX      |
+-----------+                         +-------------+
     |                                       |
     |                   PHY                 |
     +---------------------------------------+

裝置發現

OpenCAPI 依賴於裝置上實現的類似 PCI 的配置空間。 因此,主機可以透過查詢配置空間來發現 AFU。

Linux 中的 OpenCAPI 裝置被視為 PCI 裝置(有一些注意事項)。 韌體應將硬體抽象為好像它是 PCI 鏈路。 大量現有的 PCI 基礎設施被重用:在標準 PCI 列舉期間掃描裝置並分配 BAR。 因此,可以使用 ‘lspci’ 等命令來檢視有哪些裝置可用。

配置空間定義了可以在物理介面卡上找到的 AFU,例如其名稱、它可以使用的記憶體上下文數量、其 MMIO 區域的大小等。

MMIO

OpenCAPI 為每個 AFU 定義了兩個 MMIO 區域

  • 全域性 MMIO 區域,其中包含與整個 AFU 相關的暫存器。

  • 每個程序的 MMIO 區域,每個上下文的大小是固定的。

AFU 中斷

OpenCAPI 包括 AFU 向主機程序傳送中斷的可能性。 這是透過事務層中定義的 ‘intrp_req’ 完成的,它指定了一個 64 位物件控制代碼,用於定義中斷。

該驅動程式允許程序分配中斷並獲取其 64 位物件控制代碼,該控制代碼可以傳遞給 AFU。

字元裝置

該驅動程式為在物理裝置上找到的每個 AFU 建立一個字元裝置。 一個物理裝置可能有多個功能,每個功能可以有多個 AFU。 但在編寫本文時,它僅使用匯出單個 AFU 的裝置進行了測試。

字元裝置可以在 /dev/ocxl/ 中找到,並命名為:/dev/ocxl/<AFU 名稱>.<位置>.<索引>

其中 <AFU 名稱> 是一個最大 20 個字元長的名稱,可以在 AFU 的配置空間中找到。 <位置> 由驅動程式新增,可以在系統具有同一 OpenCAPI 裝置的多個例項時幫助區分裝置。 <索引> 也有助於在裝置攜帶同一 AFU 的多個副本的不太可能的情況下區分 AFU。

Sysfs 類

為表示 AFU 的裝置添加了一個 ocxl 類。 請參閱 /sys/class/ocxl。 佈局在 ABI 檔案測試/sysfs-class-ocxl 中描述

使用者 API

open

根據在配置空間中找到的 AFU 定義,AFU 可能支援使用多個記憶體上下文,在這種情況下,關聯的字元裝置可以被不同的程序多次開啟。

ioctl

OCXL_IOCTL_ATTACH

將呼叫程序的記憶體上下文附加到 AFU,以便 AFU 可以訪問其記憶體。

OCXL_IOCTL_IRQ_ALLOC

分配一個 AFU 中斷並返回一個識別符號。

OCXL_IOCTL_IRQ_FREE

釋放先前分配的 AFU 中斷。

OCXL_IOCTL_IRQ_SET_FD

將事件 fd 與 AFU 中斷相關聯,以便在 AFU 傳送中斷時通知使用者程序。

OCXL_IOCTL_GET_METADATA

從卡中獲取配置資訊,例如 MMIO 區域的大小、AFU 版本和當前上下文的 PASID。

OCXL_IOCTL_ENABLE_P9_WAIT

允許 AFU 喚醒執行 ‘wait’ 的使用者空間執行緒。 返回資訊到使用者空間以允許它配置 AFU。 請注意,這僅在 POWER9 上可用。

OCXL_IOCTL_GET_FEATURES

報告影響 OpenCAPI 的哪些 CPU 功能可以從使用者空間使用。

mmap

程序可以 mmap 每個程序的 MMIO 區域,以便與 AFU 互動。