it-swarm.com.de

Einen TRUE-Rescan des PCIe-Busses durchführen

Ich habe ein FPGA (wie die meisten Leute, die diese Frage stellen), das konfiguriert wird, nachdem mein Linux-Kernel den anfänglichen PCIe-Bus-Scan und die Enumeration durchgeführt hat. Wie Sie sich vorstellen können, implementiert der FPGA einen PCIe-Endpunkt.

Ich möchte, dass der PCIe-Core den ENTIRE-PCIe-Bus neu auflistet, so dass mein FPGA dann angezeigt wird und ich mein Treibermodul laden kann. Ich würde auch gerne die Möglichkeit haben, das FPGA für eine andere Konfiguration auszutauschen. Damit meine ich, ich möchte gerne:

  1. Booten Sie Linux
  2. FPGA konfigurieren
  3. Aufzählen des PCIe-Endpunkts und des Lademoduls
  4. Entfernen Sie den PCIe-Endpunkt
  5. FPGA neu konfigurieren
  6. Aufzählen des PCIe-Endpunkts

Alles ohne Linux neu zu starten 

Hier sind Lösungen, die an anderer Stelle vorgeschlagen wurden, aber das Problem nicht lösen.

echo 1 > /sys/bus/pci/rescan Das scheint zu funktionieren (nur manchmal) und es funktioniert nicht, wenn ich die FPGA-Last nach dem Aufzählen hot-swap machen möchte.

Hier ist eine ziemlich invasive Methode (die ich nicht getestet habe), die jemand anderswo vorgeschlagen hat. https://community.freescale.com/thread/305355

Können die Hotplug-/Stromverwaltungsfunktionen von PCIe verwendet werden, damit dies funktioniert? Wenn ja, gibt es gute Ressourcen für die Verwendung des Hotplug-Systems mit PCIe? (LDD deckt es nicht vollständig genug ab)

14
whh4000

Die erneute Aufzählung des PCIe-Busses/-baums über echo 1 > /sys/bus/pci/rescan ist die richtige Lösung. Wir verwenden es genauso wie Sie es beschrieben haben.

Wir verwenden echo 1 > $pcidevice/remove, um den Treiber vom Gerät zu trennen und das Gerät vom Baum zu trennen. Der Treiber (xillybus) wird nicht entladen, sondern nur getrennt. 

Eine bessere Lösung ist, nur den Knoten erneut zu scannen, an den Ihr FPGA angeschlossen ist. Dies reduziert die Gesamtwirkung für das System.

Diese Technik wird im FPGA-Cloud-System RC3E verwendet.

12
Paebbels

Vom Arzt

So wird das Vegas vor einem Reset in Windows zurückgesetzt. Dies basiert auf der Lieferanten-ID.

lspci -n | grep 1002: | egrep -v ".1"| awk '{print "find /sys | grep ""$1"/rescan" -| tac -;"}' | sh - | sed s/^/echo\ 1\ >\ "&/g | sed s/$/"/g

Die Ausgabe dieses Befehls wird in Ihren /etc/rc.local eingefügt, um Ihr Vegas nach dem Start zurückzusetzen, ähnlich dem devcon restart-Skript.

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