有关pcieaddrinfo类的疑惑

请教一下各位大佬们,pcieaddrinfo在mdb_interface定义中是没有DevBus,DevDevice,DevFunction这三个属性的。devbdf是bios返回给bmc的,并且赋值给pcieaddrinfo,再同步给到pciedevice。
疑问:
0.在代码中是可以看到pcieaddrinfo对象被赋值了DevBus,DevDevice,DevFunction属性,但是mds中却没有声明?


1.为什么使用mdbctl lsprop PcieAddrInfo_0_0101010101看不到DevBus,DevDevice,DevFunction信息。

2.是否可以在同级别(同一个sr文件)下,将该pcieaddrinfo的devbus,devdevice,devfun信息通过sr配置同步给另外一个pciedevice?
类似于以下的配法,是否可行:

{
    "FormatVersion": "3.00",
    "DataVersion": "3.00",
    "Unit": {
        "Type": "PCIeCard",
        "Name": "PCIeCard_1"
    },
    "ManagementTopology": {
        "Anchor": {
            "Buses": [
                "Hisport_5"
            ]
        },
        "Hisport_5": {
            "Chips": []
        }
    },
    "Objects": {
        "Component_PCIeCard": {
            "FruId": 255,
            "Instance": "<=/PCIeDevice_1.SlotID",
            "Type": 8,
            "BoardId": 65535,
            "Name": "<=/PCIeDevice_1.DeviceName",
            "Location": "<=/PCIeDevice_1.Position",
            "Manufacturer": "N/A",
            "PartNumber": "",
            "UniqueId": "",
            "Presence": 1,
            "Health": 0,
            "GroupId": 1,
            "PowerState": 1,
            "ReplaceFlag": 0,
            "NodeId": "<=/PCIeDevice_1.SlotID"
        },
        "PCIeDevice_1": {
            "DeviceName": "PCIe Card $",
            "FunctionClass": 9,
            "Position": "",
            "DiagnosticFault": 0,
            "PredictiveFault": 0,
            "BandwidthReduction": 0,
            "LinkSpeedReduced": 0,
            "CorrectableError": 0,
            "UncorrectableError": 0,
            "FatalError": 0,
            "Container": "${Container}",
            "GroupPosition": "PCIeDevice_${GroupPosition}",
            "DeviceType": 8
        },
        "Connector_PCIE_1": {
            "Bom": "14140130",
            "Slot": 1,
            "Position": 1,
            "Presence": 1,
            "Id": "",
            "AuxId": "",
            "Buses": [
                "I2cMux_9548Chan54"
            ],
            "SystemId": "${SystemId}",
            "ManagerId": "${ManagerId}",
            "ChassisId": "${ChassisId}",
            "SilkText": "PCIeSlot${Slot}",
            "IdentifyMode": 2,
            "Container": "Component_Switch",
            "Type": "PCIe"
        },
        "PcieAddrInfo_1": {
            "Location": "PCIeSlot${Slot}",
            "ComponentType": 8,
            "ContainerSlot": "${Slot}",
            "ContainerUID": "37387switch",
            "ContainerUnitType": "IEU",
            "GroupPosition": "PcieAddrInfo_1_${GroupPosition}",
            "HwPresence": "<=/Scanner_Slot0Presence.Value|>expr($1 == 1? 0 : 1)",
            "DevBus": "<=/PCIeDevice_1.DevBus",
            "DevDevice": "<=/PCIeDevice_1.DevDevice",
            "DevFunction": "<=/PCIeDevice_1.DevFunction"
        }
    }
}

答案内容由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

您好,PCIeAddrInfo的devBDF是私有属性,在正式包里是不能通过mdbctl查看到的。但是在代码内部可以查看并使用。

在csr内部也是没有办法索引这些信息的,如果需要将bdf同步给其他设备,可以通过SlotID匹配到对应的pciedevice,再从pciedevice上获取对应的devBDF。

了解了,感谢。有一些特殊情况,是否可以支持配置静态的devBDF呢?也就是是否可以在代码或者CSR中配置好了devBDF,不依赖BIOS的返回。然后四元组信息还是通过IMU动态获取。

本质上只要确定这个位置的PortId和SlotId,即使不配置devBDF,Bios也可以正常上报BDF,之后走查看四元组信息,加载卡的流程。

方法是把对应IEU的PcieAddrInfo对象的SlotId和PortId配死,具体配置的值可以观察相同插法在拓扑建立完成情况下资源树上的值。相关配置在EXU上可以找到参考,一些OCP卡的槽位就是用这种配法。