¿Dónde se produce la negociación de ancho de enlace PCI-E?

8

Estoy tratando de diagnosticar una tarjeta PCI-E de bajo rendimiento en mi sistema, y ​​me di cuenta de que está negociando el ancho de enlace incorrecto. Específicamente, al correr lspci -vv, veo:

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

mientras

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

Mi pregunta es: ¿esta negociación ocurre a nivel de hardware o de software? Dicho de otra manera, ¿la tarjeta negocia directamente con la ranura PCI-E, o esto sucede en algún lugar de los controladores?

(Si esto resulta ser una respuesta obvia, por favor, perdóname ... después de intentar diagnosticar esto durante una semana, mi mente está un poco frita).

tonysdg
fuente

Respuestas:

17

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

ingrese la descripción de la imagen aquí

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.

Krunal Desai
fuente
2
No estoy seguro de qué es lo más emocionante de esta respuesta: que es tan exquisitamente detallada (en serio, esto es hermoso y me encanta aprender cosas nuevas), o que me ayudó a resolver el problema en aproximadamente 5 minutos. Terminé teniendo que modificar las configuraciones en mi placa: es una placa de desarrollo y parece que se restableció en algún momento.
tonysdg