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;
126470d2e7SMaxim Mikityanskiy 	bool unaligned;
13a069e977SMaxim Mikityanskiy };
14a069e977SMaxim Mikityanskiy 
1532a23653SMaxim Mikityanskiy struct mlx5e_cq_param {
1632a23653SMaxim Mikityanskiy 	u32                        cqc[MLX5_ST_SZ_DW(cqc)];
1732a23653SMaxim Mikityanskiy 	struct mlx5_wq_param       wq;
1832a23653SMaxim Mikityanskiy 	u16                        eq_ix;
1932a23653SMaxim Mikityanskiy 	u8                         cq_period_mode;
2032a23653SMaxim Mikityanskiy };
2132a23653SMaxim Mikityanskiy 
22c293ac92STariq Toukan struct mlx5e_rq_param {
23c293ac92STariq Toukan 	struct mlx5e_cq_param      cqp;
24c293ac92STariq Toukan 	u32                        rqc[MLX5_ST_SZ_DW(rqc)];
25c293ac92STariq Toukan 	struct mlx5_wq_param       wq;
26c293ac92STariq Toukan 	struct mlx5e_rq_frags_info frags_info;
27*4e7401fcSMaxim Mikityanskiy 	u32                        xdp_frag_size;
28c293ac92STariq Toukan };
29c293ac92STariq Toukan 
30c293ac92STariq Toukan struct mlx5e_sq_param {
31c293ac92STariq Toukan 	struct mlx5e_cq_param      cqp;
32c293ac92STariq Toukan 	u32                        sqc[MLX5_ST_SZ_DW(sqc)];
33c293ac92STariq Toukan 	struct mlx5_wq_param       wq;
34c293ac92STariq Toukan 	bool                       is_mpw;
35e9ce991bSTariq Toukan 	bool                       is_tls;
369ded70faSMaxim Mikityanskiy 	bool                       is_xdp_mb;
37579524c6SVladyslav Tarasiuk 	u16                        stop_room;
38c293ac92STariq Toukan };
39c293ac92STariq Toukan 
4032a23653SMaxim Mikityanskiy struct mlx5e_channel_param {
4132a23653SMaxim Mikityanskiy 	struct mlx5e_rq_param      rq;
42c293ac92STariq Toukan 	struct mlx5e_sq_param      txq_sq;
4332a23653SMaxim Mikityanskiy 	struct mlx5e_sq_param      xdp_sq;
4432a23653SMaxim Mikityanskiy 	struct mlx5e_sq_param      icosq;
45c293ac92STariq Toukan 	struct mlx5e_sq_param      async_icosq;
4632a23653SMaxim Mikityanskiy };
4732a23653SMaxim Mikityanskiy 
48145e5637SEran Ben Elisha struct mlx5e_create_sq_param {
49145e5637SEran Ben Elisha 	struct mlx5_wq_ctrl        *wq_ctrl;
50145e5637SEran Ben Elisha 	u32                         cqn;
511880bc4eSEran Ben Elisha 	u32                         ts_cqe_to_dest_cqn;
52145e5637SEran Ben Elisha 	u32                         tisn;
53145e5637SEran Ben Elisha 	u8                          tis_lst_sz;
54145e5637SEran Ben Elisha 	u8                          min_inline_mode;
55145e5637SEran Ben Elisha };
56145e5637SEran Ben Elisha 
57997ce6afSMaxim Mikityanskiy /* Striding RQ dynamic parameters */
58997ce6afSMaxim Mikityanskiy 
59e5a3cc83SMaxim Mikityanskiy u8 mlx5e_mpwrq_page_shift(struct mlx5_core_dev *mdev, struct mlx5e_xsk_param *xsk);
60168723c1SMaxim Mikityanskiy enum mlx5e_mpwrq_umr_mode
61168723c1SMaxim Mikityanskiy mlx5e_mpwrq_umr_mode(struct mlx5_core_dev *mdev, struct mlx5e_xsk_param *xsk);
62168723c1SMaxim Mikityanskiy u8 mlx5e_mpwrq_umr_entry_size(enum mlx5e_mpwrq_umr_mode mode);
63168723c1SMaxim Mikityanskiy u8 mlx5e_mpwrq_log_wqe_sz(struct mlx5_core_dev *mdev, u8 page_shift,
64168723c1SMaxim Mikityanskiy 			  enum mlx5e_mpwrq_umr_mode umr_mode);
65168723c1SMaxim Mikityanskiy u8 mlx5e_mpwrq_pages_per_wqe(struct mlx5_core_dev *mdev, u8 page_shift,
66168723c1SMaxim Mikityanskiy 			     enum mlx5e_mpwrq_umr_mode umr_mode);
67168723c1SMaxim Mikityanskiy u16 mlx5e_mpwrq_umr_wqe_sz(struct mlx5_core_dev *mdev, u8 page_shift,
68168723c1SMaxim Mikityanskiy 			   enum mlx5e_mpwrq_umr_mode umr_mode);
69168723c1SMaxim Mikityanskiy u8 mlx5e_mpwrq_umr_wqebbs(struct mlx5_core_dev *mdev, u8 page_shift,
70168723c1SMaxim Mikityanskiy 			  enum mlx5e_mpwrq_umr_mode umr_mode);
71168723c1SMaxim Mikityanskiy u8 mlx5e_mpwrq_mtts_per_wqe(struct mlx5_core_dev *mdev, u8 page_shift,
72168723c1SMaxim Mikityanskiy 			    enum mlx5e_mpwrq_umr_mode umr_mode);
73168723c1SMaxim Mikityanskiy u32 mlx5e_mpwrq_max_num_entries(struct mlx5_core_dev *mdev,
74168723c1SMaxim Mikityanskiy 				enum mlx5e_mpwrq_umr_mode umr_mode);
75168723c1SMaxim Mikityanskiy u8 mlx5e_mpwrq_max_log_rq_pkts(struct mlx5_core_dev *mdev, u8 page_shift,
76168723c1SMaxim Mikityanskiy 			       enum mlx5e_mpwrq_umr_mode umr_mode);
77997ce6afSMaxim Mikityanskiy 
7832a23653SMaxim Mikityanskiy /* Parameter calculations */
7932a23653SMaxim Mikityanskiy 
80b3a131c2STariq Toukan void mlx5e_reset_tx_moderation(struct mlx5e_params *params, u8 cq_period_mode);
81b3a131c2STariq Toukan void mlx5e_reset_rx_moderation(struct mlx5e_params *params, u8 cq_period_mode);
82b3a131c2STariq Toukan void mlx5e_set_tx_cq_mode_params(struct mlx5e_params *params, u8 cq_period_mode);
83b3a131c2STariq Toukan void mlx5e_set_rx_cq_mode_params(struct mlx5e_params *params, u8 cq_period_mode);
84b3a131c2STariq Toukan 
85b3a131c2STariq Toukan bool slow_pci_heuristic(struct mlx5_core_dev *mdev);
8644f4fd03SMaxim Mikityanskiy int mlx5e_mpwrq_validate_regular(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
8744f4fd03SMaxim Mikityanskiy int mlx5e_mpwrq_validate_xsk(struct mlx5_core_dev *mdev, struct mlx5e_params *params,
8844f4fd03SMaxim Mikityanskiy 			     struct mlx5e_xsk_param *xsk);
89b3a131c2STariq Toukan void mlx5e_build_rq_params(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
90b3a131c2STariq Toukan void mlx5e_set_rq_type(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
91b3a131c2STariq Toukan void mlx5e_init_rq_type_params(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
92b3a131c2STariq Toukan 
93a011b49fSMaxim Mikityanskiy u16 mlx5e_get_linear_rq_headroom(struct mlx5e_params *params,
94a011b49fSMaxim Mikityanskiy 				 struct mlx5e_xsk_param *xsk);
95e5a3cc83SMaxim Mikityanskiy bool mlx5e_rx_is_linear_skb(struct mlx5_core_dev *mdev,
96e5a3cc83SMaxim Mikityanskiy 			    struct mlx5e_params *params,
97db05815bSMaxim Mikityanskiy 			    struct mlx5e_xsk_param *xsk);
989a22d5d8SMaxim Mikityanskiy bool mlx5e_rx_mpwqe_is_linear_skb(struct mlx5_core_dev *mdev,
99db05815bSMaxim Mikityanskiy 				  struct mlx5e_params *params,
100db05815bSMaxim Mikityanskiy 				  struct mlx5e_xsk_param *xsk);
101e5a3cc83SMaxim Mikityanskiy u8 mlx5e_mpwqe_get_log_rq_size(struct mlx5_core_dev *mdev,
102e5a3cc83SMaxim Mikityanskiy 			       struct mlx5e_params *params,
103db05815bSMaxim Mikityanskiy 			       struct mlx5e_xsk_param *xsk);
104e5ca8fb0SBen Ben-Ishay u8 mlx5e_shampo_get_log_hd_entry_size(struct mlx5_core_dev *mdev,
105e5ca8fb0SBen Ben-Ishay 				      struct mlx5e_params *params);
106e5ca8fb0SBen Ben-Ishay u8 mlx5e_shampo_get_log_rsrv_size(struct mlx5_core_dev *mdev,
107e5ca8fb0SBen Ben-Ishay 				  struct mlx5e_params *params);
108e5ca8fb0SBen Ben-Ishay u8 mlx5e_shampo_get_log_pkt_per_rsrv(struct mlx5_core_dev *mdev,
109e5ca8fb0SBen Ben-Ishay 				     struct mlx5e_params *params);
110e5ca8fb0SBen Ben-Ishay u32 mlx5e_shampo_hd_per_wqe(struct mlx5_core_dev *mdev,
111e5ca8fb0SBen Ben-Ishay 			    struct mlx5e_params *params,
112e5ca8fb0SBen Ben-Ishay 			    struct mlx5e_rq_param *rq_param);
113e5ca8fb0SBen Ben-Ishay u32 mlx5e_shampo_hd_per_wq(struct mlx5_core_dev *mdev,
114e5ca8fb0SBen Ben-Ishay 			   struct mlx5e_params *params,
115e5ca8fb0SBen Ben-Ishay 			   struct mlx5e_rq_param *rq_param);
1169a22d5d8SMaxim Mikityanskiy u8 mlx5e_mpwqe_get_log_stride_size(struct mlx5_core_dev *mdev,
117db05815bSMaxim Mikityanskiy 				   struct mlx5e_params *params,
118db05815bSMaxim Mikityanskiy 				   struct mlx5e_xsk_param *xsk);
1199a22d5d8SMaxim Mikityanskiy u8 mlx5e_mpwqe_get_log_num_strides(struct mlx5_core_dev *mdev,
120db05815bSMaxim Mikityanskiy 				   struct mlx5e_params *params,
121db05815bSMaxim Mikityanskiy 				   struct mlx5e_xsk_param *xsk);
1224b5fba4aSTariq Toukan u8 mlx5e_mpwqe_get_min_wqe_bulk(unsigned int wq_sz);
1239a22d5d8SMaxim Mikityanskiy u16 mlx5e_get_rq_headroom(struct mlx5_core_dev *mdev,
124db05815bSMaxim Mikityanskiy 			  struct mlx5e_params *params,
125db05815bSMaxim Mikityanskiy 			  struct mlx5e_xsk_param *xsk);
126db05815bSMaxim Mikityanskiy 
127db05815bSMaxim Mikityanskiy /* Build queue parameters */
128db05815bSMaxim Mikityanskiy 
1292f6b379cSMaxim Mikityanskiy void mlx5e_build_create_cq_param(struct mlx5e_create_cq_param *ccp, struct mlx5e_channel *c);
1306980ffa0STariq Toukan int mlx5e_build_rq_param(struct mlx5_core_dev *mdev,
131db05815bSMaxim Mikityanskiy 			 struct mlx5e_params *params,
132db05815bSMaxim Mikityanskiy 			 struct mlx5e_xsk_param *xsk,
1336debae2aSTariq Toukan 			 u16 q_counter,
134db05815bSMaxim Mikityanskiy 			 struct mlx5e_rq_param *param);
13589564920STariq Toukan void mlx5e_build_drop_rq_param(struct mlx5_core_dev *mdev,
136b3a131c2STariq Toukan 			       u16 q_counter,
137b3a131c2STariq Toukan 			       struct mlx5e_rq_param *param);
13889564920STariq Toukan void mlx5e_build_sq_param_common(struct mlx5_core_dev *mdev,
139db05815bSMaxim Mikityanskiy 				 struct mlx5e_sq_param *param);
14089564920STariq Toukan void mlx5e_build_sq_param(struct mlx5_core_dev *mdev,
14189564920STariq Toukan 			  struct mlx5e_params *params,
142214baf22SMaxim Mikityanskiy 			  struct mlx5e_sq_param *param);
14389564920STariq Toukan void mlx5e_build_tx_cq_param(struct mlx5_core_dev *mdev,
144db05815bSMaxim Mikityanskiy 			     struct mlx5e_params *params,
145db05815bSMaxim Mikityanskiy 			     struct mlx5e_cq_param *param);
14689564920STariq Toukan void mlx5e_build_xdpsq_param(struct mlx5_core_dev *mdev,
147db05815bSMaxim Mikityanskiy 			     struct mlx5e_params *params,
1489ded70faSMaxim Mikityanskiy 			     struct mlx5e_xsk_param *xsk,
149db05815bSMaxim Mikityanskiy 			     struct mlx5e_sq_param *param);
1506980ffa0STariq Toukan int mlx5e_build_channel_param(struct mlx5_core_dev *mdev,
151b3a131c2STariq Toukan 			      struct mlx5e_params *params,
152b3a131c2STariq Toukan 			      u16 q_counter,
153b3a131c2STariq Toukan 			      struct mlx5e_channel_param *cparam);
1549a22d5d8SMaxim Mikityanskiy 
155579524c6SVladyslav Tarasiuk u16 mlx5e_calc_sq_stop_room(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
15689564920STariq Toukan int mlx5e_validate_params(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
157f52ac702STariq Toukan bool mlx5e_verify_params_rx_mpwqe_strides(struct mlx5_core_dev *mdev,
158f52ac702STariq Toukan 					  struct mlx5e_params *params,
159f52ac702STariq Toukan 					  struct mlx5e_xsk_param *xsk);
160579524c6SVladyslav Tarasiuk 
mlx5e_params_print_info(struct mlx5_core_dev * mdev,struct mlx5e_params * params)16138438d39STariq Toukan static inline void mlx5e_params_print_info(struct mlx5_core_dev *mdev,
16238438d39STariq Toukan 					   struct mlx5e_params *params)
16338438d39STariq Toukan {
16438438d39STariq Toukan 	mlx5_core_info(mdev, "MLX5E: StrdRq(%d) RqSz(%ld) StrdSz(%ld) RxCqeCmprss(%d %s)\n",
16538438d39STariq Toukan 		       params->rq_wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ,
16638438d39STariq Toukan 		       params->rq_wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ ?
16738438d39STariq Toukan 		       BIT(mlx5e_mpwqe_get_log_rq_size(mdev, params, NULL)) :
16838438d39STariq Toukan 		       BIT(params->log_rq_mtu_frames),
16938438d39STariq Toukan 		       BIT(mlx5e_mpwqe_get_log_stride_size(mdev, params, NULL)),
17038438d39STariq Toukan 		       MLX5E_GET_PFLAG(params, MLX5E_PFLAG_RX_CQE_COMPRESS),
17138438d39STariq Toukan 		       MLX5_CAP_GEN(mdev, enhanced_cqe_compression) ?
17238438d39STariq Toukan 				       "enhanced" : "basic");
17338438d39STariq Toukan };
17438438d39STariq Toukan 
1759a22d5d8SMaxim Mikityanskiy #endif /* __MLX5_EN_PARAMS_H__ */
176