硬盘背板CPLD升级在Prepare阶段失败

问题描述

升级硬盘背板CPLD在Prepare阶段失败,如何判断失败原因以及Jtag链路是否联通呢?

环境信息

  • 软件版本: OpenUBMC2512

重现步骤

  1. 升级过程日志
    2026-07-27 13:39:35.565998 firmware_mgmt ERROR: task_id_mgmt.lua(290): sub upgrade task id are empty.
    2026-07-27 13:39:35.571589 firmware_mgmt ERROR: task_id_mgmt.lua(290): sub upgrade task id are empty.
    2026-07-27 13:39:48.548175 web_backend NOTICE: init.lua(98): upload content length:number 322820, remaining capacity space:number 46374912
    2026-07-27 13:39:48.731421 firmware_mgmt NOTICE: active_fructl.lua(96): get host type is Singlehost
    2026-07-27 13:39:48.731872 firmware_mgmt NOTICE: utils.lua(34): The file path is Local.
    2026-07-27 13:39:48.734250 firmware_mgmt NOTICE: init.lua(80): Upgrading_Flag is true
    2026-07-27 13:39:48.751833 firmware_mgmt NOTICE: init.lua(41): update status to FS_SIMPLE_UPGRADING.
    2026-07-27 13:39:48.770088 firmware_mgmt NOTICE: task_mgmt.lua(312): Create task[Id: 3240200569, StartTime: 2026-07-27T13:39:48+08:00, Progress: 0, State: New] successfully
    2026-07-27 13:39:48.770457 firmware_mgmt NOTICE: task_service.lua(55): task create success, task id: 3240200569
    2026-07-27 13:39:48.771143 firmware_mgmt NOTICE: task_id_mgmt.lua(30): add serial task id(3240200569) successfully
    2026-07-27 13:39:48.772766 firmware_mgmt NOTICE: tasks_scheduling.lua(122): start tasks processer
    2026-07-27 13:39:48.870564 firmware_mgmt NOTICE: task_mgmt.lua(443): Update task[Id: 3240200569, StartTime: 2026-07-27T13:39:48+08:00, Progress: 0, State: Running] successfully
    2026-07-27 13:39:48.871474 firmware_mgmt NOTICE: file_transfer.lua(169): start to move file [temp_upgrade_file.hpm] from tmp to shm
    2026-07-27 13:39:48.880911 firmware_mgmt NOTICE: file_transfer.lua(174): move_file_s ok:true, err:0
    2026-07-27 13:39:48.920208 firmware_mgmt NOTICE: validate_sign.lua(195): verify signature successfully
    2026-07-27 13:39:48.921138 firmware_mgmt NOTICE: action.lua(37): Validate signature successfully
    2026-07-27 13:39:48.923498 firmware_mgmt NOTICE: hpm_package.lua(782): ManufacturerValidateEnabled is false, there is no need to validate manufacture_id.
    2026-07-27 13:39:48.984930 firmware_mgmt NOTICE: hpm_package.lua(582): parse cfg file successfully, Version:1.0 FileNum:2
    2026-07-27 13:39:48.986322 firmware_mgmt NOTICE: hpm_package.lua(456): get obj table: 0x2c1ce3ed1e98 for Id=24
    2026-07-27 13:39:48.988095 firmware_mgmt NOTICE: hpm_package.lua(463): get obj table: 0x2c1ce3ed1e98 for Id=24
    2026-07-27 13:39:48.988813 firmware_mgmt NOTICE: hpm_package.lua(474): get obj table: 0x2c1ce3ed1e98 for Id=24
    2026-07-27 13:39:48.989741 firmware_mgmt NOTICE: hpm_package.lua(413): System product info:ProductId(0), ProductVendorID(0x00000001), ProductUniqueID(0x030AB300)
    2026-07-27 13:39:48.990140 firmware_mgmt NOTICE: hpm_package.lua(327): check product id successfully
    2026-07-27 13:39:49.020000 firmware_mgmt NOTICE: hpm_package.lua(395): cfg-BoardIDList(65535) match all devices
    2026-07-27 13:39:49.020346 firmware_mgmt NOTICE: hpm_package.lua(449): get obj table: 0x2c1ce3ed1e98 for Id=24
    2026-07-27 13:39:49.020715 firmware_mgmt NOTICE: hpm_package.lua(507): hard_revision:0, soft_revision:0
    2026-07-27 13:39:49.021000 firmware_mgmt NOTICE: hpm_package.lua(440): get obj nil for Id=24
    2026-07-27 13:39:49.021249 firmware_mgmt NOTICE: hpm_package.lua(527): revision number check successfully. Target revision=(0, 0, nil) and hpm revision=nil
    2026-07-27 13:39:49.125705 firmware_mgmt NOTICE: task_mgmt.lua(443): Update task[Id: 3240200569, StartTime: 2026-07-27T13:39:48+08:00, Progress: 0, State: Running] successfully
    2026-07-27 13:39:49.139158 firmware_mgmt NOTICE: action.lua(47): Parse hpm package successfully
    2026-07-27 13:39:49.704708 firmware_mgmt NOTICE: task_instance.lua(238): upgrade_task file_name=8BP_cpldimage_pl1711.hpm, FirmwareType=BP_Cpld, fw_num=1, UniqueIDList=nil, sys_id=1, info_key=1_BP_Cpld_3240200569
    2026-07-27 13:39:49.791483 firmware_mgmt NOTICE: task_mgmt.lua(443): Update task[Id: 3240200569, StartTime: 2026-07-27T13:39:48+08:00, Progress: 0, State: Running] successfully
    2026-07-27 13:39:49.792017 firmware_mgmt NOTICE: info_mgmt.lua(71): create_info: info_key=1_BP_Cpld_3240200569, FirmwareType=BP_Cpld, task_id=3240200569, upg_fw_num=1
    2026-07-27 13:39:49.893413 firmware_mgmt NOTICE: task_instance.lua(702): firmware(info key:1_BP_Cpld_3240200569) do upgrade stages
    2026-07-27 13:39:49.892559 firmware_mgmt NOTICE: task_mgmt.lua(443): Update task[Id: 3240200569, StartTime: 2026-07-27T13:39:48+08:00, Progress: 0, State: Running] successfully
    2026-07-27 13:39:49.894221 firmware_mgmt NOTICE: task_instance.lua(316): public initialize action start
    2026-07-27 13:39:49.894645 firmware_mgmt NOTICE: hpm_package.lua(485): get obj table: 0x2c1ce3ed1e98 for Id=24
    2026-07-27 13:39:49.895091 firmware_mgmt NOTICE: hpm_package.lua(539): now uptime = 189126, firmware init time = 0
    2026-07-27 13:39:49.895448 firmware_mgmt NOTICE: hpm_package.lua(456): get obj table: 0x2c1ce3ed1e98 for Id=24
    2026-07-27 13:39:49.895858 firmware_mgmt NOTICE: task_instance.lua(321): public initialize action end
    2026-07-27 13:39:49.896273 firmware_mgmt NOTICE: info_mgmt.lua(230): info_key(1_BP_Cpld_3240200569) upgrade set_stage: INITIALIZE → DIFF_PREPARE, 5
    2026-07-27 13:39:49.998047 firmware_mgmt NOTICE: task_mgmt.lua(443): Update task[Id: 3240200569, StartTime: 2026-07-27T13:39:48+08:00, Progress: 5, State: Starting] successfully
    2026-07-27 13:39:50.014656 general_hardware NOTICE: upgrade_subject.lua(112): [on_upgrade_prepare] firmware_type:BP_Cpld cur_firmware_type:BP_Cpld
    2026-07-27 13:39:50.015694 general_hardware NOTICE: upgrade_subject.lua(120): [on_upgrade_prepare] start upgrade BP_Cpld
    2026-07-27 13:39:50.016844 general_hardware NOTICE: signal.lua(173): [cpld]Start the system[1] BP_Cpld upgrade prepare phase
    2026-07-27 13:39:50.117716 firmware_mgmt NOTICE: task_mgmt.lua(443): Update task[Id: 3240200569, StartTime: 2026-07-27T13:39:48+08:00, Progress: 7, State: Running] successfully
    2026-07-27 13:39:50.124641 general_hardware NOTICE: upgrade_subject.lua(127): [on_upgrade_prepare] end upgrade BP_Cpld
    2026-07-27 13:39:50.129339 general_hardware NOTICE: fw_upgrade.lua(139): [cpld]get cpld_valid :nil
    2026-07-27 13:39:50.132927 general_hardware ERROR: signal.lua(188): [cpld] prepare upgrade failed, error: …ualib/unit_manager/class/logic_fw/upgrade/fw_upgrade.lua:71: bad argument #1 to ‘find’ (string expected, got nil)
    2026-07-27 13:39:50.135314 firmware_mgmt NOTICE: info_mgmt.lua(384): set FirmwareMode to Single
    2026-07-27 13:39:50.135669 firmware_mgmt ERROR: control.lua(183): Upgrade BP_Cpld prepare failed, ret=-1
    2026-07-27 13:39:50.136058 firmware_mgmt NOTICE: info_mgmt.lua(341): info_key(1_BP_Cpld_3240200569) upgrade failed, set_stage: DIFF_PREPARE → COMPLETED
    2026-07-27 13:39:50.208225 firmware_mgmt ERROR: task_instance.lua(293): info_key(1_BP_Cpld_3240200569) Upgrade fail, timeout=1800, stage=COMMON_PREPARE
    2026-07-27 13:39:50.208652 firmware_mgmt NOTICE: task_instance.lua(714): upgrade FirmwareMode Single
    2026-07-27 13:39:50.209240 firmware_mgmt NOTICE: task_instance.lua(626): firmware(info key:1_BP_Cpld_3240200569) do upgrade ret:-1, pre_version:nil
    2026-07-27 13:39:50.239914 firmware_mgmt NOTICE: task_mgmt.lua(174): task[Id: 3240200569, StartTime: 2026-07-27T13:39:48+08:00, Progress: 7, State: Exception] will be destroyed after 10 minutes
    2026-07-27 13:39:50.240602 firmware_mgmt NOTICE: task_mgmt.lua(443): Update task[Id: 3240200569, StartTime: 2026-07-27T13:39:48+08:00, Progress: 7, State: Exception] successfully
    2026-07-27 13:39:50.705855 firmware_mgmt WARNING: listen_cpu_idle.lua(81): cpu idle rate : 73.333333333333
    2026-07-27 13:39:50.897211 firmware_mgmt NOTICE: tasks_scheduling.lua(127): upgrade queue is empty, exit the tasks processer
    2026-07-27 13:39:50.897661 firmware_mgmt NOTICE: tasks_scheduling.lua(146): stop tasks processer
    2026-07-27 13:39:50.899035 firmware_mgmt NOTICE: active_fructl.lua(96): get host type is Singlehost
    2026-07-27 13:39:50.899447 firmware_mgmt NOTICE: active_single_host_fructrl.lua(73): active_single_host_fructrl fructrl get power status
    2026-07-27 13:39:50.902441 firmware_mgmt NOTICE: state_simple_upgrading.lua(97): simple upgraded, current active mode is:nil, wait restart seconds:360000
    2026-07-27 13:39:50.906112 firmware_mgmt NOTICE: init.lua(41): update status to FS_IDLE.
    2026-07-27 13:39:50.907472 firmware_mgmt NOTICE: init.lua(80): Upgrading_Flag is false
    2026-07-27 13:40:05.202024 firmware_mgmt NOTICE: task_service.lua(31): destroy_task_by_id: 3240200569
    2026-07-27 13:40:05.219151 firmware_mgmt NOTICE: task_mgmt.lua(461): Destroy task[Id: 3240200569, StartTime: 2026-07-27T13:39:48+08:00, Progress: 7, State: Exception] successfully
    2026-07-27 13:40:05.219509 firmware_mgmt NOTICE: task_id_mgmt.lua(40): delete serial task id(3240200569) successfully
    2026-07-27 13:40:05.219760 firmware_mgmt NOTICE: task_id_mgmt.lua(42): del serial task id(3240200569) successfully
    2026-07-27 13:40:05.220140 firmware_mgmt NOTICE: task_instance.lua(102): destroy task info(id:3240200569) successfully

