Драйвер Linux PCI вызывает инициализацию, но не зонд

Я разрабатываю драйвер для платы FPGA, подключенной к моей машине через слот расширения PCIe, и все отлично работает, если плата включается раньше ПК. Однако, если я сначала забронирую свой компьютер, а затем плату FPGA, я получу довольно необычное поведение устройства, распознаваемого и загружающего мой модуль (я вижу функцию «init», вызываемую в моем системном журнале), однако функция «зонд» никогда не называется.

Я думаю, что это связано с недопустимым BAR0. Вывод от dmesg при включении платы:

[   71.287587] pci 0000:3b:00.0: [0ae5:0001] type 00 class 0x000000
[   71.287613] pci 0000:3b:00.0: reg 0x10: [mem 0x00000000-0x0000ffff]
[   71.287821] pci 0000:3b:00.0: System wakeup disabled by ACPI
[   71.328537] my_driver:
[   71.328537] ****************************************************************
[   71.328542] my_driver: init debug=2

Этот первый регистр должен быть чем-то вроде 0xb4000000-0xb400ffff, но вместо этого он выглядит как 0. (Как я уже сказал, он отлично работает, если он включен до компьютера).

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


person Yeraze    schedule 20.08.2014    source источник
comment
Разве горячее подключение PCI не требует фактической операции подключения?   -  person CL.    schedule 21.08.2014
comment
@Yeraze: Как вы подключили свою FPGA к слоту расширения PCIe. То есть какой интерфейсный чип вы использовали для этой цели? Мне жаль, что это не связано с вашим вопросом. Вы можете либо ответить здесь, либо я разместил вопрос stackoverflow.com/questions/25445801/   -  person ddpd    schedule 22.08.2014


Ответы (3)


Решение оказалось ручным вызовом pci_assign_resource ( http://lxr.free-electrons.com/source/drivers/pci/setup-res.c#L283 ).

Вызов этого прямо перед pci_enable_device заставил ОС, а не BIOS, выделить необходимые BAR, и теперь все работает!

Мне все еще приходится вручную запускать повторное сканирование шины PCI ( echo 1 > /sys/bus/pci/rescan ).

person Yeraze    schedule 06.09.2014

Ваше PCI-устройство должно быть включено до этапа перечисления PCI в BIOS. На этапе перечисления BIOS пытается прочитать идентификатор устройств PCI, которые могут быть подключены. Если он считывает недопустимый идентификатор (0xfffff), он пропускает это устройство PCI.

У меня нет ссылки, но, насколько я знаю, у вас есть около секунды, прежде чем вы должны заполнить пространство конфигурации PCI.

person stdcall    schedule 22.12.2015

Вы уверены, что регистрируете драйвер PCI и не возвращаете ненулевое значение из mod_init? Пожалуйста, попробуйте вручную привязать устройство к вашему драйверу:

echo -n "0000:3b:00.0" > /sys/bus/pci/drivers/my_driver/bind

Нераспределенный BAR не должен быть проблемой при загрузке драйвера.

Что касается BAR, равного 0, и HotPlug: узнайте, какая у вас платформа и поддерживается ли HotPlug и как. У вас должен быть правильный драйвер HotPlug в ядре, чтобы такие вещи работали. BAR выделяются ядром (или изначально прошивкой/BIOS), поэтому вы не можете установить для них что-либо значимое со стороны FPGA - там вы можете только установить размер. Ядро должно выполнить повторное сканирование и переназначение после появления устройства. Я смутно припоминаю, что во время загрузки должно происходить какое-то резервирование, иначе ядру не нужно будет места, чтобы отдать BAR ваших устройств, и оно не будет переназначать окна на мостах ниже вашего устройства, поскольку они могут активно использоваться другими разработчиками. Другой вариант - просто программировать BAR самостоятельно из драйвера. Это не так сложно, но вы, вероятно, не захотите отправлять такие хаки клиентам. Кроме того, даже если ваше устройство работает нормально, убедитесь, что HP не отключен в FW/BIOS.

person moorray    schedule 21.08.2014
comment
Когда я вставляю или включаю плату FPGA, она автоматически определяет драйвер для загрузки (загружает мой модуль и вызывает init), но никогда не вызывает probe. - person Yeraze; 21.08.2014