Linux PCI Driver调用init,但不调用probe

时间:2014-08-20 18:23:07

标签: linux linux-kernel linux-device-driver pci-e

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

我认为这是由于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.(就像我说的,如果它在计算机之前启动它会很有效)。

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

3 个答案:

答案 0 :(得分:1)

解决方案是对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)。

答案 1 :(得分:1)

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

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

答案 2 :(得分: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。