作者:Iris Yang,AMD工程师;文章来源:AMD开发者社区
在基于 AMD FPGA 的 PCIe 解决方案中,Tandem PCIe 常用于缩短系统上电后的链路建立时间。在实际项目中, Windows 驱动适配过程中需要注意一个兼容性问题。(此问题在Linux 中不存在)本文对该问题进行简要分析,并给出解决建议,供相关开发人员参考。
问题描述
在如下环境中进行测试:
. 基于 Tandem PCIe 的设计
. Windows 操作系统
. 使用官方提供的示例驱动 https://adaptivesupport.amd.com/s/article/64761?language=en_US
在 Virtex UltraScale+ 平台上观察到:
. PCIe 链路可以正常建立
. 驱动能够正常加载
. 但在进行 MCAP 访问时,配置操作未生效, 比如出现下列错误
Writefile failed;[31],A device attached to the system is not functioning
该问题在 Virtex UltraScale 平台上未出现。
原因分析
问题与 MCAP 在 PCIe 配置空间中的偏移地址差异有关。
不同架构对应关系如下:
|
架构 |
MCAP 配置空间偏移 |
|
UltraScale |
0x340 |
|
UltraScale+ |
0x350 |
当前 Windows 示例驱动中,对 MCAP 偏移地址采用了固定值(0x340),该设置适用于 UltraScale 架构,但在 UltraScale+ 平台上将导致访问错误的配置空间地址,从而引发 MCAP 操作失败。Linux 驱动采用了更加灵活的方式可以自动识别器件并使用不同的地址。
UltraScale PG156:

UltraScale+ PG213:

处理方法
针对 UltraScale+ 平台,可通过以下方式进行适配:
修改驱动中的 MCAP 偏移地址
将mcapInit.c 中:
DevExt->MCAP_Register_Base = 0x340
改成
DevExt->MCAP_Register_Base = 0x350
完成修改后,重新编译并加载驱动,经验证 MCAP 功能可恢复正常。
工程建议
从工程实现角度,建议避免在驱动中使用固定偏移地址,可考虑以下优化方式:
1. 基于设备信息进行区分
通过 PCIe Device ID 或相关标识,识别当前 FPGA 架构,并动态选择对应的 MCAP 偏移地址。
2. 参数化配置
将 MCAP 偏移设计为可配置参数,以便在不同平台或版本间复用驱动代码。
注意事项
. 驱动修改后需符合 Windows 驱动签名要求
. 不同工具版本(Vivado/IP)可能存在差异,建议结合实际设计验证
. 建议同时确认 BAR 映射及访问路径配置正确
总结
在 Tandem PCIe 应用中,不同 FPGA 架构间的细节差异可能影响驱动行为。
本案例中:UltraScale 与 UltraScale+ 在 MCAP 配置空间偏移上的差异(0x340 vs 0x350)是导致问题的主要原因。在进行跨平台移植时,建议重点关注类似底层寄存器或配置空间的差异,以提高系统兼容性与稳定性。