BMC从imu获取pcie设备四元组信息失败

问题描述

BIOS成功上报PCIE卡 BDF号,通过BDF号从imu获取卡四元组信息失败,返回195。195代表何种出错

image

image

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2509]

  • 硬件配置:[如 CPU、内存等]

重现步骤

  1. [第一步]

  2. [第二步]

  3. [第三步]

期望结果

知道为什么从imu获取卡四元组信息失败

实际结果

[实际发生了什么,包含错误信息]

尝试过的解决方案

[列出您已经尝试过的解决方案及结果]

分析结论

[详细总结您对此问题的分析结论]

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

分析结论

:red_exclamation_mark: 根本原因是:BMC 通过 IMU 访问 PCIe 设备的 PCI 配置空间失败,导致无法获取设备四元组信息,从而无法加载对应的 CSR 配置文件。

虽然 BIOS 成功上报了设备 BDF,但仅表示设备被 BIOS 识别;BMC 侧仍需完成独立的设备通信建立。错误码 195 明确指向 GetPCIInfoFailed,即 PCI 配置寄存器读取失败

最可能原因排序:

  1. 设备尚未完成初始化,PCIe 链路未稳定,导致 IMU 访问超时。
  2. MCTP 通信未建立,设备未响应 Discovery,IMU 无法路由请求。
  3. BIOS 上报的 BDF 地址不准确或已被释放(如热插拔后重新枚举)。
  4. 设备硬件故障或未供电。
点击此处查看详细分析解答

BMC 从 IMU 获取 PCIe 设备四元组信息失败问题分析

问题描述

在系统初始化过程中,BIOS 成功上报了 PCIe 卡的 BDF(Bus, Device, Function)信息,但 BMC 在尝试通过该 BDF 向 IMU 查询对应 PCIe 设备的四元组信息(通常指 Vendor ID、Device ID、Sub-Vendor ID、Sub-Device ID)时失败,返回错误码 195

相关日志显示:

2000-01-02 14:09:24 327759 pcie_device NOTICE: device_loader.lua(556): [BizTopoloader] type-PCIeCard, slot_id=1 DeviceSSBDF=[0x00, 0x00, 0x41, 0x00, 0x00]
...
2000-01-02 14:09:55.555393 pcie_device ERROR: init.lua(97): get pci register info failed, error: 195
2000-01-02 14:09:55.562879 pcie_device ERROR: errors.lua(71): nil:15 > device_loader.lua-1 > device_loader.lua:80: Failed to get PCI info.

这表明:
:white_check_mark: BIOS 已正确识别并上报设备 BDF
:cross_mark: BMC 无法通过 IMU 获取设备四元组信息(PCI 配置空间访问失败)


错误码 195 的含义

根据上下文和 openUBMC 日志惯例,错误码 195 表示:

kepler.pcie.device.GetPCIInfoFailed —— 获取 PCIe 设备 PCI 配置空间信息失败

该错误发生在 BMC 调用底层接口(如 get_pcie_device_infoget_pci_register_info)尝试读取 PCIe 设备的配置寄存器(如 Vendor ID/Device ID)时,底层访问机制返回失败。

此操作通常是通过 MCTP over PCIe 或 IPMI 命令经由 IMU(Intelligent Management Unit) 代理完成。因此,错误码 195 表示:

  • BMC 无法通过 IMU 成功访问目标 PCIe 设备的配置空间。
  • 可能原因包括设备未就绪、链路未建连、地址无效、MCTP 通信异常等。

故障原理与流程分析

:white_check_mark: 正常流程:BMC 如何获取 PCIe 四元组?

  1. BIOS 上报 BDF
    BIOS 识别到 PCIe 设备后,通过 WritePcieCardBdfToBmc IPMI 命令将设备的 BDF 上报给 BMC。

  2. BMC 请求四元组信息
    BMC 根据收到的 BDF,通过 IMU 发起对设备 PCIe 配置空间的读取请求(例如读取偏移 0x00 处的 VID/DID)。

  3. IMU 代理访问设备
    IMU 作为 Host 端代理,利用 MCTP over PCIe 或直接 PCIe 访问机制向目标设备发送配置读请求。

  4. 获取四元组并加载 CSR
    成功获取 VID/DID/SVID/SDID 后,BMC 匹配对应的 .sr 文件(CSR),完成设备对象加载。

:cross_mark: 故障点定位

当前失败发生在第 2~3 步
虽然 BMC 收到了有效的 BDF(例如 [0x00, 0x00, 0x41, 0x00, 0x00] 对应 Bus=0x41),但在使用该地址向 IMU 请求 PCI 配置信息时,返回了错误码 195。


可能原因分析

