MCTP over SMBus主从切换情况下无法建立通信链路

问题背景

有一张走MCTP over SMBus协议带外通信的PCIe标卡,通信时需要做主从切换。
参考社区文档,我配置了CSR,希望通过mctpd组件建立通信链路。

        "Chip_Mctp": {
            "Address": 58,
            "AddrWidth": 1,
            "OffsetWidth": 0,
            "WriteTmout": 100,
            "ReadTmout": 100,
            "HealthStatus": 0,
            "DrvWriteDelay": 200
        },
        "Endpoint_1": {
            "TargetEid": 99,
            "TargetPhyAddr": 29,
            "MessageType": 4,
            "MediumType": 2,
            "RefChip": "#/Chip_Mctp"
        },
        "MctpBinding_1": {
            "BmcSMBusEid": 8,
            "BmcSMBusPhyAddr": 16
        },

但从app.log发现如下报错:

2025-10-27 09:18:22.638755 unknown_service ERROR: smbus_write_read_service.lua(88): process smbus request failed. chip name: Chip_Mctp_010101, err: ./opt/bmc/apps/hwproxy/lualib/chip.lua:414: ./opt/bmc/apps/hwproxy/lualib/stream/i2c.lua:117: response error, i2c read fail, ret: false, input:{"is_trace":false,"addrWidth":1,"name":"Chip_Mctp_010101","requestor":"bmc.kepler.hwproxy","protocol_flag":2,"mask":4294967295,"offset":0,"bus_type":0,"type":1,"len":259,"buffer":"3A 0F 0A 21 01 00 08 C9 00 80 01 00 63 F6 ","rw_type":1,"has_error":false,"addr":58,"offsetWidth":0}

从framework.log发现如下报错:

2025-11-07 01:36:21.403857 hwproxy DEBUG: i2c.lua(206): Chip Chip_Mctp_010101 fails to read data through the SMBUS protocol. ret: response error, ioctl(I2C_CMD_SLAVE_CACHE_RD) failed: Unknown error 1008, drv_id:7

个人分析

3A 0F 0A 21 01 00 08 C9 00 80 01 00 63 F6 对应的就是MCTP over SMBus的set endpoint ID命令,但是读取响应失败

设备拓扑

设备拓扑为:i2c7–>device(0x1d)

初步定位

从逻辑分析仪抓取数据如下


往BMC地址0x10寻址失败,接收到NACK,所以卡没有继续发送数据

与hardware sig的Maintainer确定了一下,该问题建议先不使用扩9545的方式来接,先验证直接使用单独一条i2c直连是否可以发通

不接PCA9545的情况下验证mctpd也无法成功接收set endpoint id的响应,验证步骤如下:
1、手动下发set eid的命令,将eid修改为0x55
image
可以看到eid设置成功
2、重启mctpd进程,触发mctpd设置eid为0x63
systemctl restart hardware.service
3、查看app.log日志

2025-11-06 03:51:45.511519 mctpd NOTICE: mctp_engine.lua(338): mctp_engine: set smbus_bmc_eid=8, smbus_bmc_phy_addr=16
2025-11-06 03:51:45.607147 unknown_service ERROR: smbus_write_read_service.lua(88): process smbus request failed. chip name: Chip_Mctp_010101, err: ./opt/bmc/apps/hwproxy/lualib/chip.lua:414: ./opt/bmc/apps/hwproxy/lualib/stream/i2c.lua:117: response error, i2c read fail, ret: false, input:{"len":259,"is_trace":false,"has_error":false,"offsetWidth":0,"drv_write_delay":0,"bus_type":0,"requestor":"bmc.kepler.hwproxy","protocol_flag":2,"buffer":"3A 0F 0A 01 01 00 00 C9 00 80 01 00 63 3F ","offset":0,"name":"Chip_Mctp_010101","type":1,"mask":4294967295,"rw_type":1,"addrWidth":1,"addr":58}

可以看到mctpd读取响应失败
4、手动读取卡的寄存器数据


可以看到eid 0x63是设置成功了,卡一直在尝试响应,序列号seq一直在变,但mctpd却报错没有响应

可以试试用你的命令发一下其他的地址,会不会是地址有问题,感觉情况好像是卡没有任何反馈,正常mctp走i2c之后的收包是在0x10地址的slave queue里面读取的,你发了信息之后,可以去那边读取一下试试。

openUBMC有slave queue吗,在哪个路径,我知道openbmc是可以用slave_mqueue接收的,我也尝试过把对应的代码移植到openUBMC平台上,但是似乎也接收不到

这个我还不清楚,按说mctp 走 smbus 都需要走slave mqueue的,如果有条件的话可以在openbmc下试试,会不会是其他的配置问题

从框架那边反馈的情况来看,大概率是I2C主从切换功能还没有实现

这个问题1月找到smbus主从切换耗时高的原因,已修复,目前测试反馈功能无异常,预计330版本会带上该修改。

1 个赞