1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Copyright (c) Meta Platforms, Inc. and affiliates. */ 3 4 #ifndef _FBNIC_RPC_H_ 5 #define _FBNIC_RPC_H_ 6 7 #include <uapi/linux/in6.h> 8 #include <linux/bitfield.h> 9 10 /* The TCAM state definitions follow an expected ordering. 11 * They start out disabled, then move through the following states: 12 * Disabled 0 -> Add 2 13 * Add 2 -> Valid 1 14 * 15 * Valid 1 -> Add/Update 2 16 * Add 2 -> Valid 1 17 * 18 * Valid 1 -> Delete 3 19 * Delete 3 -> Disabled 0 20 */ 21 enum { 22 FBNIC_TCAM_S_DISABLED = 0, 23 FBNIC_TCAM_S_VALID = 1, 24 FBNIC_TCAM_S_ADD = 2, 25 FBNIC_TCAM_S_UPDATE = FBNIC_TCAM_S_ADD, 26 FBNIC_TCAM_S_DELETE = 3, 27 }; 28 29 /* 32 MAC Destination Address TCAM Entries 30 * 4 registers DA[1:0], DA[3:2], DA[5:4], Validate 31 */ 32 #define FBNIC_RPC_TCAM_MACDA_WORD_LEN 3 33 #define FBNIC_RPC_TCAM_MACDA_NUM_ENTRIES 32 34 35 #define FBNIC_RPC_TCAM_ACT_WORD_LEN 11 36 #define FBNIC_RPC_TCAM_ACT_NUM_ENTRIES 64 37 38 #define FBNIC_TCE_TCAM_WORD_LEN 3 39 #define FBNIC_TCE_TCAM_NUM_ENTRIES 8 40 41 struct fbnic_mac_addr { 42 union { 43 unsigned char addr8[ETH_ALEN]; 44 __be16 addr16[FBNIC_RPC_TCAM_MACDA_WORD_LEN]; 45 } mask, value; 46 unsigned char state; 47 DECLARE_BITMAP(act_tcam, FBNIC_RPC_TCAM_ACT_NUM_ENTRIES); 48 }; 49 50 struct fbnic_act_tcam { 51 struct { 52 u16 tcam[FBNIC_RPC_TCAM_ACT_WORD_LEN]; 53 } mask, value; 54 unsigned char state; 55 u16 rss_en_mask; 56 u32 dest; 57 }; 58 59 enum { 60 FBNIC_RSS_EN_HOST_UDP6, 61 FBNIC_RSS_EN_HOST_UDP4, 62 FBNIC_RSS_EN_HOST_TCP6, 63 FBNIC_RSS_EN_HOST_TCP4, 64 FBNIC_RSS_EN_HOST_IP6, 65 FBNIC_RSS_EN_HOST_IP4, 66 FBNIC_RSS_EN_HOST_ETHER, 67 FBNIC_RSS_EN_XCAST_UDP6, 68 #define FBNIC_RSS_EN_NUM_UNICAST FBNIC_RSS_EN_XCAST_UDP6 69 FBNIC_RSS_EN_XCAST_UDP4, 70 FBNIC_RSS_EN_XCAST_TCP6, 71 FBNIC_RSS_EN_XCAST_TCP4, 72 FBNIC_RSS_EN_XCAST_IP6, 73 FBNIC_RSS_EN_XCAST_IP4, 74 FBNIC_RSS_EN_XCAST_ETHER, 75 FBNIC_RSS_EN_NUM_ENTRIES 76 }; 77 78 /* Reserve the first 2 entries for the use by the BMC so that we can 79 * avoid allowing rules to get in the way of BMC unicast traffic. 80 */ 81 #define FBNIC_RPC_ACT_TBL_BMC_OFFSET 0 82 #define FBNIC_RPC_ACT_TBL_BMC_ALL_MULTI_OFFSET 1 83 84 /* We reserve the last 14 entries for RSS rules on the host. The BMC 85 * unicast rule will need to be populated above these and is expected to 86 * use MACDA TCAM entry 23 to store the BMC MAC address. 87 */ 88 #define FBNIC_RPC_ACT_TBL_RSS_OFFSET \ 89 (FBNIC_RPC_ACT_TBL_NUM_ENTRIES - FBNIC_RSS_EN_NUM_ENTRIES) 90 91 /* Flags used to identify the owner for this MAC filter. Note that any 92 * flags set for Broadcast thru Promisc indicate that the rule belongs 93 * to the RSS filters for the host. 94 */ 95 enum { 96 FBNIC_MAC_ADDR_T_BMC = 0, 97 FBNIC_MAC_ADDR_T_BROADCAST = FBNIC_RPC_ACT_TBL_RSS_OFFSET, 98 #define FBNIC_MAC_ADDR_T_HOST_START FBNIC_MAC_ADDR_T_BROADCAST 99 FBNIC_MAC_ADDR_T_MULTICAST, 100 FBNIC_MAC_ADDR_T_UNICAST, 101 FBNIC_MAC_ADDR_T_ALLMULTI, /* BROADCAST ... MULTICAST*/ 102 FBNIC_MAC_ADDR_T_PROMISC, /* BROADCAST ... UNICAST */ 103 FBNIC_MAC_ADDR_T_HOST_LAST 104 }; 105 106 #define FBNIC_MAC_ADDR_T_HOST_LEN \ 107 (FBNIC_MAC_ADDR_T_HOST_LAST - FBNIC_MAC_ADDR_T_HOST_START) 108 109 #define FBNIC_RPC_TCAM_ACT0_IPSRC_IDX CSR_GENMASK(2, 0) 110 #define FBNIC_RPC_TCAM_ACT0_IPSRC_VALID CSR_BIT(3) 111 #define FBNIC_RPC_TCAM_ACT0_IPDST_IDX CSR_GENMASK(6, 4) 112 #define FBNIC_RPC_TCAM_ACT0_IPDST_VALID CSR_BIT(7) 113 #define FBNIC_RPC_TCAM_ACT0_OUTER_IPSRC_IDX CSR_GENMASK(10, 8) 114 #define FBNIC_RPC_TCAM_ACT0_OUTER_IPSRC_VALID CSR_BIT(11) 115 #define FBNIC_RPC_TCAM_ACT0_OUTER_IPDST_IDX CSR_GENMASK(14, 12) 116 #define FBNIC_RPC_TCAM_ACT0_OUTER_IPDST_VALID CSR_BIT(15) 117 118 #define FBNIC_RPC_TCAM_ACT1_L2_MACDA_IDX CSR_GENMASK(9, 5) 119 #define FBNIC_RPC_TCAM_ACT1_L2_MACDA_VALID CSR_BIT(10) 120 #define FBNIC_RPC_TCAM_ACT1_IP_IS_V6 CSR_BIT(11) 121 #define FBNIC_RPC_TCAM_ACT1_IP_VALID CSR_BIT(12) 122 #define FBNIC_RPC_TCAM_ACT1_OUTER_IP_VALID CSR_BIT(13) 123 #define FBNIC_RPC_TCAM_ACT1_L4_IS_UDP CSR_BIT(14) 124 #define FBNIC_RPC_TCAM_ACT1_L4_VALID CSR_BIT(15) 125 126 /* TCAM 0 - 3 reserved for BMC MAC addresses */ 127 #define FBNIC_RPC_TCAM_MACDA_BMC_ADDR_IDX 0 128 /* TCAM 4 reserved for broadcast MAC address */ 129 #define FBNIC_RPC_TCAM_MACDA_BROADCAST_IDX 4 130 /* TCAMs 5 - 30 will be used for multicast and unicast addresses. The 131 * boundary between the two can be variable it is currently set to 24 132 * on which the unicast addresses start. The general idea is that we will 133 * always go top-down with unicast, and bottom-up with multicast so that 134 * there should be free-space in the middle between the two. 135 * 136 * The entry at MADCA_DEFAULT_BOUNDARY is a special case as it can be used 137 * for the ALL MULTI address if the list is full, or the BMC has requested 138 * it. 139 */ 140 #define FBNIC_RPC_TCAM_MACDA_MULTICAST_IDX 5 141 #define FBNIC_RPC_TCAM_MACDA_DEFAULT_BOUNDARY 24 142 #define FBNIC_RPC_TCAM_MACDA_HOST_ADDR_IDX 30 143 /* Reserved for use to record Multicast promisc, or Promiscuous */ 144 #define FBNIC_RPC_TCAM_MACDA_PROMISC_IDX 31 145 146 enum { 147 FBNIC_UDP6_HASH_OPT, 148 FBNIC_UDP4_HASH_OPT, 149 FBNIC_TCP6_HASH_OPT, 150 FBNIC_TCP4_HASH_OPT, 151 #define FBNIC_L4_HASH_OPT FBNIC_TCP4_HASH_OPT 152 FBNIC_IPV6_HASH_OPT, 153 FBNIC_IPV4_HASH_OPT, 154 #define FBNIC_IP_HASH_OPT FBNIC_IPV4_HASH_OPT 155 FBNIC_ETHER_HASH_OPT, 156 FBNIC_NUM_HASH_OPT, 157 }; 158 159 struct fbnic_dev; 160 struct fbnic_net; 161 162 void fbnic_bmc_rpc_init(struct fbnic_dev *fbd); 163 void fbnic_bmc_rpc_all_multi_config(struct fbnic_dev *fbd, bool enable_host); 164 165 void fbnic_reset_indir_tbl(struct fbnic_net *fbn); 166 void fbnic_rss_key_fill(u32 *buffer); 167 void fbnic_rss_init_en_mask(struct fbnic_net *fbn); 168 void fbnic_rss_disable_hw(struct fbnic_dev *fbd); 169 void fbnic_rss_reinit_hw(struct fbnic_dev *fbd, struct fbnic_net *fbn); 170 void fbnic_rss_reinit(struct fbnic_dev *fbd, struct fbnic_net *fbn); 171 172 int __fbnic_xc_unsync(struct fbnic_mac_addr *mac_addr, unsigned int tcam_idx); 173 struct fbnic_mac_addr *__fbnic_uc_sync(struct fbnic_dev *fbd, 174 const unsigned char *addr); 175 struct fbnic_mac_addr *__fbnic_mc_sync(struct fbnic_dev *fbd, 176 const unsigned char *addr); 177 void fbnic_sift_macda(struct fbnic_dev *fbd); 178 void fbnic_write_macda(struct fbnic_dev *fbd); 179 180 static inline int __fbnic_uc_unsync(struct fbnic_mac_addr *mac_addr) 181 { 182 return __fbnic_xc_unsync(mac_addr, FBNIC_MAC_ADDR_T_UNICAST); 183 } 184 185 static inline int __fbnic_mc_unsync(struct fbnic_mac_addr *mac_addr) 186 { 187 return __fbnic_xc_unsync(mac_addr, FBNIC_MAC_ADDR_T_MULTICAST); 188 } 189 190 void fbnic_clear_rules(struct fbnic_dev *fbd); 191 void fbnic_write_rules(struct fbnic_dev *fbd); 192 void fbnic_write_tce_tcam(struct fbnic_dev *fbd); 193 #endif /* _FBNIC_RPC_H_ */ 194