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" 37dd1979cfSLama Kayal #include "en/ptp.h" 38*0a1498ebSLama Kayal #include "en/port.h" 39c0752f2bSKamal Heib 403460c184SSaeed Mahameed static unsigned int stats_grps_num(struct mlx5e_priv *priv) 413460c184SSaeed Mahameed { 423460c184SSaeed Mahameed return !priv->profile->stats_grps_num ? 0 : 433460c184SSaeed Mahameed priv->profile->stats_grps_num(priv); 443460c184SSaeed Mahameed } 453460c184SSaeed Mahameed 463460c184SSaeed Mahameed unsigned int mlx5e_stats_total_num(struct mlx5e_priv *priv) 473460c184SSaeed Mahameed { 48f0ff8e8cSSaeed Mahameed mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps; 493460c184SSaeed Mahameed const unsigned int num_stats_grps = stats_grps_num(priv); 503460c184SSaeed Mahameed unsigned int total = 0; 513460c184SSaeed Mahameed int i; 523460c184SSaeed Mahameed 533460c184SSaeed Mahameed for (i = 0; i < num_stats_grps; i++) 54f0ff8e8cSSaeed Mahameed total += stats_grps[i]->get_num_stats(priv); 553460c184SSaeed Mahameed 563460c184SSaeed Mahameed return total; 573460c184SSaeed Mahameed } 583460c184SSaeed Mahameed 59b521105bSAlaa Hleihel void mlx5e_stats_update_ndo_stats(struct mlx5e_priv *priv) 60b521105bSAlaa Hleihel { 61b521105bSAlaa Hleihel mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps; 62b521105bSAlaa Hleihel const unsigned int num_stats_grps = stats_grps_num(priv); 63b521105bSAlaa Hleihel int i; 64b521105bSAlaa Hleihel 65b521105bSAlaa Hleihel for (i = num_stats_grps - 1; i >= 0; i--) 66b521105bSAlaa Hleihel if (stats_grps[i]->update_stats && 67b521105bSAlaa Hleihel stats_grps[i]->update_stats_mask & MLX5E_NDO_UPDATE_STATS) 68b521105bSAlaa Hleihel stats_grps[i]->update_stats(priv); 69b521105bSAlaa Hleihel } 70b521105bSAlaa Hleihel 713460c184SSaeed Mahameed void mlx5e_stats_update(struct mlx5e_priv *priv) 723460c184SSaeed Mahameed { 73f0ff8e8cSSaeed Mahameed mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps; 743460c184SSaeed Mahameed const unsigned int num_stats_grps = stats_grps_num(priv); 753460c184SSaeed Mahameed int i; 763460c184SSaeed Mahameed 773460c184SSaeed Mahameed for (i = num_stats_grps - 1; i >= 0; i--) 78f0ff8e8cSSaeed Mahameed if (stats_grps[i]->update_stats) 79f0ff8e8cSSaeed Mahameed stats_grps[i]->update_stats(priv); 803460c184SSaeed Mahameed } 813460c184SSaeed Mahameed 823460c184SSaeed Mahameed void mlx5e_stats_fill(struct mlx5e_priv *priv, u64 *data, int idx) 833460c184SSaeed Mahameed { 84f0ff8e8cSSaeed Mahameed mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps; 853460c184SSaeed Mahameed const unsigned int num_stats_grps = stats_grps_num(priv); 863460c184SSaeed Mahameed int i; 873460c184SSaeed Mahameed 883460c184SSaeed Mahameed for (i = 0; i < num_stats_grps; i++) 89f0ff8e8cSSaeed Mahameed idx = stats_grps[i]->fill_stats(priv, data, idx); 903460c184SSaeed Mahameed } 913460c184SSaeed Mahameed 923460c184SSaeed Mahameed void mlx5e_stats_fill_strings(struct mlx5e_priv *priv, u8 *data) 933460c184SSaeed Mahameed { 94f0ff8e8cSSaeed Mahameed mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps; 953460c184SSaeed Mahameed const unsigned int num_stats_grps = stats_grps_num(priv); 963460c184SSaeed Mahameed int i, idx = 0; 973460c184SSaeed Mahameed 983460c184SSaeed Mahameed for (i = 0; i < num_stats_grps; i++) 99f0ff8e8cSSaeed Mahameed idx = stats_grps[i]->fill_strings(priv, data, idx); 1003460c184SSaeed Mahameed } 1013460c184SSaeed Mahameed 1023460c184SSaeed Mahameed /* Concrete NIC Stats */ 1033460c184SSaeed Mahameed 104c0752f2bSKamal Heib static const struct counter_desc sw_stats_desc[] = { 105c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_packets) }, 106c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_bytes) }, 107c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_packets) }, 108c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_bytes) }, 109c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_packets) }, 110c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_bytes) }, 111c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_inner_packets) }, 112c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_inner_bytes) }, 113f24686e8SGal Pressman { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_added_vlan_packets) }, 1142ad9ecdbSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_nop) }, 1155af75c74SMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_mpwqe_blks) }, 1165af75c74SMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_mpwqe_pkts) }, 117bf239741SIlya Lesokhin 118bf239741SIlya Lesokhin #ifdef CONFIG_MLX5_EN_TLS 119d2ead1f3STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_encrypted_packets) }, 120d2ead1f3STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_encrypted_bytes) }, 121bf239741SIlya Lesokhin { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_ooo) }, 122d2ead1f3STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_dump_packets) }, 123d2ead1f3STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_dump_bytes) }, 12446a3ea98STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_resync_bytes) }, 12546a3ea98STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_skip_no_sync_data) }, 12646a3ea98STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_drop_no_sync_data) }, 12746a3ea98STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_drop_bypass_req) }, 128bf239741SIlya Lesokhin #endif 129bf239741SIlya Lesokhin 130c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_lro_packets) }, 131c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_lro_bytes) }, 132def09e7bSKhalid Manaa { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_packets) }, 133def09e7bSKhalid Manaa { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_bytes) }, 134def09e7bSKhalid Manaa { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_skbs) }, 135def09e7bSKhalid Manaa { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_match_packets) }, 136def09e7bSKhalid Manaa { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_large_hds) }, 137f007c13dSNatali Shechtman { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_ecn_mark) }, 138f24686e8SGal Pressman { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_removed_vlan_packets) }, 139c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_unnecessary) }, 140c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_none) }, 141c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete) }, 1420aa1d186SSaeed Mahameed { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete_tail) }, 1430aa1d186SSaeed Mahameed { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete_tail_slow) }, 144c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_unnecessary_inner) }, 145c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_drop) }, 14686690b4bSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_redirect) }, 147890388adSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_xmit) }, 14873cab880SShay Agroskin { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_mpwqe) }, 149c2273219SShay Agroskin { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_inlnw) }, 1506c085a8aSShay Agroskin { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_nops) }, 151c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_full) }, 152890388adSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_err) }, 153890388adSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_cqe) }, 154c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_none) }, 155c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial) }, 156c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial_inner) }, 157c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_stopped) }, 158c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_dropped) }, 159c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xmit_more) }, 160db75373cSEran Ben Elisha { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_recover) }, 16186155656STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_cqes) }, 162f65a59ffSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_wake) }, 163f65a59ffSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_cqe_err) }, 16458b99ee3STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_xmit) }, 16573cab880SShay Agroskin { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_mpwqe) }, 166c2273219SShay Agroskin { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_inlnw) }, 1676c085a8aSShay Agroskin { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_nops) }, 16858b99ee3STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_full) }, 16958b99ee3STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_err) }, 17058b99ee3STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_cqes) }, 171c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_wqe_err) }, 172b71ba6b4STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_filler_cqes) }, 173b71ba6b4STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_filler_strides) }, 1740073c8f7SMoshe Shemesh { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_oversize_pkts_sw_drop) }, 175c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_buff_alloc_err) }, 176c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cqe_compress_blks) }, 177c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cqe_compress_pkts) }, 178c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_reuse) }, 179c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_full) }, 180c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_empty) }, 181c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_busy) }, 182c0752f2bSKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_waive) }, 183dc983f0eSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_congst_umr) }, 18494563847SEran Ben Elisha { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_arfs_err) }, 185be5323c8SAya Levin { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_recover) }, 18676c1e1acSTariq Toukan #ifdef CONFIG_MLX5_EN_TLS 18776c1e1acSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_decrypted_packets) }, 18876c1e1acSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_decrypted_bytes) }, 18976c1e1acSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_pkt) }, 19076c1e1acSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_start) }, 19176c1e1acSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_end) }, 19276c1e1acSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_skip) }, 19376c1e1acSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_res_ok) }, 194e9ce991bSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_res_retry) }, 19576c1e1acSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_res_skip) }, 19676c1e1acSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_err) }, 19776c1e1acSTariq Toukan #endif 198a1bf74dcSTariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_events) }, 1992d7103c8STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_poll) }, 2002d7103c8STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_arm) }, 2012d7103c8STariq Toukan { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_aff_change) }, 202db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_force_irq) }, 20357d689a8SEran Ben Elisha { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_eq_rearm) }, 204db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_packets) }, 205db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_bytes) }, 206db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_complete) }, 207db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_unnecessary) }, 208db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_unnecessary_inner) }, 209db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_none) }, 210db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_ecn_mark) }, 211db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_removed_vlan_packets) }, 212db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_xdp_drop) }, 213db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_xdp_redirect) }, 214db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_wqe_err) }, 215db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_mpwqe_filler_cqes) }, 216db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_mpwqe_filler_strides) }, 217db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_oversize_pkts_sw_drop) }, 218db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_buff_alloc_err) }, 219db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_cqe_compress_blks) }, 220db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_cqe_compress_pkts) }, 221db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_congst_umr) }, 222db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_arfs_err) }, 223db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_xmit) }, 224db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_mpwqe) }, 225db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_inlnw) }, 226db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_full) }, 227db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_err) }, 228db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_cqes) }, 229c0752f2bSKamal Heib }; 230c0752f2bSKamal Heib 231c0752f2bSKamal Heib #define NUM_SW_COUNTERS ARRAY_SIZE(sw_stats_desc) 232c0752f2bSKamal Heib 23396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(sw) 234c0752f2bSKamal Heib { 235c0752f2bSKamal Heib return NUM_SW_COUNTERS; 236c0752f2bSKamal Heib } 237c0752f2bSKamal Heib 23896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(sw) 239c0752f2bSKamal Heib { 240c0752f2bSKamal Heib int i; 241c0752f2bSKamal Heib 242c0752f2bSKamal Heib for (i = 0; i < NUM_SW_COUNTERS; i++) 243c0752f2bSKamal Heib strcpy(data + (idx++) * ETH_GSTRING_LEN, sw_stats_desc[i].format); 244c0752f2bSKamal Heib return idx; 245c0752f2bSKamal Heib } 246c0752f2bSKamal Heib 24796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(sw) 248c0752f2bSKamal Heib { 249c0752f2bSKamal Heib int i; 250c0752f2bSKamal Heib 251c0752f2bSKamal Heib for (i = 0; i < NUM_SW_COUNTERS; i++) 252c0752f2bSKamal Heib data[idx++] = MLX5E_READ_CTR64_CPU(&priv->stats.sw, sw_stats_desc, i); 253c0752f2bSKamal Heib return idx; 254c0752f2bSKamal Heib } 255c0752f2bSKamal Heib 2561a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xdp_red(struct mlx5e_sw_stats *s, 2571a7f5124SEran Ben Elisha struct mlx5e_xdpsq_stats *xdpsq_red_stats) 25819386177SKamal Heib { 2591a7f5124SEran Ben Elisha s->tx_xdp_xmit += xdpsq_red_stats->xmit; 2601a7f5124SEran Ben Elisha s->tx_xdp_mpwqe += xdpsq_red_stats->mpwqe; 2611a7f5124SEran Ben Elisha s->tx_xdp_inlnw += xdpsq_red_stats->inlnw; 2621a7f5124SEran Ben Elisha s->tx_xdp_nops += xdpsq_red_stats->nops; 2631a7f5124SEran Ben Elisha s->tx_xdp_full += xdpsq_red_stats->full; 2641a7f5124SEran Ben Elisha s->tx_xdp_err += xdpsq_red_stats->err; 2651a7f5124SEran Ben Elisha s->tx_xdp_cqes += xdpsq_red_stats->cqes; 2661a7f5124SEran Ben Elisha } 26719386177SKamal Heib 2681a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xdpsq(struct mlx5e_sw_stats *s, 2691a7f5124SEran Ben Elisha struct mlx5e_xdpsq_stats *xdpsq_stats) 2701a7f5124SEran Ben Elisha { 2711a7f5124SEran Ben Elisha s->rx_xdp_tx_xmit += xdpsq_stats->xmit; 2721a7f5124SEran Ben Elisha s->rx_xdp_tx_mpwqe += xdpsq_stats->mpwqe; 2731a7f5124SEran Ben Elisha s->rx_xdp_tx_inlnw += xdpsq_stats->inlnw; 2741a7f5124SEran Ben Elisha s->rx_xdp_tx_nops += xdpsq_stats->nops; 2751a7f5124SEran Ben Elisha s->rx_xdp_tx_full += xdpsq_stats->full; 2761a7f5124SEran Ben Elisha s->rx_xdp_tx_err += xdpsq_stats->err; 2771a7f5124SEran Ben Elisha s->rx_xdp_tx_cqe += xdpsq_stats->cqes; 2781a7f5124SEran Ben Elisha } 27919386177SKamal Heib 2801a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xsksq(struct mlx5e_sw_stats *s, 2811a7f5124SEran Ben Elisha struct mlx5e_xdpsq_stats *xsksq_stats) 2821a7f5124SEran Ben Elisha { 2831a7f5124SEran Ben Elisha s->tx_xsk_xmit += xsksq_stats->xmit; 2841a7f5124SEran Ben Elisha s->tx_xsk_mpwqe += xsksq_stats->mpwqe; 2851a7f5124SEran Ben Elisha s->tx_xsk_inlnw += xsksq_stats->inlnw; 2861a7f5124SEran Ben Elisha s->tx_xsk_full += xsksq_stats->full; 2871a7f5124SEran Ben Elisha s->tx_xsk_err += xsksq_stats->err; 2881a7f5124SEran Ben Elisha s->tx_xsk_cqes += xsksq_stats->cqes; 2891a7f5124SEran Ben Elisha } 29019386177SKamal Heib 2911a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xskrq(struct mlx5e_sw_stats *s, 2921a7f5124SEran Ben Elisha struct mlx5e_rq_stats *xskrq_stats) 2931a7f5124SEran Ben Elisha { 2941a7f5124SEran Ben Elisha s->rx_xsk_packets += xskrq_stats->packets; 2951a7f5124SEran Ben Elisha s->rx_xsk_bytes += xskrq_stats->bytes; 2961a7f5124SEran Ben Elisha s->rx_xsk_csum_complete += xskrq_stats->csum_complete; 2971a7f5124SEran Ben Elisha s->rx_xsk_csum_unnecessary += xskrq_stats->csum_unnecessary; 2981a7f5124SEran Ben Elisha s->rx_xsk_csum_unnecessary_inner += xskrq_stats->csum_unnecessary_inner; 2991a7f5124SEran Ben Elisha s->rx_xsk_csum_none += xskrq_stats->csum_none; 3001a7f5124SEran Ben Elisha s->rx_xsk_ecn_mark += xskrq_stats->ecn_mark; 3011a7f5124SEran Ben Elisha s->rx_xsk_removed_vlan_packets += xskrq_stats->removed_vlan_packets; 3021a7f5124SEran Ben Elisha s->rx_xsk_xdp_drop += xskrq_stats->xdp_drop; 3031a7f5124SEran Ben Elisha s->rx_xsk_xdp_redirect += xskrq_stats->xdp_redirect; 3041a7f5124SEran Ben Elisha s->rx_xsk_wqe_err += xskrq_stats->wqe_err; 3051a7f5124SEran Ben Elisha s->rx_xsk_mpwqe_filler_cqes += xskrq_stats->mpwqe_filler_cqes; 3061a7f5124SEran Ben Elisha s->rx_xsk_mpwqe_filler_strides += xskrq_stats->mpwqe_filler_strides; 3071a7f5124SEran Ben Elisha s->rx_xsk_oversize_pkts_sw_drop += xskrq_stats->oversize_pkts_sw_drop; 3081a7f5124SEran Ben Elisha s->rx_xsk_buff_alloc_err += xskrq_stats->buff_alloc_err; 3091a7f5124SEran Ben Elisha s->rx_xsk_cqe_compress_blks += xskrq_stats->cqe_compress_blks; 3101a7f5124SEran Ben Elisha s->rx_xsk_cqe_compress_pkts += xskrq_stats->cqe_compress_pkts; 3111a7f5124SEran Ben Elisha s->rx_xsk_congst_umr += xskrq_stats->congst_umr; 3121a7f5124SEran Ben Elisha s->rx_xsk_arfs_err += xskrq_stats->arfs_err; 3131a7f5124SEran Ben Elisha } 3141a7f5124SEran Ben Elisha 3151a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_rq_stats(struct mlx5e_sw_stats *s, 3161a7f5124SEran Ben Elisha struct mlx5e_rq_stats *rq_stats) 3171a7f5124SEran Ben Elisha { 31819386177SKamal Heib s->rx_packets += rq_stats->packets; 31919386177SKamal Heib s->rx_bytes += rq_stats->bytes; 32019386177SKamal Heib s->rx_lro_packets += rq_stats->lro_packets; 32119386177SKamal Heib s->rx_lro_bytes += rq_stats->lro_bytes; 322def09e7bSKhalid Manaa s->rx_gro_packets += rq_stats->gro_packets; 323def09e7bSKhalid Manaa s->rx_gro_bytes += rq_stats->gro_bytes; 324def09e7bSKhalid Manaa s->rx_gro_skbs += rq_stats->gro_skbs; 325def09e7bSKhalid Manaa s->rx_gro_match_packets += rq_stats->gro_match_packets; 326def09e7bSKhalid Manaa s->rx_gro_large_hds += rq_stats->gro_large_hds; 327f007c13dSNatali Shechtman s->rx_ecn_mark += rq_stats->ecn_mark; 32819386177SKamal Heib s->rx_removed_vlan_packets += rq_stats->removed_vlan_packets; 32919386177SKamal Heib s->rx_csum_none += rq_stats->csum_none; 33019386177SKamal Heib s->rx_csum_complete += rq_stats->csum_complete; 3310aa1d186SSaeed Mahameed s->rx_csum_complete_tail += rq_stats->csum_complete_tail; 3320aa1d186SSaeed Mahameed s->rx_csum_complete_tail_slow += rq_stats->csum_complete_tail_slow; 33319386177SKamal Heib s->rx_csum_unnecessary += rq_stats->csum_unnecessary; 33419386177SKamal Heib s->rx_csum_unnecessary_inner += rq_stats->csum_unnecessary_inner; 33519386177SKamal Heib s->rx_xdp_drop += rq_stats->xdp_drop; 33686690b4bSTariq Toukan s->rx_xdp_redirect += rq_stats->xdp_redirect; 33719386177SKamal Heib s->rx_wqe_err += rq_stats->wqe_err; 338b71ba6b4STariq Toukan s->rx_mpwqe_filler_cqes += rq_stats->mpwqe_filler_cqes; 339b71ba6b4STariq Toukan s->rx_mpwqe_filler_strides += rq_stats->mpwqe_filler_strides; 3400073c8f7SMoshe Shemesh s->rx_oversize_pkts_sw_drop += rq_stats->oversize_pkts_sw_drop; 34119386177SKamal Heib s->rx_buff_alloc_err += rq_stats->buff_alloc_err; 34219386177SKamal Heib s->rx_cqe_compress_blks += rq_stats->cqe_compress_blks; 34319386177SKamal Heib s->rx_cqe_compress_pkts += rq_stats->cqe_compress_pkts; 34419386177SKamal Heib s->rx_cache_reuse += rq_stats->cache_reuse; 34519386177SKamal Heib s->rx_cache_full += rq_stats->cache_full; 34619386177SKamal Heib s->rx_cache_empty += rq_stats->cache_empty; 34719386177SKamal Heib s->rx_cache_busy += rq_stats->cache_busy; 34819386177SKamal Heib s->rx_cache_waive += rq_stats->cache_waive; 349dc983f0eSTariq Toukan s->rx_congst_umr += rq_stats->congst_umr; 35094563847SEran Ben Elisha s->rx_arfs_err += rq_stats->arfs_err; 351be5323c8SAya Levin s->rx_recover += rq_stats->recover; 35276c1e1acSTariq Toukan #ifdef CONFIG_MLX5_EN_TLS 35376c1e1acSTariq Toukan s->rx_tls_decrypted_packets += rq_stats->tls_decrypted_packets; 35476c1e1acSTariq Toukan s->rx_tls_decrypted_bytes += rq_stats->tls_decrypted_bytes; 35576c1e1acSTariq Toukan s->rx_tls_resync_req_pkt += rq_stats->tls_resync_req_pkt; 35676c1e1acSTariq Toukan s->rx_tls_resync_req_start += rq_stats->tls_resync_req_start; 35776c1e1acSTariq Toukan s->rx_tls_resync_req_end += rq_stats->tls_resync_req_end; 35876c1e1acSTariq Toukan s->rx_tls_resync_req_skip += rq_stats->tls_resync_req_skip; 35976c1e1acSTariq Toukan s->rx_tls_resync_res_ok += rq_stats->tls_resync_res_ok; 360e9ce991bSTariq Toukan s->rx_tls_resync_res_retry += rq_stats->tls_resync_res_retry; 36176c1e1acSTariq Toukan s->rx_tls_resync_res_skip += rq_stats->tls_resync_res_skip; 36276c1e1acSTariq Toukan s->rx_tls_err += rq_stats->tls_err; 36376c1e1acSTariq Toukan #endif 3641a7f5124SEran Ben Elisha } 3651a7f5124SEran Ben Elisha 3661a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_ch_stats(struct mlx5e_sw_stats *s, 3671a7f5124SEran Ben Elisha struct mlx5e_ch_stats *ch_stats) 3681a7f5124SEran Ben Elisha { 369a1bf74dcSTariq Toukan s->ch_events += ch_stats->events; 3702d7103c8STariq Toukan s->ch_poll += ch_stats->poll; 3712d7103c8STariq Toukan s->ch_arm += ch_stats->arm; 3722d7103c8STariq Toukan s->ch_aff_change += ch_stats->aff_change; 373db05815bSMaxim Mikityanskiy s->ch_force_irq += ch_stats->force_irq; 37419386177SKamal Heib s->ch_eq_rearm += ch_stats->eq_rearm; 3751a7f5124SEran Ben Elisha } 37619386177SKamal Heib 3771a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_sq(struct mlx5e_sw_stats *s, 3781a7f5124SEran Ben Elisha struct mlx5e_sq_stats *sq_stats) 3791a7f5124SEran Ben Elisha { 38019386177SKamal Heib s->tx_packets += sq_stats->packets; 38119386177SKamal Heib s->tx_bytes += sq_stats->bytes; 38219386177SKamal Heib s->tx_tso_packets += sq_stats->tso_packets; 38319386177SKamal Heib s->tx_tso_bytes += sq_stats->tso_bytes; 38419386177SKamal Heib s->tx_tso_inner_packets += sq_stats->tso_inner_packets; 38519386177SKamal Heib s->tx_tso_inner_bytes += sq_stats->tso_inner_bytes; 38619386177SKamal Heib s->tx_added_vlan_packets += sq_stats->added_vlan_packets; 3872ad9ecdbSTariq Toukan s->tx_nop += sq_stats->nop; 3885af75c74SMaxim Mikityanskiy s->tx_mpwqe_blks += sq_stats->mpwqe_blks; 3895af75c74SMaxim Mikityanskiy s->tx_mpwqe_pkts += sq_stats->mpwqe_pkts; 39019386177SKamal Heib s->tx_queue_stopped += sq_stats->stopped; 39119386177SKamal Heib s->tx_queue_wake += sq_stats->wake; 39219386177SKamal Heib s->tx_queue_dropped += sq_stats->dropped; 39316cc14d8SEran Ben Elisha s->tx_cqe_err += sq_stats->cqe_err; 394db75373cSEran Ben Elisha s->tx_recover += sq_stats->recover; 39519386177SKamal Heib s->tx_xmit_more += sq_stats->xmit_more; 39619386177SKamal Heib s->tx_csum_partial_inner += sq_stats->csum_partial_inner; 39719386177SKamal Heib s->tx_csum_none += sq_stats->csum_none; 39819386177SKamal Heib s->tx_csum_partial += sq_stats->csum_partial; 399bf239741SIlya Lesokhin #ifdef CONFIG_MLX5_EN_TLS 400d2ead1f3STariq Toukan s->tx_tls_encrypted_packets += sq_stats->tls_encrypted_packets; 401d2ead1f3STariq Toukan s->tx_tls_encrypted_bytes += sq_stats->tls_encrypted_bytes; 402bf239741SIlya Lesokhin s->tx_tls_ooo += sq_stats->tls_ooo; 403d2ead1f3STariq Toukan s->tx_tls_dump_bytes += sq_stats->tls_dump_bytes; 404d2ead1f3STariq Toukan s->tx_tls_dump_packets += sq_stats->tls_dump_packets; 40546a3ea98STariq Toukan s->tx_tls_resync_bytes += sq_stats->tls_resync_bytes; 40646a3ea98STariq Toukan s->tx_tls_skip_no_sync_data += sq_stats->tls_skip_no_sync_data; 40746a3ea98STariq Toukan s->tx_tls_drop_no_sync_data += sq_stats->tls_drop_no_sync_data; 40846a3ea98STariq Toukan s->tx_tls_drop_bypass_req += sq_stats->tls_drop_bypass_req; 409bf239741SIlya Lesokhin #endif 41086155656STariq Toukan s->tx_cqes += sq_stats->cqes; 4111a7f5124SEran Ben Elisha } 4121a7f5124SEran Ben Elisha 413145e5637SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_ptp(struct mlx5e_priv *priv, 414145e5637SEran Ben Elisha struct mlx5e_sw_stats *s) 415145e5637SEran Ben Elisha { 416145e5637SEran Ben Elisha int i; 417145e5637SEran Ben Elisha 418a28359e9SAya Levin if (!priv->tx_ptp_opened && !priv->rx_ptp_opened) 419145e5637SEran Ben Elisha return; 420145e5637SEran Ben Elisha 421b0d35de4SAya Levin mlx5e_stats_grp_sw_update_stats_ch_stats(s, &priv->ptp_stats.ch); 422145e5637SEran Ben Elisha 423a28359e9SAya Levin if (priv->tx_ptp_opened) { 424145e5637SEran Ben Elisha for (i = 0; i < priv->max_opened_tc; i++) { 425b0d35de4SAya Levin mlx5e_stats_grp_sw_update_stats_sq(s, &priv->ptp_stats.sq[i]); 426145e5637SEran Ben Elisha 427145e5637SEran Ben Elisha /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */ 428145e5637SEran Ben Elisha barrier(); 429145e5637SEran Ben Elisha } 430145e5637SEran Ben Elisha } 431a28359e9SAya Levin if (priv->rx_ptp_opened) { 432a28359e9SAya Levin mlx5e_stats_grp_sw_update_stats_rq_stats(s, &priv->ptp_stats.rq); 433a28359e9SAya Levin 434a28359e9SAya Levin /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */ 435a28359e9SAya Levin barrier(); 436a28359e9SAya Levin } 437a28359e9SAya Levin } 438145e5637SEran Ben Elisha 439214baf22SMaxim Mikityanskiy static void mlx5e_stats_grp_sw_update_stats_qos(struct mlx5e_priv *priv, 440214baf22SMaxim Mikityanskiy struct mlx5e_sw_stats *s) 441214baf22SMaxim Mikityanskiy { 442214baf22SMaxim Mikityanskiy struct mlx5e_sq_stats **stats; 443214baf22SMaxim Mikityanskiy u16 max_qos_sqs; 444214baf22SMaxim Mikityanskiy int i; 445214baf22SMaxim Mikityanskiy 446214baf22SMaxim Mikityanskiy /* Pairs with smp_store_release in mlx5e_open_qos_sq. */ 447214baf22SMaxim Mikityanskiy max_qos_sqs = smp_load_acquire(&priv->htb.max_qos_sqs); 448214baf22SMaxim Mikityanskiy stats = READ_ONCE(priv->htb.qos_sq_stats); 449214baf22SMaxim Mikityanskiy 450214baf22SMaxim Mikityanskiy for (i = 0; i < max_qos_sqs; i++) { 451214baf22SMaxim Mikityanskiy mlx5e_stats_grp_sw_update_stats_sq(s, READ_ONCE(stats[i])); 452214baf22SMaxim Mikityanskiy 453214baf22SMaxim Mikityanskiy /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */ 454214baf22SMaxim Mikityanskiy barrier(); 455214baf22SMaxim Mikityanskiy } 456214baf22SMaxim Mikityanskiy } 457214baf22SMaxim Mikityanskiy 4581a7f5124SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(sw) 4591a7f5124SEran Ben Elisha { 4601a7f5124SEran Ben Elisha struct mlx5e_sw_stats *s = &priv->stats.sw; 4611a7f5124SEran Ben Elisha int i; 4621a7f5124SEran Ben Elisha 4631a7f5124SEran Ben Elisha memset(s, 0, sizeof(*s)); 4641a7f5124SEran Ben Elisha 4659d758d4aSTariq Toukan for (i = 0; i < priv->stats_nch; i++) { 4661a7f5124SEran Ben Elisha struct mlx5e_channel_stats *channel_stats = 467be98737aSTariq Toukan priv->channel_stats[i]; 4681a7f5124SEran Ben Elisha int j; 4691a7f5124SEran Ben Elisha 4701a7f5124SEran Ben Elisha mlx5e_stats_grp_sw_update_stats_rq_stats(s, &channel_stats->rq); 4711a7f5124SEran Ben Elisha mlx5e_stats_grp_sw_update_stats_xdpsq(s, &channel_stats->rq_xdpsq); 4721a7f5124SEran Ben Elisha mlx5e_stats_grp_sw_update_stats_ch_stats(s, &channel_stats->ch); 4731a7f5124SEran Ben Elisha /* xdp redirect */ 4741a7f5124SEran Ben Elisha mlx5e_stats_grp_sw_update_stats_xdp_red(s, &channel_stats->xdpsq); 4751a7f5124SEran Ben Elisha /* AF_XDP zero-copy */ 4761a7f5124SEran Ben Elisha mlx5e_stats_grp_sw_update_stats_xskrq(s, &channel_stats->xskrq); 4771a7f5124SEran Ben Elisha mlx5e_stats_grp_sw_update_stats_xsksq(s, &channel_stats->xsksq); 4781a7f5124SEran Ben Elisha 4791a7f5124SEran Ben Elisha for (j = 0; j < priv->max_opened_tc; j++) { 4801a7f5124SEran Ben Elisha mlx5e_stats_grp_sw_update_stats_sq(s, &channel_stats->sq[j]); 48142ae1a5cSArnd Bergmann 48242ae1a5cSArnd Bergmann /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */ 48342ae1a5cSArnd Bergmann barrier(); 48419386177SKamal Heib } 48519386177SKamal Heib } 486145e5637SEran Ben Elisha mlx5e_stats_grp_sw_update_stats_ptp(priv, s); 487214baf22SMaxim Mikityanskiy mlx5e_stats_grp_sw_update_stats_qos(priv, s); 48819386177SKamal Heib } 48919386177SKamal Heib 490fd8dcdb8SKamal Heib static const struct counter_desc q_stats_desc[] = { 491fd8dcdb8SKamal Heib { MLX5E_DECLARE_STAT(struct mlx5e_qcounter_stats, rx_out_of_buffer) }, 492fd8dcdb8SKamal Heib }; 493fd8dcdb8SKamal Heib 4947cbaf9a3SMoshe Shemesh static const struct counter_desc drop_rq_stats_desc[] = { 4957cbaf9a3SMoshe Shemesh { MLX5E_DECLARE_STAT(struct mlx5e_qcounter_stats, rx_if_down_packets) }, 4967cbaf9a3SMoshe Shemesh }; 4977cbaf9a3SMoshe Shemesh 498fd8dcdb8SKamal Heib #define NUM_Q_COUNTERS ARRAY_SIZE(q_stats_desc) 4997cbaf9a3SMoshe Shemesh #define NUM_DROP_RQ_COUNTERS ARRAY_SIZE(drop_rq_stats_desc) 500fd8dcdb8SKamal Heib 50196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(qcnt) 502fd8dcdb8SKamal Heib { 5037cbaf9a3SMoshe Shemesh int num_stats = 0; 5047cbaf9a3SMoshe Shemesh 5057cbaf9a3SMoshe Shemesh if (priv->q_counter) 5067cbaf9a3SMoshe Shemesh num_stats += NUM_Q_COUNTERS; 5077cbaf9a3SMoshe Shemesh 5087cbaf9a3SMoshe Shemesh if (priv->drop_rq_q_counter) 5097cbaf9a3SMoshe Shemesh num_stats += NUM_DROP_RQ_COUNTERS; 5107cbaf9a3SMoshe Shemesh 5117cbaf9a3SMoshe Shemesh return num_stats; 512fd8dcdb8SKamal Heib } 513fd8dcdb8SKamal Heib 51496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qcnt) 515fd8dcdb8SKamal Heib { 516fd8dcdb8SKamal Heib int i; 517fd8dcdb8SKamal Heib 518fd8dcdb8SKamal Heib for (i = 0; i < NUM_Q_COUNTERS && priv->q_counter; i++) 5197cbaf9a3SMoshe Shemesh strcpy(data + (idx++) * ETH_GSTRING_LEN, 5207cbaf9a3SMoshe Shemesh q_stats_desc[i].format); 5217cbaf9a3SMoshe Shemesh 5227cbaf9a3SMoshe Shemesh for (i = 0; i < NUM_DROP_RQ_COUNTERS && priv->drop_rq_q_counter; i++) 5237cbaf9a3SMoshe Shemesh strcpy(data + (idx++) * ETH_GSTRING_LEN, 5247cbaf9a3SMoshe Shemesh drop_rq_stats_desc[i].format); 5257cbaf9a3SMoshe Shemesh 526fd8dcdb8SKamal Heib return idx; 527fd8dcdb8SKamal Heib } 528fd8dcdb8SKamal Heib 52996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qcnt) 530fd8dcdb8SKamal Heib { 531fd8dcdb8SKamal Heib int i; 532fd8dcdb8SKamal Heib 533fd8dcdb8SKamal Heib for (i = 0; i < NUM_Q_COUNTERS && priv->q_counter; i++) 5347cbaf9a3SMoshe Shemesh data[idx++] = MLX5E_READ_CTR32_CPU(&priv->stats.qcnt, 5357cbaf9a3SMoshe Shemesh q_stats_desc, i); 5367cbaf9a3SMoshe Shemesh for (i = 0; i < NUM_DROP_RQ_COUNTERS && priv->drop_rq_q_counter; i++) 5377cbaf9a3SMoshe Shemesh data[idx++] = MLX5E_READ_CTR32_CPU(&priv->stats.qcnt, 5387cbaf9a3SMoshe Shemesh drop_rq_stats_desc, i); 539fd8dcdb8SKamal Heib return idx; 540fd8dcdb8SKamal Heib } 541fd8dcdb8SKamal Heib 54296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qcnt) 54319386177SKamal Heib { 54419386177SKamal Heib struct mlx5e_qcounter_stats *qcnt = &priv->stats.qcnt; 54566247fbbSLeon Romanovsky u32 out[MLX5_ST_SZ_DW(query_q_counter_out)] = {}; 54666247fbbSLeon Romanovsky u32 in[MLX5_ST_SZ_DW(query_q_counter_in)] = {}; 54766247fbbSLeon Romanovsky int ret; 54819386177SKamal Heib 54966247fbbSLeon Romanovsky MLX5_SET(query_q_counter_in, in, opcode, MLX5_CMD_OP_QUERY_Q_COUNTER); 55066247fbbSLeon Romanovsky 55166247fbbSLeon Romanovsky if (priv->q_counter) { 55266247fbbSLeon Romanovsky MLX5_SET(query_q_counter_in, in, counter_set_id, 55366247fbbSLeon Romanovsky priv->q_counter); 55466247fbbSLeon Romanovsky ret = mlx5_cmd_exec_inout(priv->mdev, query_q_counter, in, out); 55566247fbbSLeon Romanovsky if (!ret) 5567cbaf9a3SMoshe Shemesh qcnt->rx_out_of_buffer = MLX5_GET(query_q_counter_out, 5577cbaf9a3SMoshe Shemesh out, out_of_buffer); 55866247fbbSLeon Romanovsky } 55966247fbbSLeon Romanovsky 56066247fbbSLeon Romanovsky if (priv->drop_rq_q_counter) { 56166247fbbSLeon Romanovsky MLX5_SET(query_q_counter_in, in, counter_set_id, 56266247fbbSLeon Romanovsky priv->drop_rq_q_counter); 56366247fbbSLeon Romanovsky ret = mlx5_cmd_exec_inout(priv->mdev, query_q_counter, in, out); 56466247fbbSLeon Romanovsky if (!ret) 56566247fbbSLeon Romanovsky qcnt->rx_if_down_packets = MLX5_GET(query_q_counter_out, 56666247fbbSLeon Romanovsky out, out_of_buffer); 56766247fbbSLeon Romanovsky } 56819386177SKamal Heib } 56919386177SKamal Heib 5705c298143SMoshe Shemesh #define VNIC_ENV_OFF(c) MLX5_BYTE_OFF(query_vnic_env_out, c) 5710cfafd4bSMoshe Shemesh static const struct counter_desc vnic_env_stats_steer_desc[] = { 5725c298143SMoshe Shemesh { "rx_steer_missed_packets", 5735c298143SMoshe Shemesh VNIC_ENV_OFF(vport_env.nic_receive_steering_discard) }, 5745c298143SMoshe Shemesh }; 5755c298143SMoshe Shemesh 5760cfafd4bSMoshe Shemesh static const struct counter_desc vnic_env_stats_dev_oob_desc[] = { 5770cfafd4bSMoshe Shemesh { "dev_internal_queue_oob", 5780cfafd4bSMoshe Shemesh VNIC_ENV_OFF(vport_env.internal_rq_out_of_buffer) }, 5790cfafd4bSMoshe Shemesh }; 5800cfafd4bSMoshe Shemesh 5810cfafd4bSMoshe Shemesh #define NUM_VNIC_ENV_STEER_COUNTERS(dev) \ 5820cfafd4bSMoshe Shemesh (MLX5_CAP_GEN(dev, nic_receive_steering_discard) ? \ 5830cfafd4bSMoshe Shemesh ARRAY_SIZE(vnic_env_stats_steer_desc) : 0) 5840cfafd4bSMoshe Shemesh #define NUM_VNIC_ENV_DEV_OOB_COUNTERS(dev) \ 5850cfafd4bSMoshe Shemesh (MLX5_CAP_GEN(dev, vnic_env_int_rq_oob) ? \ 5860cfafd4bSMoshe Shemesh ARRAY_SIZE(vnic_env_stats_dev_oob_desc) : 0) 5875c298143SMoshe Shemesh 58896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(vnic_env) 5895c298143SMoshe Shemesh { 5900cfafd4bSMoshe Shemesh return NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev) + 5910cfafd4bSMoshe Shemesh NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev); 5925c298143SMoshe Shemesh } 5935c298143SMoshe Shemesh 59496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vnic_env) 5955c298143SMoshe Shemesh { 5965c298143SMoshe Shemesh int i; 5975c298143SMoshe Shemesh 5980cfafd4bSMoshe Shemesh for (i = 0; i < NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev); i++) 5995c298143SMoshe Shemesh strcpy(data + (idx++) * ETH_GSTRING_LEN, 6000cfafd4bSMoshe Shemesh vnic_env_stats_steer_desc[i].format); 6010cfafd4bSMoshe Shemesh 6020cfafd4bSMoshe Shemesh for (i = 0; i < NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev); i++) 6030cfafd4bSMoshe Shemesh strcpy(data + (idx++) * ETH_GSTRING_LEN, 6040cfafd4bSMoshe Shemesh vnic_env_stats_dev_oob_desc[i].format); 6055c298143SMoshe Shemesh return idx; 6065c298143SMoshe Shemesh } 6075c298143SMoshe Shemesh 60896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vnic_env) 6095c298143SMoshe Shemesh { 6105c298143SMoshe Shemesh int i; 6115c298143SMoshe Shemesh 6120cfafd4bSMoshe Shemesh for (i = 0; i < NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev); i++) 6135c298143SMoshe Shemesh data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vnic.query_vnic_env_out, 6140cfafd4bSMoshe Shemesh vnic_env_stats_steer_desc, i); 6150cfafd4bSMoshe Shemesh 6160cfafd4bSMoshe Shemesh for (i = 0; i < NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev); i++) 6170cfafd4bSMoshe Shemesh data[idx++] = MLX5E_READ_CTR32_BE(priv->stats.vnic.query_vnic_env_out, 6180cfafd4bSMoshe Shemesh vnic_env_stats_dev_oob_desc, i); 6195c298143SMoshe Shemesh return idx; 6205c298143SMoshe Shemesh } 6215c298143SMoshe Shemesh 62296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vnic_env) 6235c298143SMoshe Shemesh { 6245c298143SMoshe Shemesh u32 *out = (u32 *)priv->stats.vnic.query_vnic_env_out; 625a184cda1SLeon Romanovsky u32 in[MLX5_ST_SZ_DW(query_vnic_env_in)] = {}; 6265c298143SMoshe Shemesh struct mlx5_core_dev *mdev = priv->mdev; 6275c298143SMoshe Shemesh 6285c298143SMoshe Shemesh if (!MLX5_CAP_GEN(priv->mdev, nic_receive_steering_discard)) 6295c298143SMoshe Shemesh return; 6305c298143SMoshe Shemesh 631a184cda1SLeon Romanovsky MLX5_SET(query_vnic_env_in, in, opcode, MLX5_CMD_OP_QUERY_VNIC_ENV); 632a184cda1SLeon Romanovsky mlx5_cmd_exec_inout(mdev, query_vnic_env, in, out); 6335c298143SMoshe Shemesh } 6345c298143SMoshe Shemesh 63540cab9f1SKamal Heib #define VPORT_COUNTER_OFF(c) MLX5_BYTE_OFF(query_vport_counter_out, c) 63640cab9f1SKamal Heib static const struct counter_desc vport_stats_desc[] = { 63740cab9f1SKamal Heib { "rx_vport_unicast_packets", 63840cab9f1SKamal Heib VPORT_COUNTER_OFF(received_eth_unicast.packets) }, 63940cab9f1SKamal Heib { "rx_vport_unicast_bytes", 64040cab9f1SKamal Heib VPORT_COUNTER_OFF(received_eth_unicast.octets) }, 64140cab9f1SKamal Heib { "tx_vport_unicast_packets", 64240cab9f1SKamal Heib VPORT_COUNTER_OFF(transmitted_eth_unicast.packets) }, 64340cab9f1SKamal Heib { "tx_vport_unicast_bytes", 64440cab9f1SKamal Heib VPORT_COUNTER_OFF(transmitted_eth_unicast.octets) }, 64540cab9f1SKamal Heib { "rx_vport_multicast_packets", 64640cab9f1SKamal Heib VPORT_COUNTER_OFF(received_eth_multicast.packets) }, 64740cab9f1SKamal Heib { "rx_vport_multicast_bytes", 64840cab9f1SKamal Heib VPORT_COUNTER_OFF(received_eth_multicast.octets) }, 64940cab9f1SKamal Heib { "tx_vport_multicast_packets", 65040cab9f1SKamal Heib VPORT_COUNTER_OFF(transmitted_eth_multicast.packets) }, 65140cab9f1SKamal Heib { "tx_vport_multicast_bytes", 65240cab9f1SKamal Heib VPORT_COUNTER_OFF(transmitted_eth_multicast.octets) }, 65340cab9f1SKamal Heib { "rx_vport_broadcast_packets", 65440cab9f1SKamal Heib VPORT_COUNTER_OFF(received_eth_broadcast.packets) }, 65540cab9f1SKamal Heib { "rx_vport_broadcast_bytes", 65640cab9f1SKamal Heib VPORT_COUNTER_OFF(received_eth_broadcast.octets) }, 65740cab9f1SKamal Heib { "tx_vport_broadcast_packets", 65840cab9f1SKamal Heib VPORT_COUNTER_OFF(transmitted_eth_broadcast.packets) }, 65940cab9f1SKamal Heib { "tx_vport_broadcast_bytes", 66040cab9f1SKamal Heib VPORT_COUNTER_OFF(transmitted_eth_broadcast.octets) }, 66140cab9f1SKamal Heib { "rx_vport_rdma_unicast_packets", 66240cab9f1SKamal Heib VPORT_COUNTER_OFF(received_ib_unicast.packets) }, 66340cab9f1SKamal Heib { "rx_vport_rdma_unicast_bytes", 66440cab9f1SKamal Heib VPORT_COUNTER_OFF(received_ib_unicast.octets) }, 66540cab9f1SKamal Heib { "tx_vport_rdma_unicast_packets", 66640cab9f1SKamal Heib VPORT_COUNTER_OFF(transmitted_ib_unicast.packets) }, 66740cab9f1SKamal Heib { "tx_vport_rdma_unicast_bytes", 66840cab9f1SKamal Heib VPORT_COUNTER_OFF(transmitted_ib_unicast.octets) }, 66940cab9f1SKamal Heib { "rx_vport_rdma_multicast_packets", 67040cab9f1SKamal Heib VPORT_COUNTER_OFF(received_ib_multicast.packets) }, 67140cab9f1SKamal Heib { "rx_vport_rdma_multicast_bytes", 67240cab9f1SKamal Heib VPORT_COUNTER_OFF(received_ib_multicast.octets) }, 67340cab9f1SKamal Heib { "tx_vport_rdma_multicast_packets", 67440cab9f1SKamal Heib VPORT_COUNTER_OFF(transmitted_ib_multicast.packets) }, 67540cab9f1SKamal Heib { "tx_vport_rdma_multicast_bytes", 67640cab9f1SKamal Heib VPORT_COUNTER_OFF(transmitted_ib_multicast.octets) }, 67740cab9f1SKamal Heib }; 67840cab9f1SKamal Heib 67940cab9f1SKamal Heib #define NUM_VPORT_COUNTERS ARRAY_SIZE(vport_stats_desc) 68040cab9f1SKamal Heib 68196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(vport) 68240cab9f1SKamal Heib { 68340cab9f1SKamal Heib return NUM_VPORT_COUNTERS; 68440cab9f1SKamal Heib } 68540cab9f1SKamal Heib 68696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vport) 68740cab9f1SKamal Heib { 68840cab9f1SKamal Heib int i; 68940cab9f1SKamal Heib 69040cab9f1SKamal Heib for (i = 0; i < NUM_VPORT_COUNTERS; i++) 69140cab9f1SKamal Heib strcpy(data + (idx++) * ETH_GSTRING_LEN, vport_stats_desc[i].format); 69240cab9f1SKamal Heib return idx; 69340cab9f1SKamal Heib } 69440cab9f1SKamal Heib 69596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vport) 69640cab9f1SKamal Heib { 69740cab9f1SKamal Heib int i; 69840cab9f1SKamal Heib 69940cab9f1SKamal Heib for (i = 0; i < NUM_VPORT_COUNTERS; i++) 70040cab9f1SKamal Heib data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vport.query_vport_out, 70140cab9f1SKamal Heib vport_stats_desc, i); 70240cab9f1SKamal Heib return idx; 70340cab9f1SKamal Heib } 70440cab9f1SKamal Heib 70596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vport) 70619386177SKamal Heib { 70719386177SKamal Heib u32 *out = (u32 *)priv->stats.vport.query_vport_out; 708a184cda1SLeon Romanovsky u32 in[MLX5_ST_SZ_DW(query_vport_counter_in)] = {}; 70919386177SKamal Heib struct mlx5_core_dev *mdev = priv->mdev; 71019386177SKamal Heib 71119386177SKamal Heib MLX5_SET(query_vport_counter_in, in, opcode, MLX5_CMD_OP_QUERY_VPORT_COUNTER); 712a184cda1SLeon Romanovsky mlx5_cmd_exec_inout(mdev, query_vport_counter, in, out); 71319386177SKamal Heib } 71419386177SKamal Heib 7156e6ef814SKamal Heib #define PPORT_802_3_OFF(c) \ 7166e6ef814SKamal Heib MLX5_BYTE_OFF(ppcnt_reg, \ 7176e6ef814SKamal Heib counter_set.eth_802_3_cntrs_grp_data_layout.c##_high) 7186e6ef814SKamal Heib static const struct counter_desc pport_802_3_stats_desc[] = { 7196e6ef814SKamal Heib { "tx_packets_phy", PPORT_802_3_OFF(a_frames_transmitted_ok) }, 7206e6ef814SKamal Heib { "rx_packets_phy", PPORT_802_3_OFF(a_frames_received_ok) }, 7216e6ef814SKamal Heib { "rx_crc_errors_phy", PPORT_802_3_OFF(a_frame_check_sequence_errors) }, 7226e6ef814SKamal Heib { "tx_bytes_phy", PPORT_802_3_OFF(a_octets_transmitted_ok) }, 7236e6ef814SKamal Heib { "rx_bytes_phy", PPORT_802_3_OFF(a_octets_received_ok) }, 7246e6ef814SKamal Heib { "tx_multicast_phy", PPORT_802_3_OFF(a_multicast_frames_xmitted_ok) }, 7256e6ef814SKamal Heib { "tx_broadcast_phy", PPORT_802_3_OFF(a_broadcast_frames_xmitted_ok) }, 7266e6ef814SKamal Heib { "rx_multicast_phy", PPORT_802_3_OFF(a_multicast_frames_received_ok) }, 7276e6ef814SKamal Heib { "rx_broadcast_phy", PPORT_802_3_OFF(a_broadcast_frames_received_ok) }, 7286e6ef814SKamal Heib { "rx_in_range_len_errors_phy", PPORT_802_3_OFF(a_in_range_length_errors) }, 7296e6ef814SKamal Heib { "rx_out_of_range_len_phy", PPORT_802_3_OFF(a_out_of_range_length_field) }, 7306e6ef814SKamal Heib { "rx_oversize_pkts_phy", PPORT_802_3_OFF(a_frame_too_long_errors) }, 7316e6ef814SKamal Heib { "rx_symbol_err_phy", PPORT_802_3_OFF(a_symbol_error_during_carrier) }, 7326e6ef814SKamal Heib { "tx_mac_control_phy", PPORT_802_3_OFF(a_mac_control_frames_transmitted) }, 7336e6ef814SKamal Heib { "rx_mac_control_phy", PPORT_802_3_OFF(a_mac_control_frames_received) }, 7346e6ef814SKamal Heib { "rx_unsupported_op_phy", PPORT_802_3_OFF(a_unsupported_opcodes_received) }, 7356e6ef814SKamal Heib { "rx_pause_ctrl_phy", PPORT_802_3_OFF(a_pause_mac_ctrl_frames_received) }, 7366e6ef814SKamal Heib { "tx_pause_ctrl_phy", PPORT_802_3_OFF(a_pause_mac_ctrl_frames_transmitted) }, 7376e6ef814SKamal Heib }; 7386e6ef814SKamal Heib 7396e6ef814SKamal Heib #define NUM_PPORT_802_3_COUNTERS ARRAY_SIZE(pport_802_3_stats_desc) 7406e6ef814SKamal Heib 74196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(802_3) 7426e6ef814SKamal Heib { 7436e6ef814SKamal Heib return NUM_PPORT_802_3_COUNTERS; 7446e6ef814SKamal Heib } 7456e6ef814SKamal Heib 74696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(802_3) 7476e6ef814SKamal Heib { 7486e6ef814SKamal Heib int i; 7496e6ef814SKamal Heib 7506e6ef814SKamal Heib for (i = 0; i < NUM_PPORT_802_3_COUNTERS; i++) 7516e6ef814SKamal Heib strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_802_3_stats_desc[i].format); 7526e6ef814SKamal Heib return idx; 7536e6ef814SKamal Heib } 7546e6ef814SKamal Heib 75596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(802_3) 7566e6ef814SKamal Heib { 7576e6ef814SKamal Heib int i; 7586e6ef814SKamal Heib 7596e6ef814SKamal Heib for (i = 0; i < NUM_PPORT_802_3_COUNTERS; i++) 7606e6ef814SKamal Heib data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.IEEE_802_3_counters, 7616e6ef814SKamal Heib pport_802_3_stats_desc, i); 7626e6ef814SKamal Heib return idx; 7636e6ef814SKamal Heib } 7646e6ef814SKamal Heib 76575370eb0SEyal Davidovich #define MLX5_BASIC_PPCNT_SUPPORTED(mdev) \ 76675370eb0SEyal Davidovich (MLX5_CAP_GEN(mdev, pcam_reg) ? MLX5_CAP_PCAM_REG(mdev, ppcnt) : 1) 76775370eb0SEyal Davidovich 7687c453526SVlad Buslov static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(802_3) 76919386177SKamal Heib { 77019386177SKamal Heib struct mlx5e_pport_stats *pstats = &priv->stats.pport; 77119386177SKamal Heib struct mlx5_core_dev *mdev = priv->mdev; 77219386177SKamal Heib u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0}; 77319386177SKamal Heib int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); 77419386177SKamal Heib void *out; 77519386177SKamal Heib 77675370eb0SEyal Davidovich if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev)) 77775370eb0SEyal Davidovich return; 77875370eb0SEyal Davidovich 77919386177SKamal Heib MLX5_SET(ppcnt_reg, in, local_port, 1); 78019386177SKamal Heib out = pstats->IEEE_802_3_counters; 78119386177SKamal Heib MLX5_SET(ppcnt_reg, in, grp, MLX5_IEEE_802_3_COUNTERS_GROUP); 78219386177SKamal Heib mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0); 78319386177SKamal Heib } 78419386177SKamal Heib 7851703bb50SJakub Kicinski #define MLX5E_READ_CTR64_BE_F(ptr, set, c) \ 786098d9ed9SJakub Kicinski be64_to_cpu(*(__be64 *)((char *)ptr + \ 787098d9ed9SJakub Kicinski MLX5_BYTE_OFF(ppcnt_reg, \ 7881703bb50SJakub Kicinski counter_set.set.c##_high))) 789098d9ed9SJakub Kicinski 790b572ec9fSJakub Kicinski static int mlx5e_stats_get_ieee(struct mlx5_core_dev *mdev, 791b572ec9fSJakub Kicinski u32 *ppcnt_ieee_802_3) 792b572ec9fSJakub Kicinski { 793b572ec9fSJakub Kicinski u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {}; 794b572ec9fSJakub Kicinski int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); 795b572ec9fSJakub Kicinski 796b572ec9fSJakub Kicinski if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev)) 797b572ec9fSJakub Kicinski return -EOPNOTSUPP; 798b572ec9fSJakub Kicinski 799b572ec9fSJakub Kicinski MLX5_SET(ppcnt_reg, in, local_port, 1); 800b572ec9fSJakub Kicinski MLX5_SET(ppcnt_reg, in, grp, MLX5_IEEE_802_3_COUNTERS_GROUP); 801b572ec9fSJakub Kicinski return mlx5_core_access_reg(mdev, in, sz, ppcnt_ieee_802_3, 802b572ec9fSJakub Kicinski sz, MLX5_REG_PPCNT, 0, 0); 803b572ec9fSJakub Kicinski } 804b572ec9fSJakub Kicinski 805098d9ed9SJakub Kicinski void mlx5e_stats_pause_get(struct mlx5e_priv *priv, 806098d9ed9SJakub Kicinski struct ethtool_pause_stats *pause_stats) 807098d9ed9SJakub Kicinski { 808098d9ed9SJakub Kicinski u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)]; 809098d9ed9SJakub Kicinski struct mlx5_core_dev *mdev = priv->mdev; 810098d9ed9SJakub Kicinski 811b572ec9fSJakub Kicinski if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3)) 812098d9ed9SJakub Kicinski return; 813098d9ed9SJakub Kicinski 814098d9ed9SJakub Kicinski pause_stats->tx_pause_frames = 815098d9ed9SJakub Kicinski MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3, 8161703bb50SJakub Kicinski eth_802_3_cntrs_grp_data_layout, 817098d9ed9SJakub Kicinski a_pause_mac_ctrl_frames_transmitted); 818098d9ed9SJakub Kicinski pause_stats->rx_pause_frames = 819098d9ed9SJakub Kicinski MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3, 8201703bb50SJakub Kicinski eth_802_3_cntrs_grp_data_layout, 821098d9ed9SJakub Kicinski a_pause_mac_ctrl_frames_received); 822098d9ed9SJakub Kicinski } 823098d9ed9SJakub Kicinski 824b572ec9fSJakub Kicinski void mlx5e_stats_eth_phy_get(struct mlx5e_priv *priv, 825b572ec9fSJakub Kicinski struct ethtool_eth_phy_stats *phy_stats) 826b572ec9fSJakub Kicinski { 827b572ec9fSJakub Kicinski u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)]; 828b572ec9fSJakub Kicinski struct mlx5_core_dev *mdev = priv->mdev; 829b572ec9fSJakub Kicinski 830b572ec9fSJakub Kicinski if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3)) 831b572ec9fSJakub Kicinski return; 832b572ec9fSJakub Kicinski 833b572ec9fSJakub Kicinski phy_stats->SymbolErrorDuringCarrier = 834b572ec9fSJakub Kicinski MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3, 835b572ec9fSJakub Kicinski eth_802_3_cntrs_grp_data_layout, 836b572ec9fSJakub Kicinski a_symbol_error_during_carrier); 837b572ec9fSJakub Kicinski } 838b572ec9fSJakub Kicinski 839b572ec9fSJakub Kicinski void mlx5e_stats_eth_mac_get(struct mlx5e_priv *priv, 840b572ec9fSJakub Kicinski struct ethtool_eth_mac_stats *mac_stats) 841b572ec9fSJakub Kicinski { 842b572ec9fSJakub Kicinski u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)]; 843b572ec9fSJakub Kicinski struct mlx5_core_dev *mdev = priv->mdev; 844b572ec9fSJakub Kicinski 845b572ec9fSJakub Kicinski if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3)) 846b572ec9fSJakub Kicinski return; 847b572ec9fSJakub Kicinski 848b572ec9fSJakub Kicinski #define RD(name) \ 849b572ec9fSJakub Kicinski MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3, \ 850b572ec9fSJakub Kicinski eth_802_3_cntrs_grp_data_layout, \ 851b572ec9fSJakub Kicinski name) 852b572ec9fSJakub Kicinski 853b572ec9fSJakub Kicinski mac_stats->FramesTransmittedOK = RD(a_frames_transmitted_ok); 854b572ec9fSJakub Kicinski mac_stats->FramesReceivedOK = RD(a_frames_received_ok); 855b572ec9fSJakub Kicinski mac_stats->FrameCheckSequenceErrors = RD(a_frame_check_sequence_errors); 856b572ec9fSJakub Kicinski mac_stats->OctetsTransmittedOK = RD(a_octets_transmitted_ok); 857b572ec9fSJakub Kicinski mac_stats->OctetsReceivedOK = RD(a_octets_received_ok); 858b572ec9fSJakub Kicinski mac_stats->MulticastFramesXmittedOK = RD(a_multicast_frames_xmitted_ok); 859b572ec9fSJakub Kicinski mac_stats->BroadcastFramesXmittedOK = RD(a_broadcast_frames_xmitted_ok); 860b572ec9fSJakub Kicinski mac_stats->MulticastFramesReceivedOK = RD(a_multicast_frames_received_ok); 861b572ec9fSJakub Kicinski mac_stats->BroadcastFramesReceivedOK = RD(a_broadcast_frames_received_ok); 862b572ec9fSJakub Kicinski mac_stats->InRangeLengthErrors = RD(a_in_range_length_errors); 863b572ec9fSJakub Kicinski mac_stats->OutOfRangeLengthField = RD(a_out_of_range_length_field); 864b572ec9fSJakub Kicinski mac_stats->FrameTooLongErrors = RD(a_frame_too_long_errors); 865b572ec9fSJakub Kicinski #undef RD 866b572ec9fSJakub Kicinski } 867b572ec9fSJakub Kicinski 868b572ec9fSJakub Kicinski void mlx5e_stats_eth_ctrl_get(struct mlx5e_priv *priv, 869b572ec9fSJakub Kicinski struct ethtool_eth_ctrl_stats *ctrl_stats) 870b572ec9fSJakub Kicinski { 871b572ec9fSJakub Kicinski u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)]; 872b572ec9fSJakub Kicinski struct mlx5_core_dev *mdev = priv->mdev; 873b572ec9fSJakub Kicinski 874b572ec9fSJakub Kicinski if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3)) 875b572ec9fSJakub Kicinski return; 876b572ec9fSJakub Kicinski 877b572ec9fSJakub Kicinski ctrl_stats->MACControlFramesTransmitted = 878b572ec9fSJakub Kicinski MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3, 879b572ec9fSJakub Kicinski eth_802_3_cntrs_grp_data_layout, 880b572ec9fSJakub Kicinski a_mac_control_frames_transmitted); 881b572ec9fSJakub Kicinski ctrl_stats->MACControlFramesReceived = 882b572ec9fSJakub Kicinski MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3, 883b572ec9fSJakub Kicinski eth_802_3_cntrs_grp_data_layout, 884b572ec9fSJakub Kicinski a_mac_control_frames_received); 885b572ec9fSJakub Kicinski ctrl_stats->UnsupportedOpcodesReceived = 886b572ec9fSJakub Kicinski MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3, 887b572ec9fSJakub Kicinski eth_802_3_cntrs_grp_data_layout, 888b572ec9fSJakub Kicinski a_unsupported_opcodes_received); 889b572ec9fSJakub Kicinski } 890b572ec9fSJakub Kicinski 891fc8e64a3SKamal Heib #define PPORT_2863_OFF(c) \ 892fc8e64a3SKamal Heib MLX5_BYTE_OFF(ppcnt_reg, \ 893fc8e64a3SKamal Heib counter_set.eth_2863_cntrs_grp_data_layout.c##_high) 894fc8e64a3SKamal Heib static const struct counter_desc pport_2863_stats_desc[] = { 895fc8e64a3SKamal Heib { "rx_discards_phy", PPORT_2863_OFF(if_in_discards) }, 896fc8e64a3SKamal Heib { "tx_discards_phy", PPORT_2863_OFF(if_out_discards) }, 897fc8e64a3SKamal Heib { "tx_errors_phy", PPORT_2863_OFF(if_out_errors) }, 898fc8e64a3SKamal Heib }; 899fc8e64a3SKamal Heib 900fc8e64a3SKamal Heib #define NUM_PPORT_2863_COUNTERS ARRAY_SIZE(pport_2863_stats_desc) 901fc8e64a3SKamal Heib 90296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(2863) 903fc8e64a3SKamal Heib { 904fc8e64a3SKamal Heib return NUM_PPORT_2863_COUNTERS; 905fc8e64a3SKamal Heib } 906fc8e64a3SKamal Heib 90796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(2863) 908fc8e64a3SKamal Heib { 909fc8e64a3SKamal Heib int i; 910fc8e64a3SKamal Heib 911fc8e64a3SKamal Heib for (i = 0; i < NUM_PPORT_2863_COUNTERS; i++) 912fc8e64a3SKamal Heib strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_2863_stats_desc[i].format); 913fc8e64a3SKamal Heib return idx; 914fc8e64a3SKamal Heib } 915fc8e64a3SKamal Heib 91696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(2863) 917fc8e64a3SKamal Heib { 918fc8e64a3SKamal Heib int i; 919fc8e64a3SKamal Heib 920fc8e64a3SKamal Heib for (i = 0; i < NUM_PPORT_2863_COUNTERS; i++) 921fc8e64a3SKamal Heib data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.RFC_2863_counters, 922fc8e64a3SKamal Heib pport_2863_stats_desc, i); 923fc8e64a3SKamal Heib return idx; 924fc8e64a3SKamal Heib } 925fc8e64a3SKamal Heib 92696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(2863) 92719386177SKamal Heib { 92819386177SKamal Heib struct mlx5e_pport_stats *pstats = &priv->stats.pport; 92919386177SKamal Heib struct mlx5_core_dev *mdev = priv->mdev; 93019386177SKamal Heib u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0}; 93119386177SKamal Heib int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); 93219386177SKamal Heib void *out; 93319386177SKamal Heib 93419386177SKamal Heib MLX5_SET(ppcnt_reg, in, local_port, 1); 93519386177SKamal Heib out = pstats->RFC_2863_counters; 93619386177SKamal Heib MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2863_COUNTERS_GROUP); 93719386177SKamal Heib mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0); 93819386177SKamal Heib } 93919386177SKamal Heib 940e0e0def9SKamal Heib #define PPORT_2819_OFF(c) \ 941e0e0def9SKamal Heib MLX5_BYTE_OFF(ppcnt_reg, \ 942e0e0def9SKamal Heib counter_set.eth_2819_cntrs_grp_data_layout.c##_high) 943e0e0def9SKamal Heib static const struct counter_desc pport_2819_stats_desc[] = { 944e0e0def9SKamal Heib { "rx_undersize_pkts_phy", PPORT_2819_OFF(ether_stats_undersize_pkts) }, 945e0e0def9SKamal Heib { "rx_fragments_phy", PPORT_2819_OFF(ether_stats_fragments) }, 946e0e0def9SKamal Heib { "rx_jabbers_phy", PPORT_2819_OFF(ether_stats_jabbers) }, 947e0e0def9SKamal Heib { "rx_64_bytes_phy", PPORT_2819_OFF(ether_stats_pkts64octets) }, 948e0e0def9SKamal Heib { "rx_65_to_127_bytes_phy", PPORT_2819_OFF(ether_stats_pkts65to127octets) }, 949e0e0def9SKamal Heib { "rx_128_to_255_bytes_phy", PPORT_2819_OFF(ether_stats_pkts128to255octets) }, 950e0e0def9SKamal Heib { "rx_256_to_511_bytes_phy", PPORT_2819_OFF(ether_stats_pkts256to511octets) }, 951e0e0def9SKamal Heib { "rx_512_to_1023_bytes_phy", PPORT_2819_OFF(ether_stats_pkts512to1023octets) }, 952e0e0def9SKamal Heib { "rx_1024_to_1518_bytes_phy", PPORT_2819_OFF(ether_stats_pkts1024to1518octets) }, 953e0e0def9SKamal Heib { "rx_1519_to_2047_bytes_phy", PPORT_2819_OFF(ether_stats_pkts1519to2047octets) }, 954e0e0def9SKamal Heib { "rx_2048_to_4095_bytes_phy", PPORT_2819_OFF(ether_stats_pkts2048to4095octets) }, 955e0e0def9SKamal Heib { "rx_4096_to_8191_bytes_phy", PPORT_2819_OFF(ether_stats_pkts4096to8191octets) }, 956e0e0def9SKamal Heib { "rx_8192_to_10239_bytes_phy", PPORT_2819_OFF(ether_stats_pkts8192to10239octets) }, 957e0e0def9SKamal Heib }; 958e0e0def9SKamal Heib 959e0e0def9SKamal Heib #define NUM_PPORT_2819_COUNTERS ARRAY_SIZE(pport_2819_stats_desc) 960e0e0def9SKamal Heib 96196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(2819) 962e0e0def9SKamal Heib { 963e0e0def9SKamal Heib return NUM_PPORT_2819_COUNTERS; 964e0e0def9SKamal Heib } 965e0e0def9SKamal Heib 96696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(2819) 967e0e0def9SKamal Heib { 968e0e0def9SKamal Heib int i; 969e0e0def9SKamal Heib 970e0e0def9SKamal Heib for (i = 0; i < NUM_PPORT_2819_COUNTERS; i++) 971e0e0def9SKamal Heib strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_2819_stats_desc[i].format); 972e0e0def9SKamal Heib return idx; 973e0e0def9SKamal Heib } 974e0e0def9SKamal Heib 97596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(2819) 976e0e0def9SKamal Heib { 977e0e0def9SKamal Heib int i; 978e0e0def9SKamal Heib 979e0e0def9SKamal Heib for (i = 0; i < NUM_PPORT_2819_COUNTERS; i++) 980e0e0def9SKamal Heib data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.RFC_2819_counters, 981e0e0def9SKamal Heib pport_2819_stats_desc, i); 982e0e0def9SKamal Heib return idx; 983e0e0def9SKamal Heib } 984e0e0def9SKamal Heib 98596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(2819) 98619386177SKamal Heib { 98719386177SKamal Heib struct mlx5e_pport_stats *pstats = &priv->stats.pport; 98819386177SKamal Heib struct mlx5_core_dev *mdev = priv->mdev; 98919386177SKamal Heib u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0}; 99019386177SKamal Heib int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); 99119386177SKamal Heib void *out; 99219386177SKamal Heib 99375370eb0SEyal Davidovich if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev)) 99475370eb0SEyal Davidovich return; 99575370eb0SEyal Davidovich 99619386177SKamal Heib MLX5_SET(ppcnt_reg, in, local_port, 1); 99719386177SKamal Heib out = pstats->RFC_2819_counters; 99819386177SKamal Heib MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2819_COUNTERS_GROUP); 99919386177SKamal Heib mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0); 100019386177SKamal Heib } 100119386177SKamal Heib 1002b572ec9fSJakub Kicinski static const struct ethtool_rmon_hist_range mlx5e_rmon_ranges[] = { 1003b572ec9fSJakub Kicinski { 0, 64 }, 1004b572ec9fSJakub Kicinski { 65, 127 }, 1005b572ec9fSJakub Kicinski { 128, 255 }, 1006b572ec9fSJakub Kicinski { 256, 511 }, 1007b572ec9fSJakub Kicinski { 512, 1023 }, 1008b572ec9fSJakub Kicinski { 1024, 1518 }, 1009b572ec9fSJakub Kicinski { 1519, 2047 }, 1010b572ec9fSJakub Kicinski { 2048, 4095 }, 1011b572ec9fSJakub Kicinski { 4096, 8191 }, 1012b572ec9fSJakub Kicinski { 8192, 10239 }, 1013b572ec9fSJakub Kicinski {} 1014b572ec9fSJakub Kicinski }; 1015b572ec9fSJakub Kicinski 1016b572ec9fSJakub Kicinski void mlx5e_stats_rmon_get(struct mlx5e_priv *priv, 1017b572ec9fSJakub Kicinski struct ethtool_rmon_stats *rmon, 1018b572ec9fSJakub Kicinski const struct ethtool_rmon_hist_range **ranges) 1019b572ec9fSJakub Kicinski { 1020b572ec9fSJakub Kicinski u32 ppcnt_RFC_2819_counters[MLX5_ST_SZ_DW(ppcnt_reg)]; 1021b572ec9fSJakub Kicinski struct mlx5_core_dev *mdev = priv->mdev; 1022b572ec9fSJakub Kicinski u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0}; 1023b572ec9fSJakub Kicinski int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); 1024b572ec9fSJakub Kicinski 1025b572ec9fSJakub Kicinski MLX5_SET(ppcnt_reg, in, local_port, 1); 1026b572ec9fSJakub Kicinski MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2819_COUNTERS_GROUP); 1027b572ec9fSJakub Kicinski if (mlx5_core_access_reg(mdev, in, sz, ppcnt_RFC_2819_counters, 1028b572ec9fSJakub Kicinski sz, MLX5_REG_PPCNT, 0, 0)) 1029b572ec9fSJakub Kicinski return; 1030b572ec9fSJakub Kicinski 1031b572ec9fSJakub Kicinski #define RD(name) \ 1032b572ec9fSJakub Kicinski MLX5E_READ_CTR64_BE_F(ppcnt_RFC_2819_counters, \ 1033b572ec9fSJakub Kicinski eth_2819_cntrs_grp_data_layout, \ 1034b572ec9fSJakub Kicinski name) 1035b572ec9fSJakub Kicinski 1036b572ec9fSJakub Kicinski rmon->undersize_pkts = RD(ether_stats_undersize_pkts); 1037b572ec9fSJakub Kicinski rmon->fragments = RD(ether_stats_fragments); 1038b572ec9fSJakub Kicinski rmon->jabbers = RD(ether_stats_jabbers); 1039b572ec9fSJakub Kicinski 1040b572ec9fSJakub Kicinski rmon->hist[0] = RD(ether_stats_pkts64octets); 1041b572ec9fSJakub Kicinski rmon->hist[1] = RD(ether_stats_pkts65to127octets); 1042b572ec9fSJakub Kicinski rmon->hist[2] = RD(ether_stats_pkts128to255octets); 1043b572ec9fSJakub Kicinski rmon->hist[3] = RD(ether_stats_pkts256to511octets); 1044b572ec9fSJakub Kicinski rmon->hist[4] = RD(ether_stats_pkts512to1023octets); 1045b572ec9fSJakub Kicinski rmon->hist[5] = RD(ether_stats_pkts1024to1518octets); 1046b572ec9fSJakub Kicinski rmon->hist[6] = RD(ether_stats_pkts1519to2047octets); 1047b572ec9fSJakub Kicinski rmon->hist[7] = RD(ether_stats_pkts2048to4095octets); 1048b572ec9fSJakub Kicinski rmon->hist[8] = RD(ether_stats_pkts4096to8191octets); 1049b572ec9fSJakub Kicinski rmon->hist[9] = RD(ether_stats_pkts8192to10239octets); 1050b572ec9fSJakub Kicinski #undef RD 1051b572ec9fSJakub Kicinski 1052b572ec9fSJakub Kicinski *ranges = mlx5e_rmon_ranges; 1053b572ec9fSJakub Kicinski } 1054b572ec9fSJakub Kicinski 10552e4df0b2SKamal Heib #define PPORT_PHY_STATISTICAL_OFF(c) \ 10562e4df0b2SKamal Heib MLX5_BYTE_OFF(ppcnt_reg, \ 10572e4df0b2SKamal Heib counter_set.phys_layer_statistical_cntrs.c##_high) 10582e4df0b2SKamal Heib static const struct counter_desc pport_phy_statistical_stats_desc[] = { 10592e4df0b2SKamal Heib { "rx_pcs_symbol_err_phy", PPORT_PHY_STATISTICAL_OFF(phy_symbol_errors) }, 10602e4df0b2SKamal Heib { "rx_corrected_bits_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits) }, 10612e4df0b2SKamal Heib }; 10622e4df0b2SKamal Heib 10634cb4e98eSShay Agroskin static const struct counter_desc 10644cb4e98eSShay Agroskin pport_phy_statistical_err_lanes_stats_desc[] = { 10654cb4e98eSShay Agroskin { "rx_err_lane_0_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane0) }, 10664cb4e98eSShay Agroskin { "rx_err_lane_1_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane1) }, 10674cb4e98eSShay Agroskin { "rx_err_lane_2_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane2) }, 10684cb4e98eSShay Agroskin { "rx_err_lane_3_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane3) }, 10694cb4e98eSShay Agroskin }; 10704cb4e98eSShay Agroskin 10714cb4e98eSShay Agroskin #define NUM_PPORT_PHY_STATISTICAL_COUNTERS \ 10724cb4e98eSShay Agroskin ARRAY_SIZE(pport_phy_statistical_stats_desc) 10734cb4e98eSShay Agroskin #define NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS \ 10744cb4e98eSShay Agroskin ARRAY_SIZE(pport_phy_statistical_err_lanes_stats_desc) 10752e4df0b2SKamal Heib 107696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(phy) 10772e4df0b2SKamal Heib { 10784cb4e98eSShay Agroskin struct mlx5_core_dev *mdev = priv->mdev; 10794cb4e98eSShay Agroskin int num_stats; 10804cb4e98eSShay Agroskin 10816ab75516SSaeed Mahameed /* "1" for link_down_events special counter */ 10824cb4e98eSShay Agroskin num_stats = 1; 10834cb4e98eSShay Agroskin 10844cb4e98eSShay Agroskin num_stats += MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group) ? 10854cb4e98eSShay Agroskin NUM_PPORT_PHY_STATISTICAL_COUNTERS : 0; 10864cb4e98eSShay Agroskin 10874cb4e98eSShay Agroskin num_stats += MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters) ? 10884cb4e98eSShay Agroskin NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS : 0; 10894cb4e98eSShay Agroskin 10904cb4e98eSShay Agroskin return num_stats; 10912e4df0b2SKamal Heib } 10922e4df0b2SKamal Heib 109396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(phy) 10942e4df0b2SKamal Heib { 10954cb4e98eSShay Agroskin struct mlx5_core_dev *mdev = priv->mdev; 10962e4df0b2SKamal Heib int i; 10972e4df0b2SKamal Heib 10986ab75516SSaeed Mahameed strcpy(data + (idx++) * ETH_GSTRING_LEN, "link_down_events_phy"); 10996ab75516SSaeed Mahameed 11004cb4e98eSShay Agroskin if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group)) 11016ab75516SSaeed Mahameed return idx; 11026ab75516SSaeed Mahameed 11036ab75516SSaeed Mahameed for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_COUNTERS; i++) 11042e4df0b2SKamal Heib strcpy(data + (idx++) * ETH_GSTRING_LEN, 11052e4df0b2SKamal Heib pport_phy_statistical_stats_desc[i].format); 11064cb4e98eSShay Agroskin 11074cb4e98eSShay Agroskin if (MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters)) 11084cb4e98eSShay Agroskin for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS; i++) 11094cb4e98eSShay Agroskin strcpy(data + (idx++) * ETH_GSTRING_LEN, 11104cb4e98eSShay Agroskin pport_phy_statistical_err_lanes_stats_desc[i].format); 11114cb4e98eSShay Agroskin 11122e4df0b2SKamal Heib return idx; 11132e4df0b2SKamal Heib } 11142e4df0b2SKamal Heib 111596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(phy) 11162e4df0b2SKamal Heib { 11174cb4e98eSShay Agroskin struct mlx5_core_dev *mdev = priv->mdev; 11182e4df0b2SKamal Heib int i; 11192e4df0b2SKamal Heib 11206ab75516SSaeed Mahameed /* link_down_events_phy has special handling since it is not stored in __be64 format */ 11216ab75516SSaeed Mahameed data[idx++] = MLX5_GET(ppcnt_reg, priv->stats.pport.phy_counters, 11226ab75516SSaeed Mahameed counter_set.phys_layer_cntrs.link_down_events); 11236ab75516SSaeed Mahameed 11244cb4e98eSShay Agroskin if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group)) 11256ab75516SSaeed Mahameed return idx; 11266ab75516SSaeed Mahameed 11276ab75516SSaeed Mahameed for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_COUNTERS; i++) 11282e4df0b2SKamal Heib data[idx++] = 11292e4df0b2SKamal Heib MLX5E_READ_CTR64_BE(&priv->stats.pport.phy_statistical_counters, 11302e4df0b2SKamal Heib pport_phy_statistical_stats_desc, i); 11314cb4e98eSShay Agroskin 11324cb4e98eSShay Agroskin if (MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters)) 11334cb4e98eSShay Agroskin for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS; i++) 11344cb4e98eSShay Agroskin data[idx++] = 11354cb4e98eSShay Agroskin MLX5E_READ_CTR64_BE(&priv->stats.pport.phy_statistical_counters, 11364cb4e98eSShay Agroskin pport_phy_statistical_err_lanes_stats_desc, 11374cb4e98eSShay Agroskin i); 11382e4df0b2SKamal Heib return idx; 11392e4df0b2SKamal Heib } 11402e4df0b2SKamal Heib 114196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(phy) 114219386177SKamal Heib { 114319386177SKamal Heib struct mlx5e_pport_stats *pstats = &priv->stats.pport; 114419386177SKamal Heib struct mlx5_core_dev *mdev = priv->mdev; 114519386177SKamal Heib u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0}; 114619386177SKamal Heib int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); 114719386177SKamal Heib void *out; 114819386177SKamal Heib 114919386177SKamal Heib MLX5_SET(ppcnt_reg, in, local_port, 1); 115019386177SKamal Heib out = pstats->phy_counters; 115119386177SKamal Heib MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_COUNTERS_GROUP); 115219386177SKamal Heib mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0); 115319386177SKamal Heib 115419386177SKamal Heib if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group)) 115519386177SKamal Heib return; 115619386177SKamal Heib 115719386177SKamal Heib out = pstats->phy_statistical_counters; 115819386177SKamal Heib MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_STATISTICAL_GROUP); 115919386177SKamal Heib mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0); 116019386177SKamal Heib } 116119386177SKamal Heib 1162*0a1498ebSLama Kayal static int fec_num_lanes(struct mlx5_core_dev *dev) 1163*0a1498ebSLama Kayal { 1164*0a1498ebSLama Kayal u32 out[MLX5_ST_SZ_DW(pmlp_reg)] = {}; 1165*0a1498ebSLama Kayal u32 in[MLX5_ST_SZ_DW(pmlp_reg)] = {}; 1166*0a1498ebSLama Kayal int err; 1167*0a1498ebSLama Kayal 1168*0a1498ebSLama Kayal MLX5_SET(pmlp_reg, in, local_port, 1); 1169*0a1498ebSLama Kayal err = mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), 1170*0a1498ebSLama Kayal MLX5_REG_PMLP, 0, 0); 1171*0a1498ebSLama Kayal if (err) 1172*0a1498ebSLama Kayal return 0; 1173*0a1498ebSLama Kayal 1174*0a1498ebSLama Kayal return MLX5_GET(pmlp_reg, out, width); 1175*0a1498ebSLama Kayal } 1176*0a1498ebSLama Kayal 1177*0a1498ebSLama Kayal static int fec_active_mode(struct mlx5_core_dev *mdev) 1178*0a1498ebSLama Kayal { 1179*0a1498ebSLama Kayal unsigned long fec_active_long; 1180*0a1498ebSLama Kayal u32 fec_active; 1181*0a1498ebSLama Kayal 1182*0a1498ebSLama Kayal if (mlx5e_get_fec_mode(mdev, &fec_active, NULL)) 1183*0a1498ebSLama Kayal return MLX5E_FEC_NOFEC; 1184*0a1498ebSLama Kayal 1185*0a1498ebSLama Kayal fec_active_long = fec_active; 1186*0a1498ebSLama Kayal return find_first_bit(&fec_active_long, sizeof(unsigned long) * BITS_PER_BYTE); 1187*0a1498ebSLama Kayal } 1188*0a1498ebSLama Kayal 1189*0a1498ebSLama Kayal #define MLX5E_STATS_SET_FEC_BLOCK(idx) ({ \ 1190*0a1498ebSLama Kayal fec_stats->corrected_blocks.lanes[(idx)] = \ 1191*0a1498ebSLama Kayal MLX5E_READ_CTR64_BE_F(ppcnt, phys_layer_cntrs, \ 1192*0a1498ebSLama Kayal fc_fec_corrected_blocks_lane##idx); \ 1193*0a1498ebSLama Kayal fec_stats->uncorrectable_blocks.lanes[(idx)] = \ 1194*0a1498ebSLama Kayal MLX5E_READ_CTR64_BE_F(ppcnt, phys_layer_cntrs, \ 1195*0a1498ebSLama Kayal fc_fec_uncorrectable_blocks_lane##idx); \ 1196*0a1498ebSLama Kayal }) 1197*0a1498ebSLama Kayal 1198*0a1498ebSLama Kayal static void fec_set_fc_stats(struct ethtool_fec_stats *fec_stats, 1199*0a1498ebSLama Kayal u32 *ppcnt, u8 lanes) 1200*0a1498ebSLama Kayal { 1201*0a1498ebSLama Kayal if (lanes > 3) { /* 4 lanes */ 1202*0a1498ebSLama Kayal MLX5E_STATS_SET_FEC_BLOCK(3); 1203*0a1498ebSLama Kayal MLX5E_STATS_SET_FEC_BLOCK(2); 1204*0a1498ebSLama Kayal } 1205*0a1498ebSLama Kayal if (lanes > 1) /* 2 lanes */ 1206*0a1498ebSLama Kayal MLX5E_STATS_SET_FEC_BLOCK(1); 1207*0a1498ebSLama Kayal if (lanes > 0) /* 1 lane */ 1208*0a1498ebSLama Kayal MLX5E_STATS_SET_FEC_BLOCK(0); 1209*0a1498ebSLama Kayal } 1210*0a1498ebSLama Kayal 1211*0a1498ebSLama Kayal static void fec_set_rs_stats(struct ethtool_fec_stats *fec_stats, u32 *ppcnt) 1212*0a1498ebSLama Kayal { 1213*0a1498ebSLama Kayal fec_stats->corrected_blocks.total = 1214*0a1498ebSLama Kayal MLX5E_READ_CTR64_BE_F(ppcnt, phys_layer_cntrs, 1215*0a1498ebSLama Kayal rs_fec_corrected_blocks); 1216*0a1498ebSLama Kayal fec_stats->uncorrectable_blocks.total = 1217*0a1498ebSLama Kayal MLX5E_READ_CTR64_BE_F(ppcnt, phys_layer_cntrs, 1218*0a1498ebSLama Kayal rs_fec_uncorrectable_blocks); 1219*0a1498ebSLama Kayal } 1220*0a1498ebSLama Kayal 1221*0a1498ebSLama Kayal static void fec_set_block_stats(struct mlx5e_priv *priv, 1222*0a1498ebSLama Kayal struct ethtool_fec_stats *fec_stats) 1223*0a1498ebSLama Kayal { 1224*0a1498ebSLama Kayal struct mlx5_core_dev *mdev = priv->mdev; 1225*0a1498ebSLama Kayal u32 out[MLX5_ST_SZ_DW(ppcnt_reg)] = {}; 1226*0a1498ebSLama Kayal u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {}; 1227*0a1498ebSLama Kayal int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); 1228*0a1498ebSLama Kayal int mode = fec_active_mode(mdev); 1229*0a1498ebSLama Kayal 1230*0a1498ebSLama Kayal if (mode == MLX5E_FEC_NOFEC) 1231*0a1498ebSLama Kayal return; 1232*0a1498ebSLama Kayal 1233*0a1498ebSLama Kayal MLX5_SET(ppcnt_reg, in, local_port, 1); 1234*0a1498ebSLama Kayal MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_COUNTERS_GROUP); 1235*0a1498ebSLama Kayal if (mlx5_core_access_reg(mdev, in, sz, outl, sz, MLX5_REG_PPCNT, 0, 0)) 1236*0a1498ebSLama Kayal return; 1237*0a1498ebSLama Kayal 1238*0a1498ebSLama Kayal switch (mode) { 1239*0a1498ebSLama Kayal case MLX5E_FEC_RS_528_514: 1240*0a1498ebSLama Kayal case MLX5E_FEC_RS_544_514: 1241*0a1498ebSLama Kayal case MLX5E_FEC_LLRS_272_257_1: 1242*0a1498ebSLama Kayal fec_set_rs_stats(fec_stats, out); 1243*0a1498ebSLama Kayal return; 1244*0a1498ebSLama Kayal case MLX5E_FEC_FIRECODE: 1245*0a1498ebSLama Kayal fec_set_fc_stats(fec_stats, out, fec_num_lanes(mdev)); 1246*0a1498ebSLama Kayal } 1247*0a1498ebSLama Kayal } 1248*0a1498ebSLama Kayal 1249*0a1498ebSLama Kayal static void fec_set_corrected_bits_total(struct mlx5e_priv *priv, 12501703bb50SJakub Kicinski struct ethtool_fec_stats *fec_stats) 12511703bb50SJakub Kicinski { 12521703bb50SJakub Kicinski u32 ppcnt_phy_statistical[MLX5_ST_SZ_DW(ppcnt_reg)]; 12531703bb50SJakub Kicinski struct mlx5_core_dev *mdev = priv->mdev; 1254*0a1498ebSLama Kayal u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {}; 12551703bb50SJakub Kicinski int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); 12561703bb50SJakub Kicinski 12571703bb50SJakub Kicinski if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group)) 12581703bb50SJakub Kicinski return; 12591703bb50SJakub Kicinski 12601703bb50SJakub Kicinski MLX5_SET(ppcnt_reg, in, local_port, 1); 12611703bb50SJakub Kicinski MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_STATISTICAL_GROUP); 12621703bb50SJakub Kicinski if (mlx5_core_access_reg(mdev, in, sz, ppcnt_phy_statistical, 12631703bb50SJakub Kicinski sz, MLX5_REG_PPCNT, 0, 0)) 12641703bb50SJakub Kicinski return; 12651703bb50SJakub Kicinski 12661703bb50SJakub Kicinski fec_stats->corrected_bits.total = 12671703bb50SJakub Kicinski MLX5E_READ_CTR64_BE_F(ppcnt_phy_statistical, 12681703bb50SJakub Kicinski phys_layer_statistical_cntrs, 12691703bb50SJakub Kicinski phy_corrected_bits); 12701703bb50SJakub Kicinski } 12711703bb50SJakub Kicinski 1272*0a1498ebSLama Kayal void mlx5e_stats_fec_get(struct mlx5e_priv *priv, 1273*0a1498ebSLama Kayal struct ethtool_fec_stats *fec_stats) 1274*0a1498ebSLama Kayal { 1275*0a1498ebSLama Kayal fec_set_corrected_bits_total(priv, fec_stats); 1276*0a1498ebSLama Kayal fec_set_block_stats(priv, fec_stats); 1277*0a1498ebSLama Kayal } 1278*0a1498ebSLama Kayal 12793488bd4cSKamal Heib #define PPORT_ETH_EXT_OFF(c) \ 12803488bd4cSKamal Heib MLX5_BYTE_OFF(ppcnt_reg, \ 12813488bd4cSKamal Heib counter_set.eth_extended_cntrs_grp_data_layout.c##_high) 12823488bd4cSKamal Heib static const struct counter_desc pport_eth_ext_stats_desc[] = { 12833488bd4cSKamal Heib { "rx_buffer_passed_thres_phy", PPORT_ETH_EXT_OFF(rx_buffer_almost_full) }, 12843488bd4cSKamal Heib }; 12853488bd4cSKamal Heib 12863488bd4cSKamal Heib #define NUM_PPORT_ETH_EXT_COUNTERS ARRAY_SIZE(pport_eth_ext_stats_desc) 12873488bd4cSKamal Heib 128896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(eth_ext) 12893488bd4cSKamal Heib { 12903488bd4cSKamal Heib if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters)) 12913488bd4cSKamal Heib return NUM_PPORT_ETH_EXT_COUNTERS; 12923488bd4cSKamal Heib 12933488bd4cSKamal Heib return 0; 12943488bd4cSKamal Heib } 12953488bd4cSKamal Heib 129696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(eth_ext) 12973488bd4cSKamal Heib { 12983488bd4cSKamal Heib int i; 12993488bd4cSKamal Heib 13003488bd4cSKamal Heib if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters)) 13013488bd4cSKamal Heib for (i = 0; i < NUM_PPORT_ETH_EXT_COUNTERS; i++) 13023488bd4cSKamal Heib strcpy(data + (idx++) * ETH_GSTRING_LEN, 13033488bd4cSKamal Heib pport_eth_ext_stats_desc[i].format); 13043488bd4cSKamal Heib return idx; 13053488bd4cSKamal Heib } 13063488bd4cSKamal Heib 130796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(eth_ext) 13083488bd4cSKamal Heib { 13093488bd4cSKamal Heib int i; 13103488bd4cSKamal Heib 13113488bd4cSKamal Heib if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters)) 13123488bd4cSKamal Heib for (i = 0; i < NUM_PPORT_ETH_EXT_COUNTERS; i++) 13133488bd4cSKamal Heib data[idx++] = 13143488bd4cSKamal Heib MLX5E_READ_CTR64_BE(&priv->stats.pport.eth_ext_counters, 13153488bd4cSKamal Heib pport_eth_ext_stats_desc, i); 13163488bd4cSKamal Heib return idx; 13173488bd4cSKamal Heib } 13183488bd4cSKamal Heib 131996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(eth_ext) 132019386177SKamal Heib { 132119386177SKamal Heib struct mlx5e_pport_stats *pstats = &priv->stats.pport; 132219386177SKamal Heib struct mlx5_core_dev *mdev = priv->mdev; 132319386177SKamal Heib u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0}; 132419386177SKamal Heib int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); 132519386177SKamal Heib void *out; 132619386177SKamal Heib 132719386177SKamal Heib if (!MLX5_CAP_PCAM_FEATURE(mdev, rx_buffer_fullness_counters)) 132819386177SKamal Heib return; 132919386177SKamal Heib 133019386177SKamal Heib MLX5_SET(ppcnt_reg, in, local_port, 1); 133119386177SKamal Heib out = pstats->eth_ext_counters; 133219386177SKamal Heib MLX5_SET(ppcnt_reg, in, grp, MLX5_ETHERNET_EXTENDED_COUNTERS_GROUP); 133319386177SKamal Heib mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0); 133419386177SKamal Heib } 133519386177SKamal Heib 13369fd2b5f1SKamal Heib #define PCIE_PERF_OFF(c) \ 13379fd2b5f1SKamal Heib MLX5_BYTE_OFF(mpcnt_reg, counter_set.pcie_perf_cntrs_grp_data_layout.c) 13389fd2b5f1SKamal Heib static const struct counter_desc pcie_perf_stats_desc[] = { 13399fd2b5f1SKamal Heib { "rx_pci_signal_integrity", PCIE_PERF_OFF(rx_errors) }, 13409fd2b5f1SKamal Heib { "tx_pci_signal_integrity", PCIE_PERF_OFF(tx_errors) }, 13419fd2b5f1SKamal Heib }; 13429fd2b5f1SKamal Heib 13439fd2b5f1SKamal Heib #define PCIE_PERF_OFF64(c) \ 13449fd2b5f1SKamal Heib MLX5_BYTE_OFF(mpcnt_reg, counter_set.pcie_perf_cntrs_grp_data_layout.c##_high) 13459fd2b5f1SKamal Heib static const struct counter_desc pcie_perf_stats_desc64[] = { 13469fd2b5f1SKamal Heib { "outbound_pci_buffer_overflow", PCIE_PERF_OFF64(tx_overflow_buffer_pkt) }, 13479fd2b5f1SKamal Heib }; 13489fd2b5f1SKamal Heib 13499fd2b5f1SKamal Heib static const struct counter_desc pcie_perf_stall_stats_desc[] = { 13509fd2b5f1SKamal Heib { "outbound_pci_stalled_rd", PCIE_PERF_OFF(outbound_stalled_reads) }, 13519fd2b5f1SKamal Heib { "outbound_pci_stalled_wr", PCIE_PERF_OFF(outbound_stalled_writes) }, 13529fd2b5f1SKamal Heib { "outbound_pci_stalled_rd_events", PCIE_PERF_OFF(outbound_stalled_reads_events) }, 13539fd2b5f1SKamal Heib { "outbound_pci_stalled_wr_events", PCIE_PERF_OFF(outbound_stalled_writes_events) }, 13549fd2b5f1SKamal Heib }; 13559fd2b5f1SKamal Heib 13569fd2b5f1SKamal Heib #define NUM_PCIE_PERF_COUNTERS ARRAY_SIZE(pcie_perf_stats_desc) 13579fd2b5f1SKamal Heib #define NUM_PCIE_PERF_COUNTERS64 ARRAY_SIZE(pcie_perf_stats_desc64) 13589fd2b5f1SKamal Heib #define NUM_PCIE_PERF_STALL_COUNTERS ARRAY_SIZE(pcie_perf_stall_stats_desc) 13599fd2b5f1SKamal Heib 136096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(pcie) 13619fd2b5f1SKamal Heib { 13629fd2b5f1SKamal Heib int num_stats = 0; 13639fd2b5f1SKamal Heib 13649fd2b5f1SKamal Heib if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group)) 13659fd2b5f1SKamal Heib num_stats += NUM_PCIE_PERF_COUNTERS; 13669fd2b5f1SKamal Heib 13679fd2b5f1SKamal Heib if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt)) 13689fd2b5f1SKamal Heib num_stats += NUM_PCIE_PERF_COUNTERS64; 13699fd2b5f1SKamal Heib 13709fd2b5f1SKamal Heib if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled)) 13719fd2b5f1SKamal Heib num_stats += NUM_PCIE_PERF_STALL_COUNTERS; 13729fd2b5f1SKamal Heib 13739fd2b5f1SKamal Heib return num_stats; 13749fd2b5f1SKamal Heib } 13759fd2b5f1SKamal Heib 137696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(pcie) 13779fd2b5f1SKamal Heib { 13789fd2b5f1SKamal Heib int i; 13799fd2b5f1SKamal Heib 13809fd2b5f1SKamal Heib if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group)) 13819fd2b5f1SKamal Heib for (i = 0; i < NUM_PCIE_PERF_COUNTERS; i++) 13829fd2b5f1SKamal Heib strcpy(data + (idx++) * ETH_GSTRING_LEN, 13839fd2b5f1SKamal Heib pcie_perf_stats_desc[i].format); 13849fd2b5f1SKamal Heib 13859fd2b5f1SKamal Heib if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt)) 13869fd2b5f1SKamal Heib for (i = 0; i < NUM_PCIE_PERF_COUNTERS64; i++) 13879fd2b5f1SKamal Heib strcpy(data + (idx++) * ETH_GSTRING_LEN, 13889fd2b5f1SKamal Heib pcie_perf_stats_desc64[i].format); 13899fd2b5f1SKamal Heib 13909fd2b5f1SKamal Heib if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled)) 13919fd2b5f1SKamal Heib for (i = 0; i < NUM_PCIE_PERF_STALL_COUNTERS; i++) 13929fd2b5f1SKamal Heib strcpy(data + (idx++) * ETH_GSTRING_LEN, 13939fd2b5f1SKamal Heib pcie_perf_stall_stats_desc[i].format); 13949fd2b5f1SKamal Heib return idx; 13959fd2b5f1SKamal Heib } 13969fd2b5f1SKamal Heib 139796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pcie) 13989fd2b5f1SKamal Heib { 13999fd2b5f1SKamal Heib int i; 14009fd2b5f1SKamal Heib 14019fd2b5f1SKamal Heib if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group)) 14029fd2b5f1SKamal Heib for (i = 0; i < NUM_PCIE_PERF_COUNTERS; i++) 14039fd2b5f1SKamal Heib data[idx++] = 14049fd2b5f1SKamal Heib MLX5E_READ_CTR32_BE(&priv->stats.pcie.pcie_perf_counters, 14059fd2b5f1SKamal Heib pcie_perf_stats_desc, i); 14069fd2b5f1SKamal Heib 14079fd2b5f1SKamal Heib if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt)) 14089fd2b5f1SKamal Heib for (i = 0; i < NUM_PCIE_PERF_COUNTERS64; i++) 14099fd2b5f1SKamal Heib data[idx++] = 14109fd2b5f1SKamal Heib MLX5E_READ_CTR64_BE(&priv->stats.pcie.pcie_perf_counters, 14119fd2b5f1SKamal Heib pcie_perf_stats_desc64, i); 14129fd2b5f1SKamal Heib 14139fd2b5f1SKamal Heib if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled)) 14149fd2b5f1SKamal Heib for (i = 0; i < NUM_PCIE_PERF_STALL_COUNTERS; i++) 14159fd2b5f1SKamal Heib data[idx++] = 14169fd2b5f1SKamal Heib MLX5E_READ_CTR32_BE(&priv->stats.pcie.pcie_perf_counters, 14179fd2b5f1SKamal Heib pcie_perf_stall_stats_desc, i); 14189fd2b5f1SKamal Heib return idx; 14199fd2b5f1SKamal Heib } 14209fd2b5f1SKamal Heib 142196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(pcie) 142219386177SKamal Heib { 142319386177SKamal Heib struct mlx5e_pcie_stats *pcie_stats = &priv->stats.pcie; 142419386177SKamal Heib struct mlx5_core_dev *mdev = priv->mdev; 142519386177SKamal Heib u32 in[MLX5_ST_SZ_DW(mpcnt_reg)] = {0}; 142619386177SKamal Heib int sz = MLX5_ST_SZ_BYTES(mpcnt_reg); 142719386177SKamal Heib void *out; 142819386177SKamal Heib 142919386177SKamal Heib if (!MLX5_CAP_MCAM_FEATURE(mdev, pcie_performance_group)) 143019386177SKamal Heib return; 143119386177SKamal Heib 143219386177SKamal Heib out = pcie_stats->pcie_perf_counters; 143319386177SKamal Heib MLX5_SET(mpcnt_reg, in, grp, MLX5_PCIE_PERFORMANCE_COUNTERS_GROUP); 143419386177SKamal Heib mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_MPCNT, 0, 0); 143519386177SKamal Heib } 143619386177SKamal Heib 14371297d97fSAya Levin #define PPORT_PER_TC_PRIO_OFF(c) \ 14381297d97fSAya Levin MLX5_BYTE_OFF(ppcnt_reg, \ 14391297d97fSAya Levin counter_set.eth_per_tc_prio_grp_data_layout.c##_high) 14401297d97fSAya Levin 14411297d97fSAya Levin static const struct counter_desc pport_per_tc_prio_stats_desc[] = { 14421297d97fSAya Levin { "rx_prio%d_buf_discard", PPORT_PER_TC_PRIO_OFF(no_buffer_discard_uc) }, 14431297d97fSAya Levin }; 14441297d97fSAya Levin 14451297d97fSAya Levin #define NUM_PPORT_PER_TC_PRIO_COUNTERS ARRAY_SIZE(pport_per_tc_prio_stats_desc) 14461297d97fSAya Levin 14471297d97fSAya Levin #define PPORT_PER_TC_CONGEST_PRIO_OFF(c) \ 14481297d97fSAya Levin MLX5_BYTE_OFF(ppcnt_reg, \ 14491297d97fSAya Levin counter_set.eth_per_tc_congest_prio_grp_data_layout.c##_high) 14501297d97fSAya Levin 14511297d97fSAya Levin static const struct counter_desc pport_per_tc_congest_prio_stats_desc[] = { 14521297d97fSAya Levin { "rx_prio%d_cong_discard", PPORT_PER_TC_CONGEST_PRIO_OFF(wred_discard) }, 14531297d97fSAya Levin { "rx_prio%d_marked", PPORT_PER_TC_CONGEST_PRIO_OFF(ecn_marked_tc) }, 14541297d97fSAya Levin }; 14551297d97fSAya Levin 14561297d97fSAya Levin #define NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS \ 14571297d97fSAya Levin ARRAY_SIZE(pport_per_tc_congest_prio_stats_desc) 14581297d97fSAya Levin 14591297d97fSAya Levin static int mlx5e_grp_per_tc_prio_get_num_stats(struct mlx5e_priv *priv) 14601297d97fSAya Levin { 14611297d97fSAya Levin struct mlx5_core_dev *mdev = priv->mdev; 14621297d97fSAya Levin 14631297d97fSAya Levin if (!MLX5_CAP_GEN(mdev, sbcam_reg)) 14641297d97fSAya Levin return 0; 14651297d97fSAya Levin 14661297d97fSAya Levin return NUM_PPORT_PER_TC_PRIO_COUNTERS * NUM_PPORT_PRIO; 14671297d97fSAya Levin } 14681297d97fSAya Levin 146996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(per_port_buff_congest) 14701297d97fSAya Levin { 14711297d97fSAya Levin struct mlx5_core_dev *mdev = priv->mdev; 14721297d97fSAya Levin int i, prio; 14731297d97fSAya Levin 14741297d97fSAya Levin if (!MLX5_CAP_GEN(mdev, sbcam_reg)) 14751297d97fSAya Levin return idx; 14761297d97fSAya Levin 14771297d97fSAya Levin for (prio = 0; prio < NUM_PPORT_PRIO; prio++) { 14781297d97fSAya Levin for (i = 0; i < NUM_PPORT_PER_TC_PRIO_COUNTERS; i++) 14791297d97fSAya Levin sprintf(data + (idx++) * ETH_GSTRING_LEN, 14801297d97fSAya Levin pport_per_tc_prio_stats_desc[i].format, prio); 14811297d97fSAya Levin for (i = 0; i < NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS; i++) 14821297d97fSAya Levin sprintf(data + (idx++) * ETH_GSTRING_LEN, 14831297d97fSAya Levin pport_per_tc_congest_prio_stats_desc[i].format, prio); 14841297d97fSAya Levin } 14851297d97fSAya Levin 14861297d97fSAya Levin return idx; 14871297d97fSAya Levin } 14881297d97fSAya Levin 148996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(per_port_buff_congest) 14901297d97fSAya Levin { 14911297d97fSAya Levin struct mlx5e_pport_stats *pport = &priv->stats.pport; 14921297d97fSAya Levin struct mlx5_core_dev *mdev = priv->mdev; 14931297d97fSAya Levin int i, prio; 14941297d97fSAya Levin 14951297d97fSAya Levin if (!MLX5_CAP_GEN(mdev, sbcam_reg)) 14961297d97fSAya Levin return idx; 14971297d97fSAya Levin 14981297d97fSAya Levin for (prio = 0; prio < NUM_PPORT_PRIO; prio++) { 14991297d97fSAya Levin for (i = 0; i < NUM_PPORT_PER_TC_PRIO_COUNTERS; i++) 15001297d97fSAya Levin data[idx++] = 15011297d97fSAya Levin MLX5E_READ_CTR64_BE(&pport->per_tc_prio_counters[prio], 15021297d97fSAya Levin pport_per_tc_prio_stats_desc, i); 15031297d97fSAya Levin for (i = 0; i < NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS ; i++) 15041297d97fSAya Levin data[idx++] = 15051297d97fSAya Levin MLX5E_READ_CTR64_BE(&pport->per_tc_congest_prio_counters[prio], 15061297d97fSAya Levin pport_per_tc_congest_prio_stats_desc, i); 15071297d97fSAya Levin } 15081297d97fSAya Levin 15091297d97fSAya Levin return idx; 15101297d97fSAya Levin } 15111297d97fSAya Levin 15121297d97fSAya Levin static void mlx5e_grp_per_tc_prio_update_stats(struct mlx5e_priv *priv) 15131297d97fSAya Levin { 15141297d97fSAya Levin struct mlx5e_pport_stats *pstats = &priv->stats.pport; 15151297d97fSAya Levin struct mlx5_core_dev *mdev = priv->mdev; 15161297d97fSAya Levin u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {}; 15171297d97fSAya Levin int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); 15181297d97fSAya Levin void *out; 15191297d97fSAya Levin int prio; 15201297d97fSAya Levin 15211297d97fSAya Levin if (!MLX5_CAP_GEN(mdev, sbcam_reg)) 15221297d97fSAya Levin return; 15231297d97fSAya Levin 15241297d97fSAya Levin MLX5_SET(ppcnt_reg, in, pnat, 2); 15251297d97fSAya Levin MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_TRAFFIC_CLASS_COUNTERS_GROUP); 15261297d97fSAya Levin for (prio = 0; prio < NUM_PPORT_PRIO; prio++) { 15271297d97fSAya Levin out = pstats->per_tc_prio_counters[prio]; 15281297d97fSAya Levin MLX5_SET(ppcnt_reg, in, prio_tc, prio); 15291297d97fSAya Levin mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0); 15301297d97fSAya Levin } 15311297d97fSAya Levin } 15321297d97fSAya Levin 15331297d97fSAya Levin static int mlx5e_grp_per_tc_congest_prio_get_num_stats(struct mlx5e_priv *priv) 15341297d97fSAya Levin { 15351297d97fSAya Levin struct mlx5_core_dev *mdev = priv->mdev; 15361297d97fSAya Levin 15371297d97fSAya Levin if (!MLX5_CAP_GEN(mdev, sbcam_reg)) 15381297d97fSAya Levin return 0; 15391297d97fSAya Levin 15401297d97fSAya Levin return NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS * NUM_PPORT_PRIO; 15411297d97fSAya Levin } 15421297d97fSAya Levin 15431297d97fSAya Levin static void mlx5e_grp_per_tc_congest_prio_update_stats(struct mlx5e_priv *priv) 15441297d97fSAya Levin { 15451297d97fSAya Levin struct mlx5e_pport_stats *pstats = &priv->stats.pport; 15461297d97fSAya Levin struct mlx5_core_dev *mdev = priv->mdev; 15471297d97fSAya Levin u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {}; 15481297d97fSAya Levin int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); 15491297d97fSAya Levin void *out; 15501297d97fSAya Levin int prio; 15511297d97fSAya Levin 15521297d97fSAya Levin if (!MLX5_CAP_GEN(mdev, sbcam_reg)) 15531297d97fSAya Levin return; 15541297d97fSAya Levin 15551297d97fSAya Levin MLX5_SET(ppcnt_reg, in, pnat, 2); 15561297d97fSAya Levin MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_TRAFFIC_CLASS_CONGESTION_GROUP); 15571297d97fSAya Levin for (prio = 0; prio < NUM_PPORT_PRIO; prio++) { 15581297d97fSAya Levin out = pstats->per_tc_congest_prio_counters[prio]; 15591297d97fSAya Levin MLX5_SET(ppcnt_reg, in, prio_tc, prio); 15601297d97fSAya Levin mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0); 15611297d97fSAya Levin } 15621297d97fSAya Levin } 15631297d97fSAya Levin 156496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(per_port_buff_congest) 15651297d97fSAya Levin { 15661297d97fSAya Levin return mlx5e_grp_per_tc_prio_get_num_stats(priv) + 15671297d97fSAya Levin mlx5e_grp_per_tc_congest_prio_get_num_stats(priv); 15681297d97fSAya Levin } 15691297d97fSAya Levin 157096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(per_port_buff_congest) 15711297d97fSAya Levin { 15721297d97fSAya Levin mlx5e_grp_per_tc_prio_update_stats(priv); 15731297d97fSAya Levin mlx5e_grp_per_tc_congest_prio_update_stats(priv); 15741297d97fSAya Levin } 15751297d97fSAya Levin 15764377bea2SKamal Heib #define PPORT_PER_PRIO_OFF(c) \ 15774377bea2SKamal Heib MLX5_BYTE_OFF(ppcnt_reg, \ 15784377bea2SKamal Heib counter_set.eth_per_prio_grp_data_layout.c##_high) 1579e6000651SKamal Heib static const struct counter_desc pport_per_prio_traffic_stats_desc[] = { 1580e6000651SKamal Heib { "rx_prio%d_bytes", PPORT_PER_PRIO_OFF(rx_octets) }, 1581e6000651SKamal Heib { "rx_prio%d_packets", PPORT_PER_PRIO_OFF(rx_frames) }, 1582827a8cb2SAharon Landau { "rx_prio%d_discards", PPORT_PER_PRIO_OFF(rx_discards) }, 1583e6000651SKamal Heib { "tx_prio%d_bytes", PPORT_PER_PRIO_OFF(tx_octets) }, 1584e6000651SKamal Heib { "tx_prio%d_packets", PPORT_PER_PRIO_OFF(tx_frames) }, 1585e6000651SKamal Heib }; 1586e6000651SKamal Heib 1587e6000651SKamal Heib #define NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS ARRAY_SIZE(pport_per_prio_traffic_stats_desc) 1588e6000651SKamal Heib 158954c73f86SYuval Shaia static int mlx5e_grp_per_prio_traffic_get_num_stats(void) 1590e6000651SKamal Heib { 1591e6000651SKamal Heib return NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS * NUM_PPORT_PRIO; 1592e6000651SKamal Heib } 1593e6000651SKamal Heib 1594e6000651SKamal Heib static int mlx5e_grp_per_prio_traffic_fill_strings(struct mlx5e_priv *priv, 1595e6000651SKamal Heib u8 *data, 1596e6000651SKamal Heib int idx) 1597e6000651SKamal Heib { 1598e6000651SKamal Heib int i, prio; 1599e6000651SKamal Heib 1600e6000651SKamal Heib for (prio = 0; prio < NUM_PPORT_PRIO; prio++) { 1601e6000651SKamal Heib for (i = 0; i < NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS; i++) 1602e6000651SKamal Heib sprintf(data + (idx++) * ETH_GSTRING_LEN, 1603e6000651SKamal Heib pport_per_prio_traffic_stats_desc[i].format, prio); 1604e6000651SKamal Heib } 1605e6000651SKamal Heib 1606e6000651SKamal Heib return idx; 1607e6000651SKamal Heib } 1608e6000651SKamal Heib 1609e6000651SKamal Heib static int mlx5e_grp_per_prio_traffic_fill_stats(struct mlx5e_priv *priv, 1610e6000651SKamal Heib u64 *data, 1611e6000651SKamal Heib int idx) 1612e6000651SKamal Heib { 1613e6000651SKamal Heib int i, prio; 1614e6000651SKamal Heib 1615e6000651SKamal Heib for (prio = 0; prio < NUM_PPORT_PRIO; prio++) { 1616e6000651SKamal Heib for (i = 0; i < NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS; i++) 1617e6000651SKamal Heib data[idx++] = 1618e6000651SKamal Heib MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[prio], 1619e6000651SKamal Heib pport_per_prio_traffic_stats_desc, i); 1620e6000651SKamal Heib } 1621e6000651SKamal Heib 1622e6000651SKamal Heib return idx; 1623e6000651SKamal Heib } 1624e6000651SKamal Heib 16254377bea2SKamal Heib static const struct counter_desc pport_per_prio_pfc_stats_desc[] = { 16264377bea2SKamal Heib /* %s is "global" or "prio{i}" */ 16274377bea2SKamal Heib { "rx_%s_pause", PPORT_PER_PRIO_OFF(rx_pause) }, 16284377bea2SKamal Heib { "rx_%s_pause_duration", PPORT_PER_PRIO_OFF(rx_pause_duration) }, 16294377bea2SKamal Heib { "tx_%s_pause", PPORT_PER_PRIO_OFF(tx_pause) }, 16304377bea2SKamal Heib { "tx_%s_pause_duration", PPORT_PER_PRIO_OFF(tx_pause_duration) }, 16314377bea2SKamal Heib { "rx_%s_pause_transition", PPORT_PER_PRIO_OFF(rx_pause_transition) }, 16324377bea2SKamal Heib }; 16334377bea2SKamal Heib 16342fcb12dfSInbar Karmy static const struct counter_desc pport_pfc_stall_stats_desc[] = { 16352fcb12dfSInbar Karmy { "tx_pause_storm_warning_events", PPORT_PER_PRIO_OFF(device_stall_minor_watermark_cnt) }, 16362fcb12dfSInbar Karmy { "tx_pause_storm_error_events", PPORT_PER_PRIO_OFF(device_stall_critical_watermark_cnt) }, 16372fcb12dfSInbar Karmy }; 16382fcb12dfSInbar Karmy 16394377bea2SKamal Heib #define NUM_PPORT_PER_PRIO_PFC_COUNTERS ARRAY_SIZE(pport_per_prio_pfc_stats_desc) 16402fcb12dfSInbar Karmy #define NUM_PPORT_PFC_STALL_COUNTERS(priv) (ARRAY_SIZE(pport_pfc_stall_stats_desc) * \ 16412fcb12dfSInbar Karmy MLX5_CAP_PCAM_FEATURE((priv)->mdev, pfcc_mask) * \ 16422fcb12dfSInbar Karmy MLX5_CAP_DEBUG((priv)->mdev, stall_detect)) 16434377bea2SKamal Heib 16444377bea2SKamal Heib static unsigned long mlx5e_query_pfc_combined(struct mlx5e_priv *priv) 16454377bea2SKamal Heib { 16464377bea2SKamal Heib struct mlx5_core_dev *mdev = priv->mdev; 16474377bea2SKamal Heib u8 pfc_en_tx; 16484377bea2SKamal Heib u8 pfc_en_rx; 16494377bea2SKamal Heib int err; 16504377bea2SKamal Heib 16514377bea2SKamal Heib if (MLX5_CAP_GEN(mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) 16524377bea2SKamal Heib return 0; 16534377bea2SKamal Heib 16544377bea2SKamal Heib err = mlx5_query_port_pfc(mdev, &pfc_en_tx, &pfc_en_rx); 16554377bea2SKamal Heib 16564377bea2SKamal Heib return err ? 0 : pfc_en_tx | pfc_en_rx; 16574377bea2SKamal Heib } 16584377bea2SKamal Heib 16594377bea2SKamal Heib static bool mlx5e_query_global_pause_combined(struct mlx5e_priv *priv) 16604377bea2SKamal Heib { 16614377bea2SKamal Heib struct mlx5_core_dev *mdev = priv->mdev; 16624377bea2SKamal Heib u32 rx_pause; 16634377bea2SKamal Heib u32 tx_pause; 16644377bea2SKamal Heib int err; 16654377bea2SKamal Heib 16664377bea2SKamal Heib if (MLX5_CAP_GEN(mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) 16674377bea2SKamal Heib return false; 16684377bea2SKamal Heib 16694377bea2SKamal Heib err = mlx5_query_port_pause(mdev, &rx_pause, &tx_pause); 16704377bea2SKamal Heib 16714377bea2SKamal Heib return err ? false : rx_pause | tx_pause; 16724377bea2SKamal Heib } 16734377bea2SKamal Heib 16744377bea2SKamal Heib static int mlx5e_grp_per_prio_pfc_get_num_stats(struct mlx5e_priv *priv) 16754377bea2SKamal Heib { 16764377bea2SKamal Heib return (mlx5e_query_global_pause_combined(priv) + 16774377bea2SKamal Heib hweight8(mlx5e_query_pfc_combined(priv))) * 16782fcb12dfSInbar Karmy NUM_PPORT_PER_PRIO_PFC_COUNTERS + 16792fcb12dfSInbar Karmy NUM_PPORT_PFC_STALL_COUNTERS(priv); 16804377bea2SKamal Heib } 16814377bea2SKamal Heib 16824377bea2SKamal Heib static int mlx5e_grp_per_prio_pfc_fill_strings(struct mlx5e_priv *priv, 16834377bea2SKamal Heib u8 *data, 16844377bea2SKamal Heib int idx) 16854377bea2SKamal Heib { 16864377bea2SKamal Heib unsigned long pfc_combined; 16874377bea2SKamal Heib int i, prio; 16884377bea2SKamal Heib 16894377bea2SKamal Heib pfc_combined = mlx5e_query_pfc_combined(priv); 16904377bea2SKamal Heib for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) { 16914377bea2SKamal Heib for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) { 16924377bea2SKamal Heib char pfc_string[ETH_GSTRING_LEN]; 16934377bea2SKamal Heib 16944377bea2SKamal Heib snprintf(pfc_string, sizeof(pfc_string), "prio%d", prio); 16954377bea2SKamal Heib sprintf(data + (idx++) * ETH_GSTRING_LEN, 16964377bea2SKamal Heib pport_per_prio_pfc_stats_desc[i].format, pfc_string); 16974377bea2SKamal Heib } 16984377bea2SKamal Heib } 16994377bea2SKamal Heib 17004377bea2SKamal Heib if (mlx5e_query_global_pause_combined(priv)) { 17014377bea2SKamal Heib for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) { 17024377bea2SKamal Heib sprintf(data + (idx++) * ETH_GSTRING_LEN, 17034377bea2SKamal Heib pport_per_prio_pfc_stats_desc[i].format, "global"); 17044377bea2SKamal Heib } 17054377bea2SKamal Heib } 17064377bea2SKamal Heib 17072fcb12dfSInbar Karmy for (i = 0; i < NUM_PPORT_PFC_STALL_COUNTERS(priv); i++) 17082fcb12dfSInbar Karmy strcpy(data + (idx++) * ETH_GSTRING_LEN, 17092fcb12dfSInbar Karmy pport_pfc_stall_stats_desc[i].format); 17102fcb12dfSInbar Karmy 17114377bea2SKamal Heib return idx; 17124377bea2SKamal Heib } 17134377bea2SKamal Heib 17144377bea2SKamal Heib static int mlx5e_grp_per_prio_pfc_fill_stats(struct mlx5e_priv *priv, 17154377bea2SKamal Heib u64 *data, 17164377bea2SKamal Heib int idx) 17174377bea2SKamal Heib { 17184377bea2SKamal Heib unsigned long pfc_combined; 17194377bea2SKamal Heib int i, prio; 17204377bea2SKamal Heib 17214377bea2SKamal Heib pfc_combined = mlx5e_query_pfc_combined(priv); 17224377bea2SKamal Heib for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) { 17234377bea2SKamal Heib for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) { 17244377bea2SKamal Heib data[idx++] = 17254377bea2SKamal Heib MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[prio], 17264377bea2SKamal Heib pport_per_prio_pfc_stats_desc, i); 17274377bea2SKamal Heib } 17284377bea2SKamal Heib } 17294377bea2SKamal Heib 17304377bea2SKamal Heib if (mlx5e_query_global_pause_combined(priv)) { 17314377bea2SKamal Heib for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) { 17324377bea2SKamal Heib data[idx++] = 17334377bea2SKamal Heib MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[0], 17344377bea2SKamal Heib pport_per_prio_pfc_stats_desc, i); 17354377bea2SKamal Heib } 17364377bea2SKamal Heib } 17374377bea2SKamal Heib 17382fcb12dfSInbar Karmy for (i = 0; i < NUM_PPORT_PFC_STALL_COUNTERS(priv); i++) 17392fcb12dfSInbar Karmy data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[0], 17402fcb12dfSInbar Karmy pport_pfc_stall_stats_desc, i); 17412fcb12dfSInbar Karmy 17424377bea2SKamal Heib return idx; 17434377bea2SKamal Heib } 17444377bea2SKamal Heib 174596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(per_prio) 1746a8984281SKamal Heib { 174754c73f86SYuval Shaia return mlx5e_grp_per_prio_traffic_get_num_stats() + 1748a8984281SKamal Heib mlx5e_grp_per_prio_pfc_get_num_stats(priv); 1749a8984281SKamal Heib } 1750a8984281SKamal Heib 175196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(per_prio) 1752a8984281SKamal Heib { 1753a8984281SKamal Heib idx = mlx5e_grp_per_prio_traffic_fill_strings(priv, data, idx); 1754a8984281SKamal Heib idx = mlx5e_grp_per_prio_pfc_fill_strings(priv, data, idx); 1755a8984281SKamal Heib return idx; 1756a8984281SKamal Heib } 1757a8984281SKamal Heib 175896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(per_prio) 1759a8984281SKamal Heib { 1760a8984281SKamal Heib idx = mlx5e_grp_per_prio_traffic_fill_stats(priv, data, idx); 1761a8984281SKamal Heib idx = mlx5e_grp_per_prio_pfc_fill_stats(priv, data, idx); 1762a8984281SKamal Heib return idx; 1763a8984281SKamal Heib } 1764a8984281SKamal Heib 176596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(per_prio) 176619386177SKamal Heib { 176719386177SKamal Heib struct mlx5e_pport_stats *pstats = &priv->stats.pport; 176819386177SKamal Heib struct mlx5_core_dev *mdev = priv->mdev; 176919386177SKamal Heib u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0}; 177019386177SKamal Heib int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); 177119386177SKamal Heib int prio; 177219386177SKamal Heib void *out; 177319386177SKamal Heib 177475370eb0SEyal Davidovich if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev)) 177575370eb0SEyal Davidovich return; 177675370eb0SEyal Davidovich 177719386177SKamal Heib MLX5_SET(ppcnt_reg, in, local_port, 1); 177819386177SKamal Heib MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_PRIORITY_COUNTERS_GROUP); 177919386177SKamal Heib for (prio = 0; prio < NUM_PPORT_PRIO; prio++) { 178019386177SKamal Heib out = pstats->per_prio_counters[prio]; 178119386177SKamal Heib MLX5_SET(ppcnt_reg, in, prio_tc, prio); 178219386177SKamal Heib mlx5_core_access_reg(mdev, in, sz, out, sz, 178319386177SKamal Heib MLX5_REG_PPCNT, 0, 0); 178419386177SKamal Heib } 178519386177SKamal Heib } 178619386177SKamal Heib 17870e6f01a4SKamal Heib static const struct counter_desc mlx5e_pme_status_desc[] = { 1788c2fb3db2SMikhael Goikhman { "module_unplug", sizeof(u64) * MLX5_MODULE_STATUS_UNPLUGGED }, 17890e6f01a4SKamal Heib }; 17900e6f01a4SKamal Heib 17910e6f01a4SKamal Heib static const struct counter_desc mlx5e_pme_error_desc[] = { 1792c2fb3db2SMikhael Goikhman { "module_bus_stuck", sizeof(u64) * MLX5_MODULE_EVENT_ERROR_BUS_STUCK }, 1793c2fb3db2SMikhael Goikhman { "module_high_temp", sizeof(u64) * MLX5_MODULE_EVENT_ERROR_HIGH_TEMPERATURE }, 1794c2fb3db2SMikhael Goikhman { "module_bad_shorted", sizeof(u64) * MLX5_MODULE_EVENT_ERROR_BAD_CABLE }, 17950e6f01a4SKamal Heib }; 17960e6f01a4SKamal Heib 17970e6f01a4SKamal Heib #define NUM_PME_STATUS_STATS ARRAY_SIZE(mlx5e_pme_status_desc) 17980e6f01a4SKamal Heib #define NUM_PME_ERR_STATS ARRAY_SIZE(mlx5e_pme_error_desc) 17990e6f01a4SKamal Heib 180096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(pme) 18010e6f01a4SKamal Heib { 18020e6f01a4SKamal Heib return NUM_PME_STATUS_STATS + NUM_PME_ERR_STATS; 18030e6f01a4SKamal Heib } 18040e6f01a4SKamal Heib 180596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(pme) 18060e6f01a4SKamal Heib { 18070e6f01a4SKamal Heib int i; 18080e6f01a4SKamal Heib 18090e6f01a4SKamal Heib for (i = 0; i < NUM_PME_STATUS_STATS; i++) 18100e6f01a4SKamal Heib strcpy(data + (idx++) * ETH_GSTRING_LEN, mlx5e_pme_status_desc[i].format); 18110e6f01a4SKamal Heib 18120e6f01a4SKamal Heib for (i = 0; i < NUM_PME_ERR_STATS; i++) 18130e6f01a4SKamal Heib strcpy(data + (idx++) * ETH_GSTRING_LEN, mlx5e_pme_error_desc[i].format); 18140e6f01a4SKamal Heib 18150e6f01a4SKamal Heib return idx; 18160e6f01a4SKamal Heib } 18170e6f01a4SKamal Heib 181896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pme) 18190e6f01a4SKamal Heib { 182069c1280bSSaeed Mahameed struct mlx5_pme_stats pme_stats; 18210e6f01a4SKamal Heib int i; 18220e6f01a4SKamal Heib 182369c1280bSSaeed Mahameed mlx5_get_pme_stats(priv->mdev, &pme_stats); 182469c1280bSSaeed Mahameed 18250e6f01a4SKamal Heib for (i = 0; i < NUM_PME_STATUS_STATS; i++) 182669c1280bSSaeed Mahameed data[idx++] = MLX5E_READ_CTR64_CPU(pme_stats.status_counters, 18270e6f01a4SKamal Heib mlx5e_pme_status_desc, i); 18280e6f01a4SKamal Heib 18290e6f01a4SKamal Heib for (i = 0; i < NUM_PME_ERR_STATS; i++) 183069c1280bSSaeed Mahameed data[idx++] = MLX5E_READ_CTR64_CPU(pme_stats.error_counters, 18310e6f01a4SKamal Heib mlx5e_pme_error_desc, i); 18320e6f01a4SKamal Heib 18330e6f01a4SKamal Heib return idx; 18340e6f01a4SKamal Heib } 18350e6f01a4SKamal Heib 183696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(pme) { return; } 183796b12796SSaeed Mahameed 183896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(tls) 183943585a41SIlya Lesokhin { 184043585a41SIlya Lesokhin return mlx5e_tls_get_count(priv); 184143585a41SIlya Lesokhin } 184243585a41SIlya Lesokhin 184396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(tls) 184443585a41SIlya Lesokhin { 184543585a41SIlya Lesokhin return idx + mlx5e_tls_get_strings(priv, data + idx * ETH_GSTRING_LEN); 184643585a41SIlya Lesokhin } 184743585a41SIlya Lesokhin 184896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(tls) 184943585a41SIlya Lesokhin { 185043585a41SIlya Lesokhin return idx + mlx5e_tls_get_stats(priv, data + idx); 185143585a41SIlya Lesokhin } 185243585a41SIlya Lesokhin 185396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(tls) { return; } 185496b12796SSaeed Mahameed 18551fe85006SKamal Heib static const struct counter_desc rq_stats_desc[] = { 18561fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, packets) }, 18571fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, bytes) }, 18581fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete) }, 18590aa1d186SSaeed Mahameed { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete_tail) }, 18600aa1d186SSaeed Mahameed { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete_tail_slow) }, 18611fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary) }, 18621fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) }, 18631fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_none) }, 18641fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_drop) }, 186586690b4bSTariq Toukan { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_redirect) }, 18661fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_packets) }, 18671fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_bytes) }, 1868def09e7bSKhalid Manaa { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_packets) }, 1869def09e7bSKhalid Manaa { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_bytes) }, 1870def09e7bSKhalid Manaa { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_skbs) }, 1871def09e7bSKhalid Manaa { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_match_packets) }, 1872def09e7bSKhalid Manaa { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_large_hds) }, 1873f007c13dSNatali Shechtman { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, ecn_mark) }, 1874f24686e8SGal Pressman { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, removed_vlan_packets) }, 18751fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, wqe_err) }, 1876b71ba6b4STariq Toukan { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) }, 1877b71ba6b4STariq Toukan { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, mpwqe_filler_strides) }, 18780073c8f7SMoshe Shemesh { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, oversize_pkts_sw_drop) }, 18791fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, buff_alloc_err) }, 18801fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cqe_compress_blks) }, 18811fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) }, 18821fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_reuse) }, 18831fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_full) }, 18841fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_empty) }, 18851fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_busy) }, 18861fe85006SKamal Heib { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_waive) }, 1887dc983f0eSTariq Toukan { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, congst_umr) }, 188894563847SEran Ben Elisha { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, arfs_err) }, 1889be5323c8SAya Levin { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, recover) }, 189076c1e1acSTariq Toukan #ifdef CONFIG_MLX5_EN_TLS 189176c1e1acSTariq Toukan { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_decrypted_packets) }, 189276c1e1acSTariq Toukan { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_decrypted_bytes) }, 189376c1e1acSTariq Toukan { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_pkt) }, 189476c1e1acSTariq Toukan { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_start) }, 189576c1e1acSTariq Toukan { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_end) }, 189676c1e1acSTariq Toukan { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_skip) }, 189776c1e1acSTariq Toukan { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_res_ok) }, 1898e9ce991bSTariq Toukan { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_res_retry) }, 189976c1e1acSTariq Toukan { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_res_skip) }, 190076c1e1acSTariq Toukan { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_err) }, 190176c1e1acSTariq Toukan #endif 19021fe85006SKamal Heib }; 19031fe85006SKamal Heib 19041fe85006SKamal Heib static const struct counter_desc sq_stats_desc[] = { 19051fe85006SKamal Heib { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, packets) }, 19061fe85006SKamal Heib { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, bytes) }, 19071fe85006SKamal Heib { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_packets) }, 19081fe85006SKamal Heib { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_bytes) }, 19091fe85006SKamal Heib { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_packets) }, 19101fe85006SKamal Heib { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_bytes) }, 19111fe85006SKamal Heib { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_partial) }, 19121fe85006SKamal Heib { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) }, 1913f24686e8SGal Pressman { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) }, 19141fe85006SKamal Heib { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, nop) }, 19155af75c74SMaxim Mikityanskiy { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, mpwqe_blks) }, 19165af75c74SMaxim Mikityanskiy { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, mpwqe_pkts) }, 1917d2ead1f3STariq Toukan #ifdef CONFIG_MLX5_EN_TLS 1918d2ead1f3STariq Toukan { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_packets) }, 1919d2ead1f3STariq Toukan { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_bytes) }, 1920d2ead1f3STariq Toukan { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_ooo) }, 1921d2ead1f3STariq Toukan { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_dump_packets) }, 1922d2ead1f3STariq Toukan { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_dump_bytes) }, 192346a3ea98STariq Toukan { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_resync_bytes) }, 192446a3ea98STariq Toukan { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_skip_no_sync_data) }, 192546a3ea98STariq Toukan { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_drop_no_sync_data) }, 192646a3ea98STariq Toukan { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_drop_bypass_req) }, 1927d2ead1f3STariq Toukan #endif 19281fe85006SKamal Heib { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_none) }, 19291fe85006SKamal Heib { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, stopped) }, 19301fe85006SKamal Heib { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, dropped) }, 19311fe85006SKamal Heib { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, xmit_more) }, 1932db75373cSEran Ben Elisha { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, recover) }, 193386155656STariq Toukan { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, cqes) }, 1934f65a59ffSTariq Toukan { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, wake) }, 1935f65a59ffSTariq Toukan { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, cqe_err) }, 19361fe85006SKamal Heib }; 19371fe85006SKamal Heib 1938890388adSTariq Toukan static const struct counter_desc rq_xdpsq_stats_desc[] = { 1939890388adSTariq Toukan { MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, xmit) }, 194073cab880SShay Agroskin { MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, mpwqe) }, 1941c2273219SShay Agroskin { MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, inlnw) }, 19426c085a8aSShay Agroskin { MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, nops) }, 1943890388adSTariq Toukan { MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, full) }, 1944890388adSTariq Toukan { MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, err) }, 1945890388adSTariq Toukan { MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, cqes) }, 1946890388adSTariq Toukan }; 1947890388adSTariq Toukan 194858b99ee3STariq Toukan static const struct counter_desc xdpsq_stats_desc[] = { 194958b99ee3STariq Toukan { MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, xmit) }, 195073cab880SShay Agroskin { MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, mpwqe) }, 1951c2273219SShay Agroskin { MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, inlnw) }, 19526c085a8aSShay Agroskin { MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, nops) }, 195358b99ee3STariq Toukan { MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, full) }, 195458b99ee3STariq Toukan { MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, err) }, 195558b99ee3STariq Toukan { MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, cqes) }, 195658b99ee3STariq Toukan }; 195758b99ee3STariq Toukan 1958db05815bSMaxim Mikityanskiy static const struct counter_desc xskrq_stats_desc[] = { 1959db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, packets) }, 1960db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, bytes) }, 1961db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_complete) }, 1962db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_unnecessary) }, 1963db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) }, 1964db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_none) }, 1965db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, ecn_mark) }, 1966db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, removed_vlan_packets) }, 1967db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, xdp_drop) }, 1968db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, xdp_redirect) }, 1969db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, wqe_err) }, 1970db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) }, 1971db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_strides) }, 1972db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, oversize_pkts_sw_drop) }, 1973db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, buff_alloc_err) }, 1974db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, cqe_compress_blks) }, 1975db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) }, 1976db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, congst_umr) }, 1977db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, arfs_err) }, 1978db05815bSMaxim Mikityanskiy }; 1979db05815bSMaxim Mikityanskiy 1980db05815bSMaxim Mikityanskiy static const struct counter_desc xsksq_stats_desc[] = { 1981db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, xmit) }, 1982db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, mpwqe) }, 1983db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, inlnw) }, 1984db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, full) }, 1985db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, err) }, 1986db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, cqes) }, 1987db05815bSMaxim Mikityanskiy }; 1988db05815bSMaxim Mikityanskiy 198957d689a8SEran Ben Elisha static const struct counter_desc ch_stats_desc[] = { 1990a1bf74dcSTariq Toukan { MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, events) }, 19912d7103c8STariq Toukan { MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, poll) }, 19922d7103c8STariq Toukan { MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, arm) }, 19932d7103c8STariq Toukan { MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, aff_change) }, 1994db05815bSMaxim Mikityanskiy { MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, force_irq) }, 199557d689a8SEran Ben Elisha { MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, eq_rearm) }, 199657d689a8SEran Ben Elisha }; 199757d689a8SEran Ben Elisha 1998145e5637SEran Ben Elisha static const struct counter_desc ptp_sq_stats_desc[] = { 1999145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, packets) }, 2000145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, bytes) }, 2001145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, csum_partial) }, 2002145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) }, 2003145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) }, 2004145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, nop) }, 2005145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, csum_none) }, 2006145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, stopped) }, 2007145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, dropped) }, 2008145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, xmit_more) }, 2009145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, recover) }, 2010145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, cqes) }, 2011145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, wake) }, 2012145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, cqe_err) }, 2013145e5637SEran Ben Elisha }; 2014145e5637SEran Ben Elisha 2015145e5637SEran Ben Elisha static const struct counter_desc ptp_ch_stats_desc[] = { 2016145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, events) }, 2017145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, poll) }, 2018145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, arm) }, 2019145e5637SEran Ben Elisha { MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, eq_rearm) }, 2020145e5637SEran Ben Elisha }; 2021145e5637SEran Ben Elisha 20221880bc4eSEran Ben Elisha static const struct counter_desc ptp_cq_stats_desc[] = { 20231880bc4eSEran Ben Elisha { MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, cqe) }, 20241880bc4eSEran Ben Elisha { MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, err_cqe) }, 20251880bc4eSEran Ben Elisha { MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, abort) }, 20261880bc4eSEran Ben Elisha { MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, abort_abs_diff_ns) }, 20271880bc4eSEran Ben Elisha }; 20281880bc4eSEran Ben Elisha 2029a28359e9SAya Levin static const struct counter_desc ptp_rq_stats_desc[] = { 2030a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, packets) }, 2031a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, bytes) }, 2032a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_complete) }, 2033a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_complete_tail) }, 2034a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_complete_tail_slow) }, 2035a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_unnecessary) }, 2036a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) }, 2037a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_none) }, 2038a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, xdp_drop) }, 2039a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, xdp_redirect) }, 2040a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, lro_packets) }, 2041a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, lro_bytes) }, 2042a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, ecn_mark) }, 2043a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, removed_vlan_packets) }, 2044a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, wqe_err) }, 2045a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) }, 2046a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_strides) }, 2047a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, oversize_pkts_sw_drop) }, 2048a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, buff_alloc_err) }, 2049a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cqe_compress_blks) }, 2050a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) }, 2051a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_reuse) }, 2052a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_full) }, 2053a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_empty) }, 2054a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_busy) }, 2055a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_waive) }, 2056a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, congst_umr) }, 2057a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, arfs_err) }, 2058a28359e9SAya Levin { MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, recover) }, 2059a28359e9SAya Levin }; 2060a28359e9SAya Levin 2061214baf22SMaxim Mikityanskiy static const struct counter_desc qos_sq_stats_desc[] = { 2062214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, packets) }, 2063214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, bytes) }, 2064214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_packets) }, 2065214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_bytes) }, 2066214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_inner_packets) }, 2067214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_inner_bytes) }, 2068214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_partial) }, 2069214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) }, 2070214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) }, 2071214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, nop) }, 2072214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, mpwqe_blks) }, 2073214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, mpwqe_pkts) }, 2074214baf22SMaxim Mikityanskiy #ifdef CONFIG_MLX5_EN_TLS 2075214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_packets) }, 2076214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_bytes) }, 2077214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_ooo) }, 2078214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_dump_packets) }, 2079214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_dump_bytes) }, 2080214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_resync_bytes) }, 2081214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_skip_no_sync_data) }, 2082214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_drop_no_sync_data) }, 2083214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_drop_bypass_req) }, 2084214baf22SMaxim Mikityanskiy #endif 2085214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_none) }, 2086214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, stopped) }, 2087214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, dropped) }, 2088214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, xmit_more) }, 2089214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, recover) }, 2090214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, cqes) }, 2091214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, wake) }, 2092214baf22SMaxim Mikityanskiy { MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, cqe_err) }, 2093214baf22SMaxim Mikityanskiy }; 2094214baf22SMaxim Mikityanskiy 20951fe85006SKamal Heib #define NUM_RQ_STATS ARRAY_SIZE(rq_stats_desc) 20961fe85006SKamal Heib #define NUM_SQ_STATS ARRAY_SIZE(sq_stats_desc) 209758b99ee3STariq Toukan #define NUM_XDPSQ_STATS ARRAY_SIZE(xdpsq_stats_desc) 2098890388adSTariq Toukan #define NUM_RQ_XDPSQ_STATS ARRAY_SIZE(rq_xdpsq_stats_desc) 2099db05815bSMaxim Mikityanskiy #define NUM_XSKRQ_STATS ARRAY_SIZE(xskrq_stats_desc) 2100db05815bSMaxim Mikityanskiy #define NUM_XSKSQ_STATS ARRAY_SIZE(xsksq_stats_desc) 210157d689a8SEran Ben Elisha #define NUM_CH_STATS ARRAY_SIZE(ch_stats_desc) 2102145e5637SEran Ben Elisha #define NUM_PTP_SQ_STATS ARRAY_SIZE(ptp_sq_stats_desc) 2103145e5637SEran Ben Elisha #define NUM_PTP_CH_STATS ARRAY_SIZE(ptp_ch_stats_desc) 21041880bc4eSEran Ben Elisha #define NUM_PTP_CQ_STATS ARRAY_SIZE(ptp_cq_stats_desc) 2105a28359e9SAya Levin #define NUM_PTP_RQ_STATS ARRAY_SIZE(ptp_rq_stats_desc) 2106214baf22SMaxim Mikityanskiy #define NUM_QOS_SQ_STATS ARRAY_SIZE(qos_sq_stats_desc) 2107214baf22SMaxim Mikityanskiy 2108214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(qos) 2109214baf22SMaxim Mikityanskiy { 2110214baf22SMaxim Mikityanskiy /* Pairs with smp_store_release in mlx5e_open_qos_sq. */ 2111214baf22SMaxim Mikityanskiy return NUM_QOS_SQ_STATS * smp_load_acquire(&priv->htb.max_qos_sqs); 2112214baf22SMaxim Mikityanskiy } 2113214baf22SMaxim Mikityanskiy 2114214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qos) 2115214baf22SMaxim Mikityanskiy { 2116214baf22SMaxim Mikityanskiy /* Pairs with smp_store_release in mlx5e_open_qos_sq. */ 2117214baf22SMaxim Mikityanskiy u16 max_qos_sqs = smp_load_acquire(&priv->htb.max_qos_sqs); 2118214baf22SMaxim Mikityanskiy int i, qid; 2119214baf22SMaxim Mikityanskiy 2120214baf22SMaxim Mikityanskiy for (qid = 0; qid < max_qos_sqs; qid++) 2121214baf22SMaxim Mikityanskiy for (i = 0; i < NUM_QOS_SQ_STATS; i++) 2122214baf22SMaxim Mikityanskiy sprintf(data + (idx++) * ETH_GSTRING_LEN, 2123214baf22SMaxim Mikityanskiy qos_sq_stats_desc[i].format, qid); 2124214baf22SMaxim Mikityanskiy 2125214baf22SMaxim Mikityanskiy return idx; 2126214baf22SMaxim Mikityanskiy } 2127214baf22SMaxim Mikityanskiy 2128214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qos) 2129214baf22SMaxim Mikityanskiy { 2130214baf22SMaxim Mikityanskiy struct mlx5e_sq_stats **stats; 2131214baf22SMaxim Mikityanskiy u16 max_qos_sqs; 2132214baf22SMaxim Mikityanskiy int i, qid; 2133214baf22SMaxim Mikityanskiy 2134214baf22SMaxim Mikityanskiy /* Pairs with smp_store_release in mlx5e_open_qos_sq. */ 2135214baf22SMaxim Mikityanskiy max_qos_sqs = smp_load_acquire(&priv->htb.max_qos_sqs); 2136214baf22SMaxim Mikityanskiy stats = READ_ONCE(priv->htb.qos_sq_stats); 2137214baf22SMaxim Mikityanskiy 2138214baf22SMaxim Mikityanskiy for (qid = 0; qid < max_qos_sqs; qid++) { 2139214baf22SMaxim Mikityanskiy struct mlx5e_sq_stats *s = READ_ONCE(stats[qid]); 2140214baf22SMaxim Mikityanskiy 2141214baf22SMaxim Mikityanskiy for (i = 0; i < NUM_QOS_SQ_STATS; i++) 2142214baf22SMaxim Mikityanskiy data[idx++] = MLX5E_READ_CTR64_CPU(s, qos_sq_stats_desc, i); 2143214baf22SMaxim Mikityanskiy } 2144214baf22SMaxim Mikityanskiy 2145214baf22SMaxim Mikityanskiy return idx; 2146214baf22SMaxim Mikityanskiy } 2147214baf22SMaxim Mikityanskiy 2148214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qos) { return; } 2149145e5637SEran Ben Elisha 2150145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(ptp) 2151145e5637SEran Ben Elisha { 2152a28359e9SAya Levin int num = NUM_PTP_CH_STATS; 2153a28359e9SAya Levin 2154a28359e9SAya Levin if (!priv->tx_ptp_opened && !priv->rx_ptp_opened) 2155a28359e9SAya Levin return 0; 2156a28359e9SAya Levin 2157a28359e9SAya Levin if (priv->tx_ptp_opened) 2158a28359e9SAya Levin num += (NUM_PTP_SQ_STATS + NUM_PTP_CQ_STATS) * priv->max_opened_tc; 2159a28359e9SAya Levin if (priv->rx_ptp_opened) 2160a28359e9SAya Levin num += NUM_PTP_RQ_STATS; 2161a28359e9SAya Levin 2162a28359e9SAya Levin return num; 2163145e5637SEran Ben Elisha } 2164145e5637SEran Ben Elisha 2165145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(ptp) 2166145e5637SEran Ben Elisha { 2167145e5637SEran Ben Elisha int i, tc; 2168145e5637SEran Ben Elisha 2169a28359e9SAya Levin if (!priv->tx_ptp_opened && !priv->rx_ptp_opened) 2170145e5637SEran Ben Elisha return idx; 2171145e5637SEran Ben Elisha 2172145e5637SEran Ben Elisha for (i = 0; i < NUM_PTP_CH_STATS; i++) 2173145e5637SEran Ben Elisha sprintf(data + (idx++) * ETH_GSTRING_LEN, 2174aef0f8c6SSaeed Mahameed "%s", ptp_ch_stats_desc[i].format); 2175145e5637SEran Ben Elisha 2176a28359e9SAya Levin if (priv->tx_ptp_opened) { 2177145e5637SEran Ben Elisha for (tc = 0; tc < priv->max_opened_tc; tc++) 2178145e5637SEran Ben Elisha for (i = 0; i < NUM_PTP_SQ_STATS; i++) 2179145e5637SEran Ben Elisha sprintf(data + (idx++) * ETH_GSTRING_LEN, 2180145e5637SEran Ben Elisha ptp_sq_stats_desc[i].format, tc); 2181145e5637SEran Ben Elisha 21821880bc4eSEran Ben Elisha for (tc = 0; tc < priv->max_opened_tc; tc++) 21831880bc4eSEran Ben Elisha for (i = 0; i < NUM_PTP_CQ_STATS; i++) 21841880bc4eSEran Ben Elisha sprintf(data + (idx++) * ETH_GSTRING_LEN, 21851880bc4eSEran Ben Elisha ptp_cq_stats_desc[i].format, tc); 2186a28359e9SAya Levin } 2187a28359e9SAya Levin if (priv->rx_ptp_opened) { 2188a28359e9SAya Levin for (i = 0; i < NUM_PTP_RQ_STATS; i++) 2189a28359e9SAya Levin sprintf(data + (idx++) * ETH_GSTRING_LEN, 2190dd1979cfSLama Kayal ptp_rq_stats_desc[i].format, MLX5E_PTP_CHANNEL_IX); 2191a28359e9SAya Levin } 2192145e5637SEran Ben Elisha return idx; 2193145e5637SEran Ben Elisha } 2194145e5637SEran Ben Elisha 2195145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(ptp) 2196145e5637SEran Ben Elisha { 2197145e5637SEran Ben Elisha int i, tc; 2198145e5637SEran Ben Elisha 2199a28359e9SAya Levin if (!priv->tx_ptp_opened && !priv->rx_ptp_opened) 2200145e5637SEran Ben Elisha return idx; 2201145e5637SEran Ben Elisha 2202145e5637SEran Ben Elisha for (i = 0; i < NUM_PTP_CH_STATS; i++) 2203145e5637SEran Ben Elisha data[idx++] = 2204b0d35de4SAya Levin MLX5E_READ_CTR64_CPU(&priv->ptp_stats.ch, 2205145e5637SEran Ben Elisha ptp_ch_stats_desc, i); 2206145e5637SEran Ben Elisha 2207a28359e9SAya Levin if (priv->tx_ptp_opened) { 2208145e5637SEran Ben Elisha for (tc = 0; tc < priv->max_opened_tc; tc++) 2209145e5637SEran Ben Elisha for (i = 0; i < NUM_PTP_SQ_STATS; i++) 2210145e5637SEran Ben Elisha data[idx++] = 2211b0d35de4SAya Levin MLX5E_READ_CTR64_CPU(&priv->ptp_stats.sq[tc], 2212145e5637SEran Ben Elisha ptp_sq_stats_desc, i); 2213145e5637SEran Ben Elisha 22141880bc4eSEran Ben Elisha for (tc = 0; tc < priv->max_opened_tc; tc++) 22151880bc4eSEran Ben Elisha for (i = 0; i < NUM_PTP_CQ_STATS; i++) 22161880bc4eSEran Ben Elisha data[idx++] = 2217b0d35de4SAya Levin MLX5E_READ_CTR64_CPU(&priv->ptp_stats.cq[tc], 22181880bc4eSEran Ben Elisha ptp_cq_stats_desc, i); 2219a28359e9SAya Levin } 2220a28359e9SAya Levin if (priv->rx_ptp_opened) { 2221a28359e9SAya Levin for (i = 0; i < NUM_PTP_RQ_STATS; i++) 2222a28359e9SAya Levin data[idx++] = 2223a28359e9SAya Levin MLX5E_READ_CTR64_CPU(&priv->ptp_stats.rq, 2224a28359e9SAya Levin ptp_rq_stats_desc, i); 2225a28359e9SAya Levin } 2226145e5637SEran Ben Elisha return idx; 2227145e5637SEran Ben Elisha } 2228145e5637SEran Ben Elisha 2229145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(ptp) { return; } 22301fe85006SKamal Heib 223196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(channels) 22321fe85006SKamal Heib { 22339d758d4aSTariq Toukan int max_nch = priv->stats_nch; 223405909babSEran Ben Elisha 223505909babSEran Ben Elisha return (NUM_RQ_STATS * max_nch) + 223605909babSEran Ben Elisha (NUM_CH_STATS * max_nch) + 2237890388adSTariq Toukan (NUM_SQ_STATS * max_nch * priv->max_opened_tc) + 223858b99ee3STariq Toukan (NUM_RQ_XDPSQ_STATS * max_nch) + 2239db05815bSMaxim Mikityanskiy (NUM_XDPSQ_STATS * max_nch) + 2240db05815bSMaxim Mikityanskiy (NUM_XSKRQ_STATS * max_nch * priv->xsk.ever_used) + 2241db05815bSMaxim Mikityanskiy (NUM_XSKSQ_STATS * max_nch * priv->xsk.ever_used); 22421fe85006SKamal Heib } 22431fe85006SKamal Heib 224496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(channels) 22451fe85006SKamal Heib { 2246db05815bSMaxim Mikityanskiy bool is_xsk = priv->xsk.ever_used; 22479d758d4aSTariq Toukan int max_nch = priv->stats_nch; 22481fe85006SKamal Heib int i, j, tc; 22491fe85006SKamal Heib 225005909babSEran Ben Elisha for (i = 0; i < max_nch; i++) 225157d689a8SEran Ben Elisha for (j = 0; j < NUM_CH_STATS; j++) 225257d689a8SEran Ben Elisha sprintf(data + (idx++) * ETH_GSTRING_LEN, 225357d689a8SEran Ben Elisha ch_stats_desc[j].format, i); 225457d689a8SEran Ben Elisha 2255890388adSTariq Toukan for (i = 0; i < max_nch; i++) { 22561fe85006SKamal Heib for (j = 0; j < NUM_RQ_STATS; j++) 2257890388adSTariq Toukan sprintf(data + (idx++) * ETH_GSTRING_LEN, 2258890388adSTariq Toukan rq_stats_desc[j].format, i); 2259db05815bSMaxim Mikityanskiy for (j = 0; j < NUM_XSKRQ_STATS * is_xsk; j++) 2260db05815bSMaxim Mikityanskiy sprintf(data + (idx++) * ETH_GSTRING_LEN, 2261db05815bSMaxim Mikityanskiy xskrq_stats_desc[j].format, i); 2262890388adSTariq Toukan for (j = 0; j < NUM_RQ_XDPSQ_STATS; j++) 2263890388adSTariq Toukan sprintf(data + (idx++) * ETH_GSTRING_LEN, 2264890388adSTariq Toukan rq_xdpsq_stats_desc[j].format, i); 2265890388adSTariq Toukan } 22661fe85006SKamal Heib 226705909babSEran Ben Elisha for (tc = 0; tc < priv->max_opened_tc; tc++) 226805909babSEran Ben Elisha for (i = 0; i < max_nch; i++) 22691fe85006SKamal Heib for (j = 0; j < NUM_SQ_STATS; j++) 22701fe85006SKamal Heib sprintf(data + (idx++) * ETH_GSTRING_LEN, 22711fe85006SKamal Heib sq_stats_desc[j].format, 2272c55d8b10SEran Ben Elisha i + tc * max_nch); 22731fe85006SKamal Heib 2274db05815bSMaxim Mikityanskiy for (i = 0; i < max_nch; i++) { 2275db05815bSMaxim Mikityanskiy for (j = 0; j < NUM_XSKSQ_STATS * is_xsk; j++) 2276db05815bSMaxim Mikityanskiy sprintf(data + (idx++) * ETH_GSTRING_LEN, 2277db05815bSMaxim Mikityanskiy xsksq_stats_desc[j].format, i); 227858b99ee3STariq Toukan for (j = 0; j < NUM_XDPSQ_STATS; j++) 227958b99ee3STariq Toukan sprintf(data + (idx++) * ETH_GSTRING_LEN, 228058b99ee3STariq Toukan xdpsq_stats_desc[j].format, i); 2281db05815bSMaxim Mikityanskiy } 228258b99ee3STariq Toukan 22831fe85006SKamal Heib return idx; 22841fe85006SKamal Heib } 22851fe85006SKamal Heib 228696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(channels) 22871fe85006SKamal Heib { 2288db05815bSMaxim Mikityanskiy bool is_xsk = priv->xsk.ever_used; 22899d758d4aSTariq Toukan int max_nch = priv->stats_nch; 22901fe85006SKamal Heib int i, j, tc; 22911fe85006SKamal Heib 229205909babSEran Ben Elisha for (i = 0; i < max_nch; i++) 229357d689a8SEran Ben Elisha for (j = 0; j < NUM_CH_STATS; j++) 229457d689a8SEran Ben Elisha data[idx++] = 2295be98737aSTariq Toukan MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->ch, 229657d689a8SEran Ben Elisha ch_stats_desc, j); 229757d689a8SEran Ben Elisha 2298890388adSTariq Toukan for (i = 0; i < max_nch; i++) { 22991fe85006SKamal Heib for (j = 0; j < NUM_RQ_STATS; j++) 23001fe85006SKamal Heib data[idx++] = 2301be98737aSTariq Toukan MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->rq, 23021fe85006SKamal Heib rq_stats_desc, j); 2303db05815bSMaxim Mikityanskiy for (j = 0; j < NUM_XSKRQ_STATS * is_xsk; j++) 2304db05815bSMaxim Mikityanskiy data[idx++] = 2305be98737aSTariq Toukan MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->xskrq, 2306db05815bSMaxim Mikityanskiy xskrq_stats_desc, j); 2307890388adSTariq Toukan for (j = 0; j < NUM_RQ_XDPSQ_STATS; j++) 2308890388adSTariq Toukan data[idx++] = 2309be98737aSTariq Toukan MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->rq_xdpsq, 2310890388adSTariq Toukan rq_xdpsq_stats_desc, j); 2311890388adSTariq Toukan } 23121fe85006SKamal Heib 231305909babSEran Ben Elisha for (tc = 0; tc < priv->max_opened_tc; tc++) 231405909babSEran Ben Elisha for (i = 0; i < max_nch; i++) 23151fe85006SKamal Heib for (j = 0; j < NUM_SQ_STATS; j++) 23161fe85006SKamal Heib data[idx++] = 2317be98737aSTariq Toukan MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->sq[tc], 23181fe85006SKamal Heib sq_stats_desc, j); 23191fe85006SKamal Heib 2320db05815bSMaxim Mikityanskiy for (i = 0; i < max_nch; i++) { 2321db05815bSMaxim Mikityanskiy for (j = 0; j < NUM_XSKSQ_STATS * is_xsk; j++) 2322db05815bSMaxim Mikityanskiy data[idx++] = 2323be98737aSTariq Toukan MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->xsksq, 2324db05815bSMaxim Mikityanskiy xsksq_stats_desc, j); 232558b99ee3STariq Toukan for (j = 0; j < NUM_XDPSQ_STATS; j++) 232658b99ee3STariq Toukan data[idx++] = 2327be98737aSTariq Toukan MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->xdpsq, 232858b99ee3STariq Toukan xdpsq_stats_desc, j); 2329db05815bSMaxim Mikityanskiy } 233058b99ee3STariq Toukan 23311fe85006SKamal Heib return idx; 23321fe85006SKamal Heib } 23331fe85006SKamal Heib 233496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(channels) { return; } 233596b12796SSaeed Mahameed 23362a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(sw, 0); 23372a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(qcnt, MLX5E_NDO_UPDATE_STATS); 23382a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(vnic_env, 0); 23392a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(vport, MLX5E_NDO_UPDATE_STATS); 23402a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(802_3, MLX5E_NDO_UPDATE_STATS); 23412a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(2863, 0); 23422a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(2819, 0); 23432a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(phy, 0); 23442a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(pcie, 0); 23452a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(per_prio, 0); 23462a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(pme, 0); 23472a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(channels, 0); 23482a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(per_port_buff_congest, 0); 23497c453526SVlad Buslov MLX5E_DEFINE_STATS_GRP(eth_ext, 0); 2350f0ff8e8cSSaeed Mahameed static MLX5E_DEFINE_STATS_GRP(tls, 0); 2351145e5637SEran Ben Elisha static MLX5E_DEFINE_STATS_GRP(ptp, 0); 2352214baf22SMaxim Mikityanskiy static MLX5E_DEFINE_STATS_GRP(qos, 0); 2353f0ff8e8cSSaeed Mahameed 235419386177SKamal Heib /* The stats groups order is opposite to the update_stats() order calls */ 2355f0ff8e8cSSaeed Mahameed mlx5e_stats_grp_t mlx5e_nic_stats_grps[] = { 2356f0ff8e8cSSaeed Mahameed &MLX5E_STATS_GRP(sw), 2357f0ff8e8cSSaeed Mahameed &MLX5E_STATS_GRP(qcnt), 2358f0ff8e8cSSaeed Mahameed &MLX5E_STATS_GRP(vnic_env), 2359f0ff8e8cSSaeed Mahameed &MLX5E_STATS_GRP(vport), 2360f0ff8e8cSSaeed Mahameed &MLX5E_STATS_GRP(802_3), 2361f0ff8e8cSSaeed Mahameed &MLX5E_STATS_GRP(2863), 2362f0ff8e8cSSaeed Mahameed &MLX5E_STATS_GRP(2819), 2363f0ff8e8cSSaeed Mahameed &MLX5E_STATS_GRP(phy), 2364f0ff8e8cSSaeed Mahameed &MLX5E_STATS_GRP(eth_ext), 2365f0ff8e8cSSaeed Mahameed &MLX5E_STATS_GRP(pcie), 2366f0ff8e8cSSaeed Mahameed &MLX5E_STATS_GRP(per_prio), 2367f0ff8e8cSSaeed Mahameed &MLX5E_STATS_GRP(pme), 23680aab3e1bSRaed Salem #ifdef CONFIG_MLX5_EN_IPSEC 23690aab3e1bSRaed Salem &MLX5E_STATS_GRP(ipsec_sw), 23700aab3e1bSRaed Salem &MLX5E_STATS_GRP(ipsec_hw), 23710aab3e1bSRaed Salem #endif 2372f0ff8e8cSSaeed Mahameed &MLX5E_STATS_GRP(tls), 2373f0ff8e8cSSaeed Mahameed &MLX5E_STATS_GRP(channels), 2374f0ff8e8cSSaeed Mahameed &MLX5E_STATS_GRP(per_port_buff_congest), 2375145e5637SEran Ben Elisha &MLX5E_STATS_GRP(ptp), 2376214baf22SMaxim Mikityanskiy &MLX5E_STATS_GRP(qos), 2377c0752f2bSKamal Heib }; 2378c0752f2bSKamal Heib 23793460c184SSaeed Mahameed unsigned int mlx5e_nic_stats_grps_num(struct mlx5e_priv *priv) 23803460c184SSaeed Mahameed { 23813460c184SSaeed Mahameed return ARRAY_SIZE(mlx5e_nic_stats_grps); 23823460c184SSaeed Mahameed } 2383