Це робиться на електричному рівні, а не за допомогою програмного забезпечення. Два перелічені вище регістри, LNK_CAP та LNK_STA - це те, що ви правильно вказали як "Ось, на що посилання здатне" та "Тут поточний статус". Також є SLT_CAP та SLT_STA, на які, можливо, варто ознайомитись, оскільки це специфічно для певного слота в машині.
Специфікація PCIe визначає LTSSM - навчання тренінгів і стан стану. На рівні PHY / пристрою саме це визначає максимальну швидкість підтримки обох пристроїв, максимальну ширину зв’язку обох пристроїв, і це також, коли обертання полярності / розворот смуги руху обробляється (щоб полегшити макет для нас, специфікація дозволяє P / N підміняти тощо).
Пристрої передають один одному відомі, впорядковані набори символів, і апаратне забезпечення проходить шлях від 2,5 ГТ / с. Існують команди зміни швидкості, які можна надсилати один одному, і тут також визначаються налаштування вирівнювання каналу.
Якщо ви з'єднуєтесь з неправильною швидкістю, можливо, кореневий порт PCIe налаштований неправильно, або виникає проблема цілісності сигналу, що примушує меншу ширину зв'язку. На моєму досвіді, якщо ви пов'язувались зі швидкістю 5 ГТ / с замість 8 ГТ / с, це більше проблема SI - зв’язування при x4 8 ГТ / с замість х 8 ГТ / с здається проблемою з конфігурацією, або можливо додати карту до слота, який не підтримує ширину x8.
Реєстр можливостей кореневого комплексу (Зсув 04 год) виявить максимальну підтримувану ширину, яка може допомогти у вашій діагностиці. IIRC, -x скидає перший 4K конфігураційного простору, -xx або -xxx скидає розширений конфігураційний простір PCIe. Якщо ви скидаєте сюди весь конфігураційний простір / вставте його, я, можливо, перекопаю його, але Linux виконує гідну роботу з декодування того, що роблять регістри.