Quartus DMA IP示例使用说明--MM接口
Quartus DMA IP示例使用说明--MM接口
- 1 文件说明
- 2 下载测试
本文主要介绍Quartus DMA IP示例的使用方法。
1 文件说明
信号 | 方向 | 说明 |
---|---|---|
refclk0 | input | PCIe参考时钟0 |
refclk1 | input | PCIe参考时钟1 |
pin_perst_n | input | PCIe复位 |
rx_xxx | input | PCIe数据接收引脚 |
tx_xxx | output | PCIe数据发送引脚 |
ninit_done | input | FPGA就绪信号,0表示就绪 |
app_clk | output | 用户时钟,Gen3: 250MHz;Gen4: 400 MHz;500MHz |
app_rst_n | output | 用户复位 |
rx_pio_xxxx | inout | Bypass接口相关信号 |
p1_bam_xxx | inout | MM接口相关信号 |
信号 | 方向 | 说明 |
---|---|---|
p1_bam_waitrequest_i | input | H2D等待信号 |
p1_bam_write_o | output | H2D写信号 |
p1_bam_address_o | output | H2D写地址 |
p1_bam_burstcount_o | output | H2D写突发计数 |
p1_bam_writedata_o | output | H2D写数据 |
p1_bam_byteenable_o | output | H2D写位使能 |
p1_bam_read_o | output | D2H读信号 |
p1_bam_readdatavalid_i | input | D2H读数据有效 |
p1_bam_readdata_i | input | D2H读数据 |
virt-host-validate | grep IOMMU #检测系统是否使能IOMMU
sudo apt-get install libvirt-clients #如果提示virt-host-validate: command not found时执行
#Ubuntu系统下修改/etc/default/grub文件
GRUB_CMDLINE_LINUX="default_hugepagesz=1G hugepagesz=1G hugepages=20 \
intel_iommu=on iommu=pt panic=1 quiet splash vt.handoff=7"
#Centos系统下在GRUB_CMDLINE_LINUX下添加下述语句
default_hugepagesz=1G hugepagesz=1G hugepages=40 panic=1 intel_iommu=on iommu=pt
ls -al /sys/firmware/efi #检测系统是否为efi,如果该目录存在,则是
grub-mkconfig -o /boot/efi/EFI/ubuntu/grub.cfg #Ubuntu生成grub配置文件
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg #Centos生成grub配置文件
2 下载测试
下载程序,重启系统,检测PCIe设备,1172为Intel的Verdor ID,可以在DMA IP的设置界面进行设置,0000:a6:00.0为PCIe的BDF号,示例工程里有两个BAR,映射之后的物理地址分别为38017f800000和38017fc00000,设备分配给了node1。
cat /proc/cmdline #验证上述修改是否生效
echo 40 > /proc/sys/vm/nr_hugepages #设置hugepages
virt-host-validate | grep IOMMU #再次检测系统是否使能IOMMU
lscpu | grep NUMA #检测CUP数,如果是一个,则跳过下述设置
cat /sys/class/pci_bus/0000:a6/device/numa_node #检测设备分配给了哪个CPU
echo 40> /sys/devices/system/node/node1/hugepages/hugepages-1048576kB/nr_hugepages #使能设备对应node的hugepages
#define THREAD_SEQ "0-15" #根据设备分配修改software/user/cli/perfq_app/perfq_app.h文件中的宏定义
执行下述步骤进行相关驱动和应用的编译和安装,安装完成后可以在系统中检测到uio和ifc_uio驱动,PCIe设备正在使用的内核驱动为ifc_uio,/dev下有uio的设备
modprobe uio #安装uio驱动
cd software/kernel #编译安装mcdma内核驱动
make clean all -C driver/kmod/mcdma-custom-driver
insmod driver/kmod/mcdma-custom-driver/ifc_uio.ko
lspci -d 1172:000 -v | grep ifc_uio #验证驱动是否加载(Kernel driver in use: ifc_uio)
cd software/user #编译安装用户空间库
make clean all -C libmqdma/
cp libmqdma/libmqdmasoc.so /usr/local/lib
ldconfig -v | grep libmqdmasoc.so #验证是否已包含库函数
cd software/user/cli/perfq_app/ #编译应用
make clean && make all
./perfq_app -h #查看说明,或者直接查看readme文件
使用devmem2对设备进行读写测试,需要uio和ifc_uio驱动都加载成功后才能完成读写操作,首先对0x38017f800000的存储空间进行读写操作,写到第二个512bit处,地址增加0x40,测试结果如下。监测mm_interconnect_0的输入输出信号,slave端首先接收到主机的写请求和写数据,master端将数据写入bam_mm_1。然后slave端接受到一个读请求,master端发起一个读请求,从bam_mm_1中读出数据,slave端将数据返回主机
然后对0x38017fc00000的存储空间进行读写操作,执行过程一致,测试结果如下图所示。
仅执行读操作的测试结果如下。
执行./perfq_app -b 0000:a6:00.0 -o
进行PIO测试,输出下图所示信息表明测试通过
执行下述语句进行AVMM DMA接口的环回测试
cd software/user/cli/devmem #进行IP复位,可以在每次测试前执行复位
make clean all
./devmem 0000:a6:00.0 0 0x00200120 0x1
#define PCIe_SLOT 0 /* 0 - x16, 1 - x8 */ #根据实际配置修改user/common/include/ifc_libmqdma.h文件下的宏定义
./perfq_app -b 0000:a6:00.0 -p 32768 -l 5 -u -c 2 -d 2 -a 4 #进行DMA测试,-u为双向测试,-t为发送测试,-r为接收测试