OpenBIC
OpenSource Bridge-IC
mctp.h
Go to the documentation of this file.
1/*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef _MCTP_H
18#define _MCTP_H
19
20#ifdef __cplusplus
21extern "C" {
22#endif
23
24#include <stdint.h>
25#include <sys/printk.h>
26#include <zephyr.h>
27#include "plat_def.h"
28
29#define MCTP_DEBUG 1
30
31#define MCTP_SUCCESS 0
32#define MCTP_ERROR 1
33
34#define MCTP_RESPONSE 0
35#define MCTP_REQUEST 1
36
37#define MCTP_TX_QUEUE_SIZE 16
38
39#define MSG_ASSEMBLY_BUF_SIZE 1024
40
41#define MCTP_RX_TASK_STACK_SIZE 4096
42#define MCTP_TX_TASK_STACK_SIZE 2048
43#define MCTP_TASK_NAME_LEN 32
44
45#define MCTP_DEFAULT_ENDPOINT 0x0A
46#define MCTP_NULL_EID 0x00
47
48#ifdef PLAT_MCTP_MSG_MAX_SIZE
49#define MCTP_DEFAULT_MSG_MAX_SIZE PLAT_MCTP_MSG_MAX_SIZE
50#else
51#define MCTP_DEFAULT_MSG_MAX_SIZE 244
52#endif
53#define MCTP_TRANSPORT_HEADER_SIZE 4
54#define MCTP_MEDIUM_META_SIZE_SMBUS 3
55#define MCTP_PEC_SIZE 1 /* SMBUS/I3C */
56#define MCTP_META_INFO_SIZE (MCTP_TRANSPORT_HEADER_SIZE + MCTP_PEC_SIZE)
57
58#define MCTP_MAX_MSG_TAG_NUM 8
59
60#define MCTP_HDR_HDR_VER 0x01
61#define MCTP_HDR_SEQ_MASK 0x03
62#define MCTP_HDR_TAG_MASK 0x07
63
64#define MCTP_POLL_TIME_MS 1
65
66#define MCTP_MSG_TYPE_SHIFT 0
67#define MCTP_MSG_TYPE_MASK 0x7F
68
69#define MCTP_IC_SHIFT 7
70#define MCTP_IC_MASK 0x80
71
72typedef enum {
82
83typedef enum {
90
91/* smbus extra medium data of endpoint */
92typedef struct _mctp_i3c_ext_params {
93 uint8_t addr; /* 8 bit address */
94 uint32_t dummy; // TODO: test only
96
97/* smbus extra medium data of endpoint */
98typedef struct _mctp_smbus_ext_params {
99 uint8_t addr; /* 8 bit address */
101
102/* mctp extra parameters prototype */
103typedef struct _mctp_ext_params {
104 /* mctp transport layer parameters */
105 uint8_t tag_owner;
106 uint8_t msg_tag;
107 uint8_t ep;
108
109 /* medium parameters */
111 union {
114 };
116
117/* mctp recevice data callback function prototype */
118/* ext_params shoule be bypass to mctp_send_msg if need */
119typedef uint8_t (*mctp_fn_cb)(void *mctp_p, uint8_t *buf, uint32_t len, mctp_ext_params ext_params);
120
121/* medium write/read function prototype */
122typedef uint16_t (*medium_tx)(void *mctp_p, uint8_t *buf, uint32_t len, mctp_ext_params ext_params);
123typedef uint16_t (*medium_rx)(void *mctp_p, uint8_t *buf, uint32_t len,
124 mctp_ext_params *ext_params);
125
126/* prototype for destitation endpoint resloved */
127typedef uint8_t (*endpoint_resolve)(uint8_t dest_endpoint, void **mctp_inst,
128 mctp_ext_params *ext_params);
129
130/* i3c config for mctp medium_conf */
131typedef struct _mctp_i3c_conf {
132 uint8_t bus;
133 uint8_t addr;
135
136/* smbus config for mctp medium_conf */
137typedef struct _mctp_smbus_conf {
138 uint8_t bus;
139 uint8_t addr;
141
142/* mctp medium conf */
143typedef union {
147
148/* mctp tx message struct */
149typedef struct __attribute__((aligned(4))) {
150 uint8_t is_bridge_packet;
151 uint8_t *buf;
152 uint16_t len;
153 mctp_ext_params ext_params;
154 struct k_msgq *evt_msgq;
156
157/* mctp main struct */
158typedef struct _mctp {
161 uint8_t endpoint;
162 uint16_t max_msg_size;
163
164 /* medium related */
168
169 /* get mctp route information by application layer */
171
172 /* read/write task */
175 struct k_thread rx_task_thread_data;
176 struct k_thread tx_task_thread_data;
181
182 /* write queue */
183 struct k_msgq mctp_tx_queue;
184
185 /* point to the rx message buffer that is assembling request/response */
186 struct {
187 uint8_t *buf;
188 uint16_t offset;
190
191 /* the callback when recevie mctp data */
193
194 /* for pldm instance id */
196 uint32_t pldm_inst_table; // 32 bits field for instance id
197
198 /* for cci_msg_tag */
199 uint8_t cci_msg_tag;
200
201 /* for ncsi instance id */
203 uint32_t ncsi_inst_table[8]; // 256 bits field for instance id
204
205 /* for MCTP msg tag */
206 uint8_t msg_tag;
208
209typedef struct _mctp_smbus_port {
215
216/* mctp route entry struct */
217typedef struct _mctp_route_entry {
218 uint8_t endpoint;
219 uint8_t bus; /* TODO: only consider smbus/i3c */
220 uint8_t addr; /* TODO: only consider smbus/i3c */
224
225typedef struct _mctp_msg_handler {
229
231mctp_port *plat_get_mctp_port(uint8_t index);
232
233/* public function */
234mctp *mctp_init(void);
235
236uint8_t mctp_deinit(mctp *mctp_inst);
237
238uint8_t mctp_set_medium_configure(mctp *mctp_inst, MCTP_MEDIUM_TYPE medium_type,
239 mctp_medium_conf medium_conf);
240
241/* medium_conf should be freed by application */
242uint8_t mctp_get_medium_configure(mctp *mctp_inst, MCTP_MEDIUM_TYPE *medium_type,
243 mctp_medium_conf *medium_conf);
244
245/* mctp service start */
246uint8_t mctp_start(mctp *mctp_inst);
247
248/* mctp service stop */
249uint8_t mctp_stop(mctp *mctp_inst);
250
251/* send message to destination endpoint */
252uint8_t mctp_send_msg(mctp *mctp_inst, uint8_t *buf, uint16_t len, mctp_ext_params ext_params);
253
254/* bridge message to destination endpoint */
255uint8_t mctp_bridge_msg(mctp *mctp_inst, uint8_t *buf, uint16_t len, mctp_ext_params ext_params);
256
257/* medium init/deinit */
258uint8_t mctp_smbus_init(mctp *mctp_inst, mctp_medium_conf medium_conf);
259uint8_t mctp_smbus_deinit(mctp *mctp_inst);
260uint8_t mctp_i3c_controller_init(mctp *mctp_instance, mctp_medium_conf medium_conf);
261uint8_t mctp_i3c_target_init(mctp *mctp_instance, mctp_medium_conf medium_conf);
262uint8_t mctp_i3c_deinit(mctp *mctp_instance);
263
264/* register endpoint resolve function */
265uint8_t mctp_reg_endpoint_resolve_func(mctp *mctp_inst, endpoint_resolve resolve_fn);
266
267bool get_mctp_info_by_eid(uint8_t port, mctp **mctp_inst, mctp_ext_params *ext_params);
268uint8_t get_mctp_info(uint8_t dest_endpoint, mctp **mctp_inst, mctp_ext_params *ext_params);
269
270/* register callback function when the mctp message is received */
271uint8_t mctp_reg_msg_rx_func(mctp *mctp_inst, mctp_fn_cb rx_cb);
272
273mctp *pal_get_mctp(uint8_t mctp_medium_type, uint8_t bus);
274int pal_get_target(uint8_t interface);
275int pal_get_medium_type(uint8_t interface);
276uint8_t plat_get_eid();
278mctp *pal_find_mctp_by_bus(uint8_t bus);
280
281bool pal_is_need_mctp_interval(mctp *mctp_inst);
282int pal_get_mctp_interval_ms(mctp *mctp_inst);
283
284#ifdef __cplusplus
285}
286#endif
287
288#endif /* _MCTP_H */
bool get_mctp_info_by_eid(uint8_t port, mctp **mctp_inst, mctp_ext_params *ext_params)
Definition: mctp.c:656
uint8_t plat_get_eid()
Definition: mctp.c:426
struct _mctp_msg_handler mctp_msg_handler
uint8_t mctp_stop(mctp *mctp_inst)
Definition: mctp.c:497
uint8_t mctp_reg_endpoint_resolve_func(mctp *mctp_inst, endpoint_resolve resolve_fn)
Definition: mctp.c:633
mctp_port * pal_find_mctp_port_by_channel_target(uint8_t target)
Definition: mctp.c:718
mctp_tx_msg
Definition: mctp.h:155
uint8_t mctp_start(mctp *mctp_inst)
Definition: mctp.c:520
int pal_get_medium_type(uint8_t interface)
Definition: plat_mctp.c:85
uint8_t(* endpoint_resolve)(uint8_t dest_endpoint, void **mctp_inst, mctp_ext_params *ext_params)
Definition: mctp.h:127
struct _mctp_smbus_port mctp_port
uint16_t(* medium_tx)(void *mctp_p, uint8_t *buf, uint32_t len, mctp_ext_params ext_params)
Definition: mctp.h:122
uint8_t mctp_reg_msg_rx_func(mctp *mctp_inst, mctp_fn_cb rx_cb)
Definition: mctp.c:642
MCTP_MEDIUM_TYPE
Definition: mctp.h:83
@ MCTP_MEDIUM_TYPE_TARGET_I3C
Definition: mctp.h:87
@ MCTP_MEDIUM_TYPE_MAX
Definition: mctp.h:88
@ MCTP_MEDIUM_TYPE_CONTROLLER_I3C
Definition: mctp.h:86
@ MCTP_MEDIUM_TYPE_UNKNOWN
Definition: mctp.h:84
@ MCTP_MEDIUM_TYPE_SMBUS
Definition: mctp.h:85
uint16_t(* medium_rx)(void *mctp_p, uint8_t *buf, uint32_t len, mctp_ext_params *ext_params)
Definition: mctp.h:123
#define MCTP_MAX_MSG_TAG_NUM
Definition: mctp.h:58
uint8_t mctp_get_medium_configure(mctp *mctp_inst, MCTP_MEDIUM_TYPE *medium_type, mctp_medium_conf *medium_conf)
Definition: mctp.c:485
uint8_t plat_get_mctp_port_count()
Definition: mctp.c:688
MCTP_MSG_TYPE
Definition: mctp.h:72
@ MCTP_MSG_TYPE_PLDM
Definition: mctp.h:74
@ MCTP_MSG_TYPE_ETH
Definition: mctp.h:76
@ MCTP_MSG_TYPE_NVME
Definition: mctp.h:77
@ MCTP_MSG_TYPE_CCI
Definition: mctp.h:78
@ MCTP_MSG_TYPE_NCSI
Definition: mctp.h:75
@ MCTP_MSG_TYPE_CTRL
Definition: mctp.h:73
@ MCTP_MSG_TYPE_VEN_DEF_PCI
Definition: mctp.h:79
@ MCTP_MSG_TYPE_VEN_DEF_IANA
Definition: mctp.h:80
uint8_t mctp_i3c_deinit(mctp *mctp_instance)
uint8_t mctp_send_msg(mctp *mctp_inst, uint8_t *buf, uint16_t len, mctp_ext_params ext_params)
Definition: mctp.c:624
#define MCTP_TASK_NAME_LEN
Definition: mctp.h:43
struct _mctp_smbus_ext_params mctp_smbus_ext_params
int pal_get_target(uint8_t interface)
Definition: plat_mctp.c:103
uint8_t mctp_deinit(mctp *mctp_inst)
Definition: mctp.c:450
mctp_port * plat_get_mctp_port(uint8_t index)
Definition: mctp.c:693
mctp * pal_get_mctp(uint8_t mctp_medium_type, uint8_t bus)
Definition: plat_mctp.c:121
uint8_t get_mctp_info(uint8_t dest_endpoint, mctp **mctp_inst, mctp_ext_params *ext_params)
Definition: mctp.c:651
mctp * mctp_init(void)
Definition: mctp.c:432
struct _mctp_smbus_conf mctp_smbus_conf
#define MCTP_TX_TASK_STACK_SIZE
Definition: mctp.h:42
struct _mctp_route_entry mctp_route_entry
uint8_t mctp_smbus_deinit(mctp *mctp_inst)
Definition: mctp_smbus.c:243
uint8_t mctp_bridge_msg(mctp *mctp_inst, uint8_t *buf, uint16_t len, mctp_ext_params ext_params)
Definition: mctp.c:615
struct _mctp_ext_params mctp_ext_params
uint8_t mctp_i3c_controller_init(mctp *mctp_instance, mctp_medium_conf medium_conf)
#define MCTP_RX_TASK_STACK_SIZE
Definition: mctp.h:41
bool pal_is_need_mctp_interval(mctp *mctp_inst)
Definition: mctp.c:45
mctp * pal_find_mctp_by_bus(uint8_t bus)
Definition: mctp.c:698
uint8_t mctp_set_medium_configure(mctp *mctp_inst, MCTP_MEDIUM_TYPE medium_type, mctp_medium_conf medium_conf)
Definition: mctp.c:465
uint8_t mctp_smbus_init(mctp *mctp_inst, mctp_medium_conf medium_conf)
Definition: mctp_smbus.c:232
struct _mctp mctp
struct _mctp_i3c_conf mctp_i3c_conf
struct _mctp_i3c_ext_params mctp_i3c_ext_params
uint8_t(* mctp_fn_cb)(void *mctp_p, uint8_t *buf, uint32_t len, mctp_ext_params ext_params)
Definition: mctp.h:119
int pal_get_mctp_interval_ms(mctp *mctp_inst)
Definition: mctp.c:50
int pal_find_bus_in_mctp_port(mctp_port *p)
Definition: mctp.c:664
uint8_t mctp_i3c_target_init(mctp *mctp_instance, mctp_medium_conf medium_conf)
Definition: pldm_smbios.h:61
Definition: mctp.h:103
MCTP_MEDIUM_TYPE type
Definition: mctp.h:110
mctp_smbus_ext_params smbus_ext_params
Definition: mctp.h:112
uint8_t tag_owner
Definition: mctp.h:105
mctp_i3c_ext_params i3c_ext_params
Definition: mctp.h:113
uint8_t ep
Definition: mctp.h:107
uint8_t msg_tag
Definition: mctp.h:106
Definition: mctp.h:131
uint8_t bus
Definition: mctp.h:132
uint8_t addr
Definition: mctp.h:133
Definition: mctp.h:92
uint8_t addr
Definition: mctp.h:93
uint32_t dummy
Definition: mctp.h:94
Definition: mctp.h:225
mctp_fn_cb msg_handler_cb
Definition: mctp.h:227
MCTP_MSG_TYPE type
Definition: mctp.h:226
Definition: mctp.h:217
bool set_endpoint
Definition: mctp.h:222
uint8_t dev_present_pin
Definition: mctp.h:221
uint8_t addr
Definition: mctp.h:220
uint8_t bus
Definition: mctp.h:219
uint8_t endpoint
Definition: mctp.h:218
Definition: mctp.h:137
uint8_t bus
Definition: mctp.h:138
uint8_t addr
Definition: mctp.h:139
Definition: mctp.h:98
uint8_t addr
Definition: mctp.h:99
Definition: mctp.h:209
mctp * mctp_inst
Definition: mctp.h:210
MCTP_MEDIUM_TYPE medium_type
Definition: mctp.h:212
uint8_t channel_target
Definition: mctp.h:211
mctp_medium_conf conf
Definition: mctp.h:213
Definition: mctp.h:158
uint8_t mctp_tx_task_name[MCTP_TASK_NAME_LEN]
Definition: mctp.h:180
k_tid_t mctp_tx_task_tid
Definition: mctp.h:174
mctp_fn_cb rx_cb
Definition: mctp.h:192
struct k_msgq mctp_tx_queue
Definition: mctp.h:183
medium_tx write_data
Definition: mctp.h:167
uint8_t cci_msg_tag
Definition: mctp.h:199
struct _mctp::@71 temp_msg_buf[MCTP_MAX_MSG_TAG_NUM][2]
uint8_t endpoint
Definition: mctp.h:161
medium_rx read_data
Definition: mctp.h:166
uint8_t msg_tag
Definition: mctp.h:206
uint32_t ncsi_inst_table[8]
Definition: mctp.h:203
struct k_thread tx_task_thread_data
Definition: mctp.h:176
struct k_thread rx_task_thread_data
Definition: mctp.h:175
k_tid_t mctp_rx_task_tid
Definition: mctp.h:173
uint8_t * buf
Definition: mctp.h:187
mctp_medium_conf medium_conf
Definition: mctp.h:165
endpoint_resolve ep_resolve
Definition: mctp.h:170
K_KERNEL_STACK_MEMBER(tx_task_stack_area, MCTP_TX_TASK_STACK_SIZE)
K_KERNEL_STACK_MEMBER(rx_task_stack_area, MCTP_RX_TASK_STACK_SIZE)
uint32_t pldm_inst_table
Definition: mctp.h:196
MCTP_MEDIUM_TYPE medium_type
Definition: mctp.h:160
uint8_t pldm_inst_id
Definition: mctp.h:195
uint8_t is_servcie_start
Definition: mctp.h:159
uint16_t offset
Definition: mctp.h:188
uint8_t ncsi_inst_id
Definition: mctp.h:202
uint8_t mctp_rx_task_name[MCTP_TASK_NAME_LEN]
Definition: mctp.h:179
uint16_t max_msg_size
Definition: mctp.h:162
Definition: mctp.h:143
mctp_i3c_conf i3c_conf
Definition: mctp.h:145
mctp_smbus_conf smbus_conf
Definition: mctp.h:144