2016-03-10 9 views
1

Я пишу драйвер pci для доступа к устройству Intel с идентификатором PCI_DEVICE_ID_INTEL_BROADWELL_IMC_HA0., Который находится на ff: 12.0 (идентификатор устройства 0x6fa0).Совместное использование устройства PCI с двумя разными PCI-драйверами

Но, оказалось, что драйвер sbridge_edac уже установлен и связан с этим устройством PCI. Это заставляет my 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 
+0

Это означает, что вы либо конвертируете sbridge_edac в MFD, либо расширяете его соответствующим образом. – 0andriy

+0

Возможно, вы хотели изменить sbridge_edac? Он находится в коде ядра ядра, который я не могу просто изменить? – electro

+0

Да. Почему нет? Вы должны сделать драйвер в соответствии со спецификацией поставщика HW (Intel). Итак, прежде чем дать вам лучший ответ, вам нужно обновить сообщение со ссылкой на спецификацию или со ссылкой на необходимые части здесь. – 0andriy

ответ

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^