È fatto a livello elettrico, non tramite software. I due registri che hai elencato sopra, LNK_CAP e LNK_STA sono quelli che hai correttamente annotato come "Ecco di cosa è capace il link" e "Qui lo stato corrente". Ci sono anche SLT_CAP e SLT_STA, che potrebbero valere la pena di essere specifici in quanto a un determinato "slot" nella macchina.
Le specifiche PCIe definiscono un LTSSM - Link State e Status State Machine. A livello di PHY / dispositivo, questo è ciò che determina la velocità massima supportata da entrambi i dispositivi, la larghezza massima del collegamento supportata da entrambi i dispositivi, ed è anche qui che viene gestita l'inversione di polarità / inversione di corsia (per semplificare il layout, le specifiche consentono a P / N da scambiare, ecc.).
I dispositivi si scambiano insiemi di simboli noti e ordinati e l'hardware si alza da 2,5 GT / s. Esistono comandi di cambio velocità che possono essere inviati l'un l'altro, ed è qui che vengono definite anche le impostazioni di equalizzazione del canale.
Se si esegue il collegamento a una velocità errata, è possibile che la porta radice PCIe sia configurata in modo errato o che sia presente un problema di integrità del segnale che impone una larghezza del collegamento inferiore. Nella mia esperienza, se ti collegassi a 5 GT / s invece di 8 GT / s, questo è più un problema SI - il collegamento a x4 8 GT / s invece di x8 8 GT / s sembra un problema di configurazione, o forse aggiungendo una scheda a uno slot che non supporta la larghezza x8.
Il registro delle capacità complesse di root (Offset 04h) rivelerà la larghezza massima supportata, che potrebbe aiutare con la diagnostica. IIRC, -x scaricherà il primo 4K di spazio di configurazione, -xx o -xxx scaricherà lo spazio di configurazione esteso PCIe. Se scarichi qui l'intero spazio di configurazione / lo incolli, posso scavarlo eventualmente per te, ma Linux fa un buon lavoro di decodifica di ciò che fanno i registri.