Есть ли способ попросить ядро ​​Linux повторно запустить свой код инициализации PCI? - PullRequest
13 голосов
/ 01 декабря 2009

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

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 04 апреля 2017

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

echo "1" > /sys/class/pci_bus/0000\:00/rescan
3 голосов
/ 05 декабря 2009

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

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

2 голосов
/ 01 декабря 2009

http://www.linuxjournal.com/article/5633 предполагает, что вы сможете сделать это с 2,4 ядрами, используя pcihpfs.

Если это не работает, возможно, драйвер не поддерживает горячее подключение?

1 голос
/ 10 декабря 2009

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

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

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

...