Wo findet die Aushandlung der PCI-E-Verbindungsbreite statt?

8

Ich versuche, eine PCI-E-Karte mit schlechter Leistung in meinem System zu diagnostizieren, und habe festgestellt, dass die falsche Verbindungsbreite ausgehandelt wird. Insbesondere beim Laufen lspci -vvsehe ich:

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

während

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

Meine Frage ist: Findet diese Verhandlung auf Hardware- oder Softwareebene statt? Anders ausgedrückt: Verhandelt die Karte direkt mit dem PCI-E-Steckplatz oder geschieht dies irgendwo in den Treibern?

(Wenn sich herausstellt, dass dies eine offensichtliche Antwort ist, verzeihen Sie mir bitte ... Nachdem ich eine Woche lang versucht habe, dies zu diagnostizieren, sind meine Gedanken etwas gebraten.)

tonysdg
quelle

Antworten:

17

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

Geben Sie hier die Bildbeschreibung ein

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.

Krunal Desai
quelle
2
Ich bin mir nicht sicher, was an dieser Antwort aufregender ist - dass sie so exquisit detailliert ist (im Ernst, das ist wunderschön und ich liebe es, neue Dinge zu lernen) oder dass es mir geholfen hat, das Problem in etwa 5 Minuten zu lösen. Am Ende musste ich die Konfigurationen auf meinem Board ändern - es ist ein Dev-Board und es sieht so aus, als ob es irgendwann zurückgesetzt wurde.
Tonysdg