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)板卡相关的告警和传感器;