Como o VPD é acessado via SMBus / I2C em um dispositivo pci?

0

Semelhante ao que o IPMI está consultando, como acessarei o VPD de cada dispositivo em um servidor de destino por meio do SMBus / I2C? Preciso de um driver para isso ou o módulo i2c-dev é suficiente? Como verificar qual é qual em um barramento de destino se eu tiver vários dispositivos de armazenamento conectados a um servidor?

Estou usando o i2cdetect para verificar o barramento i2c, no entanto, não consigo verificar em qual barramento meu dispositivo está conectado ou se ele tem um barramento em primeiro lugar. Eu sei que preciso de um barramento / adaptador i2c para determinar o dispositivo i2c real. A criação de um cliente i2c pode fazer isso, mas ainda preciso verificar sua conexão de barramento e, ao criar um cliente i2c, ele fica limitado a definir dispositivos i2c conforme enumerados no id_table. Tanto quanto possível, quero que ele detecte todos os dispositivos de armazenamento, independentemente de ter um dispositivo i2c ou não.

saídas 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 output:

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

Qualquer resposta será apreciada. Muito obrigado.

    
por starz 25.01.2018 / 06:34

1 resposta

0

Para repetir na resposta o que já foi mencionado nos comentários:

Primeiro, identifique os atuais adaptadores I2C para os quais existem drivers carregados com i2detect -l .

A partir do nome do adaptador, muitas vezes é possível adivinhar a função, os adaptadores Radeon são para EDID (Monitor informações), eo adaptador SMBus I801 é da placa-mãe como parte da southbridge (você verá com lspci ).

Observe que a numeração pode não ser constante entre os inicializadores. Para encontrar o adaptador correto, veja o conteúdo de /sys/bus/i2c/devices/i2c-*/name .

O próximo passo é identificar os dispositivos I2C conectados a um adaptador específico. No seu caso, esse é o número do adaptador 8 , portanto i2cdetect -y 8 é o comando necessário.

EEPROMs geralmente têm endereços de 50 a 53 . Em geral, é muito difícil descobrir qual chip específico está conectado em um determinado endereço; inspecionar o hardware de perto, observando os números dos chips e procurando por folhas de dados para diminuir possíveis endereços I2C ajuda.

Mas EEPROMs são razoavelmente padrão. Você pode acessar o EEPROMS com o driver% kerneleeprom; depois do modprobing, o conteúdo aparecerá em /sys/bus/i2c/drivers/eeprom/ .

Na minha placa-mãe, tenho EEPROMs para duas RAMs de DIMM em 50 e 52 , e posso usar o programa decode-dimms do pacote Debian i2c-tools para decodificar o Vital Product Data (VPD) dos DIMMs.

É possível que esses dispositivos em seu sistema também sejam apenas RAM VPDs e os NVD VPDs estejam em outro lugar. Também é possível que seus NVMEs usem um barramento I2C diferente em um adaptador diferente, e você não tem o driver do kernel Linux carregado para este adaptador (ou ninguém já escreveu um driver desse tipo).

Mas pelo menos agora você sabe como usar o i2cdetect para identificar EEPROMs.

Editar

Como dito nos comentários, o microcontrolador BMC é completamente diferente da CPU do host, e é possível que ele tenha acesso a hardware diferente do que a CPU hospedeira faz. Então a resposta para "mas por que o BMC pode vê-lo?" é "porque é totalmente diferente, e o que o BMC pode e não pode fazer não influencia necessariamente o que a CPU hospedeira pode e não pode fazer".

Dito isso, parece que sua verdadeira questão é "como posso acessar o VPD do NVME na CPU host". Eu pesquisei na especificação da NVME Management Interface , e ela diz que os Endpoints de gerenciamento podem ser alcançados por meio de um I2C / SMBus porta e uma porta PCIe.

Então, meu palpite é que o Management Endpoint do seu hardware só pode ser acessado via PCIe.

Além disso, o googling encontrou uma CLI de endpoint de gerenciamento , que funciona via ioctls no driver nvme do Linux, pelo menos da rápida olhada no código que eu fiz.

Então, em seu lugar, eu tentaria essa ferramenta para acessar a interface do Management Endpoint em seu hardware e ver se você não consegue obter o VPD dessa maneira.

Eu não tenho um dispositivo NVME aqui, então não posso testar.

    
por 30.01.2018 / 18:07

Tags