Wie wird auf den VPD in einem PCI-Gerät über SMBus / I2C zugegriffen?

1260
starz

Ähnlich wie bei der Abfrage von IPMI, wie kann ich über SMBus / I2C von jedem Gerät in einem Zielserver auf VPD zugreifen? Benötige ich dafür einen Treiber oder reicht das i2c-dev-Modul aus? Wie kann ich feststellen, welche auf einem Zielbus ist, wenn mehrere Speichergeräte an einen Server angeschlossen sind?

Ich verwende i2cdetect, um den i2c-Bus zu überprüfen. Ich kann jedoch nicht überprüfen, welchen Bus mein Gerät angeschlossen hat, oder hat es überhaupt einen Bus. Ich weiß sicher, dass ich einen i2c-Bus / Adapter brauche, um das tatsächliche i2c-Gerät zu ermitteln. Das Erstellen eines i2c-Clients kann dies tun, aber ich muss immer noch seine Busverbindung überprüfen. Wenn Sie einen i2c-Client erstellen, ist die Definition der in der id_table aufgeführten i2c-Geräte eingeschränkt. Ich möchte so viel wie möglich alle Speichergeräte erkennen, unabhängig davon, ob es ein i2c-Gerät hat oder nicht.

i2cdetect-Ausgänge:

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-Ausgabe:

 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: -- -- -- -- -- -- -- --  

Alle Antworten werden geschätzt. Vielen Dank.

