在Linux上重新扫描PCIe之后未分配BAR区域

我有一个FPGA卡连接到Linux系统上的PCIe。 我可以对FPGA进行重新编程,然后echo 1 > /sys/bus/pci/rescan并在lspci显示我的卡。

但是BAR区域没有分配任何内存:

 Region 0: Memory at <unassigned> (64-bit, prefetchable) [disabled] [size=32M] Region 2: Memory at <unassigned> (64-bit, prefetchable) [disabled] [size=64M] 

我已经尝试了Linux启动命令行上的各种pci=标志,没有太大的影响。

我怀疑BAR区域太大,因此Linux无法在地址空间find适当的alignment范围来映射BAR,因为它们在启动时不存在。

这是一个正确的理论吗? 是否有可能告诉Linux为我的设备预留空间?

我也在Linux中看到这一点。 Xilinx论坛上有一个答案http://forums.xilinx.com/t5/PCI-Express/Incorrect-assignment-of-64bit-BAR-addresses/td-p/347577 – 尽管如此,你的内存空间很小。 尝试缩小规模,直到获得分配。

很可能你的BIOS不允许有这么大的内存空间BAR。 实际上我从来没有见过一个超过512MB的真正的PCIe设备映射到内存空间。 你为什么想做这个? 如果您认为有这个原因,请再次检查您的应用程序是否确实需要这些内存始终可以同时访问,或者您是否也可以使用分页机制来处理这些内存。

你的怀疑是接近的,但它是分配区域,而不是Linux的BIOS。 正如我所看到的那样,根端口被赋予了一个固定的内存块,如果你要求在这个块中有更多的空闲空间,那么你就可以不分配空间了。

只是疯狂的猜测:当驾驶员首先映射地址时,这些区域被分配地址。

Tom Keddie说,BIOS(而不是Linux内核)为设备分配地址区域。 我发现有时你需要重新启动Linux系统才能使其映射到设备。 根据您如何配置FPGA,您可能需要为FPGA提供外部电源,以便在重新启动时不会清除其配置。