我正在尝试通过 CentOS 7 Linux 上的 i2c 访问串行存在检测数据。我主要寻找位于字节 1 的 SPD 修订版,并且在 DDR3 和 DDR4 图表上是一致的。 SPD 修订版无法通过 dmidecode、lshw 或任何其他标准 linux 软件包找到,并且在某些情况下无法通过 Passmark 的 Memtestx86 检测到,这让我走上了这条路。我还使用 smbus2 库制作了一个 python 实现,但它的数据基于同一个内核模块 i2c-dev。
为了让您了解我的期望,这是使用 i2c 方法在英特尔赛扬处理器上的 DDR3 DIMM 的输出。
[root@localhost ~]# lsmod | grep i2c
i2c_dev 13985 0
i2c_i801 22736 0
i2c_algo_bit 13413 2 igb,i915
# yum install i2c-tools
[root@localhost ~]# i2cdetect -l
i2c-0 i2c i915 gmbus ssc I2C adapter
i2c-1 i2c i915 gmbus vga I2C adapter
i2c-2 i2c i915 gmbus panel I2C adapter
i2c-3 i2c i915 gmbus dpc I2C adapter
i2c-4 i2c i915 gmbus dpb I2C adapter
i2c-5 i2c i915 gmbus dpd I2C adapter
i2c-6 i2c DPDDC-B I2C adapter
i2c-7 smbus SMBus I801 adapter at e000 SMBus adapter
[root@localhost ~]# i2cdetect -y 7
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- 08 -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 51 -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
请注意,此特定 DIMM 的 SPD 版本为 1.3。
[root@localhost ~]# i2cdump -y 7 0x50
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 92 13 0b 03 04 21 02 01 03 11 01 08 0a 00 fe 00 ?????!???????.?.
10: 69 78 69 30 69 11 18 81 20 08 3c 3c 00 f0 83 05 ixi0i??? ?<<.???
20: 00 00 00 00 00 00 00 00 00 88 00 00 00 00 00 00 .........?......
30: 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 41 00 ............??A.
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
70: 00 00 00 00 00 86 f1 02 20 11 01 10 00 02 7c 07 .....??? ???.?|?
80: 4d 33 53 54 2d 34 47 4d 53 43 4c 50 43 2d 50 20 M3ST-4GMSCLPC-P
90: 20 20 00 00 80 2c 4d 30 53 32 2d 32 30 30 33 30 ..?,M0S2-20030
a0: 39 30 31 30 00 00 00 00 00 00 00 00 00 00 00 00 9010............
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[root@localhost ~]#
现在我试图在不同的主板上运行类似的测试,但我无法检测到 SPD 数据。主板和处理器包含在下面的 dmesg 日志中。
[root@localhost ~]# modprobe i2c-dev
[root@localhost ~]# i2cdetect -l
i2c-0 i2c igb BB I2C adapter
i2c-1 i2c igb BB I2C adapter
i2c-2 smbus SMBus PIIX4 adapter port 0 at 0b00 SMBus adapter
i2c-3 smbus SMBus PIIX4 adapter port 2 at 0b00 SMBus adapter
i2c-4 smbus SMBus PIIX4 adapter port 3 at 0b00 SMBus adapter
i2c-5 smbus SMBus PIIX4 adapter port 4 at 0b00 SMBus adapter
[root@localhost ~]# i2cdetect -y 2
...
[root@localhost ~]# i2cdetect -y 3
...
[root@localhost ~]# i2cdetect -y 4
...
[root@localhost ~]# i2cdetect -y 5
...
来自 dmesg
...
[ 0.000000] DMI: Supermicro Super Server/H12SSW-AN6, BIOS 2.4 02/23/2022
...
[ 1.447669] smpboot: CPU0: AMD EPYC 7402P 24-Core Processor (fam: 17, model: 31, stepping: 00)
...
[ 233.696793] i2c /dev entries driver
[ 265.088648] i2c i2c-2: SMBus Timeout!
[ 265.091939] i2c i2c-2: Failed reset at end of transaction (01)
[ 265.095368] i2c i2c-2: Failed! (01)
...
[ 302.537291] i2c i2c-3: Failed! (01)
...
[ 303.721286] i2c i2c-4: Failed! (01)
...
[ 304.841296] i2c i2c-5: Failed! (01)
...
仅供参考,我所有测试的系统都运行内核版本
3.10.0-1160.71.1.el7.x86_64
.
根据我上面所包含的内容,我怀疑 CentOS 7 中缺少一个内核模块,阻止我与那些相关的 i2c 设备连接,但不能完全确定。也许这是内核开发人员的疏忽?也许它适用于较新的内核。
在我对我的特定问题找不到什么之后,我偶然发现了这个 https://developer.amd.com/e-sms/ 带我去 https://github.com/amd/apml_modules/ 但我认为这些模块不会解决我的问题。
以防其他人在未来偶然发现这个问题,我建议观看 Jean Delvare 的视频演示。他从本质上解释了 DDR3 之后系统可读性的差异,并使我们的选择很少。
没有明显的 Linux 解决方案,您最好的选择可能是 dmidecode as i2c。 PassMark 的 RAMMon 和 Memtest86 都显示“未检测到 SPD”错误。我能够使用以下方法在我的 Windows PC 上成功读取 DDR4 Thaiphoon Burner 免费版