xref: /dpdk/drivers/net/ntnic/include/flow_api_engine.h (revision c4e84cd7f77ae44598576d88357138a08734a494)
11d3f62a0SOleksandr Kolomeiets /*
21d3f62a0SOleksandr Kolomeiets  * SPDX-License-Identifier: BSD-3-Clause
31d3f62a0SOleksandr Kolomeiets  * Copyright(c) 2023 Napatech A/S
41d3f62a0SOleksandr Kolomeiets  */
51d3f62a0SOleksandr Kolomeiets 
61d3f62a0SOleksandr Kolomeiets #ifndef _FLOW_API_ENGINE_H_
71d3f62a0SOleksandr Kolomeiets #define _FLOW_API_ENGINE_H_
81d3f62a0SOleksandr Kolomeiets 
98385ba0eSSerhii Iliushyk #include <stdint.h>
10e02fdb65SSerhii Iliushyk #include <stdatomic.h>
11e02fdb65SSerhii Iliushyk 
12e02fdb65SSerhii Iliushyk #include "hw_mod_backend.h"
13e02fdb65SSerhii Iliushyk #include "stream_binary_flow_api.h"
148385ba0eSSerhii Iliushyk 
151d3f62a0SOleksandr Kolomeiets /*
161d3f62a0SOleksandr Kolomeiets  * Resource management
177917b0d3SOleksandr Kolomeiets  */
187917b0d3SOleksandr Kolomeiets #define BIT_CONTAINER_8_ALIGN(x) (((x) + 7) / 8)
197917b0d3SOleksandr Kolomeiets 
207917b0d3SOleksandr Kolomeiets /*
217917b0d3SOleksandr Kolomeiets  * Resource management
221d3f62a0SOleksandr Kolomeiets  * These are free resources in FPGA
231d3f62a0SOleksandr Kolomeiets  * Other FPGA memory lists are linked to one of these
241d3f62a0SOleksandr Kolomeiets  * and will implicitly follow them
251d3f62a0SOleksandr Kolomeiets  */
261d3f62a0SOleksandr Kolomeiets enum res_type_e {
271d3f62a0SOleksandr Kolomeiets 	RES_QUEUE,
281d3f62a0SOleksandr Kolomeiets 	RES_CAT_CFN,
291d3f62a0SOleksandr Kolomeiets 	RES_CAT_COT,
301d3f62a0SOleksandr Kolomeiets 	RES_CAT_EXO,
311d3f62a0SOleksandr Kolomeiets 	RES_CAT_LEN,
321d3f62a0SOleksandr Kolomeiets 	RES_KM_FLOW_TYPE,
331d3f62a0SOleksandr Kolomeiets 	RES_KM_CATEGORY,
341d3f62a0SOleksandr Kolomeiets 	RES_HSH_RCP,
351d3f62a0SOleksandr Kolomeiets 	RES_PDB_RCP,
361d3f62a0SOleksandr Kolomeiets 	RES_QSL_RCP,
371d3f62a0SOleksandr Kolomeiets 	RES_QSL_QST,
381d3f62a0SOleksandr Kolomeiets 	RES_SLC_LR_RCP,
391d3f62a0SOleksandr Kolomeiets 
401d3f62a0SOleksandr Kolomeiets 	RES_FLM_FLOW_TYPE,
411d3f62a0SOleksandr Kolomeiets 	RES_FLM_RCP,
421d3f62a0SOleksandr Kolomeiets 	RES_TPE_RCP,
431d3f62a0SOleksandr Kolomeiets 	RES_TPE_EXT,
441d3f62a0SOleksandr Kolomeiets 	RES_TPE_RPL,
451d3f62a0SOleksandr Kolomeiets 	RES_SCRUB_RCP,
461d3f62a0SOleksandr Kolomeiets 	RES_COUNT,
47*c4e84cd7SSerhii Iliushyk 	RES_INVALID,
48*c4e84cd7SSerhii Iliushyk 	RES_END
491d3f62a0SOleksandr Kolomeiets };
501d3f62a0SOleksandr Kolomeiets 
51b01eb812SDanylo Vodopianov /*
52b01eb812SDanylo Vodopianov  * Flow NIC offload management
53b01eb812SDanylo Vodopianov  */
54b01eb812SDanylo Vodopianov #define MAX_OUTPUT_DEST (128)
55b01eb812SDanylo Vodopianov 
569bd46cf2SDanylo Vodopianov #define MAX_WORD_NUM 24
579bd46cf2SDanylo Vodopianov #define MAX_BANKS 6
589bd46cf2SDanylo Vodopianov 
599bd46cf2SDanylo Vodopianov #define MAX_TCAM_START_OFFSETS 4
609bd46cf2SDanylo Vodopianov 
614033e053SDanylo Vodopianov #define MAX_FLM_MTRS_SUPPORTED 4
628385ba0eSSerhii Iliushyk #define MAX_CPY_WRITERS_SUPPORTED 8
638385ba0eSSerhii Iliushyk 
646fec9a9aSSerhii Iliushyk #define MAX_MATCH_FIELDS 16
656fec9a9aSSerhii Iliushyk 
66c6821abfSDanylo Vodopianov /*
679bd46cf2SDanylo Vodopianov  *          128      128     32     32    32
689bd46cf2SDanylo Vodopianov  * Have  |  QW0  ||  QW4  || SW8 || SW9 | SWX   in FPGA
699bd46cf2SDanylo Vodopianov  *
709bd46cf2SDanylo Vodopianov  * Each word may start at any offset, though
719bd46cf2SDanylo Vodopianov  * they are combined in chronological order, with all enabled to
729bd46cf2SDanylo Vodopianov  * build the extracted match data, thus that is how the match key
739bd46cf2SDanylo Vodopianov  * must be build
74c6821abfSDanylo Vodopianov  */
759bd46cf2SDanylo Vodopianov enum extractor_e {
769bd46cf2SDanylo Vodopianov 	KM_USE_EXTRACTOR_UNDEF,
779bd46cf2SDanylo Vodopianov 	KM_USE_EXTRACTOR_QWORD,
789bd46cf2SDanylo Vodopianov 	KM_USE_EXTRACTOR_SWORD,
79c6821abfSDanylo Vodopianov };
80c6821abfSDanylo Vodopianov 
816fec9a9aSSerhii Iliushyk struct match_elem_s {
829bd46cf2SDanylo Vodopianov 	enum extractor_e extr;
836fec9a9aSSerhii Iliushyk 	int masked_for_tcam;	/* if potentially selected for TCAM */
846fec9a9aSSerhii Iliushyk 	uint32_t e_word[4];
856fec9a9aSSerhii Iliushyk 	uint32_t e_mask[4];
866fec9a9aSSerhii Iliushyk 
876fec9a9aSSerhii Iliushyk 	int extr_start_offs_id;
886fec9a9aSSerhii Iliushyk 	int8_t rel_offs;
896fec9a9aSSerhii Iliushyk 	uint32_t word_len;
906fec9a9aSSerhii Iliushyk };
916fec9a9aSSerhii Iliushyk 
929bd46cf2SDanylo Vodopianov enum cam_tech_use_e {
939bd46cf2SDanylo Vodopianov 	KM_CAM,
949bd46cf2SDanylo Vodopianov 	KM_TCAM,
959bd46cf2SDanylo Vodopianov 	KM_SYNERGY
969bd46cf2SDanylo Vodopianov };
979bd46cf2SDanylo Vodopianov 
986fec9a9aSSerhii Iliushyk struct km_flow_def_s {
996fec9a9aSSerhii Iliushyk 	struct flow_api_backend_s *be;
1006fec9a9aSSerhii Iliushyk 
1019bd46cf2SDanylo Vodopianov 	/* For keeping track of identical entries */
1029bd46cf2SDanylo Vodopianov 	struct km_flow_def_s *reference;
1039bd46cf2SDanylo Vodopianov 	struct km_flow_def_s *root;
1049bd46cf2SDanylo Vodopianov 
1056fec9a9aSSerhii Iliushyk 	/* For collect flow elements and sorting */
1066fec9a9aSSerhii Iliushyk 	struct match_elem_s match[MAX_MATCH_FIELDS];
1079bd46cf2SDanylo Vodopianov 	struct match_elem_s *match_map[MAX_MATCH_FIELDS];
1086fec9a9aSSerhii Iliushyk 	int num_ftype_elem;
1096fec9a9aSSerhii Iliushyk 
1109bd46cf2SDanylo Vodopianov 	/* Finally formatted CAM/TCAM entry */
1119bd46cf2SDanylo Vodopianov 	enum cam_tech_use_e target;
1129bd46cf2SDanylo Vodopianov 	uint32_t entry_word[MAX_WORD_NUM];
1139bd46cf2SDanylo Vodopianov 	uint32_t entry_mask[MAX_WORD_NUM];
1149bd46cf2SDanylo Vodopianov 	int key_word_size;
1159bd46cf2SDanylo Vodopianov 
1169bd46cf2SDanylo Vodopianov 	/* TCAM calculated possible bank start offsets */
1179bd46cf2SDanylo Vodopianov 	int start_offsets[MAX_TCAM_START_OFFSETS];
1189bd46cf2SDanylo Vodopianov 	int num_start_offsets;
1199bd46cf2SDanylo Vodopianov 
1206fec9a9aSSerhii Iliushyk 	/* Flow information */
1216fec9a9aSSerhii Iliushyk 	/* HW input port ID needed for compare. In port must be identical on flow types */
1226fec9a9aSSerhii Iliushyk 	uint32_t port_id;
1239bd46cf2SDanylo Vodopianov 	uint32_t info;	/* used for color (actions) */
1249bd46cf2SDanylo Vodopianov 	int info_set;
1259bd46cf2SDanylo Vodopianov 	int flow_type;	/* 0 is illegal and used as unset */
1269bd46cf2SDanylo Vodopianov 	int flushed_to_target;	/* if this km entry has been finally programmed into NIC hw */
1279bd46cf2SDanylo Vodopianov 
1289bd46cf2SDanylo Vodopianov 	/* CAM specific bank management */
1299bd46cf2SDanylo Vodopianov 	int cam_paired;
1309bd46cf2SDanylo Vodopianov 	int record_indexes[MAX_BANKS];
1319bd46cf2SDanylo Vodopianov 	int bank_used;
1329bd46cf2SDanylo Vodopianov 	uint32_t *cuckoo_moves;	/* for CAM statistics only */
1339bd46cf2SDanylo Vodopianov 	struct cam_distrib_s *cam_dist;
1347fa0bf29SDanylo Vodopianov 	struct hasher_s *hsh;
1359bd46cf2SDanylo Vodopianov 
1369bd46cf2SDanylo Vodopianov 	/* TCAM specific bank management */
1379bd46cf2SDanylo Vodopianov 	struct tcam_distrib_s *tcam_dist;
1389bd46cf2SDanylo Vodopianov 	int tcam_start_bank;
1399bd46cf2SDanylo Vodopianov 	int tcam_record;
1409bd46cf2SDanylo Vodopianov };
1419bd46cf2SDanylo Vodopianov 
1429bd46cf2SDanylo Vodopianov /*
1437fa0bf29SDanylo Vodopianov  * RSS configuration, see struct rte_flow_action_rss
1447fa0bf29SDanylo Vodopianov  */
1457fa0bf29SDanylo Vodopianov struct hsh_def_s {
1467fa0bf29SDanylo Vodopianov 	enum rte_eth_hash_function func;	/* RSS hash function to apply */
1477fa0bf29SDanylo Vodopianov 	/* RSS hash types, see definition of RTE_ETH_RSS_* for hash calculation options */
1487fa0bf29SDanylo Vodopianov 	uint64_t types;
1497fa0bf29SDanylo Vodopianov 	uint32_t key_len;	/* Hash key length in bytes. */
1507fa0bf29SDanylo Vodopianov 	const uint8_t *key;	/* Hash key. */
1517fa0bf29SDanylo Vodopianov };
1527fa0bf29SDanylo Vodopianov 
1537fa0bf29SDanylo Vodopianov /*
154c0d44442SDanylo Vodopianov  * AGE configuration, see struct rte_flow_action_age
155c0d44442SDanylo Vodopianov  */
156c0d44442SDanylo Vodopianov struct age_def_s {
157c0d44442SDanylo Vodopianov 	uint32_t timeout;
158c0d44442SDanylo Vodopianov 	void *context;
159c0d44442SDanylo Vodopianov };
160c0d44442SDanylo Vodopianov 
161c0d44442SDanylo Vodopianov /*
1629bd46cf2SDanylo Vodopianov  * Tunnel encapsulation header definition
1639bd46cf2SDanylo Vodopianov  */
1649bd46cf2SDanylo Vodopianov #define MAX_TUN_HDR_SIZE 128
1659bd46cf2SDanylo Vodopianov 
1669bd46cf2SDanylo Vodopianov struct tunnel_header_s {
1679bd46cf2SDanylo Vodopianov 	union {
1689bd46cf2SDanylo Vodopianov 		uint8_t hdr8[MAX_TUN_HDR_SIZE];
1699bd46cf2SDanylo Vodopianov 		uint32_t hdr32[(MAX_TUN_HDR_SIZE + 3) / 4];
1709bd46cf2SDanylo Vodopianov 	} d;
1719bd46cf2SDanylo Vodopianov 
1729bd46cf2SDanylo Vodopianov 	uint8_t len;
1739bd46cf2SDanylo Vodopianov 
1749bd46cf2SDanylo Vodopianov 	uint8_t nb_vlans;
1759bd46cf2SDanylo Vodopianov 
1769bd46cf2SDanylo Vodopianov 	uint8_t ip_version;	/* 4: v4, 6: v6 */
1779bd46cf2SDanylo Vodopianov 
1789bd46cf2SDanylo Vodopianov 	uint8_t new_outer;
1799bd46cf2SDanylo Vodopianov 	uint8_t l2_len;
1809bd46cf2SDanylo Vodopianov 	uint8_t l3_len;
1819bd46cf2SDanylo Vodopianov 	uint8_t l4_len;
1826fec9a9aSSerhii Iliushyk };
1836fec9a9aSSerhii Iliushyk 
184e02fdb65SSerhii Iliushyk enum flow_port_type_e {
185e02fdb65SSerhii Iliushyk 	PORT_NONE,	/* not defined or drop */
186e02fdb65SSerhii Iliushyk 	PORT_INTERNAL,	/* no queues attached */
187e02fdb65SSerhii Iliushyk 	PORT_PHY,	/* MAC phy output queue */
188e02fdb65SSerhii Iliushyk 	PORT_VIRT,	/* Memory queues to Host */
189e02fdb65SSerhii Iliushyk };
190e02fdb65SSerhii Iliushyk 
191e02fdb65SSerhii Iliushyk struct output_s {
192e02fdb65SSerhii Iliushyk 	uint32_t owning_port_id;/* the port who owns this output destination */
193e02fdb65SSerhii Iliushyk 	enum flow_port_type_e type;
194e02fdb65SSerhii Iliushyk 	int id;	/* depending on port type: queue ID or physical port id or not used */
195e02fdb65SSerhii Iliushyk 	int active;	/* activated */
196e02fdb65SSerhii Iliushyk };
197e02fdb65SSerhii Iliushyk 
198e02fdb65SSerhii Iliushyk struct nic_flow_def {
199e02fdb65SSerhii Iliushyk 	/*
200e02fdb65SSerhii Iliushyk 	 * Frame Decoder match info collected
201e02fdb65SSerhii Iliushyk 	 */
202e02fdb65SSerhii Iliushyk 	int l2_prot;
203e02fdb65SSerhii Iliushyk 	int l3_prot;
204e02fdb65SSerhii Iliushyk 	int l4_prot;
205e02fdb65SSerhii Iliushyk 	int tunnel_prot;
206e02fdb65SSerhii Iliushyk 	int tunnel_l3_prot;
207e02fdb65SSerhii Iliushyk 	int tunnel_l4_prot;
208e02fdb65SSerhii Iliushyk 	int vlans;
209e02fdb65SSerhii Iliushyk 	int fragmentation;
210e02fdb65SSerhii Iliushyk 	int ip_prot;
211e02fdb65SSerhii Iliushyk 	int tunnel_ip_prot;
212e02fdb65SSerhii Iliushyk 	/*
213e02fdb65SSerhii Iliushyk 	 * Additional meta data for various functions
214e02fdb65SSerhii Iliushyk 	 */
215e02fdb65SSerhii Iliushyk 	int in_port_override;
216e02fdb65SSerhii Iliushyk 	int non_empty;	/* default value is -1; value 1 means flow actions update */
217e02fdb65SSerhii Iliushyk 	struct output_s dst_id[MAX_OUTPUT_DEST];/* define the output to use */
218e02fdb65SSerhii Iliushyk 	/* total number of available queues defined for all outputs - i.e. number of dst_id's */
219e02fdb65SSerhii Iliushyk 	int dst_num_avail;
220e02fdb65SSerhii Iliushyk 
221e02fdb65SSerhii Iliushyk 	/*
222e02fdb65SSerhii Iliushyk 	 * Mark or Action info collection
223e02fdb65SSerhii Iliushyk 	 */
224e02fdb65SSerhii Iliushyk 	uint32_t mark;
225e02fdb65SSerhii Iliushyk 
226e02fdb65SSerhii Iliushyk 	uint32_t jump_to_group;
227e02fdb65SSerhii Iliushyk 
2284033e053SDanylo Vodopianov 	uint32_t mtr_ids[MAX_FLM_MTRS_SUPPORTED];
2294033e053SDanylo Vodopianov 
230e02fdb65SSerhii Iliushyk 	int full_offload;
2316fec9a9aSSerhii Iliushyk 
2326fec9a9aSSerhii Iliushyk 	/*
233c6821abfSDanylo Vodopianov 	 * Action push tunnel
234c6821abfSDanylo Vodopianov 	 */
235c6821abfSDanylo Vodopianov 	struct tunnel_header_s tun_hdr;
236c6821abfSDanylo Vodopianov 
237c6821abfSDanylo Vodopianov 	/*
238c6821abfSDanylo Vodopianov 	 * If DPDK RTE tunnel helper API used
239c6821abfSDanylo Vodopianov 	 * this holds the tunnel if used in flow
240c6821abfSDanylo Vodopianov 	 */
241c6821abfSDanylo Vodopianov 	struct tunnel_s *tnl;
242c6821abfSDanylo Vodopianov 
243c6821abfSDanylo Vodopianov 	/*
244c6821abfSDanylo Vodopianov 	 * Header Stripper
245c6821abfSDanylo Vodopianov 	 */
246c6821abfSDanylo Vodopianov 	int header_strip_end_dyn;
247c6821abfSDanylo Vodopianov 	int header_strip_end_ofs;
248c6821abfSDanylo Vodopianov 
249c6821abfSDanylo Vodopianov 	/*
2506fec9a9aSSerhii Iliushyk 	 * Modify field
2516fec9a9aSSerhii Iliushyk 	 */
2526fec9a9aSSerhii Iliushyk 	struct {
2536fec9a9aSSerhii Iliushyk 		uint32_t select;
254339ca124SDanylo Vodopianov 		uint32_t dyn;
255339ca124SDanylo Vodopianov 		uint32_t ofs;
256339ca124SDanylo Vodopianov 		uint32_t len;
257339ca124SDanylo Vodopianov 		uint32_t level;
2586fec9a9aSSerhii Iliushyk 		union {
2596fec9a9aSSerhii Iliushyk 			uint8_t value8[16];
2606fec9a9aSSerhii Iliushyk 			uint16_t value16[8];
2616fec9a9aSSerhii Iliushyk 			uint32_t value32[4];
2626fec9a9aSSerhii Iliushyk 		};
2636fec9a9aSSerhii Iliushyk 	} modify_field[MAX_CPY_WRITERS_SUPPORTED];
2646fec9a9aSSerhii Iliushyk 
2656fec9a9aSSerhii Iliushyk 	uint32_t modify_field_count;
266339ca124SDanylo Vodopianov 	uint8_t ttl_sub_enable;
267339ca124SDanylo Vodopianov 	uint8_t ttl_sub_ipv4;
268339ca124SDanylo Vodopianov 	uint8_t ttl_sub_outer;
2696fec9a9aSSerhii Iliushyk 
2706fec9a9aSSerhii Iliushyk 	/*
2716fec9a9aSSerhii Iliushyk 	 * Key Matcher flow definitions
2726fec9a9aSSerhii Iliushyk 	 */
2736fec9a9aSSerhii Iliushyk 	struct km_flow_def_s km;
2747fa0bf29SDanylo Vodopianov 
2757fa0bf29SDanylo Vodopianov 	/*
2767fa0bf29SDanylo Vodopianov 	 * Hash module RSS definitions
2777fa0bf29SDanylo Vodopianov 	 */
2787fa0bf29SDanylo Vodopianov 	struct hsh_def_s hsh;
279c0d44442SDanylo Vodopianov 
280c0d44442SDanylo Vodopianov 	/*
281c0d44442SDanylo Vodopianov 	 * AGE action timeout
282c0d44442SDanylo Vodopianov 	 */
283c0d44442SDanylo Vodopianov 	struct age_def_s age;
2846019656dSOleksandr Kolomeiets 
2856019656dSOleksandr Kolomeiets 	/*
2866019656dSOleksandr Kolomeiets 	 * TX fragmentation IFR/RPP_LR MTU recipe
2876019656dSOleksandr Kolomeiets 	 */
2886019656dSOleksandr Kolomeiets 	uint8_t flm_mtu_fragmentation_recipe;
289e02fdb65SSerhii Iliushyk };
290e02fdb65SSerhii Iliushyk 
291e02fdb65SSerhii Iliushyk enum flow_handle_type {
292e02fdb65SSerhii Iliushyk 	FLOW_HANDLE_TYPE_FLOW,
293e02fdb65SSerhii Iliushyk 	FLOW_HANDLE_TYPE_FLM,
294e02fdb65SSerhii Iliushyk };
2958385ba0eSSerhii Iliushyk 
2962005c549SSerhii Iliushyk struct flow_handle {
297e02fdb65SSerhii Iliushyk 	enum flow_handle_type type;
298e02fdb65SSerhii Iliushyk 	uint32_t flm_id;
299e02fdb65SSerhii Iliushyk 	uint16_t caller_id;
300e02fdb65SSerhii Iliushyk 	uint16_t learn_ignored;
301e02fdb65SSerhii Iliushyk 
3022005c549SSerhii Iliushyk 	struct flow_eth_dev *dev;
3032005c549SSerhii Iliushyk 	struct flow_handle *next;
304e02fdb65SSerhii Iliushyk 	struct flow_handle *prev;
305e02fdb65SSerhii Iliushyk 
3066f0fe142SOleksandr Kolomeiets 	/* Flow specific pointer to application data stored during action creation. */
3076f0fe142SOleksandr Kolomeiets 	void *context;
308e02fdb65SSerhii Iliushyk 	void *user_data;
309e02fdb65SSerhii Iliushyk 
310e02fdb65SSerhii Iliushyk 	union {
311e02fdb65SSerhii Iliushyk 		struct {
312e02fdb65SSerhii Iliushyk 			/*
313e02fdb65SSerhii Iliushyk 			 * 1st step conversion and validation of flow
314e02fdb65SSerhii Iliushyk 			 * verified and converted flow match + actions structure
315e02fdb65SSerhii Iliushyk 			 */
316e02fdb65SSerhii Iliushyk 			struct nic_flow_def *fd;
317e02fdb65SSerhii Iliushyk 			/*
318e02fdb65SSerhii Iliushyk 			 * 2nd step NIC HW resource allocation and configuration
319e02fdb65SSerhii Iliushyk 			 * NIC resource management structures
320e02fdb65SSerhii Iliushyk 			 */
321e02fdb65SSerhii Iliushyk 			struct {
322e02fdb65SSerhii Iliushyk 				uint32_t db_idx_counter;
323e02fdb65SSerhii Iliushyk 				uint32_t db_idxs[RES_COUNT];
324e02fdb65SSerhii Iliushyk 			};
325e02fdb65SSerhii Iliushyk 			uint32_t port_id;	/* MAC port ID or override of virtual in_port */
326e02fdb65SSerhii Iliushyk 		};
327e02fdb65SSerhii Iliushyk 
328e02fdb65SSerhii Iliushyk 		struct {
329e02fdb65SSerhii Iliushyk 			uint32_t flm_db_idx_counter;
330e02fdb65SSerhii Iliushyk 			uint32_t flm_db_idxs[RES_COUNT];
331e02fdb65SSerhii Iliushyk 
3324033e053SDanylo Vodopianov 			uint32_t flm_mtr_ids[MAX_FLM_MTRS_SUPPORTED];
3334033e053SDanylo Vodopianov 
334e02fdb65SSerhii Iliushyk 			uint32_t flm_data[10];
335e02fdb65SSerhii Iliushyk 			uint8_t flm_prot;
336e02fdb65SSerhii Iliushyk 			uint8_t flm_kid;
337e02fdb65SSerhii Iliushyk 			uint8_t flm_prio;
338e02fdb65SSerhii Iliushyk 			uint8_t flm_ft;
339e02fdb65SSerhii Iliushyk 
340e02fdb65SSerhii Iliushyk 			uint16_t flm_rpl_ext_ptr;
341e02fdb65SSerhii Iliushyk 			uint32_t flm_nat_ipv4;
342e02fdb65SSerhii Iliushyk 			uint16_t flm_nat_port;
343e02fdb65SSerhii Iliushyk 			uint8_t flm_dscp;
344e02fdb65SSerhii Iliushyk 			uint32_t flm_teid;
345e02fdb65SSerhii Iliushyk 			uint8_t flm_rqi;
346e02fdb65SSerhii Iliushyk 			uint8_t flm_qfi;
347e7e01fd1SDanylo Vodopianov 			uint8_t flm_scrub_prof;
3481042162dSDanylo Vodopianov 
3496019656dSOleksandr Kolomeiets 			uint8_t flm_mtu_fragmentation_recipe;
3506019656dSOleksandr Kolomeiets 
3511042162dSDanylo Vodopianov 			/* Flow specific pointer to application template table cell stored during
3521042162dSDanylo Vodopianov 			 * flow create.
3531042162dSDanylo Vodopianov 			 */
3541042162dSDanylo Vodopianov 			struct flow_template_table_cell *template_table_cell;
3551042162dSDanylo Vodopianov 			bool flm_async;
356e02fdb65SSerhii Iliushyk 		};
357e02fdb65SSerhii Iliushyk 	};
3582005c549SSerhii Iliushyk };
3592005c549SSerhii Iliushyk 
36087b3bb06SDanylo Vodopianov struct flow_pattern_template {
36196d92ae4SDanylo Vodopianov 	struct nic_flow_def *fd;
36287b3bb06SDanylo Vodopianov };
36387b3bb06SDanylo Vodopianov 
36487b3bb06SDanylo Vodopianov struct flow_actions_template {
3651042162dSDanylo Vodopianov 	struct nic_flow_def *fd;
3661042162dSDanylo Vodopianov 
3671042162dSDanylo Vodopianov 	uint32_t num_dest_port;
3681042162dSDanylo Vodopianov 	uint32_t num_queues;
36987b3bb06SDanylo Vodopianov };
3701042162dSDanylo Vodopianov 
3711042162dSDanylo Vodopianov struct flow_template_table_cell {
3721042162dSDanylo Vodopianov 	atomic_int status;
3731042162dSDanylo Vodopianov 	atomic_int counter;
3741042162dSDanylo Vodopianov 
3751042162dSDanylo Vodopianov 	uint32_t flm_db_idx_counter;
3761042162dSDanylo Vodopianov 	uint32_t flm_db_idxs[RES_COUNT];
3771042162dSDanylo Vodopianov 
3781042162dSDanylo Vodopianov 	uint32_t flm_key_id;
3791042162dSDanylo Vodopianov 	uint32_t flm_ft;
3801042162dSDanylo Vodopianov 
3811042162dSDanylo Vodopianov 	uint16_t flm_rpl_ext_ptr;
3821042162dSDanylo Vodopianov 	uint8_t  flm_scrub_prof;
3831042162dSDanylo Vodopianov };
3841042162dSDanylo Vodopianov 
38587b3bb06SDanylo Vodopianov struct flow_template_table {
3861042162dSDanylo Vodopianov 	struct flow_pattern_template **pattern_templates;
3871042162dSDanylo Vodopianov 	uint8_t nb_pattern_templates;
3881042162dSDanylo Vodopianov 
3891042162dSDanylo Vodopianov 	struct flow_actions_template **actions_templates;
3901042162dSDanylo Vodopianov 	uint8_t nb_actions_templates;
3911042162dSDanylo Vodopianov 
3921042162dSDanylo Vodopianov 	struct flow_template_table_cell *pattern_action_pairs;
3931042162dSDanylo Vodopianov 
3941042162dSDanylo Vodopianov 	struct rte_flow_attr attr;
3951042162dSDanylo Vodopianov 	uint16_t forced_vlan_vid;
3961042162dSDanylo Vodopianov 	uint16_t caller_id;
39787b3bb06SDanylo Vodopianov };
39887b3bb06SDanylo Vodopianov 
3999bd46cf2SDanylo Vodopianov void km_attach_ndev_resource_management(struct km_flow_def_s *km, void **handle);
4001d3f62a0SOleksandr Kolomeiets void km_free_ndev_resource_management(void **handle);
4011d3f62a0SOleksandr Kolomeiets 
4026fec9a9aSSerhii Iliushyk int km_add_match_elem(struct km_flow_def_s *km, uint32_t e_word[4], uint32_t e_mask[4],
4036fec9a9aSSerhii Iliushyk 	uint32_t word_len, enum frame_offs_e start, int8_t offset);
4046fec9a9aSSerhii Iliushyk 
4059bd46cf2SDanylo Vodopianov int km_key_create(struct km_flow_def_s *km, uint32_t port_id);
4069bd46cf2SDanylo Vodopianov /*
4079bd46cf2SDanylo Vodopianov  * Compares 2 KM key definitions after first collect validate and optimization.
4089bd46cf2SDanylo Vodopianov  * km is compared against an existing km1.
4099bd46cf2SDanylo Vodopianov  * if identical, km1 flow_type is returned
4109bd46cf2SDanylo Vodopianov  */
4119bd46cf2SDanylo Vodopianov int km_key_compare(struct km_flow_def_s *km, struct km_flow_def_s *km1);
4129bd46cf2SDanylo Vodopianov 
4139bd46cf2SDanylo Vodopianov int km_rcp_set(struct km_flow_def_s *km, int index);
4149bd46cf2SDanylo Vodopianov 
4159bd46cf2SDanylo Vodopianov int km_write_data_match_entry(struct km_flow_def_s *km, uint32_t color);
4169bd46cf2SDanylo Vodopianov int km_clear_data_match_entry(struct km_flow_def_s *km);
4179bd46cf2SDanylo Vodopianov 
4181d3f62a0SOleksandr Kolomeiets void kcc_free_ndev_resource_management(void **handle);
4191d3f62a0SOleksandr Kolomeiets 
4208385ba0eSSerhii Iliushyk /*
4218385ba0eSSerhii Iliushyk  * Group management
4228385ba0eSSerhii Iliushyk  */
4238385ba0eSSerhii Iliushyk int flow_group_handle_create(void **handle, uint32_t group_count);
4248385ba0eSSerhii Iliushyk int flow_group_handle_destroy(void **handle);
425e02fdb65SSerhii Iliushyk 
426e02fdb65SSerhii Iliushyk int flow_group_translate_get(void *handle, uint8_t owner_id, uint8_t port_id, uint32_t group_in,
427e02fdb65SSerhii Iliushyk 	uint32_t *group_out);
428e02fdb65SSerhii Iliushyk 
4291d3f62a0SOleksandr Kolomeiets #endif  /* _FLOW_API_ENGINE_H_ */
430