[求助] 米尔开发板NCSI over MCTP over SMBus问题

问题描述

目前尝试适配一个网卡设备,参考南向适配网迅网卡经验分享,在component_driver组件添加了网卡的sr文件,配置了Endpoint对象,但是对于部分配置项还有些疑惑:

1、component_driver文档中提到的NCSI over MCTP over SMBus配置中的 TargetPhyAddr 具体是指什么?与smbus芯片的 i2c 地址有关联吗?

2、在不清楚上述 TargetPhyAddr 具体内容的情况下,构建出包烧录固件在devmon树上看到了添加的网络设备,而endpoint如预期创建失败了,在mctp树上找不到。我在mctp::create_transport_and_endpoint函数中只看到了获取endpoint的流程,后续想追踪endpoint的创建情况该如何进行?请大家帮忙指点下 :folded_hands:

环境信息

  • 操作系统:OpenUBMC RTOS

  • 软件版本:OpenUBMC2512

  • 硬件配置:Hi3093

答案内容由AI生成,仅供参考:
:white_check_mark: 总结与建议

问题一答案:

TargetPhyAddr 是 MCTP 协议层的目标物理地址,不等于 I2C 地址,但两者协同工作:I2C 地址用于访问代理芯片(Chip_SmbusChip),而 TargetPhyAddr 是该代理背后设备的 MCTP 地址。

问题二答案:

可通过 tracemctp, getprop 调试节点、系统日志和 mctpd 状态来追踪 Endpoint 创建失败原因。建议结合 i2cdetect 验证 I2C 层连通性。

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

关于米尔开发板 NCSI over MCTP over SMBus 配置问题的详细解答

1. TargetPhyAddr 的含义及其与 I2C 地址的关系

TargetPhyAddr 的定义

在 MCTP(Management Component Transport Protocol)协议栈中,TargetPhyAddr 是一个关键配置项,表示 目标设备在物理通信层上的地址。根据知识库中的信息:

  • TargetPhyAddrEndpoint 实体的一个核心属性,用于标识目标设备的物理地址。
  • MCTP over SMBus 的通信模型中,该地址对应于通过 SMBus 连接的目标设备在 I2C 总线上的通信地址。

:white_check_mark: 结论TargetPhyAddr 在 MCTP over SMBus 场景下,通常就是目标设备的 I2C 从设备地址(7 位或 8 位)

与 I2C 地址的关联性

结合您提供的 SR 配置片段和上下文分析:

"Chip_SmbusChip": {
    "Address": 146  // 即 0x92
},
"Endpoint_1": {
    "TargetPhyAddr": 73,  // 即 0x49
}

这里有明显的数值差异(146 ≠ 73),这说明:

项目 说明
Chip_SmbusChip.Address 是用于操作系统直接访问该芯片时使用的 I2C 设备地址(0x92)
Endpoint_1.TargetPhyAddr 是 MCTP 协议层在传输时使用的“目标物理地址”

:warning: 重要区别:

  • RefChip: "#/Chip_SmbusChip" 表明 MCTP 通信要经过 Chip_SmbusChip 这个中介设备(即“SMBus 代理”或“MCTP endpoint chip”)。
  • TargetPhyAddr 不是这个中介本身的地址,而是它背后所代表的 最终目标设备(如网卡控制器) 的逻辑地址。

:white_check_mark: 正确理解模型(以您的场景为例):

BMC
 └─MCTP Endpoint_1 (TargetPhyAddr=73) 
     └─通过 MCTP over SMBus 协议
         └─由 Chip_SmbusChip (I2C地址=0x92) 作为通道代理
             └─实际操作目标为某个支持 MCTP 的网卡芯片(其 MCTP 层识别地址为 73)

因此:

:small_blue_diamond: TargetPhyAddrAddress 不是同一个地址,但它们处于不同通信层级:

  • Address 是 I2C/SMBus 硬件层的从设备地址;
  • TargetPhyAddr 是 MCTP 协议层的目标地址,不一定等于 I2C 地址

