1d71d8381SJian Shen // SPDX-License-Identifier: GPL-2.0+ 2d71d8381SJian Shen // Copyright (c) 2016-2017 Hisilicon Limited. 346a3df9fSSalil 446a3df9fSSalil #ifndef __HCLGE_MAIN_H 546a3df9fSSalil #define __HCLGE_MAIN_H 646a3df9fSSalil #include <linux/fs.h> 746a3df9fSSalil #include <linux/types.h> 846a3df9fSSalil #include <linux/phy.h> 9dc8131d8SYunsheng Lin #include <linux/if_vlan.h> 10dc8131d8SYunsheng Lin 1146a3df9fSSalil #include "hclge_cmd.h" 1246a3df9fSSalil #include "hnae3.h" 1346a3df9fSSalil 143c7624d8SXi Wang #define HCLGE_MOD_VERSION "1.0" 1546a3df9fSSalil #define HCLGE_DRIVER_NAME "hclge" 1646a3df9fSSalil 1739932473SJian Shen #define HCLGE_MAX_PF_NUM 8 1839932473SJian Shen 19d174ea75Sliuzhongzhu #define HCLGE_RD_FIRST_STATS_NUM 2 20d174ea75Sliuzhongzhu #define HCLGE_RD_OTHER_STATS_NUM 4 21d174ea75Sliuzhongzhu 2246a3df9fSSalil #define HCLGE_INVALID_VPORT 0xffff 2346a3df9fSSalil 2446a3df9fSSalil #define HCLGE_PF_CFG_BLOCK_SIZE 32 2546a3df9fSSalil #define HCLGE_PF_CFG_DESC_NUM \ 2646a3df9fSSalil (HCLGE_PF_CFG_BLOCK_SIZE / HCLGE_CFG_RD_LEN_BYTES) 2746a3df9fSSalil 2846a3df9fSSalil #define HCLGE_VECTOR_REG_BASE 0x20000 29466b0c00SLipeng #define HCLGE_MISC_VECTOR_REG_BASE 0x20400 3046a3df9fSSalil 3146a3df9fSSalil #define HCLGE_VECTOR_REG_OFFSET 0x4 3246a3df9fSSalil #define HCLGE_VECTOR_VF_OFFSET 0x100000 3346a3df9fSSalil 34ea4750caSJian Shen #define HCLGE_CMDQ_TX_ADDR_L_REG 0x27000 35ea4750caSJian Shen #define HCLGE_CMDQ_TX_ADDR_H_REG 0x27004 36ea4750caSJian Shen #define HCLGE_CMDQ_TX_DEPTH_REG 0x27008 37ea4750caSJian Shen #define HCLGE_CMDQ_TX_TAIL_REG 0x27010 38ea4750caSJian Shen #define HCLGE_CMDQ_TX_HEAD_REG 0x27014 39ea4750caSJian Shen #define HCLGE_CMDQ_RX_ADDR_L_REG 0x27018 40ea4750caSJian Shen #define HCLGE_CMDQ_RX_ADDR_H_REG 0x2701C 41ea4750caSJian Shen #define HCLGE_CMDQ_RX_DEPTH_REG 0x27020 42ea4750caSJian Shen #define HCLGE_CMDQ_RX_TAIL_REG 0x27024 43ea4750caSJian Shen #define HCLGE_CMDQ_RX_HEAD_REG 0x27028 44ea4750caSJian Shen #define HCLGE_CMDQ_INTR_SRC_REG 0x27100 45ea4750caSJian Shen #define HCLGE_CMDQ_INTR_STS_REG 0x27104 46ea4750caSJian Shen #define HCLGE_CMDQ_INTR_EN_REG 0x27108 47ea4750caSJian Shen #define HCLGE_CMDQ_INTR_GEN_REG 0x2710C 48ea4750caSJian Shen 49ea4750caSJian Shen /* bar registers for common func */ 50ea4750caSJian Shen #define HCLGE_VECTOR0_OTER_EN_REG 0x20600 51ea4750caSJian Shen #define HCLGE_RAS_OTHER_STS_REG 0x20B00 52ea4750caSJian Shen #define HCLGE_FUNC_RESET_STS_REG 0x20C00 53ea4750caSJian Shen #define HCLGE_GRO_EN_REG 0x28000 54ea4750caSJian Shen 55ea4750caSJian Shen /* bar registers for rcb */ 56ea4750caSJian Shen #define HCLGE_RING_RX_ADDR_L_REG 0x80000 57ea4750caSJian Shen #define HCLGE_RING_RX_ADDR_H_REG 0x80004 58ea4750caSJian Shen #define HCLGE_RING_RX_BD_NUM_REG 0x80008 59ea4750caSJian Shen #define HCLGE_RING_RX_BD_LENGTH_REG 0x8000C 60ea4750caSJian Shen #define HCLGE_RING_RX_MERGE_EN_REG 0x80014 61ea4750caSJian Shen #define HCLGE_RING_RX_TAIL_REG 0x80018 62ea4750caSJian Shen #define HCLGE_RING_RX_HEAD_REG 0x8001C 63ea4750caSJian Shen #define HCLGE_RING_RX_FBD_NUM_REG 0x80020 64ea4750caSJian Shen #define HCLGE_RING_RX_OFFSET_REG 0x80024 65ea4750caSJian Shen #define HCLGE_RING_RX_FBD_OFFSET_REG 0x80028 66ea4750caSJian Shen #define HCLGE_RING_RX_STASH_REG 0x80030 67ea4750caSJian Shen #define HCLGE_RING_RX_BD_ERR_REG 0x80034 68ea4750caSJian Shen #define HCLGE_RING_TX_ADDR_L_REG 0x80040 69ea4750caSJian Shen #define HCLGE_RING_TX_ADDR_H_REG 0x80044 70ea4750caSJian Shen #define HCLGE_RING_TX_BD_NUM_REG 0x80048 71ea4750caSJian Shen #define HCLGE_RING_TX_PRIORITY_REG 0x8004C 72ea4750caSJian Shen #define HCLGE_RING_TX_TC_REG 0x80050 73ea4750caSJian Shen #define HCLGE_RING_TX_MERGE_EN_REG 0x80054 74ea4750caSJian Shen #define HCLGE_RING_TX_TAIL_REG 0x80058 75ea4750caSJian Shen #define HCLGE_RING_TX_HEAD_REG 0x8005C 76ea4750caSJian Shen #define HCLGE_RING_TX_FBD_NUM_REG 0x80060 77ea4750caSJian Shen #define HCLGE_RING_TX_OFFSET_REG 0x80064 78ea4750caSJian Shen #define HCLGE_RING_TX_EBD_NUM_REG 0x80068 79ea4750caSJian Shen #define HCLGE_RING_TX_EBD_OFFSET_REG 0x80070 80ea4750caSJian Shen #define HCLGE_RING_TX_BD_ERR_REG 0x80074 81ea4750caSJian Shen #define HCLGE_RING_EN_REG 0x80090 82ea4750caSJian Shen 83ea4750caSJian Shen /* bar registers for tqp interrupt */ 84ea4750caSJian Shen #define HCLGE_TQP_INTR_CTRL_REG 0x20000 85ea4750caSJian Shen #define HCLGE_TQP_INTR_GL0_REG 0x20100 86ea4750caSJian Shen #define HCLGE_TQP_INTR_GL1_REG 0x20200 87ea4750caSJian Shen #define HCLGE_TQP_INTR_GL2_REG 0x20300 88ea4750caSJian Shen #define HCLGE_TQP_INTR_RL_REG 0x20900 89ea4750caSJian Shen 9046a3df9fSSalil #define HCLGE_RSS_IND_TBL_SIZE 512 915392902dSYunsheng Lin #define HCLGE_RSS_SET_BITMAP_MSK GENMASK(15, 0) 9246a3df9fSSalil #define HCLGE_RSS_KEY_SIZE 40 9346a3df9fSSalil #define HCLGE_RSS_HASH_ALGO_TOEPLITZ 0 9446a3df9fSSalil #define HCLGE_RSS_HASH_ALGO_SIMPLE 1 9546a3df9fSSalil #define HCLGE_RSS_HASH_ALGO_SYMMETRIC 2 96c79301d8SJian Shen #define HCLGE_RSS_HASH_ALGO_MASK GENMASK(3, 0) 9746a3df9fSSalil #define HCLGE_RSS_CFG_TBL_NUM \ 9846a3df9fSSalil (HCLGE_RSS_IND_TBL_SIZE / HCLGE_RSS_CFG_TBL_SIZE) 9946a3df9fSSalil 100f7db940aSLipeng #define HCLGE_RSS_INPUT_TUPLE_OTHER GENMASK(3, 0) 101f7db940aSLipeng #define HCLGE_RSS_INPUT_TUPLE_SCTP GENMASK(4, 0) 102f7db940aSLipeng #define HCLGE_D_PORT_BIT BIT(0) 103f7db940aSLipeng #define HCLGE_S_PORT_BIT BIT(1) 104f7db940aSLipeng #define HCLGE_D_IP_BIT BIT(2) 105f7db940aSLipeng #define HCLGE_S_IP_BIT BIT(3) 106f7db940aSLipeng #define HCLGE_V_TAG_BIT BIT(4) 107f7db940aSLipeng 10846a3df9fSSalil #define HCLGE_RSS_TC_SIZE_0 1 10946a3df9fSSalil #define HCLGE_RSS_TC_SIZE_1 2 11046a3df9fSSalil #define HCLGE_RSS_TC_SIZE_2 4 11146a3df9fSSalil #define HCLGE_RSS_TC_SIZE_3 8 11246a3df9fSSalil #define HCLGE_RSS_TC_SIZE_4 16 11346a3df9fSSalil #define HCLGE_RSS_TC_SIZE_5 32 11446a3df9fSSalil #define HCLGE_RSS_TC_SIZE_6 64 11546a3df9fSSalil #define HCLGE_RSS_TC_SIZE_7 128 11646a3df9fSSalil 11739932473SJian Shen #define HCLGE_UMV_TBL_SIZE 3072 11839932473SJian Shen #define HCLGE_DEFAULT_UMV_SPACE_PER_PF \ 11939932473SJian Shen (HCLGE_UMV_TBL_SIZE / HCLGE_MAX_PF_NUM) 12039932473SJian Shen 12146a3df9fSSalil #define HCLGE_TQP_RESET_TRY_TIMES 10 12246a3df9fSSalil 12346a3df9fSSalil #define HCLGE_PHY_PAGE_MDIX 0 12446a3df9fSSalil #define HCLGE_PHY_PAGE_COPPER 0 12546a3df9fSSalil 12646a3df9fSSalil /* Page Selection Reg. */ 12746a3df9fSSalil #define HCLGE_PHY_PAGE_REG 22 12846a3df9fSSalil 12946a3df9fSSalil /* Copper Specific Control Register */ 13046a3df9fSSalil #define HCLGE_PHY_CSC_REG 16 13146a3df9fSSalil 13246a3df9fSSalil /* Copper Specific Status Register */ 13346a3df9fSSalil #define HCLGE_PHY_CSS_REG 17 13446a3df9fSSalil 135a10829c4SJian Shen #define HCLGE_PHY_MDIX_CTRL_S 5 1365392902dSYunsheng Lin #define HCLGE_PHY_MDIX_CTRL_M GENMASK(6, 5) 13746a3df9fSSalil 138a10829c4SJian Shen #define HCLGE_PHY_MDIX_STATUS_B 6 139a10829c4SJian Shen #define HCLGE_PHY_SPEED_DUP_RESOLVE_B 11 14046a3df9fSSalil 1415f6ea83fSPeng Li /* Factor used to calculate offset and bitmap of VF num */ 1425f6ea83fSPeng Li #define HCLGE_VF_NUM_PER_CMD 64 1435f6ea83fSPeng Li #define HCLGE_VF_NUM_PER_BYTE 8 1445f6ea83fSPeng Li 14511732868SJian Shen enum HLCGE_PORT_TYPE { 14611732868SJian Shen HOST_PORT, 14711732868SJian Shen NETWORK_PORT 14811732868SJian Shen }; 14911732868SJian Shen 15011732868SJian Shen #define HCLGE_PF_ID_S 0 15111732868SJian Shen #define HCLGE_PF_ID_M GENMASK(2, 0) 15211732868SJian Shen #define HCLGE_VF_ID_S 3 15311732868SJian Shen #define HCLGE_VF_ID_M GENMASK(10, 3) 15411732868SJian Shen #define HCLGE_PORT_TYPE_B 11 15511732868SJian Shen #define HCLGE_NETWORK_PORT_ID_S 0 15611732868SJian Shen #define HCLGE_NETWORK_PORT_ID_M GENMASK(3, 0) 15711732868SJian Shen 1584ed340abSLipeng /* Reset related Registers */ 1596dd22bbcSHuazhong Tan #define HCLGE_PF_OTHER_INT_REG 0x20600 1604ed340abSLipeng #define HCLGE_MISC_RESET_STS_REG 0x20700 1619ca8d1a7SHuazhong Tan #define HCLGE_MISC_VECTOR_INT_STS 0x20800 1624ed340abSLipeng #define HCLGE_GLOBAL_RESET_REG 0x20A00 163f8a91784SJian Shen #define HCLGE_GLOBAL_RESET_BIT 0 164f8a91784SJian Shen #define HCLGE_CORE_RESET_BIT 1 16565e41e7eSHuazhong Tan #define HCLGE_IMP_RESET_BIT 2 1664ed340abSLipeng #define HCLGE_FUN_RST_ING 0x20C00 1674ed340abSLipeng #define HCLGE_FUN_RST_ING_B 0 1684ed340abSLipeng 1694ed340abSLipeng /* Vector0 register bits define */ 1704ed340abSLipeng #define HCLGE_VECTOR0_GLOBALRESET_INT_B 5 1714ed340abSLipeng #define HCLGE_VECTOR0_CORERESET_INT_B 6 1724ed340abSLipeng #define HCLGE_VECTOR0_IMPRESET_INT_B 7 1734ed340abSLipeng 174c1a81619SSalil Mehta /* Vector0 interrupt CMDQ event source register(RW) */ 175c1a81619SSalil Mehta #define HCLGE_VECTOR0_CMDQ_SRC_REG 0x27100 176c1a81619SSalil Mehta /* CMDQ register bits for RX event(=MBX event) */ 177c1a81619SSalil Mehta #define HCLGE_VECTOR0_RX_CMDQ_INT_B 1 178c1a81619SSalil Mehta 1796dd22bbcSHuazhong Tan #define HCLGE_VECTOR0_IMP_RESET_INT_B 1 1806dd22bbcSHuazhong Tan 1812866ccb2SFuyun Liang #define HCLGE_MAC_DEFAULT_FRAME \ 182a0b43717SYunsheng Lin (ETH_HLEN + ETH_FCS_LEN + 2 * VLAN_HLEN + ETH_DATA_LEN) 1832866ccb2SFuyun Liang #define HCLGE_MAC_MIN_FRAME 64 1842866ccb2SFuyun Liang #define HCLGE_MAC_MAX_FRAME 9728 1852866ccb2SFuyun Liang 1860979aa0bSFuyun Liang #define HCLGE_SUPPORT_1G_BIT BIT(0) 1870979aa0bSFuyun Liang #define HCLGE_SUPPORT_10G_BIT BIT(1) 1880979aa0bSFuyun Liang #define HCLGE_SUPPORT_25G_BIT BIT(2) 1890979aa0bSFuyun Liang #define HCLGE_SUPPORT_50G_BIT BIT(3) 1900979aa0bSFuyun Liang #define HCLGE_SUPPORT_100G_BIT BIT(4) 191f18635d5SJian Shen #define HCLGE_SUPPORT_100M_BIT BIT(6) 192f18635d5SJian Shen #define HCLGE_SUPPORT_10M_BIT BIT(7) 193f18635d5SJian Shen #define HCLGE_SUPPORT_GE \ 194f18635d5SJian Shen (HCLGE_SUPPORT_1G_BIT | HCLGE_SUPPORT_100M_BIT | HCLGE_SUPPORT_10M_BIT) 1950979aa0bSFuyun Liang 19646a3df9fSSalil enum HCLGE_DEV_STATE { 19746a3df9fSSalil HCLGE_STATE_REINITING, 19846a3df9fSSalil HCLGE_STATE_DOWN, 19946a3df9fSSalil HCLGE_STATE_DISABLED, 20046a3df9fSSalil HCLGE_STATE_REMOVING, 20146a3df9fSSalil HCLGE_STATE_SERVICE_INITED, 20246a3df9fSSalil HCLGE_STATE_SERVICE_SCHED, 203cb1b9f77SSalil Mehta HCLGE_STATE_RST_SERVICE_SCHED, 204cb1b9f77SSalil Mehta HCLGE_STATE_RST_HANDLING, 205c1a81619SSalil Mehta HCLGE_STATE_MBX_SERVICE_SCHED, 20646a3df9fSSalil HCLGE_STATE_MBX_HANDLING, 207c5f65480SJian Shen HCLGE_STATE_STATISTICS_UPDATING, 2088d40854fSHuazhong Tan HCLGE_STATE_CMD_DISABLE, 20946a3df9fSSalil HCLGE_STATE_MAX 21046a3df9fSSalil }; 21146a3df9fSSalil 212ca1d7669SSalil Mehta enum hclge_evt_cause { 213ca1d7669SSalil Mehta HCLGE_VECTOR0_EVENT_RST, 214ca1d7669SSalil Mehta HCLGE_VECTOR0_EVENT_MBX, 215f6162d44SSalil Mehta HCLGE_VECTOR0_EVENT_ERR, 216ca1d7669SSalil Mehta HCLGE_VECTOR0_EVENT_OTHER, 217ca1d7669SSalil Mehta }; 218ca1d7669SSalil Mehta 21946a3df9fSSalil #define HCLGE_MPF_ENBALE 1 22046a3df9fSSalil 22146a3df9fSSalil enum HCLGE_MAC_SPEED { 2225d497936SPeng Li HCLGE_MAC_SPEED_UNKNOWN = 0, /* unknown */ 22346a3df9fSSalil HCLGE_MAC_SPEED_10M = 10, /* 10 Mbps */ 22446a3df9fSSalil HCLGE_MAC_SPEED_100M = 100, /* 100 Mbps */ 22546a3df9fSSalil HCLGE_MAC_SPEED_1G = 1000, /* 1000 Mbps = 1 Gbps */ 22646a3df9fSSalil HCLGE_MAC_SPEED_10G = 10000, /* 10000 Mbps = 10 Gbps */ 22746a3df9fSSalil HCLGE_MAC_SPEED_25G = 25000, /* 25000 Mbps = 25 Gbps */ 22846a3df9fSSalil HCLGE_MAC_SPEED_40G = 40000, /* 40000 Mbps = 40 Gbps */ 22946a3df9fSSalil HCLGE_MAC_SPEED_50G = 50000, /* 50000 Mbps = 50 Gbps */ 23046a3df9fSSalil HCLGE_MAC_SPEED_100G = 100000 /* 100000 Mbps = 100 Gbps */ 23146a3df9fSSalil }; 23246a3df9fSSalil 23346a3df9fSSalil enum HCLGE_MAC_DUPLEX { 23446a3df9fSSalil HCLGE_MAC_HALF, 23546a3df9fSSalil HCLGE_MAC_FULL 23646a3df9fSSalil }; 23746a3df9fSSalil 23846a3df9fSSalil struct hclge_mac { 23946a3df9fSSalil u8 phy_addr; 24046a3df9fSSalil u8 flag; 24146a3df9fSSalil u8 media_type; 24246a3df9fSSalil u8 mac_addr[ETH_ALEN]; 24346a3df9fSSalil u8 autoneg; 24446a3df9fSSalil u8 duplex; 24546a3df9fSSalil u32 speed; 24646a3df9fSSalil int link; /* store the link status of mac & phy (if phy exit)*/ 24746a3df9fSSalil struct phy_device *phydev; 24846a3df9fSSalil struct mii_bus *mdio_bus; 24946a3df9fSSalil phy_interface_t phy_if; 2500979aa0bSFuyun Liang __ETHTOOL_DECLARE_LINK_MODE_MASK(supported); 2510979aa0bSFuyun Liang __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising); 25246a3df9fSSalil }; 25346a3df9fSSalil 25446a3df9fSSalil struct hclge_hw { 25546a3df9fSSalil void __iomem *io_base; 25646a3df9fSSalil struct hclge_mac mac; 25746a3df9fSSalil int num_vec; 25846a3df9fSSalil struct hclge_cmq cmq; 25946a3df9fSSalil }; 26046a3df9fSSalil 26146a3df9fSSalil /* TQP stats */ 26246a3df9fSSalil struct hlcge_tqp_stats { 26346a3df9fSSalil /* query_tqp_tx_queue_statistics ,opcode id: 0x0B03 */ 26446a3df9fSSalil u64 rcb_tx_ring_pktnum_rcd; /* 32bit */ 26546a3df9fSSalil /* query_tqp_rx_queue_statistics ,opcode id: 0x0B13 */ 26646a3df9fSSalil u64 rcb_rx_ring_pktnum_rcd; /* 32bit */ 26746a3df9fSSalil }; 26846a3df9fSSalil 26946a3df9fSSalil struct hclge_tqp { 270fdace1bcSJian Shen /* copy of device pointer from pci_dev, 271fdace1bcSJian Shen * used when perform DMA mapping 272fdace1bcSJian Shen */ 273fdace1bcSJian Shen struct device *dev; 27446a3df9fSSalil struct hnae3_queue q; 27546a3df9fSSalil struct hlcge_tqp_stats tqp_stats; 27646a3df9fSSalil u16 index; /* Global index in a NIC controller */ 27746a3df9fSSalil 27846a3df9fSSalil bool alloced; 27946a3df9fSSalil }; 28046a3df9fSSalil 28146a3df9fSSalil enum hclge_fc_mode { 28246a3df9fSSalil HCLGE_FC_NONE, 28346a3df9fSSalil HCLGE_FC_RX_PAUSE, 28446a3df9fSSalil HCLGE_FC_TX_PAUSE, 28546a3df9fSSalil HCLGE_FC_FULL, 28646a3df9fSSalil HCLGE_FC_PFC, 28746a3df9fSSalil HCLGE_FC_DEFAULT 28846a3df9fSSalil }; 28946a3df9fSSalil 29046a3df9fSSalil #define HCLGE_PG_NUM 4 29146a3df9fSSalil #define HCLGE_SCH_MODE_SP 0 29246a3df9fSSalil #define HCLGE_SCH_MODE_DWRR 1 29346a3df9fSSalil struct hclge_pg_info { 29446a3df9fSSalil u8 pg_id; 29546a3df9fSSalil u8 pg_sch_mode; /* 0: sp; 1: dwrr */ 29646a3df9fSSalil u8 tc_bit_map; 29746a3df9fSSalil u32 bw_limit; 29846a3df9fSSalil u8 tc_dwrr[HNAE3_MAX_TC]; 29946a3df9fSSalil }; 30046a3df9fSSalil 30146a3df9fSSalil struct hclge_tc_info { 30246a3df9fSSalil u8 tc_id; 30346a3df9fSSalil u8 tc_sch_mode; /* 0: sp; 1: dwrr */ 30446a3df9fSSalil u8 pgid; 30546a3df9fSSalil u32 bw_limit; 30646a3df9fSSalil }; 30746a3df9fSSalil 30846a3df9fSSalil struct hclge_cfg { 30946a3df9fSSalil u8 vmdq_vport_num; 31046a3df9fSSalil u8 tc_num; 31146a3df9fSSalil u16 tqp_desc_num; 31246a3df9fSSalil u16 rx_buf_len; 3130e7a40cdSPeng Li u16 rss_size_max; 31446a3df9fSSalil u8 phy_addr; 31546a3df9fSSalil u8 media_type; 31646a3df9fSSalil u8 mac_addr[ETH_ALEN]; 31746a3df9fSSalil u8 default_speed; 31846a3df9fSSalil u32 numa_node_map; 3190979aa0bSFuyun Liang u8 speed_ability; 32039932473SJian Shen u16 umv_space; 32146a3df9fSSalil }; 32246a3df9fSSalil 32346a3df9fSSalil struct hclge_tm_info { 32446a3df9fSSalil u8 num_tc; 32546a3df9fSSalil u8 num_pg; /* It must be 1 if vNET-Base schd */ 32646a3df9fSSalil u8 pg_dwrr[HCLGE_PG_NUM]; 327c5795c53SYunsheng Lin u8 prio_tc[HNAE3_MAX_USER_PRIO]; 32846a3df9fSSalil struct hclge_pg_info pg_info[HCLGE_PG_NUM]; 32946a3df9fSSalil struct hclge_tc_info tc_info[HNAE3_MAX_TC]; 33046a3df9fSSalil enum hclge_fc_mode fc_mode; 33146a3df9fSSalil u8 hw_pfc_map; /* Allow for packet drop or not on this TC */ 332d3ad430aSYunsheng Lin u8 pfc_en; /* PFC enabled or not for user priority */ 33346a3df9fSSalil }; 33446a3df9fSSalil 33546a3df9fSSalil struct hclge_comm_stats_str { 33646a3df9fSSalil char desc[ETH_GSTRING_LEN]; 33746a3df9fSSalil unsigned long offset; 33846a3df9fSSalil }; 33946a3df9fSSalil 34046a3df9fSSalil /* mac stats ,opcode id: 0x0032 */ 34146a3df9fSSalil struct hclge_mac_stats { 34246a3df9fSSalil u64 mac_tx_mac_pause_num; 34346a3df9fSSalil u64 mac_rx_mac_pause_num; 34446a3df9fSSalil u64 mac_tx_pfc_pri0_pkt_num; 34546a3df9fSSalil u64 mac_tx_pfc_pri1_pkt_num; 34646a3df9fSSalil u64 mac_tx_pfc_pri2_pkt_num; 34746a3df9fSSalil u64 mac_tx_pfc_pri3_pkt_num; 34846a3df9fSSalil u64 mac_tx_pfc_pri4_pkt_num; 34946a3df9fSSalil u64 mac_tx_pfc_pri5_pkt_num; 35046a3df9fSSalil u64 mac_tx_pfc_pri6_pkt_num; 35146a3df9fSSalil u64 mac_tx_pfc_pri7_pkt_num; 35246a3df9fSSalil u64 mac_rx_pfc_pri0_pkt_num; 35346a3df9fSSalil u64 mac_rx_pfc_pri1_pkt_num; 35446a3df9fSSalil u64 mac_rx_pfc_pri2_pkt_num; 35546a3df9fSSalil u64 mac_rx_pfc_pri3_pkt_num; 35646a3df9fSSalil u64 mac_rx_pfc_pri4_pkt_num; 35746a3df9fSSalil u64 mac_rx_pfc_pri5_pkt_num; 35846a3df9fSSalil u64 mac_rx_pfc_pri6_pkt_num; 35946a3df9fSSalil u64 mac_rx_pfc_pri7_pkt_num; 36046a3df9fSSalil u64 mac_tx_total_pkt_num; 36146a3df9fSSalil u64 mac_tx_total_oct_num; 36246a3df9fSSalil u64 mac_tx_good_pkt_num; 36346a3df9fSSalil u64 mac_tx_bad_pkt_num; 36446a3df9fSSalil u64 mac_tx_good_oct_num; 36546a3df9fSSalil u64 mac_tx_bad_oct_num; 36646a3df9fSSalil u64 mac_tx_uni_pkt_num; 36746a3df9fSSalil u64 mac_tx_multi_pkt_num; 36846a3df9fSSalil u64 mac_tx_broad_pkt_num; 36946a3df9fSSalil u64 mac_tx_undersize_pkt_num; 370200a88c6SJian Shen u64 mac_tx_oversize_pkt_num; 37146a3df9fSSalil u64 mac_tx_64_oct_pkt_num; 37246a3df9fSSalil u64 mac_tx_65_127_oct_pkt_num; 37346a3df9fSSalil u64 mac_tx_128_255_oct_pkt_num; 37446a3df9fSSalil u64 mac_tx_256_511_oct_pkt_num; 37546a3df9fSSalil u64 mac_tx_512_1023_oct_pkt_num; 37646a3df9fSSalil u64 mac_tx_1024_1518_oct_pkt_num; 37791f384f6SJian Shen u64 mac_tx_1519_2047_oct_pkt_num; 37891f384f6SJian Shen u64 mac_tx_2048_4095_oct_pkt_num; 37991f384f6SJian Shen u64 mac_tx_4096_8191_oct_pkt_num; 380dbecc779SXi Wang u64 rsv0; 381dbecc779SXi Wang u64 mac_tx_8192_9216_oct_pkt_num; 382dbecc779SXi Wang u64 mac_tx_9217_12287_oct_pkt_num; 38391f384f6SJian Shen u64 mac_tx_12288_16383_oct_pkt_num; 38491f384f6SJian Shen u64 mac_tx_1519_max_good_oct_pkt_num; 38591f384f6SJian Shen u64 mac_tx_1519_max_bad_oct_pkt_num; 38691f384f6SJian Shen 38746a3df9fSSalil u64 mac_rx_total_pkt_num; 38846a3df9fSSalil u64 mac_rx_total_oct_num; 38946a3df9fSSalil u64 mac_rx_good_pkt_num; 39046a3df9fSSalil u64 mac_rx_bad_pkt_num; 39146a3df9fSSalil u64 mac_rx_good_oct_num; 39246a3df9fSSalil u64 mac_rx_bad_oct_num; 39346a3df9fSSalil u64 mac_rx_uni_pkt_num; 39446a3df9fSSalil u64 mac_rx_multi_pkt_num; 39546a3df9fSSalil u64 mac_rx_broad_pkt_num; 39646a3df9fSSalil u64 mac_rx_undersize_pkt_num; 397200a88c6SJian Shen u64 mac_rx_oversize_pkt_num; 39846a3df9fSSalil u64 mac_rx_64_oct_pkt_num; 39946a3df9fSSalil u64 mac_rx_65_127_oct_pkt_num; 40046a3df9fSSalil u64 mac_rx_128_255_oct_pkt_num; 40146a3df9fSSalil u64 mac_rx_256_511_oct_pkt_num; 40246a3df9fSSalil u64 mac_rx_512_1023_oct_pkt_num; 40346a3df9fSSalil u64 mac_rx_1024_1518_oct_pkt_num; 40491f384f6SJian Shen u64 mac_rx_1519_2047_oct_pkt_num; 40591f384f6SJian Shen u64 mac_rx_2048_4095_oct_pkt_num; 40691f384f6SJian Shen u64 mac_rx_4096_8191_oct_pkt_num; 407dbecc779SXi Wang u64 rsv1; 408dbecc779SXi Wang u64 mac_rx_8192_9216_oct_pkt_num; 409dbecc779SXi Wang u64 mac_rx_9217_12287_oct_pkt_num; 41091f384f6SJian Shen u64 mac_rx_12288_16383_oct_pkt_num; 41191f384f6SJian Shen u64 mac_rx_1519_max_good_oct_pkt_num; 41291f384f6SJian Shen u64 mac_rx_1519_max_bad_oct_pkt_num; 41346a3df9fSSalil 414a6c51c26SJian Shen u64 mac_tx_fragment_pkt_num; 415a6c51c26SJian Shen u64 mac_tx_undermin_pkt_num; 416a6c51c26SJian Shen u64 mac_tx_jabber_pkt_num; 417a6c51c26SJian Shen u64 mac_tx_err_all_pkt_num; 418a6c51c26SJian Shen u64 mac_tx_from_app_good_pkt_num; 419a6c51c26SJian Shen u64 mac_tx_from_app_bad_pkt_num; 420a6c51c26SJian Shen u64 mac_rx_fragment_pkt_num; 421a6c51c26SJian Shen u64 mac_rx_undermin_pkt_num; 422a6c51c26SJian Shen u64 mac_rx_jabber_pkt_num; 423a6c51c26SJian Shen u64 mac_rx_fcs_err_pkt_num; 424a6c51c26SJian Shen u64 mac_rx_send_app_good_pkt_num; 425a6c51c26SJian Shen u64 mac_rx_send_app_bad_pkt_num; 426d174ea75Sliuzhongzhu u64 mac_tx_pfc_pause_pkt_num; 427d174ea75Sliuzhongzhu u64 mac_rx_pfc_pause_pkt_num; 428d174ea75Sliuzhongzhu u64 mac_tx_ctrl_pkt_num; 429d174ea75Sliuzhongzhu u64 mac_rx_ctrl_pkt_num; 43046a3df9fSSalil }; 43146a3df9fSSalil 432c5f65480SJian Shen #define HCLGE_STATS_TIMER_INTERVAL (60 * 5) 43346a3df9fSSalil struct hclge_hw_stats { 43446a3df9fSSalil struct hclge_mac_stats mac_stats; 435c5f65480SJian Shen u32 stats_timer; 43646a3df9fSSalil }; 43746a3df9fSSalil 4385f6ea83fSPeng Li struct hclge_vlan_type_cfg { 4395f6ea83fSPeng Li u16 rx_ot_fst_vlan_type; 4405f6ea83fSPeng Li u16 rx_ot_sec_vlan_type; 4415f6ea83fSPeng Li u16 rx_in_fst_vlan_type; 4425f6ea83fSPeng Li u16 rx_in_sec_vlan_type; 4435f6ea83fSPeng Li u16 tx_ot_vlan_type; 4445f6ea83fSPeng Li u16 tx_in_vlan_type; 4455f6ea83fSPeng Li }; 4465f6ea83fSPeng Li 447d695964dSJian Shen enum HCLGE_FD_MODE { 448d695964dSJian Shen HCLGE_FD_MODE_DEPTH_2K_WIDTH_400B_STAGE_1, 449d695964dSJian Shen HCLGE_FD_MODE_DEPTH_1K_WIDTH_400B_STAGE_2, 450d695964dSJian Shen HCLGE_FD_MODE_DEPTH_4K_WIDTH_200B_STAGE_1, 451d695964dSJian Shen HCLGE_FD_MODE_DEPTH_2K_WIDTH_200B_STAGE_2, 452d695964dSJian Shen }; 453d695964dSJian Shen 454d695964dSJian Shen enum HCLGE_FD_KEY_TYPE { 455d695964dSJian Shen HCLGE_FD_KEY_BASE_ON_PTYPE, 456d695964dSJian Shen HCLGE_FD_KEY_BASE_ON_TUPLE, 457d695964dSJian Shen }; 458d695964dSJian Shen 459d695964dSJian Shen enum HCLGE_FD_STAGE { 460d695964dSJian Shen HCLGE_FD_STAGE_1, 461d695964dSJian Shen HCLGE_FD_STAGE_2, 462d695964dSJian Shen }; 463d695964dSJian Shen 464d695964dSJian Shen /* OUTER_XXX indicates tuples in tunnel header of tunnel packet 465d695964dSJian Shen * INNER_XXX indicate tuples in tunneled header of tunnel packet or 466d695964dSJian Shen * tuples of non-tunnel packet 467d695964dSJian Shen */ 468d695964dSJian Shen enum HCLGE_FD_TUPLE { 469d695964dSJian Shen OUTER_DST_MAC, 470d695964dSJian Shen OUTER_SRC_MAC, 471d695964dSJian Shen OUTER_VLAN_TAG_FST, 472d695964dSJian Shen OUTER_VLAN_TAG_SEC, 473d695964dSJian Shen OUTER_ETH_TYPE, 474d695964dSJian Shen OUTER_L2_RSV, 475d695964dSJian Shen OUTER_IP_TOS, 476d695964dSJian Shen OUTER_IP_PROTO, 477d695964dSJian Shen OUTER_SRC_IP, 478d695964dSJian Shen OUTER_DST_IP, 479d695964dSJian Shen OUTER_L3_RSV, 480d695964dSJian Shen OUTER_SRC_PORT, 481d695964dSJian Shen OUTER_DST_PORT, 482d695964dSJian Shen OUTER_L4_RSV, 483d695964dSJian Shen OUTER_TUN_VNI, 484d695964dSJian Shen OUTER_TUN_FLOW_ID, 485d695964dSJian Shen INNER_DST_MAC, 486d695964dSJian Shen INNER_SRC_MAC, 487d695964dSJian Shen INNER_VLAN_TAG_FST, 488d695964dSJian Shen INNER_VLAN_TAG_SEC, 489d695964dSJian Shen INNER_ETH_TYPE, 490d695964dSJian Shen INNER_L2_RSV, 491d695964dSJian Shen INNER_IP_TOS, 492d695964dSJian Shen INNER_IP_PROTO, 493d695964dSJian Shen INNER_SRC_IP, 494d695964dSJian Shen INNER_DST_IP, 495d695964dSJian Shen INNER_L3_RSV, 496d695964dSJian Shen INNER_SRC_PORT, 497d695964dSJian Shen INNER_DST_PORT, 498d695964dSJian Shen INNER_L4_RSV, 499d695964dSJian Shen MAX_TUPLE, 500d695964dSJian Shen }; 501d695964dSJian Shen 502d695964dSJian Shen enum HCLGE_FD_META_DATA { 503d695964dSJian Shen PACKET_TYPE_ID, 504d695964dSJian Shen IP_FRAGEMENT, 505d695964dSJian Shen ROCE_TYPE, 506d695964dSJian Shen NEXT_KEY, 507d695964dSJian Shen VLAN_NUMBER, 508d695964dSJian Shen SRC_VPORT, 509d695964dSJian Shen DST_VPORT, 510d695964dSJian Shen TUNNEL_PACKET, 511d695964dSJian Shen MAX_META_DATA, 512d695964dSJian Shen }; 513d695964dSJian Shen 514d695964dSJian Shen struct key_info { 515d695964dSJian Shen u8 key_type; 516d695964dSJian Shen u8 key_length; 517d695964dSJian Shen }; 518d695964dSJian Shen 519d695964dSJian Shen static const struct key_info meta_data_key_info[] = { 520d695964dSJian Shen { PACKET_TYPE_ID, 6}, 521d695964dSJian Shen { IP_FRAGEMENT, 1}, 522d695964dSJian Shen { ROCE_TYPE, 1}, 523d695964dSJian Shen { NEXT_KEY, 5}, 524d695964dSJian Shen { VLAN_NUMBER, 2}, 525d695964dSJian Shen { SRC_VPORT, 12}, 526d695964dSJian Shen { DST_VPORT, 12}, 527d695964dSJian Shen { TUNNEL_PACKET, 1}, 528d695964dSJian Shen }; 529d695964dSJian Shen 530d695964dSJian Shen static const struct key_info tuple_key_info[] = { 531d695964dSJian Shen { OUTER_DST_MAC, 48}, 532d695964dSJian Shen { OUTER_SRC_MAC, 48}, 533d695964dSJian Shen { OUTER_VLAN_TAG_FST, 16}, 534d695964dSJian Shen { OUTER_VLAN_TAG_SEC, 16}, 535d695964dSJian Shen { OUTER_ETH_TYPE, 16}, 536d695964dSJian Shen { OUTER_L2_RSV, 16}, 537d695964dSJian Shen { OUTER_IP_TOS, 8}, 538d695964dSJian Shen { OUTER_IP_PROTO, 8}, 539d695964dSJian Shen { OUTER_SRC_IP, 32}, 540d695964dSJian Shen { OUTER_DST_IP, 32}, 541d695964dSJian Shen { OUTER_L3_RSV, 16}, 542d695964dSJian Shen { OUTER_SRC_PORT, 16}, 543d695964dSJian Shen { OUTER_DST_PORT, 16}, 544d695964dSJian Shen { OUTER_L4_RSV, 32}, 545d695964dSJian Shen { OUTER_TUN_VNI, 24}, 546d695964dSJian Shen { OUTER_TUN_FLOW_ID, 8}, 547d695964dSJian Shen { INNER_DST_MAC, 48}, 548d695964dSJian Shen { INNER_SRC_MAC, 48}, 549d695964dSJian Shen { INNER_VLAN_TAG_FST, 16}, 550d695964dSJian Shen { INNER_VLAN_TAG_SEC, 16}, 551d695964dSJian Shen { INNER_ETH_TYPE, 16}, 552d695964dSJian Shen { INNER_L2_RSV, 16}, 553d695964dSJian Shen { INNER_IP_TOS, 8}, 554d695964dSJian Shen { INNER_IP_PROTO, 8}, 555d695964dSJian Shen { INNER_SRC_IP, 32}, 556d695964dSJian Shen { INNER_DST_IP, 32}, 557d695964dSJian Shen { INNER_L3_RSV, 16}, 558d695964dSJian Shen { INNER_SRC_PORT, 16}, 559d695964dSJian Shen { INNER_DST_PORT, 16}, 560d695964dSJian Shen { INNER_L4_RSV, 32}, 561d695964dSJian Shen }; 562d695964dSJian Shen 563d695964dSJian Shen #define MAX_KEY_LENGTH 400 564d695964dSJian Shen #define MAX_KEY_DWORDS DIV_ROUND_UP(MAX_KEY_LENGTH / 8, 4) 565d695964dSJian Shen #define MAX_KEY_BYTES (MAX_KEY_DWORDS * 4) 566d695964dSJian Shen #define MAX_META_DATA_LENGTH 32 567d695964dSJian Shen 568d695964dSJian Shen enum HCLGE_FD_PACKET_TYPE { 569d695964dSJian Shen NIC_PACKET, 570d695964dSJian Shen ROCE_PACKET, 571d695964dSJian Shen }; 572d695964dSJian Shen 57311732868SJian Shen enum HCLGE_FD_ACTION { 57411732868SJian Shen HCLGE_FD_ACTION_ACCEPT_PACKET, 57511732868SJian Shen HCLGE_FD_ACTION_DROP_PACKET, 57611732868SJian Shen }; 57711732868SJian Shen 578d695964dSJian Shen struct hclge_fd_key_cfg { 579d695964dSJian Shen u8 key_sel; 580d695964dSJian Shen u8 inner_sipv6_word_en; 581d695964dSJian Shen u8 inner_dipv6_word_en; 582d695964dSJian Shen u8 outer_sipv6_word_en; 583d695964dSJian Shen u8 outer_dipv6_word_en; 584d695964dSJian Shen u32 tuple_active; 585d695964dSJian Shen u32 meta_data_active; 586d695964dSJian Shen }; 587d695964dSJian Shen 588d695964dSJian Shen struct hclge_fd_cfg { 589d695964dSJian Shen u8 fd_mode; 590d695964dSJian Shen u16 max_key_length; 591d695964dSJian Shen u32 proto_support; 592d695964dSJian Shen u32 rule_num[2]; /* rule entry number */ 593d695964dSJian Shen u16 cnt_num[2]; /* rule hit counter number */ 594d695964dSJian Shen struct hclge_fd_key_cfg key_cfg[2]; 595d695964dSJian Shen }; 596d695964dSJian Shen 59711732868SJian Shen struct hclge_fd_rule_tuples { 59811732868SJian Shen u8 src_mac[6]; 59911732868SJian Shen u8 dst_mac[6]; 60011732868SJian Shen u32 src_ip[4]; 60111732868SJian Shen u32 dst_ip[4]; 60211732868SJian Shen u16 src_port; 60311732868SJian Shen u16 dst_port; 60411732868SJian Shen u16 vlan_tag1; 60511732868SJian Shen u16 ether_proto; 60611732868SJian Shen u8 ip_tos; 60711732868SJian Shen u8 ip_proto; 60811732868SJian Shen }; 60911732868SJian Shen 61011732868SJian Shen struct hclge_fd_rule { 61111732868SJian Shen struct hlist_node rule_node; 61211732868SJian Shen struct hclge_fd_rule_tuples tuples; 61311732868SJian Shen struct hclge_fd_rule_tuples tuples_mask; 61411732868SJian Shen u32 unused_tuple; 61511732868SJian Shen u32 flow_type; 61611732868SJian Shen u8 action; 61711732868SJian Shen u16 vf_id; 61811732868SJian Shen u16 queue_id; 61911732868SJian Shen u16 location; 62011732868SJian Shen }; 62111732868SJian Shen 62211732868SJian Shen struct hclge_fd_ad_data { 62311732868SJian Shen u16 ad_id; 62411732868SJian Shen u8 drop_packet; 62511732868SJian Shen u8 forward_to_direct_queue; 62611732868SJian Shen u16 queue_id; 62711732868SJian Shen u8 use_counter; 62811732868SJian Shen u8 counter_id; 62911732868SJian Shen u8 use_next_stage; 63011732868SJian Shen u8 write_rule_id_to_bd; 63111732868SJian Shen u8 next_input_key; 63211732868SJian Shen u16 rule_id; 63311732868SJian Shen }; 63411732868SJian Shen 635*6dd86902Sliuzhongzhu struct hclge_vport_mac_addr_cfg { 636*6dd86902Sliuzhongzhu struct list_head node; 637*6dd86902Sliuzhongzhu int hd_tbl_status; 638*6dd86902Sliuzhongzhu u8 mac_addr[ETH_ALEN]; 639*6dd86902Sliuzhongzhu }; 640*6dd86902Sliuzhongzhu 641*6dd86902Sliuzhongzhu enum HCLGE_MAC_ADDR_TYPE { 642*6dd86902Sliuzhongzhu HCLGE_MAC_ADDR_UC, 643*6dd86902Sliuzhongzhu HCLGE_MAC_ADDR_MC 644*6dd86902Sliuzhongzhu }; 645*6dd86902Sliuzhongzhu 64611732868SJian Shen /* For each bit of TCAM entry, it uses a pair of 'x' and 64711732868SJian Shen * 'y' to indicate which value to match, like below: 64811732868SJian Shen * ---------------------------------- 64911732868SJian Shen * | bit x | bit y | search value | 65011732868SJian Shen * ---------------------------------- 65111732868SJian Shen * | 0 | 0 | always hit | 65211732868SJian Shen * ---------------------------------- 65311732868SJian Shen * | 1 | 0 | match '0' | 65411732868SJian Shen * ---------------------------------- 65511732868SJian Shen * | 0 | 1 | match '1' | 65611732868SJian Shen * ---------------------------------- 65711732868SJian Shen * | 1 | 1 | invalid | 65811732868SJian Shen * ---------------------------------- 65911732868SJian Shen * Then for input key(k) and mask(v), we can calculate the value by 66011732868SJian Shen * the formulae: 66111732868SJian Shen * x = (~k) & v 66211732868SJian Shen * y = (k ^ ~v) & k 66311732868SJian Shen */ 66411732868SJian Shen #define calc_x(x, k, v) ((x) = (~(k) & (v))) 66511732868SJian Shen #define calc_y(y, k, v) \ 66611732868SJian Shen do { \ 66711732868SJian Shen const typeof(k) _k_ = (k); \ 66811732868SJian Shen const typeof(v) _v_ = (v); \ 66911732868SJian Shen (y) = (_k_ ^ ~_v_) & (_k_); \ 67011732868SJian Shen } while (0) 67111732868SJian Shen 672dc8131d8SYunsheng Lin #define HCLGE_VPORT_NUM 256 67346a3df9fSSalil struct hclge_dev { 67446a3df9fSSalil struct pci_dev *pdev; 67546a3df9fSSalil struct hnae3_ae_dev *ae_dev; 67646a3df9fSSalil struct hclge_hw hw; 677466b0c00SLipeng struct hclge_misc_vector misc_vector; 67846a3df9fSSalil struct hclge_hw_stats hw_stats; 67946a3df9fSSalil unsigned long state; 6806b9a97eeSHuazhong Tan unsigned long flr_state; 6810742ed7cSHuazhong Tan unsigned long last_reset_time; 68246a3df9fSSalil 6834ed340abSLipeng enum hnae3_reset_type reset_type; 6840742ed7cSHuazhong Tan enum hnae3_reset_type reset_level; 685720bd583SHuazhong Tan unsigned long default_reset_request; 686cb1b9f77SSalil Mehta unsigned long reset_request; /* reset has been requested */ 687ca1d7669SSalil Mehta unsigned long reset_pending; /* client rst is pending to be served */ 6884d60291bSHuazhong Tan unsigned long reset_count; /* the number of reset has been done */ 68965e41e7eSHuazhong Tan u32 reset_fail_cnt; 69046a3df9fSSalil u32 fw_version; 69146a3df9fSSalil u16 num_vmdq_vport; /* Num vmdq vport this PF has set up */ 69246a3df9fSSalil u16 num_tqps; /* Num task queue pairs of this PF */ 69346a3df9fSSalil u16 num_req_vfs; /* Num VFs requested for this PF */ 69446a3df9fSSalil 695fdace1bcSJian Shen u16 base_tqp_pid; /* Base task tqp physical id of this PF */ 69646a3df9fSSalil u16 alloc_rss_size; /* Allocated RSS task queue */ 69746a3df9fSSalil u16 rss_size_max; /* HW defined max RSS task queue */ 69846a3df9fSSalil 699fdace1bcSJian Shen u16 fdir_pf_filter_count; /* Num of guaranteed filters for this PF */ 70046a3df9fSSalil u16 num_alloc_vport; /* Num vports this driver supports */ 70146a3df9fSSalil u32 numa_node_mask; 70246a3df9fSSalil u16 rx_buf_len; 70346a3df9fSSalil u16 num_desc; 70446a3df9fSSalil u8 hw_tc_map; 70546a3df9fSSalil u8 tc_num_last_time; 70646a3df9fSSalil enum hclge_fc_mode fc_mode_last_time; 7075d497936SPeng Li u8 support_sfp_query; 70846a3df9fSSalil 70946a3df9fSSalil #define HCLGE_FLAG_TC_BASE_SCH_MODE 1 71046a3df9fSSalil #define HCLGE_FLAG_VNET_BASE_SCH_MODE 2 71146a3df9fSSalil u8 tx_sch_mode; 712cacde272SYunsheng Lin u8 tc_max; 713cacde272SYunsheng Lin u8 pfc_max; 71446a3df9fSSalil 71546a3df9fSSalil u8 default_up; 716cacde272SYunsheng Lin u8 dcbx_cap; 71746a3df9fSSalil struct hclge_tm_info tm_info; 71846a3df9fSSalil 71946a3df9fSSalil u16 num_msi; 72046a3df9fSSalil u16 num_msi_left; 72146a3df9fSSalil u16 num_msi_used; 722375dd5e4SJian Shen u16 roce_base_msix_offset; 72346a3df9fSSalil u32 base_msi_vector; 72446a3df9fSSalil u16 *vector_status; 725887c3820SSalil Mehta int *vector_irq; 726887c3820SSalil Mehta u16 num_roce_msi; /* Num of roce vectors for this PF */ 727887c3820SSalil Mehta int roce_base_vector; 72846a3df9fSSalil 72946a3df9fSSalil u16 pending_udp_bitmap; 73046a3df9fSSalil 73146a3df9fSSalil u16 rx_itr_default; 73246a3df9fSSalil u16 tx_itr_default; 73346a3df9fSSalil 73446a3df9fSSalil u16 adminq_work_limit; /* Num of admin receive queue desc to process */ 73546a3df9fSSalil unsigned long service_timer_period; 73646a3df9fSSalil unsigned long service_timer_previous; 73746a3df9fSSalil struct timer_list service_timer; 73865e41e7eSHuazhong Tan struct timer_list reset_timer; 73946a3df9fSSalil struct work_struct service_task; 740cb1b9f77SSalil Mehta struct work_struct rst_service_task; 741c1a81619SSalil Mehta struct work_struct mbx_service_task; 74246a3df9fSSalil 74346a3df9fSSalil bool cur_promisc; 74446a3df9fSSalil int num_alloc_vfs; /* Actual number of VFs allocated */ 74546a3df9fSSalil 74646a3df9fSSalil struct hclge_tqp *htqp; 74746a3df9fSSalil struct hclge_vport *vport; 74846a3df9fSSalil 74946a3df9fSSalil struct dentry *hclge_dbgfs; 75046a3df9fSSalil 75146a3df9fSSalil struct hnae3_client *nic_client; 75246a3df9fSSalil struct hnae3_client *roce_client; 75346a3df9fSSalil 754887c3820SSalil Mehta #define HCLGE_FLAG_MAIN BIT(0) 755887c3820SSalil Mehta #define HCLGE_FLAG_DCB_CAPABLE BIT(1) 756887c3820SSalil Mehta #define HCLGE_FLAG_DCB_ENABLE BIT(2) 757887c3820SSalil Mehta #define HCLGE_FLAG_MQPRIO_ENABLE BIT(3) 75846a3df9fSSalil u32 flag; 75946a3df9fSSalil 76046a3df9fSSalil u32 pkt_buf_size; /* Total pf buf size for tx/rx */ 761368686beSYunsheng Lin u32 tx_buf_size; /* Tx buffer size for each TC */ 762368686beSYunsheng Lin u32 dv_buf_size; /* Dv buffer size for each TC */ 763368686beSYunsheng Lin 76446a3df9fSSalil u32 mps; /* Max packet size */ 765818f1675SYunsheng Lin /* vport_lock protect resource shared by vports */ 766818f1675SYunsheng Lin struct mutex vport_lock; 76746a3df9fSSalil 7685f6ea83fSPeng Li struct hclge_vlan_type_cfg vlan_type_cfg; 769716aaac1SJian Shen 770dc8131d8SYunsheng Lin unsigned long vlan_table[VLAN_N_VID][BITS_TO_LONGS(HCLGE_VPORT_NUM)]; 771d695964dSJian Shen 772d695964dSJian Shen struct hclge_fd_cfg fd_cfg; 773dd74f815SJian Shen struct hlist_head fd_rule_list; 774dd74f815SJian Shen u16 hclge_fd_rule_num; 7759abeb7d8SJian Shen u8 fd_en; 77639932473SJian Shen 77739932473SJian Shen u16 wanted_umv_size; 77839932473SJian Shen /* max available unicast mac vlan space */ 77939932473SJian Shen u16 max_umv_size; 78039932473SJian Shen /* private unicast mac vlan space, it's same for PF and its VFs */ 78139932473SJian Shen u16 priv_umv_size; 78239932473SJian Shen /* unicast mac vlan space shared by PF and its VFs */ 78339932473SJian Shen u16 share_umv_size; 78439932473SJian Shen struct mutex umv_mutex; /* protect share_umv_size */ 785*6dd86902Sliuzhongzhu 786*6dd86902Sliuzhongzhu struct mutex vport_cfg_mutex; /* Protect stored vf table */ 7875f6ea83fSPeng Li }; 7885f6ea83fSPeng Li 7895f6ea83fSPeng Li /* VPort level vlan tag configuration for TX direction */ 7905f6ea83fSPeng Li struct hclge_tx_vtag_cfg { 791dcb35cceSPeng Li bool accept_tag1; /* Whether accept tag1 packet from host */ 792dcb35cceSPeng Li bool accept_untag1; /* Whether accept untag1 packet from host */ 793dcb35cceSPeng Li bool accept_tag2; 794dcb35cceSPeng Li bool accept_untag2; 7955f6ea83fSPeng Li bool insert_tag1_en; /* Whether insert inner vlan tag */ 7965f6ea83fSPeng Li bool insert_tag2_en; /* Whether insert outer vlan tag */ 7975f6ea83fSPeng Li u16 default_tag1; /* The default inner vlan tag to insert */ 7985f6ea83fSPeng Li u16 default_tag2; /* The default outer vlan tag to insert */ 7995f6ea83fSPeng Li }; 8005f6ea83fSPeng Li 8015f6ea83fSPeng Li /* VPort level vlan tag configuration for RX direction */ 8025f6ea83fSPeng Li struct hclge_rx_vtag_cfg { 8035f6ea83fSPeng Li bool strip_tag1_en; /* Whether strip inner vlan tag */ 8045f6ea83fSPeng Li bool strip_tag2_en; /* Whether strip outer vlan tag */ 8055f6ea83fSPeng Li bool vlan1_vlan_prionly;/* Inner VLAN Tag up to descriptor Enable */ 8065f6ea83fSPeng Li bool vlan2_vlan_prionly;/* Outer VLAN Tag up to descriptor Enable */ 80746a3df9fSSalil }; 80846a3df9fSSalil 8096f2af429SYunsheng Lin struct hclge_rss_tuple_cfg { 8106f2af429SYunsheng Lin u8 ipv4_tcp_en; 8116f2af429SYunsheng Lin u8 ipv4_udp_en; 8126f2af429SYunsheng Lin u8 ipv4_sctp_en; 8136f2af429SYunsheng Lin u8 ipv4_fragment_en; 8146f2af429SYunsheng Lin u8 ipv6_tcp_en; 8156f2af429SYunsheng Lin u8 ipv6_udp_en; 8166f2af429SYunsheng Lin u8 ipv6_sctp_en; 8176f2af429SYunsheng Lin u8 ipv6_fragment_en; 8186f2af429SYunsheng Lin }; 8196f2af429SYunsheng Lin 820a6d818e3SYunsheng Lin enum HCLGE_VPORT_STATE { 821a6d818e3SYunsheng Lin HCLGE_VPORT_STATE_ALIVE, 822a6d818e3SYunsheng Lin HCLGE_VPORT_STATE_MAX 823a6d818e3SYunsheng Lin }; 824a6d818e3SYunsheng Lin 82546a3df9fSSalil struct hclge_vport { 82646a3df9fSSalil u16 alloc_tqps; /* Allocated Tx/Rx queues */ 82746a3df9fSSalil 82846a3df9fSSalil u8 rss_hash_key[HCLGE_RSS_KEY_SIZE]; /* User configured hash keys */ 82946a3df9fSSalil /* User configured lookup table entries */ 83046a3df9fSSalil u8 rss_indirection_tbl[HCLGE_RSS_IND_TBL_SIZE]; 83189523cfaSYunsheng Lin int rss_algo; /* User configured hash algorithm */ 8326f2af429SYunsheng Lin /* User configured rss tuple sets */ 8336f2af429SYunsheng Lin struct hclge_rss_tuple_cfg rss_tuple_sets; 83489523cfaSYunsheng Lin 83568ece54eSYunsheng Lin u16 alloc_rss_size; 83646a3df9fSSalil 83746a3df9fSSalil u16 qs_offset; 83846a3df9fSSalil u16 bw_limit; /* VSI BW Limit (0 = disabled) */ 83946a3df9fSSalil u8 dwrr; 84046a3df9fSSalil 8415f6ea83fSPeng Li struct hclge_tx_vtag_cfg txvlan_cfg; 8425f6ea83fSPeng Li struct hclge_rx_vtag_cfg rxvlan_cfg; 8435f6ea83fSPeng Li 84439932473SJian Shen u16 used_umv_num; 84539932473SJian Shen 84646a3df9fSSalil int vport_id; 84746a3df9fSSalil struct hclge_dev *back; /* Back reference to associated dev */ 84846a3df9fSSalil struct hnae3_handle nic; 84946a3df9fSSalil struct hnae3_handle roce; 850a6d818e3SYunsheng Lin 851a6d818e3SYunsheng Lin unsigned long state; 852a6d818e3SYunsheng Lin unsigned long last_active_jiffies; 853818f1675SYunsheng Lin u32 mps; /* Max packet size */ 854*6dd86902Sliuzhongzhu 855*6dd86902Sliuzhongzhu struct list_head uc_mac_list; /* Store VF unicast table */ 856*6dd86902Sliuzhongzhu struct list_head mc_mac_list; /* Store VF multicast table */ 85746a3df9fSSalil }; 85846a3df9fSSalil 85946a3df9fSSalil void hclge_promisc_param_init(struct hclge_promisc_param *param, bool en_uc, 86046a3df9fSSalil bool en_mc, bool en_bc, int vport_id); 86146a3df9fSSalil 86246a3df9fSSalil int hclge_add_uc_addr_common(struct hclge_vport *vport, 86346a3df9fSSalil const unsigned char *addr); 86446a3df9fSSalil int hclge_rm_uc_addr_common(struct hclge_vport *vport, 86546a3df9fSSalil const unsigned char *addr); 86646a3df9fSSalil int hclge_add_mc_addr_common(struct hclge_vport *vport, 86746a3df9fSSalil const unsigned char *addr); 86846a3df9fSSalil int hclge_rm_mc_addr_common(struct hclge_vport *vport, 86946a3df9fSSalil const unsigned char *addr); 87046a3df9fSSalil 87146a3df9fSSalil struct hclge_vport *hclge_get_vport(struct hnae3_handle *handle); 87284e095d6SSalil Mehta int hclge_bind_ring_with_vector(struct hclge_vport *vport, 87384e095d6SSalil Mehta int vector_id, bool en, 87446a3df9fSSalil struct hnae3_ring_chain_node *ring_chain); 87584e095d6SSalil Mehta 87646a3df9fSSalil static inline int hclge_get_queue_id(struct hnae3_queue *queue) 87746a3df9fSSalil { 87846a3df9fSSalil struct hclge_tqp *tqp = container_of(queue, struct hclge_tqp, q); 87946a3df9fSSalil 88046a3df9fSSalil return tqp->index; 88146a3df9fSSalil } 88246a3df9fSSalil 8836dd22bbcSHuazhong Tan static inline bool hclge_is_reset_pending(struct hclge_dev *hdev) 8846dd22bbcSHuazhong Tan { 8856dd22bbcSHuazhong Tan return !!hdev->reset_pending; 8866dd22bbcSHuazhong Tan } 8876dd22bbcSHuazhong Tan 888dea846e8SHuazhong Tan int hclge_inform_reset_assert_to_vf(struct hclge_vport *vport); 88946a3df9fSSalil int hclge_cfg_mac_speed_dup(struct hclge_dev *hdev, int speed, u8 duplex); 890dc8131d8SYunsheng Lin int hclge_set_vlan_filter(struct hnae3_handle *handle, __be16 proto, 891dc8131d8SYunsheng Lin u16 vlan_id, bool is_kill); 892b2641e2aSYunsheng Lin int hclge_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable); 89377f255c1SYunsheng Lin 89477f255c1SYunsheng Lin int hclge_buffer_alloc(struct hclge_dev *hdev); 89577f255c1SYunsheng Lin int hclge_rss_init_hw(struct hclge_dev *hdev); 896268f5dfaSYunsheng Lin void hclge_rss_indir_init_cfg(struct hclge_dev *hdev); 897dde1a86eSSalil Mehta 898aa5c4f17SHuazhong Tan int hclge_inform_reset_assert_to_vf(struct hclge_vport *vport); 899dde1a86eSSalil Mehta void hclge_mbx_handler(struct hclge_dev *hdev); 9007fa6be4fSHuazhong Tan int hclge_reset_tqp(struct hnae3_handle *handle, u16 queue_id); 9011a426f8bSPeng Li void hclge_reset_vf_queue(struct hclge_vport *vport, u16 queue_id); 9021770a7a3SPeng Li int hclge_cfg_flowctrl(struct hclge_dev *hdev); 9032bfbd35dSSalil Mehta int hclge_func_reset_cmd(struct hclge_dev *hdev, int func_id); 904a6d818e3SYunsheng Lin int hclge_vport_start(struct hclge_vport *vport); 905a6d818e3SYunsheng Lin void hclge_vport_stop(struct hclge_vport *vport); 906818f1675SYunsheng Lin int hclge_set_vport_mtu(struct hclge_vport *vport, int new_mtu); 9073c666b58Sliuzhongzhu int hclge_dbg_run_cmd(struct hnae3_handle *handle, char *cmd_buf); 9080c29d191Sliuzhongzhu u16 hclge_covert_handle_qid_global(struct hnae3_handle *handle, u16 queue_id); 909af013903SHuazhong Tan int hclge_notify_client(struct hclge_dev *hdev, 910af013903SHuazhong Tan enum hnae3_reset_notify_type type); 911*6dd86902Sliuzhongzhu void hclge_add_vport_mac_table(struct hclge_vport *vport, const u8 *mac_addr, 912*6dd86902Sliuzhongzhu enum HCLGE_MAC_ADDR_TYPE mac_type); 913*6dd86902Sliuzhongzhu void hclge_rm_vport_mac_table(struct hclge_vport *vport, const u8 *mac_addr, 914*6dd86902Sliuzhongzhu bool is_write_tbl, 915*6dd86902Sliuzhongzhu enum HCLGE_MAC_ADDR_TYPE mac_type); 916*6dd86902Sliuzhongzhu void hclge_rm_vport_all_mac_table(struct hclge_vport *vport, bool is_del_list, 917*6dd86902Sliuzhongzhu enum HCLGE_MAC_ADDR_TYPE mac_type); 918*6dd86902Sliuzhongzhu void hclge_uninit_vport_mac_table(struct hclge_dev *hdev); 919*6dd86902Sliuzhongzhu 92046a3df9fSSalil #endif 921