1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2019 Marvell International Ltd.
5 #ifndef __OTX2_FLOW_H__
6 #define __OTX2_FLOW_H__
10 #include <rte_flow_driver.h>
11 #include <rte_malloc.h>
12 #include <rte_tailq.h>
14 #include "otx2_common.h"
15 #include "otx2_ethdev.h"
16 #include "otx2_mbox.h"
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;
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)
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)
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)
59 /* terminating actions */
60 #define OTX2_FLOW_ACT_TERM (OTX2_FLOW_ACT_DROP | \
61 OTX2_FLOW_ACT_QUEUE | \
66 /* This mark value indicates flag action */
67 #define OTX2_FLOW_FLAG_VAL (0xffff)
69 #define NIX_RX_ACT_MATCH_OFFSET (40)
70 #define NIX_RX_ACT_MATCH_MASK (0xFFFF)
72 #define NIX_RSS_ACT_GRP_OFFSET (20)
73 #define NIX_RSS_ACT_ALG_OFFSET (56)
74 #define NIX_RSS_ACT_GRP_MASK (0xFFFFF)
75 #define NIX_RSS_ACT_ALG_MASK (0x1F)
77 /* PMD-specific definition of the opaque struct rte_flow */
78 #define OTX2_MAX_MCAM_WIDTH_DWORDS 7
85 struct npc_xtract_info {
86 /* Length in bytes of pkt data extracted. len = 0
87 * indicates that extraction is disabled.
90 uint8_t hdr_off; /* Byte offset of proto hdr: extract_src */
91 uint8_t key_off; /* Byte offset in MCAM key where data is placed */
92 uint8_t enable; /* Extraction enabled or disabled */
93 uint8_t flags_enable; /* Flags extraction enabled */
96 /* Information for a given {LAYER, LTYPE} */
97 struct npc_lid_lt_xtract_info {
98 /* Info derived from parser configuration */
99 uint16_t npc_proto; /* Network protocol identified */
100 uint8_t valid_flags_mask; /* Flags applicable */
101 uint8_t is_terminating:1; /* No more parsing */
102 struct npc_xtract_info xtract[NPC_MAX_LD];
105 union npc_kex_ldata_flags_cfg {
107 #if defined(__BIG_ENDIAN_BITFIELD)
108 uint64_t rvsd_62_1 : 61;
112 uint64_t rvsd_62_1 : 61;
119 typedef struct npc_lid_lt_xtract_info
120 otx2_dxcfg_t[NPC_MAX_INTF][NPC_MAX_LID][NPC_MAX_LT];
121 typedef struct npc_lid_lt_xtract_info
122 otx2_fxcfg_t[NPC_MAX_INTF][NPC_MAX_LD][NPC_MAX_LFL];
123 typedef union npc_kex_ldata_flags_cfg otx2_ld_flags_t[NPC_MAX_LD];
126 /* MBOX_MSG_NPC_GET_DATAX_CFG Response */
127 struct npc_get_datax_cfg {
128 /* NPC_AF_KEX_LDATA(0..1)_FLAGS_CFG */
129 union npc_kex_ldata_flags_cfg ld_flags[NPC_MAX_LD];
130 /* Extract information indexed with [LID][LTYPE] */
131 struct npc_lid_lt_xtract_info lid_lt_xtract[NPC_MAX_LID][NPC_MAX_LT];
132 /* Flags based extract indexed with [LDATA][FLAGS_LOWER_NIBBLE]
133 * Fields flags_ena_ld0, flags_ena_ld1 in
134 * struct npc_lid_lt_xtract_info indicate if this is applicable
135 * for a given {LAYER, LTYPE}
137 struct npc_xtract_info flag_xtract[NPC_MAX_LD][NPC_MAX_LT];
140 struct otx2_mcam_ents_info {
141 /* Current max & min values of mcam index */
153 /* Contiguous match string */
154 uint64_t mcam_data[OTX2_MAX_MCAM_WIDTH_DWORDS];
155 uint64_t mcam_mask[OTX2_MAX_MCAM_WIDTH_DWORDS];
157 TAILQ_ENTRY(rte_flow) next;
160 TAILQ_HEAD(otx2_flow_list, rte_flow);
162 /* Accessed from ethdev private - otx2_eth_dev */
163 struct otx2_npc_flow_info {
164 rte_atomic32_t mark_actions;
165 uint32_t keyx_supp_nmask[NPC_MAX_INTF];/* nibble mask */
166 uint32_t keyx_len[NPC_MAX_INTF]; /* per intf key len in bits */
167 uint32_t datax_len[NPC_MAX_INTF]; /* per intf data len in bits */
168 uint32_t keyw[NPC_MAX_INTF]; /* max key + data len bits */
169 uint32_t mcam_entries; /* mcam entries supported */
170 otx2_dxcfg_t prx_dxcfg; /* intf, lid, lt, extract */
171 otx2_fxcfg_t prx_fxcfg; /* Flag extract */
172 otx2_ld_flags_t prx_lfcfg; /* KEX LD_Flags CFG */
173 /* mcam entry info per priority level: both free & in-use */
174 struct otx2_mcam_ents_info *flow_entry_info;
175 /* Bitmap of free preallocated entries in ascending index &
176 * descending priority
178 struct rte_bitmap **free_entries;
179 /* Bitmap of free preallocated entries in descending index &
182 struct rte_bitmap **free_entries_rev;
183 /* Bitmap of live entries in ascending index & descending priority */
184 struct rte_bitmap **live_entries;
185 /* Bitmap of live entries in descending index & ascending priority */
186 struct rte_bitmap **live_entries_rev;
187 /* Priority bucket wise tail queue of all rte_flow resources */
188 struct otx2_flow_list *flow_list;
189 uint32_t rss_grps; /* rss groups supported */
190 struct rte_bitmap *rss_grp_entries;
191 uint16_t channel; /*rx channel */
192 uint16_t flow_prealloc_size;
193 uint16_t flow_max_priority;
194 uint16_t switch_header_type;
197 struct otx2_parse_state {
198 struct otx2_npc_flow_info *npc;
199 const struct rte_flow_item *pattern;
200 const struct rte_flow_item *last_pattern; /* Temp usage */
201 struct rte_flow_error *error;
202 struct rte_flow *flow;
206 uint8_t lt[NPC_MAX_LID];
207 uint8_t flags[NPC_MAX_LID];
208 uint8_t *mcam_data; /* point to flow->mcam_data + key_len */
209 uint8_t *mcam_mask; /* point to flow->mcam_mask + key_len */
212 struct otx2_flow_item_info {
213 const void *def_mask; /* rte_flow default mask */
214 void *hw_mask; /* hardware supported mask */
215 int len; /* length of item */
216 const void *spec; /* spec to use, NULL implies match any */
217 const void *mask; /* mask to use */
218 uint8_t hw_hdr_len; /* Extra data len at each layer*/
221 struct otx2_idev_kex_cfg {
222 struct npc_get_kex_cfg_rsp kex_cfg;
223 rte_atomic16_t kex_refcnt;
226 enum npc_kpu_parser_flag {
242 NPC_F_STAG_STAG_CTAG,
243 NPC_F_STAG_STAG_STAG,
246 NPC_F_QINQ_QINQ_CTAG,
247 NPC_F_QINQ_QINQ_QINQ,
249 NPC_F_BTAG_ITAG_STAG,
250 NPC_F_BTAG_ITAG_CTAG,
253 NPC_F_ETAG_BTAG_ITAG,
257 NPC_F_ETAG_ITAG_STAG,
258 NPC_F_ETAG_ITAG_CTAG,
260 NPC_F_ITAG_STAG_CTAG,
266 NPC_F_IP_HAS_OPTIONS,
271 NPC_F_IP_IP_IN_IP_HAS_OPTIONS,
272 NPC_F_IP_6TO4_HAS_OPTIONS,
273 NPC_F_IP_MPLS_IN_IP_HAS_OPTIONS,
274 NPC_F_IP_UNK_PROTO_HAS_OPTIONS,
277 NPC_F_IP6_MPLS_IN_IP,
278 NPC_F_TCP_HAS_OPTIONS,
283 NPC_F_TCP_HTTP_HAS_OPTIONS,
284 NPC_F_TCP_HTTPS_HAS_OPTIONS,
285 NPC_F_TCP_PPTP_HAS_OPTIONS,
286 NPC_F_TCP_UNK_PORT_HAS_OPTIONS,
288 NPC_F_UDP_VXLAN_NOVNI,
289 NPC_F_UDP_VXLAN_NOVNI_NSH,
291 NPC_F_UDP_VXLANGPE_NSH,
292 NPC_F_UDP_VXLANGPE_MPLS,
293 NPC_F_UDP_VXLANGPE_NOVNI,
294 NPC_F_UDP_VXLANGPE_NOVNI_NSH,
295 NPC_F_UDP_VXLANGPE_NOVNI_MPLS,
296 NPC_F_UDP_VXLANGPE_UNK,
297 NPC_F_UDP_VXLANGPE_NONP,
299 NPC_F_UDP_GTP_GTPU_G_PDU,
300 NPC_F_UDP_GTP_GTPU_UNK,
303 NPC_F_UDP_GENEVE_OAM,
304 NPC_F_UDP_GENEVE_CRI_OPT,
305 NPC_F_UDP_GENEVE_OAM_CRI_OPT,
311 NPC_F_GRE_HAS_CSUM_KEY,
312 NPC_F_GRE_HAS_CSUM_SEQ,
313 NPC_F_GRE_HAS_KEY_SEQ,
314 NPC_F_GRE_HAS_CSUM_KEY_SEQ,
318 NPC_F_GRE_VER1_HAS_SEQ,
319 NPC_F_GRE_VER1_HAS_ACK,
320 NPC_F_GRE_VER1_HAS_SEQ_ACK,
321 NPC_F_GRE_VER1_UNK_PROTO,
324 NPC_F_TU_ETHER_CTAG_UNK,
325 NPC_F_TU_ETHER_STAG_CTAG,
326 NPC_F_TU_ETHER_STAG_CTAG_UNK,
328 NPC_F_TU_ETHER_STAG_UNK,
329 NPC_F_TU_ETHER_QINQ_CTAG,
330 NPC_F_TU_ETHER_QINQ_CTAG_UNK,
332 NPC_F_TU_ETHER_QINQ_UNK,
333 NPC_F_LAST /* has to be the last item */
337 int otx2_flow_mcam_free_counter(struct otx2_mbox *mbox, uint16_t ctr_id);
339 int otx2_flow_mcam_read_counter(struct otx2_mbox *mbox, uint32_t ctr_id,
342 int otx2_flow_mcam_clear_counter(struct otx2_mbox *mbox, uint32_t ctr_id);
344 int otx2_flow_mcam_free_entry(struct otx2_mbox *mbox, uint32_t entry);
346 int otx2_flow_mcam_free_all_entries(struct otx2_mbox *mbox);
348 int otx2_flow_update_parse_state(struct otx2_parse_state *pst,
349 struct otx2_flow_item_info *info,
350 int lid, int lt, uint8_t flags);
352 int otx2_flow_parse_item_basic(const struct rte_flow_item *item,
353 struct otx2_flow_item_info *info,
354 struct rte_flow_error *error);
356 void otx2_flow_keyx_compress(uint64_t *data, uint32_t nibble_mask);
358 int otx2_flow_mcam_alloc_and_write(struct rte_flow *flow,
359 struct otx2_mbox *mbox,
360 struct otx2_parse_state *pst,
361 struct otx2_npc_flow_info *flow_info);
363 void otx2_flow_get_hw_supp_mask(struct otx2_parse_state *pst,
364 struct otx2_flow_item_info *info,
367 const struct rte_flow_item *
368 otx2_flow_skip_void_and_any_items(const struct rte_flow_item *pattern);
370 int otx2_flow_parse_lh(struct otx2_parse_state *pst);
372 int otx2_flow_parse_lg(struct otx2_parse_state *pst);
374 int otx2_flow_parse_lf(struct otx2_parse_state *pst);
376 int otx2_flow_parse_le(struct otx2_parse_state *pst);
378 int otx2_flow_parse_ld(struct otx2_parse_state *pst);
380 int otx2_flow_parse_lc(struct otx2_parse_state *pst);
382 int otx2_flow_parse_lb(struct otx2_parse_state *pst);
384 int otx2_flow_parse_la(struct otx2_parse_state *pst);
386 int otx2_flow_parse_higig2_hdr(struct otx2_parse_state *pst);
388 int otx2_flow_parse_actions(struct rte_eth_dev *dev,
389 const struct rte_flow_attr *attr,
390 const struct rte_flow_action actions[],
391 struct rte_flow_error *error,
392 struct rte_flow *flow);
394 int otx2_flow_free_all_resources(struct otx2_eth_dev *hw);
396 int otx2_flow_parse_mpls(struct otx2_parse_state *pst, int lid);
397 #endif /* __OTX2_FLOW_H__ */