Как осуществляется доступ к VPD через SMBus / I2C в устройстве pci?

1223
starz

Подобно тому, что запрашивает IPMI, как я получу доступ к VPD каждого устройства на целевом сервере через SMBus / I2C? Нужен ли драйвер для этого или достаточно модуля i2c-dev? Как проверить, что на целевой шине, если к серверу подключено несколько устройств хранения?

Я использую i2cdetect для проверки шины i2c, однако я не могу проверить, к какой шине подключено мое устройство, или у него вообще есть шина. Я точно знаю, что мне нужна шина / адаптер i2c, чтобы определить фактическое устройство i2c. Создание клиента i2c может сделать это, но мне все еще нужно проверить его соединение с шиной, а создание клиента i2c ограничивает определение устройств i2c, перечисленных в id_table. Как можно больше я хочу, чтобы он обнаруживал все устройства хранения независимо от того, есть ли у него устройство i2c или нет.

i2cdetect выходы:

i2c-0 i2c Radeon i2c bit bus 0x90 I2C adapter i2c-1 i2c Radeon i2c bit bus 0x91 I2C adapter i2c-2 i2c Radeon i2c bit bus 0x92 I2C adapter i2c-3 i2c Radeon i2c bit bus 0x93 I2C adapter i2c-4 i2c Radeon i2c bit bus 0x94 I2C adapter i2c-5 i2c Radeon i2c bit bus 0x95 I2C adapter i2c-6 i2c Radeon i2c bit bus 0x96 I2C adapter i2c-7 i2c Radeon i2c bit bus 0x97 I2C adapter i2c-8 smbus SMBus I801 adapter at f000 SMBus adapter 

Вывод i2cdetect -y 8:

 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- 08 -- -- -- -- -- -- --  10: -- -- -- -- 14 15 -- -- -- -- -- -- -- -- -- --  20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  30: 30 -- 32 -- -- -- -- -- -- -- -- -- -- -- -- --  40: -- -- -- -- 44 -- -- -- -- -- -- -- -- -- -- --  50: 50 51 52 53 -- -- -- -- -- -- -- -- -- -- -- --  60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 6e --  70: -- -- -- -- -- -- -- --  

Любые ответы будут оценены. Большое спасибо.

0
Извините, я не могу разобраться в вашем вопросе. Предполагая, что у вас есть встроенная система с несколькими адаптерами I2C и клиенты I2C подключены к шинам. Первый шаг - описать в своем вопросе, какая у вас система, какие у нее адаптеры I2C и какие клиенты подключаются к ней на аппаратном уровне. Если есть драйверы для ваших адаптеров, посмотрите на `dmesg` и в` / sys / bus / i2c`, если они появляются. Вы можете общаться с клиентами I2C по интерфейсу, но я не знаю ни одного драйвера для IPMI-подобных протоколов, поэтому вам нужно реализовать эти протоколы самостоятельно. dirkt 6 лет назад 0
Большое спасибо за ответ, сэр. У меня есть eeprom, подключенный к устройству nvme. Подобно тому, что запрашивает IPMI, IPMI может запрашивать информацию VPD eeprom в каждом слоте nvme. Я просто хотел бы знать, как IPMI запрашивает эту информацию. Если я использую i2cdetect, который определяет устройства i2c в системе, я действительно не знаю, где подключено мое устройство. Почему IPMI может обнаруживать эту информацию VPD на каждом слоте в системе? Я в значительной степени осведомлен о том, как запрашивать информацию, если шина i2c- * известна и адрес, однако, я действительно не имею ни малейшего представления, как определить точную шину в системе? Есть идеи, сэр? starz 6 лет назад 0
Дополнительная информация сэр. Как я уже сказал, у меня есть устройство nvme с eeprom, я хочу получить доступ к информации VPD моего устройства через SMBus / I2C. У меня уже есть код для запроса, но ему нужны входные параметры / dev / i2c- * и адрес eeprom. У меня уже есть адрес, но я не знаю, как узнать, к какому i2c- * подключено мое устройство. Этот подход в порядке? что-то вроде того, как IPMI запрашивает ту же информацию. спасибо за любую информацию. starz 6 лет назад 0
Угадайте: BMC IPMI имеет эту информацию где-то в своей прошивке. Кроме того, адаптеры I2C в BMC не обязательно совпадают или находятся в том же порядке, что и адаптеры I2C на хосте. Если вы ищете eeprom, `i2cdetect` работает достаточно надежно, и eeprom обычно имеют хорошо известные адреса. Можете ли вы отредактировать свой вопрос с помощью вывода `i2cdetect` для всех адаптеров? dirkt 6 лет назад 0
Еще раз спасибо, сэр. Обновленный вопрос для добавления вывода i2cdetect. Я читал BMC, однако я не смог углубиться в это, так как я не вижу никакого исходного кода, связанного с этим. Что касается i2cdetect, это моя проблема, я не знаю, может ли i2cdetect определить, где находится мое устройство eeprom или оно отображается в первую очередь. Что я вижу в списке, так это связка VGA i2c и адаптера SMBus после того, как я загрузил модуль i2c-i801. У меня 5 слотов pci, 2 из которых x16. Вставлена ​​1 карта VGA и 1 устройство nvme с eeprom. Как вы можете дать мне представление о том, как получить или определить, где мой EEPROM? еще раз спасибо starz 6 лет назад 0
Да, нет общедоступного исходного кода для BMC, поэтому так трудно это выяснить ... Вы включили только вывод `i2cdetect -l`, что вам нужно сделать, это проверить саму шину. Шины Radeon предназначены для EDID, в то время как I801 находится на материнской плате, поэтому отредактируйте вопрос с выводом `i2cdetect -y 8`. Сделайте отступ в четыре пробела для правильного форматирования. dirkt 6 лет назад 0
Спасибо, обновил вопрос, чтобы включить адреса для i2c-8. Еще раз спасибо. starz 6 лет назад 0

