Linux PCI 驱动程序调用 init,但不调用probe

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

我正在为通过 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/

相关文章:

python - 安装了较新版本和默认版本后,如何打开较早版本的 python?

linux - arch/x86/include/asm/unistd.h 与 include/asm-generic/unistd.h

linux - 有没有办法在进程终止后或进程终止前获取 proc/pid/status

linux - 如果执行 shell 失败,jenkins 构建不会失败

c++ - linux中进程的堆栈大小是否有限制

linux - 使用 Bash 在动态网页上模拟掷骰子

multithreading - 简单的内核多线程

c - 错误 : ‘struct tty_driver’ has no member named ‘write’

linux - 在内核内部通过网络发送数据

对 ioctl() 和内核头文件的混淆