Ini dilakukan pada tingkat listrik, bukan oleh perangkat lunak. Dua register yang Anda daftarkan di atas, LNK_CAP dan LNK_STA adalah apa yang Anda catat dengan benar sebagai 'Inilah yang mampu dilakukan tautan' dan 'Di sini status saat ini'. Ada juga SLT_CAP dan SLT_STA, yang mungkin layak dilihat karena khusus untuk 'slot' yang diberikan dalam mesin.
Spesifikasi PCIe mendefinisikan LTSSM - Pelatihan Link dan Status Status Machine. Pada tingkat PHY / perangkat, inilah yang menentukan kecepatan maksimum kedua perangkat yang didukung, lebar tautan maksimum yang didukung kedua perangkat, dan ini juga di mana pembalikan polaritas / pembalikan jalur ditangani (untuk membuat tata letak lebih mudah bagi kita, spesifikasi memungkinkan P / N untuk ditukar, dll).
Perangkat mengirim satu set simbol yang diketahui dan dipesan satu sama lain dan perangkat kerasnya bekerja naik dari 2.5GT / s. Ada perintah perubahan kecepatan yang dapat dikirim satu sama lain, dan di sinilah pengaturan penyamaan saluran juga ditentukan.
Jika Anda menautkan dengan kecepatan yang salah, mungkin saja porta PCIe dikonfigurasi salah, atau ada masalah integritas sinyal yang memaksa lebar tautan lebih rendah. Dalam pengalaman saya, jika Anda menghubungkan pada 5 GT / s bukannya 8 GT / s, itu lebih merupakan masalah SI - menghubungkan di x4 8 GT / s bukannya x8 8 GT / s sepertinya merupakan masalah konfigurasi, atau mungkin menambahkan kartu ke slot yang tidak mendukung lebar x8.
Register kemampuan kompleks akar (Offset 04j) akan mengungkapkan lebar maksimum yang didukung, yang mungkin membantu dengan diagnostik Anda. IIRC, -x akan membuang ruang konfigurasi 4K pertama, -xx atau -xxx akan membuang ruang konfigurasi tambahan PCIe. Jika Anda membuang seluruh ruang konfigurasi Anda di sini / melewatinya, saya mungkin bisa menggalinya untuk Anda, tetapi Linux melakukan pekerjaan yang baik untuk memecahkan kode apa yang register lakukan.