PCIe 复位简介
PCI Express 是一种即插即用协议,主机在启动时将枚举 PCIe 设备。此过程包括主机从读取请求中获得每个设备的地址大小,然后为设备分配基地址。因此,PCIe 接口必须在主机查询时准备就绪,否则将不会分配基地址。PCI Express 规范规定,PERST# 必须在系统电源正常后 100 毫秒内解除,并且 PCI Express 端口必须在 PERST# 解除后不超过 20 毫秒内准备好进行 Link training。这通常称为 100 毫秒启动时间要求。
对 CIPS 进行配置
首先进入 CIPS 的 CPM 界面,选择所需要的 PCIe 配置,如图 1 所示,本设计的采用的是 gen4x4(Link speed 和 Lane Width 用户可根据自己的需求进行配置),Mode 必须要选择 DMA 模式。
图 1
然后点击 CPM5 PCIe Controller 0,在 Basic 界面,如图2所示,将 Function mode 选择为 AXI bridge。Device/ Port Type 选择为 Root Port of PCE Express Root Complex,其他界面可以应用默认配置。
图 2
接下来需要对 PS PMC 进行配置,其他的配置页面不进行过多描述,详细可以参考 CPM RP 的 Example design,本篇文章主要对 IO 界面的配置进行描述。因为在 PCIe 做 RP 时,需要控制与其连接的 EP,对于不同的系统架构难以设计出一个普遍可行的方案,故 RP 的驱动在目前的版本并未对复位进行操作,PS PR 的驱动可在下面链接中获取:
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/85983409/Xilinx+PCIe+Root+and+EndPoint
本篇文章通过举例来说明,用户如何根据自己的硬件电路设计来实现对 EP 端复位的控制,如下图 3 所示,MIO38 为 PCB 板上金手指 Perst 所连的 Pin 脚,此时在 PS PCM 页面中不要将此管脚配置成 PCIe reset 管脚,而是需要将此管脚按照下图 4 配置为 GPIO 管脚。GPIO 管脚的配置如图 4 所示,Direction 配置为 Out,并设置为 PULL DOWN。
图 3
图 4
除了 CIPS 的配置需要注意之外,LPD_AXI_NOC_0 和 PMC_NOC_AXI_0两个接口需要连通到 NOC_CPM_PCIE_0,如果 LPD_AXI_NOC_0 和 PMC_NOC_AXI_0 这两个接口没有连通到 NOC_CPM_PCIE_0,那么此时 CPU 对 PCIE 的链路情况无感知,其会在 Petalinux 中打印 PCIe link down,即使用户根据本篇文章对复位进行了配置,在 PCIe debugger 中看到 LTSSM 已进入 L0,并且 PCIe 的 Link up 信号已拉高,因为 CPU 与 PCIE 之间的链路没有打通,CPU 无法感知到 PCIE 的状态依然会显示 PCIe Link down。
图 5
在 Load Petalinux 的 Image 之前,需要运行指令 gpio set 38,如下图 6 所示,这个指令是将 PCIe 的复位拉高,因为在 CIPS 中,是将复位 MIO38 配置成 Pull down,在此状态下 PCIe 处于复位状态,所以在 Load image 前需要将复位拉高,使得双端进入 Link training 状态,在运行 Petalinux 时,会显示 PCIe link up,接下来会完成 PCIE 的整个枚举流程。
图 6