Dies geschieht auf elektrischer Ebene, nicht per Software. Die beiden oben aufgeführten Register LNK_CAP und LNK_STA haben Sie korrekt als "Hier ist, wozu der Link in der Lage ist" und "Hier der aktuelle Status" notiert. Es gibt auch SLT_CAP und SLT_STA, die einen Blick wert sein können, da dies spezifisch für einen bestimmten 'Steckplatz' in der Maschine ist.
Die PCIe-Spezifikation definiert eine LTSSM - Link Training and Status State Machine. Auf PHY- / Geräteebene bestimmt dies die maximale Geschwindigkeit, die beide Geräte unterstützen, die maximale Verbindungsbreite, die beide Geräte unterstützen, und hier wird auch die Polaritätsumkehr / Spurumkehr behandelt (um das Layout für uns zu vereinfachen, erlaubt die Spezifikation P. / N ausgetauscht werden usw.).
Die Geräte senden bekannte, geordnete Sätze von Symbolen aneinander und die Hardware arbeitet sich von 2,5 GT / s hoch. Es gibt Geschwindigkeitsänderungsbefehle, die aneinander gesendet werden können, und hier werden auch die Einstellungen für den Kanalausgleich definiert.
Wenn Sie mit der falschen Geschwindigkeit verbinden, ist möglicherweise der PCIe-Root-Port falsch konfiguriert oder es liegt ein Problem mit der Signalintegrität vor, das eine geringere Verbindungsbreite erzwingt. Nach meiner Erfahrung ist das Verbinden mit 5 GT / s anstelle von 8 GT / s eher ein SI-Problem - das Verknüpfen mit x4 8 GT / s anstelle von x8 8 GT / s scheint ein Konfigurationsproblem zu sein. oder vielleicht eine Karte zu einem Steckplatz hinzufügen, der keine x8-Breite unterstützt.
Das Root-Komplex-Funktionsregister (Offset 04h) zeigt die maximal unterstützte Breite an, die bei Ihrer Diagnose hilfreich sein kann. IIRC, -x speichert die ersten 4 KB des Konfigurationsspeichers, -xx oder -xxx den erweiterten PCIe-Konfigurationsspeicher. Wenn Sie Ihren gesamten Konfigurationsbereich hier ablegen / einfügen, kann ich ihn möglicherweise für Sie durchsuchen, aber Linux dekodiert anständig, was die Register tun.