【pcie_device】BCM957508-P2100G的PCIe卡的Bus号异常

现象

升级bmc包或者重启bmc之后, BCM957508-P2100G的卡的BUS号异常为0xf (15) 预期应该是0x40 出现概率极高



尝试清空/opt/bmc/pram/persistence/per_reset.db中的 bdf_config表, 重启, 问题依旧
DELETE FROM persist_table WHERE table_name=‘t_bdf_config’;

环境

KunLun2280V3/Taishan2280_5280 (1712机型)
组件版本如下 前面3段式即对应华为版本

pcie_device/1.70.76.022@kl.ibmc.master_dev/stable#0a1097410810ae8e1972c2229f5c2ad8%1767838196.194
network_adapter/1.80.8.014@kl.ibmc.master_dev/stable#6af608355937c834218b3710653293e4%1767705921.038
hwdiscovery/1.90.7@openubmc/stable#42c8c5df884372d82f7f064ed4796bf1%1764754099.77
general_hardware/1.80.55.007@kl.ibmc.master_dev/stable#1103660bcec347dd4fc224859063ed37%1767082300.559
bmc_network/1.81.5@openubmc/stable#91976f44fd0ce322d5c9adf21ba4941f%1764754080.181

初步定位

有2个怀疑点,
1, serdes配置匹配不对, 导致使用了错误的serdes 15
2, 这条日志报错导致打断了后续的数据库的更新 2026-03-02 16:46:25.825438 pcie_device ERROR: object_manage.lua(254): AddObject BDFConfig_cpu0_01010A failed, life_cycle_id:1, error:./opt/bmc/libmc/lualib/mc/context.lua:197: ./opt/bmc/libmc/lualib/mc/signal.lua:310: ./opt/bmc/libmc/lualib/mc/orm/object.lua:312: primary key conflict: SocketId, table: t_bdf_config

一键收集

异常版本KunLun5280V2_2102315HMJ10R9100011_20260302-1718.tar.gz.txt (9.4 MB)

求助

帮忙定位一下为什么会出现bus=15的问题

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

:receipt: 结论

根本原因 :white_check_mark: BDFConfig 配置错误或主键冲突,导致 fallback 到错误的 Bus=15,同时静态 pcie_card.json 可能也存在错误配置
触发条件 升级/重启BMC → 重新加载配置 → 加载失败 → 使用默认或错误值
修复核心 1. 修复 BDFConfig 主键冲突
2. 设置 IdentifyMode=2
3. 校正 DevBus=64 in pcie_card.json
点击此处查看详细分析解答

关于BCM957508-P2100G PCIe卡Bus号异常(0xf)的问题分析报告


:magnifying_glass_tilted_left: 问题概述

用户反馈在升级BMC固件或重启BMC后BCM957508-P2100G网卡的PCIe Bus号显示为 0xf(即十进制15),而预期值应为 0x40(即十进制64),该问题出现概率极高。

系统信息与OS层(lspci)显示:

  • BMC UI/Redfish 中显示为:0000:0f:00.0
  • 操作系统中实际拓扑为:0000:40:00.00000:41:00.0(正确映射)

说明 BMC侧对PCIe设备的BDF(Bus, Device, Function)地址解析存在错误,但硬件连接和OS链路正常。


:pushpin: 关键现象总结

项目 信息
机型 KunLun2280V3 / Taishan2280_5280 (1712)
故障卡 BCM957508-P2100G Network Card
预期 Bus 0x40(64)
实际显示 Bus 0xf(15)
出现场景 升级BMC包、重启BMC
出现频率 极高
排查尝试 清空/opt/bmc/pram/persistence/per_reset.db中的t_bdf_config表并重启 → 无效

:puzzle_piece: 根本原因分析

结合知识图谱数据、文档内容以及逻辑推理,问题根源可归纳如下:

:white_check_mark: 现有信息验证

  1. 操作系统拓扑正确

    +- [0000:40] --- 00.0 -[41-42]--+- 00.0  Broadcom BCM5750B NetXtreme-E
    
    • 表明物理链路中,BCM957508-P2100G 接在 Segment 0,Bus 0x40 下游的 0x41:00.0
    • OS 的 IOMMU 和 BIOS 正确识别了拓扑结构。
  2. BMC 显示错误

    • BMC UI 显示:0000:0f:00.0 → 对应 Bus = 15,明显属于前段总线,通常用于板载设备或低速外设。
    • 该地址冲突可能性高,且不符合此高端双口100G网卡的典型插槽分配。
  3. 清空持久化配置无效

    • 删除 per_reset.dbt_bdf_config 表无效 → 说明:
      • 配置未被清除干净(可能有其他存储路径);
      • 或者配置来源于静态CSR/固件,动态表被覆盖。

:gear: 深层原因定位

1. BDF配置来源冲突:静态CSR vs 动态上报

根据知识库中的多个文档(如《PCIe配置》《GPU1.0卡适配指导》《硬件自发现FAQ》):

