Se realiza a nivel eléctrico, no por software. Los dos registros que ha enumerado anteriormente, LNK_CAP y LNK_STA son lo que anotó correctamente como "Esto es lo que el enlace es capaz de hacer" y "Aquí el estado actual". También hay SLT_CAP y SLT_STA, que pueden valer la pena ya que es específico de un "espacio" dado en la máquina.
La especificación PCIe define un LTSSM - Máquina de estado de formación y estado de enlace. En el nivel PHY / dispositivo, esto es lo que determina la velocidad máxima que admiten ambos dispositivos, el ancho de enlace máximo que admiten ambos dispositivos, y aquí también se maneja la inversión de polaridad / inversión de carril (para facilitarnos el diseño, la especificación permite P / N para intercambiar, etc.).
Los dispositivos se envían conjuntos de símbolos conocidos y ordenados entre sí y el hardware sube de 2.5GT / s. Hay comandos de cambio de velocidad que pueden enviarse entre sí, y aquí es donde también se definen las configuraciones de ecualización del canal.
Si se conecta a una velocidad incorrecta, es posible que el puerto raíz PCIe esté configurado incorrectamente o que haya un problema de integridad de la señal que obligue a un ancho de enlace más bajo. En mi experiencia, si se vinculaba a 5 GT / s en lugar de 8 GT / s, eso es más un problema de SI: vincular a x4 8 GT / s en lugar de x8 8 GT / s parece un problema de configuración, o quizás agregando una tarjeta a una ranura que no admite ancho x8.
El registro de capacidades complejas de raíz (Offset 04h) revelará el ancho máximo admitido, que podría ayudar con sus diagnósticos. IIRC, -x volcará el primer 4K de espacio de configuración, -xx o -xxx volcará el espacio de configuración extendido PCIe. Si vuelca todo su espacio de configuración aquí / pegarlo, posiblemente pueda examinarlo por usted, pero Linux hace un trabajo decente al decodificar lo que hacen los registros.