BMC 读取扩展板CPLD会报错,返回值错误

问题描述

DC Cycle 过程中流程会自动停止,停止点出现在电源按键控制阶段(LongPushButton 下发)。

环境信息

  • 关键错误日志

fructrl ERROR: pwr_button.lua(40): set prop LongPushButton to 1 failed … chip: Smc_ExpBoardSMC_0101, bus: I2c_2, write failed: smc.lua:119: attempt to get length of local ‘data’ (a nil value)

  • 定位判断

Smc_ExpBoardSMC(扩展板/CPLD访问路径)在运行中出现写读异常,触发 LongPushButton 下发失败,从而导致 DC Cycle 自动停止。

问题不局限于 LongPushButton 对应命令字,Smc_ExpBoardSMC 路径上的其他命令字/offset 访问也会出现同类失败(data=nil、SMC completion code: 4、读写 ret 异常)。

期望结果

返回值正确,无报错

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

解决方案

1. 检查并升级CPLD固件版本

# 查询当前CPLD版本信息
busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Cpld/Cpld_1_0101 bmc.kepler.Chip.JtagTarget GetChipIdcode a{ss} 0

若版本过旧,请按照以下步骤升级:

  1. 确保BMC和CSR已先完成升级
  2. 上传正确的CPLD固件文件
  3. 执行升级命令后断电重启使新版本生效

2. 验证SMC配置正确性

检查CSR配置文件中关于Smc_ExpBoardSMC_0101的定义是否正确:

"Accessor_ShortPushButton": {
  "Chip": "#/Smc_ExpBoardSMC",
  "Offset": 134224384,
  "Size": 1,
  "Mask": 1,
  "Type": 0,
  "Value": 0
}

3. 修复软件逻辑缺陷

修改相关Lua脚本以正确处理错误情况:

-- 在smc.lua中添加对nil数据的检查
if data == nil then
    return error("SMC response data is nil")
end

4. 验证I2C总线状态

# 检查I2C总线连通性
i2cdetect -y -r <bus_number>
# 监测是否有总线干扰或从设备无响应情况

5. 完整升级顺序建议

根据配套升级要求,推荐按以下顺序操作:

  1. 升级并生效BMC
  2. 升级并生效CSR
  3. 升级CPLD(扩展板、基础板)
  4. 升级MCU
  5. 升级BIOS固件
  6. 通过下电/生效命令触发AC,激活所有固件变更
点击此处查看详细分析解答

BMC读取扩展板CPLD报错问题分析与解决方案

问题描述

在DC Cycle过程中,系统流程自动停止,故障点出现在电源按键控制阶段,具体表现为向LongPushButton下发指令时失败。关键错误日志显示BMC通过SMC协议访问扩展板CPLD时出现异常。

关键错误日志

fructrl ERROR: pwr_button.lua(40): set prop LongPushButton to 1 failed … chip: Smc_ExpBoardSMC_0101, bus: I2c_2, write failed: smc.lua:119: attempt to get length of local 'data' (a nil value)

此外,系统日志中还存在大量同类错误:

  • opcode not supported, SMC completion code: 1
  • i2c write fail, ret: 5
  • request error, opcode not supported

故障定位分析

根本原因

SMC控制器与扩展板CPLD之间的通信异常导致指令执行失败。问题不仅限于LongPushButton命令字,而是整个Smc_ExpBoardSMC路径上的读写操作都存在异常。

详细分析

  1. 通信协议层面

    • 根据知识图谱数据,Smc ExpBoardSmc_0101芯片通过I2C_8总线通信(关系:I2c_8 → Smc ExpBoardSmc_0101
    • 错误日志表明SMC命令执行时返回"opcode not supported",说明接收到的指令码不被目标设备支持
    • smc_interface.lua模块尝试读取Smc_CpuBrdSMC_0101时也因不支持的操作码而失败
  2. 硬件架构关系

    graph LR
    BMC -->|I2C_2| CPLD
    BMC -->|I2C_8| Smc_ExpBoardSMC_0101
    CPLD -->|控制信号| PowerSupply
    
  3. 版本兼容性问题

    • CPLDVersion与I2C/SMBus通信密切相关,过时的CPLD固件版本可能导致芯片通信失败
    • Bakbad用户曾确认CPLD通过I2C通信正常且能切换电源状态,表明基础通信能力存在
  4. 软件实现问题

    • signal.lua脚本负责管理信号处理和系统操作,在固件升级过程中起关键作用
    • 日志中的lua: attempt to get length of local 'data' (a nil value)表明程序试图获取空值的长度,这是典型的未正确处理失败响应的情况

解决方案

1. 检查并升级CPLD固件版本

# 查询当前CPLD版本信息
busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Cpld/Cpld_1_0101 bmc.kepler.Chip.JtagTarget GetChipIdcode a{ss} 0

若版本过旧,请按照以下步骤升级:

  1. 确保BMC和CSR已先完成升级
  2. 上传正确的CPLD固件文件
  3. 执行升级命令后断电重启使新版本生效

2. 验证SMC配置正确性

检查CSR配置文件中关于Smc_ExpBoardSMC_0101的定义是否正确:

"Accessor_ShortPushButton": {
  "Chip": "#/Smc_ExpBoardSMC",
  "Offset": 134224384,
  "Size": 1,
  "Mask": 1,
  "Type": 0,
  "Value": 0
}

3. 修复软件逻辑缺陷

修改相关Lua脚本以正确处理错误情况:

-- 在smc.lua中添加对nil数据的检查
if data == nil then
    return error("SMC response data is nil")
end

4. 验证I2C总线状态

# 检查I2C总线连通性
i2cdetect -y -r <bus_number>
# 监测是否有总线干扰或从设备无响应情况

5. 完整升级顺序建议

根据配套升级要求,推荐按以下顺序操作:

  1. 升级并生效BMC
  2. 升级并生效CSR
  3. 升级CPLD(扩展板、基础板)
  4. 升级MCU
  5. 升级BIOS固件
  6. 通过下电/生效命令触发AC,激活所有固件变更

预防措施

  1. 建立版本配套矩阵,确保BMC、CSR、CPLD、BIOS等组件版本相互兼容
  2. 完善错误处理机制,避免因单个设备通信失败导致整体流程中断
  3. 实施升级前验证,使用mdbctl等工具预先验证关键路径通信正常
  4. 记录详细的升级日志,便于故障回溯分析

重要提示:CPLD作为复杂可编程逻辑器件,在服务器中承担着电源序列控制、BIOS闪存重置等关键功能。任何固件变更都需要谨慎评估,并准备回滚方案。

SMC completion code: 4是表示硬件内部错误,一般是硬件没及时响应cpld。data=nil是bmc向cpld读数据,cpld在重试次数内返回的都是数据未准备,data返回了nil,也是硬件没及时响应cpld。