Resposta parcial: posso dizer o que está errado, mas não sei como consertar isso.
Grepping a mensagem de erro na origem do kernel do Linux leva a drivers/pci/probe.c
, que requer um PCI da placa PCI_HEADER_TYPE_BRIDGE
(1) para ter a classe PCI_CLASS_BRIDGE_PCI
(0x0604). Mas sua placa PCI possui a classe 0xffff (ou seja, a classe não foi configurada corretamente pelo fabricante / revendedor), então o driver decide que algo está errado e prefere não usar essa ponte. E se a ponte não for inicializada por um driver adequado, é claro que você não verá nenhuma carta atrás dela.
As formas em torno disso são (1) corrigir o kernel para fazer uma exceção para sua placa, ou (2) dar à placa sua classe apropriada.
Pesquisando encontra uma folha de dados do chip aqui , então, em princípio, temos todas as informações que precisamos para corrigi-lo. A seção sobre o mapa de registro de configuração (6.1) diz que esses dados são armazenados em uma EEPROM, com as seguintes notas para I2C resp. Acesso SMBUS:
Note 1: When masquerade is enabled, it is pre-loadable.
Note 2: The VPD data is read/write through I2C during VPD operation.
Portanto, deve ser possível sobrescrever esses valores de alguma forma. A seção 10 tem mais detalhes sobre isso, mas a questão é se o I2C / SMBus está conectado em algum lugar, em primeiro lugar - como é em uma placa PCIe, provavelmente não. No entanto, olhando para a seção 6.3.91 / 92, parece que se pode escrever a EEPROM através do registro VPD. Descobrir como fazer isso precisa de mais algum trabalho, e possivelmente um programa em C escrito por mim.
Editar : Parece que há um arquivo vpd
em /sys/
que pode ser usado para acesso de gravação deste tipo. Por favor, dê uma olhada se /sys/bus/pci/devices/0000:04:00.0/
existir e tiver um arquivo chamado vpd
em algum lugar, ou se isso também estiver faltando por causa da classe errada. Se tal arquivo existir, por favor, faça um hexdump -C
e edite sua pergunta com os resultados.
De qualquer forma, antes de fazer isso, deve-se olhar o resto dos valores do espaço de configuração. Você pode fazer isso com lspci -s 04:00.0 -x
e lspci -s 04:00.0 -xxx
para o despejo completo. (Há um cavet sobre o uso de -xxx
na lspci
man-page que pode falhar em cartões não conformes, mas experimente). Então edite sua pergunta com os resultados. Desta forma, deve-se ver se a classe é o único valor que precisa ser corrigido ou se há mais.