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