宝德服务器PR210KPRO上所有的pcie device的rootbdf显示信息错误

我们测试了mellanox的cx4网卡以及主机自带的RAID卡9560-8i,都是一样的信息不对,具体如下:
os下rootbdf显示: bmc的web下显示:
06:00.0 16:00.0
43:04.0 95:04.0
43:00.0 95:00.0
80:00.0 aa:00.0
e6:04.0 c0:04.0

其他插槽没测试,应该也是错的。但是所有的device的bdf信息全部都是对的。

举例如下,下面是我公司的网卡信息,可以看到rootbdf(总线信息)为:aa:00.0

在os下,rootbdf显示信息:80:00.0
image.png

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

总结

核心原因:BMC的RootBDF依赖于PcieAddrInfo配置中的BusDeviceFunction属性,当这些属性与实际OS下的值不匹配时,UI显示就会错误。
解决方向:修正每个PCIe设备对应PcieAddrInfo对象的上述三个属性,使其与OS中lspci获取的Bus、Device、Function一致。同时核查SocketIDPortID是否与实际硬件拓扑相符。

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

根据您提供的现象(OS下lspci显示的RootBDF与BMC Web界面显示的RootBDF不一致,例如OS下为80:00.0而Web显示aa:00.0),结合openUBMC的架构和社区经验,该问题通常源于PcieAddrInfo配置中的RootBDF相关属性(Bus、Device、Function)与实际硬件拓扑不匹配

问题根因分析

  1. 概念澄清

    • BDF(Bus, Device, Function)是PCIe设备在总线上的真实地址,由硬件枚举决定,通常与OS下lspci输出的结果一致。
    • RootBDF 是BMC根据系统拓扑(SocketID、PortID、SlotID等)计算出的根端口地址,用于设备识别和丝印匹配。
    • 两者在正确配置下应一致(参见社区讨论网卡的rootBDF和Bus Device Function(BDF)的区别),但若PcieAddrInfo配置有误,计算出的RootBDF就会与实际BDF偏离。
  2. 配置错误来源

    • 在openUBMC中,PcieAddrInfo对象存储了每个PCIe槽位的地址信息(包括BusDeviceFunctionSocketIDPortID等),BMC基于这些属性生成丝印文件,并用于设备加载和UI展示。
    • 如果PcieAddrInfo中的BusDeviceFunction值与OS下实际值不一致(例如槽位4的卡在OS下RootBDF为80:00.0,但PcieAddrInfo中配置了Bus=0xaa等),BMC就会显示错误的RootBDF。
    • 这种现象可能波及所有槽位,原因可能是系统级PcieAddrInfo映射表(CSR/SR配置)存在整体偏移或错误

定位与解决方案

1. 核对PcieAddrInfo配置

通过BMC资源树或busctl命令,检查受影响槽位对应的PcieAddrInfo对象中的BusDeviceFunction属性值。

操作示例(以槽位4为例):

busctl introspect bmc.kepler.Systems /bmc/kepler/Systems/1/PcieAddrInfo/PcieAddrInfo_xxx  # xxx为实际对象名

查看输出中BusDeviceFunction的值,与OS下该卡的RootBDF(如80:00.0对应Bus=0x80, Device=0x00, Function=0x0)比对。

2. 修改PcieAddrInfo属性以匹配OS值

参考openUBMC社区在M.2转接板问题中的解决方案(见文档2):

解决方案:修改PcieAddrInfo_SAS_1对象下的RootBDF三个相关属性BusDeviceFunction,改成OS下lspci查到的硬盘的RootBDF,匹配上就能获取到丝印。

同理,您需要将每个PcieAddrInfo对象中与实际卡不符的BusDeviceFunction修正为OS下该卡的真实RootBDF对应的数值。

3. 检查PortID和SocketID配置

