重置基于 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驱动调试