前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【经验分享】AMD MPSoC PS PCIe 访问PL BRAM的参考设计

【经验分享】AMD MPSoC PS PCIe 访问PL BRAM的参考设计

作者头像
hankfu
发布2024-06-28 09:09:31
450
发布2024-06-28 09:09:31
举报
文章被收录于专栏:hankhank

AMD MPSoC PS PCIe 访问PL BRAM的参考设计

测试环境:

Vivado 2024.1, Vitis Classic 2024.1, Avnet UltraZed Board. AMD R2544 Board, Ubuntu 20.04

客户需求

客户要求AMD MPSoC 的 PS 部分的 PCIe 能访问 PL的AXI BRAM。

Vivado设计

从Avnet 借了 UltraZed Board,得到了Vivado工程。设置BRAM大小为64KB。为了验证PL的AXI BRAM,在Block Design中增加了System ILA。

Block Design
Block Design

其它部分,没有更改。其中PCIe 的Serdes设置如下:

![PCIe 的Serdes设置(https://img2024.cnblogs.com/blog/1853605/202406/1853605-20240627171245296-1267205126.png)

PCIe 的参考时钟设置如下:

PCIe 的参考时钟
PCIe 的参考时钟

PCIe 的设备类型、IO BAR、中断设置如下:

PCIe 的设备类型
PCIe 的设备类型
PCIe 的IO BAR 0
PCIe 的IO BAR 0
PCIe 的IO BAR 1
PCIe 的IO BAR 1
PCIe 的IO BAR 2
PCIe 的IO BAR 2
PCIe 的中断
PCIe 的中断

编译Vivado工程,导出XSA文件。

AMD MPSoC 软件

得到XSA文件后,在Vitis Classic 2024.1 里以“Hello World”为模板创建工程,删除“hellworld.c”。

再把目录“Xilinx\Vitis\2024.1\data\embeddedsw\XilinxProcessorIPLib\drivers\pciepsu_v1_7\examples”中的文件“xpciepsu_ingress_ep_enable_example.c”复制到工程中。编译System工程,得到对应的ELF文件和启动文件BOOT.BIN。

编译后的文件结构如下。

MPSoC 软件文件结构
MPSoC 软件文件结构

把启动文件BOOT.BIN,复制到TF卡,插入UltraZed Board,单板能正常启动。

X86 R2544 Ubuntu 20 软件

从github复制代码

代码语言:javascript
复制
git clone git@github.com:Xilinx/zynqmp-pspcie-epdma.git

按README.md编译。编译命令:

代码语言:javascript
复制
        cd zynqmp_ep_ps_pcie_dma
        make
        sudo make insert

编译日志:

代码语言:javascript
复制
xilinx@xilinx-Bilby-RV1:~/zynqmp-pspcie-epdma$ uname -a
Linux xilinx-Bilby-RV1 5.15.0-113-generic #123~20.04.1-Ubuntu SMP Wed Jun 12 17:33:13 UTC 2024 x86_64 x86_6GNU/Linux
xilinx@xilinx-Bilby-RV1:~/zynqmp-pspcie-epdma$ make
Compiling PS PCIe DMA Driver
make[1]: Entering directory '/home/xilinx/zynqmp-pspcie-epdma/driver'
make  -C /lib/modules/5.15.0-113-generic/build M=/home/xilinx/zynqmp-pspcie-epdma/driver  SUBDIRS= modules
make[2]: Entering directory '/usr/src/linux-headers-5.15.0-113-generic'
  CC [M]  /home/xilinx/zynqmp-pspcie-epdma/driver/ps_pcie_dma.o
   ......
   ......
   ......
  CC [M]  /home/xilinx/zynqmp-pspcie-epdma/driver/ps_pcie_dma.mod.o
  LD [M]  /home/xilinx/zynqmp-pspcie-epdma/driver/ps_pcie_dma.ko
  BTF [M] /home/xilinx/zynqmp-pspcie-epdma/driver/ps_pcie_dma.ko
Skipping BTF generation for /home/xilinx/zynqmp-pspcie-epdma/driver/ps_pcie_dma.ko due to unavailability of
make[2]: Leaving directory '/usr/src/linux-headers-5.15.0-113-generic'
make[1]: Leaving directory '/home/xilinx/zynqmp-pspcie-epdma/driver'
***** Driver Compiled *****
Compiling Test Applications
make[1]: Entering directory '/home/xilinx/zynqmp-pspcie-epdma/apps'
gcc  -c -O3 -Os -I /home/xilinx/zynqmp-pspcie-epdma -I ../common/ sync_test.c -o sync_test.o
gcc  -O3 -Os -I /home/xilinx/zynqmp-pspcie-epdma sync_test.o -lpthread -o simple_test
gcc  -c -O3 -Os -I /home/xilinx/zynqmp-pspcie-epdma -I ../common/ pci_pio_test.c -o pci_pio_test.o
gcc  -O3 -Os -I /home/xilinx/zynqmp-pspcie-epdma pci_pio_test.o -lpthread -o pio_test
make[1]: Leaving directory '/home/xilinx/zynqmp-pspcie-epdma/apps'
***** Applications Compiled *****
xilinx@xilinx-Bilby-RV1:~/zynqmp-pspcie-epdma$ find -name "*.ko"
./driver/ps_pcie_dma.ko

安装驱动后,内核输出内容:

代码语言:javascript
复制
xilinx@xilinx-Bilby-RV1:~/zynqmp-pspcie-epdma$ sudo make insert
[sudo] password for xilinx:
Inserting PS PCIe DMA Driver
***** Driver Loaded *****

xilinx@xilinx-Bilby-RV1:~/zynqmp-pspcie-epdma$ dmesg | tail -n 30
......
......
[ 6011.393878] ps_pcie_dma: loading out-of-tree module taints kernel.
[ 6011.393942] ps_pcie_dma: module verification failed: signature and/or required key missing - tainting ke
[ 6011.394437] ps_pcie_dma init()
[ 6011.394491] ps_pcie_dma 0000:01:00.0: PS PCIe DMA PCIe Driver probe
[ 6011.394625] ps_pcie_dma 0000:01:00.0: PS PCIe DMA PCIe 64bit access capable
[ 6011.475001] ps_pcie_dma 0000:01:00.0: MSI/MSI-X not detected - using legacy interrupts
[ 6011.475304] ps_pcie_dma 0000:01:00.0: PS PCIe DMA driver successfully probed

安装驱动后,设备节点信息:

代码语言:javascript
复制
xilinx@xilinx-Bilby-RV1:~/zynqmp-pspcie-epdma$ ls /dev/ps_pcie_* -l
crwxrwxrwx 1 root root 510, 0 6月  27 15:55 /dev/ps_pcie_dmachan0_0
crwxrwxrwx 1 root root 510, 1 6月  27 15:55 /dev/ps_pcie_dmachan1_0
crwxrwxrwx 1 root root 510, 2 6月  27 15:55 /dev/ps_pcie_dmachan2_0
crwxrwxrwx 1 root root 510, 3 6月  27 15:55 /dev/ps_pcie_dmachan3_0
crwxrwxrwx 1 root root 509, 0 6月  27 15:55 /dev/ps_pcie_pio_0

X86 R2544 Ubuntu 20.04 测试

运行命令“simple_test”,能发起DMA访问16KB和64KB数据。注意,通过参数“-a 0x80000000”指定PL BRAM的地址。

代码语言:javascript
复制
xilinx@xilinx-Bilby-RV1:~/zynqmp-pspcie-epdma/apps$  ./simple_test -c 0 -a 0x80000000 -l 16384 -d s2c
write return value is 16384
Total time taken for transferring 16384 bytes of data is 115 micro seconds
xilinx@xilinx-Bilby-RV1:~/zynqmp-pspcie-epdma/apps$  ./simple_test -c 0 -a 0x80000000 -l 65536 -d s2c
write return value is 65536
Total time taken for transferring 65536 bytes of data is 271 micro seconds

通过System ILA,可以看到单板硬件上有AXI访问波形。

运行命令“simple_test”,访问64KB+8Byte数据,由于超过了BRAM大小(64KB),就会挂死系统,程序一直不结束。这是正常的。

代码语言:javascript
复制
xilinx@xilinx-Bilby-RV1:~/zynqmp-pspcie-epdma/apps$ ./simple_test -c 0 -a 0x80000000 -l 131072 -d s2c
^C^C

可以添加AXI Firewall检查超时的AXI访问,并自动结束,从而避免上述情况。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 测试环境:
  • 客户需求
  • Vivado设计
  • AMD MPSoC 软件
  • X86 R2544 Ubuntu 20 软件
  • X86 R2544 Ubuntu 20.04 测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档