xref: /dpdk/examples/ipsec-secgw/event_helper.h (revision 4b978938168b219346775ff877ac31649a36cba7)
1e0b0e55cSAnoob Joseph /* SPDX-License-Identifier: BSD-3-Clause
2e0b0e55cSAnoob Joseph  * Copyright (C) 2020 Marvell International Ltd.
3e0b0e55cSAnoob Joseph  */
4e0b0e55cSAnoob Joseph #ifndef _EVENT_HELPER_H_
5e0b0e55cSAnoob Joseph #define _EVENT_HELPER_H_
6e0b0e55cSAnoob Joseph 
7e0b0e55cSAnoob Joseph #include <rte_log.h>
8e0b0e55cSAnoob Joseph 
9e0b0e55cSAnoob Joseph #define RTE_LOGTYPE_EH  RTE_LOGTYPE_USER4
10e0b0e55cSAnoob Joseph 
11e0b0e55cSAnoob Joseph #define EH_LOG_ERR(...) \
12e0b0e55cSAnoob Joseph 	RTE_LOG(ERR, EH, \
13e0b0e55cSAnoob Joseph 		RTE_FMT("%s() line %u: " RTE_FMT_HEAD(__VA_ARGS__ ,) "\n", \
14e0b0e55cSAnoob Joseph 			__func__, __LINE__, RTE_FMT_TAIL(__VA_ARGS__ ,)))
15e0b0e55cSAnoob Joseph 
164ce38479SAnoob Joseph #define EH_LOG_INFO(...) \
174ce38479SAnoob Joseph 	RTE_LOG(INFO, EH, \
184ce38479SAnoob Joseph 		RTE_FMT("%s() line %u: " RTE_FMT_HEAD(__VA_ARGS__ ,) "\n", \
194ce38479SAnoob Joseph 			__func__, __LINE__, RTE_FMT_TAIL(__VA_ARGS__ ,)))
204ce38479SAnoob Joseph 
21e0b0e55cSAnoob Joseph /* Max event devices supported */
22e0b0e55cSAnoob Joseph #define EVENT_MODE_MAX_EVENT_DEVS RTE_EVENT_MAX_DEVS
23e0b0e55cSAnoob Joseph 
2402afed59SAnoob Joseph /* Max Rx adapters supported */
2502afed59SAnoob Joseph #define EVENT_MODE_MAX_RX_ADAPTERS RTE_EVENT_MAX_DEVS
2602afed59SAnoob Joseph 
271d89ccf3SAnoob Joseph /* Max Tx adapters supported */
281d89ccf3SAnoob Joseph #define EVENT_MODE_MAX_TX_ADAPTERS RTE_EVENT_MAX_DEVS
291d89ccf3SAnoob Joseph 
3002afed59SAnoob Joseph /* Max Rx adapter connections */
3102afed59SAnoob Joseph #define EVENT_MODE_MAX_CONNECTIONS_PER_ADAPTER 16
3202afed59SAnoob Joseph 
331d89ccf3SAnoob Joseph /* Max Tx adapter connections */
341d89ccf3SAnoob Joseph #define EVENT_MODE_MAX_CONNECTIONS_PER_TX_ADAPTER 16
351d89ccf3SAnoob Joseph 
36d7bcfb97SAnoob Joseph /* Max event queues supported per event device */
37d7bcfb97SAnoob Joseph #define EVENT_MODE_MAX_EVENT_QUEUES_PER_DEV RTE_EVENT_MAX_QUEUES_PER_DEV
38d7bcfb97SAnoob Joseph 
39d7bcfb97SAnoob Joseph /* Max event-lcore links */
40d7bcfb97SAnoob Joseph #define EVENT_MODE_MAX_LCORE_LINKS \
41d7bcfb97SAnoob Joseph 	(EVENT_MODE_MAX_EVENT_DEVS * EVENT_MODE_MAX_EVENT_QUEUES_PER_DEV)
42d7bcfb97SAnoob Joseph 
431bf6baacSLukasz Bartosik /* Max adapters that one Rx core can handle */
441bf6baacSLukasz Bartosik #define EVENT_MODE_MAX_ADAPTERS_PER_RX_CORE EVENT_MODE_MAX_RX_ADAPTERS
451bf6baacSLukasz Bartosik 
461d89ccf3SAnoob Joseph /* Max adapters that one Tx core can handle */
471d89ccf3SAnoob Joseph #define EVENT_MODE_MAX_ADAPTERS_PER_TX_CORE EVENT_MODE_MAX_TX_ADAPTERS
481d89ccf3SAnoob Joseph 
49bc33e9c7SLukasz Bartosik /* Used to indicate that queue schedule type is not set */
50bc33e9c7SLukasz Bartosik #define SCHED_TYPE_NOT_SET	3
51bc33e9c7SLukasz Bartosik 
52e0b0e55cSAnoob Joseph /**
53e0b0e55cSAnoob Joseph  * Packet transfer mode of the application
54e0b0e55cSAnoob Joseph  */
55e0b0e55cSAnoob Joseph enum eh_pkt_transfer_mode {
56e0b0e55cSAnoob Joseph 	EH_PKT_TRANSFER_MODE_POLL = 0,
57e0b0e55cSAnoob Joseph 	EH_PKT_TRANSFER_MODE_EVENT,
58e0b0e55cSAnoob Joseph };
59e0b0e55cSAnoob Joseph 
601bf6baacSLukasz Bartosik /**
611bf6baacSLukasz Bartosik  * Event mode packet rx types
621bf6baacSLukasz Bartosik  */
631bf6baacSLukasz Bartosik enum eh_rx_types {
641bf6baacSLukasz Bartosik 	EH_RX_TYPE_NON_BURST = 0,
651bf6baacSLukasz Bartosik 	EH_RX_TYPE_BURST
661bf6baacSLukasz Bartosik };
671bf6baacSLukasz Bartosik 
68ec3cc53fSLukasz Bartosik /**
69ec3cc53fSLukasz Bartosik  * Event mode packet tx types
70ec3cc53fSLukasz Bartosik  */
71ec3cc53fSLukasz Bartosik enum eh_tx_types {
72ec3cc53fSLukasz Bartosik 	EH_TX_TYPE_INTERNAL_PORT = 0,
73ec3cc53fSLukasz Bartosik 	EH_TX_TYPE_NO_INTERNAL_PORT
74ec3cc53fSLukasz Bartosik };
75ec3cc53fSLukasz Bartosik 
7665e3a202SLukasz Bartosik /**
7765e3a202SLukasz Bartosik  * Event mode ipsec mode types
7865e3a202SLukasz Bartosik  */
7965e3a202SLukasz Bartosik enum eh_ipsec_mode_types {
8065e3a202SLukasz Bartosik 	EH_IPSEC_MODE_TYPE_APP = 0,
8165e3a202SLukasz Bartosik 	EH_IPSEC_MODE_TYPE_DRIVER
8265e3a202SLukasz Bartosik };
8365e3a202SLukasz Bartosik 
84e0b0e55cSAnoob Joseph /* Event dev params */
85e0b0e55cSAnoob Joseph struct eventdev_params {
86e0b0e55cSAnoob Joseph 	uint8_t eventdev_id;
87e0b0e55cSAnoob Joseph 	uint8_t nb_eventqueue;
88e0b0e55cSAnoob Joseph 	uint8_t nb_eventport;
89e0b0e55cSAnoob Joseph 	uint8_t ev_queue_mode;
90ec3cc53fSLukasz Bartosik 	uint8_t all_internal_ports;
91c12871e4SVolodymyr Fialko 	int tx_queue_id;
92c12871e4SVolodymyr Fialko 	int ev_cpt_queue_id;
93e0b0e55cSAnoob Joseph };
94e0b0e55cSAnoob Joseph 
95d7bcfb97SAnoob Joseph /**
96d7bcfb97SAnoob Joseph  * Event-lcore link configuration
97d7bcfb97SAnoob Joseph  */
98d7bcfb97SAnoob Joseph struct eh_event_link_info {
99d7bcfb97SAnoob Joseph 	uint8_t eventdev_id;
100d7bcfb97SAnoob Joseph 		/**< Event device ID */
101d7bcfb97SAnoob Joseph 	uint8_t event_port_id;
102d7bcfb97SAnoob Joseph 		/**< Event port ID */
103d7bcfb97SAnoob Joseph 	uint8_t eventq_id;
104d7bcfb97SAnoob Joseph 		/**< Event queue to be linked to the port */
105*4b978938SSivaprasad Tummala 	uint32_t lcore_id;
106d7bcfb97SAnoob Joseph 		/**< Lcore to be polling on this port */
107d7bcfb97SAnoob Joseph };
108d7bcfb97SAnoob Joseph 
10902afed59SAnoob Joseph /* Rx adapter connection info */
11002afed59SAnoob Joseph struct rx_adapter_connection_info {
11102afed59SAnoob Joseph 	uint8_t ethdev_id;
11202afed59SAnoob Joseph 	uint8_t eventq_id;
11302afed59SAnoob Joseph 	int32_t ethdev_rx_qid;
11402afed59SAnoob Joseph };
11502afed59SAnoob Joseph 
11602afed59SAnoob Joseph /* Rx adapter conf */
11702afed59SAnoob Joseph struct rx_adapter_conf {
11802afed59SAnoob Joseph 	int32_t eventdev_id;
11902afed59SAnoob Joseph 	int32_t adapter_id;
12002afed59SAnoob Joseph 	uint32_t rx_core_id;
12102afed59SAnoob Joseph 	uint8_t nb_connections;
12202afed59SAnoob Joseph 	struct rx_adapter_connection_info
12302afed59SAnoob Joseph 			conn[EVENT_MODE_MAX_CONNECTIONS_PER_ADAPTER];
12402afed59SAnoob Joseph };
12502afed59SAnoob Joseph 
1261d89ccf3SAnoob Joseph /* Tx adapter connection info */
1271d89ccf3SAnoob Joseph struct tx_adapter_connection_info {
1281d89ccf3SAnoob Joseph 	uint8_t ethdev_id;
1291d89ccf3SAnoob Joseph 	int32_t ethdev_tx_qid;
1301d89ccf3SAnoob Joseph };
1311d89ccf3SAnoob Joseph 
1321d89ccf3SAnoob Joseph /* Tx adapter conf */
1331d89ccf3SAnoob Joseph struct tx_adapter_conf {
1341d89ccf3SAnoob Joseph 	int32_t eventdev_id;
1351d89ccf3SAnoob Joseph 	int32_t adapter_id;
1361d89ccf3SAnoob Joseph 	uint32_t tx_core_id;
1371d89ccf3SAnoob Joseph 	uint8_t nb_connections;
1381d89ccf3SAnoob Joseph 	struct tx_adapter_connection_info
1391d89ccf3SAnoob Joseph 			conn[EVENT_MODE_MAX_CONNECTIONS_PER_TX_ADAPTER];
1401d89ccf3SAnoob Joseph 	uint8_t tx_ev_queue;
1411d89ccf3SAnoob Joseph };
1421d89ccf3SAnoob Joseph 
143e0b0e55cSAnoob Joseph /* Eventmode conf data */
144e0b0e55cSAnoob Joseph struct eventmode_conf {
145e0b0e55cSAnoob Joseph 	int nb_eventdev;
146e0b0e55cSAnoob Joseph 		/**< No of event devs */
147e0b0e55cSAnoob Joseph 	struct eventdev_params eventdev_config[EVENT_MODE_MAX_EVENT_DEVS];
148e0b0e55cSAnoob Joseph 		/**< Per event dev conf */
14902afed59SAnoob Joseph 	uint8_t nb_rx_adapter;
15002afed59SAnoob Joseph 		/**< No of Rx adapters */
15102afed59SAnoob Joseph 	struct rx_adapter_conf rx_adapter[EVENT_MODE_MAX_RX_ADAPTERS];
15202afed59SAnoob Joseph 		/**< Rx adapter conf */
1531d89ccf3SAnoob Joseph 	uint8_t nb_tx_adapter;
1541d89ccf3SAnoob Joseph 		/**< No of Tx adapters */
1551d89ccf3SAnoob Joseph 	struct tx_adapter_conf tx_adapter[EVENT_MODE_MAX_TX_ADAPTERS];
1561d89ccf3SAnoob Joseph 		/** Tx adapter conf */
157d7bcfb97SAnoob Joseph 	uint8_t nb_link;
158d7bcfb97SAnoob Joseph 		/**< No of links */
159d7bcfb97SAnoob Joseph 	struct eh_event_link_info
160d7bcfb97SAnoob Joseph 		link[EVENT_MODE_MAX_LCORE_LINKS];
161d7bcfb97SAnoob Joseph 		/**< Per link conf */
162d7bcfb97SAnoob Joseph 	struct rte_bitmap *eth_core_mask;
163d7bcfb97SAnoob Joseph 		/**< Core mask of cores to be used for software Rx and Tx */
16402afed59SAnoob Joseph 	uint32_t eth_portmask;
16502afed59SAnoob Joseph 		/**< Mask of the eth ports to be used */
166e0b0e55cSAnoob Joseph 	union {
167e0b0e55cSAnoob Joseph 		struct {
168e0b0e55cSAnoob Joseph 			uint64_t sched_type			: 2;
169e0b0e55cSAnoob Joseph 		/**< Schedule type */
170d7bcfb97SAnoob Joseph 			uint64_t all_ev_queue_to_ev_port	: 1;
171d7bcfb97SAnoob Joseph 		/**<
172d7bcfb97SAnoob Joseph 		 * When enabled, all event queues need to be mapped to
173d7bcfb97SAnoob Joseph 		 * each event port
174d7bcfb97SAnoob Joseph 		 */
17586738ebeSSrujana Challa 			uint64_t event_vector                   : 1;
17686738ebeSSrujana Challa 		/**<
17786738ebeSSrujana Challa 		 * Enable event vector, when enabled application can
17886738ebeSSrujana Challa 		 * receive vector of events.
17986738ebeSSrujana Challa 		 */
18086738ebeSSrujana Challa 			uint64_t vector_size                    : 16;
181e0b0e55cSAnoob Joseph 		};
182e0b0e55cSAnoob Joseph 		uint64_t u64;
183e0b0e55cSAnoob Joseph 	} ext_params;
184e0b0e55cSAnoob Joseph 		/**< 64 bit field to specify extended params */
18586738ebeSSrujana Challa 	uint64_t vector_tmo_ns;
18686738ebeSSrujana Challa 		/**< Max vector timeout in nanoseconds */
18748a39871SNithin Dabilpuram 	uint64_t vector_pool_sz;
18848a39871SNithin Dabilpuram 		/**< Vector pool size */
1890dbe550aSVolodymyr Fialko 	bool enable_event_crypto_adapter;
1900dbe550aSVolodymyr Fialko 		/**< Enables event crypto adapter related configuration */
191e0b0e55cSAnoob Joseph };
192e0b0e55cSAnoob Joseph 
193e0b0e55cSAnoob Joseph /**
194e0b0e55cSAnoob Joseph  * Event helper configuration
195e0b0e55cSAnoob Joseph  */
196e0b0e55cSAnoob Joseph struct eh_conf {
197e0b0e55cSAnoob Joseph 	enum eh_pkt_transfer_mode mode;
198e0b0e55cSAnoob Joseph 		/**< Packet transfer mode of the application */
199e0b0e55cSAnoob Joseph 	uint32_t eth_portmask;
200e0b0e55cSAnoob Joseph 		/**<
201e0b0e55cSAnoob Joseph 		 * Mask of the eth ports to be used. This portmask would be
202e0b0e55cSAnoob Joseph 		 * checked while initializing devices using helper routines.
203e0b0e55cSAnoob Joseph 		 */
204e0b0e55cSAnoob Joseph 	void *mode_params;
205e0b0e55cSAnoob Joseph 		/**< Mode specific parameters */
20665e3a202SLukasz Bartosik 
20765e3a202SLukasz Bartosik 		/** Application specific params */
20865e3a202SLukasz Bartosik 	enum eh_ipsec_mode_types ipsec_mode;
20965e3a202SLukasz Bartosik 		/**< Mode of ipsec run */
210e0b0e55cSAnoob Joseph };
211e0b0e55cSAnoob Joseph 
2121bf6baacSLukasz Bartosik /* Workers registered by the application */
2131bf6baacSLukasz Bartosik struct eh_app_worker_params {
2141bf6baacSLukasz Bartosik 	union {
2151bf6baacSLukasz Bartosik 		struct {
2161bf6baacSLukasz Bartosik 			uint64_t burst : 1;
2171bf6baacSLukasz Bartosik 			/**< Specify status of rx type burst */
218ec3cc53fSLukasz Bartosik 			uint64_t tx_internal_port : 1;
219ec3cc53fSLukasz Bartosik 			/**< Specify whether tx internal port is available */
22065e3a202SLukasz Bartosik 			uint64_t ipsec_mode : 1;
22165e3a202SLukasz Bartosik 			/**< Specify ipsec processing level */
2221bf6baacSLukasz Bartosik 		};
2231bf6baacSLukasz Bartosik 		uint64_t u64;
2241bf6baacSLukasz Bartosik 	} cap;
2251bf6baacSLukasz Bartosik 			/**< Capabilities of this worker */
2261bf6baacSLukasz Bartosik 	void (*worker_thread)(struct eh_event_link_info *links,
2271bf6baacSLukasz Bartosik 			uint8_t nb_links);
2281bf6baacSLukasz Bartosik 			/**< Worker thread */
2291bf6baacSLukasz Bartosik };
2301bf6baacSLukasz Bartosik 
231e0b0e55cSAnoob Joseph /**
232bc33e9c7SLukasz Bartosik  * Allocate memory for event helper configuration and initialize
233bc33e9c7SLukasz Bartosik  * it with default values.
234bc33e9c7SLukasz Bartosik  *
235bc33e9c7SLukasz Bartosik  * @return
236bc33e9c7SLukasz Bartosik  * - pointer to event helper configuration structure on success.
237bc33e9c7SLukasz Bartosik  * - NULL on failure.
238bc33e9c7SLukasz Bartosik  */
239bc33e9c7SLukasz Bartosik struct eh_conf *
240bc33e9c7SLukasz Bartosik eh_conf_init(void);
241bc33e9c7SLukasz Bartosik 
242bc33e9c7SLukasz Bartosik /**
243bc33e9c7SLukasz Bartosik  * Uninitialize event helper configuration and release its memory
244bc33e9c7SLukasz Bartosik . *
245bc33e9c7SLukasz Bartosik  * @param conf
246bc33e9c7SLukasz Bartosik  *   Event helper configuration
247bc33e9c7SLukasz Bartosik  */
248bc33e9c7SLukasz Bartosik void
249bc33e9c7SLukasz Bartosik eh_conf_uninit(struct eh_conf *conf);
250bc33e9c7SLukasz Bartosik 
251bc33e9c7SLukasz Bartosik /**
252e0b0e55cSAnoob Joseph  * Initialize event mode devices
253e0b0e55cSAnoob Joseph  *
254e0b0e55cSAnoob Joseph  * Application can call this function to get the event devices, eth devices
255e0b0e55cSAnoob Joseph  * and eth rx & tx adapters initialized according to the default config or
256e0b0e55cSAnoob Joseph  * config populated using the command line args.
257e0b0e55cSAnoob Joseph  *
258e0b0e55cSAnoob Joseph  * Application is expected to initialize the eth devices and then the event
259e0b0e55cSAnoob Joseph  * mode helper subsystem will stop & start eth devices according to its
260e0b0e55cSAnoob Joseph  * requirement. Call to this function should be done after the eth devices
261e0b0e55cSAnoob Joseph  * are successfully initialized.
262e0b0e55cSAnoob Joseph  *
263e0b0e55cSAnoob Joseph  * @param conf
264e0b0e55cSAnoob Joseph  *   Event helper configuration
265e0b0e55cSAnoob Joseph  * @return
266e0b0e55cSAnoob Joseph  *  - 0 on success.
267e0b0e55cSAnoob Joseph  *  - (<0) on failure.
268e0b0e55cSAnoob Joseph  */
269e0b0e55cSAnoob Joseph int32_t
270e0b0e55cSAnoob Joseph eh_devs_init(struct eh_conf *conf);
271e0b0e55cSAnoob Joseph 
272e0b0e55cSAnoob Joseph /**
273e0b0e55cSAnoob Joseph  * Release event mode devices
274e0b0e55cSAnoob Joseph  *
275e0b0e55cSAnoob Joseph  * Application can call this function to release event devices,
276e0b0e55cSAnoob Joseph  * eth rx & tx adapters according to the config.
277e0b0e55cSAnoob Joseph  *
278e0b0e55cSAnoob Joseph  * Call to this function should be done before application stops
279e0b0e55cSAnoob Joseph  * and closes eth devices. This function will not close and stop
280e0b0e55cSAnoob Joseph  * eth devices.
281e0b0e55cSAnoob Joseph  *
282e0b0e55cSAnoob Joseph  * @param conf
283e0b0e55cSAnoob Joseph  *   Event helper configuration
284e0b0e55cSAnoob Joseph  * @return
285e0b0e55cSAnoob Joseph  *  - 0 on success.
286e0b0e55cSAnoob Joseph  *  - (<0) on failure.
287e0b0e55cSAnoob Joseph  */
288e0b0e55cSAnoob Joseph int32_t
289e0b0e55cSAnoob Joseph eh_devs_uninit(struct eh_conf *conf);
290e0b0e55cSAnoob Joseph 
2911d89ccf3SAnoob Joseph /**
2921d89ccf3SAnoob Joseph  * Get eventdev tx queue
2931d89ccf3SAnoob Joseph  *
2941d89ccf3SAnoob Joseph  * If the application uses event device which does not support internal port
2951d89ccf3SAnoob Joseph  * then it needs to submit the events to a Tx queue before final transmission.
2961d89ccf3SAnoob Joseph  * This Tx queue will be created internally by the eventmode helper subsystem,
2971d89ccf3SAnoob Joseph  * and application will need its queue ID when it runs the execution loop.
2981d89ccf3SAnoob Joseph  *
2991d89ccf3SAnoob Joseph  * @param mode_conf
3001d89ccf3SAnoob Joseph  *   Event helper configuration
3011d89ccf3SAnoob Joseph  * @param eventdev_id
3021d89ccf3SAnoob Joseph  *   Event device ID
3031d89ccf3SAnoob Joseph  * @return
3041d89ccf3SAnoob Joseph  *   Tx queue ID
3051d89ccf3SAnoob Joseph  */
3061d89ccf3SAnoob Joseph uint8_t
3071d89ccf3SAnoob Joseph eh_get_tx_queue(struct eh_conf *conf, uint8_t eventdev_id);
3081d89ccf3SAnoob Joseph 
3094ce38479SAnoob Joseph /**
3104ce38479SAnoob Joseph  * Display event mode configuration
3114ce38479SAnoob Joseph  *
3124ce38479SAnoob Joseph  * @param conf
3134ce38479SAnoob Joseph  *   Event helper configuration
3144ce38479SAnoob Joseph  */
3154ce38479SAnoob Joseph void
3164ce38479SAnoob Joseph eh_display_conf(struct eh_conf *conf);
3174ce38479SAnoob Joseph 
3181bf6baacSLukasz Bartosik 
3191bf6baacSLukasz Bartosik /**
3201bf6baacSLukasz Bartosik  * Launch eventmode worker
3211bf6baacSLukasz Bartosik  *
3221bf6baacSLukasz Bartosik  * The application can request the eventmode helper subsystem to launch the
3231bf6baacSLukasz Bartosik  * worker based on the capabilities of event device and the options selected
3241bf6baacSLukasz Bartosik  * while initializing the eventmode.
3251bf6baacSLukasz Bartosik  *
3261bf6baacSLukasz Bartosik  * @param conf
3271bf6baacSLukasz Bartosik  *   Event helper configuration
3281bf6baacSLukasz Bartosik  * @param app_wrkr
3291bf6baacSLukasz Bartosik  *   List of all the workers registered by application, along with its
3301bf6baacSLukasz Bartosik  *   capabilities
3311bf6baacSLukasz Bartosik  * @param nb_wrkr_param
3321bf6baacSLukasz Bartosik  *   Number of workers passed by the application
3331bf6baacSLukasz Bartosik  *
3341bf6baacSLukasz Bartosik  */
3351bf6baacSLukasz Bartosik void
3361bf6baacSLukasz Bartosik eh_launch_worker(struct eh_conf *conf, struct eh_app_worker_params *app_wrkr,
3371bf6baacSLukasz Bartosik 		uint8_t nb_wrkr_param);
3381bf6baacSLukasz Bartosik 
339e0b0e55cSAnoob Joseph #endif /* _EVENT_HELPER_H_ */
340