:pushpin: 建议实践

  • 若目标网卡芯片支持 原生 MCTP over SMBus,则 TargetPhyAddr 应设置为该芯片的 MCTP 协议定义的物理地址(需查阅芯片手册)。
  • 若是通过一个“翻译桥接芯片”(如 CPLD 或 MCU)转发 MCTP 命令,则 TargetPhyAddr 由桥接芯片内部逻辑决定。

2. 如何追踪 Endpoint 创建失败的原因及调试方法

:pushpin: 当前现象总结:

  • Devmon 树中已看到 PCIeNicCard 设备对象,说明 SR 文件解析成功;
  • MCTP 树中未出现对应 Endpoint;
  • 调试代码发现 create_transport_and_endpoint 被调用,但结果失败;
  • 无法追踪为何 Endpoint 创建失败。

:white_check_mark: 追踪步骤建议(系统级调试流程)

(1) 检查 MCTPD 是否正常运行

确保 MCTP 守护进程(mctpd)正在运行且服务正常。

# 查看 mctpd 是否启动
ps | grep mctpd

# 检查日志输出
journalctl -u mctpd.service

:light_bulb: 提示:MCTPD 是负责 Endpoint 对象管理和通信的核心服务。若未运行,则所有 MCTP 功能失效。


(2) 确认 Endpoint 初始化是否被触发

Endpoint 的创建依赖于 MCTP Binding + Endpoint 配置对象 + mctpd 主服务 的协同工作。

参考知识库文档(mctpd使用说明)中的流程:

业务组件 → mctpd主服务 → mctpd SMBus读写服务

具体路径:

  • 您的 component_driver 注册了对象后,mctpd 会通过 ORM 加载这些配置;
  • 当系统启动或组件激活时,调用 create_transport_and_endpoint
  • 内部流程:根据 Endpoint_1 中的 RefChip 找到 Chip_SmbusChip → 获取其 I2C 地址 → 组装 MCTP 绑定参数 → 创建传输层对象。

(3) 使用 tracemctp 命令调试 MCTP 流量

tracemctp 是 BMC 提供的强大调试工具,可用于监控 MCTP Endpoint 报文。

:white_check_mark: 操作步骤如下:

# 进入调试模式
attach mctpd

# 开启所有 MCTP Endpoint 报文跟踪
tracemctp all start

# 或针对特定 endpoint(如果知道名字)
tracemctp Endpoint_1 start

:pushpin: 预期输出行为:

  • 如果 Endpoint 创建成功,tracemctp 会显示 MCTP 请求/响应;
  • 如果创建失败,tracemctp 会提示无此资源或超时。

