CPLD生效模式缺少DC方式

问题描述

当前升级主板CPLD以及扩展板CPLD之后,AC生效的会影响业务,需要切换成DC生效方式
但是目前没有支持DC生效方式:

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2509]

  • 硬件配置:[如 CPU、内存等]

重现步骤

  1. [第一步] 上电情况下烧写CPLD

  2. [第二步] 系统下电,进行烧写CPLD

  3. [第三步] CPLD烧写成功观察到BMC以及OS都被重启,影响业务

期望结果

CPLD烧写flash成功之后,进行生效的时候,可以执行DC方式进行生效

实际结果

实际上执行了AC生效方式

尝试过的解决方案

问题1: * 废弃属性:ValidMode和ValidAction在最新版本中已废弃,但是send_register_active_action从代码上看还是获取了ValidMode
问题2:目前是否已经支持了DC生效CPLD策略,如果没有,是否可以支持上

答案内容由AI生成,仅供参考:
:white_check_mark: 总结与建议

项目 内容
问题本质 缺少对“DC断电生效”方式的支持,当前默认使用AC Cycle
是否支持DC生效 :cross_mark: 当前OpenUBMC版本不支持
根本原因 硬件初始化要求完整电源序列 + 缺乏标准接口定义
临时解决方案 :white_check_mark: 使用 Smooth RebootPowerCycle 方式延迟生效
最佳实践 勾选“重启BMC”与“整机下电”,触发 ResetAC 模式
未来方向 提议增加DC Cycle支持,作为高级电源策略可选功能
点击此处查看详细分析解答

CPLD生效模式缺少DC方式问题分析与解决方案

根据您提供的信息,当前在升级主板和扩展板CPLD后,系统采用AC生效方式(即整机掉电重启)会对业务造成影响,您希望切换为DC(Direct Current,直流电源)生效方式。以下是对此问题的全面分析与解答。


:magnifying_glass_tilted_left: 问题核心分析

当前现象

  • 操作流程:上电状态下烧写CPLD → 系统下电 → CPLD烧写成功 → BMC与OS均被重启(即执行了AC重启)
  • 实际行为:系统触发的是 AC Cycle(交流断电再上电),导致整机重启,影响业务连续性
  • 期望目标:实现 DC方式生效,即仅切断直流供电部分,不进行完整AC重启,以减少对业务的影响

:books: 背景知识梳理

1. CPLD升级生效机制概述

CPLD作为复杂可编程逻辑器件,在固件更新后必须通过特定系统事件才能使新固件生效。常见生效方式包括:

生效方式 说明
PowerOff 仅关机,但不保证硬件重初始化
PowerCycle 安全关机后再上电
ResetAC 模拟完整AC掉电–上电周期,等效于拔插电源线
Smooth Reboot 平滑重启,在BMC重启时执行生效动作,减少中断

:light_bulb: 根据知识库文档,ResetAC 是一种复合动作,通常由同时选择“重启BMC”和“整机下电”触发,用于确保CPLD完成完整复位。


2. 当前支持的生效动作定义(来自代码片段)

def VALID_ACTION_DEF = {
    VALID_ACTION_RESET_ACTIVE = 0,        -- 默认值为0,AC重启
    SUPPORT_AC_RESET_ACTIVE = 1,          -- 生效完CPLD后进行AC重启
    SUPPORT_BMC_RESET_ACTIVE = 2,         -- 生效完CPLD后进行BMC重启
    SUPPORT_NO_RESET_ACTIVE = 3           -- 不执行任何重启操作
}

:magnifying_glass_tilted_left: 关键点

  • 所列选项中无DC相关模式(如 SUPPORT_DC_RESET_ACTIVE 或类似枚举)
  • 当前最多支持 AC重启、BMC重启、不重启
  • ValidModeValidAction 已在最新版本中标记为废弃

3. 废弃属性与实际使用的矛盾

您提到:

“ValidMode和ValidAction在最新版本中已废弃,但是 send_register_active_action 从代码上看还是获取了 ValidMode”

:white_check_mark: 事实确认

  • 确实,ValidMode / ValidAction 已被标记为废弃字段(见Knowledge Graph中 ValidAction 实体描述)
  • 新机制应使用 RegisterActiveAction RPC 接口进行生效策略注册,通过 ActiveConditionActiveMode 参数传递策略
  • 但部分旧路径仍可能读取 CSR 配置中的 ValidMode 字段(兼容性考虑)

:pushpin: 结论:系统正处于新旧机制过渡阶段,存在双重处理逻辑。


:gear: 当前是否支持DC生效方式?

:white_check_mark: 明确回答:

:cross_mark: 目前OpenUBMC系统并不直接支持“DC方式生效”的CPLD固件激活机制

原因分析:

原因 说明
1. 硬件依赖性强 CPLD通常负责电源控制、复位信号生成等关键功能,其自身更新需依赖外部完整断电周期(AC Cycle)才能可靠加载新逻辑
2. DC断电难以隔离 “DC生效”意味着仅切断服务器内部直流供电路径,而不涉及前端PDU或电源模块的AC断开。这在多数服务器平台中无法精确实现,且存在状态不确定性
3. 缺乏标准接口 IPMI/BMC标准未定义统一的“DC Cycle”命令,现有 PowerCtrlType 接口仅支持 On, ForceOff, ACCycle, PowerCycle
4. 安全性考量 若允许仅DC断电生效,可能导致部分电路残留电压,引发CPLD初始化失败或状态不一致

