我正在为通过 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。(就像我说的,如果它在计算机之前打开电源,它就可以完美工作)。
是否需要执行额外的步骤才能分配此 block ?或者以某种方式向内核表明它需要这样做?
最佳答案
解决方案最终是手动调用 pci_assign_resource
( http://lxr.free-electrons.com/source/drivers/pci/setup-res.c#L283 )。
在 pci_enable_device
之前调用此函数会导致操作系统(而不是 BIOS)分配所需的 BAR,现在一切正常!
我仍然需要手动触发 PCI 总线重新扫描 (echo 1 >/sys/bus/pci/rescan
)。
关于Linux PCI 驱动程序调用 init,但不调用probe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25411870/