Odbywa się to na poziomie elektrycznym, a nie przez oprogramowanie. Dwa wyżej wymienione rejestry, LNK_CAP i LNK_STA, są tym, co poprawnie zapisałeś jako „Oto, do czego zdolny jest link” i „Oto obecny stan”. Istnieją również SLT_CAP i SLT_STA, które mogą być warte spojrzenia, ponieważ są specyficzne dla danego „gniazda” w maszynie.
Specyfikacja PCIe definiuje LTSSM - Link Training and Status State Machine. Na poziomie PHY / urządzenia to określa maksymalną prędkość obsługiwaną przez oba urządzenia, maksymalną szerokość łącza obsługiwaną przez oba urządzenia, i tutaj również obsługiwane jest odwrócenie polaryzacji / odwrócenie linii (aby ułatwić nam układ, specyfikacja umożliwia P / N do zamiany itp.).
Urządzenia wysyłają do siebie znane, uporządkowane zestawy symboli, a sprzęt działa w górę od 2,5GT / s. Istnieją polecenia zmiany prędkości, które mogą być do siebie przesyłane, i tutaj zdefiniowane są również ustawienia wyrównania kanału.
Jeśli łączysz się z niewłaściwą szybkością, możliwe, że port główny PCIe jest źle skonfigurowany lub że występuje problem z integralnością sygnału, który wymusza mniejszą szerokość łącza. Z mojego doświadczenia wynika, że jeśli łączysz się z prędkością 5 GT / s zamiast 8 GT / s, to bardziej problem z SI - połączenie z prędkością x4 8 GT / s zamiast x8 8 GT / s wydaje się problemem z konfiguracją, lub może dodanie karty do gniazda, które nie obsługuje szerokości x8.
Rejestr możliwości złożonych systemów korzeniowych (Offset 04h) ujawni maksymalną obsługiwaną szerokość, która może pomóc w twojej diagnostyce. IIRC, -x zrzuci pierwsze 4K przestrzeni konfiguracyjnej, -xx lub -xxx zrzuci rozszerzoną przestrzeń konfiguracyjną PCIe. Jeśli zrzucisz całą przestrzeń konfiguracyjną tutaj / wkleisz ją, mogę ją dla ciebie przekopać, ale Linux wykonuje przyzwoite zadanie dekodowania czynności rejestrów.