1、背景介绍
公司搭建pcie调试平台,想要通过pcie桥片使各个pcie设备通过pcie桥片实现mem空间互相访问。由于zynq7000系列只能例化出一个pcie核,所以采用的方式是:zynq例化出pcie 的RC IP核,
通过8750pcie桥片,访问ep pcie设备(这里我们用的是pcie转sata接口板)。
这里的fpga逻辑工程搭建xilinx官方有标准的流程。具体参考
Zynq PCI Express Root Complex design in Vivado - FPGA Developer
Xilinx PCIe Root Port - Xilinx Wiki - Confluence
xilinx wiki 里面 的Xilinx_Answer_71494_ZC706_KC705.pdf 里面描述了很多相关问题。
我这里遇到的具体的问题就是 ,由于class code 没有手动输入,选择默认。导致后面无法给ep设备分配BAR空间。具体报错为Bar: no space for [mem size 0x100000000]
failed to assign [mem size 0x1000].
2、8750桥片设置
上边步骤完成,点对点pcie mem空间数据可以正常写入和读取。
下面主要说一下8750桥片的配置。通过上面配置我们可以正常访问到桥片。并且RC枚举的时候将桥片的每一个port都认为是一个ep设备。如下图所示
00:00.0 PCI bridge: Xilinx Corporation Device 7124
01:00.0 PCI bridge: PLX Technology, Inc. Device 8750 (rev ab)
02:00.0 PCI bridge: PLX Technology, Inc. Device 8750 (rev ab)
02:01.0 PCI bridge: PLX Technology, Inc. Device 8750 (rev ab)
02:02.0 PCI bridge: PLX Technology, Inc. Device 8750 (rev ab)
02:04.0 PCI bridge: PLX Technology, Inc. Device 8750 (rev ab)
02:08.0 PCI bridge: PLX Technology, Inc. Device 8750 (rev ab)
02:09.0 PCI bridge: PLX Technology, Inc. Device 8750 (rev ab)
02:0a.0 PCI bridge: PLX Technology, Inc. Device 8750 (rev ab)
06:00.0 SATA controller: Marvell Technology Group Ltd. Device 9215 (rev 11)
00:00.0 为我的RC,06:00.0为SATA设备。因为SATA设备是挂在8750桥片上,所以如果想访问SATA设备必须要通过8750桥片。注意桥片枚举完成之后的配置空间中的command 是0x100140即io访问和mem访问方式都被关闭掉。如下
01:00.0 PCI bridge: PLX Technology, Inc. Device 8750 (rev ab) (prog-if 00 [Normal decode])
Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr+ Stepping- SERR+ FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
这时我们需要手动的将i/o,mem打开
我们可以通过RC的CTL BAR空间访问所有bus上的devices的配置空间,并进行读写操作。
我这里的配置空间是0x80000000.所以01:00:00的配置空间地址是0x80100000.
root@xxx:~# devmem 0x80100004
0x00100140
root@xxx:~# devmem 0x80100004 0x100147
设置完成之后我们就可以通过桥片访问sata设备了。