Как стать автором
Обновить

Lane margining: как оценить качество PCIe-соединения без дополнительной аппаратуры

Уровень сложностиСредний
Время на прочтение17 мин
Количество просмотров4.4K
Всего голосов 39: ↑49 и ↓-10+59
Комментарии22

Комментарии 22

Расскажите в комментариях, пользуетесь ли вы какими-то утилитами для оценки качества PCIe-соединения?

Чтобы по-настоящему погрузиться в процесс, мы применяем различные хардварные средства, подключаемые с помощью макетных проводов!

Какие плюсы и минусы у них есть?

Помимо огромного эстетического удовольствия, главный плюс — это абсолютная гибкость настройки. Она позволяет в любой момент создавать действительно уникальные и индивидуальные конфигурации путем сгибания и переключения проводов.

Что касается минусов, то основной — это время. Нет, нет, всегда найдется тот одинокий проводок, который решит выскочить из контакта.

Собственно - линк

То что PCIe умудряется работать в таких условиях - это настоящее инженерное чудо. Браво авторам спецификации и инженерам которые делали трансиверы.

У меня, к сожалению, такой фокус не удался. Пытался подключить SSD (NVMe x4) таким вот выносным способом к процессорному модулю и это не сработало. Запаял сокет M.2 на несущую плату и всё заработало.

Это какой Gen?

В выводе lspci на экране можно в LnkSta разглядеть 2.5GT/s x4, это Gen1.

Мы обратились за публичными критериями pass/fail к Intel и AMD, но первые пока молчат, а вторые на форуме пометили пост как спам

Вас туда ещё пускают?

Супер! Спасибо за утилиту и статью.

Наконец кто-то разбирающийся в PCI Express появился (засветился) на Хабре. :-)

Пара вопросов, если позволите:

  1. Где можно найти описание всех этих опций/битов/флагов которые выдает утилита lspci ? Я пытался читать спецификции на PCIe, но тамошняя терминология слабо пересекается с тем, что выдает утилита. От прочтения всё стало еще более запутаннее. :)

  2. На моём ноутбуке Lenovo двухгодичной давности ни одно из PCIe устройств не выдает MargReady+. С чем это может быть связано ? Не достаточно высокий Gen хоста ?

  3. Как узнать какой Gen максимально поддерживается хостом ? dmesg об этом скромно умалчивает.

  4. Правильно ли я понял, что пользоваться фичей Lane Margining можно только с PCIe Gen4 и выше ?

  5. В моей ОС (FreeBSD 13.3) установлен пакет pciutils v3.12, утилиты pcilmr в нём нет, но lspci отображает состояние бита MargReady. С какой версии утилита pcilmr появилась в пакете ?

PS: Как раз сейчас занимаюсь отладкой PCIe на нашем оноплатнике на базе Скифа, там хост PCIe Gen3. Какую полезную информацию можно выжать из этих утилит о состоянии линка, кроме как его GT/s ?

  1. PCI Express Base Specification. Раздел 7. Software Initialization and Configuration. Там где-то с секции 7.6 начинается описание capabilities

  2. А у вас там там вообще много PCIe устройств? Все что сидит в PCH видится как просто PCI, например.

  3. lspci показывает. Надо только запускать как-то так: `sudo lspci -vvv`, ищите строчку LnkCap

Какую полезную информацию можно выжать из этих утилит о состоянии линка, кроме как его GT/s ?

Ну если запускать с -vvv то вот например:

		LnkCap2: Supported Link Speeds: 2.5-8GT/s, Crosslink- Retimer- 2Retimers- DRS-
		LnkCtl2: Target Link Speed: 8GT/s, EnterCompliance- SpeedDis-
			Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-
			Compliance Preset/De-emphasis: -6dB de-emphasis, 0dB preshoot
		LnkSta2: Current De-emphasis Level: -3.5dB, EqualizationComplete+ EqualizationPhase1+
			EqualizationPhase2+ EqualizationPhase3+ LinkEqualizationRequest-
			Retimer- 2Retimers- CrosslinkRes: unsupported

Внимание на LnkSta2

Спасибо за ответ.

Утилиту pcilmr раздобыл - собрал пакет из репозитория с Github-а. На удивление собралось под фрей без вопросов.

На ноутбуке у меня похоже несколько хостов PCIe. На части портов показывает:

LnkCap2: Supported Link Speeds: 2.5-8GT/s, Crosslink- Retimer- 2Retimers- DRS-

На другой части:

LnkCap2: Supported Link Speeds: 2.5-16GT/s, Crosslink- Retimer+ 2Retimers+ DRS-

Я правильно понимаю, что 8GT/s это PCIe Gen 3, а 16GT/s это Gen 4 ?

На некоторых портах показывает "возможность" Margining, но флажок MargReady везде с минусом:

root@butterfly:/home/rz # lspci -vvv | grep -A 2 'Margining'
pcilib: 0000:01:00.0 64-bit device address ignored.
pcilib: 0000:01:00.0 64-bit device address ignored.
	Capabilities: [440 v1] Lane Margining at the Receiver
		PortCap: Uses Driver-
		PortSta: MargReady- MargSoftReady-
--
	Capabilities: [d00 v1] Lane Margining at the Receiver
		PortCap: Uses Driver+
		PortSta: MargReady- MargSoftReady-
