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

时间:2014-06-23 13:26:40

标签: linux enumeration fpga pci-e

我在Linux系统上连接了PCIe的FPGA卡。我可以重新编程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无法在地址空间中找到适当对齐的范围来映射BAR,因为它们在启动时不会出现。

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

3 个答案:

答案 0 :(得分:1)

我在Linux中也看到了这一点。在http://forums.xilinx.com/t5/PCI-Express/Incorrect-assignment-of-64bit-BAR-addresses/td-p/347577的Xilinx论坛上有一个答案 - 但你的记忆空间很小。尝试缩小大小,直到获得分配。

  

很可能你的BIOS不允许这么大的内存空间BAR。   实际上我从未见过超过512MB的真正PCIe设备   映射到内存空间。你为什么想做这个?如果你认为   有理由,再次检查你的申请是否真的   要求始终可以访问此数量的内存   时间或者你也可以使用分页机制处理这个问题。

您的怀疑很接近,但是BIOS正在分配区域,而不是Linux。正如我所看到的那样,根端口被给予一个固定的内存块,如果你在那个块中要求的不仅仅是免费的,那么你就可以进行未分配。

答案 1 :(得分:0)

只是猜测:当司机首先映射地址时,会为这些地区分配地址。

答案 2 :(得分:0)

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