1、驱动源码路径和驱动框架
git路径:GitHub - RapidIO/kernel-rapidio: Kernel for RapidIO
驱动框架:
rapidio.ko rapidio总线核心,包括:rio.c rio-access.c rio-driver.c rio-sysfs.c
tsi721_mport.ko tsi721芯片的设备驱动 ,包括:tsi721.c tsi721_dma.c
rio_mport_cdev.ko 创建/dev/rio_mport0 字符设备文件,字符驱动
rio-scan.ko 枚举设备的驱动
rio_cm.ko dma传输时通道的选择,一般不会用到
rionet.ko rapidio的网络传输驱动
switches/idt_gen2.ko 交换桥片的驱动
2、驱动编译问题
驱动源码是根据内核版本为4.* 进行开发的,如果要使用内核版本为5.*以及更高版本,要进行代码修改。
驱动编译报错如图:
解决方法:
3、驱动加载参数
rapidio 用于两个主板A、B,进行通信,分为主板和副板,主板负责枚举,副板负责发现,先发现后枚举。
主板A:
insmod rapidio.ko hdid=0 #主板加载驱动,设置hdid=0
insmod tsi721_mport.ko dbg_level=0xff mbox_sel=0xf dma_sel=0x7f pcie_mrrs=5 dma_txqueue_sz=4096 dma_desc_per_channel=4096
insmod idt_gen2.ko
insmod rio-scan.ko
insmod rio_mport_cdev.ko rio_res_mem=0x40000000 rio_res_size=0x10000000
insmod rio_cm.ko
副板B:
insmod rapidio.ko hdid=-1 #副板加载驱动,设置hdid=-1
insmod tsi721_mport.ko dbg_level=0 mbox_sel=0xf dma_sel=0x7f pcie_mrrs=5 dma_txqueue_sz=4096 dma_desc_per_channel=4096
insmod idt_gen2.ko
insmod rio-scan.ko
4、加载驱动后,枚举连接
主板A:
insmod rionet.ko
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
sysctl -w net.ipv4.tcp_timestamps=0
sysctl -w net.ipv4.tcp_sack=0
sysctl -w net.core.netdev_max_backlog=250000
#set mtu
filerapidio=`ls /sys/class/rapidio_port/ -t |head -n1|awk '{print $0}'`
#echo $filerapidio
networkport=`ls /sys/class/rapidio_port/$filerapidio/net/ -t |head -n1 |awk '{print $0}'`
#echo $networkport
MTU=920
echo $MTU > /sys/class/net/$networkport/mtu
echo "the MTU of $networkport is $MTU"
副板B:
insmod rio_mport_cdev.ko rio_res_mem=0x40000000 rio_res_size=0x10000000
insmod rio_cm.ko
#mdev -s
insmod rionet.ko
#mdev -s
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
sysctl -w net.ipv4.tcp_timestamps=0
sysctl -w net.ipv4.tcp_sack=0
sysctl -w net.core.netdev_max_backlog=250000
#set mtu
filerapidio=`ls /sys/class/rapidio_port/ -t |head -n1|awk '{print $0}'`
#echo $filerapidio
networkport=`ls /sys/class/rapidio_port/$filerapidio/net/ -t |head -n1 |awk '{print $0}'`
#echo $networkport
MTU=920
echo $MTU > /sys/class/net/$networkport/mtu
echo "the MTU of $networkport is $MTU"
注意:
先在副板上执行 echo -1 > /sys/bus/rapidio/scan ,进行发现,再在主板A上执行 echo -1 > /sys/bus/rapidio/scan ,进行枚举;这个过程需要等待几秒钟;
5、DMA测试
rapidio 的DMA测试分为读端和写端,不分主板和副板;
-读取0x60 寄存器的值,为枚举之后的本地的ID
命令:./rio_test_misc -M 0 -O 0x60
-读端命令:./rio_test_dma -M 0 -I 0x200000 -R 0x2000000
-写端命令:./rio_test_dma -M 0 -D 0x1 -S 0x200000 -A 0x2000000 -d -T 10
注意:rio_test_dma.c 这个测试源代码已经限制 数据一次 传输的 大小为 2M,如果需要增大需要修改测试源码;
6、性能调优 and 问题解决
-、操作系统的内存管理,即伙伴系统会限制最大的连续内存申请,需要调整页大小4K/16K和内核的配置文件中CONFIG_FORCE_MAX_ZONEORDER=11;
-、内存预留的方式
1、在grub中增加:mem=12G ,预留出高端内存;
2、insmod rio_mport_cdev.ko rio_res_mem=? 加载驱动是指定内存物理地址
3、测试命令上增加 -L 物理地址