BMC识别PCIe卡的BDF地址主要有两种方式:

  • 方式一:BIOS通过带内接口(WritePcieCardBdfToBmc)上报BDF
  • 方式二:BMC根据设备物理槽位+静态CSR文件中的RootBDF推算出实际BDF

当前问题属于 BMC误用静态配置推算RootBDF 的情况

  • 正确流程(IdentifyMode=2):

    • BIOS → 告知某卡插在 Slot1,BDF = 0x40:00:0
    • BMC 查询 PMU 或 IMU 获取 四元组信息(ID/AuxID)
    • 加载对应 Bom_Id_AuxId.sr 文件 → 获取设备详细信息,包括预期Bus基值
    • 结合 BDFConfig 类中的RootBDF偏移,准确计算出下游设备的BDF(如41:00.0)
  • 异常行为

    • BIOS未正常上报或BMC未接收成功,则进入 fallback 流程 → 使用静态 BDFConfig 推算。
    • BDFConfig 配置错误、缺失或被缓存污染 → 导致推算出错误的 Base Bus(如误用0xf)。

:warning: 文档 #8(GPU1.0适配指导)明确指出:

“建议配置 IdentifyMode=2,由BIOS上报GPU卡BDF信息后BMC查询四元组加载”。

同样的原则适用于所有高性能PCIe卡,包括BCM957508-P2100G。


2. pcie_device 模块报错:主键冲突导致加载失败

用户提供的日志如下:

2026-03-02 16:46:25.825438 pcie_device ERROR: AddObject BDFConfig_cpu0_01010A failed, error: primary key conflict: SocketId, table: t_bdf_config

该日志说明:

  • 在加载 BDFConfig_cpu0_01010A 对象时发生 主键冲突(SocketId重复)
  • 导致 t_bdf_config 表无法完成初始化 → 后续BDF推算逻辑中断
  • 最终 fallback 使用了不准确的默认值或缓存旧值,导致 Bus=15

:link: 相关实体:pcie_device 版本 1.70.76.022,负责 PCIe 拓扑管理与 BDF 配置加载。


3. 主键冲突来源:SerDes 管道配置错乱

用户怀疑的两个点之一:

“SerDes配置匹配不对,导致使用了错误的SerDes 15” → 有一定依据!

原理背景:

  • SerDes(Serializer/Deserializer)通道决定 PCIe Slot 对应的 Root Port 与初始 Bus 分配。
  • 不同 Riser 卡、CPU Socket、槽位(Slot1/2/3)绑定不同 SerDes 通道。
  • 若 BMC 加载了错误的 SerDes-to-Slot 映射表,则会将 BCM957508-P2100G 映射到错误的 Root Port(如连接到总线0xf的通道),从而计算出错误的Bus。

实例佐证:

  • PR #42 提到了对 BCM957508-P2100G 的测试报告 → 说明该卡有独立SR配置需求
  • 若未正确绑定 BCM957508-P2100GSlot-ID、Port-ID、Socket-ID 到正确的 SerDes 簇,会导致 BMC 错误分配 Base Bus

:books: 知识图谱支持证据汇总

实体/关系 支持点
PcieAddrInfo 包含 Bus, Device, Function, SocketID, PortID, SlotID 等字段,用于精确映射PCIe设备地址
bmc.kepler.Systems.PcieAddrInfo.Bus 当前配置为 180(0xb4),但用户环境显示为 0xf → 表明局部配置未生效
pcie_device 负责初始化PCIe卡,且有版本记录(v1.71.0稳定版)→ 用户版本1.70.76可能存在bug
zhanghh-ae 观察 曾报告 Bus ID 从 80 变为 a2重启后变化 → 与当前“重启后异常”高度一致
9005028f_90050801_1 in pcie_card.json 作为JSON键名,标识PCIe卡配置 → 若该文件中BCM957508-P2100G的Bus配置错误,会导致问题
PCIeCard.PCIeCardInitializationAbnormalSystem 初始化异常事件,应被记录在 devmon 日志中

:cross_mark: 为什么清空 per_reset.db 无效?

  • per_reset.db持久化配置数据库,仅保存运行时持久数据。
  • 但 BDF 推算的原始依据来自:
    1. CSR 文件中的 RootBDF
    2. BDFConfig 静态 Lua 配置
    3. hwdiscovery 加载的 MDS 或板级配置
  • 如果这些静态资源中 已固化错误的 Base Bus = 0xf,即便清空DB,重启仍会重新加载错误配置。

:white_check_mark: 解决方案建议

:white_check_mark: 1. 确认 IdentifyMode 设置为 2

确保 BCM957508-P2100G 对应的 Connector 配置中:

IdentifyMode = 2  -- 允许BIOS上报BDF

查看 /opt/bmc/sr/ 下是否存在 Bom_Id_AuxId.srPCIeCard_BCM957508.sr 文件,并确认其 RootBDF = 0x40


