xref: /dpdk/drivers/net/hns3/hns3_stats.c (revision 08159599978f7f7eb6c4aaed7c290e33b8bc3d64)
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