146a3df9fSSalil /* 246a3df9fSSalil * Copyright (c) 2016~2017 Hisilicon Limited. 346a3df9fSSalil * 446a3df9fSSalil * This program is free software; you can redistribute it and/or modify 546a3df9fSSalil * it under the terms of the GNU General Public License as published by 646a3df9fSSalil * the Free Software Foundation; either version 2 of the License, or 746a3df9fSSalil * (at your option) any later version. 846a3df9fSSalil */ 946a3df9fSSalil 1046a3df9fSSalil #ifndef __HCLGE_MAIN_H 1146a3df9fSSalil #define __HCLGE_MAIN_H 1246a3df9fSSalil #include <linux/fs.h> 1346a3df9fSSalil #include <linux/types.h> 1446a3df9fSSalil #include <linux/phy.h> 15dc8131d8SYunsheng Lin #include <linux/if_vlan.h> 16dc8131d8SYunsheng Lin 1746a3df9fSSalil #include "hclge_cmd.h" 1846a3df9fSSalil #include "hnae3.h" 1946a3df9fSSalil 203c7624d8SXi Wang #define HCLGE_MOD_VERSION "1.0" 2146a3df9fSSalil #define HCLGE_DRIVER_NAME "hclge" 2246a3df9fSSalil 2346a3df9fSSalil #define HCLGE_INVALID_VPORT 0xffff 2446a3df9fSSalil 2546a3df9fSSalil #define HCLGE_ROCE_VECTOR_OFFSET 96 2646a3df9fSSalil 2746a3df9fSSalil #define HCLGE_PF_CFG_BLOCK_SIZE 32 2846a3df9fSSalil #define HCLGE_PF_CFG_DESC_NUM \ 2946a3df9fSSalil (HCLGE_PF_CFG_BLOCK_SIZE / HCLGE_CFG_RD_LEN_BYTES) 3046a3df9fSSalil 3146a3df9fSSalil #define HCLGE_VECTOR_REG_BASE 0x20000 32466b0c00SLipeng #define HCLGE_MISC_VECTOR_REG_BASE 0x20400 3346a3df9fSSalil 3446a3df9fSSalil #define HCLGE_VECTOR_REG_OFFSET 0x4 3546a3df9fSSalil #define HCLGE_VECTOR_VF_OFFSET 0x100000 3646a3df9fSSalil 3746a3df9fSSalil #define HCLGE_RSS_IND_TBL_SIZE 512 385392902dSYunsheng Lin #define HCLGE_RSS_SET_BITMAP_MSK GENMASK(15, 0) 3946a3df9fSSalil #define HCLGE_RSS_KEY_SIZE 40 4046a3df9fSSalil #define HCLGE_RSS_HASH_ALGO_TOEPLITZ 0 4146a3df9fSSalil #define HCLGE_RSS_HASH_ALGO_SIMPLE 1 4246a3df9fSSalil #define HCLGE_RSS_HASH_ALGO_SYMMETRIC 2 4346a3df9fSSalil #define HCLGE_RSS_HASH_ALGO_MASK 0xf 4446a3df9fSSalil #define HCLGE_RSS_CFG_TBL_NUM \ 4546a3df9fSSalil (HCLGE_RSS_IND_TBL_SIZE / HCLGE_RSS_CFG_TBL_SIZE) 4646a3df9fSSalil 47f7db940aSLipeng #define HCLGE_RSS_INPUT_TUPLE_OTHER GENMASK(3, 0) 48f7db940aSLipeng #define HCLGE_RSS_INPUT_TUPLE_SCTP GENMASK(4, 0) 49f7db940aSLipeng #define HCLGE_D_PORT_BIT BIT(0) 50f7db940aSLipeng #define HCLGE_S_PORT_BIT BIT(1) 51f7db940aSLipeng #define HCLGE_D_IP_BIT BIT(2) 52f7db940aSLipeng #define HCLGE_S_IP_BIT BIT(3) 53f7db940aSLipeng #define HCLGE_V_TAG_BIT BIT(4) 54f7db940aSLipeng 5546a3df9fSSalil #define HCLGE_RSS_TC_SIZE_0 1 5646a3df9fSSalil #define HCLGE_RSS_TC_SIZE_1 2 5746a3df9fSSalil #define HCLGE_RSS_TC_SIZE_2 4 5846a3df9fSSalil #define HCLGE_RSS_TC_SIZE_3 8 5946a3df9fSSalil #define HCLGE_RSS_TC_SIZE_4 16 6046a3df9fSSalil #define HCLGE_RSS_TC_SIZE_5 32 6146a3df9fSSalil #define HCLGE_RSS_TC_SIZE_6 64 6246a3df9fSSalil #define HCLGE_RSS_TC_SIZE_7 128 6346a3df9fSSalil 6440cca1c5SXi Wang #define HCLGE_MTA_TBL_SIZE 4096 6540cca1c5SXi Wang 6646a3df9fSSalil #define HCLGE_TQP_RESET_TRY_TIMES 10 6746a3df9fSSalil 6846a3df9fSSalil #define HCLGE_PHY_PAGE_MDIX 0 6946a3df9fSSalil #define HCLGE_PHY_PAGE_COPPER 0 7046a3df9fSSalil 7146a3df9fSSalil /* Page Selection Reg. */ 7246a3df9fSSalil #define HCLGE_PHY_PAGE_REG 22 7346a3df9fSSalil 7446a3df9fSSalil /* Copper Specific Control Register */ 7546a3df9fSSalil #define HCLGE_PHY_CSC_REG 16 7646a3df9fSSalil 7746a3df9fSSalil /* Copper Specific Status Register */ 7846a3df9fSSalil #define HCLGE_PHY_CSS_REG 17 7946a3df9fSSalil 80*a10829c4SJian Shen #define HCLGE_PHY_MDIX_CTRL_S 5 815392902dSYunsheng Lin #define HCLGE_PHY_MDIX_CTRL_M GENMASK(6, 5) 8246a3df9fSSalil 83*a10829c4SJian Shen #define HCLGE_PHY_MDIX_STATUS_B 6 84*a10829c4SJian Shen #define HCLGE_PHY_SPEED_DUP_RESOLVE_B 11 8546a3df9fSSalil 865f6ea83fSPeng Li /* Factor used to calculate offset and bitmap of VF num */ 875f6ea83fSPeng Li #define HCLGE_VF_NUM_PER_CMD 64 885f6ea83fSPeng Li #define HCLGE_VF_NUM_PER_BYTE 8 895f6ea83fSPeng Li 904ed340abSLipeng /* Reset related Registers */ 914ed340abSLipeng #define HCLGE_MISC_RESET_STS_REG 0x20700 929ca8d1a7SHuazhong Tan #define HCLGE_MISC_VECTOR_INT_STS 0x20800 934ed340abSLipeng #define HCLGE_GLOBAL_RESET_REG 0x20A00 944ed340abSLipeng #define HCLGE_GLOBAL_RESET_BIT 0x0 954ed340abSLipeng #define HCLGE_CORE_RESET_BIT 0x1 964ed340abSLipeng #define HCLGE_FUN_RST_ING 0x20C00 974ed340abSLipeng #define HCLGE_FUN_RST_ING_B 0 984ed340abSLipeng 994ed340abSLipeng /* Vector0 register bits define */ 1004ed340abSLipeng #define HCLGE_VECTOR0_GLOBALRESET_INT_B 5 1014ed340abSLipeng #define HCLGE_VECTOR0_CORERESET_INT_B 6 1024ed340abSLipeng #define HCLGE_VECTOR0_IMPRESET_INT_B 7 1034ed340abSLipeng 104c1a81619SSalil Mehta /* Vector0 interrupt CMDQ event source register(RW) */ 105c1a81619SSalil Mehta #define HCLGE_VECTOR0_CMDQ_SRC_REG 0x27100 106c1a81619SSalil Mehta /* CMDQ register bits for RX event(=MBX event) */ 107c1a81619SSalil Mehta #define HCLGE_VECTOR0_RX_CMDQ_INT_B 1 108c1a81619SSalil Mehta 1092866ccb2SFuyun Liang #define HCLGE_MAC_DEFAULT_FRAME \ 1102866ccb2SFuyun Liang (ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN + ETH_DATA_LEN) 1112866ccb2SFuyun Liang #define HCLGE_MAC_MIN_FRAME 64 1122866ccb2SFuyun Liang #define HCLGE_MAC_MAX_FRAME 9728 1132866ccb2SFuyun Liang 1140979aa0bSFuyun Liang #define HCLGE_SUPPORT_1G_BIT BIT(0) 1150979aa0bSFuyun Liang #define HCLGE_SUPPORT_10G_BIT BIT(1) 1160979aa0bSFuyun Liang #define HCLGE_SUPPORT_25G_BIT BIT(2) 1170979aa0bSFuyun Liang #define HCLGE_SUPPORT_50G_BIT BIT(3) 1180979aa0bSFuyun Liang #define HCLGE_SUPPORT_100G_BIT BIT(4) 1190979aa0bSFuyun Liang 12046a3df9fSSalil enum HCLGE_DEV_STATE { 12146a3df9fSSalil HCLGE_STATE_REINITING, 12246a3df9fSSalil HCLGE_STATE_DOWN, 12346a3df9fSSalil HCLGE_STATE_DISABLED, 12446a3df9fSSalil HCLGE_STATE_REMOVING, 12546a3df9fSSalil HCLGE_STATE_SERVICE_INITED, 12646a3df9fSSalil HCLGE_STATE_SERVICE_SCHED, 127cb1b9f77SSalil Mehta HCLGE_STATE_RST_SERVICE_SCHED, 128cb1b9f77SSalil Mehta HCLGE_STATE_RST_HANDLING, 129c1a81619SSalil Mehta HCLGE_STATE_MBX_SERVICE_SCHED, 13046a3df9fSSalil HCLGE_STATE_MBX_HANDLING, 131c5f65480SJian Shen HCLGE_STATE_STATISTICS_UPDATING, 1328d40854fSHuazhong Tan HCLGE_STATE_CMD_DISABLE, 13346a3df9fSSalil HCLGE_STATE_MAX 13446a3df9fSSalil }; 13546a3df9fSSalil 136ca1d7669SSalil Mehta enum hclge_evt_cause { 137ca1d7669SSalil Mehta HCLGE_VECTOR0_EVENT_RST, 138ca1d7669SSalil Mehta HCLGE_VECTOR0_EVENT_MBX, 139ca1d7669SSalil Mehta HCLGE_VECTOR0_EVENT_OTHER, 140ca1d7669SSalil Mehta }; 141ca1d7669SSalil Mehta 14246a3df9fSSalil #define HCLGE_MPF_ENBALE 1 14346a3df9fSSalil struct hclge_caps { 14446a3df9fSSalil u16 num_tqp; 14546a3df9fSSalil u16 num_buffer_cell; 14646a3df9fSSalil u32 flag; 14746a3df9fSSalil u16 vmdq; 14846a3df9fSSalil }; 14946a3df9fSSalil 15046a3df9fSSalil enum HCLGE_MAC_SPEED { 15146a3df9fSSalil HCLGE_MAC_SPEED_10M = 10, /* 10 Mbps */ 15246a3df9fSSalil HCLGE_MAC_SPEED_100M = 100, /* 100 Mbps */ 15346a3df9fSSalil HCLGE_MAC_SPEED_1G = 1000, /* 1000 Mbps = 1 Gbps */ 15446a3df9fSSalil HCLGE_MAC_SPEED_10G = 10000, /* 10000 Mbps = 10 Gbps */ 15546a3df9fSSalil HCLGE_MAC_SPEED_25G = 25000, /* 25000 Mbps = 25 Gbps */ 15646a3df9fSSalil HCLGE_MAC_SPEED_40G = 40000, /* 40000 Mbps = 40 Gbps */ 15746a3df9fSSalil HCLGE_MAC_SPEED_50G = 50000, /* 50000 Mbps = 50 Gbps */ 15846a3df9fSSalil HCLGE_MAC_SPEED_100G = 100000 /* 100000 Mbps = 100 Gbps */ 15946a3df9fSSalil }; 16046a3df9fSSalil 16146a3df9fSSalil enum HCLGE_MAC_DUPLEX { 16246a3df9fSSalil HCLGE_MAC_HALF, 16346a3df9fSSalil HCLGE_MAC_FULL 16446a3df9fSSalil }; 16546a3df9fSSalil 16646a3df9fSSalil enum hclge_mta_dmac_sel_type { 16746a3df9fSSalil HCLGE_MAC_ADDR_47_36, 16846a3df9fSSalil HCLGE_MAC_ADDR_46_35, 16946a3df9fSSalil HCLGE_MAC_ADDR_45_34, 17046a3df9fSSalil HCLGE_MAC_ADDR_44_33, 17146a3df9fSSalil }; 17246a3df9fSSalil 17346a3df9fSSalil struct hclge_mac { 17446a3df9fSSalil u8 phy_addr; 17546a3df9fSSalil u8 flag; 17646a3df9fSSalil u8 media_type; 17746a3df9fSSalil u8 mac_addr[ETH_ALEN]; 17846a3df9fSSalil u8 autoneg; 17946a3df9fSSalil u8 duplex; 18046a3df9fSSalil u32 speed; 18146a3df9fSSalil int link; /* store the link status of mac & phy (if phy exit)*/ 18246a3df9fSSalil struct phy_device *phydev; 18346a3df9fSSalil struct mii_bus *mdio_bus; 18446a3df9fSSalil phy_interface_t phy_if; 1850979aa0bSFuyun Liang __ETHTOOL_DECLARE_LINK_MODE_MASK(supported); 1860979aa0bSFuyun Liang __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising); 18746a3df9fSSalil }; 18846a3df9fSSalil 18946a3df9fSSalil struct hclge_hw { 19046a3df9fSSalil void __iomem *io_base; 19146a3df9fSSalil struct hclge_mac mac; 19246a3df9fSSalil int num_vec; 19346a3df9fSSalil struct hclge_cmq cmq; 19446a3df9fSSalil struct hclge_caps caps; 19546a3df9fSSalil }; 19646a3df9fSSalil 19746a3df9fSSalil /* TQP stats */ 19846a3df9fSSalil struct hlcge_tqp_stats { 19946a3df9fSSalil /* query_tqp_tx_queue_statistics ,opcode id: 0x0B03 */ 20046a3df9fSSalil u64 rcb_tx_ring_pktnum_rcd; /* 32bit */ 20146a3df9fSSalil /* query_tqp_rx_queue_statistics ,opcode id: 0x0B13 */ 20246a3df9fSSalil u64 rcb_rx_ring_pktnum_rcd; /* 32bit */ 20346a3df9fSSalil }; 20446a3df9fSSalil 20546a3df9fSSalil struct hclge_tqp { 20646a3df9fSSalil struct device *dev; /* Device for DMA mapping */ 20746a3df9fSSalil struct hnae3_queue q; 20846a3df9fSSalil struct hlcge_tqp_stats tqp_stats; 20946a3df9fSSalil u16 index; /* Global index in a NIC controller */ 21046a3df9fSSalil 21146a3df9fSSalil bool alloced; 21246a3df9fSSalil }; 21346a3df9fSSalil 21446a3df9fSSalil enum hclge_fc_mode { 21546a3df9fSSalil HCLGE_FC_NONE, 21646a3df9fSSalil HCLGE_FC_RX_PAUSE, 21746a3df9fSSalil HCLGE_FC_TX_PAUSE, 21846a3df9fSSalil HCLGE_FC_FULL, 21946a3df9fSSalil HCLGE_FC_PFC, 22046a3df9fSSalil HCLGE_FC_DEFAULT 22146a3df9fSSalil }; 22246a3df9fSSalil 22346a3df9fSSalil #define HCLGE_PG_NUM 4 22446a3df9fSSalil #define HCLGE_SCH_MODE_SP 0 22546a3df9fSSalil #define HCLGE_SCH_MODE_DWRR 1 22646a3df9fSSalil struct hclge_pg_info { 22746a3df9fSSalil u8 pg_id; 22846a3df9fSSalil u8 pg_sch_mode; /* 0: sp; 1: dwrr */ 22946a3df9fSSalil u8 tc_bit_map; 23046a3df9fSSalil u32 bw_limit; 23146a3df9fSSalil u8 tc_dwrr[HNAE3_MAX_TC]; 23246a3df9fSSalil }; 23346a3df9fSSalil 23446a3df9fSSalil struct hclge_tc_info { 23546a3df9fSSalil u8 tc_id; 23646a3df9fSSalil u8 tc_sch_mode; /* 0: sp; 1: dwrr */ 23746a3df9fSSalil u8 pgid; 23846a3df9fSSalil u32 bw_limit; 23946a3df9fSSalil }; 24046a3df9fSSalil 24146a3df9fSSalil struct hclge_cfg { 24246a3df9fSSalil u8 vmdq_vport_num; 24346a3df9fSSalil u8 tc_num; 24446a3df9fSSalil u16 tqp_desc_num; 24546a3df9fSSalil u16 rx_buf_len; 2460e7a40cdSPeng Li u16 rss_size_max; 24746a3df9fSSalil u8 phy_addr; 24846a3df9fSSalil u8 media_type; 24946a3df9fSSalil u8 mac_addr[ETH_ALEN]; 25046a3df9fSSalil u8 default_speed; 25146a3df9fSSalil u32 numa_node_map; 2520979aa0bSFuyun Liang u8 speed_ability; 25346a3df9fSSalil }; 25446a3df9fSSalil 25546a3df9fSSalil struct hclge_tm_info { 25646a3df9fSSalil u8 num_tc; 25746a3df9fSSalil u8 num_pg; /* It must be 1 if vNET-Base schd */ 25846a3df9fSSalil u8 pg_dwrr[HCLGE_PG_NUM]; 259c5795c53SYunsheng Lin u8 prio_tc[HNAE3_MAX_USER_PRIO]; 26046a3df9fSSalil struct hclge_pg_info pg_info[HCLGE_PG_NUM]; 26146a3df9fSSalil struct hclge_tc_info tc_info[HNAE3_MAX_TC]; 26246a3df9fSSalil enum hclge_fc_mode fc_mode; 26346a3df9fSSalil u8 hw_pfc_map; /* Allow for packet drop or not on this TC */ 26446a3df9fSSalil }; 26546a3df9fSSalil 26646a3df9fSSalil struct hclge_comm_stats_str { 26746a3df9fSSalil char desc[ETH_GSTRING_LEN]; 26846a3df9fSSalil unsigned long offset; 26946a3df9fSSalil }; 27046a3df9fSSalil 27146a3df9fSSalil /* all 64bit stats, opcode id: 0x0030 */ 27246a3df9fSSalil struct hclge_64_bit_stats { 27346a3df9fSSalil /* query_igu_stat */ 27446a3df9fSSalil u64 igu_rx_oversize_pkt; 27546a3df9fSSalil u64 igu_rx_undersize_pkt; 27646a3df9fSSalil u64 igu_rx_out_all_pkt; 27746a3df9fSSalil u64 igu_rx_uni_pkt; 27846a3df9fSSalil u64 igu_rx_multi_pkt; 27946a3df9fSSalil u64 igu_rx_broad_pkt; 28046a3df9fSSalil u64 rsv0; 28146a3df9fSSalil 28246a3df9fSSalil /* query_egu_stat */ 28346a3df9fSSalil u64 egu_tx_out_all_pkt; 28446a3df9fSSalil u64 egu_tx_uni_pkt; 28546a3df9fSSalil u64 egu_tx_multi_pkt; 28646a3df9fSSalil u64 egu_tx_broad_pkt; 28746a3df9fSSalil 28846a3df9fSSalil /* ssu_ppp packet stats */ 28946a3df9fSSalil u64 ssu_ppp_mac_key_num; 29046a3df9fSSalil u64 ssu_ppp_host_key_num; 29146a3df9fSSalil u64 ppp_ssu_mac_rlt_num; 29246a3df9fSSalil u64 ppp_ssu_host_rlt_num; 29346a3df9fSSalil 29446a3df9fSSalil /* ssu_tx_in_out_dfx_stats */ 29546a3df9fSSalil u64 ssu_tx_in_num; 29646a3df9fSSalil u64 ssu_tx_out_num; 29746a3df9fSSalil /* ssu_rx_in_out_dfx_stats */ 29846a3df9fSSalil u64 ssu_rx_in_num; 29946a3df9fSSalil u64 ssu_rx_out_num; 30046a3df9fSSalil }; 30146a3df9fSSalil 30246a3df9fSSalil /* all 32bit stats, opcode id: 0x0031 */ 30346a3df9fSSalil struct hclge_32_bit_stats { 30446a3df9fSSalil u64 igu_rx_err_pkt; 30546a3df9fSSalil u64 igu_rx_no_eof_pkt; 30646a3df9fSSalil u64 igu_rx_no_sof_pkt; 30746a3df9fSSalil u64 egu_tx_1588_pkt; 30846a3df9fSSalil u64 egu_tx_err_pkt; 30946a3df9fSSalil u64 ssu_full_drop_num; 31046a3df9fSSalil u64 ssu_part_drop_num; 31146a3df9fSSalil u64 ppp_key_drop_num; 31246a3df9fSSalil u64 ppp_rlt_drop_num; 31346a3df9fSSalil u64 ssu_key_drop_num; 31446a3df9fSSalil u64 pkt_curr_buf_cnt; 31546a3df9fSSalil u64 qcn_fb_rcv_cnt; 31646a3df9fSSalil u64 qcn_fb_drop_cnt; 31746a3df9fSSalil u64 qcn_fb_invaild_cnt; 31846a3df9fSSalil u64 rsv0; 31946a3df9fSSalil u64 rx_packet_tc0_in_cnt; 32046a3df9fSSalil u64 rx_packet_tc1_in_cnt; 32146a3df9fSSalil u64 rx_packet_tc2_in_cnt; 32246a3df9fSSalil u64 rx_packet_tc3_in_cnt; 32346a3df9fSSalil u64 rx_packet_tc4_in_cnt; 32446a3df9fSSalil u64 rx_packet_tc5_in_cnt; 32546a3df9fSSalil u64 rx_packet_tc6_in_cnt; 32646a3df9fSSalil u64 rx_packet_tc7_in_cnt; 32746a3df9fSSalil u64 rx_packet_tc0_out_cnt; 32846a3df9fSSalil u64 rx_packet_tc1_out_cnt; 32946a3df9fSSalil u64 rx_packet_tc2_out_cnt; 33046a3df9fSSalil u64 rx_packet_tc3_out_cnt; 33146a3df9fSSalil u64 rx_packet_tc4_out_cnt; 33246a3df9fSSalil u64 rx_packet_tc5_out_cnt; 33346a3df9fSSalil u64 rx_packet_tc6_out_cnt; 33446a3df9fSSalil u64 rx_packet_tc7_out_cnt; 33546a3df9fSSalil 33646a3df9fSSalil /* Tx packet level statistics */ 33746a3df9fSSalil u64 tx_packet_tc0_in_cnt; 33846a3df9fSSalil u64 tx_packet_tc1_in_cnt; 33946a3df9fSSalil u64 tx_packet_tc2_in_cnt; 34046a3df9fSSalil u64 tx_packet_tc3_in_cnt; 34146a3df9fSSalil u64 tx_packet_tc4_in_cnt; 34246a3df9fSSalil u64 tx_packet_tc5_in_cnt; 34346a3df9fSSalil u64 tx_packet_tc6_in_cnt; 34446a3df9fSSalil u64 tx_packet_tc7_in_cnt; 34546a3df9fSSalil u64 tx_packet_tc0_out_cnt; 34646a3df9fSSalil u64 tx_packet_tc1_out_cnt; 34746a3df9fSSalil u64 tx_packet_tc2_out_cnt; 34846a3df9fSSalil u64 tx_packet_tc3_out_cnt; 34946a3df9fSSalil u64 tx_packet_tc4_out_cnt; 35046a3df9fSSalil u64 tx_packet_tc5_out_cnt; 35146a3df9fSSalil u64 tx_packet_tc6_out_cnt; 35246a3df9fSSalil u64 tx_packet_tc7_out_cnt; 35346a3df9fSSalil 35446a3df9fSSalil /* packet buffer statistics */ 35546a3df9fSSalil u64 pkt_curr_buf_tc0_cnt; 35646a3df9fSSalil u64 pkt_curr_buf_tc1_cnt; 35746a3df9fSSalil u64 pkt_curr_buf_tc2_cnt; 35846a3df9fSSalil u64 pkt_curr_buf_tc3_cnt; 35946a3df9fSSalil u64 pkt_curr_buf_tc4_cnt; 36046a3df9fSSalil u64 pkt_curr_buf_tc5_cnt; 36146a3df9fSSalil u64 pkt_curr_buf_tc6_cnt; 36246a3df9fSSalil u64 pkt_curr_buf_tc7_cnt; 36346a3df9fSSalil 36446a3df9fSSalil u64 mb_uncopy_num; 36546a3df9fSSalil u64 lo_pri_unicast_rlt_drop_num; 36646a3df9fSSalil u64 hi_pri_multicast_rlt_drop_num; 36746a3df9fSSalil u64 lo_pri_multicast_rlt_drop_num; 36846a3df9fSSalil u64 rx_oq_drop_pkt_cnt; 36946a3df9fSSalil u64 tx_oq_drop_pkt_cnt; 37046a3df9fSSalil u64 nic_l2_err_drop_pkt_cnt; 37146a3df9fSSalil u64 roc_l2_err_drop_pkt_cnt; 37246a3df9fSSalil }; 37346a3df9fSSalil 37446a3df9fSSalil /* mac stats ,opcode id: 0x0032 */ 37546a3df9fSSalil struct hclge_mac_stats { 37646a3df9fSSalil u64 mac_tx_mac_pause_num; 37746a3df9fSSalil u64 mac_rx_mac_pause_num; 37846a3df9fSSalil u64 mac_tx_pfc_pri0_pkt_num; 37946a3df9fSSalil u64 mac_tx_pfc_pri1_pkt_num; 38046a3df9fSSalil u64 mac_tx_pfc_pri2_pkt_num; 38146a3df9fSSalil u64 mac_tx_pfc_pri3_pkt_num; 38246a3df9fSSalil u64 mac_tx_pfc_pri4_pkt_num; 38346a3df9fSSalil u64 mac_tx_pfc_pri5_pkt_num; 38446a3df9fSSalil u64 mac_tx_pfc_pri6_pkt_num; 38546a3df9fSSalil u64 mac_tx_pfc_pri7_pkt_num; 38646a3df9fSSalil u64 mac_rx_pfc_pri0_pkt_num; 38746a3df9fSSalil u64 mac_rx_pfc_pri1_pkt_num; 38846a3df9fSSalil u64 mac_rx_pfc_pri2_pkt_num; 38946a3df9fSSalil u64 mac_rx_pfc_pri3_pkt_num; 39046a3df9fSSalil u64 mac_rx_pfc_pri4_pkt_num; 39146a3df9fSSalil u64 mac_rx_pfc_pri5_pkt_num; 39246a3df9fSSalil u64 mac_rx_pfc_pri6_pkt_num; 39346a3df9fSSalil u64 mac_rx_pfc_pri7_pkt_num; 39446a3df9fSSalil u64 mac_tx_total_pkt_num; 39546a3df9fSSalil u64 mac_tx_total_oct_num; 39646a3df9fSSalil u64 mac_tx_good_pkt_num; 39746a3df9fSSalil u64 mac_tx_bad_pkt_num; 39846a3df9fSSalil u64 mac_tx_good_oct_num; 39946a3df9fSSalil u64 mac_tx_bad_oct_num; 40046a3df9fSSalil u64 mac_tx_uni_pkt_num; 40146a3df9fSSalil u64 mac_tx_multi_pkt_num; 40246a3df9fSSalil u64 mac_tx_broad_pkt_num; 40346a3df9fSSalil u64 mac_tx_undersize_pkt_num; 404200a88c6SJian Shen u64 mac_tx_oversize_pkt_num; 40546a3df9fSSalil u64 mac_tx_64_oct_pkt_num; 40646a3df9fSSalil u64 mac_tx_65_127_oct_pkt_num; 40746a3df9fSSalil u64 mac_tx_128_255_oct_pkt_num; 40846a3df9fSSalil u64 mac_tx_256_511_oct_pkt_num; 40946a3df9fSSalil u64 mac_tx_512_1023_oct_pkt_num; 41046a3df9fSSalil u64 mac_tx_1024_1518_oct_pkt_num; 41191f384f6SJian Shen u64 mac_tx_1519_2047_oct_pkt_num; 41291f384f6SJian Shen u64 mac_tx_2048_4095_oct_pkt_num; 41391f384f6SJian Shen u64 mac_tx_4096_8191_oct_pkt_num; 414dbecc779SXi Wang u64 rsv0; 415dbecc779SXi Wang u64 mac_tx_8192_9216_oct_pkt_num; 416dbecc779SXi Wang u64 mac_tx_9217_12287_oct_pkt_num; 41791f384f6SJian Shen u64 mac_tx_12288_16383_oct_pkt_num; 41891f384f6SJian Shen u64 mac_tx_1519_max_good_oct_pkt_num; 41991f384f6SJian Shen u64 mac_tx_1519_max_bad_oct_pkt_num; 42091f384f6SJian Shen 42146a3df9fSSalil u64 mac_rx_total_pkt_num; 42246a3df9fSSalil u64 mac_rx_total_oct_num; 42346a3df9fSSalil u64 mac_rx_good_pkt_num; 42446a3df9fSSalil u64 mac_rx_bad_pkt_num; 42546a3df9fSSalil u64 mac_rx_good_oct_num; 42646a3df9fSSalil u64 mac_rx_bad_oct_num; 42746a3df9fSSalil u64 mac_rx_uni_pkt_num; 42846a3df9fSSalil u64 mac_rx_multi_pkt_num; 42946a3df9fSSalil u64 mac_rx_broad_pkt_num; 43046a3df9fSSalil u64 mac_rx_undersize_pkt_num; 431200a88c6SJian Shen u64 mac_rx_oversize_pkt_num; 43246a3df9fSSalil u64 mac_rx_64_oct_pkt_num; 43346a3df9fSSalil u64 mac_rx_65_127_oct_pkt_num; 43446a3df9fSSalil u64 mac_rx_128_255_oct_pkt_num; 43546a3df9fSSalil u64 mac_rx_256_511_oct_pkt_num; 43646a3df9fSSalil u64 mac_rx_512_1023_oct_pkt_num; 43746a3df9fSSalil u64 mac_rx_1024_1518_oct_pkt_num; 43891f384f6SJian Shen u64 mac_rx_1519_2047_oct_pkt_num; 43991f384f6SJian Shen u64 mac_rx_2048_4095_oct_pkt_num; 44091f384f6SJian Shen u64 mac_rx_4096_8191_oct_pkt_num; 441dbecc779SXi Wang u64 rsv1; 442dbecc779SXi Wang u64 mac_rx_8192_9216_oct_pkt_num; 443dbecc779SXi Wang u64 mac_rx_9217_12287_oct_pkt_num; 44491f384f6SJian Shen u64 mac_rx_12288_16383_oct_pkt_num; 44591f384f6SJian Shen u64 mac_rx_1519_max_good_oct_pkt_num; 44691f384f6SJian Shen u64 mac_rx_1519_max_bad_oct_pkt_num; 44746a3df9fSSalil 448a6c51c26SJian Shen u64 mac_tx_fragment_pkt_num; 449a6c51c26SJian Shen u64 mac_tx_undermin_pkt_num; 450a6c51c26SJian Shen u64 mac_tx_jabber_pkt_num; 451a6c51c26SJian Shen u64 mac_tx_err_all_pkt_num; 452a6c51c26SJian Shen u64 mac_tx_from_app_good_pkt_num; 453a6c51c26SJian Shen u64 mac_tx_from_app_bad_pkt_num; 454a6c51c26SJian Shen u64 mac_rx_fragment_pkt_num; 455a6c51c26SJian Shen u64 mac_rx_undermin_pkt_num; 456a6c51c26SJian Shen u64 mac_rx_jabber_pkt_num; 457a6c51c26SJian Shen u64 mac_rx_fcs_err_pkt_num; 458a6c51c26SJian Shen u64 mac_rx_send_app_good_pkt_num; 459a6c51c26SJian Shen u64 mac_rx_send_app_bad_pkt_num; 46046a3df9fSSalil }; 46146a3df9fSSalil 462c5f65480SJian Shen #define HCLGE_STATS_TIMER_INTERVAL (60 * 5) 46346a3df9fSSalil struct hclge_hw_stats { 46446a3df9fSSalil struct hclge_mac_stats mac_stats; 46546a3df9fSSalil struct hclge_64_bit_stats all_64_bit_stats; 46646a3df9fSSalil struct hclge_32_bit_stats all_32_bit_stats; 467c5f65480SJian Shen u32 stats_timer; 46846a3df9fSSalil }; 46946a3df9fSSalil 4705f6ea83fSPeng Li struct hclge_vlan_type_cfg { 4715f6ea83fSPeng Li u16 rx_ot_fst_vlan_type; 4725f6ea83fSPeng Li u16 rx_ot_sec_vlan_type; 4735f6ea83fSPeng Li u16 rx_in_fst_vlan_type; 4745f6ea83fSPeng Li u16 rx_in_sec_vlan_type; 4755f6ea83fSPeng Li u16 tx_ot_vlan_type; 4765f6ea83fSPeng Li u16 tx_in_vlan_type; 4775f6ea83fSPeng Li }; 4785f6ea83fSPeng Li 479dc8131d8SYunsheng Lin #define HCLGE_VPORT_NUM 256 48046a3df9fSSalil struct hclge_dev { 48146a3df9fSSalil struct pci_dev *pdev; 48246a3df9fSSalil struct hnae3_ae_dev *ae_dev; 48346a3df9fSSalil struct hclge_hw hw; 484466b0c00SLipeng struct hclge_misc_vector misc_vector; 48546a3df9fSSalil struct hclge_hw_stats hw_stats; 48646a3df9fSSalil unsigned long state; 48746a3df9fSSalil 4884ed340abSLipeng enum hnae3_reset_type reset_type; 489cb1b9f77SSalil Mehta unsigned long reset_request; /* reset has been requested */ 490ca1d7669SSalil Mehta unsigned long reset_pending; /* client rst is pending to be served */ 49146a3df9fSSalil u32 fw_version; 49246a3df9fSSalil u16 num_vmdq_vport; /* Num vmdq vport this PF has set up */ 49346a3df9fSSalil u16 num_tqps; /* Num task queue pairs of this PF */ 49446a3df9fSSalil u16 num_req_vfs; /* Num VFs requested for this PF */ 49546a3df9fSSalil 49646a3df9fSSalil /* Base task tqp physical id of this PF */ 49746a3df9fSSalil u16 base_tqp_pid; 49846a3df9fSSalil u16 alloc_rss_size; /* Allocated RSS task queue */ 49946a3df9fSSalil u16 rss_size_max; /* HW defined max RSS task queue */ 50046a3df9fSSalil 50146a3df9fSSalil /* Num of guaranteed filters for this PF */ 50246a3df9fSSalil u16 fdir_pf_filter_count; 50346a3df9fSSalil u16 num_alloc_vport; /* Num vports this driver supports */ 50446a3df9fSSalil u32 numa_node_mask; 50546a3df9fSSalil u16 rx_buf_len; 50646a3df9fSSalil u16 num_desc; 50746a3df9fSSalil u8 hw_tc_map; 50846a3df9fSSalil u8 tc_num_last_time; 50946a3df9fSSalil enum hclge_fc_mode fc_mode_last_time; 51046a3df9fSSalil 51146a3df9fSSalil #define HCLGE_FLAG_TC_BASE_SCH_MODE 1 51246a3df9fSSalil #define HCLGE_FLAG_VNET_BASE_SCH_MODE 2 51346a3df9fSSalil u8 tx_sch_mode; 514cacde272SYunsheng Lin u8 tc_max; 515cacde272SYunsheng Lin u8 pfc_max; 51646a3df9fSSalil 51746a3df9fSSalil u8 default_up; 518cacde272SYunsheng Lin u8 dcbx_cap; 51946a3df9fSSalil struct hclge_tm_info tm_info; 52046a3df9fSSalil 52146a3df9fSSalil u16 num_msi; 52246a3df9fSSalil u16 num_msi_left; 52346a3df9fSSalil u16 num_msi_used; 52446a3df9fSSalil u32 base_msi_vector; 52546a3df9fSSalil u16 *vector_status; 526887c3820SSalil Mehta int *vector_irq; 527887c3820SSalil Mehta u16 num_roce_msi; /* Num of roce vectors for this PF */ 528887c3820SSalil Mehta int roce_base_vector; 52946a3df9fSSalil 53046a3df9fSSalil u16 pending_udp_bitmap; 53146a3df9fSSalil 53246a3df9fSSalil u16 rx_itr_default; 53346a3df9fSSalil u16 tx_itr_default; 53446a3df9fSSalil 53546a3df9fSSalil u16 adminq_work_limit; /* Num of admin receive queue desc to process */ 53646a3df9fSSalil unsigned long service_timer_period; 53746a3df9fSSalil unsigned long service_timer_previous; 53846a3df9fSSalil struct timer_list service_timer; 53946a3df9fSSalil struct work_struct service_task; 540cb1b9f77SSalil Mehta struct work_struct rst_service_task; 541c1a81619SSalil Mehta struct work_struct mbx_service_task; 54246a3df9fSSalil 54346a3df9fSSalil bool cur_promisc; 54446a3df9fSSalil int num_alloc_vfs; /* Actual number of VFs allocated */ 54546a3df9fSSalil 54646a3df9fSSalil struct hclge_tqp *htqp; 54746a3df9fSSalil struct hclge_vport *vport; 54846a3df9fSSalil 54946a3df9fSSalil struct dentry *hclge_dbgfs; 55046a3df9fSSalil 55146a3df9fSSalil struct hnae3_client *nic_client; 55246a3df9fSSalil struct hnae3_client *roce_client; 55346a3df9fSSalil 554887c3820SSalil Mehta #define HCLGE_FLAG_MAIN BIT(0) 555887c3820SSalil Mehta #define HCLGE_FLAG_DCB_CAPABLE BIT(1) 556887c3820SSalil Mehta #define HCLGE_FLAG_DCB_ENABLE BIT(2) 557887c3820SSalil Mehta #define HCLGE_FLAG_MQPRIO_ENABLE BIT(3) 55846a3df9fSSalil u32 flag; 55946a3df9fSSalil 56046a3df9fSSalil u32 pkt_buf_size; /* Total pf buf size for tx/rx */ 56146a3df9fSSalil u32 mps; /* Max packet size */ 56246a3df9fSSalil 56346a3df9fSSalil enum hclge_mta_dmac_sel_type mta_mac_sel_type; 56446a3df9fSSalil bool enable_mta; /* Mutilcast filter enable */ 5655f6ea83fSPeng Li 5665f6ea83fSPeng Li struct hclge_vlan_type_cfg vlan_type_cfg; 567716aaac1SJian Shen 568dc8131d8SYunsheng Lin unsigned long vlan_table[VLAN_N_VID][BITS_TO_LONGS(HCLGE_VPORT_NUM)]; 5695f6ea83fSPeng Li }; 5705f6ea83fSPeng Li 5715f6ea83fSPeng Li /* VPort level vlan tag configuration for TX direction */ 5725f6ea83fSPeng Li struct hclge_tx_vtag_cfg { 573dcb35cceSPeng Li bool accept_tag1; /* Whether accept tag1 packet from host */ 574dcb35cceSPeng Li bool accept_untag1; /* Whether accept untag1 packet from host */ 575dcb35cceSPeng Li bool accept_tag2; 576dcb35cceSPeng Li bool accept_untag2; 5775f6ea83fSPeng Li bool insert_tag1_en; /* Whether insert inner vlan tag */ 5785f6ea83fSPeng Li bool insert_tag2_en; /* Whether insert outer vlan tag */ 5795f6ea83fSPeng Li u16 default_tag1; /* The default inner vlan tag to insert */ 5805f6ea83fSPeng Li u16 default_tag2; /* The default outer vlan tag to insert */ 5815f6ea83fSPeng Li }; 5825f6ea83fSPeng Li 5835f6ea83fSPeng Li /* VPort level vlan tag configuration for RX direction */ 5845f6ea83fSPeng Li struct hclge_rx_vtag_cfg { 5855f6ea83fSPeng Li bool strip_tag1_en; /* Whether strip inner vlan tag */ 5865f6ea83fSPeng Li bool strip_tag2_en; /* Whether strip outer vlan tag */ 5875f6ea83fSPeng Li bool vlan1_vlan_prionly;/* Inner VLAN Tag up to descriptor Enable */ 5885f6ea83fSPeng Li bool vlan2_vlan_prionly;/* Outer VLAN Tag up to descriptor Enable */ 58946a3df9fSSalil }; 59046a3df9fSSalil 5916f2af429SYunsheng Lin struct hclge_rss_tuple_cfg { 5926f2af429SYunsheng Lin u8 ipv4_tcp_en; 5936f2af429SYunsheng Lin u8 ipv4_udp_en; 5946f2af429SYunsheng Lin u8 ipv4_sctp_en; 5956f2af429SYunsheng Lin u8 ipv4_fragment_en; 5966f2af429SYunsheng Lin u8 ipv6_tcp_en; 5976f2af429SYunsheng Lin u8 ipv6_udp_en; 5986f2af429SYunsheng Lin u8 ipv6_sctp_en; 5996f2af429SYunsheng Lin u8 ipv6_fragment_en; 6006f2af429SYunsheng Lin }; 6016f2af429SYunsheng Lin 60246a3df9fSSalil struct hclge_vport { 60346a3df9fSSalil u16 alloc_tqps; /* Allocated Tx/Rx queues */ 60446a3df9fSSalil 60546a3df9fSSalil u8 rss_hash_key[HCLGE_RSS_KEY_SIZE]; /* User configured hash keys */ 60646a3df9fSSalil /* User configured lookup table entries */ 60746a3df9fSSalil u8 rss_indirection_tbl[HCLGE_RSS_IND_TBL_SIZE]; 60889523cfaSYunsheng Lin int rss_algo; /* User configured hash algorithm */ 6096f2af429SYunsheng Lin /* User configured rss tuple sets */ 6106f2af429SYunsheng Lin struct hclge_rss_tuple_cfg rss_tuple_sets; 61189523cfaSYunsheng Lin 61268ece54eSYunsheng Lin u16 alloc_rss_size; 61346a3df9fSSalil 61446a3df9fSSalil u16 qs_offset; 61546a3df9fSSalil u16 bw_limit; /* VSI BW Limit (0 = disabled) */ 61646a3df9fSSalil u8 dwrr; 61746a3df9fSSalil 6185f6ea83fSPeng Li struct hclge_tx_vtag_cfg txvlan_cfg; 6195f6ea83fSPeng Li struct hclge_rx_vtag_cfg rxvlan_cfg; 6205f6ea83fSPeng Li 62146a3df9fSSalil int vport_id; 62246a3df9fSSalil struct hclge_dev *back; /* Back reference to associated dev */ 62346a3df9fSSalil struct hnae3_handle nic; 62446a3df9fSSalil struct hnae3_handle roce; 62540cca1c5SXi Wang 62640cca1c5SXi Wang bool accept_mta_mc; /* whether to accept mta filter multicast */ 62740cca1c5SXi Wang unsigned long mta_shadow[BITS_TO_LONGS(HCLGE_MTA_TBL_SIZE)]; 62846a3df9fSSalil }; 62946a3df9fSSalil 63046a3df9fSSalil void hclge_promisc_param_init(struct hclge_promisc_param *param, bool en_uc, 63146a3df9fSSalil bool en_mc, bool en_bc, int vport_id); 63246a3df9fSSalil 63346a3df9fSSalil int hclge_add_uc_addr_common(struct hclge_vport *vport, 63446a3df9fSSalil const unsigned char *addr); 63546a3df9fSSalil int hclge_rm_uc_addr_common(struct hclge_vport *vport, 63646a3df9fSSalil const unsigned char *addr); 63746a3df9fSSalil int hclge_add_mc_addr_common(struct hclge_vport *vport, 63846a3df9fSSalil const unsigned char *addr); 63946a3df9fSSalil int hclge_rm_mc_addr_common(struct hclge_vport *vport, 64046a3df9fSSalil const unsigned char *addr); 64146a3df9fSSalil 64246a3df9fSSalil int hclge_cfg_func_mta_filter(struct hclge_dev *hdev, 64346a3df9fSSalil u8 func_id, 64446a3df9fSSalil bool enable); 64540cca1c5SXi Wang int hclge_update_mta_status_common(struct hclge_vport *vport, 64640cca1c5SXi Wang unsigned long *status, 64740cca1c5SXi Wang u16 idx, 64840cca1c5SXi Wang u16 count, 64940cca1c5SXi Wang bool update_filter); 65040cca1c5SXi Wang 65146a3df9fSSalil struct hclge_vport *hclge_get_vport(struct hnae3_handle *handle); 65284e095d6SSalil Mehta int hclge_bind_ring_with_vector(struct hclge_vport *vport, 65384e095d6SSalil Mehta int vector_id, bool en, 65446a3df9fSSalil struct hnae3_ring_chain_node *ring_chain); 65584e095d6SSalil Mehta 65646a3df9fSSalil static inline int hclge_get_queue_id(struct hnae3_queue *queue) 65746a3df9fSSalil { 65846a3df9fSSalil struct hclge_tqp *tqp = container_of(queue, struct hclge_tqp, q); 65946a3df9fSSalil 66046a3df9fSSalil return tqp->index; 66146a3df9fSSalil } 66246a3df9fSSalil 66346a3df9fSSalil int hclge_cfg_mac_speed_dup(struct hclge_dev *hdev, int speed, u8 duplex); 664dc8131d8SYunsheng Lin int hclge_set_vlan_filter(struct hnae3_handle *handle, __be16 proto, 665dc8131d8SYunsheng Lin u16 vlan_id, bool is_kill); 666b2641e2aSYunsheng Lin int hclge_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable); 66777f255c1SYunsheng Lin 66877f255c1SYunsheng Lin int hclge_buffer_alloc(struct hclge_dev *hdev); 66977f255c1SYunsheng Lin int hclge_rss_init_hw(struct hclge_dev *hdev); 670268f5dfaSYunsheng Lin void hclge_rss_indir_init_cfg(struct hclge_dev *hdev); 671dde1a86eSSalil Mehta 672dde1a86eSSalil Mehta void hclge_mbx_handler(struct hclge_dev *hdev); 67384e095d6SSalil Mehta void hclge_reset_tqp(struct hnae3_handle *handle, u16 queue_id); 6741a426f8bSPeng Li void hclge_reset_vf_queue(struct hclge_vport *vport, u16 queue_id); 6751770a7a3SPeng Li int hclge_cfg_flowctrl(struct hclge_dev *hdev); 6762bfbd35dSSalil Mehta int hclge_func_reset_cmd(struct hclge_dev *hdev, int func_id); 67746a3df9fSSalil #endif 678