Я использую шину PCIe на Freescale MPC8308 (как корневой комплекс), а конечное устройство - это ASIC с одной областью памяти 256 МБ и только одним регистром BAR. Регистры конфигурации конфигурации устройства легко доступны через пакет «pciutils». Сначала я попытался получить доступ к области памяти с помощью mmap()
, но это не сработало. Поэтому на следующем уровне я подготовил драйвер устройства для конечного устройства PCIe, который является модулем ядра, который загружается в ядро после загрузки Linux.Ошибка драйвера PCIe для включения устройства и выделение памяти
В моем драйвере устройства конечной точки определяется из устройства ID таблицы, но когда я хочу, чтобы включить устройство по pci_enable_device()
, я вижу эту ошибку:
driver-pci 0000:00:00.0: device not available because of BAR 0 [0x000000-0xfffffff] collisions
Кроме того, когда я хочу, чтобы выделить область памяти для 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: device not available because of BAR 0 [0x000000-0xfffffff] collisions
PCI enable encountered a problem
driver-pci: probe of 0000:00:00.0 failed with error -22
Стоит отметить, что в драйвере я могу правильно считывать и записывать регистры конфигурации, используя такие функции, как pci_read_config_dword()
и pci_write_config_dword()
.
В чем проблема, на ваш взгляд? возможно, проблема возникает из-за того, что ядро инициализирует устройство до модуля ядра? что я должен сделать, чтобы это не произошло?
Аппаратные средства не работают. В обычной рабочей системе вы должны быть уверены, что в адресном пространстве шины нет столкновений. В противном случае вам нужно перераспределить его. – 0andriy
@ Энди Шевченко, спасибо Энди, если я хочу перераспределить все адреса и регистры памяти; есть ли способ удалить текущее адресное пространство для устройств PCI? –