Uacce 介紹¶
Uacce (統一/使用者空間訪問意向加速器框架) 旨在提供加速器和程序之間的共享虛擬定址 (SVA)。因此,加速器可以訪問主 CPU 的任何資料結構。這與 CPU 和 IO 裝置之間的資料共享不同,後者僅共享資料內容而不是地址。由於統一的地址,硬體和程序的使用者空間可以在通訊中共享相同的虛擬地址。Uacce 將硬體加速器視為異構處理器,而 IOMMU 共享相同的 CPU 頁表,從而實現從 va 到 pa 的相同轉換。
__________________________ __________________________
| | | |
| User application (CPU) | | Hardware Accelerator |
|__________________________| |__________________________|
| |
| va | va
V V
__________ __________
| | | |
| MMU | | IOMMU |
|__________| |__________|
| |
| |
V pa V pa
_______________________________________
| |
| Memory |
|_______________________________________|
架構¶
Uacce 是核心模組,負責 iommu 和地址共享。使用者驅動程式和庫稱為 WarpDrive。
圍繞 IOMMU SVA API 構建的 uacce 裝置可以訪問多個地址空間,包括沒有 PASID 的地址空間。
一個虛擬概念,佇列,用於通訊。它提供了一個類似 FIFO 的介面。並且它在應用程式和所有涉及的硬體之間維護一個統一的地址空間。
___________________ ________________
| | user API | |
| WarpDrive library | ------------> | user driver |
|___________________| |________________|
| |
| |
| queue fd |
| |
| |
v |
___________________ _________ |
| | | | | mmap memory
| Other framework | | uacce | | r/w interface
| crypto/nic/others | |_________| |
|___________________| |
| | |
| register | register |
| | |
| | |
| _________________ __________ |
| | | | | |
------------- | Device Driver | | IOMMU | |
|_________________| |__________| |
| |
| V
| ___________________
| | |
-------------------------- | Device(Hardware) |
|___________________|
它是如何工作的¶
Uacce 使用 mmap 和 IOMMU 來實現這一技巧。
Uacce 為每個註冊到它的裝置建立一個 chrdev。當用戶應用程式開啟 chrdev 時,會建立一個新佇列。檔案描述符用作佇列的使用者控制代碼。加速器裝置將其自身表示為 Uacce 物件,該物件作為 chrdev 匯出到使用者空間。使用者應用程式透過 ioctl(作為控制路徑)或共享記憶體(作為資料路徑)與硬體通訊。
到硬體的控制路徑透過檔案操作,而資料路徑透過佇列 fd 的 mmap 空間。
佇列檔案地址空間
/**
* enum uacce_qfrt: qfrt type
* @UACCE_QFRT_MMIO: device mmio region
* @UACCE_QFRT_DUS: device user share region
*/
enum uacce_qfrt {
UACCE_QFRT_MMIO = 0,
UACCE_QFRT_DUS = 1,
};
所有區域都是可選的,並且因裝置型別而異。每個區域只能 mmapped 一次,否則返回 -EEXIST。
裝置 mmio 區域對映到硬體 mmio 空間。它通常用於門鈴或到硬體的其他通知。它不夠快,不能作為資料通道。
裝置使用者共享區域用於在使用者程序和裝置之間共享資料緩衝區。
Uacce 註冊 API¶
註冊 API 在 uacce.h 中定義。
struct uacce_interface {
char name[UACCE_MAX_NAME_SIZE];
unsigned int flags;
const struct uacce_ops *ops;
};
根據 IOMMU 功能,uacce_interface 標誌可以是
/**
* UACCE Device flags:
* UACCE_DEV_SVA: Shared Virtual Addresses
* Support PASID
* Support device page faults (PCI PRI or SMMU Stall)
*/
#define UACCE_DEV_SVA BIT(0)
struct uacce_device *uacce_alloc(struct device *parent,
struct uacce_interface *interface);
int uacce_register(struct uacce_device *uacce);
void uacce_remove(struct uacce_device *uacce);
uacce_register 結果可以是
如果未編譯 uacce 模組,則為 ERR_PTR(-ENODEV)
使用所需的標誌成功
使用協商的標誌成功,例如
uacce_interface.flags = UACCE_DEV_SVA 但是 uacce->flags = ~UACCE_DEV_SVA
因此,使用者驅動程式需要檢查返回值以及協商的 uacce->flags。
使用者驅動程式¶
佇列檔案 mmap 空間將需要使用者驅動程式來包裝通訊協議。Uacce 在 sysfs 中提供了一些屬性,供使用者驅動程式相應地匹配正確的加速器。更多詳細資訊請參見 ABI 檔案測試/sysfs-driver-uacce。