.. SPDX-License-Identifier: GPL-2.0 .. include:: ../../disclaimer-zh_CN.rst :Original: Documentation/userspace-api/accelerators/ocxl.rst :翻译: æŽç¿ Rui Li <me@lirui.org> ===================================== OpenCAPI ï¼ˆå¼€æ”¾ç›¸å¹²åŠ é€Ÿå™¨å¤„ç†å™¨æŽ¥å£ï¼‰ ===================================== *OpenCAPI: Open Coherent Accelerator Processor Interface* OpenCAPI是处ç†å™¨å’ŒåŠ 速器之间的一个接å£ï¼Œè‡´åŠ›äºŽè¾¾åˆ°ä½Žå»¶è¿Ÿå’Œé«˜å¸¦å®½ã€‚该规范 ç”± `OpenCAPI Consortium <http://opencapi.org/>`_ å¼€å‘。 它å…è®¸åŠ é€Ÿå™¨ï¼ˆå¯ä»¥æ˜¯FPGAã€ASICç‰ï¼‰ä½¿ç”¨è™šæ‹Ÿåœ°å€è¿žè´¯åœ°è®¿é—®ä¸»æœºå†…å˜ã€‚一个OpenCAPI 设备也å¯ä»¥æ‰˜ç®¡å®ƒè‡ªå·±çš„内å˜ï¼Œå¹¶å¯ä»¥ç”±ä¸»æœºè®¿é—®ã€‚ OpenCAPI在Linuxä¸ç§°ä¸ºâ€œocxlâ€ï¼Œå®ƒä½œä¸ºâ€œcxlâ€ï¼ˆç”¨äºŽpowerpcçš„IBM CAPI接å£çš„驱动)的 开放ã€å¤„ç†å™¨æ— 关的演进,这么命å是为了é¿å…与ISDN CAPIå系统相混淆。 高层视角 ======== OpenCAPI定义了一个在物ç†é“¾è·¯å±‚上实现的数æ®é“¾è·¯å±‚(TLï¼‰å’Œä¼ è¾“å±‚ï¼ˆTL)。任何 实现DLå’ŒTL的处ç†å™¨æˆ–者设备都å¯ä»¥å¼€å§‹å…±äº«å†…å˜ã€‚ :: +-----------+ +-------------+ | | | | | | | Accelerated | | Processor | | Function | | | +--------+ | Unit | +--------+ | |--| Memory | | (AFU) |--| Memory | | | +--------+ | | +--------+ +-----------+ +-------------+ | | +-----------+ +-------------+ | TL | | TLX | +-----------+ +-------------+ | | +-----------+ +-------------+ | DL | | DLX | +-----------+ +-------------+ | | | PHY | +---------------------------------------+ Processor:处ç†å™¨ Memoryï¼šå†…å˜ Accelerated Function Unitï¼šåŠ é€Ÿå‡½æ•°å•å…ƒ 设备å‘现 ======== OpenCAPIä¾èµ–一个在设备上实现的与PCI类似的é…ç½®ç©ºé—´ã€‚å› æ¤ä¸»æœºå¯ä»¥é€šè¿‡æŸ¥è¯¢ é…置空间æ¥å‘现AFU。 OpenCAPI设备在Linuxä¸è¢«å½“作类PCI设备(有一些注æ„事项)。固件需è¦å¯¹ç¡¬ä»¶è¿›è¡Œ 抽象,就好åƒå®ƒæ˜¯ä¸€ä¸ªPCI链路。许多已有的PCI架构被é‡ç”¨ï¼šåœ¨æ¨¡æ‹Ÿæ ‡å‡†PCI时, 设备被扫æ并且BAR(基å€å¯„å˜å™¨ï¼‰è¢«åˆ†é…。åƒâ€œlspciâ€çš„å‘½ä»¤å› æ¤å¯ä»¥è¢«ç”¨äºŽæŸ¥çœ‹ 哪些设备å¯ç”¨ã€‚ é…置空间定义了å¯ä»¥åœ¨ç‰©ç†é€‚é…器上å¯ä»¥è¢«æ‰¾åˆ°çš„AFU,比如它的åå—ã€æ”¯æŒå¤šå°‘内 å˜ä¸Šä¸‹æ–‡ã€å†…å˜æ˜ å°„IO(MMIO)区域的大å°ç‰ã€‚ MMIO ==== OpenCAPI为æ¯ä¸ªAFU定义了两个MMIO区域: * 全局MMIO区域,ä¿å˜å’Œæ•´ä¸ªAFU相关的寄å˜å™¨ã€‚ * æ¯ä¸ªè¿›ç¨‹çš„MMIO区域,对于æ¯ä¸ªä¸Šä¸‹æ–‡å›ºå®šå¤§å°ã€‚ AFUä¸æ– ======= OpenCAPI拥有AFUå‘主机进程å‘é€ä¸æ–çš„å¯èƒ½æ€§ã€‚å®ƒé€šè¿‡å®šä¹‰åœ¨ä¼ è¾“å±‚çš„â€œintrp_req†æ¥å®Œæˆï¼ŒæŒ‡å®šä¸€ä¸ªå®šä¹‰ä¸æ–çš„64ä½å¯¹è±¡å¥æŸ„。 驱动å…许一个进程分é…ä¸æ–并获å–å¯ä»¥ä¼ 递给AFUçš„64ä½å¯¹è±¡å¥æŸ„。 å—符设备 ======== 驱动为æ¯ä¸ªåœ¨ç‰©ç†è®¾å¤‡ä¸Šå‘现的AFU创建一个å—符设备。一个物ç†è®¾å¤‡å¯èƒ½æ‹¥æœ‰å¤šä¸ª 函数,一个函数å¯ä»¥æ‹¥æœ‰å¤šä¸ªAFU。ä¸è¿‡ç¼–写这篇文档之时,åªå¯¹å¯¼å‡ºä¸€ä¸ªAFU的设备 测试过。 å—符设备å¯ä»¥åœ¨ /dev/ocxl/ ä¸è¢«æ‰¾åˆ°ï¼Œå…¶å‘½å为: /dev/ocxl/<AFU å称>.<ä½ç½®>.<索引> <AFU å称> 是一个最长20个å—符的å称,和在AFUé…置空间ä¸æ‰¾åˆ°çš„相åŒã€‚ <ä½ç½®>ç”±é©±åŠ¨æ·»åŠ ï¼Œå¯åœ¨ç³»ç»Ÿæœ‰ä¸æ¢ä¸€ä¸ªç›¸åŒçš„OpenCAPI设备时帮助区分设备。 <索引>也是为了在少è§æƒ…况下帮助区分AFU,å³è®¾å¤‡æºå¸¦å¤šä¸ªåŒæ ·çš„AFU副本时。 Sysfsç±» ======= æ·»åŠ äº†ä»£è¡¨AFUçš„ocxl类。查看/sys/class/ocxl。布局在 Documentation/ABI/testing/sysfs-class-ocxl ä¸æ述。 用户API ======= 打开 ---- 基于在é…置空间ä¸æ‰¾åˆ°çš„AFU定义,AFUå¯èƒ½æ”¯æŒåœ¨å¤šä¸ªå†…å˜ä¸Šä¸‹æ–‡ä¸å·¥ä½œï¼Œè¿™ç§æƒ…况 下相关的å—符设备å¯ä»¥è¢«ä¸åŒè¿›ç¨‹å¤šæ¬¡æ‰“开。 ioctl ----- OCXL_IOCTL_ATTACH: é™„åŠ è°ƒç”¨è¿›ç¨‹çš„å†…å˜ä¸Šä¸‹æ–‡åˆ°AFU,以å…许AFU访问其内å˜ã€‚ OCXL_IOCTL_IRQ_ALLOC: 分é…AFUä¸æ–ï¼Œè¿”å›žæ ‡è¯†ç¬¦ã€‚ OCXL_IOCTL_IRQ_FREE: 释放之å‰åˆ†é…çš„AFUä¸æ–。 OCXL_IOCTL_IRQ_SET_FD: 将一个事件文件æ述符和AFUä¸æ–å…³è”ï¼Œå› æ¤ç”¨æˆ·è¿›ç¨‹å¯ä»¥åœ¨AFUå‘é€ä¸æ–时收到通 知。 OCXL_IOCTL_GET_METADATA: 从å¡ä¸èŽ·å–é…置信æ¯ï¼Œæ¯”如内å˜æ˜ å°„IO区域的大å°ã€AFU版本和当å‰ä¸Šä¸‹æ–‡çš„进程 地å€ç©ºé—´ID(PASID)。 OCXL_IOCTL_ENABLE_P9_WAIT: å…许AFU唤醒执行“ç‰å¾…â€çš„用户空间进程。返回信æ¯ç»™ç”¨æˆ·ç©ºé—´ï¼Œå…许其é…ç½®AFU。 注æ„è¿™åªåœ¨POWER9上å¯ç”¨ã€‚ OCXL_IOCTL_GET_FEATURES: 报告用户空间å¯ç”¨çš„å½±å“OpenCAPIçš„CPU特性。 mmap ---- 一个进程å¯ä»¥mmapæ¯ä¸ªè¿›ç¨‹çš„MMIO区域æ¥å’ŒAFU交互。