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 的结果可以是

  1. 如果未编译 uacce 模块,则 ERR_PTR(-ENODEV)

  2. 以所需的标志成功

  3. 以协商的标志成功,例如

uacce_interface.flags = UACCE_DEV_SVA 但 uacce->flags = ~UACCE_DEV_SVA

因此,用户驱动程序需要检查返回值以及协商的 uacce->flags。

用户驱动程序

队列文件 mmap 空间将需要一个用户驱动程序来包装通信协议。 Uacce 在 sysfs 中提供一些属性,供用户驱动程序相应地匹配正确的加速器。 更多详细信息请参见 Documentation/ABI/testing/sysfs-driver-uacce。