CRPS电源适配升级流程

问题描述

我最近在openubmc上做一款CRPS电源的适配,目前在看固件的升级流程,有以下疑问,请帮忙指导一下:

1 电源固件应该要通过ComponentID进行匹配,ComponentID是多少?

2 CRPS电源的升级流程,是不是要做power_mgmt上做适配,是在include\device_tree\adapters\power_mgmt\protocol\upgrade目录下新增新的升级流程么?

3 电源固件的升级是通过什么流程触发?

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:openubmc26.03

  • 硬件配置:

重现步骤

  1. [第一步]

  2. [第二步]

  3. [第三步]

期望结果

期望实现CRPS电源升级

实际结果

[实际发生了什么,包含错误信息]

尝试过的解决方案

[列出您已经尝试过的解决方案及结果]

分析结论

[详细总结您对此问题的分析结论]

答案内容由AI生成,仅供参考:
:white_check_mark: 推荐解决方案总结

问题 解决方案
ComponentID未知 查阅update.cfgplatform.sr;参照ID分配表申请唯一ID
适配位置错误 include/device_tree/adapters/power_mgmt/protocol/ 下新增 crps.lua,并在 init.lua 中注册协议
升级未触发 确保 PsuSlot 正确加载,bmc.dev.PowerSupply 暴露完整静态属性(Model、FirmwareVersion等),且 firmware_mgmt组件 支持该ComponentID
点击此处查看详细分析解答

CRPS电源适配升级流程指导

根据您在openUBMC平台上进行CRPS电源适配和固件升级的疑问,结合现有知识库信息,现提供以下详细指导:

1. 电源固件ComponentID匹配问题

电源固件的ComponentID应按以下方式确定:

  • 唯一性要求:ComponentID与ComponentIDEx组合必须唯一,不可与其他固件冲突。
  • 参考文档:应在《IBMC IPMI接口说明》的“附录-固件ID管理-表1 固件升级ID分配表”中查找或申请。
  • 常见ID分配
    • BIOS固件:通常为 1
    • BMC固件:通常为 6
    • CPLD固件:可能为 3 或特定值
  • CRPS电源固件:需根据具体硬件定义,建议参考类似电源产品的ID分配,若无明确规定,应新增并确保不冲突。

建议操作:检查当前系统中的update.cfg文件以及VPD仓中的platform.sr配置,确认是否有已定义的ComponentID/ComponentIDEx组合,并保持一致。


2. CRPS电源升级流程适配位置

是否需要在include/device_tree/adapters/power_mgmt/protocol/upgrade下新增?

:white_check_mark: 是的,但需按正确结构适配。具体路径和实现如下:

正确适配路径与结构:

include/device_tree/
└── adapters/
    └── power_mgmt/
        ├── protocol/
        │   └── crps.lua         ← 实现CRPS协议逻辑(可继承pmbus)
        ├── init.lua             ← 注册CRPS协议
        └── upgrade/             ← 固件升级处理逻辑(若需特殊流程)

关键适配点:

  1. init.lua 中注册协议映射
['Great Wall'] = {
    ['GW-CRPS800N2'] = {
        'CRPS', 
        require 'xxx.crps'  -- 自定义crps.lua文件
    }
}
  1. 创建 crps.lua 文件(可继承pmbus):

    • 继承通用PMBus协议
    • 复写差异化命令字或升级逻辑
    • 实现 upgrade(upgrade_path, upgrade_process) 方法
  2. 升级流程控制Power Upgrade 模块统一调度,通常无需单独创建新流程文件,除非有特殊校验逻辑。

:pushpin: 注意:PsuSlot对象通过power_upgrade方法控制升级过程,因此需确保PsuSlot正确关联到CRPS协议实现。


3. 电源固件升级触发流程

电源固件升级由 openUBMC固件管理框架统一触发,具体流程如下:

:repeat_button: 升级触发机制:

  1. 用户通过 Web UI 或 CLI 发起升级请求(如上传 .hpm 包)
  2. firmware_mgmt组件 接收请求,解析固件包(含ComponentID、版本等)
  3. 系统匹配目标设备(通过 bmc.dev.PowerSupply 提供的静态属性:Model、Manufacturer、PartNumber等)
  4. 调用 Power Mgmt 组件的 Power Upgrade 模块执行升级

:white_check_mark: 完整升级流程步骤:

步骤 操作
1 获取协议和升级包匹配的电源
2 校验电源数量是否为0
3 电源模式切换为主用(防止整机掉电)
4 按健康度排序升级顺序
5 遍历每个电源,逐一升级
6 校验环境是否支持升级
7 停止电源数据监控(暂停 power_monitor_start
8 执行单个电源固件升级
9 恢复监控并刷新固件信息
10 返回升级结果

:hammer_and_wrench: 升级期间会暂停基础监控,确保服务器不断电。


:white_check_mark: 推荐解决方案总结

问题 解决方案
ComponentID未知 查阅update.cfgplatform.sr;参照ID分配表申请唯一ID
适配位置错误 include/device_tree/adapters/power_mgmt/protocol/ 下新增 crps.lua,并在 init.lua 中注册协议
升级未触发 确保 PsuSlot 正确加载,bmc.dev.PowerSupply 暴露完整静态属性(Model、FirmwareVersion等),且 firmware_mgmt组件 支持该ComponentID

:police_car_light: 常见踩坑点提醒

  • :cross_mark: PsuSlot未出现在资源树:这是正常现象,PsuSlot作为中间件不直接暴露在资源树中,用于连接OnePower与硬件槽位。
  • :cross_mark: 类变量未在ctor中定义:会导致获取为nil,务必在构造函数中初始化。
  • :cross_mark: 升级包签名问题:CRPS电源升级包必须为签名的Power Upgrade Package,否则会被拒绝。
  • :cross_mark: 固件类型未在VPD仓注册:若未在platform.sr中定义FirmwareComponentInfo对象,firmware_mgmt组件将无法识别该固件。

:magnifying_glass_tilted_left: 验证建议

  1. 使用 busctl --user tree bmc.kepler.power_mgmt 查看OnePower对象是否存在
  2. 检查日志中 pmbus_GW_CRPS.lua 是否正常输出工作模式
  3. 升级前确认 UpgradeStatus 状态为 0(未升级)
  4. 查看 /dump_info/LogDump/ps_black_box.log 是否生成黑匣子日志

如有进一步问题,建议参考 openUBMC电源适配指南 或参与社区 Topic 240(关于Pmbus CRPS电源配置)讨论。

是的,在power_mgmt适配,如果include\device_tree\adapters\power_mgmt\protocol\upgrade下的升级流程不适配的话,需要新增对应的流程,触发是在src/lualib/power_upgrade.lua文件下的处理的升级信号,三个阶段都做了固件类型等校验:

signal.register_callback('upgrade_prepare_callback', nil, prepare_upgrade)
signal.register_callback('upgrade_process_callback', nil, process_upgrade)
signal.register_callback('upgrade_finish_callback', nil, finish_upgrade)

目前看起来是要修改upgrade里的升级流程

platform.sr中电源相关配置如下

“FirmwareComponentInfo_Power”: {

“ComponentID”: 23,

“ComponentIDEx”: 4294967295,

“Name”: “Power”,

“RevisionNumber”: 0

},

应该componentid=23代表电源固件升级