pcilib: 0000:05:00.0 64-bit device address ignored.
pcilib: 0000:05:00.0 64-bit device address ignored.
--
	Capabilities: [440 v1] Lane Margining at the Receiver
		PortCap: Uses Driver-
		PortSta: MargReady- MargSoftReady-

Как это интерпретировать ? Возможность есть но она не поддерживается конечным устройством ?

На ноутбуке у меня похоже несколько хостов PCIe. На части портов показывает:

Скорее несколько мостов PCIe. Можете использовать `lspci -t`. Несколько PCI Host Bridge тоже бывает, но на х86 мне такое не встречалось.

Я правильно понимаю, что 8GT/s это PCIe Gen 3, а 16GT/s это Gen 4 ?

Типа того. AFAIK, Gen3/Gen4 - это чисто маркетинговые обозначения, спецификация ими не оперирует, соответственно lspci тоже не умеет показывать эти обозначения.

На некоторых портах показывает "возможность" Margining, но флажок MargReady везде с минусом:

А это как раз в этом посте и описано, почитайте. Как минимум в одном случае вам нужна поддержка этой фичи драйвером устройства.

Я статью прочел. Но я не понимаю смысла написанного вот тут:

Самым интересным битовым флагом Margining Ready устройство, а точнее его
PHY, сообщает о готовности к приему команд — хороший знак для нас! Бит
Margining Uses Driver Software означает необходимость помощи в
проведении процедуры со стороны хоста, а флаг Margining Software Ready —
что такая помощь в первоначальной инициализации проведена.

Не могли бы Вы расшифровать это для тупого Груга и как это применить для моего случая ? :)

Мне также не понятно, почему устройство заявляет о наличии такой "возможности", но при этом индицирует, что команду принимать не будет (MargReady-). Какая-то странная логика.

Это могут быть чипсет и внутренняя периферия вроде встроенной графики, которые хоть и видятся системой как отдельные PCIe-устройства, но находятся на одном чипе с процессором. Потому функциональность LM только для соблюдения стандарта.

Из "ноутбучного" железа NVMe обычно соглашается по-настоящему промаржиниться.

Про 8GT/s, он же Gen3: если нет под рукой особенных утилит и отладчиков от производителя (Intel в некоторых случаях позволяет построить глаз для Gen3), но поддерживается AER, то, например, можно пустить нагрузку и следить за счётчиками, не набегают ли слишком быстро.

Наличие ошибок покажут "плюсы" в UESta и CESta (uncorrectable errors, correctable errors) в функциональности AER в lspci, а счётичики ведёт драйвер в /sys/bus/pci/devices/XXXX:XX:XX.X/aer_*

Спасибо, это полезная информация.

Пользовался в свое время аппаратным оценивателем качества сигнала PCIe Gen3, который выглядел как многоканальный высокоскоростной осциллограф с Windows XP на борту, софтом для построения глазных диаграмм и софтом для оценки соответствия этих диаграмм спецификации. Интересная была железка, только дорогая очень, себе домой такую не купишь.

Та железка была с французской фамилией LeCroy ?

Из готового доступного ПО есть утилита Lane Margin Tool (LMT) for PCIe 4.0/5.0 от Intel в виде закрытого прекомпилированного скрипта на Python

А не было желания\возможность раскопать его? Учитывая что это питон, вероятно задача не должна быть экстра-сложной, если интел дополнительно для обфускации ничего не делала

С самого начала решили что инструмент будем публиковать как Open Source, потому LMT оставался как дополнительный источник информации. Но смотреть начинали, столкнулись с ярким колоритом, ЕВПОЧЯ :)

В то же время pciutils написан на C, имеет минимум зависимостей, легко доступен в пакетных менеджерах многих дистрибутивов Linux, BSD и даже OpenEmbedded.

Не знаю зачем мне эта информация, но было очень интересно, спасибо! Не перестаю удивляться какие нынче сложные штуки в вещах которые нас окружают.

Может когда-нибудь пригодится.

Нынче оценка качества PCIe соединения может иметь значение даже для домашних пользователей, которые на своих машинах ничего, кроме игр, не запускают - а все из-за распространения райзеров для "красивой" установки GPU параллельно матплате. Хотя и было продемонстрировано, что система может остаться работоспособной при "удлинении" PCIe на пару метров с помощью цепочки потребительских райзеров, во-первых, райзер райзеру рознь, а во-вторых, интересно было бы оценить качество такого соединения.

Планируете что-нибудь в этом направлении? Под винду, с упрощенной оценкой результатов, например.

А итоговая оценка в терминах Perfect, Pass, Fail уже выводится.

Вижу, что есть официальная сборка pciutils под винду от мейнтейнера пакета. Под рукой нашлась win10, бегло посмотрел: на этом конкретном ПК простого запуска из-под администратора недостаточно, пришлось перебирать методы доступа к регистрам конфигурационного пространства (ключом -A), единственным потенциально рабочим выглядит windbg, но для этого нужно до-установить что-то. Позже, во второй заход, погляжу ещё раз. Ну и нужно будет добавить поддержку этого ключа в pcilmr, по аналогии с lspci и setpci, тогда будет работать в точности как в Linux и BSD.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий