2016-11-17 11 views
0

Я использую шину 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().

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

+1

Аппаратные средства не работают. В обычной рабочей системе вы должны быть уверены, что в адресном пространстве шины нет столкновений. В противном случае вам нужно перераспределить его. – 0andriy

+0

@ Энди Шевченко, спасибо Энди, если я хочу перераспределить все адреса и регистры памяти; есть ли способ удалить текущее адресное пространство для устройств PCI? –

ответ

0

Доступ к регистрам BAR, как правило, относится к небольшой области. Ваш размер BAR0 кажется слишком большим. Попробуйте с меньшим объемом памяти (менее 1 МБ), он должен работать.

+0

Спасибо. но, к сожалению, размер BAR0 не настраивается, поскольку его первые 28 бит являются только битами чтения, которые невозможно отредактировать и всегда равны нулю. так как я могу изменить размер области памяти? –

+0

@FabienM, На самом деле это не имеет значения. – 0andriy