Réinitialiser un périphérique PCI sous Linux

12

Existe-t-il un moyen générique de réinitialiser un périphérique PCI sous Linux à partir de la ligne de commande? Cela signifie que le bus PCI émet une commande de réinitialisation.

Jonathan
la source

Réponses:

6

selon http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci, vous pouvez réinitialiser les fonctions individuelles de l'appareil si cela est pris en charge:

What:       /sys/bus/pci/devices/.../reset
Description:
            Some devices allow an individual function to be reset
            without affecting other functions in the same device.
            For devices that have this support, a file named reset
            will be present in sysfs.  Writing 1 to this file
            will perform reset.
Andre Holzner
la source
5

La chose la plus proche du bus PCI pour une réinitialisation au niveau du périphérique est de changer l'état d'alimentation en D3 et de revenir en D0. Après avoir déchargé le pilote (il serait mauvais de réinitialiser le matériel sous le pilote), vous pouvez utiliser setpcipour écrire dans les registres de contrôle pour changer l'état d'alimentation, mais je pense que cela se produit automatiquement lorsque vous déchargez le pilote.

psusi
la source
1

Puisqu'un périphérique PCI générique n'est pas connectable à chaud, il n'y aura pas de moyen de le réinitialiser et de le faire réénumérer par le noyau.

Quel que soit le type de problèmes que vous essayez de résoudre, il existe certainement un meilleur moyen que de simplement le réinitialiser.


la source
4
Je simule un périphérique PCI dans QEMU et j'ai besoin de réinitialiser son état au fur et à mesure de mon développement. Je voulais le faire de l'intérieur de l'invité.
Jonathan
1
J'ai une carte buggy pci cctv, elle fonctionne mais meurt parfois avec un segfault. Après cela, tout le système doit être redémarré, avec une réinitialisation PCI cela pourrait être évitable ... Le système est stable, pas de mal, seule l'entrée vidéo est vierge, donc parfois c'est une meilleure solution pour réinitialiser le PCI que de redémarrer toute la machine tous les jours. (surtout si vous êtes à 8000 km de cette machine pendant 6 mois)
Gipsz Jakab
1

Le problème avec les solutions ci-dessus est qu'elles nécessitent la coopérativité de l'appareil; cependant, dans la plupart des scénarios, la raison pour la réinitialiser est exactement sa non-coopérativité.

Cependant, comme il est décrit ici , il existe un autre moyen, "plus difficile" de le réinitialiser au niveau PCI: nous le supprimons du bus PCI, puis le réinsérons par une nouvelle analyse.

Les marches:

  1. echo 1 >/sys/bus/pci/<pci-id-of-device>/remove. Nous pouvons trouver son ID PCI avec une lspcicommande.
  2. echo 1 >/sys/bus/pci/rescan

J'ai ici un périphérique PCI buggé, parfois une réinitialisation au niveau PCI, parfois cette astuce de suppression de lecture le corrige. Je suis sur le point d'écrire un script pour le faire automatiquement. :-)

peterh - Réintégrer Monica
la source
Pouah. Mon contrôleur USB est toujours bogué, même après cette réinitialisation.
Chris
@Chris Êtes-vous sûr qu'il s'agit du contrôleur et non d'un périphérique?
peterh
Oui, je suis sûr que c'est le contrôleur 00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller. Je le passe à VM via VFIO et après le redémarrage de la VM, je dois également redémarrer l'hôte pour le faire fonctionner à nouveau, sinon tout USB branché est détecté, mais la communication échoue.
Chris