文章目录
背景
本文是rshim 的深入解析第二篇。
对于Mellanox BF系列的DPU(Data Processing Unit,数据处理单元)卡,RShim,全称“Remote Shim”。提供了管理通道用来方便主机对DPU卡进行管理,如重置芯片、从外部启动 ARM、查看寄存器状态进行调试、提供串口访问以及提供 TCP/IP 接口(常用的tmpfifo_net的网络设备也是rshim提供的)。他在硬件上有一个专门的硬件单元。从RShim这个名字来看,设计者期望提供一个能够远程访问的很薄的一个垫片层(Shim),所以看待RShim应该抛开迷雾,关注数据流动,直击功能本质。
本文涉及到rshim的的部分代码机制机理介绍。
跟多参考兄弟篇文章:https://blog.youkuaiyun.com/essencelite/article/details/147670941
代码相关分析
关于rshim设备的黑名单
rshim设备黑名单指定后可以不开启映射rshim文件,具体在配置文件中设置。
支持黑名单模式,在rshim_blocked_dev_names中配置,在pcie扫描后在rshim_pcie_probe阶段,使用rshim_allow_device判断。如果在黑名单之中不创建。
rshim有配置文件
/etc/rshim.conf
比如指定rshim名字和pcie的映射关系,指定黑名单
rshim的映射3中模式
有uio vfio direct, 一般使用uio方式
rshim中前后端模式
rshim支持的寄存器
寄存器地址:
BF3的rshim的PCIe的bar空间的window size
可见大小是512K
另外BF2的是49行的 64K
rshim使用用户态PCIe库之后如何发起PCIe的TLP读取
直接使用pci_read_byte指定dev句柄以及配置空间的地址
bd->rev_id = pci_read_byte(pci_dev, PCI_REVISION_ID);
rshim中的虚拟控制通道
可见各个channel的操作地址是base地址+ channel上移16bit
rshim读取PCIe配置空间的方式
使用libpci提供的pci_cap_write,指定dev句柄,以及需要读取的cap地址和访问的地址
# 比如设置Set access width to 64 bits
pci_cap_write(pci_dev, MSN_GW_CR_64B_BOOT_ADDR, (addr >> 2));
所以rshim访问的本质是通过libpci提供的PCIe TLP报文收发能力,以及在rshim后端提供的MMIO地址进行访问控制,本质是走的TLP报文。
并且访问主体是rshim的backend,访问的几个函数是:
rshim使能pcie能力需要做的事情
说先rshim开启pcie enable是在启动rshim中期,是rshim初始化后选择PCIe模式,然后PCIe的 probe阶段的初始化前期,用来初始化用户态PCIe操作的相关的准备动作
rshim使用pcie进行操作,需要对pcie进行一些初始化,具体在rshim_pcie_enable
中。
rshim在进行内存mapping的处理策略
rshim会根据映射的机制来使用不同的策略,比如vfio会使用vfio的标准策略(比如打开"/dev/vfio/vfio",打开group,获取设备信息,然后mmap,pread pwrite配置,中断使能等。
rshim如何判断是否可以访问DPU的rshim
通过rshim_access_check函数来访问,使用的是read_rshim,channel是:RSHIM_CHANNEL
比如:
rshim是如何判断是否有多个rshim进程attach到DPU上的rshim资源的
rshim的console串口的一些配置与波特率
串口波特率的设置都在rshim fuse的初始化阶段。
波特率是115200
配置不同设备的ucse的用户态驱动fops:
比如BOOT:
比如console:
综述
rshim程序和DPU设备通信支持走PCIe或者USB链路,并且定义了多个虚拟channel,不同channel实现不同功能。假设是PCIe链路,则在用户态映射BAR空间,然后对mapping的地址进行读写。对于对外提供的boot、misc、console、rshim等文件,最终都调用backend的接口,写到不同的channel从而完成rshim的功能。