文章目录
1.说明
本节说明如何支持mctp over pcie endpoint的开发。基于平台为intel BHS,cpu作为bus owner。
开发包包含:
注意:只是作为开发调试理解mctp kernel方案框架,且在没有机器作为bus owner条件做的一个实验性工作。
2.驱动支持
为了调试方便,将内核程序改成模块形式开发,然后调试的时候主动加载卸载。
需要注意,调试该方案,需要停止任何使用/dev/aspeed-mctp0接口的访问的其他应用层方案,因为其他方案均不会有效运行。
2.1 dts配置
dts配置注意添加:
c
aliases {
...
mctp0 = &mctp;
}
其余按照sdk建议来做即可。
2.2 驱动模块开发的设置操作(模块形式加载)
- 1.设置内核支持模块编译的开发方式

之后,开启几个模块:



如此,编译后,可以看到如下代码结构:

注意一点:
- 文件
linux-aspeed/drivers/soc/aspeed/aspeed-mctp.c中的#ifdef CONFIG_MCTP_TRANSPORT_PCIE_VDM失效,需要自定义让其使能。
系统启动后,安装ko文件,之后可以使用如下命令:
c
# insmod /tmp/mctp-pcie-vdm.ko
# insmod /tmp/aspeed-mctp.ko

加载完成之后,可以看到设备节点出现。
那么,如何支持将BMC作为endpoint呢?
原始的代码逻辑是不支持作为endpoint的。这个是已知点。 因此支持作为endpoint,可以按照如下思路入手:
- 首先将
BMC addr(eid)设置为255,使其能接收广播数据。 - 在
cpu设置好BMC的eid之后,将eid 255删除。将新的eid作为bmc的local eid BMC使用新的local eid,与cpu bus owner通信,获取routing table数据。
目前,最基本的一个代码框架的调试,可以参考代码仓库: bmc as endpoint
2.3 调试
2.3.1 应用层调试命令
调试最重要的几个命令:
- 1.安装驱动程序
c
# insmod /tmp/mctp-pcie-vdm.ko
# insmod /tmp/aspeed-mctp.ko
- 2.启动
mctpd
c
# /tmp/mctpd
- 3.设置相关参数
c
# /tmp/mctp link set mctppcie0 up
# /tmp/mctp addr add 255 dev mctppcie0
2.3.2 kernel层
kernel层需要过滤掉相关eid=255的设置。
2.3.3 测试基本mctp功能
~# /tmp/mctp route
eid min 9 max 9 net 1 dev mctppci0 mtu 64
eid min 10 max 10 net 1 dev mctppci0 mtu 0
eid min 29 max 29 net 1 dev mctppci0 mtu 64
# /tmp/mctp addr
eid 10 net 1 dev mctppci0
~# /tmp/mctp link
dev lo index 1 address 00:00:00:00:00:00 net 1 mtu 65536 up
dev mctppci0 index 6 address 00:00:00 net 1 mtu 64 up
~# /tmp/mctp neigh
eid 9 net 1 dev mctppci0 lladdr 12:8b:00
eid 29 net 1 dev mctppci0 lladdr 12:18:00


另外,使用工具mctp-client可以查看是否可以获取到单独的endpoint信息:
c
# /tmp/mctp-client net 1 eid 9 type control data 0 6
00 06 00 FF 00 10 00 10 E2



2.3.4 测试基本pldm功能
将https://github.com/openbmc/pldm添加到工程中,然后结合: https://github.com/openbmc/pldm/blob/3124782739408b77dbf7df07833336ee63dcc239/pldmtool/README.md,其中,需要参考提交:去掉来自entity配置.
然后执行:
c
# pldmtool raw -d 0x80 0x00 0x04 0x00 0x00 -m 9
pldmtool: Tx: 80 00 04 00 00
pldmtool: Rx: 00 00 04 00 21 00 00 00 00 00 00 00
# pldmtool base GetPLDMTypes -m 9
{
"CompletionCode": "SUCCESS",
"PLDMTypes": [
{
"PLDM Type": "base",
"PLDM Type Code": 0
}
]
}