1c0752f2bSKamal Heib /*
2c0752f2bSKamal Heib  * Copyright (c) 2017, Mellanox Technologies, Ltd.  All rights reserved.
3c0752f2bSKamal Heib  *
4c0752f2bSKamal Heib  * This software is available to you under a choice of one of two
5c0752f2bSKamal Heib  * licenses.  You may choose to be licensed under the terms of the GNU
6c0752f2bSKamal Heib  * General Public License (GPL) Version 2, available from the file
7c0752f2bSKamal Heib  * COPYING in the main directory of this source tree, or the
8c0752f2bSKamal Heib  * OpenIB.org BSD license below:
9c0752f2bSKamal Heib  *
10c0752f2bSKamal Heib  *     Redistribution and use in source and binary forms, with or
11c0752f2bSKamal Heib  *     without modification, are permitted provided that the following
12c0752f2bSKamal Heib  *     conditions are met:
13c0752f2bSKamal Heib  *
14c0752f2bSKamal Heib  *      - Redistributions of source code must retain the above
15c0752f2bSKamal Heib  *        copyright notice, this list of conditions and the following
16c0752f2bSKamal Heib  *        disclaimer.
17c0752f2bSKamal Heib  *
18c0752f2bSKamal Heib  *      - Redistributions in binary form must reproduce the above
19c0752f2bSKamal Heib  *        copyright notice, this list of conditions and the following
20c0752f2bSKamal Heib  *        disclaimer in the documentation and/or other materials
21c0752f2bSKamal Heib  *        provided with the distribution.
22c0752f2bSKamal Heib  *
23c0752f2bSKamal Heib  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24c0752f2bSKamal Heib  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25c0752f2bSKamal Heib  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26c0752f2bSKamal Heib  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27c0752f2bSKamal Heib  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28c0752f2bSKamal Heib  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29c0752f2bSKamal Heib  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30c0752f2bSKamal Heib  * SOFTWARE.
31c0752f2bSKamal Heib  */
32c0752f2bSKamal Heib 
3369c1280bSSaeed Mahameed #include "lib/mlx5.h"
34c0752f2bSKamal Heib #include "en.h"
3543585a41SIlya Lesokhin #include "en_accel/tls.h"
360aab3e1bSRaed Salem #include "en_accel/en_accel.h"
37c0752f2bSKamal Heib 
383460c184SSaeed Mahameed static unsigned int stats_grps_num(struct mlx5e_priv *priv)
393460c184SSaeed Mahameed {
403460c184SSaeed Mahameed 	return !priv->profile->stats_grps_num ? 0 :
413460c184SSaeed Mahameed 		priv->profile->stats_grps_num(priv);
423460c184SSaeed Mahameed }
433460c184SSaeed Mahameed 
443460c184SSaeed Mahameed unsigned int mlx5e_stats_total_num(struct mlx5e_priv *priv)
453460c184SSaeed Mahameed {
46f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
473460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
483460c184SSaeed Mahameed 	unsigned int total = 0;
493460c184SSaeed Mahameed 	int i;
503460c184SSaeed Mahameed 
513460c184SSaeed Mahameed 	for (i = 0; i < num_stats_grps; i++)
52f0ff8e8cSSaeed Mahameed 		total += stats_grps[i]->get_num_stats(priv);
533460c184SSaeed Mahameed 
543460c184SSaeed Mahameed 	return total;
553460c184SSaeed Mahameed }
563460c184SSaeed Mahameed 
57b521105bSAlaa Hleihel void mlx5e_stats_update_ndo_stats(struct mlx5e_priv *priv)
58b521105bSAlaa Hleihel {
59b521105bSAlaa Hleihel 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
60b521105bSAlaa Hleihel 	const unsigned int num_stats_grps = stats_grps_num(priv);
61b521105bSAlaa Hleihel 	int i;
62b521105bSAlaa Hleihel 
63b521105bSAlaa Hleihel 	for (i = num_stats_grps - 1; i >= 0; i--)
64b521105bSAlaa Hleihel 		if (stats_grps[i]->update_stats &&
65b521105bSAlaa Hleihel 		    stats_grps[i]->update_stats_mask & MLX5E_NDO_UPDATE_STATS)
66b521105bSAlaa Hleihel 			stats_grps[i]->update_stats(priv);
67b521105bSAlaa Hleihel }
68b521105bSAlaa Hleihel 
693460c184SSaeed Mahameed void mlx5e_stats_update(struct mlx5e_priv *priv)
703460c184SSaeed Mahameed {
71f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
723460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
733460c184SSaeed Mahameed 	int i;
743460c184SSaeed Mahameed 
753460c184SSaeed Mahameed 	for (i = num_stats_grps - 1; i >= 0; i--)
76f0ff8e8cSSaeed Mahameed 		if (stats_grps[i]->update_stats)
77f0ff8e8cSSaeed Mahameed 			stats_grps[i]->update_stats(priv);
783460c184SSaeed Mahameed }
793460c184SSaeed Mahameed 
803460c184SSaeed Mahameed void mlx5e_stats_fill(struct mlx5e_priv *priv, u64 *data, int idx)
813460c184SSaeed Mahameed {
82f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
833460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
843460c184SSaeed Mahameed 	int i;
853460c184SSaeed Mahameed 
863460c184SSaeed Mahameed 	for (i = 0; i < num_stats_grps; i++)
87f0ff8e8cSSaeed Mahameed 		idx = stats_grps[i]->fill_stats(priv, data, idx);
883460c184SSaeed Mahameed }
893460c184SSaeed Mahameed 
903460c184SSaeed Mahameed void mlx5e_stats_fill_strings(struct mlx5e_priv *priv, u8 *data)
913460c184SSaeed Mahameed {
92f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
933460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
943460c184SSaeed Mahameed 	int i, idx = 0;
953460c184SSaeed Mahameed 
963460c184SSaeed Mahameed 	for (i = 0; i < num_stats_grps; i++)
97f0ff8e8cSSaeed Mahameed 		idx = stats_grps[i]->fill_strings(priv, data, idx);
983460c184SSaeed Mahameed }
993460c184SSaeed Mahameed 
1003460c184SSaeed Mahameed /* Concrete NIC Stats */
1013460c184SSaeed Mahameed 
102c0752f2bSKamal Heib static const struct counter_desc sw_stats_desc[] = {
103c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_packets) },
104c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_bytes) },
105c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_packets) },
106c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_bytes) },
107c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_packets) },
108c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_bytes) },
109c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_inner_packets) },
110c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_inner_bytes) },
111f24686e8SGal Pressman 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_added_vlan_packets) },
1122ad9ecdbSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_nop) },
1135af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_mpwqe_blks) },
1145af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_mpwqe_pkts) },
115bf239741SIlya Lesokhin 
116bf239741SIlya Lesokhin #ifdef CONFIG_MLX5_EN_TLS
117d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_encrypted_packets) },
118d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_encrypted_bytes) },
119bf239741SIlya Lesokhin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_ooo) },
120d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_dump_packets) },
121d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_dump_bytes) },
12246a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_resync_bytes) },
12346a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_skip_no_sync_data) },
12446a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_drop_no_sync_data) },
12546a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_drop_bypass_req) },
126bf239741SIlya Lesokhin #endif
127bf239741SIlya Lesokhin 
128c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_lro_packets) },
129c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_lro_bytes) },
130f007c13dSNatali Shechtman 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_ecn_mark) },
131f24686e8SGal Pressman 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_removed_vlan_packets) },
132c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_unnecessary) },
133c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_none) },
134c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete) },
1350aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete_tail) },
1360aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete_tail_slow) },
137c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_unnecessary_inner) },
138c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_drop) },
13986690b4bSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_redirect) },
140890388adSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_xmit) },
14173cab880SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_mpwqe) },
142c2273219SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_inlnw) },
1436c085a8aSShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_nops) },
144c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_full) },
145890388adSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_err) },
146890388adSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_cqe) },
147c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_none) },
148c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial) },
149c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial_inner) },
150c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_stopped) },
151c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_dropped) },
152c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xmit_more) },
153db75373cSEran Ben Elisha 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_recover) },
15486155656STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_cqes) },
155f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_wake) },
156f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_cqe_err) },
15758b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_xmit) },
15873cab880SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_mpwqe) },
159c2273219SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_inlnw) },
1606c085a8aSShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_nops) },
16158b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_full) },
16258b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_err) },
16358b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_cqes) },
164c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_wqe_err) },
165b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_filler_cqes) },
166b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_filler_strides) },
1670073c8f7SMoshe Shemesh 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_oversize_pkts_sw_drop) },
168c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_buff_alloc_err) },
169c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cqe_compress_blks) },
170c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cqe_compress_pkts) },
171c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_reuse) },
172c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_full) },
173c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_empty) },
174c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_busy) },
175c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_waive) },
176dc983f0eSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_congst_umr) },
17794563847SEran Ben Elisha 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_arfs_err) },
178be5323c8SAya Levin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_recover) },
17976c1e1acSTariq Toukan #ifdef CONFIG_MLX5_EN_TLS
18076c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_decrypted_packets) },
18176c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_decrypted_bytes) },
18276c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_pkt) },
18376c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_start) },
18476c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_end) },
18576c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_skip) },
18676c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_res_ok) },
187e9ce991bSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_res_retry) },
18876c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_res_skip) },
18976c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_err) },
19076c1e1acSTariq Toukan #endif
191a1bf74dcSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_events) },
1922d7103c8STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_poll) },
1932d7103c8STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_arm) },
1942d7103c8STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_aff_change) },
195db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_force_irq) },
19657d689a8SEran Ben Elisha 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_eq_rearm) },
197db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_packets) },
198db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_bytes) },
199db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_complete) },
200db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_unnecessary) },
201db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_unnecessary_inner) },
202db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_none) },
203db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_ecn_mark) },
204db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_removed_vlan_packets) },
205db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_xdp_drop) },
206db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_xdp_redirect) },
207db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_wqe_err) },
208db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_mpwqe_filler_cqes) },
209db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_mpwqe_filler_strides) },
210db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_oversize_pkts_sw_drop) },
211db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_buff_alloc_err) },
212db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_cqe_compress_blks) },
213db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_cqe_compress_pkts) },
214db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_congst_umr) },
215db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_arfs_err) },
216db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_xmit) },
217db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_mpwqe) },
218db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_inlnw) },
219db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_full) },
220db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_err) },
221db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_cqes) },
222c0752f2bSKamal Heib };
223c0752f2bSKamal Heib 
224c0752f2bSKamal Heib #define NUM_SW_COUNTERS			ARRAY_SIZE(sw_stats_desc)
225c0752f2bSKamal Heib 
22696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(sw)
227c0752f2bSKamal Heib {
228c0752f2bSKamal Heib 	return NUM_SW_COUNTERS;
229c0752f2bSKamal Heib }
230c0752f2bSKamal Heib 
23196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(sw)
232c0752f2bSKamal Heib {
233c0752f2bSKamal Heib 	int i;
234c0752f2bSKamal Heib 
235c0752f2bSKamal Heib 	for (i = 0; i < NUM_SW_COUNTERS; i++)
236c0752f2bSKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, sw_stats_desc[i].format);
237c0752f2bSKamal Heib 	return idx;
238c0752f2bSKamal Heib }
239c0752f2bSKamal Heib 
24096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(sw)
241c0752f2bSKamal Heib {
242c0752f2bSKamal Heib 	int i;
243c0752f2bSKamal Heib 
244c0752f2bSKamal Heib 	for (i = 0; i < NUM_SW_COUNTERS; i++)
245c0752f2bSKamal Heib 		data[idx++] = MLX5E_READ_CTR64_CPU(&priv->stats.sw, sw_stats_desc, i);
246c0752f2bSKamal Heib 	return idx;
247c0752f2bSKamal Heib }
248c0752f2bSKamal Heib 
2491a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xdp_red(struct mlx5e_sw_stats *s,
2501a7f5124SEran Ben Elisha 						    struct mlx5e_xdpsq_stats *xdpsq_red_stats)
25119386177SKamal Heib {
2521a7f5124SEran Ben Elisha 	s->tx_xdp_xmit  += xdpsq_red_stats->xmit;
2531a7f5124SEran Ben Elisha 	s->tx_xdp_mpwqe += xdpsq_red_stats->mpwqe;
2541a7f5124SEran Ben Elisha 	s->tx_xdp_inlnw += xdpsq_red_stats->inlnw;
2551a7f5124SEran Ben Elisha 	s->tx_xdp_nops  += xdpsq_red_stats->nops;
2561a7f5124SEran Ben Elisha 	s->tx_xdp_full  += xdpsq_red_stats->full;
2571a7f5124SEran Ben Elisha 	s->tx_xdp_err   += xdpsq_red_stats->err;
2581a7f5124SEran Ben Elisha 	s->tx_xdp_cqes  += xdpsq_red_stats->cqes;
2591a7f5124SEran Ben Elisha }
26019386177SKamal Heib 
2611a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xdpsq(struct mlx5e_sw_stats *s,
2621a7f5124SEran Ben Elisha 						  struct mlx5e_xdpsq_stats *xdpsq_stats)
2631a7f5124SEran Ben Elisha {
2641a7f5124SEran Ben Elisha 	s->rx_xdp_tx_xmit  += xdpsq_stats->xmit;
2651a7f5124SEran Ben Elisha 	s->rx_xdp_tx_mpwqe += xdpsq_stats->mpwqe;
2661a7f5124SEran Ben Elisha 	s->rx_xdp_tx_inlnw += xdpsq_stats->inlnw;
2671a7f5124SEran Ben Elisha 	s->rx_xdp_tx_nops  += xdpsq_stats->nops;
2681a7f5124SEran Ben Elisha 	s->rx_xdp_tx_full  += xdpsq_stats->full;
2691a7f5124SEran Ben Elisha 	s->rx_xdp_tx_err   += xdpsq_stats->err;
2701a7f5124SEran Ben Elisha 	s->rx_xdp_tx_cqe   += xdpsq_stats->cqes;
2711a7f5124SEran Ben Elisha }
27219386177SKamal Heib 
2731a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xsksq(struct mlx5e_sw_stats *s,
2741a7f5124SEran Ben Elisha 						  struct mlx5e_xdpsq_stats *xsksq_stats)
2751a7f5124SEran Ben Elisha {
2761a7f5124SEran Ben Elisha 	s->tx_xsk_xmit  += xsksq_stats->xmit;
2771a7f5124SEran Ben Elisha 	s->tx_xsk_mpwqe += xsksq_stats->mpwqe;
2781a7f5124SEran Ben Elisha 	s->tx_xsk_inlnw += xsksq_stats->inlnw;
2791a7f5124SEran Ben Elisha 	s->tx_xsk_full  += xsksq_stats->full;
2801a7f5124SEran Ben Elisha 	s->tx_xsk_err   += xsksq_stats->err;
2811a7f5124SEran Ben Elisha 	s->tx_xsk_cqes  += xsksq_stats->cqes;
2821a7f5124SEran Ben Elisha }
28319386177SKamal Heib 
2841a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xskrq(struct mlx5e_sw_stats *s,
2851a7f5124SEran Ben Elisha 						  struct mlx5e_rq_stats *xskrq_stats)
2861a7f5124SEran Ben Elisha {
2871a7f5124SEran Ben Elisha 	s->rx_xsk_packets                += xskrq_stats->packets;
2881a7f5124SEran Ben Elisha 	s->rx_xsk_bytes                  += xskrq_stats->bytes;
2891a7f5124SEran Ben Elisha 	s->rx_xsk_csum_complete          += xskrq_stats->csum_complete;
2901a7f5124SEran Ben Elisha 	s->rx_xsk_csum_unnecessary       += xskrq_stats->csum_unnecessary;
2911a7f5124SEran Ben Elisha 	s->rx_xsk_csum_unnecessary_inner += xskrq_stats->csum_unnecessary_inner;
2921a7f5124SEran Ben Elisha 	s->rx_xsk_csum_none              += xskrq_stats->csum_none;
2931a7f5124SEran Ben Elisha 	s->rx_xsk_ecn_mark               += xskrq_stats->ecn_mark;
2941a7f5124SEran Ben Elisha 	s->rx_xsk_removed_vlan_packets   += xskrq_stats->removed_vlan_packets;
2951a7f5124SEran Ben Elisha 	s->rx_xsk_xdp_drop               += xskrq_stats->xdp_drop;
2961a7f5124SEran Ben Elisha 	s->rx_xsk_xdp_redirect           += xskrq_stats->xdp_redirect;
2971a7f5124SEran Ben Elisha 	s->rx_xsk_wqe_err                += xskrq_stats->wqe_err;
2981a7f5124SEran Ben Elisha 	s->rx_xsk_mpwqe_filler_cqes      += xskrq_stats->mpwqe_filler_cqes;
2991a7f5124SEran Ben Elisha 	s->rx_xsk_mpwqe_filler_strides   += xskrq_stats->mpwqe_filler_strides;
3001a7f5124SEran Ben Elisha 	s->rx_xsk_oversize_pkts_sw_drop  += xskrq_stats->oversize_pkts_sw_drop;
3011a7f5124SEran Ben Elisha 	s->rx_xsk_buff_alloc_err         += xskrq_stats->buff_alloc_err;
3021a7f5124SEran Ben Elisha 	s->rx_xsk_cqe_compress_blks      += xskrq_stats->cqe_compress_blks;
3031a7f5124SEran Ben Elisha 	s->rx_xsk_cqe_compress_pkts      += xskrq_stats->cqe_compress_pkts;
3041a7f5124SEran Ben Elisha 	s->rx_xsk_congst_umr             += xskrq_stats->congst_umr;
3051a7f5124SEran Ben Elisha 	s->rx_xsk_arfs_err               += xskrq_stats->arfs_err;
3061a7f5124SEran Ben Elisha }
3071a7f5124SEran Ben Elisha 
3081a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_rq_stats(struct mlx5e_sw_stats *s,
3091a7f5124SEran Ben Elisha 						     struct mlx5e_rq_stats *rq_stats)
3101a7f5124SEran Ben Elisha {
31119386177SKamal Heib 	s->rx_packets                 += rq_stats->packets;
31219386177SKamal Heib 	s->rx_bytes                   += rq_stats->bytes;
31319386177SKamal Heib 	s->rx_lro_packets             += rq_stats->lro_packets;
31419386177SKamal Heib 	s->rx_lro_bytes               += rq_stats->lro_bytes;
315f007c13dSNatali Shechtman 	s->rx_ecn_mark                += rq_stats->ecn_mark;
31619386177SKamal Heib 	s->rx_removed_vlan_packets    += rq_stats->removed_vlan_packets;
31719386177SKamal Heib 	s->rx_csum_none               += rq_stats->csum_none;
31819386177SKamal Heib 	s->rx_csum_complete           += rq_stats->csum_complete;
3190aa1d186SSaeed Mahameed 	s->rx_csum_complete_tail      += rq_stats->csum_complete_tail;
3200aa1d186SSaeed Mahameed 	s->rx_csum_complete_tail_slow += rq_stats->csum_complete_tail_slow;
32119386177SKamal Heib 	s->rx_csum_unnecessary        += rq_stats->csum_unnecessary;
32219386177SKamal Heib 	s->rx_csum_unnecessary_inner  += rq_stats->csum_unnecessary_inner;
32319386177SKamal Heib 	s->rx_xdp_drop                += rq_stats->xdp_drop;
32486690b4bSTariq Toukan 	s->rx_xdp_redirect            += rq_stats->xdp_redirect;
32519386177SKamal Heib 	s->rx_wqe_err                 += rq_stats->wqe_err;
326b71ba6b4STariq Toukan 	s->rx_mpwqe_filler_cqes       += rq_stats->mpwqe_filler_cqes;
327b71ba6b4STariq Toukan 	s->rx_mpwqe_filler_strides    += rq_stats->mpwqe_filler_strides;
3280073c8f7SMoshe Shemesh 	s->rx_oversize_pkts_sw_drop   += rq_stats->oversize_pkts_sw_drop;
32919386177SKamal Heib 	s->rx_buff_alloc_err          += rq_stats->buff_alloc_err;
33019386177SKamal Heib 	s->rx_cqe_compress_blks       += rq_stats->cqe_compress_blks;
33119386177SKamal Heib 	s->rx_cqe_compress_pkts       += rq_stats->cqe_compress_pkts;
33219386177SKamal Heib 	s->rx_cache_reuse             += rq_stats->cache_reuse;
33319386177SKamal Heib 	s->rx_cache_full              += rq_stats->cache_full;
33419386177SKamal Heib 	s->rx_cache_empty             += rq_stats->cache_empty;
33519386177SKamal Heib 	s->rx_cache_busy              += rq_stats->cache_busy;
33619386177SKamal Heib 	s->rx_cache_waive             += rq_stats->cache_waive;
337dc983f0eSTariq Toukan 	s->rx_congst_umr              += rq_stats->congst_umr;
33894563847SEran Ben Elisha 	s->rx_arfs_err                += rq_stats->arfs_err;
339be5323c8SAya Levin 	s->rx_recover                 += rq_stats->recover;
34076c1e1acSTariq Toukan #ifdef CONFIG_MLX5_EN_TLS
34176c1e1acSTariq Toukan 	s->rx_tls_decrypted_packets   += rq_stats->tls_decrypted_packets;
34276c1e1acSTariq Toukan 	s->rx_tls_decrypted_bytes     += rq_stats->tls_decrypted_bytes;
34376c1e1acSTariq Toukan 	s->rx_tls_resync_req_pkt      += rq_stats->tls_resync_req_pkt;
34476c1e1acSTariq Toukan 	s->rx_tls_resync_req_start    += rq_stats->tls_resync_req_start;
34576c1e1acSTariq Toukan 	s->rx_tls_resync_req_end      += rq_stats->tls_resync_req_end;
34676c1e1acSTariq Toukan 	s->rx_tls_resync_req_skip     += rq_stats->tls_resync_req_skip;
34776c1e1acSTariq Toukan 	s->rx_tls_resync_res_ok       += rq_stats->tls_resync_res_ok;
348e9ce991bSTariq Toukan 	s->rx_tls_resync_res_retry    += rq_stats->tls_resync_res_retry;
34976c1e1acSTariq Toukan 	s->rx_tls_resync_res_skip     += rq_stats->tls_resync_res_skip;
35076c1e1acSTariq Toukan 	s->rx_tls_err                 += rq_stats->tls_err;
35176c1e1acSTariq Toukan #endif
3521a7f5124SEran Ben Elisha }
3531a7f5124SEran Ben Elisha 
3541a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_ch_stats(struct mlx5e_sw_stats *s,
3551a7f5124SEran Ben Elisha 						     struct mlx5e_ch_stats *ch_stats)
3561a7f5124SEran Ben Elisha {
357a1bf74dcSTariq Toukan 	s->ch_events      += ch_stats->events;
3582d7103c8STariq Toukan 	s->ch_poll        += ch_stats->poll;
3592d7103c8STariq Toukan 	s->ch_arm         += ch_stats->arm;
3602d7103c8STariq Toukan 	s->ch_aff_change  += ch_stats->aff_change;
361db05815bSMaxim Mikityanskiy 	s->ch_force_irq   += ch_stats->force_irq;
36219386177SKamal Heib 	s->ch_eq_rearm    += ch_stats->eq_rearm;
3631a7f5124SEran Ben Elisha }
36419386177SKamal Heib 
3651a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_sq(struct mlx5e_sw_stats *s,
3661a7f5124SEran Ben Elisha 					       struct mlx5e_sq_stats *sq_stats)
3671a7f5124SEran Ben Elisha {
36819386177SKamal Heib 	s->tx_packets               += sq_stats->packets;
36919386177SKamal Heib 	s->tx_bytes                 += sq_stats->bytes;
37019386177SKamal Heib 	s->tx_tso_packets           += sq_stats->tso_packets;
37119386177SKamal Heib 	s->tx_tso_bytes             += sq_stats->tso_bytes;
37219386177SKamal Heib 	s->tx_tso_inner_packets     += sq_stats->tso_inner_packets;
37319386177SKamal Heib 	s->tx_tso_inner_bytes       += sq_stats->tso_inner_bytes;
37419386177SKamal Heib 	s->tx_added_vlan_packets    += sq_stats->added_vlan_packets;
3752ad9ecdbSTariq Toukan 	s->tx_nop                   += sq_stats->nop;
3765af75c74SMaxim Mikityanskiy 	s->tx_mpwqe_blks            += sq_stats->mpwqe_blks;
3775af75c74SMaxim Mikityanskiy 	s->tx_mpwqe_pkts            += sq_stats->mpwqe_pkts;
37819386177SKamal Heib 	s->tx_queue_stopped         += sq_stats->stopped;
37919386177SKamal Heib 	s->tx_queue_wake            += sq_stats->wake;
38019386177SKamal Heib 	s->tx_queue_dropped         += sq_stats->dropped;
38116cc14d8SEran Ben Elisha 	s->tx_cqe_err               += sq_stats->cqe_err;
382db75373cSEran Ben Elisha 	s->tx_recover               += sq_stats->recover;
38319386177SKamal Heib 	s->tx_xmit_more             += sq_stats->xmit_more;
38419386177SKamal Heib 	s->tx_csum_partial_inner    += sq_stats->csum_partial_inner;
38519386177SKamal Heib 	s->tx_csum_none             += sq_stats->csum_none;
38619386177SKamal Heib 	s->tx_csum_partial          += sq_stats->csum_partial;
387bf239741SIlya Lesokhin #ifdef CONFIG_MLX5_EN_TLS
388d2ead1f3STariq Toukan 	s->tx_tls_encrypted_packets += sq_stats->tls_encrypted_packets;
389d2ead1f3STariq Toukan 	s->tx_tls_encrypted_bytes   += sq_stats->tls_encrypted_bytes;
390bf239741SIlya Lesokhin 	s->tx_tls_ooo               += sq_stats->tls_ooo;
391d2ead1f3STariq Toukan 	s->tx_tls_dump_bytes        += sq_stats->tls_dump_bytes;
392d2ead1f3STariq Toukan 	s->tx_tls_dump_packets      += sq_stats->tls_dump_packets;
39346a3ea98STariq Toukan 	s->tx_tls_resync_bytes      += sq_stats->tls_resync_bytes;
39446a3ea98STariq Toukan 	s->tx_tls_skip_no_sync_data += sq_stats->tls_skip_no_sync_data;
39546a3ea98STariq Toukan 	s->tx_tls_drop_no_sync_data += sq_stats->tls_drop_no_sync_data;
39646a3ea98STariq Toukan 	s->tx_tls_drop_bypass_req   += sq_stats->tls_drop_bypass_req;
397bf239741SIlya Lesokhin #endif
39886155656STariq Toukan 	s->tx_cqes                  += sq_stats->cqes;
3991a7f5124SEran Ben Elisha }
4001a7f5124SEran Ben Elisha 
401145e5637SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_ptp(struct mlx5e_priv *priv,
402145e5637SEran Ben Elisha 						struct mlx5e_sw_stats *s)
403145e5637SEran Ben Elisha {
404145e5637SEran Ben Elisha 	int i;
405145e5637SEran Ben Elisha 
406a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
407145e5637SEran Ben Elisha 		return;
408145e5637SEran Ben Elisha 
409b0d35de4SAya Levin 	mlx5e_stats_grp_sw_update_stats_ch_stats(s, &priv->ptp_stats.ch);
410145e5637SEran Ben Elisha 
411a28359e9SAya Levin 	if (priv->tx_ptp_opened) {
412145e5637SEran Ben Elisha 		for (i = 0; i < priv->max_opened_tc; i++) {
413b0d35de4SAya Levin 			mlx5e_stats_grp_sw_update_stats_sq(s, &priv->ptp_stats.sq[i]);
414145e5637SEran Ben Elisha 
415145e5637SEran Ben Elisha 			/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
416145e5637SEran Ben Elisha 			barrier();
417145e5637SEran Ben Elisha 		}
418145e5637SEran Ben Elisha 	}
419a28359e9SAya Levin 	if (priv->rx_ptp_opened) {
420a28359e9SAya Levin 		mlx5e_stats_grp_sw_update_stats_rq_stats(s, &priv->ptp_stats.rq);
421a28359e9SAya Levin 
422a28359e9SAya Levin 		/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
423a28359e9SAya Levin 		barrier();
424a28359e9SAya Levin 	}
425a28359e9SAya Levin }
426145e5637SEran Ben Elisha 
427214baf22SMaxim Mikityanskiy static void mlx5e_stats_grp_sw_update_stats_qos(struct mlx5e_priv *priv,
428214baf22SMaxim Mikityanskiy 						struct mlx5e_sw_stats *s)
429214baf22SMaxim Mikityanskiy {
430214baf22SMaxim Mikityanskiy 	struct mlx5e_sq_stats **stats;
431214baf22SMaxim Mikityanskiy 	u16 max_qos_sqs;
432214baf22SMaxim Mikityanskiy 	int i;
433214baf22SMaxim Mikityanskiy 
434214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
435214baf22SMaxim Mikityanskiy 	max_qos_sqs = smp_load_acquire(&priv->htb.max_qos_sqs);
436214baf22SMaxim Mikityanskiy 	stats = READ_ONCE(priv->htb.qos_sq_stats);
437214baf22SMaxim Mikityanskiy 
438214baf22SMaxim Mikityanskiy 	for (i = 0; i < max_qos_sqs; i++) {
439214baf22SMaxim Mikityanskiy 		mlx5e_stats_grp_sw_update_stats_sq(s, READ_ONCE(stats[i]));
440214baf22SMaxim Mikityanskiy 
441214baf22SMaxim Mikityanskiy 		/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
442214baf22SMaxim Mikityanskiy 		barrier();
443214baf22SMaxim Mikityanskiy 	}
444214baf22SMaxim Mikityanskiy }
445214baf22SMaxim Mikityanskiy 
4461a7f5124SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(sw)
4471a7f5124SEran Ben Elisha {
4481a7f5124SEran Ben Elisha 	struct mlx5e_sw_stats *s = &priv->stats.sw;
4491a7f5124SEran Ben Elisha 	int i;
4501a7f5124SEran Ben Elisha 
4511a7f5124SEran Ben Elisha 	memset(s, 0, sizeof(*s));
4521a7f5124SEran Ben Elisha 
453*9d758d4aSTariq Toukan 	for (i = 0; i < priv->stats_nch; i++) {
4541a7f5124SEran Ben Elisha 		struct mlx5e_channel_stats *channel_stats =
4551a7f5124SEran Ben Elisha 			&priv->channel_stats[i];
4561a7f5124SEran Ben Elisha 		int j;
4571a7f5124SEran Ben Elisha 
4581a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_rq_stats(s, &channel_stats->rq);
4591a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xdpsq(s, &channel_stats->rq_xdpsq);
4601a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_ch_stats(s, &channel_stats->ch);
4611a7f5124SEran Ben Elisha 		/* xdp redirect */
4621a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xdp_red(s, &channel_stats->xdpsq);
4631a7f5124SEran Ben Elisha 		/* AF_XDP zero-copy */
4641a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xskrq(s, &channel_stats->xskrq);
4651a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xsksq(s, &channel_stats->xsksq);
4661a7f5124SEran Ben Elisha 
4671a7f5124SEran Ben Elisha 		for (j = 0; j < priv->max_opened_tc; j++) {
4681a7f5124SEran Ben Elisha 			mlx5e_stats_grp_sw_update_stats_sq(s, &channel_stats->sq[j]);
46942ae1a5cSArnd Bergmann 
47042ae1a5cSArnd Bergmann 			/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
47142ae1a5cSArnd Bergmann 			barrier();
47219386177SKamal Heib 		}
47319386177SKamal Heib 	}
474145e5637SEran Ben Elisha 	mlx5e_stats_grp_sw_update_stats_ptp(priv, s);
475214baf22SMaxim Mikityanskiy 	mlx5e_stats_grp_sw_update_stats_qos(priv, s);
47619386177SKamal Heib }
47719386177SKamal Heib 
478fd8dcdb8SKamal Heib static const struct counter_desc q_stats_desc[] = {
479fd8dcdb8SKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_qcounter_stats, rx_out_of_buffer) },
480fd8dcdb8SKamal Heib };
481fd8dcdb8SKamal Heib 
4827cbaf9a3SMoshe Shemesh static const struct counter_desc drop_rq_stats_desc[] = {
4837cbaf9a3SMoshe Shemesh 	{ MLX5E_DECLARE_STAT(struct mlx5e_qcounter_stats, rx_if_down_packets) },
4847cbaf9a3SMoshe Shemesh };
4857cbaf9a3SMoshe Shemesh 
486fd8dcdb8SKamal Heib #define NUM_Q_COUNTERS			ARRAY_SIZE(q_stats_desc)
4877cbaf9a3SMoshe Shemesh #define NUM_DROP_RQ_COUNTERS		ARRAY_SIZE(drop_rq_stats_desc)
488fd8dcdb8SKamal Heib 
48996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(qcnt)
490fd8dcdb8SKamal Heib {
4917cbaf9a3SMoshe Shemesh 	int num_stats = 0;
4927cbaf9a3SMoshe Shemesh 
4937cbaf9a3SMoshe Shemesh 	if (priv->q_counter)
4947cbaf9a3SMoshe Shemesh 		num_stats += NUM_Q_COUNTERS;
4957cbaf9a3SMoshe Shemesh 
4967cbaf9a3SMoshe Shemesh 	if (priv->drop_rq_q_counter)
4977cbaf9a3SMoshe Shemesh 		num_stats += NUM_DROP_RQ_COUNTERS;
4987cbaf9a3SMoshe Shemesh 
4997cbaf9a3SMoshe Shemesh 	return num_stats;
500fd8dcdb8SKamal Heib }
501fd8dcdb8SKamal Heib 
50296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qcnt)
503fd8dcdb8SKamal Heib {
504fd8dcdb8SKamal Heib 	int i;
505fd8dcdb8SKamal Heib 
506fd8dcdb8SKamal Heib 	for (i = 0; i < NUM_Q_COUNTERS && priv->q_counter; i++)
5077cbaf9a3SMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
5087cbaf9a3SMoshe Shemesh 		       q_stats_desc[i].format);
5097cbaf9a3SMoshe Shemesh 
5107cbaf9a3SMoshe Shemesh 	for (i = 0; i < NUM_DROP_RQ_COUNTERS && priv->drop_rq_q_counter; i++)
5117cbaf9a3SMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
5127cbaf9a3SMoshe Shemesh 		       drop_rq_stats_desc[i].format);
5137cbaf9a3SMoshe Shemesh 
514fd8dcdb8SKamal Heib 	return idx;
515fd8dcdb8SKamal Heib }
516fd8dcdb8SKamal Heib 
51796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qcnt)
518fd8dcdb8SKamal Heib {
519fd8dcdb8SKamal Heib 	int i;
520fd8dcdb8SKamal Heib 
521fd8dcdb8SKamal Heib 	for (i = 0; i < NUM_Q_COUNTERS && priv->q_counter; i++)
5227cbaf9a3SMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR32_CPU(&priv->stats.qcnt,
5237cbaf9a3SMoshe Shemesh 						   q_stats_desc, i);
5247cbaf9a3SMoshe Shemesh 	for (i = 0; i < NUM_DROP_RQ_COUNTERS && priv->drop_rq_q_counter; i++)
5257cbaf9a3SMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR32_CPU(&priv->stats.qcnt,
5267cbaf9a3SMoshe Shemesh 						   drop_rq_stats_desc, i);
527fd8dcdb8SKamal Heib 	return idx;
528fd8dcdb8SKamal Heib }
529fd8dcdb8SKamal Heib 
53096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qcnt)
53119386177SKamal Heib {
53219386177SKamal Heib 	struct mlx5e_qcounter_stats *qcnt = &priv->stats.qcnt;
53366247fbbSLeon Romanovsky 	u32 out[MLX5_ST_SZ_DW(query_q_counter_out)] = {};
53466247fbbSLeon Romanovsky 	u32 in[MLX5_ST_SZ_DW(query_q_counter_in)] = {};
53566247fbbSLeon Romanovsky 	int ret;
53619386177SKamal Heib 
53766247fbbSLeon Romanovsky 	MLX5_SET(query_q_counter_in, in, opcode, MLX5_CMD_OP_QUERY_Q_COUNTER);
53866247fbbSLeon Romanovsky 
53966247fbbSLeon Romanovsky 	if (priv->q_counter) {
54066247fbbSLeon Romanovsky 		MLX5_SET(query_q_counter_in, in, counter_set_id,
54166247fbbSLeon Romanovsky 			 priv->q_counter);
54266247fbbSLeon Romanovsky 		ret = mlx5_cmd_exec_inout(priv->mdev, query_q_counter, in, out);
54366247fbbSLeon Romanovsky 		if (!ret)
5447cbaf9a3SMoshe Shemesh 			qcnt->rx_out_of_buffer = MLX5_GET(query_q_counter_out,
5457cbaf9a3SMoshe Shemesh 							  out, out_of_buffer);
54666247fbbSLeon Romanovsky 	}
54766247fbbSLeon Romanovsky 
54866247fbbSLeon Romanovsky 	if (priv->drop_rq_q_counter) {
54966247fbbSLeon Romanovsky 		MLX5_SET(query_q_counter_in, in, counter_set_id,
55066247fbbSLeon Romanovsky 			 priv->drop_rq_q_counter);
55166247fbbSLeon Romanovsky 		ret = mlx5_cmd_exec_inout(priv->mdev, query_q_counter, in, out);
55266247fbbSLeon Romanovsky 		if (!ret)
55366247fbbSLeon Romanovsky 			qcnt->rx_if_down_packets = MLX5_GET(query_q_counter_out,
55466247fbbSLeon Romanovsky 							    out, out_of_buffer);
55566247fbbSLeon Romanovsky 	}
55619386177SKamal Heib }
55719386177SKamal Heib 
5585c298143SMoshe Shemesh #define VNIC_ENV_OFF(c) MLX5_BYTE_OFF(query_vnic_env_out, c)
5590cfafd4bSMoshe Shemesh static const struct counter_desc vnic_env_stats_steer_desc[] = {
5605c298143SMoshe Shemesh 	{ "rx_steer_missed_packets",
5615c298143SMoshe Shemesh 		VNIC_ENV_OFF(vport_env.nic_receive_steering_discard) },
5625c298143SMoshe Shemesh };
5635c298143SMoshe Shemesh 
5640cfafd4bSMoshe Shemesh static const struct counter_desc vnic_env_stats_dev_oob_desc[] = {
5650cfafd4bSMoshe Shemesh 	{ "dev_internal_queue_oob",
5660cfafd4bSMoshe Shemesh 		VNIC_ENV_OFF(vport_env.internal_rq_out_of_buffer) },
5670cfafd4bSMoshe Shemesh };
5680cfafd4bSMoshe Shemesh 
5690cfafd4bSMoshe Shemesh #define NUM_VNIC_ENV_STEER_COUNTERS(dev) \
5700cfafd4bSMoshe Shemesh 	(MLX5_CAP_GEN(dev, nic_receive_steering_discard) ? \
5710cfafd4bSMoshe Shemesh 	 ARRAY_SIZE(vnic_env_stats_steer_desc) : 0)
5720cfafd4bSMoshe Shemesh #define NUM_VNIC_ENV_DEV_OOB_COUNTERS(dev) \
5730cfafd4bSMoshe Shemesh 	(MLX5_CAP_GEN(dev, vnic_env_int_rq_oob) ? \
5740cfafd4bSMoshe Shemesh 	 ARRAY_SIZE(vnic_env_stats_dev_oob_desc) : 0)
5755c298143SMoshe Shemesh 
57696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(vnic_env)
5775c298143SMoshe Shemesh {
5780cfafd4bSMoshe Shemesh 	return NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev) +
5790cfafd4bSMoshe Shemesh 		NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev);
5805c298143SMoshe Shemesh }
5815c298143SMoshe Shemesh 
58296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vnic_env)
5835c298143SMoshe Shemesh {
5845c298143SMoshe Shemesh 	int i;
5855c298143SMoshe Shemesh 
5860cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev); i++)
5875c298143SMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
5880cfafd4bSMoshe Shemesh 		       vnic_env_stats_steer_desc[i].format);
5890cfafd4bSMoshe Shemesh 
5900cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev); i++)
5910cfafd4bSMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
5920cfafd4bSMoshe Shemesh 		       vnic_env_stats_dev_oob_desc[i].format);
5935c298143SMoshe Shemesh 	return idx;
5945c298143SMoshe Shemesh }
5955c298143SMoshe Shemesh 
59696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vnic_env)
5975c298143SMoshe Shemesh {
5985c298143SMoshe Shemesh 	int i;
5995c298143SMoshe Shemesh 
6000cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev); i++)
6015c298143SMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vnic.query_vnic_env_out,
6020cfafd4bSMoshe Shemesh 						  vnic_env_stats_steer_desc, i);
6030cfafd4bSMoshe Shemesh 
6040cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev); i++)
6050cfafd4bSMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR32_BE(priv->stats.vnic.query_vnic_env_out,
6060cfafd4bSMoshe Shemesh 						  vnic_env_stats_dev_oob_desc, i);
6075c298143SMoshe Shemesh 	return idx;
6085c298143SMoshe Shemesh }
6095c298143SMoshe Shemesh 
61096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vnic_env)
6115c298143SMoshe Shemesh {
6125c298143SMoshe Shemesh 	u32 *out = (u32 *)priv->stats.vnic.query_vnic_env_out;
613a184cda1SLeon Romanovsky 	u32 in[MLX5_ST_SZ_DW(query_vnic_env_in)] = {};
6145c298143SMoshe Shemesh 	struct mlx5_core_dev *mdev = priv->mdev;
6155c298143SMoshe Shemesh 
6165c298143SMoshe Shemesh 	if (!MLX5_CAP_GEN(priv->mdev, nic_receive_steering_discard))
6175c298143SMoshe Shemesh 		return;
6185c298143SMoshe Shemesh 
619a184cda1SLeon Romanovsky 	MLX5_SET(query_vnic_env_in, in, opcode, MLX5_CMD_OP_QUERY_VNIC_ENV);
620a184cda1SLeon Romanovsky 	mlx5_cmd_exec_inout(mdev, query_vnic_env, in, out);
6215c298143SMoshe Shemesh }
6225c298143SMoshe Shemesh 
62340cab9f1SKamal Heib #define VPORT_COUNTER_OFF(c) MLX5_BYTE_OFF(query_vport_counter_out, c)
62440cab9f1SKamal Heib static const struct counter_desc vport_stats_desc[] = {
62540cab9f1SKamal Heib 	{ "rx_vport_unicast_packets",
62640cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_unicast.packets) },
62740cab9f1SKamal Heib 	{ "rx_vport_unicast_bytes",
62840cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_unicast.octets) },
62940cab9f1SKamal Heib 	{ "tx_vport_unicast_packets",
63040cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_unicast.packets) },
63140cab9f1SKamal Heib 	{ "tx_vport_unicast_bytes",
63240cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_unicast.octets) },
63340cab9f1SKamal Heib 	{ "rx_vport_multicast_packets",
63440cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_multicast.packets) },
63540cab9f1SKamal Heib 	{ "rx_vport_multicast_bytes",
63640cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_multicast.octets) },
63740cab9f1SKamal Heib 	{ "tx_vport_multicast_packets",
63840cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_multicast.packets) },
63940cab9f1SKamal Heib 	{ "tx_vport_multicast_bytes",
64040cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_multicast.octets) },
64140cab9f1SKamal Heib 	{ "rx_vport_broadcast_packets",
64240cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_broadcast.packets) },
64340cab9f1SKamal Heib 	{ "rx_vport_broadcast_bytes",
64440cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_broadcast.octets) },
64540cab9f1SKamal Heib 	{ "tx_vport_broadcast_packets",
64640cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_broadcast.packets) },
64740cab9f1SKamal Heib 	{ "tx_vport_broadcast_bytes",
64840cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_broadcast.octets) },
64940cab9f1SKamal Heib 	{ "rx_vport_rdma_unicast_packets",
65040cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_unicast.packets) },
65140cab9f1SKamal Heib 	{ "rx_vport_rdma_unicast_bytes",
65240cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_unicast.octets) },
65340cab9f1SKamal Heib 	{ "tx_vport_rdma_unicast_packets",
65440cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_unicast.packets) },
65540cab9f1SKamal Heib 	{ "tx_vport_rdma_unicast_bytes",
65640cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_unicast.octets) },
65740cab9f1SKamal Heib 	{ "rx_vport_rdma_multicast_packets",
65840cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_multicast.packets) },
65940cab9f1SKamal Heib 	{ "rx_vport_rdma_multicast_bytes",
66040cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_multicast.octets) },
66140cab9f1SKamal Heib 	{ "tx_vport_rdma_multicast_packets",
66240cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_multicast.packets) },
66340cab9f1SKamal Heib 	{ "tx_vport_rdma_multicast_bytes",
66440cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_multicast.octets) },
66540cab9f1SKamal Heib };
66640cab9f1SKamal Heib 
66740cab9f1SKamal Heib #define NUM_VPORT_COUNTERS		ARRAY_SIZE(vport_stats_desc)
66840cab9f1SKamal Heib 
66996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(vport)
67040cab9f1SKamal Heib {
67140cab9f1SKamal Heib 	return NUM_VPORT_COUNTERS;
67240cab9f1SKamal Heib }
67340cab9f1SKamal Heib 
67496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vport)
67540cab9f1SKamal Heib {
67640cab9f1SKamal Heib 	int i;
67740cab9f1SKamal Heib 
67840cab9f1SKamal Heib 	for (i = 0; i < NUM_VPORT_COUNTERS; i++)
67940cab9f1SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, vport_stats_desc[i].format);
68040cab9f1SKamal Heib 	return idx;
68140cab9f1SKamal Heib }
68240cab9f1SKamal Heib 
68396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vport)
68440cab9f1SKamal Heib {
68540cab9f1SKamal Heib 	int i;
68640cab9f1SKamal Heib 
68740cab9f1SKamal Heib 	for (i = 0; i < NUM_VPORT_COUNTERS; i++)
68840cab9f1SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vport.query_vport_out,
68940cab9f1SKamal Heib 						  vport_stats_desc, i);
69040cab9f1SKamal Heib 	return idx;
69140cab9f1SKamal Heib }
69240cab9f1SKamal Heib 
69396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vport)
69419386177SKamal Heib {
69519386177SKamal Heib 	u32 *out = (u32 *)priv->stats.vport.query_vport_out;
696a184cda1SLeon Romanovsky 	u32 in[MLX5_ST_SZ_DW(query_vport_counter_in)] = {};
69719386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
69819386177SKamal Heib 
69919386177SKamal Heib 	MLX5_SET(query_vport_counter_in, in, opcode, MLX5_CMD_OP_QUERY_VPORT_COUNTER);
700a184cda1SLeon Romanovsky 	mlx5_cmd_exec_inout(mdev, query_vport_counter, in, out);
70119386177SKamal Heib }
70219386177SKamal Heib 
7036e6ef814SKamal Heib #define PPORT_802_3_OFF(c) \
7046e6ef814SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
7056e6ef814SKamal Heib 		      counter_set.eth_802_3_cntrs_grp_data_layout.c##_high)
7066e6ef814SKamal Heib static const struct counter_desc pport_802_3_stats_desc[] = {
7076e6ef814SKamal Heib 	{ "tx_packets_phy", PPORT_802_3_OFF(a_frames_transmitted_ok) },
7086e6ef814SKamal Heib 	{ "rx_packets_phy", PPORT_802_3_OFF(a_frames_received_ok) },
7096e6ef814SKamal Heib 	{ "rx_crc_errors_phy", PPORT_802_3_OFF(a_frame_check_sequence_errors) },
7106e6ef814SKamal Heib 	{ "tx_bytes_phy", PPORT_802_3_OFF(a_octets_transmitted_ok) },
7116e6ef814SKamal Heib 	{ "rx_bytes_phy", PPORT_802_3_OFF(a_octets_received_ok) },
7126e6ef814SKamal Heib 	{ "tx_multicast_phy", PPORT_802_3_OFF(a_multicast_frames_xmitted_ok) },
7136e6ef814SKamal Heib 	{ "tx_broadcast_phy", PPORT_802_3_OFF(a_broadcast_frames_xmitted_ok) },
7146e6ef814SKamal Heib 	{ "rx_multicast_phy", PPORT_802_3_OFF(a_multicast_frames_received_ok) },
7156e6ef814SKamal Heib 	{ "rx_broadcast_phy", PPORT_802_3_OFF(a_broadcast_frames_received_ok) },
7166e6ef814SKamal Heib 	{ "rx_in_range_len_errors_phy", PPORT_802_3_OFF(a_in_range_length_errors) },
7176e6ef814SKamal Heib 	{ "rx_out_of_range_len_phy", PPORT_802_3_OFF(a_out_of_range_length_field) },
7186e6ef814SKamal Heib 	{ "rx_oversize_pkts_phy", PPORT_802_3_OFF(a_frame_too_long_errors) },
7196e6ef814SKamal Heib 	{ "rx_symbol_err_phy", PPORT_802_3_OFF(a_symbol_error_during_carrier) },
7206e6ef814SKamal Heib 	{ "tx_mac_control_phy", PPORT_802_3_OFF(a_mac_control_frames_transmitted) },
7216e6ef814SKamal Heib 	{ "rx_mac_control_phy", PPORT_802_3_OFF(a_mac_control_frames_received) },
7226e6ef814SKamal Heib 	{ "rx_unsupported_op_phy", PPORT_802_3_OFF(a_unsupported_opcodes_received) },
7236e6ef814SKamal Heib 	{ "rx_pause_ctrl_phy", PPORT_802_3_OFF(a_pause_mac_ctrl_frames_received) },
7246e6ef814SKamal Heib 	{ "tx_pause_ctrl_phy", PPORT_802_3_OFF(a_pause_mac_ctrl_frames_transmitted) },
7256e6ef814SKamal Heib };
7266e6ef814SKamal Heib 
7276e6ef814SKamal Heib #define NUM_PPORT_802_3_COUNTERS	ARRAY_SIZE(pport_802_3_stats_desc)
7286e6ef814SKamal Heib 
72996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(802_3)
7306e6ef814SKamal Heib {
7316e6ef814SKamal Heib 	return NUM_PPORT_802_3_COUNTERS;
7326e6ef814SKamal Heib }
7336e6ef814SKamal Heib 
73496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(802_3)
7356e6ef814SKamal Heib {
7366e6ef814SKamal Heib 	int i;
7376e6ef814SKamal Heib 
7386e6ef814SKamal Heib 	for (i = 0; i < NUM_PPORT_802_3_COUNTERS; i++)
7396e6ef814SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_802_3_stats_desc[i].format);
7406e6ef814SKamal Heib 	return idx;
7416e6ef814SKamal Heib }
7426e6ef814SKamal Heib 
74396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(802_3)
7446e6ef814SKamal Heib {
7456e6ef814SKamal Heib 	int i;
7466e6ef814SKamal Heib 
7476e6ef814SKamal Heib 	for (i = 0; i < NUM_PPORT_802_3_COUNTERS; i++)
7486e6ef814SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.IEEE_802_3_counters,
7496e6ef814SKamal Heib 						  pport_802_3_stats_desc, i);
7506e6ef814SKamal Heib 	return idx;
7516e6ef814SKamal Heib }
7526e6ef814SKamal Heib 
75375370eb0SEyal Davidovich #define MLX5_BASIC_PPCNT_SUPPORTED(mdev) \
75475370eb0SEyal Davidovich 	(MLX5_CAP_GEN(mdev, pcam_reg) ? MLX5_CAP_PCAM_REG(mdev, ppcnt) : 1)
75575370eb0SEyal Davidovich 
7567c453526SVlad Buslov static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(802_3)
75719386177SKamal Heib {
75819386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
75919386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
76019386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
76119386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
76219386177SKamal Heib 	void *out;
76319386177SKamal Heib 
76475370eb0SEyal Davidovich 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
76575370eb0SEyal Davidovich 		return;
76675370eb0SEyal Davidovich 
76719386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
76819386177SKamal Heib 	out = pstats->IEEE_802_3_counters;
76919386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_IEEE_802_3_COUNTERS_GROUP);
77019386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
77119386177SKamal Heib }
77219386177SKamal Heib 
7731703bb50SJakub Kicinski #define MLX5E_READ_CTR64_BE_F(ptr, set, c)		\
774098d9ed9SJakub Kicinski 	be64_to_cpu(*(__be64 *)((char *)ptr +		\
775098d9ed9SJakub Kicinski 		MLX5_BYTE_OFF(ppcnt_reg,		\
7761703bb50SJakub Kicinski 			      counter_set.set.c##_high)))
777098d9ed9SJakub Kicinski 
778b572ec9fSJakub Kicinski static int mlx5e_stats_get_ieee(struct mlx5_core_dev *mdev,
779b572ec9fSJakub Kicinski 				u32 *ppcnt_ieee_802_3)
780b572ec9fSJakub Kicinski {
781b572ec9fSJakub Kicinski 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
782b572ec9fSJakub Kicinski 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
783b572ec9fSJakub Kicinski 
784b572ec9fSJakub Kicinski 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
785b572ec9fSJakub Kicinski 		return -EOPNOTSUPP;
786b572ec9fSJakub Kicinski 
787b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, local_port, 1);
788b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, grp, MLX5_IEEE_802_3_COUNTERS_GROUP);
789b572ec9fSJakub Kicinski 	return mlx5_core_access_reg(mdev, in, sz, ppcnt_ieee_802_3,
790b572ec9fSJakub Kicinski 				    sz, MLX5_REG_PPCNT, 0, 0);
791b572ec9fSJakub Kicinski }
792b572ec9fSJakub Kicinski 
793098d9ed9SJakub Kicinski void mlx5e_stats_pause_get(struct mlx5e_priv *priv,
794098d9ed9SJakub Kicinski 			   struct ethtool_pause_stats *pause_stats)
795098d9ed9SJakub Kicinski {
796098d9ed9SJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
797098d9ed9SJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
798098d9ed9SJakub Kicinski 
799b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
800098d9ed9SJakub Kicinski 		return;
801098d9ed9SJakub Kicinski 
802098d9ed9SJakub Kicinski 	pause_stats->tx_pause_frames =
803098d9ed9SJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
8041703bb50SJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
805098d9ed9SJakub Kicinski 				      a_pause_mac_ctrl_frames_transmitted);
806098d9ed9SJakub Kicinski 	pause_stats->rx_pause_frames =
807098d9ed9SJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
8081703bb50SJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
809098d9ed9SJakub Kicinski 				      a_pause_mac_ctrl_frames_received);
810098d9ed9SJakub Kicinski }
811098d9ed9SJakub Kicinski 
812b572ec9fSJakub Kicinski void mlx5e_stats_eth_phy_get(struct mlx5e_priv *priv,
813b572ec9fSJakub Kicinski 			     struct ethtool_eth_phy_stats *phy_stats)
814b572ec9fSJakub Kicinski {
815b572ec9fSJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
816b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
817b572ec9fSJakub Kicinski 
818b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
819b572ec9fSJakub Kicinski 		return;
820b572ec9fSJakub Kicinski 
821b572ec9fSJakub Kicinski 	phy_stats->SymbolErrorDuringCarrier =
822b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
823b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
824b572ec9fSJakub Kicinski 				      a_symbol_error_during_carrier);
825b572ec9fSJakub Kicinski }
826b572ec9fSJakub Kicinski 
827b572ec9fSJakub Kicinski void mlx5e_stats_eth_mac_get(struct mlx5e_priv *priv,
828b572ec9fSJakub Kicinski 			     struct ethtool_eth_mac_stats *mac_stats)
829b572ec9fSJakub Kicinski {
830b572ec9fSJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
831b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
832b572ec9fSJakub Kicinski 
833b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
834b572ec9fSJakub Kicinski 		return;
835b572ec9fSJakub Kicinski 
836b572ec9fSJakub Kicinski #define RD(name)							\
837b572ec9fSJakub Kicinski 	MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,				\
838b572ec9fSJakub Kicinski 			      eth_802_3_cntrs_grp_data_layout,		\
839b572ec9fSJakub Kicinski 			      name)
840b572ec9fSJakub Kicinski 
841b572ec9fSJakub Kicinski 	mac_stats->FramesTransmittedOK	= RD(a_frames_transmitted_ok);
842b572ec9fSJakub Kicinski 	mac_stats->FramesReceivedOK	= RD(a_frames_received_ok);
843b572ec9fSJakub Kicinski 	mac_stats->FrameCheckSequenceErrors = RD(a_frame_check_sequence_errors);
844b572ec9fSJakub Kicinski 	mac_stats->OctetsTransmittedOK	= RD(a_octets_transmitted_ok);
845b572ec9fSJakub Kicinski 	mac_stats->OctetsReceivedOK	= RD(a_octets_received_ok);
846b572ec9fSJakub Kicinski 	mac_stats->MulticastFramesXmittedOK = RD(a_multicast_frames_xmitted_ok);
847b572ec9fSJakub Kicinski 	mac_stats->BroadcastFramesXmittedOK = RD(a_broadcast_frames_xmitted_ok);
848b572ec9fSJakub Kicinski 	mac_stats->MulticastFramesReceivedOK = RD(a_multicast_frames_received_ok);
849b572ec9fSJakub Kicinski 	mac_stats->BroadcastFramesReceivedOK = RD(a_broadcast_frames_received_ok);
850b572ec9fSJakub Kicinski 	mac_stats->InRangeLengthErrors	= RD(a_in_range_length_errors);
851b572ec9fSJakub Kicinski 	mac_stats->OutOfRangeLengthField = RD(a_out_of_range_length_field);
852b572ec9fSJakub Kicinski 	mac_stats->FrameTooLongErrors	= RD(a_frame_too_long_errors);
853b572ec9fSJakub Kicinski #undef RD
854b572ec9fSJakub Kicinski }
855b572ec9fSJakub Kicinski 
856b572ec9fSJakub Kicinski void mlx5e_stats_eth_ctrl_get(struct mlx5e_priv *priv,
857b572ec9fSJakub Kicinski 			      struct ethtool_eth_ctrl_stats *ctrl_stats)
858b572ec9fSJakub Kicinski {
859b572ec9fSJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
860b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
861b572ec9fSJakub Kicinski 
862b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
863b572ec9fSJakub Kicinski 		return;
864b572ec9fSJakub Kicinski 
865b572ec9fSJakub Kicinski 	ctrl_stats->MACControlFramesTransmitted =
866b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
867b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
868b572ec9fSJakub Kicinski 				      a_mac_control_frames_transmitted);
869b572ec9fSJakub Kicinski 	ctrl_stats->MACControlFramesReceived =
870b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
871b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
872b572ec9fSJakub Kicinski 				      a_mac_control_frames_received);
873b572ec9fSJakub Kicinski 	ctrl_stats->UnsupportedOpcodesReceived =
874b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
875b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
876b572ec9fSJakub Kicinski 				      a_unsupported_opcodes_received);
877b572ec9fSJakub Kicinski }
878b572ec9fSJakub Kicinski 
879fc8e64a3SKamal Heib #define PPORT_2863_OFF(c) \
880fc8e64a3SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
881fc8e64a3SKamal Heib 		      counter_set.eth_2863_cntrs_grp_data_layout.c##_high)
882fc8e64a3SKamal Heib static const struct counter_desc pport_2863_stats_desc[] = {
883fc8e64a3SKamal Heib 	{ "rx_discards_phy", PPORT_2863_OFF(if_in_discards) },
884fc8e64a3SKamal Heib 	{ "tx_discards_phy", PPORT_2863_OFF(if_out_discards) },
885fc8e64a3SKamal Heib 	{ "tx_errors_phy", PPORT_2863_OFF(if_out_errors) },
886fc8e64a3SKamal Heib };
887fc8e64a3SKamal Heib 
888fc8e64a3SKamal Heib #define NUM_PPORT_2863_COUNTERS		ARRAY_SIZE(pport_2863_stats_desc)
889fc8e64a3SKamal Heib 
89096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(2863)
891fc8e64a3SKamal Heib {
892fc8e64a3SKamal Heib 	return NUM_PPORT_2863_COUNTERS;
893fc8e64a3SKamal Heib }
894fc8e64a3SKamal Heib 
89596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(2863)
896fc8e64a3SKamal Heib {
897fc8e64a3SKamal Heib 	int i;
898fc8e64a3SKamal Heib 
899fc8e64a3SKamal Heib 	for (i = 0; i < NUM_PPORT_2863_COUNTERS; i++)
900fc8e64a3SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_2863_stats_desc[i].format);
901fc8e64a3SKamal Heib 	return idx;
902fc8e64a3SKamal Heib }
903fc8e64a3SKamal Heib 
90496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(2863)
905fc8e64a3SKamal Heib {
906fc8e64a3SKamal Heib 	int i;
907fc8e64a3SKamal Heib 
908fc8e64a3SKamal Heib 	for (i = 0; i < NUM_PPORT_2863_COUNTERS; i++)
909fc8e64a3SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.RFC_2863_counters,
910fc8e64a3SKamal Heib 						  pport_2863_stats_desc, i);
911fc8e64a3SKamal Heib 	return idx;
912fc8e64a3SKamal Heib }
913fc8e64a3SKamal Heib 
91496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(2863)
91519386177SKamal Heib {
91619386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
91719386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
91819386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
91919386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
92019386177SKamal Heib 	void *out;
92119386177SKamal Heib 
92219386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
92319386177SKamal Heib 	out = pstats->RFC_2863_counters;
92419386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2863_COUNTERS_GROUP);
92519386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
92619386177SKamal Heib }
92719386177SKamal Heib 
928e0e0def9SKamal Heib #define PPORT_2819_OFF(c) \
929e0e0def9SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
930e0e0def9SKamal Heib 		      counter_set.eth_2819_cntrs_grp_data_layout.c##_high)
931e0e0def9SKamal Heib static const struct counter_desc pport_2819_stats_desc[] = {
932e0e0def9SKamal Heib 	{ "rx_undersize_pkts_phy", PPORT_2819_OFF(ether_stats_undersize_pkts) },
933e0e0def9SKamal Heib 	{ "rx_fragments_phy", PPORT_2819_OFF(ether_stats_fragments) },
934e0e0def9SKamal Heib 	{ "rx_jabbers_phy", PPORT_2819_OFF(ether_stats_jabbers) },
935e0e0def9SKamal Heib 	{ "rx_64_bytes_phy", PPORT_2819_OFF(ether_stats_pkts64octets) },
936e0e0def9SKamal Heib 	{ "rx_65_to_127_bytes_phy", PPORT_2819_OFF(ether_stats_pkts65to127octets) },
937e0e0def9SKamal Heib 	{ "rx_128_to_255_bytes_phy", PPORT_2819_OFF(ether_stats_pkts128to255octets) },
938e0e0def9SKamal Heib 	{ "rx_256_to_511_bytes_phy", PPORT_2819_OFF(ether_stats_pkts256to511octets) },
939e0e0def9SKamal Heib 	{ "rx_512_to_1023_bytes_phy", PPORT_2819_OFF(ether_stats_pkts512to1023octets) },
940e0e0def9SKamal Heib 	{ "rx_1024_to_1518_bytes_phy", PPORT_2819_OFF(ether_stats_pkts1024to1518octets) },
941e0e0def9SKamal Heib 	{ "rx_1519_to_2047_bytes_phy", PPORT_2819_OFF(ether_stats_pkts1519to2047octets) },
942e0e0def9SKamal Heib 	{ "rx_2048_to_4095_bytes_phy", PPORT_2819_OFF(ether_stats_pkts2048to4095octets) },
943e0e0def9SKamal Heib 	{ "rx_4096_to_8191_bytes_phy", PPORT_2819_OFF(ether_stats_pkts4096to8191octets) },
944e0e0def9SKamal Heib 	{ "rx_8192_to_10239_bytes_phy", PPORT_2819_OFF(ether_stats_pkts8192to10239octets) },
945e0e0def9SKamal Heib };
946e0e0def9SKamal Heib 
947e0e0def9SKamal Heib #define NUM_PPORT_2819_COUNTERS		ARRAY_SIZE(pport_2819_stats_desc)
948e0e0def9SKamal Heib 
94996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(2819)
950e0e0def9SKamal Heib {
951e0e0def9SKamal Heib 	return NUM_PPORT_2819_COUNTERS;
952e0e0def9SKamal Heib }
953e0e0def9SKamal Heib 
95496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(2819)
955e0e0def9SKamal Heib {
956e0e0def9SKamal Heib 	int i;
957e0e0def9SKamal Heib 
958e0e0def9SKamal Heib 	for (i = 0; i < NUM_PPORT_2819_COUNTERS; i++)
959e0e0def9SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_2819_stats_desc[i].format);
960e0e0def9SKamal Heib 	return idx;
961e0e0def9SKamal Heib }
962e0e0def9SKamal Heib 
96396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(2819)
964e0e0def9SKamal Heib {
965e0e0def9SKamal Heib 	int i;
966e0e0def9SKamal Heib 
967e0e0def9SKamal Heib 	for (i = 0; i < NUM_PPORT_2819_COUNTERS; i++)
968e0e0def9SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.RFC_2819_counters,
969e0e0def9SKamal Heib 						  pport_2819_stats_desc, i);
970e0e0def9SKamal Heib 	return idx;
971e0e0def9SKamal Heib }
972e0e0def9SKamal Heib 
97396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(2819)
97419386177SKamal Heib {
97519386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
97619386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
97719386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
97819386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
97919386177SKamal Heib 	void *out;
98019386177SKamal Heib 
98175370eb0SEyal Davidovich 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
98275370eb0SEyal Davidovich 		return;
98375370eb0SEyal Davidovich 
98419386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
98519386177SKamal Heib 	out = pstats->RFC_2819_counters;
98619386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2819_COUNTERS_GROUP);
98719386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
98819386177SKamal Heib }
98919386177SKamal Heib 
990b572ec9fSJakub Kicinski static const struct ethtool_rmon_hist_range mlx5e_rmon_ranges[] = {
991b572ec9fSJakub Kicinski 	{    0,    64 },
992b572ec9fSJakub Kicinski 	{   65,   127 },
993b572ec9fSJakub Kicinski 	{  128,   255 },
994b572ec9fSJakub Kicinski 	{  256,   511 },
995b572ec9fSJakub Kicinski 	{  512,  1023 },
996b572ec9fSJakub Kicinski 	{ 1024,  1518 },
997b572ec9fSJakub Kicinski 	{ 1519,  2047 },
998b572ec9fSJakub Kicinski 	{ 2048,  4095 },
999b572ec9fSJakub Kicinski 	{ 4096,  8191 },
1000b572ec9fSJakub Kicinski 	{ 8192, 10239 },
1001b572ec9fSJakub Kicinski 	{}
1002b572ec9fSJakub Kicinski };
1003b572ec9fSJakub Kicinski 
1004b572ec9fSJakub Kicinski void mlx5e_stats_rmon_get(struct mlx5e_priv *priv,
1005b572ec9fSJakub Kicinski 			  struct ethtool_rmon_stats *rmon,
1006b572ec9fSJakub Kicinski 			  const struct ethtool_rmon_hist_range **ranges)
1007b572ec9fSJakub Kicinski {
1008b572ec9fSJakub Kicinski 	u32 ppcnt_RFC_2819_counters[MLX5_ST_SZ_DW(ppcnt_reg)];
1009b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
1010b572ec9fSJakub Kicinski 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
1011b572ec9fSJakub Kicinski 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
1012b572ec9fSJakub Kicinski 
1013b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, local_port, 1);
1014b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2819_COUNTERS_GROUP);
1015b572ec9fSJakub Kicinski 	if (mlx5_core_access_reg(mdev, in, sz, ppcnt_RFC_2819_counters,
1016b572ec9fSJakub Kicinski 				 sz, MLX5_REG_PPCNT, 0, 0))
1017b572ec9fSJakub Kicinski 		return;
1018b572ec9fSJakub Kicinski 
1019b572ec9fSJakub Kicinski #define RD(name)						\
1020b572ec9fSJakub Kicinski 	MLX5E_READ_CTR64_BE_F(ppcnt_RFC_2819_counters,		\
1021b572ec9fSJakub Kicinski 			      eth_2819_cntrs_grp_data_layout,	\
1022b572ec9fSJakub Kicinski 			      name)
1023b572ec9fSJakub Kicinski 
1024b572ec9fSJakub Kicinski 	rmon->undersize_pkts	= RD(ether_stats_undersize_pkts);
1025b572ec9fSJakub Kicinski 	rmon->fragments		= RD(ether_stats_fragments);
1026b572ec9fSJakub Kicinski 	rmon->jabbers		= RD(ether_stats_jabbers);
1027b572ec9fSJakub Kicinski 
1028b572ec9fSJakub Kicinski 	rmon->hist[0]		= RD(ether_stats_pkts64octets);
1029b572ec9fSJakub Kicinski 	rmon->hist[1]		= RD(ether_stats_pkts65to127octets);
1030b572ec9fSJakub Kicinski 	rmon->hist[2]		= RD(ether_stats_pkts128to255octets);
1031b572ec9fSJakub Kicinski 	rmon->hist[3]		= RD(ether_stats_pkts256to511octets);
1032b572ec9fSJakub Kicinski 	rmon->hist[4]		= RD(ether_stats_pkts512to1023octets);
1033b572ec9fSJakub Kicinski 	rmon->hist[5]		= RD(ether_stats_pkts1024to1518octets);
1034b572ec9fSJakub Kicinski 	rmon->hist[6]		= RD(ether_stats_pkts1519to2047octets);
1035b572ec9fSJakub Kicinski 	rmon->hist[7]		= RD(ether_stats_pkts2048to4095octets);
1036b572ec9fSJakub Kicinski 	rmon->hist[8]		= RD(ether_stats_pkts4096to8191octets);
1037b572ec9fSJakub Kicinski 	rmon->hist[9]		= RD(ether_stats_pkts8192to10239octets);
1038b572ec9fSJakub Kicinski #undef RD
1039b572ec9fSJakub Kicinski 
1040b572ec9fSJakub Kicinski 	*ranges = mlx5e_rmon_ranges;
1041b572ec9fSJakub Kicinski }
1042b572ec9fSJakub Kicinski 
10432e4df0b2SKamal Heib #define PPORT_PHY_STATISTICAL_OFF(c) \
10442e4df0b2SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
10452e4df0b2SKamal Heib 		      counter_set.phys_layer_statistical_cntrs.c##_high)
10462e4df0b2SKamal Heib static const struct counter_desc pport_phy_statistical_stats_desc[] = {
10472e4df0b2SKamal Heib 	{ "rx_pcs_symbol_err_phy", PPORT_PHY_STATISTICAL_OFF(phy_symbol_errors) },
10482e4df0b2SKamal Heib 	{ "rx_corrected_bits_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits) },
10492e4df0b2SKamal Heib };
10502e4df0b2SKamal Heib 
10514cb4e98eSShay Agroskin static const struct counter_desc
10524cb4e98eSShay Agroskin pport_phy_statistical_err_lanes_stats_desc[] = {
10534cb4e98eSShay Agroskin 	{ "rx_err_lane_0_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane0) },
10544cb4e98eSShay Agroskin 	{ "rx_err_lane_1_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane1) },
10554cb4e98eSShay Agroskin 	{ "rx_err_lane_2_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane2) },
10564cb4e98eSShay Agroskin 	{ "rx_err_lane_3_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane3) },
10574cb4e98eSShay Agroskin };
10584cb4e98eSShay Agroskin 
10594cb4e98eSShay Agroskin #define NUM_PPORT_PHY_STATISTICAL_COUNTERS \
10604cb4e98eSShay Agroskin 	ARRAY_SIZE(pport_phy_statistical_stats_desc)
10614cb4e98eSShay Agroskin #define NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS \
10624cb4e98eSShay Agroskin 	ARRAY_SIZE(pport_phy_statistical_err_lanes_stats_desc)
10632e4df0b2SKamal Heib 
106496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(phy)
10652e4df0b2SKamal Heib {
10664cb4e98eSShay Agroskin 	struct mlx5_core_dev *mdev = priv->mdev;
10674cb4e98eSShay Agroskin 	int num_stats;
10684cb4e98eSShay Agroskin 
10696ab75516SSaeed Mahameed 	/* "1" for link_down_events special counter */
10704cb4e98eSShay Agroskin 	num_stats = 1;
10714cb4e98eSShay Agroskin 
10724cb4e98eSShay Agroskin 	num_stats += MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group) ?
10734cb4e98eSShay Agroskin 		     NUM_PPORT_PHY_STATISTICAL_COUNTERS : 0;
10744cb4e98eSShay Agroskin 
10754cb4e98eSShay Agroskin 	num_stats += MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters) ?
10764cb4e98eSShay Agroskin 		     NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS : 0;
10774cb4e98eSShay Agroskin 
10784cb4e98eSShay Agroskin 	return num_stats;
10792e4df0b2SKamal Heib }
10802e4df0b2SKamal Heib 
108196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(phy)
10822e4df0b2SKamal Heib {
10834cb4e98eSShay Agroskin 	struct mlx5_core_dev *mdev = priv->mdev;
10842e4df0b2SKamal Heib 	int i;
10852e4df0b2SKamal Heib 
10866ab75516SSaeed Mahameed 	strcpy(data + (idx++) * ETH_GSTRING_LEN, "link_down_events_phy");
10876ab75516SSaeed Mahameed 
10884cb4e98eSShay Agroskin 	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
10896ab75516SSaeed Mahameed 		return idx;
10906ab75516SSaeed Mahameed 
10916ab75516SSaeed Mahameed 	for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_COUNTERS; i++)
10922e4df0b2SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
10932e4df0b2SKamal Heib 		       pport_phy_statistical_stats_desc[i].format);
10944cb4e98eSShay Agroskin 
10954cb4e98eSShay Agroskin 	if (MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters))
10964cb4e98eSShay Agroskin 		for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS; i++)
10974cb4e98eSShay Agroskin 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
10984cb4e98eSShay Agroskin 			       pport_phy_statistical_err_lanes_stats_desc[i].format);
10994cb4e98eSShay Agroskin 
11002e4df0b2SKamal Heib 	return idx;
11012e4df0b2SKamal Heib }
11022e4df0b2SKamal Heib 
110396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(phy)
11042e4df0b2SKamal Heib {
11054cb4e98eSShay Agroskin 	struct mlx5_core_dev *mdev = priv->mdev;
11062e4df0b2SKamal Heib 	int i;
11072e4df0b2SKamal Heib 
11086ab75516SSaeed Mahameed 	/* link_down_events_phy has special handling since it is not stored in __be64 format */
11096ab75516SSaeed Mahameed 	data[idx++] = MLX5_GET(ppcnt_reg, priv->stats.pport.phy_counters,
11106ab75516SSaeed Mahameed 			       counter_set.phys_layer_cntrs.link_down_events);
11116ab75516SSaeed Mahameed 
11124cb4e98eSShay Agroskin 	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
11136ab75516SSaeed Mahameed 		return idx;
11146ab75516SSaeed Mahameed 
11156ab75516SSaeed Mahameed 	for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_COUNTERS; i++)
11162e4df0b2SKamal Heib 		data[idx++] =
11172e4df0b2SKamal Heib 			MLX5E_READ_CTR64_BE(&priv->stats.pport.phy_statistical_counters,
11182e4df0b2SKamal Heib 					    pport_phy_statistical_stats_desc, i);
11194cb4e98eSShay Agroskin 
11204cb4e98eSShay Agroskin 	if (MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters))
11214cb4e98eSShay Agroskin 		for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS; i++)
11224cb4e98eSShay Agroskin 			data[idx++] =
11234cb4e98eSShay Agroskin 				MLX5E_READ_CTR64_BE(&priv->stats.pport.phy_statistical_counters,
11244cb4e98eSShay Agroskin 						    pport_phy_statistical_err_lanes_stats_desc,
11254cb4e98eSShay Agroskin 						    i);
11262e4df0b2SKamal Heib 	return idx;
11272e4df0b2SKamal Heib }
11282e4df0b2SKamal Heib 
112996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(phy)
113019386177SKamal Heib {
113119386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
113219386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
113319386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
113419386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
113519386177SKamal Heib 	void *out;
113619386177SKamal Heib 
113719386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
113819386177SKamal Heib 	out = pstats->phy_counters;
113919386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_COUNTERS_GROUP);
114019386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
114119386177SKamal Heib 
114219386177SKamal Heib 	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
114319386177SKamal Heib 		return;
114419386177SKamal Heib 
114519386177SKamal Heib 	out = pstats->phy_statistical_counters;
114619386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_STATISTICAL_GROUP);
114719386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
114819386177SKamal Heib }
114919386177SKamal Heib 
11501703bb50SJakub Kicinski void mlx5e_stats_fec_get(struct mlx5e_priv *priv,
11511703bb50SJakub Kicinski 			 struct ethtool_fec_stats *fec_stats)
11521703bb50SJakub Kicinski {
11531703bb50SJakub Kicinski 	u32 ppcnt_phy_statistical[MLX5_ST_SZ_DW(ppcnt_reg)];
11541703bb50SJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
11551703bb50SJakub Kicinski 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
11561703bb50SJakub Kicinski 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
11571703bb50SJakub Kicinski 
11581703bb50SJakub Kicinski 	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
11591703bb50SJakub Kicinski 		return;
11601703bb50SJakub Kicinski 
11611703bb50SJakub Kicinski 	MLX5_SET(ppcnt_reg, in, local_port, 1);
11621703bb50SJakub Kicinski 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_STATISTICAL_GROUP);
11631703bb50SJakub Kicinski 	if (mlx5_core_access_reg(mdev, in, sz, ppcnt_phy_statistical,
11641703bb50SJakub Kicinski 				 sz, MLX5_REG_PPCNT, 0, 0))
11651703bb50SJakub Kicinski 		return;
11661703bb50SJakub Kicinski 
11671703bb50SJakub Kicinski 	fec_stats->corrected_bits.total =
11681703bb50SJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_phy_statistical,
11691703bb50SJakub Kicinski 				      phys_layer_statistical_cntrs,
11701703bb50SJakub Kicinski 				      phy_corrected_bits);
11711703bb50SJakub Kicinski }
11721703bb50SJakub Kicinski 
11733488bd4cSKamal Heib #define PPORT_ETH_EXT_OFF(c) \
11743488bd4cSKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
11753488bd4cSKamal Heib 		      counter_set.eth_extended_cntrs_grp_data_layout.c##_high)
11763488bd4cSKamal Heib static const struct counter_desc pport_eth_ext_stats_desc[] = {
11773488bd4cSKamal Heib 	{ "rx_buffer_passed_thres_phy", PPORT_ETH_EXT_OFF(rx_buffer_almost_full) },
11783488bd4cSKamal Heib };
11793488bd4cSKamal Heib 
11803488bd4cSKamal Heib #define NUM_PPORT_ETH_EXT_COUNTERS	ARRAY_SIZE(pport_eth_ext_stats_desc)
11813488bd4cSKamal Heib 
118296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(eth_ext)
11833488bd4cSKamal Heib {
11843488bd4cSKamal Heib 	if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters))
11853488bd4cSKamal Heib 		return NUM_PPORT_ETH_EXT_COUNTERS;
11863488bd4cSKamal Heib 
11873488bd4cSKamal Heib 	return 0;
11883488bd4cSKamal Heib }
11893488bd4cSKamal Heib 
119096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(eth_ext)
11913488bd4cSKamal Heib {
11923488bd4cSKamal Heib 	int i;
11933488bd4cSKamal Heib 
11943488bd4cSKamal Heib 	if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters))
11953488bd4cSKamal Heib 		for (i = 0; i < NUM_PPORT_ETH_EXT_COUNTERS; i++)
11963488bd4cSKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
11973488bd4cSKamal Heib 			       pport_eth_ext_stats_desc[i].format);
11983488bd4cSKamal Heib 	return idx;
11993488bd4cSKamal Heib }
12003488bd4cSKamal Heib 
120196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(eth_ext)
12023488bd4cSKamal Heib {
12033488bd4cSKamal Heib 	int i;
12043488bd4cSKamal Heib 
12053488bd4cSKamal Heib 	if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters))
12063488bd4cSKamal Heib 		for (i = 0; i < NUM_PPORT_ETH_EXT_COUNTERS; i++)
12073488bd4cSKamal Heib 			data[idx++] =
12083488bd4cSKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.eth_ext_counters,
12093488bd4cSKamal Heib 						    pport_eth_ext_stats_desc, i);
12103488bd4cSKamal Heib 	return idx;
12113488bd4cSKamal Heib }
12123488bd4cSKamal Heib 
121396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(eth_ext)
121419386177SKamal Heib {
121519386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
121619386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
121719386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
121819386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
121919386177SKamal Heib 	void *out;
122019386177SKamal Heib 
122119386177SKamal Heib 	if (!MLX5_CAP_PCAM_FEATURE(mdev, rx_buffer_fullness_counters))
122219386177SKamal Heib 		return;
122319386177SKamal Heib 
122419386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
122519386177SKamal Heib 	out = pstats->eth_ext_counters;
122619386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_ETHERNET_EXTENDED_COUNTERS_GROUP);
122719386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
122819386177SKamal Heib }
122919386177SKamal Heib 
12309fd2b5f1SKamal Heib #define PCIE_PERF_OFF(c) \
12319fd2b5f1SKamal Heib 	MLX5_BYTE_OFF(mpcnt_reg, counter_set.pcie_perf_cntrs_grp_data_layout.c)
12329fd2b5f1SKamal Heib static const struct counter_desc pcie_perf_stats_desc[] = {
12339fd2b5f1SKamal Heib 	{ "rx_pci_signal_integrity", PCIE_PERF_OFF(rx_errors) },
12349fd2b5f1SKamal Heib 	{ "tx_pci_signal_integrity", PCIE_PERF_OFF(tx_errors) },
12359fd2b5f1SKamal Heib };
12369fd2b5f1SKamal Heib 
12379fd2b5f1SKamal Heib #define PCIE_PERF_OFF64(c) \
12389fd2b5f1SKamal Heib 	MLX5_BYTE_OFF(mpcnt_reg, counter_set.pcie_perf_cntrs_grp_data_layout.c##_high)
12399fd2b5f1SKamal Heib static const struct counter_desc pcie_perf_stats_desc64[] = {
12409fd2b5f1SKamal Heib 	{ "outbound_pci_buffer_overflow", PCIE_PERF_OFF64(tx_overflow_buffer_pkt) },
12419fd2b5f1SKamal Heib };
12429fd2b5f1SKamal Heib 
12439fd2b5f1SKamal Heib static const struct counter_desc pcie_perf_stall_stats_desc[] = {
12449fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_rd", PCIE_PERF_OFF(outbound_stalled_reads) },
12459fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_wr", PCIE_PERF_OFF(outbound_stalled_writes) },
12469fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_rd_events", PCIE_PERF_OFF(outbound_stalled_reads_events) },
12479fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_wr_events", PCIE_PERF_OFF(outbound_stalled_writes_events) },
12489fd2b5f1SKamal Heib };
12499fd2b5f1SKamal Heib 
12509fd2b5f1SKamal Heib #define NUM_PCIE_PERF_COUNTERS		ARRAY_SIZE(pcie_perf_stats_desc)
12519fd2b5f1SKamal Heib #define NUM_PCIE_PERF_COUNTERS64	ARRAY_SIZE(pcie_perf_stats_desc64)
12529fd2b5f1SKamal Heib #define NUM_PCIE_PERF_STALL_COUNTERS	ARRAY_SIZE(pcie_perf_stall_stats_desc)
12539fd2b5f1SKamal Heib 
125496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(pcie)
12559fd2b5f1SKamal Heib {
12569fd2b5f1SKamal Heib 	int num_stats = 0;
12579fd2b5f1SKamal Heib 
12589fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group))
12599fd2b5f1SKamal Heib 		num_stats += NUM_PCIE_PERF_COUNTERS;
12609fd2b5f1SKamal Heib 
12619fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt))
12629fd2b5f1SKamal Heib 		num_stats += NUM_PCIE_PERF_COUNTERS64;
12639fd2b5f1SKamal Heib 
12649fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled))
12659fd2b5f1SKamal Heib 		num_stats += NUM_PCIE_PERF_STALL_COUNTERS;
12669fd2b5f1SKamal Heib 
12679fd2b5f1SKamal Heib 	return num_stats;
12689fd2b5f1SKamal Heib }
12699fd2b5f1SKamal Heib 
127096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(pcie)
12719fd2b5f1SKamal Heib {
12729fd2b5f1SKamal Heib 	int i;
12739fd2b5f1SKamal Heib 
12749fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group))
12759fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS; i++)
12769fd2b5f1SKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
12779fd2b5f1SKamal Heib 			       pcie_perf_stats_desc[i].format);
12789fd2b5f1SKamal Heib 
12799fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt))
12809fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS64; i++)
12819fd2b5f1SKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
12829fd2b5f1SKamal Heib 			       pcie_perf_stats_desc64[i].format);
12839fd2b5f1SKamal Heib 
12849fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled))
12859fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_STALL_COUNTERS; i++)
12869fd2b5f1SKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
12879fd2b5f1SKamal Heib 			       pcie_perf_stall_stats_desc[i].format);
12889fd2b5f1SKamal Heib 	return idx;
12899fd2b5f1SKamal Heib }
12909fd2b5f1SKamal Heib 
129196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pcie)
12929fd2b5f1SKamal Heib {
12939fd2b5f1SKamal Heib 	int i;
12949fd2b5f1SKamal Heib 
12959fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group))
12969fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS; i++)
12979fd2b5f1SKamal Heib 			data[idx++] =
12989fd2b5f1SKamal Heib 				MLX5E_READ_CTR32_BE(&priv->stats.pcie.pcie_perf_counters,
12999fd2b5f1SKamal Heib 						    pcie_perf_stats_desc, i);
13009fd2b5f1SKamal Heib 
13019fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt))
13029fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS64; i++)
13039fd2b5f1SKamal Heib 			data[idx++] =
13049fd2b5f1SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pcie.pcie_perf_counters,
13059fd2b5f1SKamal Heib 						    pcie_perf_stats_desc64, i);
13069fd2b5f1SKamal Heib 
13079fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled))
13089fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_STALL_COUNTERS; i++)
13099fd2b5f1SKamal Heib 			data[idx++] =
13109fd2b5f1SKamal Heib 				MLX5E_READ_CTR32_BE(&priv->stats.pcie.pcie_perf_counters,
13119fd2b5f1SKamal Heib 						    pcie_perf_stall_stats_desc, i);
13129fd2b5f1SKamal Heib 	return idx;
13139fd2b5f1SKamal Heib }
13149fd2b5f1SKamal Heib 
131596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(pcie)
131619386177SKamal Heib {
131719386177SKamal Heib 	struct mlx5e_pcie_stats *pcie_stats = &priv->stats.pcie;
131819386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
131919386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(mpcnt_reg)] = {0};
132019386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(mpcnt_reg);
132119386177SKamal Heib 	void *out;
132219386177SKamal Heib 
132319386177SKamal Heib 	if (!MLX5_CAP_MCAM_FEATURE(mdev, pcie_performance_group))
132419386177SKamal Heib 		return;
132519386177SKamal Heib 
132619386177SKamal Heib 	out = pcie_stats->pcie_perf_counters;
132719386177SKamal Heib 	MLX5_SET(mpcnt_reg, in, grp, MLX5_PCIE_PERFORMANCE_COUNTERS_GROUP);
132819386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_MPCNT, 0, 0);
132919386177SKamal Heib }
133019386177SKamal Heib 
13311297d97fSAya Levin #define PPORT_PER_TC_PRIO_OFF(c) \
13321297d97fSAya Levin 	MLX5_BYTE_OFF(ppcnt_reg, \
13331297d97fSAya Levin 		      counter_set.eth_per_tc_prio_grp_data_layout.c##_high)
13341297d97fSAya Levin 
13351297d97fSAya Levin static const struct counter_desc pport_per_tc_prio_stats_desc[] = {
13361297d97fSAya Levin 	{ "rx_prio%d_buf_discard", PPORT_PER_TC_PRIO_OFF(no_buffer_discard_uc) },
13371297d97fSAya Levin };
13381297d97fSAya Levin 
13391297d97fSAya Levin #define NUM_PPORT_PER_TC_PRIO_COUNTERS	ARRAY_SIZE(pport_per_tc_prio_stats_desc)
13401297d97fSAya Levin 
13411297d97fSAya Levin #define PPORT_PER_TC_CONGEST_PRIO_OFF(c) \
13421297d97fSAya Levin 	MLX5_BYTE_OFF(ppcnt_reg, \
13431297d97fSAya Levin 		      counter_set.eth_per_tc_congest_prio_grp_data_layout.c##_high)
13441297d97fSAya Levin 
13451297d97fSAya Levin static const struct counter_desc pport_per_tc_congest_prio_stats_desc[] = {
13461297d97fSAya Levin 	{ "rx_prio%d_cong_discard", PPORT_PER_TC_CONGEST_PRIO_OFF(wred_discard) },
13471297d97fSAya Levin 	{ "rx_prio%d_marked", PPORT_PER_TC_CONGEST_PRIO_OFF(ecn_marked_tc) },
13481297d97fSAya Levin };
13491297d97fSAya Levin 
13501297d97fSAya Levin #define NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS \
13511297d97fSAya Levin 	ARRAY_SIZE(pport_per_tc_congest_prio_stats_desc)
13521297d97fSAya Levin 
13531297d97fSAya Levin static int mlx5e_grp_per_tc_prio_get_num_stats(struct mlx5e_priv *priv)
13541297d97fSAya Levin {
13551297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
13561297d97fSAya Levin 
13571297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
13581297d97fSAya Levin 		return 0;
13591297d97fSAya Levin 
13601297d97fSAya Levin 	return NUM_PPORT_PER_TC_PRIO_COUNTERS * NUM_PPORT_PRIO;
13611297d97fSAya Levin }
13621297d97fSAya Levin 
136396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(per_port_buff_congest)
13641297d97fSAya Levin {
13651297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
13661297d97fSAya Levin 	int i, prio;
13671297d97fSAya Levin 
13681297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
13691297d97fSAya Levin 		return idx;
13701297d97fSAya Levin 
13711297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
13721297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_PRIO_COUNTERS; i++)
13731297d97fSAya Levin 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
13741297d97fSAya Levin 				pport_per_tc_prio_stats_desc[i].format, prio);
13751297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS; i++)
13761297d97fSAya Levin 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
13771297d97fSAya Levin 				pport_per_tc_congest_prio_stats_desc[i].format, prio);
13781297d97fSAya Levin 	}
13791297d97fSAya Levin 
13801297d97fSAya Levin 	return idx;
13811297d97fSAya Levin }
13821297d97fSAya Levin 
138396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(per_port_buff_congest)
13841297d97fSAya Levin {
13851297d97fSAya Levin 	struct mlx5e_pport_stats *pport = &priv->stats.pport;
13861297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
13871297d97fSAya Levin 	int i, prio;
13881297d97fSAya Levin 
13891297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
13901297d97fSAya Levin 		return idx;
13911297d97fSAya Levin 
13921297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
13931297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_PRIO_COUNTERS; i++)
13941297d97fSAya Levin 			data[idx++] =
13951297d97fSAya Levin 				MLX5E_READ_CTR64_BE(&pport->per_tc_prio_counters[prio],
13961297d97fSAya Levin 						    pport_per_tc_prio_stats_desc, i);
13971297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS ; i++)
13981297d97fSAya Levin 			data[idx++] =
13991297d97fSAya Levin 				MLX5E_READ_CTR64_BE(&pport->per_tc_congest_prio_counters[prio],
14001297d97fSAya Levin 						    pport_per_tc_congest_prio_stats_desc, i);
14011297d97fSAya Levin 	}
14021297d97fSAya Levin 
14031297d97fSAya Levin 	return idx;
14041297d97fSAya Levin }
14051297d97fSAya Levin 
14061297d97fSAya Levin static void mlx5e_grp_per_tc_prio_update_stats(struct mlx5e_priv *priv)
14071297d97fSAya Levin {
14081297d97fSAya Levin 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
14091297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
14101297d97fSAya Levin 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
14111297d97fSAya Levin 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
14121297d97fSAya Levin 	void *out;
14131297d97fSAya Levin 	int prio;
14141297d97fSAya Levin 
14151297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
14161297d97fSAya Levin 		return;
14171297d97fSAya Levin 
14181297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, pnat, 2);
14191297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_TRAFFIC_CLASS_COUNTERS_GROUP);
14201297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
14211297d97fSAya Levin 		out = pstats->per_tc_prio_counters[prio];
14221297d97fSAya Levin 		MLX5_SET(ppcnt_reg, in, prio_tc, prio);
14231297d97fSAya Levin 		mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
14241297d97fSAya Levin 	}
14251297d97fSAya Levin }
14261297d97fSAya Levin 
14271297d97fSAya Levin static int mlx5e_grp_per_tc_congest_prio_get_num_stats(struct mlx5e_priv *priv)
14281297d97fSAya Levin {
14291297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
14301297d97fSAya Levin 
14311297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
14321297d97fSAya Levin 		return 0;
14331297d97fSAya Levin 
14341297d97fSAya Levin 	return NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS * NUM_PPORT_PRIO;
14351297d97fSAya Levin }
14361297d97fSAya Levin 
14371297d97fSAya Levin static void mlx5e_grp_per_tc_congest_prio_update_stats(struct mlx5e_priv *priv)
14381297d97fSAya Levin {
14391297d97fSAya Levin 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
14401297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
14411297d97fSAya Levin 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
14421297d97fSAya Levin 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
14431297d97fSAya Levin 	void *out;
14441297d97fSAya Levin 	int prio;
14451297d97fSAya Levin 
14461297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
14471297d97fSAya Levin 		return;
14481297d97fSAya Levin 
14491297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, pnat, 2);
14501297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_TRAFFIC_CLASS_CONGESTION_GROUP);
14511297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
14521297d97fSAya Levin 		out = pstats->per_tc_congest_prio_counters[prio];
14531297d97fSAya Levin 		MLX5_SET(ppcnt_reg, in, prio_tc, prio);
14541297d97fSAya Levin 		mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
14551297d97fSAya Levin 	}
14561297d97fSAya Levin }
14571297d97fSAya Levin 
145896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(per_port_buff_congest)
14591297d97fSAya Levin {
14601297d97fSAya Levin 	return mlx5e_grp_per_tc_prio_get_num_stats(priv) +
14611297d97fSAya Levin 		mlx5e_grp_per_tc_congest_prio_get_num_stats(priv);
14621297d97fSAya Levin }
14631297d97fSAya Levin 
146496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(per_port_buff_congest)
14651297d97fSAya Levin {
14661297d97fSAya Levin 	mlx5e_grp_per_tc_prio_update_stats(priv);
14671297d97fSAya Levin 	mlx5e_grp_per_tc_congest_prio_update_stats(priv);
14681297d97fSAya Levin }
14691297d97fSAya Levin 
14704377bea2SKamal Heib #define PPORT_PER_PRIO_OFF(c) \
14714377bea2SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
14724377bea2SKamal Heib 		      counter_set.eth_per_prio_grp_data_layout.c##_high)
1473e6000651SKamal Heib static const struct counter_desc pport_per_prio_traffic_stats_desc[] = {
1474e6000651SKamal Heib 	{ "rx_prio%d_bytes", PPORT_PER_PRIO_OFF(rx_octets) },
1475e6000651SKamal Heib 	{ "rx_prio%d_packets", PPORT_PER_PRIO_OFF(rx_frames) },
1476827a8cb2SAharon Landau 	{ "rx_prio%d_discards", PPORT_PER_PRIO_OFF(rx_discards) },
1477e6000651SKamal Heib 	{ "tx_prio%d_bytes", PPORT_PER_PRIO_OFF(tx_octets) },
1478e6000651SKamal Heib 	{ "tx_prio%d_packets", PPORT_PER_PRIO_OFF(tx_frames) },
1479e6000651SKamal Heib };
1480e6000651SKamal Heib 
1481e6000651SKamal Heib #define NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS	ARRAY_SIZE(pport_per_prio_traffic_stats_desc)
1482e6000651SKamal Heib 
148354c73f86SYuval Shaia static int mlx5e_grp_per_prio_traffic_get_num_stats(void)
1484e6000651SKamal Heib {
1485e6000651SKamal Heib 	return NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS * NUM_PPORT_PRIO;
1486e6000651SKamal Heib }
1487e6000651SKamal Heib 
1488e6000651SKamal Heib static int mlx5e_grp_per_prio_traffic_fill_strings(struct mlx5e_priv *priv,
1489e6000651SKamal Heib 						   u8 *data,
1490e6000651SKamal Heib 						   int idx)
1491e6000651SKamal Heib {
1492e6000651SKamal Heib 	int i, prio;
1493e6000651SKamal Heib 
1494e6000651SKamal Heib 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
1495e6000651SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS; i++)
1496e6000651SKamal Heib 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
1497e6000651SKamal Heib 				pport_per_prio_traffic_stats_desc[i].format, prio);
1498e6000651SKamal Heib 	}
1499e6000651SKamal Heib 
1500e6000651SKamal Heib 	return idx;
1501e6000651SKamal Heib }
1502e6000651SKamal Heib 
1503e6000651SKamal Heib static int mlx5e_grp_per_prio_traffic_fill_stats(struct mlx5e_priv *priv,
1504e6000651SKamal Heib 						 u64 *data,
1505e6000651SKamal Heib 						 int idx)
1506e6000651SKamal Heib {
1507e6000651SKamal Heib 	int i, prio;
1508e6000651SKamal Heib 
1509e6000651SKamal Heib 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
1510e6000651SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS; i++)
1511e6000651SKamal Heib 			data[idx++] =
1512e6000651SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[prio],
1513e6000651SKamal Heib 						    pport_per_prio_traffic_stats_desc, i);
1514e6000651SKamal Heib 	}
1515e6000651SKamal Heib 
1516e6000651SKamal Heib 	return idx;
1517e6000651SKamal Heib }
1518e6000651SKamal Heib 
15194377bea2SKamal Heib static const struct counter_desc pport_per_prio_pfc_stats_desc[] = {
15204377bea2SKamal Heib 	/* %s is "global" or "prio{i}" */
15214377bea2SKamal Heib 	{ "rx_%s_pause", PPORT_PER_PRIO_OFF(rx_pause) },
15224377bea2SKamal Heib 	{ "rx_%s_pause_duration", PPORT_PER_PRIO_OFF(rx_pause_duration) },
15234377bea2SKamal Heib 	{ "tx_%s_pause", PPORT_PER_PRIO_OFF(tx_pause) },
15244377bea2SKamal Heib 	{ "tx_%s_pause_duration", PPORT_PER_PRIO_OFF(tx_pause_duration) },
15254377bea2SKamal Heib 	{ "rx_%s_pause_transition", PPORT_PER_PRIO_OFF(rx_pause_transition) },
15264377bea2SKamal Heib };
15274377bea2SKamal Heib 
15282fcb12dfSInbar Karmy static const struct counter_desc pport_pfc_stall_stats_desc[] = {
15292fcb12dfSInbar Karmy 	{ "tx_pause_storm_warning_events", PPORT_PER_PRIO_OFF(device_stall_minor_watermark_cnt) },
15302fcb12dfSInbar Karmy 	{ "tx_pause_storm_error_events", PPORT_PER_PRIO_OFF(device_stall_critical_watermark_cnt) },
15312fcb12dfSInbar Karmy };
15322fcb12dfSInbar Karmy 
15334377bea2SKamal Heib #define NUM_PPORT_PER_PRIO_PFC_COUNTERS		ARRAY_SIZE(pport_per_prio_pfc_stats_desc)
15342fcb12dfSInbar Karmy #define NUM_PPORT_PFC_STALL_COUNTERS(priv)	(ARRAY_SIZE(pport_pfc_stall_stats_desc) * \
15352fcb12dfSInbar Karmy 						 MLX5_CAP_PCAM_FEATURE((priv)->mdev, pfcc_mask) * \
15362fcb12dfSInbar Karmy 						 MLX5_CAP_DEBUG((priv)->mdev, stall_detect))
15374377bea2SKamal Heib 
15384377bea2SKamal Heib static unsigned long mlx5e_query_pfc_combined(struct mlx5e_priv *priv)
15394377bea2SKamal Heib {
15404377bea2SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
15414377bea2SKamal Heib 	u8 pfc_en_tx;
15424377bea2SKamal Heib 	u8 pfc_en_rx;
15434377bea2SKamal Heib 	int err;
15444377bea2SKamal Heib 
15454377bea2SKamal Heib 	if (MLX5_CAP_GEN(mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH)
15464377bea2SKamal Heib 		return 0;
15474377bea2SKamal Heib 
15484377bea2SKamal Heib 	err = mlx5_query_port_pfc(mdev, &pfc_en_tx, &pfc_en_rx);
15494377bea2SKamal Heib 
15504377bea2SKamal Heib 	return err ? 0 : pfc_en_tx | pfc_en_rx;
15514377bea2SKamal Heib }
15524377bea2SKamal Heib 
15534377bea2SKamal Heib static bool mlx5e_query_global_pause_combined(struct mlx5e_priv *priv)
15544377bea2SKamal Heib {
15554377bea2SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
15564377bea2SKamal Heib 	u32 rx_pause;
15574377bea2SKamal Heib 	u32 tx_pause;
15584377bea2SKamal Heib 	int err;
15594377bea2SKamal Heib 
15604377bea2SKamal Heib 	if (MLX5_CAP_GEN(mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH)
15614377bea2SKamal Heib 		return false;
15624377bea2SKamal Heib 
15634377bea2SKamal Heib 	err = mlx5_query_port_pause(mdev, &rx_pause, &tx_pause);
15644377bea2SKamal Heib 
15654377bea2SKamal Heib 	return err ? false : rx_pause | tx_pause;
15664377bea2SKamal Heib }
15674377bea2SKamal Heib 
15684377bea2SKamal Heib static int mlx5e_grp_per_prio_pfc_get_num_stats(struct mlx5e_priv *priv)
15694377bea2SKamal Heib {
15704377bea2SKamal Heib 	return (mlx5e_query_global_pause_combined(priv) +
15714377bea2SKamal Heib 		hweight8(mlx5e_query_pfc_combined(priv))) *
15722fcb12dfSInbar Karmy 		NUM_PPORT_PER_PRIO_PFC_COUNTERS +
15732fcb12dfSInbar Karmy 		NUM_PPORT_PFC_STALL_COUNTERS(priv);
15744377bea2SKamal Heib }
15754377bea2SKamal Heib 
15764377bea2SKamal Heib static int mlx5e_grp_per_prio_pfc_fill_strings(struct mlx5e_priv *priv,
15774377bea2SKamal Heib 					       u8 *data,
15784377bea2SKamal Heib 					       int idx)
15794377bea2SKamal Heib {
15804377bea2SKamal Heib 	unsigned long pfc_combined;
15814377bea2SKamal Heib 	int i, prio;
15824377bea2SKamal Heib 
15834377bea2SKamal Heib 	pfc_combined = mlx5e_query_pfc_combined(priv);
15844377bea2SKamal Heib 	for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) {
15854377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
15864377bea2SKamal Heib 			char pfc_string[ETH_GSTRING_LEN];
15874377bea2SKamal Heib 
15884377bea2SKamal Heib 			snprintf(pfc_string, sizeof(pfc_string), "prio%d", prio);
15894377bea2SKamal Heib 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
15904377bea2SKamal Heib 				pport_per_prio_pfc_stats_desc[i].format, pfc_string);
15914377bea2SKamal Heib 		}
15924377bea2SKamal Heib 	}
15934377bea2SKamal Heib 
15944377bea2SKamal Heib 	if (mlx5e_query_global_pause_combined(priv)) {
15954377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
15964377bea2SKamal Heib 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
15974377bea2SKamal Heib 				pport_per_prio_pfc_stats_desc[i].format, "global");
15984377bea2SKamal Heib 		}
15994377bea2SKamal Heib 	}
16004377bea2SKamal Heib 
16012fcb12dfSInbar Karmy 	for (i = 0; i < NUM_PPORT_PFC_STALL_COUNTERS(priv); i++)
16022fcb12dfSInbar Karmy 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
16032fcb12dfSInbar Karmy 		       pport_pfc_stall_stats_desc[i].format);
16042fcb12dfSInbar Karmy 
16054377bea2SKamal Heib 	return idx;
16064377bea2SKamal Heib }
16074377bea2SKamal Heib 
16084377bea2SKamal Heib static int mlx5e_grp_per_prio_pfc_fill_stats(struct mlx5e_priv *priv,
16094377bea2SKamal Heib 					     u64 *data,
16104377bea2SKamal Heib 					     int idx)
16114377bea2SKamal Heib {
16124377bea2SKamal Heib 	unsigned long pfc_combined;
16134377bea2SKamal Heib 	int i, prio;
16144377bea2SKamal Heib 
16154377bea2SKamal Heib 	pfc_combined = mlx5e_query_pfc_combined(priv);
16164377bea2SKamal Heib 	for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) {
16174377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
16184377bea2SKamal Heib 			data[idx++] =
16194377bea2SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[prio],
16204377bea2SKamal Heib 						    pport_per_prio_pfc_stats_desc, i);
16214377bea2SKamal Heib 		}
16224377bea2SKamal Heib 	}
16234377bea2SKamal Heib 
16244377bea2SKamal Heib 	if (mlx5e_query_global_pause_combined(priv)) {
16254377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
16264377bea2SKamal Heib 			data[idx++] =
16274377bea2SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[0],
16284377bea2SKamal Heib 						    pport_per_prio_pfc_stats_desc, i);
16294377bea2SKamal Heib 		}
16304377bea2SKamal Heib 	}
16314377bea2SKamal Heib 
16322fcb12dfSInbar Karmy 	for (i = 0; i < NUM_PPORT_PFC_STALL_COUNTERS(priv); i++)
16332fcb12dfSInbar Karmy 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[0],
16342fcb12dfSInbar Karmy 						  pport_pfc_stall_stats_desc, i);
16352fcb12dfSInbar Karmy 
16364377bea2SKamal Heib 	return idx;
16374377bea2SKamal Heib }
16384377bea2SKamal Heib 
163996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(per_prio)
1640a8984281SKamal Heib {
164154c73f86SYuval Shaia 	return mlx5e_grp_per_prio_traffic_get_num_stats() +
1642a8984281SKamal Heib 		mlx5e_grp_per_prio_pfc_get_num_stats(priv);
1643a8984281SKamal Heib }
1644a8984281SKamal Heib 
164596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(per_prio)
1646a8984281SKamal Heib {
1647a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_traffic_fill_strings(priv, data, idx);
1648a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_pfc_fill_strings(priv, data, idx);
1649a8984281SKamal Heib 	return idx;
1650a8984281SKamal Heib }
1651a8984281SKamal Heib 
165296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(per_prio)
1653a8984281SKamal Heib {
1654a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_traffic_fill_stats(priv, data, idx);
1655a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_pfc_fill_stats(priv, data, idx);
1656a8984281SKamal Heib 	return idx;
1657a8984281SKamal Heib }
1658a8984281SKamal Heib 
165996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(per_prio)
166019386177SKamal Heib {
166119386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
166219386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
166319386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
166419386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
166519386177SKamal Heib 	int prio;
166619386177SKamal Heib 	void *out;
166719386177SKamal Heib 
166875370eb0SEyal Davidovich 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
166975370eb0SEyal Davidovich 		return;
167075370eb0SEyal Davidovich 
167119386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
167219386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_PRIORITY_COUNTERS_GROUP);
167319386177SKamal Heib 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
167419386177SKamal Heib 		out = pstats->per_prio_counters[prio];
167519386177SKamal Heib 		MLX5_SET(ppcnt_reg, in, prio_tc, prio);
167619386177SKamal Heib 		mlx5_core_access_reg(mdev, in, sz, out, sz,
167719386177SKamal Heib 				     MLX5_REG_PPCNT, 0, 0);
167819386177SKamal Heib 	}
167919386177SKamal Heib }
168019386177SKamal Heib 
16810e6f01a4SKamal Heib static const struct counter_desc mlx5e_pme_status_desc[] = {
1682c2fb3db2SMikhael Goikhman 	{ "module_unplug",       sizeof(u64) * MLX5_MODULE_STATUS_UNPLUGGED },
16830e6f01a4SKamal Heib };
16840e6f01a4SKamal Heib 
16850e6f01a4SKamal Heib static const struct counter_desc mlx5e_pme_error_desc[] = {
1686c2fb3db2SMikhael Goikhman 	{ "module_bus_stuck",    sizeof(u64) * MLX5_MODULE_EVENT_ERROR_BUS_STUCK },
1687c2fb3db2SMikhael Goikhman 	{ "module_high_temp",    sizeof(u64) * MLX5_MODULE_EVENT_ERROR_HIGH_TEMPERATURE },
1688c2fb3db2SMikhael Goikhman 	{ "module_bad_shorted",  sizeof(u64) * MLX5_MODULE_EVENT_ERROR_BAD_CABLE },
16890e6f01a4SKamal Heib };
16900e6f01a4SKamal Heib 
16910e6f01a4SKamal Heib #define NUM_PME_STATUS_STATS		ARRAY_SIZE(mlx5e_pme_status_desc)
16920e6f01a4SKamal Heib #define NUM_PME_ERR_STATS		ARRAY_SIZE(mlx5e_pme_error_desc)
16930e6f01a4SKamal Heib 
169496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(pme)
16950e6f01a4SKamal Heib {
16960e6f01a4SKamal Heib 	return NUM_PME_STATUS_STATS + NUM_PME_ERR_STATS;
16970e6f01a4SKamal Heib }
16980e6f01a4SKamal Heib 
169996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(pme)
17000e6f01a4SKamal Heib {
17010e6f01a4SKamal Heib 	int i;
17020e6f01a4SKamal Heib 
17030e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_STATUS_STATS; i++)
17040e6f01a4SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, mlx5e_pme_status_desc[i].format);
17050e6f01a4SKamal Heib 
17060e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_ERR_STATS; i++)
17070e6f01a4SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, mlx5e_pme_error_desc[i].format);
17080e6f01a4SKamal Heib 
17090e6f01a4SKamal Heib 	return idx;
17100e6f01a4SKamal Heib }
17110e6f01a4SKamal Heib 
171296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pme)
17130e6f01a4SKamal Heib {
171469c1280bSSaeed Mahameed 	struct mlx5_pme_stats pme_stats;
17150e6f01a4SKamal Heib 	int i;
17160e6f01a4SKamal Heib 
171769c1280bSSaeed Mahameed 	mlx5_get_pme_stats(priv->mdev, &pme_stats);
171869c1280bSSaeed Mahameed 
17190e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_STATUS_STATS; i++)
172069c1280bSSaeed Mahameed 		data[idx++] = MLX5E_READ_CTR64_CPU(pme_stats.status_counters,
17210e6f01a4SKamal Heib 						   mlx5e_pme_status_desc, i);
17220e6f01a4SKamal Heib 
17230e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_ERR_STATS; i++)
172469c1280bSSaeed Mahameed 		data[idx++] = MLX5E_READ_CTR64_CPU(pme_stats.error_counters,
17250e6f01a4SKamal Heib 						   mlx5e_pme_error_desc, i);
17260e6f01a4SKamal Heib 
17270e6f01a4SKamal Heib 	return idx;
17280e6f01a4SKamal Heib }
17290e6f01a4SKamal Heib 
173096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(pme) { return; }
173196b12796SSaeed Mahameed 
173296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(tls)
173343585a41SIlya Lesokhin {
173443585a41SIlya Lesokhin 	return mlx5e_tls_get_count(priv);
173543585a41SIlya Lesokhin }
173643585a41SIlya Lesokhin 
173796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(tls)
173843585a41SIlya Lesokhin {
173943585a41SIlya Lesokhin 	return idx + mlx5e_tls_get_strings(priv, data + idx * ETH_GSTRING_LEN);
174043585a41SIlya Lesokhin }
174143585a41SIlya Lesokhin 
174296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(tls)
174343585a41SIlya Lesokhin {
174443585a41SIlya Lesokhin 	return idx + mlx5e_tls_get_stats(priv, data + idx);
174543585a41SIlya Lesokhin }
174643585a41SIlya Lesokhin 
174796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(tls) { return; }
174896b12796SSaeed Mahameed 
17491fe85006SKamal Heib static const struct counter_desc rq_stats_desc[] = {
17501fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, packets) },
17511fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, bytes) },
17521fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete) },
17530aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete_tail) },
17540aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete_tail_slow) },
17551fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary) },
17561fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) },
17571fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_none) },
17581fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_drop) },
175986690b4bSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_redirect) },
17601fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_packets) },
17611fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_bytes) },
1762f007c13dSNatali Shechtman 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, ecn_mark) },
1763f24686e8SGal Pressman 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, removed_vlan_packets) },
17641fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, wqe_err) },
1765b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) },
1766b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, mpwqe_filler_strides) },
17670073c8f7SMoshe Shemesh 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, oversize_pkts_sw_drop) },
17681fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, buff_alloc_err) },
17691fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cqe_compress_blks) },
17701fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) },
17711fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_reuse) },
17721fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_full) },
17731fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_empty) },
17741fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_busy) },
17751fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_waive) },
1776dc983f0eSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, congst_umr) },
177794563847SEran Ben Elisha 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, arfs_err) },
1778be5323c8SAya Levin 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, recover) },
177976c1e1acSTariq Toukan #ifdef CONFIG_MLX5_EN_TLS
178076c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_decrypted_packets) },
178176c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_decrypted_bytes) },
178276c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_pkt) },
178376c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_start) },
178476c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_end) },
178576c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_skip) },
178676c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_res_ok) },
1787e9ce991bSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_res_retry) },
178876c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_res_skip) },
178976c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_err) },
179076c1e1acSTariq Toukan #endif
17911fe85006SKamal Heib };
17921fe85006SKamal Heib 
17931fe85006SKamal Heib static const struct counter_desc sq_stats_desc[] = {
17941fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, packets) },
17951fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, bytes) },
17961fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_packets) },
17971fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_bytes) },
17981fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_packets) },
17991fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_bytes) },
18001fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_partial) },
18011fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) },
1802f24686e8SGal Pressman 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) },
18031fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, nop) },
18045af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, mpwqe_blks) },
18055af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, mpwqe_pkts) },
1806d2ead1f3STariq Toukan #ifdef CONFIG_MLX5_EN_TLS
1807d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_packets) },
1808d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_bytes) },
1809d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_ooo) },
1810d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_dump_packets) },
1811d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_dump_bytes) },
181246a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_resync_bytes) },
181346a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_skip_no_sync_data) },
181446a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_drop_no_sync_data) },
181546a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_drop_bypass_req) },
1816d2ead1f3STariq Toukan #endif
18171fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_none) },
18181fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, stopped) },
18191fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, dropped) },
18201fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, xmit_more) },
1821db75373cSEran Ben Elisha 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, recover) },
182286155656STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, cqes) },
1823f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, wake) },
1824f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, cqe_err) },
18251fe85006SKamal Heib };
18261fe85006SKamal Heib 
1827890388adSTariq Toukan static const struct counter_desc rq_xdpsq_stats_desc[] = {
1828890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, xmit) },
182973cab880SShay Agroskin 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, mpwqe) },
1830c2273219SShay Agroskin 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, inlnw) },
18316c085a8aSShay Agroskin 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, nops) },
1832890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, full) },
1833890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, err) },
1834890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, cqes) },
1835890388adSTariq Toukan };
1836890388adSTariq Toukan 
183758b99ee3STariq Toukan static const struct counter_desc xdpsq_stats_desc[] = {
183858b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, xmit) },
183973cab880SShay Agroskin 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, mpwqe) },
1840c2273219SShay Agroskin 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, inlnw) },
18416c085a8aSShay Agroskin 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, nops) },
184258b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, full) },
184358b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, err) },
184458b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, cqes) },
184558b99ee3STariq Toukan };
184658b99ee3STariq Toukan 
1847db05815bSMaxim Mikityanskiy static const struct counter_desc xskrq_stats_desc[] = {
1848db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, packets) },
1849db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, bytes) },
1850db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_complete) },
1851db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_unnecessary) },
1852db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) },
1853db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_none) },
1854db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, ecn_mark) },
1855db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, removed_vlan_packets) },
1856db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, xdp_drop) },
1857db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, xdp_redirect) },
1858db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, wqe_err) },
1859db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) },
1860db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_strides) },
1861db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, oversize_pkts_sw_drop) },
1862db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, buff_alloc_err) },
1863db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, cqe_compress_blks) },
1864db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) },
1865db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, congst_umr) },
1866db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, arfs_err) },
1867db05815bSMaxim Mikityanskiy };
1868db05815bSMaxim Mikityanskiy 
1869db05815bSMaxim Mikityanskiy static const struct counter_desc xsksq_stats_desc[] = {
1870db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, xmit) },
1871db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, mpwqe) },
1872db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, inlnw) },
1873db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, full) },
1874db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, err) },
1875db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, cqes) },
1876db05815bSMaxim Mikityanskiy };
1877db05815bSMaxim Mikityanskiy 
187857d689a8SEran Ben Elisha static const struct counter_desc ch_stats_desc[] = {
1879a1bf74dcSTariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, events) },
18802d7103c8STariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, poll) },
18812d7103c8STariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, arm) },
18822d7103c8STariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, aff_change) },
1883db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, force_irq) },
188457d689a8SEran Ben Elisha 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, eq_rearm) },
188557d689a8SEran Ben Elisha };
188657d689a8SEran Ben Elisha 
1887145e5637SEran Ben Elisha static const struct counter_desc ptp_sq_stats_desc[] = {
1888145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, packets) },
1889145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, bytes) },
1890145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, csum_partial) },
1891145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) },
1892145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) },
1893145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, nop) },
1894145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, csum_none) },
1895145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, stopped) },
1896145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, dropped) },
1897145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, xmit_more) },
1898145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, recover) },
1899145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, cqes) },
1900145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, wake) },
1901145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, cqe_err) },
1902145e5637SEran Ben Elisha };
1903145e5637SEran Ben Elisha 
1904145e5637SEran Ben Elisha static const struct counter_desc ptp_ch_stats_desc[] = {
1905145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, events) },
1906145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, poll) },
1907145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, arm) },
1908145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, eq_rearm) },
1909145e5637SEran Ben Elisha };
1910145e5637SEran Ben Elisha 
19111880bc4eSEran Ben Elisha static const struct counter_desc ptp_cq_stats_desc[] = {
19121880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, cqe) },
19131880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, err_cqe) },
19141880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, abort) },
19151880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, abort_abs_diff_ns) },
19161880bc4eSEran Ben Elisha };
19171880bc4eSEran Ben Elisha 
1918a28359e9SAya Levin static const struct counter_desc ptp_rq_stats_desc[] = {
1919a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, packets) },
1920a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, bytes) },
1921a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_complete) },
1922a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_complete_tail) },
1923a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_complete_tail_slow) },
1924a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_unnecessary) },
1925a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) },
1926a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_none) },
1927a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, xdp_drop) },
1928a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, xdp_redirect) },
1929a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, lro_packets) },
1930a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, lro_bytes) },
1931a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, ecn_mark) },
1932a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, removed_vlan_packets) },
1933a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, wqe_err) },
1934a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) },
1935a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_strides) },
1936a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, oversize_pkts_sw_drop) },
1937a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, buff_alloc_err) },
1938a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cqe_compress_blks) },
1939a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) },
1940a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_reuse) },
1941a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_full) },
1942a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_empty) },
1943a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_busy) },
1944a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_waive) },
1945a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, congst_umr) },
1946a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, arfs_err) },
1947a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, recover) },
1948a28359e9SAya Levin };
1949a28359e9SAya Levin 
1950214baf22SMaxim Mikityanskiy static const struct counter_desc qos_sq_stats_desc[] = {
1951214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, packets) },
1952214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, bytes) },
1953214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_packets) },
1954214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_bytes) },
1955214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_inner_packets) },
1956214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_inner_bytes) },
1957214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_partial) },
1958214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) },
1959214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) },
1960214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, nop) },
1961214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, mpwqe_blks) },
1962214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, mpwqe_pkts) },
1963214baf22SMaxim Mikityanskiy #ifdef CONFIG_MLX5_EN_TLS
1964214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_packets) },
1965214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_bytes) },
1966214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_ooo) },
1967214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_dump_packets) },
1968214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_dump_bytes) },
1969214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_resync_bytes) },
1970214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_skip_no_sync_data) },
1971214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_drop_no_sync_data) },
1972214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_drop_bypass_req) },
1973214baf22SMaxim Mikityanskiy #endif
1974214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_none) },
1975214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, stopped) },
1976214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, dropped) },
1977214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, xmit_more) },
1978214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, recover) },
1979214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, cqes) },
1980214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, wake) },
1981214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, cqe_err) },
1982214baf22SMaxim Mikityanskiy };
1983214baf22SMaxim Mikityanskiy 
19841fe85006SKamal Heib #define NUM_RQ_STATS			ARRAY_SIZE(rq_stats_desc)
19851fe85006SKamal Heib #define NUM_SQ_STATS			ARRAY_SIZE(sq_stats_desc)
198658b99ee3STariq Toukan #define NUM_XDPSQ_STATS			ARRAY_SIZE(xdpsq_stats_desc)
1987890388adSTariq Toukan #define NUM_RQ_XDPSQ_STATS		ARRAY_SIZE(rq_xdpsq_stats_desc)
1988db05815bSMaxim Mikityanskiy #define NUM_XSKRQ_STATS			ARRAY_SIZE(xskrq_stats_desc)
1989db05815bSMaxim Mikityanskiy #define NUM_XSKSQ_STATS			ARRAY_SIZE(xsksq_stats_desc)
199057d689a8SEran Ben Elisha #define NUM_CH_STATS			ARRAY_SIZE(ch_stats_desc)
1991145e5637SEran Ben Elisha #define NUM_PTP_SQ_STATS		ARRAY_SIZE(ptp_sq_stats_desc)
1992145e5637SEran Ben Elisha #define NUM_PTP_CH_STATS		ARRAY_SIZE(ptp_ch_stats_desc)
19931880bc4eSEran Ben Elisha #define NUM_PTP_CQ_STATS		ARRAY_SIZE(ptp_cq_stats_desc)
1994a28359e9SAya Levin #define NUM_PTP_RQ_STATS                ARRAY_SIZE(ptp_rq_stats_desc)
1995214baf22SMaxim Mikityanskiy #define NUM_QOS_SQ_STATS		ARRAY_SIZE(qos_sq_stats_desc)
1996214baf22SMaxim Mikityanskiy 
1997214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(qos)
1998214baf22SMaxim Mikityanskiy {
1999214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
2000214baf22SMaxim Mikityanskiy 	return NUM_QOS_SQ_STATS * smp_load_acquire(&priv->htb.max_qos_sqs);
2001214baf22SMaxim Mikityanskiy }
2002214baf22SMaxim Mikityanskiy 
2003214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qos)
2004214baf22SMaxim Mikityanskiy {
2005214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
2006214baf22SMaxim Mikityanskiy 	u16 max_qos_sqs = smp_load_acquire(&priv->htb.max_qos_sqs);
2007214baf22SMaxim Mikityanskiy 	int i, qid;
2008214baf22SMaxim Mikityanskiy 
2009214baf22SMaxim Mikityanskiy 	for (qid = 0; qid < max_qos_sqs; qid++)
2010214baf22SMaxim Mikityanskiy 		for (i = 0; i < NUM_QOS_SQ_STATS; i++)
2011214baf22SMaxim Mikityanskiy 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2012214baf22SMaxim Mikityanskiy 				qos_sq_stats_desc[i].format, qid);
2013214baf22SMaxim Mikityanskiy 
2014214baf22SMaxim Mikityanskiy 	return idx;
2015214baf22SMaxim Mikityanskiy }
2016214baf22SMaxim Mikityanskiy 
2017214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qos)
2018214baf22SMaxim Mikityanskiy {
2019214baf22SMaxim Mikityanskiy 	struct mlx5e_sq_stats **stats;
2020214baf22SMaxim Mikityanskiy 	u16 max_qos_sqs;
2021214baf22SMaxim Mikityanskiy 	int i, qid;
2022214baf22SMaxim Mikityanskiy 
2023214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
2024214baf22SMaxim Mikityanskiy 	max_qos_sqs = smp_load_acquire(&priv->htb.max_qos_sqs);
2025214baf22SMaxim Mikityanskiy 	stats = READ_ONCE(priv->htb.qos_sq_stats);
2026214baf22SMaxim Mikityanskiy 
2027214baf22SMaxim Mikityanskiy 	for (qid = 0; qid < max_qos_sqs; qid++) {
2028214baf22SMaxim Mikityanskiy 		struct mlx5e_sq_stats *s = READ_ONCE(stats[qid]);
2029214baf22SMaxim Mikityanskiy 
2030214baf22SMaxim Mikityanskiy 		for (i = 0; i < NUM_QOS_SQ_STATS; i++)
2031214baf22SMaxim Mikityanskiy 			data[idx++] = MLX5E_READ_CTR64_CPU(s, qos_sq_stats_desc, i);
2032214baf22SMaxim Mikityanskiy 	}
2033214baf22SMaxim Mikityanskiy 
2034214baf22SMaxim Mikityanskiy 	return idx;
2035214baf22SMaxim Mikityanskiy }
2036214baf22SMaxim Mikityanskiy 
2037214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qos) { return; }
2038145e5637SEran Ben Elisha 
2039145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(ptp)
2040145e5637SEran Ben Elisha {
2041a28359e9SAya Levin 	int num = NUM_PTP_CH_STATS;
2042a28359e9SAya Levin 
2043a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
2044a28359e9SAya Levin 		return 0;
2045a28359e9SAya Levin 
2046a28359e9SAya Levin 	if (priv->tx_ptp_opened)
2047a28359e9SAya Levin 		num += (NUM_PTP_SQ_STATS + NUM_PTP_CQ_STATS) * priv->max_opened_tc;
2048a28359e9SAya Levin 	if (priv->rx_ptp_opened)
2049a28359e9SAya Levin 		num += NUM_PTP_RQ_STATS;
2050a28359e9SAya Levin 
2051a28359e9SAya Levin 	return num;
2052145e5637SEran Ben Elisha }
2053145e5637SEran Ben Elisha 
2054145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(ptp)
2055145e5637SEran Ben Elisha {
2056145e5637SEran Ben Elisha 	int i, tc;
2057145e5637SEran Ben Elisha 
2058a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
2059145e5637SEran Ben Elisha 		return idx;
2060145e5637SEran Ben Elisha 
2061145e5637SEran Ben Elisha 	for (i = 0; i < NUM_PTP_CH_STATS; i++)
2062145e5637SEran Ben Elisha 		sprintf(data + (idx++) * ETH_GSTRING_LEN,
2063145e5637SEran Ben Elisha 			ptp_ch_stats_desc[i].format);
2064145e5637SEran Ben Elisha 
2065a28359e9SAya Levin 	if (priv->tx_ptp_opened) {
2066145e5637SEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
2067145e5637SEran Ben Elisha 			for (i = 0; i < NUM_PTP_SQ_STATS; i++)
2068145e5637SEran Ben Elisha 				sprintf(data + (idx++) * ETH_GSTRING_LEN,
2069145e5637SEran Ben Elisha 					ptp_sq_stats_desc[i].format, tc);
2070145e5637SEran Ben Elisha 
20711880bc4eSEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
20721880bc4eSEran Ben Elisha 			for (i = 0; i < NUM_PTP_CQ_STATS; i++)
20731880bc4eSEran Ben Elisha 				sprintf(data + (idx++) * ETH_GSTRING_LEN,
20741880bc4eSEran Ben Elisha 					ptp_cq_stats_desc[i].format, tc);
2075a28359e9SAya Levin 	}
2076a28359e9SAya Levin 	if (priv->rx_ptp_opened) {
2077a28359e9SAya Levin 		for (i = 0; i < NUM_PTP_RQ_STATS; i++)
2078a28359e9SAya Levin 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2079a28359e9SAya Levin 				ptp_rq_stats_desc[i].format);
2080a28359e9SAya Levin 	}
2081145e5637SEran Ben Elisha 	return idx;
2082145e5637SEran Ben Elisha }
2083145e5637SEran Ben Elisha 
2084145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(ptp)
2085145e5637SEran Ben Elisha {
2086145e5637SEran Ben Elisha 	int i, tc;
2087145e5637SEran Ben Elisha 
2088a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
2089145e5637SEran Ben Elisha 		return idx;
2090145e5637SEran Ben Elisha 
2091145e5637SEran Ben Elisha 	for (i = 0; i < NUM_PTP_CH_STATS; i++)
2092145e5637SEran Ben Elisha 		data[idx++] =
2093b0d35de4SAya Levin 			MLX5E_READ_CTR64_CPU(&priv->ptp_stats.ch,
2094145e5637SEran Ben Elisha 					     ptp_ch_stats_desc, i);
2095145e5637SEran Ben Elisha 
2096a28359e9SAya Levin 	if (priv->tx_ptp_opened) {
2097145e5637SEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
2098145e5637SEran Ben Elisha 			for (i = 0; i < NUM_PTP_SQ_STATS; i++)
2099145e5637SEran Ben Elisha 				data[idx++] =
2100b0d35de4SAya Levin 					MLX5E_READ_CTR64_CPU(&priv->ptp_stats.sq[tc],
2101145e5637SEran Ben Elisha 							     ptp_sq_stats_desc, i);
2102145e5637SEran Ben Elisha 
21031880bc4eSEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
21041880bc4eSEran Ben Elisha 			for (i = 0; i < NUM_PTP_CQ_STATS; i++)
21051880bc4eSEran Ben Elisha 				data[idx++] =
2106b0d35de4SAya Levin 					MLX5E_READ_CTR64_CPU(&priv->ptp_stats.cq[tc],
21071880bc4eSEran Ben Elisha 							     ptp_cq_stats_desc, i);
2108a28359e9SAya Levin 	}
2109a28359e9SAya Levin 	if (priv->rx_ptp_opened) {
2110a28359e9SAya Levin 		for (i = 0; i < NUM_PTP_RQ_STATS; i++)
2111a28359e9SAya Levin 			data[idx++] =
2112a28359e9SAya Levin 				MLX5E_READ_CTR64_CPU(&priv->ptp_stats.rq,
2113a28359e9SAya Levin 						     ptp_rq_stats_desc, i);
2114a28359e9SAya Levin 	}
2115145e5637SEran Ben Elisha 	return idx;
2116145e5637SEran Ben Elisha }
2117145e5637SEran Ben Elisha 
2118145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(ptp) { return; }
21191fe85006SKamal Heib 
212096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(channels)
21211fe85006SKamal Heib {
2122*9d758d4aSTariq Toukan 	int max_nch = priv->stats_nch;
212305909babSEran Ben Elisha 
212405909babSEran Ben Elisha 	return (NUM_RQ_STATS * max_nch) +
212505909babSEran Ben Elisha 	       (NUM_CH_STATS * max_nch) +
2126890388adSTariq Toukan 	       (NUM_SQ_STATS * max_nch * priv->max_opened_tc) +
212758b99ee3STariq Toukan 	       (NUM_RQ_XDPSQ_STATS * max_nch) +
2128db05815bSMaxim Mikityanskiy 	       (NUM_XDPSQ_STATS * max_nch) +
2129db05815bSMaxim Mikityanskiy 	       (NUM_XSKRQ_STATS * max_nch * priv->xsk.ever_used) +
2130db05815bSMaxim Mikityanskiy 	       (NUM_XSKSQ_STATS * max_nch * priv->xsk.ever_used);
21311fe85006SKamal Heib }
21321fe85006SKamal Heib 
213396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(channels)
21341fe85006SKamal Heib {
2135db05815bSMaxim Mikityanskiy 	bool is_xsk = priv->xsk.ever_used;
2136*9d758d4aSTariq Toukan 	int max_nch = priv->stats_nch;
21371fe85006SKamal Heib 	int i, j, tc;
21381fe85006SKamal Heib 
213905909babSEran Ben Elisha 	for (i = 0; i < max_nch; i++)
214057d689a8SEran Ben Elisha 		for (j = 0; j < NUM_CH_STATS; j++)
214157d689a8SEran Ben Elisha 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
214257d689a8SEran Ben Elisha 				ch_stats_desc[j].format, i);
214357d689a8SEran Ben Elisha 
2144890388adSTariq Toukan 	for (i = 0; i < max_nch; i++) {
21451fe85006SKamal Heib 		for (j = 0; j < NUM_RQ_STATS; j++)
2146890388adSTariq Toukan 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2147890388adSTariq Toukan 				rq_stats_desc[j].format, i);
2148db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKRQ_STATS * is_xsk; j++)
2149db05815bSMaxim Mikityanskiy 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2150db05815bSMaxim Mikityanskiy 				xskrq_stats_desc[j].format, i);
2151890388adSTariq Toukan 		for (j = 0; j < NUM_RQ_XDPSQ_STATS; j++)
2152890388adSTariq Toukan 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2153890388adSTariq Toukan 				rq_xdpsq_stats_desc[j].format, i);
2154890388adSTariq Toukan 	}
21551fe85006SKamal Heib 
215605909babSEran Ben Elisha 	for (tc = 0; tc < priv->max_opened_tc; tc++)
215705909babSEran Ben Elisha 		for (i = 0; i < max_nch; i++)
21581fe85006SKamal Heib 			for (j = 0; j < NUM_SQ_STATS; j++)
21591fe85006SKamal Heib 				sprintf(data + (idx++) * ETH_GSTRING_LEN,
21601fe85006SKamal Heib 					sq_stats_desc[j].format,
2161c55d8b10SEran Ben Elisha 					i + tc * max_nch);
21621fe85006SKamal Heib 
2163db05815bSMaxim Mikityanskiy 	for (i = 0; i < max_nch; i++) {
2164db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKSQ_STATS * is_xsk; j++)
2165db05815bSMaxim Mikityanskiy 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2166db05815bSMaxim Mikityanskiy 				xsksq_stats_desc[j].format, i);
216758b99ee3STariq Toukan 		for (j = 0; j < NUM_XDPSQ_STATS; j++)
216858b99ee3STariq Toukan 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
216958b99ee3STariq Toukan 				xdpsq_stats_desc[j].format, i);
2170db05815bSMaxim Mikityanskiy 	}
217158b99ee3STariq Toukan 
21721fe85006SKamal Heib 	return idx;
21731fe85006SKamal Heib }
21741fe85006SKamal Heib 
217596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(channels)
21761fe85006SKamal Heib {
2177db05815bSMaxim Mikityanskiy 	bool is_xsk = priv->xsk.ever_used;
2178*9d758d4aSTariq Toukan 	int max_nch = priv->stats_nch;
21791fe85006SKamal Heib 	int i, j, tc;
21801fe85006SKamal Heib 
218105909babSEran Ben Elisha 	for (i = 0; i < max_nch; i++)
218257d689a8SEran Ben Elisha 		for (j = 0; j < NUM_CH_STATS; j++)
218357d689a8SEran Ben Elisha 			data[idx++] =
218405909babSEran Ben Elisha 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].ch,
218557d689a8SEran Ben Elisha 						     ch_stats_desc, j);
218657d689a8SEran Ben Elisha 
2187890388adSTariq Toukan 	for (i = 0; i < max_nch; i++) {
21881fe85006SKamal Heib 		for (j = 0; j < NUM_RQ_STATS; j++)
21891fe85006SKamal Heib 			data[idx++] =
219005909babSEran Ben Elisha 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].rq,
21911fe85006SKamal Heib 						     rq_stats_desc, j);
2192db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKRQ_STATS * is_xsk; j++)
2193db05815bSMaxim Mikityanskiy 			data[idx++] =
2194db05815bSMaxim Mikityanskiy 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].xskrq,
2195db05815bSMaxim Mikityanskiy 						     xskrq_stats_desc, j);
2196890388adSTariq Toukan 		for (j = 0; j < NUM_RQ_XDPSQ_STATS; j++)
2197890388adSTariq Toukan 			data[idx++] =
2198890388adSTariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].rq_xdpsq,
2199890388adSTariq Toukan 						     rq_xdpsq_stats_desc, j);
2200890388adSTariq Toukan 	}
22011fe85006SKamal Heib 
220205909babSEran Ben Elisha 	for (tc = 0; tc < priv->max_opened_tc; tc++)
220305909babSEran Ben Elisha 		for (i = 0; i < max_nch; i++)
22041fe85006SKamal Heib 			for (j = 0; j < NUM_SQ_STATS; j++)
22051fe85006SKamal Heib 				data[idx++] =
220605909babSEran Ben Elisha 					MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].sq[tc],
22071fe85006SKamal Heib 							     sq_stats_desc, j);
22081fe85006SKamal Heib 
2209db05815bSMaxim Mikityanskiy 	for (i = 0; i < max_nch; i++) {
2210db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKSQ_STATS * is_xsk; j++)
2211db05815bSMaxim Mikityanskiy 			data[idx++] =
2212db05815bSMaxim Mikityanskiy 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].xsksq,
2213db05815bSMaxim Mikityanskiy 						     xsksq_stats_desc, j);
221458b99ee3STariq Toukan 		for (j = 0; j < NUM_XDPSQ_STATS; j++)
221558b99ee3STariq Toukan 			data[idx++] =
221658b99ee3STariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].xdpsq,
221758b99ee3STariq Toukan 						     xdpsq_stats_desc, j);
2218db05815bSMaxim Mikityanskiy 	}
221958b99ee3STariq Toukan 
22201fe85006SKamal Heib 	return idx;
22211fe85006SKamal Heib }
22221fe85006SKamal Heib 
222396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(channels) { return; }
222496b12796SSaeed Mahameed 
22252a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(sw, 0);
22262a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(qcnt, MLX5E_NDO_UPDATE_STATS);
22272a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(vnic_env, 0);
22282a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(vport, MLX5E_NDO_UPDATE_STATS);
22292a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(802_3, MLX5E_NDO_UPDATE_STATS);
22302a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(2863, 0);
22312a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(2819, 0);
22322a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(phy, 0);
22332a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(pcie, 0);
22342a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(per_prio, 0);
22352a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(pme, 0);
22362a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(channels, 0);
22372a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(per_port_buff_congest, 0);
22387c453526SVlad Buslov MLX5E_DEFINE_STATS_GRP(eth_ext, 0);
2239f0ff8e8cSSaeed Mahameed static MLX5E_DEFINE_STATS_GRP(tls, 0);
2240145e5637SEran Ben Elisha static MLX5E_DEFINE_STATS_GRP(ptp, 0);
2241214baf22SMaxim Mikityanskiy static MLX5E_DEFINE_STATS_GRP(qos, 0);
2242f0ff8e8cSSaeed Mahameed 
224319386177SKamal Heib /* The stats groups order is opposite to the update_stats() order calls */
2244f0ff8e8cSSaeed Mahameed mlx5e_stats_grp_t mlx5e_nic_stats_grps[] = {
2245f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(sw),
2246f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(qcnt),
2247f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(vnic_env),
2248f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(vport),
2249f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(802_3),
2250f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(2863),
2251f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(2819),
2252f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(phy),
2253f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(eth_ext),
2254f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(pcie),
2255f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(per_prio),
2256f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(pme),
22570aab3e1bSRaed Salem #ifdef CONFIG_MLX5_EN_IPSEC
22580aab3e1bSRaed Salem 	&MLX5E_STATS_GRP(ipsec_sw),
22590aab3e1bSRaed Salem 	&MLX5E_STATS_GRP(ipsec_hw),
22600aab3e1bSRaed Salem #endif
2261f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(tls),
2262f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(channels),
2263f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(per_port_buff_congest),
2264145e5637SEran Ben Elisha 	&MLX5E_STATS_GRP(ptp),
2265214baf22SMaxim Mikityanskiy 	&MLX5E_STATS_GRP(qos),
2266c0752f2bSKamal Heib };
2267c0752f2bSKamal Heib 
22683460c184SSaeed Mahameed unsigned int mlx5e_nic_stats_grps_num(struct mlx5e_priv *priv)
22693460c184SSaeed Mahameed {
22703460c184SSaeed Mahameed 	return ARRAY_SIZE(mlx5e_nic_stats_grps);
22713460c184SSaeed Mahameed }
2272