![如何通过 pci 设备中的 SMBus/I2C 访问 VPD?](https://linux22.com/image/1551743/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20pci%20%E8%AE%BE%E5%A4%87%E4%B8%AD%E7%9A%84%20SMBus%2FI2C%20%E8%AE%BF%E9%97%AE%20VPD%EF%BC%9F.png)
与 IPMI 查询的内容类似,我将如何通过 SMBus/I2C 访问目标服务器中每个设备的 VPD?我需要驱动程序吗?还是 i2c-dev 模块就足够了?如果我有多个存储设备连接到服务器,如何验证目标总线上的哪个是哪个?
我正在使用 i2cdetect 来验证 i2c 总线,但是,我无法验证我的设备连接到哪条总线,或者它是否有总线。我知道我需要一个 i2c 总线/适配器来确定实际的 i2c 设备。创建 i2c 客户端可以做到这一点,但我仍然需要验证其总线连接,并且创建 i2c 客户端使其仅限于定义 id_table 中枚举的 i2c 设备。我希望它尽可能地检测所有存储设备,无论它是否有 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: -- -- -- -- -- -- -- --
任何回复都将不胜感激。非常感谢。
答案1
在答案中重复评论中已经提到的内容:
首先,确定当前的 I2C 适配器是否已加载驱动程序i2detect -l
。
从适配器的名称通常可以猜出其功能,Radeon
适配器用于扩展显示识别码(显示器信息),并且SMBus I801
适配器来自主板,作为南桥的一部分(您将通过 看到它lspci
)。
请注意,编号在引导过程中可能不一致。要找到正确的适配器,请查看 的内容/sys/bus/i2c/devices/i2c-*/name
。
下一步是识别连接到特定适配器的 I2C 设备。 在您的例子中,这是适配器编号8
,因此i2cdetect -y 8
是必要的命令。
电可擦除只读存储器通常地址从50
到53
。一般来说,很难找出特定地址连接的特定芯片;仔细检查硬件、注意芯片编号并查找数据表以缩小可能的 I2C 地址范围会有所帮助。
但 EEPROM 相当标准。您可以使用内核eeprom
驱动程序访问 EEPROM;在 modprobing 之后,内容将显示在 下/sys/bus/i2c/drivers/eeprom/
。
在我的主板上,我有两个 DIMM RAM 的 EEPROM,分别位于50
和52
,我可以使用decode-dimms
Debiani2c-tools
软件包中的程序来解码重要产品数据 (VPD)的 DIMM。
您系统上的这些设备可能也只是 RAM VPD,而 NVME VPD 位于其他地方。您的 NVME 也可能使用不同适配器上的其他 I2C 总线,并且您没有为该适配器加载 Linux 内核驱动程序(或者尚未有人编写此类驱动程序)。
但至少现在您知道如何使用它i2cdetect
来识别 EEPROM。
编辑
正如评论中所说,BMC 微控制器与主机 CPU 完全不同,并且它可能可以访问与主机 CPU 不同的硬件。因此,“但为什么 BMC 可以看到它?”的答案是“因为它完全不同,并且 BMC 能做什么和不能做什么不一定会影响主机 CPU 能做什么和不能做什么”。
话虽如此,你真正的问题似乎是“我如何才能访问主机 CPU 上的 NVME 的 VPD”。我在 Google 上搜索了NVME 管理接口规范,并且表示管理端点可以通过 I2C/SMBus 端口和 PCIe 端口访问。
因此,我的猜测是,您的硬件的管理端点只能通过 PCIe 访问。
进一步谷歌搜索发现管理端点 CLIioctls
它可以通过Linux驱动程序工作nvme
,至少从我快速浏览的代码来看是这样的。
因此,我会代替您尝试使用此工具来访问您硬件上的管理端点接口,看看您是否无法通过这种方式获取 VPD。
我这里没有NVME设备,所以无法测试。