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 9struct mlx5e_xsk_param { 10 u16 headroom; 11 u16 chunk_size; 12 bool unaligned; 13}; 14 15struct mlx5e_cq_param { 16 u32 cqc[MLX5_ST_SZ_DW(cqc)]; 17 struct mlx5_wq_param wq; 18 u16 eq_ix; 19 u8 cq_period_mode; 20}; 21 22struct mlx5e_rq_param { 23 struct mlx5e_cq_param cqp; 24 u32 rqc[MLX5_ST_SZ_DW(rqc)]; 25 struct mlx5_wq_param wq; 26 struct mlx5e_rq_frags_info frags_info; 27 u32 xdp_frag_size; 28}; 29 30struct mlx5e_sq_param { 31 struct mlx5e_cq_param cqp; 32 u32 sqc[MLX5_ST_SZ_DW(sqc)]; 33 struct mlx5_wq_param wq; 34 bool is_mpw; 35 bool is_tls; 36 bool is_xdp_mb; 37 u16 stop_room; 38}; 39 40struct mlx5e_channel_param { 41 struct mlx5e_rq_param rq; 42 struct mlx5e_sq_param txq_sq; 43 struct mlx5e_sq_param xdp_sq; 44 struct mlx5e_sq_param icosq; 45 struct mlx5e_sq_param async_icosq; 46}; 47 48struct mlx5e_create_sq_param { 49 struct mlx5_wq_ctrl *wq_ctrl; 50 u32 cqn; 51 u32 ts_cqe_to_dest_cqn; 52 u32 tisn; 53 u8 tis_lst_sz; 54 u8 min_inline_mode; 55}; 56 57/* Striding RQ dynamic parameters */ 58 59u8 mlx5e_mpwrq_page_shift(struct mlx5_core_dev *mdev, struct mlx5e_xsk_param *xsk); 60enum mlx5e_mpwrq_umr_mode 61mlx5e_mpwrq_umr_mode(struct mlx5_core_dev *mdev, struct mlx5e_xsk_param *xsk); 62u8 mlx5e_mpwrq_umr_entry_size(enum mlx5e_mpwrq_umr_mode mode); 63u8 mlx5e_mpwrq_log_wqe_sz(struct mlx5_core_dev *mdev, u8 page_shift, 64 enum mlx5e_mpwrq_umr_mode umr_mode); 65u8 mlx5e_mpwrq_pages_per_wqe(struct mlx5_core_dev *mdev, u8 page_shift, 66 enum mlx5e_mpwrq_umr_mode umr_mode); 67u16 mlx5e_mpwrq_umr_wqe_sz(struct mlx5_core_dev *mdev, u8 page_shift, 68 enum mlx5e_mpwrq_umr_mode umr_mode); 69u8 mlx5e_mpwrq_umr_wqebbs(struct mlx5_core_dev *mdev, u8 page_shift, 70 enum mlx5e_mpwrq_umr_mode umr_mode); 71u8 mlx5e_mpwrq_mtts_per_wqe(struct mlx5_core_dev *mdev, u8 page_shift, 72 enum mlx5e_mpwrq_umr_mode umr_mode); 73u32 mlx5e_mpwrq_max_num_entries(struct mlx5_core_dev *mdev, 74 enum mlx5e_mpwrq_umr_mode umr_mode); 75u8 mlx5e_mpwrq_max_log_rq_pkts(struct mlx5_core_dev *mdev, u8 page_shift, 76 enum mlx5e_mpwrq_umr_mode umr_mode); 77 78/* Parameter calculations */ 79 80void mlx5e_reset_tx_moderation(struct mlx5e_params *params, u8 cq_period_mode); 81void mlx5e_reset_rx_moderation(struct mlx5e_params *params, u8 cq_period_mode); 82void mlx5e_set_tx_cq_mode_params(struct mlx5e_params *params, u8 cq_period_mode); 83void mlx5e_set_rx_cq_mode_params(struct mlx5e_params *params, u8 cq_period_mode); 84 85bool slow_pci_heuristic(struct mlx5_core_dev *mdev); 86int mlx5e_mpwrq_validate_regular(struct mlx5_core_dev *mdev, struct mlx5e_params *params); 87int mlx5e_mpwrq_validate_xsk(struct mlx5_core_dev *mdev, struct mlx5e_params *params, 88 struct mlx5e_xsk_param *xsk); 89void mlx5e_build_rq_params(struct mlx5_core_dev *mdev, struct mlx5e_params *params); 90void mlx5e_set_rq_type(struct mlx5_core_dev *mdev, struct mlx5e_params *params); 91void mlx5e_init_rq_type_params(struct mlx5_core_dev *mdev, struct mlx5e_params *params); 92 93u16 mlx5e_get_linear_rq_headroom(struct mlx5e_params *params, 94 struct mlx5e_xsk_param *xsk); 95bool mlx5e_rx_is_linear_skb(struct mlx5_core_dev *mdev, 96 struct mlx5e_params *params, 97 struct mlx5e_xsk_param *xsk); 98bool mlx5e_rx_mpwqe_is_linear_skb(struct mlx5_core_dev *mdev, 99 struct mlx5e_params *params, 100 struct mlx5e_xsk_param *xsk); 101u8 mlx5e_mpwqe_get_log_rq_size(struct mlx5_core_dev *mdev, 102 struct mlx5e_params *params, 103 struct mlx5e_xsk_param *xsk); 104u8 mlx5e_shampo_get_log_hd_entry_size(struct mlx5_core_dev *mdev, 105 struct mlx5e_params *params); 106u8 mlx5e_shampo_get_log_rsrv_size(struct mlx5_core_dev *mdev, 107 struct mlx5e_params *params); 108u8 mlx5e_shampo_get_log_pkt_per_rsrv(struct mlx5_core_dev *mdev, 109 struct mlx5e_params *params); 110u32 mlx5e_shampo_hd_per_wqe(struct mlx5_core_dev *mdev, 111 struct mlx5e_params *params, 112 struct mlx5e_rq_param *rq_param); 113u32 mlx5e_shampo_hd_per_wq(struct mlx5_core_dev *mdev, 114 struct mlx5e_params *params, 115 struct mlx5e_rq_param *rq_param); 116u8 mlx5e_mpwqe_get_log_stride_size(struct mlx5_core_dev *mdev, 117 struct mlx5e_params *params, 118 struct mlx5e_xsk_param *xsk); 119u8 mlx5e_mpwqe_get_log_num_strides(struct mlx5_core_dev *mdev, 120 struct mlx5e_params *params, 121 struct mlx5e_xsk_param *xsk); 122u8 mlx5e_mpwqe_get_min_wqe_bulk(unsigned int wq_sz); 123u16 mlx5e_get_rq_headroom(struct mlx5_core_dev *mdev, 124 struct mlx5e_params *params, 125 struct mlx5e_xsk_param *xsk); 126 127/* Build queue parameters */ 128 129void mlx5e_build_create_cq_param(struct mlx5e_create_cq_param *ccp, struct mlx5e_channel *c); 130int mlx5e_build_rq_param(struct mlx5_core_dev *mdev, 131 struct mlx5e_params *params, 132 struct mlx5e_xsk_param *xsk, 133 struct mlx5e_rq_param *param); 134void mlx5e_build_drop_rq_param(struct mlx5_core_dev *mdev, 135 struct mlx5e_rq_param *param); 136void mlx5e_build_sq_param_common(struct mlx5_core_dev *mdev, 137 struct mlx5e_sq_param *param); 138void mlx5e_build_sq_param(struct mlx5_core_dev *mdev, 139 struct mlx5e_params *params, 140 struct mlx5e_sq_param *param); 141void mlx5e_build_tx_cq_param(struct mlx5_core_dev *mdev, 142 struct mlx5e_params *params, 143 struct mlx5e_cq_param *param); 144void mlx5e_build_xdpsq_param(struct mlx5_core_dev *mdev, 145 struct mlx5e_params *params, 146 struct mlx5e_xsk_param *xsk, 147 struct mlx5e_sq_param *param); 148int mlx5e_build_channel_param(struct mlx5_core_dev *mdev, 149 struct mlx5e_params *params, 150 struct mlx5e_channel_param *cparam); 151 152u16 mlx5e_calc_sq_stop_room(struct mlx5_core_dev *mdev, struct mlx5e_params *params); 153int mlx5e_validate_params(struct mlx5_core_dev *mdev, struct mlx5e_params *params); 154bool mlx5e_verify_params_rx_mpwqe_strides(struct mlx5_core_dev *mdev, 155 struct mlx5e_params *params, 156 struct mlx5e_xsk_param *xsk); 157 158static inline void mlx5e_params_print_info(struct mlx5_core_dev *mdev, 159 struct mlx5e_params *params) 160{ 161 mlx5_core_info(mdev, "MLX5E: StrdRq(%d) RqSz(%ld) StrdSz(%ld) RxCqeCmprss(%d %s)\n", 162 params->rq_wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ, 163 params->rq_wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ ? 164 BIT(mlx5e_mpwqe_get_log_rq_size(mdev, params, NULL)) : 165 BIT(params->log_rq_mtu_frames), 166 BIT(mlx5e_mpwqe_get_log_stride_size(mdev, params, NULL)), 167 MLX5E_GET_PFLAG(params, MLX5E_PFLAG_RX_CQE_COMPRESS), 168 MLX5_CAP_GEN(mdev, enhanced_cqe_compression) ? 169 "enhanced" : "basic"); 170}; 171 172#endif /* __MLX5_EN_PARAMS_H__ */ 173