RAID扣卡适配求助

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

RAID扣卡适配问题分析与建议

根据您提供的问题背景和尝试过程,当前在适配RAID扣卡时遇到的核心矛盾是:Controller_1对象的加载依赖于PCIeDevice_1DeviceName必须以"PCIe Card"开头且槽位有效,但RAID扣卡因无BDF上报导致PCIe信息无法动态获取,从而无法完成PCIeDevice的初始化

以下将从架构原理、适配流程和解决方案三个方面进行系统性分析与建议。


一、问题根源分析

1. 当前加载依赖链路

根据知识库内容和代码逻辑,RAID卡组件的加载遵循如下顺序:

vpd → pcie_device(加载PCIeDevice)→ storage(加载Controller)
  • vpd模块:负责通过硬件拓扑识别PCIe设备的存在(基于BOM+ID+AUXID),并生成或激活对应SR文件。
  • pcie_device模块:基于BIOS上报的BDF信息,查询PCIe设备四元组(Vendor ID, Device ID, SubVendor ID, SubDevice ID),动态设置PCIeDevice对象属性(如SlotID, DevBus等)。
  • storage模块:在PCIeDevice对象完全建立后,通过RefChip引用初始化Controller对象,获取RAID控制器状态与配置。

:warning: 关键点:Controller对象的初始化强依赖PCIeDevice存在且DeviceName命名规范。如文档中所述:

if not prefix_equal(object.DeviceName, "PCIE Card") ...

PCIeDevice未创建或命名不规范,则Controller将无限等待,导致适配失败。


二、是否可以去掉PCIe相关配置?

:cross_mark: 结论:不推荐直接去除PCIe相关配置

虽然您希望仅配置RAID相关信息以简化流程,但从系统架构设计角度,PCIeDevice不是可选装饰,而是硬件自发现和管理的基础单元,原因如下:

原因 说明
:wrench: 硬件管理框架统一性 openUBMC所有扩展设备均通过PCIeDevice类统一建模。无论是RAID卡、网卡还是GPU,都需先作为PCIe设备被识别,才能进一步加载功能控制器。
:package: 拓扑关系绑定 PCIeDevice承载了设备物理位置(Slot、Socket)、链路状态(Speed、Width)、告警属性等关键信息,是硬件故障定位、热插拔检测、资源调度的依据。
:link: 数据关联桥梁 Controller_1.RefChip需通过PCIeDevice.SlotIDGroupPosition反向查找对应的芯片路径,若缺少此层映射,storage无法确定RAID芯片归属。

:white_check_mark: 因此,不能完全绕过PCIe配置。但可以通过模拟/预置PCIe信息的方式实现对无BDF上报RAID扣卡的支持。


三、可行解决方案建议

:white_check_mark: 方案一:静态预置PCIeDevice,跳过BDF依赖(推荐)

适用于:RAID扣卡固定安装、无BDF上报、BIOS不可控的场景。

实施步骤:

  1. 配置IdentifyMode = 1(固定ID模式)

    • 在Riser卡SR中配置Connector_PCIE_SLOTX时不依赖BIOS上报,而是手动指定IdAuxId
    • 示例:
      "Connector_PCIE_SLOT3": {
        "Bom": "14140130",
        "Slot": 3,
        "Position": 3,
        "Presence": 1,
        "Id": "100010e2",        // VendorID(16进制)+DeviceID
        "AuxId": "10004010",     // SubVendorID+SubDeviceID
        "IdentifyMode": 1,
        "Container": "Component_RiserCard",
        "Type": "PCIe"
      }
      
  2. 确保CSR文件名为 BOM_ID_AUXID.sr
    如:14140130_100010e2_10004010.sr,使vpd能正确加载该文件。

  3. 在SR中显式定义PCIeDevice并写死Slot

    "PCIeDevice_1": {
      "DeviceName": "PCIe Card 3 (9500-16i)",
      "FunctionClass": 1,
      "SlotID": 3,
      "DevBus": 0,
      "DevDevice": 3,
      "DevFunction": 0,
      "SocketID": 0,
      "GroupPosition": "PCIeDevice_3",
      "Container": "${Container}"
    }
    
  4. 配置PcieAddrInfo传递静态BDF信息
    即使BIOS不主动上报,也可由BMC主动模拟传递:

    "PcieAddrInfo_1": {
      "SocketId": 0,
      "Bus": 0,
      "Device": 3,
      "Function": 0,
      "SlotId": 3
    }
    
  5. 触发pcie_device加载逻辑

    • 可通过调试命令手动注入BDF:
      ipmitool raw 0x3a 0x6a <slot> <bus> <dev> <func>
      
      其中0x6aSet PCIe Card BDF命令(见KG中Set PCIe Card BDF实体描述)。

:white_check_mark: 方案二:修改Controller加载逻辑(需代码变更)

修改建议点:

  • 放宽before_add_object中对DeviceName的校验条件

    • 当前强制要求为PCIe Card X,可改为支持RAID Card X或允许空值回退。
    • 或增加判断:若为已知RAID扣卡类型,则跳过命名检查。
  • 引入“虚拟PCIeDevice”机制

    • 对于特定RAID扣卡,由storage模块直接创建一个轻量级PCIeDevice伪对象,仅包含必要字段(Slot、FunctionClass等),用于满足依赖关系。

:warning: 风险提示:这类修改属于侵入式变更,可能影响其他场景兼容性,建议在私有分支维护。


四、验证与调试建议

1. 日志检查项

  • framework.log:查看SR是否成功加载。
  • hwdiscovery.log:确认Connector_PCIE_SLOTX实例化成功。
  • storage.log:观察controller_object.lua是否进入add_controller_to_link_topo流程。
  • app.log:搜索[BizTopoLoader] Load PCIeCard打印。

2. DBus查询命令

# 查看PCIe设备是否加载
busctl --user tree bmc.kepler.hwdiscovery | grep PCIe

# 查询RAID控制器状态
busctl --user introspect bmc.kepler.storage /bmc/kepler/Systems/1/Storage/Controllers/

3. 关键配置文件验证

文件 检查项
vpd/sr/*.sr 文件名是否为 BOM_ID_AUXID.sr
PCIeDevice定义 FunctionClass=1, DeviceName包含槽位
PcieAddrInfo 包含正确的SlotId, Bus, Device, Function
Controller_1.TypeId 确保为系统已注册类型(如20),否则需在common_def.lua中注册回调库

五、总结与建议

项目 建议
是否可去PCIe配置 :cross_mark: 不可移除,PCIeDevice为必选项
推荐解决方案 :white_check_mark: 使用IdentifyMode=1静态预置PCIeDevice信息
是否需改代码 :warning: 尽量避免;若必须,建议优化before_add_object校验逻辑
适配重点 :white_check_mark: 确保vpd→pcie_device→storage链路完整

:light_bulb: 最终建议路径
使用静态ID + 手动定义PCIeDevice + 注入BDF的方式完成适配,既能保持架构一致性,又能解决无BDF上报问题。待后续支持MCTP/i2c带外通信后,再逐步过渡到标准流程。

相关链接:

  1. raid卡适配指导
  2. 9500HBA卡web无法获取信息
  3. raid卡适配出现问题
  4. RAID卡配置指南
  5. RAID卡常见问题指南 | 文档中心 | openUBMC