代码仓介绍
电源管理组件(power_mgmt)是系统中负责电源状态监控、配置控制与故障诊断的核心模块。
代码仓位置:power_mgmt
代码仓功能:负责电源基础信息的获取如电压、电流、温度、功率等,提供电源工作模式、睡眠模式的设置与电源固件升级的功能,同时提供异常事件、告警、黑匣子日志等多种方式用于监测电源状态与故障定位。
代码目录结构:
📦power_mgmt
┣ 📂docs #文档目录
┣ 📂include
┃ ┣ 📂device_tree #设备树相关实现
┃ ┃ ┗ 📂adapters
┃ ┃ ┃ ┣ 📂14060876_0000000xxxxxxxxxxxxx #14060876_0000000xxxxxxxxxxxxx单板对应adapter实现
┃ ┃ ┃ ┣ 📂14100513_0000000xxxxxxxxxxxxx #14100513_0000000xxxxxxxxxxxxx单板对应adapter实现
┃ ┃ ┃ ┣ 📂14191046_0000000xxxxxxxxxxxxx #14191046_0000000xxxxxxxxxxxxx单板对应adapter实现
┃ ┃ ┃ ┣ 📂power_mgmt
┃ ┃ ┃ ┃ ┣ 📂protocol
┃ ┃ ┃ ┃ ┃ ┣ 📂monitor
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜canbus.lua #canbus电源monitor
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜canbus_pah.lua
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜canbus_tpsu.lua
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜pmbus.lua #pmbus电源monitor
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜pmbus_PDC4000D12_LC.lua
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜pmbus_qb900.lua
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜powerconverter_pmbus.lua
┃ ┃ ┃ ┃ ┃ ┣ 📂upgrade
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜canbus_upgrade.lua #canbus电源升级处理
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜fw_def.lua
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜pmbus_upgrade.lua #pmbus电源升级处理
┃ ┃ ┃ ┃ ┃ ┣ 📜canbus.lua #canbus协议
┃ ┃ ┃ ┃ ┃ ┣ 📜canbus_pah.lua
┃ ┃ ┃ ┃ ┃ ┣ 📜canbus_tpsu.lua
┃ ┃ ┃ ┃ ┃ ┣ 📜init.lua #Protocol适配与加载
┃ ┃ ┃ ┃ ┃ ┣ 📜pmbus.lua #pmbus协议
┃ ┃ ┃ ┃ ┃ ┣ 📜pmbus_FP1420.lua
┃ ┃ ┃ ┃ ┃ ┣ 📜pmbus_PDC3KD5412_LC.lua
┃ ┃ ┃ ┃ ┃ ┣ 📜pmbus_PDC4000D12_LC.lua
┃ ┃ ┃ ┃ ┃ ┣ 📜pmbus_eb1000_1.lua
┃ ┃ ┃ ┃ ┃ ┣ 📜pmbus_qb900.lua
┃ ┃ ┃ ┃ ┃ ┣ 📜powerconverter_pmbus.lua
┃ ┃ ┃ ┃ ┃ ┗ 📜smc.lua
┃ ┃ ┃ ┃ ┗ 📜utils.lua #工具函数实现
┃ ┃ ┃ ┣ 📜OnePower.lua #OnePower通用实现
┃ ┃ ┃ ┗ 📜PsuSlot.lua #PsuSlot通用实现
┃ ┗ 📂hwproxy #电源插件相关实现
┃ ┃ ┗ 📂plugins
┃ ┃ ┃ ┗ 📂power_mgmt
┃ ┃ ┃ ┃ ┗ 📜init.lua #电源插件代码
┣ 📂manufacture #装备测试项代码
┃ ┣ 📜customize_cfg.lua
┃ ┗ 📜manufacture_app.lua
┣ 📂src
┃ ┣ 📂debug
┃ ┃ ┗ 📂lualib
┃ ┃ ┃ ┗ 📂power_mgmt_mock
┃ ┃ ┃ ┃ ┗ 📜init.lua
┃ ┣ 📂lualib
┃ ┃ ┣ 📂config_mgmt
┃ ┃ ┃ ┣ 📜customize_config.lua
┃ ┃ ┃ ┗ 📜server.lua
┃ ┃ ┣ 📂device #电源对象处理层
┃ ┃ ┃ ┣ 📜circuit.lua
┃ ┃ ┃ ┣ 📜power_configuration.lua #电源配置对象处理层
┃ ┃ ┃ ┣ 📜power_mgmt.lua
┃ ┃ ┃ ┣ 📜power_supplies.lua
┃ ┃ ┃ ┣ 📜psu.lua #单个电源处理层
┃ ┃ ┃ ┗ 📜psu_slot.lua #单个电源槽位对象处理层
┃ ┃ ┣ 📂external_interface
┃ ┃ ┃ ┗ 📜handler.lua #存放外部调用接口和全局变量接口
┃ ┃ ┣ 📂macros #存放常量
┃ ┃ ┃ ┣ 📜fw_def.lua
┃ ┃ ┃ ┣ 📜power_mgmt_enums.lua
┃ ┃ ┃ ┗ 📜psu_def.lua
┃ ┃ ┣ 📜add_event.lua #调用接口生成软件告警
┃ ┃ ┣ 📜capacitor_mgmt.lua
┃ ┃ ┣ 📜circuit_mgmt.lua
┃ ┃ ┣ 📜efficiency_curve.lua #电源效率转换曲线
┃ ┃ ┣ 📜export_import_engine.lua #配置导入导出
┃ ┃ ┣ 📜gpio_drived.lua #中断信号抓取
┃ ┃ ┣ 📜life_prediction_model.lua #TPSU turbo电容寿命预测功能
┃ ┃ ┣ 📜lock_chip.lua
┃ ┃ ┣ 📜log_service.lua #日志收集、aclost事件记录
┃ ┃ ┣ 📜metric_collect.lua #数据采集
┃ ┃ ┣ 📜parser_cfg.lua #升级包解析文件
┃ ┃ ┣ 📜power_ipmi.lua #电源ipmi实现
┃ ┃ ┣ 📜power_mgmt_app.lua #app入口
┃ ┃ ┣ 📜power_mgmt_bus.lua #全局bus存放
┃ ┃ ┣ 📜power_mgmt_metric.lua
┃ ┃ ┣ 📜power_mgmt_utils.lua #电源工具函数实现
┃ ┃ ┣ 📜power_supplies_service.lua
┃ ┃ ┣ 📜power_upgrade.lua #电源升级处理
┃ ┃ ┣ 📜psu_service.lua #所有电源对象处理层
┃ ┃ ┣ 📜signal.lua #电源升级信号处理
┃ ┃ ┣ 📜system_power.lua #电源fru信息定制化配置
┃ ┃ ┗ 📜task_service.lua #通用任务处理
┃ ┗ 📂service
┃ ┃ ┗ 📜main.lua
┣ ...
┗ 📂test #测试目录关键特性
电源信息采集
电源管理组件通过访问与电源模块关联的 FRU(现场可更换单元)及协议指定寄存器,获取制造商、型号、序列号、额定参数等基础信息。不同厂商可通过 OEM 命令扩展自定义数据。用户可通过 Redfish、IPMI 命令或命令行工具直接查询电源的实时状态与历史数据。
当前系统支持以下两类通信协议:
- PMBus(Power Management Bus)
基于 I2C 的开放式数字电源管理协议,支持多设备挂载于同一总线,实现主机与电源模块之间的双向通信,适用于标准化电压调节与实时监控场景。
- CAN bus(Controller Area Network bus)
CAN 总线是一种高可靠性、强抗干扰能力的串行通信协议,广泛应用于汽车电子、工业控制及航空航天等实时性要求严苛的场景。在特定服务器架构(如工业级或定制化高可用系统)中,CAN 被用于电源模块间的对等通信,支持 PSU 状态同步、故障隔离与负载协同控制。
黑匣子日志机制
电源黑匣子用于持续记录电源关键寄存器的状态变化。当电源发生异常(如电压突变、过温、通信中断)时,系统自动保存事发前后时段的数据至文件 /dump_info/LogDump/ps_black_box.log。通过一键日志采集功能,可快速导出该记录,辅助开发与运维人员精准分析故障原因。
固件升级
电源固件升级通过上传经过签名的升级包完成。升级期间系统将:
- 暂停常规监控任务;
- 强制将升级电源设为主用模式,确保业务供电不中断;
- 在升级完成后自动重启监控服务并验证新固件版本。
电源模式管理
支持以下两种可配置的电源模式:
- 主用模式(Enabled):电源处于正常工作状态,为负载供电。
- 备用模式(StandbySpare):电源处于待命状态,仅在主用电源异常时接管负载。
openUBMC 支持负载均衡(所有电源均为主用)与主备供电(仅指定电源为主用,其余为备用)两种策略,用户可根据冗余需求动态调整。
告警与事件机制
当 AC 异常掉电时,硬件触发中断,管理控制器记录事件标志并启动事后分析流程(如记录上次掉电原因)。同时,支持配置阈值告警(如过压、过流、温度超标),并通过 Syslog、Redfish Event 实时上报。
适配关键点
电源适配过程可参考电源适配指南。以下将对适配项的作用和适配关键点进行总结。
电源CSR适配
配置电源在位信息 Scanner(通常位于扩展版上)
这里以配置电源 1 为例,配置的 CSR 为14100513_00000001010302023922.sr
"Scanner_PS1Pres": {
"Chip": "#/Smc_ExpBoardSMC", // 关联的chip
"Offset": 603981056, // 偏移
"Size": 2, // 读取数据长度
"Mask": 1, // 位读时有效,从硬件读取数据后与掩码按位与操作
"Type": 0, // 读类型,0:位读,1:块读
"Value": 0, // 读值
"Period": 2000 // 扫描周期,单位ms
}Scanner_PS1Pres 作用: 根据配置信息,hwproxy 会进行周期扫描,本例为 2 秒,将扫描且计算后的值更新到资源树,主要用于判定 PSU1 在位状态。
配置电源连接器(通常位于扩展版上)
这一步用于配置电源加载使用的CSR,这里配置的是电源 1 加载使用的是 CSR(14191046_PSU_0.sr),这里的在位信息使用上一步配置的电源在位状态。
"Connector_PowerSupply_1": {
"Bom": "14191046", // 下级组件Bomid
"Slot": 1, // 当前连接器槽位,用于确认下级组件的槽位信息(必填)
"Position": 9, // 当前连接器位置,用于计算下级组件的位置(必填)
"Presence": "<=/Scanner_PS1Pres.Value", // 下级组件在位信息(必填)
"Id": "PSU", // 下级组件的组件id
"AuxId": "0", // 下级组件的组件Auxid
"Buses": [ // 连接器的总线信息,用于传递至下级组件(必填)
"I2c_2"
],
"SystemId": 1, // 连接器下级的SystemId,用于传递至下级组件
"SilkText": "psu1", // 连接器的丝印信息
"IdentifyMode": 2, // Connector的标志模式(必填)
"Type": "Psu" // Connector的类型
}配置注意事项:
- Position 唯一性: 同一 CSR 中所有 Connector 的 Position 必须唯一
- 识别模式匹配: IdentifyMode 必须与实际组件类型匹配
- 总线有效性: Buses 中的总线必须在系统中存在
- 在位状态: Presence为 1 时才会加载下级 SR
- ID 配置规则: 根据 IdentifyMode 选择合适的 ID 获取方式
配置电源槽位和电源chip(通常位于扩展版上)
这一步配置槽位信息及电源 chip,配置的 CSR 为14100513_00000001010302023922.sr
"PsuSlot_1": {
"SlotNumber": 1, // 槽位号
"Presence": "<=/Scanner_PS1Pres.Value", // 引用电源的在位寄存器
"SlotI2cAddr": 184, // 电源槽位i2c地址
"PsuChip": "#/Eeprom_PsuChip1" // 关联电源i2c器件
},
"Eeprom_PsuChip1": {
"Address": 184, // 地址信息
"AddrWidth": 1, // 位宽
"OffsetWidth": 1, // 偏移宽度
"ReadTmout": 30, // 读取超时时间,单位ms
"WriteTmout": 30, // 写入超时时间,单位ms
"RwBlockSize": 1024 // 分页读写的数据大小,单位Byte
}配置注意事项:
- 槽位唯一性: SlotNumber 必须唯一标识电源槽位
- I2C地址: SlotI2cAddr 使用 10 进制表示
- 在位检测: Presence 必须关联有效的 Scanner 对象
- 器件关联: PsuChip 必须关联有效的 EEPROM 器件,该器件为与电源硬件通信的对象(包括偏移,地址等)。
配置电源CSR
这一步进行电源对象的配置,电源对象根据电源在位信息变化加载及卸载,需要在14191046_PSU_0.sr来配置。
"FruData_Ps": {
"FruId": 1, // FruId,1-63会自动分配fruid,默认可以配1
"StorageType": "Power" // 非标电子标签不做限制
},
"Fru_Ps": {
"PowerState": 1, // Fru的热插拔状态
"Health": 0, // 健康状态
"EepStatus": 1, // EEPROM状态
"Type": 3, // FRU类型,请参考IDP文档中的IPMI接口说明的设备类型附录
"FruDataId": "#/FruData_Ps" // 关联frudata对象名
},
"OnePower_0": {
"SlotNumber": "${Slot}", // 槽位号(必填)
"Presence": 1, // 在位信息(必填)
"Protocol": "pmbus", // 电源协议
"PhysicalInterface": "pmbus", // 物理接口(必填)
"DeviceLocator": "PSU${Slot}", // 物理位置(必填)
"Position": "EXU", // 容器信息(必填)
"EnvTemperatureCelsius": 0, // 单个电源环境温度
"SerialNumber": "", // 序列号
"OutputState": 1, // 电源电压输出状态
"DeepSleepEnabled": 0, // 电源深度休眠使能(告警使用)
"OutputPowerWatts": 0, // 输出功耗
"InputVoltageFault": 32768, // 电压输入状态
"OutputVoltageFault": 0, // 电压输出状态
"OutputCurrentFault": 0, // 电流输出状态
"FanFault": 0, // 风扇状态
"Fan1Fault": 0, // 风扇1故障
"Fan2Fault": 0, // 风扇2故障
"Failure": 0, // 电源故障
"OverTemperature": 0, // 风扇1故障
"LossOfInput": 255, // 过温故障
"RefFrudata": "#/FruData_Ps", // 关联的Frudata对象
"PartNumber": "" // 部件编码
}电源设备树适配
OnePower
设备树加载通用模型,与通用逻辑不一致的需要自行在对应的CSR目录下补充adapter。通用OnePower核心功能包括:
- 建立槽位关联:通过位置匹配建立
OnePower与PsuSlot的关联,核心函数为register_psu_slot - 电子标签信息刷新:从底层获取FRU数据(最多重试3次),更新到上层框架,核心函数为
update_fru_data - 属性自动同步:核心函数
fetch_property() - 方法注册:注册外部调用方法
- 启动电源监控:核心函数
power_monitor_start
PsuSlot
PsuSlot对象是硬件抽象的中间层,负责:
- 管理具体电源硬件(通过protocol协议驱动)
- 提供统一接口给上层
OnePower对象调用 - 实现电源状态的实时监控
Monitor
monitor模块返回一个包含完整监控功能的PsuSlot类,核心作用:
- 协议抽象:隐藏 PMBus/CANBus 协议差异,提供统一监控接口
- 策略定制:根据不同协议特性优化监控频率和方式
- 数据标准化:将不同协议数据映射到统一健康事件模型
- 性能适配:根据协议能力实施合适的监控策略
Protocol
电源协议,根据不同的电源类型实现,对外屏蔽命令字和逻辑功能实现,接口功能和名称保持一致。
主要包含:
- 电源功率信息、状态信息、Fru信息的查询;
- 电源黑匣子数据获取;
- 电源模式设置(主备、深度休眠);
- 电源风扇转速设置;
- 电源升级处理。
调试命令
查询电源风扇转速
命令功能
查询电源风扇转速
命令格式
getpsufanspeed <ObjectName>
使用实例
% attach power_mgmt
Success
% lsobj OnePower
OnePower_0_010109
OnePower_0_01010B
% getpsufanspeed OnePower_0_01010B
6419
%查询电源寄存器信息
命令功能
查询pmbus协议的电源寄存器信息
命令格式
getpsureg <ObjectName> <Cmd> <Length>
使用实例
% attach power_mgmt
Success
% lobj OnePower
OnePower_0_010109
OnePower_0_01010B
% getpsureg OnePower_0_01010B 144 2
[26,25]相关 busctl 命令
busctl --user tree bmc.kepler.power_mgmt
#查看电源对象OnePower属性
busctl --user introspect bmc.kepler.power_mgmt /bmc/kepler/Systems/1/PowerMgmt/OnePower_0_010109
busctl --user introspect bmc.kepler.hwproxy /bmc/kepler/Chip/Eeprom/Eeprom_PsuChip1_0101
#以pmbus读取电源1的输入功率
busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Eeprom/Eeprom_PsuChip1_0101 bmc.kepler.Chip.BlockIO Read a{ss}uu 0 151 3