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

  1. 如果未編譯 uacce 模組,則為 ERR_PTR(-ENODEV)

  2. 使用所需的標誌成功

  3. 使用協商的標誌成功,例如

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

因此,使用者驅動程式需要檢查返回值以及協商的 uacce->flags。

使用者驅動程式

佇列檔案 mmap 空間將需要使用者驅動程式來包裝通訊協議。Uacce 在 sysfs 中提供了一些屬性,供使用者驅動程式相應地匹配正確的加速器。更多詳細資訊請參見 ABI 檔案測試/sysfs-driver-uacce