Merge branch 'for-5.3/upstream-fixes' into for-linus
[linux-2.6-block.git] / drivers / net / ethernet / mellanox / mlx5 / core / en / params.h
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_rq_param {
15         u32                        rqc[MLX5_ST_SZ_DW(rqc)];
16         struct mlx5_wq_param       wq;
17         struct mlx5e_rq_frags_info frags_info;
18 };
19
20 struct mlx5e_sq_param {
21         u32                        sqc[MLX5_ST_SZ_DW(sqc)];
22         struct mlx5_wq_param       wq;
23         bool                       is_mpw;
24 };
25
26 struct mlx5e_cq_param {
27         u32                        cqc[MLX5_ST_SZ_DW(cqc)];
28         struct mlx5_wq_param       wq;
29         u16                        eq_ix;
30         u8                         cq_period_mode;
31 };
32
33 struct mlx5e_channel_param {
34         struct mlx5e_rq_param      rq;
35         struct mlx5e_sq_param      sq;
36         struct mlx5e_sq_param      xdp_sq;
37         struct mlx5e_sq_param      icosq;
38         struct mlx5e_cq_param      rx_cq;
39         struct mlx5e_cq_param      tx_cq;
40         struct mlx5e_cq_param      icosq_cq;
41 };
42
43 static inline bool mlx5e_qid_get_ch_if_in_group(struct mlx5e_params *params,
44                                                 u16 qid,
45                                                 enum mlx5e_rq_group group,
46                                                 u16 *ix)
47 {
48         int nch = params->num_channels;
49         int ch = qid - nch * group;
50
51         if (ch < 0 || ch >= nch)
52                 return false;
53
54         *ix = ch;
55         return true;
56 }
57
58 static inline void mlx5e_qid_get_ch_and_group(struct mlx5e_params *params,
59                                               u16 qid,
60                                               u16 *ix,
61                                               enum mlx5e_rq_group *group)
62 {
63         u16 nch = params->num_channels;
64
65         *ix = qid % nch;
66         *group = qid / nch;
67 }
68
69 static inline bool mlx5e_qid_validate(struct mlx5e_params *params, u64 qid)
70 {
71         return qid < params->num_channels * MLX5E_NUM_RQ_GROUPS;
72 }
73
74 /* Parameter calculations */
75
76 u16 mlx5e_get_linear_rq_headroom(struct mlx5e_params *params,
77                                  struct mlx5e_xsk_param *xsk);
78 u32 mlx5e_rx_get_linear_frag_sz(struct mlx5e_params *params,
79                                 struct mlx5e_xsk_param *xsk);
80 u8 mlx5e_mpwqe_log_pkts_per_wqe(struct mlx5e_params *params,
81                                 struct mlx5e_xsk_param *xsk);
82 bool mlx5e_rx_is_linear_skb(struct mlx5e_params *params,
83                             struct mlx5e_xsk_param *xsk);
84 bool mlx5e_rx_mpwqe_is_linear_skb(struct mlx5_core_dev *mdev,
85                                   struct mlx5e_params *params,
86                                   struct mlx5e_xsk_param *xsk);
87 u8 mlx5e_mpwqe_get_log_rq_size(struct mlx5e_params *params,
88                                struct mlx5e_xsk_param *xsk);
89 u8 mlx5e_mpwqe_get_log_stride_size(struct mlx5_core_dev *mdev,
90                                    struct mlx5e_params *params,
91                                    struct mlx5e_xsk_param *xsk);
92 u8 mlx5e_mpwqe_get_log_num_strides(struct mlx5_core_dev *mdev,
93                                    struct mlx5e_params *params,
94                                    struct mlx5e_xsk_param *xsk);
95 u16 mlx5e_get_rq_headroom(struct mlx5_core_dev *mdev,
96                           struct mlx5e_params *params,
97                           struct mlx5e_xsk_param *xsk);
98
99 /* Build queue parameters */
100
101 void mlx5e_build_rq_param(struct mlx5e_priv *priv,
102                           struct mlx5e_params *params,
103                           struct mlx5e_xsk_param *xsk,
104                           struct mlx5e_rq_param *param);
105 void mlx5e_build_sq_param_common(struct mlx5e_priv *priv,
106                                  struct mlx5e_sq_param *param);
107 void mlx5e_build_rx_cq_param(struct mlx5e_priv *priv,
108                              struct mlx5e_params *params,
109                              struct mlx5e_xsk_param *xsk,
110                              struct mlx5e_cq_param *param);
111 void mlx5e_build_tx_cq_param(struct mlx5e_priv *priv,
112                              struct mlx5e_params *params,
113                              struct mlx5e_cq_param *param);
114 void mlx5e_build_ico_cq_param(struct mlx5e_priv *priv,
115                               u8 log_wq_size,
116                               struct mlx5e_cq_param *param);
117 void mlx5e_build_icosq_param(struct mlx5e_priv *priv,
118                              u8 log_wq_size,
119                              struct mlx5e_sq_param *param);
120 void mlx5e_build_xdpsq_param(struct mlx5e_priv *priv,
121                              struct mlx5e_params *params,
122                              struct mlx5e_sq_param *param);
123
124 #endif /* __MLX5_EN_PARAMS_H__ */