遍搜全网,竟然关于openbmc mctp over pcie
的支持说明情况了无文章,这不是一个艰难的问题,服务器BMC
也不是一个超级精尖的产品,想当年分享stm32
资料,都是满天飞。可能服务器市场大家对于文章上的分享并无兴趣。
此篇文章只是一个最基本的简单的说明文章,弥补一下openbmc
资源匮乏吧。另外,本片文章只是一个简单的开篇文章,有错漏,有知识不全面,请尽管评论。
注意: 本章涉及的代码可以查看代码仓库:https://gitee.com/wit_yuan/yuan_mctpd/tree/yuan_modified_mctpd
1.官方活跃的mctp
支持情况
官方活跃的2个仓库有:https://github.com/CodeConstruct/mctp和https://github.com/openbmc/libmctp,这一套下来还需要kernel
的支持, 代码的提交可以参考如下链接:
https://lore.kernel.org/netdev/[email protected]/
简单来讲,可以参考内核这几个文件:
build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/af_mctp.c
build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/device.c
build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/neigh.c
build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/route.c
build/ast2600-default/workspace/sources/linux-aspeed/net/socket.c
这几个文件是核心的整个mctp
架构代码。
如下几个文件是驱动代码,对接到硬件上:
build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-i2c.c
build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-i3c.c
build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-serial.c
可以看到,这里面没有一个直接的针对mctp-pcie.c
文件,粗浅看,这个架构是不支持mctp over pcie
的。
补充一点,文件:build/ast2600-default/workspace/sources/linux-aspeed/drivers/soc/aspeed/aspeed-mctp.c
是内核的mctp over pcie
驱动文件,但是说了与不说一样,因为架构上没支持(差一个驱动程序)。
简单看一下文件:build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-i2c.c
中的mctp_i2c_add_netdev()
函数:
static int mctp_i2c_add_netdev(struct mctp_i2c_client *mcli,
struct i2c_adapter *adap)
---> struct net_device *ndev = NULL;
---> ndev = alloc_netdev(sizeof(*midev), namebuf, NET_NAME_ENUM, mctp_i2c_net_setup);
---> rc = mctp_register_netdev(ndev, &mctp_i2c_mctp_ops);
可以反推,目前的架构是不支持mctp over pcie
的。当前的架构情况是kernel mctp
+ lib
+ dbus
服务组成。
2.intel-mctp
的支持情况
留意: intel
已经对这一块不再维护了。
可以在intel
的openbmc
仓库里面,找到链接:
- 1.
libmctp
链接:https://github.com/Intel-BMC/libmctp - 2.
pmci
链接:https://github.com/Intel-BMC/pmci - 3.
mctpd
链接:https://github.com/Intel-BMC/pmci/tree/master/mctpd
从mctpd
仓库代码,基本上看到是支持mctp over pcie
的并且BMC
是支持作为endpoint
的。这符合我的需求。
我的需求如下:
1.bios作为bus owner,负责分配eid
2.bmc作为endpoint,访问其他pcie设备
2.1 libmctp
分析
libmctp
的代码仓库如下:
https://github.com/Intel-BMC/libmctp
对于mctp over pcie
的支持,可查看文件:
build/ast2600-default/workspace/sources/libmctp-intel/libmctp.h
build/ast2600-default/workspace/sources/libmctp-intel/astpcie.c
库的功能实现用的是.c
文件,实现基本的ioctl()
,对于C++
来说不好和kernel
交互的代码。这里是实现就没什么可说的。
2.2.intel-bmc
的mctpd
的实现
mctpd
的代码仓库如下:
https://github.com/Intel-BMC/pmci/tree/master/mctpd
这一块的作用是作为一个dbus service
,供其他client
调用接口。代码结构比较清晰。
注意,这里面有一个yaml
的文件需要导入,作为server
与client
等的支持的头文件。
2.3 导入intel bmc mctp over pcie
的实现
注意:这里导入只是一个基本的功能测试mctp over pcie
,不是实际功能开发。
参考git
仓库上的.bb
文件,资源路径:
https://github.com/Intel-BMC/openbmc/tree/1-release/meta-openbmc-mods/meta-common/recipes-phosphor/pmci.
在目录: meta-aspeed-sdk/recipes-phosphor/mctpd/
中导入https://github.com/Intel-BMC/openbmc/blob/1-release/meta-openbmc-mods/meta-common/recipes-phosphor/pmci/mctpd.bb
文件。
修改mctpd.bb
文件名,改为:mctpd_1.0.bb
,内容如:
SUMMARY = "MCTP Daemon"
DESCRIPTION = "Implementation of MCTP (DTMF DSP0236)"
LICENSE = "CLOSED"
SRC_URI = "file://mctpd.tar.gz"
S = "${WORKDIR}"
PV = "1.0+git${SRCPV}"
OECMAKE_SOURCEPATH = "${S}"
inherit cmake systemd
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
DEPENDS += " \
libmctp-intel \
systemd \
sdbusplus \
phosphor-logging \
boost \
i2c-tools \
cli11 \
nlohmann-json \
gtest \
phosphor-dbus-interfaces \
udev \
"
PACKAGECONFIG[systemd] = ",,systemd,libsystemd"
SYSTEMD_AUTO_ENABLE:${
PN} = "enable"
do_install:append(){
install -d ${
D}/${
systemd_system_unitdir}
install -d ${
D}/${
bindir}
install -d ${
D}/${
datadir}/mctp/
install -m 755 ${
WORKDIR}/${
PN}-${
PV}/mctpd ${
D}/${
bindir}
install -<