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

Есть ли способ попросить ядро ​​Linux повторно запустить свой код инициализации PCI?

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

Я застрял в ядре серии 2.4.x для этого, и в настоящее время я работаю с 2.4.20, но буду двигаться до 2.4.37, если это имеет значение. Дистрибутив - это урезанный Red Hat 7.3, работающий на диске ram, но я могу добавить любые инструменты, необходимые для его работы (пока они играют хорошо с серией 2.4).

Если какой-то фон поможет прояснить, что я пытаюсь сделать: с холодной загрузки, однажды в Linux я использую GPIO для программирования FPGA. Часть FPGA, запрограммированная, реализует простое PCI-устройство. В настоящее время, после программирования FPGA, я перезагружаю систему, и Linux распознает устройство после его появления и загружает драйвер для него.

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

Я считаю, что Linux способен видеть устройство после его программирования, но перед перезагрузкой, потому что scanpci покажет устройство после его программирования, как и lspci -H 1. Мне просто нужен способ получить его в /proc/pci, настроить и включить.

4b9b3361

Ответ 1

Вы можете ускорить перезагрузку с помощью kexec, если вы не поймете, как восстановить проверку PCI. Вы можете спросить об этом на LKML, если вы еще этого не сделали.

разгрузка/перезагрузка модуля не помогает, не так ли?

Ответ 2

http://www.linuxjournal.com/article/5633 предлагает вам сделать это с помощью ядер 2.4 с помощью pcihpfs.

Если это не работает, возможно, драйвер не поддерживает hotplug?

Ответ 3

Эта команда, приведенная ниже, поможет пользователю пересканировать полный корневой концентратор.

echo "1" > /sys/class/pci_bus/0000\:00/rescan

Ответ 4

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

Лучше всего будет просто настроить новую карту. Если ваше ядро ​​поддерживает устройства Cardus, оно уже знает, как настроить недавно вставленное PCI-устройство (это то, что является Cardbus). Вам просто нужно выяснить, как заставить ядро ​​сделать это...

Это может быть возможно для модуля ядра. Даже если вы не можете получить встроенный код hotplug, вы должны установить ресурсы pci, используя вызовы pci_bus_write_config_dword() и друзей. Возможно, есть некоторая настройка маршрутизации IRQ.