:magnifying_glass_tilted_right: 参考知识库内容(文档#10):

% attach mctpd 
Success 
% tracemctp Endpoint_173_4 start
============= PCIe capture [SEND]

(4) 检查 /bmc/kepler/mctpd/MicroComponent/Debug 节点

该路径是 MCTPD 的调试资源节点,可用于查询状态。

# 列出当前已注册的 Endpoint
getprop /bmc/kepler/mctpd/MicroComponent/Debug EndpointList
# 或查看错误统计
getprop /bmc/kepler/mctpd/MicroComponent/Debug ErrorCount

(5) 日志排查建议

  • 重点日志模块mctpd, devmon, network_adapter
  • 常见日志关键字
    • "failed to create endpoint"
    • "cannot resolve RefChip"
    • "timeout on SMBus transaction"
    • "invalid TargetPhyAddr"
# 查看系统日志中与 MCTP 相关的内容
logread | grep -i mctp

(6) 检查 MctpBinding_1 配置是否正确

知识库明确指出:

MctpBinding_1 配置链接 BMC 的 SMBus 物理地址与 Chip_SmbusChip,用于通信路由。

当前配置:

"MctpBinding_1": {
    "BmcSMBusEid": 8,
    "BmcSMBusPhyAddr": 16
}

:pushpin: 需确认:

  • BmcSMBusPhyAddr=16 是否符合实际 BMC 的 SMBus 物理地址?
  • 是否与 mctp_lib.get_smbus_endpoint() 所需参数一致?

:books: 参考知识库实体:Mctp.MctpBinding.SMBus 中定义了 BmcPhyAddr 属性。


:white_check_mark: 排查清单(Checklist)

检查项 是否完成 建议动作
RefChip 指向的 Chip_SmbusChip 存在且 I2C 可访问 使用 i2cdetect -y <bus> 测试地址 0x92 是否存在
TargetPhyAddr 是否为设备支持的 MCTP 地址 查阅网卡芯片手册确认
MediumType=128 是否支持 SMBus :white_check_mark: 是标准值(知识库文档#2)
MessageType=2 是否对应 NCSI :white_check_mark: 正确
MctpBinding_1 已正确配置 Bmc 地址 审核是否匹配硬件设计
mctpd 服务正在运行 systemctl status mctpd
是否调用了 create_transport_and_endpoint :white_check_mark: 已知
tracemctp 能否捕获通信 执行追踪命令测试
日志是否报错 logread | grep -i mctp

:wrench: 建议修改建议(基于当前配置)

"Endpoint_1": {
    "TargetEid": "${$Slot} > expr($1 + 8)",
    "TargetPhyAddr": 73,              // ❓请核实是否应为此值
                                        // → 建议尝试设置为 0x92(即146)测试连通性
    "MessageType": 2,
    "MediumType": 128,
    "RefChip": "#/Chip_SmbusChip"
}

:wrench: 临时调试建议

  • TargetPhyAddr 改为 146(即 Chip_SmbusChip 的 Address),看是否能创建成功;
  • 若仍失败,说明问题不在于地址转换,而在于 MCTP over SMBus 协议握手失败
  • 此时需启用 tracemctp 和日志抓取。

:white_check_mark: 总结与建议

问题一答案:

TargetPhyAddr 是 MCTP 协议层的目标物理地址,不等于 I2C 地址,但两者协同工作:I2C 地址用于访问代理芯片(Chip_SmbusChip),而 TargetPhyAddr 是该代理背后设备的 MCTP 地址。

问题二答案:

可通过 tracemctp, getprop 调试节点、系统日志和 mctpd 状态来追踪 Endpoint 创建失败原因。建议结合 i2cdetect 验证 I2C 层连通性。


:hammer_and_wrench: 最终建议

  1. 优先验证 I2C 层通信:使用命令行工具确认 Chip_SmbusChip 在 I2C 总线上可正常通信;
  2. 启用 tracemctp:捕获 MCTP 报文流;
  3. 对比标准适配案例:参考 Hi182X.lua 实现(见文档#4);
  4. 咨询 FXX(社区专家):根据知识库描述,FXX 曾指导过类似问题,尤其关于 network_adapter 无需修改的情况。

:person_raising_hand: 如有更多上下文(如芯片型号、MCTP 规范文档),可进一步精准定位。


如需,我可为您生成一份 NCSI over MCTP over SMBus 调试手册模板,欢迎继续提问。

和网迅网卡联调的吗?component_drivers组件版本号是多少?

不是网讯,截图是参考的 南向网卡驱动适配指南.md 中的 NCSI over MCTP over SMBus 小节,目前主要是对其中sr的配置有些疑问,component_drivers就git上拉取的1.2.93

1、TargetPhyAddr属性对应网卡i2c从设备的地址,Chip_SmbusChip这里对应的是TargetPhyAddr左移一位后的值。

2、需要先确认网卡设备的smbus配置,目前ubmc是固定master,通过block read获取网卡响应的,所以需要保证网卡固定slave。

好的,多谢指导 :+1:

sr文件有配置Drvwritedelay属性吗?如果网卡smbus配置没问题,那么可能是这个属性配置值太小,导致ubmc从网卡read响应时网卡还没准备好rsp,ubmc获取的报文内容有问题没通过校验。可以配高一点试试。

ok,我先修改下TargetPhyAddr,并延长Drvwritedelay再试试