PCIe驱动程序错误,用于启用设备和分配内存

时间:2016-11-17 08:48:37

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

我在飞思卡尔MPC8308上使用PCIe总线(作为根复合体),端点设备是一个只有一个256 MB内存区域和一个BAR寄存器的ASIC。可以通过“pciutils”包轻松访问设备配置空间寄存器。起初我尝试使用mmap()访问内存区域,但它不起作用。所以在下一级,我为PCIe端点设备准备了一个设备驱动程序,这是一个内核模块,我在Linux启动后加载到内核中。

在我的驱动程序中,端点设备是从设备ID表中识别出来的,但是当我想通过pci_enable_device()启用设备时,我看到了这个错误:

  

driver-pci 0000:00:00.0:因BAR 0 [0x000000-0xfffffff]冲突而无法使用设备

此外,当我想使用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-0xfffffff]冲突而无法使用设备

     

PCI启用遇到问题

     

driver-pci:探测0000:00:00.0失败,错误-22

值得注意的是,在驱动程序中,我可以使用pci_read_config_dword()pci_write_config_dword()等函数正确读写配置寄存器。

你觉得有什么问题?是否可能出现问题,因为内核在内核模块之前初始化设备?我应该怎么做以防止这种情况发生?

1 个答案:

答案 0 :(得分:0)

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