与 2 个不同的 PCI 驱动程序共享 PCI 设备

问题描述 投票:0回答:2

我正在编写 pci 驱动程序来访问 ID 为 PCI_DEVICE_ID_INTEL_BROADWELL_IMC_HA0 的 Intel 设备,该设备位于 ff:12.0(设备 ID 0x6fa0)。

但是,事实证明 sbridge_edac 驱动程序已安装并与该 PCI 设备关联。这会导致我的 pci_register_driver() 返回错误。 如果另一个驱动程序已与其关联,是否有办法让我的 PCI 驱动程序使用该 PCI 设备?

#define PCI_DEVICE_ID_INTEL_BROADWELL_IMC_HA0   0x6fa0

static const struct pci_device_id sbridge_pci_tbl[] = {
    {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_HA0)},
   {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IBRIDGE_IMC_HA0_TA)},
    {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_HASWELL_IMC_HA0)},
    {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BROADWELL_IMC_HA0)},
    {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_KNL_IMC_SAD0)},
    {0,}            /* 0 terminated list. */
};

MODULE_DEVICE_TABLE(pci, sbridge_pci_tbl);

static struct pci_driver discovery_pci_driver ={
    .name       = DRIVER_NAME,
    .probe      = discovery_probe,
    .remove     = discovery_remove,
    .id_table   = sbridge_pci_tbl,
};

static int __init discovery_init(void)
{
    int res;

    res = pci_register_driver(&discovery_pci_driver);
    if(res<0) {
        PERR("Adding driver to pci core failed\n");
       return res;
}


return 0;
}


$lspci -x

ff:12.0 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 0
    Subsystem: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 0
    Kernel driver in use: sbridge_edac
linux-kernel linux-device-driver pci
2个回答
0
投票

由于您想创建自己的驱动程序并将其与英特尔硬件关联,您可以执行以下操作之一:

  1. 从内核配置中删除
    sbridge_edac
    驱动程序并重新编译。此时您也可以添加您的驱动程序。
  2. 创建一个启动脚本,卸载
    sbridge_edac
    驱动程序,然后加载到您的驱动程序中。
  3. 使用您的功能扩展
    sbridge_edac
    驱动程序(编辑其代码)。
  4. 在用户空间代码中创建一个函数,确定正在运行的驱动程序并相应地调用它。您必须将驱动程序功能放入用户空间代码中并使用
    sbridge_edac
    。但其他用户程序可以访问这个程序而不是驱动程序。

0
投票

请注意,您可以通过 sysfs 从特定设备实例动态删除驱动程序。这可能是比简单地从系统中完全删除 sbridge_edac 更谨慎的方法,因为其他设备可能需要它。您还可以通过内核命令行将您不需要的驱动程序列入黑名单。

© www.soinside.com 2019 - 2024. All rights reserved.