Подтвердить что ты не робот

Как ядро ​​Linux может быть вынуждено перечислить шину PCI-e?

Ядро Linux 2.6

У меня есть fpga, загружаемая через GPIO, подключенную к платой разработки с Linux. Fpga будет передавать и принимать данные по шине pci-express. Однако это перечислено при загрузке и, как таковая, ссылка не обнаружена (поскольку fpga не загружается при загрузке).

Как я могу принудительно переназначить шину pci-e в linux? Есть ли простая команда или мне придется делать изменения ядра? Мне нужна возможность подключения устройств pcie hotplug.

4b9b3361

Ответ 1

Интересно, на какой платформе вы работаете: работа вокруг (ака-хак) для работы, которая работает в системах x86, заключается в том, чтобы BIOS в основном статически настраивал PCI-устройство на любую шину, устройство, функцию, на которую обычно приземляется FPGA, затем ОС перечислит устройство и зарезервирует для него пространство PCI (хотя устройство на самом деле не существует). Затем в драйвере вашего устройства вам нужно будет выполнить некоторые дополнительные действия, например, настроить BAR и int строки вручную после того, как запрограммирована программа fpga. Конечно, это требует модификации BIOS, который, если вы работаете с поставщиком BIOS, вы можете заключить их для внесения этого изменения для вас, если вы не работаете с поставщиком BIOS, тогда это будет намного сложнее... Также имейте в виду что я работал над VxWorks на x86, и у нас был AMI, который создал пользовательский BIOS для наших плат...

Если у вас нет BIOS, подумайте о его программировании в загрузчике, там у вас уже есть возможность читать с диска, и, возможно, добавление возможностей GPIO не слишком сложно (если вы используете jtag и GPIO?), на самом деле в зависимости от того, какой загрузчик вы используете, возможно, он уже сможет делать GPIO?

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

Еще один вариант, который вы, возможно, уже обнаружили, и который действительно подходит для времени разработки: включите систему, запрограммируйте плату fpga, затем выполните reset (без силового цикла, например: sudo reboot now), FPGA должна сохранять свою конфигурацию, а linux должен перечислить ее...

Ответ 3

После включения компьютера BIOS перечисляет PCI-шину и пытается выполнить все запросы ввода-вывода IO (MMIO) с памятью и памятью. Сначала он устанавливает эти BAR, и когда операционная система загружает эти BAR, может быть изменена ОС по своему усмотрению, пока драйвер шины PCI снова перечислит шину. Даже если суперпользователь системы может запустить команду setpci, чтобы изменить этот БАР после того, как BIOS уже попытался их настроить, и ОС загрузилась (может привести к сбоям драйверов и нескольким другим плохим вещам, если это сделано неправильно).

Мне приходилось делать это в тех случаях, когда рассматриваемая карта не была назначена никакими ресурсами BIOS, так как запрошенный регион требовал 64-разрядного адреса, а BIOS работал только с 32-разрядными адресами. Я смог последовать за этим фактом и изменить эти адреса (первоначально назначенные BIOS) на любые адреса, которые я счел нужным, вставить модуль ядра, а мой драйвер будет отображать и использовать эти вновь назначенные адреса для карты без зная разницу.

Проблема, возникающая при использовании горячих подключений карт PCI-Express, заключается в том, что сама мощность слота не может быть включена/выключена без определенных контроллеров hotplug, которые должны существовать на материнской плате/объединительной плате. Не имея этих контроллеров hotplug для выключения питания слота может привести к короткому замыканию между крошечными штифтами, когда карта физически вставлена ​​и/или удалена, если питание все еще присутствует. Однако события Hotplug могут быть инициированы с помощью любого конца (хоста или устройства конечной точки). Это, похоже, не так, однако, если ваша FPGA уже имеет ссылку, установленную с корневым комплексом, возможным решением вашей проблемы было бы создание прерываний hotplug, чтобы вызвать повторное сканирование шины в ОС.

Однако существует большая проблема: если ваша карта фактически не получает ссылку на корневой комплекс, она не сможет генерировать любые события hotplug; который, кажется, имеет место. После загрузки FPGA должна переключать строку PRESENT на шине PCIe, чтобы сообщить ОС, что есть карта, готовая к перечислению. После обнаружения ОС должна попытаться установить ссылку на карту и назначить области памяти устройству. После того, как ОС перечислит карту, вы сможете загрузить драйверы против нее и увидеть ее в lspci. Вы заявили, что используете ядро ​​2.6, которое поддерживает поддержку hotplugging и динамического распределения ресурсов, поэтому этот метод должен работать до тех пор, пока ваш FPGA поддерживает возможность переключения линии PRESENT PCIe.