Ripristina un dispositivo PCI in Linux


12

Esiste un modo generico per ripristinare un dispositivo PCI in Linux dalla riga di comando? Cioè, fa sì che il bus PCI emetta un comando di reset.

Risposte:


6

secondo http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci è possibile ripristinare le singole funzioni del dispositivo se supportato:

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 cosa più vicina al bus PCI per un reset a livello di dispositivo è cambiare lo stato di alimentazione in D3 e poi di nuovo in D0. Dopo aver scaricato il driver (sarebbe male ripristinare l'hardware da sotto il driver), è possibile utilizzare setpciper scrivere nei registri di controllo per modificare lo stato di alimentazione, ma credo che ciò avvenga automaticamente quando si scarica il driver.


1

Poiché un dispositivo PCI generico non è hot plug, non ci sarà modo di reimpostarlo e di re-enumerarlo dal kernel.

Qualunque sia il tipo di problemi che stai cercando di risolvere, c'è sicuramente un modo migliore che ripristinarlo.


4
Sto simulando un dispositivo PCI in QEMU e ho bisogno di ripristinare il suo stato mentre lo sviluppo. Volevo farlo dall'interno dell'ospite.
Jonathan,

1
Ho una scheda cctv pci buggy, funziona ma a volte muore con un segfault. Dopodiché, l'intero sistema deve essere riavviato, con un ripristino PCI questo potrebbe essere evitabile ... Il sistema è stabile, nessun danno, solo l'ingresso video diventa vuoto, quindi a volte è una soluzione migliore per ripristinare il PCI che riavviare l'intera macchina ogni giorno. (specialmente se sei a 8000 km di distanza da quella macchina per 6 mesi)
Gipsz Jakab

1

Il problema con le soluzioni sopra è che richiedono la cooperatività del dispositivo; tuttavia nella maggior parte degli scenari il motivo per ripristinarlo è esattamente la sua non cooperatività.

Tuttavia, come è descritto qui , esiste un altro modo "più difficile" per reimpostarlo a livello PCI: lo rimuoviamo dal bus PCI e quindi lo reinseriamo con una nuova scansione.

I passi:

  1. echo 1 >/sys/bus/pci/<pci-id-of-device>/remove. Possiamo trovare il suo ID PCI con un lspcicomando.
  2. echo 1 >/sys/bus/pci/rescan

Ho qui un dispositivo PCI difettoso, a volte ripristino a livello PCI, a volte questo trucco letto per la rimozione lo risolve. Sto per scrivere una sceneggiatura per farlo automagicamente. :-)


Ugh. Il mio controller USB è ancora difettoso, anche dopo questo reset.
Chris

@Chris Sei sicuro che sia il controller e non un dispositivo su di esso?
Peter - Ripristina Monica il

Sì, sono sicuro che sia il controller 00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller. Lo passo alla VM tramite VFIO e dopo il riavvio della VM devo anche riavviare l'host per farlo funzionare di nuovo, altrimenti viene rilevata qualsiasi USB collegata, ma la comunicazione fallisce.
Chris,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.