【发布时间】:2017-03-31 17:19:30
【问题描述】:
我在 Freescale MPC8308(作为根复合体)上使用 PCIe 总线,端点设备是一个 ASIC,只有一个 256 MB 内存区域和一个 BAR 寄存器。设备配置空间寄存器可通过“pciutils”包轻松访问。起初我尝试使用mmap() 访问内存区域,但没有成功。所以在下一个级别,我为 PCIe 端点设备准备了一个设备驱动程序,这是一个内核模块,我在 Linux 启动后加载到内核中。
在我的驱动程序中,端点设备是从设备 ID 表中识别出来的,但是当我想通过 pci_enable_device() 启用设备时,我看到了这个错误:
driver-pci 0000:00:00.0:由于 BAR 0 [0x000000-0xffffff] 冲突,设备不可用
另外,当我想使用pci_request_region()为PCIe设备分配内存区域时,这是不可能的。
这是驱动程序代码中不起作用的部分:
pci_enable_result = pci_enable_device (pdev);
if (pci_enable_result)
{
printk(KERN_INFO "PCI enable encountered a problem \n");
return pci_enable_result;
}
else
{
printk(KERN_INFO "PCI enable was succesfull \n");
}
这是“dmesg”中的结果:
driver-pci 0000:00:00.0:由于 BAR 0 [0x000000-0xffffff] 冲突,设备不可用
PCI启用遇到问题
driver-pci: 0000:00:00.0 探测失败,错误 -22
值得注意的是,在驱动程序中,我可以使用pci_read_config_dword()和pci_write_config_dword()等函数正确读写配置寄存器。
你觉得有什么问题?是否可能因为内核在内核模块之前初始化设备而出现问题?我应该怎么做才能防止这种情况发生?
【问题讨论】:
-
你的硬件坏了。在通常的工作系统中,您必须确保总线地址空间中没有冲突。否则你需要重新分配它。
-
@AndyShevchenko ,谢谢安迪,如果我想重新分配整个总线地址和内存区域;有什么方法可以删除当前为 PCI 设备分配的地址空间?
标签: linux-kernel linux-device-driver kernel-module pci-e