Riser卡适配一些问题

我们硬件参照00000001040302046574这张Riser卡设计新Riser卡,基本配置信息也差不多。BMC在适配时就根据这种这种Riser的CSR修改的,同时配置了PSR中的线缆检测。

        "UnitConfiguration_IEU2": {
            "SlotType": "IEU",
            "SlotNumber": 2,
            "SlotSilkText": "IEUSlot2",
            "ContainerSlot": 2,
            "Configurations": [
                {
                    "UID": "XXXXXX",
                    "Index": 2,
                    "SrcPortName": ["D4b"],
                    "TargetPortID": [17],
                    "Slot": [21],
                    "Device": []
                }
            ],
            "Port1LinkInfo": ""
        }

现在有问题,设备上电后RAID卡也能正常识别,在Web页面也能“系统信息”->“其他”->"PCIe卡"中也能显示RAID卡相关消息,但是RAID的位置信息显示为空,如果调整PSR中线缆检测,位置信息会显示为另外一张Riser卡上。这个问题需要如何定位?

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

:white_check_mark: 三、总结:高效定位与修复路径

步骤 检查项 工具/命令
1 Riser 卡是否返回唯一 Index journalctl -f | grep BizTopoMonitor
2 PSR 白名单是否按 UID + Index 区分? BMC Studio 查看 PSR.sr
3 UnitConfiguration_IEU2 是否配置正确? 检查 SrcPortName, TargetPortID, Slot
4 Connector_PCIE_SLOTx 是否绑定到 PcieAddrInfo_x busctl tree, D-Bus 调试
5 pcie_device 是否报拓扑匹配失败? journalctl -u pcie_device
6 Web 上“PCIe卡”对象是否缺少 Position 属性? Redfish API /PCIeDevices
点击此处查看详细分析解答

关于 Riser 卡适配中 RAID 卡位置信息显示异常的问题定位分析

根据您描述的场景:

  • 新设计的 Riser 卡基于已知型号 00000001040302046574 进行开发,硬件设计与 CSR 配置类似;
  • BMC 已完成 CSR 和 PSR 中的线缆检测白名单配置
  • 系统可正常识别 RAID 卡,Web 页面可显示 PCIe 设备信息,但 RAID 卡的“位置信息”显示为空或错误指向其他 Riser 卡

此问题本质属于 Riser 卡拓扑识别与位置映射错误,涉及 PSR 配置不完整、UID/Index 匹配冲突、Connector 与 PCIe 设备未正确关联等多方面因素。


:magnifying_glass_tilted_left: 一、问题核心定位方向

:white_check_mark: 1. 位置信息为空的原因分析

RAID 卡虽被识别,但其所在 PCIe Slot 的物理位置(Position)无法正确获取,通常由以下原因导致:

可能原因 详细说明
PSR 白名单中未正确配置 Index 区分 多个 Riser 卡使用相同 UID 时,若未通过 Index 区分不同槽位,则系统无法判断该 Riser 卡具体插在哪个 Slot。导致匹配失败或错乱。
Connector 到 PCIeDevice 映射关系断裂 比如 Connector_PCIE_SLOTx 没有正确绑定到 PcieAddrInfo_x 或对应 PCIeCard 对象,导致即使设备存在,也无法获取 SlotIDPosition
UnitConfiguration 配置冲突或重复 多个 UnitConfiguration_IEU(如 IEU1 和 IEU2)使用了相同的 SrcPortNameTargetPortID,导致系统无法唯一匹配。
BMC 拓扑发现流程未完成 biz_topo.lua 报错显示 match unit config with topo fail,表示业务拓扑匹配失败,直接影响 Slot 和 Device 的归属关系建立。

:red_circle: 关键线索:您提到“调整 PSR 线缆检测后,位置信息会显示为另一张 Riser 卡”,这强烈提示 UID/Index 缺乏唯一性,造成配置错位匹配


:wrench: 二、关键定位步骤与解决方案

:white_check_mark: 步骤 1:检查 PSR 白名单是否 通过 Index 区分槽位

当多个 Riser 卡具有 相同 UID(如您的情况)时,必须依赖 Index 字段进行槽位区分。

:cross_mark: 当前风险点:

  • 如果所有 Riser 卡返回的 Index = 1,即使插在不同 Slot,BMC 视为“同一张卡”的多次插入。
  • 导致 PSR 白名单中只能匹配一条记录,进而造成 Slot 信息丢失或错位

:white_check_mark: 解决方案:

确保 不同 Slot 的 Riser 卡返回不同的 Index 值(如 Slot 1 → Index=1,Slot 2 → Index=2)。

:pushpin: 参考实践:社区技术支持指出,应在 PSR 白名单中配置 index 值来区分同一 UID 的 Riser 卡:

{
  "uid": "XXXXXX",
  "index": 1,
  "port_id": 17,
  "name": "A3a"
}

并确保 Riser 卡返回的 EEPROM 数据中 index 字段随 Slot 改变。

