有关pcieaddrinfo类的疑惑

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

关于 PcieAddrInfo 类中 DevBusDevDeviceDevFunction 属性的详细解析

针对您提出的关于 PcieAddrInfo 类的多个疑问,结合知识图谱信息与文档内容,现进行系统性解答如下:


:magnifying_glass_tilted_left: 疑问 0:为何代码中可赋值 DevBusDevDeviceDevFunction,但 MDS 中未声明?

:white_check_mark: 事实依据:

  • 在 Lua 源码文件 pcie_addr_info.lua 中存在以下方法:

    function c_pcie_addr_info:update_device_bdf(dev_bus, dev_device, dev_function)
        self:set_prop('DevBus', dev_bus)
        self:set_prop('DevDevice', dev_device)
        self:set_prop('DevFunction', dev_function)
    end
    

    这表明在运行时通过 set_prop 动态为 PcieAddrInfo 对象设置了三个属性。

  • 但在 MDS 模型定义mdb_interface 接口定义 中,并未显式声明这三个属性。

:pushpin: 原因分析:

在 openUBMC 架构中,存在两类属性机制:

类型 说明
静态属性(Static Properties) 由 MDS 或 SR 文件预先定义,在资源树(D-Bus)中暴露,可通过 mdbctl 查看。
动态属性(Dynamic Properties) 在运行时通过 set_prop 添加,仅存在于内存对象中,不注册到 D-Bus 接口,因此 不可见于 mdbctl lsprop

:warning: 结论DevBusDevDeviceDevFunction动态运行时属性,用于内部逻辑传递和同步,但 未在 MDS 中注册为持久化或对外暴露的接口属性,因此不会出现在 D-Bus 接口列表中。


:magnifying_glass_tilted_left: 疑问 1:为何 mdbctl lsprop PcieAddrInfo_xxx 看不到 DevBus 等属性?

:white_check_mark: 事实依据:

执行命令:

mdbctl lsprop PcieAddrInfo_0_0101010101

输出结果中仅包含如下标准属性(来自 D-Bus 接口 bmc.kepler.Systems.PcieAddrInfo):

Bus, Device, Function, Segment, SlotID, SocketID, VendorID, DeviceID, PortID...

没有出现 DevBusDevDeviceDevFunction

:pushpin: 原因分析:

  • mdbctl 查询的是 D-Bus 上暴露的接口属性,即那些在 mdb_interface.json 或 MDS 中声明并绑定到 D-Bus 的属性。
  • 动态添加的 DevBus 等属性 不在任何 D-Bus 接口定义中,仅为 Lua 层内存对象的字段,供程序内部使用。
  • 即使调用了 set_prop(),若未配置为 CSR 属性或未在类接口中定义,则不会同步至资源树(Resource Tree)。

:white_check_mark: 解决方案建议
若需外部工具访问这些值,应将它们作为正式属性添加到 PcieAddrInfo 类的接口定义中,并在 SR 文件中配置为 "usage": "CSR""expose": true


:magnifying_glass_tilted_left: 疑问 2:是否可以在 SR 文件中将 PcieAddrInfoDevBus/DevDevice/DevFunction 同步给另一个 PCIeDevice

您提出如下同步配置是否可行:

"PcieAddrInfo_1": {
    "DevBus": "<=/PCIeDevice_1.DevBus",
    "DevDevice": "<=/PCIeDevice_1.DevDevice",
    "DevFunction": "<=/PCIeDevice_1.DevFunction"
}

:cross_mark: 答案:不可行

:pushpin: 原因分析:

  1. DevBus 等是动态属性,非正式 CSR 属性

    • SR 文件中的 <==/... 引用语法要求被引用的属性是 已注册的 CSR 属性或资源树属性(D-Bus)
    • PCIeDevice_1.DevBus 若也未在 MDS 中定义,则不具备“可引用”资格。
  2. 属性流向错误

    • 正常流程是:BIOS 上报 BDF → BMC 存入 DevBDF(或其分解字段)→ 同步给 PCIeDevice
    • 而您的配置试图反向操作:PCIeDevice 回写 PcieAddrInfo,违背了系统拓扑加载顺序。
  3. 正确的同步关系应为:

    "PCIeDevice_1": {
        "DevBus":   "<=/PcieAddrInfo_1.DevBus",
        "DevDevice": "<=/PcieAddrInfo_1.DevDevice",
        "DevFunction": "<=/PcieAddrInfo_1.DevFunction"
    }
    

    即:PcieAddrInfo 提供源数据,PCIeDevice 消费该数据。

  4. 进一步事实支持

    • 根据知识库中描述:

      “PCIeDevice 的加载是先加载它的上一级配置 PCIeAddrInfo 对象,然后再来加载对应的 PCIeDevice,PCIeDevice 中槽位号和 BDF 由 PCIeAddrInfo 同步而来”(来源:[板卡适配指南])

    • 可知:PcieAddrInfo 是上游配置源,PCIeDevice 是下游消费者。

:white_check_mark: 推荐做法
若需让 PcieAddrInfo 获取设备 BDF,应在业务逻辑中由 BIOS/IPMI 上报后,通过代码调用 update_device_bdf() 设置动态属性;若需持久化或对外暴露,应修改 MDS 模型将其定义为正式属性。


:white_check_mark: 总结

问题 结论
0. 代码可以赋值,MDS 不声明? :white_check_mark: 可行。因 set_prop 支持动态添加内存属性,不依赖 MDS 声明。
1. 为什么 mdbctl lsprop 看不到? :cross_mark: 因为这些属性未注册到 D-Bus 接口,仅存在于 Lua 对象内存中。
2. 是否可通过 SR 同步给其他对象? :cross_mark: 不可行。动态属性不能用于 CSR 配置引用;且数据流向错误。应由 PcieAddrInfoPCIeDevice

:light_bulb: 建议与最佳实践

  1. 如需对外暴露 DevBus 等字段

    • 修改 PcieAddrInfo 类的接口定义,在 MDS 或 mdb_interface.json 中添加:

      "DevBus": { "type": "uint8", "expose": true, "usage": "CSR" }
      
    • 并在 SR 文件中正确使用引用语法。

  2. 优先使用标准字段

    • 使用已定义字段如 Device, Bus, Function 表示地址信息。
    • DevBus 等宜用于区分“设备实际 BDF”与“配置预期 BDF”。
  3. 调试技巧

    • 使用 Lua 日志打印动态属性:

      log.info("DevBus=%d", self.DevBus)
      
    • 或通过 __index/__newindex 拦截属性访问以排查问题。


如有更多关于 CSR、MDS 模型或 PCIe 动态加载的问题,欢迎继续提问!

相关链接:

  1. PcieAddrInfo这个对象的Bus属性能否固定写死呢?
  2. 系统管理-其他-PCIE卡页面槽位号和CPU归属信息不同步
  3. PCIe配置指导说明文档
  4. 【讨论】PCIe Switch场景下如何加载PCIe卡
  5. 持久化机制常见问题 | 文档中心 | openUBMC