基于2603开发的openUBMC版本
板卡连接是:基础板上接一个switch板,switch板上有12个pcie插槽,其中槽位1会接sp681网卡。
不接SP681的情况下,switch板的I2C链路正常:
switch信息读值正常:
smc读写正常:
插上SP681网卡后,就频繁读写失败:
switch信息频繁获取不到:
smc报错:
接下来除了让硬件帮忙量信号,BMC这边还有什么深入定位的方法么?
答案内容由AI生成,仅供参考:
| 步骤 | 操作 | 参考来源 |
|---|---|---|
| 1 | 分析 dmesg、app.log,确认具体错误码(ret:5 等) | 文档块 8 |
| 2 | 核查 I2C 地址是否左移一位,SR 配置是否匹配 | 文档块 2 |
| 3 | 检查 Accessor/Chip 的 AddrWidth/OffsetWidth | 文档块 8 |
| 4 | 查看是否有多个服务并发访问该总线,尝试串行化并增加延迟 | 文档块 1 |
| 5 | 使用 hisportdetect 或 busctl 手动验证 I2C 通信 | 文档块 2、4 |
| 6 | 尝试降低 I2C 时钟或增加重试 | 经验方法 |
| 7 | 确认 SP681 网卡固件及 MCTP 兼容性 | 文档块 5、10 |
若以上方法仍无法定位,建议将完整日志与硬件原理图提交至 openUBMC 社区论坛(discuss.openubmc.cn),获取更专业的分析。
根据您描述的问题(基于 openUBMC 2603 版本,基础板 + switch 板,槽位 1 插入 SP681 网卡后 I2C 链路频繁报错),结合提供的上下文,BMC 侧可以尝试以下深入定位方法:
检查 dmesg、app.log、sensor.log,重点关注 I2C 访问失败时的返回码。
i2c write/read fail, ret: 5,表示 slave 未发送 ACK,通信失败(参考《V3硬件访问错误排查指南》)。BMC.Error.Unknow 或 Bmc_Error_Unknown,表明系统无法分类错误,需进一步结合上下文分析。查看 dmesg 中类似如下格式的日志:
I2C-08-RT<-5|-5> M<0x2e|0x0|0x0|3|10> ... E<0x1|0x0|0x0|0x1>
这表示从器件未响应(参考文档块 1 中的论坛回复),可用逻辑分析仪抓取波形验证,但 BMC 侧可先对比插卡前后的日志差异。
7 位地址左移:确认 switch 板上各器件(如 SMC、温度传感器、EEPROM)的 I2C 地址在 BMC 配置中是否为 7 位地址左移一位 后的值(参考文档块 2)。若未正确左移,BMC 发送的地址与实际器件不匹配,导致无 ACK。
SR 文件配置:检查 SR(System Resource)或管理拓扑(ManagementTopology)中 I2C 总线的定义是否与实际硬件连接一致。例如 I2c_8 总线连接了 SMC_ExpBoardSMC_0101、Eeprom_DemoEeprom_1 等器件,需确保 Bus、Address、Chip 映射正确(参考知识图谱中 I2c_8 的描述)。
Accessor/Chip 属性:确认访问该 switch 板所用的 Chip(如 SMC、PCA9555 等)的 AddrWidth 和 OffsetWidth 配置正确。若配置错误,BMC 写入总线的数据格式会异常,导致器件无法解析(参考《V3硬件访问错误排查指南》)。
多服务并发访问:插入 SP681 网卡后,可能新增了某些服务(如 devmon、网络适配器驱动)同时访问 switch 板所在的 I2C 总线,导致总线冲突。可在配置中 将硬盘日志收集、传感器扫描等任务改为串行触发,并增加每次 I2C 交互后的等待时间(例如从 3ms 改为 5ms,参考文档块 1 的解决方案)。
查看 hwproxy 插件队列:确认是否有插件请求阻塞 I2C 总线。文档块 1 中曾提到“硬盘日志收集有多个硬盘由多个硬盘任务并行触发改为串行触发,减轻插件队列阻塞”。
增加重试机制:在读取 switch 板信息或 SMC 时,增加 3~5 次重试,每次间隔适当延时(如 50ms)。文档块 5 中 SP681 网卡 SN 跳变问题曾尝试加 5 次重试,虽仍读出错误数据,但可结合其他方法使用。
降低 I2C 时钟频率:若怀疑插入网卡后总线电容增加或信号质量下降,可尝试在驱动中降低 I2C 时钟频率(如从 400kHz 降为 100kHz),验证是否改善。
禁用无关的 MCTP 协议访问:参考文档块 10,QLE 网卡需打开 MCTP 使能,但若 SP681 网卡未正确支持 MCTP,其 MCTP 通信阻塞也可能影响同一 I2C 总线。可临时关闭不必要的 MCTP 会话,观察问题是否消失。
使用 hisportdetect 工具:扫描 I2C 总线,确认是否所有预期器件都能被正确枚举。若扫描不到,则可能是地址配置或硬件链路问题。
通过 busctl 直接访问相关 DBus 对象:例如 bmc.kepler.general_hardware 下的接口,手动发送 I2C 读写命令,观察返回结果与错误信息。
模拟测试:在 QEMU 仿真环境中搭建相同的硬件拓扑(基础板+switch板+SP681虚拟设备),复现问题并进行软件调试(参考《openUBMC Qemu特性设计说明书》)。
文档块 5 明确记录了 SP681 网卡在 BMC Reset 长稳测试中 SN 跳变,且加 5 次重试仍读出错误数据。这表明该网卡可能存在 固件缺陷或硬件链路设计问题,尤其在多卡插满时更易复现。建议:
虽然用户已提及“让硬件帮忙量信号”,但 BMC 侧可主动提供以下协助:
| 步骤 | 操作 | 参考来源 |
|---|---|---|
| 1 | 分析 dmesg、app.log,确认具体错误码(ret:5 等) | 文档块 8 |
| 2 | 核查 I2C 地址是否左移一位,SR 配置是否匹配 | 文档块 2 |
| 3 | 检查 Accessor/Chip 的 AddrWidth/OffsetWidth | 文档块 8 |
| 4 | 查看是否有多个服务并发访问该总线,尝试串行化并增加延迟 | 文档块 1 |
| 5 | 使用 hisportdetect 或 busctl 手动验证 I2C 通信 | 文档块 2、4 |
| 6 | 尝试降低 I2C 时钟或增加重试 | 经验方法 |
| 7 | 确认 SP681 网卡固件及 MCTP 兼容性 | 文档块 5、10 |
若以上方法仍无法定位,建议将完整日志与硬件原理图提交至 openUBMC 社区论坛(discuss.openubmc.cn),获取更专业的分析。
completion code 4表明SMC在处理i2c请求时发生内部错误
SMC协议实现的I2c扩展 ,所有的i2c访问实际上都是BMC把i2c请求封装成SMC协议报文发给SMC,再由SMC去做处理
当前的情况是i2c请求传递给SMC后,SMC返回这个请求处理时发生内部错误(具体那种类型的错误,需要SMC的同事分析下),但是基于当前的场景,推测时链路异常之类的问题,导致请求发送失败。
具体的可以求助SMC的同事提供更明确的错误类型,或者更直接点测量下链路信号
你试下走vpd版本,大概率不报错,推测是设备树版本的这张卡少了什么东西导致的
2509版本也有这样的问题 当时应该走的是VPD
与框架同事确认,这个问题当前没有软件侧更好的排查方法了。建议参考楼上的解决方法,从SMC或硬件链路入手排查
也是在component_drivers里 component_drivers实现了bmc.dev.chip/bus的read接口。
南向驱动从底层的总线操作到上层的设备管理都实现。
在component_drivers中发现两个问题:
1.std_smbus.cpp中m_buffer_len的长度默认为64,如果csr中不配置的话,这会导致SMC固定从网卡回读64个Byte,如果实际网卡的返回体没有64Byte,就会导致时钟延展;
2.在drivers/internal/chip/chip_smc/smc.cpp中的forward_by_front_chip中,在 if (!is_smc) {}分支里,forward_write的入参buffer_offset来自于csr中配置的OffsetWidth,对SP681网卡来说就是0,这会导致smc收不到BMC想发给网卡的请求体。
你好,component_drivers的两个问题是否解决
目前完成问题确认 已反馈需求,社区应该在Q3解决问题
好的
@liujie_11 问下社区的Issue和MR链接有吗?
之前以为沟通确认问题之后以为华为内部会提。
这次的RM sig来不及了,下次rm sig之前我们提一下。
问题关闭跟踪