怎样新增PCIe Switch CSR对象

当前考虑要进行PCIe Switch芯片的固件更新,由于当前CSR规定的对象没有能表示SW固件更新的,因此想新增SWFirmware对象,请问该怎样实现?

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

要成功新增支持PCIe Switch芯片固件更新的CSR对象,您需要:

步骤 内容
1 在CSR中定义新的 SWFirmware 对象,设置UID、StorageChip等属性
2 扩展 SRUpgrade 服务以识别 PcieSwitch 类型
3 实现Flash写入逻辑(建议在 general_hardware/src/lualib/PCIeSwitch
4 构建正确的升级包(UID.sr 文件)
5 可选:开放状态查询接口,实现端到端管理

:pushpin: 关键提示

根据知识库中 HuangDing 提供的指导:“关于pcie_switch的配适可以通过更改代码并增加CSR中的字段方式来手动适配,目前还没有通用适配方案。” 因此,当前只能通过定制化开发实现,尚无开箱即用的支持。

一旦完成,即可实现对PCIe Switch芯片固件的标准化管理与安全升级。

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

如何新增CSR对象以支持PCIe Switch芯片固件更新

针对当前需求——为支持PCIe Switch芯片固件更新而新增一个表示SW固件升级的SWFirmware对象(或类似功能的对象),以下是基于现有系统架构和CSR机制的详细实现路径说明。


:puzzle_piece: 背景分析

目前系统中已存在与PCIe Switch相关的对象和升级机制,但缺少直接用于描述其固件更新行为的标准化对象。相关组件包括:

  • Chip PCIeSwitch:代表物理Switch芯片。
  • PCIe Switch Object:软件层面的PCIe Switch表示。
  • SRUpgrade / CSR Upgrade:负责配置与固件升级服务的核心类。
  • StorageChip:指定EEPROM存储位置,用于写入固件。
  • general_hardware/src/lualib/PCIeSwitch:未来Flash升级逻辑建议实现路径。
  • CSR文件:定义硬件自描述信息的核心配置文件。

:warning: 当前问题:缺少一个标准化的“Switch Firmware”对象类型来在CSR中明确定义Switch芯片的固件属性、版本、存储路径、升级策略等。


:white_check_mark: 实现目标

新增一个名为 SWFirmwareFirmware_PcieSwitch 的CSR对象类型,用于支持:

  1. 定义Switch芯片的固件属性(如版本号、UID、存储位置)。
  2. 在升级流程中被SRUpgrade识别并执行写入操作。
  3. 支持通过标准升级接口(如Redfish/IPMI/BMC Studio)进行管理。

:wrench: 实现步骤

第一步:定义新的CSR对象类(SWFirmware

在CSR配置文件中新增一个对象类型,结构如下(参考现有SRUpgrade对象):

"SWFirmware_1": {
    "UID": "00000001020302031826",
    "Type": "PcieSwitch",
    "Version": "1.00",
    "StorageChip": "#/Eeprom_EXU",
    "SoftwareId": "HWFIRM-SWITCH01",
    "WriteProtect": "#/Accessor_EXUWP.Value",
    "Description": "Firmware for PCIe Switch Chip"
}

:white_check_mark: 说明:

  • UID:全局唯一标识该Switch设备。
  • StorageChip:指向实际存储Switch固件的EEPROM地址。
  • WriteProtect:用于控制EEPROM写保护状态。
  • 此结构可被SRUpgrade服务自动识别与处理。

第二步:扩展SRUpgrade逻辑以识别新对象类型

修改 /src/lualib/sr_upg_service/parser_cfg.luasr_upgrade.lua,确保能够解析和处理 SWFirmware 类型。

1. 在 parser_cfg.lua 中添加类型映射

local SUPPORTED_TYPES = {
    BCU = true,
    PDB = true,
    -- ...其他类型
    PcieSwitch = true  -- 新增支持
}

2. 在 sr_upgrade.lua 基类中允许处理 PcieSwitch 类型

function SRUpgrade:isSupportedType(type)
    return SUPPORTED_TYPES[type] or type == "PcieSwitch"
end

第三步:建立“PCIe Switch芯片”与“固件对象”的关联

在CSR中使用动态引用,将Switch硬件对象绑定到固件对象。

示例:主控板CSR中定义

{
  "Chip_PcieSwitch_1": {
    "Address": 178,
    "HealthStatus": 0,
    "FirmwareObject": "#/SWFirmware_1"
  }
}

这样,系统可通过 Chip_PcieSwitch 查找其对应的固件对象,并触发升级。


第四步:实现Flash Upgrade逻辑(可选但必要)

由于当前系统尚未实现Switch芯片的Flash升级流程,需补充代码:

:light_bulb: 推荐路径:general_hardware/src/lualib/PCIeSwitch

创建文件 /general_hardware/src/lualib/PCIeSwitch/flash_upgrade.lua

local FlashUpgrade = {}

function FlashUpgrade.write(firmwareData, eepromPath)
    local chip = mc.find(eepromPath)
    if not chip then
        return false, "EEPROM not found"
    end

    -- 关闭写保护
    local wp = mc.find("#/Accessor_EXUWP.Value")
    if wp then wp:set(false) end

    -- 写入数据
    local ok = chip:write(0, firmwareData)
    if not ok then return false, "write failed" end

    -- 校验数据
    local readBack = chip:read(0, #firmwareData)
    if readBack ~= firmwareData then
        return false, "verification failed"
    end

    -- 重新开启写保护
    if wp then wp:set(true) end

    return true
end

return FlashUpgrade

调用方式:

sr_upgrade.luaProcess阶段 引入此模块:

require("general_hardware.src.lua.PCIeSwitch.flash_upgrade")
-- 在升级流程中调用 FlashUpgrade.write(data, storageChip)

第五步:配置升级包与目录结构

确保升级包包含对应UID的固件文件:

upgrade_package/
├── 00000001020302031826.sr  ← SWFirmware的固件数据
└── config.json

SRUpgrade服务会根据UID匹配找到该文件并执行升级。


第六步:支持状态查询与监控(可选)

新增命令接口(如IPMI/Redfish)

  • 实现 Get PCIe Switch Upgrade Status 命令(原已定义为禁用)。
  • 启用网络命令码:NetFn=30h, CMD=97h, SubCmd=0Fh
  • 返回字段如:
    {
      "Status": "Completed",
      "Progress": 100,
      "CurrentVersion": "1.00",
      "TargetVersion": "1.10"
    }
    

或通过D-Bus暴露状态

注册对象路径 /xyz/openbmc_project/software/pcie_switch,实现标准obmc-software接口。


:counterclockwise_arrows_button: 升级流程整合图

flowchart TB
    Start([收到升级请求]) --> Parse[解析CSR配置]
    Parse --> Match[匹配UID: 000000...1826]
    Match --> FindObj[查找SWFirmware_1]
    FindObj --> DisableWP[关闭EEPROM写保护]
    DisableWP --> Write[写入Flash]
    Write --> Verify[回读验证]
    Verify --> EnableWP[开启写保护]
    EnableWP --> UpdateVer[更新Version字段]
    UpdateVer --> Finish([升级完成])

:locked_with_key: 安全与兼容性注意事项

  1. 写保护机制必须启用:防止误写EEPROM。
  2. 升级前备份原始数据(低风险情况下可选)。
  3. 版本校验与签名验证:可在后续扩展中加入数字签名支持。
  4. 与V3系统的兼容性:V3系统部分功能受限(如网络性能下降),应测试升级过程稳定性。
  5. 避免并行任务干扰:历史上出现过日志任务干扰CSR升级的情况,应确保串行执行。

:white_check_mark: 验证建议

  1. 日志检查

    journalctl -u sr_upg_service
    

    查看是否有“Writing firmware to PcieSwitch”等日志。

  2. 命令行测试

    ipmcget -t storage -d firmwareupgrade -v SWFirmware_1
    
  3. 查看EEPROM数据

    mc info Eeprom_EXU
    

:white_check_mark: 总结

要成功新增支持PCIe Switch芯片固件更新的CSR对象,您需要:

步骤 内容
1 在CSR中定义新的 SWFirmware 对象,设置UID、StorageChip等属性
2 扩展 SRUpgrade 服务以识别 PcieSwitch 类型
3 实现Flash写入逻辑(建议在 general_hardware/src/lualib/PCIeSwitch
4 构建正确的升级包(UID.sr 文件)
5 可选:开放状态查询接口,实现端到端管理

:pushpin: 关键提示

根据知识库中 HuangDing 提供的指导:“关于pcie_switch的配适可以通过更改代码并增加CSR中的字段方式来手动适配,目前还没有通用适配方案。” 因此,当前只能通过定制化开发实现,尚无开箱即用的支持。

一旦完成,即可实现对PCIe Switch芯片固件的标准化管理与安全升级。

相关链接:

  1. CSR升级介绍
  2. switch板卡线缆警告配置
  3. [WIP]BMC Studio用户指南
  4. 如何使用BMC-Studio打包hpm--bmc_studio使用反馈
  5. GPU卡适配指导 | 文档中心 | openUBMC

如果这边更新PCIe Switch的芯片地址和方法比较确定的话,也可以参考设备树的方法,用C代码手动去进行更新,实现一个相关的资源树接口供Lua代码调用。

如果使用CSR方式的话,需要明确一下走的链路,在CSR文件里直接增加。之后在mdb_interface和组件的model.json中定义相关的对象类型,自动生成后框架可以实现分发。

这个SW的flash默认是在SW侧的,BMC要更新之前需要通过cpld把FLASH切到BMC侧来,因此感觉这种是不是更适合在csr,mdb_interface里面新增对象呢

实际上在component_driver里做csr和在mdb_interface里是一样的,如果只是切Flash,感觉上和CSR配置没啥关系,就是在业务里配置一下。