xref: /dpdk/drivers/common/mlx5/linux/mlx5_glue.h (revision d4d85aa6f13aed654b2cd8344fe30ec7b7aba7c7)
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 #ifndef MLX5_GLUE_H_
772f75660SOphir Munk #define MLX5_GLUE_H_
872f75660SOphir Munk 
972f75660SOphir Munk #include <stddef.h>
1072f75660SOphir Munk #include <stdint.h>
1172f75660SOphir Munk /* Verbs headers do not support -pedantic. */
1272f75660SOphir Munk #ifdef PEDANTIC
1372f75660SOphir Munk #pragma GCC diagnostic ignored "-Wpedantic"
1472f75660SOphir Munk #endif
1572f75660SOphir Munk #include <infiniband/mlx5dv.h>
1672f75660SOphir Munk #include <infiniband/verbs.h>
1772f75660SOphir Munk #ifdef PEDANTIC
1872f75660SOphir Munk #pragma GCC diagnostic error "-Wpedantic"
1972f75660SOphir Munk #endif
2072f75660SOphir Munk 
2172f75660SOphir Munk #include <rte_byteorder.h>
2272f75660SOphir Munk 
2372f75660SOphir Munk #include "mlx5_autoconf.h"
2472f75660SOphir Munk 
2572f75660SOphir Munk #ifndef MLX5_GLUE_VERSION
2672f75660SOphir Munk #define MLX5_GLUE_VERSION ""
2772f75660SOphir Munk #endif
2872f75660SOphir Munk 
2972f75660SOphir Munk #ifndef HAVE_IBV_DEVICE_COUNTERS_SET_V42
3072f75660SOphir Munk struct ibv_counter_set;
3172f75660SOphir Munk struct ibv_counter_set_data;
3272f75660SOphir Munk struct ibv_counter_set_description;
3372f75660SOphir Munk struct ibv_counter_set_init_attr;
3472f75660SOphir Munk struct ibv_query_counter_set_attr;
3572f75660SOphir Munk #endif
3672f75660SOphir Munk 
3772f75660SOphir Munk #ifndef HAVE_IBV_DEVICE_COUNTERS_SET_V45
3872f75660SOphir Munk struct ibv_counters;
3972f75660SOphir Munk struct ibv_counters_init_attr;
4072f75660SOphir Munk struct ibv_counter_attach_attr;
4172f75660SOphir Munk #endif
4272f75660SOphir Munk 
4372f75660SOphir Munk #ifndef HAVE_IBV_DEVICE_TUNNEL_SUPPORT
4472f75660SOphir Munk struct mlx5dv_qp_init_attr;
4572f75660SOphir Munk #endif
4672f75660SOphir Munk 
4772f75660SOphir Munk #ifndef HAVE_IBV_DEVICE_STRIDING_RQ_SUPPORT
4872f75660SOphir Munk struct mlx5dv_wq_init_attr;
4972f75660SOphir Munk #endif
5072f75660SOphir Munk 
5172f75660SOphir Munk #ifndef HAVE_IBV_FLOW_DV_SUPPORT
5272f75660SOphir Munk struct mlx5dv_flow_matcher;
5372f75660SOphir Munk struct mlx5dv_flow_matcher_attr;
5472f75660SOphir Munk struct mlx5dv_flow_action_attr;
5572f75660SOphir Munk struct mlx5dv_flow_match_parameters;
5672f75660SOphir Munk struct mlx5dv_dr_flow_meter_attr;
5772f75660SOphir Munk struct ibv_flow_action;
5872f75660SOphir Munk enum mlx5dv_flow_action_packet_reformat_type { packet_reformat_type = 0, };
5972f75660SOphir Munk enum mlx5dv_flow_table_type { flow_table_type = 0, };
6072f75660SOphir Munk #endif
6172f75660SOphir Munk 
6272f75660SOphir Munk #ifndef HAVE_IBV_FLOW_DEVX_COUNTERS
6372f75660SOphir Munk #define MLX5DV_FLOW_ACTION_COUNTERS_DEVX 0
6472f75660SOphir Munk #endif
6572f75660SOphir Munk 
6672f75660SOphir Munk #ifndef HAVE_IBV_DEVX_OBJ
6772f75660SOphir Munk struct mlx5dv_devx_obj;
6872f75660SOphir Munk struct mlx5dv_devx_umem { uint32_t umem_id; };
6972f75660SOphir Munk struct mlx5dv_devx_uar { void *reg_addr; void *base_addr; uint32_t page_id; };
7072f75660SOphir Munk #endif
7172f75660SOphir Munk 
7272f75660SOphir Munk #ifndef HAVE_IBV_DEVX_ASYNC
7372f75660SOphir Munk struct mlx5dv_devx_cmd_comp;
7472f75660SOphir Munk struct mlx5dv_devx_async_cmd_hdr;
7572f75660SOphir Munk #endif
7672f75660SOphir Munk 
7772f75660SOphir Munk #ifndef HAVE_MLX5DV_DR
7872f75660SOphir Munk enum  mlx5dv_dr_domain_type { unused, };
7972f75660SOphir Munk struct mlx5dv_dr_domain;
8072f75660SOphir Munk #endif
8172f75660SOphir Munk 
8272f75660SOphir Munk #ifndef HAVE_MLX5DV_DR_DEVX_PORT
8372f75660SOphir Munk struct mlx5dv_devx_port;
8472f75660SOphir Munk #endif
8572f75660SOphir Munk 
8672f75660SOphir Munk #ifndef HAVE_MLX5_DR_CREATE_ACTION_FLOW_METER
8772f75660SOphir Munk struct mlx5dv_dr_flow_meter_attr;
8872f75660SOphir Munk #endif
8972f75660SOphir Munk 
9072f75660SOphir Munk #ifndef HAVE_IBV_DEVX_EVENT
9172f75660SOphir Munk struct mlx5dv_devx_event_channel { int fd; };
9272f75660SOphir Munk struct mlx5dv_devx_async_event_hdr;
9372f75660SOphir Munk #define MLX5DV_DEVX_CREATE_EVENT_CHANNEL_FLAGS_OMIT_EV_DATA 1
9472f75660SOphir Munk #endif
9572f75660SOphir Munk 
9672f75660SOphir Munk #ifndef HAVE_IBV_VAR
9772f75660SOphir Munk struct mlx5dv_var { uint32_t page_id; uint32_t length; off_t mmap_off;
9872f75660SOphir Munk 			uint64_t comp_mask; };
9972f75660SOphir Munk #endif
10072f75660SOphir Munk 
10172f75660SOphir Munk #ifndef HAVE_IBV_RELAXED_ORDERING
10272f75660SOphir Munk #define IBV_ACCESS_RELAXED_ORDERING 0
10372f75660SOphir Munk #endif
10472f75660SOphir Munk 
10572f75660SOphir Munk /* LIB_GLUE_VERSION must be updated every time this structure is modified. */
10672f75660SOphir Munk struct mlx5_glue {
10772f75660SOphir Munk 	const char *version;
10872f75660SOphir Munk 	int (*fork_init)(void);
10972f75660SOphir Munk 	struct ibv_pd *(*alloc_pd)(struct ibv_context *context);
11072f75660SOphir Munk 	int (*dealloc_pd)(struct ibv_pd *pd);
11172f75660SOphir Munk 	struct ibv_device **(*get_device_list)(int *num_devices);
11272f75660SOphir Munk 	void (*free_device_list)(struct ibv_device **list);
11372f75660SOphir Munk 	struct ibv_context *(*open_device)(struct ibv_device *device);
11472f75660SOphir Munk 	int (*close_device)(struct ibv_context *context);
11572f75660SOphir Munk 	int (*query_device)(struct ibv_context *context,
11672f75660SOphir Munk 			    struct ibv_device_attr *device_attr);
11772f75660SOphir Munk 	int (*query_device_ex)(struct ibv_context *context,
11872f75660SOphir Munk 			       const struct ibv_query_device_ex_input *input,
11972f75660SOphir Munk 			       struct ibv_device_attr_ex *attr);
12072f75660SOphir Munk 	int (*query_rt_values_ex)(struct ibv_context *context,
12172f75660SOphir Munk 			       struct ibv_values_ex *values);
12272f75660SOphir Munk 	int (*query_port)(struct ibv_context *context, uint8_t port_num,
12372f75660SOphir Munk 			  struct ibv_port_attr *port_attr);
12472f75660SOphir Munk 	struct ibv_comp_channel *(*create_comp_channel)
12572f75660SOphir Munk 		(struct ibv_context *context);
12672f75660SOphir Munk 	int (*destroy_comp_channel)(struct ibv_comp_channel *channel);
12772f75660SOphir Munk 	struct ibv_cq *(*create_cq)(struct ibv_context *context, int cqe,
12872f75660SOphir Munk 				    void *cq_context,
12972f75660SOphir Munk 				    struct ibv_comp_channel *channel,
13072f75660SOphir Munk 				    int comp_vector);
13172f75660SOphir Munk 	int (*destroy_cq)(struct ibv_cq *cq);
13272f75660SOphir Munk 	int (*get_cq_event)(struct ibv_comp_channel *channel,
13372f75660SOphir Munk 			    struct ibv_cq **cq, void **cq_context);
13472f75660SOphir Munk 	void (*ack_cq_events)(struct ibv_cq *cq, unsigned int nevents);
13572f75660SOphir Munk 	struct ibv_rwq_ind_table *(*create_rwq_ind_table)
13672f75660SOphir Munk 		(struct ibv_context *context,
13772f75660SOphir Munk 		 struct ibv_rwq_ind_table_init_attr *init_attr);
13872f75660SOphir Munk 	int (*destroy_rwq_ind_table)(struct ibv_rwq_ind_table *rwq_ind_table);
13972f75660SOphir Munk 	struct ibv_wq *(*create_wq)(struct ibv_context *context,
14072f75660SOphir Munk 				    struct ibv_wq_init_attr *wq_init_attr);
14172f75660SOphir Munk 	int (*destroy_wq)(struct ibv_wq *wq);
14272f75660SOphir Munk 	int (*modify_wq)(struct ibv_wq *wq, struct ibv_wq_attr *wq_attr);
14372f75660SOphir Munk 	struct ibv_flow *(*create_flow)(struct ibv_qp *qp,
14472f75660SOphir Munk 					struct ibv_flow_attr *flow);
14572f75660SOphir Munk 	int (*destroy_flow)(struct ibv_flow *flow_id);
14672f75660SOphir Munk 	int (*destroy_flow_action)(void *action);
14772f75660SOphir Munk 	struct ibv_qp *(*create_qp)(struct ibv_pd *pd,
14872f75660SOphir Munk 				    struct ibv_qp_init_attr *qp_init_attr);
14972f75660SOphir Munk 	struct ibv_qp *(*create_qp_ex)
15072f75660SOphir Munk 		(struct ibv_context *context,
15172f75660SOphir Munk 		 struct ibv_qp_init_attr_ex *qp_init_attr_ex);
15272f75660SOphir Munk 	int (*destroy_qp)(struct ibv_qp *qp);
15372f75660SOphir Munk 	int (*modify_qp)(struct ibv_qp *qp, struct ibv_qp_attr *attr,
15472f75660SOphir Munk 			 int attr_mask);
15572f75660SOphir Munk 	struct ibv_mr *(*reg_mr)(struct ibv_pd *pd, void *addr,
15672f75660SOphir Munk 				 size_t length, int access);
15772f75660SOphir Munk 	struct ibv_mr *(*alloc_null_mr)(struct ibv_pd *pd);
15872f75660SOphir Munk 	int (*dereg_mr)(struct ibv_mr *mr);
15972f75660SOphir Munk 	struct ibv_counter_set *(*create_counter_set)
16072f75660SOphir Munk 		(struct ibv_context *context,
16172f75660SOphir Munk 		 struct ibv_counter_set_init_attr *init_attr);
16272f75660SOphir Munk 	int (*destroy_counter_set)(struct ibv_counter_set *cs);
16372f75660SOphir Munk 	int (*describe_counter_set)
16472f75660SOphir Munk 		(struct ibv_context *context,
16572f75660SOphir Munk 		 uint16_t counter_set_id,
16672f75660SOphir Munk 		 struct ibv_counter_set_description *cs_desc);
16772f75660SOphir Munk 	int (*query_counter_set)(struct ibv_query_counter_set_attr *query_attr,
16872f75660SOphir Munk 				 struct ibv_counter_set_data *cs_data);
16972f75660SOphir Munk 	struct ibv_counters *(*create_counters)
17072f75660SOphir Munk 		(struct ibv_context *context,
17172f75660SOphir Munk 		 struct ibv_counters_init_attr *init_attr);
17272f75660SOphir Munk 	int (*destroy_counters)(struct ibv_counters *counters);
17372f75660SOphir Munk 	int (*attach_counters)(struct ibv_counters *counters,
17472f75660SOphir Munk 			       struct ibv_counter_attach_attr *attr,
17572f75660SOphir Munk 			       struct ibv_flow *flow);
17672f75660SOphir Munk 	int (*query_counters)(struct ibv_counters *counters,
17772f75660SOphir Munk 			      uint64_t *counters_value,
17872f75660SOphir Munk 			      uint32_t ncounters,
17972f75660SOphir Munk 			      uint32_t flags);
18072f75660SOphir Munk 	void (*ack_async_event)(struct ibv_async_event *event);
18172f75660SOphir Munk 	int (*get_async_event)(struct ibv_context *context,
18272f75660SOphir Munk 			       struct ibv_async_event *event);
18372f75660SOphir Munk 	const char *(*port_state_str)(enum ibv_port_state port_state);
18472f75660SOphir Munk 	struct ibv_cq *(*cq_ex_to_cq)(struct ibv_cq_ex *cq);
18572f75660SOphir Munk 	void *(*dr_create_flow_action_dest_flow_tbl)(void *tbl);
18672f75660SOphir Munk 	void *(*dr_create_flow_action_dest_port)(void *domain,
18772f75660SOphir Munk 						 uint32_t port);
18872f75660SOphir Munk 	void *(*dr_create_flow_action_drop)();
18972f75660SOphir Munk 	void *(*dr_create_flow_action_push_vlan)
19072f75660SOphir Munk 					(struct mlx5dv_dr_domain *domain,
19172f75660SOphir Munk 					 rte_be32_t vlan_tag);
19272f75660SOphir Munk 	void *(*dr_create_flow_action_pop_vlan)();
19372f75660SOphir Munk 	void *(*dr_create_flow_tbl)(void *domain, uint32_t level);
19472f75660SOphir Munk 	int (*dr_destroy_flow_tbl)(void *tbl);
19572f75660SOphir Munk 	void *(*dr_create_domain)(struct ibv_context *ctx,
19672f75660SOphir Munk 				  enum mlx5dv_dr_domain_type domain);
19772f75660SOphir Munk 	int (*dr_destroy_domain)(void *domain);
19872f75660SOphir Munk 	struct ibv_cq_ex *(*dv_create_cq)
19972f75660SOphir Munk 		(struct ibv_context *context,
20072f75660SOphir Munk 		 struct ibv_cq_init_attr_ex *cq_attr,
20172f75660SOphir Munk 		 struct mlx5dv_cq_init_attr *mlx5_cq_attr);
20272f75660SOphir Munk 	struct ibv_wq *(*dv_create_wq)
20372f75660SOphir Munk 		(struct ibv_context *context,
20472f75660SOphir Munk 		 struct ibv_wq_init_attr *wq_attr,
20572f75660SOphir Munk 		 struct mlx5dv_wq_init_attr *mlx5_wq_attr);
20672f75660SOphir Munk 	int (*dv_query_device)(struct ibv_context *ctx_in,
20772f75660SOphir Munk 			       struct mlx5dv_context *attrs_out);
20872f75660SOphir Munk 	int (*dv_set_context_attr)(struct ibv_context *ibv_ctx,
20972f75660SOphir Munk 				   enum mlx5dv_set_ctx_attr_type type,
21072f75660SOphir Munk 				   void *attr);
21172f75660SOphir Munk 	int (*dv_init_obj)(struct mlx5dv_obj *obj, uint64_t obj_type);
21272f75660SOphir Munk 	struct ibv_qp *(*dv_create_qp)
21372f75660SOphir Munk 		(struct ibv_context *context,
21472f75660SOphir Munk 		 struct ibv_qp_init_attr_ex *qp_init_attr_ex,
21572f75660SOphir Munk 		 struct mlx5dv_qp_init_attr *dv_qp_init_attr);
21672f75660SOphir Munk 	void *(*dv_create_flow_matcher)
21772f75660SOphir Munk 		(struct ibv_context *context,
21872f75660SOphir Munk 		 struct mlx5dv_flow_matcher_attr *matcher_attr,
21972f75660SOphir Munk 		 void *tbl);
22072f75660SOphir Munk 	void *(*dv_create_flow)(void *matcher, void *match_value,
22172f75660SOphir Munk 			  size_t num_actions, void *actions[]);
22272f75660SOphir Munk 	void *(*dv_create_flow_action_counter)(void *obj, uint32_t  offset);
22372f75660SOphir Munk 	void *(*dv_create_flow_action_dest_ibv_qp)(void *qp);
22472f75660SOphir Munk 	void *(*dv_create_flow_action_dest_devx_tir)(void *tir);
22572f75660SOphir Munk 	void *(*dv_create_flow_action_modify_header)
22672f75660SOphir Munk 		(struct ibv_context *ctx, enum mlx5dv_flow_table_type ft_type,
22772f75660SOphir Munk 		 void *domain, uint64_t flags, size_t actions_sz,
22872f75660SOphir Munk 		 uint64_t actions[]);
22972f75660SOphir Munk 	void *(*dv_create_flow_action_packet_reformat)
23072f75660SOphir Munk 		(struct ibv_context *ctx,
23172f75660SOphir Munk 		 enum mlx5dv_flow_action_packet_reformat_type reformat_type,
23272f75660SOphir Munk 		 enum mlx5dv_flow_table_type ft_type,
23372f75660SOphir Munk 		 struct mlx5dv_dr_domain *domain,
23472f75660SOphir Munk 		 uint32_t flags, size_t data_sz, void *data);
23572f75660SOphir Munk 	void *(*dv_create_flow_action_tag)(uint32_t tag);
23672f75660SOphir Munk 	void *(*dv_create_flow_action_meter)
23772f75660SOphir Munk 		(struct mlx5dv_dr_flow_meter_attr *attr);
23872f75660SOphir Munk 	int (*dv_modify_flow_action_meter)(void *action,
23972f75660SOphir Munk 		struct mlx5dv_dr_flow_meter_attr *attr, uint64_t modify_bits);
240*d4d85aa6SShiri Kuzin 	void *(*dr_create_flow_action_default_miss)(void);
24172f75660SOphir Munk 	int (*dv_destroy_flow)(void *flow);
24272f75660SOphir Munk 	int (*dv_destroy_flow_matcher)(void *matcher);
24372f75660SOphir Munk 	struct ibv_context *(*dv_open_device)(struct ibv_device *device);
24472f75660SOphir Munk 	struct mlx5dv_var *(*dv_alloc_var)(struct ibv_context *context,
24572f75660SOphir Munk 					   uint32_t flags);
24672f75660SOphir Munk 	void (*dv_free_var)(struct mlx5dv_var *var);
24772f75660SOphir Munk 	struct mlx5dv_devx_uar *(*devx_alloc_uar)(struct ibv_context *context,
24872f75660SOphir Munk 						  uint32_t flags);
24972f75660SOphir Munk 	void (*devx_free_uar)(struct mlx5dv_devx_uar *devx_uar);
25072f75660SOphir Munk 	struct mlx5dv_devx_obj *(*devx_obj_create)
25172f75660SOphir Munk 					(struct ibv_context *ctx,
25272f75660SOphir Munk 					 const void *in, size_t inlen,
25372f75660SOphir Munk 					 void *out, size_t outlen);
25472f75660SOphir Munk 	int (*devx_obj_destroy)(struct mlx5dv_devx_obj *obj);
25572f75660SOphir Munk 	int (*devx_obj_query)(struct mlx5dv_devx_obj *obj,
25672f75660SOphir Munk 			      const void *in, size_t inlen,
25772f75660SOphir Munk 			      void *out, size_t outlen);
25872f75660SOphir Munk 	int (*devx_obj_modify)(struct mlx5dv_devx_obj *obj,
25972f75660SOphir Munk 			       const void *in, size_t inlen,
26072f75660SOphir Munk 			       void *out, size_t outlen);
26172f75660SOphir Munk 	int (*devx_general_cmd)(struct ibv_context *context,
26272f75660SOphir Munk 				const void *in, size_t inlen,
26372f75660SOphir Munk 				void *out, size_t outlen);
26472f75660SOphir Munk 	struct mlx5dv_devx_cmd_comp *(*devx_create_cmd_comp)
26572f75660SOphir Munk 					(struct ibv_context *context);
26672f75660SOphir Munk 	void (*devx_destroy_cmd_comp)(struct mlx5dv_devx_cmd_comp *cmd_comp);
26772f75660SOphir Munk 	int (*devx_obj_query_async)(struct mlx5dv_devx_obj *obj,
26872f75660SOphir Munk 				    const void *in, size_t inlen,
26972f75660SOphir Munk 				    size_t outlen, uint64_t wr_id,
27072f75660SOphir Munk 				    struct mlx5dv_devx_cmd_comp *cmd_comp);
27172f75660SOphir Munk 	int (*devx_get_async_cmd_comp)(struct mlx5dv_devx_cmd_comp *cmd_comp,
27272f75660SOphir Munk 				       struct mlx5dv_devx_async_cmd_hdr *resp,
27372f75660SOphir Munk 				       size_t cmd_resp_len);
27472f75660SOphir Munk 	struct mlx5dv_devx_umem *(*devx_umem_reg)(struct ibv_context *context,
27572f75660SOphir Munk 						  void *addr, size_t size,
27672f75660SOphir Munk 						  uint32_t access);
27772f75660SOphir Munk 	int (*devx_umem_dereg)(struct mlx5dv_devx_umem *dv_devx_umem);
27872f75660SOphir Munk 	int (*devx_qp_query)(struct ibv_qp *qp,
27972f75660SOphir Munk 			     const void *in, size_t inlen,
28072f75660SOphir Munk 			     void *out, size_t outlen);
28172f75660SOphir Munk 	int (*devx_port_query)(struct ibv_context *ctx,
28272f75660SOphir Munk 			       uint32_t port_num,
28372f75660SOphir Munk 			       struct mlx5dv_devx_port *mlx5_devx_port);
28472f75660SOphir Munk 	int (*dr_dump_domain)(FILE *file, void *domain);
28572f75660SOphir Munk 	int (*devx_query_eqn)(struct ibv_context *context, uint32_t cpus,
28672f75660SOphir Munk 			      uint32_t *eqn);
28772f75660SOphir Munk 	struct mlx5dv_devx_event_channel *(*devx_create_event_channel)
28872f75660SOphir Munk 				(struct ibv_context *context, int flags);
28972f75660SOphir Munk 	void (*devx_destroy_event_channel)
29072f75660SOphir Munk 			(struct mlx5dv_devx_event_channel *event_channel);
29172f75660SOphir Munk 	int (*devx_subscribe_devx_event)
29272f75660SOphir Munk 			(struct mlx5dv_devx_event_channel *event_channel,
29372f75660SOphir Munk 			 struct mlx5dv_devx_obj *obj,
29472f75660SOphir Munk 			 uint16_t events_sz,
29572f75660SOphir Munk 			 uint16_t events_num[],
29672f75660SOphir Munk 			 uint64_t cookie);
29772f75660SOphir Munk 	int (*devx_subscribe_devx_event_fd)
29872f75660SOphir Munk 			(struct mlx5dv_devx_event_channel *event_channel,
29972f75660SOphir Munk 			 int fd,
30072f75660SOphir Munk 			 struct mlx5dv_devx_obj *obj,
30172f75660SOphir Munk 			 uint16_t event_num);
30272f75660SOphir Munk 	ssize_t (*devx_get_event)
30372f75660SOphir Munk 			(struct mlx5dv_devx_event_channel *event_channel,
30472f75660SOphir Munk 			 struct mlx5dv_devx_async_event_hdr *event_data,
30572f75660SOphir Munk 			 size_t event_resp_len);
306bebee850SSuanming Mou 	void (*dr_reclaim_domain_memory)(void *domain, uint32_t enable);
30772f75660SOphir Munk };
30872f75660SOphir Munk 
30972f75660SOphir Munk extern const struct mlx5_glue *mlx5_glue;
31072f75660SOphir Munk 
31172f75660SOphir Munk #endif /* MLX5_GLUE_H_ */
312