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.

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.

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.


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.


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.