目录
背景
分析
驱动影响
SPD register 接口
只读
修改验证
总结
背景
x86 smbus上下挂一个eeprom,只能读取,不能写入。
写入命令采用:
i2cset -y -f 0 0x50 0 0x33 即向总线0 下的0x50 地址的eeprom偏移量0 写入数据0x33,
命令输出 write failed.
分析
驱动影响
查看 /sys/bus/i2c/下的设备信息,为:
cd /sys/bus/i2c/devices/
0-0036/ 0-0037/ 0-0050/ i2c-0/ i2c-1/ i2c-2/ i2c-3/ i2c-4/ i2c-5/ i2c-6/ i2c-7/ i2c-8/
进而查看 0-0050 下面的name字段,查看名称为ee1004.
走读内核代码, ee1004.c drivers\misc\eeprom
以及lsmod 查看,可知存在驱动ee1004, 进而看上电 dmesg信息:
[ 2.647416] ee1004 0-0050: 512 byte EE1004-compliant SPD EEPROM, read-only
此处显示0x50 被识别为 SPD EEPROM,并且只读。
针对如此,我们将ee1004驱动加入到/etc/modeprobe.d/backlist.conf中,使这个驱动不被加载。然而将此驱动不加载后,依然不能写,而且查看 /sys/bus/i2c/devices下面的设备0-0050依然存在,并且名字为ee1004.
SPD register 接口
根据上面的分析,我们注意到SPD这个信息,同时联想到X86 对内存的访问配置,于是继续分析dmesg信息,我们查找SPD关键字,并查看前后几行信息:
[ 0.858493] i2c i2c-0: 1/4 memory slots populated (from DMI)
[ 0.858861] i2c i2c-0: Successfully instantiated SPD at 0x50
代码在 i2c-smbus.c drivers\i2c 中,其中slot_count 和dimm_count分别为上面打印中1/4中的4和1。于是我们得到在eeprom地址为0x50-0x53时,会被此接口注册,将设备添加到i2c设备树下面。
于是,我们将eeprom的地址修改为0x57
再次重新上电,/sys/bus/i2c/devices下已经没有0-0050设备。
然而,我们依然不能对其进行写。
只读
再次回到dmesg信息,第一节提到的 read-only:
1) eeprom有写保护机制,这个由硬件管脚决定,和硬件确认进行写保护的连接。
2) dmesg里面一条关键信息
[ 1.477401] i801_smbus 0000:00:1f.4: SPD Write Disable is set
根据此条信息,走读桥片手册,smbus控制器部分,其中:
lspci -xxx -s 0:1f.4
00:1f.4 SMBus: Intel Corporation 100 Series/C230 Series Chipset Family SMBus (rev 31)
00: 86 80 23 a1 03 00 80 02 31 00 05 0c 00 00 00 00
10: 04 a0 82 df 00 00 00 00 00 00 00 00 00 00 00 00
20: 41 f0 00 00 00 00 00 00 00 00 00 00 86 80 70 72
30: 00 00 00 00 00 00 00 00 00 00 00 00 0b 01 00 00
40: 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
确认0x40寄存器为11,即SPDWD位被设置为1。那就是针对 0X50 -0X57地址段的设备都不能被写。
修改验证
此寄存器位位RW/O ,即read-write-once,在系统中已经不能写入。
验证
1) 在BIOS中将此位清除,则eeprom可以正常写。
2) smbus下挂非0x50-0x57的设备,例如本测试用的0x72的设备,即使SPDWD为1,依然可以写入。
总结
为避免SPD被误写入,x86控制器引入此位,然而在我们的环境中,内存都用的颗粒,无需spd,同时下挂eeprom,导致被误伤。