南向驱动部件支持SMC场景

于社区2603 basecode发现的问题

正常的smc透传命令帧:

当前南向驱动发送的smc透传命令帧:


BMC只发送了smc数据头,没有带上smbus请求体负载。
且smc数据头的读取长度字节固定为0x40,如果smbus从设备的返回体没有64Byte,就会导致时钟延展。

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想发给网卡的请求体。

答案内容由AI生成,仅供参考:
根据社区讨论记录,该问题定位在 component_drivers 组件中,具体现象、原因与解决进展如下。

问题现象

  • 当前南向驱动发送的 SMC 透传命令帧只包含了 SMC 数据头,没有携带 SMBus 请求体负载。
  • SMC 数据头的读取长度字节固定为 0x40(即 64)。如果 SMBus 从设备实际返回体不足 64 字节,会引发**时钟延展(clock stretching)**问题。

问题原因

社区成员 liujie_11 在 component_drivers 代码中定位到以下两个具体问题:

  1. std_smbus.cpp 中 m_buffer_len 默认值为 64

    • 如果 csr 中不配置该值,SMC 会固定从网卡回读 64 个 Byte。
    • 当实际网卡的返回体不足 64 Byte 时,就会导致时钟延展。
  2. drivers/internal/chip/chip_smc/smc.cpp 的 forward_by_front_chip 中 buffer_offset 取值问题

    • 在 if (!is_smc) {} 分支里,forward_write 的入参 buffer_offset 来自 csr 中配置的 OffsetWidth。
    • 对 SP681 网卡来说该值为 0,这会导致 SMC 收不到 BMC 想发给网卡的请求体。

解决进展

  • liujie_11 表示:“目前完成问题确认,已反馈需求,社区应该在 Q3 解决问题。”
  • 后续讨论中也提到,该需求会考虑在下次 RM SIG 之前提交。

基于最新版本重新进行验证,看看问题是否已解决