19a22d5d8SMaxim Mikityanskiy /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
29a22d5d8SMaxim Mikityanskiy /* Copyright (c) 2019 Mellanox Technologies. */
39a22d5d8SMaxim Mikityanskiy 
49a22d5d8SMaxim Mikityanskiy #ifndef __MLX5_EN_PARAMS_H__
59a22d5d8SMaxim Mikityanskiy #define __MLX5_EN_PARAMS_H__
69a22d5d8SMaxim Mikityanskiy 
79a22d5d8SMaxim Mikityanskiy #include "en.h"
89a22d5d8SMaxim Mikityanskiy 
9a069e977SMaxim Mikityanskiy struct mlx5e_xsk_param {
10a069e977SMaxim Mikityanskiy 	u16 headroom;
11a069e977SMaxim Mikityanskiy 	u16 chunk_size;
12a069e977SMaxim Mikityanskiy };
13a069e977SMaxim Mikityanskiy 
1432a23653SMaxim Mikityanskiy struct mlx5e_cq_param {
1532a23653SMaxim Mikityanskiy 	u32                        cqc[MLX5_ST_SZ_DW(cqc)];
1632a23653SMaxim Mikityanskiy 	struct mlx5_wq_param       wq;
1732a23653SMaxim Mikityanskiy 	u16                        eq_ix;
1832a23653SMaxim Mikityanskiy 	u8                         cq_period_mode;
1932a23653SMaxim Mikityanskiy };
2032a23653SMaxim Mikityanskiy 
21c293ac92STariq Toukan struct mlx5e_rq_param {
22c293ac92STariq Toukan 	struct mlx5e_cq_param      cqp;
23c293ac92STariq Toukan 	u32                        rqc[MLX5_ST_SZ_DW(rqc)];
24c293ac92STariq Toukan 	struct mlx5_wq_param       wq;
25c293ac92STariq Toukan 	struct mlx5e_rq_frags_info frags_info;
26c293ac92STariq Toukan };
27c293ac92STariq Toukan 
28c293ac92STariq Toukan struct mlx5e_sq_param {
29c293ac92STariq Toukan 	struct mlx5e_cq_param      cqp;
30c293ac92STariq Toukan 	u32                        sqc[MLX5_ST_SZ_DW(sqc)];
31c293ac92STariq Toukan 	struct mlx5_wq_param       wq;
32c293ac92STariq Toukan 	bool                       is_mpw;
33579524c6SVladyslav Tarasiuk 	u16                        stop_room;
34c293ac92STariq Toukan };
35c293ac92STariq Toukan 
3632a23653SMaxim Mikityanskiy struct mlx5e_channel_param {
3732a23653SMaxim Mikityanskiy 	struct mlx5e_rq_param      rq;
38c293ac92STariq Toukan 	struct mlx5e_sq_param      txq_sq;
3932a23653SMaxim Mikityanskiy 	struct mlx5e_sq_param      xdp_sq;
4032a23653SMaxim Mikityanskiy 	struct mlx5e_sq_param      icosq;
41c293ac92STariq Toukan 	struct mlx5e_sq_param      async_icosq;
4232a23653SMaxim Mikityanskiy };
4332a23653SMaxim Mikityanskiy 
44145e5637SEran Ben Elisha struct mlx5e_create_sq_param {
45145e5637SEran Ben Elisha 	struct mlx5_wq_ctrl        *wq_ctrl;
46145e5637SEran Ben Elisha 	u32                         cqn;
471880bc4eSEran Ben Elisha 	u32                         ts_cqe_to_dest_cqn;
48145e5637SEran Ben Elisha 	u32                         tisn;
49145e5637SEran Ben Elisha 	u8                          tis_lst_sz;
50145e5637SEran Ben Elisha 	u8                          min_inline_mode;
51145e5637SEran Ben Elisha };
52145e5637SEran Ben Elisha 
53db05815bSMaxim Mikityanskiy static inline bool mlx5e_qid_get_ch_if_in_group(struct mlx5e_params *params,
54db05815bSMaxim Mikityanskiy 						u16 qid,
55db05815bSMaxim Mikityanskiy 						enum mlx5e_rq_group group,
56db05815bSMaxim Mikityanskiy 						u16 *ix)
57db05815bSMaxim Mikityanskiy {
58db05815bSMaxim Mikityanskiy 	int nch = params->num_channels;
59db05815bSMaxim Mikityanskiy 	int ch = qid - nch * group;
60db05815bSMaxim Mikityanskiy 
61db05815bSMaxim Mikityanskiy 	if (ch < 0 || ch >= nch)
62db05815bSMaxim Mikityanskiy 		return false;
63db05815bSMaxim Mikityanskiy 
64db05815bSMaxim Mikityanskiy 	*ix = ch;
65db05815bSMaxim Mikityanskiy 	return true;
66db05815bSMaxim Mikityanskiy }
67db05815bSMaxim Mikityanskiy 
68db05815bSMaxim Mikityanskiy static inline void mlx5e_qid_get_ch_and_group(struct mlx5e_params *params,
69db05815bSMaxim Mikityanskiy 					      u16 qid,
70db05815bSMaxim Mikityanskiy 					      u16 *ix,
71db05815bSMaxim Mikityanskiy 					      enum mlx5e_rq_group *group)
72db05815bSMaxim Mikityanskiy {
73db05815bSMaxim Mikityanskiy 	u16 nch = params->num_channels;
74db05815bSMaxim Mikityanskiy 
75db05815bSMaxim Mikityanskiy 	*ix = qid % nch;
76db05815bSMaxim Mikityanskiy 	*group = qid / nch;
77db05815bSMaxim Mikityanskiy }
78db05815bSMaxim Mikityanskiy 
79694826e3STariq Toukan static inline bool mlx5e_qid_validate(const struct mlx5e_profile *profile,
80694826e3STariq Toukan 				      struct mlx5e_params *params, u64 qid)
81db05815bSMaxim Mikityanskiy {
82694826e3STariq Toukan 	return qid < params->num_channels * profile->rq_groups;
83db05815bSMaxim Mikityanskiy }
84db05815bSMaxim Mikityanskiy 
8532a23653SMaxim Mikityanskiy /* Parameter calculations */
8632a23653SMaxim Mikityanskiy 
87a011b49fSMaxim Mikityanskiy u16 mlx5e_get_linear_rq_headroom(struct mlx5e_params *params,
88a011b49fSMaxim Mikityanskiy 				 struct mlx5e_xsk_param *xsk);
89282c0c79SMaxim Mikityanskiy u32 mlx5e_rx_get_min_frag_sz(struct mlx5e_params *params,
90282c0c79SMaxim Mikityanskiy 			     struct mlx5e_xsk_param *xsk);
91a069e977SMaxim Mikityanskiy u32 mlx5e_rx_get_linear_frag_sz(struct mlx5e_params *params,
92a069e977SMaxim Mikityanskiy 				struct mlx5e_xsk_param *xsk);
93db05815bSMaxim Mikityanskiy u8 mlx5e_mpwqe_log_pkts_per_wqe(struct mlx5e_params *params,
94db05815bSMaxim Mikityanskiy 				struct mlx5e_xsk_param *xsk);
95db05815bSMaxim Mikityanskiy bool mlx5e_rx_is_linear_skb(struct mlx5e_params *params,
96db05815bSMaxim Mikityanskiy 			    struct mlx5e_xsk_param *xsk);
979a22d5d8SMaxim Mikityanskiy bool mlx5e_rx_mpwqe_is_linear_skb(struct mlx5_core_dev *mdev,
98db05815bSMaxim Mikityanskiy 				  struct mlx5e_params *params,
99db05815bSMaxim Mikityanskiy 				  struct mlx5e_xsk_param *xsk);
100db05815bSMaxim Mikityanskiy u8 mlx5e_mpwqe_get_log_rq_size(struct mlx5e_params *params,
101db05815bSMaxim Mikityanskiy 			       struct mlx5e_xsk_param *xsk);
1029a22d5d8SMaxim Mikityanskiy u8 mlx5e_mpwqe_get_log_stride_size(struct mlx5_core_dev *mdev,
103db05815bSMaxim Mikityanskiy 				   struct mlx5e_params *params,
104db05815bSMaxim Mikityanskiy 				   struct mlx5e_xsk_param *xsk);
1059a22d5d8SMaxim Mikityanskiy u8 mlx5e_mpwqe_get_log_num_strides(struct mlx5_core_dev *mdev,
106db05815bSMaxim Mikityanskiy 				   struct mlx5e_params *params,
107db05815bSMaxim Mikityanskiy 				   struct mlx5e_xsk_param *xsk);
1089a22d5d8SMaxim Mikityanskiy u16 mlx5e_get_rq_headroom(struct mlx5_core_dev *mdev,
109db05815bSMaxim Mikityanskiy 			  struct mlx5e_params *params,
110db05815bSMaxim Mikityanskiy 			  struct mlx5e_xsk_param *xsk);
111db05815bSMaxim Mikityanskiy 
112db05815bSMaxim Mikityanskiy /* Build queue parameters */
113db05815bSMaxim Mikityanskiy 
114*2f6b379cSMaxim Mikityanskiy void mlx5e_build_create_cq_param(struct mlx5e_create_cq_param *ccp, struct mlx5e_channel *c);
115db05815bSMaxim Mikityanskiy void mlx5e_build_rq_param(struct mlx5e_priv *priv,
116db05815bSMaxim Mikityanskiy 			  struct mlx5e_params *params,
117db05815bSMaxim Mikityanskiy 			  struct mlx5e_xsk_param *xsk,
118db05815bSMaxim Mikityanskiy 			  struct mlx5e_rq_param *param);
119db05815bSMaxim Mikityanskiy void mlx5e_build_sq_param_common(struct mlx5e_priv *priv,
120db05815bSMaxim Mikityanskiy 				 struct mlx5e_sq_param *param);
121db05815bSMaxim Mikityanskiy void mlx5e_build_rx_cq_param(struct mlx5e_priv *priv,
122db05815bSMaxim Mikityanskiy 			     struct mlx5e_params *params,
123db05815bSMaxim Mikityanskiy 			     struct mlx5e_xsk_param *xsk,
124db05815bSMaxim Mikityanskiy 			     struct mlx5e_cq_param *param);
125db05815bSMaxim Mikityanskiy void mlx5e_build_tx_cq_param(struct mlx5e_priv *priv,
126db05815bSMaxim Mikityanskiy 			     struct mlx5e_params *params,
127db05815bSMaxim Mikityanskiy 			     struct mlx5e_cq_param *param);
128db05815bSMaxim Mikityanskiy void mlx5e_build_ico_cq_param(struct mlx5e_priv *priv,
129db05815bSMaxim Mikityanskiy 			      u8 log_wq_size,
130db05815bSMaxim Mikityanskiy 			      struct mlx5e_cq_param *param);
131db05815bSMaxim Mikityanskiy void mlx5e_build_icosq_param(struct mlx5e_priv *priv,
132db05815bSMaxim Mikityanskiy 			     u8 log_wq_size,
133db05815bSMaxim Mikityanskiy 			     struct mlx5e_sq_param *param);
134db05815bSMaxim Mikityanskiy void mlx5e_build_xdpsq_param(struct mlx5e_priv *priv,
135db05815bSMaxim Mikityanskiy 			     struct mlx5e_params *params,
136db05815bSMaxim Mikityanskiy 			     struct mlx5e_sq_param *param);
1379a22d5d8SMaxim Mikityanskiy 
138579524c6SVladyslav Tarasiuk u16 mlx5e_calc_sq_stop_room(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
139579524c6SVladyslav Tarasiuk int mlx5e_validate_params(struct mlx5e_priv *priv, struct mlx5e_params *params);
140579524c6SVladyslav Tarasiuk 
1419a22d5d8SMaxim Mikityanskiy #endif /* __MLX5_EN_PARAMS_H__ */
142