Linux kernel 删除/重新扫描后pci_启用_设备()失败

Linux kernel 删除/重新扫描后pci_启用_设备()失败,linux-kernel,fpga,pci,pci-e,Linux Kernel,Fpga,Pci,Pci E,我这里有一个Linux 4.4(我曾经在一个旧的内核上工作,它以同样的方式失败),它有一个PCIe连接的FPGA设备和一个驱动程序,这两个都是我自己设计的。这些在正常条件下工作良好,但现在我尝试让它们在热插拔条件下工作。这不是真正的硬件热插拔,我一直在尝试的是设备的sysfs目录中通常的echo 1>删除,然后是echo 1>/sys/bus/pci/rescan 设备重新出现后,我的驱动程序初始化调用pci\u enable\u device(),在记录时失败: otscan 0000:02:

我这里有一个Linux 4.4(我曾经在一个旧的内核上工作,它以同样的方式失败),它有一个PCIe连接的FPGA设备和一个驱动程序,这两个都是我自己设计的。这些在正常条件下工作良好,但现在我尝试让它们在热插拔条件下工作。这不是真正的硬件热插拔,我一直在尝试的是设备的sysfs目录中通常的
echo 1>删除
,然后是
echo 1>/sys/bus/pci/rescan

设备重新出现后,我的驱动程序初始化调用
pci\u enable\u device()
,在记录时失败:

otscan 0000:02:00.0: can't enable device: BAR 0 [mem 0xf7e01000-0xf7e013ff] not claimed
otscan 0000:02:00.0: can't enable device: BAR 1 [mem 0xf7e00000-0xf7e00fff] not claimed
otscan 0000:02:00.0: can't enable device: BAR 2 [mem 0xf0200000-0xf020ffff 64bit pref] not claimed
(通常它会在第一个无人认领的资源之后停止,但我已经修改了它,以继续并确认事实上所有的酒吧都无人认领。)

这里的“未声明”意味着
结构资源
存在但没有父资源,从我收集的信息来看,这是由于从未对其调用过
request\u resource()
造成的。我不认为这是一个驱动程序问题,因为由于无法启用设备,初始化例程在中止之前无法完成很多工作

这就留下了FPGA(带硬IP PCIe核心的Altera Cyclone V)和一些我可能做得不好的地方,比如错误处理总线重置。当通过sysfs重新填充时,该计算机中的其他PCIe设备工作


我已经研究了一段时间,但仍然没有弄清楚为什么Linux会对我的设备进行不同的处理。我的设备有什么可能的属性可以让Linux决定不调用设备栏上的
request\u resource()
。我将PCIe核心配置中的类代码保留为
0
(这是无效的),当设备处于引导状态时,该配置工作正常。输入一个合理的值(
0x40000
对于多媒体视频设备,在我的例子中,
0xff0000
对于“未注册设备”也起作用)也使它在热插拔上起作用


Linux似乎仅部分处理类代码为
0
的设备。

问题似乎是FPGA PCIe核心的PCIe配置空间中的类定义不正确。确保类寄存器的高位字节是st,与0不同

在查看dmesg时,我们遇到了类似的问题: “无法启用设备:条0……未声明” 然后
“pci_enable_device failed”(pci_enable_device failed)(pci_enable_device failed)(pci_enable_device failed)(pci_enable_device failed)(pci_enable_device failed)(pci_enable_device failed)(我自己过去也看到过。但是你的更小。我从来没有追根究底,cyclone V和IMX6 linux系统也存在同样的问题。感谢您为我们节省了不少时间:)