Совместное использование устройства PCI с двумя разными драйверами PCI

Я пишу драйвер pci для доступа к устройству Intel с идентификатором PCI_DEVICE_ID_INTEL_BROADWELL_IMC_HA0., который находится по адресу ff:12.0 (идентификатор устройства 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

person electro    schedule 10.03.2016    source источник
comment
Это означает, что вы либо конвертируете sbridge_edac в MFD, либо соответствующим образом расширяете его.   -  person 0andriy    schedule 10.03.2016
comment
Вы хотели изменить sbridge_edac? Это в исходном коде ядра, который я не могу просто изменить?   -  person electro    schedule 10.03.2016
comment
Да. Почему нет? Вы должны сделать драйвер в соответствии со спецификацией от поставщика оборудования (Intel). Итак, прежде чем дать вам лучший ответ, вы должны обновить сообщение со ссылкой на спецификацию или указать здесь необходимые части.   -  person 0andriy    schedule 10.03.2016


Ответы (1)


Поскольку вы хотите создать свой собственный драйвер и связать его с оборудованием Intel, вы можете выполнить одно из следующих действий:

  1. Удалите драйвер sbridge_edac из конфигурации ядра и перекомпилируйте. Вы также можете добавить своего водителя в это время.
  2. Создайте сценарий запуска, который выгружает драйвер sbridge_edac, а затем загружает ваш драйвер.
  3. Расширьте драйвер sbridge_edac своей функциональностью (отредактируйте их код).
  4. Создайте функцию в коде пользовательского пространства, которая определяет, какой драйвер запущен, и вызовите ее соответствующим образом. Вам нужно будет поместить функциональность вашего драйвера в код пользовательского пространства и работать с файлом sbridge_edac. Но другие пользовательские программы могли получить доступ к этой программе вместо драйвера.
person user2205930    schedule 08.04.2016