Lines Matching full:mctp
140 static void *mctp_msg_dup(const void *msg, size_t msg_len, struct mctp *mctp) in mctp_msg_dup() argument
142 void *copy = __mctp_msg_alloc(msg_len, mctp); in mctp_msg_dup()
153 static struct mctp_msg_ctx *mctp_msg_ctx_lookup(struct mctp *mctp, uint8_t src, in mctp_msg_ctx_lookup() argument
160 for (i = 0; i < ARRAY_SIZE(mctp->msg_ctxs); i++) { in mctp_msg_ctx_lookup()
161 struct mctp_msg_ctx *ctx = &mctp->msg_ctxs[i]; in mctp_msg_ctx_lookup()
170 static struct mctp_msg_ctx *mctp_msg_ctx_create(struct mctp *mctp, uint8_t src, in mctp_msg_ctx_create() argument
176 for (i = 0; i < ARRAY_SIZE(mctp->msg_ctxs); i++) { in mctp_msg_ctx_create()
177 struct mctp_msg_ctx *tmp = &mctp->msg_ctxs[i]; in mctp_msg_ctx_create()
192 ctx->buf_alloc_size = mctp->max_message_size; in mctp_msg_ctx_create()
193 ctx->buf = __mctp_msg_alloc(ctx->buf_alloc_size, mctp); in mctp_msg_ctx_create()
204 __mctp_msg_free(ctx->buf, bus->mctp); in mctp_msg_ctx_drop()
236 struct mctp *mctp_init(void) in mctp_init()
238 struct mctp *mctp; in mctp_init() local
240 mctp = __mctp_alloc(sizeof(*mctp)); in mctp_init()
242 if (!mctp) in mctp_init()
245 mctp_setup(mctp, sizeof(*mctp)); in mctp_init()
246 return mctp; in mctp_init()
262 int mctp_setup(struct mctp *mctp, size_t struct_mctp_size) in mctp_setup() argument
264 if (struct_mctp_size < sizeof(struct mctp)) { in mctp_setup()
265 mctp_prdebug("Mismatching struct mctp"); in mctp_setup()
268 memset(mctp, 0, sizeof(*mctp)); in mctp_setup()
269 mctp->max_message_size = MCTP_MAX_MESSAGE_SIZE; in mctp_setup()
271 mctp->platform_now = mctp_default_now; in mctp_setup()
274 mctp_control_add_type(mctp, MCTP_CTRL_HDR_MSG_TYPE); in mctp_setup()
279 void mctp_set_max_message_size(struct mctp *mctp, size_t message_size) in mctp_set_max_message_size() argument
281 mctp->max_message_size = message_size; in mctp_set_max_message_size()
284 void mctp_set_capture_handler(struct mctp *mctp, mctp_capture_fn fn, void *user) in mctp_set_capture_handler() argument
286 mctp->capture = fn; in mctp_set_capture_handler()
287 mctp->capture_data = user; in mctp_set_capture_handler()
290 static void mctp_bus_destroy(struct mctp_bus *bus, struct mctp *mctp) in mctp_bus_destroy() argument
293 __mctp_msg_free(bus->tx_msg, mctp); in mctp_bus_destroy()
298 void mctp_cleanup(struct mctp *mctp) in mctp_cleanup() argument
303 static_assert(ARRAY_SIZE(mctp->msg_ctxs) < SIZE_MAX, "size"); in mctp_cleanup()
304 for (i = 0; i < ARRAY_SIZE(mctp->msg_ctxs); i++) { in mctp_cleanup()
305 struct mctp_msg_ctx *tmp = &mctp->msg_ctxs[i]; in mctp_cleanup()
307 __mctp_msg_free(tmp->buf, mctp); in mctp_cleanup()
310 while (mctp->n_busses--) in mctp_cleanup()
311 mctp_bus_destroy(&mctp->busses[mctp->n_busses], mctp); in mctp_cleanup()
314 void mctp_destroy(struct mctp *mctp) in mctp_destroy() argument
316 mctp_cleanup(mctp); in mctp_destroy()
317 __mctp_free(mctp); in mctp_destroy()
320 int mctp_set_rx_all(struct mctp *mctp, mctp_rx_fn fn, void *data) in mctp_set_rx_all() argument
322 mctp->message_rx = fn; in mctp_set_rx_all()
323 mctp->message_rx_data = data; in mctp_set_rx_all()
327 static struct mctp_bus *find_bus_for_eid(struct mctp *mctp, mctp_eid_t dest in find_bus_for_eid() argument
330 if (mctp->n_busses == 0) in find_bus_for_eid()
335 return &mctp->busses[0]; in find_bus_for_eid()
338 int mctp_register_bus(struct mctp *mctp, struct mctp_binding *binding, in mctp_register_bus() argument
345 assert(mctp->n_busses == 0); in mctp_register_bus()
346 mctp->n_busses = 1; in mctp_register_bus()
350 memset(mctp->busses, 0, sizeof(struct mctp_bus)); in mctp_register_bus()
351 mctp->busses[0].mctp = mctp; in mctp_register_bus()
352 mctp->busses[0].binding = binding; in mctp_register_bus()
353 mctp->busses[0].eid = eid; in mctp_register_bus()
354 binding->bus = &mctp->busses[0]; in mctp_register_bus()
355 binding->mctp = mctp; in mctp_register_bus()
356 mctp->route_policy = ROUTE_ENDPOINT; in mctp_register_bus()
363 mctp->n_busses = 0; in mctp_register_bus()
380 void mctp_unregister_bus(struct mctp *mctp, struct mctp_binding *binding) in mctp_unregister_bus() argument
386 mctp->n_busses = 0; in mctp_unregister_bus()
387 binding->mctp = NULL; in mctp_unregister_bus()
391 int mctp_bridge_busses(struct mctp *mctp, struct mctp_binding *b1, in mctp_bridge_busses() argument
399 assert(mctp->n_busses == 0); in mctp_bridge_busses()
401 memset(mctp->busses, 0, 2 * sizeof(struct mctp_bus)); in mctp_bridge_busses()
402 mctp->n_busses = 2; in mctp_bridge_busses()
403 mctp->busses[0].binding = b1; in mctp_bridge_busses()
404 b1->bus = &mctp->busses[0]; in mctp_bridge_busses()
405 b1->mctp = mctp; in mctp_bridge_busses()
406 mctp->busses[1].binding = b2; in mctp_bridge_busses()
407 b2->bus = &mctp->busses[1]; in mctp_bridge_busses()
408 b2->mctp = mctp; in mctp_bridge_busses()
410 mctp->route_policy = ROUTE_BRIDGE; in mctp_bridge_busses()
458 /* MCTP bus binding handler */ in mctp_ctrl_handle_msg()
492 * Receive the complete MCTP message and route it.
496 static void mctp_rx(struct mctp *mctp, struct mctp_bus *bus, mctp_eid_t src, in mctp_rx() argument
502 if (mctp->route_policy == ROUTE_ENDPOINT && in mctp_rx()
509 /* Handle MCTP Control Messages: */ in mctp_rx()
526 if (mctp->message_rx) in mctp_rx()
527 mctp->message_rx(src, tag_owner, msg_tag, in mctp_rx()
528 mctp->message_rx_data, buf, len); in mctp_rx()
531 if (mctp->route_policy == ROUTE_BRIDGE) { in mctp_rx()
534 for (i = 0; i < mctp->n_busses; i++) { in mctp_rx()
535 struct mctp_bus *dest_bus = &mctp->busses[i]; in mctp_rx()
539 void *copy = mctp_msg_dup(buf, len, mctp); in mctp_rx()
553 struct mctp *mctp = binding->mctp; in mctp_bus_rx() local
564 /* Drop packet if it was smaller than mctp hdr size */ in mctp_bus_rx()
568 if (mctp->capture) in mctp_bus_rx()
569 mctp->capture(pkt, MCTP_MESSAGE_CAPTURE_INCOMING, in mctp_bus_rx()
570 mctp->capture_data); in mctp_bus_rx()
581 if (mctp->route_policy == ROUTE_ENDPOINT && in mctp_bus_rx()
598 len, mctp); in mctp_bus_rx()
600 mctp_rx(mctp, bus, hdr->src, hdr->dest, tag_owner, tag, in mctp_bus_rx()
602 __mctp_msg_free(p, mctp); in mctp_bus_rx()
610 ctx = mctp_msg_ctx_lookup(mctp, hdr->src, hdr->dest, tag); in mctp_bus_rx()
614 ctx = mctp_msg_ctx_create(mctp, hdr->src, hdr->dest, in mctp_bus_rx()
638 ctx = mctp_msg_ctx_lookup(mctp, hdr->src, hdr->dest, tag); in mctp_bus_rx()
664 mctp_rx(mctp, bus, ctx->src, ctx->dest, tag_owner, tag, in mctp_bus_rx()
672 ctx = mctp_msg_ctx_lookup(mctp, hdr->src, hdr->dest, tag); in mctp_bus_rx()
710 struct mctp *mctp = bus->binding->mctp; in mctp_packet_tx() local
717 if (mctp->capture) in mctp_packet_tx()
718 mctp->capture(pkt, MCTP_MESSAGE_CAPTURE_OUTGOING, in mctp_packet_tx()
719 mctp->capture_data); in mctp_packet_tx()
777 __mctp_msg_free(bus->tx_msg, bus->binding->mctp); in mctp_tx_complete()
905 __mctp_msg_free(msg, bus->binding->mctp); in mctp_message_tx_on_bus()
909 int mctp_message_tx_alloced(struct mctp *mctp, mctp_eid_t eid, bool tag_owner, in mctp_message_tx_alloced() argument
918 __mctp_msg_free(msg, mctp); in mctp_message_tx_alloced()
922 bus = find_bus_for_eid(mctp, eid); in mctp_message_tx_alloced()
924 __mctp_msg_free(msg, mctp); in mctp_message_tx_alloced()
932 int mctp_message_tx(struct mctp *mctp, mctp_eid_t eid, bool tag_owner, in mctp_message_tx() argument
935 void *copy = mctp_msg_dup(msg, msg_len, mctp); in mctp_message_tx()
940 return mctp_message_tx_alloced(mctp, eid, tag_owner, msg_tag, copy, in mctp_message_tx()
944 void mctp_set_now_op(struct mctp *mctp, uint64_t (*now)(void *), void *ctx) in mctp_set_now_op() argument
947 mctp->platform_now = now; in mctp_set_now_op()
948 mctp->platform_now_ctx = ctx; in mctp_set_now_op()
951 uint64_t mctp_now(struct mctp *mctp) in mctp_now() argument
953 assert(mctp->platform_now); in mctp_now()
954 return mctp->platform_now(mctp->platform_now_ctx); in mctp_now()
960 struct mctp *mctp = bus->binding->mctp; in mctp_dealloc_tag() local
965 for (size_t i = 0; i < ARRAY_SIZE(mctp->req_tags); i++) { in mctp_dealloc_tag()
966 struct mctp_req_tag *r = &mctp->req_tags[i]; in mctp_dealloc_tag()
977 static int mctp_alloc_tag(struct mctp *mctp, mctp_eid_t local, in mctp_alloc_tag() argument
981 uint64_t now = mctp_now(mctp); in mctp_alloc_tag()
986 for (size_t i = 0; i < ARRAY_SIZE(mctp->req_tags); i++) { in mctp_alloc_tag()
987 struct mctp_req_tag *r = &mctp->req_tags[i]; in mctp_alloc_tag()
1003 uint8_t tag = (t + mctp->tag_round_robin) % 8; in mctp_alloc_tag()
1010 mctp->tag_round_robin = (tag + 1) % 8; in mctp_alloc_tag()
1019 int mctp_message_tx_request(struct mctp *mctp, mctp_eid_t eid, void *msg, in mctp_message_tx_request() argument
1025 bus = find_bus_for_eid(mctp, eid); in mctp_message_tx_request()
1027 __mctp_msg_free(msg, mctp); in mctp_message_tx_request()
1032 rc = mctp_alloc_tag(mctp, bus->eid, eid, &alloc_tag); in mctp_message_tx_request()
1035 __mctp_msg_free(msg, mctp); in mctp_message_tx_request()
1043 return mctp_message_tx_alloced(mctp, eid, true, alloc_tag, msg, in mctp_message_tx_request()
1047 bool mctp_is_tx_ready(struct mctp *mctp, mctp_eid_t eid) in mctp_is_tx_ready() argument
1051 bus = find_bus_for_eid(mctp, eid); in mctp_is_tx_ready()
1058 void *mctp_get_alloc_ctx(struct mctp *mctp) in mctp_get_alloc_ctx() argument
1060 return mctp->alloc_ctx; in mctp_get_alloc_ctx()
1063 void mctp_set_alloc_ctx(struct mctp *mctp, void *ctx) in mctp_set_alloc_ctx() argument
1065 mctp->alloc_ctx = ctx; in mctp_set_alloc_ctx()