1

Я использую шину PCIe в Freescale MPC8308 (в качестве корневого комплекса), а конечное устройство представляет собой ASIC с одной областью памяти 256 МБ и одним регистром BAR. Регистры пространства конфигурации устройства легко доступны через пакет "pciutils". Сначала я попытался получить доступ к области памяти с помощью mmap() но это не сработало. Итак, на следующем уровне я подготовил драйвер устройства для конечного устройства PCIe, являющегося модулем ядра, который я загружаю в ядро после загрузки Linux.

В моем драйвере устройство конечной точки идентифицируется из таблицы идентификаторов устройств, но когда я хочу включить устройство с помощью pci_enable_device() , я вижу эту ошибку:

driver-pci 0000: 00: 00.0: устройство недоступно из-за коллизий BAR 0 [0x000000-0xfffffff]

Также, когда я хочу выделить область памяти для устройства PCIe с помощью pci_request_region() , это невозможно.

Вот часть кода драйвера, которая не работает:

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 возникла проблема

драйвер-pci: зонд 0000: 00: 00.0 не выполнен с ошибкой -22

Стоит отметить, что в драйвере я могу правильно читать и записывать регистры конфигурации, используя такие функции, как pci_read_config_dword() и pci_write_config_dword() .

В чем проблема, вы думаете? Возможно ли, что проблема возникает, потому что ядро инициализирует устройство до модуля ядра? что я должен сделать, чтобы это не произошло?

0