电源管理机制介绍
更新时间: 2025/12/11
在Gitcode上查看源码

代码仓介绍

电源管理组件(power_mgmt)是系统中负责电源状态监控、配置控制与故障诊断的核心模块。
代码仓位置:power_mgmt
代码仓功能:负责电源基础信息的获取如电压、电流、温度、功率等,提供电源工作模式、睡眠模式的设置与电源固件升级的功能,同时提供异常事件、告警、黑匣子日志等多种方式用于监测电源状态与故障定位。

代码目录结构:

bash
📦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                                          #测试目录

关键特性

  1. 电源信息采集

    电源管理组件通过访问与电源模块关联的 FRU(现场可更换单元)及协议指定寄存器,获取制造商、型号、序列号、额定参数等基础信息。不同厂商可通过 OEM 命令扩展自定义数据。用户可通过 Redfish、IPMI 命令或命令行工具直接查询电源的实时状态与历史数据。

    当前系统支持以下两类通信协议:

    • PMBus(Power Management Bus)

    基于 I2C 的开放式数字电源管理协议,支持多设备挂载于同一总线,实现主机与电源模块之间的双向通信,适用于标准化电压调节与实时监控场景。

    • CAN bus(Controller Area Network bus)

    CAN 总线是一种高可靠性、强抗干扰能力的串行通信协议,广泛应用于汽车电子、工业控制及航空航天等实时性要求严苛的场景。在特定服务器架构(如工业级或定制化高可用系统)中,CAN 被用于电源模块间的对等通信,支持 PSU 状态同步、故障隔离与负载协同控制。

  2. 黑匣子日志机制

    电源黑匣子用于持续记录电源关键寄存器的状态变化。当电源发生异常(如电压突变、过温、通信中断)时,系统自动保存事发前后时段的数据至文件 /dump_info/LogDump/ps_black_box.log。通过一键日志采集功能,可快速导出该记录,辅助开发与运维人员精准分析故障原因。

  3. 固件升级

    电源固件升级通过上传经过签名的升级包完成。升级期间系统将:

    • 暂停常规监控任务;
    • 强制将升级电源设为主用模式,确保业务供电不中断;
    • 在升级完成后自动重启监控服务并验证新固件版本。
  4. 电源模式管理

    支持以下两种可配置的电源模式:

    • 主用模式(Enabled):电源处于正常工作状态,为负载供电。
    • 备用模式(StandbySpare):电源处于待命状态,仅在主用电源异常时接管负载。

    openUBMC 支持负载均衡(所有电源均为主用)与主备供电(仅指定电源为主用,其余为备用)两种策略,用户可根据冗余需求动态调整。

  5. 告警与事件机制

    当 AC 异常掉电时,硬件触发中断,管理控制器记录事件标志并启动事后分析流程(如记录上次掉电原因)。同时,支持配置阈值告警(如过压、过流、温度超标),并通过 Syslog、Redfish Event 实时上报。

适配关键点

电源适配过程可参考电源适配指南。以下将对适配项的作用和适配关键点进行总结。

电源CSR适配

配置电源在位信息 Scanner(通常位于扩展版上)

这里以配置电源 1 为例,配置的 CSR 为14100513_00000001010302023922.sr

json
"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),这里的在位信息使用上一步配置的电源在位状态。

json
"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

json
"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来配置。

json
"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核心功能包括:

  • 建立槽位关联:通过位置匹配建立OnePowerPsuSlot的关联,核心函数为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>

使用实例

shell
% attach power_mgmt
Success

% lsobj OnePower   
OnePower_0_010109   
OnePower_0_01010B  

% getpsufanspeed OnePower_0_01010B   
6419   

%

查询电源寄存器信息

命令功能

查询pmbus协议的电源寄存器信息

命令格式

getpsureg <ObjectName> <Cmd> <Length>

使用实例

shell
% attach power_mgmt  
Success  

% lobj OnePower  
OnePower_0_010109  
OnePower_0_01010B  

% getpsureg OnePower_0_01010B 144 2
[26,25]

相关 busctl 命令

shell
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