J'ai un périphérique PCIe qui ne fonctionne correctement que lorsque l'ordinateur est complètement éteint puis rallumé. L'émission d'une commande simple reboot
ou reboot -p
ne semble pas couper l'alimentation de la carte PCIe, ce qui l'empêche de fonctionner après le redémarrage.
Existe-t-il un moyen, à partir du système d'exploitation, de redémarrer un périphérique dans un emplacement PCIe? Je peux le trouver /sys/bus/pci/devices/0000*/
, mais je ne sais pas comment réinitialiser correctement la carte. Basculer le pouvoir semble être le seul moyen.
Sauf cela, puis-je modifier un paramètre quelque part qui provoquera un cycle d'alimentation complet sur une reboot
commande?
Soit dit en passant, j'utilise Ubuntu 12.10.
devices
power-management
pci
zachd1_618
la source
la source
reboot -f
? Cela revient à appuyer sur le bouton d'alimentation du CPU.reboot
ne fonctionnait pas. Votrereboot -f
est toujours un redémarrage en douceur.Réponses:
Méthode potentielle n ° 1
Je pense que vous pouvez le faire avec ces commandes:
désactiver
activer
Où
$NUMBER
est le numéro de l'emplacement PCI.lspci -vv
peut aider à identifier l'appareil. Ce n'est pas très bien documenté ...Méthode potentielle n ° 2
Je suis tombé sur ce fil sur U&L , problème similaire: il y a des réponses à cette question qui disent que vous pouvez réinitialiser avec cette commande:
Cependant, je lirais les réponses là-bas! Il y a des conditions pour le faire de cette façon! Plus précisément, je voudrais lire cette réponse !
Méthode potentielle n ° 3
Il existe une commande Unix
setpci
, qui peut vous donner une méthode pour réinitialiser un périphérique dans le bus PCI.Je n'ai vu aucun exemple spécifique avec cette commande, vous devrez donc rechercher des exemples sur Google et parcourir la page de manuel . Je marcherais légèrement avec cette commande jusqu'à ce que vous ayez confiance en son utilisation. D'après ce que j'ai lu à ce sujet, il s'agit de manipuler le matériel directement et il y a donc toujours des risques à le faire vous-même par rapport à l'utilisation d'un outil qui expose ce type de fonctionnalité!
la source
/sys/bus/pci/devices/$NUMBER/
. Mais rien ne semble justifier le réglage 0 ou 1echo "1" > ...
.power
place réellement dans D3.remove
etrescan
permettra au noyau d'alimenter cycliquement le périphérique PCI sansreboot
:où DDDD.BB.DD.F = Domaine: Bus: Device.Function
la source
Les réinitialisations dans PCI express sont un peu complexes. Il existe deux principaux types de réinitialisation: la réinitialisation conventionnelle et la réinitialisation au niveau de la fonction. Il existe également deux types de réinitialisations conventionnelles, les réinitialisations fondamentales et les réinitialisations non fondamentales. Voir la spécification PCI express pour tous les détails.
Une «réinitialisation à froid» est une réinitialisation fondamentale qui a lieu après la mise sous tension d'un périphérique PCIe. Il ne semble pas y avoir de moyen standard de déclencher une réinitialisation à froid, sauf pour éteindre et rallumer le système. Sur mes machines, le
/sys/bus/pci/slots
répertoire est vide.Une «réinitialisation à chaud» est une réinitialisation fondamentale qui se déclenche sans couper l'alimentation de l'appareil. Il ne semble y avoir aucun moyen standard de déclencher une réinitialisation à chaud.
Une «réinitialisation à chaud» est une réinitialisation conventionnelle qui est déclenchée sur une liaison PCI express. Une réinitialisation à chaud est déclenchée soit lorsqu'une liaison est forcée au repos électrique, soit en envoyant des ensembles ordonnés TS1 et TS2 avec le bit de réinitialisation à chaud défini. Le logiciel peut lancer une réinitialisation à chaud en définissant puis en effaçant le bit de réinitialisation du bus secondaire dans le registre de contrôle de pont dans l'espace de configuration PCI du port de pont en amont de l'appareil.
Une «réinitialisation au niveau de la fonction» (FLR) est une réinitialisation qui affecte uniquement une seule fonction d'un périphérique PCI express. Il ne doit pas réinitialiser l'ensemble du périphérique PCIe. L'implémentation de réinitialisations au niveau des fonctions n'est pas requise par la spécification PCIe. Une réinitialisation au niveau de la fonction est lancée en définissant le bit de réinitialisation au niveau de la fonction de lancement dans le registre de commande de périphérique de la fonction dans la structure de capacité PCI express dans l'espace de configuration PCI.
Linux expose la fonctionnalité de réinitialisation au niveau de la fonction sous la forme de
/sys/bus/pci/devices/$dev/reset
. L'écriture d'un 1 dans ce fichier lancera une réinitialisation au niveau de la fonction sur la fonction correspondante. Notez que cela n'affecte que cette fonction spécifique du périphérique, pas l'ensemble du périphérique, et les périphériques ne sont pas nécessaires pour implémenter des réinitialisations au niveau des fonctions selon la spécification PCIe.Je ne connais aucune méthode «sympa» pour déclencher une réinitialisation à chaud (il n'y a pas d'entrée sysfs pour cela). Cependant, il est possible d'utiliser setpci pour ce faire:
Assurez-vous que tous les pilotes connectés sont déchargés avant d'exécuter ce script. Ce script tentera de supprimer le périphérique PCIe, puis commandera au port du commutateur en amont d'émettre une réinitialisation à chaud, puis tentera de réanalyser le bus PCIe. Ce script a également été testé uniquement sur des appareils avec une seule fonction, il peut donc avoir besoin d'être retravaillé pour les appareils avec plusieurs fonctions.
la source