作者:Iris Yang,AMD工程师;来源:AMD开发者社区
本文将从硬件设计和驱动使用两个方面介绍基于CPM5 QDMA 的 Versal Tandem设计和 启动流程。
Versal QDMA 的两个PCIe 控制器都支持不同方式的Tandem (Tandem PROM • Tandem PCIe)。和其他系列的Tandem 选项一样,Tandem PROM是Tandem配置的简化模式,只是其中两个阶段都包含在同一个pdi 里面,用户可以把这个pdi 文件存到PROM 钟,系统会先配置CPM 然后再去配置其他部分这样就能比较容易的满足120ms 启动时间的要求。
而Tandem PCIe 则 更为复杂,它第二部分的加载基于PCIe 链路,在BD 设计中必须包含从CPM MASTER到 PMC slave的路径。而在PMC 中需要使用特定的加载到的接口 Slave Boot Interface(SBI),其位于AMD Versal设备地址0x102100000。
下面重点介绍Tandem PCIe的软硬件流程。
首先在CPM 生成界面选择 DMA , 把Tandem mode 选择为Tandem PCIE. 第二页选择QDMA 其他都可以用默认选项。
CIPS 的PCIE reset 复位选择和板上一致。
按照下图连接 BD, 需要连上复位 sys_reset , 连接NOC, 并且把CPM 的master 和PMC 的slave 连上, 按照下图把地址分配到
0x102100000 (slave boot stream), 这样QDMA 的传输目标地址就设置为从0x102100000 开始。NOC 另一侧可以连接BRAM 和其他需要的用户侧PL逻辑。
由于工具并不会自动拉低PL 的复位管脚所以用户必须写 XSDB (0xF1260330) 地址来拉低复位或者 把PL reset 管脚从CDO 中直接拉低并且重新生成PDI. 如果PL 的复位是在CIPS 外面的 你需要自己去控制这个复位保证加载完pdi2 后 PL 是可以工作的。
生成pdi 文件后 开始清除原来的驱动和加载新的驱动,以下为步骤。
首先可以通过JTAG 或者RPOM 的方式,把第一阶段的pdi 文件下载进去 并且重启主机。这个时候应该可以通过lspci 看到AMD Xilinx 的bdf。然后准备好驱动和应用程序并运行以下程序。
1. 获取最新的驱动程序, 驱动可以从网站下载: dma_ip_drivers/QDMA at master · Xilinx/dma_ip_drivers · GitHub
2. 从内核中删除旧模块(仅在必要时) $> rmmod qdma-pf
3. 编译驱动程序和应用程序。 $> make -DTANDEM_BOOT_SUPPORTED
4. 安装(复制)驱动程序和应用程序到标准位置。$> make install
5. 载入内核模块 #> modprobe qdma-pf
6. 产生H2C 的队列 $> dma-ctl qdma10000 q add idx 0 dir h2c mode mm
7. 启动 一个队列, aperture size 是4k $> dma-ctl qdma10000 q start idx 0 dir h2c aperture_size 4096
8. 传输pdi2 , 这里的大小和名字需要按照实际情况修改 $> dma-ctl qdma10000_MM_0-f design_wrapper.pdi -s 1384992 -a 0x102100000
9. 卸载驱动冲i性能加载驱动重复2-5
10. 用xsdb 去写o 0xF1260330 如果 pl_reset 连到了stag2 的逻辑上 如果没有这步可以省略
11. 完成其他测试 ,比如 BD design 后面连了ddr 或者bram 可以用 dma_to_device 来测试PL 是否能正确接收数据。