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