1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) Meta Platforms, Inc. and affiliates. */
3
4 #include <linux/etherdevice.h>
5 #include <linux/ethtool.h>
6
7 #include "fbnic.h"
8 #include "fbnic_netdev.h"
9 #include "fbnic_rpc.h"
10
fbnic_reset_indir_tbl(struct fbnic_net * fbn)11 void fbnic_reset_indir_tbl(struct fbnic_net *fbn)
12 {
13 unsigned int num_rx = fbn->num_rx_queues;
14 unsigned int i;
15
16 if (netif_is_rxfh_configured(fbn->netdev))
17 return;
18
19 for (i = 0; i < FBNIC_RPC_RSS_TBL_SIZE; i++)
20 fbn->indir_tbl[0][i] = ethtool_rxfh_indir_default(i, num_rx);
21 }
22
fbnic_rss_key_fill(u32 * buffer)23 void fbnic_rss_key_fill(u32 *buffer)
24 {
25 static u32 rss_key[FBNIC_RPC_RSS_KEY_DWORD_LEN];
26
27 net_get_random_once(rss_key, sizeof(rss_key));
28 rss_key[FBNIC_RPC_RSS_KEY_LAST_IDX] &= FBNIC_RPC_RSS_KEY_LAST_MASK;
29
30 memcpy(buffer, rss_key, sizeof(rss_key));
31 }
32
33 #define RX_HASH_OPT_L4 \
34 (RXH_IP_SRC | RXH_IP_DST | RXH_L4_B_0_1 | RXH_L4_B_2_3)
35 #define RX_HASH_OPT_L3 \
36 (RXH_IP_SRC | RXH_IP_DST)
37 #define RX_HASH_OPT_L2 RXH_L2DA
38
fbnic_rss_init_en_mask(struct fbnic_net * fbn)39 void fbnic_rss_init_en_mask(struct fbnic_net *fbn)
40 {
41 fbn->rss_flow_hash[FBNIC_TCP4_HASH_OPT] = RX_HASH_OPT_L4;
42 fbn->rss_flow_hash[FBNIC_TCP6_HASH_OPT] = RX_HASH_OPT_L4;
43
44 fbn->rss_flow_hash[FBNIC_UDP4_HASH_OPT] = RX_HASH_OPT_L3;
45 fbn->rss_flow_hash[FBNIC_UDP6_HASH_OPT] = RX_HASH_OPT_L3;
46 fbn->rss_flow_hash[FBNIC_IPV4_HASH_OPT] = RX_HASH_OPT_L3;
47 fbn->rss_flow_hash[FBNIC_IPV6_HASH_OPT] = RX_HASH_OPT_L3;
48
49 fbn->rss_flow_hash[FBNIC_ETHER_HASH_OPT] = RX_HASH_OPT_L2;
50 }
51
fbnic_rss_disable_hw(struct fbnic_dev * fbd)52 void fbnic_rss_disable_hw(struct fbnic_dev *fbd)
53 {
54 /* Disable RPC by clearing enable bit and configuration */
55 if (!fbnic_bmc_present(fbd))
56 wr32(fbd, FBNIC_RPC_RMI_CONFIG,
57 FIELD_PREP(FBNIC_RPC_RMI_CONFIG_OH_BYTES, 20));
58 }
59
60 #define FBNIC_FH_2_RSSEM_BIT(_fh, _rssem, _val) \
61 FIELD_PREP(FBNIC_RPC_ACT_TBL1_RSS_ENA_##_rssem, \
62 FIELD_GET(RXH_##_fh, _val))
fbnic_flow_hash_2_rss_en_mask(struct fbnic_net * fbn,int flow_type)63 static u16 fbnic_flow_hash_2_rss_en_mask(struct fbnic_net *fbn, int flow_type)
64 {
65 u32 flow_hash = fbn->rss_flow_hash[flow_type];
66 u32 rss_en_mask = 0;
67
68 rss_en_mask |= FBNIC_FH_2_RSSEM_BIT(L2DA, L2_DA, flow_hash);
69 rss_en_mask |= FBNIC_FH_2_RSSEM_BIT(IP_SRC, IP_SRC, flow_hash);
70 rss_en_mask |= FBNIC_FH_2_RSSEM_BIT(IP_DST, IP_DST, flow_hash);
71 rss_en_mask |= FBNIC_FH_2_RSSEM_BIT(L4_B_0_1, L4_SRC, flow_hash);
72 rss_en_mask |= FBNIC_FH_2_RSSEM_BIT(L4_B_2_3, L4_DST, flow_hash);
73
74 return rss_en_mask;
75 }
76
fbnic_rss_reinit_hw(struct fbnic_dev * fbd,struct fbnic_net * fbn)77 void fbnic_rss_reinit_hw(struct fbnic_dev *fbd, struct fbnic_net *fbn)
78 {
79 unsigned int i;
80
81 for (i = 0; i < FBNIC_RPC_RSS_TBL_SIZE; i++) {
82 wr32(fbd, FBNIC_RPC_RSS_TBL(0, i), fbn->indir_tbl[0][i]);
83 wr32(fbd, FBNIC_RPC_RSS_TBL(1, i), fbn->indir_tbl[1][i]);
84 }
85
86 for (i = 0; i < FBNIC_RPC_RSS_KEY_DWORD_LEN; i++)
87 wr32(fbd, FBNIC_RPC_RSS_KEY(i), fbn->rss_key[i]);
88
89 /* Default action for this to drop w/ no destination */
90 wr32(fbd, FBNIC_RPC_ACT_TBL0_DEFAULT, FBNIC_RPC_ACT_TBL0_DROP);
91 wrfl(fbd);
92
93 wr32(fbd, FBNIC_RPC_ACT_TBL1_DEFAULT, 0);
94
95 /* If it isn't already enabled set the RMI Config value to enable RPC */
96 wr32(fbd, FBNIC_RPC_RMI_CONFIG,
97 FIELD_PREP(FBNIC_RPC_RMI_CONFIG_MTU, FBNIC_MAX_JUMBO_FRAME_SIZE) |
98 FIELD_PREP(FBNIC_RPC_RMI_CONFIG_OH_BYTES, 20) |
99 FBNIC_RPC_RMI_CONFIG_ENABLE);
100 }
101
fbnic_bmc_rpc_all_multi_config(struct fbnic_dev * fbd,bool enable_host)102 void fbnic_bmc_rpc_all_multi_config(struct fbnic_dev *fbd,
103 bool enable_host)
104 {
105 struct fbnic_act_tcam *act_tcam;
106 struct fbnic_mac_addr *mac_addr;
107 int j;
108
109 /* We need to add the all multicast filter at the end of the
110 * multicast address list. This way if there are any that are
111 * shared between the host and the BMC they can be directed to
112 * both. Otherwise the remainder just get sent directly to the
113 * BMC.
114 */
115 mac_addr = &fbd->mac_addr[fbd->mac_addr_boundary - 1];
116 if (fbnic_bmc_present(fbd) && fbd->fw_cap.all_multi) {
117 if (mac_addr->state != FBNIC_TCAM_S_VALID) {
118 eth_zero_addr(mac_addr->value.addr8);
119 eth_broadcast_addr(mac_addr->mask.addr8);
120 mac_addr->value.addr8[0] ^= 1;
121 mac_addr->mask.addr8[0] ^= 1;
122 set_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam);
123 mac_addr->state = FBNIC_TCAM_S_ADD;
124 }
125 if (enable_host)
126 set_bit(FBNIC_MAC_ADDR_T_ALLMULTI,
127 mac_addr->act_tcam);
128 else
129 clear_bit(FBNIC_MAC_ADDR_T_ALLMULTI,
130 mac_addr->act_tcam);
131 } else if (!test_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam) &&
132 !is_zero_ether_addr(mac_addr->mask.addr8) &&
133 mac_addr->state == FBNIC_TCAM_S_VALID) {
134 clear_bit(FBNIC_MAC_ADDR_T_ALLMULTI, mac_addr->act_tcam);
135 clear_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam);
136 mac_addr->state = FBNIC_TCAM_S_DELETE;
137 }
138
139 /* We have to add a special handler for multicast as the
140 * BMC may have an all-multi rule already in place. As such
141 * adding a rule ourselves won't do any good so we will have
142 * to modify the rules for the ALL MULTI below if the BMC
143 * already has the rule in place.
144 */
145 act_tcam = &fbd->act_tcam[FBNIC_RPC_ACT_TBL_BMC_ALL_MULTI_OFFSET];
146
147 /* If we are not enabling the rule just delete it. We will fall
148 * back to the RSS rules that support the multicast addresses.
149 */
150 if (!fbnic_bmc_present(fbd) || !fbd->fw_cap.all_multi || enable_host) {
151 if (act_tcam->state == FBNIC_TCAM_S_VALID)
152 act_tcam->state = FBNIC_TCAM_S_DELETE;
153 return;
154 }
155
156 /* Rewrite TCAM rule 23 to handle BMC all-multi traffic */
157 act_tcam->dest = FIELD_PREP(FBNIC_RPC_ACT_TBL0_DEST_MASK,
158 FBNIC_RPC_ACT_TBL0_DEST_BMC);
159 act_tcam->mask.tcam[0] = 0xffff;
160
161 /* MACDA 0 - 3 is reserved for the BMC MAC address */
162 act_tcam->value.tcam[1] =
163 FIELD_PREP(FBNIC_RPC_TCAM_ACT1_L2_MACDA_IDX,
164 fbd->mac_addr_boundary - 1) |
165 FBNIC_RPC_TCAM_ACT1_L2_MACDA_VALID;
166 act_tcam->mask.tcam[1] = 0xffff &
167 ~FBNIC_RPC_TCAM_ACT1_L2_MACDA_IDX &
168 ~FBNIC_RPC_TCAM_ACT1_L2_MACDA_VALID;
169
170 for (j = 2; j < FBNIC_RPC_TCAM_ACT_WORD_LEN; j++)
171 act_tcam->mask.tcam[j] = 0xffff;
172
173 act_tcam->state = FBNIC_TCAM_S_UPDATE;
174 }
175
fbnic_bmc_rpc_init(struct fbnic_dev * fbd)176 void fbnic_bmc_rpc_init(struct fbnic_dev *fbd)
177 {
178 int i = FBNIC_RPC_TCAM_MACDA_BMC_ADDR_IDX;
179 struct fbnic_act_tcam *act_tcam;
180 struct fbnic_mac_addr *mac_addr;
181 int j;
182
183 /* Check if BMC is present */
184 if (!fbnic_bmc_present(fbd))
185 return;
186
187 /* Fetch BMC MAC addresses from firmware capabilities */
188 for (j = 0; j < 4; j++) {
189 u8 *bmc_mac = fbd->fw_cap.bmc_mac_addr[j];
190
191 /* Validate BMC MAC addresses */
192 if (is_zero_ether_addr(bmc_mac))
193 continue;
194
195 if (is_multicast_ether_addr(bmc_mac))
196 mac_addr = __fbnic_mc_sync(fbd, bmc_mac);
197 else
198 mac_addr = &fbd->mac_addr[i++];
199
200 if (!mac_addr) {
201 netdev_err(fbd->netdev,
202 "No slot for BMC MAC address[%d]\n", j);
203 continue;
204 }
205
206 ether_addr_copy(mac_addr->value.addr8, bmc_mac);
207 eth_zero_addr(mac_addr->mask.addr8);
208
209 set_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam);
210 mac_addr->state = FBNIC_TCAM_S_ADD;
211 }
212
213 /* Validate Broadcast is also present, record it and tag it */
214 mac_addr = &fbd->mac_addr[FBNIC_RPC_TCAM_MACDA_BROADCAST_IDX];
215 eth_broadcast_addr(mac_addr->value.addr8);
216 set_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam);
217 mac_addr->state = FBNIC_TCAM_S_ADD;
218
219 /* Rewrite TCAM rule 0 if it isn't present to relocate BMC rules */
220 act_tcam = &fbd->act_tcam[FBNIC_RPC_ACT_TBL_BMC_OFFSET];
221 act_tcam->dest = FIELD_PREP(FBNIC_RPC_ACT_TBL0_DEST_MASK,
222 FBNIC_RPC_ACT_TBL0_DEST_BMC);
223 act_tcam->mask.tcam[0] = 0xffff;
224
225 /* MACDA 0 - 3 is reserved for the BMC MAC address
226 * to account for that we have to mask out the lower 2 bits
227 * of the macda by performing an &= with 0x1c.
228 */
229 act_tcam->value.tcam[1] = FBNIC_RPC_TCAM_ACT1_L2_MACDA_VALID;
230 act_tcam->mask.tcam[1] = 0xffff &
231 ~FIELD_PREP(FBNIC_RPC_TCAM_ACT1_L2_MACDA_IDX, 0x1c) &
232 ~FBNIC_RPC_TCAM_ACT1_L2_MACDA_VALID;
233
234 for (j = 2; j < FBNIC_RPC_TCAM_ACT_WORD_LEN; j++)
235 act_tcam->mask.tcam[j] = 0xffff;
236
237 act_tcam->state = FBNIC_TCAM_S_UPDATE;
238
239 fbnic_bmc_rpc_all_multi_config(fbd, false);
240 }
241
242 #define FBNIC_ACT1_INIT(_l4, _udp, _ip, _v6) \
243 (((_l4) ? FBNIC_RPC_TCAM_ACT1_L4_VALID : 0) | \
244 ((_udp) ? FBNIC_RPC_TCAM_ACT1_L4_IS_UDP : 0) | \
245 ((_ip) ? FBNIC_RPC_TCAM_ACT1_IP_VALID : 0) | \
246 ((_v6) ? FBNIC_RPC_TCAM_ACT1_IP_IS_V6 : 0))
247
248 #define FBNIC_TSTAMP_MASK(_all, _udp, _ether) \
249 (((_all) ? ((1u << FBNIC_NUM_HASH_OPT) - 1) : 0) | \
250 ((_udp) ? (1u << FBNIC_UDP6_HASH_OPT) | \
251 (1u << FBNIC_UDP4_HASH_OPT) : 0) | \
252 ((_ether) ? (1u << FBNIC_ETHER_HASH_OPT) : 0))
253
fbnic_rss_reinit(struct fbnic_dev * fbd,struct fbnic_net * fbn)254 void fbnic_rss_reinit(struct fbnic_dev *fbd, struct fbnic_net *fbn)
255 {
256 static const u32 act1_value[FBNIC_NUM_HASH_OPT] = {
257 FBNIC_ACT1_INIT(1, 1, 1, 1), /* UDP6 */
258 FBNIC_ACT1_INIT(1, 1, 1, 0), /* UDP4 */
259 FBNIC_ACT1_INIT(1, 0, 1, 1), /* TCP6 */
260 FBNIC_ACT1_INIT(1, 0, 1, 0), /* TCP4 */
261 FBNIC_ACT1_INIT(0, 0, 1, 1), /* IP6 */
262 FBNIC_ACT1_INIT(0, 0, 1, 0), /* IP4 */
263 0 /* Ether */
264 };
265 u32 tstamp_mask = 0;
266 unsigned int i;
267
268 /* To support scenarios where a BMC is present we must write the
269 * rules twice, once for the unicast cases, and once again for
270 * the broadcast/multicast cases as we have to support 2 destinations.
271 */
272 BUILD_BUG_ON(FBNIC_RSS_EN_NUM_UNICAST * 2 != FBNIC_RSS_EN_NUM_ENTRIES);
273 BUILD_BUG_ON(ARRAY_SIZE(act1_value) != FBNIC_NUM_HASH_OPT);
274
275 /* Set timestamp mask with 1b per flow type */
276 if (fbn->hwtstamp_config.rx_filter != HWTSTAMP_FILTER_NONE) {
277 switch (fbn->hwtstamp_config.rx_filter) {
278 case HWTSTAMP_FILTER_ALL:
279 tstamp_mask = FBNIC_TSTAMP_MASK(1, 1, 1);
280 break;
281 case HWTSTAMP_FILTER_PTP_V2_EVENT:
282 tstamp_mask = FBNIC_TSTAMP_MASK(0, 1, 1);
283 break;
284 case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
285 case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
286 tstamp_mask = FBNIC_TSTAMP_MASK(0, 1, 0);
287 break;
288 case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
289 tstamp_mask = FBNIC_TSTAMP_MASK(0, 0, 1);
290 break;
291 default:
292 netdev_warn(fbn->netdev, "Unsupported hwtstamp_rx_filter\n");
293 break;
294 }
295 }
296
297 /* Program RSS hash enable mask for host in action TCAM/table. */
298 for (i = fbnic_bmc_present(fbd) ? 0 : FBNIC_RSS_EN_NUM_UNICAST;
299 i < FBNIC_RSS_EN_NUM_ENTRIES; i++) {
300 unsigned int idx = i + FBNIC_RPC_ACT_TBL_RSS_OFFSET;
301 struct fbnic_act_tcam *act_tcam = &fbd->act_tcam[idx];
302 u32 flow_hash, dest, rss_en_mask;
303 int flow_type, j;
304 u16 value = 0;
305
306 flow_type = i % FBNIC_RSS_EN_NUM_UNICAST;
307 flow_hash = fbn->rss_flow_hash[flow_type];
308
309 /* Set DEST_HOST based on absence of RXH_DISCARD */
310 dest = FIELD_PREP(FBNIC_RPC_ACT_TBL0_DEST_MASK,
311 !(RXH_DISCARD & flow_hash) ?
312 FBNIC_RPC_ACT_TBL0_DEST_HOST : 0);
313
314 if (i >= FBNIC_RSS_EN_NUM_UNICAST && fbnic_bmc_present(fbd))
315 dest |= FIELD_PREP(FBNIC_RPC_ACT_TBL0_DEST_MASK,
316 FBNIC_RPC_ACT_TBL0_DEST_BMC);
317
318 if (!dest)
319 dest = FBNIC_RPC_ACT_TBL0_DROP;
320 else if (tstamp_mask & (1u << flow_type))
321 dest |= FBNIC_RPC_ACT_TBL0_TS_ENA;
322
323 if (act1_value[flow_type] & FBNIC_RPC_TCAM_ACT1_L4_VALID)
324 dest |= FIELD_PREP(FBNIC_RPC_ACT_TBL0_DMA_HINT,
325 FBNIC_RCD_HDR_AL_DMA_HINT_L4);
326
327 rss_en_mask = fbnic_flow_hash_2_rss_en_mask(fbn, flow_type);
328
329 act_tcam->dest = dest;
330 act_tcam->rss_en_mask = rss_en_mask;
331 act_tcam->state = FBNIC_TCAM_S_UPDATE;
332
333 act_tcam->mask.tcam[0] = 0xffff;
334
335 /* We reserve the upper 8 MACDA TCAM entries for host
336 * unicast. So we set the value to 24, and the mask the
337 * lower bits so that the lower entries can be used as
338 * multicast or BMC addresses.
339 */
340 if (i < FBNIC_RSS_EN_NUM_UNICAST)
341 value = FIELD_PREP(FBNIC_RPC_TCAM_ACT1_L2_MACDA_IDX,
342 fbd->mac_addr_boundary);
343 value |= FBNIC_RPC_TCAM_ACT1_L2_MACDA_VALID;
344
345 flow_type = i % FBNIC_RSS_EN_NUM_UNICAST;
346 value |= act1_value[flow_type];
347
348 act_tcam->value.tcam[1] = value;
349 act_tcam->mask.tcam[1] = ~value;
350
351 for (j = 2; j < FBNIC_RPC_TCAM_ACT_WORD_LEN; j++)
352 act_tcam->mask.tcam[j] = 0xffff;
353
354 act_tcam->state = FBNIC_TCAM_S_UPDATE;
355 }
356 }
357
__fbnic_uc_sync(struct fbnic_dev * fbd,const unsigned char * addr)358 struct fbnic_mac_addr *__fbnic_uc_sync(struct fbnic_dev *fbd,
359 const unsigned char *addr)
360 {
361 struct fbnic_mac_addr *avail_addr = NULL;
362 unsigned int i;
363
364 /* Scan from middle of list to bottom, filling bottom up.
365 * Skip the first entry which is reserved for dev_addr and
366 * leave the last entry to use for promiscuous filtering.
367 */
368 for (i = fbd->mac_addr_boundary - 1;
369 i < FBNIC_RPC_TCAM_MACDA_HOST_ADDR_IDX; i++) {
370 struct fbnic_mac_addr *mac_addr = &fbd->mac_addr[i];
371
372 if (mac_addr->state == FBNIC_TCAM_S_DISABLED) {
373 avail_addr = mac_addr;
374 } else if (ether_addr_equal(mac_addr->value.addr8, addr)) {
375 avail_addr = mac_addr;
376 break;
377 }
378 }
379
380 if (avail_addr && avail_addr->state == FBNIC_TCAM_S_DISABLED) {
381 ether_addr_copy(avail_addr->value.addr8, addr);
382 eth_zero_addr(avail_addr->mask.addr8);
383 avail_addr->state = FBNIC_TCAM_S_ADD;
384 }
385
386 return avail_addr;
387 }
388
__fbnic_mc_sync(struct fbnic_dev * fbd,const unsigned char * addr)389 struct fbnic_mac_addr *__fbnic_mc_sync(struct fbnic_dev *fbd,
390 const unsigned char *addr)
391 {
392 struct fbnic_mac_addr *avail_addr = NULL;
393 unsigned int i;
394
395 /* Scan from middle of list to top, filling top down.
396 * Skip over the address reserved for the BMC MAC and
397 * exclude index 0 as that belongs to the broadcast address
398 */
399 for (i = fbd->mac_addr_boundary;
400 --i > FBNIC_RPC_TCAM_MACDA_BROADCAST_IDX;) {
401 struct fbnic_mac_addr *mac_addr = &fbd->mac_addr[i];
402
403 if (mac_addr->state == FBNIC_TCAM_S_DISABLED) {
404 avail_addr = mac_addr;
405 } else if (ether_addr_equal(mac_addr->value.addr8, addr)) {
406 avail_addr = mac_addr;
407 break;
408 }
409 }
410
411 /* Scan the BMC addresses to see if it may have already
412 * reserved the address.
413 */
414 while (--i) {
415 struct fbnic_mac_addr *mac_addr = &fbd->mac_addr[i];
416
417 if (!is_zero_ether_addr(mac_addr->mask.addr8))
418 continue;
419
420 /* Only move on if we find a match */
421 if (!ether_addr_equal(mac_addr->value.addr8, addr))
422 continue;
423
424 /* We need to pull this address to the shared area */
425 if (avail_addr) {
426 memcpy(avail_addr, mac_addr, sizeof(*mac_addr));
427 mac_addr->state = FBNIC_TCAM_S_DELETE;
428 avail_addr->state = FBNIC_TCAM_S_ADD;
429 }
430
431 break;
432 }
433
434 if (avail_addr && avail_addr->state == FBNIC_TCAM_S_DISABLED) {
435 ether_addr_copy(avail_addr->value.addr8, addr);
436 eth_zero_addr(avail_addr->mask.addr8);
437 avail_addr->state = FBNIC_TCAM_S_ADD;
438 }
439
440 return avail_addr;
441 }
442
__fbnic_xc_unsync(struct fbnic_mac_addr * mac_addr,unsigned int tcam_idx)443 int __fbnic_xc_unsync(struct fbnic_mac_addr *mac_addr, unsigned int tcam_idx)
444 {
445 if (!test_and_clear_bit(tcam_idx, mac_addr->act_tcam))
446 return -ENOENT;
447
448 if (bitmap_empty(mac_addr->act_tcam, FBNIC_RPC_TCAM_ACT_NUM_ENTRIES))
449 mac_addr->state = FBNIC_TCAM_S_DELETE;
450
451 return 0;
452 }
453
fbnic_sift_macda(struct fbnic_dev * fbd)454 void fbnic_sift_macda(struct fbnic_dev *fbd)
455 {
456 int dest, src;
457
458 /* Move BMC only addresses back into BMC region */
459 for (dest = FBNIC_RPC_TCAM_MACDA_BMC_ADDR_IDX,
460 src = FBNIC_RPC_TCAM_MACDA_MULTICAST_IDX;
461 ++dest < FBNIC_RPC_TCAM_MACDA_BROADCAST_IDX &&
462 src < fbd->mac_addr_boundary;) {
463 struct fbnic_mac_addr *dest_addr = &fbd->mac_addr[dest];
464
465 if (dest_addr->state != FBNIC_TCAM_S_DISABLED)
466 continue;
467
468 while (src < fbd->mac_addr_boundary) {
469 struct fbnic_mac_addr *src_addr = &fbd->mac_addr[src++];
470
471 /* Verify BMC bit is set */
472 if (!test_bit(FBNIC_MAC_ADDR_T_BMC, src_addr->act_tcam))
473 continue;
474
475 /* Verify filter isn't already disabled */
476 if (src_addr->state == FBNIC_TCAM_S_DISABLED ||
477 src_addr->state == FBNIC_TCAM_S_DELETE)
478 continue;
479
480 /* Verify only BMC bit is set */
481 if (bitmap_weight(src_addr->act_tcam,
482 FBNIC_RPC_TCAM_ACT_NUM_ENTRIES) != 1)
483 continue;
484
485 /* Verify we are not moving wildcard address */
486 if (!is_zero_ether_addr(src_addr->mask.addr8))
487 continue;
488
489 memcpy(dest_addr, src_addr, sizeof(*src_addr));
490 src_addr->state = FBNIC_TCAM_S_DELETE;
491 dest_addr->state = FBNIC_TCAM_S_ADD;
492 }
493 }
494 }
495
fbnic_clear_macda_entry(struct fbnic_dev * fbd,unsigned int idx)496 static void fbnic_clear_macda_entry(struct fbnic_dev *fbd, unsigned int idx)
497 {
498 int i;
499
500 /* Invalidate entry and clear addr state info */
501 for (i = 0; i <= FBNIC_RPC_TCAM_MACDA_WORD_LEN; i++)
502 wr32(fbd, FBNIC_RPC_TCAM_MACDA(idx, i), 0);
503 }
504
fbnic_clear_macda(struct fbnic_dev * fbd)505 static void fbnic_clear_macda(struct fbnic_dev *fbd)
506 {
507 int idx;
508
509 for (idx = ARRAY_SIZE(fbd->mac_addr); idx--;) {
510 struct fbnic_mac_addr *mac_addr = &fbd->mac_addr[idx];
511
512 if (mac_addr->state == FBNIC_TCAM_S_DISABLED)
513 continue;
514
515 if (test_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam)) {
516 if (fbnic_bmc_present(fbd))
517 continue;
518 dev_warn_once(fbd->dev,
519 "Found BMC MAC address w/ BMC not present\n");
520 }
521
522 fbnic_clear_macda_entry(fbd, idx);
523
524 /* If rule was already destined for deletion just wipe it now */
525 if (mac_addr->state == FBNIC_TCAM_S_DELETE) {
526 memset(mac_addr, 0, sizeof(*mac_addr));
527 continue;
528 }
529
530 /* Change state to update so that we will rewrite
531 * this tcam the next time fbnic_write_macda is called.
532 */
533 mac_addr->state = FBNIC_TCAM_S_UPDATE;
534 }
535 }
536
fbnic_write_macda_entry(struct fbnic_dev * fbd,unsigned int idx,struct fbnic_mac_addr * mac_addr)537 static void fbnic_write_macda_entry(struct fbnic_dev *fbd, unsigned int idx,
538 struct fbnic_mac_addr *mac_addr)
539 {
540 __be16 *mask, *value;
541 int i;
542
543 mask = &mac_addr->mask.addr16[FBNIC_RPC_TCAM_MACDA_WORD_LEN - 1];
544 value = &mac_addr->value.addr16[FBNIC_RPC_TCAM_MACDA_WORD_LEN - 1];
545
546 for (i = 0; i < FBNIC_RPC_TCAM_MACDA_WORD_LEN; i++)
547 wr32(fbd, FBNIC_RPC_TCAM_MACDA(idx, i),
548 FIELD_PREP(FBNIC_RPC_TCAM_MACDA_MASK, ntohs(*mask--)) |
549 FIELD_PREP(FBNIC_RPC_TCAM_MACDA_VALUE, ntohs(*value--)));
550
551 wrfl(fbd);
552
553 wr32(fbd, FBNIC_RPC_TCAM_MACDA(idx, i), FBNIC_RPC_TCAM_VALIDATE);
554 }
555
fbnic_write_macda(struct fbnic_dev * fbd)556 void fbnic_write_macda(struct fbnic_dev *fbd)
557 {
558 int idx;
559
560 for (idx = ARRAY_SIZE(fbd->mac_addr); idx--;) {
561 struct fbnic_mac_addr *mac_addr = &fbd->mac_addr[idx];
562
563 /* Check if update flag is set else exit. */
564 if (!(mac_addr->state & FBNIC_TCAM_S_UPDATE))
565 continue;
566
567 /* Clear by writing 0s. */
568 if (mac_addr->state == FBNIC_TCAM_S_DELETE) {
569 /* Invalidate entry and clear addr state info */
570 fbnic_clear_macda_entry(fbd, idx);
571 memset(mac_addr, 0, sizeof(*mac_addr));
572
573 continue;
574 }
575
576 fbnic_write_macda_entry(fbd, idx, mac_addr);
577
578 mac_addr->state = FBNIC_TCAM_S_VALID;
579 }
580 }
581
fbnic_clear_act_tcam(struct fbnic_dev * fbd,unsigned int idx)582 static void fbnic_clear_act_tcam(struct fbnic_dev *fbd, unsigned int idx)
583 {
584 int i;
585
586 /* Invalidate entry and clear addr state info */
587 for (i = 0; i <= FBNIC_RPC_TCAM_ACT_WORD_LEN; i++)
588 wr32(fbd, FBNIC_RPC_TCAM_ACT(idx, i), 0);
589 }
590
fbnic_clear_tce_tcam_entry(struct fbnic_dev * fbd,unsigned int idx)591 static void fbnic_clear_tce_tcam_entry(struct fbnic_dev *fbd, unsigned int idx)
592 {
593 int i;
594
595 /* Invalidate entry and clear addr state info */
596 for (i = 0; i <= FBNIC_TCE_TCAM_WORD_LEN; i++)
597 wr32(fbd, FBNIC_TCE_RAM_TCAM(idx, i), 0);
598 }
599
fbnic_write_tce_tcam_dest(struct fbnic_dev * fbd,unsigned int idx,struct fbnic_mac_addr * mac_addr)600 static void fbnic_write_tce_tcam_dest(struct fbnic_dev *fbd, unsigned int idx,
601 struct fbnic_mac_addr *mac_addr)
602 {
603 u32 dest = FBNIC_TCE_TCAM_DEST_BMC;
604 u32 idx2dest_map;
605
606 if (is_multicast_ether_addr(mac_addr->value.addr8))
607 dest |= FBNIC_TCE_TCAM_DEST_MAC;
608
609 idx2dest_map = rd32(fbd, FBNIC_TCE_TCAM_IDX2DEST_MAP);
610 idx2dest_map &= ~(FBNIC_TCE_TCAM_IDX2DEST_MAP_DEST_ID_0 << (4 * idx));
611 idx2dest_map |= dest << (4 * idx);
612
613 wr32(fbd, FBNIC_TCE_TCAM_IDX2DEST_MAP, idx2dest_map);
614 }
615
fbnic_write_tce_tcam_entry(struct fbnic_dev * fbd,unsigned int idx,struct fbnic_mac_addr * mac_addr)616 static void fbnic_write_tce_tcam_entry(struct fbnic_dev *fbd, unsigned int idx,
617 struct fbnic_mac_addr *mac_addr)
618 {
619 __be16 *mask, *value;
620 int i;
621
622 mask = &mac_addr->mask.addr16[FBNIC_TCE_TCAM_WORD_LEN - 1];
623 value = &mac_addr->value.addr16[FBNIC_TCE_TCAM_WORD_LEN - 1];
624
625 for (i = 0; i < FBNIC_TCE_TCAM_WORD_LEN; i++)
626 wr32(fbd, FBNIC_TCE_RAM_TCAM(idx, i),
627 FIELD_PREP(FBNIC_TCE_RAM_TCAM_MASK, ntohs(*mask--)) |
628 FIELD_PREP(FBNIC_TCE_RAM_TCAM_VALUE, ntohs(*value--)));
629
630 wrfl(fbd);
631
632 wr32(fbd, FBNIC_TCE_RAM_TCAM3(idx), FBNIC_TCE_RAM_TCAM3_MCQ_MASK |
633 FBNIC_TCE_RAM_TCAM3_DEST_MASK |
634 FBNIC_TCE_RAM_TCAM3_VALIDATE);
635 }
636
__fbnic_write_tce_tcam_rev(struct fbnic_dev * fbd)637 static void __fbnic_write_tce_tcam_rev(struct fbnic_dev *fbd)
638 {
639 int tcam_idx = FBNIC_TCE_TCAM_NUM_ENTRIES;
640 int mac_idx;
641
642 for (mac_idx = ARRAY_SIZE(fbd->mac_addr); mac_idx--;) {
643 struct fbnic_mac_addr *mac_addr = &fbd->mac_addr[mac_idx];
644
645 /* Verify BMC bit is set */
646 if (!test_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam))
647 continue;
648
649 if (!tcam_idx) {
650 dev_err(fbd->dev, "TCE TCAM overflow\n");
651 return;
652 }
653
654 tcam_idx--;
655 fbnic_write_tce_tcam_dest(fbd, tcam_idx, mac_addr);
656 fbnic_write_tce_tcam_entry(fbd, tcam_idx, mac_addr);
657 }
658
659 while (tcam_idx)
660 fbnic_clear_tce_tcam_entry(fbd, --tcam_idx);
661
662 fbd->tce_tcam_last = tcam_idx;
663 }
664
__fbnic_write_tce_tcam(struct fbnic_dev * fbd)665 static void __fbnic_write_tce_tcam(struct fbnic_dev *fbd)
666 {
667 int tcam_idx = 0;
668 int mac_idx;
669
670 for (mac_idx = 0; mac_idx < ARRAY_SIZE(fbd->mac_addr); mac_idx++) {
671 struct fbnic_mac_addr *mac_addr = &fbd->mac_addr[mac_idx];
672
673 /* Verify BMC bit is set */
674 if (!test_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam))
675 continue;
676
677 if (tcam_idx == FBNIC_TCE_TCAM_NUM_ENTRIES) {
678 dev_err(fbd->dev, "TCE TCAM overflow\n");
679 return;
680 }
681
682 fbnic_write_tce_tcam_dest(fbd, tcam_idx, mac_addr);
683 fbnic_write_tce_tcam_entry(fbd, tcam_idx, mac_addr);
684 tcam_idx++;
685 }
686
687 while (tcam_idx < FBNIC_TCE_TCAM_NUM_ENTRIES)
688 fbnic_clear_tce_tcam_entry(fbd, tcam_idx++);
689
690 fbd->tce_tcam_last = tcam_idx;
691 }
692
fbnic_write_tce_tcam(struct fbnic_dev * fbd)693 void fbnic_write_tce_tcam(struct fbnic_dev *fbd)
694 {
695 if (fbd->tce_tcam_last)
696 __fbnic_write_tce_tcam_rev(fbd);
697 else
698 __fbnic_write_tce_tcam(fbd);
699 }
700
fbnic_clear_rules(struct fbnic_dev * fbd)701 void fbnic_clear_rules(struct fbnic_dev *fbd)
702 {
703 u32 dest = FIELD_PREP(FBNIC_RPC_ACT_TBL0_DEST_MASK,
704 FBNIC_RPC_ACT_TBL0_DEST_BMC);
705 int i = FBNIC_RPC_TCAM_ACT_NUM_ENTRIES - 1;
706 struct fbnic_act_tcam *act_tcam;
707
708 /* Clear MAC rules */
709 fbnic_clear_macda(fbd);
710
711 /* If BMC is present we need to preserve the last rule which
712 * will be used to route traffic to the BMC if it is received.
713 *
714 * At this point it should be the only MAC address in the MACDA
715 * so any unicast or multicast traffic received should be routed
716 * to it. So leave the last rule in place.
717 *
718 * It will be rewritten to add the host again when we bring
719 * the interface back up.
720 */
721 if (fbnic_bmc_present(fbd)) {
722 act_tcam = &fbd->act_tcam[i];
723
724 if (act_tcam->state == FBNIC_TCAM_S_VALID &&
725 (act_tcam->dest & dest)) {
726 wr32(fbd, FBNIC_RPC_ACT_TBL0(i), dest);
727 wr32(fbd, FBNIC_RPC_ACT_TBL1(i), 0);
728
729 act_tcam->state = FBNIC_TCAM_S_UPDATE;
730
731 i--;
732 }
733 }
734
735 /* Work from the bottom up deleting all other rules from hardware */
736 do {
737 act_tcam = &fbd->act_tcam[i];
738
739 if (act_tcam->state != FBNIC_TCAM_S_VALID)
740 continue;
741
742 fbnic_clear_act_tcam(fbd, i);
743 act_tcam->state = FBNIC_TCAM_S_UPDATE;
744 } while (i--);
745 }
746
fbnic_delete_act_tcam(struct fbnic_dev * fbd,unsigned int idx)747 static void fbnic_delete_act_tcam(struct fbnic_dev *fbd, unsigned int idx)
748 {
749 fbnic_clear_act_tcam(fbd, idx);
750 memset(&fbd->act_tcam[idx], 0, sizeof(struct fbnic_act_tcam));
751 }
752
fbnic_update_act_tcam(struct fbnic_dev * fbd,unsigned int idx)753 static void fbnic_update_act_tcam(struct fbnic_dev *fbd, unsigned int idx)
754 {
755 struct fbnic_act_tcam *act_tcam = &fbd->act_tcam[idx];
756 int i;
757
758 /* Update entry by writing the destination and RSS mask */
759 wr32(fbd, FBNIC_RPC_ACT_TBL0(idx), act_tcam->dest);
760 wr32(fbd, FBNIC_RPC_ACT_TBL1(idx), act_tcam->rss_en_mask);
761
762 /* Write new TCAM rule to hardware */
763 for (i = 0; i < FBNIC_RPC_TCAM_ACT_WORD_LEN; i++)
764 wr32(fbd, FBNIC_RPC_TCAM_ACT(idx, i),
765 FIELD_PREP(FBNIC_RPC_TCAM_ACT_MASK,
766 act_tcam->mask.tcam[i]) |
767 FIELD_PREP(FBNIC_RPC_TCAM_ACT_VALUE,
768 act_tcam->value.tcam[i]));
769
770 wrfl(fbd);
771
772 wr32(fbd, FBNIC_RPC_TCAM_ACT(idx, i), FBNIC_RPC_TCAM_VALIDATE);
773 act_tcam->state = FBNIC_TCAM_S_VALID;
774 }
775
fbnic_write_rules(struct fbnic_dev * fbd)776 void fbnic_write_rules(struct fbnic_dev *fbd)
777 {
778 int i;
779
780 /* Flush any pending action table rules */
781 for (i = 0; i < FBNIC_RPC_ACT_TBL_NUM_ENTRIES; i++) {
782 struct fbnic_act_tcam *act_tcam = &fbd->act_tcam[i];
783
784 /* Check if update flag is set else exit. */
785 if (!(act_tcam->state & FBNIC_TCAM_S_UPDATE))
786 continue;
787
788 if (act_tcam->state == FBNIC_TCAM_S_DELETE)
789 fbnic_delete_act_tcam(fbd, i);
790 else
791 fbnic_update_act_tcam(fbd, i);
792 }
793 }
794