Bir pci cihazında SMBus / I2C üzerinden VPD'ye nasıl erişilir?


0

Hangi IPMI'yi sorguladığına benzer şekilde, bir hedef sunucudaki VPD'ye SMBus / I2C üzerinden nasıl erişirim? Bunun için bir sürücüye ihtiyacım var mı yoksa i2c-dev modülü yeterli mi? Bir sunucuya bağlı birkaç depolama aygıtım varsa, hangisinin hedef veriyolunda hangisi olduğunu nasıl doğrularım?

İ2c veriyolunu doğrulamak için i2cdetect kullanıyorum, ancak cihazımın hangi veri yolunun bağlı olduğunu veya ilk önce bir veri yolu olduğunu doğrulayamıyorum. Gerçek i2c cihazını belirlemek için bir i2c veriyoluna / adaptörüne ihtiyacım olduğunu biliyorum. Bir i2c istemcisi oluşturmak bunu yapabilir, ancak yine de veri yolu bağlantısını doğrulamam gerekiyor ve bir i2c istemcisi oluşturmak i2c cihazlarını id_table'da belirtilen şekilde tanımlamakla sınırlandırıyor. Olabildiğince, i2c aygıtı olup olmadığına bakılmaksızın tüm depolama aygıtlarını algılamasını istiyorum.

i2cdetect çıktıları:

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 çıkışı:

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

Herhangi bir cevap takdir edilecektir. Çok teşekkür ederim.


Üzgünüm, sorunuzdan pek bir anlam çıkaramıyorum. Birkaç I2C adaptörüne sahip yerleşik bir sisteminiz olduğunu ve veri yollarına bağlı I2C istemcilerinizin olduğunu varsayalım. İlk adım, sorunuzda hangi sisteme sahip olduğunuzu, hangi I2C adaptörlerine sahip olduğunu ve donanımda hangi müşterilerin ona bağlandığını açıklamaktır. Senin adaptörleri için sürücüler varsa, bakmak dmesgve altında /sys/bus/i2conlar kadar gösterirseniz. I2C istemcileriyle arabirim üzerinden iletişim kurabilirsiniz, ancak IPMI benzeri protokoller için sürücülerden haberdar değilim, bu yüzden bu protokolleri kendiniz uygulamak zorundasınız.
dirkt

Cevabınız için teşekkürler, efendim. Nvme cihazına bağlı bir eeprom var. IPMI'nin sorguladığı gibi, IPMI her nvme yuvasında eeprom'un VPD bilgilerini sorgulayabilir. IPMI'nin bu bilgileri nasıl sorguladığını bilmek istiyorum. Sistemdeki i2c aygıtlarını belirleyen i2cdetect kullanırsam, aygıtımın nereye bağlandığını gerçekten bilmiyorum. IPMI, bu VPD bilgilerini sistemdeki her yuvada nasıl algılayabilir? Eğer i2c- * bus biliniyorsa ve adres biliniyorsa bilgilerin nasıl sorgulanacağının farkındayım, ancak sistemdeki tam veriyolunun nasıl belirleneceği hakkında hiçbir fikrim yok. Herhangi bir fikir efendim?
starz

Ek bilgi Efendim. Dediğim gibi, üzerinde eeprom olan bir nvme cihazım var, cihazımın VPD bilgilerine SMBus / I2C üzerinden erişmek istiyorum. Sorgulama için zaten bir kodum var ancak / dev / i2c- * 'nin girdi parametrelerine ve eepromun adresine ihtiyacı var. Ancak, adresim zaten var, hangi i2c- * cihazımın takılı olduğunu nasıl bileceğime dair hiçbir fikrim yok. Bu yaklaşım tamam mı? IPMI'nin aynı bilgiyi nasıl sorguladığı gibi. herhangi bir bilgi için teşekkürler.
starz

Tahmin et: IPMI BMC, bu bilgiyi kendi yazılımı içinde bir yerde bulunduruyor. Ayrıca, BMC'deki I2C adaptörleri, ana bilgisayardaki I2C adaptörleriyle aynı veya aynı sırada değildir. Bir eeprom arıyorsanız, i2cdetectoldukça güvenilir bir şekilde çalışır ve eepromların genelde iyi bilinen adresleri vardır. Sorunuzu i2cdetecttüm adaptörler için olan çıktılarla düzenleyebilir misiniz ?
dirkt

Tekrar teşekkürler efendim. İ2cdetect çıktısını eklemek için güncellenmiş soru. BMC'yi okudum, ancak bununla ilgili herhangi bir kaynak kodunu göremediğim için o kadar derine giremedim. İ2cdetect ile ilgili olarak, bu benim sorunum, i2cdetect'in eeprom cihazımın nerede olduğunu veya ilk etapta görüntülenip görüntülenmeyeceğini belirleyip belirlemediğini bilmiyorum. Listede gördüğüm şey i2c-i801 modülünü yükledikten sonra bir demet VGA i2c ve bir SMBus adaptörü. 2 tanesi x16 olan 5 pci yuvam var. 1 VGA kartı takılı ve içinde eeprom bulunan 1 nvme cihazı. Eeprom'umun nereden alınacağı veya belirleneceği konusunda bana nasıl bir fikir verebilirsin? tekrar teşekkürler
starz

Yanıtlar:


0

Yorumda daha önce bahsedilenleri cevapta tekrarlamak için:

Öncelikle, yüklü sürücüleri bulunan mevcut I2C adaptörlerini tanımlayın i2detect -l.

