1 /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
2 /* Copyright (c) 2019 Mellanox Technologies. */
3 
4 #ifndef __MLX5_EN_PARAMS_H__
5 #define __MLX5_EN_PARAMS_H__
6 
7 #include "en.h"
8 
9 struct mlx5e_xsk_param {
10 	u16 headroom;
11 	u16 chunk_size;
12 };
13 
14 struct mlx5e_cq_param {
15 	u32                        cqc[MLX5_ST_SZ_DW(cqc)];
16 	struct mlx5_wq_param       wq;
17 	u16                        eq_ix;
18 	u8                         cq_period_mode;
19 };
20 
21 struct mlx5e_rq_param {
22 	struct mlx5e_cq_param      cqp;
23 	u32                        rqc[MLX5_ST_SZ_DW(rqc)];
24 	struct mlx5_wq_param       wq;
25 	struct mlx5e_rq_frags_info frags_info;
26 };
27 
28 struct mlx5e_sq_param {
29 	struct mlx5e_cq_param      cqp;
30 	u32                        sqc[MLX5_ST_SZ_DW(sqc)];
31 	struct mlx5_wq_param       wq;
32 	bool                       is_mpw;
33 	u16                        stop_room;
34 };
35 
36 struct mlx5e_channel_param {
37 	struct mlx5e_rq_param      rq;
38 	struct mlx5e_sq_param      txq_sq;
39 	struct mlx5e_sq_param      xdp_sq;
40 	struct mlx5e_sq_param      icosq;
41 	struct mlx5e_sq_param      async_icosq;
42 };
43 
44 struct mlx5e_create_sq_param {
45 	struct mlx5_wq_ctrl        *wq_ctrl;
46 	u32                         cqn;
47 	u32                         ts_cqe_to_dest_cqn;
48 	u32                         tisn;
49 	u8                          tis_lst_sz;
50 	u8                          min_inline_mode;
51 };
52 
53 static inline bool mlx5e_qid_get_ch_if_in_group(struct mlx5e_params *params,
54 						u16 qid,
55 						enum mlx5e_rq_group group,
56 						u16 *ix)
57 {
58 	int nch = params->num_channels;
59 	int ch = qid - nch * group;
60 
61 	if (ch < 0 || ch >= nch)
62 		return false;
63 
64 	*ix = ch;
65 	return true;
66 }
67 
68 static inline void mlx5e_qid_get_ch_and_group(struct mlx5e_params *params,
69 					      u16 qid,
70 					      u16 *ix,
71 					      enum mlx5e_rq_group *group)
72 {
73 	u16 nch = params->num_channels;
74 
75 	*ix = qid % nch;
76 	*group = qid / nch;
77 }
78 
79 static inline bool mlx5e_qid_validate(const struct mlx5e_profile *profile,
80 				      struct mlx5e_params *params, u64 qid)
81 {
82 	return qid < params->num_channels * profile->rq_groups;
83 }
84 
85 /* Parameter calculations */
86 
87 u16 mlx5e_get_linear_rq_headroom(struct mlx5e_params *params,
88 				 struct mlx5e_xsk_param *xsk);
89 u32 mlx5e_rx_get_min_frag_sz(struct mlx5e_params *params,
90 			     struct mlx5e_xsk_param *xsk);
91 u32 mlx5e_rx_get_linear_frag_sz(struct mlx5e_params *params,
92 				struct mlx5e_xsk_param *xsk);
93 u8 mlx5e_mpwqe_log_pkts_per_wqe(struct mlx5e_params *params,
94 				struct mlx5e_xsk_param *xsk);
95 bool mlx5e_rx_is_linear_skb(struct mlx5e_params *params,
96 			    struct mlx5e_xsk_param *xsk);
97 bool mlx5e_rx_mpwqe_is_linear_skb(struct mlx5_core_dev *mdev,
98 				  struct mlx5e_params *params,
99 				  struct mlx5e_xsk_param *xsk);
100 u8 mlx5e_mpwqe_get_log_rq_size(struct mlx5e_params *params,
101 			       struct mlx5e_xsk_param *xsk);
102 u8 mlx5e_mpwqe_get_log_stride_size(struct mlx5_core_dev *mdev,
103 				   struct mlx5e_params *params,
104 				   struct mlx5e_xsk_param *xsk);
105 u8 mlx5e_mpwqe_get_log_num_strides(struct mlx5_core_dev *mdev,
106 				   struct mlx5e_params *params,
107 				   struct mlx5e_xsk_param *xsk);
108 u16 mlx5e_get_rq_headroom(struct mlx5_core_dev *mdev,
109 			  struct mlx5e_params *params,
110 			  struct mlx5e_xsk_param *xsk);
111 
112 /* Build queue parameters */
113 
114 void mlx5e_build_create_cq_param(struct mlx5e_create_cq_param *ccp, struct mlx5e_channel *c);
115 void mlx5e_build_rq_param(struct mlx5e_priv *priv,
116 			  struct mlx5e_params *params,
117 			  struct mlx5e_xsk_param *xsk,
118 			  struct mlx5e_rq_param *param);
119 void mlx5e_build_sq_param_common(struct mlx5e_priv *priv,
120 				 struct mlx5e_sq_param *param);
121 void mlx5e_build_rx_cq_param(struct mlx5e_priv *priv,
122 			     struct mlx5e_params *params,
123 			     struct mlx5e_xsk_param *xsk,
124 			     struct mlx5e_cq_param *param);
125 void mlx5e_build_tx_cq_param(struct mlx5e_priv *priv,
126 			     struct mlx5e_params *params,
127 			     struct mlx5e_cq_param *param);
128 void mlx5e_build_ico_cq_param(struct mlx5e_priv *priv,
129 			      u8 log_wq_size,
130 			      struct mlx5e_cq_param *param);
131 void mlx5e_build_icosq_param(struct mlx5e_priv *priv,
132 			     u8 log_wq_size,
133 			     struct mlx5e_sq_param *param);
134 void mlx5e_build_xdpsq_param(struct mlx5e_priv *priv,
135 			     struct mlx5e_params *params,
136 			     struct mlx5e_sq_param *param);
137 
138 u16 mlx5e_calc_sq_stop_room(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
139 int mlx5e_validate_params(struct mlx5e_priv *priv, struct mlx5e_params *params);
140 
141 #endif /* __MLX5_EN_PARAMS_H__ */
142