Ich habe ein PCIe-Gerät, das nur dann ordnungsgemäß funktioniert, wenn der Computer vollständig aus- und wieder eingeschaltet ist. Wenn Sie einen einfachen Befehl reboot
oder einen reboot -p
Befehl eingeben , wird die PCIe-Karte nicht aus- und wieder eingeschaltet, sodass sie nach dem Neustart nicht funktioniert.
Gibt es eine Möglichkeit, vom Betriebssystem aus ein Gerät in einem PCIe-Steckplatz aus- und wieder einzuschalten? Ich kann es in finden /sys/bus/pci/devices/0000*/
, aber ich kann nicht herausfinden, wie man das Brett richtig zurücksetzt. Machtwechsel scheint der einzige Weg zu sein.
Kann ich ansonsten irgendwo eine Einstellung ändern, bei der ein reboot
Befehl vollständig aus- und wieder eingeschaltet wird ?
Ich verwende übrigens Ubuntu 12.10.
quelle
reboot -f
? Dies ist vergleichbar mit dem Drücken des Netzschalters der CPU.reboot
nicht funktioniert. Sie führenreboot -f
immer noch einen Soft-Neustart durch.Antworten:
Mögliche Methode # 1
Ich denke, Sie können es mit diesen Befehlen tun:
deaktivieren
aktivieren
Wo
$NUMBER
ist die Nummer des PCI-Steckplatzes.lspci -vv
kann helfen, das Gerät zu identifizieren. Dies ist nicht sehr gut dokumentiert ...Mögliche Methode # 2
Ich bin auf diesen Thread bei U & L gestoßen , ein ähnliches Problem: Es gibt einige Antworten auf diese Frage, die besagen, dass Sie mit diesem Befehl zurücksetzen können:
Allerdings würde ich die Antworten dort lesen! Es gibt Umstände, die das so machen! Speziell würde ich diese Antwort lesen !
Mögliche Methode # 3
Es gibt einen Unix-Befehl,
setpci
mit dem Sie möglicherweise ein Gerät im PCI-Bus zurücksetzen können.Ich habe mit diesem Befehl keine konkreten Beispiele gesehen, daher müssen Sie bei Google nach Beispielen suchen und die Manpage durchsehen . Ich würde mit diesem Befehl leichtfertig umgehen, bis Sie sicher sind, dass er verwendet wird. Nach dem, was ich darüber gelesen habe, wird die Hardware direkt manipuliert, und es besteht immer das Risiko, dies selbst zu tun, anstatt ein Tool zu verwenden, das diese Art von Funktionalität verfügbar macht!
quelle
/sys/bus/pci/devices/$NUMBER/
. Aber nichts scheint die Einstellung 0 oder 1 zu rechtfertigenecho "1" > ...
.power
tatsächlich in D3 bringt.remove
undrescan
ermöglicht es dem Kernel, das PCI-Gerät durch einen Cycler mit Strom zu versorgen, ohnereboot
:Dabei ist DDDD.BB.DD.F = Domain: Bus: Device.Function
quelle
Zurücksetzen in PCI Express ist etwas komplex. Es gibt zwei Haupttypen von Zurücksetzungen - herkömmliche Zurücksetzungen und Zurücksetzungen auf Funktionsebene. Es gibt auch zwei Arten von konventionellen Rücksetzungen, Grundrücksetzungen und nicht-Grundrücksetzungen. Alle Details finden Sie in der PCI-Express-Spezifikation.
Ein "Kaltstart" ist ein grundlegender Neustart, der nach dem Einschalten eines PCIe-Geräts erfolgt. Es scheint keine Standardmethode zum Auslösen eines Kaltstartens zu geben, außer zum Aus- und Wiedereinschalten des Systems. Auf meinen Rechnern ist das
/sys/bus/pci/slots
Verzeichnis leer.Ein "Warm-Reset" ist ein grundlegender Reset, der ausgelöst wird, ohne dass die Stromversorgung des Geräts unterbrochen wird. Es scheint keine Standardmethode zu geben, um einen Warmstart auszulösen.
Ein "Hot-Reset" ist ein herkömmlicher Reset, der über eine PCI-Express-Verbindung ausgelöst wird. Ein Hot-Reset wird entweder ausgelöst, wenn eine Verbindung in den Leerlauf geschaltet wird, oder indem von TS1 und TS2 bestellte Sätze mit gesetztem Hot-Reset-Bit gesendet werden. Die Software kann einen Hot-Reset einleiten, indem sie das Reset-Bit für den sekundären Bus im Bridge-Steuerregister im PCI-Konfigurationsbereich des Bridge-Ports vor dem Gerät setzt und anschließend löscht.
Ein "Function Level Reset" (FLR) ist ein Reset, der nur eine einzelne Funktion eines PCI-Express-Geräts betrifft. Es darf nicht das gesamte PCIe-Gerät zurückgesetzt werden. Das Implementieren von Zurücksetzungen auf Funktionsebene ist in der PCIe-Spezifikation nicht erforderlich. Ein Zurücksetzen auf Funktionsebene wird eingeleitet, indem das Bit zum Zurücksetzen auf Funktionsebene im Gerätesteuerregister der Funktion in der PCI-Express-Fähigkeitsstruktur im PCI-Konfigurationsbereich gesetzt wird.
Linux stellt die Funktionalität zum Zurücksetzen auf Funktionsebene in Form von zur Verfügung
/sys/bus/pci/devices/$dev/reset
. Wenn Sie eine 1 in diese Datei schreiben, wird die entsprechende Funktion auf Funktionsebene zurückgesetzt. Beachten Sie, dass dies nur die spezifische Funktion des Geräts betrifft, nicht das gesamte Gerät, und dass Geräte nicht zur Implementierung von Zurücksetzungen auf Funktionsebene gemäß der PCIe-Spezifikation erforderlich sind.Mir ist keine "nette" Methode bekannt, um einen Hot-Reset auszulösen (dafür gibt es keinen sysfs-Eintrag). Es ist jedoch möglich, setpci zu verwenden:
Stellen Sie sicher, dass alle angehängten Treiber entladen sind, bevor Sie dieses Skript ausführen. In diesem Skript wird versucht, das PCIe-Gerät zu entfernen. Anschließend wird der Upstream-Switch-Port angewiesen, einen Hot-Reset durchzuführen. Anschließend wird versucht, den PCIe-Bus erneut zu scannen. Dieses Skript wurde auch nur auf Geräten mit einer einzigen Funktion getestet. Daher muss es möglicherweise für Geräte mit mehreren Funktionen überarbeitet werden.
quelle