背景
鲲鹏/昇腾新增CPLD无感升级场景,允许CPLD在正常运行过程中上传固件包,执行升级操作并立即生效。为确保CPLD业务功能不受影响,无感升级流程中BMC与CPLD需要通信配合,提前告知CPLD消费模块即将开始无感升级,同时BMC需要负责CPLD升级完成后的关键寄存器内容恢复。为实现以上功能点,需要在LogicFirmware对象内新增若干属性,用于描述CPLD在无感升级过程中需要使用到的信息。
关联ISSUE
整体方案
- 硬件提供hpm包时在update.cfg文件中新增属性HotValidType,执行升级流程时,general_hardware组件判断若HotValidType = 1,则执行无感升级流程,否则执行现有的冷升级流程。
- 完整的无感升级流程,步骤如下:
- 向CPLD中写入cpld.svf文件。
- 检查bios是否处于正在启动的状态,如果是的话等待bios启动完成。之后向CPLD寄存器写入标志位,通知CPLD将数据存储到flash,并等待CPLD通过寄存器响应。
- 将CPLD指定的寄存器列表里面的数据读出,保存下来,待升级流程完成后重新写入进行恢复。
- 向CPLD寄存器写入标志位,通知其他CPLD消费模块即将开始升级,需要暂停访问CPLD的操作。等待各消费模块做好升级准备后写寄存器回复BMC。
- 关闭BMC访问CPLD的能力,防止升级过程中产生误告警。
- 拉低无感升级专用GPIO。
- 加载valid.svf文件。
- 恢复步骤3)、4)、5)、6)的操作。
- 以上无感升级流程中,并非所有的步骤都要执行,而是根据具体产品的CPLD执行其中一部分。例如,鲲鹏产品的CPLD无感升级时,无需执行步骤4)、6);昇腾产品的CPLD无感升级时,无需执行步骤2)。此外,以上步骤中与CPLD通信交互的寄存器地址、需要保存与恢复的寄存器地址、GPIO管脚编号等信息均与具体的CPLD相关,无法固化在代码流程中。因此,需要为LogicFirmware对象新增私有属性,关联以上无感升级流程中的必要信息。在配置CSR时正确配置LogicFirmware的这些新增属性,从而实现无感升级功能的正确执行。
评审点
评审点1:新增对象CpldRestoreReg,用于无感升级流程中保存和恢复寄存器内容
评审点2:LogicFirmware对象新增私有属性WriteSignalReg,用于无感升级过程中BMC通知消费模块即将开始无感升级
评审点3:新增对象CpldReadSignalReg,用于无感升级过程中各个消费模块通知BMC已完成无感升级的准备
评审点4:LogicFirmware对象新增私有属性UpgradeGpio,用于保存无感升级使用的GPIO管脚信息
详细描述
评审点1:新增对象CpldRestoreReg,用于无感升级流程中保存和恢复寄存器内容
| 属性名称 | 涉及对象 | 资源path | 变化类型 | 属性说明 | 持久化类型 | 取值说明 |
|---|---|---|---|---|---|---|
| RestoreReg | general_hardware组件的CpldRestoreReg对象 | 无 | 新增私有属性 | 待保存与恢复的寄存器对象 | 不持久化 | 关联Accessor寄存器对象 |
| RestoreType | general_hardware组件的CpldRestoreReg对象 | 无 | 新增私有属性 | 无感升级后寄存器值的恢复策略 | 不持久化 | 0:RestoreValueState正常时使用RestoreValue恢复,否则使用RestoreDefaultValue恢复 1:RestoreValueState正常时使用RestoreValue恢复,否则无动作 其他值:不处理 默认值:0 |
| RestoreValue | general_hardware组件的CpldRestoreReg对象 | 无 | 新增私有属性 | 待保存与恢复的寄存器值 | 不持久化 | 1. 配置为固定值,表示升级完成后需要将该寄存器恢复为固定值 2. 配置为关联Accessor或Scanner,表示升级前需要读取寄存器内容保存,升级后根据读取的内容恢复 |
| RestoreValueState | general_hardware组件的CpldRestoreReg对象 | 无 | 新增私有属性 | 待保存与恢复的寄存器值状态 | 不持久化 | 0:寄存器值正常,无感升级后使用RestoreValue进行恢复 非0:寄存器值异常,无感升级后的恢复动作根据RestoreType取值决定 默认值:0 |
| RestoreDefaultValue | general_hardware组件的CpldRestoreReg对象 | 无 | 新增私有属性 | 当RestoreValueState异常时需要恢复的默认值 | 不持久化 | 配置为固定值,当RestoreValueState异常且需要恢复时,使用该值恢复 |
| RefLogicFirmware | general_hardware组件的CpldRestoreReg对象 | 无 | 新增私有属性 | 该对象寄存器所在的CPLD名称 | 不持久化 | 相关的LogicFirmware的Name属性 |
配置举例:
"LogicFirmware_Test1": {
...
"Name": "XXX_CPLD1",
...
},
"CpldRestoreReg_Test1": {
"RestoreReg": "#/Accessor_Reg1.Value",
"RestoreValue": 5,
"RefLogicFirmware": "XXX_CPLD1"
},
"CpldRestoreReg_Test2": {
"RestoreReg": "#/Accessor_Reg2.Value",
"RestoreValue": "<=/Scanner_Reg2.Value",
"RestoreValueState": "<=/Scanner_Reg2.State",
"RestoreDefaultValue": 10,
"RefLogicFirmware": "XXX_CPLD1"
},
"CpldRestoreReg_Test3": {
"RestoreReg": "#/Accessor_Reg3.Value",
"RestoreValue": "<=/Scanner_Reg3.Value",
"RestoreValueState": "<=/Scanner_Reg3.State",
"RestoreType": 1,
"RefLogicFirmware": "XXX_CPLD1"
}
以上配置含义中,各寄存器的恢复策略如下:
- Reg1:无感升级后恢复为默认值5
- Reg2:如果升级前自身的State正常,则保存自身数值,无感升级后恢复为保存的数值。否则恢复为默认值10
- Reg3:如果升级前自身的State正常,则保存自身数值,无感升级后恢复为保存的数值。否则不恢复
评审点2:LogicFirmware对象新增私有属性WriteSignalReg,用于无感升级过程中BMC通知消费模块即将开始无感升级
| 属性名称 | 涉及对象 | 资源path | 变化类型 | 属性说明 | 持久化类型 | 取值说明 |
|---|---|---|---|---|---|---|
| WriteSignalReg | general_hardware组件的LogicFirmware对象 | 无 | 新增私有属性 | 关联待升级CPLD的寄存器,用于在无感升级前通知其他消费模块准备升级 | 不持久化 | 关联待升级CPLD的寄存器 |
配置举例:
"LogicFirmware_Test1": {
...
"WriteSignalReg": "#/Accessor_Reg4.Value",
...
}
评审点3:新增对象CpldReadSignalReg,用于无感升级过程中各个消费模块通知BMC已完成无感升级的准备
| 属性名称 | 涉及对象 | 资源path | 变化类型 | 属性说明 | 持久化类型 | 取值说明 |
|---|---|---|---|---|---|---|
| Reg | general_hardware组件的CpldReadSignalReg对象 | 无 | 新增私有属性 | BMC接收各消费模块已准备好进行升级的寄存器 | 不持久化 | 关联Accessor寄存器对象 |
| RefLogicFirmware | general_hardware组件的CpldReadSignalReg对象 | 无 | 新增私有属性 | 该对象寄存器所在的CPLD名称 | 不持久化 | 相关的LogicFirmware的Name属性 |
配置举例:
"LogicFirmware_Test1": {
...
"Name": "XXX_CPLD1",
...
},
"CpldReadSignalReg_Test1": {
"Reg": "#/Accessor_Reg5.Value",
"RefLogicFirmware": "XXX_CPLD1"
},
"CpldReadSignalReg_Test2": {
"Reg": "#/Accessor_Reg6.Value",
"RefLogicFirmware": "XXX_CPLD1"
},
"CpldReadSignalReg_Test3": {
"Reg": "#/Accessor_Reg7.Value",
"RefLogicFirmware": "XXX_CPLD1"
}
以上评审点2和3中新增的属性具体使用方法如下:
sequenceDiagram
participant BMC as BMC
participant CPLD as CPLD
participant model1 as 消费模块1
participant model2 as 消费模块2
participant modeln as 消费模块n
Note over BMC: 无感升级步骤1)、2)、3)
BMC ->> CPLD: 将WriteSignalReg寄存器写为0
Note over CPLD: 逻辑保证,每当WriteSignalReg寄存器跳变时,自动将所有的ReadSignalRegs写为0
BMC ->> CPLD: 将WriteSignalReg寄存器写为0x55
BMC -->> CPLD: 循环读取所有ReadSignalRegs,等待寄存器全变为0x55
model1 -->> CPLD: 读取WriteSignalReg变为0x55
model2 -->> CPLD: 读取WriteSignalReg变为0x55
modeln -->> CPLD: 读取WriteSignalReg变为0x55
Note over model1: 升级前准备工作
Note over model2: 升级前准备工作
Note over modeln: 升级前准备工作
model1 ->> CPLD: 写ReadSignalReg为0x55
model2 ->> CPLD: 写ReadSignalReg为0x55
modeln ->> CPLD: 写ReadSignalReg为0x55
BMC -->> CPLD: 所有ReadSignalReg已变为0x55
Note over BMC: 无感升级步骤5)、6)、7)
BMC ->> CPLD: 将WriteSignalReg寄存器写为0
BMC ->> CPLD: 将WriteSignalReg寄存器写为0xAA
BMC -->> CPLD: 循环读取所有ReadSignalRegs,等待寄存器全变为0xAA
model1 -->> CPLD: 读取WriteSignalReg变为0xAA
model2 -->> CPLD: 读取WriteSignalReg变为0xAA
modeln -->> CPLD: 读取WriteSignalReg变为0xAA
Note over model1: 升级后恢复工作
Note over model2: 升级后恢复工作
Note over modeln: 升级后恢复工作
model1 ->> CPLD: 写ReadSignalReg为0xAA
model2 ->> CPLD: 写ReadSignalReg为0xAA
modeln ->> CPLD: 写ReadSignalReg为0xAA
BMC ->> CPLD: 将WriteSignalReg寄存器写为0
Note over BMC: 无感升级剩余步骤
评审点4:LogicFirmware对象新增私有属性UpgradeGpio,用于保存无感升级使用的GPIO管脚信息
| 属性名称 | 涉及对象 | 资源path | 变化类型 | 属性说明 | 持久化类型 | 取值说明 |
|---|---|---|---|---|---|---|
| UpgradeGpio | general_hardware组件的LogicFirmware对象 | 无 | 新增私有属性 | 无感升级流程中使用的专用GPIO引脚编号 | 不持久化 | 取值为U8,GPIO引脚编号 默认值:255 |
配置举例:
"LogicFirmware_Test1": {
...
"UpgradeGpio": 55,
...
}