我正在为通过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.(就像我说的,如果它在计算机之前启动它会很有效)。
是否需要额外的步骤来分配此块?或者以某种方式向内核表明它需要这样做?
答案 0 :(得分:1)
解决方案是对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
)。
答案 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。