J'ai un FPGA (comme la plupart des gens qui posent cette question) qui est configuré après que mon noyau Linux effectue le balayage et l'énumération du bus PCIe initial. Comme vous pouvez le deviner, le FPGA implémente un point de terminaison PCIe.
J'aimerais que le noyau PCIe ré-énumère le bus ENTIER PCIe afin que mon FPGA apparaisse ensuite et que je puisse charger mon module de pilote. Je voudrais aussi la possibilité de permuter la charge de FPGA pour une configuration différente. J'entends par là que j'aimerais pouvoir:
Tout cela sans redémarrer Linux
Voici des solutions qui ont été proposées ailleurs mais ne résolvent pas le problème.
echo 1 > /sys/bus/pci/rescan
Cela semble fonctionner (seulement parfois) et cela ne fonctionne pas si je veux échanger la charge FPGA après sa première énumération.
Voici une méthode assez invasive (que je n’ai pas testée) que quelqu'un a proposée ailleurs aussi. https://community.freescale.com/thread/305355
Les installations Hotplug/Power Managment de PCIe peuvent-elles être utilisées pour que cela fonctionne? Si tel est le cas, existe-t-il de bonnes ressources pour utiliser le système Hotplug avec PCIe? (LDD ne le couvre pas assez complètement)
La ré-énumération du bus/arbre PCIe via echo 1 > /sys/bus/pci/rescan
est la solution correcte. Nous l'utilisons de la même manière que vous l'avez décrite.
Nous utilisons echo 1 > $pcidevice/remove
pour déconnecter le pilote du périphérique et pour le détacher de l’arborescence. Le pilote (xillybus) n'est pas déchargé, il est simplement déconnecté.
Une meilleure solution consiste à ne scanner de nouveau que le noeud auquel votre FPGA est attaché. Cela réduit l'impact global sur le système.
Cette technique est utilisée dans le système cloud RC3E FPGA.
Du docteur
Voici comment réinitialiser le Vegas avant identique à une réinitialisation dans Windows. Ceci est basé sur l'ID du fournisseur.
lspci -n | grep 1002: | egrep -v ".1"| awk '{print "find /sys | grep ""$1"/rescan" -| tac -;"}' | sh - | sed s/^/echo\ 1\ >\ "&/g | sed s/$/"/g
La sortie de celle-ci insérée dans votre /etc/rc.local
pour réinitialiser votre Vegas après le démarrage est similaire au script de redémarrage de devcon.
echo 1 > "/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/rescan"
echo 1 > "/sys/devices/pci0000:00/0000:00:1c.5/0000:03:00.0/rescan"
echo 1 > "/sys/devices/pci0000:00/0000:00:1d.0/0000:06:00.0/rescan"
echo 1 > "/sys/devices/pci0000:00/0000:00:1d.1/0000:07:00.0/rescan"