:backhand_index_pointing_right: 务必验证:[BizTopoMonitor] 日志中的 unit=[uid=..., index=1, ...] 是否在多个 Slot 下均为 index=1

若是,则必须修改硬件或 CPLD 固件逻辑,使不同槽位报告不同的 index


:white_check_mark: 步骤 2:确认 UnitConfiguration_IEU2 配置正确性

您当前配置如下:

"UnitConfiguration_IEU2": {
    "SlotType": "IEU",
    "SlotNumber": 2,
    "SlotSilkText": "IEUSlot2",
    "ContainerSlot": 2,
    "Configurations": [
        {
            "UID": "XXXXXX",
            "Index": 2,
            "SrcPortName": ["D4b"],
            "TargetPortID": [17],
            "Slot": [21],
            "Device": []
        }
    ]
}

:warning: 存在潜在问题:

  • SrcPortNameTargetPortID 是否与其他 UnitConfiguration 冲突?
    • UnitConfiguration_IEU1 是否也配置了 TargetPortID: 17?会导致多路信号冲突。
  • Index 在配置中是否用于匹配?
    • 必须确保 PSR.sr 白名单中也配置对应 index=2 的条目,否则 index=2 不生效。
  • Slot: [21] 的含义是否明确?
    • 应确认该值是否为最终要显示的逻辑 Slot 编号,是否与 Web 页面展示逻辑一致。

:white_check_mark: 建议动作:

  1. 使用 BMC Studio 打开 PSR.sr 文件,检查是否配置了如下白名单项:
    {
      "uid": "XXXXXX",
      "index": 2,
      "name": "D4b",
      "port_id": 17
    }
    
  2. 检查是否存在 两条相同 UID + 不同 Index 的配置,且 index 被代码用于区分。

:white_check_mark: 步骤 3:检查 Connector 到 PCIeCard 的绑定关系

位置信息来源于:

Connector_PCIE_SLOTx → PcieAddrInfo_x → PCIeCard_x → SlotID/Position

如果中间任一环节未链接,则 位置信息为空

:round_pushpin: 已知案例:

文档中明确提到:

“Connector_PCIe_4 未正确链接到 PcieAddrInfo_4 对象,导致 slot 信息显示为 ‘0’。”

:white_check_mark: 定位方法:

  1. 登录 BMC Shell,执行:

    dbus-send --print-reply --dest=xyz.openbmc_project.ObjectMapper /xyz/openbmc_project/object_mapper xyz.openbmc_project.ObjectMapper.GetSubTree string:/xyz/openbmc_project/inventory item:int32:0 array:string:"xyz.openbmc_project.Inventory.Item.PCIeCard"
    

    查看是否存在 PCIeCard 对象及其属性。

  2. 检查:

    busctl tree xyz.openbmc_project.Inventory.Manager
    

    Connector_PCIE_SLOT1, PcieAddrInfo_1, PCIeCard_1 是否存在且关联。

  3. 使用 BMC Studio 的模拟环境或 QEMU 重现,观察对象生成过程。


:white_check_mark: 步骤 4:检查日志中是否有 拓扑匹配失败报错

您应重点排查以下日志:

journalctl -u pcie_device | grep -i "match.*fail"

典型错误:

match unit config with topo fail, ret: ./opt/bmc/apps/pcie_device/lualib/biz_topo/biz_topo.lua:441

这表示:

  • pcie_device 服务尝试根据 UnitConfiguration 匹配实际连接的 Riser 卡失败;
  • 失败原因可能是 UID/Index/PortName 不匹配。

:white_check_mark: 解决方案:

  • 确保 biz_topo.lua 中启用了 index 作为匹配维度;
  • 确保 Riser 卡返回的 实际 UID + Index + PortName 与 PSR 白名单和 UnitConfiguration 完全一致。

:white_check_mark: 步骤 5:确认 RAID 卡所属 Slot 的 ParentCardSlotId 设置

RAID 卡属于某一个 Slot 的子设备,其位置由:

ParentCardSlotId ← 来自上级 PCIe 设备的 SlotID

例如:

"ParentCardSlotId": "/PCIeDevice_1.SlotID"

:white_check_mark: 验证方式:

  1. 通过 Redfish API:

    GET /redfish/v1/Systems/system/PCIeDevices/NVMeRaid
    

    查看字段 ParentPCIeDeviceLinks

  2. D-Bus 查询:

    busctl get-property xyz.openbmc_project.Inventory.Manager /xyz/openbmc_project/inventory/system/chassis/motherboard/PCIeSlot_Riser1 xyz.openbmc_project.Inventory.Item.PCIeSlot LocationCode
    

:white_check_mark: 三、总结:高效定位与修复路径

