【问题标题】:PCIe driver error for enabling device and allocating memory启用设备和分配内存的 PCIe 驱动程序错误
【发布时间】: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


【解决方案1】:

BAR 寄存器访问通常用于小区域。您的 BAR0 尺寸似乎太大。尝试使用更少的内存(小于 1MB),它应该可以工作。

【讨论】:

  • 谢谢。但不幸的是,BAR0 的大小是不可配置的,因为它的前 28 位是只读位,无法编辑并且始终为零。那么如何更改内存区域大小?
  • @FabienM,其实没关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2019-11-19
  • 2017-09-24
相关资源
最近更新 更多