答案内容由AI生成,仅供参考:
关于 PcieAddrInfo 类中 DevBus、DevDevice、DevFunction 属性的详细解析
针对您提出的关于 PcieAddrInfo 类的多个疑问,结合知识图谱信息与文档内容,现进行系统性解答如下:
疑问 0:为何代码中可赋值 DevBus、DevDevice、DevFunction,但 MDS 中未声明?
事实依据:
-
在 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接口定义 中,并未显式声明这三个属性。
原因分析:
在 openUBMC 架构中,存在两类属性机制:
| 类型 | 说明 |
|---|---|
| 静态属性(Static Properties) | 由 MDS 或 SR 文件预先定义,在资源树(D-Bus)中暴露,可通过 mdbctl 查看。 |
| 动态属性(Dynamic Properties) | 在运行时通过 set_prop 添加,仅存在于内存对象中,不注册到 D-Bus 接口,因此 不可见于 mdbctl lsprop。 |
结论:
DevBus、DevDevice、DevFunction是 动态运行时属性,用于内部逻辑传递和同步,但 未在 MDS 中注册为持久化或对外暴露的接口属性,因此不会出现在 D-Bus 接口列表中。
疑问 1:为何 mdbctl lsprop PcieAddrInfo_xxx 看不到 DevBus 等属性?
事实依据:
执行命令:
mdbctl lsprop PcieAddrInfo_0_0101010101
输出结果中仅包含如下标准属性(来自 D-Bus 接口 bmc.kepler.Systems.PcieAddrInfo):
Bus, Device, Function, Segment, SlotID, SocketID, VendorID, DeviceID, PortID...
没有出现 DevBus、DevDevice、DevFunction。
原因分析:
mdbctl查询的是 D-Bus 上暴露的接口属性,即那些在mdb_interface.json或 MDS 中声明并绑定到 D-Bus 的属性。- 动态添加的
DevBus等属性 不在任何 D-Bus 接口定义中,仅为 Lua 层内存对象的字段,供程序内部使用。 - 即使调用了
set_prop(),若未配置为 CSR 属性或未在类接口中定义,则不会同步至资源树(Resource Tree)。
解决方案建议:
若需外部工具访问这些值,应将它们作为正式属性添加到PcieAddrInfo类的接口定义中,并在 SR 文件中配置为"usage": "CSR"或"expose": true。
疑问 2:是否可以在 SR 文件中将 PcieAddrInfo 的 DevBus/DevDevice/DevFunction 同步给另一个 PCIeDevice?
您提出如下同步配置是否可行:
"PcieAddrInfo_1": {
"DevBus": "<=/PCIeDevice_1.DevBus",
"DevDevice": "<=/PCIeDevice_1.DevDevice",
"DevFunction": "<=/PCIeDevice_1.DevFunction"
}
答案:不可行
原因分析:
-
DevBus等是动态属性,非正式 CSR 属性- SR 文件中的
<==/...引用语法要求被引用的属性是 已注册的 CSR 属性或资源树属性(D-Bus)。 - 而
PCIeDevice_1.DevBus若也未在 MDS 中定义,则不具备“可引用”资格。
- SR 文件中的
-
属性流向错误
- 正常流程是:BIOS 上报 BDF → BMC 存入
DevBDF(或其分解字段)→ 同步给PCIeDevice。 - 而您的配置试图反向操作:从
PCIeDevice回写PcieAddrInfo,违背了系统拓扑加载顺序。
- 正常流程是:BIOS 上报 BDF → BMC 存入
-
正确的同步关系应为:
"PCIeDevice_1": { "DevBus": "<=/PcieAddrInfo_1.DevBus", "DevDevice": "<=/PcieAddrInfo_1.DevDevice", "DevFunction": "<=/PcieAddrInfo_1.DevFunction" }即:
PcieAddrInfo提供源数据,PCIeDevice消费该数据。 -
进一步事实支持:
-
根据知识库中描述:
“PCIeDevice 的加载是先加载它的上一级配置 PCIeAddrInfo 对象,然后再来加载对应的 PCIeDevice,PCIeDevice 中槽位号和 BDF 由 PCIeAddrInfo 同步而来”(来源:[板卡适配指南])
-
可知:
PcieAddrInfo是上游配置源,PCIeDevice是下游消费者。
-
推荐做法:
若需让PcieAddrInfo获取设备 BDF,应在业务逻辑中由 BIOS/IPMI 上报后,通过代码调用update_device_bdf()设置动态属性;若需持久化或对外暴露,应修改 MDS 模型将其定义为正式属性。
总结
| 问题 | 结论 |
|---|---|
| 0. 代码可以赋值,MDS 不声明? | set_prop 支持动态添加内存属性,不依赖 MDS 声明。 |
1. 为什么 mdbctl lsprop 看不到? |
|
| 2. 是否可通过 SR 同步给其他对象? | PcieAddrInfo → PCIeDevice。 |
建议与最佳实践
-
如需对外暴露
DevBus等字段:-
修改
PcieAddrInfo类的接口定义,在 MDS 或mdb_interface.json中添加:"DevBus": { "type": "uint8", "expose": true, "usage": "CSR" } -
并在 SR 文件中正确使用引用语法。
-
-
优先使用标准字段:
- 使用已定义字段如
Device,Bus,Function表示地址信息。 DevBus等宜用于区分“设备实际 BDF”与“配置预期 BDF”。
- 使用已定义字段如
-
调试技巧:
-
使用 Lua 日志打印动态属性:
log.info("DevBus=%d", self.DevBus) -
或通过
__index/__newindex拦截属性访问以排查问题。
-
如有更多关于 CSR、MDS 模型或 PCIe 动态加载的问题,欢迎继续提问!
相关链接: