xref: /dpdk/drivers/net/mlx4/mlx4_glue.c (revision 5feecc57d90b97c579b16d1083ea167f7564530b)
14eba244bSAdrien Mazarguil /* SPDX-License-Identifier: BSD-3-Clause
24eba244bSAdrien Mazarguil  * Copyright 2018 6WIND S.A.
3*5feecc57SShahaf Shuler  * Copyright 2018 Mellanox Technologies, Ltd
44eba244bSAdrien Mazarguil  */
54eba244bSAdrien Mazarguil 
6747ac2b4SAdrien Mazarguil #include <stddef.h>
7747ac2b4SAdrien Mazarguil #include <stdint.h>
8747ac2b4SAdrien Mazarguil 
94eba244bSAdrien Mazarguil /* Verbs headers do not support -pedantic. */
104eba244bSAdrien Mazarguil #ifdef PEDANTIC
114eba244bSAdrien Mazarguil #pragma GCC diagnostic ignored "-Wpedantic"
124eba244bSAdrien Mazarguil #endif
134eba244bSAdrien Mazarguil #include <infiniband/mlx4dv.h>
144eba244bSAdrien Mazarguil #include <infiniband/verbs.h>
154eba244bSAdrien Mazarguil #ifdef PEDANTIC
164eba244bSAdrien Mazarguil #pragma GCC diagnostic error "-Wpedantic"
174eba244bSAdrien Mazarguil #endif
184eba244bSAdrien Mazarguil 
194eba244bSAdrien Mazarguil #include "mlx4_glue.h"
204eba244bSAdrien Mazarguil 
214eba244bSAdrien Mazarguil static int
mlx4_glue_fork_init(void)224eba244bSAdrien Mazarguil mlx4_glue_fork_init(void)
234eba244bSAdrien Mazarguil {
244eba244bSAdrien Mazarguil 	return ibv_fork_init();
254eba244bSAdrien Mazarguil }
264eba244bSAdrien Mazarguil 
274eba244bSAdrien Mazarguil static int
mlx4_glue_get_async_event(struct ibv_context * context,struct ibv_async_event * event)284eba244bSAdrien Mazarguil mlx4_glue_get_async_event(struct ibv_context *context,
294eba244bSAdrien Mazarguil 			  struct ibv_async_event *event)
304eba244bSAdrien Mazarguil {
314eba244bSAdrien Mazarguil 	return ibv_get_async_event(context, event);
324eba244bSAdrien Mazarguil }
334eba244bSAdrien Mazarguil 
344eba244bSAdrien Mazarguil static void
mlx4_glue_ack_async_event(struct ibv_async_event * event)354eba244bSAdrien Mazarguil mlx4_glue_ack_async_event(struct ibv_async_event *event)
364eba244bSAdrien Mazarguil {
374eba244bSAdrien Mazarguil 	ibv_ack_async_event(event);
384eba244bSAdrien Mazarguil }
394eba244bSAdrien Mazarguil 
404eba244bSAdrien Mazarguil static struct ibv_pd *
mlx4_glue_alloc_pd(struct ibv_context * context)414eba244bSAdrien Mazarguil mlx4_glue_alloc_pd(struct ibv_context *context)
424eba244bSAdrien Mazarguil {
434eba244bSAdrien Mazarguil 	return ibv_alloc_pd(context);
444eba244bSAdrien Mazarguil }
454eba244bSAdrien Mazarguil 
464eba244bSAdrien Mazarguil static int
mlx4_glue_dealloc_pd(struct ibv_pd * pd)474eba244bSAdrien Mazarguil mlx4_glue_dealloc_pd(struct ibv_pd *pd)
484eba244bSAdrien Mazarguil {
494eba244bSAdrien Mazarguil 	return ibv_dealloc_pd(pd);
504eba244bSAdrien Mazarguil }
514eba244bSAdrien Mazarguil 
524eba244bSAdrien Mazarguil static struct ibv_device **
mlx4_glue_get_device_list(int * num_devices)534eba244bSAdrien Mazarguil mlx4_glue_get_device_list(int *num_devices)
544eba244bSAdrien Mazarguil {
554eba244bSAdrien Mazarguil 	return ibv_get_device_list(num_devices);
564eba244bSAdrien Mazarguil }
574eba244bSAdrien Mazarguil 
584eba244bSAdrien Mazarguil static void
mlx4_glue_free_device_list(struct ibv_device ** list)594eba244bSAdrien Mazarguil mlx4_glue_free_device_list(struct ibv_device **list)
604eba244bSAdrien Mazarguil {
614eba244bSAdrien Mazarguil 	ibv_free_device_list(list);
624eba244bSAdrien Mazarguil }
634eba244bSAdrien Mazarguil 
644eba244bSAdrien Mazarguil static struct ibv_context *
mlx4_glue_open_device(struct ibv_device * device)654eba244bSAdrien Mazarguil mlx4_glue_open_device(struct ibv_device *device)
664eba244bSAdrien Mazarguil {
674eba244bSAdrien Mazarguil 	return ibv_open_device(device);
684eba244bSAdrien Mazarguil }
694eba244bSAdrien Mazarguil 
704eba244bSAdrien Mazarguil static int
mlx4_glue_close_device(struct ibv_context * context)714eba244bSAdrien Mazarguil mlx4_glue_close_device(struct ibv_context *context)
724eba244bSAdrien Mazarguil {
734eba244bSAdrien Mazarguil 	return ibv_close_device(context);
744eba244bSAdrien Mazarguil }
754eba244bSAdrien Mazarguil 
764eba244bSAdrien Mazarguil static const char *
mlx4_glue_get_device_name(struct ibv_device * device)774eba244bSAdrien Mazarguil mlx4_glue_get_device_name(struct ibv_device *device)
784eba244bSAdrien Mazarguil {
794eba244bSAdrien Mazarguil 	return ibv_get_device_name(device);
804eba244bSAdrien Mazarguil }
814eba244bSAdrien Mazarguil 
824eba244bSAdrien Mazarguil static int
mlx4_glue_query_device(struct ibv_context * context,struct ibv_device_attr * device_attr)834eba244bSAdrien Mazarguil mlx4_glue_query_device(struct ibv_context *context,
844eba244bSAdrien Mazarguil 		       struct ibv_device_attr *device_attr)
854eba244bSAdrien Mazarguil {
864eba244bSAdrien Mazarguil 	return ibv_query_device(context, device_attr);
874eba244bSAdrien Mazarguil }
884eba244bSAdrien Mazarguil 
894eba244bSAdrien Mazarguil static int
mlx4_glue_query_device_ex(struct ibv_context * context,const struct ibv_query_device_ex_input * input,struct ibv_device_attr_ex * attr)904eba244bSAdrien Mazarguil mlx4_glue_query_device_ex(struct ibv_context *context,
914eba244bSAdrien Mazarguil 			  const struct ibv_query_device_ex_input *input,
924eba244bSAdrien Mazarguil 			  struct ibv_device_attr_ex *attr)
934eba244bSAdrien Mazarguil {
944eba244bSAdrien Mazarguil 	return ibv_query_device_ex(context, input, attr);
954eba244bSAdrien Mazarguil }
964eba244bSAdrien Mazarguil 
974eba244bSAdrien Mazarguil static int
mlx4_glue_query_port(struct ibv_context * context,uint8_t port_num,struct ibv_port_attr * port_attr)984eba244bSAdrien Mazarguil mlx4_glue_query_port(struct ibv_context *context, uint8_t port_num,
994eba244bSAdrien Mazarguil 		     struct ibv_port_attr *port_attr)
1004eba244bSAdrien Mazarguil {
1014eba244bSAdrien Mazarguil 	return ibv_query_port(context, port_num, port_attr);
1024eba244bSAdrien Mazarguil }
1034eba244bSAdrien Mazarguil 
1044eba244bSAdrien Mazarguil static const char *
mlx4_glue_port_state_str(enum ibv_port_state port_state)1054eba244bSAdrien Mazarguil mlx4_glue_port_state_str(enum ibv_port_state port_state)
1064eba244bSAdrien Mazarguil {
1074eba244bSAdrien Mazarguil 	return ibv_port_state_str(port_state);
1084eba244bSAdrien Mazarguil }
1094eba244bSAdrien Mazarguil 
1104eba244bSAdrien Mazarguil static struct ibv_comp_channel *
mlx4_glue_create_comp_channel(struct ibv_context * context)1114eba244bSAdrien Mazarguil mlx4_glue_create_comp_channel(struct ibv_context *context)
1124eba244bSAdrien Mazarguil {
1134eba244bSAdrien Mazarguil 	return ibv_create_comp_channel(context);
1144eba244bSAdrien Mazarguil }
1154eba244bSAdrien Mazarguil 
1164eba244bSAdrien Mazarguil static int
mlx4_glue_destroy_comp_channel(struct ibv_comp_channel * channel)1174eba244bSAdrien Mazarguil mlx4_glue_destroy_comp_channel(struct ibv_comp_channel *channel)
1184eba244bSAdrien Mazarguil {
1194eba244bSAdrien Mazarguil 	return ibv_destroy_comp_channel(channel);
1204eba244bSAdrien Mazarguil }
1214eba244bSAdrien Mazarguil 
1224eba244bSAdrien Mazarguil static struct ibv_cq *
mlx4_glue_create_cq(struct ibv_context * context,int cqe,void * cq_context,struct ibv_comp_channel * channel,int comp_vector)1234eba244bSAdrien Mazarguil mlx4_glue_create_cq(struct ibv_context *context, int cqe, void *cq_context,
1244eba244bSAdrien Mazarguil 		    struct ibv_comp_channel *channel, int comp_vector)
1254eba244bSAdrien Mazarguil {
1264eba244bSAdrien Mazarguil 	return ibv_create_cq(context, cqe, cq_context, channel, comp_vector);
1274eba244bSAdrien Mazarguil }
1284eba244bSAdrien Mazarguil 
1294eba244bSAdrien Mazarguil static int
mlx4_glue_destroy_cq(struct ibv_cq * cq)1304eba244bSAdrien Mazarguil mlx4_glue_destroy_cq(struct ibv_cq *cq)
1314eba244bSAdrien Mazarguil {
1324eba244bSAdrien Mazarguil 	return ibv_destroy_cq(cq);
1334eba244bSAdrien Mazarguil }
1344eba244bSAdrien Mazarguil 
1354eba244bSAdrien Mazarguil static int
mlx4_glue_get_cq_event(struct ibv_comp_channel * channel,struct ibv_cq ** cq,void ** cq_context)1364eba244bSAdrien Mazarguil mlx4_glue_get_cq_event(struct ibv_comp_channel *channel, struct ibv_cq **cq,
1374eba244bSAdrien Mazarguil 		       void **cq_context)
1384eba244bSAdrien Mazarguil {
1394eba244bSAdrien Mazarguil 	return ibv_get_cq_event(channel, cq, cq_context);
1404eba244bSAdrien Mazarguil }
1414eba244bSAdrien Mazarguil 
1424eba244bSAdrien Mazarguil static void
mlx4_glue_ack_cq_events(struct ibv_cq * cq,unsigned int nevents)1434eba244bSAdrien Mazarguil mlx4_glue_ack_cq_events(struct ibv_cq *cq, unsigned int nevents)
1444eba244bSAdrien Mazarguil {
1454eba244bSAdrien Mazarguil 	ibv_ack_cq_events(cq, nevents);
1464eba244bSAdrien Mazarguil }
1474eba244bSAdrien Mazarguil 
1484eba244bSAdrien Mazarguil static struct ibv_flow *
mlx4_glue_create_flow(struct ibv_qp * qp,struct ibv_flow_attr * flow)1494eba244bSAdrien Mazarguil mlx4_glue_create_flow(struct ibv_qp *qp, struct ibv_flow_attr *flow)
1504eba244bSAdrien Mazarguil {
1514eba244bSAdrien Mazarguil 	return ibv_create_flow(qp, flow);
1524eba244bSAdrien Mazarguil }
1534eba244bSAdrien Mazarguil 
1544eba244bSAdrien Mazarguil static int
mlx4_glue_destroy_flow(struct ibv_flow * flow_id)1554eba244bSAdrien Mazarguil mlx4_glue_destroy_flow(struct ibv_flow *flow_id)
1564eba244bSAdrien Mazarguil {
1574eba244bSAdrien Mazarguil 	return ibv_destroy_flow(flow_id);
1584eba244bSAdrien Mazarguil }
1594eba244bSAdrien Mazarguil 
1604eba244bSAdrien Mazarguil static struct ibv_qp *
mlx4_glue_create_qp(struct ibv_pd * pd,struct ibv_qp_init_attr * qp_init_attr)1614eba244bSAdrien Mazarguil mlx4_glue_create_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *qp_init_attr)
1624eba244bSAdrien Mazarguil {
1634eba244bSAdrien Mazarguil 	return ibv_create_qp(pd, qp_init_attr);
1644eba244bSAdrien Mazarguil }
1654eba244bSAdrien Mazarguil 
1664eba244bSAdrien Mazarguil static struct ibv_qp *
mlx4_glue_create_qp_ex(struct ibv_context * context,struct ibv_qp_init_attr_ex * qp_init_attr_ex)1674eba244bSAdrien Mazarguil mlx4_glue_create_qp_ex(struct ibv_context *context,
1684eba244bSAdrien Mazarguil 		       struct ibv_qp_init_attr_ex *qp_init_attr_ex)
1694eba244bSAdrien Mazarguil {
1704eba244bSAdrien Mazarguil 	return ibv_create_qp_ex(context, qp_init_attr_ex);
1714eba244bSAdrien Mazarguil }
1724eba244bSAdrien Mazarguil 
1734eba244bSAdrien Mazarguil static int
mlx4_glue_destroy_qp(struct ibv_qp * qp)1744eba244bSAdrien Mazarguil mlx4_glue_destroy_qp(struct ibv_qp *qp)
1754eba244bSAdrien Mazarguil {
1764eba244bSAdrien Mazarguil 	return ibv_destroy_qp(qp);
1774eba244bSAdrien Mazarguil }
1784eba244bSAdrien Mazarguil 
1794eba244bSAdrien Mazarguil static int
mlx4_glue_modify_qp(struct ibv_qp * qp,struct ibv_qp_attr * attr,int attr_mask)1804eba244bSAdrien Mazarguil mlx4_glue_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr, int attr_mask)
1814eba244bSAdrien Mazarguil {
1824eba244bSAdrien Mazarguil 	return ibv_modify_qp(qp, attr, attr_mask);
1834eba244bSAdrien Mazarguil }
1844eba244bSAdrien Mazarguil 
1854eba244bSAdrien Mazarguil static struct ibv_mr *
mlx4_glue_reg_mr(struct ibv_pd * pd,void * addr,size_t length,int access)1864eba244bSAdrien Mazarguil mlx4_glue_reg_mr(struct ibv_pd *pd, void *addr, size_t length, int access)
1874eba244bSAdrien Mazarguil {
1884eba244bSAdrien Mazarguil 	return ibv_reg_mr(pd, addr, length, access);
1894eba244bSAdrien Mazarguil }
1904eba244bSAdrien Mazarguil 
1914eba244bSAdrien Mazarguil static int
mlx4_glue_dereg_mr(struct ibv_mr * mr)1924eba244bSAdrien Mazarguil mlx4_glue_dereg_mr(struct ibv_mr *mr)
1934eba244bSAdrien Mazarguil {
1944eba244bSAdrien Mazarguil 	return ibv_dereg_mr(mr);
1954eba244bSAdrien Mazarguil }
1964eba244bSAdrien Mazarguil 
1974eba244bSAdrien Mazarguil static struct ibv_rwq_ind_table *
mlx4_glue_create_rwq_ind_table(struct ibv_context * context,struct ibv_rwq_ind_table_init_attr * init_attr)1984eba244bSAdrien Mazarguil mlx4_glue_create_rwq_ind_table(struct ibv_context *context,
1994eba244bSAdrien Mazarguil 			       struct ibv_rwq_ind_table_init_attr *init_attr)
2004eba244bSAdrien Mazarguil {
2014eba244bSAdrien Mazarguil 	return ibv_create_rwq_ind_table(context, init_attr);
2024eba244bSAdrien Mazarguil }
2034eba244bSAdrien Mazarguil 
2044eba244bSAdrien Mazarguil static int
mlx4_glue_destroy_rwq_ind_table(struct ibv_rwq_ind_table * rwq_ind_table)2054eba244bSAdrien Mazarguil mlx4_glue_destroy_rwq_ind_table(struct ibv_rwq_ind_table *rwq_ind_table)
2064eba244bSAdrien Mazarguil {
2074eba244bSAdrien Mazarguil 	return ibv_destroy_rwq_ind_table(rwq_ind_table);
2084eba244bSAdrien Mazarguil }
2094eba244bSAdrien Mazarguil 
2104eba244bSAdrien Mazarguil static struct ibv_wq *
mlx4_glue_create_wq(struct ibv_context * context,struct ibv_wq_init_attr * wq_init_attr)2114eba244bSAdrien Mazarguil mlx4_glue_create_wq(struct ibv_context *context,
2124eba244bSAdrien Mazarguil 		    struct ibv_wq_init_attr *wq_init_attr)
2134eba244bSAdrien Mazarguil {
2144eba244bSAdrien Mazarguil 	return ibv_create_wq(context, wq_init_attr);
2154eba244bSAdrien Mazarguil }
2164eba244bSAdrien Mazarguil 
2174eba244bSAdrien Mazarguil static int
mlx4_glue_destroy_wq(struct ibv_wq * wq)2184eba244bSAdrien Mazarguil mlx4_glue_destroy_wq(struct ibv_wq *wq)
2194eba244bSAdrien Mazarguil {
2204eba244bSAdrien Mazarguil 	return ibv_destroy_wq(wq);
2214eba244bSAdrien Mazarguil }
2224eba244bSAdrien Mazarguil static int
mlx4_glue_modify_wq(struct ibv_wq * wq,struct ibv_wq_attr * wq_attr)2234eba244bSAdrien Mazarguil mlx4_glue_modify_wq(struct ibv_wq *wq, struct ibv_wq_attr *wq_attr)
2244eba244bSAdrien Mazarguil {
2254eba244bSAdrien Mazarguil 	return ibv_modify_wq(wq, wq_attr);
2264eba244bSAdrien Mazarguil }
2274eba244bSAdrien Mazarguil 
2284eba244bSAdrien Mazarguil static int
mlx4_glue_dv_init_obj(struct mlx4dv_obj * obj,uint64_t obj_type)2294eba244bSAdrien Mazarguil mlx4_glue_dv_init_obj(struct mlx4dv_obj *obj, uint64_t obj_type)
2304eba244bSAdrien Mazarguil {
2314eba244bSAdrien Mazarguil 	return mlx4dv_init_obj(obj, obj_type);
2324eba244bSAdrien Mazarguil }
2334eba244bSAdrien Mazarguil 
2344eba244bSAdrien Mazarguil static int
mlx4_glue_dv_set_context_attr(struct ibv_context * context,enum mlx4dv_set_ctx_attr_type attr_type,void * attr)2354eba244bSAdrien Mazarguil mlx4_glue_dv_set_context_attr(struct ibv_context *context,
2364eba244bSAdrien Mazarguil 			      enum mlx4dv_set_ctx_attr_type attr_type,
2374eba244bSAdrien Mazarguil 			      void *attr)
2384eba244bSAdrien Mazarguil {
2394eba244bSAdrien Mazarguil 	return mlx4dv_set_context_attr(context, attr_type, attr);
2404eba244bSAdrien Mazarguil }
2414eba244bSAdrien Mazarguil 
2424eba244bSAdrien Mazarguil const struct mlx4_glue *mlx4_glue = &(const struct mlx4_glue){
2436d5df2eaSAdrien Mazarguil 	.version = MLX4_GLUE_VERSION,
2444eba244bSAdrien Mazarguil 	.fork_init = mlx4_glue_fork_init,
2454eba244bSAdrien Mazarguil 	.get_async_event = mlx4_glue_get_async_event,
2464eba244bSAdrien Mazarguil 	.ack_async_event = mlx4_glue_ack_async_event,
2474eba244bSAdrien Mazarguil 	.alloc_pd = mlx4_glue_alloc_pd,
2484eba244bSAdrien Mazarguil 	.dealloc_pd = mlx4_glue_dealloc_pd,
2494eba244bSAdrien Mazarguil 	.get_device_list = mlx4_glue_get_device_list,
2504eba244bSAdrien Mazarguil 	.free_device_list = mlx4_glue_free_device_list,
2514eba244bSAdrien Mazarguil 	.open_device = mlx4_glue_open_device,
2524eba244bSAdrien Mazarguil 	.close_device = mlx4_glue_close_device,
2534eba244bSAdrien Mazarguil 	.get_device_name = mlx4_glue_get_device_name,
2544eba244bSAdrien Mazarguil 	.query_device = mlx4_glue_query_device,
2554eba244bSAdrien Mazarguil 	.query_device_ex = mlx4_glue_query_device_ex,
2564eba244bSAdrien Mazarguil 	.query_port = mlx4_glue_query_port,
2574eba244bSAdrien Mazarguil 	.port_state_str = mlx4_glue_port_state_str,
2584eba244bSAdrien Mazarguil 	.create_comp_channel = mlx4_glue_create_comp_channel,
2594eba244bSAdrien Mazarguil 	.destroy_comp_channel = mlx4_glue_destroy_comp_channel,
2604eba244bSAdrien Mazarguil 	.create_cq = mlx4_glue_create_cq,
2614eba244bSAdrien Mazarguil 	.destroy_cq = mlx4_glue_destroy_cq,
2624eba244bSAdrien Mazarguil 	.get_cq_event = mlx4_glue_get_cq_event,
2634eba244bSAdrien Mazarguil 	.ack_cq_events = mlx4_glue_ack_cq_events,
2644eba244bSAdrien Mazarguil 	.create_flow = mlx4_glue_create_flow,
2654eba244bSAdrien Mazarguil 	.destroy_flow = mlx4_glue_destroy_flow,
2664eba244bSAdrien Mazarguil 	.create_qp = mlx4_glue_create_qp,
2674eba244bSAdrien Mazarguil 	.create_qp_ex = mlx4_glue_create_qp_ex,
2684eba244bSAdrien Mazarguil 	.destroy_qp = mlx4_glue_destroy_qp,
2694eba244bSAdrien Mazarguil 	.modify_qp = mlx4_glue_modify_qp,
2704eba244bSAdrien Mazarguil 	.reg_mr = mlx4_glue_reg_mr,
2714eba244bSAdrien Mazarguil 	.dereg_mr = mlx4_glue_dereg_mr,
2724eba244bSAdrien Mazarguil 	.create_rwq_ind_table = mlx4_glue_create_rwq_ind_table,
2734eba244bSAdrien Mazarguil 	.destroy_rwq_ind_table = mlx4_glue_destroy_rwq_ind_table,
2744eba244bSAdrien Mazarguil 	.create_wq = mlx4_glue_create_wq,
2754eba244bSAdrien Mazarguil 	.destroy_wq = mlx4_glue_destroy_wq,
2764eba244bSAdrien Mazarguil 	.modify_wq = mlx4_glue_modify_wq,
2774eba244bSAdrien Mazarguil 	.dv_init_obj = mlx4_glue_dv_init_obj,
2784eba244bSAdrien Mazarguil 	.dv_set_context_attr = mlx4_glue_dv_set_context_attr,
2794eba244bSAdrien Mazarguil };
280