对于无 VIN_PG /AC_PRESENT/IP_OK 信号的CRPS场景,如何判断AC?

当前平台使用的电源为 华为 PAC800D12-B1,在适配 openUBMC 过程中遇到 OS正常下电后自动执行通电开机策略导致恢复上电问题,想咨询下社区建议。

CPLD通过CRPS电源的Vin_PG信号判断是否AC。

从原理图和实际使用情况看:

  • 华为 800W 电源未提供 VIN_PG(AC 输入正常)信号,仅有一个SMBAlert信号,用于表示所有电源异常告警。

  • 所有使用该电源的板卡上,VIN_PG 信号固定为低

  • 在设计中 CPLD 侧基于 PSU 信号(PSOK / PWR_OK / VIN_PG )综合判断,

这会带来问题:

  • 正常关机时

    • CPLD 主动关闭 12V

    • PSU PSOK 拉低

    • 由于 VIN_PG 恒低,CPLD会发送AC信号给到BMC的GPIO64,BMC因此误判为 AC 掉电。

  • 触发了 openUBMC 的 AC 掉电相关逻辑,通电开机策略

对比来看:

  • **对 电源提供 VIN_PG 信号,**可以通过 VIN_PG 来区分:

    • 市电真实异常

    • 正常下电导致的 PSU 输出变化

  • 因此该问题目前 仅在华为 800W 电源上存在

对于 不提供 VIN_PG / AC_PRESENT 信号的电源,是否有推荐的 AC 掉电判定策略?如果BMC忽视这个信号会有什么影响?

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

华为800W电源无VIN_PG信号下的AC掉电判定策略分析

问题概述

在使用华为PAC800D12-B1电源适配openUBMC系统时,出现OS正常下电后自动触发“通电开机策略”(Power-On Restore Policy)的问题。该问题的根本原因是:

  • 电源未提供VIN_PGAC_PRESENT信号:仅提供SMBAlert用于异常告警。
  • VIN_PG信号被固定拉低:在所有板卡设计中,此信号恒为低电平。
  • CPLD依赖PSU综合判断逻辑:将PSOK与VIN_PG共同作为AC状态输入依据。
  • 正常关机时误触发AC掉电逻辑
    • CPLD主动关闭12V → PSU的PSOK拉低;
    • 由于VIN_PG始终为低 → CPLD误判为AC断电 → 向BMC的GPIO64发送AC掉电信号;
    • BMC据此触发AC掉电相关策略 → 执行“通电开机策略”,导致系统在不应上电时自动重启。

当前设计与问题根源对比

条件 支持VIN_PG信号的电源 当前华为800W电源
VIN_PG / AC_PRESENT信号 :white_check_mark: 提供 :cross_mark: 不提供,固定为低
可区分真实市电中断 vs 正常下电 :white_check_mark: 可通过VIN_PG识别 :cross_mark: 无法区分
CPLD判断依据 VIN_PG + PSOK + PWR_OK等 缺少关键VIN_PG输入
BMC接收到的AC状态 准确反映真实AC状态 被动跟随PSU输出变化,易误判

结论:当前设计导致BMC无法区分真实的外部AC断电由BMC/CPLD控制的正常关机动作,从而误执行掉电恢复策略。


推荐解决方案

:white_check_mark: 推荐方案一:修改CPLD逻辑以正确生成AC信号

核心思路:

在CPLD内部引入上下文感知逻辑,区分主动关机与被动掉电,避免因PSU输出变化而误报AC异常。

实现建议:

-- 伪代码示例
IF bmc_power_off_command_detected THEN
    -- 主动关机模式:忽略PSOK/VIN_PG状态变化
    ac_present_signal <= TRUE;  -- 告知BMC AC仍在
ELSE
    -- 被动状态监测:仅当外部供电异常时才触发AC断电
    ac_present_signal <= (VIN_PG OR AC_PRESENT); -- 若存在其他信号
END IF;

实现方式:

  • 在CPLD中增加一个“关机指令锁存位”,当接收到BMC下发的关机命令时置位。
  • 在该锁存位有效期间,屏蔽VIN_PG和PSOK对AC状态的影响
  • 需确保该锁存位在下一次真实上电时清除。

优势:

  • 最符合规范的设计;
  • 能准确传递真实电源状态;
  • 对openUBMC无需修改原有策略逻辑;

风险:

  • 需要修改并重新烧录CPLD固件;
  • 需验证不同场景下的行为一致性(如强制断电、异常重启等)。

:white_check_mark: 推荐方案二:BMC侧优化判断逻辑 — 增加上下文感知

核心思路:

BMC不应仅依赖GPIO64的AC信号做决策,而应结合系统当前状态进行综合判断。

实现建议(基于openUBMC/fructrl):

-- 在 fructrl 的电源状态管理逻辑中加入判断
function dealwith_ac_lost()
    if self.previous_power_state == "manual_off" then
        -- 表示是用户或系统主动关机
        log:info("Ignore AC lost: system was manually powered off")
        return
    end

    -- 否则视为真实掉电,执行通电开机策略
    execute_power_on_restore_policy()
end