0
Es tut mir leid, ich kann deine Frage nicht verstehen. Angenommen, Sie verfügen über ein Embedded-System mit mehreren I2C-Adaptern und über I2C-Clients, die mit den Bussen verbunden sind. Der erste Schritt besteht darin, in Ihrer Frage zu beschreiben, welches System Sie haben, welche I2C-Adapter es hat und welche Clients auf Hardwareebene eine Verbindung herstellen. Wenn Treiber für Ihre Adapter vorhanden sind, lesen Sie `dmesg` und unter` / sys / bus / i2c`, falls sie angezeigt werden. Sie können über die Schnittstelle mit I2C-Clients kommunizieren, mir sind jedoch keine Treiber für IPMI-ähnliche Protokolle bekannt. Daher müssen Sie diese Protokolle selbst implementieren. dirkt vor 6 Jahren 0
Vielen Dank für die Antwort, Sir. Ich habe ein eeprom mit nvme Gerät verbunden. Ähnlich wie das Abfragen von IPMI kann IPMI die VPD-Informationen von eeprom auf jedem nvme-Slot abfragen. Ich möchte nur wissen, wie IPMI diese Informationen abfragt. Wenn ich i2cdetect verwende, das die i2c-Geräte im System ermittelt, weiß ich wirklich nicht, wo mein Gerät angeschlossen ist. Wie kann IPMI diese VPD-Informationen an jedem Steckplatz im System erkennen? Ich bin mir ziemlich bewusst, wie man Informationen abfragt, ob der i2c- * bus bekannt ist und die Adresse. Ich habe jedoch keine Ahnung, wie ich den genauen Bus im System ermitteln kann. Irgendeine Idee, Sir? starz vor 6 Jahren 0
Weitere Infos Sir. Wie gesagt, ich habe ein nvme-Gerät mit eeprom, ich möchte über SMBus / I2C auf die VPD-Informationen meines Geräts zugreifen. Ich habe bereits einen Code zum Abfragen, aber er benötigt die Eingabeparameter von / dev / i2c- * und die Adresse des EEPROM. Ich habe bereits die Adresse, aber ich weiß nicht, welcher i2c- * mein Gerät angeschlossen ist. Ist dieser Ansatz in Ordnung? Es ist ungefähr so, wie IPMI die gleichen Informationen abfragt. danke für alle informationen. starz vor 6 Jahren 0
Ratet mal: Der IPMI BMC hat diese Informationen irgendwo in seiner Firmware. Außerdem sind die I2C-Adapter im BMC nicht unbedingt gleich oder in derselben Reihenfolge wie die I2C-Adapter auf dem Host. Wenn Sie nach einem EEPROM suchen, funktioniert "i2cdetect" ziemlich zuverlässig, und die EEPROMs verfügen normalerweise über bekannte Adressen. Können Sie Ihre Frage mit der Ausgabe von `i2cdetect` für alle Adapter bearbeiten? dirkt vor 6 Jahren 0
Nochmals vielen Dank, Sir. Frage wurde aktualisiert, um die Ausgabe von i2cdetect hinzuzufügen. Ich habe BMC gelesen, aber ich konnte mich nicht so tief damit auseinandersetzen, da ich keinen damit zusammenhängenden Quellcode sehen kann. In Bezug auf i2cdetect, das ist mein Problem, ich weiß nicht, ob i2cdetect feststellen kann, wo sich mein eeprom-Gerät befindet oder ob es überhaupt angezeigt wird. Was ich in der Liste sehe, ist ein Haufen VGA i2c und ein SMBus-Adapter, nachdem ich das i2c-i801-Modul geladen habe. Ich habe 5 PCI-Slot, von denen 2 x16 sind. 1 VGA-Karte eingelegt und 1 nvme-Gerät mit eeprom. Wie können Sie mir eine Idee geben, wie ich mein eeprom abrufen oder ermitteln kann? Danke noch einmal starz vor 6 Jahren 0
Ja, es gibt keinen öffentlichen Quellcode für den BMC. Deshalb ist es so schwer herauszufinden ... Sie haben nur die Ausgabe von `i2cdetect -l 'aufgenommen. Sie müssen den Bus selbst prüfen. Die Radeon-Busse sind für EDID, während sich der I801 auf dem Motherboard befindet. Bearbeiten Sie also die Frage mit der Ausgabe von `i2cdetect -y 8`. Einrücken von vier Leerzeichen für die korrekte Formatierung. dirkt vor 6 Jahren 0
Danke, aktualisierte Frage, um Adressen für i2c-8 aufzunehmen. Danke noch einmal. starz vor 6 Jahren 0

1 Antwort auf die Frage

0
dirkt

Um zu wiederholen, was bereits in den Kommentaren erwähnt wurde:

Identifizieren Sie zunächst die aktuellen I2C-Adapter, für die Treiber geladen sind i2detect -l.

Aus dem Namen des Adapters kann man oft die Funktion erraten, die RadeonAdapter sind für EDID (Monitorinformationen) und der SMBus I801Adapter ist vom Motherboard als Teil der Southbridge (Sie werden es sehen lspci).

Beachten Sie, dass die Nummerierung möglicherweise nicht konstant ist. Um den richtigen Adapter zu finden, sehen Sie sich den Inhalt von an /sys/bus/i2c/devices/i2c-*/name.

Der nächste Schritt besteht darin, I2C-Geräte zu identifizieren, die an einen bestimmten Adapter angeschlossen sind. In Ihrem Fall ist dies die Adapternummer 8, also i2cdetect -y 8der notwendige Befehl.

EEPROMs haben normalerweise Adressen von 50bis 53. Im Allgemeinen ist es ziemlich schwierig herauszufinden, welcher Chip an einer bestimmten Adresse angeschlossen ist. die Hardware genau zu untersuchen, die Chipnummern zu notieren und nach Datenblättern zu suchen, um mögliche I2C-Adressen einzugrenzen, hilft.

EEPROMs sind jedoch ziemlich standard. Sie können mit dem Kernel- eepromTreiber auf die EEPROMs zugreifen . Nach dem Modifizieren wird der Inhalt unter angezeigt /sys/bus/i2c/drivers/eeprom/.

Auf meinem Motherboard habe ich EEPROMs für zwei DIMM-RAMs 50und 52kann das decode-dimmsProgramm aus dem Debian- i2c-toolsPaket verwenden, um die Vital Product Data (VPD) der DIMMs zu decodieren .

Es ist möglich, dass diese Geräte in Ihrem System auch nur RAM-VPDs sind, und die NVME-VPDs sind woanders. Es ist auch möglich, dass Ihre NVMEs einen anderen I2C-Bus auf einem anderen Adapter verwenden, und Sie haben keinen Linux-Kernel-Treiber für diesen Adapter geladen (oder noch niemand hat einen solchen Treiber geschrieben).

Zumindest wissen Sie jetzt, wie Sie i2cdetectEEPROMs identifizieren können.

Bearbeiten

Wie in den Kommentaren erwähnt, unterscheidet sich der BMC-Mikrocontroller vollständig von der Host-CPU. Möglicherweise hat er Zugriff auf andere Hardware als die Host-CPU. Also die Antwort auf "aber warum kann der BMC es sehen?" ist "weil es völlig anders ist und was der BMC tun kann und was nicht, beeinflusst nicht unbedingt das, was die Host-CPU kann und was nicht".

Ihre eigentliche Frage ist anscheinend "Wie kann ich auf die VPD von NVME auf der Host-CPU zugreifen". Ich habe die NVME-Verwaltungsschnittstellenspezifikation gegoogelt und besagt, dass Verwaltungsendpunkte sowohl über einen I2C / SMBus-Port als auch über einen PCIe-Port erreicht werden können.

Meine Vermutung wäre also, dass der Management Endpoint Ihrer Hardware nur über PCIe erreichbar ist.

Weiteres Googeln fand eine Management Endpoint-CLI, die über ioctlsden Linux- nvmeTreiber funktioniert, zumindest durch den kurzen Blick auf den Code, den ich gemacht habe.

An Ihrer Stelle würde ich mit diesem Tool versuchen, auf die Management Endpoint-Oberfläche Ihrer Hardware zuzugreifen und zu prüfen, ob Sie die VPD auf diese Weise nicht erhalten können.

Ich habe kein NVME-Gerät hier und kann daher nicht testen.

Vielen Dank für alle Antworten, Sir. Info hinzugefügt, ich habe 4 DIMMs in meinem Setup. Außerdem habe ich für den Bus 8 versucht, mein nvme aus dem PCI-Slot zu entfernen, und es werden immer noch die -y-Ausgangsadressen angezeigt. Scheint, mein eeprom ist nicht eingeloggt. Ich gehe davon aus, dass Sie, ähnlich wie Sie es gesagt haben, einen Adaptertreiber benötigt, jedoch auf die Idee zurückkam, wie IPMI mein eeprom VPD abfragen kann, selbst wenn es nicht den i2c-Bus oder sogar meine eeprom-Adresse anzeigt in i2cdetect. Auch wenn i801 nicht modifiziert ist, kann IPMI die VPD-Informationen weiterhin anzeigen. Noch mehr Ideen, Sir? Ich freue mich sehr darauf, alle meine Fragen zu beantworten. starz vor 6 Jahren 0
Sir, ich bin mit diesem Ansatz bei Ioctls vertraut. Was ich eigentlich entwickeln möchte, ist eine Abfrage mit zwei Ansätzen für den Zugriff auf VPD, und ich bin damit schon fertig, diese werden als eingebundene Befehle bezeichnet. Ausgehende Befehle erfolgen über SMBus / I2C. Dafür entwickle ich. Zu Ihrer Information benötigen eingehende Befehle Firmware-Unterstützung, während ausgehende Befehle direkt auf Hardwarekomponenten zugreifen können, um Informationen zu erhalten, die auf einem bestimmten Gerät gespeichert sind. Ehrlich gesagt, ich habe bereits NVME-MIS rot gemacht und es macht mich wirklich aus der Idee heraus, dass es nur erklärt, anstatt mir eine gründliche Codediskussion zu geben. starz vor 6 Jahren 0
Zusätzlicher Ansatz, den ich gemacht habe, habe ich auch über IPMIs Open Source oder CLIs geforscht, ich habe nur das SMCIPMITool, das über CLI mit nvme VPD-Informationen ausgeführt werden kann. Andere Tools wie IPMITool mit Open Source verfügen nicht über eine solche Funktion. SMCIPMITool ist in Java und das Paket ist binär, kein Quellcode. Ich habe also Schwierigkeiten zu suchen, wie das Tool solche VPD-Informationen abfragt. starz vor 6 Jahren 0