limingfeng
(Limingfeng(恒扬数据))
2026 年4 月 29 日 09:50
1
问题描述
在进行固件升级测试时,尝试连续升级多个组件:
先升级 CPLD(已确认升级成功:日志显示升级完成,SMC 查询版本已更新)
未进行重启,直接继续升级 BMC
现象
BMC 固件文件上传成功,但Web 页面提示升级操作失败
BMC 日志
2000-01-02 06:57:57.753595 firmware_mgmt NOTICE: utils.lua(34): The file path is Local.
2000-01-02 06:57:57.842793 firmware_mgmt ERROR: state_wait_restart.lua(31): Accycle or BMCreset is about to be performed during firmware actived, please wait
2000-01-02 06:57:57.843978 firmware_mgmt WARNING: init.lua(97): state_handle.lua:61 > state_wait_restart.lua:37 > state_wait_restart.lua:32: An error occurred during the firmware upgrade process. Details: Accycle or BMCreset is about to be performed during firmware actived, please wait
答案内容由AI生成,仅供参考:
结论
不支持直接连续升级(CPLD → BMC)而不重启。
**支持分阶段连续升级:CPLD 升级 → **(重启)
系统出于稳定性与安全性考虑 ,禁止在有固件等待激活(如 CPLD)的情况下启动 BMC 升级。该行为是 预期设计 ,而非缺陷。
建议严格按照“一升级一激活 ”的原则执行多组件固件升级。
点击此处查看详细分析解答
固件是否支持连续升级(CPLD → BMC)
根据提供的日志信息和系统机制分析,系统在当前状态下不支持在CPLD升级完成后立即进行BMC固件升级而中间不重启 。以下是详细分析:
问题现象总结
步骤1: 成功升级 CPLD,SMC 查询显示版本已更新。
步骤2: 未重启系统,直接尝试升级 BMC。
结果:
BMC 固件文件上传成功。
Web 页面提示升级操作失败。
BMC 日志报错:Accycle or BMCreset is about to be performed during firmware actived, please wait
日志分析
关键错误日志如下:
2000-01-02 06:57:57.842793 firmware_mgmt ERROR: state_wait_restart.lua(31): Accycle or BMCreset is about to be performed during firmware actived, please wait
2000-01-02 06:57:57.843978 firmware_mgmt WARNING: init.lua(97): ... An error occurred during the firmware upgrade process. Details: Accycle or BMCreset is about to be performed during firmware actived, please wait
错误含义解析:
state_wait_restart.lua 是 固件管理模块 中负责监控重启状态的脚本。
错误表明:系统检测到正在等待电源循环(Accycle)或 BMC 重启(BMCreset)以激活之前的固件更新(如 CPLD 升级) 。
在此状态下,系统锁定新的固件升级任务 ,防止并发冲突或状态异常。
固件升级生效机制说明
1. CPLD 升级的生效方式
冷升级模式(Cold Upgrade) :需通过 BMC 重启 或 系统下电上电(AC cycle) 才能生效。
即使升级操作完成,若未执行重启,系统仍处于 “待生效 ” 状态。
在此期间,固件管理系统会 标记系统为“升级进行中”状态 ,并阻止其他关键固件(如 BMC)的升级。
参考文档:【openUBMC 支持CPLD升级平滑生效特性设计说明书.md】 提到:
平滑生效场景:CPLD升级后等待BMC平滑重启时生效。
直接生效场景:仅在系统下电时升级才可直接生效。
若未满足生效条件,则进入“注册生效”模式,等待 BMC 重启。
2. BMC 固件升级的前提条件
BMC 固件升级要求系统处于 稳定状态 ,且无正在进行的激活流程。
若存在待处理的激活任务(如 CPLD 等待重启生效),firmware_mgmt 模块将 拒绝新升级请求 ,以保障系统可靠性。
正确操作流程建议
要实现 CPLD → BMC 的连续升级 ,必须按以下顺序执行:
升级 CPLD 固件
执行 BMC 平滑重启(BMCRestart)或 AC Power Cycle
再进行 BMC 固件升级
解决方案
问题
解决方案
连续升级失败
在 CPLD 升级后执行 BMC 重启或 AC 下电上电 ,确保固件激活完成后再升级 BMC
避免误操作
在 Web 页面或 CLI 中增加状态检查:查询 FirmwareActiveStatus 或 UpgradeStage 是否为 COMPLETED
自动化脚本建议
在升级流程中加入判断逻辑:
if UpgradeStage != COMPLETED then
wait_for_reboot_or_exit()
end
结论
不支持直接连续升级(CPLD → BMC)而不重启。
**支持分阶段连续升级:CPLD 升级 → **(重启)
系统出于稳定性与安全性考虑 ,禁止在有固件等待激活(如 CPLD)的情况下启动 BMC 升级。该行为是 预期设计 ,而非缺陷。
建议严格按照“一升级一激活 ”的原则执行多组件固件升级。
从firmware_mgmt的日志看,似乎是CPLD升级完成后由于当前满足生效条件,立刻开始执行CPLD的生效了。请检查下你的CPLD生效条件是如何配置的(例如下电时生效)?再确认下上传CPLD固件包进行升级时,环境是否已经满足了生效条件的要求?
如果CPLD升级完成后,环境当前不满足生效条件,则firmware_mgmt会注册一个待生效的固件信息,需要手动选择这个待生效的固件进行生效操作。此时在手动生效这个固件之前,是可以继续升级其他固件的。
limingfeng
(Limingfeng(恒扬数据))
2026 年5 月 8 日 08:14
4
CPLD应该是无感升级,BMC查询拓展板CPLD的版本也确实更新了,如果固件生效完成了还可以升级其他固件吗,还是还是需要重启BMC?
通常来说,CPLD生效完成后会执行对应的生效动作,而这个生效动作一般都是AC。你上面截图的日志部分显示固件管理这边由于准备执行AC(或BMC复位),所以此时不能立刻升级下一个固件。
其他有一些种类的固件,升级完成后是没有这些对应生效动作的,例如MCU,这种情况下你升级完MCU之后不会发生AC或BMC复位,就可以再升级下一个固件。
你提到CPLD执行的是无感升级,无感升级应该是不会注册生效任务的,但是从前面的现象来看是执行了生效的,似乎不是无感升级流程。如果你对这块CPLD升级时具体做了什么还有疑问,可以提供完整的日志我检查下。
limingfeng
(Limingfeng(恒扬数据))
2026 年5 月 9 日 08:51
6
limingfeng
(Limingfeng(恒扬数据))
2026 年5 月 9 日 08:56
7
下面貼了日志, 我对无感升级的理解可能错了, 我应该是热升级, 从查看CPLD的版本号看已经更新完成了,但是流程还是需要执行复位或者AC,可能是我的cpld生效文件配置有问题吗
从general_hardware的升级日志看,你的cpld升级走的是正常的冷升级流程,这种升级流程会先写入升级文件,然后等待带内上下电的状态满足要求时,再执行生效步骤,然后执行AC操作。走的并非是你所说的热升级流程,所以会有帖子一开始所描述的现象。(继续升级下一个固件时,由于当前正在生效CPLD并准备AC操作,不允许升级)
如果想要热升级CPLD,需要固件包的update.cfg文件中配置HotValidList=1这个属性,指明这一片CPLD需要热升级。可以检查下是否有配置相关字段。
limingfeng
(Limingfeng(恒扬数据))
2026 年5 月 11 日 03:02
9
目前用的update.cfg是参考的社区教程做的, 里面有两个Firmware对象,教程里面说第一个是对应valid.vme,第二个对应cpld.vme。
我看了一部分代码升级好像是只关注Firmware1,如果热升级的话还需要valid.vme吗, 增加HotValidList=1是每个都需要增加吗
[Basic]
Version=1.0
[Firmware]
FileNum=2
#载板在线升级包
[Firmware0]
ProductID=0
ComponentID=0
FRUID=0
DllLen=0
Updatefile=libupgrade_0.so
BoardID=65535
BoardIDList=65535
Uid=00000001010302061816,000000141BKHX00100100000,0000001010302023922
MultipleSuppliersMode=1
CPLDChipNummbers=1
[Firmware1]
ProductID=0
ComponentID=5
FRUID=0
DllLen=0
Updatefile=libupgrade_5.so
BoardID=65535
BoardIDList=65535
Uid=00000001010302061816,000000141BKHX00100100000,00000001010302023922
MultipleSuppliersMode=1
CPLDChipNummbers=1
limingfeng
(Limingfeng(恒扬数据))
2026 年5 月 11 日 04:28
11
设备是一块拓展板CPLD,2个模组CPLD,现在是用升级拓展板的CPLD来看问题, 修改了update.cfg在FirmWare1对象增加了HotValidList=1之后日志里面能看到HotList有值了,不过看日志生效的动作好像是从db里面取得,还是需要AC。
以下是升级过程中general_hardware的部分日志
2000-01-01 12:34:22.224852 general_hardware NOTICE: upgrade_subject.lua(112): [on_upgrade_prepare] firmware_type:Cpld cur_firmware_type:Cpld
2000-01-01 12:34:22.225203 general_hardware NOTICE: upgrade_subject.lua(120): [on_upgrade_prepare] start upgrade Cpld
2000-01-01 12:34:22.226092 general_hardware NOTICE: signal.lua(173): [cpld]Start the system[1] Cpld upgrade prepare phase
2000-01-01 12:34:22.324558 general_hardware NOTICE: upgrade_subject.lua(127): [on_upgrade_prepare] end upgrade Cpld
2000-01-01 12:34:22.325735 general_hardware NOTICE: fw_upgrade.lua(147): [cpld] lmf debug prepare upgrade, system[1] firmware_type:Cpld
2000-01-01 12:34:22.326690 general_hardware NOTICE: fw_upgrade.lua(148): [cpld] lmf debug prepare upgrade, cfg_path:/dev/shm/upgrade/2022590836/update.cfg
2000-01-01 12:34:22.328466 general_hardware NOTICE: fw_upgrade.lua(149): [cpld] lmf debug prepare upgrade, parameters:{ [Platform] = , [FirmwareMode] = Single, [CfgPath] = /dev/shm/upgrade/2022590836/update.cfg, [FirmwareIndex] = Firmware1, [ComponentID] = 5, [TaskId] = 2022590836, }
2000-01-01 12:34:22.333744 general_hardware NOTICE: fw_cfgs.lua(100): update_file_num:2
2000-01-01 12:34:22.334158 general_hardware NOTICE: fw_cfgs.lua(101): Basic Version:1.0
2000-01-01 12:34:22.334443 general_hardware NOTICE: fw_cfgs.lua(102): Firmware1.HotValidList:1
2000-01-01 12:34:22.334892 general_hardware NOTICE: fw_cfgs.lua(24): parse group Firmware1
2000-01-01 12:34:22.335576 general_hardware NOTICE: fw_cfgs.lua(37): parse hot valid list 1
2000-01-01 12:34:22.336502 general_hardware NOTICE: fw_upgrade.lua(183): [cpld]get cpld_valid :nil
2000-01-01 12:34:22.339641 general_hardware NOTICE: fw_upgrade.lua(194): [cpld] lmf debug support multifirmware:false
2000-01-01 12:34:22.339943 general_hardware NOTICE: fw_upgrade.lua(196): [cpld] lmf debug firmware index:1
2000-01-01 12:34:22.340408 general_hardware NOTICE: fw_upgrade.lua(94): [cpld] lmf debug prepare upgrade, index:1
2000-01-01 12:34:22.340854 general_hardware NOTICE: fw_cfgs.lua(71): check fw uid(00000001010302023922) id(255) id_ex(4294967295) exist success
2000-01-01 12:34:22.715761 general_hardware NOTICE: fw_init.lua(194): get fw version 0.13
2000-01-01 12:34:22.716713 general_hardware NOTICE: fw_upgrade.lua(134): [cpld]get verion[0.13]
2000-01-01 12:34:22.717755 general_hardware NOTICE: fw_upgrade.lua(206): [cpld] lmf debug prepare upgrade, parameters:{ [Platform] = , [FirmwareMode] = Single, [CfgPath] = /dev/shm/upgrade/2022590836/update.cfg, [FirmwareIndex] = Firmware1, [ComponentID] = 5, [TaskId] = 2022590836, }
2000-01-01 12:34:24.042915 general_hardware NOTICE: upgrade_subject.lua(139): [on_upgrade_process] start upgrade Cpld
2000-01-01 12:34:24.043322 general_hardware NOTICE: signal.lua(196): [cpld]Start the system[1] Cpld upgrade process phase
2000-01-01 12:34:24.151929 general_hardware NOTICE: upgrade_subject.lua(146): [on_upgrade_process] end upgrade Cpld
2000-01-01 12:34:24.152538 general_hardware NOTICE: fw_upgrade.lua(233): [CPLD] start jtag cpld upgrade
2000-01-01 12:34:24.153107 general_hardware NOTICE: fw_cfgs.lua(71): check fw uid(00000001010302023922) id(255) id_ex(4294967295) exist success
2000-01-01 12:34:24.153673 general_hardware NOTICE: process.lua(43): cpld fw matched, system_id = 1, fw.uid = 00000001010302023922, fw.csr.Name = EXU_CPLD
2000-01-01 12:34:24.172149 general_hardware NOTICE: process.lua(464): [cpld]get cpld packages successful
2000-01-01 12:34:24.173144 general_hardware NOTICE: process.lua(198): [cpld]load_cpld_single
2000-01-01 12:34:24.173715 general_hardware NOTICE: process.lua(61): load file[0x270cc]
2000-01-01 12:35:09.347956 general_hardware NOTICE: process.lua(87): [cpld]/dev/shm/upgrade/2022590836/cpld.vme update success!
2000-01-01 12:35:09.351251 general_hardware NOTICE: valid.lua(229): [cpld]set system_id = 1 ValidatingCpldFlag = 1
2000-01-01 12:35:10.579509 general_hardware NOTICE: upgrade_subject.lua(158): [on_upgrade_finish] start upgrade Cpld
2000-01-01 12:35:10.579936 general_hardware NOTICE: signal.lua(323): [cpld]Start the system[1] Cpld upgrade finish phase
2000-01-01 12:35:10.688740 general_hardware NOTICE: fructl_handler.lua(57): get_host_type: get host type Singlehost
2000-01-01 12:35:10.693010 general_hardware NOTICE: fructl_handler.lua(76): get_power_state: system[1] get power power ON
2000-01-01 12:35:10.695047 general_hardware NOTICE: signal.lua(239): upgrade_single_host system_id[1] firmware_type[Cpld] power_state[ON]
2000-01-01 12:35:10.696704 general_hardware NOTICE: valid.lua(224): [cpld]get system_id = 1 ValidatingCpldFlag = true
2000-01-01 12:35:10.697516 general_hardware NOTICE: fw_cfgs.lua(71): check fw uid(00000001010302023922) id(255) id_ex(4294967295) exist success
2000-01-01 12:35:10.698162 general_hardware NOTICE: signal.lua(45): cpld fw matched, system_id = 1, fw.uid = 00000001010302023922, fw.csr.Name = EXU_CPLD
2000-01-01 12:35:10.700517 general_hardware NOTICE: fructl_handler.lua(57): get_host_type: get host type Singlehost
2000-01-01 12:35:10.703768 general_hardware NOTICE: signal.lua(66): [CPLD]get customize ActiveCondition from db, value = PowerOff
2000-01-01 12:35:10.704487 general_hardware NOTICE: signal.lua(84): [CPLD]Register Active Action start active_condition = PowerOff active_mode = ResetAC
2000-01-01 12:35:10.827766 general_hardware NOTICE: upgrade_subject.lua(165): [on_upgrade_finish] end upgrade Cpld
2000-01-01 12:35:15.539915 general_hardware NOTICE: upgrade_subject.lua(176): [on_active_process] start upgrade CPLD
2000-01-01 12:35:15.540429 general_hardware NOTICE: signal.lua(422): get active signal, system_id: 1, firmware_type: CPLD
2000-01-01 12:35:15.540692 general_hardware NOTICE: signal.lua(429): [CPLD]----------Start Active----------
2000-01-01 12:35:15.541057 general_hardware NOTICE: signal.lua(343): [CPLD]update active status
2000-01-01 12:35:15.584844 general_hardware NOTICE: signal.lua(352): active_single_host system_id[1] firmware_type[CPLD]
2000-01-01 12:35:15.585630 general_hardware NOTICE: upgrade_subject.lua(183): [on_active_process] end upgrade CPLD
2000-01-01 12:35:15.586493 general_hardware NOTICE: fw_upgrade.lua(279): [cpld] finish upgrade system_id[1] firmware_type[CPLD]
2000-01-01 12:35:15.587217 general_hardware NOTICE: fw_upgrade.lua(286): [cpld] set valid true
2000-01-01 12:35:15.587868 general_hardware NOTICE: valid.lua(265): [cpld]start cpld valid task, system_id = 1
2000-01-01 12:35:15.589434 general_hardware NOTICE: valid.lua(224): [cpld]get system_id = 1 ValidatingCpldFlag = true
2000-01-01 12:35:15.603289 fructrl NOTICE: fructrl_obj_mgnt.lua(288): [System:1]set poweron lock, pwronlocked=true, timeout=300, appname=general_hardware, reason=cpld
2000-01-01 12:35:15.604382 fructrl NOTICE: pwr_lock.lua(60): [System:nil][general_hardware]Add power on lock to lock_table successfully.
2000-01-01 12:35:16.118431 general_hardware NOTICE: valid.lua(129): [cpld]found /data/opt/bmc/up_cfg/valid_00000001010302023922_1_1.vme, uid[00000001010302023922], chip_index[1], sysid[1]
2000-01-01 12:35:16.120039 general_hardware NOTICE: valid.lua(196): [cpld]make_cpld_upg_valid, system_id:1, file:/data/opt/bmc/up_cfg/valid_00000001010302023922_1_1.vme, type:vme
2000-01-01 12:35:16.681307 general_hardware NOTICE: valid.lua(57): [cpld]start valid cpld, file:/data/opt/bmc/up_cfg/valid_00000001010302023922_1_1.vme, type:vme
2000-01-01 12:35:16.682637 general_hardware NOTICE: valid.lua(66): [cpld]valid file[0x83]:/data/opt/bmc/up_cfg/valid_00000001010302023922_1_1.vme
2000-01-01 12:35:17.773701 general_hardware NOTICE: cpu_board.lua(53): [BCU]set BMC startup completed flag to CPLD successfully
2000-01-01 12:35:17.783217 general_hardware NOTICE: cpu_board.lua(53): [BCU]set BMC startup completed flag to CPLD successfully
2000-01-01 12:35:17.929023 general_hardware NOTICE: valid.lua(92): [cpld]/data/opt/bmc/up_cfg/valid_00000001010302023922_1_1.vme update success!!!
2000-01-01 12:35:20.924682 general_hardware NOTICE: valid.lua(229): [cpld]set system_id = 1 ValidatingCpldFlag = 0
2000-01-01 12:35:20.946654 general_hardware NOTICE: fructl_handler.lua(175): set power restore successfully, reason: ActiveCpld, execute: Yes, period: Once, priority: 2
2000-01-01 12:35:20.947806 general_hardware NOTICE: fw_upgrade.lua(289): [cpld] set valid false
2000-01-01 12:35:20.948482 general_hardware NOTICE: signal.lua(364): [CPLD]----------END Active----------
lisongwei
(lisongwei)
2026 年5 月 11 日 06:32
12
从日志内容看,本次升级走的还是冷升级流程。HotValidList像是配置上了但是没生效。判断CPLD冷升级或是热升级的分支是在fw_upgrade.lua文件中的check_hot_upgrade进行的,而这个函数几个可能分支的日志打印都没有。检查下你当前运行的组件版本是否比较老,fw_upgrade.lua文件中有没有这个函数,可以更新组件代码到社区最新后再试一下
limingfeng
(Limingfeng(恒扬数据))
2026 年5 月 11 日 07:40
13
应该是因为厂商模式为1所以没有进去check_hot_upgrade的流程, 这个热升级和厂商模式有关系吗, 现在配置的是1,然后 defs.CPLD_SUPPLIER_MODE.SINGLE定义的也是1,载板CPLD就是安陆的,这个需要怎么改吗, 是直接改升级配置的MultipleSuppliersMode改成大于1这样行吗?
if *signal*.upg_cfg_list\[index\].supplier_mode > defs.CPLD_SUPPLIER_MODE.SINGLE then
ret = check_hot_upgrade(*signal*.upg_cfg_list, index)
end
lisongwei
(lisongwei)
2026 年5 月 11 日 11:13
14
可以此处MultipleSuppliersMode修改为多厂商模式试下。另外注意,多厂商模式时升级/生效文件不能命名成cpld.vme/valid.vme,而是需要加上序号,例如改为cpld01.vme/valid01.vme。可以这样再试下。
limingfeng
(Limingfeng(恒扬数据))
2026 年5 月 12 日 01:40
15
修改vme文件名为cpld01.vme和valid01.vme后成功实现了热升级, 多谢~
limingfeng
(Limingfeng(恒扬数据))
2026 年5 月 12 日 07:47
16
遇到一个 CPLD 设备识别的新问题,换了一款CPLD芯片升级时候日志报错说不支持的CPLD设备,实际芯片为安路EF3::EF3LAOCG642B
general_hardware ERROR: cpld_chip.lua(48): Invalid cpld device id CC3F(1)
看了下 cpld_chip.lua 的 support_list,里面没有这个CC3F的 device id。
local support_list = {
-- 安路
anlu_ef2l15 = {id = 0x04004c37, get_file_id_func = get_anlu_file_id},
anlu_ef2 = {id = 0x03004c37, get_file_id_func = get_anlu_file_id},
anlu_ef3 = {id = 0x00008c3b, get_file_id_func = get_anlu_file_id},
anlu_3f0f9 = {id = 0x0003f0f9, get_file_id_func = get_anlu_file_id},
-- lattice
lattice_ef2 = {id = 0x012bd043, get_file_id_func = get_lattice_file_id},
lattice_ef3 = {id = 0x612bd043, get_file_id_func = get_lattice_file_id},
lattice_lcmxo2_4000hc = {id = 0x012bc043, get_file_id_func = get_lattice_file_id},
-- 紫光
pango_ef2 = {id = 0x0042a899, get_file_id_func = get_pangu_file_id},
pango_ef3 = {id = 0x0042b988, get_file_id_func = get_pangu_file_id},
pango = {id = 0x0042b899, get_file_id_func = get_pangu_file_id},
}
看上去不同型号使用的是同一套函数句柄/处理逻辑,所以我直接在 support_list 里补了一个映射,实测升级和启动都正常,没有发现异常。
想确认一下:
这种直接补 support_list 的做法是否有风险?
正常情况下,这类新增 device id 的标准处理流程一般是怎样的?
lisongwei
(lisongwei)
2026 年5 月 12 日 11:55
18
确认需要新增的话,这里直接新增你需要的device id合入代码即可。