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