xref: /linux/drivers/net/ethernet/meta/fbnic/fbnic_rpc.h (revision 7f71507851fc7764b36a3221839607d3a45c2025)
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	      2
13  *  Add	      2	-> Valid      1
14  *
15  *  Valid     1	-> Add/Update 2
16  *  Add	      2	-> Valid      1
17  *
18  *  Valid     1	-> Delete     3
19  *  Delete    3	-> Disabled   0
20  */
21 enum {
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 Entries
30  * 4 registers DA[1:0], DA[3:2], DA[5:4], Validate
31  */
32 #define FBNIC_RPC_TCAM_MACDA_WORD_LEN		3
33 #define FBNIC_RPC_TCAM_MACDA_NUM_ENTRIES	32
34 
35 #define FBNIC_RPC_TCAM_ACT_WORD_LEN		11
36 #define FBNIC_RPC_TCAM_ACT_NUM_ENTRIES		64
37 
38 #define FBNIC_TCE_TCAM_WORD_LEN			3
39 #define FBNIC_TCE_TCAM_NUM_ENTRIES		8
40 
41 struct fbnic_mac_addr {
42 	union {
43 		unsigned char addr8[ETH_ALEN];
44 		__be16 addr16[FBNIC_RPC_TCAM_MACDA_WORD_LEN];
45 	} mask, value;
46 	unsigned char state;
47 	DECLARE_BITMAP(act_tcam, FBNIC_RPC_TCAM_ACT_NUM_ENTRIES);
48 };
49 
50 struct fbnic_act_tcam {
51 	struct {
52 		u16 tcam[FBNIC_RPC_TCAM_ACT_WORD_LEN];
53 	} mask, value;
54 	unsigned char state;
55 	u16 rss_en_mask;
56 	u32 dest;
57 };
58 
59 enum {
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
76 };
77 
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.
80  */
81 #define FBNIC_RPC_ACT_TBL_BMC_OFFSET		0
82 #define FBNIC_RPC_ACT_TBL_BMC_ALL_MULTI_OFFSET	1
83 
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.
87  */
88 #define FBNIC_RPC_ACT_TBL_RSS_OFFSET \
89 	(FBNIC_RPC_ACT_TBL_NUM_ENTRIES - FBNIC_RSS_EN_NUM_ENTRIES)
90 
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.
94  */
95 enum {
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
104 };
105 
106 #define FBNIC_MAC_ADDR_T_HOST_LEN \
107 	(FBNIC_MAC_ADDR_T_HOST_LAST - FBNIC_MAC_ADDR_T_HOST_START)
108 
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)
117 
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)
125 
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.
135  *
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
138  * it.
139  */
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
145 
146 enum {
147 	FBNIC_UDP6_HASH_OPT,
148 	FBNIC_UDP4_HASH_OPT,
149 	FBNIC_TCP6_HASH_OPT,
150 	FBNIC_TCP4_HASH_OPT,
151 #define FBNIC_L4_HASH_OPT FBNIC_TCP4_HASH_OPT
152 	FBNIC_IPV6_HASH_OPT,
153 	FBNIC_IPV4_HASH_OPT,
154 #define FBNIC_IP_HASH_OPT FBNIC_IPV4_HASH_OPT
155 	FBNIC_ETHER_HASH_OPT,
156 	FBNIC_NUM_HASH_OPT,
157 };
158 
159 struct fbnic_dev;
160 struct fbnic_net;
161 
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);
164 
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);
171 
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);
179 
180 static inline int __fbnic_uc_unsync(struct fbnic_mac_addr *mac_addr)
181 {
182 	return __fbnic_xc_unsync(mac_addr, FBNIC_MAC_ADDR_T_UNICAST);
183 }
184 
185 static inline int __fbnic_mc_unsync(struct fbnic_mac_addr *mac_addr)
186 {
187 	return __fbnic_xc_unsync(mac_addr, FBNIC_MAC_ADDR_T_MULTICAST);
188 }
189 
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_ */
194