Jak można zmusić jądro Linuksa do wyliczenia magistrali PCI-e?

Linux kernel 2.6

Mam fpga, który jest ładowany przez GPIO podłączony do płyty deweloperskiej z systemem linux. Fpga będzie przesyłać i odbierać dane za pośrednictwem magistrali pci-express. Jest to jednak wymienione podczas rozruchu i jako takie nie jest wykrywany żaden link(ponieważ fpga nie jest ładowany podczas rozruchu).

Jak wymusić ponowne wyliczenie magistrali pci-e w Linuksie? Czy istnieje proste polecenie, czy będę musiał dokonać zmian w jądrze? Potrzebuję możliwości podłączenia urządzeń pcie.

Author: reign_man, 2012-09-14

3 answers

Zastanawiam się, na jakiej platformie jesteś: obejście (aka hack) tego, który działa na systemach x86, polega na tym, aby BIOS zasadniczo statycznie skonfigurował urządzenie PCI na dowolnej magistrali, urządzeniu, funkcji, na której normalnie ląduje FPGA, wtedy system operacyjny wyliczy urządzenie i zarezerwuje dla niego miejsce na PCI (nawet jeśli urządzenie tak naprawdę nie istnieje). Następnie w sterowniku urządzenia będziesz musiał zrobić kilka dodatkowych rzeczy, takich jak ustawienie pasków i linii int ręcznie po zaprogramowaniu fpga. Oczywiście. wymaga to modyfikacji BIOSu, który jeśli pracujesz z dostawcą BIOSu, możesz zlecić im wprowadzenie tej zmiany za Ciebie, jeśli nie pracujesz z dostawcą BIOSu, będzie to znacznie trudniejsze... Należy również pamiętać, że pracowałem nad VxWorks na x86 i mieliśmy AMI zrobić niestandardowy BIOS dla naszych płyt...

Jeśli nie masz BIOSu, rozważ zaprogramowanie go w bootloaderze, tam już masz możliwość odczytu z dysku, a dodawanie możliwości GPIO prawdopodobnie nie jest zbyt trudne (zakładając, że używasz jtag i GPIOs?), w rzeczywistości w zależności od tego, co bootloader używasz może już być w stanie zrobić GPIO?

Problem z modyfikacją jądra polega na tym, że musisz znaleźć miejsce, w którym możesz przeczytać plik bitowy, przed wyliczeniem PCI... Jeśli na przykład sterowniki urządzeń dyskowych są zainicjalizowane po PCI, to oczywiście musisz zrobić kilka radykalnych zmian w jądrze tylko po to, aby odczytać plik bitowy przed wyliczeniem PCI, co może spowodować inne irytujące problemy...

Jeszcze jedna opcja, którą być może już odkryłeś i która jest w porządku tylko na czas rozwoju: Włącz system, zaprogramuj płytę fpga, a następnie wykonaj reset (bez cyklu zasilania, na przykład: sudo reboot now), FPGA powinien zachować swoją konfigurację, a linux powinien ją wyliczyć...

 9
Author: Chris Desjardins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-15 07:06:24

Jako root, spróbuj wykonać następujące polecenie:

echo "1" > /sys/bus/pci/rescan

Zobacz ten link, aby uzyskać więcej informacji: http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci

 24
Author: user1202136,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-14 11:38:01

Po włączeniu komputera BIOS wylicza magistralę PCI i próbuje spełnić wszystkie żądania IO (MMIO) z mapowaniem przestrzeni i pamięci. Ustawia te paski na początku, a gdy system operacyjny ładuje te paski mogą być zmieniane przez system operacyjny, jak uzna to za stosowne, podczas gdy sterownik magistrali PCI ponownie wylicza magistralę. Możliwe jest nawet, że superużytkownik systemu uruchomi polecenie setpci, aby zmienić te paski po tym, jak BIOS już spróbuje je skonfigurować i system operacyjny załaduje (może spowodować awarię sterowników i kilka innych złych rzeczy, jeśli wykonane nieprawidłowo).

Musiałem to zrobić w przypadkach, gdy dana karta nie została przypisana żadnych zasobów przez BIOS, ponieważ żądany region wymagał adresu 64-bitowego, A BIOS działał tylko z przypisaniami adresów 32-bitowych. Udało mi się wejść po fakcie i zmienić te adresy (pierwotnie przypisane przez BIOS) na dowolne adresy, które uznałem za stosowne, wstawić moduł jądra, a mój sterownik mapował i używał te nowo przypisane adresy dla Karty, nie znając różnicy.

Problem, który istnieje z hotplugging kart PCI-Express jest to, że zasilania do gniazda, SAM, nie może być włączony / wyłączony bez określonych kontrolerów hotplug, które muszą istnieć na płycie głównej/płycie głównej. Brak tych kontrolerów hotplug, aby wyłączyć zasilanie gniazda, może prowadzić do zwarć między maleńkimi pinami, gdy karta jest fizycznie włożona i / lub wyjęta, jeśli zasilanie jest nadal obecne. Hotplug events, może być jednak inicjowany przez dowolny koniec (host lub urządzenie końcowe). Wydaje się, że tak nie jest, jednak jeśli twój FPGA ma już łącze ustanowione z kompleksem root, możliwym rozwiązaniem problemu byłoby wygenerowanie przerwań hotplug, aby spowodować ponowne skanowanie magistrali w systemie operacyjnym.

Jest jednak poważny problem - jeśli Twoja karta nie uzyska łącza do kompleksu głównego, nie będzie w stanie wygenerować żadnych zdarzeń hotplug; co wydaje się mieć miejsce. Po uruchomieniu FPGA powinien przełączyć linię PRESENT na magistrali PCIe, aby poinformować system operacyjny, że karta jest gotowa do wyliczenia. Po wykryciu system operacyjny powinien próbować nawiązać połączenie z kartą i przypisać regiony pamięci do urządzenia. Po wyliczeniu karty przez system operacyjny będziesz mógł załadować sterowniki i zobaczyć je w lspci. Stwierdziłeś, że używasz jądra 2.6, które ma wsparcie dla hotpluggingu i dynamicznej alokacji zasobów, więc ta metoda powinna działać tak długo, jak Twój FPGA obsługuje również możliwość przełączania obecnej linii PCIe.

 5
Author: datboi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-03 21:38:09