18839c5e2SWei Hu (Xavier) /* SPDX-License-Identifier: BSD-3-Clause
253e6f86cSMin Hu (Connor) * Copyright(c) 2018-2021 HiSilicon Limited.
38839c5e2SWei Hu (Xavier) */
48839c5e2SWei Hu (Xavier)
58839c5e2SWei Hu (Xavier) #include <rte_ethdev.h>
68839c5e2SWei Hu (Xavier) #include <rte_io.h>
78839c5e2SWei Hu (Xavier) #include <rte_malloc.h>
88839c5e2SWei Hu (Xavier)
98839c5e2SWei Hu (Xavier) #include "hns3_ethdev.h"
108839c5e2SWei Hu (Xavier) #include "hns3_rxtx.h"
118839c5e2SWei Hu (Xavier) #include "hns3_logs.h"
124016d76bSChengwen Feng #include "hns3_regs.h"
138839c5e2SWei Hu (Xavier)
1486c551d1SHuisong Li /* The statistics of the per-rxq basic stats */
1586c551d1SHuisong Li static const struct hns3_xstats_name_offset hns3_rxq_basic_stats_strings[] = {
1686c551d1SHuisong Li {"packets",
1786c551d1SHuisong Li HNS3_RXQ_BASIC_STATS_FIELD_OFFSET(packets)},
1886c551d1SHuisong Li {"bytes",
1986c551d1SHuisong Li HNS3_RXQ_BASIC_STATS_FIELD_OFFSET(bytes)},
2086c551d1SHuisong Li {"errors",
2186c551d1SHuisong Li HNS3_RXQ_BASIC_STATS_FIELD_OFFSET(errors)}
2286c551d1SHuisong Li };
2386c551d1SHuisong Li
2486c551d1SHuisong Li /* The statistics of the per-txq basic stats */
2586c551d1SHuisong Li static const struct hns3_xstats_name_offset hns3_txq_basic_stats_strings[] = {
2686c551d1SHuisong Li {"packets",
2786c551d1SHuisong Li HNS3_TXQ_BASIC_STATS_FIELD_OFFSET(packets)},
2886c551d1SHuisong Li {"bytes",
2986c551d1SHuisong Li HNS3_TXQ_BASIC_STATS_FIELD_OFFSET(bytes)}
3086c551d1SHuisong Li };
3186c551d1SHuisong Li
328839c5e2SWei Hu (Xavier) /* MAC statistics */
338839c5e2SWei Hu (Xavier) static const struct hns3_xstats_name_offset hns3_mac_strings[] = {
348839c5e2SWei Hu (Xavier) {"mac_tx_mac_pause_num",
358839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_mac_pause_num)},
368839c5e2SWei Hu (Xavier) {"mac_rx_mac_pause_num",
378839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_mac_pause_num)},
388839c5e2SWei Hu (Xavier) {"mac_tx_control_pkt_num",
398839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_ctrl_pkt_num)},
408839c5e2SWei Hu (Xavier) {"mac_rx_control_pkt_num",
418839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_ctrl_pkt_num)},
428839c5e2SWei Hu (Xavier) {"mac_tx_pfc_pkt_num",
438839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_pfc_pause_pkt_num)},
448839c5e2SWei Hu (Xavier) {"mac_tx_pfc_pri0_pkt_num",
458839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_pfc_pri0_pkt_num)},
468839c5e2SWei Hu (Xavier) {"mac_tx_pfc_pri1_pkt_num",
478839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_pfc_pri1_pkt_num)},
488839c5e2SWei Hu (Xavier) {"mac_tx_pfc_pri2_pkt_num",
498839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_pfc_pri2_pkt_num)},
508839c5e2SWei Hu (Xavier) {"mac_tx_pfc_pri3_pkt_num",
518839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_pfc_pri3_pkt_num)},
528839c5e2SWei Hu (Xavier) {"mac_tx_pfc_pri4_pkt_num",
538839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_pfc_pri4_pkt_num)},
548839c5e2SWei Hu (Xavier) {"mac_tx_pfc_pri5_pkt_num",
558839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_pfc_pri5_pkt_num)},
568839c5e2SWei Hu (Xavier) {"mac_tx_pfc_pri6_pkt_num",
578839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_pfc_pri6_pkt_num)},
588839c5e2SWei Hu (Xavier) {"mac_tx_pfc_pri7_pkt_num",
598839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_pfc_pri7_pkt_num)},
608839c5e2SWei Hu (Xavier) {"mac_rx_pfc_pkt_num",
618839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_pfc_pause_pkt_num)},
628839c5e2SWei Hu (Xavier) {"mac_rx_pfc_pri0_pkt_num",
638839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_pfc_pri0_pkt_num)},
648839c5e2SWei Hu (Xavier) {"mac_rx_pfc_pri1_pkt_num",
658839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_pfc_pri1_pkt_num)},
668839c5e2SWei Hu (Xavier) {"mac_rx_pfc_pri2_pkt_num",
678839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_pfc_pri2_pkt_num)},
688839c5e2SWei Hu (Xavier) {"mac_rx_pfc_pri3_pkt_num",
698839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_pfc_pri3_pkt_num)},
708839c5e2SWei Hu (Xavier) {"mac_rx_pfc_pri4_pkt_num",
718839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_pfc_pri4_pkt_num)},
728839c5e2SWei Hu (Xavier) {"mac_rx_pfc_pri5_pkt_num",
738839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_pfc_pri5_pkt_num)},
748839c5e2SWei Hu (Xavier) {"mac_rx_pfc_pri6_pkt_num",
758839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_pfc_pri6_pkt_num)},
768839c5e2SWei Hu (Xavier) {"mac_rx_pfc_pri7_pkt_num",
778839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_pfc_pri7_pkt_num)},
788839c5e2SWei Hu (Xavier) {"mac_tx_total_pkt_num",
798839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_total_pkt_num)},
808839c5e2SWei Hu (Xavier) {"mac_tx_total_oct_num",
818839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_total_oct_num)},
828839c5e2SWei Hu (Xavier) {"mac_tx_good_pkt_num",
838839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_good_pkt_num)},
848839c5e2SWei Hu (Xavier) {"mac_tx_bad_pkt_num",
858839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_bad_pkt_num)},
868839c5e2SWei Hu (Xavier) {"mac_tx_good_oct_num",
878839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_good_oct_num)},
888839c5e2SWei Hu (Xavier) {"mac_tx_bad_oct_num",
898839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_bad_oct_num)},
908839c5e2SWei Hu (Xavier) {"mac_tx_uni_pkt_num",
918839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_uni_pkt_num)},
928839c5e2SWei Hu (Xavier) {"mac_tx_multi_pkt_num",
938839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_multi_pkt_num)},
948839c5e2SWei Hu (Xavier) {"mac_tx_broad_pkt_num",
958839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_broad_pkt_num)},
968839c5e2SWei Hu (Xavier) {"mac_tx_undersize_pkt_num",
978839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_undersize_pkt_num)},
988839c5e2SWei Hu (Xavier) {"mac_tx_oversize_pkt_num",
998839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_oversize_pkt_num)},
1008839c5e2SWei Hu (Xavier) {"mac_tx_64_oct_pkt_num",
1018839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_64_oct_pkt_num)},
1028839c5e2SWei Hu (Xavier) {"mac_tx_65_127_oct_pkt_num",
1038839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_65_127_oct_pkt_num)},
1048839c5e2SWei Hu (Xavier) {"mac_tx_128_255_oct_pkt_num",
1058839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_128_255_oct_pkt_num)},
1068839c5e2SWei Hu (Xavier) {"mac_tx_256_511_oct_pkt_num",
1078839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_256_511_oct_pkt_num)},
1088839c5e2SWei Hu (Xavier) {"mac_tx_512_1023_oct_pkt_num",
1098839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_512_1023_oct_pkt_num)},
1108839c5e2SWei Hu (Xavier) {"mac_tx_1024_1518_oct_pkt_num",
1118839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_1024_1518_oct_pkt_num)},
1128839c5e2SWei Hu (Xavier) {"mac_tx_1519_2047_oct_pkt_num",
1138839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_1519_2047_oct_pkt_num)},
1148839c5e2SWei Hu (Xavier) {"mac_tx_2048_4095_oct_pkt_num",
1158839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_2048_4095_oct_pkt_num)},
1168839c5e2SWei Hu (Xavier) {"mac_tx_4096_8191_oct_pkt_num",
1178839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_4096_8191_oct_pkt_num)},
1188839c5e2SWei Hu (Xavier) {"mac_tx_8192_9216_oct_pkt_num",
1198839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_8192_9216_oct_pkt_num)},
1208839c5e2SWei Hu (Xavier) {"mac_tx_9217_12287_oct_pkt_num",
1218839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_9217_12287_oct_pkt_num)},
1228839c5e2SWei Hu (Xavier) {"mac_tx_12288_16383_oct_pkt_num",
1238839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_12288_16383_oct_pkt_num)},
1248839c5e2SWei Hu (Xavier) {"mac_tx_1519_max_good_pkt_num",
1258839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_1519_max_good_oct_pkt_num)},
1268839c5e2SWei Hu (Xavier) {"mac_tx_1519_max_bad_pkt_num",
1278839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_1519_max_bad_oct_pkt_num)},
1288839c5e2SWei Hu (Xavier) {"mac_rx_total_pkt_num",
1298839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_total_pkt_num)},
1308839c5e2SWei Hu (Xavier) {"mac_rx_total_oct_num",
1318839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_total_oct_num)},
1328839c5e2SWei Hu (Xavier) {"mac_rx_good_pkt_num",
1338839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_good_pkt_num)},
1348839c5e2SWei Hu (Xavier) {"mac_rx_bad_pkt_num",
1358839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_bad_pkt_num)},
1368839c5e2SWei Hu (Xavier) {"mac_rx_good_oct_num",
1378839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_good_oct_num)},
1388839c5e2SWei Hu (Xavier) {"mac_rx_bad_oct_num",
1398839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_bad_oct_num)},
1408839c5e2SWei Hu (Xavier) {"mac_rx_uni_pkt_num",
1418839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_uni_pkt_num)},
1428839c5e2SWei Hu (Xavier) {"mac_rx_multi_pkt_num",
1438839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_multi_pkt_num)},
1448839c5e2SWei Hu (Xavier) {"mac_rx_broad_pkt_num",
1458839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_broad_pkt_num)},
1468839c5e2SWei Hu (Xavier) {"mac_rx_undersize_pkt_num",
1478839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_undersize_pkt_num)},
1488839c5e2SWei Hu (Xavier) {"mac_rx_oversize_pkt_num",
1498839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_oversize_pkt_num)},
1508839c5e2SWei Hu (Xavier) {"mac_rx_64_oct_pkt_num",
1518839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_64_oct_pkt_num)},
1528839c5e2SWei Hu (Xavier) {"mac_rx_65_127_oct_pkt_num",
1538839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_65_127_oct_pkt_num)},
1548839c5e2SWei Hu (Xavier) {"mac_rx_128_255_oct_pkt_num",
1558839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_128_255_oct_pkt_num)},
1568839c5e2SWei Hu (Xavier) {"mac_rx_256_511_oct_pkt_num",
1578839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_256_511_oct_pkt_num)},
1588839c5e2SWei Hu (Xavier) {"mac_rx_512_1023_oct_pkt_num",
1598839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_512_1023_oct_pkt_num)},
1608839c5e2SWei Hu (Xavier) {"mac_rx_1024_1518_oct_pkt_num",
1618839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_1024_1518_oct_pkt_num)},
1628839c5e2SWei Hu (Xavier) {"mac_rx_1519_2047_oct_pkt_num",
1638839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_1519_2047_oct_pkt_num)},
1648839c5e2SWei Hu (Xavier) {"mac_rx_2048_4095_oct_pkt_num",
1658839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_2048_4095_oct_pkt_num)},
1668839c5e2SWei Hu (Xavier) {"mac_rx_4096_8191_oct_pkt_num",
1678839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_4096_8191_oct_pkt_num)},
1688839c5e2SWei Hu (Xavier) {"mac_rx_8192_9216_oct_pkt_num",
1698839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_8192_9216_oct_pkt_num)},
1708839c5e2SWei Hu (Xavier) {"mac_rx_9217_12287_oct_pkt_num",
1718839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_9217_12287_oct_pkt_num)},
1728839c5e2SWei Hu (Xavier) {"mac_rx_12288_16383_oct_pkt_num",
1738839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_12288_16383_oct_pkt_num)},
1748839c5e2SWei Hu (Xavier) {"mac_rx_1519_max_good_pkt_num",
1758839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_1519_max_good_oct_pkt_num)},
1768839c5e2SWei Hu (Xavier) {"mac_rx_1519_max_bad_pkt_num",
1778839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_1519_max_bad_oct_pkt_num)},
1788839c5e2SWei Hu (Xavier) {"mac_tx_fragment_pkt_num",
1798839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_fragment_pkt_num)},
1808839c5e2SWei Hu (Xavier) {"mac_tx_undermin_pkt_num",
1818839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_undermin_pkt_num)},
1828839c5e2SWei Hu (Xavier) {"mac_tx_jabber_pkt_num",
1838839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_jabber_pkt_num)},
1848839c5e2SWei Hu (Xavier) {"mac_tx_err_all_pkt_num",
1858839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_err_all_pkt_num)},
1868839c5e2SWei Hu (Xavier) {"mac_tx_from_app_good_pkt_num",
1878839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_from_app_good_pkt_num)},
1888839c5e2SWei Hu (Xavier) {"mac_tx_from_app_bad_pkt_num",
1898839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_tx_from_app_bad_pkt_num)},
1908839c5e2SWei Hu (Xavier) {"mac_rx_fragment_pkt_num",
1918839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_fragment_pkt_num)},
1928839c5e2SWei Hu (Xavier) {"mac_rx_undermin_pkt_num",
1938839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_undermin_pkt_num)},
1948839c5e2SWei Hu (Xavier) {"mac_rx_jabber_pkt_num",
1958839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_jabber_pkt_num)},
1968839c5e2SWei Hu (Xavier) {"mac_rx_fcs_err_pkt_num",
1978839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_fcs_err_pkt_num)},
1988839c5e2SWei Hu (Xavier) {"mac_rx_send_app_good_pkt_num",
1998839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_send_app_good_pkt_num)},
2008839c5e2SWei Hu (Xavier) {"mac_rx_send_app_bad_pkt_num",
2018839c5e2SWei Hu (Xavier) HNS3_MAC_STATS_OFFSET(mac_rx_send_app_bad_pkt_num)}
2028839c5e2SWei Hu (Xavier) };
2038839c5e2SWei Hu (Xavier)
2048839c5e2SWei Hu (Xavier) /* The statistic of reset */
2058839c5e2SWei Hu (Xavier) static const struct hns3_xstats_name_offset hns3_reset_stats_strings[] = {
2068839c5e2SWei Hu (Xavier) {"REQ_RESET_CNT",
2078839c5e2SWei Hu (Xavier) HNS3_RESET_STATS_FIELD_OFFSET(request_cnt)},
2088839c5e2SWei Hu (Xavier) {"GLOBAL_RESET_CNT",
2098839c5e2SWei Hu (Xavier) HNS3_RESET_STATS_FIELD_OFFSET(global_cnt)},
2108839c5e2SWei Hu (Xavier) {"IMP_RESET_CNT",
2118839c5e2SWei Hu (Xavier) HNS3_RESET_STATS_FIELD_OFFSET(imp_cnt)},
2128839c5e2SWei Hu (Xavier) {"RESET_EXEC_CNT",
2138839c5e2SWei Hu (Xavier) HNS3_RESET_STATS_FIELD_OFFSET(exec_cnt)},
2148839c5e2SWei Hu (Xavier) {"RESET_SUCCESS_CNT",
2158839c5e2SWei Hu (Xavier) HNS3_RESET_STATS_FIELD_OFFSET(success_cnt)},
2168839c5e2SWei Hu (Xavier) {"RESET_FAIL_CNT",
2178839c5e2SWei Hu (Xavier) HNS3_RESET_STATS_FIELD_OFFSET(fail_cnt)},
2188839c5e2SWei Hu (Xavier) {"RESET_MERGE_CNT",
2198839c5e2SWei Hu (Xavier) HNS3_RESET_STATS_FIELD_OFFSET(merge_cnt)}
2208839c5e2SWei Hu (Xavier) };
2218839c5e2SWei Hu (Xavier)
2228839c5e2SWei Hu (Xavier) /* The statistic of errors in Rx BD */
2238839c5e2SWei Hu (Xavier) static const struct hns3_xstats_name_offset hns3_rx_bd_error_strings[] = {
2249b77f1feSHuisong Li {"PKT_LEN_ERRORS",
2258839c5e2SWei Hu (Xavier) HNS3_RX_BD_ERROR_STATS_FIELD_OFFSET(pkt_len_errors)},
2269b77f1feSHuisong Li {"L2_ERRORS",
2279b77f1feSHuisong Li HNS3_RX_BD_ERROR_STATS_FIELD_OFFSET(l2_errors)}
2288839c5e2SWei Hu (Xavier) };
2298839c5e2SWei Hu (Xavier)
2309b77f1feSHuisong Li /* The dfx statistic in Rx datapath */
2319b77f1feSHuisong Li static const struct hns3_xstats_name_offset hns3_rxq_dfx_stats_strings[] = {
2329b77f1feSHuisong Li {"L3_CHECKSUM_ERRORS",
2339b77f1feSHuisong Li HNS3_RXQ_DFX_STATS_FIELD_OFFSET(l3_csum_errors)},
2349b77f1feSHuisong Li {"L4_CHECKSUM_ERRORS",
2359b77f1feSHuisong Li HNS3_RXQ_DFX_STATS_FIELD_OFFSET(l4_csum_errors)},
2369b77f1feSHuisong Li {"OL3_CHECKSUM_ERRORS",
2379b77f1feSHuisong Li HNS3_RXQ_DFX_STATS_FIELD_OFFSET(ol3_csum_errors)},
2389b77f1feSHuisong Li {"OL4_CHECKSUM_ERRORS",
2399b77f1feSHuisong Li HNS3_RXQ_DFX_STATS_FIELD_OFFSET(ol4_csum_errors)}
2409b77f1feSHuisong Li };
2419b77f1feSHuisong Li
2429b77f1feSHuisong Li /* The dfx statistic in Tx datapath */
2439b77f1feSHuisong Li static const struct hns3_xstats_name_offset hns3_txq_dfx_stats_strings[] = {
2449b77f1feSHuisong Li {"OVER_LENGTH_PKT_CNT",
2459b77f1feSHuisong Li HNS3_TXQ_DFX_STATS_FIELD_OFFSET(over_length_pkt_cnt)},
2469b77f1feSHuisong Li {"EXCEED_LIMITED_BD_PKT_CNT",
2479b77f1feSHuisong Li HNS3_TXQ_DFX_STATS_FIELD_OFFSET(exceed_limit_bd_pkt_cnt)},
2489b77f1feSHuisong Li {"EXCEED_LIMITED_BD_PKT_REASSEMBLE_FAIL_CNT",
2499b77f1feSHuisong Li HNS3_TXQ_DFX_STATS_FIELD_OFFSET(exceed_limit_bd_reassem_fail)},
2509b77f1feSHuisong Li {"UNSUPPORTED_TUNNEL_PKT_CNT",
2519b77f1feSHuisong Li HNS3_TXQ_DFX_STATS_FIELD_OFFSET(unsupported_tunnel_pkt_cnt)},
2529b77f1feSHuisong Li {"QUEUE_FULL_CNT",
2539b77f1feSHuisong Li HNS3_TXQ_DFX_STATS_FIELD_OFFSET(queue_full_cnt)},
2549b77f1feSHuisong Li {"SHORT_PKT_PAD_FAIL_CNT",
2559b77f1feSHuisong Li HNS3_TXQ_DFX_STATS_FIELD_OFFSET(pkt_padding_fail_cnt)}
256c4b7d676SWei Hu (Xavier) };
257c4b7d676SWei Hu (Xavier)
2584016d76bSChengwen Feng /* The statistic of rx queue */
2594016d76bSChengwen Feng static const struct hns3_xstats_name_offset hns3_rx_queue_strings[] = {
2604016d76bSChengwen Feng {"RX_QUEUE_FBD", HNS3_RING_RX_FBDNUM_REG}
2614016d76bSChengwen Feng };
2624016d76bSChengwen Feng
2634016d76bSChengwen Feng /* The statistic of tx queue */
2644016d76bSChengwen Feng static const struct hns3_xstats_name_offset hns3_tx_queue_strings[] = {
2654016d76bSChengwen Feng {"TX_QUEUE_FBD", HNS3_RING_TX_FBDNUM_REG}
2664016d76bSChengwen Feng };
2674016d76bSChengwen Feng
2683e9f3042SMin Hu (Connor) /* The statistic of imissed packet */
2693e9f3042SMin Hu (Connor) static const struct hns3_xstats_name_offset hns3_imissed_stats_strings[] = {
2703e9f3042SMin Hu (Connor) {"RPU_DROP_CNT",
2713e9f3042SMin Hu (Connor) HNS3_IMISSED_STATS_FIELD_OFFSET(rpu_rx_drop_cnt)},
2720f10bd6bSMin Hu (Connor) {"SSU_DROP_CNT",
2730f10bd6bSMin Hu (Connor) HNS3_IMISSED_STATS_FIELD_OFFSET(ssu_rx_drop_cnt)},
2743e9f3042SMin Hu (Connor) };
2753e9f3042SMin Hu (Connor)
2768839c5e2SWei Hu (Xavier) #define HNS3_NUM_MAC_STATS (sizeof(hns3_mac_strings) / \
2778839c5e2SWei Hu (Xavier) sizeof(hns3_mac_strings[0]))
2788839c5e2SWei Hu (Xavier)
2798839c5e2SWei Hu (Xavier) #define HNS3_NUM_RESET_XSTATS (sizeof(hns3_reset_stats_strings) / \
2808839c5e2SWei Hu (Xavier) sizeof(hns3_reset_stats_strings[0]))
2818839c5e2SWei Hu (Xavier)
2828839c5e2SWei Hu (Xavier) #define HNS3_NUM_RX_BD_ERROR_XSTATS (sizeof(hns3_rx_bd_error_strings) / \
2838839c5e2SWei Hu (Xavier) sizeof(hns3_rx_bd_error_strings[0]))
2848839c5e2SWei Hu (Xavier)
2859b77f1feSHuisong Li #define HNS3_NUM_RXQ_DFX_XSTATS (sizeof(hns3_rxq_dfx_stats_strings) / \
2869b77f1feSHuisong Li sizeof(hns3_rxq_dfx_stats_strings[0]))
2879b77f1feSHuisong Li
2889b77f1feSHuisong Li #define HNS3_NUM_TXQ_DFX_XSTATS (sizeof(hns3_txq_dfx_stats_strings) / \
2899b77f1feSHuisong Li sizeof(hns3_txq_dfx_stats_strings[0]))
290c4b7d676SWei Hu (Xavier)
2914016d76bSChengwen Feng #define HNS3_NUM_RX_QUEUE_STATS (sizeof(hns3_rx_queue_strings) / \
2924016d76bSChengwen Feng sizeof(hns3_rx_queue_strings[0]))
2934016d76bSChengwen Feng
2944016d76bSChengwen Feng #define HNS3_NUM_TX_QUEUE_STATS (sizeof(hns3_tx_queue_strings) / \
2954016d76bSChengwen Feng sizeof(hns3_tx_queue_strings[0]))
2964016d76bSChengwen Feng
29786c551d1SHuisong Li #define HNS3_NUM_RXQ_BASIC_STATS (sizeof(hns3_rxq_basic_stats_strings) / \
29886c551d1SHuisong Li sizeof(hns3_rxq_basic_stats_strings[0]))
29986c551d1SHuisong Li
30086c551d1SHuisong Li #define HNS3_NUM_TXQ_BASIC_STATS (sizeof(hns3_txq_basic_stats_strings) / \
30186c551d1SHuisong Li sizeof(hns3_txq_basic_stats_strings[0]))
30286c551d1SHuisong Li
3033e9f3042SMin Hu (Connor) #define HNS3_NUM_IMISSED_XSTATS (sizeof(hns3_imissed_stats_strings) / \
3043e9f3042SMin Hu (Connor) sizeof(hns3_imissed_stats_strings[0]))
3053e9f3042SMin Hu (Connor)
3060f10bd6bSMin Hu (Connor) #define HNS3_FIX_NUM_STATS (HNS3_NUM_MAC_STATS + HNS3_NUM_RESET_XSTATS)
3078839c5e2SWei Hu (Xavier)
30876d79456SWei Hu (Xavier) static void hns3_tqp_stats_clear(struct hns3_hw *hw);
30976d79456SWei Hu (Xavier)
3108839c5e2SWei Hu (Xavier) static int
hns3_update_mac_stats(struct hns3_hw * hw)3116ee07e3cSHuisong Li hns3_update_mac_stats(struct hns3_hw *hw)
3128839c5e2SWei Hu (Xavier) {
3136ee07e3cSHuisong Li #define HNS3_MAC_STATS_REG_NUM_PER_DESC 4
3146ee07e3cSHuisong Li
3158839c5e2SWei Hu (Xavier) uint64_t *data = (uint64_t *)(&hw->mac_stats);
3168839c5e2SWei Hu (Xavier) struct hns3_cmd_desc *desc;
3176ee07e3cSHuisong Li uint32_t stats_iterms;
3188839c5e2SWei Hu (Xavier) uint64_t *desc_data;
3196ee07e3cSHuisong Li uint32_t desc_num;
3201bbac878SDengdui Huang uint32_t i;
3218839c5e2SWei Hu (Xavier) int ret;
3228839c5e2SWei Hu (Xavier)
3236ee07e3cSHuisong Li /* The first desc has a 64-bit header, so need to consider it. */
3246ee07e3cSHuisong Li desc_num = hw->mac_stats_reg_num / HNS3_MAC_STATS_REG_NUM_PER_DESC + 1;
3258839c5e2SWei Hu (Xavier) desc = rte_malloc("hns3_mac_desc",
3268839c5e2SWei Hu (Xavier) desc_num * sizeof(struct hns3_cmd_desc), 0);
3278839c5e2SWei Hu (Xavier) if (desc == NULL) {
3288839c5e2SWei Hu (Xavier) hns3_err(hw, "Mac_update_stats alloced desc malloc fail");
3298839c5e2SWei Hu (Xavier) return -ENOMEM;
3308839c5e2SWei Hu (Xavier) }
3318839c5e2SWei Hu (Xavier)
3328839c5e2SWei Hu (Xavier) hns3_cmd_setup_basic_desc(desc, HNS3_OPC_STATS_MAC_ALL, true);
3338839c5e2SWei Hu (Xavier) ret = hns3_cmd_send(hw, desc, desc_num);
3348839c5e2SWei Hu (Xavier) if (ret) {
3358839c5e2SWei Hu (Xavier) hns3_err(hw, "Update complete MAC pkt stats fail : %d", ret);
3368839c5e2SWei Hu (Xavier) rte_free(desc);
3378839c5e2SWei Hu (Xavier) return ret;
3388839c5e2SWei Hu (Xavier) }
3398839c5e2SWei Hu (Xavier)
3406ee07e3cSHuisong Li stats_iterms = RTE_MIN(sizeof(hw->mac_stats) / sizeof(uint64_t),
3416ee07e3cSHuisong Li hw->mac_stats_reg_num);
3426ee07e3cSHuisong Li desc_data = (uint64_t *)(&desc[0].data[0]);
3436ee07e3cSHuisong Li for (i = 0; i < stats_iterms; i++) {
3446ee07e3cSHuisong Li /*
3456ee07e3cSHuisong Li * Data memory is continuous and only the first descriptor has a
3466ee07e3cSHuisong Li * header in this command.
3476ee07e3cSHuisong Li */
3488839c5e2SWei Hu (Xavier) *data += rte_le_to_cpu_64(*desc_data);
3498839c5e2SWei Hu (Xavier) data++;
3508839c5e2SWei Hu (Xavier) desc_data++;
3518839c5e2SWei Hu (Xavier) }
3528839c5e2SWei Hu (Xavier) rte_free(desc);
3538839c5e2SWei Hu (Xavier)
3548839c5e2SWei Hu (Xavier) return 0;
3558839c5e2SWei Hu (Xavier) }
3568839c5e2SWei Hu (Xavier)
3578839c5e2SWei Hu (Xavier) static int
hns3_mac_query_reg_num(struct hns3_hw * hw,uint32_t * reg_num)3586ee07e3cSHuisong Li hns3_mac_query_reg_num(struct hns3_hw *hw, uint32_t *reg_num)
3598839c5e2SWei Hu (Xavier) {
3606ee07e3cSHuisong Li #define HNS3_MAC_STATS_RSV_REG_NUM_ON_HIP08_B 3
3618839c5e2SWei Hu (Xavier) struct hns3_cmd_desc desc;
3628839c5e2SWei Hu (Xavier) int ret;
3638839c5e2SWei Hu (Xavier)
3648839c5e2SWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_QUERY_MAC_REG_NUM, true);
3658839c5e2SWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc, 1);
3666ee07e3cSHuisong Li if (ret) {
3676ee07e3cSHuisong Li hns3_err(hw, "failed to query MAC statistic reg number, ret = %d",
3686ee07e3cSHuisong Li ret);
3696ee07e3cSHuisong Li return ret;
3706ee07e3cSHuisong Li }
3716ee07e3cSHuisong Li
3726ee07e3cSHuisong Li /* The number of MAC statistics registers are provided by firmware. */
3736ee07e3cSHuisong Li *reg_num = rte_le_to_cpu_32(desc.data[0]);
3746ee07e3cSHuisong Li if (*reg_num == 0) {
3756ee07e3cSHuisong Li hns3_err(hw, "MAC statistic reg number is invalid!");
3766ee07e3cSHuisong Li return -ENODATA;
3776ee07e3cSHuisong Li }
3786ee07e3cSHuisong Li
3796ee07e3cSHuisong Li /*
3806ee07e3cSHuisong Li * If driver doesn't request the firmware to report more MAC statistics
3816ee07e3cSHuisong Li * iterms and the total number of MAC statistics registers by using new
3826ee07e3cSHuisong Li * method, firmware will only reports the number of valid statistics
3836ee07e3cSHuisong Li * registers. However, structure hns3_mac_stats in driver contains valid
3846ee07e3cSHuisong Li * and reserved statistics iterms. In this case, the total register
3856ee07e3cSHuisong Li * number must be added to three reserved statistics registers.
3866ee07e3cSHuisong Li */
3876ee07e3cSHuisong Li *reg_num += HNS3_MAC_STATS_RSV_REG_NUM_ON_HIP08_B;
3886ee07e3cSHuisong Li
3896ee07e3cSHuisong Li return 0;
3906ee07e3cSHuisong Li }
3916ee07e3cSHuisong Li
3926ee07e3cSHuisong Li int
hns3_query_mac_stats_reg_num(struct hns3_hw * hw)3936ee07e3cSHuisong Li hns3_query_mac_stats_reg_num(struct hns3_hw *hw)
3946ee07e3cSHuisong Li {
3956ee07e3cSHuisong Li uint32_t mac_stats_reg_num = 0;
3966ee07e3cSHuisong Li int ret;
3976ee07e3cSHuisong Li
3986ee07e3cSHuisong Li ret = hns3_mac_query_reg_num(hw, &mac_stats_reg_num);
3998839c5e2SWei Hu (Xavier) if (ret)
4008839c5e2SWei Hu (Xavier) return ret;
4018839c5e2SWei Hu (Xavier)
4026ee07e3cSHuisong Li hw->mac_stats_reg_num = mac_stats_reg_num;
4036ee07e3cSHuisong Li if (hw->mac_stats_reg_num > sizeof(hw->mac_stats) / sizeof(uint64_t))
4046ee07e3cSHuisong Li hns3_warn(hw, "MAC stats reg number from firmware is greater than stats iterms in driver.");
4058839c5e2SWei Hu (Xavier)
4068839c5e2SWei Hu (Xavier) return 0;
4078839c5e2SWei Hu (Xavier) }
4088839c5e2SWei Hu (Xavier)
4098839c5e2SWei Hu (Xavier) static int
hns3_update_port_rpu_drop_stats(struct hns3_hw * hw)4100f10bd6bSMin Hu (Connor) hns3_update_port_rpu_drop_stats(struct hns3_hw *hw)
4113e9f3042SMin Hu (Connor) {
4123e9f3042SMin Hu (Connor) struct hns3_rx_missed_stats *stats = &hw->imissed_stats;
4133e9f3042SMin Hu (Connor) struct hns3_query_rpu_cmd *req;
4143e9f3042SMin Hu (Connor) struct hns3_cmd_desc desc;
4153e9f3042SMin Hu (Connor) uint64_t cnt;
4163e9f3042SMin Hu (Connor) uint32_t tc_num;
4173e9f3042SMin Hu (Connor) int ret;
4183e9f3042SMin Hu (Connor)
4193e9f3042SMin Hu (Connor) hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_DFX_RPU_REG_0, true);
4203e9f3042SMin Hu (Connor) req = (struct hns3_query_rpu_cmd *)desc.data;
4213e9f3042SMin Hu (Connor)
4223e9f3042SMin Hu (Connor) /*
4233e9f3042SMin Hu (Connor) * tc_num is 0, means rpu stats of all TC channels will be
4243e9f3042SMin Hu (Connor) * get from firmware
4253e9f3042SMin Hu (Connor) */
4263e9f3042SMin Hu (Connor) tc_num = 0;
4273e9f3042SMin Hu (Connor) req->tc_queue_num = rte_cpu_to_le_32(tc_num);
4283e9f3042SMin Hu (Connor) ret = hns3_cmd_send(hw, &desc, 1);
4293e9f3042SMin Hu (Connor) if (ret) {
4303e9f3042SMin Hu (Connor) hns3_err(hw, "failed to query RPU stats: %d", ret);
4313e9f3042SMin Hu (Connor) return ret;
4323e9f3042SMin Hu (Connor) }
4333e9f3042SMin Hu (Connor)
4343e9f3042SMin Hu (Connor) cnt = rte_le_to_cpu_32(req->rpu_rx_pkt_drop_cnt);
4353e9f3042SMin Hu (Connor) stats->rpu_rx_drop_cnt += cnt;
4363e9f3042SMin Hu (Connor)
4373e9f3042SMin Hu (Connor) return 0;
4383e9f3042SMin Hu (Connor) }
4393e9f3042SMin Hu (Connor)
4400f10bd6bSMin Hu (Connor) static void
hns3_update_function_rpu_drop_stats(struct hns3_hw * hw)4410f10bd6bSMin Hu (Connor) hns3_update_function_rpu_drop_stats(struct hns3_hw *hw)
4420f10bd6bSMin Hu (Connor) {
4430f10bd6bSMin Hu (Connor) struct hns3_rx_missed_stats *stats = &hw->imissed_stats;
4440f10bd6bSMin Hu (Connor)
4450f10bd6bSMin Hu (Connor) stats->rpu_rx_drop_cnt += hns3_read_dev(hw, HNS3_RPU_DROP_CNT_REG);
4460f10bd6bSMin Hu (Connor) }
4470f10bd6bSMin Hu (Connor)
4480f10bd6bSMin Hu (Connor) static int
hns3_update_rpu_drop_stats(struct hns3_hw * hw)4490f10bd6bSMin Hu (Connor) hns3_update_rpu_drop_stats(struct hns3_hw *hw)
4500f10bd6bSMin Hu (Connor) {
4510f10bd6bSMin Hu (Connor) struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw);
4520f10bd6bSMin Hu (Connor) int ret = 0;
4530f10bd6bSMin Hu (Connor)
4540f10bd6bSMin Hu (Connor) if (hw->drop_stats_mode == HNS3_PKTS_DROP_STATS_MODE1 && !hns->is_vf)
4550f10bd6bSMin Hu (Connor) ret = hns3_update_port_rpu_drop_stats(hw);
4560f10bd6bSMin Hu (Connor) else if (hw->drop_stats_mode == HNS3_PKTS_DROP_STATS_MODE2)
4570f10bd6bSMin Hu (Connor) hns3_update_function_rpu_drop_stats(hw);
4580f10bd6bSMin Hu (Connor)
4590f10bd6bSMin Hu (Connor) return ret;
4600f10bd6bSMin Hu (Connor) }
4610f10bd6bSMin Hu (Connor)
4620f10bd6bSMin Hu (Connor) static int
hns3_get_ssu_drop_stats(struct hns3_hw * hw,struct hns3_cmd_desc * desc,int bd_num,bool is_rx)4630f10bd6bSMin Hu (Connor) hns3_get_ssu_drop_stats(struct hns3_hw *hw, struct hns3_cmd_desc *desc,
4640f10bd6bSMin Hu (Connor) int bd_num, bool is_rx)
4650f10bd6bSMin Hu (Connor) {
4660f10bd6bSMin Hu (Connor) struct hns3_query_ssu_cmd *req;
4670f10bd6bSMin Hu (Connor) int ret;
4680f10bd6bSMin Hu (Connor) int i;
4690f10bd6bSMin Hu (Connor)
4700f10bd6bSMin Hu (Connor) for (i = 0; i < bd_num - 1; i++) {
4710f10bd6bSMin Hu (Connor) hns3_cmd_setup_basic_desc(&desc[i],
4720f10bd6bSMin Hu (Connor) HNS3_OPC_SSU_DROP_REG, true);
4730f10bd6bSMin Hu (Connor) desc[i].flag |= rte_cpu_to_le_16(HNS3_CMD_FLAG_NEXT);
4740f10bd6bSMin Hu (Connor) }
4750f10bd6bSMin Hu (Connor) hns3_cmd_setup_basic_desc(&desc[i], HNS3_OPC_SSU_DROP_REG, true);
4760f10bd6bSMin Hu (Connor) req = (struct hns3_query_ssu_cmd *)desc[0].data;
4770f10bd6bSMin Hu (Connor) req->rxtx = is_rx ? 0 : 1;
4780f10bd6bSMin Hu (Connor) ret = hns3_cmd_send(hw, desc, bd_num);
4790f10bd6bSMin Hu (Connor)
4800f10bd6bSMin Hu (Connor) return ret;
4810f10bd6bSMin Hu (Connor) }
4820f10bd6bSMin Hu (Connor)
4830f10bd6bSMin Hu (Connor) static int
hns3_update_port_rx_ssu_drop_stats(struct hns3_hw * hw)4840f10bd6bSMin Hu (Connor) hns3_update_port_rx_ssu_drop_stats(struct hns3_hw *hw)
4850f10bd6bSMin Hu (Connor) {
4860f10bd6bSMin Hu (Connor) struct hns3_rx_missed_stats *stats = &hw->imissed_stats;
4870f10bd6bSMin Hu (Connor) struct hns3_cmd_desc desc[HNS3_OPC_SSU_DROP_REG_NUM];
4880f10bd6bSMin Hu (Connor) struct hns3_query_ssu_cmd *req;
4890f10bd6bSMin Hu (Connor) uint64_t cnt;
4900f10bd6bSMin Hu (Connor) int ret;
4910f10bd6bSMin Hu (Connor)
4920f10bd6bSMin Hu (Connor) ret = hns3_get_ssu_drop_stats(hw, desc, HNS3_OPC_SSU_DROP_REG_NUM,
4930f10bd6bSMin Hu (Connor) true);
4940f10bd6bSMin Hu (Connor) if (ret) {
4950f10bd6bSMin Hu (Connor) hns3_err(hw, "failed to get Rx SSU drop stats, ret = %d", ret);
4960f10bd6bSMin Hu (Connor) return ret;
4970f10bd6bSMin Hu (Connor) }
4980f10bd6bSMin Hu (Connor)
4990f10bd6bSMin Hu (Connor) req = (struct hns3_query_ssu_cmd *)desc[0].data;
5000f10bd6bSMin Hu (Connor) cnt = rte_le_to_cpu_32(req->oq_drop_cnt) +
5010f10bd6bSMin Hu (Connor) rte_le_to_cpu_32(req->full_drop_cnt) +
5020f10bd6bSMin Hu (Connor) rte_le_to_cpu_32(req->part_drop_cnt);
5030f10bd6bSMin Hu (Connor)
5040f10bd6bSMin Hu (Connor) stats->ssu_rx_drop_cnt += cnt;
5050f10bd6bSMin Hu (Connor)
5060f10bd6bSMin Hu (Connor) return 0;
5070f10bd6bSMin Hu (Connor) }
5080f10bd6bSMin Hu (Connor)
509cb082f59SMin Hu (Connor) static int
hns3_update_port_tx_ssu_drop_stats(struct hns3_hw * hw)510cb082f59SMin Hu (Connor) hns3_update_port_tx_ssu_drop_stats(struct hns3_hw *hw)
511cb082f59SMin Hu (Connor) {
512cb082f59SMin Hu (Connor) struct hns3_cmd_desc desc[HNS3_OPC_SSU_DROP_REG_NUM];
513cb082f59SMin Hu (Connor) struct hns3_query_ssu_cmd *req;
514cb082f59SMin Hu (Connor) uint64_t cnt;
515cb082f59SMin Hu (Connor) int ret;
516cb082f59SMin Hu (Connor)
517cb082f59SMin Hu (Connor) ret = hns3_get_ssu_drop_stats(hw, desc, HNS3_OPC_SSU_DROP_REG_NUM,
518cb082f59SMin Hu (Connor) false);
519cb082f59SMin Hu (Connor) if (ret) {
520cb082f59SMin Hu (Connor) hns3_err(hw, "failed to get Tx SSU drop stats, ret = %d", ret);
521cb082f59SMin Hu (Connor) return ret;
522cb082f59SMin Hu (Connor) }
523cb082f59SMin Hu (Connor)
524cb082f59SMin Hu (Connor) req = (struct hns3_query_ssu_cmd *)desc[0].data;
525cb082f59SMin Hu (Connor) cnt = rte_le_to_cpu_32(req->oq_drop_cnt) +
526cb082f59SMin Hu (Connor) rte_le_to_cpu_32(req->full_drop_cnt) +
527cb082f59SMin Hu (Connor) rte_le_to_cpu_32(req->part_drop_cnt);
528cb082f59SMin Hu (Connor)
529cb082f59SMin Hu (Connor) hw->oerror_stats += cnt;
530cb082f59SMin Hu (Connor)
531cb082f59SMin Hu (Connor) return 0;
532cb082f59SMin Hu (Connor) }
533cb082f59SMin Hu (Connor)
5341a1de987SHuisong Li static int
hns3_update_imissed_stats(struct hns3_hw * hw,bool is_clear)5353e9f3042SMin Hu (Connor) hns3_update_imissed_stats(struct hns3_hw *hw, bool is_clear)
5363e9f3042SMin Hu (Connor) {
5370f10bd6bSMin Hu (Connor) struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw);
5383e9f3042SMin Hu (Connor) int ret;
5393e9f3042SMin Hu (Connor)
5400f10bd6bSMin Hu (Connor) if (hw->drop_stats_mode == HNS3_PKTS_DROP_STATS_MODE1 && hns->is_vf)
5410f10bd6bSMin Hu (Connor) return 0;
5420f10bd6bSMin Hu (Connor)
5430f10bd6bSMin Hu (Connor) if (hw->drop_stats_mode == HNS3_PKTS_DROP_STATS_MODE2 && !hns->is_vf) {
5440f10bd6bSMin Hu (Connor) ret = hns3_update_port_rx_ssu_drop_stats(hw);
5450f10bd6bSMin Hu (Connor) if (ret)
5460f10bd6bSMin Hu (Connor) return ret;
5470f10bd6bSMin Hu (Connor) }
5480f10bd6bSMin Hu (Connor)
5493e9f3042SMin Hu (Connor) ret = hns3_update_rpu_drop_stats(hw);
5503e9f3042SMin Hu (Connor) if (ret)
5513e9f3042SMin Hu (Connor) return ret;
5523e9f3042SMin Hu (Connor)
5533e9f3042SMin Hu (Connor) if (is_clear)
5543e9f3042SMin Hu (Connor) memset(&hw->imissed_stats, 0, sizeof(hw->imissed_stats));
5553e9f3042SMin Hu (Connor)
5563e9f3042SMin Hu (Connor) return 0;
5573e9f3042SMin Hu (Connor) }
5583e9f3042SMin Hu (Connor)
559cb082f59SMin Hu (Connor) static int
hns3_update_oerror_stats(struct hns3_hw * hw,bool is_clear)560cb082f59SMin Hu (Connor) hns3_update_oerror_stats(struct hns3_hw *hw, bool is_clear)
561cb082f59SMin Hu (Connor) {
562cb082f59SMin Hu (Connor) struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw);
563cb082f59SMin Hu (Connor) int ret;
564cb082f59SMin Hu (Connor)
565cb082f59SMin Hu (Connor) if (hw->drop_stats_mode == HNS3_PKTS_DROP_STATS_MODE1 || hns->is_vf)
566cb082f59SMin Hu (Connor) return 0;
567cb082f59SMin Hu (Connor)
568cb082f59SMin Hu (Connor) ret = hns3_update_port_tx_ssu_drop_stats(hw);
569cb082f59SMin Hu (Connor) if (ret)
570cb082f59SMin Hu (Connor) return ret;
571cb082f59SMin Hu (Connor)
572cb082f59SMin Hu (Connor) if (is_clear)
573cb082f59SMin Hu (Connor) hw->oerror_stats = 0;
574cb082f59SMin Hu (Connor)
575cb082f59SMin Hu (Connor) return 0;
576cb082f59SMin Hu (Connor) }
577cb082f59SMin Hu (Connor)
578a65342d9SHuisong Li static void
hns3_rcb_rx_ring_stats_get(struct hns3_rx_queue * rxq,struct hns3_tqp_stats * stats)579a65342d9SHuisong Li hns3_rcb_rx_ring_stats_get(struct hns3_rx_queue *rxq,
580a65342d9SHuisong Li struct hns3_tqp_stats *stats)
581a65342d9SHuisong Li {
582a65342d9SHuisong Li uint32_t cnt;
583a65342d9SHuisong Li
584a65342d9SHuisong Li cnt = hns3_read_dev(rxq, HNS3_RING_RX_PKTNUM_RECORD_REG);
585a65342d9SHuisong Li stats->rcb_rx_ring_pktnum_rcd += cnt;
586a65342d9SHuisong Li stats->rcb_rx_ring_pktnum[rxq->queue_id] += cnt;
587a65342d9SHuisong Li }
588a65342d9SHuisong Li
589a65342d9SHuisong Li static void
hns3_rcb_tx_ring_stats_get(struct hns3_tx_queue * txq,struct hns3_tqp_stats * stats)590a65342d9SHuisong Li hns3_rcb_tx_ring_stats_get(struct hns3_tx_queue *txq,
591a65342d9SHuisong Li struct hns3_tqp_stats *stats)
592a65342d9SHuisong Li {
593a65342d9SHuisong Li uint32_t cnt;
594a65342d9SHuisong Li
595a65342d9SHuisong Li cnt = hns3_read_dev(txq, HNS3_RING_TX_PKTNUM_RECORD_REG);
596a65342d9SHuisong Li stats->rcb_tx_ring_pktnum_rcd += cnt;
597a65342d9SHuisong Li stats->rcb_tx_ring_pktnum[txq->queue_id] += cnt;
598a65342d9SHuisong Li }
599a65342d9SHuisong Li
6008839c5e2SWei Hu (Xavier) /*
6018839c5e2SWei Hu (Xavier) * Query tqp tx queue statistics ,opcode id: 0x0B03.
6028839c5e2SWei Hu (Xavier) * Query tqp rx queue statistics ,opcode id: 0x0B13.
6038839c5e2SWei Hu (Xavier) * Get all statistics of a port.
6048839c5e2SWei Hu (Xavier) * @param eth_dev
6058839c5e2SWei Hu (Xavier) * Pointer to Ethernet device.
6068839c5e2SWei Hu (Xavier) * @praram rte_stats
6078839c5e2SWei Hu (Xavier) * Pointer to structure rte_eth_stats.
6088839c5e2SWei Hu (Xavier) * @return
6098839c5e2SWei Hu (Xavier) * 0 on success.
6108839c5e2SWei Hu (Xavier) */
6118839c5e2SWei Hu (Xavier) int
hns3_stats_get(struct rte_eth_dev * eth_dev,struct rte_eth_stats * rte_stats)6128839c5e2SWei Hu (Xavier) hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats)
6138839c5e2SWei Hu (Xavier) {
6148839c5e2SWei Hu (Xavier) struct hns3_adapter *hns = eth_dev->data->dev_private;
6158839c5e2SWei Hu (Xavier) struct hns3_hw *hw = &hns->hw;
6163e9f3042SMin Hu (Connor) struct hns3_rx_missed_stats *imissed_stats = &hw->imissed_stats;
6178839c5e2SWei Hu (Xavier) struct hns3_tqp_stats *stats = &hw->tqp_stats;
6188839c5e2SWei Hu (Xavier) struct hns3_rx_queue *rxq;
6191e28e842SChengchang Tang struct hns3_tx_queue *txq;
6208839c5e2SWei Hu (Xavier) uint16_t i;
6218839c5e2SWei Hu (Xavier) int ret;
6228839c5e2SWei Hu (Xavier)
6237b296662SHuisong Li rte_spinlock_lock(&hw->stats_lock);
6243e9f3042SMin Hu (Connor) /* Update imissed stats */
6253e9f3042SMin Hu (Connor) ret = hns3_update_imissed_stats(hw, false);
6263e9f3042SMin Hu (Connor) if (ret) {
627a65342d9SHuisong Li hns3_err(hw, "update imissed stats failed, ret = %d", ret);
628a65342d9SHuisong Li goto out;
6293e9f3042SMin Hu (Connor) }
6300f10bd6bSMin Hu (Connor) rte_stats->imissed = imissed_stats->rpu_rx_drop_cnt +
6310f10bd6bSMin Hu (Connor) imissed_stats->ssu_rx_drop_cnt;
6323e9f3042SMin Hu (Connor)
6330f10bd6bSMin Hu (Connor) /* Get the error stats and bytes of received packets */
63486c551d1SHuisong Li for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
6358839c5e2SWei Hu (Xavier) rxq = eth_dev->data->rx_queues[i];
6361e28e842SChengchang Tang if (rxq == NULL)
6371e28e842SChengchang Tang continue;
638fdcd6a3eSMin Hu (Connor)
639a65342d9SHuisong Li hns3_rcb_rx_ring_stats_get(rxq, stats);
6401e28e842SChengchang Tang rte_stats->ierrors += rxq->err_stats.l2_errors +
6411e28e842SChengchang Tang rxq->err_stats.pkt_len_errors;
642fdcd6a3eSMin Hu (Connor) rte_stats->ibytes += rxq->basic_stats.bytes;
6438839c5e2SWei Hu (Xavier) }
6441e627b8dSHao Chen
6451e28e842SChengchang Tang /* Reads all the stats of a txq in a loop to keep them synchronized */
646fdcd6a3eSMin Hu (Connor) for (i = 0; i < eth_dev->data->nb_tx_queues; i++) {
647fdcd6a3eSMin Hu (Connor) txq = eth_dev->data->tx_queues[i];
6481e28e842SChengchang Tang if (txq == NULL)
6491e28e842SChengchang Tang continue;
6501e28e842SChengchang Tang
651a65342d9SHuisong Li hns3_rcb_tx_ring_stats_get(txq, stats);
652fdcd6a3eSMin Hu (Connor) rte_stats->obytes += txq->basic_stats.bytes;
653fdcd6a3eSMin Hu (Connor) }
654fdcd6a3eSMin Hu (Connor)
655cb082f59SMin Hu (Connor) ret = hns3_update_oerror_stats(hw, false);
656cb082f59SMin Hu (Connor) if (ret) {
657a65342d9SHuisong Li hns3_err(hw, "update oerror stats failed, ret = %d", ret);
658a65342d9SHuisong Li goto out;
659cb082f59SMin Hu (Connor) }
660cb082f59SMin Hu (Connor) rte_stats->oerrors = hw->oerror_stats;
661cb082f59SMin Hu (Connor)
662c27e64eeSChengchang Tang /*
663c27e64eeSChengchang Tang * If HW statistics are reset by stats_reset, but a lot of residual
664c27e64eeSChengchang Tang * packets exist in the hardware queue and these packets are error
665c27e64eeSChengchang Tang * packets, flip overflow may occurred. So return 0 in this case.
666c27e64eeSChengchang Tang */
667c27e64eeSChengchang Tang rte_stats->ipackets =
668c27e64eeSChengchang Tang stats->rcb_rx_ring_pktnum_rcd > rte_stats->ierrors ?
669c27e64eeSChengchang Tang stats->rcb_rx_ring_pktnum_rcd - rte_stats->ierrors : 0;
6701e627b8dSHao Chen rte_stats->opackets = stats->rcb_tx_ring_pktnum_rcd -
6711e627b8dSHao Chen rte_stats->oerrors;
6721e627b8dSHao Chen rte_stats->rx_nombuf = eth_dev->data->rx_mbuf_alloc_failed;
6737b296662SHuisong Li
674a65342d9SHuisong Li out:
6757b296662SHuisong Li rte_spinlock_unlock(&hw->stats_lock);
6767b296662SHuisong Li
677a65342d9SHuisong Li return ret;
6788839c5e2SWei Hu (Xavier) }
6798839c5e2SWei Hu (Xavier)
6808839c5e2SWei Hu (Xavier) int
hns3_stats_reset(struct rte_eth_dev * eth_dev)6818839c5e2SWei Hu (Xavier) hns3_stats_reset(struct rte_eth_dev *eth_dev)
6828839c5e2SWei Hu (Xavier) {
6838839c5e2SWei Hu (Xavier) struct hns3_adapter *hns = eth_dev->data->dev_private;
6848839c5e2SWei Hu (Xavier) struct hns3_hw *hw = &hns->hw;
6858839c5e2SWei Hu (Xavier) struct hns3_rx_queue *rxq;
6861e28e842SChengchang Tang struct hns3_tx_queue *txq;
6878839c5e2SWei Hu (Xavier) uint16_t i;
6888839c5e2SWei Hu (Xavier) int ret;
6898839c5e2SWei Hu (Xavier)
6907b296662SHuisong Li rte_spinlock_lock(&hw->stats_lock);
6913e9f3042SMin Hu (Connor) /*
6923e9f3042SMin Hu (Connor) * Note: Reading hardware statistics of imissed registers will
6933e9f3042SMin Hu (Connor) * clear them.
6943e9f3042SMin Hu (Connor) */
6953e9f3042SMin Hu (Connor) ret = hns3_update_imissed_stats(hw, true);
6963e9f3042SMin Hu (Connor) if (ret) {
6970f10bd6bSMin Hu (Connor) hns3_err(hw, "clear imissed stats failed, ret = %d", ret);
698a65342d9SHuisong Li goto out;
6993e9f3042SMin Hu (Connor) }
7003e9f3042SMin Hu (Connor)
701cb082f59SMin Hu (Connor) /*
702cb082f59SMin Hu (Connor) * Note: Reading hardware statistics of oerror registers will
703cb082f59SMin Hu (Connor) * clear them.
704cb082f59SMin Hu (Connor) */
705cb082f59SMin Hu (Connor) ret = hns3_update_oerror_stats(hw, true);
706cb082f59SMin Hu (Connor) if (ret) {
707a65342d9SHuisong Li hns3_err(hw, "clear oerror stats failed, ret = %d", ret);
708a65342d9SHuisong Li goto out;
709cb082f59SMin Hu (Connor) }
710cb082f59SMin Hu (Connor)
7119b77f1feSHuisong Li for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
7128839c5e2SWei Hu (Xavier) rxq = eth_dev->data->rx_queues[i];
7131e28e842SChengchang Tang if (rxq == NULL)
7141e28e842SChengchang Tang continue;
7151e28e842SChengchang Tang
7169b77f1feSHuisong Li rxq->err_stats.pkt_len_errors = 0;
7179b77f1feSHuisong Li rxq->err_stats.l2_errors = 0;
718c4b7d676SWei Hu (Xavier) }
7191e28e842SChengchang Tang
7201e28e842SChengchang Tang /* Clear all the stats of a rxq in a loop to keep them synchronized */
7211e28e842SChengchang Tang for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
7221e28e842SChengchang Tang rxq = eth_dev->data->rx_queues[i];
7231e28e842SChengchang Tang if (rxq == NULL)
7241e28e842SChengchang Tang continue;
7251e28e842SChengchang Tang
7261e28e842SChengchang Tang memset(&rxq->basic_stats, 0,
7271e28e842SChengchang Tang sizeof(struct hns3_rx_basic_stats));
7281e28e842SChengchang Tang
7291e28e842SChengchang Tang /* This register is read-clear */
7301e28e842SChengchang Tang (void)hns3_read_dev(rxq, HNS3_RING_RX_PKTNUM_RECORD_REG);
7311e28e842SChengchang Tang rxq->err_stats.pkt_len_errors = 0;
7321e28e842SChengchang Tang rxq->err_stats.l2_errors = 0;
733c4b7d676SWei Hu (Xavier) }
734c4b7d676SWei Hu (Xavier)
7351e28e842SChengchang Tang /* Clear all the stats of a txq in a loop to keep them synchronized */
7361e28e842SChengchang Tang for (i = 0; i < eth_dev->data->nb_tx_queues; i++) {
7371e28e842SChengchang Tang txq = eth_dev->data->tx_queues[i];
7381e28e842SChengchang Tang if (txq == NULL)
7391e28e842SChengchang Tang continue;
7401e28e842SChengchang Tang
7411e28e842SChengchang Tang memset(&txq->basic_stats, 0,
7421e28e842SChengchang Tang sizeof(struct hns3_tx_basic_stats));
7431e28e842SChengchang Tang
7441e28e842SChengchang Tang /* This register is read-clear */
7451e28e842SChengchang Tang (void)hns3_read_dev(txq, HNS3_RING_TX_PKTNUM_RECORD_REG);
7461e28e842SChengchang Tang }
7471e28e842SChengchang Tang
74876d79456SWei Hu (Xavier) hns3_tqp_stats_clear(hw);
7497b296662SHuisong Li
750a65342d9SHuisong Li out:
7517b296662SHuisong Li rte_spinlock_unlock(&hw->stats_lock);
7527b296662SHuisong Li
753a65342d9SHuisong Li return ret;
7548839c5e2SWei Hu (Xavier) }
7558839c5e2SWei Hu (Xavier)
75668ca93e3SWei Hu (Xavier) static int
hns3_mac_stats_reset(struct hns3_hw * hw)757c05a5409SHuisong Li hns3_mac_stats_reset(struct hns3_hw *hw)
7588839c5e2SWei Hu (Xavier) {
7598839c5e2SWei Hu (Xavier) struct hns3_mac_stats *mac_stats = &hw->mac_stats;
7608839c5e2SWei Hu (Xavier) int ret;
7618839c5e2SWei Hu (Xavier)
762c05a5409SHuisong Li /* Clear hardware MAC statistics by reading it. */
763c05a5409SHuisong Li ret = hns3_update_mac_stats(hw);
76468ca93e3SWei Hu (Xavier) if (ret) {
7658839c5e2SWei Hu (Xavier) hns3_err(hw, "Clear Mac stats fail : %d", ret);
76668ca93e3SWei Hu (Xavier) return ret;
76768ca93e3SWei Hu (Xavier) }
7688839c5e2SWei Hu (Xavier)
7698839c5e2SWei Hu (Xavier) memset(mac_stats, 0, sizeof(struct hns3_mac_stats));
77068ca93e3SWei Hu (Xavier)
77168ca93e3SWei Hu (Xavier) return 0;
7728839c5e2SWei Hu (Xavier) }
7738839c5e2SWei Hu (Xavier)
774*08159599SJie Hai static uint16_t
hns3_get_imissed_stats_num(struct hns3_adapter * hns)7750f10bd6bSMin Hu (Connor) hns3_get_imissed_stats_num(struct hns3_adapter *hns)
7760f10bd6bSMin Hu (Connor) {
7770f10bd6bSMin Hu (Connor) #define NO_IMISSED_STATS_NUM 0
7780f10bd6bSMin Hu (Connor) #define RPU_STATS_ITEM_NUM 1
7790f10bd6bSMin Hu (Connor) struct hns3_hw *hw = &hns->hw;
7800f10bd6bSMin Hu (Connor)
7810f10bd6bSMin Hu (Connor) if (hw->drop_stats_mode == HNS3_PKTS_DROP_STATS_MODE1 && hns->is_vf)
7820f10bd6bSMin Hu (Connor) return NO_IMISSED_STATS_NUM;
7830f10bd6bSMin Hu (Connor)
7840f10bd6bSMin Hu (Connor) if (hw->drop_stats_mode == HNS3_PKTS_DROP_STATS_MODE2 && !hns->is_vf)
7850f10bd6bSMin Hu (Connor) return HNS3_NUM_IMISSED_XSTATS;
7860f10bd6bSMin Hu (Connor)
7870f10bd6bSMin Hu (Connor) return RPU_STATS_ITEM_NUM;
7880f10bd6bSMin Hu (Connor) }
7890f10bd6bSMin Hu (Connor)
7908839c5e2SWei Hu (Xavier) /* This function calculates the number of xstats based on the current config */
7918839c5e2SWei Hu (Xavier) static int
hns3_xstats_calc_num(struct rte_eth_dev * dev)7928839c5e2SWei Hu (Xavier) hns3_xstats_calc_num(struct rte_eth_dev *dev)
7938839c5e2SWei Hu (Xavier) {
79486c551d1SHuisong Li #define HNS3_PF_VF_RX_COMM_STATS_NUM (HNS3_NUM_RX_BD_ERROR_XSTATS + \
79586c551d1SHuisong Li HNS3_NUM_RXQ_DFX_XSTATS + \
79686c551d1SHuisong Li HNS3_NUM_RX_QUEUE_STATS + \
79786c551d1SHuisong Li HNS3_NUM_RXQ_BASIC_STATS)
79886c551d1SHuisong Li #define HNS3_PF_VF_TX_COMM_STATS_NUM (HNS3_NUM_TXQ_DFX_XSTATS + \
79986c551d1SHuisong Li HNS3_NUM_TX_QUEUE_STATS + \
80086c551d1SHuisong Li HNS3_NUM_TXQ_BASIC_STATS)
80186c551d1SHuisong Li
8028839c5e2SWei Hu (Xavier) struct hns3_adapter *hns = dev->data->dev_private;
8039b77f1feSHuisong Li uint16_t nb_rx_q = dev->data->nb_rx_queues;
8049b77f1feSHuisong Li uint16_t nb_tx_q = dev->data->nb_tx_queues;
80586c551d1SHuisong Li int rx_comm_stats_num = nb_rx_q * HNS3_PF_VF_RX_COMM_STATS_NUM;
80686c551d1SHuisong Li int tx_comm_stats_num = nb_tx_q * HNS3_PF_VF_TX_COMM_STATS_NUM;
8070f10bd6bSMin Hu (Connor) int stats_num;
8080f10bd6bSMin Hu (Connor)
8090f10bd6bSMin Hu (Connor) stats_num = rx_comm_stats_num + tx_comm_stats_num;
8100f10bd6bSMin Hu (Connor) stats_num += hns3_get_imissed_stats_num(hns);
8118839c5e2SWei Hu (Xavier)
8128839c5e2SWei Hu (Xavier) if (hns->is_vf)
8130f10bd6bSMin Hu (Connor) stats_num += HNS3_NUM_RESET_XSTATS;
8148839c5e2SWei Hu (Xavier) else
8150f10bd6bSMin Hu (Connor) stats_num += HNS3_FIX_NUM_STATS;
8160f10bd6bSMin Hu (Connor)
8170f10bd6bSMin Hu (Connor) return stats_num;
818c4b7d676SWei Hu (Xavier) }
819c4b7d676SWei Hu (Xavier)
820c4b7d676SWei Hu (Xavier) static void
hns3_queue_stats_get(struct rte_eth_dev * dev,struct rte_eth_xstat * xstats,int * count)8219b77f1feSHuisong Li hns3_queue_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
822c4b7d676SWei Hu (Xavier) int *count)
823c4b7d676SWei Hu (Xavier) {
824c4b7d676SWei Hu (Xavier) struct hns3_adapter *hns = dev->data->dev_private;
825c4b7d676SWei Hu (Xavier) struct hns3_hw *hw = &hns->hw;
826c4b7d676SWei Hu (Xavier) uint32_t reg_offset;
827c4b7d676SWei Hu (Xavier) uint16_t i, j;
828c4b7d676SWei Hu (Xavier)
829c4b7d676SWei Hu (Xavier) /* Get rx queue stats */
830c4b7d676SWei Hu (Xavier) for (j = 0; j < dev->data->nb_rx_queues; j++) {
831c4b7d676SWei Hu (Xavier) for (i = 0; i < HNS3_NUM_RX_QUEUE_STATS; i++) {
83276d79456SWei Hu (Xavier) reg_offset = hns3_get_tqp_reg_offset(j);
833c4b7d676SWei Hu (Xavier) xstats[*count].value = hns3_read_dev(hw,
834c4b7d676SWei Hu (Xavier) reg_offset + hns3_rx_queue_strings[i].offset);
835c4b7d676SWei Hu (Xavier) xstats[*count].id = *count;
836c4b7d676SWei Hu (Xavier) (*count)++;
837c4b7d676SWei Hu (Xavier) }
838c4b7d676SWei Hu (Xavier) }
839c4b7d676SWei Hu (Xavier)
840c4b7d676SWei Hu (Xavier) /* Get tx queue stats */
841c4b7d676SWei Hu (Xavier) for (j = 0; j < dev->data->nb_tx_queues; j++) {
842c4b7d676SWei Hu (Xavier) for (i = 0; i < HNS3_NUM_TX_QUEUE_STATS; i++) {
84376d79456SWei Hu (Xavier) reg_offset = hns3_get_tqp_reg_offset(j);
844c4b7d676SWei Hu (Xavier) xstats[*count].value = hns3_read_dev(hw,
845c4b7d676SWei Hu (Xavier) reg_offset + hns3_tx_queue_strings[i].offset);
846c4b7d676SWei Hu (Xavier) xstats[*count].id = *count;
847c4b7d676SWei Hu (Xavier) (*count)++;
848c4b7d676SWei Hu (Xavier) }
849c4b7d676SWei Hu (Xavier) }
8508839c5e2SWei Hu (Xavier) }
8518839c5e2SWei Hu (Xavier)
8529b77f1feSHuisong Li static void
hns3_rxq_dfx_stats_get(struct rte_eth_dev * dev,struct rte_eth_xstat * xstats,int * count)8539b77f1feSHuisong Li hns3_rxq_dfx_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
8549b77f1feSHuisong Li int *count)
8559b77f1feSHuisong Li {
8569b77f1feSHuisong Li struct hns3_rx_dfx_stats *dfx_stats;
8579b77f1feSHuisong Li struct hns3_rx_queue *rxq;
8589b77f1feSHuisong Li uint16_t i, j;
8599b77f1feSHuisong Li char *val;
8609b77f1feSHuisong Li
8619b77f1feSHuisong Li for (i = 0; i < dev->data->nb_rx_queues; i++) {
8629b77f1feSHuisong Li rxq = (struct hns3_rx_queue *)dev->data->rx_queues[i];
8639b77f1feSHuisong Li if (rxq == NULL)
8649b77f1feSHuisong Li continue;
8659b77f1feSHuisong Li
8669b77f1feSHuisong Li dfx_stats = &rxq->dfx_stats;
8679b77f1feSHuisong Li for (j = 0; j < HNS3_NUM_RXQ_DFX_XSTATS; j++) {
8689b77f1feSHuisong Li val = (char *)dfx_stats +
8699b77f1feSHuisong Li hns3_rxq_dfx_stats_strings[j].offset;
8709b77f1feSHuisong Li xstats[*count].value = *(uint64_t *)val;
8719b77f1feSHuisong Li xstats[*count].id = *count;
8729b77f1feSHuisong Li (*count)++;
8739b77f1feSHuisong Li }
8749b77f1feSHuisong Li }
8759b77f1feSHuisong Li }
8769b77f1feSHuisong Li
8779b77f1feSHuisong Li static void
hns3_txq_dfx_stats_get(struct rte_eth_dev * dev,struct rte_eth_xstat * xstats,int * count)8789b77f1feSHuisong Li hns3_txq_dfx_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
8799b77f1feSHuisong Li int *count)
8809b77f1feSHuisong Li {
8819b77f1feSHuisong Li struct hns3_tx_dfx_stats *dfx_stats;
8829b77f1feSHuisong Li struct hns3_tx_queue *txq;
8839b77f1feSHuisong Li uint16_t i, j;
8849b77f1feSHuisong Li char *val;
8859b77f1feSHuisong Li
8869b77f1feSHuisong Li for (i = 0; i < dev->data->nb_tx_queues; i++) {
8879b77f1feSHuisong Li txq = (struct hns3_tx_queue *)dev->data->tx_queues[i];
8889b77f1feSHuisong Li if (txq == NULL)
8899b77f1feSHuisong Li continue;
8909b77f1feSHuisong Li
8919b77f1feSHuisong Li dfx_stats = &txq->dfx_stats;
8929b77f1feSHuisong Li for (j = 0; j < HNS3_NUM_TXQ_DFX_XSTATS; j++) {
8939b77f1feSHuisong Li val = (char *)dfx_stats +
8949b77f1feSHuisong Li hns3_txq_dfx_stats_strings[j].offset;
8959b77f1feSHuisong Li xstats[*count].value = *(uint64_t *)val;
8969b77f1feSHuisong Li xstats[*count].id = *count;
8979b77f1feSHuisong Li (*count)++;
8989b77f1feSHuisong Li }
8999b77f1feSHuisong Li }
9009b77f1feSHuisong Li }
9019b77f1feSHuisong Li
9029b77f1feSHuisong Li static void
hns3_tqp_dfx_stats_get(struct rte_eth_dev * dev,struct rte_eth_xstat * xstats,int * count)9039b77f1feSHuisong Li hns3_tqp_dfx_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
9049b77f1feSHuisong Li int *count)
9059b77f1feSHuisong Li {
9069b77f1feSHuisong Li hns3_rxq_dfx_stats_get(dev, xstats, count);
9079b77f1feSHuisong Li hns3_txq_dfx_stats_get(dev, xstats, count);
9089b77f1feSHuisong Li }
90986c551d1SHuisong Li
91086c551d1SHuisong Li static void
hns3_rxq_basic_stats_get(struct rte_eth_dev * dev,struct rte_eth_xstat * xstats,int * count)91186c551d1SHuisong Li hns3_rxq_basic_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
91286c551d1SHuisong Li int *count)
91386c551d1SHuisong Li {
91486c551d1SHuisong Li struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);
91586c551d1SHuisong Li struct hns3_tqp_stats *stats = &hw->tqp_stats;
91686c551d1SHuisong Li struct hns3_rx_basic_stats *rxq_stats;
91786c551d1SHuisong Li struct hns3_rx_queue *rxq;
91886c551d1SHuisong Li uint16_t i, j;
91986c551d1SHuisong Li char *val;
92086c551d1SHuisong Li
92186c551d1SHuisong Li for (i = 0; i < dev->data->nb_rx_queues; i++) {
92286c551d1SHuisong Li rxq = dev->data->rx_queues[i];
92386c551d1SHuisong Li if (rxq == NULL)
92486c551d1SHuisong Li continue;
92586c551d1SHuisong Li
926a65342d9SHuisong Li hns3_rcb_rx_ring_stats_get(rxq, stats);
92786c551d1SHuisong Li rxq_stats = &rxq->basic_stats;
92886c551d1SHuisong Li rxq_stats->errors = rxq->err_stats.l2_errors +
92986c551d1SHuisong Li rxq->err_stats.pkt_len_errors;
9301e28e842SChengchang Tang
931c27e64eeSChengchang Tang /*
932c27e64eeSChengchang Tang * If HW statistics are reset by stats_reset, but a lot of
933c27e64eeSChengchang Tang * residual packets exist in the hardware queue and these
934c27e64eeSChengchang Tang * packets are error packets, flip overflow may occurred.
935c27e64eeSChengchang Tang * So return 0 in this case.
936c27e64eeSChengchang Tang */
937c27e64eeSChengchang Tang rxq_stats->packets =
938c27e64eeSChengchang Tang stats->rcb_rx_ring_pktnum[i] > rxq_stats->errors ?
939c27e64eeSChengchang Tang stats->rcb_rx_ring_pktnum[i] - rxq_stats->errors : 0;
94086c551d1SHuisong Li for (j = 0; j < HNS3_NUM_RXQ_BASIC_STATS; j++) {
94186c551d1SHuisong Li val = (char *)rxq_stats +
94286c551d1SHuisong Li hns3_rxq_basic_stats_strings[j].offset;
94386c551d1SHuisong Li xstats[*count].value = *(uint64_t *)val;
94486c551d1SHuisong Li xstats[*count].id = *count;
94586c551d1SHuisong Li (*count)++;
94686c551d1SHuisong Li }
94786c551d1SHuisong Li }
94886c551d1SHuisong Li }
94986c551d1SHuisong Li
95086c551d1SHuisong Li static void
hns3_txq_basic_stats_get(struct rte_eth_dev * dev,struct rte_eth_xstat * xstats,int * count)95186c551d1SHuisong Li hns3_txq_basic_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
95286c551d1SHuisong Li int *count)
95386c551d1SHuisong Li {
95486c551d1SHuisong Li struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);
95586c551d1SHuisong Li struct hns3_tqp_stats *stats = &hw->tqp_stats;
95686c551d1SHuisong Li struct hns3_tx_basic_stats *txq_stats;
95786c551d1SHuisong Li struct hns3_tx_queue *txq;
95886c551d1SHuisong Li uint16_t i, j;
95986c551d1SHuisong Li char *val;
96086c551d1SHuisong Li
96186c551d1SHuisong Li for (i = 0; i < dev->data->nb_tx_queues; i++) {
96286c551d1SHuisong Li txq = dev->data->tx_queues[i];
96386c551d1SHuisong Li if (txq == NULL)
96486c551d1SHuisong Li continue;
96586c551d1SHuisong Li
966a65342d9SHuisong Li hns3_rcb_tx_ring_stats_get(txq, stats);
9671e28e842SChengchang Tang
96886c551d1SHuisong Li txq_stats = &txq->basic_stats;
96986c551d1SHuisong Li txq_stats->packets = stats->rcb_tx_ring_pktnum[i];
970fdcd6a3eSMin Hu (Connor)
97186c551d1SHuisong Li for (j = 0; j < HNS3_NUM_TXQ_BASIC_STATS; j++) {
97286c551d1SHuisong Li val = (char *)txq_stats +
97386c551d1SHuisong Li hns3_txq_basic_stats_strings[j].offset;
97486c551d1SHuisong Li xstats[*count].value = *(uint64_t *)val;
97586c551d1SHuisong Li xstats[*count].id = *count;
97686c551d1SHuisong Li (*count)++;
97786c551d1SHuisong Li }
97886c551d1SHuisong Li }
97986c551d1SHuisong Li }
98086c551d1SHuisong Li
9811e28e842SChengchang Tang static void
hns3_tqp_basic_stats_get(struct rte_eth_dev * dev,struct rte_eth_xstat * xstats,int * count)98286c551d1SHuisong Li hns3_tqp_basic_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
98386c551d1SHuisong Li int *count)
98486c551d1SHuisong Li {
98586c551d1SHuisong Li hns3_rxq_basic_stats_get(dev, xstats, count);
98686c551d1SHuisong Li hns3_txq_basic_stats_get(dev, xstats, count);
98786c551d1SHuisong Li }
98886c551d1SHuisong Li
9890f10bd6bSMin Hu (Connor) static void
hns3_imissed_stats_get(struct rte_eth_dev * dev,struct rte_eth_xstat * xstats,int * count)9900f10bd6bSMin Hu (Connor) hns3_imissed_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
9910f10bd6bSMin Hu (Connor) int *count)
9920f10bd6bSMin Hu (Connor) {
9930f10bd6bSMin Hu (Connor) struct hns3_adapter *hns = dev->data->dev_private;
9940f10bd6bSMin Hu (Connor) struct hns3_hw *hw = &hns->hw;
9950f10bd6bSMin Hu (Connor) struct hns3_rx_missed_stats *imissed_stats = &hw->imissed_stats;
996*08159599SJie Hai uint16_t imissed_stats_num;
9970f10bd6bSMin Hu (Connor) int cnt = *count;
9980f10bd6bSMin Hu (Connor) char *addr;
9990f10bd6bSMin Hu (Connor) uint16_t i;
10000f10bd6bSMin Hu (Connor)
10010f10bd6bSMin Hu (Connor) imissed_stats_num = hns3_get_imissed_stats_num(hns);
10020f10bd6bSMin Hu (Connor)
10030f10bd6bSMin Hu (Connor) for (i = 0; i < imissed_stats_num; i++) {
10040f10bd6bSMin Hu (Connor) addr = (char *)imissed_stats +
10050f10bd6bSMin Hu (Connor) hns3_imissed_stats_strings[i].offset;
10060f10bd6bSMin Hu (Connor) xstats[cnt].value = *(uint64_t *)addr;
10070f10bd6bSMin Hu (Connor) xstats[cnt].id = cnt;
10080f10bd6bSMin Hu (Connor) cnt++;
10090f10bd6bSMin Hu (Connor) }
10100f10bd6bSMin Hu (Connor)
10110f10bd6bSMin Hu (Connor) *count = cnt;
10120f10bd6bSMin Hu (Connor) }
10130f10bd6bSMin Hu (Connor)
10148839c5e2SWei Hu (Xavier) /*
10158839c5e2SWei Hu (Xavier) * Retrieve extended(tqp | Mac) statistics of an Ethernet device.
10168839c5e2SWei Hu (Xavier) * @param dev
10178839c5e2SWei Hu (Xavier) * Pointer to Ethernet device.
10188839c5e2SWei Hu (Xavier) * @praram xstats
10198839c5e2SWei Hu (Xavier) * A pointer to a table of structure of type *rte_eth_xstat*
10208839c5e2SWei Hu (Xavier) * to be filled with device statistics ids and values.
1021e15401f3SChengwen Feng * This parameter can be set to NULL if and only if n is 0.
10228839c5e2SWei Hu (Xavier) * @param n
10238839c5e2SWei Hu (Xavier) * The size of the xstats array (number of elements).
1024e15401f3SChengwen Feng * If lower than the required number of elements, the function returns the
1025e15401f3SChengwen Feng * required number of elements.
1026e15401f3SChengwen Feng * If equal to zero, the xstats parameter must be NULL, the function returns
1027e15401f3SChengwen Feng * the required number of elements.
10288839c5e2SWei Hu (Xavier) * @return
10298839c5e2SWei Hu (Xavier) * 0 on fail, count(The size of the statistics elements) on success.
10308839c5e2SWei Hu (Xavier) */
10318839c5e2SWei Hu (Xavier) int
hns3_dev_xstats_get(struct rte_eth_dev * dev,struct rte_eth_xstat * xstats,unsigned int n)10328839c5e2SWei Hu (Xavier) hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
10338839c5e2SWei Hu (Xavier) unsigned int n)
10348839c5e2SWei Hu (Xavier) {
10358839c5e2SWei Hu (Xavier) struct hns3_adapter *hns = dev->data->dev_private;
10368839c5e2SWei Hu (Xavier) struct hns3_hw *hw = &hns->hw;
10378839c5e2SWei Hu (Xavier) struct hns3_mac_stats *mac_stats = &hw->mac_stats;
10388839c5e2SWei Hu (Xavier) struct hns3_reset_stats *reset_stats = &hw->reset.stats;
10399b77f1feSHuisong Li struct hns3_rx_bd_errors_stats *rx_err_stats;
10408839c5e2SWei Hu (Xavier) struct hns3_rx_queue *rxq;
10418839c5e2SWei Hu (Xavier) uint16_t i, j;
10428839c5e2SWei Hu (Xavier) char *addr;
10438839c5e2SWei Hu (Xavier) int count;
10448839c5e2SWei Hu (Xavier) int ret;
10458839c5e2SWei Hu (Xavier)
10468839c5e2SWei Hu (Xavier) count = hns3_xstats_calc_num(dev);
10478839c5e2SWei Hu (Xavier) if ((int)n < count)
10488839c5e2SWei Hu (Xavier) return count;
10498839c5e2SWei Hu (Xavier)
10508839c5e2SWei Hu (Xavier) count = 0;
10518839c5e2SWei Hu (Xavier)
1052a65342d9SHuisong Li rte_spinlock_lock(&hw->stats_lock);
10531e28e842SChengchang Tang hns3_tqp_basic_stats_get(dev, xstats, &count);
105486c551d1SHuisong Li
10558839c5e2SWei Hu (Xavier) if (!hns->is_vf) {
1056c05a5409SHuisong Li ret = hns3_update_mac_stats(hw);
1057dcb33fd7SHuisong Li if (ret < 0) {
10588839c5e2SWei Hu (Xavier) hns3_err(hw, "Update Mac stats fail : %d", ret);
1059a65342d9SHuisong Li rte_spinlock_unlock(&hw->stats_lock);
1060dcb33fd7SHuisong Li return ret;
10618839c5e2SWei Hu (Xavier) }
10628839c5e2SWei Hu (Xavier)
10638839c5e2SWei Hu (Xavier) /* Get MAC stats from hw->hw_xstats.mac_stats struct */
10648839c5e2SWei Hu (Xavier) for (i = 0; i < HNS3_NUM_MAC_STATS; i++) {
10658839c5e2SWei Hu (Xavier) addr = (char *)mac_stats + hns3_mac_strings[i].offset;
10668839c5e2SWei Hu (Xavier) xstats[count].value = *(uint64_t *)addr;
10678839c5e2SWei Hu (Xavier) xstats[count].id = count;
10688839c5e2SWei Hu (Xavier) count++;
10698839c5e2SWei Hu (Xavier) }
10700f10bd6bSMin Hu (Connor) }
10718839c5e2SWei Hu (Xavier)
10723e9f3042SMin Hu (Connor) ret = hns3_update_imissed_stats(hw, false);
10733e9f3042SMin Hu (Connor) if (ret) {
1074a65342d9SHuisong Li hns3_err(hw, "update imissed stats failed, ret = %d", ret);
10757b296662SHuisong Li rte_spinlock_unlock(&hw->stats_lock);
10763e9f3042SMin Hu (Connor) return ret;
10773e9f3042SMin Hu (Connor) }
10783e9f3042SMin Hu (Connor)
10790f10bd6bSMin Hu (Connor) hns3_imissed_stats_get(dev, xstats, &count);
10808839c5e2SWei Hu (Xavier)
10818839c5e2SWei Hu (Xavier) /* Get the reset stat */
10828839c5e2SWei Hu (Xavier) for (i = 0; i < HNS3_NUM_RESET_XSTATS; i++) {
10838839c5e2SWei Hu (Xavier) addr = (char *)reset_stats + hns3_reset_stats_strings[i].offset;
10848839c5e2SWei Hu (Xavier) xstats[count].value = *(uint64_t *)addr;
10858839c5e2SWei Hu (Xavier) xstats[count].id = count;
10868839c5e2SWei Hu (Xavier) count++;
10878839c5e2SWei Hu (Xavier) }
10888839c5e2SWei Hu (Xavier)
10898839c5e2SWei Hu (Xavier) /* Get the Rx BD errors stats */
10904016d76bSChengwen Feng for (j = 0; j < dev->data->nb_rx_queues; j++) {
10918839c5e2SWei Hu (Xavier) for (i = 0; i < HNS3_NUM_RX_BD_ERROR_XSTATS; i++) {
10928839c5e2SWei Hu (Xavier) rxq = dev->data->rx_queues[j];
10939b77f1feSHuisong Li if (rxq) {
10949b77f1feSHuisong Li rx_err_stats = &rxq->err_stats;
10959b77f1feSHuisong Li addr = (char *)rx_err_stats +
10969b77f1feSHuisong Li hns3_rx_bd_error_strings[i].offset;
10978839c5e2SWei Hu (Xavier) xstats[count].value = *(uint64_t *)addr;
10988839c5e2SWei Hu (Xavier) xstats[count].id = count;
10998839c5e2SWei Hu (Xavier) count++;
11008839c5e2SWei Hu (Xavier) }
11018839c5e2SWei Hu (Xavier) }
11024016d76bSChengwen Feng }
11034016d76bSChengwen Feng
11049b77f1feSHuisong Li hns3_tqp_dfx_stats_get(dev, xstats, &count);
11059b77f1feSHuisong Li hns3_queue_stats_get(dev, xstats, &count);
1106a65342d9SHuisong Li rte_spinlock_unlock(&hw->stats_lock);
11079b77f1feSHuisong Li
11088839c5e2SWei Hu (Xavier) return count;
11098839c5e2SWei Hu (Xavier) }
11108839c5e2SWei Hu (Xavier)
11119b77f1feSHuisong Li static void
hns3_tqp_basic_stats_name_get(struct rte_eth_dev * dev,struct rte_eth_xstat_name * xstats_names,uint32_t * count)111286c551d1SHuisong Li hns3_tqp_basic_stats_name_get(struct rte_eth_dev *dev,
111386c551d1SHuisong Li struct rte_eth_xstat_name *xstats_names,
111486c551d1SHuisong Li uint32_t *count)
111586c551d1SHuisong Li {
111686c551d1SHuisong Li uint16_t i, j;
111786c551d1SHuisong Li
111886c551d1SHuisong Li for (i = 0; i < dev->data->nb_rx_queues; i++) {
111986c551d1SHuisong Li for (j = 0; j < HNS3_NUM_RXQ_BASIC_STATS; j++) {
112086c551d1SHuisong Li snprintf(xstats_names[*count].name,
112186c551d1SHuisong Li sizeof(xstats_names[*count].name),
112286c551d1SHuisong Li "rx_q%u_%s", i,
112386c551d1SHuisong Li hns3_rxq_basic_stats_strings[j].name);
112486c551d1SHuisong Li (*count)++;
112586c551d1SHuisong Li }
112686c551d1SHuisong Li }
112786c551d1SHuisong Li for (i = 0; i < dev->data->nb_tx_queues; i++) {
112886c551d1SHuisong Li for (j = 0; j < HNS3_NUM_TXQ_BASIC_STATS; j++) {
112986c551d1SHuisong Li snprintf(xstats_names[*count].name,
113086c551d1SHuisong Li sizeof(xstats_names[*count].name),
113186c551d1SHuisong Li "tx_q%u_%s", i,
113286c551d1SHuisong Li hns3_txq_basic_stats_strings[j].name);
113386c551d1SHuisong Li (*count)++;
113486c551d1SHuisong Li }
113586c551d1SHuisong Li }
113686c551d1SHuisong Li }
113786c551d1SHuisong Li
113886c551d1SHuisong Li static void
hns3_tqp_dfx_stats_name_get(struct rte_eth_dev * dev,struct rte_eth_xstat_name * xstats_names,uint32_t * count)11399b77f1feSHuisong Li hns3_tqp_dfx_stats_name_get(struct rte_eth_dev *dev,
11409b77f1feSHuisong Li struct rte_eth_xstat_name *xstats_names,
11419b77f1feSHuisong Li uint32_t *count)
11429b77f1feSHuisong Li {
11439b77f1feSHuisong Li uint16_t i, j;
11449b77f1feSHuisong Li
114586c551d1SHuisong Li for (i = 0; i < dev->data->nb_rx_queues; i++) {
114686c551d1SHuisong Li for (j = 0; j < HNS3_NUM_RXQ_DFX_XSTATS; j++) {
11479b77f1feSHuisong Li snprintf(xstats_names[*count].name,
11489b77f1feSHuisong Li sizeof(xstats_names[*count].name),
114986c551d1SHuisong Li "rx_q%u_%s", i,
115086c551d1SHuisong Li hns3_rxq_dfx_stats_strings[j].name);
11519b77f1feSHuisong Li (*count)++;
11529b77f1feSHuisong Li }
11539b77f1feSHuisong Li }
11549b77f1feSHuisong Li
115586c551d1SHuisong Li for (i = 0; i < dev->data->nb_tx_queues; i++) {
115686c551d1SHuisong Li for (j = 0; j < HNS3_NUM_TXQ_DFX_XSTATS; j++) {
11579b77f1feSHuisong Li snprintf(xstats_names[*count].name,
11589b77f1feSHuisong Li sizeof(xstats_names[*count].name),
115986c551d1SHuisong Li "tx_q%u_%s", i,
116086c551d1SHuisong Li hns3_txq_dfx_stats_strings[j].name);
11619b77f1feSHuisong Li (*count)++;
11629b77f1feSHuisong Li }
11639b77f1feSHuisong Li }
11649b77f1feSHuisong Li }
11659b77f1feSHuisong Li
11660f10bd6bSMin Hu (Connor) static void
hns3_imissed_stats_name_get(struct rte_eth_dev * dev,struct rte_eth_xstat_name * xstats_names,uint32_t * count)11670f10bd6bSMin Hu (Connor) hns3_imissed_stats_name_get(struct rte_eth_dev *dev,
11680f10bd6bSMin Hu (Connor) struct rte_eth_xstat_name *xstats_names,
11690f10bd6bSMin Hu (Connor) uint32_t *count)
11700f10bd6bSMin Hu (Connor) {
11710f10bd6bSMin Hu (Connor) struct hns3_adapter *hns = dev->data->dev_private;
11720f10bd6bSMin Hu (Connor) uint32_t cnt = *count;
1173*08159599SJie Hai uint16_t imissed_stats_num;
11740f10bd6bSMin Hu (Connor) uint16_t i;
11750f10bd6bSMin Hu (Connor)
11760f10bd6bSMin Hu (Connor) imissed_stats_num = hns3_get_imissed_stats_num(hns);
11770f10bd6bSMin Hu (Connor)
11780f10bd6bSMin Hu (Connor) for (i = 0; i < imissed_stats_num; i++) {
11790f10bd6bSMin Hu (Connor) snprintf(xstats_names[cnt].name,
11800f10bd6bSMin Hu (Connor) sizeof(xstats_names[cnt].name),
11810f10bd6bSMin Hu (Connor) "%s", hns3_imissed_stats_strings[i].name);
11820f10bd6bSMin Hu (Connor) cnt++;
11830f10bd6bSMin Hu (Connor) }
11840f10bd6bSMin Hu (Connor)
11850f10bd6bSMin Hu (Connor) *count = cnt;
11860f10bd6bSMin Hu (Connor) }
11870f10bd6bSMin Hu (Connor)
11888839c5e2SWei Hu (Xavier) /*
11898839c5e2SWei Hu (Xavier) * Retrieve names of extended statistics of an Ethernet device.
11908839c5e2SWei Hu (Xavier) *
11918839c5e2SWei Hu (Xavier) * There is an assumption that 'xstat_names' and 'xstats' arrays are matched
11928839c5e2SWei Hu (Xavier) * by array index:
11938839c5e2SWei Hu (Xavier) * xstats_names[i].name => xstats[i].value
11948839c5e2SWei Hu (Xavier) *
11958839c5e2SWei Hu (Xavier) * And the array index is same with id field of 'struct rte_eth_xstat':
11968839c5e2SWei Hu (Xavier) * xstats[i].id == i
11978839c5e2SWei Hu (Xavier) *
11988839c5e2SWei Hu (Xavier) * This assumption makes key-value pair matching less flexible but simpler.
11998839c5e2SWei Hu (Xavier) *
12008839c5e2SWei Hu (Xavier) * @param dev
12018839c5e2SWei Hu (Xavier) * Pointer to Ethernet device.
12028839c5e2SWei Hu (Xavier) * @param xstats_names
12038839c5e2SWei Hu (Xavier) * An rte_eth_xstat_name array of at least *size* elements to
12048839c5e2SWei Hu (Xavier) * be filled. If set to NULL, the function returns the required number
12058839c5e2SWei Hu (Xavier) * of elements.
12068839c5e2SWei Hu (Xavier) * @param size
12078839c5e2SWei Hu (Xavier) * The size of the xstats_names array (number of elements).
12088839c5e2SWei Hu (Xavier) * @return
12098839c5e2SWei Hu (Xavier) * - A positive value lower or equal to size: success. The return value
12108839c5e2SWei Hu (Xavier) * is the number of entries filled in the stats table.
12118839c5e2SWei Hu (Xavier) */
12128839c5e2SWei Hu (Xavier) int
hns3_dev_xstats_get_names(struct rte_eth_dev * dev,struct rte_eth_xstat_name * xstats_names,__rte_unused unsigned int size)12134016d76bSChengwen Feng hns3_dev_xstats_get_names(struct rte_eth_dev *dev,
12148839c5e2SWei Hu (Xavier) struct rte_eth_xstat_name *xstats_names,
12158839c5e2SWei Hu (Xavier) __rte_unused unsigned int size)
12168839c5e2SWei Hu (Xavier) {
12178839c5e2SWei Hu (Xavier) struct hns3_adapter *hns = dev->data->dev_private;
12188839c5e2SWei Hu (Xavier) int cnt_stats = hns3_xstats_calc_num(dev);
12198839c5e2SWei Hu (Xavier) uint32_t count = 0;
12208839c5e2SWei Hu (Xavier) uint16_t i, j;
12218839c5e2SWei Hu (Xavier)
12228839c5e2SWei Hu (Xavier) if (xstats_names == NULL)
12238839c5e2SWei Hu (Xavier) return cnt_stats;
12248839c5e2SWei Hu (Xavier)
122586c551d1SHuisong Li hns3_tqp_basic_stats_name_get(dev, xstats_names, &count);
122686c551d1SHuisong Li
12278839c5e2SWei Hu (Xavier) /* Note: size limited checked in rte_eth_xstats_get_names() */
12288839c5e2SWei Hu (Xavier) if (!hns->is_vf) {
12298839c5e2SWei Hu (Xavier) /* Get MAC name from hw->hw_xstats.mac_stats struct */
12308839c5e2SWei Hu (Xavier) for (i = 0; i < HNS3_NUM_MAC_STATS; i++) {
12318839c5e2SWei Hu (Xavier) snprintf(xstats_names[count].name,
12328839c5e2SWei Hu (Xavier) sizeof(xstats_names[count].name),
12338839c5e2SWei Hu (Xavier) "%s", hns3_mac_strings[i].name);
12348839c5e2SWei Hu (Xavier) count++;
12358839c5e2SWei Hu (Xavier) }
12360f10bd6bSMin Hu (Connor) }
12378839c5e2SWei Hu (Xavier)
12380f10bd6bSMin Hu (Connor) hns3_imissed_stats_name_get(dev, xstats_names, &count);
12390f10bd6bSMin Hu (Connor)
12408839c5e2SWei Hu (Xavier) for (i = 0; i < HNS3_NUM_RESET_XSTATS; i++) {
12418839c5e2SWei Hu (Xavier) snprintf(xstats_names[count].name,
12428839c5e2SWei Hu (Xavier) sizeof(xstats_names[count].name),
12438839c5e2SWei Hu (Xavier) "%s", hns3_reset_stats_strings[i].name);
12448839c5e2SWei Hu (Xavier) count++;
12458839c5e2SWei Hu (Xavier) }
12468839c5e2SWei Hu (Xavier)
12478839c5e2SWei Hu (Xavier) for (j = 0; j < dev->data->nb_rx_queues; j++) {
12488839c5e2SWei Hu (Xavier) for (i = 0; i < HNS3_NUM_RX_BD_ERROR_XSTATS; i++) {
12498839c5e2SWei Hu (Xavier) snprintf(xstats_names[count].name,
12508839c5e2SWei Hu (Xavier) sizeof(xstats_names[count].name),
12519b77f1feSHuisong Li "rx_q%u_%s", j,
12528839c5e2SWei Hu (Xavier) hns3_rx_bd_error_strings[i].name);
12538839c5e2SWei Hu (Xavier) count++;
12548839c5e2SWei Hu (Xavier) }
12558839c5e2SWei Hu (Xavier) }
12568839c5e2SWei Hu (Xavier)
12579b77f1feSHuisong Li hns3_tqp_dfx_stats_name_get(dev, xstats_names, &count);
1258c4b7d676SWei Hu (Xavier)
12594016d76bSChengwen Feng for (j = 0; j < dev->data->nb_rx_queues; j++) {
12604016d76bSChengwen Feng for (i = 0; i < HNS3_NUM_RX_QUEUE_STATS; i++) {
12614016d76bSChengwen Feng snprintf(xstats_names[count].name,
12624016d76bSChengwen Feng sizeof(xstats_names[count].name),
12639b77f1feSHuisong Li "rx_q%u_%s", j, hns3_rx_queue_strings[i].name);
12644016d76bSChengwen Feng count++;
12654016d76bSChengwen Feng }
12664016d76bSChengwen Feng }
12674016d76bSChengwen Feng
12684016d76bSChengwen Feng for (j = 0; j < dev->data->nb_tx_queues; j++) {
12694016d76bSChengwen Feng for (i = 0; i < HNS3_NUM_TX_QUEUE_STATS; i++) {
12704016d76bSChengwen Feng snprintf(xstats_names[count].name,
12714016d76bSChengwen Feng sizeof(xstats_names[count].name),
12729b77f1feSHuisong Li "tx_q%u_%s", j, hns3_tx_queue_strings[i].name);
12734016d76bSChengwen Feng count++;
12744016d76bSChengwen Feng }
12754016d76bSChengwen Feng }
12764016d76bSChengwen Feng
12778839c5e2SWei Hu (Xavier) return count;
12788839c5e2SWei Hu (Xavier) }
12798839c5e2SWei Hu (Xavier)
12808839c5e2SWei Hu (Xavier) /*
12818839c5e2SWei Hu (Xavier) * Retrieve extended statistics of an Ethernet device.
12828839c5e2SWei Hu (Xavier) *
12838839c5e2SWei Hu (Xavier) * @param dev
12848839c5e2SWei Hu (Xavier) * Pointer to Ethernet device.
12858839c5e2SWei Hu (Xavier) * @param ids
12868839c5e2SWei Hu (Xavier) * A pointer to an ids array passed by application. This tells which
12878839c5e2SWei Hu (Xavier) * statistics values function should retrieve. This parameter
12888839c5e2SWei Hu (Xavier) * can be set to NULL if size is 0. In this case function will retrieve
12897be78d02SJosh Soref * all available statistics.
12908839c5e2SWei Hu (Xavier) * @param values
12918839c5e2SWei Hu (Xavier) * A pointer to a table to be filled with device statistics values.
12928839c5e2SWei Hu (Xavier) * @param size
12938839c5e2SWei Hu (Xavier) * The size of the ids array (number of elements).
12948839c5e2SWei Hu (Xavier) * @return
12958839c5e2SWei Hu (Xavier) * - A positive value lower or equal to size: success. The return value
12968839c5e2SWei Hu (Xavier) * is the number of entries filled in the stats table.
12978839c5e2SWei Hu (Xavier) * - A positive value higher than size: error, the given statistics table
12988839c5e2SWei Hu (Xavier) * is too small. The return value corresponds to the size that should
12998839c5e2SWei Hu (Xavier) * be given to succeed. The entries in the table are not valid and
13008839c5e2SWei Hu (Xavier) * shall not be used by the caller.
13018839c5e2SWei Hu (Xavier) * - 0 on no ids.
13028839c5e2SWei Hu (Xavier) */
13038839c5e2SWei Hu (Xavier) int
hns3_dev_xstats_get_by_id(struct rte_eth_dev * dev,const uint64_t * ids,uint64_t * values,uint32_t size)13048839c5e2SWei Hu (Xavier) hns3_dev_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
13058839c5e2SWei Hu (Xavier) uint64_t *values, uint32_t size)
13068839c5e2SWei Hu (Xavier) {
13078839c5e2SWei Hu (Xavier) const uint32_t cnt_stats = hns3_xstats_calc_num(dev);
13084016d76bSChengwen Feng struct hns3_adapter *hns = dev->data->dev_private;
13094016d76bSChengwen Feng struct rte_eth_xstat *values_copy;
13104016d76bSChengwen Feng struct hns3_hw *hw = &hns->hw;
13114016d76bSChengwen Feng uint32_t count_value;
13128839c5e2SWei Hu (Xavier) uint64_t len;
13134016d76bSChengwen Feng uint32_t i;
13148839c5e2SWei Hu (Xavier)
13153213d584SHuisong Li if (ids == NULL && values == NULL)
13163213d584SHuisong Li return cnt_stats;
13173213d584SHuisong Li
13183213d584SHuisong Li if (ids == NULL)
13193213d584SHuisong Li if (size < cnt_stats)
13208839c5e2SWei Hu (Xavier) return cnt_stats;
13218839c5e2SWei Hu (Xavier)
13224016d76bSChengwen Feng len = cnt_stats * sizeof(struct rte_eth_xstat);
13238839c5e2SWei Hu (Xavier) values_copy = rte_zmalloc("hns3_xstats_values", len, 0);
13248839c5e2SWei Hu (Xavier) if (values_copy == NULL) {
13255bddaf38SHuisong Li hns3_err(hw, "Failed to allocate 0x%" PRIx64 " bytes needed to store statistics values",
13265bddaf38SHuisong Li len);
13278839c5e2SWei Hu (Xavier) return -ENOMEM;
13288839c5e2SWei Hu (Xavier) }
13298839c5e2SWei Hu (Xavier)
13304016d76bSChengwen Feng count_value = hns3_dev_xstats_get(dev, values_copy, cnt_stats);
13314016d76bSChengwen Feng if (count_value != cnt_stats) {
13324016d76bSChengwen Feng rte_free(values_copy);
13334016d76bSChengwen Feng return -EINVAL;
13348839c5e2SWei Hu (Xavier) }
13358839c5e2SWei Hu (Xavier)
13363213d584SHuisong Li if (ids == NULL && values != NULL) {
13373213d584SHuisong Li for (i = 0; i < cnt_stats; i++)
13383213d584SHuisong Li memcpy(&values[i], &values_copy[i].value,
13393213d584SHuisong Li sizeof(values[i]));
13403213d584SHuisong Li
13413213d584SHuisong Li rte_free(values_copy);
13423213d584SHuisong Li return cnt_stats;
13433213d584SHuisong Li }
13443213d584SHuisong Li
13458839c5e2SWei Hu (Xavier) for (i = 0; i < size; i++) {
13468839c5e2SWei Hu (Xavier) if (ids[i] >= cnt_stats) {
13475bddaf38SHuisong Li hns3_err(hw, "ids[%u] (%" PRIu64 ") is invalid, should < %u",
13485bddaf38SHuisong Li i, ids[i], cnt_stats);
13498839c5e2SWei Hu (Xavier) rte_free(values_copy);
13508839c5e2SWei Hu (Xavier) return -EINVAL;
13518839c5e2SWei Hu (Xavier) }
13524016d76bSChengwen Feng memcpy(&values[i], &values_copy[ids[i]].value,
13534016d76bSChengwen Feng sizeof(values[i]));
13548839c5e2SWei Hu (Xavier) }
13558839c5e2SWei Hu (Xavier)
13568839c5e2SWei Hu (Xavier) rte_free(values_copy);
13578839c5e2SWei Hu (Xavier) return size;
13588839c5e2SWei Hu (Xavier) }
13598839c5e2SWei Hu (Xavier)
13608839c5e2SWei Hu (Xavier) /*
13618839c5e2SWei Hu (Xavier) * Retrieve names of extended statistics of an Ethernet device.
13628839c5e2SWei Hu (Xavier) *
13638839c5e2SWei Hu (Xavier) * @param dev
13648839c5e2SWei Hu (Xavier) * Pointer to Ethernet device.
13658c9f976fSAndrew Rybchenko * @param ids
13668c9f976fSAndrew Rybchenko * IDs array given by app to retrieve specific statistics
13678839c5e2SWei Hu (Xavier) * @param xstats_names
13688839c5e2SWei Hu (Xavier) * An rte_eth_xstat_name array of at least *size* elements to
13698839c5e2SWei Hu (Xavier) * be filled. If set to NULL, the function returns the required number
13708839c5e2SWei Hu (Xavier) * of elements.
13718839c5e2SWei Hu (Xavier) * @param size
13728839c5e2SWei Hu (Xavier) * The size of the xstats_names array (number of elements).
13738839c5e2SWei Hu (Xavier) * @return
13748839c5e2SWei Hu (Xavier) * - A positive value lower or equal to size: success. The return value
13758839c5e2SWei Hu (Xavier) * is the number of entries filled in the stats table.
13768839c5e2SWei Hu (Xavier) * - A positive value higher than size: error, the given statistics table
13778839c5e2SWei Hu (Xavier) * is too small. The return value corresponds to the size that should
13788839c5e2SWei Hu (Xavier) * be given to succeed. The entries in the table are not valid and
13798839c5e2SWei Hu (Xavier) * shall not be used by the caller.
13808839c5e2SWei Hu (Xavier) */
13818839c5e2SWei Hu (Xavier) int
hns3_dev_xstats_get_names_by_id(struct rte_eth_dev * dev,const uint64_t * ids,struct rte_eth_xstat_name * xstats_names,uint32_t size)13828839c5e2SWei Hu (Xavier) hns3_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,
13838c9f976fSAndrew Rybchenko const uint64_t *ids,
13848839c5e2SWei Hu (Xavier) struct rte_eth_xstat_name *xstats_names,
13858c9f976fSAndrew Rybchenko uint32_t size)
13868839c5e2SWei Hu (Xavier) {
13878839c5e2SWei Hu (Xavier) const uint32_t cnt_stats = hns3_xstats_calc_num(dev);
13884016d76bSChengwen Feng struct hns3_adapter *hns = dev->data->dev_private;
13894016d76bSChengwen Feng struct rte_eth_xstat_name *names_copy;
13904016d76bSChengwen Feng struct hns3_hw *hw = &hns->hw;
13918839c5e2SWei Hu (Xavier) uint64_t len;
13924016d76bSChengwen Feng uint32_t i;
13938839c5e2SWei Hu (Xavier)
13943213d584SHuisong Li if (xstats_names == NULL)
13958839c5e2SWei Hu (Xavier) return cnt_stats;
13968839c5e2SWei Hu (Xavier)
13973213d584SHuisong Li if (ids == NULL) {
13983213d584SHuisong Li if (size < cnt_stats)
13993213d584SHuisong Li return cnt_stats;
14003213d584SHuisong Li
14013213d584SHuisong Li return hns3_dev_xstats_get_names(dev, xstats_names, cnt_stats);
14023213d584SHuisong Li }
14033213d584SHuisong Li
14048839c5e2SWei Hu (Xavier) len = cnt_stats * sizeof(struct rte_eth_xstat_name);
14054016d76bSChengwen Feng names_copy = rte_zmalloc("hns3_xstats_names", len, 0);
14064016d76bSChengwen Feng if (names_copy == NULL) {
14075bddaf38SHuisong Li hns3_err(hw, "Failed to allocate 0x%" PRIx64 " bytes needed to store statistics names",
14085bddaf38SHuisong Li len);
14098839c5e2SWei Hu (Xavier) return -ENOMEM;
14108839c5e2SWei Hu (Xavier) }
14118839c5e2SWei Hu (Xavier)
14124016d76bSChengwen Feng (void)hns3_dev_xstats_get_names(dev, names_copy, cnt_stats);
14138839c5e2SWei Hu (Xavier)
14148839c5e2SWei Hu (Xavier) for (i = 0; i < size; i++) {
14158839c5e2SWei Hu (Xavier) if (ids[i] >= cnt_stats) {
14165bddaf38SHuisong Li hns3_err(hw, "ids[%u] (%" PRIu64 ") is invalid, should < %u",
14175bddaf38SHuisong Li i, ids[i], cnt_stats);
14184016d76bSChengwen Feng rte_free(names_copy);
14198839c5e2SWei Hu (Xavier) return -EINVAL;
14208839c5e2SWei Hu (Xavier) }
14218839c5e2SWei Hu (Xavier) snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
14224016d76bSChengwen Feng "%s", names_copy[ids[i]].name);
14238839c5e2SWei Hu (Xavier) }
14248839c5e2SWei Hu (Xavier)
14254016d76bSChengwen Feng rte_free(names_copy);
14268839c5e2SWei Hu (Xavier) return size;
14278839c5e2SWei Hu (Xavier) }
14288839c5e2SWei Hu (Xavier)
1429ec12dc5aSHuisong Li static void
hns3_tqp_dfx_stats_clear(struct rte_eth_dev * dev)1430ec12dc5aSHuisong Li hns3_tqp_dfx_stats_clear(struct rte_eth_dev *dev)
1431ec12dc5aSHuisong Li {
1432ec12dc5aSHuisong Li struct hns3_rx_queue *rxq;
1433ec12dc5aSHuisong Li struct hns3_tx_queue *txq;
14349b77f1feSHuisong Li uint16_t i;
1435ec12dc5aSHuisong Li
1436ec12dc5aSHuisong Li /* Clear Rx dfx stats */
14379b77f1feSHuisong Li for (i = 0; i < dev->data->nb_rx_queues; i++) {
1438ec12dc5aSHuisong Li rxq = dev->data->rx_queues[i];
14399b77f1feSHuisong Li if (rxq)
14409b77f1feSHuisong Li memset(&rxq->dfx_stats, 0,
14419b77f1feSHuisong Li sizeof(struct hns3_rx_dfx_stats));
1442ec12dc5aSHuisong Li }
1443ec12dc5aSHuisong Li
1444ec12dc5aSHuisong Li /* Clear Tx dfx stats */
14459b77f1feSHuisong Li for (i = 0; i < dev->data->nb_tx_queues; i++) {
1446ec12dc5aSHuisong Li txq = dev->data->tx_queues[i];
14479b77f1feSHuisong Li if (txq)
14489b77f1feSHuisong Li memset(&txq->dfx_stats, 0,
14499b77f1feSHuisong Li sizeof(struct hns3_tx_dfx_stats));
1450ec12dc5aSHuisong Li }
1451ec12dc5aSHuisong Li }
1452ec12dc5aSHuisong Li
14538839c5e2SWei Hu (Xavier) int
hns3_dev_xstats_reset(struct rte_eth_dev * dev)14548839c5e2SWei Hu (Xavier) hns3_dev_xstats_reset(struct rte_eth_dev *dev)
14558839c5e2SWei Hu (Xavier) {
14568839c5e2SWei Hu (Xavier) struct hns3_adapter *hns = dev->data->dev_private;
1457a65342d9SHuisong Li struct hns3_hw *hw = &hns->hw;
145868ca93e3SWei Hu (Xavier) int ret;
14598839c5e2SWei Hu (Xavier)
14608839c5e2SWei Hu (Xavier) /* Clear tqp stats */
146168ca93e3SWei Hu (Xavier) ret = hns3_stats_reset(dev);
146268ca93e3SWei Hu (Xavier) if (ret)
146368ca93e3SWei Hu (Xavier) return ret;
146468ca93e3SWei Hu (Xavier)
1465a65342d9SHuisong Li rte_spinlock_lock(&hw->stats_lock);
146686c551d1SHuisong Li hns3_tqp_dfx_stats_clear(dev);
146786c551d1SHuisong Li
14688839c5e2SWei Hu (Xavier) /* Clear reset stats */
14698839c5e2SWei Hu (Xavier) memset(&hns->hw.reset.stats, 0, sizeof(struct hns3_reset_stats));
14708839c5e2SWei Hu (Xavier)
14718839c5e2SWei Hu (Xavier) if (hns->is_vf)
1472a65342d9SHuisong Li goto out;
14738839c5e2SWei Hu (Xavier)
1474c05a5409SHuisong Li ret = hns3_mac_stats_reset(hw);
147568ca93e3SWei Hu (Xavier)
1476a65342d9SHuisong Li out:
1477a65342d9SHuisong Li rte_spinlock_unlock(&hw->stats_lock);
1478a65342d9SHuisong Li
1479a65342d9SHuisong Li return ret;
14808839c5e2SWei Hu (Xavier) }
148176d79456SWei Hu (Xavier)
14821a1de987SHuisong Li static int
hns3_tqp_stats_init(struct hns3_hw * hw)148376d79456SWei Hu (Xavier) hns3_tqp_stats_init(struct hns3_hw *hw)
148476d79456SWei Hu (Xavier) {
148576d79456SWei Hu (Xavier) struct hns3_tqp_stats *tqp_stats = &hw->tqp_stats;
148676d79456SWei Hu (Xavier)
148776d79456SWei Hu (Xavier) tqp_stats->rcb_rx_ring_pktnum = rte_zmalloc("hns3_rx_ring_pkt_num",
148876d79456SWei Hu (Xavier) sizeof(uint64_t) * hw->tqps_num, 0);
148976d79456SWei Hu (Xavier) if (tqp_stats->rcb_rx_ring_pktnum == NULL) {
149076d79456SWei Hu (Xavier) hns3_err(hw, "failed to allocate rx_ring pkt_num.");
149176d79456SWei Hu (Xavier) return -ENOMEM;
149276d79456SWei Hu (Xavier) }
149376d79456SWei Hu (Xavier)
149476d79456SWei Hu (Xavier) tqp_stats->rcb_tx_ring_pktnum = rte_zmalloc("hns3_tx_ring_pkt_num",
149576d79456SWei Hu (Xavier) sizeof(uint64_t) * hw->tqps_num, 0);
149676d79456SWei Hu (Xavier) if (tqp_stats->rcb_tx_ring_pktnum == NULL) {
149776d79456SWei Hu (Xavier) hns3_err(hw, "failed to allocate tx_ring pkt_num.");
149876d79456SWei Hu (Xavier) rte_free(tqp_stats->rcb_rx_ring_pktnum);
149976d79456SWei Hu (Xavier) tqp_stats->rcb_rx_ring_pktnum = NULL;
150076d79456SWei Hu (Xavier) return -ENOMEM;
150176d79456SWei Hu (Xavier) }
150276d79456SWei Hu (Xavier)
150376d79456SWei Hu (Xavier) return 0;
150476d79456SWei Hu (Xavier) }
150576d79456SWei Hu (Xavier)
15061a1de987SHuisong Li static void
hns3_tqp_stats_uninit(struct hns3_hw * hw)150776d79456SWei Hu (Xavier) hns3_tqp_stats_uninit(struct hns3_hw *hw)
150876d79456SWei Hu (Xavier) {
150976d79456SWei Hu (Xavier) struct hns3_tqp_stats *tqp_stats = &hw->tqp_stats;
151076d79456SWei Hu (Xavier)
151176d79456SWei Hu (Xavier) rte_free(tqp_stats->rcb_rx_ring_pktnum);
151276d79456SWei Hu (Xavier) tqp_stats->rcb_rx_ring_pktnum = NULL;
151376d79456SWei Hu (Xavier) rte_free(tqp_stats->rcb_tx_ring_pktnum);
151476d79456SWei Hu (Xavier) tqp_stats->rcb_tx_ring_pktnum = NULL;
151576d79456SWei Hu (Xavier) }
151676d79456SWei Hu (Xavier)
151776d79456SWei Hu (Xavier) static void
hns3_tqp_stats_clear(struct hns3_hw * hw)151876d79456SWei Hu (Xavier) hns3_tqp_stats_clear(struct hns3_hw *hw)
151976d79456SWei Hu (Xavier) {
152076d79456SWei Hu (Xavier) struct hns3_tqp_stats *stats = &hw->tqp_stats;
152176d79456SWei Hu (Xavier)
152276d79456SWei Hu (Xavier) stats->rcb_rx_ring_pktnum_rcd = 0;
152376d79456SWei Hu (Xavier) stats->rcb_tx_ring_pktnum_rcd = 0;
152476d79456SWei Hu (Xavier) memset(stats->rcb_rx_ring_pktnum, 0, sizeof(uint64_t) * hw->tqps_num);
152576d79456SWei Hu (Xavier) memset(stats->rcb_tx_ring_pktnum, 0, sizeof(uint64_t) * hw->tqps_num);
152676d79456SWei Hu (Xavier) }
15271a1de987SHuisong Li
15281a1de987SHuisong Li int
hns3_stats_init(struct hns3_hw * hw)15291a1de987SHuisong Li hns3_stats_init(struct hns3_hw *hw)
15301a1de987SHuisong Li {
1531b38bd88bSHuisong Li struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw);
15321a1de987SHuisong Li int ret;
15331a1de987SHuisong Li
1534a65342d9SHuisong Li rte_spinlock_init(&hw->stats_lock);
15351a1de987SHuisong Li /* Hardware statistics of imissed registers cleared. */
15361a1de987SHuisong Li ret = hns3_update_imissed_stats(hw, true);
15371a1de987SHuisong Li if (ret) {
15381a1de987SHuisong Li hns3_err(hw, "clear imissed stats failed, ret = %d", ret);
15391a1de987SHuisong Li return ret;
15401a1de987SHuisong Li }
15411a1de987SHuisong Li
1542*08159599SJie Hai if (!hns->is_vf) {
1543*08159599SJie Hai ret = hns3_mac_stats_reset(hw);
1544*08159599SJie Hai if (ret) {
1545*08159599SJie Hai hns3_err(hw, "reset mac stats failed, ret = %d", ret);
1546*08159599SJie Hai return ret;
1547*08159599SJie Hai }
1548*08159599SJie Hai }
1549b38bd88bSHuisong Li
15501a1de987SHuisong Li return hns3_tqp_stats_init(hw);
15511a1de987SHuisong Li }
15521a1de987SHuisong Li
15531a1de987SHuisong Li void
hns3_stats_uninit(struct hns3_hw * hw)15541a1de987SHuisong Li hns3_stats_uninit(struct hns3_hw *hw)
15551a1de987SHuisong Li {
15561a1de987SHuisong Li hns3_tqp_stats_uninit(hw);
15571a1de987SHuisong Li }
1558a65342d9SHuisong Li
1559a65342d9SHuisong Li static void
hns3_update_queues_stats(struct hns3_hw * hw)1560a65342d9SHuisong Li hns3_update_queues_stats(struct hns3_hw *hw)
1561a65342d9SHuisong Li {
1562a65342d9SHuisong Li struct rte_eth_dev_data *data = hw->data;
1563a65342d9SHuisong Li struct hns3_rx_queue *rxq;
1564a65342d9SHuisong Li struct hns3_tx_queue *txq;
1565a65342d9SHuisong Li uint16_t i;
1566a65342d9SHuisong Li
1567a65342d9SHuisong Li for (i = 0; i < data->nb_rx_queues; i++) {
1568a65342d9SHuisong Li rxq = data->rx_queues[i];
1569a65342d9SHuisong Li if (rxq != NULL)
1570a65342d9SHuisong Li hns3_rcb_rx_ring_stats_get(rxq, &hw->tqp_stats);
1571a65342d9SHuisong Li }
1572a65342d9SHuisong Li
1573a65342d9SHuisong Li for (i = 0; i < data->nb_tx_queues; i++) {
1574a65342d9SHuisong Li txq = data->tx_queues[i];
1575a65342d9SHuisong Li if (txq != NULL)
1576a65342d9SHuisong Li hns3_rcb_tx_ring_stats_get(txq, &hw->tqp_stats);
1577a65342d9SHuisong Li }
1578a65342d9SHuisong Li }
1579a65342d9SHuisong Li
1580a65342d9SHuisong Li /*
1581a65342d9SHuisong Li * Some hardware statistics registers are not 64-bit. If hardware statistics are
1582a65342d9SHuisong Li * not obtained for a long time, these statistics may be reversed. This function
1583a65342d9SHuisong Li * is used to update these hardware statistics in periodic task.
1584a65342d9SHuisong Li */
1585a65342d9SHuisong Li void
hns3_update_hw_stats(struct hns3_hw * hw)1586a65342d9SHuisong Li hns3_update_hw_stats(struct hns3_hw *hw)
1587a65342d9SHuisong Li {
1588a65342d9SHuisong Li struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw);
1589a65342d9SHuisong Li
1590a65342d9SHuisong Li rte_spinlock_lock(&hw->stats_lock);
1591a65342d9SHuisong Li if (!hns->is_vf)
1592a65342d9SHuisong Li hns3_update_mac_stats(hw);
1593a65342d9SHuisong Li
1594a65342d9SHuisong Li hns3_update_queues_stats(hw);
1595a65342d9SHuisong Li rte_spinlock_unlock(&hw->stats_lock);
1596a65342d9SHuisong Li }
1597