190 lines · c
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 213 * Add 2 -> Valid 114 *15 * Valid 1 -> Add/Update 216 * Add 2 -> Valid 117 *18 * Valid 1 -> Delete 319 * Delete 3 -> Disabled 020 */21enum {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 Entries30 * 4 registers DA[1:0], DA[3:2], DA[5:4], Validate31 */32#define FBNIC_RPC_TCAM_MACDA_WORD_LEN 333#define FBNIC_RPC_TCAM_MACDA_NUM_ENTRIES 3234 35#define FBNIC_RPC_TCAM_ACT_WORD_LEN 1136#define FBNIC_RPC_TCAM_ACT_NUM_ENTRIES 6437 38struct fbnic_mac_addr {39 union {40 unsigned char addr8[ETH_ALEN];41 __be16 addr16[FBNIC_RPC_TCAM_MACDA_WORD_LEN];42 } mask, value;43 unsigned char state;44 DECLARE_BITMAP(act_tcam, FBNIC_RPC_TCAM_ACT_NUM_ENTRIES);45};46 47struct fbnic_act_tcam {48 struct {49 u16 tcam[FBNIC_RPC_TCAM_ACT_WORD_LEN];50 } mask, value;51 unsigned char state;52 u16 rss_en_mask;53 u32 dest;54};55 56enum {57 FBNIC_RSS_EN_HOST_UDP6,58 FBNIC_RSS_EN_HOST_UDP4,59 FBNIC_RSS_EN_HOST_TCP6,60 FBNIC_RSS_EN_HOST_TCP4,61 FBNIC_RSS_EN_HOST_IP6,62 FBNIC_RSS_EN_HOST_IP4,63 FBNIC_RSS_EN_HOST_ETHER,64 FBNIC_RSS_EN_XCAST_UDP6,65#define FBNIC_RSS_EN_NUM_UNICAST FBNIC_RSS_EN_XCAST_UDP666 FBNIC_RSS_EN_XCAST_UDP4,67 FBNIC_RSS_EN_XCAST_TCP6,68 FBNIC_RSS_EN_XCAST_TCP4,69 FBNIC_RSS_EN_XCAST_IP6,70 FBNIC_RSS_EN_XCAST_IP4,71 FBNIC_RSS_EN_XCAST_ETHER,72 FBNIC_RSS_EN_NUM_ENTRIES73};74 75/* Reserve the first 2 entries for the use by the BMC so that we can76 * avoid allowing rules to get in the way of BMC unicast traffic.77 */78#define FBNIC_RPC_ACT_TBL_BMC_OFFSET 079#define FBNIC_RPC_ACT_TBL_BMC_ALL_MULTI_OFFSET 180 81/* We reserve the last 14 entries for RSS rules on the host. The BMC82 * unicast rule will need to be populated above these and is expected to83 * use MACDA TCAM entry 23 to store the BMC MAC address.84 */85#define FBNIC_RPC_ACT_TBL_RSS_OFFSET \86 (FBNIC_RPC_ACT_TBL_NUM_ENTRIES - FBNIC_RSS_EN_NUM_ENTRIES)87 88/* Flags used to identify the owner for this MAC filter. Note that any89 * flags set for Broadcast thru Promisc indicate that the rule belongs90 * to the RSS filters for the host.91 */92enum {93 FBNIC_MAC_ADDR_T_BMC = 0,94 FBNIC_MAC_ADDR_T_BROADCAST = FBNIC_RPC_ACT_TBL_RSS_OFFSET,95#define FBNIC_MAC_ADDR_T_HOST_START FBNIC_MAC_ADDR_T_BROADCAST96 FBNIC_MAC_ADDR_T_MULTICAST,97 FBNIC_MAC_ADDR_T_UNICAST,98 FBNIC_MAC_ADDR_T_ALLMULTI, /* BROADCAST ... MULTICAST*/99 FBNIC_MAC_ADDR_T_PROMISC, /* BROADCAST ... UNICAST */100 FBNIC_MAC_ADDR_T_HOST_LAST101};102 103#define FBNIC_MAC_ADDR_T_HOST_LEN \104 (FBNIC_MAC_ADDR_T_HOST_LAST - FBNIC_MAC_ADDR_T_HOST_START)105 106#define FBNIC_RPC_TCAM_ACT0_IPSRC_IDX CSR_GENMASK(2, 0)107#define FBNIC_RPC_TCAM_ACT0_IPSRC_VALID CSR_BIT(3)108#define FBNIC_RPC_TCAM_ACT0_IPDST_IDX CSR_GENMASK(6, 4)109#define FBNIC_RPC_TCAM_ACT0_IPDST_VALID CSR_BIT(7)110#define FBNIC_RPC_TCAM_ACT0_OUTER_IPSRC_IDX CSR_GENMASK(10, 8)111#define FBNIC_RPC_TCAM_ACT0_OUTER_IPSRC_VALID CSR_BIT(11)112#define FBNIC_RPC_TCAM_ACT0_OUTER_IPDST_IDX CSR_GENMASK(14, 12)113#define FBNIC_RPC_TCAM_ACT0_OUTER_IPDST_VALID CSR_BIT(15)114 115#define FBNIC_RPC_TCAM_ACT1_L2_MACDA_IDX CSR_GENMASK(9, 5)116#define FBNIC_RPC_TCAM_ACT1_L2_MACDA_VALID CSR_BIT(10)117#define FBNIC_RPC_TCAM_ACT1_IP_IS_V6 CSR_BIT(11)118#define FBNIC_RPC_TCAM_ACT1_IP_VALID CSR_BIT(12)119#define FBNIC_RPC_TCAM_ACT1_OUTER_IP_VALID CSR_BIT(13)120#define FBNIC_RPC_TCAM_ACT1_L4_IS_UDP CSR_BIT(14)121#define FBNIC_RPC_TCAM_ACT1_L4_VALID CSR_BIT(15)122 123/* TCAM 0 - 3 reserved for BMC MAC addresses */124#define FBNIC_RPC_TCAM_MACDA_BMC_ADDR_IDX 0125/* TCAM 4 reserved for broadcast MAC address */126#define FBNIC_RPC_TCAM_MACDA_BROADCAST_IDX 4127/* TCAMs 5 - 30 will be used for multicast and unicast addresses. The128 * boundary between the two can be variable it is currently set to 24129 * on which the unicast addresses start. The general idea is that we will130 * always go top-down with unicast, and bottom-up with multicast so that131 * there should be free-space in the middle between the two.132 *133 * The entry at MADCA_DEFAULT_BOUNDARY is a special case as it can be used134 * for the ALL MULTI address if the list is full, or the BMC has requested135 * it.136 */137#define FBNIC_RPC_TCAM_MACDA_MULTICAST_IDX 5138#define FBNIC_RPC_TCAM_MACDA_DEFAULT_BOUNDARY 24139#define FBNIC_RPC_TCAM_MACDA_HOST_ADDR_IDX 30140/* Reserved for use to record Multicast promisc, or Promiscuous */141#define FBNIC_RPC_TCAM_MACDA_PROMISC_IDX 31142 143enum {144 FBNIC_UDP6_HASH_OPT,145 FBNIC_UDP4_HASH_OPT,146 FBNIC_TCP6_HASH_OPT,147 FBNIC_TCP4_HASH_OPT,148#define FBNIC_L4_HASH_OPT FBNIC_TCP4_HASH_OPT149 FBNIC_IPV6_HASH_OPT,150 FBNIC_IPV4_HASH_OPT,151#define FBNIC_IP_HASH_OPT FBNIC_IPV4_HASH_OPT152 FBNIC_ETHER_HASH_OPT,153 FBNIC_NUM_HASH_OPT,154};155 156struct fbnic_dev;157struct fbnic_net;158 159void fbnic_bmc_rpc_init(struct fbnic_dev *fbd);160void fbnic_bmc_rpc_all_multi_config(struct fbnic_dev *fbd, bool enable_host);161 162void fbnic_reset_indir_tbl(struct fbnic_net *fbn);163void fbnic_rss_key_fill(u32 *buffer);164void fbnic_rss_init_en_mask(struct fbnic_net *fbn);165void fbnic_rss_disable_hw(struct fbnic_dev *fbd);166void fbnic_rss_reinit_hw(struct fbnic_dev *fbd, struct fbnic_net *fbn);167void fbnic_rss_reinit(struct fbnic_dev *fbd, struct fbnic_net *fbn);168 169int __fbnic_xc_unsync(struct fbnic_mac_addr *mac_addr, unsigned int tcam_idx);170struct fbnic_mac_addr *__fbnic_uc_sync(struct fbnic_dev *fbd,171 const unsigned char *addr);172struct fbnic_mac_addr *__fbnic_mc_sync(struct fbnic_dev *fbd,173 const unsigned char *addr);174void fbnic_sift_macda(struct fbnic_dev *fbd);175void fbnic_write_macda(struct fbnic_dev *fbd);176 177static inline int __fbnic_uc_unsync(struct fbnic_mac_addr *mac_addr)178{179 return __fbnic_xc_unsync(mac_addr, FBNIC_MAC_ADDR_T_UNICAST);180}181 182static inline int __fbnic_mc_unsync(struct fbnic_mac_addr *mac_addr)183{184 return __fbnic_xc_unsync(mac_addr, FBNIC_MAC_ADDR_T_MULTICAST);185}186 187void fbnic_clear_rules(struct fbnic_dev *fbd);188void fbnic_write_rules(struct fbnic_dev *fbd);189#endif /* _FBNIC_RPC_H_ */190