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