重置基于 FPGA 的 PCIe 卡并恢复其配置空间

Posted

技术标签:

【中文标题】重置基于 FPGA 的 PCIe 卡并恢复其配置空间【英文标题】:Reset FPGA based PCIe card and restore its Config Space 【发布时间】:2014-03-05 16:22:09 【问题描述】:

我正在调整基于 FPGA 的 PCIe 卡的 Windows / Linux 驱动程序。 (使用带有 PCIe 端点的 LatticeECP3) 我需要添加一个驱动程序功能以允许主机驱动的比特流更新 FPGA 无需重启主机

即闪烁后,我需要重置 FPGA 以重新加载比特流。 这当然会导致 PCIe 端点的 Config Space 设置丢失。

我的第一个方法是实施以下步骤:

    保存 PCIe 的 PCI 配置空间。 通过电源管理功能使设备进入睡眠模式。 通过电源管理功能唤醒设备。这将触发 FPGA 重置。 恢复 PCI 配置空间。

我的问题:

    Q1:对于在 Windows 上运行的 PCIe 设备,这是一个受支持的用例吗? 7 / Linux 主机平台? Q2:什么是合适的关键字来查找文档或 关于这个用例的编码示例。

【问题讨论】:

【参考方案1】:

在 Widows 上,您需要通过设备管理器“禁用/启用”,但以编程方式。因此,您的 PCIe 设备将被 Windows 重新枚举,并且 PCI cfg 空间将获得正确的值(不一定与“禁用”之前相同)。

SetupDiChangeState() 是您的朋友,它完全满足您的需求。查看 Windows 驱动程序开发工具包中的 DevCon 示例。它展示了如何编写代码(该示例展示了很多除了禁用/启用之外的好东西,我相信你会喜欢的 :))。

您需要注意的一点是:如果重新刷新 PCIe 端点后需要更大的内存资源,则可能需要更改系统范围内的 PCIe 内存资源平衡,在这种情况下,最简单的方法是重新启动。简而言之,避免由于重新刷新而调整内存资源的大小。

在 Linux 上,这并不容易。用户模式关键字是“Linux hotplug 子系统”。内核模式关键字包括 pci_enable_device() 和 pci_disable_device()。也许这个链接会有所帮助:How can the linux kernel be forced to enumerate the PCI-e bus?

【讨论】:

以上是关于重置基于 FPGA 的 PCIe 卡并恢复其配置空间的主要内容,如果未能解决你的问题,请参考以下文章

RK3399+PCIe+FPGA 在高速AD无线通信中的应用

XILINX K7 FPGA+RK3399 PCIE驱动调试

Notes18检查FPGA版本,检查PCIE

Xilinx Kintex-7 FPGA K7 XC7K325T板卡6兄弟

FPGA实战操作 -- PCIe总线(例程设计分析)

基于XC7K325T处理器的PCIE光纤卡2路光纤卡