Lines Matching +full:tcam +full:- +full:based

1 // SPDX-License-Identifier: GPL-2.0
13 unsigned int num_rx = fbn->num_rx_queues; in fbnic_reset_indir_tbl()
16 if (netif_is_rxfh_configured(fbn->netdev)) in fbnic_reset_indir_tbl()
20 fbn->indir_tbl[0][i] = ethtool_rxfh_indir_default(i, num_rx); in fbnic_reset_indir_tbl()
41 fbn->rss_flow_hash[FBNIC_TCP4_HASH_OPT] = RX_HASH_OPT_L4; in fbnic_rss_init_en_mask()
42 fbn->rss_flow_hash[FBNIC_TCP6_HASH_OPT] = RX_HASH_OPT_L4; in fbnic_rss_init_en_mask()
44 fbn->rss_flow_hash[FBNIC_UDP4_HASH_OPT] = RX_HASH_OPT_L3; in fbnic_rss_init_en_mask()
45 fbn->rss_flow_hash[FBNIC_UDP6_HASH_OPT] = RX_HASH_OPT_L3; in fbnic_rss_init_en_mask()
46 fbn->rss_flow_hash[FBNIC_IPV4_HASH_OPT] = RX_HASH_OPT_L3; in fbnic_rss_init_en_mask()
47 fbn->rss_flow_hash[FBNIC_IPV6_HASH_OPT] = RX_HASH_OPT_L3; in fbnic_rss_init_en_mask()
49 fbn->rss_flow_hash[FBNIC_ETHER_HASH_OPT] = RX_HASH_OPT_L2; in fbnic_rss_init_en_mask()
65 u32 flow_hash = fbn->rss_flow_hash[flow_type]; in fbnic_flow_hash_2_rss_en_mask()
82 wr32(fbd, FBNIC_RPC_RSS_TBL(0, i), fbn->indir_tbl[0][i]); in fbnic_rss_reinit_hw()
83 wr32(fbd, FBNIC_RPC_RSS_TBL(1, i), fbn->indir_tbl[1][i]); in fbnic_rss_reinit_hw()
87 wr32(fbd, FBNIC_RPC_RSS_KEY(i), fbn->rss_key[i]); in fbnic_rss_reinit_hw()
115 mac_addr = &fbd->mac_addr[fbd->mac_addr_boundary - 1]; in fbnic_bmc_rpc_all_multi_config()
116 if (fbnic_bmc_present(fbd) && fbd->fw_cap.all_multi) { in fbnic_bmc_rpc_all_multi_config()
117 if (mac_addr->state != FBNIC_TCAM_S_VALID) { in fbnic_bmc_rpc_all_multi_config()
118 eth_zero_addr(mac_addr->value.addr8); in fbnic_bmc_rpc_all_multi_config()
119 eth_broadcast_addr(mac_addr->mask.addr8); in fbnic_bmc_rpc_all_multi_config()
120 mac_addr->value.addr8[0] ^= 1; in fbnic_bmc_rpc_all_multi_config()
121 mac_addr->mask.addr8[0] ^= 1; in fbnic_bmc_rpc_all_multi_config()
122 set_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam); in fbnic_bmc_rpc_all_multi_config()
123 mac_addr->state = FBNIC_TCAM_S_ADD; in fbnic_bmc_rpc_all_multi_config()
127 mac_addr->act_tcam); in fbnic_bmc_rpc_all_multi_config()
130 mac_addr->act_tcam); in fbnic_bmc_rpc_all_multi_config()
131 } else if (!test_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam) && in fbnic_bmc_rpc_all_multi_config()
132 !is_zero_ether_addr(mac_addr->mask.addr8) && in fbnic_bmc_rpc_all_multi_config()
133 mac_addr->state == FBNIC_TCAM_S_VALID) { in fbnic_bmc_rpc_all_multi_config()
134 clear_bit(FBNIC_MAC_ADDR_T_ALLMULTI, mac_addr->act_tcam); in fbnic_bmc_rpc_all_multi_config()
135 clear_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam); in fbnic_bmc_rpc_all_multi_config()
136 mac_addr->state = FBNIC_TCAM_S_DELETE; in fbnic_bmc_rpc_all_multi_config()
140 * BMC may have an all-multi rule already in place. As such in fbnic_bmc_rpc_all_multi_config()
145 act_tcam = &fbd->act_tcam[FBNIC_RPC_ACT_TBL_BMC_ALL_MULTI_OFFSET]; in fbnic_bmc_rpc_all_multi_config()
150 if (!fbnic_bmc_present(fbd) || !fbd->fw_cap.all_multi || enable_host) { in fbnic_bmc_rpc_all_multi_config()
151 if (act_tcam->state == FBNIC_TCAM_S_VALID) in fbnic_bmc_rpc_all_multi_config()
152 act_tcam->state = FBNIC_TCAM_S_DELETE; in fbnic_bmc_rpc_all_multi_config()
156 /* Rewrite TCAM rule 23 to handle BMC all-multi traffic */ in fbnic_bmc_rpc_all_multi_config()
157 act_tcam->dest = FIELD_PREP(FBNIC_RPC_ACT_TBL0_DEST_MASK, in fbnic_bmc_rpc_all_multi_config()
159 act_tcam->mask.tcam[0] = 0xffff; in fbnic_bmc_rpc_all_multi_config()
161 /* MACDA 0 - 3 is reserved for the BMC MAC address */ in fbnic_bmc_rpc_all_multi_config()
162 act_tcam->value.tcam[1] = in fbnic_bmc_rpc_all_multi_config()
164 fbd->mac_addr_boundary - 1) | in fbnic_bmc_rpc_all_multi_config()
166 act_tcam->mask.tcam[1] = 0xffff & in fbnic_bmc_rpc_all_multi_config()
171 act_tcam->mask.tcam[j] = 0xffff; in fbnic_bmc_rpc_all_multi_config()
173 act_tcam->state = FBNIC_TCAM_S_UPDATE; in fbnic_bmc_rpc_all_multi_config()
189 u8 *bmc_mac = fbd->fw_cap.bmc_mac_addr[j]; in fbnic_bmc_rpc_init()
198 mac_addr = &fbd->mac_addr[i++]; in fbnic_bmc_rpc_init()
201 netdev_err(fbd->netdev, in fbnic_bmc_rpc_init()
206 ether_addr_copy(mac_addr->value.addr8, bmc_mac); in fbnic_bmc_rpc_init()
207 eth_zero_addr(mac_addr->mask.addr8); in fbnic_bmc_rpc_init()
209 set_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam); in fbnic_bmc_rpc_init()
210 mac_addr->state = FBNIC_TCAM_S_ADD; in fbnic_bmc_rpc_init()
214 mac_addr = &fbd->mac_addr[FBNIC_RPC_TCAM_MACDA_BROADCAST_IDX]; in fbnic_bmc_rpc_init()
215 eth_broadcast_addr(mac_addr->value.addr8); in fbnic_bmc_rpc_init()
216 set_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam); in fbnic_bmc_rpc_init()
217 mac_addr->state = FBNIC_TCAM_S_ADD; in fbnic_bmc_rpc_init()
219 /* Rewrite TCAM rule 0 if it isn't present to relocate BMC rules */ in fbnic_bmc_rpc_init()
220 act_tcam = &fbd->act_tcam[FBNIC_RPC_ACT_TBL_BMC_OFFSET]; in fbnic_bmc_rpc_init()
221 act_tcam->dest = FIELD_PREP(FBNIC_RPC_ACT_TBL0_DEST_MASK, in fbnic_bmc_rpc_init()
223 act_tcam->mask.tcam[0] = 0xffff; in fbnic_bmc_rpc_init()
225 /* MACDA 0 - 3 is reserved for the BMC MAC address in fbnic_bmc_rpc_init()
229 act_tcam->value.tcam[1] = FBNIC_RPC_TCAM_ACT1_L2_MACDA_VALID; in fbnic_bmc_rpc_init()
230 act_tcam->mask.tcam[1] = 0xffff & in fbnic_bmc_rpc_init()
235 act_tcam->mask.tcam[j] = 0xffff; in fbnic_bmc_rpc_init()
237 act_tcam->state = FBNIC_TCAM_S_UPDATE; in fbnic_bmc_rpc_init()
249 (((_all) ? ((1u << FBNIC_NUM_HASH_OPT) - 1) : 0) | \
276 if (fbn->hwtstamp_config.rx_filter != HWTSTAMP_FILTER_NONE) { in fbnic_rss_reinit()
277 switch (fbn->hwtstamp_config.rx_filter) { in fbnic_rss_reinit()
292 netdev_warn(fbn->netdev, "Unsupported hwtstamp_rx_filter\n"); in fbnic_rss_reinit()
297 /* Program RSS hash enable mask for host in action TCAM/table. */ in fbnic_rss_reinit()
301 struct fbnic_act_tcam *act_tcam = &fbd->act_tcam[idx]; in fbnic_rss_reinit()
307 flow_hash = fbn->rss_flow_hash[flow_type]; in fbnic_rss_reinit()
309 /* Set DEST_HOST based on absence of RXH_DISCARD */ in fbnic_rss_reinit()
329 act_tcam->dest = dest; in fbnic_rss_reinit()
330 act_tcam->rss_en_mask = rss_en_mask; in fbnic_rss_reinit()
331 act_tcam->state = FBNIC_TCAM_S_UPDATE; in fbnic_rss_reinit()
333 act_tcam->mask.tcam[0] = 0xffff; in fbnic_rss_reinit()
335 /* We reserve the upper 8 MACDA TCAM entries for host in fbnic_rss_reinit()
342 fbd->mac_addr_boundary); in fbnic_rss_reinit()
348 act_tcam->value.tcam[1] = value; in fbnic_rss_reinit()
349 act_tcam->mask.tcam[1] = ~value; in fbnic_rss_reinit()
352 act_tcam->mask.tcam[j] = 0xffff; in fbnic_rss_reinit()
354 act_tcam->state = FBNIC_TCAM_S_UPDATE; in fbnic_rss_reinit()
368 for (i = fbd->mac_addr_boundary - 1; in __fbnic_uc_sync()
370 struct fbnic_mac_addr *mac_addr = &fbd->mac_addr[i]; in __fbnic_uc_sync()
372 if (mac_addr->state == FBNIC_TCAM_S_DISABLED) { in __fbnic_uc_sync()
374 } else if (ether_addr_equal(mac_addr->value.addr8, addr)) { in __fbnic_uc_sync()
380 if (avail_addr && avail_addr->state == FBNIC_TCAM_S_DISABLED) { in __fbnic_uc_sync()
381 ether_addr_copy(avail_addr->value.addr8, addr); in __fbnic_uc_sync()
382 eth_zero_addr(avail_addr->mask.addr8); in __fbnic_uc_sync()
383 avail_addr->state = FBNIC_TCAM_S_ADD; in __fbnic_uc_sync()
399 for (i = fbd->mac_addr_boundary; in __fbnic_mc_sync()
400 --i > FBNIC_RPC_TCAM_MACDA_BROADCAST_IDX;) { in __fbnic_mc_sync()
401 struct fbnic_mac_addr *mac_addr = &fbd->mac_addr[i]; in __fbnic_mc_sync()
403 if (mac_addr->state == FBNIC_TCAM_S_DISABLED) { in __fbnic_mc_sync()
405 } else if (ether_addr_equal(mac_addr->value.addr8, addr)) { in __fbnic_mc_sync()
414 while (--i) { in __fbnic_mc_sync()
415 struct fbnic_mac_addr *mac_addr = &fbd->mac_addr[i]; in __fbnic_mc_sync()
417 if (!is_zero_ether_addr(mac_addr->mask.addr8)) in __fbnic_mc_sync()
421 if (!ether_addr_equal(mac_addr->value.addr8, addr)) in __fbnic_mc_sync()
427 mac_addr->state = FBNIC_TCAM_S_DELETE; in __fbnic_mc_sync()
428 avail_addr->state = FBNIC_TCAM_S_ADD; in __fbnic_mc_sync()
434 if (avail_addr && avail_addr->state == FBNIC_TCAM_S_DISABLED) { in __fbnic_mc_sync()
435 ether_addr_copy(avail_addr->value.addr8, addr); in __fbnic_mc_sync()
436 eth_zero_addr(avail_addr->mask.addr8); in __fbnic_mc_sync()
437 avail_addr->state = FBNIC_TCAM_S_ADD; in __fbnic_mc_sync()
445 if (!test_and_clear_bit(tcam_idx, mac_addr->act_tcam)) in __fbnic_xc_unsync()
446 return -ENOENT; in __fbnic_xc_unsync()
448 if (bitmap_empty(mac_addr->act_tcam, FBNIC_RPC_TCAM_ACT_NUM_ENTRIES)) in __fbnic_xc_unsync()
449 mac_addr->state = FBNIC_TCAM_S_DELETE; in __fbnic_xc_unsync()
462 src < fbd->mac_addr_boundary;) { in fbnic_sift_macda()
463 struct fbnic_mac_addr *dest_addr = &fbd->mac_addr[dest]; in fbnic_sift_macda()
465 if (dest_addr->state != FBNIC_TCAM_S_DISABLED) in fbnic_sift_macda()
468 while (src < fbd->mac_addr_boundary) { in fbnic_sift_macda()
469 struct fbnic_mac_addr *src_addr = &fbd->mac_addr[src++]; in fbnic_sift_macda()
472 if (!test_bit(FBNIC_MAC_ADDR_T_BMC, src_addr->act_tcam)) in fbnic_sift_macda()
476 if (src_addr->state == FBNIC_TCAM_S_DISABLED || in fbnic_sift_macda()
477 src_addr->state == FBNIC_TCAM_S_DELETE) in fbnic_sift_macda()
481 if (bitmap_weight(src_addr->act_tcam, in fbnic_sift_macda()
486 if (!is_zero_ether_addr(src_addr->mask.addr8)) in fbnic_sift_macda()
490 src_addr->state = FBNIC_TCAM_S_DELETE; in fbnic_sift_macda()
491 dest_addr->state = FBNIC_TCAM_S_ADD; in fbnic_sift_macda()
509 for (idx = ARRAY_SIZE(fbd->mac_addr); idx--;) { in fbnic_clear_macda()
510 struct fbnic_mac_addr *mac_addr = &fbd->mac_addr[idx]; in fbnic_clear_macda()
512 if (mac_addr->state == FBNIC_TCAM_S_DISABLED) in fbnic_clear_macda()
515 if (test_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam)) { in fbnic_clear_macda()
518 dev_warn_once(fbd->dev, in fbnic_clear_macda()
525 if (mac_addr->state == FBNIC_TCAM_S_DELETE) { in fbnic_clear_macda()
531 * this tcam the next time fbnic_write_macda is called. in fbnic_clear_macda()
533 mac_addr->state = FBNIC_TCAM_S_UPDATE; in fbnic_clear_macda()
543 mask = &mac_addr->mask.addr16[FBNIC_RPC_TCAM_MACDA_WORD_LEN - 1]; in fbnic_write_macda_entry()
544 value = &mac_addr->value.addr16[FBNIC_RPC_TCAM_MACDA_WORD_LEN - 1]; in fbnic_write_macda_entry()
548 FIELD_PREP(FBNIC_RPC_TCAM_MACDA_MASK, ntohs(*mask--)) | in fbnic_write_macda_entry()
549 FIELD_PREP(FBNIC_RPC_TCAM_MACDA_VALUE, ntohs(*value--))); in fbnic_write_macda_entry()
560 for (idx = ARRAY_SIZE(fbd->mac_addr); idx--;) { in fbnic_write_macda()
561 struct fbnic_mac_addr *mac_addr = &fbd->mac_addr[idx]; in fbnic_write_macda()
564 if (!(mac_addr->state & FBNIC_TCAM_S_UPDATE)) in fbnic_write_macda()
568 if (mac_addr->state == FBNIC_TCAM_S_DELETE) { in fbnic_write_macda()
578 mac_addr->state = FBNIC_TCAM_S_VALID; in fbnic_write_macda()
606 if (is_multicast_ether_addr(mac_addr->value.addr8)) in fbnic_write_tce_tcam_dest()
622 mask = &mac_addr->mask.addr16[FBNIC_TCE_TCAM_WORD_LEN - 1]; in fbnic_write_tce_tcam_entry()
623 value = &mac_addr->value.addr16[FBNIC_TCE_TCAM_WORD_LEN - 1]; in fbnic_write_tce_tcam_entry()
627 FIELD_PREP(FBNIC_TCE_RAM_TCAM_MASK, ntohs(*mask--)) | in fbnic_write_tce_tcam_entry()
628 FIELD_PREP(FBNIC_TCE_RAM_TCAM_VALUE, ntohs(*value--))); in fbnic_write_tce_tcam_entry()
642 for (mac_idx = ARRAY_SIZE(fbd->mac_addr); mac_idx--;) { in __fbnic_write_tce_tcam_rev()
643 struct fbnic_mac_addr *mac_addr = &fbd->mac_addr[mac_idx]; in __fbnic_write_tce_tcam_rev()
646 if (!test_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam)) in __fbnic_write_tce_tcam_rev()
650 dev_err(fbd->dev, "TCE TCAM overflow\n"); in __fbnic_write_tce_tcam_rev()
654 tcam_idx--; in __fbnic_write_tce_tcam_rev()
660 fbnic_clear_tce_tcam_entry(fbd, --tcam_idx); in __fbnic_write_tce_tcam_rev()
662 fbd->tce_tcam_last = tcam_idx; in __fbnic_write_tce_tcam_rev()
670 for (mac_idx = 0; mac_idx < ARRAY_SIZE(fbd->mac_addr); mac_idx++) { in __fbnic_write_tce_tcam()
671 struct fbnic_mac_addr *mac_addr = &fbd->mac_addr[mac_idx]; in __fbnic_write_tce_tcam()
674 if (!test_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam)) in __fbnic_write_tce_tcam()
678 dev_err(fbd->dev, "TCE TCAM overflow\n"); in __fbnic_write_tce_tcam()
690 fbd->tce_tcam_last = tcam_idx; in __fbnic_write_tce_tcam()
695 if (fbd->tce_tcam_last) in fbnic_write_tce_tcam()
705 int i = FBNIC_RPC_TCAM_ACT_NUM_ENTRIES - 1; in fbnic_clear_rules()
722 act_tcam = &fbd->act_tcam[i]; in fbnic_clear_rules()
724 if (act_tcam->state == FBNIC_TCAM_S_VALID && in fbnic_clear_rules()
725 (act_tcam->dest & dest)) { in fbnic_clear_rules()
729 act_tcam->state = FBNIC_TCAM_S_UPDATE; in fbnic_clear_rules()
731 i--; in fbnic_clear_rules()
737 act_tcam = &fbd->act_tcam[i]; in fbnic_clear_rules()
739 if (act_tcam->state != FBNIC_TCAM_S_VALID) in fbnic_clear_rules()
743 act_tcam->state = FBNIC_TCAM_S_UPDATE; in fbnic_clear_rules()
744 } while (i--); in fbnic_clear_rules()
750 memset(&fbd->act_tcam[idx], 0, sizeof(struct fbnic_act_tcam)); in fbnic_delete_act_tcam()
755 struct fbnic_act_tcam *act_tcam = &fbd->act_tcam[idx]; in fbnic_update_act_tcam()
759 wr32(fbd, FBNIC_RPC_ACT_TBL0(idx), act_tcam->dest); in fbnic_update_act_tcam()
760 wr32(fbd, FBNIC_RPC_ACT_TBL1(idx), act_tcam->rss_en_mask); in fbnic_update_act_tcam()
762 /* Write new TCAM rule to hardware */ in fbnic_update_act_tcam()
766 act_tcam->mask.tcam[i]) | in fbnic_update_act_tcam()
768 act_tcam->value.tcam[i])); in fbnic_update_act_tcam()
773 act_tcam->state = FBNIC_TCAM_S_VALID; in fbnic_update_act_tcam()
782 struct fbnic_act_tcam *act_tcam = &fbd->act_tcam[i]; in fbnic_write_rules()
785 if (!(act_tcam->state & FBNIC_TCAM_S_UPDATE)) in fbnic_write_rules()
788 if (act_tcam->state == FBNIC_TCAM_S_DELETE) in fbnic_write_rules()