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 互動。