期望结果

升级硬盘背板CPLD在Prepare阶段失败,如何判断失败根因以及Jtag链路是否联通呢?

实际结果

升级失败,报错2026-07-27 13:39:50.132927 general_hardware ERROR: signal.lua(188): [cpld] prepare upgrade failed, error: …ualib/unit_manager/class/logic_fw/upgrade/fw_upgrade.lua:71: bad argument #1 to ‘find’ (string expected, got nil),不清楚根因

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

总结建议

排查方向 具体操作 参考来源
UID 绑定 检查 CSR 中 LogicFirmware 的 UID 是否与升级包配置一致 搜索结果1
cpld_valid 为空 检查升级包中 ColdValidList/HotValidList 是否缺失或空值 文档块2
JTAG 通道切换 使用 busctl 设置并确认通道 搜索结果5
CPLD 芯片识别 使用 mdbctl 调用 GetChipIdcode 搜索结果9
硬件链路 查看 dmesg 扫链结果或测量 TDO 波形 搜索结果5、9

由于具体错误是 Lua 参数类型错误(nil 被传入 string.find),建议优先检查升级包配置文件中 ColdValidList/HotValidList 字段是否被正确填写,并核对 CSR 中的 UID 与升级包 UID 是否匹配。完成这两项验证后,再按照上述 JTAG 链路排查方法确认硬件通路是否正常。

