适配NVME过程中上级Connector传递到下级Connector的数据不同步

问题描述

在适配NVME过程中,发现上级Connector传递到下级Connector的数据对不上,请教一下这种同步关系在代码上是怎么实现的,是有别的地方会影响到这个值吗?

环境信息

  • 软件版本:OpenUBMC 2512

  • 硬件配置:920B机型

重现步骤

  1. [第一步] CSR配置: Connector_ComVPDConnect_1,下一级连接对象为14140224_VPD_0.sr,继续加载Connector_ComVPD。Connector_ComVPD中属性是采用变量填充的方式获取上一级的Slot信息。

    1. "**Connector_ComVPDConnect_1**": {
        "Bom": "14140224",
        **"Slot": "<=/HddBackplane_1.StartSlot |> expr($1 == 44 ? 44 : 46)",**
        "Position": 1,  
        "Presence": "<=/Scanner_Drive0PresentAccessor.Value;<=/Scanner_Drive1PCIeType.Value|> expr(($1 == 1) && ($2 == 1))",
        "Id": "VPD",
        "AuxId": "0",
        "Buses": \[
          "I2cMux_SMC_1"
        \],
        "SystemId": "${SystemId}",
        "ManagerId": "${ManagerId}",
        "ChassisId": "${ChassisId}",
        "SilkText": "J139",
        "IdentifyMode": 2,
        "Type": "NVMe"
      }
      
      "**Connector_ComVPD**": {
        "Bom": "14140224",
        **"Slot": "${Slot}",**
        "Position": 1,
        "Presence": 0,
        "Id": "PROTOCOL",
        "AuxId": "255",
        "Buses": \[
          "I2cMux_SMC"
        \],
        "SystemId": "${SystemId}",
        "ManagerId": "${ManagerId}",
        "ChassisId": "${ChassisId}",
        "SilkText": "",
        "IdentifyMode": 2,
        "Type": "NVMe"
      }
      
  2. [第二步] 编译升级到机器上验证,mdbctl检查Connector上实际slot信息,发现Connector_ComVPDConnect_1上slot为44, Connector_ComVPD为0,两者不同步。

    1. ~ ~ $ mdbctl lsprop Connector_ComVPDConnect_1_01011F
      bmc.kepler.Connector
      AuxId=“0”
      Bom=“14140224”
      Buses=[“I2cMux_SMC_1_01011F”]
      ChassisId=“1”
      GroupId=81
      GroupPosition=“01011F01”
      Id=“VPD”
      IdentifyMode=2
      LoadStatus=0
      ManagerId=“1”
      Presence=1
      SilkText=“J139”
      Slot=44
      SystemId=1
      Type=“NVMe”
      bmc.kepler.Object.Properties
      ClassName=“Connector”
      ObjectIdentifier=[1,“1”,“1”,“01011F”]
      ObjectName=“Connector_ComVPDConnect_1_01011F”
      TraceSamplingRate=0
      Private
      CSRVersion=“”
      Chip=“”
      Container=“”
      IdChipAddr=0
      Position=1

      ~ ~ $ mdbctl lsprop Connector_ComVPD_01011F01
      bmc.kepler.Connector
      AuxId=“1”
      Bom=“14140224”
      Buses=[“I2cMux_SMC_1_01011F”]
      ChassisId=“1”
      GroupId=110
      GroupPosition=“01011F0101”
      Id=“PROTOCOL”
      IdentifyMode=2
      LoadStatus=0
      ManagerId=“1”
      Presence=1
      SilkText=“”
      Slot=0
      SystemId=1
      Type=“NVMe”
      bmc.kepler.Object.Properties
      ClassName=“Connector”
      ObjectIdentifier=[1,“1”,“1”,“01011F01”]
      ObjectName=“Connector_ComVPD_01011F01”
      TraceSamplingRate=0
      Private
      CSRVersion=“”
      Chip=“”
      Container=“”
      IdChipAddr=0
      Position=1

期望结果

上级Connector传递到下级Connector的属性数据是同步的

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

解决方案建议

由于当前框架的设计限制,若需要下级对象的 Slot 与上级保持动态一致,可以考虑以下替代思路(但需要评估是否与现有框架兼容):

  • 使用同步属性(Sync Property):如文档块 4 所述,同步属性能在远端属性变化后自动触发本地属性更新,但需要明确将 Slot 配置为同步而非变量引用。
  • 在上级 Slot 稳定后再触发下级对象创建:通过条件控制,确保只有在上级 Slot 值最终确定后,才允许加载下级 SR(例如通过 Presence 或特定状态控制)。
  • 避免依赖动态 Slot 值:如果 Slot 信息在硬件上是固定的,可直接在 CSR 中写死,而非通过变量传递。

