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.

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.

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.


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.


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. :-)


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.