前置OCP网卡MCX623436AN-CDAB热插拔失败,一直处于卸载中

项目使用前置OCP网卡MCX623436AN-CDAB,最近更换了前面板的OCP riser,改变了UBC线缆接法后,热插拔操作一直处于卸载中的状态,无法卸载成功,截图如下:


查看了NetworkAdapter组件,目前会调用PCIe_Slot对象的PowerControl方法将电源状态设置成Off

然后一直监控PCIeSlot对象的PowerState属性,如果变为Off就说明下电成功
busctl --user introspect bmc.kepler.pcie_device /bmc/kepler/Systems/1/PCIeSlots/PCIeSlot_OCP_1_0101030B

但是当前情况下PowerState一直处于On的状态,所以一直处于卸载中,请问下PowerState是那一块程序会修改值,我在开源代码里没有找到,实际下电操作是不是闭源组件做的?是不是需要适配当前机器拓扑

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

总结与建议

项目 内容
根本原因 新更换的OCP Riser板未正确传递电源状态反馈信号至BMC,导致PowerState无法更新为Off,阻塞热插拔流程。
是否闭源组件控制 是。PowerControl的实际执行和PowerState更新由底层驱动或闭源HAL模块控制。
是否需适配拓扑 是。必须根据当前硬件连接关系更新CSR中的信号映射和表达式逻辑。
推荐操作顺序 ① 检查UBC线缆物理连接 → ② 验证CSR配置 → ③ 添加调试日志 → ④ 更新匹配逻辑

:wrench: 下一步建议:联合硬件工程师测量UBC线缆关键信号,确认反馈通路是否完整,并与原设计对比信号定义一致性。

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

OCP网卡MCX623436AN-CDAB热插拔失败问题分析与解决方案

问题描述

项目中使用的前置OCP网卡MCX623436AN-CDAB在更换前面板OCP Riser并调整UBC线缆接法后,执行热插拔操作时出现“资源卸载中”状态无法完成的问题。系统日志显示已成功下发热插拔命令,但PCIe槽位的PowerState属性始终为On,导致无法完成下电和卸载流程。


故障现象总结

  1. 前端表现:

    • 执行热插拔后,BMC Web界面显示“资源卸载中”。
    • 无法成功卸载MCX623436AN-CDAB网卡。
  2. 后台行为:

    • network_adapter组件已调用PCIeSlot:PowerControl("Off")方法。
    • 槽位PowerState属性持续为On,未变为Off,监控逻辑无法继续。
    • 实际电源未切断。
  3. 关键线索:

    • 更换了OCP Riser板并修改了UBC线缆接法。
    • PCIeSlot_OCP_1对象的PowerState属性值一直不更新。

技术原理与系统架构分析

1. OCP卡热插拔控制机制

根据知识库中的设计(参考CSR方案评审文档):

  • 热插拔依赖扩展板或Riser卡:OCP卡本身不具备独立的热插拔控制能力,必须通过Riser卡或扩展板提供通知式热插拔功能。
  • 电源控制流程:
    • BMC Web发起热插拔 → network_adapter模块响应 → 调用PCIeSlot:PowerControl("Off")
    • PowerControl实际通过硬件接口控制Riser卡上的电源开关
    • Riser卡将物理下电状态反馈给BMC → 更新PowerState为Off

2. PowerState 更新机制

PowerState的更新并非由调用者主动设置,而是由底层硬件驱动或闭源组件监听物理状态后反向同步:

  • 签名路径依赖:PowerState字段通过表达式绑定底层传感器状态,例如:

    "PowerState": "expr(($1 == 1 && $2 == 1) ? 'Off' : 'On')"
    

    其中$1, $2可能来自Riser板上的电源使能信号或Power Good信号。

  • 实际控制路径:

    • PowerControl("Off") → 向Riser卡发送断电信号(如GPIO拉高/低)
    • Riser卡切断+12V/Vcc电源 → 电源模块返回Power Good信号为0
    • BMC Scanner扫描到信号变化 → 更新PowerState

问题根因分析

:white_check_mark: 核心结论:

PowerState无法更新的根本原因是:当前Riser板与BMC之间的电源状态反馈链路未正确连接或信号定义不匹配,导致BMC无法感知实际电源状态的变化。

详细分析依据:

1. Riser板更换导致信号链路中断

  • 原始Riser板与当前新板可能存在以下差异:
    • UBC线缆中用于传递“Aux Power State”或“Card Power Good”的引脚未连接。
    • GPIO信号极性定义不同(如原为高电平有效,新版为低电平有效但未适配)。
  • 知识图谱中明确指出:
    {"entity1": "PCIeSlot_OCP_1", "entity2": "Scanner_aux_power_state", "description": "PCIeSlot_OCP_1 evaluates power state based on Scanner_aux_power_state.Value."}
    