点击此处查看详细分析解答

根据您提供的升级日志,CPLD 升级流程在 Prepare 阶段失败,核心错误为:

general_hardware ERROR: signal.lua(188): [cpld] prepare upgrade failed,
error: …ualib/unit_manager/class/logic_fw/upgrade/fw_upgrade.lua:71:
bad argument #1 to ‘find’ (string expected, got nil)

从日志顺序看,在出现此错误之前有 get cpld_valid :nil 的打印。cpld_valid 通常指向生效阶段的 valid 文件列表,该值为 nil 后被传入 string.find 函数,导致 Lua 参数类型错误。


:one: 失败根因判断

Prepare 阶段是升级前的准备环节,主要工作包括(来自知识库 Prepare Phase 描述):

  • 解析升级配置文件
  • 检查系统升级条件(如是否已有其他 CPLD 升级在进行)
  • 确定热升级/冷升级模式
  • 获取当前固件版本并验证信号

根据您复现的日志以及社区已有案例,以下原因可能性较高:

:small_blue_diamond: UID 绑定问题

背板 CPLD 升级若使用 自定义 UID,需要在 CSR 的 LogicFirmware 对象中进行正确绑定。社区已有案例指出:

背板CPLD:使用自定义 UID;EXU_CPLD:使用天池社区定义的 UID。
UID 不匹配会导致 prepare 阶段失败
(来源:搜索结果1——《升级背板CPLD失败(prepare阶段热检查失败)》)