Bağdaştırıcının adından bir kişi genellikle işlevi tahmin edebilir, Radeonbağdaştırıcılar EDID içindir (Monitör bilgileri) ve SMBus I801bağdaştırıcı anakarttan güney köprüsünün bir parçası olarak görür (göreceksiniz lspci).

Numaralandırmanın botlar arasında sabit olmayabileceğini unutmayın. Doğru adaptörü bulmak için, içeriğine bakın /sys/bus/i2c/devices/i2c-*/name.

Bir sonraki adım, belirli bir adaptöre bağlı I2C cihazlarını tanımlamaktır. Senin durumunda, bu adaptör numarası 8, i2cdetect -y 8gerekli komut da öyle.

EEPROMlar genellikle gelen adresleri 50için 53. Genel olarak, belirli bir adrese hangi yonganın belirli bir adrese bağlı olduğunu bulmak oldukça zor; Donanımı yakından incelemek, çip numaralarını not etmek ve olası I2C adreslerini daraltmak için veri sayfaları aramak yardımcı olur.

Ancak EEPROM'lar oldukça standart. EEPROMS'a çekirdek eepromsürücüsü ile erişebilirsiniz ; modprobing sonra, içeriği altında görünecektir /sys/bus/i2c/drivers/eeprom/.

Benim anakart, ben iki DIMM RAM için EEPROM'ları sahip 50ve 52ve ben kullanabilir decode-dimmsDebian programı i2c-toolskodunu çözmek için paketin Yaşamsal Ürün Verilerini (VPD) DIMM.

Sisteminizdeki bu cihazların da sadece RAM VPD'ler ve NVME VPD'lerin başka bir yerde olması mümkündür. NVME'nizin farklı bir adaptörde farklı bir I2C veriyolu kullanması da mümkündür ve bu adaptör için Linux çekirdek sürücüsü yüklü değildir (veya henüz böyle bir sürücü yazmadı).

Ancak en azından şimdi i2cdetectEEPROM'ları tanımlamak için nasıl kullanılacağını biliyorsunuz .

Düzenle

Yorumlarda belirtildiği gibi, BMC mikro denetleyicisi ana bilgisayar CPU'sundan tamamen farklıdır ve ana bilgisayar CPU'sundan farklı donanıma erişimi olabilir. Öyleyse cevap "ama neden BMC bunu görebiliyor?" "tamamen farklı olduğu ve BMC'nin yapabileceği ve yapamadığı şey, ana bilgisayar işlemcisinin yapabileceği ve yapamayacağı anlamına gelmez".

Bu, sizin asıl sorunuzun "ana bilgisayar CPU'sunda NVME'nin VPD'sine nasıl erişebilirim" gibi görünüyor. Ben googled NVME Yönetim Arabirimi şartname ve Yönetim Endpoints hem I2C / SMBus liman ve PCIe portu üzerinden ulaşılabilir söylüyor.

Bu yüzden benim tahminim, donanımınızın Yönetim Bitiş Noktası'na yalnızca PCIe aracılığıyla erişilebiliyor olmasıdır.

Daha fazla googling , en azından yaptığım koda hızlıca bakıldığında Linux sürücüsü üzerinden çalışan bir Yönetim Uç Noktası CLI buldu .ioctlsnvme

Böylece, sizin yerinizde, bu aracı donanımınızdaki Management Endpoint arabirimine erişmeye çalışacağım ve VPD'yi bu şekilde alamayacağınıza bakın.

Burada bir NVME cihazım yok, bu yüzden test edemiyorum.


Tüm cevaplar için teşekkürler, efendim. Eklenen bilgiler, kurulumumda 4 DIMM var. Ek olarak, veri yolu 8 için, pci yuvasındaki nvme ayarımı kaldırmaya çalıştım ve hala aynı -y çıkış adresleri görüntüleniyor. Görünüşe göre eeprom giriş yapılmadı. Söylediklerinize benzer şekilde, bir adaptör sürücüsüne ihtiyaç duyulduğunu varsayalım, ancak bu, IPMI'nin e2rom veri yolumu göstermesem bile eeprom VPD'mi nasıl sorgulayabileceği fikrine geri dönmemi sağladı. i2cdetect'te. İ801 modprobed olmasa bile, IPMI VPD bilgisini hala görüntüleyebilir. Başka fikriniz var mı efendim? Tüm sorularıma cevap verdiğiniz için teşekkür ederim.
Starz

Efendim, ioctls'deki bu yaklaşıma aşinayım. Aslında, geliştirmek istediğim, VPD'ye erişmek için yapılan çift yaklaşımlı bir sorgu ve zaten bununla işim bitti, bunlara bağlı komutlar deniyor. Dışa bağlı komutlar SMBus / I2C üzerindendir. Bunun için geliştiriyorum. FYI, dahili komutlar ürün yazılımı desteği gerektirir, dışarıdaki komutlar ise belirli bir cihazda depolanan bilgiler için donanım bileşenlerine doğrudan erişebilir. Açıkçası, ben zaten NVME-MIS'i kırmızılıyorum ve beni gerçekten ayrıntılı bir kod tartışması yapmak yerine açıkladığı fikrinden çıkarıyor.
Starz

Yaptığım ek bir yaklaşım, IPMI açık kaynak veya CLI'leri de araştırıyorum, bugüne kadar sadece SMCIPMITool'e yalnızca nLIl VPD bilgisine sahip CLI üzerinden çalışabiliyorum. Açık kaynaklı IPMITool gibi diğer araçlar da böyle bir özelliğe sahip değil. SMCIPMITool java'da ve paketi ikili dosyada, kaynak kodu yok, bu yüzden takımın VPD bilgilerini nasıl sorguladığını bulmakta zorlanıyorum.
Starz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.