芯片下传感器偏移超过255时读取数据

问题描述

芯片下存在传感器偏移超过255,配置Chip对象和Scanner对象后

  1. 当Chip对象的OffsetWidth值为1时,现象为偏移255以内的传感器能读到值;255以外的报错 bus: I2c, read failed: smc.lua:89: bad argument #2 to ‘s_pack’ (unsigned overflow)。
  2. 当Chip对象的OffsetWidth值为2时,现象为偏移255以内的传感器能读到值,但原始值不对;值为几万,偏移255以外的传感器能读到正确的值

环境信息

  • 软件版本:OpenUBMC2509

  • 硬件配置:920模组

期望结果

期望可以读到偏移超过255的传感器值

尝试过的解决方案

  1. 配置两个访问相同地址、OffsetWidth分别为1和2的对象。实际不行,可能存在机制会合并处理相同的对象
  2. 配置SmcDfxInfo来读超过255的数据。结果不行

答案内容由AI生成,仅供参考:

总结

项目 内容
问题本质 OffsetWidth 设置不当 + Lua s_pack 打包溢出导致高偏移地址读取失败
根本原因 偏移 > 255 时使用 OffsetWidth=1 超出 uint8 范围,引发 unsigned overflow
短期解决 统一设置 OffsetWidth=2,修正 Scanner 中的 Offset 与数据解析逻辑
长期建议 升级至 OpenUBMC 2512 或更高版本,验证是否已修复此类边界问题
验证方法 使用 ipmitool sensoripmcget 查看是否能读取到高偏移传感器的正确值

:warning: 重要提醒:避免混合配置不同 OffsetWidth 的对象,系统可能自动合并导致行为不可控。统一规划并全局配置是最稳妥做法。

点击此处查看详细分析解答

芯片下传感器偏移超过255时读取数据问题分析与解决方案

问题概述

当芯片下的传感器配置偏移(Offset)超过255时,系统在读取数据过程中出现异常。该问题与Chip对象的OffsetWidth属性配置密切相关,具体表现为:

  • OffsetWidth=1:仅能正确读取偏移≤255的传感器数据;偏移>255的传感器读取失败,并报错 unsigned overflow
  • OffsetWidth=2:偏移≤255的数据读取值错误(原始值异常如几万),而偏移>255的数据可被正确读取。

此问题影响对高偏移地址传感器的正常访问,导致部分硬件监控功能失效。


根本原因分析

1. OffsetWidth 定义与作用

根据知识库内容,OffsetWidth 是访问硬件寄存器时用于表示偏移地址宽度的参数(单位为字节)。其作用决定了如何打包和解析 I2C/SMBus 通信中的地址字段。

  • OffsetWidth = 1:表示偏移地址使用 1 字节(范围 0x00 ~ 0xFF,即 0 ~ 255)
  • OffsetWidth = 2:表示偏移地址使用 2 字节(范围 0x0000 ~ 0xFFFF,即 0 ~ 65535)

2. 错误日志溯源

从错误日志:

chip: Smc_CpuBrdSMC_0101, bus: I2c_1, read failed: smc.lua:89: bad argument #2 to ‘s_pack’ (unsigned overflow)

结合知识库实体 "Eeprom_EXU_0101" 描述可知:

“Eeprom_EXU_0101 is a chip identified in the error log, located on the I2c_2 bus, which failed to read due to an unsigned overflow error in the s_pack function.”

s_pack 是 Lua 中用于打包二进制数据的函数,当尝试将一个大于 255 的值以单字节无符号整数(u8)形式写入时,就会触发 unsigned overflow 错误。

因此:

  • OffsetWidth=1 但实际偏移 > 255 时,系统试图将一个超出 uint8 范围的值打包,导致溢出报错。
  • OffsetWidth=2 时,虽然可以支持更大偏移,但对于原本仅需 1 字节表示的小偏移(如 < 255),由于未正确进行字节序或格式转换,可能导致解析结果异常(例如显示为几万)。

3. 硬件通信帧构造问题

知识图谱中提到:

"Chip_PCIeSwitch", "I2C Communication Frame": “Incorrect register access due to misconfigured OffsetWidth causes the I2C communication frame to be improperly constructed.”

这表明错误的 OffsetWidth 配置会导致 I2C 协议层的数据帧结构错误,从而引发通信失败或数据错乱。


尝试方案分析

方案一:配置两个不同 OffsetWidth 的对象

尝试同时配置 OffsetWidth=1OffsetWidth=2 的对象来分别读取高低偏移传感器。

结果失败原因分析

  • OpenUBMC 的硬件代理(hwproxy)组件会对相同或重叠的硬件资源进行合并管理,避免重复扫描。
  • 系统识别出两个对象指向同一物理芯片(Chip),即使 OffsetWidth 不同,也可能仅保留一个实例或产生冲突,导致机制失效。

结论:资源管理机制限制了多配置共存,不可行

方案二:使用 SmcDfxInfo_exu 读取大偏移数据

尝试通过 SmcDfxInfo_exu 配置来获取偏移大于255的数据。

尽管 SmcDfxInfo_exu 是专用于 SMC 芯片诊断信息读取的配置对象,并设置了 Offset=7424, Size=2, Period=400 等参数,但在实际运行中:

  • smc_interface.lua 模块尝试读取时仍受底层 I2C 协议和 OffsetWidth 限制。
  • SMC read (get dfx info) fail 错误说明该路径仍然依赖底层通信机制,未能绕过 s_pack 的打包限制。

结论:SmcDfxInfo_exu 本身不解决底层通信协议限制,无法规避溢出问题


