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,
};
所有区域都是可选的,并且因设备类型而异。 每个区域只能 mmap 一次,否则返回 -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 中提供一些属性,供用户驱动程序相应地匹配正确的加速器。 更多详细信息请参见 Documentation/ABI/testing/sysfs-driver-uacce。