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 
87*b3a131c2STariq Toukan void mlx5e_reset_tx_moderation(struct mlx5e_params *params, u8 cq_period_mode);
88*b3a131c2STariq Toukan void mlx5e_reset_rx_moderation(struct mlx5e_params *params, u8 cq_period_mode);
89*b3a131c2STariq Toukan void mlx5e_set_tx_cq_mode_params(struct mlx5e_params *params, u8 cq_period_mode);
90*b3a131c2STariq Toukan void mlx5e_set_rx_cq_mode_params(struct mlx5e_params *params, u8 cq_period_mode);
91*b3a131c2STariq Toukan 
92*b3a131c2STariq Toukan bool slow_pci_heuristic(struct mlx5_core_dev *mdev);
93*b3a131c2STariq Toukan bool mlx5e_striding_rq_possible(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
94*b3a131c2STariq Toukan void mlx5e_build_rq_params(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
95*b3a131c2STariq Toukan void mlx5e_set_rq_type(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
96*b3a131c2STariq Toukan void mlx5e_init_rq_type_params(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
97*b3a131c2STariq Toukan 
98a011b49fSMaxim Mikityanskiy u16 mlx5e_get_linear_rq_headroom(struct mlx5e_params *params,
99a011b49fSMaxim Mikityanskiy 				 struct mlx5e_xsk_param *xsk);
100282c0c79SMaxim Mikityanskiy u32 mlx5e_rx_get_min_frag_sz(struct mlx5e_params *params,
101282c0c79SMaxim Mikityanskiy 			     struct mlx5e_xsk_param *xsk);
102db05815bSMaxim Mikityanskiy u8 mlx5e_mpwqe_log_pkts_per_wqe(struct mlx5e_params *params,
103db05815bSMaxim Mikityanskiy 				struct mlx5e_xsk_param *xsk);
104db05815bSMaxim Mikityanskiy bool mlx5e_rx_is_linear_skb(struct mlx5e_params *params,
105db05815bSMaxim Mikityanskiy 			    struct mlx5e_xsk_param *xsk);
1069a22d5d8SMaxim Mikityanskiy bool mlx5e_rx_mpwqe_is_linear_skb(struct mlx5_core_dev *mdev,
107db05815bSMaxim Mikityanskiy 				  struct mlx5e_params *params,
108db05815bSMaxim Mikityanskiy 				  struct mlx5e_xsk_param *xsk);
109db05815bSMaxim Mikityanskiy u8 mlx5e_mpwqe_get_log_rq_size(struct mlx5e_params *params,
110db05815bSMaxim Mikityanskiy 			       struct mlx5e_xsk_param *xsk);
1119a22d5d8SMaxim Mikityanskiy u8 mlx5e_mpwqe_get_log_stride_size(struct mlx5_core_dev *mdev,
112db05815bSMaxim Mikityanskiy 				   struct mlx5e_params *params,
113db05815bSMaxim Mikityanskiy 				   struct mlx5e_xsk_param *xsk);
1149a22d5d8SMaxim Mikityanskiy u8 mlx5e_mpwqe_get_log_num_strides(struct mlx5_core_dev *mdev,
115db05815bSMaxim Mikityanskiy 				   struct mlx5e_params *params,
116db05815bSMaxim Mikityanskiy 				   struct mlx5e_xsk_param *xsk);
1179a22d5d8SMaxim Mikityanskiy u16 mlx5e_get_rq_headroom(struct mlx5_core_dev *mdev,
118db05815bSMaxim Mikityanskiy 			  struct mlx5e_params *params,
119db05815bSMaxim Mikityanskiy 			  struct mlx5e_xsk_param *xsk);
120db05815bSMaxim Mikityanskiy 
121db05815bSMaxim Mikityanskiy /* Build queue parameters */
122db05815bSMaxim Mikityanskiy 
1232f6b379cSMaxim Mikityanskiy void mlx5e_build_create_cq_param(struct mlx5e_create_cq_param *ccp, struct mlx5e_channel *c);
124db05815bSMaxim Mikityanskiy void mlx5e_build_rq_param(struct mlx5e_priv *priv,
125db05815bSMaxim Mikityanskiy 			  struct mlx5e_params *params,
126db05815bSMaxim Mikityanskiy 			  struct mlx5e_xsk_param *xsk,
1276debae2aSTariq Toukan 			  u16 q_counter,
128db05815bSMaxim Mikityanskiy 			  struct mlx5e_rq_param *param);
129*b3a131c2STariq Toukan void mlx5e_build_drop_rq_param(struct mlx5e_priv *priv,
130*b3a131c2STariq Toukan 			       u16 q_counter,
131*b3a131c2STariq Toukan 			       struct mlx5e_rq_param *param);
132db05815bSMaxim Mikityanskiy void mlx5e_build_sq_param_common(struct mlx5e_priv *priv,
133db05815bSMaxim Mikityanskiy 				 struct mlx5e_sq_param *param);
134214baf22SMaxim Mikityanskiy void mlx5e_build_sq_param(struct mlx5e_priv *priv, struct mlx5e_params *params,
135214baf22SMaxim Mikityanskiy 			  struct mlx5e_sq_param *param);
136db05815bSMaxim Mikityanskiy void mlx5e_build_tx_cq_param(struct mlx5e_priv *priv,
137db05815bSMaxim Mikityanskiy 			     struct mlx5e_params *params,
138db05815bSMaxim Mikityanskiy 			     struct mlx5e_cq_param *param);
139db05815bSMaxim Mikityanskiy void mlx5e_build_xdpsq_param(struct mlx5e_priv *priv,
140db05815bSMaxim Mikityanskiy 			     struct mlx5e_params *params,
141db05815bSMaxim Mikityanskiy 			     struct mlx5e_sq_param *param);
142*b3a131c2STariq Toukan void mlx5e_build_channel_param(struct mlx5e_priv *priv,
143*b3a131c2STariq Toukan 			       struct mlx5e_params *params,
144*b3a131c2STariq Toukan 			       u16 q_counter,
145*b3a131c2STariq Toukan 			       struct mlx5e_channel_param *cparam);
1469a22d5d8SMaxim Mikityanskiy 
147579524c6SVladyslav Tarasiuk u16 mlx5e_calc_sq_stop_room(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
148579524c6SVladyslav Tarasiuk int mlx5e_validate_params(struct mlx5e_priv *priv, struct mlx5e_params *params);
149579524c6SVladyslav Tarasiuk 
1509a22d5d8SMaxim Mikityanskiy #endif /* __MLX5_EN_PARAMS_H__ */
151