web-dev-qa-db-fra.com

Comment effectuer une nouvelle analyse TRUE du bus PCIe

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:

  1. Boot Linux
  2. Configurer le FPGA
  3. Énumérer le point de terminaison PCIe et charger le module
  4. Supprimer le point de terminaison PCIe
  5. Reconfigurer le FPGA
  6. Nouvelle énumération du point d'extrémité PCIe

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)

14
whh4000

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.

12
Paebbels

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"
0
The Doctor