1 ответ на вопрос

0
dirkt

Чтобы повторить в ответе то, что уже упоминалось в комментариях:

Сначала определите существующие адаптеры I2C, для которых есть загруженные драйверы i2detect -l.

По названию адаптера часто можно догадаться о функции, Radeonадаптеры предназначены для EDID (информация о мониторе), а SMBus I801адаптер от материнской платы как часть южного моста (вы увидите это с lspci).

Обратите внимание, что нумерация может не быть постоянной в зависимости от ботинок. Чтобы найти правильный адаптер, посмотрите на содержимое /sys/bus/i2c/devices/i2c-*/name.

Следующим шагом является определение устройств I2C, подключенных к определенному адаптеру. В вашем случае это номер адаптера 8, поэтому i2cdetect -y 8это необходимая команда.

EEPROM обычно имеют адреса от 50до 53. В общем, довольно сложно выяснить, какой именно чип подключен по определенному адресу; помогает тщательный осмотр аппаратного обеспечения, учет номеров чипов и поиск таблиц данных для сужения возможных адресов I2C.

Но EEPROM довольно стандартны. Вы можете получить доступ к EEPROMS с помощью eepromдрайвера ядра ; после modprobing содержимое будет отображаться в /sys/bus/i2c/drivers/eeprom/.

На моей материнской плате у меня есть EEPROM для двух RAM DIMM в 50и 52, и я могу использовать decode-dimmsпрограмму из i2c-toolsпакета Debian для декодирования Vital Product Data (VPD) модулей DIMM.

Возможно, что эти устройства в вашей системе также являются только виртуальными виртуальными жесткими дисками, а виртуальные виртуальные машины NVME находятся где-то еще. Также возможно, что ваш NVME использует другую шину I2C на другом адаптере, и у вас не загружен драйвер ядра Linux для этого адаптера (или никто еще не написал такой драйвер).

Но, по крайней мере, теперь вы знаете, как использовать i2cdetectдля определения EEPROM.

редактировать

Как сказано в комментариях, микроконтроллер BMC полностью отличается от центрального процессора, и возможно, что он имеет доступ к другому оборудованию, нежели центральный процессор. Таким образом, ответ на вопрос "но почему BMC может это увидеть?" это «потому что это совершенно другое, и то, что BMC может и не может делать, не обязательно влияет на то, что может и не может делать центральный процессор».

Тем не менее, кажется, что ваш реальный вопрос «как я могу получить доступ к VPD NVME на хост-процессоре». Я погуглил спецификацию интерфейса управления NVME, и там говорится, что с конечными точками управления можно связаться как через порт I2C / SMBus, так и через порт PCIe.

Поэтому я предполагаю, что конечная точка управления вашего оборудования доступна только через PCIe.

Дальнейшее поиск в Google нашло CLI Management Endpoint, который работает через драйвер ioctlsLinux nvme, по крайней мере, из быстрого просмотра кода, который я сделал.

Поэтому вместо вас я бы попробовал этот инструмент для доступа к интерфейсу Management Endpoint на вашем оборудовании и выяснил, не можете ли вы получить VPD таким образом.

У меня нет устройства NVME, поэтому я не могу проверить.

Большое спасибо за все ответы, сэр. Добавлена ​​информация, в моей настройке 4 модуля DIMM. Кроме того, для шины 8 я попытался удалить свой nvme в слот pci, и все еще отображаются те же выходные -y адреса. Кажется, мой EEPROM не вошел в него. Я предполагаю, что, как вы и сказали, необходимость в драйвере адаптера необходима, однако это заставило меня вернуться к идее о том, как IPMI может запрашивать мой VPD eeprom, даже если он не показывает шину i2c или даже мой адрес eeprom в i2cdetect. Даже если i801 не является modprobed, IPMI все равно может отображать информацию VPD. Есть еще идеи, сэр? Очень ценю ответы на все мои вопросы. starz 6 лет назад 0
Сэр, я знаком с этим подходом на ioctls. На самом деле, я хочу разработать запрос двойного подхода для доступа к VPD, и я уже закончил с этим, они называются внутренними командами. Исходящие команды через SMBus / I2C. Для этого я и развиваюсь. К сведению, для встроенных команд требуется поддержка встроенного программного обеспечения, тогда как исходящие команды могут напрямую обращаться к аппаратным компонентам для получения информации, хранящейся на конкретном устройстве. Честно говоря, я уже перекрасил NVME-MIS, и это действительно утомляет меня от идеи, которую он объясняет, а не дает подробное обсуждение кода. starz 6 лет назад 0
Дополнительный подход, который я сделал, я также изучаю с открытым исходным кодом IPMI, или CLI, на сегодняшний день, у меня есть только SMCIPMITool для запуска через CLI с информацией nvme VPD. другие инструменты, такие как IPMITool с открытым исходным кодом, не имеют такой функции. SMCIPMITool находится в Java, и его пакет находится в двоичном формате, без исходного кода, поэтому мне трудно найти способ, которым инструмент запрашивает такую ​​информацию VPD. starz 6 лет назад 0

Похожие вопросы