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 	bool                       is_tls;
34 	bool                       is_xdp_mb;
35 	u16                        stop_room;
36 };
37 
38 struct mlx5e_channel_param {
39 	struct mlx5e_rq_param      rq;
40 	struct mlx5e_sq_param      txq_sq;
41 	struct mlx5e_sq_param      xdp_sq;
42 	struct mlx5e_sq_param      icosq;
43 	struct mlx5e_sq_param      async_icosq;
44 };
45 
46 struct mlx5e_create_sq_param {
47 	struct mlx5_wq_ctrl        *wq_ctrl;
48 	u32                         cqn;
49 	u32                         ts_cqe_to_dest_cqn;
50 	u32                         tisn;
51 	u8                          tis_lst_sz;
52 	u8                          min_inline_mode;
53 };
54 
55 static inline bool mlx5e_qid_get_ch_if_in_group(struct mlx5e_params *params,
56 						u16 qid,
57 						enum mlx5e_rq_group group,
58 						u16 *ix)
59 {
60 	int nch = params->num_channels;
61 	int ch = qid - nch * group;
62 
63 	if (ch < 0 || ch >= nch)
64 		return false;
65 
66 	*ix = ch;
67 	return true;
68 }
69 
70 static inline void mlx5e_qid_get_ch_and_group(struct mlx5e_params *params,
71 					      u16 qid,
72 					      u16 *ix,
73 					      enum mlx5e_rq_group *group)
74 {
75 	u16 nch = params->num_channels;
76 
77 	*ix = qid % nch;
78 	*group = qid / nch;
79 }
80 
81 static inline bool mlx5e_qid_validate(const struct mlx5e_profile *profile,
82 				      struct mlx5e_params *params, u64 qid)
83 {
84 	return qid < params->num_channels * profile->rq_groups;
85 }
86 
87 /* Parameter calculations */
88 
89 void mlx5e_reset_tx_moderation(struct mlx5e_params *params, u8 cq_period_mode);
90 void mlx5e_reset_rx_moderation(struct mlx5e_params *params, u8 cq_period_mode);
91 void mlx5e_set_tx_cq_mode_params(struct mlx5e_params *params, u8 cq_period_mode);
92 void mlx5e_set_rx_cq_mode_params(struct mlx5e_params *params, u8 cq_period_mode);
93 
94 bool slow_pci_heuristic(struct mlx5_core_dev *mdev);
95 int mlx5e_mpwrq_validate_regular(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
96 int mlx5e_mpwrq_validate_xsk(struct mlx5_core_dev *mdev, struct mlx5e_params *params,
97 			     struct mlx5e_xsk_param *xsk);
98 void mlx5e_build_rq_params(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
99 void mlx5e_set_rq_type(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
100 void mlx5e_init_rq_type_params(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
101 
102 u16 mlx5e_get_linear_rq_headroom(struct mlx5e_params *params,
103 				 struct mlx5e_xsk_param *xsk);
104 u32 mlx5e_rx_get_min_frag_sz(struct mlx5e_params *params,
105 			     struct mlx5e_xsk_param *xsk);
106 u8 mlx5e_mpwqe_log_pkts_per_wqe(struct mlx5e_params *params,
107 				struct mlx5e_xsk_param *xsk);
108 bool mlx5e_rx_is_linear_skb(struct mlx5e_params *params,
109 			    struct mlx5e_xsk_param *xsk);
110 bool mlx5e_rx_mpwqe_is_linear_skb(struct mlx5_core_dev *mdev,
111 				  struct mlx5e_params *params,
112 				  struct mlx5e_xsk_param *xsk);
113 u8 mlx5e_mpwqe_get_log_rq_size(struct mlx5e_params *params,
114 			       struct mlx5e_xsk_param *xsk);
115 u8 mlx5e_shampo_get_log_hd_entry_size(struct mlx5_core_dev *mdev,
116 				      struct mlx5e_params *params);
117 u8 mlx5e_shampo_get_log_rsrv_size(struct mlx5_core_dev *mdev,
118 				  struct mlx5e_params *params);
119 u8 mlx5e_shampo_get_log_pkt_per_rsrv(struct mlx5_core_dev *mdev,
120 				     struct mlx5e_params *params);
121 u32 mlx5e_shampo_hd_per_wqe(struct mlx5_core_dev *mdev,
122 			    struct mlx5e_params *params,
123 			    struct mlx5e_rq_param *rq_param);
124 u32 mlx5e_shampo_hd_per_wq(struct mlx5_core_dev *mdev,
125 			   struct mlx5e_params *params,
126 			   struct mlx5e_rq_param *rq_param);
127 u8 mlx5e_mpwqe_get_log_stride_size(struct mlx5_core_dev *mdev,
128 				   struct mlx5e_params *params,
129 				   struct mlx5e_xsk_param *xsk);
130 u8 mlx5e_mpwqe_get_log_num_strides(struct mlx5_core_dev *mdev,
131 				   struct mlx5e_params *params,
132 				   struct mlx5e_xsk_param *xsk);
133 u8 mlx5e_mpwqe_get_min_wqe_bulk(unsigned int wq_sz);
134 u16 mlx5e_get_rq_headroom(struct mlx5_core_dev *mdev,
135 			  struct mlx5e_params *params,
136 			  struct mlx5e_xsk_param *xsk);
137 
138 /* Build queue parameters */
139 
140 void mlx5e_build_create_cq_param(struct mlx5e_create_cq_param *ccp, struct mlx5e_channel *c);
141 int mlx5e_build_rq_param(struct mlx5_core_dev *mdev,
142 			 struct mlx5e_params *params,
143 			 struct mlx5e_xsk_param *xsk,
144 			 u16 q_counter,
145 			 struct mlx5e_rq_param *param);
146 void mlx5e_build_drop_rq_param(struct mlx5_core_dev *mdev,
147 			       u16 q_counter,
148 			       struct mlx5e_rq_param *param);
149 void mlx5e_build_sq_param_common(struct mlx5_core_dev *mdev,
150 				 struct mlx5e_sq_param *param);
151 void mlx5e_build_sq_param(struct mlx5_core_dev *mdev,
152 			  struct mlx5e_params *params,
153 			  struct mlx5e_sq_param *param);
154 void mlx5e_build_tx_cq_param(struct mlx5_core_dev *mdev,
155 			     struct mlx5e_params *params,
156 			     struct mlx5e_cq_param *param);
157 void mlx5e_build_xdpsq_param(struct mlx5_core_dev *mdev,
158 			     struct mlx5e_params *params,
159 			     struct mlx5e_xsk_param *xsk,
160 			     struct mlx5e_sq_param *param);
161 int mlx5e_build_channel_param(struct mlx5_core_dev *mdev,
162 			      struct mlx5e_params *params,
163 			      u16 q_counter,
164 			      struct mlx5e_channel_param *cparam);
165 
166 u16 mlx5e_calc_sq_stop_room(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
167 int mlx5e_validate_params(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
168 
169 #endif /* __MLX5_EN_PARAMS_H__ */
170