Onde ocorre a negociação de largura de link PCI-E?

8

Estou tentando diagnosticar uma placa PCI-E de baixo desempenho no meu sistema e percebi que ela está negociando a largura do link incorreta. Especificamente, da execução lspci -vv, eu vejo:

LnkCap: Port #1, Speed 8GT/s, Width x8, ASPM L1, Exit Latency L0s <4us, L1 <4us
        ClockPM- Surprise- LLActRep- BwNot-

enquanto

LnkSta: Speed 8GT/s, Width x4, TrErr- Train- SlotClk- DLActive- BWMgmt- ABWMgmt-

Minha pergunta é: essa negociação ocorre no nível do hardware ou no software? Dito de outra forma, a placa negocia diretamente com o slot PCI-E ou isso acontece em algum lugar nos drivers?

(Se isso for uma resposta óbvia, por favor, perdoe-me ... depois de tentar diagnosticar isso por uma semana, minha mente está um pouco frustrada.)

tonysdg
fonte

Respostas:

17

É feito no nível elétrico, não por software. Os dois registros listados acima, LNK_CAP e LNK_STA, são os que você anotou corretamente como 'Aqui está o que o link é capaz' e 'Aqui está o status atual'. Há também SLT_CAP e SLT_STA, que podem valer uma olhada, pois são específicos para um determinado 'slot' na máquina.

A especificação PCIe define um LTSSM - Link Training and Status State Machine. No nível PHY / dispositivo, é isso que determina a velocidade máxima que ambos os dispositivos suportam, a largura máxima do link que ambos os dispositivos suportam e também é onde a inversão de polaridade / reversão de faixa é tratada (para facilitar o layout para nós, a especificação permite P / N a ser trocado, etc.).

insira a descrição da imagem aqui

Os dispositivos enviam conjuntos de símbolos conhecidos e ordenados um ao outro e o hardware sobe de 2,5GT / s. Existem comandos de mudança de velocidade que podem ser enviados entre si, e aqui é onde as configurações de equalização de canal também são definidas.

Se você estiver vinculando na velocidade errada, pode ser possível que a porta raiz PCIe esteja configurada incorretamente ou que haja um problema de integridade do sinal forçando uma largura de link menor. Na minha experiência, se você estava vinculando 5 GT / s em vez de 8 GT / s, isso é mais um problema de SI - vincular x4 8 GT / s em vez de x8 8 GT / s parece um problema de configuração, ou talvez adicionar um cartão a um slot que não suporta largura x8.

O registro de recursos complexos raiz (Offset 04h) revelará a largura máxima suportada, que pode ajudar no seu diagnóstico. IIRC, -x despeja o primeiro 4K do espaço de configuração, -xx ou -xxx despeja o espaço de configuração estendido do PCIe. Se você despejar todo o seu espaço de configuração aqui / colá-lo, posso cavá-lo para você, mas o Linux faz um trabalho decente de decodificar o que os registros fazem.

Krunal Desai
fonte
2
Não sei ao certo o que é mais empolgante nessa resposta - que é tão requintadamente detalhada (sério, isso é lindo e adoro aprender coisas novas) ou que me ajudou a resolver o problema em cerca de 5 minutos. Acabei tendo que modificar as configurações da minha placa - é uma placa de desenvolvimento e parece que ela foi redefinida em algum momento.
tonysdg