在复杂拓扑中,RootBDF还依赖SocketIDPortID(代表CPU SerDes端口)。如果这些值与实际硬件连接不符,也会导致RootBDF计算错误。建议:

  • 查阅硬件手册或与硬件团队确认每个PCIe槽位连接的CPU Socket和SerDes端口编号。
  • 对比PcieAddrInfo中的PortIDSocketID是否与预期一致(社区帖子#3975中曾指出PortID配置错误导致RootBDF不匹配的问题)。

4. 整体排查PcieAddrInfo映射文件

由于所有设备均异常,很可能是**全局的PcieAddrInfo配置表(CSR/SR文件)**存在问题。请检查:

  • 系统中PcieAddrInfo_xxx对象的数量是否与现有PCIe槽位一致。
  • 每个对象的SlotIDBus等属性是否与物理槽位、实际BDF对应。
  • 是否存在重复或缺失的槽位配置。

5. 验证修改效果

修改配置后,可能需要重启BMC相关服务或重新加载设备,使新配置生效。之后在Web界面确认RootBDF是否已与OS一致。

总结

核心原因:BMC的RootBDF依赖于PcieAddrInfo配置中的BusDeviceFunction属性,当这些属性与实际OS下的值不匹配时,UI显示就会错误。
解决方向:修正每个PCIe设备对应PcieAddrInfo对象的上述三个属性,使其与OS中lspci获取的Bus、Device、Function一致。同时核查SocketIDPortID是否与实际硬件拓扑相符。

如上述步骤仍无法解决问题,建议提供完整的PcieAddrInfo配置内容和特定槽位的OS lspci信息,以便进一步分析。

~ ~ $ busctl introspect bmc.kepler.Systems /bmc/kepler/Systems/1/PcieAddrInfo/PcieAddrInfo_1_01010109
Failed to introspect object /bmc/kepler/Systems/1/PcieAddrInfo/PcieAddrInfo_1_01010109 of service bmc.kepler.Systems: The name bmc.kepler.Systems was not provided by any .service files

权限不够,只能mbctl下:
~ ~ $ mdbctl lsprop PcieAddrInfo_1_01010109
bmc.kepler.Object.Properties
ClassName=“PcieAddrInfo”
ObjectIdentifier=[1,“1”,“”,“01010109”]
ObjectName=“PcieAddrInfo_1_01010109”
TraceSamplingRate=0
bmc.kepler.Systems.PcieAddrInfo
Bus=170
ComponentType=8
ControllerIndex=2
ControllerType=0
Device=0
DeviceID=3970
Function=0
GroupID=0
Lanes=16
PCIeType=“Gen5”
PortID=12
ReadyToEnumerate=true
Segment=0
SlotID=4
SlotType=“”
SocketID=1
VendorID=7704
Private
ContainerSlot=2
ContainerUID=“00000001040302044498”
ContainerUnitType=“IEU”
DevBus=129
DevDevice=0
DevFunction=0
GroupPosition=“PcieAddrInfo_1_01010109”
Location=“RiserCard2”
MultihostPresence=1

可以看到, Bus=170,就是0xAA, DevBus=129,就是对应0x81,就是不对的

os下rootbdf显示: bmc的web下显示:
06:00.0 16:00.0
43:04.0 95:04.0
43:00.0 95:00.0
80:00.0 aa:00.0
e6:04.0 c0:04.0

就是对应上面的:80:00.0 aa:00.0

有可能是PSR中BDFConfig的配置问题。BDFConfig配置了CPU的PortId对应的root Bus和root Device

通过查找,发现是pcie_device仓里面的biz_topo.lua代码里面的local override_root_bdf映射不对,可能只是对我这个机型不对:
local override_root_bdf = {
[0x0] = {
[0] = { 0x01, 0, 0 },
[2] = { 0x01, 0x2, 0 },
[4] = { 0x01, 0x4, 0 },
[6] = { 0x01, 0x6, 0 },
[8] = { 0x16, 0, 0 },
[10] = { 0x16, 0x4, 0 },
[12] = { 0x40, 0, 0 },
[14] = { 0x40, 0x2, 0 },
[16] = { 0x40, 0x4, 0 },
[18] = { 0x40, 0x6, 0 },
[20] = { 0x56, 0, 0 },
[22] = { 0x56, 0x2, 0 },
[24] = { 0x56, 0x4, 0 },
[26] = { 0x56, 0x6, 0 },
[32] = { 0x5F, 0, 0 },
[34] = { 0x5F, 0x2, 0 },
[36] = { 0x5F, 0x4, 0 },
[38] = { 0x5F, 0x6, 0 }
},
[0x1] = {
[0] = { 0x80, 0, 0 },
[2] = { 0x80, 0x2, 0 },
[4] = { 0x80, 0x4, 0 },
[6] = { 0x80, 0x6, 0 },
[8] = { 0x95, 0, 0 },
[10] = { 0x95, 0x4, 0 },
[12] = { 0xAA, 0, 0 },
[14] = { 0xAA, 0x2, 0 },
[16] = { 0xAA, 0x4, 0 },
[18] = { 0xAA, 0x6, 0 },
[20] = { 0xC0, 0, 0 },
[22] = { 0xC0, 0x2, 0 },
[24] = { 0xC0, 0x4, 0 },
[26] = { 0xC0, 0x6, 0 },
[32] = { 0xD5, 0, 0 },
[34] = { 0xD5, 0x2, 0 },
[36] = { 0xD5, 0x4, 0 },
[38] = { 0xD5, 0x6, 0 }
}
}

我的卡的一个插槽:
~ ~ $ mdbctl lsprop PcieAddrInfo_1_01010109 | grep -E “SocketID|PortID”
PortID=12
SocketID=1

对应这个表格的:
[0x1] = {
[0] = { 0x80, 0, 0 },
[2] = { 0x80, 0x2, 0 },
[4] = { 0x80, 0x4, 0 },
[6] = { 0x80, 0x6, 0 },
[8] = { 0x95, 0, 0 },
[10] = { 0x95, 0x4, 0 },
[12] = { 0xAA, 0, 0 },
因此就是0xAA了,应该是0x80才对。关键是如果硬编码了,是不是其他型号的服务器又不对了?

我临时这样修改后,我自己的机器上,基本上都对了:

可以确定是我这个机型缺少:PSR中BDFConfig的配置。

这里写死配置是为了兼容早期机型的老PSR,因为老PSR可能没有配置BDFConfig。当前推荐做法是在PSR中配置BDFConfig