2

我正在为通过 PCIe 扩展槽连接到我的机器的 FPGA 板开发驱动程序,如果板在 PC 之前通电,一切都会很好。但是,如果我先预订我的计算机,然后预订 FPGA 板,我会得到设备被识别并加载我的模块的相当不寻常的行为(我看到我的系统日志中调用了“init”函数),但是“probe”函数永远不会被调用。

我认为这是由于 BAR0 无效。上电时的输出dmesg

[   71.287587] pci 0000:3b:00.0: [0ae5:0001] type 00 class 0x000000
[   71.287613] pci 0000:3b:00.0: reg 0x10: [mem 0x00000000-0x0000ffff]
[   71.287821] pci 0000:3b:00.0: System wakeup disabled by ACPI
[   71.328537] my_driver:
[   71.328537] ****************************************************************
[   71.328542] my_driver: init debug=2

第一个 reg 应该是 0xb4000000-0xb400ffff 之类的东西,但它却显示为 0。(就像我说的,如果它在计算机之前打开电源,它就可以正常工作)。

是否需要额外的步骤才能分配此块?或者以某种方式向内核表明它需要这样做?

4

3 回答 3

2

该解决方案最终是手动调用pci_assign_resourcehttp://lxr.free-electrons.com/source/drivers/pci/setup-res.c#L283)。

之前调用它pci_enable_device会导致操作系统而不是 BIOS 分配所需的 BAR,现在一切正常!

我仍然需要手动触发 PCI 总线重新扫描(echo 1 > /sys/bus/pci/rescan)。

于 2014-09-06T02:28:32.110 回答
1

您的 PCI 设备必须在 BIOS PCI 枚举阶段之前通电。在枚举阶段,BIOS 尝试读取可能连接的 PCI 设备的 ID。如果它读取到无效 ID (0xfffff),它会跳过该 PCI 设备。

我没有参考资料,但是 AFAIK,在您必须填充 PCI 的配置空间之前,您有大约一秒钟的时间。

于 2015-12-22T20:07:49.537 回答
0

您确定您注册了 PCI 驱动程序并且不从 mod_init 返回非零值吗?请尝试手动将设备绑定到您的驱动程序:

echo -n "0000:3b:00.0" > /sys/bus/pci/drivers/my_driver/bind

加载驱动程序时,未分配的 BAR 应该不是问题。

至于 BAR 为 0 和 HotPlug:了解您的平台是什么以及是否以及如何支持 HotPlug。您需要在内核中拥有正确的 HotPlug 驱动程序才能使此类工作正常工作。BAR 由内核(或最初的固件/BIOS)分配,因此您无法将它们设置为从 FPGA 端有意义的任何东西 - 您只能设置大小。设备出现后,内核必须进行重新扫描和重新分配。我隐约记得在启动期间应该进行一些保留,否则内核将不必为设备的 BAR 提供空间,并且它不会重新分配设备下方网桥上的窗口,因为它们可以被其他开发人员积极使用。其他选择是自己从驱动程序中进行 BAR 编程。这并不难,但你可能不会 不想将这种黑客技术发送给客户。此外,即使您的设备似乎运行良好,请确保您没有在 FW/BIOS 中禁用 HP。

于 2014-08-21T10:14:27.697 回答