固件是否支持连续升级(CPLD → BMC)问题分析
更新时间: 2026/05/28
在Gitcode上查看源码

问题背景

  • 单板类型:自研板;
  • 软件版本:openUBMC 26.03;
  • 涉及功能:升级,BMC,cpld;
  • 触发条件:先成功升级CPLD后未进行重启,直接继续升级BMC;
  • 业务表现:预期BMC侧先升级CPLD成功且未重启生效的情况下升级BMC成功;实际先升级CPLD后未重启生效的情况下升级BMC,文件上传成功,升级失败;

问题复现步骤

  1. BMC侧升级CPLD成功,不立即重启生效;
  2. 升级BMC;

关键日志信息

firmware_mgmt组件日志信息: general_hardware组件日志:

定位过程

  1. 从firmware_mgmt的日志看,似乎是CPLD升级完成后由于当前满足生效条件,立刻开始执行CPLD的生效了。需要检查下CPLD生效条件是如何配置的(例如下电时生效),再确认下上传CPLD固件包进行升级时,环境是否已经满足了生效条件的要求,如果CPLD升级完成后,环境当前不满足生效条件,则firmware_mgmt会注册一个待生效的固件信息,需要手动选择这个待生效的固件进行生效操作。此时在手动生效这个固件之前,是可以继续升级其他固件。

  2. 从general_hardware的升级日志看,日志中无相关热升级标志,所以cpld升级走的是正常的冷升级流程,这种升级流程会先写入升级文件,然后等待带内上下电的状态满足要求时,再执行生效步骤,然后执行AC操作;

  3. 如果想要热升级CPLD,需要固件包的update.cfg文件中配置HotValidList=1这个属性,指明这一片CPLD需要热升级。需要检查下update.cfg文件是否有配置相关字段;

  4. 热升级时update.cfg文件需要配置需要valid.vme文件,且在Firmware1下面新增HotValidList属性即可。如果一块单板上只有一片CPLD,那新增HotValidList=1即可。但如果一块单板上有多个CPLD(例如,CPU板上有3片CPLD),此时需要新增的属性为HotValidList=1,2,3;

  5. 尝试按照步骤4的操作结合板子实际情况设备是一块拓展板CPLD,2个模组CPLD,现在是用升级拓展板的CPLD来看问题,修改了update.cfg在FirmWare1对象增加了HotValidList=1之后日志里面能看到HotList有值了,不过看日志生效的动作好像是从db里面取得,还是需要AC;从general_hardware组件日志内容看,HotValidList像是配置上了但是没生效。判断CPLD冷升级或是热升级的分支是在fw_upgrade.lua文件中的check_hot_upgrade进行的,而这个函数几个可能分支的日志打印都没有。需要检查下当前运行的组件版本是否比较老,fw_upgrade.lua文件中有没有这个函数,如果比较老可以尝试更新组件代码到社区最新后再试一下;

  6. 怀疑是因为厂商模式为1所以没有进到check_hot_upgrade的流程,这个热升级和厂商模式有关系,现在配置的是1,然后defs.CPLD_SUPPLIER_MODE.SINGLE定义的也是1,载板CPLD是安陆的,尝试此处MultipleSuppliersMode修改为多厂商模式,同时多厂商模式时升级/生效文件不能命名成cpld.vme/valid.vme,而是需要加上序号,例如改为cpld01.vme/valid01.vme。

    text
        if *signal*.upg_cfg_list\[index\].supplier_mode > defs.CPLD_SUPPLIER_MODE.SINGLE then
    
            ret = check_hot_upgrade(*signal*.upg_cfg_list, index)
    
        end

问题原因

多厂商模式升级时,需要将配置参数MultipleSuppliersMode不能配置成1,且生效文件命名不正确,否则热升级无法正确识别被升级文件的生效文件和升级方式,导致升级功能无法正常实现。

解决方案

MultipleSuppliersMode按实际的厂商数量配置,生效文件cpld.vme/valid.vme加上序号,如cpld01.vme/valid01.vme。