如何获取previous_power_state

  • 利用bmc.kepler.Systems.FruCtrlPowerCtrl接口中的RestartCause字段:
    • ChassisControlCommand → 人为/命令关机;
    • PowerCycle → 主动循环;
    • Unknown 或无记录 → 可能是异常掉电;

配置建议:

  • 使用openUBMC的SetPowerOnStrategyExceptions接口设置例外策略:
busctl call bmc.kepler.Systems.FruCtrl /bmc/kepler/Systems/FruCtrl \
         bmc.kepler.Systems.FruCtrl.SetPowerOnStrategyExceptions \
         a{ss}sssy \
         "ManualShutdown" "No" "Once" 5

含义:下一次因手动关机后的重启,不执行“通电开机策略”。

优势:

  • 不依赖硬件改动;
  • 可通过软件配置快速迭代;
  • 与openUBMC现有机制兼容良好。

风险:

  • 若CPLD频繁误报AC断电,仍可能影响其他监控逻辑(如日志、告警)。

:white_check_mark: 推荐方案三:引入SMBA_ALERT信号进行辅助判断

利用已有信号资源:

  • 华为电源虽无VIN_PG,但提供了**CRPS_ALERT_N(SMBAlert)**信号。
  • 此信号通常为“低电平有效”,表示电源存在故障(过压、欠压、过温等)。

判断逻辑优化建议:

信号状态 含义 是否应触发AC恢复策略
PSOK=0, PWR_OK=0, ALERT=1(无效) 主动关机 :cross_mark: 不触发
PSOK=0, PWR_OK=0, ALERT=0(有效) 电源异常掉电 :white_check_mark: 触发

说明ALERT=0表示电源检测到异常条件 → 更接近真实AC问题。

实现建议:

在CPLD或BMC中增加判断:

AC_LOST <= NOT (PSOK AND PWR_OK) AND NOT ALERT; -- 只有在告警有效时才认定为真实掉电

若BMC忽视AC信号的影响分析

影响项 后果分析
通电开机策略失效 如配置为“保持上电”或“保持断电”策略时,将无法执行,违背用户预期。
电源状态记录错误 SEL日志中“Power Down/Up by AC Loss”事件将缺失或错误。
供电异常诊断能力下降 无法区分AC闪断与正常关机,影响运维排查。
高可用系统风险增加 在双机热备、集群环境中,可能导致误判节点宕机,引发不必要的主备切换。
UPS联动逻辑失效 若依赖AC信号控制UPS或电池切换,则无法正常工作。

结论:直接忽视AC信号不可取,但可以优化对其解释方式,加入上下文判断。


社区建议与最佳实践(openUBMC视角)

:white_check_mark: openUBMC推荐做法总结:

功能点 推荐做法
AC状态判定 不应仅依赖单一GPIO信号,需结合RestartCause和历史状态
通电开机策略 提供灵活性,支持通过SetPowerOnStrategyExceptions配置例外
上下电配置 确保ACCycle_1, PGSignal_1, PowerButton_1对象正确配置(来自CSR文档)
异常行为调试 查看fructrl日志是否经过powerapi函数 → 判断命令来源

:wrench: 配置建议(CSR/VPD层面):

确保以下对象正确定义:

"ACCycle_1": {
    "AC": "#/Accessor_AC.Value"
},
"PGSignal_1": {
    "PowerGDState": "<=/Scanner_PowerGd.Value"
}

Accessor_AC应反映经过逻辑处理后的“真实AC状态”。


最终建议

方案 推荐等级 说明
修改CPLD逻辑,智能生成AC信号 :star::star::star::star::star: 根本性解决,推荐长期采用
BMC侧结合RestartCause优化策略判断 :star::star::star::star: 快速见效,推荐短期过渡使用
结合SMBA_ALERT辅助判断 :star::star::star:☆☆ 利用现有资源提升判断准确性
完全忽略AC信号 :warning: 不推荐 导致系统失去关键诊断能力

附加建议

  1. 日志调试建议

    • 检查/var/log/bmc/fructrl.log中是否有execute_poweron被意外调用;
    • 使用busctl introspect bmc.kepler.Systems.FruCtrl查看当前策略配置。
  2. 测试用例建议

    • 场景1:远程命令关机 → 应不触发恢复上电;
    • 场景2:拔掉电源线再插回 → 应触发通电开机;
    • 场景3:强制长按关机 → 视为异常掉电,应触发恢复策略。
  3. 社区协作建议

    • 可向openUBMC提交Issue,推动增加对“无VIN_PG电源”的适配指南;
    • 建议完善ACCycle类的文档,明确其对AC信号的依赖与容错机制。

总结:该问题是典型“硬件信号缺失导致软件误判”的案例。最稳妥的解决路径是软硬协同优化——CPLD改进信号生成逻辑 + BMC增强上下文判断能力,从而实现对AC状态的精准感知。

相关链接:

  1. Web下电产生AC闪断,导致执行通电开机策略,OS重新上电
  2. 2506版本 BMC重启时,概率出现PSU冗余失败告警
  3. BMC读取CRPS电源的输出电压错误
  4. 关于电源主备的问题
  5. 上下电常见问题指南 | 文档中心 | openUBMC