Où se produit la négociation de la largeur de liaison PCI-E?

8

J'essaie de diagnostiquer une carte PCI-E sous-performante dans mon système, et j'ai réalisé qu'elle négocie la mauvaise largeur de liaison. Plus précisément, en courant lspci -vv, je vois:

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

tandis que

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

Ma question est: cette négociation a-t-elle lieu au niveau matériel ou au niveau logiciel? Autrement dit, la carte négocie-t-elle directement avec l'emplacement PCI-E, ou cela se produit-il quelque part dans les pilotes?

(Si cela s'avère être une réponse évidente, veuillez me pardonner ... après avoir essayé de diagnostiquer cela pendant une semaine, mon esprit est un peu frit.)

tonysdg
la source

Réponses:

17

Cela se fait au niveau électrique, pas par logiciel. Les deux registres que vous avez énumérés ci-dessus, LNK_CAP et LNK_STA sont ce que vous avez correctement noté comme «Voici ce dont le lien est capable» et «Voici l'état actuel». Il existe également SLT_CAP et SLT_STA, qui peuvent valoir le coup d'œil car elles sont spécifiques à un «emplacement» donné dans la machine.

La spécification PCIe définit une machine d'état LTSSM - Link Training and Status. Au niveau PHY / appareil, c'est ce qui détermine la vitesse maximale prise en charge par les deux appareils, la largeur de liaison maximale prise en charge par les deux appareils, et c'est également là que l'inversion de polarité / l'inversion de voie est gérée (pour nous faciliter la disposition, la spécification permet P / N à échanger, etc.).

entrez la description de l'image ici

Les appareils s'envoient des ensembles de symboles connus et ordonnés et le matériel monte de 2,5 GT / s. Il existe des commandes de changement de vitesse qui peuvent être envoyées les unes aux autres, et c'est ici que les paramètres d'égalisation des canaux sont également définis.

Si vous vous connectez à la mauvaise vitesse, il est possible que le port racine PCIe soit mal configuré ou qu'il y ait un problème d'intégrité du signal forçant une largeur de liaison inférieure. D'après mon expérience, si vous vous connectiez à 5 GT / s au lieu de 8 GT / s, c'est plus un problème SI - la liaison à x4 8 GT / s au lieu de x8 8 GT / s semble être un problème de configuration, ou peut-être en ajoutant une carte à un emplacement qui ne prend pas en charge la largeur x8.

Le registre des capacités complexes racine (décalage 04h) révèlera la largeur maximale prise en charge, ce qui pourrait vous aider dans vos diagnostics. IIRC, -x videra le premier 4K d'espace de configuration, -xx ou -xxx videra l'espace de configuration étendu PCIe. Si vous videz l'intégralité de votre espace de configuration ici / coller, je peux le fouiller pour vous, mais Linux fait un travail décent de décodage de ce que font les registres.

Krunal Desai
la source
2
Je ne suis pas sûr de ce qui est plus excitant dans cette réponse - qu'elle est si délicieusement détaillée (sérieusement, c'est beau, et j'aime apprendre de nouvelles choses), ou qu'elle m'a aidé à résoudre le problème en environ 5 minutes. J'ai fini par devoir modifier les configurations sur ma carte - c'est une carte de développement et il semble qu'elle ait été réinitialisée à un moment donné.
tonysdg