1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (c) Meta Platforms, Inc. and affiliates. */
7 #include <uapi/linux/in6.h>
8 #include <linux/bitfield.h>
10 /* The TCAM state definitions follow an expected ordering.
11 * They start out disabled, then move through the following states:
15 * Valid 1 -> Add/Update 2
19 * Delete 3 -> Disabled 0
22 FBNIC_TCAM_S_DISABLED
= 0,
23 FBNIC_TCAM_S_VALID
= 1,
25 FBNIC_TCAM_S_UPDATE
= FBNIC_TCAM_S_ADD
,
26 FBNIC_TCAM_S_DELETE
= 3,
29 /* 32 MAC Destination Address TCAM Entries
30 * 4 registers DA[1:0], DA[3:2], DA[5:4], Validate
32 #define FBNIC_RPC_TCAM_MACDA_WORD_LEN 3
33 #define FBNIC_RPC_TCAM_MACDA_NUM_ENTRIES 32
35 #define FBNIC_RPC_TCAM_ACT_WORD_LEN 11
36 #define FBNIC_RPC_TCAM_ACT_NUM_ENTRIES 64
38 #define FBNIC_TCE_TCAM_WORD_LEN 3
39 #define FBNIC_TCE_TCAM_NUM_ENTRIES 8
41 struct fbnic_mac_addr
{
43 unsigned char addr8
[ETH_ALEN
];
44 __be16 addr16
[FBNIC_RPC_TCAM_MACDA_WORD_LEN
];
47 DECLARE_BITMAP(act_tcam
, FBNIC_RPC_TCAM_ACT_NUM_ENTRIES
);
50 struct fbnic_act_tcam
{
52 u16 tcam
[FBNIC_RPC_TCAM_ACT_WORD_LEN
];
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
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.
81 #define FBNIC_RPC_ACT_TBL_BMC_OFFSET 0
82 #define FBNIC_RPC_ACT_TBL_BMC_ALL_MULTI_OFFSET 1
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.
88 #define FBNIC_RPC_ACT_TBL_RSS_OFFSET \
89 (FBNIC_RPC_ACT_TBL_NUM_ENTRIES - FBNIC_RSS_EN_NUM_ENTRIES)
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.
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
106 #define FBNIC_MAC_ADDR_T_HOST_LEN \
107 (FBNIC_MAC_ADDR_T_HOST_LAST - FBNIC_MAC_ADDR_T_HOST_START)
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)
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)
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.
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
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
151 #define FBNIC_L4_HASH_OPT FBNIC_TCP4_HASH_OPT
154 #define FBNIC_IP_HASH_OPT FBNIC_IPV4_HASH_OPT
155 FBNIC_ETHER_HASH_OPT
,
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
);
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
);
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
);
180 static inline int __fbnic_uc_unsync(struct fbnic_mac_addr
*mac_addr
)
182 return __fbnic_xc_unsync(mac_addr
, FBNIC_MAC_ADDR_T_UNICAST
);
185 static inline int __fbnic_mc_unsync(struct fbnic_mac_addr
*mac_addr
)
187 return __fbnic_xc_unsync(mac_addr
, FBNIC_MAC_ADDR_T_MULTICAST
);
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_ */