Redefinir um dispositivo PCI no Linux

12

Existe uma maneira genérica de redefinir um dispositivo PCI no Linux a partir da linha de comando? Ou seja, faça com que o barramento PCI emita um comando de redefinição.

Jonathan
fonte

Respostas:

6

de acordo com http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci, você pode redefinir funções individuais do dispositivo, se suportado:

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
fonte
5

A coisa mais próxima que o barramento PCI tem de uma redefinição no nível do dispositivo é alterar o estado de energia para D3 e voltar para D0. Após descarregar o driver (seria ruim redefinir o hardware por baixo do driver), você pode setpciescrever nos registros de controle para alterar o estado de energia, mas acredito que isso acontece automaticamente quando você descarrega o driver.

psusi
fonte
1

Como um dispositivo PCI genérico não é hotpluggable, não haverá uma maneira de redefini-lo e fazer com que o kernel o enumere novamente.

Qualquer que seja o tipo de problema que você esteja tentando resolver, certamente há uma maneira melhor do que simplesmente redefini-lo.


fonte
4
Estou simulando um dispositivo PCI no QEMU e preciso redefinir seu estado à medida que desenvolvo. Eu queria fazer isso de dentro do convidado.
Jonathan
Eu tenho um buggy pci cctv card, ele está funcionando, mas às vezes morre com um segfault. Depois disso, todo o sistema precisa ser reiniciado, com uma redefinição do PCI, isso pode ser evitado ... O sistema é estável, sem danos, apenas a entrada de vídeo fica em branco; portanto, às vezes, é uma solução melhor redefinir o PCI do que reiniciar a máquina inteira todos os dias. (especialmente se você é 8 mil quilômetros de distância de que a máquina por 6 meses)
Gipsz Jakab
1

O problema com as soluções acima é que elas requerem a cooperatividade do dispositivo; no entanto, na maioria dos cenários, o motivo para redefini-lo é exatamente a sua não-cooperatividade.

No entanto, como é descrito aqui , existe outra maneira "mais difícil" de redefini-lo no nível PCI: nós o removemos do barramento PCI e, em seguida, reinserimos com uma nova varredura.

Os passos:

  1. echo 1 >/sys/bus/pci/<pci-id-of-device>/remove. Podemos encontrar o seu ID PCI com um lspcicomando.
  2. echo 1 >/sys/bus/pci/rescan

Eu tenho aqui um dispositivo pci com bugs, às vezes redefinição no nível PCI, às vezes esse truque de remoção e leitura corrige. Estou prestes a escrever um script para fazê-lo automaticamente. :-)

peterh - Restabelecer Monica
fonte
Ugh. Meu controlador USB ainda está com erros, mesmo após essa redefinição.
Chris
@ Chris Você tem certeza de que é o controlador e não um dispositivo?
peterh - Restabelece Monica
Sim, tenho certeza que é o controlador 00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller. Eu o passo para a VM através do VFIO e após a reinicialização da VM, também preciso reiniciar o host para fazê-lo funcionar novamente, caso contrário, qualquer USB conectado será detectado, mas a comunicação falhará.
Chris