x86 smbus 下挂eeprom不能写问题

     

目录

     

 背景

        分析

        驱动影响

       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,导致被误伤。

     

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

proware

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值