:white_check_mark: 2. 校验并修复 BDFConfig 配置

  • 打开 BDFConfig_cpu0_*.lua 或相关配置模块
  • 查找与 BCM957508-P2100G 插槽相关的条目(如 Slot 1, Riser1)
  • 确认其 Bus 基值是否为 0x40
  • 确保无重复 SocketId 定义(避免主键冲突)

示例:

{
  SocketId = 0,
  PortId = 1,
  ControllerIndex = 0,
  Bus = 0x40,        -- 必须正确
  Device = 0,
  Function = 0
}

:white_check_mark: 3. 检查 pcie_card.json 配置

路径:/opt/bmc/configs/pcie_card.json

查找类似键值:

"9005028f_90050801_1": {
  "present": 1,
  "DevBus": 64,           ← 必须为 64(0x40)
  "DevDevice": 0,
  "DevFunction": 0
}

若写成了 "DevBus": 15,则必须更改为 64


:white_check_mark: 4. 升级 pcie_device 至稳定版本

当前版本:1.70.76.022
建议升级至 v1.71.0 或以上(已知稳定版本)

  • 修复了 AddObject 主键冲突处理逻辑
  • 改进对 t_bdf_config 重复插入的错误恢复机制

:white_check_mark: 5. 强制刷新所有PCIe相关缓存

执行以下命令清除残留状态:

# 停止服务
systemctl stop pcie_device

# 清除DB和缓存
rm /opt/bmc/pram/persistence/per_reset.db
rm -rf /data/var/log/bmc/framework.log*
sync

# 重启
reboot

注意:确保新版本SR/BMC已正确打包 BDFConfig


:white_check_mark: 6. 验证SerDes Slot映射

  • 通过 mdbctl 检查 Connector 的 PortIdSlotID 是否与硬件匹配
  • 确认 BCM957508-P2100G 所在 Slot 对应的 SerDes Pipeline 是否为 高带宽、专用通道(非默认共享通道)

:hammer_and_wrench: 临时规避方案

若短期内无法修改配置,可手动修正 UI 显示(仅限展示):

  • 修改 Redfish 响应中 PCIeDevices@odata.idDeviceLocator 字段(不推荐长期使用

:receipt: 结论

根本原因 :white_check_mark: BDFConfig 配置错误或主键冲突,导致 fallback 到错误的 Bus=15,同时静态 pcie_card.json 可能也存在错误配置
触发条件 升级/重启BMC → 重新加载配置 → 加载失败 → 使用默认或错误值
修复核心 1. 修复 BDFConfig 主键冲突
2. 设置 IdentifyMode=2
3. 校正 DevBus=64 in pcie_card.json

:paperclip: 建议后续动作

  1. :white_check_mark: 收集完整 framework.logapp_debug_log_all,搜索 BDFConfig_cpu0primary key conflict
  2. :white_check_mark: 提取当前环境中 /opt/bmc/sr/*.srconfigs/pcie_card.json
  3. :white_check_mark: 比对 PR #42 中的 BCM957508-P2100G 测试报告配置项
  4. :white_check_mark: 向 QA 提交 bug report,请求 pcie_device/1.70.76 版本回归测试

如需,可协助审查具体配置文件。请提供:

  • pcie_card.json
  • BDFConfig_*.lua
  • Connector_PCIE_SLOTxmdbctl 输出

:white_check_mark: 最终目标:实现 重启/升级后自动正确识别 Bus=0x40,与 OS 层拓扑严格一致。

这个是新的一个一键收集

异常-KunLun2180V2_2102315KHN10R7100001_20260309-1900.tar.zip.001.txt (7 MB)
异常-KunLun2180V2_2102315KHN10R7100001_20260309-1900.tar.zip.002.txt (3.2 MB)

您好,请问这个现象是在什么状况下出现的?是升级BMC到最新版本就概率出现,在之前就不出现吗?如果是这样的话烦请提供一下之前的版本信息。

这个卡是配置了多个rootBDF吗?插卡在EXU、IEU还是Switch上?

你好,请教下,我的RootBDF配置如下所示:

图片

另外在日志有如下打印:

这里是不是哪没配置好呀,导致这个网卡在network_adapter中的识别存在问题

不好意思 忘记带版本了 这个是1230的版本 不是LTS的; 目前是这张卡总是高概率出现. 其他卡好像没有怎么出现过

这个卡是配置了多个rootBDF吗?—这个我不清楚, 怎么确定呢?
插卡在EXU、IEU还是Switch上?—应该是在EXU-BCU上

这边看到您在PSR中配置PortID = 12 的情况下Bus为15,这个rootBDF会被同步到对应PortID的PCIeAddrInfo上

BDFConfig_cpu0
{
“PortId”: 12,
“Bus”: 15,
“ControllerIndex”: 2,
“Device”: 0
},

1 个赞

你好 这个是我的一键收集里面传递的嘛? 我没有搜索到这个项诶


感谢
解压PSR.bin里面得到的
发现异常版本的PSR版本号比较低, 这个应该就是问题的原因