xref: /dpdk/drivers/net/ntnic/include/flow_api_engine.h (revision c6821abf58e8e53ca800cbe2cbb30c34536dd682)
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,
471d3f62a0SOleksandr Kolomeiets 	RES_INVALID
481d3f62a0SOleksandr Kolomeiets };
491d3f62a0SOleksandr Kolomeiets 
50b01eb812SDanylo Vodopianov /*
51b01eb812SDanylo Vodopianov  * Flow NIC offload management
52b01eb812SDanylo Vodopianov  */
53b01eb812SDanylo Vodopianov #define MAX_OUTPUT_DEST (128)
54b01eb812SDanylo Vodopianov 
558385ba0eSSerhii Iliushyk #define MAX_CPY_WRITERS_SUPPORTED 8
568385ba0eSSerhii Iliushyk 
576fec9a9aSSerhii Iliushyk #define MAX_MATCH_FIELDS 16
586fec9a9aSSerhii Iliushyk 
59*c6821abfSDanylo Vodopianov /*
60*c6821abfSDanylo Vodopianov  * Tunnel encapsulation header definition
61*c6821abfSDanylo Vodopianov  */
62*c6821abfSDanylo Vodopianov #define MAX_TUN_HDR_SIZE 128
63*c6821abfSDanylo Vodopianov struct tunnel_header_s {
64*c6821abfSDanylo Vodopianov 	union {
65*c6821abfSDanylo Vodopianov 		uint8_t hdr8[MAX_TUN_HDR_SIZE];
66*c6821abfSDanylo Vodopianov 		uint32_t hdr32[(MAX_TUN_HDR_SIZE + 3) / 4];
67*c6821abfSDanylo Vodopianov 	} d;
68*c6821abfSDanylo Vodopianov 	uint32_t user_port_id;
69*c6821abfSDanylo Vodopianov 	uint8_t len;
70*c6821abfSDanylo Vodopianov 
71*c6821abfSDanylo Vodopianov 	uint8_t nb_vlans;
72*c6821abfSDanylo Vodopianov 
73*c6821abfSDanylo Vodopianov 	uint8_t ip_version;	/* 4: v4, 6: v6 */
74*c6821abfSDanylo Vodopianov 	uint16_t ip_csum_precalc;
75*c6821abfSDanylo Vodopianov 
76*c6821abfSDanylo Vodopianov 	uint8_t new_outer;
77*c6821abfSDanylo Vodopianov 	uint8_t l2_len;
78*c6821abfSDanylo Vodopianov 	uint8_t l3_len;
79*c6821abfSDanylo Vodopianov 	uint8_t l4_len;
80*c6821abfSDanylo Vodopianov };
81*c6821abfSDanylo Vodopianov 
826fec9a9aSSerhii Iliushyk struct match_elem_s {
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 
926fec9a9aSSerhii Iliushyk struct km_flow_def_s {
936fec9a9aSSerhii Iliushyk 	struct flow_api_backend_s *be;
946fec9a9aSSerhii Iliushyk 
956fec9a9aSSerhii Iliushyk 	/* For collect flow elements and sorting */
966fec9a9aSSerhii Iliushyk 	struct match_elem_s match[MAX_MATCH_FIELDS];
976fec9a9aSSerhii Iliushyk 	int num_ftype_elem;
986fec9a9aSSerhii Iliushyk 
996fec9a9aSSerhii Iliushyk 	/* Flow information */
1006fec9a9aSSerhii Iliushyk 	/* HW input port ID needed for compare. In port must be identical on flow types */
1016fec9a9aSSerhii Iliushyk 	uint32_t port_id;
1026fec9a9aSSerhii Iliushyk };
1036fec9a9aSSerhii Iliushyk 
104e02fdb65SSerhii Iliushyk enum flow_port_type_e {
105e02fdb65SSerhii Iliushyk 	PORT_NONE,	/* not defined or drop */
106e02fdb65SSerhii Iliushyk 	PORT_INTERNAL,	/* no queues attached */
107e02fdb65SSerhii Iliushyk 	PORT_PHY,	/* MAC phy output queue */
108e02fdb65SSerhii Iliushyk 	PORT_VIRT,	/* Memory queues to Host */
109e02fdb65SSerhii Iliushyk };
110e02fdb65SSerhii Iliushyk 
111e02fdb65SSerhii Iliushyk struct output_s {
112e02fdb65SSerhii Iliushyk 	uint32_t owning_port_id;/* the port who owns this output destination */
113e02fdb65SSerhii Iliushyk 	enum flow_port_type_e type;
114e02fdb65SSerhii Iliushyk 	int id;	/* depending on port type: queue ID or physical port id or not used */
115e02fdb65SSerhii Iliushyk 	int active;	/* activated */
116e02fdb65SSerhii Iliushyk };
117e02fdb65SSerhii Iliushyk 
118e02fdb65SSerhii Iliushyk struct nic_flow_def {
119e02fdb65SSerhii Iliushyk 	/*
120e02fdb65SSerhii Iliushyk 	 * Frame Decoder match info collected
121e02fdb65SSerhii Iliushyk 	 */
122e02fdb65SSerhii Iliushyk 	int l2_prot;
123e02fdb65SSerhii Iliushyk 	int l3_prot;
124e02fdb65SSerhii Iliushyk 	int l4_prot;
125e02fdb65SSerhii Iliushyk 	int tunnel_prot;
126e02fdb65SSerhii Iliushyk 	int tunnel_l3_prot;
127e02fdb65SSerhii Iliushyk 	int tunnel_l4_prot;
128e02fdb65SSerhii Iliushyk 	int vlans;
129e02fdb65SSerhii Iliushyk 	int fragmentation;
130e02fdb65SSerhii Iliushyk 	int ip_prot;
131e02fdb65SSerhii Iliushyk 	int tunnel_ip_prot;
132e02fdb65SSerhii Iliushyk 	/*
133e02fdb65SSerhii Iliushyk 	 * Additional meta data for various functions
134e02fdb65SSerhii Iliushyk 	 */
135e02fdb65SSerhii Iliushyk 	int in_port_override;
136e02fdb65SSerhii Iliushyk 	int non_empty;	/* default value is -1; value 1 means flow actions update */
137e02fdb65SSerhii Iliushyk 	struct output_s dst_id[MAX_OUTPUT_DEST];/* define the output to use */
138e02fdb65SSerhii Iliushyk 	/* total number of available queues defined for all outputs - i.e. number of dst_id's */
139e02fdb65SSerhii Iliushyk 	int dst_num_avail;
140e02fdb65SSerhii Iliushyk 
141e02fdb65SSerhii Iliushyk 	/*
142e02fdb65SSerhii Iliushyk 	 * Mark or Action info collection
143e02fdb65SSerhii Iliushyk 	 */
144e02fdb65SSerhii Iliushyk 	uint32_t mark;
145e02fdb65SSerhii Iliushyk 
146e02fdb65SSerhii Iliushyk 	uint32_t jump_to_group;
147e02fdb65SSerhii Iliushyk 
148e02fdb65SSerhii Iliushyk 	int full_offload;
1496fec9a9aSSerhii Iliushyk 
1506fec9a9aSSerhii Iliushyk 	/*
151*c6821abfSDanylo Vodopianov 	 * Action push tunnel
152*c6821abfSDanylo Vodopianov 	 */
153*c6821abfSDanylo Vodopianov 	struct tunnel_header_s tun_hdr;
154*c6821abfSDanylo Vodopianov 
155*c6821abfSDanylo Vodopianov 	/*
156*c6821abfSDanylo Vodopianov 	 * If DPDK RTE tunnel helper API used
157*c6821abfSDanylo Vodopianov 	 * this holds the tunnel if used in flow
158*c6821abfSDanylo Vodopianov 	 */
159*c6821abfSDanylo Vodopianov 	struct tunnel_s *tnl;
160*c6821abfSDanylo Vodopianov 
161*c6821abfSDanylo Vodopianov 	/*
162*c6821abfSDanylo Vodopianov 	 * Header Stripper
163*c6821abfSDanylo Vodopianov 	 */
164*c6821abfSDanylo Vodopianov 	int header_strip_end_dyn;
165*c6821abfSDanylo Vodopianov 	int header_strip_end_ofs;
166*c6821abfSDanylo Vodopianov 
167*c6821abfSDanylo Vodopianov 	/*
1686fec9a9aSSerhii Iliushyk 	 * Modify field
1696fec9a9aSSerhii Iliushyk 	 */
1706fec9a9aSSerhii Iliushyk 	struct {
1716fec9a9aSSerhii Iliushyk 		uint32_t select;
172339ca124SDanylo Vodopianov 		uint32_t dyn;
173339ca124SDanylo Vodopianov 		uint32_t ofs;
174339ca124SDanylo Vodopianov 		uint32_t len;
175339ca124SDanylo Vodopianov 		uint32_t level;
1766fec9a9aSSerhii Iliushyk 		union {
1776fec9a9aSSerhii Iliushyk 			uint8_t value8[16];
1786fec9a9aSSerhii Iliushyk 			uint16_t value16[8];
1796fec9a9aSSerhii Iliushyk 			uint32_t value32[4];
1806fec9a9aSSerhii Iliushyk 		};
1816fec9a9aSSerhii Iliushyk 	} modify_field[MAX_CPY_WRITERS_SUPPORTED];
1826fec9a9aSSerhii Iliushyk 
1836fec9a9aSSerhii Iliushyk 	uint32_t modify_field_count;
184339ca124SDanylo Vodopianov 	uint8_t ttl_sub_enable;
185339ca124SDanylo Vodopianov 	uint8_t ttl_sub_ipv4;
186339ca124SDanylo Vodopianov 	uint8_t ttl_sub_outer;
1876fec9a9aSSerhii Iliushyk 
1886fec9a9aSSerhii Iliushyk 	/*
1896fec9a9aSSerhii Iliushyk 	 * Key Matcher flow definitions
1906fec9a9aSSerhii Iliushyk 	 */
1916fec9a9aSSerhii Iliushyk 	struct km_flow_def_s km;
192e02fdb65SSerhii Iliushyk };
193e02fdb65SSerhii Iliushyk 
194e02fdb65SSerhii Iliushyk enum flow_handle_type {
195e02fdb65SSerhii Iliushyk 	FLOW_HANDLE_TYPE_FLOW,
196e02fdb65SSerhii Iliushyk 	FLOW_HANDLE_TYPE_FLM,
197e02fdb65SSerhii Iliushyk };
1988385ba0eSSerhii Iliushyk 
1992005c549SSerhii Iliushyk struct flow_handle {
200e02fdb65SSerhii Iliushyk 	enum flow_handle_type type;
201e02fdb65SSerhii Iliushyk 	uint32_t flm_id;
202e02fdb65SSerhii Iliushyk 	uint16_t caller_id;
203e02fdb65SSerhii Iliushyk 	uint16_t learn_ignored;
204e02fdb65SSerhii Iliushyk 
2052005c549SSerhii Iliushyk 	struct flow_eth_dev *dev;
2062005c549SSerhii Iliushyk 	struct flow_handle *next;
207e02fdb65SSerhii Iliushyk 	struct flow_handle *prev;
208e02fdb65SSerhii Iliushyk 
209e02fdb65SSerhii Iliushyk 	void *user_data;
210e02fdb65SSerhii Iliushyk 
211e02fdb65SSerhii Iliushyk 	union {
212e02fdb65SSerhii Iliushyk 		struct {
213e02fdb65SSerhii Iliushyk 			/*
214e02fdb65SSerhii Iliushyk 			 * 1st step conversion and validation of flow
215e02fdb65SSerhii Iliushyk 			 * verified and converted flow match + actions structure
216e02fdb65SSerhii Iliushyk 			 */
217e02fdb65SSerhii Iliushyk 			struct nic_flow_def *fd;
218e02fdb65SSerhii Iliushyk 			/*
219e02fdb65SSerhii Iliushyk 			 * 2nd step NIC HW resource allocation and configuration
220e02fdb65SSerhii Iliushyk 			 * NIC resource management structures
221e02fdb65SSerhii Iliushyk 			 */
222e02fdb65SSerhii Iliushyk 			struct {
223e02fdb65SSerhii Iliushyk 				uint32_t db_idx_counter;
224e02fdb65SSerhii Iliushyk 				uint32_t db_idxs[RES_COUNT];
225e02fdb65SSerhii Iliushyk 			};
226e02fdb65SSerhii Iliushyk 			uint32_t port_id;	/* MAC port ID or override of virtual in_port */
227e02fdb65SSerhii Iliushyk 		};
228e02fdb65SSerhii Iliushyk 
229e02fdb65SSerhii Iliushyk 		struct {
230e02fdb65SSerhii Iliushyk 			uint32_t flm_db_idx_counter;
231e02fdb65SSerhii Iliushyk 			uint32_t flm_db_idxs[RES_COUNT];
232e02fdb65SSerhii Iliushyk 
233e02fdb65SSerhii Iliushyk 			uint32_t flm_data[10];
234e02fdb65SSerhii Iliushyk 			uint8_t flm_prot;
235e02fdb65SSerhii Iliushyk 			uint8_t flm_kid;
236e02fdb65SSerhii Iliushyk 			uint8_t flm_prio;
237e02fdb65SSerhii Iliushyk 			uint8_t flm_ft;
238e02fdb65SSerhii Iliushyk 
239e02fdb65SSerhii Iliushyk 			uint16_t flm_rpl_ext_ptr;
240e02fdb65SSerhii Iliushyk 			uint32_t flm_nat_ipv4;
241e02fdb65SSerhii Iliushyk 			uint16_t flm_nat_port;
242e02fdb65SSerhii Iliushyk 			uint8_t flm_dscp;
243e02fdb65SSerhii Iliushyk 			uint32_t flm_teid;
244e02fdb65SSerhii Iliushyk 			uint8_t flm_rqi;
245e02fdb65SSerhii Iliushyk 			uint8_t flm_qfi;
246e02fdb65SSerhii Iliushyk 		};
247e02fdb65SSerhii Iliushyk 	};
2482005c549SSerhii Iliushyk };
2492005c549SSerhii Iliushyk 
2501d3f62a0SOleksandr Kolomeiets void km_free_ndev_resource_management(void **handle);
2511d3f62a0SOleksandr Kolomeiets 
2526fec9a9aSSerhii Iliushyk int km_add_match_elem(struct km_flow_def_s *km, uint32_t e_word[4], uint32_t e_mask[4],
2536fec9a9aSSerhii Iliushyk 	uint32_t word_len, enum frame_offs_e start, int8_t offset);
2546fec9a9aSSerhii Iliushyk 
2551d3f62a0SOleksandr Kolomeiets void kcc_free_ndev_resource_management(void **handle);
2561d3f62a0SOleksandr Kolomeiets 
2578385ba0eSSerhii Iliushyk /*
2588385ba0eSSerhii Iliushyk  * Group management
2598385ba0eSSerhii Iliushyk  */
2608385ba0eSSerhii Iliushyk int flow_group_handle_create(void **handle, uint32_t group_count);
2618385ba0eSSerhii Iliushyk int flow_group_handle_destroy(void **handle);
262e02fdb65SSerhii Iliushyk 
263e02fdb65SSerhii Iliushyk int flow_group_translate_get(void *handle, uint8_t owner_id, uint8_t port_id, uint32_t group_in,
264e02fdb65SSerhii Iliushyk 	uint32_t *group_out);
265e02fdb65SSerhii Iliushyk 
2661d3f62a0SOleksandr Kolomeiets #endif  /* _FLOW_API_ENGINE_H_ */
267