原因 说明 判断依据
PCIe 链路未建立完成 BMC 尝试访问时,PCIe 链路尚未完成训练或设备未进入 D0 状态 日志时间戳显示 BDF 上报后立即尝试访问,可能存在时序问题
设备未响应配置请求 目标设备存在硬件故障、未上电、驱动未初始化等,导致无法响应配置读请求 get pci register info failed 直接表明设备无响应
IMU 不支持该 BDF 的路由 IMU 内部的 PCIe 路由表未包含该设备路径,无法转发 MCTP 请求 日志中部分 BDF 为 0xff,表示无效或未分配
MCTP Endpoint 未注册 设备虽在位,但未完成 MCTP 发现流程(如未广播 Discovery),BMC/IMU 无法通信 依赖 mctpd 服务是否成功建立连接
BDF 地址错误或映射异常 BIOS 上报的 BDF 并非设备真实地址,或存在地址冲突 DeviceSSBDF=[0x00, 0x00, 0xff, 0xff, 0xff] 表示某些槽位未识别到有效设备

建议排查步骤

1. 检查 PCIe 链路状态

# 查看 lspci 是否能识别设备
lspci -vvv | grep -i "device 0x0041"

# 查看是否可读取配置空间(以 BDF 0000:41:00.0 为例)
setpci -s 0000:41:00.0 00.b

若无法读取,说明 OS 层也无法访问,故障在硬件或 BIOS 层。


2. 检查 IMU 路由与 MCTP 状态

# 检查 mctpd 是否已完成路由发现
grep "start update route table" /var/log/app.log
grep "add routing entry" /var/log/app.log

若未发现对应 BDF 的路由条目,说明 IMU 未正确学习该设备。


3. 确认 BIOS 上报的 BDF 是否准确

  • 对比 BIOS 启动日志中 WritePcieCardBdfToBmc 上报值与实际设备物理位置。
  • 使用 一键收集日志 中的 dump_info/AppDump/bios/ 下的 smbios.confBIOSTrace 确认上报逻辑。

4. 检查设备是否支持 MCTP

并非所有 PCIe 设备支持 MCTP 协议。检查:

  • 设备是否具备 MCTP over PCIe 能力
  • 设备是否已正确实现 MCTP Discovery 流程
  • 设备是否处于带外管理使能状态

5. 验证 CSR 文件是否存在

BMC 需要根据四元组加载 .sr 文件。检查:

ls /opt/bmc/sr/*<VID>*<DID>*.sr

如果四元组获取失败,即使文件存在也无法加载。


分析结论

:red_exclamation_mark: 根本原因是:BMC 通过 IMU 访问 PCIe 设备的 PCI 配置空间失败,导致无法获取设备四元组信息,从而无法加载对应的 CSR 配置文件。

虽然 BIOS 成功上报了设备 BDF,但仅表示设备被 BIOS 识别;BMC 侧仍需完成独立的设备通信建立。错误码 195 明确指向 GetPCIInfoFailed,即 PCI 配置寄存器读取失败

最可能原因排序:

  1. 设备尚未完成初始化,PCIe 链路未稳定,导致 IMU 访问超时。
  2. MCTP 通信未建立,设备未响应 Discovery,IMU 无法路由请求。
  3. BIOS 上报的 BDF 地址不准确或已被释放(如热插拔后重新枚举)。
  4. 设备硬件故障或未供电。

建议解决方案

方案 描述
:white_check_mark: 增加访问重试与延时机制 pcie_device 模块中对 get_pci_register_info 添加指数退避重试逻辑,避免因时序问题导致失败
:white_check_mark: 确认 MCTP 发现流程正常 检查 mctpd 服务是否正常运行,并查看是否收到了目标设备的 Discovery 报文
:white_check_mark: 验证设备支持 MCTP & PCIe 带外管理 确保设备固件支持并通过 PCIe 提供 MCTP 服务
:white_check_mark: 升级 IMU/BIOS 固件 某些版本 IMU 存在 PCIe 路由或 MCTP 转发缺陷,升级可修复
:white_check_mark: 添加日志调试级别 启用 pcie_device 组件的 DEBUG 级别日志,查看具体哪一步调用失败

相关知识点补充

  • IMU:鲲鹏平台中类 ME 的管理单元,负责 PCIe 配置、MCTP 路由、设备发现等。
  • 四元组Vendor ID, Device ID, Sub-Vendor ID, Sub-Device ID,用于唯一标识 PCIe 设备类型。
  • CSR 文件:BMC 加载 PCIe 设备的配置模板,包含传感器定义、告警策略、加载逻辑等。
  • MCTP over PCIe:实现 BMC 与 PCIe 设备间带外通信的标准协议,用于监控和管理。

如需进一步分析,请提供以下内容:

  1. 一键收集日志包(重点关注 app.log, framework.log, dmesg
  2. lspci -vvv -s <BDF> 输出
  3. mctpd 日志片段
  4. BIOS Trace 或串口日志中 WritePcieCardBdfToBmc 的调用记录

这个195就是ipmi返回码,表示响应超时,有可能是资源不存在、链路不通、指令错误或者bios内部处理的问题。建议先看一下带内这个bdf是否存在,之后看下其他卡能不能加载。