2. PowerControl 实际由闭源组件执行

  • PowerControl方法是一个封装接口,其具体实现依赖于硬件抽象层(HAL),通常为闭源固件模块。
  • 开源代码中只能看到调用入口,无法查看底层操作细节。
  • 知识库证实该操作依赖物理单板配置:
    {"entity1": "Expansion Board", "entity2": "OCP Card", "description": "The OCP Card relies on the expansion board to provide notification-based hot-plug functionality."}
    

3. 槽位识别与Component Type匹配问题

  • network_adapter模块需要通过is_matched_slot()函数判断哪个PCIe Slot对应此OCP卡。
  • 若Riser变更导致SlotId或SupportedComponentTypes不符合预期,可能导致匹配失败,进而跳过真实下电操作。
  • 相关日志已提示:
    log:notice("%s can not find matched pcie slot", self.DeviceLocator)
    

解决方案建议

:white_check_mark: 方案一:检查Riser板UBC线缆连接(推荐优先执行)

项目 检查内容
UBC线缆引脚定义 确认是否包含AUX_PWR_OK, CARD_PWR_GOOD, PRSNT#等信号
电源反馈路径 检查Riser板是否将电源Good信号连接至BMC的Scanner输入引脚
信号电平匹配 确认BMC端Scanner配置的高低电平阈值与Riser输出一致

:hammer_and_wrench: 工具建议:使用万用表测量UBC连接器对应针脚在热插拔过程中的电压变化。


:white_check_mark: 方案二:验证并更新BMC侧CSR配置

若硬件连接无误,则可能是CSR配置未适配当前拓扑:

  1. 检查PCIeSlot_OCP_1配置中PowerState的计算逻辑:

    "PowerState": "Scanner_aux_power_state.Value |> expr($1 == 0 ? 'Off' : 'On')"
    

    需根据实际信号极性调整表达式。

  2. 确认SupportedComponentTypes是否包含83(OCP卡类型):

    "SupportedComponentTypes": [1, 83]
    
  3. 检查RefMgmtConnector是否指向正确的Riser连接器:

    "RefMgmtConnector": "#/Connector_OCP_Riser_1"
    

:white_check_mark: 方案三:更新network_adapter模块的匹配逻辑

根据文档片段:

function c_network_adapter:is_matched_slot(pcie_slot)
    ...
    if pcie_slot.SlotId ~= self.SlotNumber then
        return false
    end
    ...
end

建议添加调试日志,确认self.SlotNumber与目标PCIeSlot的SlotId是否一致。


:white_check_mark: 方案四:引入独立在位状态检测(长期方案)

参考已评审方案《【暂不评审】OCP热插拔功能,新增私有对象表示在位信号》:

  • 在CSR中新增OCP1Presence对象,直接读取Riser板的在位信号:
    "OCP1Presence": {
      "Id": 1,
      "Value": " expr(($1 == 1 && $2 == 1) ? 1 : 0)"
    }
    
  • pcie_device组件监听该信号变化,决定是否卸载设备。

总结与建议

项目 内容
根本原因 新更换的OCP Riser板未正确传递电源状态反馈信号至BMC,导致PowerState无法更新为Off,阻塞热插拔流程。
是否闭源组件控制 是。PowerControl的实际执行和PowerState更新由底层驱动或闭源HAL模块控制。
是否需适配拓扑 是。必须根据当前硬件连接关系更新CSR中的信号映射和表达式逻辑。
推荐操作顺序 ① 检查UBC线缆物理连接 → ② 验证CSR配置 → ③ 添加调试日志 → ④ 更新匹配逻辑

:wrench: 下一步建议:联合硬件工程师测量UBC线缆关键信号,确认反馈通路是否完整,并与原设计对比信号定义一致性。

PCIe_Slot对象的PowerControl方法实现在pcie_device组件中

我在社区代码里没有找到哪个csr里有配置PCIe_Slot对象,请问你们是为了实现热拔插自己配的么?

不是 PCIeSlot对象默认就有,我也没找到在哪里配置的,关于你说的PowerControl方法我也在pcie_device组件中看到了,但是这个方法只是设置了ReadyToRemove属性为1,后续哪个组件会监控这个属性变化,进行实际的下电操作在开源代码里看不到

我理解这是通过Accessor实现的,即改了ReadyToRemove和PowerOnSwitch属性后,通过Accessor去通知硬件下电,所以我才想找个PCIeSlot对象的配置看一下:

我找了一下也没有找到,会不会是闭源部分里面定义的

CSR里面有配置Accessor去引用这个ReadyToRemove吗?

CSR里有两个属性一个ReadyToRemove和一个ReadyToRemoveValue,两个有什么区别?

ReadyToRemove指是否准备好热插拔,ReadyToRemoveValue是关联寄存器的可以修改寄存器的值

请问这个问题有结论吗?碰到了类似的问题

后来结论是硬件CPLD问题,返回的状态值有问题

好的,谢谢