xref: /f-stack/dpdk/drivers/net/octeontx2/otx2_flow.h (revision 2d9fd380)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2019 Marvell International Ltd.
3  */
4 
5 #ifndef __OTX2_FLOW_H__
6 #define __OTX2_FLOW_H__
7 
8 #include <stdint.h>
9 
10 #include <rte_flow_driver.h>
11 #include <rte_malloc.h>
12 #include <rte_tailq.h>
13 
14 #include "otx2_common.h"
15 #include "otx2_ethdev.h"
16 #include "otx2_mbox.h"
17 
18 struct otx2_eth_dev;
19 
20 int otx2_flow_init(struct otx2_eth_dev *hw);
21 int otx2_flow_fini(struct otx2_eth_dev *hw);
22 extern const struct rte_flow_ops otx2_flow_ops;
23 
24 enum {
25 	OTX2_INTF_RX = 0,
26 	OTX2_INTF_TX = 1,
27 	OTX2_INTF_MAX = 2,
28 };
29 
30 #define NPC_IH_LENGTH			8
31 #define NPC_TPID_LENGTH			2
32 #define NPC_HIGIG2_LENGTH		16
33 #define NPC_COUNTER_NONE		(-1)
34 /* 32 bytes from LDATA_CFG & 32 bytes from FLAGS_CFG */
35 #define NPC_MAX_EXTRACT_DATA_LEN	(64)
36 #define NPC_LDATA_LFLAG_LEN		(16)
37 #define NPC_MCAM_TOT_ENTRIES		(4096)
38 #define NPC_MAX_KEY_NIBBLES		(31)
39 /* Nibble offsets */
40 #define NPC_LAYER_KEYX_SZ		(3)
41 #define NPC_PARSE_KEX_S_LA_OFFSET	(7)
42 #define NPC_PARSE_KEX_S_LID_OFFSET(lid)		\
43 	((((lid) - NPC_LID_LA) * NPC_LAYER_KEYX_SZ)  \
44 	+ NPC_PARSE_KEX_S_LA_OFFSET)
45 
46 
47 /* supported flow actions flags */
48 #define OTX2_FLOW_ACT_MARK    (1 << 0)
49 #define OTX2_FLOW_ACT_FLAG    (1 << 1)
50 #define OTX2_FLOW_ACT_DROP    (1 << 2)
51 #define OTX2_FLOW_ACT_QUEUE   (1 << 3)
52 #define OTX2_FLOW_ACT_RSS     (1 << 4)
53 #define OTX2_FLOW_ACT_DUP     (1 << 5)
54 #define OTX2_FLOW_ACT_SEC     (1 << 6)
55 #define OTX2_FLOW_ACT_COUNT   (1 << 7)
56 #define OTX2_FLOW_ACT_PF      (1 << 8)
57 #define OTX2_FLOW_ACT_VF      (1 << 9)
58 #define OTX2_FLOW_ACT_VLAN_STRIP (1 << 10)
59 #define OTX2_FLOW_ACT_VLAN_INSERT (1 << 11)
60 #define OTX2_FLOW_ACT_VLAN_ETHTYPE_INSERT (1 << 12)
61 #define OTX2_FLOW_ACT_VLAN_PCP_INSERT (1 << 13)
62 
63 /* terminating actions */
64 #define OTX2_FLOW_ACT_TERM    (OTX2_FLOW_ACT_DROP  | \
65 			       OTX2_FLOW_ACT_QUEUE | \
66 			       OTX2_FLOW_ACT_RSS   | \
67 			       OTX2_FLOW_ACT_DUP   | \
68 			       OTX2_FLOW_ACT_SEC)
69 
70 /* This mark value indicates flag action */
71 #define OTX2_FLOW_FLAG_VAL    (0xffff)
72 
73 #define NIX_RX_ACT_MATCH_OFFSET		(40)
74 #define NIX_RX_ACT_MATCH_MASK		(0xFFFF)
75 
76 #define NIX_RSS_ACT_GRP_OFFSET		(20)
77 #define NIX_RSS_ACT_ALG_OFFSET		(56)
78 #define NIX_RSS_ACT_GRP_MASK		(0xFFFFF)
79 #define NIX_RSS_ACT_ALG_MASK		(0x1F)
80 
81 /* PMD-specific definition of the opaque struct rte_flow */
82 #define OTX2_MAX_MCAM_WIDTH_DWORDS	7
83 
84 enum npc_mcam_intf {
85 	NPC_MCAM_RX,
86 	NPC_MCAM_TX
87 };
88 
89 struct npc_xtract_info {
90 	/* Length in bytes of pkt data extracted. len = 0
91 	 * indicates that extraction is disabled.
92 	 */
93 	uint8_t len;
94 	uint8_t hdr_off; /* Byte offset of proto hdr: extract_src */
95 	uint8_t key_off; /* Byte offset in MCAM key where data is placed */
96 	uint8_t enable; /* Extraction enabled or disabled */
97 	uint8_t flags_enable; /* Flags extraction enabled */
98 };
99 
100 /* Information for a given {LAYER, LTYPE} */
101 struct npc_lid_lt_xtract_info {
102 	/* Info derived from parser configuration */
103 	uint16_t npc_proto;              /* Network protocol identified */
104 	uint8_t  valid_flags_mask;       /* Flags applicable */
105 	uint8_t  is_terminating:1;       /* No more parsing */
106 	struct npc_xtract_info xtract[NPC_MAX_LD];
107 };
108 
109 union npc_kex_ldata_flags_cfg {
110 	struct {
111 	#if defined(__BIG_ENDIAN_BITFIELD)
112 		uint64_t rvsd_62_1	: 61;
113 		uint64_t lid		: 3;
114 	#else
115 		uint64_t lid		: 3;
116 		uint64_t rvsd_62_1	: 61;
117 	#endif
118 	} s;
119 
120 	uint64_t i;
121 };
122 
123 typedef struct npc_lid_lt_xtract_info
124 	otx2_dxcfg_t[NPC_MAX_INTF][NPC_MAX_LID][NPC_MAX_LT];
125 typedef struct npc_lid_lt_xtract_info
126 	otx2_fxcfg_t[NPC_MAX_INTF][NPC_MAX_LD][NPC_MAX_LFL];
127 typedef union npc_kex_ldata_flags_cfg otx2_ld_flags_t[NPC_MAX_LD];
128 
129 
130 /* MBOX_MSG_NPC_GET_DATAX_CFG Response */
131 struct npc_get_datax_cfg {
132 	/* NPC_AF_KEX_LDATA(0..1)_FLAGS_CFG */
133 	union npc_kex_ldata_flags_cfg ld_flags[NPC_MAX_LD];
134 	/* Extract information indexed with [LID][LTYPE] */
135 	struct npc_lid_lt_xtract_info lid_lt_xtract[NPC_MAX_LID][NPC_MAX_LT];
136 	/* Flags based extract indexed with [LDATA][FLAGS_LOWER_NIBBLE]
137 	 * Fields flags_ena_ld0, flags_ena_ld1 in
138 	 * struct npc_lid_lt_xtract_info indicate if this is applicable
139 	 * for a given {LAYER, LTYPE}
140 	 */
141 	struct npc_xtract_info flag_xtract[NPC_MAX_LD][NPC_MAX_LT];
142 };
143 
144 struct otx2_mcam_ents_info {
145 	/* Current max & min values of mcam index */
146 	uint32_t max_id;
147 	uint32_t min_id;
148 	uint32_t free_ent;
149 	uint32_t live_ent;
150 };
151 
152 struct rte_flow {
153 	uint8_t  nix_intf;
154 	uint32_t  mcam_id;
155 	int32_t ctr_id;
156 	uint32_t priority;
157 	/* Contiguous match string */
158 	uint64_t mcam_data[OTX2_MAX_MCAM_WIDTH_DWORDS];
159 	uint64_t mcam_mask[OTX2_MAX_MCAM_WIDTH_DWORDS];
160 	uint64_t npc_action;
161 	uint64_t vtag_action;
162 	TAILQ_ENTRY(rte_flow) next;
163 };
164 
165 TAILQ_HEAD(otx2_flow_list, rte_flow);
166 
167 /* Accessed from ethdev private - otx2_eth_dev */
168 struct otx2_npc_flow_info {
169 	rte_atomic32_t mark_actions;
170 	uint32_t vtag_actions;
171 	uint32_t keyx_supp_nmask[NPC_MAX_INTF];/* nibble mask */
172 	uint32_t keyx_len[NPC_MAX_INTF];	/* per intf key len in bits */
173 	uint32_t datax_len[NPC_MAX_INTF];	/* per intf data len in bits */
174 	uint32_t keyw[NPC_MAX_INTF];		/* max key + data len bits */
175 	uint32_t mcam_entries;			/* mcam entries supported */
176 	otx2_dxcfg_t prx_dxcfg;			/* intf, lid, lt, extract */
177 	otx2_fxcfg_t prx_fxcfg;			/* Flag extract */
178 	otx2_ld_flags_t prx_lfcfg;		/* KEX LD_Flags CFG */
179 	/* mcam entry info per priority level: both free & in-use */
180 	struct otx2_mcam_ents_info *flow_entry_info;
181 	/* Bitmap of free preallocated entries in ascending index &
182 	 * descending priority
183 	 */
184 	struct rte_bitmap **free_entries;
185 	/* Bitmap of free preallocated entries in descending index &
186 	 * ascending priority
187 	 */
188 	struct rte_bitmap **free_entries_rev;
189 	/* Bitmap of live entries in ascending index & descending priority */
190 	struct rte_bitmap **live_entries;
191 	/* Bitmap of live entries in descending index & ascending priority */
192 	struct rte_bitmap **live_entries_rev;
193 	/* Priority bucket wise tail queue of all rte_flow resources */
194 	struct otx2_flow_list *flow_list;
195 	uint32_t rss_grps;  /* rss groups supported */
196 	struct rte_bitmap *rss_grp_entries;
197 	uint16_t channel; /*rx channel */
198 	uint16_t flow_prealloc_size;
199 	uint16_t flow_max_priority;
200 	uint16_t switch_header_type;
201 };
202 
203 struct otx2_parse_state {
204 	struct otx2_npc_flow_info *npc;
205 	const struct rte_flow_item *pattern;
206 	const struct rte_flow_item *last_pattern; /* Temp usage */
207 	struct rte_flow_error *error;
208 	struct rte_flow *flow;
209 	uint8_t tunnel;
210 	uint8_t terminate;
211 	uint8_t layer_mask;
212 	uint8_t lt[NPC_MAX_LID];
213 	uint8_t flags[NPC_MAX_LID];
214 	uint8_t *mcam_data; /* point to flow->mcam_data + key_len */
215 	uint8_t *mcam_mask; /* point to flow->mcam_mask + key_len */
216 	bool is_vf;
217 };
218 
219 struct otx2_flow_item_info {
220 	const void *def_mask; /* rte_flow default mask */
221 	void *hw_mask;        /* hardware supported mask */
222 	int  len;             /* length of item */
223 	const void *spec;     /* spec to use, NULL implies match any */
224 	const void *mask;     /* mask to use */
225 	uint8_t hw_hdr_len;  /* Extra data len at each layer*/
226 };
227 
228 struct otx2_idev_kex_cfg {
229 	struct npc_get_kex_cfg_rsp kex_cfg;
230 	rte_atomic16_t kex_refcnt;
231 };
232 
233 enum npc_kpu_parser_flag {
234 	NPC_F_NA = 0,
235 	NPC_F_PKI,
236 	NPC_F_PKI_VLAN,
237 	NPC_F_PKI_ETAG,
238 	NPC_F_PKI_ITAG,
239 	NPC_F_PKI_MPLS,
240 	NPC_F_PKI_NSH,
241 	NPC_F_ETYPE_UNK,
242 	NPC_F_ETHER_VLAN,
243 	NPC_F_ETHER_ETAG,
244 	NPC_F_ETHER_ITAG,
245 	NPC_F_ETHER_MPLS,
246 	NPC_F_ETHER_NSH,
247 	NPC_F_STAG_CTAG,
248 	NPC_F_STAG_CTAG_UNK,
249 	NPC_F_STAG_STAG_CTAG,
250 	NPC_F_STAG_STAG_STAG,
251 	NPC_F_QINQ_CTAG,
252 	NPC_F_QINQ_CTAG_UNK,
253 	NPC_F_QINQ_QINQ_CTAG,
254 	NPC_F_QINQ_QINQ_QINQ,
255 	NPC_F_BTAG_ITAG,
256 	NPC_F_BTAG_ITAG_STAG,
257 	NPC_F_BTAG_ITAG_CTAG,
258 	NPC_F_BTAG_ITAG_UNK,
259 	NPC_F_ETAG_CTAG,
260 	NPC_F_ETAG_BTAG_ITAG,
261 	NPC_F_ETAG_STAG,
262 	NPC_F_ETAG_QINQ,
263 	NPC_F_ETAG_ITAG,
264 	NPC_F_ETAG_ITAG_STAG,
265 	NPC_F_ETAG_ITAG_CTAG,
266 	NPC_F_ETAG_ITAG_UNK,
267 	NPC_F_ITAG_STAG_CTAG,
268 	NPC_F_ITAG_STAG,
269 	NPC_F_ITAG_CTAG,
270 	NPC_F_MPLS_4_LABELS,
271 	NPC_F_MPLS_3_LABELS,
272 	NPC_F_MPLS_2_LABELS,
273 	NPC_F_IP_HAS_OPTIONS,
274 	NPC_F_IP_IP_IN_IP,
275 	NPC_F_IP_6TO4,
276 	NPC_F_IP_MPLS_IN_IP,
277 	NPC_F_IP_UNK_PROTO,
278 	NPC_F_IP_IP_IN_IP_HAS_OPTIONS,
279 	NPC_F_IP_6TO4_HAS_OPTIONS,
280 	NPC_F_IP_MPLS_IN_IP_HAS_OPTIONS,
281 	NPC_F_IP_UNK_PROTO_HAS_OPTIONS,
282 	NPC_F_IP6_HAS_EXT,
283 	NPC_F_IP6_TUN_IP6,
284 	NPC_F_IP6_MPLS_IN_IP,
285 	NPC_F_TCP_HAS_OPTIONS,
286 	NPC_F_TCP_HTTP,
287 	NPC_F_TCP_HTTPS,
288 	NPC_F_TCP_PPTP,
289 	NPC_F_TCP_UNK_PORT,
290 	NPC_F_TCP_HTTP_HAS_OPTIONS,
291 	NPC_F_TCP_HTTPS_HAS_OPTIONS,
292 	NPC_F_TCP_PPTP_HAS_OPTIONS,
293 	NPC_F_TCP_UNK_PORT_HAS_OPTIONS,
294 	NPC_F_UDP_VXLAN,
295 	NPC_F_UDP_VXLAN_NOVNI,
296 	NPC_F_UDP_VXLAN_NOVNI_NSH,
297 	NPC_F_UDP_VXLANGPE,
298 	NPC_F_UDP_VXLANGPE_NSH,
299 	NPC_F_UDP_VXLANGPE_MPLS,
300 	NPC_F_UDP_VXLANGPE_NOVNI,
301 	NPC_F_UDP_VXLANGPE_NOVNI_NSH,
302 	NPC_F_UDP_VXLANGPE_NOVNI_MPLS,
303 	NPC_F_UDP_VXLANGPE_UNK,
304 	NPC_F_UDP_VXLANGPE_NONP,
305 	NPC_F_UDP_GTP_GTPC,
306 	NPC_F_UDP_GTP_GTPU_G_PDU,
307 	NPC_F_UDP_GTP_GTPU_UNK,
308 	NPC_F_UDP_UNK_PORT,
309 	NPC_F_UDP_GENEVE,
310 	NPC_F_UDP_GENEVE_OAM,
311 	NPC_F_UDP_GENEVE_CRI_OPT,
312 	NPC_F_UDP_GENEVE_OAM_CRI_OPT,
313 	NPC_F_GRE_NVGRE,
314 	NPC_F_GRE_HAS_SRE,
315 	NPC_F_GRE_HAS_CSUM,
316 	NPC_F_GRE_HAS_KEY,
317 	NPC_F_GRE_HAS_SEQ,
318 	NPC_F_GRE_HAS_CSUM_KEY,
319 	NPC_F_GRE_HAS_CSUM_SEQ,
320 	NPC_F_GRE_HAS_KEY_SEQ,
321 	NPC_F_GRE_HAS_CSUM_KEY_SEQ,
322 	NPC_F_GRE_HAS_ROUTE,
323 	NPC_F_GRE_UNK_PROTO,
324 	NPC_F_GRE_VER1,
325 	NPC_F_GRE_VER1_HAS_SEQ,
326 	NPC_F_GRE_VER1_HAS_ACK,
327 	NPC_F_GRE_VER1_HAS_SEQ_ACK,
328 	NPC_F_GRE_VER1_UNK_PROTO,
329 	NPC_F_TU_ETHER_UNK,
330 	NPC_F_TU_ETHER_CTAG,
331 	NPC_F_TU_ETHER_CTAG_UNK,
332 	NPC_F_TU_ETHER_STAG_CTAG,
333 	NPC_F_TU_ETHER_STAG_CTAG_UNK,
334 	NPC_F_TU_ETHER_STAG,
335 	NPC_F_TU_ETHER_STAG_UNK,
336 	NPC_F_TU_ETHER_QINQ_CTAG,
337 	NPC_F_TU_ETHER_QINQ_CTAG_UNK,
338 	NPC_F_TU_ETHER_QINQ,
339 	NPC_F_TU_ETHER_QINQ_UNK,
340 	NPC_F_LAST /* has to be the last item */
341 };
342 
343 
344 int otx2_flow_mcam_free_counter(struct otx2_mbox *mbox, uint16_t ctr_id);
345 
346 int otx2_flow_mcam_read_counter(struct otx2_mbox *mbox, uint32_t ctr_id,
347 				uint64_t *count);
348 
349 int otx2_flow_mcam_clear_counter(struct otx2_mbox *mbox, uint32_t ctr_id);
350 
351 int otx2_flow_mcam_free_entry(struct otx2_mbox *mbox, uint32_t entry);
352 
353 int otx2_flow_mcam_free_all_entries(struct otx2_mbox *mbox);
354 
355 int otx2_flow_update_parse_state(struct otx2_parse_state *pst,
356 				 struct otx2_flow_item_info *info,
357 				 int lid, int lt, uint8_t flags);
358 
359 int otx2_flow_parse_item_basic(const struct rte_flow_item *item,
360 			       struct otx2_flow_item_info *info,
361 			       struct rte_flow_error *error);
362 
363 void otx2_flow_keyx_compress(uint64_t *data, uint32_t nibble_mask);
364 
365 int otx2_flow_mcam_alloc_and_write(struct rte_flow *flow,
366 				   struct otx2_mbox *mbox,
367 				   struct otx2_parse_state *pst,
368 				   struct otx2_npc_flow_info *flow_info);
369 
370 void otx2_flow_get_hw_supp_mask(struct otx2_parse_state *pst,
371 				struct otx2_flow_item_info *info,
372 				int lid, int lt);
373 
374 const struct rte_flow_item *
375 otx2_flow_skip_void_and_any_items(const struct rte_flow_item *pattern);
376 
377 int otx2_flow_parse_lh(struct otx2_parse_state *pst);
378 
379 int otx2_flow_parse_lg(struct otx2_parse_state *pst);
380 
381 int otx2_flow_parse_lf(struct otx2_parse_state *pst);
382 
383 int otx2_flow_parse_le(struct otx2_parse_state *pst);
384 
385 int otx2_flow_parse_ld(struct otx2_parse_state *pst);
386 
387 int otx2_flow_parse_lc(struct otx2_parse_state *pst);
388 
389 int otx2_flow_parse_lb(struct otx2_parse_state *pst);
390 
391 int otx2_flow_parse_la(struct otx2_parse_state *pst);
392 
393 int otx2_flow_parse_higig2_hdr(struct otx2_parse_state *pst);
394 
395 int otx2_flow_parse_actions(struct rte_eth_dev *dev,
396 			    const struct rte_flow_attr *attr,
397 			    const struct rte_flow_action actions[],
398 			    struct rte_flow_error *error,
399 			    struct rte_flow *flow);
400 
401 int otx2_flow_free_all_resources(struct otx2_eth_dev *hw);
402 
403 int otx2_flow_parse_mpls(struct otx2_parse_state *pst, int lid);
404 #endif /* __OTX2_FLOW_H__ */
405