1bf80eef2SRui Li.. SPDX-License-Identifier: GPL-2.0 2bf80eef2SRui Li.. include:: ../../disclaimer-zh_CN.rst 3bf80eef2SRui Li 4bf80eef2SRui Li:Original: Documentation/userspace-api/accelerators/ocxl.rst 5bf80eef2SRui Li 6bf80eef2SRui Li:翻译: 7bf80eef2SRui Li 8bf80eef2SRui Li 李睿 Rui Li <me@lirui.org> 9bf80eef2SRui Li 10bf80eef2SRui Li===================================== 11bf80eef2SRui LiOpenCAPI (开放相干加速器处理器接口) 12bf80eef2SRui Li===================================== 13bf80eef2SRui Li 14bf80eef2SRui Li*OpenCAPI: Open Coherent Accelerator Processor Interface* 15bf80eef2SRui Li 16bf80eef2SRui LiOpenCAPI是处理器和加速器之间的一个接口,致力于达到低延迟和高带宽。该规范 17bf80eef2SRui Li由 `OpenCAPI Consortium <http://opencapi.org/>`_ 开发。 18bf80eef2SRui Li 19bf80eef2SRui Li它允许加速器(可以是FPGA、ASIC等)使用虚拟地址连贯地访问主机内存。一个OpenCAPI 20bf80eef2SRui Li设备也可以托管它自己的内存,并可以由主机访问。 21bf80eef2SRui Li 22bf80eef2SRui LiOpenCAPI在Linux中称为“ocxl”,它作为“cxl”(用于powerpc的IBM CAPI接口的驱动)的 23bf80eef2SRui Li开放、处理器无关的演进,这么命名是为了避免与ISDN CAPI子系统相混淆。 24bf80eef2SRui Li 25bf80eef2SRui Li 26bf80eef2SRui Li高层视角 27bf80eef2SRui Li======== 28bf80eef2SRui Li 29bf80eef2SRui LiOpenCAPI定义了一个在物理链路层上实现的数据链路层(TL)和传输层(TL)。任何 30bf80eef2SRui Li实现DL和TL的处理器或者设备都可以开始共享内存。 31bf80eef2SRui Li 32bf80eef2SRui Li:: 33bf80eef2SRui Li 34bf80eef2SRui Li +-----------+ +-------------+ 35bf80eef2SRui Li | | | | 36bf80eef2SRui Li | | | Accelerated | 37bf80eef2SRui Li | Processor | | Function | 38bf80eef2SRui Li | | +--------+ | Unit | +--------+ 39bf80eef2SRui Li | |--| Memory | | (AFU) |--| Memory | 40bf80eef2SRui Li | | +--------+ | | +--------+ 41bf80eef2SRui Li +-----------+ +-------------+ 42bf80eef2SRui Li | | 43bf80eef2SRui Li +-----------+ +-------------+ 44bf80eef2SRui Li | TL | | TLX | 45bf80eef2SRui Li +-----------+ +-------------+ 46bf80eef2SRui Li | | 47bf80eef2SRui Li +-----------+ +-------------+ 48bf80eef2SRui Li | DL | | DLX | 49bf80eef2SRui Li +-----------+ +-------------+ 50bf80eef2SRui Li | | 51bf80eef2SRui Li | PHY | 52bf80eef2SRui Li +---------------------------------------+ 53bf80eef2SRui Li 54bf80eef2SRui Li Processor:处理器 55bf80eef2SRui Li Memory:内存 56*b1a54551SLu Dai Accelerated Function Unit:加速功能单元 57bf80eef2SRui Li 58bf80eef2SRui Li 59bf80eef2SRui Li 60bf80eef2SRui Li设备发现 61bf80eef2SRui Li======== 62bf80eef2SRui Li 63bf80eef2SRui LiOpenCAPI依赖一个在设备上实现的与PCI类似的配置空间。因此主机可以通过查询 64bf80eef2SRui Li配置空间来发现AFU。 65bf80eef2SRui Li 66bf80eef2SRui LiOpenCAPI设备在Linux中被当作类PCI设备(有一些注意事项)。固件需要对硬件进行 67bf80eef2SRui Li抽象,就好像它是一个PCI链路。许多已有的PCI架构被重用:在模拟标准PCI时, 68bf80eef2SRui Li设备被扫描并且BAR(基址寄存器)被分配。像“lspci”的命令因此可以被用于查看 69bf80eef2SRui Li哪些设备可用。 70bf80eef2SRui Li 71bf80eef2SRui Li配置空间定义了可以在物理适配器上可以被找到的AFU,比如它的名字、支持多少内 72bf80eef2SRui Li存上下文、内存映射IO(MMIO)区域的大小等。 73bf80eef2SRui Li 74bf80eef2SRui Li 75bf80eef2SRui Li 76bf80eef2SRui LiMMIO 77bf80eef2SRui Li==== 78bf80eef2SRui Li 79bf80eef2SRui LiOpenCAPI为每个AFU定义了两个MMIO区域: 80bf80eef2SRui Li 81bf80eef2SRui Li* 全局MMIO区域,保存和整个AFU相关的寄存器。 82bf80eef2SRui Li* 每个进程的MMIO区域,对于每个上下文固定大小。 83bf80eef2SRui Li 84bf80eef2SRui Li 85bf80eef2SRui Li 86bf80eef2SRui LiAFU中断 87bf80eef2SRui Li======= 88bf80eef2SRui Li 89bf80eef2SRui LiOpenCAPI拥有AFU向主机进程发送中断的可能性。它通过定义在传输层的“intrp_req” 90bf80eef2SRui Li来完成,指定一个定义中断的64位对象句柄。 91bf80eef2SRui Li 92bf80eef2SRui Li驱动允许一个进程分配中断并获取可以传递给AFU的64位对象句柄。 93bf80eef2SRui Li 94bf80eef2SRui Li 95bf80eef2SRui Li 96bf80eef2SRui Li字符设备 97bf80eef2SRui Li======== 98bf80eef2SRui Li 99bf80eef2SRui Li驱动为每个在物理设备上发现的AFU创建一个字符设备。一个物理设备可能拥有多个 100*b1a54551SLu Dai功能,一个功能可以拥有多个AFU。不过编写这篇文档之时,只对导出一个AFU的设备 101bf80eef2SRui Li测试过。 102bf80eef2SRui Li 103bf80eef2SRui Li字符设备可以在 /dev/ocxl/ 中被找到,其命名为: 104bf80eef2SRui Li/dev/ocxl/<AFU 名称>.<位置>.<索引> 105bf80eef2SRui Li 106bf80eef2SRui Li<AFU 名称> 是一个最长20个字符的名称,和在AFU配置空间中找到的相同。 107bf80eef2SRui Li<位置>由驱动添加,可在系统有不止一个相同的OpenCAPI设备时帮助区分设备。 108bf80eef2SRui Li<索引>也是为了在少见情况下帮助区分AFU,即设备携带多个同样的AFU副本时。 109bf80eef2SRui Li 110bf80eef2SRui Li 111bf80eef2SRui Li 112bf80eef2SRui LiSysfs类 113bf80eef2SRui Li======= 114bf80eef2SRui Li 115bf80eef2SRui Li添加了代表AFU的ocxl类。查看/sys/class/ocxl。布局在 116bf80eef2SRui LiDocumentation/ABI/testing/sysfs-class-ocxl 中描述。 117bf80eef2SRui Li 118bf80eef2SRui Li 119bf80eef2SRui Li 120bf80eef2SRui Li用户API 121bf80eef2SRui Li======= 122bf80eef2SRui Li 123bf80eef2SRui Li打开 124bf80eef2SRui Li---- 125bf80eef2SRui Li 126bf80eef2SRui Li基于在配置空间中找到的AFU定义,AFU可能支持在多个内存上下文中工作,这种情况 127bf80eef2SRui Li下相关的字符设备可以被不同进程多次打开。 128bf80eef2SRui Li 129bf80eef2SRui Li 130bf80eef2SRui Liioctl 131bf80eef2SRui Li----- 132bf80eef2SRui Li 133bf80eef2SRui LiOCXL_IOCTL_ATTACH: 134bf80eef2SRui Li 135bf80eef2SRui Li 附加调用进程的内存上下文到AFU,以允许AFU访问其内存。 136bf80eef2SRui Li 137bf80eef2SRui LiOCXL_IOCTL_IRQ_ALLOC: 138bf80eef2SRui Li 139bf80eef2SRui Li 分配AFU中断,返回标识符。 140bf80eef2SRui Li 141bf80eef2SRui LiOCXL_IOCTL_IRQ_FREE: 142bf80eef2SRui Li 143bf80eef2SRui Li 释放之前分配的AFU中断。 144bf80eef2SRui Li 145bf80eef2SRui LiOCXL_IOCTL_IRQ_SET_FD: 146bf80eef2SRui Li 147bf80eef2SRui Li 将一个事件文件描述符和AFU中断关联,因此用户进程可以在AFU发送中断时收到通 148bf80eef2SRui Li 知。 149bf80eef2SRui Li 150bf80eef2SRui LiOCXL_IOCTL_GET_METADATA: 151bf80eef2SRui Li 152bf80eef2SRui Li 从卡中获取配置信息,比如内存映射IO区域的大小、AFU版本和当前上下文的进程 153bf80eef2SRui Li 地址空间ID(PASID)。 154bf80eef2SRui Li 155bf80eef2SRui LiOCXL_IOCTL_ENABLE_P9_WAIT: 156bf80eef2SRui Li 157bf80eef2SRui Li 允许AFU唤醒执行“等待”的用户空间进程。返回信息给用户空间,允许其配置AFU。 158bf80eef2SRui Li 注意这只在POWER9上可用。 159bf80eef2SRui Li 160bf80eef2SRui LiOCXL_IOCTL_GET_FEATURES: 161bf80eef2SRui Li 162bf80eef2SRui Li 报告用户空间可用的影响OpenCAPI的CPU特性。 163bf80eef2SRui Li 164bf80eef2SRui Li 165bf80eef2SRui Limmap 166bf80eef2SRui Li---- 167bf80eef2SRui Li 168bf80eef2SRui Li一个进程可以mmap每个进程的MMIO区域来和AFU交互。 169