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