您日志中的 ProductUniqueID(0x030AB300) 为自定义值,请确认该 UID 在 CSR 中已正确注册且与升级包 update.cfg 中的 Uid 字段一致。

:small_blue_diamond: cpld_valid 获取为空

cpld_valid 在源码中用于后续生效阶段的 valid 文件处理,其值通常来自于升级包配置中的 ColdValidListHotValidList。若这两个列表为,则代码可能返回 nil,从而触发 Lua 错误(string expected, got nil)。
(参考:文档块2 中的升级包配置示例,其中 ColdValidList=HotValidList= 均为空白)

:small_blue_diamond: 热检查失败

Prepare 阶段会进行热检查(hot check),若检查未通过则直接失败。知识图谱中记录了:

Backplate CPLD upgrade fails during the Prepare Phase due to a failed hot check.

您日志中未出现明确的热检查失败日志,但该因素是常见失败原因之一。

:small_blue_diamond: CSR 配置或升级包解析错误

如果 CSR 中定义的 LogicFirmware 对象的 FirmwareRouteChipInfo 等属性不正确,或者升级包解析时关键字段(如 file_pathComponentID)异常,也可能导致 prepare 阶段出错。


:two: 如何判断 JTAG 链路是否联通

JTAG 链路连通性是 CPLD 升级的基础,在 Prepare 阶段固件管理模块会尝试获取 CPLD 的厂商信息。若链路不通,通常会表现为无法获取 ChipIdcode 或扫链结果为空。