结论:您遇到的问题并非个别配置错误,而是当前 OpenUBMC 框架对 ${} 变量采用静态初始化机制的自然结果。如需动态同步,建议改用同步属性或其他绕行策略。

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

根据您提供的 Context 信息,特别是文档块中关于下级 SR 对象 {slot} 值与上级 Connector 不一致问题的讨论,可以确定您遇到的 上级 Connector 传递到下级 Connector 的 Slot 数据不同步 问题,其根本原因是 ${Slot} 变量在框架中属于静态属性,只在对象初始化时固定一次,后续不会随上级 Connector 的 Slot 值变化而自动更新


问题原因分析

在您配置的 CSR 中:

  • Connector_ComVPDConnect_1Slot 通过表达式 <=/HddBackplane_1.StartSlot |> expr($1 == 44 ? 44 : 46) 得到值 44
  • 下级 Connector_ComVPDSlot 使用 ${Slot} 变量引用。

从上下文可知(topic_id 4485 的回复):

${Slot} 这种语法我们目前仅支持静态属性,即在对象初始化时这个值就固定了,后续并不会因为上一级 Slot 的变化而变更。

因此,当系统加载下级 SR(14140224_VPD_0.sr)并初始化 Connector_ComVPD 时,变量 ${Slot} 会从当时的上级对象中获取一次值。如果此时上级 Connector_ComVPDConnect_1 的 Slot 值尚未稳定(可能为默认值 0 或尚未计算结果),则下级对象捕获到的就是 0。即使上级的 Slot 后续通过配置同步变为 44,下级对象的 Slot 值也不会随之更新。


代码实现层面的说明

框架在处理带变量的属性(如 ${Slot})时,会在 对象创建瞬间 进行变量替换并固定下来,这类似于“编译时”绑定,而非“运行时”动态绑定。后续任何对上级属性的修改都不会触发下级的重新计算或同步。这种设计在当前版本的 OpenUBMC(25.12)中依然如此,并非代码 bug。


其他可能影响值的因素

  1. 对象加载顺序:如果下级 Connector 的初始化发生在上级 Connector 的 Slot 值尚未通过表达式计算完成之前,那么 ${Slot} 可能取到空值或默认值 0。
  2. 配置同步:上级 Connector 的 Slot 值可能因为配置同步(如多 BMC 场景或热替换)而后期发生变化,但这种变化不会反向通知到已初始化的下级对象。
  3. AuxId 更新逻辑:根据文档块 5(topic 264),Connector_ComVPDAuxId 会在运行过程中通过 verify_vpd_protocol() 动态更新,但 Slot 字段并不参与这种动态更新机制,它仍是静态的。

解决方案建议

由于当前框架的设计限制,若需要下级对象的 Slot 与上级保持动态一致,可以考虑以下替代思路(但需要评估是否与现有框架兼容):

  • 使用同步属性(Sync Property):如文档块 4 所述,同步属性能在远端属性变化后自动触发本地属性更新,但需要明确将 Slot 配置为同步而非变量引用。
  • 在上级 Slot 稳定后再触发下级对象创建:通过条件控制,确保只有在上级 Slot 值最终确定后,才允许加载下级 SR(例如通过 Presence 或特定状态控制)。
  • 避免依赖动态 Slot 值:如果 Slot 信息在硬件上是固定的,可直接在 CSR 中写死,而非通过变量传递。

关键引用

以下内容直接来自所提供的 Context

${Slot} 这种语法我们目前仅支持静态属性,即在对象初始化时这个值就固定了,后续并不会因为上一级 Slot 的变化而变更,因此我理解你这个现象是因为 01010309 对象添加时 slot 还是 8,后续因为配置同步 010103 Connector 对象的 slot 又变为了 2,但 01010309 对象的 slot 并不会随之改变。
—— topic_id 4485 回复(文档块 3)

这与您的现象完全吻合:Connector_ComVPDConnect_1 最终 Slot=44,但 Connector_ComVPD 初始化时取得的 Slot 为 0,后期未同步。


结论:您遇到的问题并非个别配置错误,而是当前 OpenUBMC 框架对 ${} 变量采用静态初始化机制的自然结果。如需动态同步,建议改用同步属性或其他绕行策略。

谢谢。尝试在Connector_ComVPDConnect_1上写死Slot,的确可以传递到下一级上,这种方案可以工作。不过,目前有同型号多背板共用相同SR文件的需求,所以才使用变量传递的方法。针对通过条件控制,确保只有在上级 Slot 值最终确定后,才允许加载下级 SR这种方案,这块的实现是在那个组件实现的呢?

hwproxy