xref: /dpdk/drivers/common/mlx5/linux/mlx5_glue.c (revision 6ebd062e0602f0571cf9abbe9eabd0e5f6ad0a39)
172f75660SOphir Munk /* SPDX-License-Identifier: BSD-3-Clause
272f75660SOphir Munk  * Copyright 2018 6WIND S.A.
372f75660SOphir Munk  * Copyright 2018 Mellanox Technologies, Ltd
472f75660SOphir Munk  */
572f75660SOphir Munk 
672f75660SOphir Munk #include <errno.h>
772f75660SOphir Munk #include <stdalign.h>
872f75660SOphir Munk #include <stddef.h>
972f75660SOphir Munk #include <stdint.h>
1072f75660SOphir Munk #include <stdlib.h>
1172f75660SOphir Munk /*
1272f75660SOphir Munk  * Not needed by this file; included to work around the lack of off_t
1372f75660SOphir Munk  * definition for mlx5dv.h with unpatched rdma-core versions.
1472f75660SOphir Munk  */
1572f75660SOphir Munk #include <sys/types.h>
1672f75660SOphir Munk 
1772f75660SOphir Munk #include "mlx5_glue.h"
1872f75660SOphir Munk 
1972f75660SOphir Munk static int
2072f75660SOphir Munk mlx5_glue_fork_init(void)
2172f75660SOphir Munk {
2272f75660SOphir Munk 	return ibv_fork_init();
2372f75660SOphir Munk }
2472f75660SOphir Munk 
2572f75660SOphir Munk static struct ibv_pd *
2672f75660SOphir Munk mlx5_glue_alloc_pd(struct ibv_context *context)
2772f75660SOphir Munk {
2872f75660SOphir Munk 	return ibv_alloc_pd(context);
2972f75660SOphir Munk }
3072f75660SOphir Munk 
3172f75660SOphir Munk static int
3272f75660SOphir Munk mlx5_glue_dealloc_pd(struct ibv_pd *pd)
3372f75660SOphir Munk {
3472f75660SOphir Munk 	return ibv_dealloc_pd(pd);
3572f75660SOphir Munk }
3672f75660SOphir Munk 
3772f75660SOphir Munk static struct ibv_device **
3872f75660SOphir Munk mlx5_glue_get_device_list(int *num_devices)
3972f75660SOphir Munk {
4072f75660SOphir Munk 	return ibv_get_device_list(num_devices);
4172f75660SOphir Munk }
4272f75660SOphir Munk 
4372f75660SOphir Munk static void
4472f75660SOphir Munk mlx5_glue_free_device_list(struct ibv_device **list)
4572f75660SOphir Munk {
4672f75660SOphir Munk 	ibv_free_device_list(list);
4772f75660SOphir Munk }
4872f75660SOphir Munk 
4972f75660SOphir Munk static struct ibv_context *
5072f75660SOphir Munk mlx5_glue_open_device(struct ibv_device *device)
5172f75660SOphir Munk {
5272f75660SOphir Munk 	return ibv_open_device(device);
5372f75660SOphir Munk }
5472f75660SOphir Munk 
5572f75660SOphir Munk static int
5672f75660SOphir Munk mlx5_glue_close_device(struct ibv_context *context)
5772f75660SOphir Munk {
5872f75660SOphir Munk 	return ibv_close_device(context);
5972f75660SOphir Munk }
6072f75660SOphir Munk 
6172f75660SOphir Munk static int
6272f75660SOphir Munk mlx5_glue_query_device(struct ibv_context *context,
6372f75660SOphir Munk 		       struct ibv_device_attr *device_attr)
6472f75660SOphir Munk {
6572f75660SOphir Munk 	return ibv_query_device(context, device_attr);
6672f75660SOphir Munk }
6772f75660SOphir Munk 
6872f75660SOphir Munk static int
6972f75660SOphir Munk mlx5_glue_query_device_ex(struct ibv_context *context,
7072f75660SOphir Munk 			  const struct ibv_query_device_ex_input *input,
7172f75660SOphir Munk 			  struct ibv_device_attr_ex *attr)
7272f75660SOphir Munk {
7372f75660SOphir Munk 	return ibv_query_device_ex(context, input, attr);
7472f75660SOphir Munk }
7572f75660SOphir Munk 
7672f75660SOphir Munk static int
7772f75660SOphir Munk mlx5_glue_query_rt_values_ex(struct ibv_context *context,
7872f75660SOphir Munk 			  struct ibv_values_ex *values)
7972f75660SOphir Munk {
8072f75660SOphir Munk 	return ibv_query_rt_values_ex(context, values);
8172f75660SOphir Munk }
8272f75660SOphir Munk 
8372f75660SOphir Munk static int
8472f75660SOphir Munk mlx5_glue_query_port(struct ibv_context *context, uint8_t port_num,
8572f75660SOphir Munk 		     struct ibv_port_attr *port_attr)
8672f75660SOphir Munk {
8772f75660SOphir Munk 	return ibv_query_port(context, port_num, port_attr);
8872f75660SOphir Munk }
8972f75660SOphir Munk 
9072f75660SOphir Munk static struct ibv_comp_channel *
9172f75660SOphir Munk mlx5_glue_create_comp_channel(struct ibv_context *context)
9272f75660SOphir Munk {
9372f75660SOphir Munk 	return ibv_create_comp_channel(context);
9472f75660SOphir Munk }
9572f75660SOphir Munk 
9672f75660SOphir Munk static int
9772f75660SOphir Munk mlx5_glue_destroy_comp_channel(struct ibv_comp_channel *channel)
9872f75660SOphir Munk {
9972f75660SOphir Munk 	return ibv_destroy_comp_channel(channel);
10072f75660SOphir Munk }
10172f75660SOphir Munk 
10272f75660SOphir Munk static struct ibv_cq *
10372f75660SOphir Munk mlx5_glue_create_cq(struct ibv_context *context, int cqe, void *cq_context,
10472f75660SOphir Munk 		    struct ibv_comp_channel *channel, int comp_vector)
10572f75660SOphir Munk {
10672f75660SOphir Munk 	return ibv_create_cq(context, cqe, cq_context, channel, comp_vector);
10772f75660SOphir Munk }
10872f75660SOphir Munk 
10972f75660SOphir Munk static int
11072f75660SOphir Munk mlx5_glue_destroy_cq(struct ibv_cq *cq)
11172f75660SOphir Munk {
11272f75660SOphir Munk 	return ibv_destroy_cq(cq);
11372f75660SOphir Munk }
11472f75660SOphir Munk 
11572f75660SOphir Munk static int
11672f75660SOphir Munk mlx5_glue_get_cq_event(struct ibv_comp_channel *channel, struct ibv_cq **cq,
11772f75660SOphir Munk 		       void **cq_context)
11872f75660SOphir Munk {
11972f75660SOphir Munk 	return ibv_get_cq_event(channel, cq, cq_context);
12072f75660SOphir Munk }
12172f75660SOphir Munk 
12272f75660SOphir Munk static void
12372f75660SOphir Munk mlx5_glue_ack_cq_events(struct ibv_cq *cq, unsigned int nevents)
12472f75660SOphir Munk {
12572f75660SOphir Munk 	ibv_ack_cq_events(cq, nevents);
12672f75660SOphir Munk }
12772f75660SOphir Munk 
12872f75660SOphir Munk static struct ibv_rwq_ind_table *
12972f75660SOphir Munk mlx5_glue_create_rwq_ind_table(struct ibv_context *context,
13072f75660SOphir Munk 			       struct ibv_rwq_ind_table_init_attr *init_attr)
13172f75660SOphir Munk {
13272f75660SOphir Munk 	return ibv_create_rwq_ind_table(context, init_attr);
13372f75660SOphir Munk }
13472f75660SOphir Munk 
13572f75660SOphir Munk static int
13672f75660SOphir Munk mlx5_glue_destroy_rwq_ind_table(struct ibv_rwq_ind_table *rwq_ind_table)
13772f75660SOphir Munk {
13872f75660SOphir Munk 	return ibv_destroy_rwq_ind_table(rwq_ind_table);
13972f75660SOphir Munk }
14072f75660SOphir Munk 
14172f75660SOphir Munk static struct ibv_wq *
14272f75660SOphir Munk mlx5_glue_create_wq(struct ibv_context *context,
14372f75660SOphir Munk 		    struct ibv_wq_init_attr *wq_init_attr)
14472f75660SOphir Munk {
14572f75660SOphir Munk 	return ibv_create_wq(context, wq_init_attr);
14672f75660SOphir Munk }
14772f75660SOphir Munk 
14872f75660SOphir Munk static int
14972f75660SOphir Munk mlx5_glue_destroy_wq(struct ibv_wq *wq)
15072f75660SOphir Munk {
15172f75660SOphir Munk 	return ibv_destroy_wq(wq);
15272f75660SOphir Munk }
15372f75660SOphir Munk static int
15472f75660SOphir Munk mlx5_glue_modify_wq(struct ibv_wq *wq, struct ibv_wq_attr *wq_attr)
15572f75660SOphir Munk {
15672f75660SOphir Munk 	return ibv_modify_wq(wq, wq_attr);
15772f75660SOphir Munk }
15872f75660SOphir Munk 
15972f75660SOphir Munk static struct ibv_flow *
16072f75660SOphir Munk mlx5_glue_create_flow(struct ibv_qp *qp, struct ibv_flow_attr *flow)
16172f75660SOphir Munk {
16272f75660SOphir Munk 	return ibv_create_flow(qp, flow);
16372f75660SOphir Munk }
16472f75660SOphir Munk 
16572f75660SOphir Munk static int
16672f75660SOphir Munk mlx5_glue_destroy_flow(struct ibv_flow *flow_id)
16772f75660SOphir Munk {
16872f75660SOphir Munk 	return ibv_destroy_flow(flow_id);
16972f75660SOphir Munk }
17072f75660SOphir Munk 
17172f75660SOphir Munk static int
17272f75660SOphir Munk mlx5_glue_destroy_flow_action(void *action)
17372f75660SOphir Munk {
17472f75660SOphir Munk #ifdef HAVE_IBV_FLOW_DV_SUPPORT
17572f75660SOphir Munk #ifdef HAVE_MLX5DV_DR
17672f75660SOphir Munk 	return mlx5dv_dr_action_destroy(action);
17772f75660SOphir Munk #else
17872f75660SOphir Munk 	struct mlx5dv_flow_action_attr *attr = action;
17972f75660SOphir Munk 	int res = 0;
18072f75660SOphir Munk 	switch (attr->type) {
18172f75660SOphir Munk 	case MLX5DV_FLOW_ACTION_TAG:
18272f75660SOphir Munk 		break;
18372f75660SOphir Munk 	default:
18472f75660SOphir Munk 		res = ibv_destroy_flow_action(attr->action);
18572f75660SOphir Munk 		break;
18672f75660SOphir Munk 	}
187cdb034a8SOphir Munk 	free(action);
18872f75660SOphir Munk 	return res;
18972f75660SOphir Munk #endif
19072f75660SOphir Munk #else
19172f75660SOphir Munk 	(void)action;
19272f75660SOphir Munk 	return -ENOTSUP;
19372f75660SOphir Munk #endif
19472f75660SOphir Munk }
19572f75660SOphir Munk 
19672f75660SOphir Munk static struct ibv_qp *
19772f75660SOphir Munk mlx5_glue_create_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *qp_init_attr)
19872f75660SOphir Munk {
19972f75660SOphir Munk 	return ibv_create_qp(pd, qp_init_attr);
20072f75660SOphir Munk }
20172f75660SOphir Munk 
20272f75660SOphir Munk static struct ibv_qp *
20372f75660SOphir Munk mlx5_glue_create_qp_ex(struct ibv_context *context,
20472f75660SOphir Munk 		       struct ibv_qp_init_attr_ex *qp_init_attr_ex)
20572f75660SOphir Munk {
20672f75660SOphir Munk 	return ibv_create_qp_ex(context, qp_init_attr_ex);
20772f75660SOphir Munk }
20872f75660SOphir Munk 
20972f75660SOphir Munk static int
21072f75660SOphir Munk mlx5_glue_destroy_qp(struct ibv_qp *qp)
21172f75660SOphir Munk {
21272f75660SOphir Munk 	return ibv_destroy_qp(qp);
21372f75660SOphir Munk }
21472f75660SOphir Munk 
21572f75660SOphir Munk static int
21672f75660SOphir Munk mlx5_glue_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr, int attr_mask)
21772f75660SOphir Munk {
21872f75660SOphir Munk 	return ibv_modify_qp(qp, attr, attr_mask);
21972f75660SOphir Munk }
22072f75660SOphir Munk 
22172f75660SOphir Munk static struct ibv_mr *
22272f75660SOphir Munk mlx5_glue_reg_mr(struct ibv_pd *pd, void *addr, size_t length, int access)
22372f75660SOphir Munk {
22472f75660SOphir Munk 	return ibv_reg_mr(pd, addr, length, access);
22572f75660SOphir Munk }
22672f75660SOphir Munk 
22772f75660SOphir Munk static struct ibv_mr *
228*6ebd062eSMichael Baum mlx5_glue_reg_mr_iova(struct ibv_pd *pd, void *addr, size_t length,
229*6ebd062eSMichael Baum 		      uint64_t iova, int access)
230*6ebd062eSMichael Baum {
231*6ebd062eSMichael Baum #ifdef HAVE_MLX5_IBV_REG_MR_IOVA
232*6ebd062eSMichael Baum 		return ibv_reg_mr_iova(pd, addr, length, iova, access);
233*6ebd062eSMichael Baum #else
234*6ebd062eSMichael Baum 	(void)pd;
235*6ebd062eSMichael Baum 	(void)addr;
236*6ebd062eSMichael Baum 	(void)length;
237*6ebd062eSMichael Baum 	(void)iova;
238*6ebd062eSMichael Baum 	(void)access;
239*6ebd062eSMichael Baum 	errno = ENOTSUP;
240*6ebd062eSMichael Baum 	return NULL;
241*6ebd062eSMichael Baum #endif
242*6ebd062eSMichael Baum }
243*6ebd062eSMichael Baum 
244*6ebd062eSMichael Baum static struct ibv_mr *
24572f75660SOphir Munk mlx5_glue_alloc_null_mr(struct ibv_pd *pd)
24672f75660SOphir Munk {
24772f75660SOphir Munk #ifdef HAVE_IBV_DEVX_OBJ
24872f75660SOphir Munk 	return ibv_alloc_null_mr(pd);
24972f75660SOphir Munk #else
25072f75660SOphir Munk 	(void)pd;
25172f75660SOphir Munk 	errno = ENOTSUP;
25272f75660SOphir Munk 	return NULL;
25372f75660SOphir Munk #endif
25472f75660SOphir Munk }
25572f75660SOphir Munk 
25672f75660SOphir Munk static int
25772f75660SOphir Munk mlx5_glue_dereg_mr(struct ibv_mr *mr)
25872f75660SOphir Munk {
25972f75660SOphir Munk 	return ibv_dereg_mr(mr);
26072f75660SOphir Munk }
26172f75660SOphir Munk 
26272f75660SOphir Munk static struct ibv_counter_set *
26372f75660SOphir Munk mlx5_glue_create_counter_set(struct ibv_context *context,
26472f75660SOphir Munk 			     struct ibv_counter_set_init_attr *init_attr)
26572f75660SOphir Munk {
26672f75660SOphir Munk #ifndef HAVE_IBV_DEVICE_COUNTERS_SET_V42
26772f75660SOphir Munk 	(void)context;
26872f75660SOphir Munk 	(void)init_attr;
26972f75660SOphir Munk 	return NULL;
27072f75660SOphir Munk #else
27172f75660SOphir Munk 	return ibv_create_counter_set(context, init_attr);
27272f75660SOphir Munk #endif
27372f75660SOphir Munk }
27472f75660SOphir Munk 
27572f75660SOphir Munk static int
27672f75660SOphir Munk mlx5_glue_destroy_counter_set(struct ibv_counter_set *cs)
27772f75660SOphir Munk {
27872f75660SOphir Munk #ifndef HAVE_IBV_DEVICE_COUNTERS_SET_V42
27972f75660SOphir Munk 	(void)cs;
28072f75660SOphir Munk 	return -ENOTSUP;
28172f75660SOphir Munk #else
28272f75660SOphir Munk 	return ibv_destroy_counter_set(cs);
28372f75660SOphir Munk #endif
28472f75660SOphir Munk }
28572f75660SOphir Munk 
28672f75660SOphir Munk static int
28772f75660SOphir Munk mlx5_glue_describe_counter_set(struct ibv_context *context,
28872f75660SOphir Munk 			       uint16_t counter_set_id,
28972f75660SOphir Munk 			       struct ibv_counter_set_description *cs_desc)
29072f75660SOphir Munk {
29172f75660SOphir Munk #ifndef HAVE_IBV_DEVICE_COUNTERS_SET_V42
29272f75660SOphir Munk 	(void)context;
29372f75660SOphir Munk 	(void)counter_set_id;
29472f75660SOphir Munk 	(void)cs_desc;
29572f75660SOphir Munk 	return -ENOTSUP;
29672f75660SOphir Munk #else
29772f75660SOphir Munk 	return ibv_describe_counter_set(context, counter_set_id, cs_desc);
29872f75660SOphir Munk #endif
29972f75660SOphir Munk }
30072f75660SOphir Munk 
30172f75660SOphir Munk static int
30272f75660SOphir Munk mlx5_glue_query_counter_set(struct ibv_query_counter_set_attr *query_attr,
30372f75660SOphir Munk 			    struct ibv_counter_set_data *cs_data)
30472f75660SOphir Munk {
30572f75660SOphir Munk #ifndef HAVE_IBV_DEVICE_COUNTERS_SET_V42
30672f75660SOphir Munk 	(void)query_attr;
30772f75660SOphir Munk 	(void)cs_data;
30872f75660SOphir Munk 	return -ENOTSUP;
30972f75660SOphir Munk #else
31072f75660SOphir Munk 	return ibv_query_counter_set(query_attr, cs_data);
31172f75660SOphir Munk #endif
31272f75660SOphir Munk }
31372f75660SOphir Munk 
31472f75660SOphir Munk static struct ibv_counters *
31572f75660SOphir Munk mlx5_glue_create_counters(struct ibv_context *context,
31672f75660SOphir Munk 			  struct ibv_counters_init_attr *init_attr)
31772f75660SOphir Munk {
31872f75660SOphir Munk #ifndef HAVE_IBV_DEVICE_COUNTERS_SET_V45
31972f75660SOphir Munk 	(void)context;
32072f75660SOphir Munk 	(void)init_attr;
32172f75660SOphir Munk 	errno = ENOTSUP;
32272f75660SOphir Munk 	return NULL;
32372f75660SOphir Munk #else
32472f75660SOphir Munk 	return ibv_create_counters(context, init_attr);
32572f75660SOphir Munk #endif
32672f75660SOphir Munk }
32772f75660SOphir Munk 
32872f75660SOphir Munk static int
32972f75660SOphir Munk mlx5_glue_destroy_counters(struct ibv_counters *counters)
33072f75660SOphir Munk {
33172f75660SOphir Munk #ifndef HAVE_IBV_DEVICE_COUNTERS_SET_V45
33272f75660SOphir Munk 	(void)counters;
33372f75660SOphir Munk 	return -ENOTSUP;
33472f75660SOphir Munk #else
33572f75660SOphir Munk 	return ibv_destroy_counters(counters);
33672f75660SOphir Munk #endif
33772f75660SOphir Munk }
33872f75660SOphir Munk 
33972f75660SOphir Munk static int
34072f75660SOphir Munk mlx5_glue_attach_counters(struct ibv_counters *counters,
34172f75660SOphir Munk 			  struct ibv_counter_attach_attr *attr,
34272f75660SOphir Munk 			  struct ibv_flow *flow)
34372f75660SOphir Munk {
34472f75660SOphir Munk #ifndef HAVE_IBV_DEVICE_COUNTERS_SET_V45
34572f75660SOphir Munk 	(void)counters;
34672f75660SOphir Munk 	(void)attr;
34772f75660SOphir Munk 	(void)flow;
34872f75660SOphir Munk 	return -ENOTSUP;
34972f75660SOphir Munk #else
35072f75660SOphir Munk 	return ibv_attach_counters_point_flow(counters, attr, flow);
35172f75660SOphir Munk #endif
35272f75660SOphir Munk }
35372f75660SOphir Munk 
35472f75660SOphir Munk static int
35572f75660SOphir Munk mlx5_glue_query_counters(struct ibv_counters *counters,
35672f75660SOphir Munk 			 uint64_t *counters_value,
35772f75660SOphir Munk 			 uint32_t ncounters,
35872f75660SOphir Munk 			 uint32_t flags)
35972f75660SOphir Munk {
36072f75660SOphir Munk #ifndef HAVE_IBV_DEVICE_COUNTERS_SET_V45
36172f75660SOphir Munk 	(void)counters;
36272f75660SOphir Munk 	(void)counters_value;
36372f75660SOphir Munk 	(void)ncounters;
36472f75660SOphir Munk 	(void)flags;
36572f75660SOphir Munk 	return -ENOTSUP;
36672f75660SOphir Munk #else
36772f75660SOphir Munk 	return ibv_read_counters(counters, counters_value, ncounters, flags);
36872f75660SOphir Munk #endif
36972f75660SOphir Munk }
37072f75660SOphir Munk 
37172f75660SOphir Munk static void
37272f75660SOphir Munk mlx5_glue_ack_async_event(struct ibv_async_event *event)
37372f75660SOphir Munk {
37472f75660SOphir Munk 	ibv_ack_async_event(event);
37572f75660SOphir Munk }
37672f75660SOphir Munk 
37772f75660SOphir Munk static int
37872f75660SOphir Munk mlx5_glue_get_async_event(struct ibv_context *context,
37972f75660SOphir Munk 			  struct ibv_async_event *event)
38072f75660SOphir Munk {
38172f75660SOphir Munk 	return ibv_get_async_event(context, event);
38272f75660SOphir Munk }
38372f75660SOphir Munk 
38472f75660SOphir Munk static const char *
38572f75660SOphir Munk mlx5_glue_port_state_str(enum ibv_port_state port_state)
38672f75660SOphir Munk {
38772f75660SOphir Munk 	return ibv_port_state_str(port_state);
38872f75660SOphir Munk }
38972f75660SOphir Munk 
39072f75660SOphir Munk static struct ibv_cq *
39172f75660SOphir Munk mlx5_glue_cq_ex_to_cq(struct ibv_cq_ex *cq)
39272f75660SOphir Munk {
39372f75660SOphir Munk 	return ibv_cq_ex_to_cq(cq);
39472f75660SOphir Munk }
39572f75660SOphir Munk 
39672f75660SOphir Munk static void *
39772f75660SOphir Munk mlx5_glue_dr_create_flow_action_dest_flow_tbl(void *tbl)
39872f75660SOphir Munk {
39972f75660SOphir Munk #ifdef HAVE_MLX5DV_DR
40072f75660SOphir Munk 	return mlx5dv_dr_action_create_dest_table(tbl);
40172f75660SOphir Munk #else
40272f75660SOphir Munk 	(void)tbl;
40372f75660SOphir Munk 	errno = ENOTSUP;
40472f75660SOphir Munk 	return NULL;
40572f75660SOphir Munk #endif
40672f75660SOphir Munk }
40772f75660SOphir Munk 
40872f75660SOphir Munk static void *
40972f75660SOphir Munk mlx5_glue_dr_create_flow_action_dest_port(void *domain, uint32_t port)
41072f75660SOphir Munk {
4110fd928bbSViacheslav Ovsiienko #ifdef HAVE_MLX5DV_DR_CREATE_DEST_IB_PORT
41272f75660SOphir Munk 	return mlx5dv_dr_action_create_dest_ib_port(domain, port);
41372f75660SOphir Munk #else
41472f75660SOphir Munk #ifdef HAVE_MLX5DV_DR_ESWITCH
41572f75660SOphir Munk 	return mlx5dv_dr_action_create_dest_vport(domain, port);
41672f75660SOphir Munk #else
41772f75660SOphir Munk 	(void)domain;
41872f75660SOphir Munk 	(void)port;
41972f75660SOphir Munk 	errno = ENOTSUP;
42072f75660SOphir Munk 	return NULL;
42172f75660SOphir Munk #endif
42272f75660SOphir Munk #endif
42372f75660SOphir Munk }
42472f75660SOphir Munk 
42572f75660SOphir Munk static void *
42672f75660SOphir Munk mlx5_glue_dr_create_flow_action_drop(void)
42772f75660SOphir Munk {
42872f75660SOphir Munk #ifdef HAVE_MLX5DV_DR_ESWITCH
42972f75660SOphir Munk 	return mlx5dv_dr_action_create_drop();
43072f75660SOphir Munk #else
43172f75660SOphir Munk 	errno = ENOTSUP;
43272f75660SOphir Munk 	return NULL;
43372f75660SOphir Munk #endif
43472f75660SOphir Munk }
43572f75660SOphir Munk 
43672f75660SOphir Munk static void *
43772f75660SOphir Munk mlx5_glue_dr_create_flow_action_push_vlan(struct mlx5dv_dr_domain *domain,
43872f75660SOphir Munk 					  rte_be32_t vlan_tag)
43972f75660SOphir Munk {
44072f75660SOphir Munk #ifdef HAVE_MLX5DV_DR_VLAN
44172f75660SOphir Munk 	return mlx5dv_dr_action_create_push_vlan(domain, vlan_tag);
44272f75660SOphir Munk #else
44372f75660SOphir Munk 	(void)domain;
44472f75660SOphir Munk 	(void)vlan_tag;
44572f75660SOphir Munk 	errno = ENOTSUP;
44672f75660SOphir Munk 	return NULL;
44772f75660SOphir Munk #endif
44872f75660SOphir Munk }
44972f75660SOphir Munk 
45072f75660SOphir Munk static void *
45172f75660SOphir Munk mlx5_glue_dr_create_flow_action_pop_vlan(void)
45272f75660SOphir Munk {
45372f75660SOphir Munk #ifdef HAVE_MLX5DV_DR_VLAN
45472f75660SOphir Munk 	return mlx5dv_dr_action_create_pop_vlan();
45572f75660SOphir Munk #else
45672f75660SOphir Munk 	errno = ENOTSUP;
45772f75660SOphir Munk 	return NULL;
45872f75660SOphir Munk #endif
45972f75660SOphir Munk }
46072f75660SOphir Munk 
46172f75660SOphir Munk static void *
46272f75660SOphir Munk mlx5_glue_dr_create_flow_tbl(void *domain, uint32_t level)
46372f75660SOphir Munk {
46472f75660SOphir Munk #ifdef HAVE_MLX5DV_DR
46572f75660SOphir Munk 	return mlx5dv_dr_table_create(domain, level);
46672f75660SOphir Munk #else
46772f75660SOphir Munk 	(void)domain;
46872f75660SOphir Munk 	(void)level;
46972f75660SOphir Munk 	errno = ENOTSUP;
47072f75660SOphir Munk 	return NULL;
47172f75660SOphir Munk #endif
47272f75660SOphir Munk }
47372f75660SOphir Munk 
47472f75660SOphir Munk static int
47572f75660SOphir Munk mlx5_glue_dr_destroy_flow_tbl(void *tbl)
47672f75660SOphir Munk {
47772f75660SOphir Munk #ifdef HAVE_MLX5DV_DR
47872f75660SOphir Munk 	return mlx5dv_dr_table_destroy(tbl);
47972f75660SOphir Munk #else
48072f75660SOphir Munk 	(void)tbl;
48172f75660SOphir Munk 	errno = ENOTSUP;
48272f75660SOphir Munk 	return errno;
48372f75660SOphir Munk #endif
48472f75660SOphir Munk }
48572f75660SOphir Munk 
48672f75660SOphir Munk static void *
48772f75660SOphir Munk mlx5_glue_dr_create_domain(struct ibv_context *ctx,
48872f75660SOphir Munk 			   enum  mlx5dv_dr_domain_type domain)
48972f75660SOphir Munk {
49072f75660SOphir Munk #ifdef HAVE_MLX5DV_DR
49172f75660SOphir Munk 	return mlx5dv_dr_domain_create(ctx, domain);
49272f75660SOphir Munk #else
49372f75660SOphir Munk 	(void)ctx;
49472f75660SOphir Munk 	(void)domain;
49572f75660SOphir Munk 	errno = ENOTSUP;
49672f75660SOphir Munk 	return NULL;
49772f75660SOphir Munk #endif
49872f75660SOphir Munk }
49972f75660SOphir Munk 
50072f75660SOphir Munk static int
50172f75660SOphir Munk mlx5_glue_dr_destroy_domain(void *domain)
50272f75660SOphir Munk {
50372f75660SOphir Munk #ifdef HAVE_MLX5DV_DR
50472f75660SOphir Munk 	return mlx5dv_dr_domain_destroy(domain);
50572f75660SOphir Munk #else
50672f75660SOphir Munk 	(void)domain;
50772f75660SOphir Munk 	errno = ENOTSUP;
50872f75660SOphir Munk 	return errno;
50972f75660SOphir Munk #endif
51072f75660SOphir Munk }
51172f75660SOphir Munk 
5126e0cd74aSBing Zhao static int
5136e0cd74aSBing Zhao mlx5_glue_dr_sync_domain(void *domain, uint32_t flags)
5146e0cd74aSBing Zhao {
5156e0cd74aSBing Zhao #ifdef HAVE_MLX5DV_DR
5166e0cd74aSBing Zhao 	return mlx5dv_dr_domain_sync(domain, flags);
5176e0cd74aSBing Zhao #else
5186e0cd74aSBing Zhao 	(void)domain;
5196e0cd74aSBing Zhao 	(void)flags;
5206e0cd74aSBing Zhao 	errno = ENOTSUP;
5216e0cd74aSBing Zhao 	return errno;
5226e0cd74aSBing Zhao #endif
5236e0cd74aSBing Zhao }
5246e0cd74aSBing Zhao 
52572f75660SOphir Munk static struct ibv_cq_ex *
52672f75660SOphir Munk mlx5_glue_dv_create_cq(struct ibv_context *context,
52772f75660SOphir Munk 		       struct ibv_cq_init_attr_ex *cq_attr,
52872f75660SOphir Munk 		       struct mlx5dv_cq_init_attr *mlx5_cq_attr)
52972f75660SOphir Munk {
53072f75660SOphir Munk 	return mlx5dv_create_cq(context, cq_attr, mlx5_cq_attr);
53172f75660SOphir Munk }
53272f75660SOphir Munk 
53372f75660SOphir Munk static struct ibv_wq *
53472f75660SOphir Munk mlx5_glue_dv_create_wq(struct ibv_context *context,
53572f75660SOphir Munk 		       struct ibv_wq_init_attr *wq_attr,
53672f75660SOphir Munk 		       struct mlx5dv_wq_init_attr *mlx5_wq_attr)
53772f75660SOphir Munk {
53872f75660SOphir Munk #ifndef HAVE_IBV_DEVICE_STRIDING_RQ_SUPPORT
53972f75660SOphir Munk 	(void)context;
54072f75660SOphir Munk 	(void)wq_attr;
54172f75660SOphir Munk 	(void)mlx5_wq_attr;
54272f75660SOphir Munk 	errno = ENOTSUP;
54372f75660SOphir Munk 	return NULL;
54472f75660SOphir Munk #else
54572f75660SOphir Munk 	return mlx5dv_create_wq(context, wq_attr, mlx5_wq_attr);
54672f75660SOphir Munk #endif
54772f75660SOphir Munk }
54872f75660SOphir Munk 
54972f75660SOphir Munk static int
55072f75660SOphir Munk mlx5_glue_dv_query_device(struct ibv_context *ctx,
55172f75660SOphir Munk 			  struct mlx5dv_context *attrs_out)
55272f75660SOphir Munk {
55372f75660SOphir Munk 	return mlx5dv_query_device(ctx, attrs_out);
55472f75660SOphir Munk }
55572f75660SOphir Munk 
55672f75660SOphir Munk static int
55772f75660SOphir Munk mlx5_glue_dv_set_context_attr(struct ibv_context *ibv_ctx,
55872f75660SOphir Munk 			      enum mlx5dv_set_ctx_attr_type type, void *attr)
55972f75660SOphir Munk {
56072f75660SOphir Munk 	return mlx5dv_set_context_attr(ibv_ctx, type, attr);
56172f75660SOphir Munk }
56272f75660SOphir Munk 
56372f75660SOphir Munk static int
56472f75660SOphir Munk mlx5_glue_dv_init_obj(struct mlx5dv_obj *obj, uint64_t obj_type)
56572f75660SOphir Munk {
56672f75660SOphir Munk 	return mlx5dv_init_obj(obj, obj_type);
56772f75660SOphir Munk }
56872f75660SOphir Munk 
56972f75660SOphir Munk static struct ibv_qp *
57072f75660SOphir Munk mlx5_glue_dv_create_qp(struct ibv_context *context,
57172f75660SOphir Munk 		       struct ibv_qp_init_attr_ex *qp_init_attr_ex,
57272f75660SOphir Munk 		       struct mlx5dv_qp_init_attr *dv_qp_init_attr)
57372f75660SOphir Munk {
57472f75660SOphir Munk #ifdef HAVE_IBV_DEVICE_TUNNEL_SUPPORT
57572f75660SOphir Munk 	return mlx5dv_create_qp(context, qp_init_attr_ex, dv_qp_init_attr);
57672f75660SOphir Munk #else
57772f75660SOphir Munk 	(void)context;
57872f75660SOphir Munk 	(void)qp_init_attr_ex;
57972f75660SOphir Munk 	(void)dv_qp_init_attr;
58072f75660SOphir Munk 	errno = ENOTSUP;
58172f75660SOphir Munk 	return NULL;
58272f75660SOphir Munk #endif
58372f75660SOphir Munk }
58472f75660SOphir Munk 
58572f75660SOphir Munk static void *
58672f75660SOphir Munk mlx5_glue_dv_create_flow_matcher(struct ibv_context *context,
58772f75660SOphir Munk 				 struct mlx5dv_flow_matcher_attr *matcher_attr,
58872f75660SOphir Munk 				 void *tbl)
58972f75660SOphir Munk {
59072f75660SOphir Munk #ifdef HAVE_IBV_FLOW_DV_SUPPORT
59172f75660SOphir Munk #ifdef HAVE_MLX5DV_DR
59272f75660SOphir Munk 	(void)context;
59372f75660SOphir Munk 	return mlx5dv_dr_matcher_create(tbl, matcher_attr->priority,
59472f75660SOphir Munk 					matcher_attr->match_criteria_enable,
59572f75660SOphir Munk 					matcher_attr->match_mask);
59672f75660SOphir Munk #else
59772f75660SOphir Munk 	(void)tbl;
59872f75660SOphir Munk 	return mlx5dv_create_flow_matcher(context, matcher_attr);
59972f75660SOphir Munk #endif
60072f75660SOphir Munk #else
60172f75660SOphir Munk 	(void)context;
60272f75660SOphir Munk 	(void)matcher_attr;
60372f75660SOphir Munk 	(void)tbl;
60472f75660SOphir Munk 	errno = ENOTSUP;
60572f75660SOphir Munk 	return NULL;
60672f75660SOphir Munk #endif
60772f75660SOphir Munk }
60872f75660SOphir Munk 
60972f75660SOphir Munk static void *
61072f75660SOphir Munk mlx5_glue_dv_create_flow(void *matcher,
61172f75660SOphir Munk 			 void *match_value,
61272f75660SOphir Munk 			 size_t num_actions,
61372f75660SOphir Munk 			 void *actions[])
61472f75660SOphir Munk {
61572f75660SOphir Munk #ifdef HAVE_IBV_FLOW_DV_SUPPORT
61672f75660SOphir Munk #ifdef HAVE_MLX5DV_DR
61772f75660SOphir Munk 	return mlx5dv_dr_rule_create(matcher, match_value, num_actions,
61872f75660SOphir Munk 				     (struct mlx5dv_dr_action **)actions);
61972f75660SOphir Munk #else
62043e73483SThomas Monjalon 	size_t i;
62172f75660SOphir Munk 	struct mlx5dv_flow_action_attr actions_attr[8];
62272f75660SOphir Munk 
62372f75660SOphir Munk 	if (num_actions > 8)
62472f75660SOphir Munk 		return NULL;
62543e73483SThomas Monjalon 	for (i = 0; i < num_actions; i++)
62672f75660SOphir Munk 		actions_attr[i] =
62772f75660SOphir Munk 			*((struct mlx5dv_flow_action_attr *)(actions[i]));
62872f75660SOphir Munk 	return mlx5dv_create_flow(matcher, match_value,
62972f75660SOphir Munk 				  num_actions, actions_attr);
63072f75660SOphir Munk #endif
63172f75660SOphir Munk #else
63272f75660SOphir Munk 	(void)matcher;
63372f75660SOphir Munk 	(void)match_value;
63472f75660SOphir Munk 	(void)num_actions;
63572f75660SOphir Munk 	(void)actions;
63672f75660SOphir Munk 	return NULL;
63772f75660SOphir Munk #endif
63872f75660SOphir Munk }
63972f75660SOphir Munk 
64072f75660SOphir Munk static void *
64172f75660SOphir Munk mlx5_glue_dv_create_flow_action_counter(void *counter_obj, uint32_t offset)
64272f75660SOphir Munk {
64372f75660SOphir Munk #ifdef HAVE_IBV_FLOW_DV_SUPPORT
64472f75660SOphir Munk #ifdef HAVE_MLX5DV_DR
64572f75660SOphir Munk 	return mlx5dv_dr_action_create_flow_counter(counter_obj, offset);
64672f75660SOphir Munk #else
64772f75660SOphir Munk 	struct mlx5dv_flow_action_attr *action;
64872f75660SOphir Munk 
64972f75660SOphir Munk 	(void)offset;
650cdb034a8SOphir Munk 	action = malloc(sizeof(*action));
65172f75660SOphir Munk 	if (!action)
65272f75660SOphir Munk 		return NULL;
65372f75660SOphir Munk 	action->type = MLX5DV_FLOW_ACTION_COUNTERS_DEVX;
65472f75660SOphir Munk 	action->obj = counter_obj;
65572f75660SOphir Munk 	return action;
65672f75660SOphir Munk #endif
65772f75660SOphir Munk #else
65872f75660SOphir Munk 	(void)counter_obj;
65972f75660SOphir Munk 	(void)offset;
66072f75660SOphir Munk 	errno = ENOTSUP;
66172f75660SOphir Munk 	return NULL;
66272f75660SOphir Munk #endif
66372f75660SOphir Munk }
66472f75660SOphir Munk 
66572f75660SOphir Munk static void *
66672f75660SOphir Munk mlx5_glue_dv_create_flow_action_dest_ibv_qp(void *qp)
66772f75660SOphir Munk {
66872f75660SOphir Munk #ifdef HAVE_IBV_FLOW_DV_SUPPORT
66972f75660SOphir Munk #ifdef HAVE_MLX5DV_DR
67072f75660SOphir Munk 	return mlx5dv_dr_action_create_dest_ibv_qp(qp);
67172f75660SOphir Munk #else
67272f75660SOphir Munk 	struct mlx5dv_flow_action_attr *action;
67372f75660SOphir Munk 
674cdb034a8SOphir Munk 	action = malloc(sizeof(*action));
67572f75660SOphir Munk 	if (!action)
67672f75660SOphir Munk 		return NULL;
67772f75660SOphir Munk 	action->type = MLX5DV_FLOW_ACTION_DEST_IBV_QP;
67872f75660SOphir Munk 	action->obj = qp;
67972f75660SOphir Munk 	return action;
68072f75660SOphir Munk #endif
68172f75660SOphir Munk #else
68272f75660SOphir Munk 	(void)qp;
68372f75660SOphir Munk 	errno = ENOTSUP;
68472f75660SOphir Munk 	return NULL;
68572f75660SOphir Munk #endif
68672f75660SOphir Munk }
68772f75660SOphir Munk 
68872f75660SOphir Munk static void *
68972f75660SOphir Munk mlx5_glue_dv_create_flow_action_dest_devx_tir(void *tir)
69072f75660SOphir Munk {
69172f75660SOphir Munk #ifdef HAVE_MLX5DV_DR_ACTION_DEST_DEVX_TIR
69272f75660SOphir Munk 	return mlx5dv_dr_action_create_dest_devx_tir(tir);
69372f75660SOphir Munk #else
69472f75660SOphir Munk 	(void)tir;
69572f75660SOphir Munk 	errno = ENOTSUP;
69672f75660SOphir Munk 	return NULL;
69772f75660SOphir Munk #endif
69872f75660SOphir Munk }
69972f75660SOphir Munk 
70072f75660SOphir Munk static void *
70172f75660SOphir Munk mlx5_glue_dv_create_flow_action_modify_header
70272f75660SOphir Munk 					(struct ibv_context *ctx,
70372f75660SOphir Munk 					 enum mlx5dv_flow_table_type ft_type,
70472f75660SOphir Munk 					 void *domain, uint64_t flags,
70572f75660SOphir Munk 					 size_t actions_sz,
70672f75660SOphir Munk 					 uint64_t actions[])
70772f75660SOphir Munk {
70872f75660SOphir Munk #ifdef HAVE_IBV_FLOW_DV_SUPPORT
70972f75660SOphir Munk #ifdef HAVE_MLX5DV_DR
71072f75660SOphir Munk 	(void)ctx;
71172f75660SOphir Munk 	(void)ft_type;
71272f75660SOphir Munk 	return mlx5dv_dr_action_create_modify_header(domain, flags, actions_sz,
71372f75660SOphir Munk 						     (__be64 *)actions);
71472f75660SOphir Munk #else
71572f75660SOphir Munk 	struct mlx5dv_flow_action_attr *action;
71672f75660SOphir Munk 
71772f75660SOphir Munk 	(void)domain;
71872f75660SOphir Munk 	(void)flags;
719cdb034a8SOphir Munk 	action = malloc(sizeof(*action));
72072f75660SOphir Munk 	if (!action)
72172f75660SOphir Munk 		return NULL;
72272f75660SOphir Munk 	action->type = MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION;
72372f75660SOphir Munk 	action->action = mlx5dv_create_flow_action_modify_header
72472f75660SOphir Munk 		(ctx, actions_sz, actions, ft_type);
72572f75660SOphir Munk 	return action;
72672f75660SOphir Munk #endif
72772f75660SOphir Munk #else
72872f75660SOphir Munk 	(void)ctx;
72972f75660SOphir Munk 	(void)ft_type;
73072f75660SOphir Munk 	(void)domain;
73172f75660SOphir Munk 	(void)flags;
73272f75660SOphir Munk 	(void)actions_sz;
73372f75660SOphir Munk 	(void)actions;
73472f75660SOphir Munk 	errno = ENOTSUP;
73572f75660SOphir Munk 	return NULL;
73672f75660SOphir Munk #endif
73772f75660SOphir Munk }
73872f75660SOphir Munk 
73972f75660SOphir Munk static void *
74072f75660SOphir Munk mlx5_glue_dv_create_flow_action_packet_reformat
74172f75660SOphir Munk 		(struct ibv_context *ctx,
74272f75660SOphir Munk 		 enum mlx5dv_flow_action_packet_reformat_type reformat_type,
74372f75660SOphir Munk 		 enum mlx5dv_flow_table_type ft_type,
74472f75660SOphir Munk 		 struct mlx5dv_dr_domain *domain,
74572f75660SOphir Munk 		 uint32_t flags, size_t data_sz, void *data)
74672f75660SOphir Munk {
74772f75660SOphir Munk #ifdef HAVE_IBV_FLOW_DV_SUPPORT
74872f75660SOphir Munk #ifdef HAVE_MLX5DV_DR
74972f75660SOphir Munk 	(void)ctx;
75072f75660SOphir Munk 	(void)ft_type;
75172f75660SOphir Munk 	return mlx5dv_dr_action_create_packet_reformat(domain, flags,
75272f75660SOphir Munk 						       reformat_type, data_sz,
75372f75660SOphir Munk 						       data);
75472f75660SOphir Munk #else
75572f75660SOphir Munk 	(void)domain;
75672f75660SOphir Munk 	(void)flags;
75772f75660SOphir Munk 	struct mlx5dv_flow_action_attr *action;
75872f75660SOphir Munk 
759cdb034a8SOphir Munk 	action = malloc(sizeof(*action));
76072f75660SOphir Munk 	if (!action)
76172f75660SOphir Munk 		return NULL;
76272f75660SOphir Munk 	action->type = MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION;
76372f75660SOphir Munk 	action->action = mlx5dv_create_flow_action_packet_reformat
76472f75660SOphir Munk 		(ctx, data_sz, data, reformat_type, ft_type);
76572f75660SOphir Munk 	return action;
76672f75660SOphir Munk #endif
76772f75660SOphir Munk #else
76872f75660SOphir Munk 	(void)ctx;
76972f75660SOphir Munk 	(void)reformat_type;
77072f75660SOphir Munk 	(void)ft_type;
77172f75660SOphir Munk 	(void)domain;
77272f75660SOphir Munk 	(void)flags;
77372f75660SOphir Munk 	(void)data_sz;
77472f75660SOphir Munk 	(void)data;
77572f75660SOphir Munk 	errno = ENOTSUP;
77672f75660SOphir Munk 	return NULL;
77772f75660SOphir Munk #endif
77872f75660SOphir Munk }
77972f75660SOphir Munk 
78072f75660SOphir Munk static void *
78172f75660SOphir Munk mlx5_glue_dv_create_flow_action_tag(uint32_t tag)
78272f75660SOphir Munk {
78372f75660SOphir Munk #ifdef HAVE_IBV_FLOW_DV_SUPPORT
78472f75660SOphir Munk #ifdef HAVE_MLX5DV_DR
78572f75660SOphir Munk 	return mlx5dv_dr_action_create_tag(tag);
786ed5d2365SMichael Baum #else /* HAVE_MLX5DV_DR */
78772f75660SOphir Munk 	struct mlx5dv_flow_action_attr *action;
78866914d19SSuanming Mou 
789cdb034a8SOphir Munk 	action = malloc(sizeof(*action));
79072f75660SOphir Munk 	if (!action)
79172f75660SOphir Munk 		return NULL;
79272f75660SOphir Munk 	action->type = MLX5DV_FLOW_ACTION_TAG;
79372f75660SOphir Munk 	action->tag_value = tag;
79472f75660SOphir Munk 	return action;
795ed5d2365SMichael Baum #endif /* HAVE_MLX5DV_DR */
796ed5d2365SMichael Baum #else /* HAVE_IBV_FLOW_DV_SUPPORT */
79772f75660SOphir Munk 	(void)tag;
79872f75660SOphir Munk 	errno = ENOTSUP;
79972f75660SOphir Munk 	return NULL;
800ed5d2365SMichael Baum #endif /* HAVE_IBV_FLOW_DV_SUPPORT */
80172f75660SOphir Munk }
80272f75660SOphir Munk 
80372f75660SOphir Munk static void *
80472f75660SOphir Munk mlx5_glue_dv_create_flow_action_meter(struct mlx5dv_dr_flow_meter_attr *attr)
80572f75660SOphir Munk {
80672f75660SOphir Munk #if defined(HAVE_MLX5DV_DR) && defined(HAVE_MLX5_DR_CREATE_ACTION_FLOW_METER)
80772f75660SOphir Munk 	return mlx5dv_dr_action_create_flow_meter(attr);
80872f75660SOphir Munk #else
80972f75660SOphir Munk 	(void)attr;
81072f75660SOphir Munk 	errno = ENOTSUP;
81172f75660SOphir Munk 	return NULL;
81272f75660SOphir Munk #endif
81372f75660SOphir Munk }
81472f75660SOphir Munk 
81572f75660SOphir Munk static int
81672f75660SOphir Munk mlx5_glue_dv_modify_flow_action_meter(void *action,
81772f75660SOphir Munk 				      struct mlx5dv_dr_flow_meter_attr *attr,
81872f75660SOphir Munk 				      uint64_t modify_bits)
81972f75660SOphir Munk {
82072f75660SOphir Munk #if defined(HAVE_MLX5DV_DR) && defined(HAVE_MLX5_DR_CREATE_ACTION_FLOW_METER)
82172f75660SOphir Munk 	return mlx5dv_dr_action_modify_flow_meter(action, attr, modify_bits);
82272f75660SOphir Munk #else
82372f75660SOphir Munk 	(void)action;
82472f75660SOphir Munk 	(void)attr;
82572f75660SOphir Munk 	(void)modify_bits;
82672f75660SOphir Munk 	errno = ENOTSUP;
82772f75660SOphir Munk 	return errno;
82872f75660SOphir Munk #endif
82972f75660SOphir Munk }
83072f75660SOphir Munk 
831d4d85aa6SShiri Kuzin static void *
832a2999c7bSDekel Peled mlx5_glue_dv_create_flow_action_aso(struct mlx5dv_dr_domain *domain,
833a2999c7bSDekel Peled 				    void *aso_obj,
834a2999c7bSDekel Peled 				    uint32_t offset,
835a2999c7bSDekel Peled 				    uint32_t flags,
836a2999c7bSDekel Peled 				    uint8_t return_reg_c)
837a2999c7bSDekel Peled {
838a2999c7bSDekel Peled #if defined(HAVE_MLX5DV_DR) && defined(HAVE_MLX5_DR_CREATE_ACTION_ASO)
839a2999c7bSDekel Peled 	return mlx5dv_dr_action_create_aso(domain, aso_obj, offset,
840a2999c7bSDekel Peled 					   flags, return_reg_c);
841a2999c7bSDekel Peled #else
842a2999c7bSDekel Peled 	(void)domain;
843a2999c7bSDekel Peled 	(void)aso_obj;
844a2999c7bSDekel Peled 	(void)offset;
845a2999c7bSDekel Peled 	(void)flags;
846a2999c7bSDekel Peled 	(void)return_reg_c;
847a2999c7bSDekel Peled 	errno = ENOTSUP;
848a2999c7bSDekel Peled 	return NULL;
849a2999c7bSDekel Peled #endif
850a2999c7bSDekel Peled }
851a2999c7bSDekel Peled 
852a2999c7bSDekel Peled static void *
853d4d85aa6SShiri Kuzin mlx5_glue_dr_create_flow_action_default_miss(void)
854d4d85aa6SShiri Kuzin {
855d4d85aa6SShiri Kuzin #if defined(HAVE_MLX5DV_DR) && defined(HAVE_MLX5_DR_CREATE_ACTION_DEFAULT_MISS)
856d4d85aa6SShiri Kuzin 	return mlx5dv_dr_action_create_default_miss();
857d4d85aa6SShiri Kuzin #else
858d4d85aa6SShiri Kuzin 	errno = ENOTSUP;
859d4d85aa6SShiri Kuzin 	return NULL;
860d4d85aa6SShiri Kuzin #endif
861d4d85aa6SShiri Kuzin }
862d4d85aa6SShiri Kuzin 
86372f75660SOphir Munk static int
86472f75660SOphir Munk mlx5_glue_dv_destroy_flow(void *flow_id)
86572f75660SOphir Munk {
86672f75660SOphir Munk #ifdef HAVE_MLX5DV_DR
86772f75660SOphir Munk 	return mlx5dv_dr_rule_destroy(flow_id);
86872f75660SOphir Munk #else
86972f75660SOphir Munk 	return ibv_destroy_flow(flow_id);
87072f75660SOphir Munk #endif
87172f75660SOphir Munk }
87272f75660SOphir Munk 
87372f75660SOphir Munk static int
87472f75660SOphir Munk mlx5_glue_dv_destroy_flow_matcher(void *matcher)
87572f75660SOphir Munk {
87672f75660SOphir Munk #ifdef HAVE_IBV_FLOW_DV_SUPPORT
87772f75660SOphir Munk #ifdef HAVE_MLX5DV_DR
87872f75660SOphir Munk 	return mlx5dv_dr_matcher_destroy(matcher);
87972f75660SOphir Munk #else
88072f75660SOphir Munk 	return mlx5dv_destroy_flow_matcher(matcher);
88172f75660SOphir Munk #endif
88272f75660SOphir Munk #else
88372f75660SOphir Munk 	(void)matcher;
88472f75660SOphir Munk 	errno = ENOTSUP;
88572f75660SOphir Munk 	return errno;
88672f75660SOphir Munk #endif
88772f75660SOphir Munk }
88872f75660SOphir Munk 
88972f75660SOphir Munk static struct ibv_context *
89072f75660SOphir Munk mlx5_glue_dv_open_device(struct ibv_device *device)
89172f75660SOphir Munk {
89272f75660SOphir Munk #ifdef HAVE_IBV_DEVX_OBJ
89372f75660SOphir Munk 	return mlx5dv_open_device(device,
89472f75660SOphir Munk 				  &(struct mlx5dv_context_attr){
89572f75660SOphir Munk 					.flags = MLX5DV_CONTEXT_FLAGS_DEVX,
89672f75660SOphir Munk 				  });
89772f75660SOphir Munk #else
89872f75660SOphir Munk 	(void)device;
89972f75660SOphir Munk 	errno = ENOTSUP;
90072f75660SOphir Munk 	return NULL;
90172f75660SOphir Munk #endif
90272f75660SOphir Munk }
90372f75660SOphir Munk 
90472f75660SOphir Munk static struct mlx5dv_devx_obj *
90572f75660SOphir Munk mlx5_glue_devx_obj_create(struct ibv_context *ctx,
90672f75660SOphir Munk 			  const void *in, size_t inlen,
90772f75660SOphir Munk 			  void *out, size_t outlen)
90872f75660SOphir Munk {
90972f75660SOphir Munk #ifdef HAVE_IBV_DEVX_OBJ
91072f75660SOphir Munk 	return mlx5dv_devx_obj_create(ctx, in, inlen, out, outlen);
91172f75660SOphir Munk #else
91272f75660SOphir Munk 	(void)ctx;
91372f75660SOphir Munk 	(void)in;
91472f75660SOphir Munk 	(void)inlen;
91572f75660SOphir Munk 	(void)out;
91672f75660SOphir Munk 	(void)outlen;
91772f75660SOphir Munk 	errno = ENOTSUP;
91872f75660SOphir Munk 	return NULL;
91972f75660SOphir Munk #endif
92072f75660SOphir Munk }
92172f75660SOphir Munk 
92272f75660SOphir Munk static int
92372f75660SOphir Munk mlx5_glue_devx_obj_destroy(struct mlx5dv_devx_obj *obj)
92472f75660SOphir Munk {
92572f75660SOphir Munk #ifdef HAVE_IBV_DEVX_OBJ
92672f75660SOphir Munk 	return mlx5dv_devx_obj_destroy(obj);
92772f75660SOphir Munk #else
92872f75660SOphir Munk 	(void)obj;
92972f75660SOphir Munk 	return -ENOTSUP;
93072f75660SOphir Munk #endif
93172f75660SOphir Munk }
93272f75660SOphir Munk 
93372f75660SOphir Munk static int
93472f75660SOphir Munk mlx5_glue_devx_obj_query(struct mlx5dv_devx_obj *obj,
93572f75660SOphir Munk 			 const void *in, size_t inlen,
93672f75660SOphir Munk 			 void *out, size_t outlen)
93772f75660SOphir Munk {
93872f75660SOphir Munk #ifdef HAVE_IBV_DEVX_OBJ
93972f75660SOphir Munk 	return mlx5dv_devx_obj_query(obj, in, inlen, out, outlen);
94072f75660SOphir Munk #else
94172f75660SOphir Munk 	(void)obj;
94272f75660SOphir Munk 	(void)in;
94372f75660SOphir Munk 	(void)inlen;
94472f75660SOphir Munk 	(void)out;
94572f75660SOphir Munk 	(void)outlen;
94672f75660SOphir Munk 	return -ENOTSUP;
94772f75660SOphir Munk #endif
94872f75660SOphir Munk }
94972f75660SOphir Munk 
95072f75660SOphir Munk static int
95172f75660SOphir Munk mlx5_glue_devx_obj_modify(struct mlx5dv_devx_obj *obj,
95272f75660SOphir Munk 			  const void *in, size_t inlen,
95372f75660SOphir Munk 			  void *out, size_t outlen)
95472f75660SOphir Munk {
95572f75660SOphir Munk #ifdef HAVE_IBV_DEVX_OBJ
95672f75660SOphir Munk 	return mlx5dv_devx_obj_modify(obj, in, inlen, out, outlen);
95772f75660SOphir Munk #else
95872f75660SOphir Munk 	(void)obj;
95972f75660SOphir Munk 	(void)in;
96072f75660SOphir Munk 	(void)inlen;
96172f75660SOphir Munk 	(void)out;
96272f75660SOphir Munk 	(void)outlen;
96372f75660SOphir Munk 	return -ENOTSUP;
96472f75660SOphir Munk #endif
96572f75660SOphir Munk }
96672f75660SOphir Munk 
96772f75660SOphir Munk static int
96872f75660SOphir Munk mlx5_glue_devx_general_cmd(struct ibv_context *ctx,
96972f75660SOphir Munk 			   const void *in, size_t inlen,
97072f75660SOphir Munk 			   void *out, size_t outlen)
97172f75660SOphir Munk {
97272f75660SOphir Munk #ifdef HAVE_IBV_DEVX_OBJ
97372f75660SOphir Munk 	return mlx5dv_devx_general_cmd(ctx, in, inlen, out, outlen);
97472f75660SOphir Munk #else
97572f75660SOphir Munk 	(void)ctx;
97672f75660SOphir Munk 	(void)in;
97772f75660SOphir Munk 	(void)inlen;
97872f75660SOphir Munk 	(void)out;
97972f75660SOphir Munk 	(void)outlen;
98072f75660SOphir Munk 	return -ENOTSUP;
98172f75660SOphir Munk #endif
98272f75660SOphir Munk }
98372f75660SOphir Munk 
98472f75660SOphir Munk static struct mlx5dv_devx_cmd_comp *
98572f75660SOphir Munk mlx5_glue_devx_create_cmd_comp(struct ibv_context *ctx)
98672f75660SOphir Munk {
98772f75660SOphir Munk #ifdef HAVE_IBV_DEVX_ASYNC
98872f75660SOphir Munk 	return mlx5dv_devx_create_cmd_comp(ctx);
98972f75660SOphir Munk #else
99072f75660SOphir Munk 	(void)ctx;
99172f75660SOphir Munk 	errno = -ENOTSUP;
99272f75660SOphir Munk 	return NULL;
99372f75660SOphir Munk #endif
99472f75660SOphir Munk }
99572f75660SOphir Munk 
99672f75660SOphir Munk static void
99772f75660SOphir Munk mlx5_glue_devx_destroy_cmd_comp(struct mlx5dv_devx_cmd_comp *cmd_comp)
99872f75660SOphir Munk {
99972f75660SOphir Munk #ifdef HAVE_IBV_DEVX_ASYNC
100072f75660SOphir Munk 	mlx5dv_devx_destroy_cmd_comp(cmd_comp);
100172f75660SOphir Munk #else
100272f75660SOphir Munk 	(void)cmd_comp;
100372f75660SOphir Munk 	errno = -ENOTSUP;
100472f75660SOphir Munk #endif
100572f75660SOphir Munk }
100672f75660SOphir Munk 
100772f75660SOphir Munk static int
100872f75660SOphir Munk mlx5_glue_devx_obj_query_async(struct mlx5dv_devx_obj *obj, const void *in,
100972f75660SOphir Munk 			       size_t inlen, size_t outlen, uint64_t wr_id,
101072f75660SOphir Munk 			       struct mlx5dv_devx_cmd_comp *cmd_comp)
101172f75660SOphir Munk {
101272f75660SOphir Munk #ifdef HAVE_IBV_DEVX_ASYNC
101372f75660SOphir Munk 	return mlx5dv_devx_obj_query_async(obj, in, inlen, outlen, wr_id,
101472f75660SOphir Munk 					   cmd_comp);
101572f75660SOphir Munk #else
101672f75660SOphir Munk 	(void)obj;
101772f75660SOphir Munk 	(void)in;
101872f75660SOphir Munk 	(void)inlen;
101972f75660SOphir Munk 	(void)outlen;
102072f75660SOphir Munk 	(void)wr_id;
102172f75660SOphir Munk 	(void)cmd_comp;
102272f75660SOphir Munk 	return -ENOTSUP;
102372f75660SOphir Munk #endif
102472f75660SOphir Munk }
102572f75660SOphir Munk 
102672f75660SOphir Munk static int
102772f75660SOphir Munk mlx5_glue_devx_get_async_cmd_comp(struct mlx5dv_devx_cmd_comp *cmd_comp,
102872f75660SOphir Munk 				  struct mlx5dv_devx_async_cmd_hdr *cmd_resp,
102972f75660SOphir Munk 				  size_t cmd_resp_len)
103072f75660SOphir Munk {
103172f75660SOphir Munk #ifdef HAVE_IBV_DEVX_ASYNC
103272f75660SOphir Munk 	return mlx5dv_devx_get_async_cmd_comp(cmd_comp, cmd_resp,
103372f75660SOphir Munk 					      cmd_resp_len);
103472f75660SOphir Munk #else
103572f75660SOphir Munk 	(void)cmd_comp;
103672f75660SOphir Munk 	(void)cmd_resp;
103772f75660SOphir Munk 	(void)cmd_resp_len;
103872f75660SOphir Munk 	return -ENOTSUP;
103972f75660SOphir Munk #endif
104072f75660SOphir Munk }
104172f75660SOphir Munk 
104272f75660SOphir Munk static struct mlx5dv_devx_umem *
104372f75660SOphir Munk mlx5_glue_devx_umem_reg(struct ibv_context *context, void *addr, size_t size,
104472f75660SOphir Munk 			uint32_t access)
104572f75660SOphir Munk {
104672f75660SOphir Munk #ifdef HAVE_IBV_DEVX_OBJ
104772f75660SOphir Munk 	return mlx5dv_devx_umem_reg(context, addr, size, access);
104872f75660SOphir Munk #else
104972f75660SOphir Munk 	(void)context;
105072f75660SOphir Munk 	(void)addr;
105172f75660SOphir Munk 	(void)size;
105272f75660SOphir Munk 	(void)access;
105372f75660SOphir Munk 	errno = -ENOTSUP;
105472f75660SOphir Munk 	return NULL;
105572f75660SOphir Munk #endif
105672f75660SOphir Munk }
105772f75660SOphir Munk 
105872f75660SOphir Munk static int
105972f75660SOphir Munk mlx5_glue_devx_umem_dereg(struct mlx5dv_devx_umem *dv_devx_umem)
106072f75660SOphir Munk {
106172f75660SOphir Munk #ifdef HAVE_IBV_DEVX_OBJ
106272f75660SOphir Munk 	return mlx5dv_devx_umem_dereg(dv_devx_umem);
106372f75660SOphir Munk #else
106472f75660SOphir Munk 	(void)dv_devx_umem;
106572f75660SOphir Munk 	return -ENOTSUP;
106672f75660SOphir Munk #endif
106772f75660SOphir Munk }
106872f75660SOphir Munk 
106972f75660SOphir Munk static int
107072f75660SOphir Munk mlx5_glue_devx_qp_query(struct ibv_qp *qp,
107172f75660SOphir Munk 			const void *in, size_t inlen,
107272f75660SOphir Munk 			void *out, size_t outlen)
107372f75660SOphir Munk {
107472f75660SOphir Munk #ifdef HAVE_IBV_DEVX_QP
107572f75660SOphir Munk 	return mlx5dv_devx_qp_query(qp, in, inlen, out, outlen);
107672f75660SOphir Munk #else
107772f75660SOphir Munk 	(void)qp;
107872f75660SOphir Munk 	(void)in;
107972f75660SOphir Munk 	(void)inlen;
108072f75660SOphir Munk 	(void)out;
108172f75660SOphir Munk 	(void)outlen;
108272f75660SOphir Munk 	errno = ENOTSUP;
108372f75660SOphir Munk 	return errno;
108472f75660SOphir Munk #endif
108572f75660SOphir Munk }
108672f75660SOphir Munk 
108772f75660SOphir Munk static int
108875a9a73dSMatan Azrad mlx5_glue_devx_wq_query(struct ibv_wq *wq, const void *in, size_t inlen,
108975a9a73dSMatan Azrad 			void *out, size_t outlen)
109075a9a73dSMatan Azrad {
109175a9a73dSMatan Azrad #ifdef HAVE_IBV_DEVX_QP
109275a9a73dSMatan Azrad 	return mlx5dv_devx_wq_query(wq, in, inlen, out, outlen);
109375a9a73dSMatan Azrad #else
109475a9a73dSMatan Azrad 	(void)wq;
109575a9a73dSMatan Azrad 	(void)in;
109675a9a73dSMatan Azrad 	(void)inlen;
109775a9a73dSMatan Azrad 	(void)out;
109875a9a73dSMatan Azrad 	(void)outlen;
109975a9a73dSMatan Azrad 	errno = ENOTSUP;
110075a9a73dSMatan Azrad 	return errno;
110175a9a73dSMatan Azrad #endif
110275a9a73dSMatan Azrad }
110375a9a73dSMatan Azrad 
110475a9a73dSMatan Azrad static int
110572f75660SOphir Munk mlx5_glue_devx_port_query(struct ibv_context *ctx,
110672f75660SOphir Munk 			  uint32_t port_num,
1107d0cf77e8SViacheslav Ovsiienko 			  struct mlx5_port_info *info)
110872f75660SOphir Munk {
1109d0cf77e8SViacheslav Ovsiienko 	int err = 0;
1110d0cf77e8SViacheslav Ovsiienko 
1111d0cf77e8SViacheslav Ovsiienko 	info->query_flags = 0;
1112d0cf77e8SViacheslav Ovsiienko #ifdef HAVE_MLX5DV_DR_DEVX_PORT_V35
1113d0cf77e8SViacheslav Ovsiienko 	/* The DevX port query API is implemented (rdma-core v35 and above). */
1114d0cf77e8SViacheslav Ovsiienko 	struct mlx5_ib_uapi_query_port devx_port;
1115d0cf77e8SViacheslav Ovsiienko 
1116d0cf77e8SViacheslav Ovsiienko 	memset(&devx_port, 0, sizeof(devx_port));
1117d0cf77e8SViacheslav Ovsiienko 	err = mlx5dv_query_port(ctx, port_num, &devx_port);
1118d0cf77e8SViacheslav Ovsiienko 	if (err)
1119d0cf77e8SViacheslav Ovsiienko 		return err;
1120d0cf77e8SViacheslav Ovsiienko 	if (devx_port.flags & MLX5DV_QUERY_PORT_VPORT_REG_C0) {
1121d0cf77e8SViacheslav Ovsiienko 		info->vport_meta_tag = devx_port.reg_c0.value;
1122d0cf77e8SViacheslav Ovsiienko 		info->vport_meta_mask = devx_port.reg_c0.mask;
1123d0cf77e8SViacheslav Ovsiienko 		info->query_flags |= MLX5_PORT_QUERY_REG_C0;
1124d0cf77e8SViacheslav Ovsiienko 	}
1125d0cf77e8SViacheslav Ovsiienko 	if (devx_port.flags & MLX5DV_QUERY_PORT_VPORT) {
1126d0cf77e8SViacheslav Ovsiienko 		info->vport_id = devx_port.vport;
1127d0cf77e8SViacheslav Ovsiienko 		info->query_flags |= MLX5_PORT_QUERY_VPORT;
1128d0cf77e8SViacheslav Ovsiienko 	}
112972f75660SOphir Munk #else
1130d0cf77e8SViacheslav Ovsiienko #ifdef HAVE_MLX5DV_DR_DEVX_PORT
1131d0cf77e8SViacheslav Ovsiienko 	/* The legacy DevX port query API is implemented (prior v35). */
1132d0cf77e8SViacheslav Ovsiienko 	struct mlx5dv_devx_port devx_port = {
1133d0cf77e8SViacheslav Ovsiienko 		.comp_mask = MLX5DV_DEVX_PORT_VPORT |
1134d0cf77e8SViacheslav Ovsiienko 			     MLX5DV_DEVX_PORT_MATCH_REG_C_0
1135d0cf77e8SViacheslav Ovsiienko 	};
1136d0cf77e8SViacheslav Ovsiienko 
1137d0cf77e8SViacheslav Ovsiienko 	err = mlx5dv_query_devx_port(ctx, port_num, &devx_port);
1138d0cf77e8SViacheslav Ovsiienko 	if (err)
1139d0cf77e8SViacheslav Ovsiienko 		return err;
1140d0cf77e8SViacheslav Ovsiienko 	if (devx_port.comp_mask & MLX5DV_DEVX_PORT_MATCH_REG_C_0) {
1141d0cf77e8SViacheslav Ovsiienko 		info->vport_meta_tag = devx_port.reg_c_0.value;
1142d0cf77e8SViacheslav Ovsiienko 		info->vport_meta_mask = devx_port.reg_c_0.mask;
1143d0cf77e8SViacheslav Ovsiienko 		info->query_flags |= MLX5_PORT_QUERY_REG_C0;
1144d0cf77e8SViacheslav Ovsiienko 	}
1145d0cf77e8SViacheslav Ovsiienko 	if (devx_port.comp_mask & MLX5DV_DEVX_PORT_VPORT) {
1146d0cf77e8SViacheslav Ovsiienko 		info->vport_id = devx_port.vport_num;
1147d0cf77e8SViacheslav Ovsiienko 		info->query_flags |= MLX5_PORT_QUERY_VPORT;
1148d0cf77e8SViacheslav Ovsiienko 	}
1149d0cf77e8SViacheslav Ovsiienko #else
1150d0cf77e8SViacheslav Ovsiienko 	RTE_SET_USED(ctx);
1151d0cf77e8SViacheslav Ovsiienko 	RTE_SET_USED(port_num);
1152d0cf77e8SViacheslav Ovsiienko #endif /* HAVE_MLX5DV_DR_DEVX_PORT */
1153d0cf77e8SViacheslav Ovsiienko #endif /* HAVE_MLX5DV_DR_DEVX_PORT_V35 */
1154d0cf77e8SViacheslav Ovsiienko 	return err;
115572f75660SOphir Munk }
115672f75660SOphir Munk 
115772f75660SOphir Munk static int
1158a38d22edSHaifei Luo mlx5_glue_dr_dump_single_rule(FILE *file, void *rule)
1159a38d22edSHaifei Luo {
1160a38d22edSHaifei Luo #ifdef HAVE_MLX5_DR_FLOW_DUMP_RULE
1161a38d22edSHaifei Luo 	return mlx5dv_dump_dr_rule(file, rule);
1162a38d22edSHaifei Luo #else
1163a38d22edSHaifei Luo 	RTE_SET_USED(file);
1164a38d22edSHaifei Luo 	RTE_SET_USED(rule);
1165a38d22edSHaifei Luo 	return -ENOTSUP;
1166a38d22edSHaifei Luo #endif
1167a38d22edSHaifei Luo }
1168a38d22edSHaifei Luo 
1169a38d22edSHaifei Luo static int
117072f75660SOphir Munk mlx5_glue_dr_dump_domain(FILE *file, void *domain)
117172f75660SOphir Munk {
117272f75660SOphir Munk #ifdef HAVE_MLX5_DR_FLOW_DUMP
117372f75660SOphir Munk 	return mlx5dv_dump_dr_domain(file, domain);
117472f75660SOphir Munk #else
117572f75660SOphir Munk 	RTE_SET_USED(file);
117672f75660SOphir Munk 	RTE_SET_USED(domain);
117772f75660SOphir Munk 	return -ENOTSUP;
117872f75660SOphir Munk #endif
117972f75660SOphir Munk }
118072f75660SOphir Munk 
1181a3def854SJiawei Wang static void *
11824d23dd35SJiawei Wang mlx5_glue_dr_create_flow_action_sampler
11834d23dd35SJiawei Wang 			(struct mlx5dv_dr_flow_sampler_attr *attr)
1184a3def854SJiawei Wang {
1185a3def854SJiawei Wang #ifdef HAVE_MLX5_DR_CREATE_ACTION_FLOW_SAMPLE
1186a3def854SJiawei Wang 	return mlx5dv_dr_action_create_flow_sampler(attr);
1187a3def854SJiawei Wang #else
1188a3def854SJiawei Wang 	(void)attr;
1189a3def854SJiawei Wang 	errno = ENOTSUP;
1190a3def854SJiawei Wang 	return NULL;
1191a3def854SJiawei Wang #endif
1192a3def854SJiawei Wang }
1193a3def854SJiawei Wang 
11944d23dd35SJiawei Wang static void *
11954d23dd35SJiawei Wang mlx5_glue_dr_action_create_dest_array
11964d23dd35SJiawei Wang 			(void *domain,
11974d23dd35SJiawei Wang 			 size_t num_dest,
11984d23dd35SJiawei Wang 			 struct mlx5dv_dr_action_dest_attr *dests[])
11994d23dd35SJiawei Wang {
12004d23dd35SJiawei Wang #ifdef HAVE_MLX5_DR_CREATE_ACTION_DEST_ARRAY
12014d23dd35SJiawei Wang 	return mlx5dv_dr_action_create_dest_array
12024d23dd35SJiawei Wang 				(domain,
12034d23dd35SJiawei Wang 				num_dest,
12044d23dd35SJiawei Wang 				dests);
12054d23dd35SJiawei Wang #else
12064d23dd35SJiawei Wang 	(void)domain;
12074d23dd35SJiawei Wang 	(void)num_dest;
12084d23dd35SJiawei Wang 	(void)dests;
12094d23dd35SJiawei Wang 	errno = ENOTSUP;
12104d23dd35SJiawei Wang 	return NULL;
12114d23dd35SJiawei Wang #endif
12124d23dd35SJiawei Wang }
12134d23dd35SJiawei Wang 
121472f75660SOphir Munk static int
121572f75660SOphir Munk mlx5_glue_devx_query_eqn(struct ibv_context *ctx, uint32_t cpus,
121672f75660SOphir Munk 			 uint32_t *eqn)
121772f75660SOphir Munk {
121872f75660SOphir Munk #ifdef HAVE_IBV_DEVX_OBJ
121972f75660SOphir Munk 	return mlx5dv_devx_query_eqn(ctx, cpus, eqn);
122072f75660SOphir Munk #else
122172f75660SOphir Munk 	(void)ctx;
122272f75660SOphir Munk 	(void)cpus;
122372f75660SOphir Munk 	(void)eqn;
122472f75660SOphir Munk 	return -ENOTSUP;
122572f75660SOphir Munk #endif
122672f75660SOphir Munk }
122772f75660SOphir Munk 
122872f75660SOphir Munk static struct mlx5dv_devx_event_channel *
122972f75660SOphir Munk mlx5_glue_devx_create_event_channel(struct ibv_context *ctx, int flags)
123072f75660SOphir Munk {
123172f75660SOphir Munk #ifdef HAVE_IBV_DEVX_EVENT
123272f75660SOphir Munk 	return mlx5dv_devx_create_event_channel(ctx, flags);
123372f75660SOphir Munk #else
123472f75660SOphir Munk 	(void)ctx;
123572f75660SOphir Munk 	(void)flags;
123672f75660SOphir Munk 	errno = ENOTSUP;
123772f75660SOphir Munk 	return NULL;
123872f75660SOphir Munk #endif
123972f75660SOphir Munk }
124072f75660SOphir Munk 
124172f75660SOphir Munk static void
124272f75660SOphir Munk mlx5_glue_devx_destroy_event_channel(struct mlx5dv_devx_event_channel *eventc)
124372f75660SOphir Munk {
124472f75660SOphir Munk #ifdef HAVE_IBV_DEVX_EVENT
124572f75660SOphir Munk 	mlx5dv_devx_destroy_event_channel(eventc);
124672f75660SOphir Munk #else
124772f75660SOphir Munk 	(void)eventc;
124872f75660SOphir Munk #endif
124972f75660SOphir Munk }
125072f75660SOphir Munk 
125172f75660SOphir Munk static int
125272f75660SOphir Munk mlx5_glue_devx_subscribe_devx_event(struct mlx5dv_devx_event_channel *eventc,
125372f75660SOphir Munk 				    struct mlx5dv_devx_obj *obj,
125472f75660SOphir Munk 				    uint16_t events_sz, uint16_t events_num[],
125572f75660SOphir Munk 				    uint64_t cookie)
125672f75660SOphir Munk {
125772f75660SOphir Munk #ifdef HAVE_IBV_DEVX_EVENT
125872f75660SOphir Munk 	return mlx5dv_devx_subscribe_devx_event(eventc, obj, events_sz,
125972f75660SOphir Munk 						events_num, cookie);
126072f75660SOphir Munk #else
126172f75660SOphir Munk 	(void)eventc;
126272f75660SOphir Munk 	(void)obj;
126372f75660SOphir Munk 	(void)events_sz;
126472f75660SOphir Munk 	(void)events_num;
126572f75660SOphir Munk 	(void)cookie;
126672f75660SOphir Munk 	return -ENOTSUP;
126772f75660SOphir Munk #endif
126872f75660SOphir Munk }
126972f75660SOphir Munk 
127072f75660SOphir Munk static int
127172f75660SOphir Munk mlx5_glue_devx_subscribe_devx_event_fd(struct mlx5dv_devx_event_channel *eventc,
127272f75660SOphir Munk 				       int fd, struct mlx5dv_devx_obj *obj,
127372f75660SOphir Munk 				       uint16_t event_num)
127472f75660SOphir Munk {
127572f75660SOphir Munk #ifdef HAVE_IBV_DEVX_EVENT
127672f75660SOphir Munk 	return mlx5dv_devx_subscribe_devx_event_fd(eventc, fd, obj, event_num);
127772f75660SOphir Munk #else
127872f75660SOphir Munk 	(void)eventc;
127972f75660SOphir Munk 	(void)fd;
128072f75660SOphir Munk 	(void)obj;
128172f75660SOphir Munk 	(void)event_num;
128272f75660SOphir Munk 	return -ENOTSUP;
128372f75660SOphir Munk #endif
128472f75660SOphir Munk }
128572f75660SOphir Munk 
128672f75660SOphir Munk static ssize_t
128772f75660SOphir Munk mlx5_glue_devx_get_event(struct mlx5dv_devx_event_channel *eventc,
128872f75660SOphir Munk 			 struct mlx5dv_devx_async_event_hdr *event_data,
128972f75660SOphir Munk 			 size_t event_resp_len)
129072f75660SOphir Munk {
129172f75660SOphir Munk #ifdef HAVE_IBV_DEVX_EVENT
129272f75660SOphir Munk 	return mlx5dv_devx_get_event(eventc, event_data, event_resp_len);
129372f75660SOphir Munk #else
129472f75660SOphir Munk 	(void)eventc;
129572f75660SOphir Munk 	(void)event_data;
129672f75660SOphir Munk 	(void)event_resp_len;
129772f75660SOphir Munk 	errno = ENOTSUP;
129872f75660SOphir Munk 	return -1;
129972f75660SOphir Munk #endif
130072f75660SOphir Munk }
130172f75660SOphir Munk 
130272f75660SOphir Munk static struct mlx5dv_devx_uar *
130372f75660SOphir Munk mlx5_glue_devx_alloc_uar(struct ibv_context *context, uint32_t flags)
130472f75660SOphir Munk {
130572f75660SOphir Munk #ifdef HAVE_IBV_DEVX_OBJ
130672f75660SOphir Munk 	return mlx5dv_devx_alloc_uar(context, flags);
130772f75660SOphir Munk #else
130872f75660SOphir Munk 	(void)context;
130972f75660SOphir Munk 	(void)flags;
131072f75660SOphir Munk 	errno = ENOTSUP;
131172f75660SOphir Munk 	return NULL;
131272f75660SOphir Munk #endif
131372f75660SOphir Munk }
131472f75660SOphir Munk 
131572f75660SOphir Munk static void
131672f75660SOphir Munk mlx5_glue_devx_free_uar(struct mlx5dv_devx_uar *devx_uar)
131772f75660SOphir Munk {
131872f75660SOphir Munk #ifdef HAVE_IBV_DEVX_OBJ
131972f75660SOphir Munk 	mlx5dv_devx_free_uar(devx_uar);
132072f75660SOphir Munk #else
132172f75660SOphir Munk 	(void)devx_uar;
132272f75660SOphir Munk #endif
132372f75660SOphir Munk }
132472f75660SOphir Munk 
132572f75660SOphir Munk static struct mlx5dv_var *
132672f75660SOphir Munk mlx5_glue_dv_alloc_var(struct ibv_context *context, uint32_t flags)
132772f75660SOphir Munk {
132872f75660SOphir Munk #ifdef HAVE_IBV_VAR
132972f75660SOphir Munk 	return mlx5dv_alloc_var(context, flags);
133072f75660SOphir Munk #else
133172f75660SOphir Munk 	(void)context;
133272f75660SOphir Munk 	(void)flags;
133372f75660SOphir Munk 	errno = ENOTSUP;
133472f75660SOphir Munk 	return NULL;
133572f75660SOphir Munk #endif
133672f75660SOphir Munk }
133772f75660SOphir Munk 
133872f75660SOphir Munk static void
133972f75660SOphir Munk mlx5_glue_dv_free_var(struct mlx5dv_var *var)
134072f75660SOphir Munk {
134172f75660SOphir Munk #ifdef HAVE_IBV_VAR
134272f75660SOphir Munk 	mlx5dv_free_var(var);
134372f75660SOphir Munk #else
134472f75660SOphir Munk 	(void)var;
134572f75660SOphir Munk 	errno = ENOTSUP;
134672f75660SOphir Munk #endif
134772f75660SOphir Munk }
134872f75660SOphir Munk 
1349bebee850SSuanming Mou static void
1350bebee850SSuanming Mou mlx5_glue_dr_reclaim_domain_memory(void *domain, uint32_t enable)
1351bebee850SSuanming Mou {
1352bebee850SSuanming Mou #ifdef HAVE_MLX5DV_DR_MEM_RECLAIM
1353bebee850SSuanming Mou 	mlx5dv_dr_domain_set_reclaim_device_memory(domain, enable);
1354bebee850SSuanming Mou #else
1355bebee850SSuanming Mou 	(void)(enable);
1356bebee850SSuanming Mou 	(void)(domain);
1357bebee850SSuanming Mou #endif
1358bebee850SSuanming Mou }
1359bebee850SSuanming Mou 
136079a7e409SViacheslav Ovsiienko static struct mlx5dv_pp *
136179a7e409SViacheslav Ovsiienko mlx5_glue_dv_alloc_pp(struct ibv_context *context,
136279a7e409SViacheslav Ovsiienko 		      size_t pp_context_sz,
136379a7e409SViacheslav Ovsiienko 		      const void *pp_context,
136479a7e409SViacheslav Ovsiienko 		      uint32_t flags)
136579a7e409SViacheslav Ovsiienko {
136679a7e409SViacheslav Ovsiienko #ifdef HAVE_MLX5DV_PP_ALLOC
136779a7e409SViacheslav Ovsiienko 	return mlx5dv_pp_alloc(context, pp_context_sz, pp_context, flags);
136879a7e409SViacheslav Ovsiienko #else
136979a7e409SViacheslav Ovsiienko 	RTE_SET_USED(context);
137079a7e409SViacheslav Ovsiienko 	RTE_SET_USED(pp_context_sz);
137179a7e409SViacheslav Ovsiienko 	RTE_SET_USED(pp_context);
137279a7e409SViacheslav Ovsiienko 	RTE_SET_USED(flags);
137379a7e409SViacheslav Ovsiienko 	errno = ENOTSUP;
137479a7e409SViacheslav Ovsiienko 	return NULL;
137579a7e409SViacheslav Ovsiienko #endif
137679a7e409SViacheslav Ovsiienko }
137779a7e409SViacheslav Ovsiienko 
137879a7e409SViacheslav Ovsiienko static void
1379e39226bdSJiawei Wang mlx5_glue_dr_allow_duplicate_rules(void *domain, uint32_t allow)
1380e39226bdSJiawei Wang {
1381e39226bdSJiawei Wang #ifdef HAVE_MLX5_DR_ALLOW_DUPLICATE
1382e39226bdSJiawei Wang 	mlx5dv_dr_domain_allow_duplicate_rules(domain, allow);
1383e39226bdSJiawei Wang #else
1384e39226bdSJiawei Wang 	(void)(allow);
1385e39226bdSJiawei Wang 	(void)(domain);
1386e39226bdSJiawei Wang #endif
1387e39226bdSJiawei Wang }
1388e39226bdSJiawei Wang 
1389e39226bdSJiawei Wang static void
139079a7e409SViacheslav Ovsiienko mlx5_glue_dv_free_pp(struct mlx5dv_pp *pp)
139179a7e409SViacheslav Ovsiienko {
139279a7e409SViacheslav Ovsiienko #ifdef HAVE_MLX5DV_PP_ALLOC
139379a7e409SViacheslav Ovsiienko 	mlx5dv_pp_free(pp);
139479a7e409SViacheslav Ovsiienko #else
139579a7e409SViacheslav Ovsiienko 	RTE_SET_USED(pp);
139679a7e409SViacheslav Ovsiienko #endif
139779a7e409SViacheslav Ovsiienko }
139879a7e409SViacheslav Ovsiienko 
139972f75660SOphir Munk __rte_cache_aligned
140072f75660SOphir Munk const struct mlx5_glue *mlx5_glue = &(const struct mlx5_glue) {
140172f75660SOphir Munk 	.version = MLX5_GLUE_VERSION,
140272f75660SOphir Munk 	.fork_init = mlx5_glue_fork_init,
140372f75660SOphir Munk 	.alloc_pd = mlx5_glue_alloc_pd,
140472f75660SOphir Munk 	.dealloc_pd = mlx5_glue_dealloc_pd,
140572f75660SOphir Munk 	.get_device_list = mlx5_glue_get_device_list,
140672f75660SOphir Munk 	.free_device_list = mlx5_glue_free_device_list,
140772f75660SOphir Munk 	.open_device = mlx5_glue_open_device,
140872f75660SOphir Munk 	.close_device = mlx5_glue_close_device,
140972f75660SOphir Munk 	.query_device = mlx5_glue_query_device,
141072f75660SOphir Munk 	.query_device_ex = mlx5_glue_query_device_ex,
141172f75660SOphir Munk 	.query_rt_values_ex = mlx5_glue_query_rt_values_ex,
141272f75660SOphir Munk 	.query_port = mlx5_glue_query_port,
141372f75660SOphir Munk 	.create_comp_channel = mlx5_glue_create_comp_channel,
141472f75660SOphir Munk 	.destroy_comp_channel = mlx5_glue_destroy_comp_channel,
141572f75660SOphir Munk 	.create_cq = mlx5_glue_create_cq,
141672f75660SOphir Munk 	.destroy_cq = mlx5_glue_destroy_cq,
141772f75660SOphir Munk 	.get_cq_event = mlx5_glue_get_cq_event,
141872f75660SOphir Munk 	.ack_cq_events = mlx5_glue_ack_cq_events,
141972f75660SOphir Munk 	.create_rwq_ind_table = mlx5_glue_create_rwq_ind_table,
142072f75660SOphir Munk 	.destroy_rwq_ind_table = mlx5_glue_destroy_rwq_ind_table,
142172f75660SOphir Munk 	.create_wq = mlx5_glue_create_wq,
142272f75660SOphir Munk 	.destroy_wq = mlx5_glue_destroy_wq,
142372f75660SOphir Munk 	.modify_wq = mlx5_glue_modify_wq,
142472f75660SOphir Munk 	.create_flow = mlx5_glue_create_flow,
142572f75660SOphir Munk 	.destroy_flow = mlx5_glue_destroy_flow,
142672f75660SOphir Munk 	.destroy_flow_action = mlx5_glue_destroy_flow_action,
142772f75660SOphir Munk 	.create_qp = mlx5_glue_create_qp,
142872f75660SOphir Munk 	.create_qp_ex = mlx5_glue_create_qp_ex,
142972f75660SOphir Munk 	.destroy_qp = mlx5_glue_destroy_qp,
143072f75660SOphir Munk 	.modify_qp = mlx5_glue_modify_qp,
143172f75660SOphir Munk 	.reg_mr = mlx5_glue_reg_mr,
1432*6ebd062eSMichael Baum 	.reg_mr_iova = mlx5_glue_reg_mr_iova,
143372f75660SOphir Munk 	.alloc_null_mr = mlx5_glue_alloc_null_mr,
143472f75660SOphir Munk 	.dereg_mr = mlx5_glue_dereg_mr,
143572f75660SOphir Munk 	.create_counter_set = mlx5_glue_create_counter_set,
143672f75660SOphir Munk 	.destroy_counter_set = mlx5_glue_destroy_counter_set,
143772f75660SOphir Munk 	.describe_counter_set = mlx5_glue_describe_counter_set,
143872f75660SOphir Munk 	.query_counter_set = mlx5_glue_query_counter_set,
143972f75660SOphir Munk 	.create_counters = mlx5_glue_create_counters,
144072f75660SOphir Munk 	.destroy_counters = mlx5_glue_destroy_counters,
144172f75660SOphir Munk 	.attach_counters = mlx5_glue_attach_counters,
144272f75660SOphir Munk 	.query_counters = mlx5_glue_query_counters,
144372f75660SOphir Munk 	.ack_async_event = mlx5_glue_ack_async_event,
144472f75660SOphir Munk 	.get_async_event = mlx5_glue_get_async_event,
144572f75660SOphir Munk 	.port_state_str = mlx5_glue_port_state_str,
144672f75660SOphir Munk 	.cq_ex_to_cq = mlx5_glue_cq_ex_to_cq,
144772f75660SOphir Munk 	.dr_create_flow_action_dest_flow_tbl =
144872f75660SOphir Munk 		mlx5_glue_dr_create_flow_action_dest_flow_tbl,
144972f75660SOphir Munk 	.dr_create_flow_action_dest_port =
145072f75660SOphir Munk 		mlx5_glue_dr_create_flow_action_dest_port,
145172f75660SOphir Munk 	.dr_create_flow_action_drop =
145272f75660SOphir Munk 		mlx5_glue_dr_create_flow_action_drop,
145372f75660SOphir Munk 	.dr_create_flow_action_push_vlan =
145472f75660SOphir Munk 		mlx5_glue_dr_create_flow_action_push_vlan,
145572f75660SOphir Munk 	.dr_create_flow_action_pop_vlan =
145672f75660SOphir Munk 		mlx5_glue_dr_create_flow_action_pop_vlan,
145772f75660SOphir Munk 	.dr_create_flow_tbl = mlx5_glue_dr_create_flow_tbl,
145872f75660SOphir Munk 	.dr_destroy_flow_tbl = mlx5_glue_dr_destroy_flow_tbl,
145972f75660SOphir Munk 	.dr_create_domain = mlx5_glue_dr_create_domain,
146072f75660SOphir Munk 	.dr_destroy_domain = mlx5_glue_dr_destroy_domain,
14616e0cd74aSBing Zhao 	.dr_sync_domain = mlx5_glue_dr_sync_domain,
146272f75660SOphir Munk 	.dv_create_cq = mlx5_glue_dv_create_cq,
146372f75660SOphir Munk 	.dv_create_wq = mlx5_glue_dv_create_wq,
146472f75660SOphir Munk 	.dv_query_device = mlx5_glue_dv_query_device,
146572f75660SOphir Munk 	.dv_set_context_attr = mlx5_glue_dv_set_context_attr,
146672f75660SOphir Munk 	.dv_init_obj = mlx5_glue_dv_init_obj,
146772f75660SOphir Munk 	.dv_create_qp = mlx5_glue_dv_create_qp,
146872f75660SOphir Munk 	.dv_create_flow_matcher = mlx5_glue_dv_create_flow_matcher,
146972f75660SOphir Munk 	.dv_create_flow = mlx5_glue_dv_create_flow,
147072f75660SOphir Munk 	.dv_create_flow_action_counter =
147172f75660SOphir Munk 		mlx5_glue_dv_create_flow_action_counter,
147272f75660SOphir Munk 	.dv_create_flow_action_dest_ibv_qp =
147372f75660SOphir Munk 		mlx5_glue_dv_create_flow_action_dest_ibv_qp,
147472f75660SOphir Munk 	.dv_create_flow_action_dest_devx_tir =
147572f75660SOphir Munk 		mlx5_glue_dv_create_flow_action_dest_devx_tir,
147672f75660SOphir Munk 	.dv_create_flow_action_modify_header =
147772f75660SOphir Munk 		mlx5_glue_dv_create_flow_action_modify_header,
147872f75660SOphir Munk 	.dv_create_flow_action_packet_reformat =
147972f75660SOphir Munk 		mlx5_glue_dv_create_flow_action_packet_reformat,
148072f75660SOphir Munk 	.dv_create_flow_action_tag =  mlx5_glue_dv_create_flow_action_tag,
148172f75660SOphir Munk 	.dv_create_flow_action_meter = mlx5_glue_dv_create_flow_action_meter,
148272f75660SOphir Munk 	.dv_modify_flow_action_meter = mlx5_glue_dv_modify_flow_action_meter,
1483a2999c7bSDekel Peled 	.dv_create_flow_action_aso = mlx5_glue_dv_create_flow_action_aso,
1484d4d85aa6SShiri Kuzin 	.dr_create_flow_action_default_miss =
1485d4d85aa6SShiri Kuzin 		mlx5_glue_dr_create_flow_action_default_miss,
148672f75660SOphir Munk 	.dv_destroy_flow = mlx5_glue_dv_destroy_flow,
148772f75660SOphir Munk 	.dv_destroy_flow_matcher = mlx5_glue_dv_destroy_flow_matcher,
148872f75660SOphir Munk 	.dv_open_device = mlx5_glue_dv_open_device,
148972f75660SOphir Munk 	.devx_obj_create = mlx5_glue_devx_obj_create,
149072f75660SOphir Munk 	.devx_obj_destroy = mlx5_glue_devx_obj_destroy,
149172f75660SOphir Munk 	.devx_obj_query = mlx5_glue_devx_obj_query,
149272f75660SOphir Munk 	.devx_obj_modify = mlx5_glue_devx_obj_modify,
149372f75660SOphir Munk 	.devx_general_cmd = mlx5_glue_devx_general_cmd,
149472f75660SOphir Munk 	.devx_create_cmd_comp = mlx5_glue_devx_create_cmd_comp,
149572f75660SOphir Munk 	.devx_destroy_cmd_comp = mlx5_glue_devx_destroy_cmd_comp,
149672f75660SOphir Munk 	.devx_obj_query_async = mlx5_glue_devx_obj_query_async,
149772f75660SOphir Munk 	.devx_get_async_cmd_comp = mlx5_glue_devx_get_async_cmd_comp,
149872f75660SOphir Munk 	.devx_umem_reg = mlx5_glue_devx_umem_reg,
149972f75660SOphir Munk 	.devx_umem_dereg = mlx5_glue_devx_umem_dereg,
150072f75660SOphir Munk 	.devx_qp_query = mlx5_glue_devx_qp_query,
150175a9a73dSMatan Azrad 	.devx_wq_query = mlx5_glue_devx_wq_query,
150272f75660SOphir Munk 	.devx_port_query = mlx5_glue_devx_port_query,
150372f75660SOphir Munk 	.dr_dump_domain = mlx5_glue_dr_dump_domain,
1504a38d22edSHaifei Luo 	.dr_dump_rule = mlx5_glue_dr_dump_single_rule,
1505bebee850SSuanming Mou 	.dr_reclaim_domain_memory = mlx5_glue_dr_reclaim_domain_memory,
1506a3def854SJiawei Wang 	.dr_create_flow_action_sampler =
1507a3def854SJiawei Wang 		mlx5_glue_dr_create_flow_action_sampler,
15084d23dd35SJiawei Wang 	.dr_create_flow_action_dest_array =
15094d23dd35SJiawei Wang 		mlx5_glue_dr_action_create_dest_array,
1510e39226bdSJiawei Wang 	.dr_allow_duplicate_rules = mlx5_glue_dr_allow_duplicate_rules,
151172f75660SOphir Munk 	.devx_query_eqn = mlx5_glue_devx_query_eqn,
151272f75660SOphir Munk 	.devx_create_event_channel = mlx5_glue_devx_create_event_channel,
151372f75660SOphir Munk 	.devx_destroy_event_channel = mlx5_glue_devx_destroy_event_channel,
151472f75660SOphir Munk 	.devx_subscribe_devx_event = mlx5_glue_devx_subscribe_devx_event,
151572f75660SOphir Munk 	.devx_subscribe_devx_event_fd = mlx5_glue_devx_subscribe_devx_event_fd,
151672f75660SOphir Munk 	.devx_get_event = mlx5_glue_devx_get_event,
151772f75660SOphir Munk 	.devx_alloc_uar = mlx5_glue_devx_alloc_uar,
151872f75660SOphir Munk 	.devx_free_uar = mlx5_glue_devx_free_uar,
151972f75660SOphir Munk 	.dv_alloc_var = mlx5_glue_dv_alloc_var,
152072f75660SOphir Munk 	.dv_free_var = mlx5_glue_dv_free_var,
152179a7e409SViacheslav Ovsiienko 	.dv_alloc_pp = mlx5_glue_dv_alloc_pp,
152279a7e409SViacheslav Ovsiienko 	.dv_free_pp = mlx5_glue_dv_free_pp,
152372f75660SOphir Munk };
1524