Это сделано на электрическом уровне, а не с помощью программного обеспечения. Два регистра, которые вы перечислили выше, LNK_CAP и LNK_STA - это то, что вы правильно отметили как «Вот то, на что способна ссылка» и «Вот текущий статус». Есть также SLT_CAP и SLT_STA, на которые, возможно, стоит обратить внимание, так как они специфичны для данного «слота» в машине.
Спецификация PCIe определяет LTSSM - механизм обучения линии связи и состояния. На уровне PHY / устройства это то, что определяет максимальную скорость, которую поддерживают оба устройства, максимальную ширину линии связи, которую поддерживают оба устройства, и это также, где обрабатывается смена полярности / смена полосы движения (чтобы упростить расположение для нас, спецификация позволяет P / N для замены и т. Д.).
Устройства посылают друг другу известные, упорядоченные наборы символов, а аппаратное обеспечение работает с 2,5 Гт / с. Существуют команды изменения скорости, которые можно отправлять друг другу, и здесь также определяются настройки выравнивания канала.
Если вы подключаетесь с неправильной скоростью, возможно, неверно настроен корневой порт PCIe или что проблема целостности сигнала вынуждает уменьшить ширину канала. По моему опыту, если вы подключались со скоростью 5 ГТ / с вместо 8 ГТ / с, то это скорее проблема СИ - соединение с x4 8 ГТ / с вместо x8 8 ГТ / с кажется проблемой конфигурации, или, возможно, добавление карты в слот, который не поддерживает ширину х8.
Регистр корневых комплексных возможностей (смещение 04h) покажет максимальную поддерживаемую ширину, которая может помочь с вашей диагностикой. IIRC, -x сбросит первые 4K конфигурационного пространства, -xx или -xxx сбросит расширенное конфигурационное пространство PCIe. Если вы сбросите все свое конфигурационное пространство здесь / вставите его, я, возможно, покопаюсь для вас, но Linux отлично справляется с расшифровкой того, что делают регистры.