:counterclockwise_arrows_button: 替代方案与推荐做法

虽然“DC生效”暂不支持,但可通过以下机制实现业务影响最小化的CPLD生效

:white_check_mark: 方案一:使用平滑重启(Smooth Reboot)机制

原理:

  • 升级完成后,注册生效任务
  • 等待系统自然发生 BMC平滑重启(例如维护窗口中的计划重启)
  • 在BMC启动阶段检查并触发CPLD生效

优势:

  • 避免立即中断业务
  • 可与其他组件升级合并处理
  • 符合 openUBMC 设计规范

配置方式:

-- 使用 RPC 接口注册生效策略
RegisterActiveAction({
    ActiveCondition = "BMC_REBOOT",
    ActiveMode = "RESET_CPLD"
})

:link: 参考文档:openUBMC 支持CPLD升级平滑生效特性设计说明书


:white_check_mark: 方案二:配置 BMCSet_CPLD_UpgradeActiveConditionPowerCycle

目的:

避免仅“整机下电”失败的问题,强制要求 完整电源循环

配置项说明:

BMCSet_CPLD_UpgradeActiveCondition = PowerCycle
  • PowerOff:仅下电(不够彻底,部分平台不支持)
  • PowerCycle:必须经历下电→上电过程(推荐)

效果:

防止因“假下电”导致CPLD未正确加载新固件


:white_check_mark: 方案三:前端UI优化提示“建议勾选两项”

根据知识库描述,同时选择 “重启BMC” + “整机下电” 会触发 ResetAC 模式,系统将其解释为完整AC重启。

:wrench: 建议:

  • 在Web界面添加提示:“CPLD升级需完整AC重启,请勾选‘重启BMC’与‘整机下电’”
  • 后端自动合并为 ResetAC 模式,提升用户体验与成功率

:puzzle_piece: 关于 ResetAC 的特别说明

什么是 ResetAC

  • 它不是一个物理接口,而是一个逻辑复合动作
  • 仅当同时选择多个策略时触发:
    function m.get_active_policy(policy)
        if #policy == 1 then
            return policy[1]  -- 如 PowerOff 或 ResetBMC
        else
            return 'ResetAC'  -- 多选强制转为 ResetAC
        end
    end
    

为什么需要这样做?

  • 确保真正断电:防止仅软件关机但电源未真正切断
  • 满足CPLD加载要求:多数CPLD芯片需要 VIN=0 → VIN=1 的完整上电序列
  • 避免部分复位问题:防止CPU/BMC已重启但CPLD固件未激活

:hammer_and_wrench: 可行性增强建议(可提交至社区或开发团队)

建议项 描述
新增 SUPPORT_DC_CYCLE 枚举值 VALID_ACTION_DEF 中增加对DC断电的支持(前提:硬件平台支持可控DC断电)
引入 PowerType 参数扩展 PowerCtrl 接口中区分 AC_Cycle, DC_Cycle, Hybrid_Cycle
DC Cycle 硬件适配层开发 仅在支持DC断电能力的平台(如模块化电源架构)启用该功能
增加日志追踪能力 firmware_mgmt 日志中记录具体生效方式(AC/DC/BMC)以便定位问题

:white_check_mark: 总结与建议

项目 内容
问题本质 缺少对“DC断电生效”方式的支持,当前默认使用AC Cycle
是否支持DC生效 :cross_mark: 当前OpenUBMC版本不支持
根本原因 硬件初始化要求完整电源序列 + 缺乏标准接口定义
临时解决方案 :white_check_mark: 使用 Smooth RebootPowerCycle 方式延迟生效
最佳实践 勾选“重启BMC”与“整机下电”,触发 ResetAC 模式
未来方向 提议增加DC Cycle支持,作为高级电源策略可选功能

:pushpin: 推荐操作步骤(立即可用)

  1. 修改配置项

    BMCSet_CPLD_UpgradeActiveCondition = PowerCycle
    
  2. 执行升级时务必勾选

    • :check_box_with_check: 重启BMC
    • :check_box_with_check: 整机下电
      → 自动触发 ResetAC 完整重启
  3. 结合维护窗口安排

    • 使用 平滑生效机制,等待下次BMC重启时统一激活多个固件更新
  4. 提交需求

    • 向 openUBMC 社区或厂商提交 Feature Request:
      支持 DC Cycle 作为 CPLD 升级生效可选项

如需进一步协助配置生效策略或分析日志,请提供 firmware_mgmt 模块的 mdb_info.logupgrade.log 片段,可帮助精准定位生效流程。

是否可以支持提供DC生效方式的功能

首先需要看CPLD的电源是受哪里控制的。如果你的机器上DC下电能够重启CPLD,那么理论上CPLD的生效模式也可以配置为DC下电。否则就是硬件上不支持这种生效方式,只能选择AC生效。

然后如果确认硬件支持这种生效方式,那么需要软件修改以进行支持。当前通用硬件和固件管理模块支持的生效条件、生效动作都列在ValidCondition、ValidMode里面了,不包含DC下电的选项,建议在hardware sig提交议题。