根据社区现有的排查指南(来源于 搜索结果5搜索结果9),可按以下步骤验证:

:pushpin: 方法一:使用 busctl 设置 JTAG 通道并检查

先确认 JTAG 切换链路是否已正确选通:

busctl --user set-property bmc.kepler.hwproxy \
  /bmc/kepler/Accessor/Accessor_JtagSwitch_010101 \
  bmc.kepler.Accessor Value t \<通道号\>
  • 通道号:EXU 通常为 0,BCU 通常为 1(具体参考 CSR 中 FirmwareRoute 属性)。
  • 设置后再通过 busctl 读取该属性值,确认是否切换成功。

:pushpin: 方法二:使用 mdbctl 读取 CPLD 芯片 ID

mdbctl call Cpld_1_010101 bmc.kepler.Chip.JtagTarget GetChipIdcode 0

如果能正确返回芯片 ID(如 0x12345678),说明 JTAG 链路基本正常。
若返回空或报错,则表示链路存在问题(来自搜索结果9)。

注:Cpld_1_010101 是常见 CPLD 实例路径,具体名称请根据实际 CSR 中 ChipInfo 的定义调整。

:pushpin: 方法三:检查内核日志(dmesg)中的扫链输出

在 BMC 命令行执行 dmesg | grep -i cpld,查看类似以下信息:

[SVF] scan register ...  // 表示正在扫描 JTAG 链
cpld std load failed(21)  // 表示加载失败

如果扫链结果中未发现 CPLD 设备,说明 JTAG 链路硬件层面未正常连接(来自搜索结果5)。

:pushpin: 方法四:硬件信号测量(高级)

若以上软件方法均无法获取到 CPLD 信息,且日志中 sample 值为 0(来自搜索结果9的 TDO 校验描述),则需硬件工程师使用示波器测量 CPLD 的 TDO 波形,确认 JTAG 链路是否物理开路或驱动异常。


总结建议

排查方向 具体操作 参考来源
UID 绑定 检查 CSR 中 LogicFirmware 的 UID 是否与升级包配置一致 搜索结果1
cpld_valid 为空 检查升级包中 ColdValidList/HotValidList 是否缺失或空值 文档块2
JTAG 通道切换 使用 busctl 设置并确认通道 搜索结果5
CPLD 芯片识别 使用 mdbctl 调用 GetChipIdcode 搜索结果9
硬件链路 查看 dmesg 扫链结果或测量 TDO 波形 搜索结果5、9

由于具体错误是 Lua 参数类型错误(nil 被传入 string.find),建议优先检查升级包配置文件中 ColdValidList/HotValidList 字段是否被正确填写,并核对 CSR 中的 UID 与升级包 UID 是否匹配。完成这两项验证后,再按照上述 JTAG 链路排查方法确认硬件通路是否正常。

失败原因是general_hardware的那一行日志没错,你可以看下fw_upgrade.lua文件的这一行,这里是在将固件列表中的固件名称和字符串进行匹配,而读取到的name是个空字符串。进一步排查建议两个点:

  1. 在这里打印正在遍历的fw的其他属性,确认是哪一个固件对象导致的问题。
  2. 固件对象的初始化是在fw_init.lua这个文件中的new函数做的,可以看一下这个函数中name属性赋值的逻辑,检查下是否有csr中LogicFirmware对象配置有问题,导致这里搞出了name为nil的情况
1 个赞