问题背景
- 单板类型:自研板;
- 软件版本:openUBMC 26.03;
- 涉及功能:升级,BMC,cpld;
- 触发条件:先成功升级CPLD后未进行重启,直接继续升级BMC;
- 业务表现:预期BMC侧先升级CPLD成功且未重启生效的情况下升级BMC成功;实际先升级CPLD后未重启生效的情况下升级BMC,文件上传成功,升级失败;
问题复现步骤
- BMC侧升级CPLD成功,不立即重启生效;
- 升级BMC;
关键日志信息
firmware_mgmt组件日志信息: general_hardware组件日志:
定位过程
从firmware_mgmt的日志看,似乎是CPLD升级完成后由于当前满足生效条件,立刻开始执行CPLD的生效了。需要检查下CPLD生效条件是如何配置的(例如下电时生效),再确认下上传CPLD固件包进行升级时,环境是否已经满足了生效条件的要求,如果CPLD升级完成后,环境当前不满足生效条件,则firmware_mgmt会注册一个待生效的固件信息,需要手动选择这个待生效的固件进行生效操作。此时在手动生效这个固件之前,是可以继续升级其他固件。
从general_hardware的升级日志看,日志中无相关热升级标志,所以cpld升级走的是正常的冷升级流程,这种升级流程会先写入升级文件,然后等待带内上下电的状态满足要求时,再执行生效步骤,然后执行AC操作;
如果想要热升级CPLD,需要固件包的update.cfg文件中配置HotValidList=1这个属性,指明这一片CPLD需要热升级。需要检查下update.cfg文件是否有配置相关字段;
热升级时update.cfg文件需要配置需要valid.vme文件,且在Firmware1下面新增HotValidList属性即可。如果一块单板上只有一片CPLD,那新增HotValidList=1即可。但如果一块单板上有多个CPLD(例如,CPU板上有3片CPLD),此时需要新增的属性为HotValidList=1,2,3;
尝试按照步骤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文件中有没有这个函数,如果比较老可以尝试更新组件代码到社区最新后再试一下;
怀疑是因为厂商模式为1所以没有进到check_hot_upgrade的流程,这个热升级和厂商模式有关系,现在配置的是1,然后defs.CPLD_SUPPLIER_MODE.SINGLE定义的也是1,载板CPLD是安陆的,尝试此处MultipleSuppliersMode修改为多厂商模式,同时多厂商模式时升级/生效文件不能命名成cpld.vme/valid.vme,而是需要加上序号,例如改为cpld01.vme/valid01.vme。
textif *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。