general_hardware组件功能场景库

general_hardware组件功能场景库

概述

本文档详细描述了general_hardware组件中关键功能场景的实现及细节,涵盖固件升级、固件信息管理、板卡信息管理及相关告警等功能,这些功能场景是高频使用的,因此需保证稳定性和可靠性。


一. 固件升级管理

功能描述

(1)CPLD、MCU、CSR、VRD、FPGA、Retimer等固件的升级逻辑;
(2) 各固件信息管理,用于redfish、web界面显示;

1、CPLD固件升级

  • CPLD描述:全英文名称为Complex Programming logic device,中文为复杂可编程逻辑器件,是一种用于实现特定逻辑功能的硬件设备。
  • CPLD所在板卡类型:BCU(基础板)、EXU(扩展板)、SEU(硬盘背板)、CLU(风扇板)等。

1.1、 升级对象下发

  • 板卡支持CPLD固件升级,只需要在遵循天池规范的CSR增加自描述信息,且CPLD升级对象为LogicFirmware_xxx,自发现组件会在初始化阶段将对象下发到general_hardware,组件侧保存升级对象,后续即可支持对应CPLD固件的带外升级。

  • CPLD升级对象LogicFirmware_xxx的关键属性定义说明:

    属性名 UId Name Version UpgradeChip ChipInfo Routes FirmwareRoute
    属性含义 固件UI的 固件名 固件版本号 升级管理的Chip Chip信息 升级路由 固件路由
  • CSR对LogicFirmware定义举例(BCU板上的CPLD):

        "LogicFirmware_BCU_1": {
            "UId": "00000001020302024339",
            "Name": "BCU_CPLD1",
            "Manufacturer": "Huawei",
            "Version": "#/Accessor_LogicVerId.Value",
            "Location": 6288,
            "UpgradeChip": "#/Cpld_1",
            "ChipInfo": "#/Cpld_1",
            "Routes": "#/Accessor_JtagSwitch.Value",
            "DefaultRoute": 0,
            "FirmwareRoute": 1,
            "ValidMode": 0,
            "ValidAction": 0,
            "SoftwareId": "CPLD-BC82AMDT"
        }
  • 自发现LogicFirmware实现:
      function unit_manager:on_add_object(class_name, object, position)
          ['LogicFirmware'] = function ()
             -- 创建对象obj保存LogicFirmware信息:
              local obj = c_logic_fw.new(object, position, self.bus, device_name)
             
              -- 插入obj
              table.insert(self.logic_fw, obj)

              -- 注册CPLD固件到firmware_mgmt
              obj:register_logic_fw_info()
          end)
       end

1.2、 固件升级、生效信号监听

  • 升级阶段:固件子模块升级包含prepare、process、finish三个阶段,各个阶段需要与固件管理模块进行交互,交互模式均是由固件管理模块发送广播信号,通知固件子模块执行对应的处理;
  • 升级结果:以上三个阶段都完成后,则认为升级成功,如果中间任意阶段失败则将结束升级流程并返回失败,则认为升级失败,或在规定时间内没有完成各阶段处理,则认为超时失败;
  • 生效阶段:对于部分固件上电场景下升级后还需要执行生效处理,则会有生效active阶段,且在系统下电时,固件管理发送广播生效信号,通过固件子模块进行生效处理;
  • 各阶段信号监听及回调:
    function signal.init(bus, db, fw)
        -- 监听升级准备信号
        fw_mgmt_client:SubscribeUpdateServiceUpdateServiceUpgradePrepareSignal(signal.upgrade_prepare_callback)
        -- 监听升级处理信号
        fw_mgmt_client:SubscribeUpdateServiceUpdateServiceUpgradeProcessSignal(signal.upgrade_process_callback)
        -- 监听升级完成信号
        fw_mgmt_client:SubscribeUpdateServiceUpdateServiceUpgradeFinishSignal(signal.upgrade_finish_callback)
        -- 监听生效信号
        fw_mgmt_client:SubscribeFirmwareActiveFirmwareActiveActiveProcessSignal(signal.active_callback)
    end
    

1.3、 升级各阶段处理

  • 准备阶段:主要是解析升级配置文件、热升级检查、获取当前固件版本号并响应prepare信号;
    function fw_upgrade.prepare_upgrade(signal, system_id, firmware_type, cfg_path)
        -- 解析升级配置文件update.cfg
        signal.upg_cfg_list = cfg:get_cfg_list(cfg_path)
    
        -- 热升级检查
        check_hot_upgrade(signal.upg_cfg_list)
    
        -- 获取当前固件版本号
        local version = get_prepare_upgrade_version(signal, version)
    
        -- 响应prepare信号
        fw_mgmt_client:UpdateServiceUpdateServicePrepareReply(context.new(), system_id, firmware_type, version, ret)
    end
    
  • 处理阶段:主要是匹配UID找到对应的固件,将升级包选择硬件链路发送过去;
    function fw_upgrade.process_upgrade(signal, system_id, firmware_type, file_path)
        if signal.upg_cfg_list[1].update_link and signal.upg_cfg_list[1].update_link == '1' then
            -- i2c链路升级
            iic_upgrade:iic_upgrade_cpld(signal.db, signal.fw_list, signal.upg_cfg_list,
                file_path, system_id, firmware_type)
        else
            -- jtag链路升级
            process_handle:upgrade_component_cpld(signal.db, system_id, signal.fw_list,
                signal.upg_cfg_list, file_path, g_cpld_upgrade_list, fw_upgrade.hot_upgrade)
        end
    
        -- 响应process信号
        fw_mgmt_client:UpdateServiceUpdateServiceProcessReply(context.new(), system_id, firmware_type,
            is_need_valid and defs.RET.OK or ret)
    end
    
  • 完成阶段:区分HOST升级,进行生效文件的处理;
    function signal.upgrade_finish_callback(ctx, system_id, firmware_type)
        -- 更新升级进度
        fw_mgmt_client:UpdateServiceUpdateServiceUpdateUpgradeStatus(context.new(),
            system_id, firmware_type, ret_ok, 90, 'Running')
    
        if system_id == defs.ALL_SYSTEM_ID then
            -- 升级所有HOST
            upgrade_all_host(system_id, firmware_type, power_state)
        else
            -- 升级单HOST
            upgrade_single_host(system_id, firmware_type, power_state)
        end
    end
    
  • 生效阶段:对上电升级缓存的生效文件进行生效处理;
    function signal.active_callback(ctx, system_id, firmware_type)
        -- 更新生效状态
        update_active_status(firmware_id, firmware_type, 'Apply')
    
        if system_id == defs.ALL_SYSTEM_ID then
            -- 生效所有HOST
            active_all_host(system_id, firmware_type)
        else
            -- 生效单个HOST
            active_single_host(system_id, firmware_type)
        end
    end
    

2. 板卡管理

功能描述

(1)web、redfish、cli接口的板卡信息返回;
(2)板卡的加载处理;
(3)板卡相关的告警和传感器;


总结

请问是否可支持非天池架构标准的背板的cpld升级

1、目前升级分带内和带外升级,比如网卡、RAID卡、硬盘等升级都是走的带内,在OS侧通过工具进行升级;
2、BMC支持的升级都是带外,只能支持满足天池规范标准的器件升级,因为需要读取板卡的UID来区分,才能找到升级的固件位置;
综上所述:不支持 非天池架构标准 的背板的cpld升级