解决方案建议

:white_check_mark: 推荐方案:统一设置 OffsetWidth=2 并修正读值逻辑

步骤一:确保所有相关 Chip 对象设置 OffsetWidth=2

{
  "Chip": {
    "Address": 144,
    "AddrWidth": 1,
    "OffsetWidth": 2,
    "ReadTmout": 0,
    "WriteTmout": 0
  }
}

确保整个设备树中对此类 SMC/EEPROM 器件统一使用双字节偏移宽度。

步骤二:修正 Scanner 配置中的 Offset 表达式

由于 JSON 不支持十六进制,需将原十六进制偏移(如 0x300 = 768)转换为十进制并在配置中显式声明:

{
  "Scanner": {
    "Chip": "#/Smc_CpuBrdSMC_0101",
    "Offset": 768,
    "Size": 2,
    "Type": 0,
    "Period": 500
  }
}

步骤三:验证并修复数据解析逻辑(关键!)

问题“值为几万”是由于字节序(Endianness)或类型解析错误导致。例如:

  • 若返回两个字节 [0x12, 0x34],若按小端序解析为 0x3412 = 13330,而实际应为大端 0x1234 = 4660

解决方式

  • 修改 Scanner 所关联的 bmc.kepler.hwproxyfrudata_service.lua 脚本中数据解析逻辑,确保使用正确的字节序和数据类型。
  • 可通过调试命令 ipmcget -d v 查看原始返回值,比对预期值以确认解析逻辑。

步骤四:启用调试日志辅助排查

建议启用以下调试手段:

  • 启用 hwproxyfrudata_service.lua 的 trace 日志;
  • 使用 ipmitool raw 手动发送读取命令验证底层通信;
  • 检查 Lua 层 s_pack/s_unpack 调用是否带正确格式符(如 'S' 表示 uint16)。

已知修复进展

根据知识库中的社区反馈:

“已知问题,传感器超出 255 个,超出部分的传感器信息异常”
“是的,已在 2512 版本中修复”

虽然此描述针对“数量超出255”,但暗示 OpenUBMC 团队已意识到 与 255 相关的边界处理缺陷,并在 2512 版本中进行了修复。

建议:

  • 升级至 OpenUBMC 2512 或更高版本,可能已包含对 OffsetWidths_pack 溢出问题的底层修复。

总结

项目 内容
问题本质 OffsetWidth 设置不当 + Lua s_pack 打包溢出导致高偏移地址读取失败
根本原因 偏移 > 255 时使用 OffsetWidth=1 超出 uint8 范围,引发 unsigned overflow
短期解决 统一设置 OffsetWidth=2,修正 Scanner 中的 Offset 与数据解析逻辑
长期建议 升级至 OpenUBMC 2512+ 版本,验证是否已修复此类边界问题
验证方法 使用 ipmitool sensoripmcget 查看是否能读取到高偏移传感器的正确值

:warning: 重要提醒:避免混合配置不同 OffsetWidth 的对象,系统可能自动合并导致行为不可控。统一规划并全局配置是最稳妥做法。

相关链接:

  1. ipmitool sensor与ipmcget -t sensor -d list返回不同
  2. 首页左上角logo访问权限异常
  3. CPU出错录像测试方式求助
  4. 部分NPU AICORE Temp传感器读取速度慢
  5. 资源协作接口 | 文档中心 | openUBMC


不同偏移位宽场景下,封装偏移所占用的字节是不一样的,OffsetWidth值为1时,超过255的偏移封装是失败的。要访问偏移超过255的需要偏移位宽为2以上,偏移位宽的设置主要是根据对应的器件的规格设置。你现在访问的是什么器件?

访问模组或基础板上VRD芯片的传感器,下图为920模组上的VRD芯片,访问该芯片目的为读取列表中的传感器值,其中VDDQ_CD和HVCC的偏移为0x18b,VDDQ Temp的偏移为0x18d
BMC I2C1——CpuBrdSMC——I2cMux1/I2cMux2——Chip_Vrd0、1、2、3——传感器


器件如果需要2字节偏移,Offsetwidth必须配置2。我记得Vrd有切页的逻辑,那部分应该是cpld实现的,可以咨询下cpld逻辑那边是怎么处理的。

没太明白切页逻辑的意思。同一台机器,同一个920模组及对应的920模组逻辑,使用V2的BMC固件,是可以正常读取到上述8个传感器的值的,并且Chip对象配置的OffsetWidth是1,偏移配的也是一样的。所以按我理解应该是V2、V3这块处理差异问题叭?

V2配置的xml类是Vrd还是Chip

Vrd类

V2的Vrd类是器件通过i2c和BMC直接通信的,里面有独立的切页逻辑;V3看你提供的topo,vrd器件实际是通过smc管理的,通过逻辑透传,这里切页逻辑不在BMC做的,是逻辑做的。两个是不同的实现,所以我建议你咨询下cpld逻辑那边

找驻场的逻辑同事看了920模组逻辑代码,CPLD没有对数据进行处理,BMC通过SMC forward和Vrd通信,相当于I2C直连,这部分对CPLD不可见

而且使用的是同一台机器,分别用V2、V3的固件,所以应该不存在切页逻辑分别由BMC、CPLD实现,应该是都由BMC实现的吧,可以展开讲讲一下V2 Vrd类的切页逻辑吗?切页是指VRD芯片支持页寄存器(page select)吗?

应该是00h吧,先往00h写,再读

如果是透传的话,我理解你在csr配置的时候应该是Vrd类而不是Chip类