步骤 检查项 工具/命令
1 Riser 卡是否返回唯一 Index journalctl -f | grep BizTopoMonitor
2 PSR 白名单是否按 UID + Index 区分? BMC Studio 查看 PSR.sr
3 UnitConfiguration_IEU2 是否配置正确? 检查 SrcPortName, TargetPortID, Slot
4 Connector_PCIE_SLOTx 是否绑定到 PcieAddrInfo_x busctl tree, D-Bus 调试
5 pcie_device 是否报拓扑匹配失败? journalctl -u pcie_device
6 Web 上“PCIe卡”对象是否缺少 Position 属性? Redfish API /PCIeDevices

:white_check_mark: 四、推荐解决措施

  1. 修改硬件/CPLD:使每个槽位的 Riser 卡返回唯一的 Index(Slot1 → Index=1, Slot2 → Index=2);
  2. 在 PSR 白名单中为每个 Index 配置独立条目
  3. 确保 UnitConfiguration_IEU1IEU2 使用不同 TargetPortIDSrcPortName,避免冲突;
  4. 重启 pcie_device 服务 或重新上电,验证修复效果;
  5. 使用 BMC Studio 模拟环境 验证配置有效性,避免反复烧录。

:pushpin: 结语

“RAID 位置为空”根本原因是 Riser 卡身份无法唯一确定,导致 BMC 无法将其映射到正确的 Slot 上。

核心解决方案是:
:white_check_mark: 实现 UID + Index 的双重唯一标识机制,并保证 PSR、UnitConfiguration、Connector、PCIeCard 整个链路配置统一、无冲突。

如能提供 biz_topo.lua 的匹配逻辑或 BMC Studio 中的 PSR 配置截图,可进一步精准分析。

这种情况需要结合连接器信息定位一下,Riser卡中的${Slot}信息是从上级连接器下来的(注意不是SlotID,可以看一下实机环境上的ContainerSlot,确定按照低速线匹配的Riser线缆信息正确。

拓扑建立会按照PcieAddrInfo中获取到的ContainerUnitType和ContainerSlot匹配上对应的UnitConfiguration,再结合线缆信息找出最接近的配置。

这个是PcieAddrInfo配置,在实际设备上查看了一下ContainerSlot值是配置中写的值和配置的一样,都是2。

    "PcieAddrInfo_1": {
      "Location": "RiserCard${Slot}",
      "ComponentType": 8,
      "ContainerSlot": "${Slot}",
      "ContainerUID": "XXXXXX",
      "ContainerUnitType": "IEU",
      "GroupPosition": "PcieAddrInfo_1_${GroupPosition}"
    },

这个是在设备上查看的PcieAddrInfo信息

 lsprop PcieAddrInfo_1_01010111
bmc.kepler.Object.Properties
  ClassName="PcieAddrInfo"
  ObjectIdentifier=[1,"1","1","01010111"]
  ObjectName="PcieAddrInfo_1_01010111"
  TraceSamplingRate=0
bmc.kepler.Systems.PcieAddrInfo
  Bus=213
  ComponentType=8
  ControllerIndex=5
  ControllerType=0
  Device=4
  DeviceID=0
  Function=0
  GroupID=0
  Lanes=8
  PCIeType="Gen3"
  PortID=36
  ReadyToEnumerate=true
  Segment=0
  SlotID=21
  SlotType=""
  SocketID=1
  VendorID=0
Private
  ContainerSlot=2
  ContainerUID="XXXXXX"
  ContainerUnitType="IEU"
  DevBus=0
  DevDevice=0
  DevFunction=0
  GroupPosition="PcieAddrInfo_1_01010111"
  Location="RiserCard2"
  MultihostPresence=0

这个是UnitConfigration是设备中信息

% lsprop UnitConfiguration_IEU2_01010A
bmc.kepler.Object.Properties
  ClassName="UnitConfiguration"
  ObjectIdentifier=[1,"1","1","01010A"]
  ObjectName="UnitConfiguration_IEU2_01010A"
  TraceSamplingRate=0
bmc.kepler.Systems.UnitConfigError
  AbsenceAllowed=0
  Port1LinkInfo="XXXXXX(IEUSlot2)"
  Port1Status=1
  Port2LinkInfo=""
  Port2Status=255
Private
  Configurations=[{"SrcPortName":["D4b"],"UID":"XXXXXX","Slot":[21],"Index":2,"Device":[],"TargetPortID":[33]}]
  ContainerSlot=2
  ContainerUID=""
  SlotNumber=2
  SlotSilkText="IEUSlot2"
  SlotType="IEU"

您好,这边方便发一下问题的一键收集吗?

可以的,邮件已经发送给你了。

这边看到您有一张UID以58结尾的RiserCard,里面的连接器引用了Component_RiserCard,但是没有配置Component_RiserCard对象,这样会导致下级的PcieDevice对象拿不到Container对象,从而使得根据这个对象匹配不到Position。

代码在pcie_device组件中,可以搜索 local container_obj_name = self:get_prop(‘Container’) 这个语句。

感谢,对比了一下正常的Riser卡配置,确实缺少了Component_RiserCard对象。向请问一下如今这种问题具体如何定位,在app.log上没找到对应的配置错误信息。