xref: /dpdk/examples/ipsec-secgw/event_helper.c (revision 6cf329f9d8c2eb97c8f39becd514c14b25251ac1)
1e0b0e55cSAnoob Joseph /* SPDX-License-Identifier: BSD-3-Clause
2e0b0e55cSAnoob Joseph  * Copyright (C) 2020 Marvell International Ltd.
3e0b0e55cSAnoob Joseph  */
472b452c5SDmitry Kozlyuk #include <stdlib.h>
572b452c5SDmitry Kozlyuk 
6d7bcfb97SAnoob Joseph #include <rte_bitmap.h>
70dbe550aSVolodymyr Fialko #include <rte_cryptodev.h>
8e0b0e55cSAnoob Joseph #include <rte_ethdev.h>
9e0b0e55cSAnoob Joseph #include <rte_eventdev.h>
100dbe550aSVolodymyr Fialko #include <rte_event_crypto_adapter.h>
1102afed59SAnoob Joseph #include <rte_event_eth_rx_adapter.h>
121d89ccf3SAnoob Joseph #include <rte_event_eth_tx_adapter.h>
13d7bcfb97SAnoob Joseph #include <rte_malloc.h>
1402afed59SAnoob Joseph #include <stdbool.h>
15e0b0e55cSAnoob Joseph 
16e0b0e55cSAnoob Joseph #include "event_helper.h"
1786738ebeSSrujana Challa #include "ipsec-secgw.h"
1886738ebeSSrujana Challa 
1986738ebeSSrujana Challa #define DEFAULT_VECTOR_SIZE  16
2086738ebeSSrujana Challa #define DEFAULT_VECTOR_TMO   102400
21e0b0e55cSAnoob Joseph 
22c12871e4SVolodymyr Fialko #define INVALID_EV_QUEUE_ID -1
23c12871e4SVolodymyr Fialko 
241bf6baacSLukasz Bartosik static volatile bool eth_core_running;
251bf6baacSLukasz Bartosik 
2602afed59SAnoob Joseph static int
2702afed59SAnoob Joseph eh_get_enabled_cores(struct rte_bitmap *eth_core_mask)
2802afed59SAnoob Joseph {
2902afed59SAnoob Joseph 	int i, count = 0;
3002afed59SAnoob Joseph 
3102afed59SAnoob Joseph 	RTE_LCORE_FOREACH(i) {
3202afed59SAnoob Joseph 		/* Check if this core is enabled in core mask*/
3302afed59SAnoob Joseph 		if (rte_bitmap_get(eth_core_mask, i)) {
3402afed59SAnoob Joseph 			/* Found enabled core */
3502afed59SAnoob Joseph 			count++;
3602afed59SAnoob Joseph 		}
3702afed59SAnoob Joseph 	}
3802afed59SAnoob Joseph 	return count;
3902afed59SAnoob Joseph }
4002afed59SAnoob Joseph 
4102afed59SAnoob Joseph static inline unsigned int
4202afed59SAnoob Joseph eh_get_next_eth_core(struct eventmode_conf *em_conf)
4302afed59SAnoob Joseph {
4402afed59SAnoob Joseph 	static unsigned int prev_core = -1;
4502afed59SAnoob Joseph 	unsigned int next_core;
4602afed59SAnoob Joseph 
4702afed59SAnoob Joseph 	/*
4802afed59SAnoob Joseph 	 * Make sure we have at least one eth core running, else the following
4902afed59SAnoob Joseph 	 * logic would lead to an infinite loop.
5002afed59SAnoob Joseph 	 */
5102afed59SAnoob Joseph 	if (eh_get_enabled_cores(em_conf->eth_core_mask) == 0) {
5202afed59SAnoob Joseph 		EH_LOG_ERR("No enabled eth core found");
5302afed59SAnoob Joseph 		return RTE_MAX_LCORE;
5402afed59SAnoob Joseph 	}
5502afed59SAnoob Joseph 
5602afed59SAnoob Joseph 	/* Only some cores are marked as eth cores, skip others */
5702afed59SAnoob Joseph 	do {
5802afed59SAnoob Joseph 		/* Get the next core */
5902afed59SAnoob Joseph 		next_core = rte_get_next_lcore(prev_core, 0, 1);
6002afed59SAnoob Joseph 
6102afed59SAnoob Joseph 		/* Check if we have reached max lcores */
6202afed59SAnoob Joseph 		if (next_core == RTE_MAX_LCORE)
6302afed59SAnoob Joseph 			return next_core;
6402afed59SAnoob Joseph 
6502afed59SAnoob Joseph 		/* Update prev_core */
6602afed59SAnoob Joseph 		prev_core = next_core;
6702afed59SAnoob Joseph 	} while (!(rte_bitmap_get(em_conf->eth_core_mask, next_core)));
6802afed59SAnoob Joseph 
6902afed59SAnoob Joseph 	return next_core;
7002afed59SAnoob Joseph }
7102afed59SAnoob Joseph 
72d7bcfb97SAnoob Joseph static inline unsigned int
73d7bcfb97SAnoob Joseph eh_get_next_active_core(struct eventmode_conf *em_conf, unsigned int prev_core)
74d7bcfb97SAnoob Joseph {
75d7bcfb97SAnoob Joseph 	unsigned int next_core;
76d7bcfb97SAnoob Joseph 
77d7bcfb97SAnoob Joseph 	/* Get next active core skipping cores reserved as eth cores */
78d7bcfb97SAnoob Joseph 	do {
79d7bcfb97SAnoob Joseph 		/* Get the next core */
80d7bcfb97SAnoob Joseph 		next_core = rte_get_next_lcore(prev_core, 0, 0);
81d7bcfb97SAnoob Joseph 
82d7bcfb97SAnoob Joseph 		/* Check if we have reached max lcores */
83d7bcfb97SAnoob Joseph 		if (next_core == RTE_MAX_LCORE)
84d7bcfb97SAnoob Joseph 			return next_core;
85d7bcfb97SAnoob Joseph 
86d7bcfb97SAnoob Joseph 		prev_core = next_core;
87d7bcfb97SAnoob Joseph 	} while (rte_bitmap_get(em_conf->eth_core_mask, next_core));
88d7bcfb97SAnoob Joseph 
89d7bcfb97SAnoob Joseph 	return next_core;
90d7bcfb97SAnoob Joseph }
91d7bcfb97SAnoob Joseph 
921d89ccf3SAnoob Joseph static struct eventdev_params *
931d89ccf3SAnoob Joseph eh_get_eventdev_params(struct eventmode_conf *em_conf, uint8_t eventdev_id)
941d89ccf3SAnoob Joseph {
951d89ccf3SAnoob Joseph 	int i;
961d89ccf3SAnoob Joseph 
971d89ccf3SAnoob Joseph 	for (i = 0; i < em_conf->nb_eventdev; i++) {
981d89ccf3SAnoob Joseph 		if (em_conf->eventdev_config[i].eventdev_id == eventdev_id)
991d89ccf3SAnoob Joseph 			break;
1001d89ccf3SAnoob Joseph 	}
1011d89ccf3SAnoob Joseph 
1021d89ccf3SAnoob Joseph 	/* No match */
1031d89ccf3SAnoob Joseph 	if (i == em_conf->nb_eventdev)
1041d89ccf3SAnoob Joseph 		return NULL;
1051d89ccf3SAnoob Joseph 
1061d89ccf3SAnoob Joseph 	return &(em_conf->eventdev_config[i]);
1071d89ccf3SAnoob Joseph }
108ec3cc53fSLukasz Bartosik 
109ec3cc53fSLukasz Bartosik static inline bool
110ec3cc53fSLukasz Bartosik eh_dev_has_rx_internal_port(uint8_t eventdev_id)
111ec3cc53fSLukasz Bartosik {
112ec3cc53fSLukasz Bartosik 	bool flag = true;
113f5ad5016SAnkur Dwivedi 	int j, ret;
114ec3cc53fSLukasz Bartosik 
115ec3cc53fSLukasz Bartosik 	RTE_ETH_FOREACH_DEV(j) {
116ec3cc53fSLukasz Bartosik 		uint32_t caps = 0;
117ec3cc53fSLukasz Bartosik 
118f5ad5016SAnkur Dwivedi 		ret = rte_event_eth_rx_adapter_caps_get(eventdev_id, j, &caps);
119f5ad5016SAnkur Dwivedi 		if (ret < 0)
120f5ad5016SAnkur Dwivedi 			return false;
121f5ad5016SAnkur Dwivedi 
122ec3cc53fSLukasz Bartosik 		if (!(caps & RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT))
123ec3cc53fSLukasz Bartosik 			flag = false;
124ec3cc53fSLukasz Bartosik 	}
125ec3cc53fSLukasz Bartosik 	return flag;
126ec3cc53fSLukasz Bartosik }
127ec3cc53fSLukasz Bartosik 
128ec3cc53fSLukasz Bartosik static inline bool
129ec3cc53fSLukasz Bartosik eh_dev_has_tx_internal_port(uint8_t eventdev_id)
130ec3cc53fSLukasz Bartosik {
131ec3cc53fSLukasz Bartosik 	bool flag = true;
132f5ad5016SAnkur Dwivedi 	int j, ret;
133ec3cc53fSLukasz Bartosik 
134ec3cc53fSLukasz Bartosik 	RTE_ETH_FOREACH_DEV(j) {
135ec3cc53fSLukasz Bartosik 		uint32_t caps = 0;
136ec3cc53fSLukasz Bartosik 
137f5ad5016SAnkur Dwivedi 		ret = rte_event_eth_tx_adapter_caps_get(eventdev_id, j, &caps);
138f5ad5016SAnkur Dwivedi 		if (ret < 0)
139f5ad5016SAnkur Dwivedi 			return false;
140f5ad5016SAnkur Dwivedi 
141ec3cc53fSLukasz Bartosik 		if (!(caps & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT))
142ec3cc53fSLukasz Bartosik 			flag = false;
143ec3cc53fSLukasz Bartosik 	}
144ec3cc53fSLukasz Bartosik 	return flag;
145ec3cc53fSLukasz Bartosik }
146ec3cc53fSLukasz Bartosik 
1471bf6baacSLukasz Bartosik static inline bool
1481bf6baacSLukasz Bartosik eh_dev_has_burst_mode(uint8_t dev_id)
1491bf6baacSLukasz Bartosik {
1501bf6baacSLukasz Bartosik 	struct rte_event_dev_info dev_info;
1511bf6baacSLukasz Bartosik 
1521bf6baacSLukasz Bartosik 	rte_event_dev_info_get(dev_id, &dev_info);
1531bf6baacSLukasz Bartosik 	return (dev_info.event_dev_cap & RTE_EVENT_DEV_CAP_BURST_MODE) ?
1541bf6baacSLukasz Bartosik 			true : false;
1551bf6baacSLukasz Bartosik }
1561bf6baacSLukasz Bartosik 
157e0b0e55cSAnoob Joseph static int
158c12871e4SVolodymyr Fialko eh_set_nb_eventdev(struct eventmode_conf *em_conf)
159e0b0e55cSAnoob Joseph {
160e0b0e55cSAnoob Joseph 	struct eventdev_params *eventdev_config;
161c12871e4SVolodymyr Fialko 	int nb_eventdev;
162e0b0e55cSAnoob Joseph 
163e0b0e55cSAnoob Joseph 	/* Get the number of event devices */
164e0b0e55cSAnoob Joseph 	nb_eventdev = rte_event_dev_count();
165e0b0e55cSAnoob Joseph 	if (nb_eventdev == 0) {
166e0b0e55cSAnoob Joseph 		EH_LOG_ERR("No event devices detected");
167e0b0e55cSAnoob Joseph 		return -EINVAL;
168e0b0e55cSAnoob Joseph 	}
169e0b0e55cSAnoob Joseph 
170e0b0e55cSAnoob Joseph 	if (nb_eventdev != 1) {
171e0b0e55cSAnoob Joseph 		EH_LOG_ERR("Event mode does not support multiple event devices. "
172e0b0e55cSAnoob Joseph 			   "Please provide only one event device.");
173e0b0e55cSAnoob Joseph 		return -EINVAL;
174e0b0e55cSAnoob Joseph 	}
175e0b0e55cSAnoob Joseph 
176c12871e4SVolodymyr Fialko 	/* Set event dev id*/
177c12871e4SVolodymyr Fialko 	eventdev_config = &(em_conf->eventdev_config[0]);
178c12871e4SVolodymyr Fialko 	eventdev_config->eventdev_id = 0;
179c12871e4SVolodymyr Fialko 
180c12871e4SVolodymyr Fialko 	/* Update the number of event devices */
181c12871e4SVolodymyr Fialko 	em_conf->nb_eventdev = 1;
182c12871e4SVolodymyr Fialko 
183c12871e4SVolodymyr Fialko 	return 0;
184c12871e4SVolodymyr Fialko }
185c12871e4SVolodymyr Fialko 
186c12871e4SVolodymyr Fialko static int
187c12871e4SVolodymyr Fialko eh_set_default_conf_eventdev(struct eventmode_conf *em_conf)
188c12871e4SVolodymyr Fialko {
189c12871e4SVolodymyr Fialko 	int lcore_count, nb_eth_dev, ret;
190c12871e4SVolodymyr Fialko 	struct eventdev_params *eventdev_config;
191c12871e4SVolodymyr Fialko 	struct rte_event_dev_info dev_info;
192c12871e4SVolodymyr Fialko 
193e0b0e55cSAnoob Joseph 	/* Get the number of eth devs */
194e0b0e55cSAnoob Joseph 	nb_eth_dev = rte_eth_dev_count_avail();
195e0b0e55cSAnoob Joseph 	if (nb_eth_dev == 0) {
196e0b0e55cSAnoob Joseph 		EH_LOG_ERR("No eth devices detected");
197e0b0e55cSAnoob Joseph 		return -EINVAL;
198e0b0e55cSAnoob Joseph 	}
199e0b0e55cSAnoob Joseph 
200e0b0e55cSAnoob Joseph 	/* Get the number of lcores */
201e0b0e55cSAnoob Joseph 	lcore_count = rte_lcore_count();
202e0b0e55cSAnoob Joseph 
203e0b0e55cSAnoob Joseph 	/* Read event device info */
204e0b0e55cSAnoob Joseph 	ret = rte_event_dev_info_get(0, &dev_info);
205e0b0e55cSAnoob Joseph 	if (ret < 0) {
206e0b0e55cSAnoob Joseph 		EH_LOG_ERR("Failed to read event device info %d", ret);
207e0b0e55cSAnoob Joseph 		return ret;
208e0b0e55cSAnoob Joseph 	}
209e0b0e55cSAnoob Joseph 
210e0b0e55cSAnoob Joseph 	/* Check if enough ports are available */
211e0b0e55cSAnoob Joseph 	if (dev_info.max_event_ports < 2) {
212e0b0e55cSAnoob Joseph 		EH_LOG_ERR("Not enough event ports available");
213e0b0e55cSAnoob Joseph 		return -EINVAL;
214e0b0e55cSAnoob Joseph 	}
215e0b0e55cSAnoob Joseph 
216e0b0e55cSAnoob Joseph 	/* Get the first event dev conf */
217e0b0e55cSAnoob Joseph 	eventdev_config = &(em_conf->eventdev_config[0]);
218e0b0e55cSAnoob Joseph 
219e0b0e55cSAnoob Joseph 	/* Save number of queues & ports available */
220c12871e4SVolodymyr Fialko 	eventdev_config->nb_eventqueue = nb_eth_dev;
221e0b0e55cSAnoob Joseph 	eventdev_config->nb_eventport = dev_info.max_event_ports;
222e0b0e55cSAnoob Joseph 	eventdev_config->ev_queue_mode = RTE_EVENT_QUEUE_CFG_ALL_TYPES;
223e0b0e55cSAnoob Joseph 
224e0b0e55cSAnoob Joseph 	/* One queue is reserved for Tx */
225c12871e4SVolodymyr Fialko 	eventdev_config->tx_queue_id = INVALID_EV_QUEUE_ID;
226c12871e4SVolodymyr Fialko 	if (eventdev_config->all_internal_ports) {
227c12871e4SVolodymyr Fialko 		if (eventdev_config->nb_eventqueue >= dev_info.max_event_queues) {
228c12871e4SVolodymyr Fialko 			EH_LOG_ERR("Not enough event queues available");
229c12871e4SVolodymyr Fialko 			return -EINVAL;
230c12871e4SVolodymyr Fialko 		}
231c12871e4SVolodymyr Fialko 		eventdev_config->tx_queue_id =
232c12871e4SVolodymyr Fialko 			eventdev_config->nb_eventqueue++;
233c12871e4SVolodymyr Fialko 	}
234c12871e4SVolodymyr Fialko 
235c12871e4SVolodymyr Fialko 	/* One queue is reserved for event crypto adapter */
236c12871e4SVolodymyr Fialko 	eventdev_config->ev_cpt_queue_id = INVALID_EV_QUEUE_ID;
237c12871e4SVolodymyr Fialko 	if (em_conf->enable_event_crypto_adapter) {
238c12871e4SVolodymyr Fialko 		if (eventdev_config->nb_eventqueue >= dev_info.max_event_queues) {
239c12871e4SVolodymyr Fialko 			EH_LOG_ERR("Not enough event queues available");
240c12871e4SVolodymyr Fialko 			return -EINVAL;
241c12871e4SVolodymyr Fialko 		}
242c12871e4SVolodymyr Fialko 		eventdev_config->ev_cpt_queue_id =
243c12871e4SVolodymyr Fialko 			eventdev_config->nb_eventqueue++;
244e0b0e55cSAnoob Joseph 	}
245e0b0e55cSAnoob Joseph 
246e0b0e55cSAnoob Joseph 	/* Check if there are more ports than required */
247e0b0e55cSAnoob Joseph 	if (eventdev_config->nb_eventport > lcore_count) {
248e0b0e55cSAnoob Joseph 		/* One port per lcore is enough */
249e0b0e55cSAnoob Joseph 		eventdev_config->nb_eventport = lcore_count;
250e0b0e55cSAnoob Joseph 	}
251e0b0e55cSAnoob Joseph 
252e0b0e55cSAnoob Joseph 	return 0;
253e0b0e55cSAnoob Joseph }
254e0b0e55cSAnoob Joseph 
255ec3cc53fSLukasz Bartosik static void
256ec3cc53fSLukasz Bartosik eh_do_capability_check(struct eventmode_conf *em_conf)
257ec3cc53fSLukasz Bartosik {
258ec3cc53fSLukasz Bartosik 	struct eventdev_params *eventdev_config;
259ec3cc53fSLukasz Bartosik 	int all_internal_ports = 1;
260ec3cc53fSLukasz Bartosik 	uint32_t eventdev_id;
261ec3cc53fSLukasz Bartosik 	int i;
262ec3cc53fSLukasz Bartosik 
263ec3cc53fSLukasz Bartosik 	for (i = 0; i < em_conf->nb_eventdev; i++) {
264ec3cc53fSLukasz Bartosik 
265ec3cc53fSLukasz Bartosik 		/* Get the event dev conf */
266ec3cc53fSLukasz Bartosik 		eventdev_config = &(em_conf->eventdev_config[i]);
267ec3cc53fSLukasz Bartosik 		eventdev_id = eventdev_config->eventdev_id;
268ec3cc53fSLukasz Bartosik 
269ec3cc53fSLukasz Bartosik 		/* Check if event device has internal port for Rx & Tx */
270ec3cc53fSLukasz Bartosik 		if (eh_dev_has_rx_internal_port(eventdev_id) &&
271ec3cc53fSLukasz Bartosik 		    eh_dev_has_tx_internal_port(eventdev_id)) {
272ec3cc53fSLukasz Bartosik 			eventdev_config->all_internal_ports = 1;
273ec3cc53fSLukasz Bartosik 		} else {
274ec3cc53fSLukasz Bartosik 			all_internal_ports = 0;
275ec3cc53fSLukasz Bartosik 		}
276ec3cc53fSLukasz Bartosik 	}
277ec3cc53fSLukasz Bartosik 
278ec3cc53fSLukasz Bartosik 	/*
279ec3cc53fSLukasz Bartosik 	 * If Rx & Tx internal ports are supported by all event devices then
280c12871e4SVolodymyr Fialko 	 * eth cores won't be required. Override the eth core mask requested.
281ec3cc53fSLukasz Bartosik 	 */
282c12871e4SVolodymyr Fialko 	if (all_internal_ports)
283ec3cc53fSLukasz Bartosik 		rte_bitmap_reset(em_conf->eth_core_mask);
284ec3cc53fSLukasz Bartosik }
285ec3cc53fSLukasz Bartosik 
286e0b0e55cSAnoob Joseph static int
287d7bcfb97SAnoob Joseph eh_set_default_conf_link(struct eventmode_conf *em_conf)
288d7bcfb97SAnoob Joseph {
289d7bcfb97SAnoob Joseph 	struct eventdev_params *eventdev_config;
290d7bcfb97SAnoob Joseph 	struct eh_event_link_info *link;
291d7bcfb97SAnoob Joseph 	unsigned int lcore_id = -1;
292d7bcfb97SAnoob Joseph 	int i, link_index;
293d7bcfb97SAnoob Joseph 
294d7bcfb97SAnoob Joseph 	/*
295d7bcfb97SAnoob Joseph 	 * Create a 1:1 mapping from event ports to cores. If the number
296d7bcfb97SAnoob Joseph 	 * of event ports is lesser than the cores, some cores won't
297d7bcfb97SAnoob Joseph 	 * execute worker. If there are more event ports, then some ports
298d7bcfb97SAnoob Joseph 	 * won't be used.
299d7bcfb97SAnoob Joseph 	 *
300d7bcfb97SAnoob Joseph 	 */
301d7bcfb97SAnoob Joseph 
302d7bcfb97SAnoob Joseph 	/*
303d7bcfb97SAnoob Joseph 	 * The event queue-port mapping is done according to the link. Since
304d7bcfb97SAnoob Joseph 	 * we are falling back to the default link config, enabling
305d7bcfb97SAnoob Joseph 	 * "all_ev_queue_to_ev_port" mode flag. This will map all queues
306d7bcfb97SAnoob Joseph 	 * to the port.
307d7bcfb97SAnoob Joseph 	 */
308d7bcfb97SAnoob Joseph 	em_conf->ext_params.all_ev_queue_to_ev_port = 1;
309d7bcfb97SAnoob Joseph 
310d7bcfb97SAnoob Joseph 	/* Get first event dev conf */
311d7bcfb97SAnoob Joseph 	eventdev_config = &(em_conf->eventdev_config[0]);
312d7bcfb97SAnoob Joseph 
313d7bcfb97SAnoob Joseph 	/* Loop through the ports */
314d7bcfb97SAnoob Joseph 	for (i = 0; i < eventdev_config->nb_eventport; i++) {
315d7bcfb97SAnoob Joseph 
316d7bcfb97SAnoob Joseph 		/* Get next active core id */
317d7bcfb97SAnoob Joseph 		lcore_id = eh_get_next_active_core(em_conf,
318d7bcfb97SAnoob Joseph 				lcore_id);
319d7bcfb97SAnoob Joseph 
320d7bcfb97SAnoob Joseph 		if (lcore_id == RTE_MAX_LCORE) {
321d7bcfb97SAnoob Joseph 			/* Reached max cores */
322d7bcfb97SAnoob Joseph 			return 0;
323d7bcfb97SAnoob Joseph 		}
324d7bcfb97SAnoob Joseph 
325d7bcfb97SAnoob Joseph 		/* Save the current combination as one link */
326d7bcfb97SAnoob Joseph 
327d7bcfb97SAnoob Joseph 		/* Get the index */
328d7bcfb97SAnoob Joseph 		link_index = em_conf->nb_link;
329d7bcfb97SAnoob Joseph 
330d7bcfb97SAnoob Joseph 		/* Get the corresponding link */
331d7bcfb97SAnoob Joseph 		link = &(em_conf->link[link_index]);
332d7bcfb97SAnoob Joseph 
333d7bcfb97SAnoob Joseph 		/* Save link */
334d7bcfb97SAnoob Joseph 		link->eventdev_id = eventdev_config->eventdev_id;
335d7bcfb97SAnoob Joseph 		link->event_port_id = i;
336d7bcfb97SAnoob Joseph 		link->lcore_id = lcore_id;
337d7bcfb97SAnoob Joseph 
338d7bcfb97SAnoob Joseph 		/*
339d7bcfb97SAnoob Joseph 		 * Don't set eventq_id as by default all queues
340d7bcfb97SAnoob Joseph 		 * need to be mapped to the port, which is controlled
341d7bcfb97SAnoob Joseph 		 * by the operating mode.
342d7bcfb97SAnoob Joseph 		 */
343d7bcfb97SAnoob Joseph 
344d7bcfb97SAnoob Joseph 		/* Update number of links */
345d7bcfb97SAnoob Joseph 		em_conf->nb_link++;
346d7bcfb97SAnoob Joseph 	}
347d7bcfb97SAnoob Joseph 
348d7bcfb97SAnoob Joseph 	return 0;
349d7bcfb97SAnoob Joseph }
350d7bcfb97SAnoob Joseph 
351d7bcfb97SAnoob Joseph static int
35202afed59SAnoob Joseph eh_set_default_conf_rx_adapter(struct eventmode_conf *em_conf)
35302afed59SAnoob Joseph {
35402afed59SAnoob Joseph 	struct rx_adapter_connection_info *conn;
35502afed59SAnoob Joseph 	struct eventdev_params *eventdev_config;
35602afed59SAnoob Joseph 	struct rx_adapter_conf *adapter;
357ec3cc53fSLukasz Bartosik 	bool rx_internal_port = true;
35802afed59SAnoob Joseph 	bool single_ev_queue = false;
359ec3cc53fSLukasz Bartosik 	int nb_eventqueue;
360ec3cc53fSLukasz Bartosik 	uint32_t caps = 0;
36102afed59SAnoob Joseph 	int eventdev_id;
36202afed59SAnoob Joseph 	int nb_eth_dev;
36302afed59SAnoob Joseph 	int adapter_id;
36402afed59SAnoob Joseph 	int conn_id;
365f5ad5016SAnkur Dwivedi 	int ret;
36602afed59SAnoob Joseph 	int i;
36702afed59SAnoob Joseph 
36802afed59SAnoob Joseph 	/* Create one adapter with eth queues mapped to event queue(s) */
36902afed59SAnoob Joseph 
37002afed59SAnoob Joseph 	if (em_conf->nb_eventdev == 0) {
37102afed59SAnoob Joseph 		EH_LOG_ERR("No event devs registered");
37202afed59SAnoob Joseph 		return -EINVAL;
37302afed59SAnoob Joseph 	}
37402afed59SAnoob Joseph 
37502afed59SAnoob Joseph 	/* Get the number of eth devs */
37602afed59SAnoob Joseph 	nb_eth_dev = rte_eth_dev_count_avail();
37702afed59SAnoob Joseph 
37802afed59SAnoob Joseph 	/* Use the first event dev */
37902afed59SAnoob Joseph 	eventdev_config = &(em_conf->eventdev_config[0]);
38002afed59SAnoob Joseph 
38102afed59SAnoob Joseph 	/* Get eventdev ID */
38202afed59SAnoob Joseph 	eventdev_id = eventdev_config->eventdev_id;
38302afed59SAnoob Joseph 	adapter_id = 0;
38402afed59SAnoob Joseph 
38502afed59SAnoob Joseph 	/* Get adapter conf */
38602afed59SAnoob Joseph 	adapter = &(em_conf->rx_adapter[adapter_id]);
38702afed59SAnoob Joseph 
38802afed59SAnoob Joseph 	/* Set adapter conf */
38902afed59SAnoob Joseph 	adapter->eventdev_id = eventdev_id;
39002afed59SAnoob Joseph 	adapter->adapter_id = adapter_id;
391ec3cc53fSLukasz Bartosik 
392ec3cc53fSLukasz Bartosik 	/*
393ec3cc53fSLukasz Bartosik 	 * If event device does not have internal ports for passing
394ec3cc53fSLukasz Bartosik 	 * packets then reserved one queue for Tx path
395ec3cc53fSLukasz Bartosik 	 */
396ec3cc53fSLukasz Bartosik 	nb_eventqueue = eventdev_config->all_internal_ports ?
397ec3cc53fSLukasz Bartosik 			eventdev_config->nb_eventqueue :
398ec3cc53fSLukasz Bartosik 			eventdev_config->nb_eventqueue - 1;
39902afed59SAnoob Joseph 
400c12871e4SVolodymyr Fialko 	/* Reserve one queue for event crypto adapter */
401c12871e4SVolodymyr Fialko 	if (em_conf->enable_event_crypto_adapter)
402c12871e4SVolodymyr Fialko 		nb_eventqueue--;
403c12871e4SVolodymyr Fialko 
40402afed59SAnoob Joseph 	/*
40502afed59SAnoob Joseph 	 * Map all queues of eth device (port) to an event queue. If there
40602afed59SAnoob Joseph 	 * are more event queues than eth ports then create 1:1 mapping.
40702afed59SAnoob Joseph 	 * Otherwise map all eth ports to a single event queue.
40802afed59SAnoob Joseph 	 */
409ec3cc53fSLukasz Bartosik 	if (nb_eth_dev > nb_eventqueue)
41002afed59SAnoob Joseph 		single_ev_queue = true;
41102afed59SAnoob Joseph 
41202afed59SAnoob Joseph 	for (i = 0; i < nb_eth_dev; i++) {
41302afed59SAnoob Joseph 
41402afed59SAnoob Joseph 		/* Use only the ports enabled */
41502afed59SAnoob Joseph 		if ((em_conf->eth_portmask & (1 << i)) == 0)
41602afed59SAnoob Joseph 			continue;
41702afed59SAnoob Joseph 
41802afed59SAnoob Joseph 		/* Get the connection id */
41902afed59SAnoob Joseph 		conn_id = adapter->nb_connections;
42002afed59SAnoob Joseph 
42102afed59SAnoob Joseph 		/* Get the connection */
42202afed59SAnoob Joseph 		conn = &(adapter->conn[conn_id]);
42302afed59SAnoob Joseph 
42402afed59SAnoob Joseph 		/* Set mapping between eth ports & event queues*/
42502afed59SAnoob Joseph 		conn->ethdev_id = i;
42602afed59SAnoob Joseph 		conn->eventq_id = single_ev_queue ? 0 : i;
42702afed59SAnoob Joseph 
42802afed59SAnoob Joseph 		/* Add all eth queues eth port to event queue */
42902afed59SAnoob Joseph 		conn->ethdev_rx_qid = -1;
43002afed59SAnoob Joseph 
431ec3cc53fSLukasz Bartosik 		/* Get Rx adapter capabilities */
432f5ad5016SAnkur Dwivedi 		ret = rte_event_eth_rx_adapter_caps_get(eventdev_id, i, &caps);
433f5ad5016SAnkur Dwivedi 		if (ret < 0) {
434f5ad5016SAnkur Dwivedi 			EH_LOG_ERR("Failed to get event device %d eth rx adapter"
435f5ad5016SAnkur Dwivedi 				   " capabilities for port %d", eventdev_id, i);
436f5ad5016SAnkur Dwivedi 			return ret;
437f5ad5016SAnkur Dwivedi 		}
438ec3cc53fSLukasz Bartosik 		if (!(caps & RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT))
439ec3cc53fSLukasz Bartosik 			rx_internal_port = false;
440ec3cc53fSLukasz Bartosik 
44102afed59SAnoob Joseph 		/* Update no of connections */
44202afed59SAnoob Joseph 		adapter->nb_connections++;
44302afed59SAnoob Joseph 
44402afed59SAnoob Joseph 	}
44502afed59SAnoob Joseph 
446ec3cc53fSLukasz Bartosik 	if (rx_internal_port) {
447ec3cc53fSLukasz Bartosik 		/* Rx core is not required */
448ec3cc53fSLukasz Bartosik 		adapter->rx_core_id = -1;
449ec3cc53fSLukasz Bartosik 	} else {
450ec3cc53fSLukasz Bartosik 		/* Rx core is required */
451ec3cc53fSLukasz Bartosik 		adapter->rx_core_id = eh_get_next_eth_core(em_conf);
452ec3cc53fSLukasz Bartosik 	}
453ec3cc53fSLukasz Bartosik 
45402afed59SAnoob Joseph 	/* We have setup one adapter */
45502afed59SAnoob Joseph 	em_conf->nb_rx_adapter = 1;
45602afed59SAnoob Joseph 
45702afed59SAnoob Joseph 	return 0;
45802afed59SAnoob Joseph }
45902afed59SAnoob Joseph 
46002afed59SAnoob Joseph static int
4611d89ccf3SAnoob Joseph eh_set_default_conf_tx_adapter(struct eventmode_conf *em_conf)
4621d89ccf3SAnoob Joseph {
4631d89ccf3SAnoob Joseph 	struct tx_adapter_connection_info *conn;
4641d89ccf3SAnoob Joseph 	struct eventdev_params *eventdev_config;
4651d89ccf3SAnoob Joseph 	struct tx_adapter_conf *tx_adapter;
466ec3cc53fSLukasz Bartosik 	bool tx_internal_port = true;
467ec3cc53fSLukasz Bartosik 	uint32_t caps = 0;
4681d89ccf3SAnoob Joseph 	int eventdev_id;
4691d89ccf3SAnoob Joseph 	int adapter_id;
4701d89ccf3SAnoob Joseph 	int nb_eth_dev;
4711d89ccf3SAnoob Joseph 	int conn_id;
472f5ad5016SAnkur Dwivedi 	int ret;
4731d89ccf3SAnoob Joseph 	int i;
4741d89ccf3SAnoob Joseph 
4751d89ccf3SAnoob Joseph 	/*
4761d89ccf3SAnoob Joseph 	 * Create one Tx adapter with all eth queues mapped to event queues
4771d89ccf3SAnoob Joseph 	 * 1:1.
4781d89ccf3SAnoob Joseph 	 */
4791d89ccf3SAnoob Joseph 
4801d89ccf3SAnoob Joseph 	if (em_conf->nb_eventdev == 0) {
4811d89ccf3SAnoob Joseph 		EH_LOG_ERR("No event devs registered");
4821d89ccf3SAnoob Joseph 		return -EINVAL;
4831d89ccf3SAnoob Joseph 	}
4841d89ccf3SAnoob Joseph 
4851d89ccf3SAnoob Joseph 	/* Get the number of eth devs */
4861d89ccf3SAnoob Joseph 	nb_eth_dev = rte_eth_dev_count_avail();
4871d89ccf3SAnoob Joseph 
4881d89ccf3SAnoob Joseph 	/* Use the first event dev */
4891d89ccf3SAnoob Joseph 	eventdev_config = &(em_conf->eventdev_config[0]);
4901d89ccf3SAnoob Joseph 
4911d89ccf3SAnoob Joseph 	/* Get eventdev ID */
4921d89ccf3SAnoob Joseph 	eventdev_id = eventdev_config->eventdev_id;
4931d89ccf3SAnoob Joseph 	adapter_id = 0;
4941d89ccf3SAnoob Joseph 
4951d89ccf3SAnoob Joseph 	/* Get adapter conf */
4961d89ccf3SAnoob Joseph 	tx_adapter = &(em_conf->tx_adapter[adapter_id]);
4971d89ccf3SAnoob Joseph 
4981d89ccf3SAnoob Joseph 	/* Set adapter conf */
4991d89ccf3SAnoob Joseph 	tx_adapter->eventdev_id = eventdev_id;
5001d89ccf3SAnoob Joseph 	tx_adapter->adapter_id = adapter_id;
5011d89ccf3SAnoob Joseph 
5021d89ccf3SAnoob Joseph 	/*
5031d89ccf3SAnoob Joseph 	 * Map all Tx queues of the eth device (port) to the event device.
5041d89ccf3SAnoob Joseph 	 */
5051d89ccf3SAnoob Joseph 
5061d89ccf3SAnoob Joseph 	/* Set defaults for connections */
5071d89ccf3SAnoob Joseph 
5081d89ccf3SAnoob Joseph 	/*
5091d89ccf3SAnoob Joseph 	 * One eth device (port) is one connection. Map all Tx queues
5101d89ccf3SAnoob Joseph 	 * of the device to the Tx adapter.
5111d89ccf3SAnoob Joseph 	 */
5121d89ccf3SAnoob Joseph 
5131d89ccf3SAnoob Joseph 	for (i = 0; i < nb_eth_dev; i++) {
5141d89ccf3SAnoob Joseph 
5151d89ccf3SAnoob Joseph 		/* Use only the ports enabled */
5161d89ccf3SAnoob Joseph 		if ((em_conf->eth_portmask & (1 << i)) == 0)
5171d89ccf3SAnoob Joseph 			continue;
5181d89ccf3SAnoob Joseph 
5191d89ccf3SAnoob Joseph 		/* Get the connection id */
5201d89ccf3SAnoob Joseph 		conn_id = tx_adapter->nb_connections;
5211d89ccf3SAnoob Joseph 
5221d89ccf3SAnoob Joseph 		/* Get the connection */
5231d89ccf3SAnoob Joseph 		conn = &(tx_adapter->conn[conn_id]);
5241d89ccf3SAnoob Joseph 
5251d89ccf3SAnoob Joseph 		/* Add ethdev to connections */
5261d89ccf3SAnoob Joseph 		conn->ethdev_id = i;
5271d89ccf3SAnoob Joseph 
5281d89ccf3SAnoob Joseph 		/* Add all eth tx queues to adapter */
5291d89ccf3SAnoob Joseph 		conn->ethdev_tx_qid = -1;
5301d89ccf3SAnoob Joseph 
531ec3cc53fSLukasz Bartosik 		/* Get Tx adapter capabilities */
532f5ad5016SAnkur Dwivedi 		ret = rte_event_eth_tx_adapter_caps_get(eventdev_id, i, &caps);
533f5ad5016SAnkur Dwivedi 		if (ret < 0) {
534f5ad5016SAnkur Dwivedi 			EH_LOG_ERR("Failed to get event device %d eth tx adapter"
535f5ad5016SAnkur Dwivedi 				   " capabilities for port %d", eventdev_id, i);
536f5ad5016SAnkur Dwivedi 			return ret;
537f5ad5016SAnkur Dwivedi 		}
538ec3cc53fSLukasz Bartosik 		if (!(caps & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT))
539ec3cc53fSLukasz Bartosik 			tx_internal_port = false;
540ec3cc53fSLukasz Bartosik 
5411d89ccf3SAnoob Joseph 		/* Update no of connections */
5421d89ccf3SAnoob Joseph 		tx_adapter->nb_connections++;
5431d89ccf3SAnoob Joseph 	}
5441d89ccf3SAnoob Joseph 
545ec3cc53fSLukasz Bartosik 	if (tx_internal_port) {
546ec3cc53fSLukasz Bartosik 		/* Tx core is not required */
547ec3cc53fSLukasz Bartosik 		tx_adapter->tx_core_id = -1;
548ec3cc53fSLukasz Bartosik 	} else {
549ec3cc53fSLukasz Bartosik 		/* Tx core is required */
550ec3cc53fSLukasz Bartosik 		tx_adapter->tx_core_id = eh_get_next_eth_core(em_conf);
551ec3cc53fSLukasz Bartosik 
552ec3cc53fSLukasz Bartosik 		/*
553ec3cc53fSLukasz Bartosik 		 * Use one event queue per adapter for submitting packets
554ec3cc53fSLukasz Bartosik 		 * for Tx. Reserving the last queue available
555ec3cc53fSLukasz Bartosik 		 */
556ec3cc53fSLukasz Bartosik 		/* Queue numbers start at 0 */
557ec3cc53fSLukasz Bartosik 		tx_adapter->tx_ev_queue = eventdev_config->nb_eventqueue - 1;
558ec3cc53fSLukasz Bartosik 	}
559ec3cc53fSLukasz Bartosik 
5601d89ccf3SAnoob Joseph 	/* We have setup one adapter */
5611d89ccf3SAnoob Joseph 	em_conf->nb_tx_adapter = 1;
5621d89ccf3SAnoob Joseph 	return 0;
5631d89ccf3SAnoob Joseph }
5641d89ccf3SAnoob Joseph 
5651d89ccf3SAnoob Joseph static int
566e0b0e55cSAnoob Joseph eh_validate_conf(struct eventmode_conf *em_conf)
567e0b0e55cSAnoob Joseph {
568e0b0e55cSAnoob Joseph 	int ret;
569e0b0e55cSAnoob Joseph 
570e0b0e55cSAnoob Joseph 	/*
571e0b0e55cSAnoob Joseph 	 * Check if event devs are specified. Else probe the event devices
572e0b0e55cSAnoob Joseph 	 * and initialize the config with all ports & queues available
573e0b0e55cSAnoob Joseph 	 */
574e0b0e55cSAnoob Joseph 	if (em_conf->nb_eventdev == 0) {
575c12871e4SVolodymyr Fialko 		ret = eh_set_nb_eventdev(em_conf);
576c12871e4SVolodymyr Fialko 		if (ret != 0)
577c12871e4SVolodymyr Fialko 			return ret;
578c12871e4SVolodymyr Fialko 		eh_do_capability_check(em_conf);
579e0b0e55cSAnoob Joseph 		ret = eh_set_default_conf_eventdev(em_conf);
580e0b0e55cSAnoob Joseph 		if (ret != 0)
581e0b0e55cSAnoob Joseph 			return ret;
582c12871e4SVolodymyr Fialko 	} else {
583ec3cc53fSLukasz Bartosik 		/* Perform capability check for the selected event devices */
584ec3cc53fSLukasz Bartosik 		eh_do_capability_check(em_conf);
585c12871e4SVolodymyr Fialko 	}
586ec3cc53fSLukasz Bartosik 
587d7bcfb97SAnoob Joseph 	/*
588d7bcfb97SAnoob Joseph 	 * Check if links are specified. Else generate a default config for
589d7bcfb97SAnoob Joseph 	 * the event ports used.
590d7bcfb97SAnoob Joseph 	 */
591d7bcfb97SAnoob Joseph 	if (em_conf->nb_link == 0) {
592d7bcfb97SAnoob Joseph 		ret = eh_set_default_conf_link(em_conf);
593d7bcfb97SAnoob Joseph 		if (ret != 0)
594d7bcfb97SAnoob Joseph 			return ret;
595d7bcfb97SAnoob Joseph 	}
596d7bcfb97SAnoob Joseph 
59702afed59SAnoob Joseph 	/*
59802afed59SAnoob Joseph 	 * Check if rx adapters are specified. Else generate a default config
59902afed59SAnoob Joseph 	 * with one rx adapter and all eth queues - event queue mapped.
60002afed59SAnoob Joseph 	 */
60102afed59SAnoob Joseph 	if (em_conf->nb_rx_adapter == 0) {
60202afed59SAnoob Joseph 		ret = eh_set_default_conf_rx_adapter(em_conf);
60302afed59SAnoob Joseph 		if (ret != 0)
60402afed59SAnoob Joseph 			return ret;
60502afed59SAnoob Joseph 	}
60602afed59SAnoob Joseph 
6071d89ccf3SAnoob Joseph 	/*
6081d89ccf3SAnoob Joseph 	 * Check if tx adapters are specified. Else generate a default config
6091d89ccf3SAnoob Joseph 	 * with one tx adapter.
6101d89ccf3SAnoob Joseph 	 */
6111d89ccf3SAnoob Joseph 	if (em_conf->nb_tx_adapter == 0) {
6121d89ccf3SAnoob Joseph 		ret = eh_set_default_conf_tx_adapter(em_conf);
6131d89ccf3SAnoob Joseph 		if (ret != 0)
6141d89ccf3SAnoob Joseph 			return ret;
6151d89ccf3SAnoob Joseph 	}
6161d89ccf3SAnoob Joseph 
617e0b0e55cSAnoob Joseph 	return 0;
618e0b0e55cSAnoob Joseph }
619e0b0e55cSAnoob Joseph 
620e0b0e55cSAnoob Joseph static int
621e0b0e55cSAnoob Joseph eh_initialize_eventdev(struct eventmode_conf *em_conf)
622e0b0e55cSAnoob Joseph {
623e0b0e55cSAnoob Joseph 	struct rte_event_queue_conf eventq_conf = {0};
624e0b0e55cSAnoob Joseph 	struct rte_event_dev_info evdev_default_conf;
625e0b0e55cSAnoob Joseph 	struct rte_event_dev_config eventdev_conf;
626e0b0e55cSAnoob Joseph 	struct eventdev_params *eventdev_config;
627e0b0e55cSAnoob Joseph 	int nb_eventdev = em_conf->nb_eventdev;
628d7bcfb97SAnoob Joseph 	struct eh_event_link_info *link;
629d7bcfb97SAnoob Joseph 	uint8_t *queue = NULL;
630e0b0e55cSAnoob Joseph 	uint8_t eventdev_id;
631e0b0e55cSAnoob Joseph 	int nb_eventqueue;
632c12871e4SVolodymyr Fialko 	int ret, j;
633c12871e4SVolodymyr Fialko 	uint8_t i;
634e0b0e55cSAnoob Joseph 
635e0b0e55cSAnoob Joseph 	for (i = 0; i < nb_eventdev; i++) {
636e0b0e55cSAnoob Joseph 
637e0b0e55cSAnoob Joseph 		/* Get eventdev config */
638e0b0e55cSAnoob Joseph 		eventdev_config = &(em_conf->eventdev_config[i]);
639e0b0e55cSAnoob Joseph 
640e0b0e55cSAnoob Joseph 		/* Get event dev ID */
641e0b0e55cSAnoob Joseph 		eventdev_id = eventdev_config->eventdev_id;
642e0b0e55cSAnoob Joseph 
643e0b0e55cSAnoob Joseph 		/* Get the number of queues */
644e0b0e55cSAnoob Joseph 		nb_eventqueue = eventdev_config->nb_eventqueue;
645e0b0e55cSAnoob Joseph 
646e0b0e55cSAnoob Joseph 		/* Reset the default conf */
647e0b0e55cSAnoob Joseph 		memset(&evdev_default_conf, 0,
648e0b0e55cSAnoob Joseph 			sizeof(struct rte_event_dev_info));
649e0b0e55cSAnoob Joseph 
650e0b0e55cSAnoob Joseph 		/* Get default conf of eventdev */
651e0b0e55cSAnoob Joseph 		ret = rte_event_dev_info_get(eventdev_id, &evdev_default_conf);
652e0b0e55cSAnoob Joseph 		if (ret < 0) {
653e0b0e55cSAnoob Joseph 			EH_LOG_ERR(
654e0b0e55cSAnoob Joseph 				"Error in getting event device info[devID:%d]",
655e0b0e55cSAnoob Joseph 				eventdev_id);
656e0b0e55cSAnoob Joseph 			return ret;
657e0b0e55cSAnoob Joseph 		}
658e0b0e55cSAnoob Joseph 
659e0b0e55cSAnoob Joseph 		memset(&eventdev_conf, 0, sizeof(struct rte_event_dev_config));
660e0b0e55cSAnoob Joseph 		eventdev_conf.nb_events_limit =
661e0b0e55cSAnoob Joseph 				evdev_default_conf.max_num_events;
662e0b0e55cSAnoob Joseph 		eventdev_conf.nb_event_queues = nb_eventqueue;
663e0b0e55cSAnoob Joseph 		eventdev_conf.nb_event_ports =
664e0b0e55cSAnoob Joseph 				eventdev_config->nb_eventport;
665e0b0e55cSAnoob Joseph 		eventdev_conf.nb_event_queue_flows =
666e0b0e55cSAnoob Joseph 				evdev_default_conf.max_event_queue_flows;
667e0b0e55cSAnoob Joseph 		eventdev_conf.nb_event_port_dequeue_depth =
668e0b0e55cSAnoob Joseph 				evdev_default_conf.max_event_port_dequeue_depth;
669e0b0e55cSAnoob Joseph 		eventdev_conf.nb_event_port_enqueue_depth =
670e0b0e55cSAnoob Joseph 				evdev_default_conf.max_event_port_enqueue_depth;
671e0b0e55cSAnoob Joseph 
672*6cf329f9SPavan Nikhilesh 		if (evdev_default_conf.event_dev_cap & RTE_EVENT_DEV_CAP_EVENT_PRESCHEDULE)
673*6cf329f9SPavan Nikhilesh 			eventdev_conf.preschedule_type = RTE_EVENT_PRESCHEDULE;
674*6cf329f9SPavan Nikhilesh 
675*6cf329f9SPavan Nikhilesh 		if (evdev_default_conf.event_dev_cap & RTE_EVENT_DEV_CAP_EVENT_PRESCHEDULE_ADAPTIVE)
676*6cf329f9SPavan Nikhilesh 			eventdev_conf.preschedule_type = RTE_EVENT_PRESCHEDULE_ADAPTIVE;
677*6cf329f9SPavan Nikhilesh 
678e0b0e55cSAnoob Joseph 		/* Configure event device */
679e0b0e55cSAnoob Joseph 		ret = rte_event_dev_configure(eventdev_id, &eventdev_conf);
680e0b0e55cSAnoob Joseph 		if (ret < 0) {
681e0b0e55cSAnoob Joseph 			EH_LOG_ERR("Error in configuring event device");
682e0b0e55cSAnoob Joseph 			return ret;
683e0b0e55cSAnoob Joseph 		}
684e0b0e55cSAnoob Joseph 
685e0b0e55cSAnoob Joseph 		/* Configure event queues */
686e0b0e55cSAnoob Joseph 		for (j = 0; j < nb_eventqueue; j++) {
687e0b0e55cSAnoob Joseph 
688e0b0e55cSAnoob Joseph 			memset(&eventq_conf, 0,
689e0b0e55cSAnoob Joseph 					sizeof(struct rte_event_queue_conf));
690e0b0e55cSAnoob Joseph 
691e0b0e55cSAnoob Joseph 			/* Per event dev queues can be ATQ or SINGLE LINK */
692e0b0e55cSAnoob Joseph 			eventq_conf.event_queue_cfg =
693e0b0e55cSAnoob Joseph 					eventdev_config->ev_queue_mode;
694e0b0e55cSAnoob Joseph 			/*
695e0b0e55cSAnoob Joseph 			 * All queues need to be set with sched_type as
696ec3cc53fSLukasz Bartosik 			 * schedule type for the application stage. One
697ec3cc53fSLukasz Bartosik 			 * queue would be reserved for the final eth tx
698ec3cc53fSLukasz Bartosik 			 * stage if event device does not have internal
699ec3cc53fSLukasz Bartosik 			 * ports. This will be an atomic queue.
700e0b0e55cSAnoob Joseph 			 */
701c12871e4SVolodymyr Fialko 			if (j == eventdev_config->tx_queue_id) {
702e0b0e55cSAnoob Joseph 				eventq_conf.schedule_type =
703e0b0e55cSAnoob Joseph 					RTE_SCHED_TYPE_ATOMIC;
704e0b0e55cSAnoob Joseph 			} else {
705e0b0e55cSAnoob Joseph 				eventq_conf.schedule_type =
706e0b0e55cSAnoob Joseph 					em_conf->ext_params.sched_type;
707e0b0e55cSAnoob Joseph 			}
708c12871e4SVolodymyr Fialko 			/*
709c12871e4SVolodymyr Fialko 			 * Give event crypto device's queue higher priority then Rx queues. This
710c12871e4SVolodymyr Fialko 			 * will allow crypto events to be processed with highest priority.
711c12871e4SVolodymyr Fialko 			 */
712c12871e4SVolodymyr Fialko 			if (j == eventdev_config->ev_cpt_queue_id) {
713c12871e4SVolodymyr Fialko 				eventq_conf.priority =
714c12871e4SVolodymyr Fialko 					RTE_EVENT_DEV_PRIORITY_HIGHEST;
715c12871e4SVolodymyr Fialko 			} else {
716c12871e4SVolodymyr Fialko 				eventq_conf.priority =
717c12871e4SVolodymyr Fialko 					RTE_EVENT_DEV_PRIORITY_NORMAL;
718c12871e4SVolodymyr Fialko 			}
719e0b0e55cSAnoob Joseph 
720e0b0e55cSAnoob Joseph 			/* Set max atomic flows to 1024 */
721e0b0e55cSAnoob Joseph 			eventq_conf.nb_atomic_flows = 1024;
722e0b0e55cSAnoob Joseph 			eventq_conf.nb_atomic_order_sequences = 1024;
723e0b0e55cSAnoob Joseph 
724e0b0e55cSAnoob Joseph 			/* Setup the queue */
725e0b0e55cSAnoob Joseph 			ret = rte_event_queue_setup(eventdev_id, j,
726e0b0e55cSAnoob Joseph 					&eventq_conf);
727e0b0e55cSAnoob Joseph 			if (ret < 0) {
728e0b0e55cSAnoob Joseph 				EH_LOG_ERR("Failed to setup event queue %d",
729e0b0e55cSAnoob Joseph 					   ret);
730e0b0e55cSAnoob Joseph 				return ret;
731e0b0e55cSAnoob Joseph 			}
732e0b0e55cSAnoob Joseph 		}
733e0b0e55cSAnoob Joseph 
734e0b0e55cSAnoob Joseph 		/* Configure event ports */
735e0b0e55cSAnoob Joseph 		for (j = 0; j <  eventdev_config->nb_eventport; j++) {
736e0b0e55cSAnoob Joseph 			ret = rte_event_port_setup(eventdev_id, j, NULL);
737e0b0e55cSAnoob Joseph 			if (ret < 0) {
738e0b0e55cSAnoob Joseph 				EH_LOG_ERR("Failed to setup event port %d",
739e0b0e55cSAnoob Joseph 					   ret);
740e0b0e55cSAnoob Joseph 				return ret;
741e0b0e55cSAnoob Joseph 			}
742e0b0e55cSAnoob Joseph 		}
743e0b0e55cSAnoob Joseph 	}
744e0b0e55cSAnoob Joseph 
745d7bcfb97SAnoob Joseph 	/* Make event queue - event port link */
746d7bcfb97SAnoob Joseph 	for (j = 0; j <  em_conf->nb_link; j++) {
747d7bcfb97SAnoob Joseph 
748d7bcfb97SAnoob Joseph 		/* Get link info */
749d7bcfb97SAnoob Joseph 		link = &(em_conf->link[j]);
750d7bcfb97SAnoob Joseph 
751d7bcfb97SAnoob Joseph 		/* Get event dev ID */
752d7bcfb97SAnoob Joseph 		eventdev_id = link->eventdev_id;
753d7bcfb97SAnoob Joseph 
754d7bcfb97SAnoob Joseph 		/*
755d7bcfb97SAnoob Joseph 		 * If "all_ev_queue_to_ev_port" params flag is selected, all
756d7bcfb97SAnoob Joseph 		 * queues need to be mapped to the port.
757d7bcfb97SAnoob Joseph 		 */
758d7bcfb97SAnoob Joseph 		if (em_conf->ext_params.all_ev_queue_to_ev_port)
759d7bcfb97SAnoob Joseph 			queue = NULL;
760d7bcfb97SAnoob Joseph 		else
761d7bcfb97SAnoob Joseph 			queue = &(link->eventq_id);
762d7bcfb97SAnoob Joseph 
763d7bcfb97SAnoob Joseph 		/* Link queue to port */
764d7bcfb97SAnoob Joseph 		ret = rte_event_port_link(eventdev_id, link->event_port_id,
765d7bcfb97SAnoob Joseph 				queue, NULL, 1);
766d7bcfb97SAnoob Joseph 		if (ret < 0) {
767d7bcfb97SAnoob Joseph 			EH_LOG_ERR("Failed to link event port %d", ret);
768d7bcfb97SAnoob Joseph 			return ret;
769d7bcfb97SAnoob Joseph 		}
770d7bcfb97SAnoob Joseph 	}
771d7bcfb97SAnoob Joseph 
772986c2c9eSNithin Dabilpuram 	return 0;
773986c2c9eSNithin Dabilpuram }
774986c2c9eSNithin Dabilpuram 
775986c2c9eSNithin Dabilpuram static int
776986c2c9eSNithin Dabilpuram eh_start_eventdev(struct eventmode_conf *em_conf)
777986c2c9eSNithin Dabilpuram {
778986c2c9eSNithin Dabilpuram 	struct eventdev_params *eventdev_config;
779986c2c9eSNithin Dabilpuram 	int nb_eventdev = em_conf->nb_eventdev;
780986c2c9eSNithin Dabilpuram 	int i, ret;
781986c2c9eSNithin Dabilpuram 
782e0b0e55cSAnoob Joseph 	/* Start event devices */
783e0b0e55cSAnoob Joseph 	for (i = 0; i < nb_eventdev; i++) {
784e0b0e55cSAnoob Joseph 
785e0b0e55cSAnoob Joseph 		/* Get eventdev config */
786e0b0e55cSAnoob Joseph 		eventdev_config = &(em_conf->eventdev_config[i]);
787e0b0e55cSAnoob Joseph 
788e0b0e55cSAnoob Joseph 		ret = rte_event_dev_start(eventdev_config->eventdev_id);
789e0b0e55cSAnoob Joseph 		if (ret < 0) {
790e0b0e55cSAnoob Joseph 			EH_LOG_ERR("Failed to start event device %d, %d",
791e0b0e55cSAnoob Joseph 				   i, ret);
792e0b0e55cSAnoob Joseph 			return ret;
793e0b0e55cSAnoob Joseph 		}
794e0b0e55cSAnoob Joseph 	}
795e0b0e55cSAnoob Joseph 	return 0;
796e0b0e55cSAnoob Joseph }
797e0b0e55cSAnoob Joseph 
79802afed59SAnoob Joseph static int
7990dbe550aSVolodymyr Fialko eh_initialize_crypto_adapter(struct eventmode_conf *em_conf)
8000dbe550aSVolodymyr Fialko {
8011d5078c6SVolodymyr Fialko 	struct rte_event_crypto_adapter_queue_conf queue_conf;
8020dbe550aSVolodymyr Fialko 	struct rte_event_dev_info evdev_default_conf = {0};
8030dbe550aSVolodymyr Fialko 	struct rte_event_port_conf port_conf = {0};
8040dbe550aSVolodymyr Fialko 	struct eventdev_params *eventdev_config;
8051d5078c6SVolodymyr Fialko 	char mp_name[RTE_MEMPOOL_NAMESIZE];
8061d5078c6SVolodymyr Fialko 	const uint8_t nb_qp_per_cdev = 1;
8070dbe550aSVolodymyr Fialko 	uint8_t eventdev_id, cdev_id, n;
8081d5078c6SVolodymyr Fialko 	uint32_t cap, nb_elem;
8091d5078c6SVolodymyr Fialko 	int ret, socket_id;
8100dbe550aSVolodymyr Fialko 
8110dbe550aSVolodymyr Fialko 	if (!em_conf->enable_event_crypto_adapter)
8120dbe550aSVolodymyr Fialko 		return 0;
8130dbe550aSVolodymyr Fialko 
8140dbe550aSVolodymyr Fialko 	/*
8150dbe550aSVolodymyr Fialko 	 * More then one eventdev is not supported,
8160dbe550aSVolodymyr Fialko 	 * all event crypto adapters will be assigned to one eventdev
8170dbe550aSVolodymyr Fialko 	 */
8180dbe550aSVolodymyr Fialko 	RTE_ASSERT(em_conf->nb_eventdev == 1);
8190dbe550aSVolodymyr Fialko 
8200dbe550aSVolodymyr Fialko 	/* Get event device configuration */
8210dbe550aSVolodymyr Fialko 	eventdev_config = &(em_conf->eventdev_config[0]);
8220dbe550aSVolodymyr Fialko 	eventdev_id = eventdev_config->eventdev_id;
8230dbe550aSVolodymyr Fialko 
8240dbe550aSVolodymyr Fialko 	n = rte_cryptodev_count();
8250dbe550aSVolodymyr Fialko 
8260dbe550aSVolodymyr Fialko 	for (cdev_id = 0; cdev_id != n; cdev_id++) {
8270dbe550aSVolodymyr Fialko 		/* Check event's crypto capabilities */
8280dbe550aSVolodymyr Fialko 		ret = rte_event_crypto_adapter_caps_get(eventdev_id, cdev_id, &cap);
8290dbe550aSVolodymyr Fialko 		if (ret < 0) {
8300dbe550aSVolodymyr Fialko 			EH_LOG_ERR("Failed to get event device's crypto capabilities %d", ret);
8310dbe550aSVolodymyr Fialko 			return ret;
8320dbe550aSVolodymyr Fialko 		}
8330dbe550aSVolodymyr Fialko 
8340dbe550aSVolodymyr Fialko 		if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD)) {
8350dbe550aSVolodymyr Fialko 			EH_LOG_ERR("Event crypto adapter does not support forward mode!");
8360dbe550aSVolodymyr Fialko 			return -EINVAL;
8370dbe550aSVolodymyr Fialko 		}
8380dbe550aSVolodymyr Fialko 
8390dbe550aSVolodymyr Fialko 		/* Create event crypto adapter */
8400dbe550aSVolodymyr Fialko 
8410dbe550aSVolodymyr Fialko 		/* Get default configuration of event dev */
8420dbe550aSVolodymyr Fialko 		ret = rte_event_dev_info_get(eventdev_id, &evdev_default_conf);
8430dbe550aSVolodymyr Fialko 		if (ret < 0) {
8440dbe550aSVolodymyr Fialko 			EH_LOG_ERR("Failed to get event dev info %d", ret);
8450dbe550aSVolodymyr Fialko 			return ret;
8460dbe550aSVolodymyr Fialko 		}
8470dbe550aSVolodymyr Fialko 
8480dbe550aSVolodymyr Fialko 		/* Setup port conf */
8490dbe550aSVolodymyr Fialko 		port_conf.new_event_threshold =
8500dbe550aSVolodymyr Fialko 				evdev_default_conf.max_num_events;
8510dbe550aSVolodymyr Fialko 		port_conf.dequeue_depth =
8520dbe550aSVolodymyr Fialko 				evdev_default_conf.max_event_port_dequeue_depth;
8530dbe550aSVolodymyr Fialko 		port_conf.enqueue_depth =
8540dbe550aSVolodymyr Fialko 				evdev_default_conf.max_event_port_enqueue_depth;
8550dbe550aSVolodymyr Fialko 
8560dbe550aSVolodymyr Fialko 		/* Create adapter */
8570dbe550aSVolodymyr Fialko 		ret = rte_event_crypto_adapter_create(cdev_id, eventdev_id,
8580dbe550aSVolodymyr Fialko 				&port_conf, RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD);
8590dbe550aSVolodymyr Fialko 		if (ret < 0) {
8600dbe550aSVolodymyr Fialko 			EH_LOG_ERR("Failed to create event crypto adapter %d", ret);
8610dbe550aSVolodymyr Fialko 			return ret;
8620dbe550aSVolodymyr Fialko 		}
8630dbe550aSVolodymyr Fialko 
8641d5078c6SVolodymyr Fialko 		memset(&queue_conf, 0, sizeof(queue_conf));
8651d5078c6SVolodymyr Fialko 		if ((cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_EVENT_VECTOR) &&
8661d5078c6SVolodymyr Fialko 		    (em_conf->ext_params.event_vector)) {
8671d5078c6SVolodymyr Fialko 			queue_conf.flags |= RTE_EVENT_CRYPTO_ADAPTER_EVENT_VECTOR;
8681d5078c6SVolodymyr Fialko 			queue_conf.vector_sz = em_conf->ext_params.vector_size;
8691d5078c6SVolodymyr Fialko 			/*
8701d5078c6SVolodymyr Fialko 			 * Currently all sessions configured with same response
8711d5078c6SVolodymyr Fialko 			 * info fields, so packets will be aggregated to the
8721d5078c6SVolodymyr Fialko 			 * same vector. This allows us to configure number of
8731d5078c6SVolodymyr Fialko 			 * vectors only to hold all queue pair descriptors.
8741d5078c6SVolodymyr Fialko 			 */
8751d5078c6SVolodymyr Fialko 			nb_elem = (qp_desc_nb / queue_conf.vector_sz) + 1;
8761d5078c6SVolodymyr Fialko 			nb_elem *= nb_qp_per_cdev;
8771d5078c6SVolodymyr Fialko 			socket_id = rte_cryptodev_socket_id(cdev_id);
8781d5078c6SVolodymyr Fialko 			snprintf(mp_name, RTE_MEMPOOL_NAMESIZE,
8791d5078c6SVolodymyr Fialko 					"QP_VEC_%u_%u", socket_id, cdev_id);
8801d5078c6SVolodymyr Fialko 			queue_conf.vector_mp = rte_event_vector_pool_create(
8811d5078c6SVolodymyr Fialko 					mp_name, nb_elem, 0,
8821d5078c6SVolodymyr Fialko 					queue_conf.vector_sz, socket_id);
8831d5078c6SVolodymyr Fialko 			if (queue_conf.vector_mp == NULL) {
8841d5078c6SVolodymyr Fialko 				EH_LOG_ERR("failed to create event vector pool");
8851d5078c6SVolodymyr Fialko 				return -ENOMEM;
8861d5078c6SVolodymyr Fialko 			}
8871d5078c6SVolodymyr Fialko 		}
8881d5078c6SVolodymyr Fialko 
8890dbe550aSVolodymyr Fialko 		/* Add crypto queue pairs to event crypto adapter */
8900dbe550aSVolodymyr Fialko 		ret = rte_event_crypto_adapter_queue_pair_add(cdev_id, eventdev_id,
8910dbe550aSVolodymyr Fialko 				-1, /* adds all the pre configured queue pairs to the instance */
8921d5078c6SVolodymyr Fialko 				&queue_conf);
8930dbe550aSVolodymyr Fialko 		if (ret < 0) {
8940dbe550aSVolodymyr Fialko 			EH_LOG_ERR("Failed to add queue pairs to event crypto adapter %d", ret);
8950dbe550aSVolodymyr Fialko 			return ret;
8960dbe550aSVolodymyr Fialko 		}
8970dbe550aSVolodymyr Fialko 	}
8980dbe550aSVolodymyr Fialko 
8990dbe550aSVolodymyr Fialko 	return 0;
9000dbe550aSVolodymyr Fialko }
9010dbe550aSVolodymyr Fialko 
9020dbe550aSVolodymyr Fialko static int
9030dbe550aSVolodymyr Fialko eh_start_crypto_adapter(struct eventmode_conf *em_conf)
9040dbe550aSVolodymyr Fialko {
9050dbe550aSVolodymyr Fialko 	uint8_t cdev_id, n;
9060dbe550aSVolodymyr Fialko 	int ret;
9070dbe550aSVolodymyr Fialko 
9080dbe550aSVolodymyr Fialko 	if (!em_conf->enable_event_crypto_adapter)
9090dbe550aSVolodymyr Fialko 		return 0;
9100dbe550aSVolodymyr Fialko 
9110dbe550aSVolodymyr Fialko 	n = rte_cryptodev_count();
9120dbe550aSVolodymyr Fialko 	for (cdev_id = 0; cdev_id != n; cdev_id++) {
9130dbe550aSVolodymyr Fialko 		ret = rte_event_crypto_adapter_start(cdev_id);
9140dbe550aSVolodymyr Fialko 		if (ret < 0) {
9150dbe550aSVolodymyr Fialko 			EH_LOG_ERR("Failed to start event crypto device %d (%d)",
9160dbe550aSVolodymyr Fialko 					cdev_id, ret);
9170dbe550aSVolodymyr Fialko 			return ret;
9180dbe550aSVolodymyr Fialko 		}
9190dbe550aSVolodymyr Fialko 	}
9200dbe550aSVolodymyr Fialko 
9210dbe550aSVolodymyr Fialko 	return 0;
9220dbe550aSVolodymyr Fialko }
9230dbe550aSVolodymyr Fialko 
9240dbe550aSVolodymyr Fialko static int
9250dbe550aSVolodymyr Fialko eh_stop_crypto_adapter(struct eventmode_conf *em_conf)
9260dbe550aSVolodymyr Fialko {
9270dbe550aSVolodymyr Fialko 	uint8_t cdev_id, n;
9280dbe550aSVolodymyr Fialko 	int ret;
9290dbe550aSVolodymyr Fialko 
9300dbe550aSVolodymyr Fialko 	if (!em_conf->enable_event_crypto_adapter)
9310dbe550aSVolodymyr Fialko 		return 0;
9320dbe550aSVolodymyr Fialko 
9330dbe550aSVolodymyr Fialko 	n = rte_cryptodev_count();
9340dbe550aSVolodymyr Fialko 	for (cdev_id = 0; cdev_id != n; cdev_id++) {
9350dbe550aSVolodymyr Fialko 		ret = rte_event_crypto_adapter_stop(cdev_id);
9360dbe550aSVolodymyr Fialko 		if (ret < 0) {
9370dbe550aSVolodymyr Fialko 			EH_LOG_ERR("Failed to stop event crypto device %d (%d)",
9380dbe550aSVolodymyr Fialko 					cdev_id, ret);
9390dbe550aSVolodymyr Fialko 			return ret;
9400dbe550aSVolodymyr Fialko 		}
9410dbe550aSVolodymyr Fialko 	}
9420dbe550aSVolodymyr Fialko 
9430dbe550aSVolodymyr Fialko 	return 0;
9440dbe550aSVolodymyr Fialko }
9450dbe550aSVolodymyr Fialko 
9460dbe550aSVolodymyr Fialko static int
94786738ebeSSrujana Challa eh_event_vector_limits_validate(struct eventmode_conf *em_conf,
94886738ebeSSrujana Challa 				uint8_t ev_dev_id, uint8_t ethdev_id)
94986738ebeSSrujana Challa {
95086738ebeSSrujana Challa 	struct rte_event_eth_rx_adapter_vector_limits limits = {0};
95186738ebeSSrujana Challa 	uint16_t vector_size = em_conf->ext_params.vector_size;
95286738ebeSSrujana Challa 	int ret;
95386738ebeSSrujana Challa 
95486738ebeSSrujana Challa 	ret = rte_event_eth_rx_adapter_vector_limits_get(ev_dev_id, ethdev_id,
95586738ebeSSrujana Challa 							 &limits);
95686738ebeSSrujana Challa 	if (ret) {
95786738ebeSSrujana Challa 		EH_LOG_ERR("failed to get vector limits");
95886738ebeSSrujana Challa 		return ret;
95986738ebeSSrujana Challa 	}
96086738ebeSSrujana Challa 
96186738ebeSSrujana Challa 	if (vector_size < limits.min_sz || vector_size > limits.max_sz) {
96286738ebeSSrujana Challa 		EH_LOG_ERR("Vector size [%d] not within limits min[%d] max[%d]",
96386738ebeSSrujana Challa 			   vector_size, limits.min_sz, limits.max_sz);
96486738ebeSSrujana Challa 		return -EINVAL;
96586738ebeSSrujana Challa 	}
96686738ebeSSrujana Challa 
96786738ebeSSrujana Challa 	if (limits.log2_sz && !rte_is_power_of_2(vector_size)) {
96886738ebeSSrujana Challa 		EH_LOG_ERR("Vector size [%d] not power of 2", vector_size);
96986738ebeSSrujana Challa 		return -EINVAL;
97086738ebeSSrujana Challa 	}
97186738ebeSSrujana Challa 
97286738ebeSSrujana Challa 	if (em_conf->vector_tmo_ns > limits.max_timeout_ns ||
97386738ebeSSrujana Challa 	    em_conf->vector_tmo_ns < limits.min_timeout_ns) {
97486738ebeSSrujana Challa 		EH_LOG_ERR("Vector timeout [%" PRIu64
97586738ebeSSrujana Challa 			   "] not within limits max[%" PRIu64
97686738ebeSSrujana Challa 			   "] min[%" PRIu64 "]",
97786738ebeSSrujana Challa 			   em_conf->vector_tmo_ns,
97886738ebeSSrujana Challa 			   limits.max_timeout_ns,
97986738ebeSSrujana Challa 			   limits.min_timeout_ns);
98086738ebeSSrujana Challa 		return -EINVAL;
98186738ebeSSrujana Challa 	}
98286738ebeSSrujana Challa 	return 0;
98386738ebeSSrujana Challa }
98486738ebeSSrujana Challa 
98586738ebeSSrujana Challa static int
98602afed59SAnoob Joseph eh_rx_adapter_configure(struct eventmode_conf *em_conf,
98702afed59SAnoob Joseph 		struct rx_adapter_conf *adapter)
98802afed59SAnoob Joseph {
98902afed59SAnoob Joseph 	struct rte_event_eth_rx_adapter_queue_conf queue_conf = {0};
99002afed59SAnoob Joseph 	struct rte_event_dev_info evdev_default_conf = {0};
99102afed59SAnoob Joseph 	struct rte_event_port_conf port_conf = {0};
99202afed59SAnoob Joseph 	struct rx_adapter_connection_info *conn;
99386738ebeSSrujana Challa 	uint32_t service_id, socket_id, nb_elem;
99486738ebeSSrujana Challa 	struct rte_mempool *vector_pool = NULL;
99586738ebeSSrujana Challa 	uint32_t lcore_id = rte_lcore_id();
99648a39871SNithin Dabilpuram 	int ret, portid, nb_ports = 0;
99702afed59SAnoob Joseph 	uint8_t eventdev_id;
99802afed59SAnoob Joseph 	int j;
99902afed59SAnoob Joseph 
100002afed59SAnoob Joseph 	/* Get event dev ID */
100102afed59SAnoob Joseph 	eventdev_id = adapter->eventdev_id;
100202afed59SAnoob Joseph 
100302afed59SAnoob Joseph 	/* Get default configuration of event dev */
100402afed59SAnoob Joseph 	ret = rte_event_dev_info_get(eventdev_id, &evdev_default_conf);
100502afed59SAnoob Joseph 	if (ret < 0) {
100602afed59SAnoob Joseph 		EH_LOG_ERR("Failed to get event dev info %d", ret);
100702afed59SAnoob Joseph 		return ret;
100802afed59SAnoob Joseph 	}
100902afed59SAnoob Joseph 
101048a39871SNithin Dabilpuram 	RTE_ETH_FOREACH_DEV(portid)
101148a39871SNithin Dabilpuram 		if ((em_conf->eth_portmask & (1 << portid)))
101248a39871SNithin Dabilpuram 			nb_ports++;
101348a39871SNithin Dabilpuram 
101486738ebeSSrujana Challa 	if (em_conf->ext_params.event_vector) {
101586738ebeSSrujana Challa 		socket_id = rte_lcore_to_socket_id(lcore_id);
101648a39871SNithin Dabilpuram 
101748a39871SNithin Dabilpuram 		if (em_conf->vector_pool_sz) {
101848a39871SNithin Dabilpuram 			nb_elem = em_conf->vector_pool_sz;
101948a39871SNithin Dabilpuram 		} else {
102048a39871SNithin Dabilpuram 			nb_elem = (nb_bufs_in_pool /
102148a39871SNithin Dabilpuram 				   em_conf->ext_params.vector_size) + 1;
102248a39871SNithin Dabilpuram 			if (per_port_pool)
102348a39871SNithin Dabilpuram 				nb_elem = nb_ports * nb_elem;
102431edfc4aSPavan Nikhilesh 			nb_elem = RTE_MAX(512U, nb_elem);
102548a39871SNithin Dabilpuram 		}
102631edfc4aSPavan Nikhilesh 		nb_elem += rte_lcore_count() * 32;
102786738ebeSSrujana Challa 		vector_pool = rte_event_vector_pool_create(
102831edfc4aSPavan Nikhilesh 			"vector_pool", nb_elem, 32,
102931edfc4aSPavan Nikhilesh 			em_conf->ext_params.vector_size, socket_id);
103086738ebeSSrujana Challa 		if (vector_pool == NULL) {
103186738ebeSSrujana Challa 			EH_LOG_ERR("failed to create event vector pool");
103286738ebeSSrujana Challa 			return -ENOMEM;
103386738ebeSSrujana Challa 		}
103486738ebeSSrujana Challa 	}
103502afed59SAnoob Joseph 	/* Setup port conf */
103602afed59SAnoob Joseph 	port_conf.new_event_threshold = 1200;
103702afed59SAnoob Joseph 	port_conf.dequeue_depth =
103802afed59SAnoob Joseph 			evdev_default_conf.max_event_port_dequeue_depth;
103902afed59SAnoob Joseph 	port_conf.enqueue_depth =
104002afed59SAnoob Joseph 			evdev_default_conf.max_event_port_enqueue_depth;
104102afed59SAnoob Joseph 
104202afed59SAnoob Joseph 	/* Create Rx adapter */
104302afed59SAnoob Joseph 	ret = rte_event_eth_rx_adapter_create(adapter->adapter_id,
104402afed59SAnoob Joseph 			adapter->eventdev_id, &port_conf);
104502afed59SAnoob Joseph 	if (ret < 0) {
104602afed59SAnoob Joseph 		EH_LOG_ERR("Failed to create rx adapter %d", ret);
104702afed59SAnoob Joseph 		return ret;
104802afed59SAnoob Joseph 	}
104902afed59SAnoob Joseph 
105002afed59SAnoob Joseph 	/* Setup various connections in the adapter */
105102afed59SAnoob Joseph 	for (j = 0; j < adapter->nb_connections; j++) {
105202afed59SAnoob Joseph 		/* Get connection */
105302afed59SAnoob Joseph 		conn = &(adapter->conn[j]);
105402afed59SAnoob Joseph 
105502afed59SAnoob Joseph 		/* Setup queue conf */
105602afed59SAnoob Joseph 		queue_conf.ev.queue_id = conn->eventq_id;
105702afed59SAnoob Joseph 		queue_conf.ev.sched_type = em_conf->ext_params.sched_type;
105802afed59SAnoob Joseph 		queue_conf.ev.event_type = RTE_EVENT_TYPE_ETHDEV;
105902afed59SAnoob Joseph 
106086738ebeSSrujana Challa 		if (em_conf->ext_params.event_vector) {
106186738ebeSSrujana Challa 			ret = eh_event_vector_limits_validate(em_conf,
106286738ebeSSrujana Challa 							      eventdev_id,
106386738ebeSSrujana Challa 							      conn->ethdev_id);
106486738ebeSSrujana Challa 			if (ret)
106586738ebeSSrujana Challa 				return ret;
106686738ebeSSrujana Challa 
106786738ebeSSrujana Challa 			queue_conf.vector_sz = em_conf->ext_params.vector_size;
106886738ebeSSrujana Challa 			queue_conf.vector_timeout_ns = em_conf->vector_tmo_ns;
106986738ebeSSrujana Challa 			queue_conf.vector_mp = vector_pool;
107086738ebeSSrujana Challa 			queue_conf.rx_queue_flags =
107186738ebeSSrujana Challa 				RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR;
107286738ebeSSrujana Challa 		}
107386738ebeSSrujana Challa 
107402afed59SAnoob Joseph 		/* Add queue to the adapter */
107502afed59SAnoob Joseph 		ret = rte_event_eth_rx_adapter_queue_add(adapter->adapter_id,
107602afed59SAnoob Joseph 				conn->ethdev_id, conn->ethdev_rx_qid,
107702afed59SAnoob Joseph 				&queue_conf);
107802afed59SAnoob Joseph 		if (ret < 0) {
107902afed59SAnoob Joseph 			EH_LOG_ERR("Failed to add eth queue to rx adapter %d",
108002afed59SAnoob Joseph 				   ret);
108102afed59SAnoob Joseph 			return ret;
108202afed59SAnoob Joseph 		}
108302afed59SAnoob Joseph 	}
108402afed59SAnoob Joseph 
108502afed59SAnoob Joseph 	/* Get the service ID used by rx adapter */
108602afed59SAnoob Joseph 	ret = rte_event_eth_rx_adapter_service_id_get(adapter->adapter_id,
108702afed59SAnoob Joseph 						      &service_id);
108802afed59SAnoob Joseph 	if (ret != -ESRCH && ret < 0) {
108902afed59SAnoob Joseph 		EH_LOG_ERR("Failed to get service id used by rx adapter %d",
109002afed59SAnoob Joseph 			   ret);
109102afed59SAnoob Joseph 		return ret;
109202afed59SAnoob Joseph 	}
109302afed59SAnoob Joseph 
109402afed59SAnoob Joseph 	rte_service_set_runstate_mapped_check(service_id, 0);
109502afed59SAnoob Joseph 
109602afed59SAnoob Joseph 	/* Start adapter */
109702afed59SAnoob Joseph 	ret = rte_event_eth_rx_adapter_start(adapter->adapter_id);
109802afed59SAnoob Joseph 	if (ret < 0) {
109902afed59SAnoob Joseph 		EH_LOG_ERR("Failed to start rx adapter %d", ret);
110002afed59SAnoob Joseph 		return ret;
110102afed59SAnoob Joseph 	}
110202afed59SAnoob Joseph 
110302afed59SAnoob Joseph 	return 0;
110402afed59SAnoob Joseph }
110502afed59SAnoob Joseph 
110602afed59SAnoob Joseph static int
110702afed59SAnoob Joseph eh_initialize_rx_adapter(struct eventmode_conf *em_conf)
110802afed59SAnoob Joseph {
110902afed59SAnoob Joseph 	struct rx_adapter_conf *adapter;
111002afed59SAnoob Joseph 	int i, ret;
111102afed59SAnoob Joseph 
111202afed59SAnoob Joseph 	/* Configure rx adapters */
111302afed59SAnoob Joseph 	for (i = 0; i < em_conf->nb_rx_adapter; i++) {
111402afed59SAnoob Joseph 		adapter = &(em_conf->rx_adapter[i]);
111502afed59SAnoob Joseph 		ret = eh_rx_adapter_configure(em_conf, adapter);
111602afed59SAnoob Joseph 		if (ret < 0) {
111702afed59SAnoob Joseph 			EH_LOG_ERR("Failed to configure rx adapter %d", ret);
111802afed59SAnoob Joseph 			return ret;
111902afed59SAnoob Joseph 		}
112002afed59SAnoob Joseph 	}
112102afed59SAnoob Joseph 	return 0;
112202afed59SAnoob Joseph }
112302afed59SAnoob Joseph 
11241bf6baacSLukasz Bartosik static int32_t
11251bf6baacSLukasz Bartosik eh_start_worker_eth_core(struct eventmode_conf *conf, uint32_t lcore_id)
11261bf6baacSLukasz Bartosik {
11271bf6baacSLukasz Bartosik 	uint32_t service_id[EVENT_MODE_MAX_ADAPTERS_PER_RX_CORE];
11281bf6baacSLukasz Bartosik 	struct rx_adapter_conf *rx_adapter;
11291bf6baacSLukasz Bartosik 	struct tx_adapter_conf *tx_adapter;
11301bf6baacSLukasz Bartosik 	int service_count = 0;
11311bf6baacSLukasz Bartosik 	int adapter_id;
11321bf6baacSLukasz Bartosik 	int32_t ret;
11331bf6baacSLukasz Bartosik 	int i;
11341bf6baacSLukasz Bartosik 
11351bf6baacSLukasz Bartosik 	EH_LOG_INFO("Entering eth_core processing on lcore %u", lcore_id);
11361bf6baacSLukasz Bartosik 
11371bf6baacSLukasz Bartosik 	/*
11381bf6baacSLukasz Bartosik 	 * Parse adapter config to check which of all Rx adapters need
11391bf6baacSLukasz Bartosik 	 * to be handled by this core.
11401bf6baacSLukasz Bartosik 	 */
11411bf6baacSLukasz Bartosik 	for (i = 0; i < conf->nb_rx_adapter; i++) {
11421bf6baacSLukasz Bartosik 		/* Check if we have exceeded the max allowed */
11431bf6baacSLukasz Bartosik 		if (service_count > EVENT_MODE_MAX_ADAPTERS_PER_RX_CORE) {
11441bf6baacSLukasz Bartosik 			EH_LOG_ERR(
11451bf6baacSLukasz Bartosik 			      "Exceeded the max allowed adapters per rx core");
11461bf6baacSLukasz Bartosik 			break;
11471bf6baacSLukasz Bartosik 		}
11481bf6baacSLukasz Bartosik 
11491bf6baacSLukasz Bartosik 		rx_adapter = &(conf->rx_adapter[i]);
11501bf6baacSLukasz Bartosik 		if (rx_adapter->rx_core_id != lcore_id)
11511bf6baacSLukasz Bartosik 			continue;
11521bf6baacSLukasz Bartosik 
11531bf6baacSLukasz Bartosik 		/* Adapter is handled by this core */
11541bf6baacSLukasz Bartosik 		adapter_id = rx_adapter->adapter_id;
11551bf6baacSLukasz Bartosik 
11561bf6baacSLukasz Bartosik 		/* Get the service ID for the adapters */
11571bf6baacSLukasz Bartosik 		ret = rte_event_eth_rx_adapter_service_id_get(adapter_id,
11581bf6baacSLukasz Bartosik 				&(service_id[service_count]));
11591bf6baacSLukasz Bartosik 
11601bf6baacSLukasz Bartosik 		if (ret != -ESRCH && ret < 0) {
11611bf6baacSLukasz Bartosik 			EH_LOG_ERR(
11621bf6baacSLukasz Bartosik 				"Failed to get service id used by rx adapter");
11631bf6baacSLukasz Bartosik 			return ret;
11641bf6baacSLukasz Bartosik 		}
11651bf6baacSLukasz Bartosik 
11661bf6baacSLukasz Bartosik 		/* Update service count */
11671bf6baacSLukasz Bartosik 		service_count++;
11681bf6baacSLukasz Bartosik 	}
11691bf6baacSLukasz Bartosik 
11701bf6baacSLukasz Bartosik 	/*
11711bf6baacSLukasz Bartosik 	 * Parse adapter config to see which of all Tx adapters need
11721bf6baacSLukasz Bartosik 	 * to be handled by this core.
11731bf6baacSLukasz Bartosik 	 */
11741bf6baacSLukasz Bartosik 	for (i = 0; i < conf->nb_tx_adapter; i++) {
11751bf6baacSLukasz Bartosik 		/* Check if we have exceeded the max allowed */
11761bf6baacSLukasz Bartosik 		if (service_count > EVENT_MODE_MAX_ADAPTERS_PER_TX_CORE) {
11771bf6baacSLukasz Bartosik 			EH_LOG_ERR(
11781bf6baacSLukasz Bartosik 				"Exceeded the max allowed adapters per tx core");
11791bf6baacSLukasz Bartosik 			break;
11801bf6baacSLukasz Bartosik 		}
11811bf6baacSLukasz Bartosik 
11821bf6baacSLukasz Bartosik 		tx_adapter = &conf->tx_adapter[i];
11831bf6baacSLukasz Bartosik 		if (tx_adapter->tx_core_id != lcore_id)
11841bf6baacSLukasz Bartosik 			continue;
11851bf6baacSLukasz Bartosik 
11861bf6baacSLukasz Bartosik 		/* Adapter is handled by this core */
11871bf6baacSLukasz Bartosik 		adapter_id = tx_adapter->adapter_id;
11881bf6baacSLukasz Bartosik 
11891bf6baacSLukasz Bartosik 		/* Get the service ID for the adapters */
11901bf6baacSLukasz Bartosik 		ret = rte_event_eth_tx_adapter_service_id_get(adapter_id,
11911bf6baacSLukasz Bartosik 				&(service_id[service_count]));
11921bf6baacSLukasz Bartosik 
11931bf6baacSLukasz Bartosik 		if (ret != -ESRCH && ret < 0) {
11941bf6baacSLukasz Bartosik 			EH_LOG_ERR(
11951bf6baacSLukasz Bartosik 				"Failed to get service id used by tx adapter");
11961bf6baacSLukasz Bartosik 			return ret;
11971bf6baacSLukasz Bartosik 		}
11981bf6baacSLukasz Bartosik 
11991bf6baacSLukasz Bartosik 		/* Update service count */
12001bf6baacSLukasz Bartosik 		service_count++;
12011bf6baacSLukasz Bartosik 	}
12021bf6baacSLukasz Bartosik 
12031bf6baacSLukasz Bartosik 	eth_core_running = true;
12041bf6baacSLukasz Bartosik 
12051bf6baacSLukasz Bartosik 	while (eth_core_running) {
12061bf6baacSLukasz Bartosik 		for (i = 0; i < service_count; i++) {
12071bf6baacSLukasz Bartosik 			/* Initiate adapter service */
12081bf6baacSLukasz Bartosik 			rte_service_run_iter_on_app_lcore(service_id[i], 0);
12091bf6baacSLukasz Bartosik 		}
12101bf6baacSLukasz Bartosik 	}
12111bf6baacSLukasz Bartosik 
12121bf6baacSLukasz Bartosik 	return 0;
12131bf6baacSLukasz Bartosik }
12141bf6baacSLukasz Bartosik 
12151bf6baacSLukasz Bartosik static int32_t
12161bf6baacSLukasz Bartosik eh_stop_worker_eth_core(void)
12171bf6baacSLukasz Bartosik {
12181bf6baacSLukasz Bartosik 	if (eth_core_running) {
12191bf6baacSLukasz Bartosik 		EH_LOG_INFO("Stopping eth cores");
12201bf6baacSLukasz Bartosik 		eth_core_running = false;
12211bf6baacSLukasz Bartosik 	}
12221bf6baacSLukasz Bartosik 	return 0;
12231bf6baacSLukasz Bartosik }
12241bf6baacSLukasz Bartosik 
12251bf6baacSLukasz Bartosik static struct eh_app_worker_params *
12261bf6baacSLukasz Bartosik eh_find_worker(uint32_t lcore_id, struct eh_conf *conf,
12271bf6baacSLukasz Bartosik 		struct eh_app_worker_params *app_wrkrs, uint8_t nb_wrkr_param)
12281bf6baacSLukasz Bartosik {
12291bf6baacSLukasz Bartosik 	struct eh_app_worker_params curr_conf = { {{0} }, NULL};
12301bf6baacSLukasz Bartosik 	struct eh_event_link_info *link = NULL;
12311bf6baacSLukasz Bartosik 	struct eh_app_worker_params *tmp_wrkr;
12321bf6baacSLukasz Bartosik 	struct eventmode_conf *em_conf;
12331bf6baacSLukasz Bartosik 	uint8_t eventdev_id;
12341bf6baacSLukasz Bartosik 	int i;
12351bf6baacSLukasz Bartosik 
12361bf6baacSLukasz Bartosik 	/* Get eventmode config */
12371bf6baacSLukasz Bartosik 	em_conf = conf->mode_params;
12381bf6baacSLukasz Bartosik 
12391bf6baacSLukasz Bartosik 	/*
12401bf6baacSLukasz Bartosik 	 * Use event device from the first lcore-event link.
12411bf6baacSLukasz Bartosik 	 *
12421bf6baacSLukasz Bartosik 	 * Assumption: All lcore-event links tied to a core are using the
12431bf6baacSLukasz Bartosik 	 * same event device. In other words, one core would be polling on
12441bf6baacSLukasz Bartosik 	 * queues of a single event device only.
12451bf6baacSLukasz Bartosik 	 */
12461bf6baacSLukasz Bartosik 
12471bf6baacSLukasz Bartosik 	/* Get a link for this lcore */
12481bf6baacSLukasz Bartosik 	for (i = 0; i < em_conf->nb_link; i++) {
12491bf6baacSLukasz Bartosik 		link = &(em_conf->link[i]);
12501bf6baacSLukasz Bartosik 		if (link->lcore_id == lcore_id)
12511bf6baacSLukasz Bartosik 			break;
12521bf6baacSLukasz Bartosik 	}
12531bf6baacSLukasz Bartosik 
12541bf6baacSLukasz Bartosik 	if (link == NULL) {
12551bf6baacSLukasz Bartosik 		EH_LOG_ERR("No valid link found for lcore %d", lcore_id);
12561bf6baacSLukasz Bartosik 		return NULL;
12571bf6baacSLukasz Bartosik 	}
12581bf6baacSLukasz Bartosik 
12591bf6baacSLukasz Bartosik 	/* Get event dev ID */
12601bf6baacSLukasz Bartosik 	eventdev_id = link->eventdev_id;
12611bf6baacSLukasz Bartosik 
12621bf6baacSLukasz Bartosik 	/* Populate the curr_conf with the capabilities */
12631bf6baacSLukasz Bartosik 
1264ec3cc53fSLukasz Bartosik 	/* Check for Tx internal port */
1265ec3cc53fSLukasz Bartosik 	if (eh_dev_has_tx_internal_port(eventdev_id))
1266ec3cc53fSLukasz Bartosik 		curr_conf.cap.tx_internal_port = EH_TX_TYPE_INTERNAL_PORT;
1267ec3cc53fSLukasz Bartosik 	else
1268ec3cc53fSLukasz Bartosik 		curr_conf.cap.tx_internal_port = EH_TX_TYPE_NO_INTERNAL_PORT;
1269ec3cc53fSLukasz Bartosik 
12701bf6baacSLukasz Bartosik 	/* Check for burst mode */
12711bf6baacSLukasz Bartosik 	if (eh_dev_has_burst_mode(eventdev_id))
12721bf6baacSLukasz Bartosik 		curr_conf.cap.burst = EH_RX_TYPE_BURST;
12731bf6baacSLukasz Bartosik 	else
12741bf6baacSLukasz Bartosik 		curr_conf.cap.burst = EH_RX_TYPE_NON_BURST;
12751bf6baacSLukasz Bartosik 
127665e3a202SLukasz Bartosik 	curr_conf.cap.ipsec_mode = conf->ipsec_mode;
127765e3a202SLukasz Bartosik 
12781bf6baacSLukasz Bartosik 	/* Parse the passed list and see if we have matching capabilities */
12791bf6baacSLukasz Bartosik 
12801bf6baacSLukasz Bartosik 	/* Initialize the pointer used to traverse the list */
12811bf6baacSLukasz Bartosik 	tmp_wrkr = app_wrkrs;
12821bf6baacSLukasz Bartosik 
12831bf6baacSLukasz Bartosik 	for (i = 0; i < nb_wrkr_param; i++, tmp_wrkr++) {
12841bf6baacSLukasz Bartosik 
12851bf6baacSLukasz Bartosik 		/* Skip this if capabilities are not matching */
12861bf6baacSLukasz Bartosik 		if (tmp_wrkr->cap.u64 != curr_conf.cap.u64)
12871bf6baacSLukasz Bartosik 			continue;
12881bf6baacSLukasz Bartosik 
12891bf6baacSLukasz Bartosik 		/* If the checks pass, we have a match */
12901bf6baacSLukasz Bartosik 		return tmp_wrkr;
12911bf6baacSLukasz Bartosik 	}
12921bf6baacSLukasz Bartosik 
12931bf6baacSLukasz Bartosik 	return NULL;
12941bf6baacSLukasz Bartosik }
12951bf6baacSLukasz Bartosik 
12961bf6baacSLukasz Bartosik static int
12971bf6baacSLukasz Bartosik eh_verify_match_worker(struct eh_app_worker_params *match_wrkr)
12981bf6baacSLukasz Bartosik {
12991bf6baacSLukasz Bartosik 	/* Verify registered worker */
13001bf6baacSLukasz Bartosik 	if (match_wrkr->worker_thread == NULL) {
13011bf6baacSLukasz Bartosik 		EH_LOG_ERR("No worker registered");
13021bf6baacSLukasz Bartosik 		return 0;
13031bf6baacSLukasz Bartosik 	}
13041bf6baacSLukasz Bartosik 
13051bf6baacSLukasz Bartosik 	/* Success */
13061bf6baacSLukasz Bartosik 	return 1;
13071bf6baacSLukasz Bartosik }
13081bf6baacSLukasz Bartosik 
13091bf6baacSLukasz Bartosik static uint8_t
13101bf6baacSLukasz Bartosik eh_get_event_lcore_links(uint32_t lcore_id, struct eh_conf *conf,
13111bf6baacSLukasz Bartosik 		struct eh_event_link_info **links)
13121bf6baacSLukasz Bartosik {
13131bf6baacSLukasz Bartosik 	struct eh_event_link_info *link_cache;
13141bf6baacSLukasz Bartosik 	struct eventmode_conf *em_conf = NULL;
13151bf6baacSLukasz Bartosik 	struct eh_event_link_info *link;
13161bf6baacSLukasz Bartosik 	uint8_t lcore_nb_link = 0;
13171bf6baacSLukasz Bartosik 	size_t single_link_size;
13181bf6baacSLukasz Bartosik 	size_t cache_size;
13191bf6baacSLukasz Bartosik 	int index = 0;
13201bf6baacSLukasz Bartosik 	int i;
13211bf6baacSLukasz Bartosik 
13221bf6baacSLukasz Bartosik 	if (conf == NULL || links == NULL) {
13231bf6baacSLukasz Bartosik 		EH_LOG_ERR("Invalid args");
13241bf6baacSLukasz Bartosik 		return -EINVAL;
13251bf6baacSLukasz Bartosik 	}
13261bf6baacSLukasz Bartosik 
13271bf6baacSLukasz Bartosik 	/* Get eventmode conf */
13281bf6baacSLukasz Bartosik 	em_conf = conf->mode_params;
13291bf6baacSLukasz Bartosik 
13301bf6baacSLukasz Bartosik 	if (em_conf == NULL) {
13311bf6baacSLukasz Bartosik 		EH_LOG_ERR("Invalid event mode parameters");
13321bf6baacSLukasz Bartosik 		return -EINVAL;
13331bf6baacSLukasz Bartosik 	}
13341bf6baacSLukasz Bartosik 
13351bf6baacSLukasz Bartosik 	/* Get the number of links registered */
13361bf6baacSLukasz Bartosik 	for (i = 0; i < em_conf->nb_link; i++) {
13371bf6baacSLukasz Bartosik 
13381bf6baacSLukasz Bartosik 		/* Get link */
13391bf6baacSLukasz Bartosik 		link = &(em_conf->link[i]);
13401bf6baacSLukasz Bartosik 
13411bf6baacSLukasz Bartosik 		/* Check if we have link intended for this lcore */
13421bf6baacSLukasz Bartosik 		if (link->lcore_id == lcore_id) {
13431bf6baacSLukasz Bartosik 
13441bf6baacSLukasz Bartosik 			/* Update the number of links for this core */
13451bf6baacSLukasz Bartosik 			lcore_nb_link++;
13461bf6baacSLukasz Bartosik 
13471bf6baacSLukasz Bartosik 		}
13481bf6baacSLukasz Bartosik 	}
13491bf6baacSLukasz Bartosik 
13501bf6baacSLukasz Bartosik 	/* Compute size of one entry to be copied */
13511bf6baacSLukasz Bartosik 	single_link_size = sizeof(struct eh_event_link_info);
13521bf6baacSLukasz Bartosik 
13531bf6baacSLukasz Bartosik 	/* Compute size of the buffer required */
13541bf6baacSLukasz Bartosik 	cache_size = lcore_nb_link * sizeof(struct eh_event_link_info);
13551bf6baacSLukasz Bartosik 
13561bf6baacSLukasz Bartosik 	/* Compute size of the buffer required */
13571bf6baacSLukasz Bartosik 	link_cache = calloc(1, cache_size);
13581bf6baacSLukasz Bartosik 
13591bf6baacSLukasz Bartosik 	/* Get the number of links registered */
13601bf6baacSLukasz Bartosik 	for (i = 0; i < em_conf->nb_link; i++) {
13611bf6baacSLukasz Bartosik 
13621bf6baacSLukasz Bartosik 		/* Get link */
13631bf6baacSLukasz Bartosik 		link = &(em_conf->link[i]);
13641bf6baacSLukasz Bartosik 
13651bf6baacSLukasz Bartosik 		/* Check if we have link intended for this lcore */
13661bf6baacSLukasz Bartosik 		if (link->lcore_id == lcore_id) {
13671bf6baacSLukasz Bartosik 
13681bf6baacSLukasz Bartosik 			/* Cache the link */
13691bf6baacSLukasz Bartosik 			memcpy(&link_cache[index], link, single_link_size);
13701bf6baacSLukasz Bartosik 
13711bf6baacSLukasz Bartosik 			/* Update index */
13721bf6baacSLukasz Bartosik 			index++;
13731bf6baacSLukasz Bartosik 		}
13741bf6baacSLukasz Bartosik 	}
13751bf6baacSLukasz Bartosik 
13761bf6baacSLukasz Bartosik 	/* Update the links for application to use the cached links */
13771bf6baacSLukasz Bartosik 	*links = link_cache;
13781bf6baacSLukasz Bartosik 
13791bf6baacSLukasz Bartosik 	/* Return the number of cached links */
13801bf6baacSLukasz Bartosik 	return lcore_nb_link;
13811bf6baacSLukasz Bartosik }
13821bf6baacSLukasz Bartosik 
13831d89ccf3SAnoob Joseph static int
13841d89ccf3SAnoob Joseph eh_tx_adapter_configure(struct eventmode_conf *em_conf,
13851d89ccf3SAnoob Joseph 		struct tx_adapter_conf *adapter)
13861d89ccf3SAnoob Joseph {
13871d89ccf3SAnoob Joseph 	struct rte_event_dev_info evdev_default_conf = {0};
13881d89ccf3SAnoob Joseph 	struct rte_event_port_conf port_conf = {0};
13891d89ccf3SAnoob Joseph 	struct tx_adapter_connection_info *conn;
13901d89ccf3SAnoob Joseph 	struct eventdev_params *eventdev_config;
13911d89ccf3SAnoob Joseph 	uint8_t tx_port_id = 0;
13921d89ccf3SAnoob Joseph 	uint8_t eventdev_id;
13931d89ccf3SAnoob Joseph 	uint32_t service_id;
13941d89ccf3SAnoob Joseph 	int ret, j;
13951d89ccf3SAnoob Joseph 
13961d89ccf3SAnoob Joseph 	/* Get event dev ID */
13971d89ccf3SAnoob Joseph 	eventdev_id = adapter->eventdev_id;
13981d89ccf3SAnoob Joseph 
13991d89ccf3SAnoob Joseph 	/* Get event device conf */
14001d89ccf3SAnoob Joseph 	eventdev_config = eh_get_eventdev_params(em_conf, eventdev_id);
14011d89ccf3SAnoob Joseph 
14021d89ccf3SAnoob Joseph 	/* Create Tx adapter */
14031d89ccf3SAnoob Joseph 
14041d89ccf3SAnoob Joseph 	/* Get default configuration of event dev */
14051d89ccf3SAnoob Joseph 	ret = rte_event_dev_info_get(eventdev_id, &evdev_default_conf);
14061d89ccf3SAnoob Joseph 	if (ret < 0) {
14071d89ccf3SAnoob Joseph 		EH_LOG_ERR("Failed to get event dev info %d", ret);
14081d89ccf3SAnoob Joseph 		return ret;
14091d89ccf3SAnoob Joseph 	}
14101d89ccf3SAnoob Joseph 
14111d89ccf3SAnoob Joseph 	/* Setup port conf */
14121d89ccf3SAnoob Joseph 	port_conf.new_event_threshold =
14131d89ccf3SAnoob Joseph 			evdev_default_conf.max_num_events;
14141d89ccf3SAnoob Joseph 	port_conf.dequeue_depth =
14151d89ccf3SAnoob Joseph 			evdev_default_conf.max_event_port_dequeue_depth;
14161d89ccf3SAnoob Joseph 	port_conf.enqueue_depth =
14171d89ccf3SAnoob Joseph 			evdev_default_conf.max_event_port_enqueue_depth;
14181d89ccf3SAnoob Joseph 
14191d89ccf3SAnoob Joseph 	/* Create adapter */
14201d89ccf3SAnoob Joseph 	ret = rte_event_eth_tx_adapter_create(adapter->adapter_id,
14211d89ccf3SAnoob Joseph 			adapter->eventdev_id, &port_conf);
14221d89ccf3SAnoob Joseph 	if (ret < 0) {
14231d89ccf3SAnoob Joseph 		EH_LOG_ERR("Failed to create tx adapter %d", ret);
14241d89ccf3SAnoob Joseph 		return ret;
14251d89ccf3SAnoob Joseph 	}
14261d89ccf3SAnoob Joseph 
14271d89ccf3SAnoob Joseph 	/* Setup various connections in the adapter */
14281d89ccf3SAnoob Joseph 	for (j = 0; j < adapter->nb_connections; j++) {
14291d89ccf3SAnoob Joseph 
14301d89ccf3SAnoob Joseph 		/* Get connection */
14311d89ccf3SAnoob Joseph 		conn = &(adapter->conn[j]);
14321d89ccf3SAnoob Joseph 
14331d89ccf3SAnoob Joseph 		/* Add queue to the adapter */
14341d89ccf3SAnoob Joseph 		ret = rte_event_eth_tx_adapter_queue_add(adapter->adapter_id,
14351d89ccf3SAnoob Joseph 				conn->ethdev_id, conn->ethdev_tx_qid);
14361d89ccf3SAnoob Joseph 		if (ret < 0) {
14371d89ccf3SAnoob Joseph 			EH_LOG_ERR("Failed to add eth queue to tx adapter %d",
14381d89ccf3SAnoob Joseph 				   ret);
14391d89ccf3SAnoob Joseph 			return ret;
14401d89ccf3SAnoob Joseph 		}
14411d89ccf3SAnoob Joseph 	}
14421d89ccf3SAnoob Joseph 
1443ec3cc53fSLukasz Bartosik 	/*
1444ec3cc53fSLukasz Bartosik 	 * Check if Tx core is assigned. If Tx core is not assigned then
1445ec3cc53fSLukasz Bartosik 	 * the adapter has internal port for submitting Tx packets and
1446ec3cc53fSLukasz Bartosik 	 * Tx event queue & port setup is not required
1447ec3cc53fSLukasz Bartosik 	 */
1448ec3cc53fSLukasz Bartosik 	if (adapter->tx_core_id == (uint32_t) (-1)) {
1449ec3cc53fSLukasz Bartosik 		/* Internal port is present */
1450ec3cc53fSLukasz Bartosik 		goto skip_tx_queue_port_setup;
1451ec3cc53fSLukasz Bartosik 	}
1452ec3cc53fSLukasz Bartosik 
14531d89ccf3SAnoob Joseph 	/* Setup Tx queue & port */
14541d89ccf3SAnoob Joseph 
14551d89ccf3SAnoob Joseph 	/* Get event port used by the adapter */
14561d89ccf3SAnoob Joseph 	ret = rte_event_eth_tx_adapter_event_port_get(
14571d89ccf3SAnoob Joseph 			adapter->adapter_id, &tx_port_id);
14581d89ccf3SAnoob Joseph 	if (ret) {
14591d89ccf3SAnoob Joseph 		EH_LOG_ERR("Failed to get tx adapter port id %d", ret);
14601d89ccf3SAnoob Joseph 		return ret;
14611d89ccf3SAnoob Joseph 	}
14621d89ccf3SAnoob Joseph 
14631d89ccf3SAnoob Joseph 	/*
14641d89ccf3SAnoob Joseph 	 * Tx event queue is reserved for Tx adapter. Unlink this queue
14651d89ccf3SAnoob Joseph 	 * from all other ports
14661d89ccf3SAnoob Joseph 	 *
14671d89ccf3SAnoob Joseph 	 */
14681d89ccf3SAnoob Joseph 	for (j = 0; j < eventdev_config->nb_eventport; j++) {
14691d89ccf3SAnoob Joseph 		rte_event_port_unlink(eventdev_id, j,
14701d89ccf3SAnoob Joseph 				      &(adapter->tx_ev_queue), 1);
14711d89ccf3SAnoob Joseph 	}
14721d89ccf3SAnoob Joseph 
14731d89ccf3SAnoob Joseph 	/* Link Tx event queue to Tx port */
14741d89ccf3SAnoob Joseph 	ret = rte_event_port_link(eventdev_id, tx_port_id,
14751d89ccf3SAnoob Joseph 			&(adapter->tx_ev_queue), NULL, 1);
14761d89ccf3SAnoob Joseph 	if (ret != 1) {
14771d89ccf3SAnoob Joseph 		EH_LOG_ERR("Failed to link event queue to port");
14781d89ccf3SAnoob Joseph 		return ret;
14791d89ccf3SAnoob Joseph 	}
14801d89ccf3SAnoob Joseph 
14811d89ccf3SAnoob Joseph 	/* Get the service ID used by Tx adapter */
14821d89ccf3SAnoob Joseph 	ret = rte_event_eth_tx_adapter_service_id_get(adapter->adapter_id,
14831d89ccf3SAnoob Joseph 						      &service_id);
14841d89ccf3SAnoob Joseph 	if (ret != -ESRCH && ret < 0) {
14851d89ccf3SAnoob Joseph 		EH_LOG_ERR("Failed to get service id used by tx adapter %d",
14861d89ccf3SAnoob Joseph 			   ret);
14871d89ccf3SAnoob Joseph 		return ret;
14881d89ccf3SAnoob Joseph 	}
14891d89ccf3SAnoob Joseph 
14901d89ccf3SAnoob Joseph 	rte_service_set_runstate_mapped_check(service_id, 0);
14911d89ccf3SAnoob Joseph 
1492ec3cc53fSLukasz Bartosik skip_tx_queue_port_setup:
14931d89ccf3SAnoob Joseph 	/* Start adapter */
14941d89ccf3SAnoob Joseph 	ret = rte_event_eth_tx_adapter_start(adapter->adapter_id);
14951d89ccf3SAnoob Joseph 	if (ret < 0) {
14961d89ccf3SAnoob Joseph 		EH_LOG_ERR("Failed to start tx adapter %d", ret);
14971d89ccf3SAnoob Joseph 		return ret;
14981d89ccf3SAnoob Joseph 	}
14991d89ccf3SAnoob Joseph 
15001d89ccf3SAnoob Joseph 	return 0;
15011d89ccf3SAnoob Joseph }
15021d89ccf3SAnoob Joseph 
15031d89ccf3SAnoob Joseph static int
15041d89ccf3SAnoob Joseph eh_initialize_tx_adapter(struct eventmode_conf *em_conf)
15051d89ccf3SAnoob Joseph {
15061d89ccf3SAnoob Joseph 	struct tx_adapter_conf *adapter;
15071d89ccf3SAnoob Joseph 	int i, ret;
15081d89ccf3SAnoob Joseph 
15091d89ccf3SAnoob Joseph 	/* Configure Tx adapters */
15101d89ccf3SAnoob Joseph 	for (i = 0; i < em_conf->nb_tx_adapter; i++) {
15111d89ccf3SAnoob Joseph 		adapter = &(em_conf->tx_adapter[i]);
15121d89ccf3SAnoob Joseph 		ret = eh_tx_adapter_configure(em_conf, adapter);
15131d89ccf3SAnoob Joseph 		if (ret < 0) {
15141d89ccf3SAnoob Joseph 			EH_LOG_ERR("Failed to configure tx adapter %d", ret);
15151d89ccf3SAnoob Joseph 			return ret;
15161d89ccf3SAnoob Joseph 		}
15171d89ccf3SAnoob Joseph 	}
15181d89ccf3SAnoob Joseph 	return 0;
15191d89ccf3SAnoob Joseph }
15201d89ccf3SAnoob Joseph 
15214ce38479SAnoob Joseph static void
15224ce38479SAnoob Joseph eh_display_operating_mode(struct eventmode_conf *em_conf)
15234ce38479SAnoob Joseph {
15244ce38479SAnoob Joseph 	char sched_types[][32] = {
15254ce38479SAnoob Joseph 		"RTE_SCHED_TYPE_ORDERED",
15264ce38479SAnoob Joseph 		"RTE_SCHED_TYPE_ATOMIC",
15274ce38479SAnoob Joseph 		"RTE_SCHED_TYPE_PARALLEL",
15284ce38479SAnoob Joseph 	};
15294ce38479SAnoob Joseph 	EH_LOG_INFO("Operating mode:");
15304ce38479SAnoob Joseph 
15314ce38479SAnoob Joseph 	EH_LOG_INFO("\tScheduling type: \t%s",
15324ce38479SAnoob Joseph 		sched_types[em_conf->ext_params.sched_type]);
15334ce38479SAnoob Joseph 
15344ce38479SAnoob Joseph 	EH_LOG_INFO("");
15354ce38479SAnoob Joseph }
15364ce38479SAnoob Joseph 
15374ce38479SAnoob Joseph static void
15384ce38479SAnoob Joseph eh_display_event_dev_conf(struct eventmode_conf *em_conf)
15394ce38479SAnoob Joseph {
15404ce38479SAnoob Joseph 	char queue_mode[][32] = {
15414ce38479SAnoob Joseph 		"",
15424ce38479SAnoob Joseph 		"ATQ (ALL TYPE QUEUE)",
15434ce38479SAnoob Joseph 		"SINGLE LINK",
15444ce38479SAnoob Joseph 	};
15454ce38479SAnoob Joseph 	char print_buf[256] = { 0 };
15464ce38479SAnoob Joseph 	int i;
15474ce38479SAnoob Joseph 
15484ce38479SAnoob Joseph 	EH_LOG_INFO("Event Device Configuration:");
15494ce38479SAnoob Joseph 
15504ce38479SAnoob Joseph 	for (i = 0; i < em_conf->nb_eventdev; i++) {
15514ce38479SAnoob Joseph 		sprintf(print_buf,
15524ce38479SAnoob Joseph 			"\tDev ID: %-2d \tQueues: %-2d \tPorts: %-2d",
15534ce38479SAnoob Joseph 			em_conf->eventdev_config[i].eventdev_id,
15544ce38479SAnoob Joseph 			em_conf->eventdev_config[i].nb_eventqueue,
15554ce38479SAnoob Joseph 			em_conf->eventdev_config[i].nb_eventport);
15564ce38479SAnoob Joseph 		sprintf(print_buf + strlen(print_buf),
15574ce38479SAnoob Joseph 			"\tQueue mode: %s",
15584ce38479SAnoob Joseph 			queue_mode[em_conf->eventdev_config[i].ev_queue_mode]);
15594ce38479SAnoob Joseph 		EH_LOG_INFO("%s", print_buf);
15604ce38479SAnoob Joseph 	}
15614ce38479SAnoob Joseph 	EH_LOG_INFO("");
15624ce38479SAnoob Joseph }
15634ce38479SAnoob Joseph 
15644ce38479SAnoob Joseph static void
15654ce38479SAnoob Joseph eh_display_rx_adapter_conf(struct eventmode_conf *em_conf)
15664ce38479SAnoob Joseph {
15674ce38479SAnoob Joseph 	int nb_rx_adapter = em_conf->nb_rx_adapter;
15684ce38479SAnoob Joseph 	struct rx_adapter_connection_info *conn;
15694ce38479SAnoob Joseph 	struct rx_adapter_conf *adapter;
15704ce38479SAnoob Joseph 	char print_buf[256] = { 0 };
15714ce38479SAnoob Joseph 	int i, j;
15724ce38479SAnoob Joseph 
15734ce38479SAnoob Joseph 	EH_LOG_INFO("Rx adapters configured: %d", nb_rx_adapter);
15744ce38479SAnoob Joseph 
15754ce38479SAnoob Joseph 	for (i = 0; i < nb_rx_adapter; i++) {
15764ce38479SAnoob Joseph 		adapter = &(em_conf->rx_adapter[i]);
1577ec3cc53fSLukasz Bartosik 		sprintf(print_buf,
15787be78d02SJosh Soref 			"\tRx adapter ID: %-2d\tConnections: %-2d\tEvent dev ID: %-2d",
15794ce38479SAnoob Joseph 			adapter->adapter_id,
15804ce38479SAnoob Joseph 			adapter->nb_connections,
1581ec3cc53fSLukasz Bartosik 			adapter->eventdev_id);
1582ec3cc53fSLukasz Bartosik 		if (adapter->rx_core_id == (uint32_t)-1)
1583ec3cc53fSLukasz Bartosik 			sprintf(print_buf + strlen(print_buf),
1584ec3cc53fSLukasz Bartosik 				"\tRx core: %-2s", "[INTERNAL PORT]");
1585ec3cc53fSLukasz Bartosik 		else if (adapter->rx_core_id == RTE_MAX_LCORE)
1586ec3cc53fSLukasz Bartosik 			sprintf(print_buf + strlen(print_buf),
1587ec3cc53fSLukasz Bartosik 				"\tRx core: %-2s", "[NONE]");
1588ec3cc53fSLukasz Bartosik 		else
1589ec3cc53fSLukasz Bartosik 			sprintf(print_buf + strlen(print_buf),
1590ec3cc53fSLukasz Bartosik 				"\tRx core: %-2d", adapter->rx_core_id);
1591ec3cc53fSLukasz Bartosik 
1592ec3cc53fSLukasz Bartosik 		EH_LOG_INFO("%s", print_buf);
15934ce38479SAnoob Joseph 
15944ce38479SAnoob Joseph 		for (j = 0; j < adapter->nb_connections; j++) {
15954ce38479SAnoob Joseph 			conn = &(adapter->conn[j]);
15964ce38479SAnoob Joseph 
15974ce38479SAnoob Joseph 			sprintf(print_buf,
15984ce38479SAnoob Joseph 				"\t\tEthdev ID: %-2d", conn->ethdev_id);
15994ce38479SAnoob Joseph 
16004ce38479SAnoob Joseph 			if (conn->ethdev_rx_qid == -1)
16014ce38479SAnoob Joseph 				sprintf(print_buf + strlen(print_buf),
16024ce38479SAnoob Joseph 					"\tEth rx queue: %-2s", "ALL");
16034ce38479SAnoob Joseph 			else
16044ce38479SAnoob Joseph 				sprintf(print_buf + strlen(print_buf),
16054ce38479SAnoob Joseph 					"\tEth rx queue: %-2d",
16064ce38479SAnoob Joseph 					conn->ethdev_rx_qid);
16074ce38479SAnoob Joseph 
16084ce38479SAnoob Joseph 			sprintf(print_buf + strlen(print_buf),
16094ce38479SAnoob Joseph 				"\tEvent queue: %-2d", conn->eventq_id);
16104ce38479SAnoob Joseph 			EH_LOG_INFO("%s", print_buf);
16114ce38479SAnoob Joseph 		}
16124ce38479SAnoob Joseph 	}
16134ce38479SAnoob Joseph 	EH_LOG_INFO("");
16144ce38479SAnoob Joseph }
16154ce38479SAnoob Joseph 
16164ce38479SAnoob Joseph static void
16174ce38479SAnoob Joseph eh_display_tx_adapter_conf(struct eventmode_conf *em_conf)
16184ce38479SAnoob Joseph {
16194ce38479SAnoob Joseph 	int nb_tx_adapter = em_conf->nb_tx_adapter;
16204ce38479SAnoob Joseph 	struct tx_adapter_connection_info *conn;
16214ce38479SAnoob Joseph 	struct tx_adapter_conf *adapter;
16224ce38479SAnoob Joseph 	char print_buf[256] = { 0 };
16234ce38479SAnoob Joseph 	int i, j;
16244ce38479SAnoob Joseph 
16254ce38479SAnoob Joseph 	EH_LOG_INFO("Tx adapters configured: %d", nb_tx_adapter);
16264ce38479SAnoob Joseph 
16274ce38479SAnoob Joseph 	for (i = 0; i < nb_tx_adapter; i++) {
16284ce38479SAnoob Joseph 		adapter = &(em_conf->tx_adapter[i]);
16294ce38479SAnoob Joseph 		sprintf(print_buf,
16304ce38479SAnoob Joseph 			"\tTx adapter ID: %-2d\tConnections: %-2d\tEvent dev ID: %-2d",
16314ce38479SAnoob Joseph 			adapter->adapter_id,
16324ce38479SAnoob Joseph 			adapter->nb_connections,
16334ce38479SAnoob Joseph 			adapter->eventdev_id);
16344ce38479SAnoob Joseph 		if (adapter->tx_core_id == (uint32_t)-1)
16354ce38479SAnoob Joseph 			sprintf(print_buf + strlen(print_buf),
16364ce38479SAnoob Joseph 				"\tTx core: %-2s", "[INTERNAL PORT]");
16374ce38479SAnoob Joseph 		else if (adapter->tx_core_id == RTE_MAX_LCORE)
16384ce38479SAnoob Joseph 			sprintf(print_buf + strlen(print_buf),
16394ce38479SAnoob Joseph 				"\tTx core: %-2s", "[NONE]");
16404ce38479SAnoob Joseph 		else
16414ce38479SAnoob Joseph 			sprintf(print_buf + strlen(print_buf),
16424ce38479SAnoob Joseph 				"\tTx core: %-2d,\tInput event queue: %-2d",
16434ce38479SAnoob Joseph 				adapter->tx_core_id, adapter->tx_ev_queue);
16444ce38479SAnoob Joseph 
16454ce38479SAnoob Joseph 		EH_LOG_INFO("%s", print_buf);
16464ce38479SAnoob Joseph 
16474ce38479SAnoob Joseph 		for (j = 0; j < adapter->nb_connections; j++) {
16484ce38479SAnoob Joseph 			conn = &(adapter->conn[j]);
16494ce38479SAnoob Joseph 
16504ce38479SAnoob Joseph 			sprintf(print_buf,
16514ce38479SAnoob Joseph 				"\t\tEthdev ID: %-2d", conn->ethdev_id);
16524ce38479SAnoob Joseph 
16534ce38479SAnoob Joseph 			if (conn->ethdev_tx_qid == -1)
16544ce38479SAnoob Joseph 				sprintf(print_buf + strlen(print_buf),
16554ce38479SAnoob Joseph 					"\tEth tx queue: %-2s", "ALL");
16564ce38479SAnoob Joseph 			else
16574ce38479SAnoob Joseph 				sprintf(print_buf + strlen(print_buf),
16584ce38479SAnoob Joseph 					"\tEth tx queue: %-2d",
16594ce38479SAnoob Joseph 					conn->ethdev_tx_qid);
16604ce38479SAnoob Joseph 			EH_LOG_INFO("%s", print_buf);
16614ce38479SAnoob Joseph 		}
16624ce38479SAnoob Joseph 	}
16634ce38479SAnoob Joseph 	EH_LOG_INFO("");
16644ce38479SAnoob Joseph }
16654ce38479SAnoob Joseph 
16664ce38479SAnoob Joseph static void
16674ce38479SAnoob Joseph eh_display_link_conf(struct eventmode_conf *em_conf)
16684ce38479SAnoob Joseph {
16694ce38479SAnoob Joseph 	struct eh_event_link_info *link;
16704ce38479SAnoob Joseph 	char print_buf[256] = { 0 };
16714ce38479SAnoob Joseph 	int i;
16724ce38479SAnoob Joseph 
16734ce38479SAnoob Joseph 	EH_LOG_INFO("Links configured: %d", em_conf->nb_link);
16744ce38479SAnoob Joseph 
16754ce38479SAnoob Joseph 	for (i = 0; i < em_conf->nb_link; i++) {
16764ce38479SAnoob Joseph 		link = &(em_conf->link[i]);
16774ce38479SAnoob Joseph 
16784ce38479SAnoob Joseph 		sprintf(print_buf,
16794ce38479SAnoob Joseph 			"\tEvent dev ID: %-2d\tEvent port: %-2d",
16804ce38479SAnoob Joseph 			link->eventdev_id,
16814ce38479SAnoob Joseph 			link->event_port_id);
16824ce38479SAnoob Joseph 
16834ce38479SAnoob Joseph 		if (em_conf->ext_params.all_ev_queue_to_ev_port)
16844ce38479SAnoob Joseph 			sprintf(print_buf + strlen(print_buf),
16854ce38479SAnoob Joseph 				"Event queue: %-2s\t", "ALL");
16864ce38479SAnoob Joseph 		else
16874ce38479SAnoob Joseph 			sprintf(print_buf + strlen(print_buf),
16884ce38479SAnoob Joseph 				"Event queue: %-2d\t", link->eventq_id);
16894ce38479SAnoob Joseph 
16904ce38479SAnoob Joseph 		sprintf(print_buf + strlen(print_buf),
16914ce38479SAnoob Joseph 			"Lcore: %-2d", link->lcore_id);
16924ce38479SAnoob Joseph 		EH_LOG_INFO("%s", print_buf);
16934ce38479SAnoob Joseph 	}
16944ce38479SAnoob Joseph 	EH_LOG_INFO("");
16954ce38479SAnoob Joseph }
16964ce38479SAnoob Joseph 
1697bc33e9c7SLukasz Bartosik struct eh_conf *
1698bc33e9c7SLukasz Bartosik eh_conf_init(void)
1699bc33e9c7SLukasz Bartosik {
1700bc33e9c7SLukasz Bartosik 	struct eventmode_conf *em_conf = NULL;
1701bc33e9c7SLukasz Bartosik 	struct eh_conf *conf = NULL;
1702bc33e9c7SLukasz Bartosik 	unsigned int eth_core_id;
1703bc33e9c7SLukasz Bartosik 	void *bitmap = NULL;
1704bc33e9c7SLukasz Bartosik 	uint32_t nb_bytes;
1705bc33e9c7SLukasz Bartosik 
1706bc33e9c7SLukasz Bartosik 	/* Allocate memory for config */
1707bc33e9c7SLukasz Bartosik 	conf = calloc(1, sizeof(struct eh_conf));
1708bc33e9c7SLukasz Bartosik 	if (conf == NULL) {
1709bc33e9c7SLukasz Bartosik 		EH_LOG_ERR("Failed to allocate memory for eventmode helper "
1710bc33e9c7SLukasz Bartosik 			   "config");
1711bc33e9c7SLukasz Bartosik 		return NULL;
1712bc33e9c7SLukasz Bartosik 	}
1713bc33e9c7SLukasz Bartosik 
1714bc33e9c7SLukasz Bartosik 	/* Set default conf */
1715bc33e9c7SLukasz Bartosik 
1716bc33e9c7SLukasz Bartosik 	/* Packet transfer mode: poll */
1717bc33e9c7SLukasz Bartosik 	conf->mode = EH_PKT_TRANSFER_MODE_POLL;
171865e3a202SLukasz Bartosik 	conf->ipsec_mode = EH_IPSEC_MODE_TYPE_APP;
1719bc33e9c7SLukasz Bartosik 
1720bc33e9c7SLukasz Bartosik 	/* Keep all ethernet ports enabled by default */
1721bc33e9c7SLukasz Bartosik 	conf->eth_portmask = -1;
1722bc33e9c7SLukasz Bartosik 
1723bc33e9c7SLukasz Bartosik 	/* Allocate memory for event mode params */
1724bc33e9c7SLukasz Bartosik 	conf->mode_params = calloc(1, sizeof(struct eventmode_conf));
1725bc33e9c7SLukasz Bartosik 	if (conf->mode_params == NULL) {
1726bc33e9c7SLukasz Bartosik 		EH_LOG_ERR("Failed to allocate memory for event mode params");
1727bc33e9c7SLukasz Bartosik 		goto free_conf;
1728bc33e9c7SLukasz Bartosik 	}
1729bc33e9c7SLukasz Bartosik 
1730bc33e9c7SLukasz Bartosik 	/* Get eventmode conf */
1731bc33e9c7SLukasz Bartosik 	em_conf = conf->mode_params;
1732bc33e9c7SLukasz Bartosik 
1733bc33e9c7SLukasz Bartosik 	/* Allocate and initialize bitmap for eth cores */
1734bc33e9c7SLukasz Bartosik 	nb_bytes = rte_bitmap_get_memory_footprint(RTE_MAX_LCORE);
1735bc33e9c7SLukasz Bartosik 	if (!nb_bytes) {
1736bc33e9c7SLukasz Bartosik 		EH_LOG_ERR("Failed to get bitmap footprint");
1737bc33e9c7SLukasz Bartosik 		goto free_em_conf;
1738bc33e9c7SLukasz Bartosik 	}
1739bc33e9c7SLukasz Bartosik 
1740bc33e9c7SLukasz Bartosik 	bitmap = rte_zmalloc("event-helper-ethcore-bitmap", nb_bytes,
1741bc33e9c7SLukasz Bartosik 			     RTE_CACHE_LINE_SIZE);
1742bc33e9c7SLukasz Bartosik 	if (!bitmap) {
1743bc33e9c7SLukasz Bartosik 		EH_LOG_ERR("Failed to allocate memory for eth cores bitmap\n");
1744bc33e9c7SLukasz Bartosik 		goto free_em_conf;
1745bc33e9c7SLukasz Bartosik 	}
1746bc33e9c7SLukasz Bartosik 
1747bc33e9c7SLukasz Bartosik 	em_conf->eth_core_mask = rte_bitmap_init(RTE_MAX_LCORE, bitmap,
1748bc33e9c7SLukasz Bartosik 						 nb_bytes);
1749bc33e9c7SLukasz Bartosik 	if (!em_conf->eth_core_mask) {
1750bc33e9c7SLukasz Bartosik 		EH_LOG_ERR("Failed to initialize bitmap");
1751bc33e9c7SLukasz Bartosik 		goto free_bitmap;
1752bc33e9c7SLukasz Bartosik 	}
1753bc33e9c7SLukasz Bartosik 
1754bc33e9c7SLukasz Bartosik 	/* Set schedule type as not set */
1755bc33e9c7SLukasz Bartosik 	em_conf->ext_params.sched_type = SCHED_TYPE_NOT_SET;
1756bc33e9c7SLukasz Bartosik 
1757bc33e9c7SLukasz Bartosik 	/* Set two cores as eth cores for Rx & Tx */
1758bc33e9c7SLukasz Bartosik 
1759cb056611SStephen Hemminger 	/* Use first core other than main core as Rx core */
1760bc33e9c7SLukasz Bartosik 	eth_core_id = rte_get_next_lcore(0,	/* curr core */
1761cb056611SStephen Hemminger 					 1,	/* skip main core */
1762bc33e9c7SLukasz Bartosik 					 0	/* wrap */);
1763bc33e9c7SLukasz Bartosik 
1764bc33e9c7SLukasz Bartosik 	rte_bitmap_set(em_conf->eth_core_mask, eth_core_id);
1765bc33e9c7SLukasz Bartosik 
1766bc33e9c7SLukasz Bartosik 	/* Use next core as Tx core */
1767bc33e9c7SLukasz Bartosik 	eth_core_id = rte_get_next_lcore(eth_core_id,	/* curr core */
1768cb056611SStephen Hemminger 					 1,		/* skip main core */
1769bc33e9c7SLukasz Bartosik 					 0		/* wrap */);
1770bc33e9c7SLukasz Bartosik 
1771bc33e9c7SLukasz Bartosik 	rte_bitmap_set(em_conf->eth_core_mask, eth_core_id);
1772bc33e9c7SLukasz Bartosik 
177386738ebeSSrujana Challa 	em_conf->ext_params.vector_size = DEFAULT_VECTOR_SIZE;
177486738ebeSSrujana Challa 	em_conf->vector_tmo_ns = DEFAULT_VECTOR_TMO;
177586738ebeSSrujana Challa 
1776bc33e9c7SLukasz Bartosik 	return conf;
1777bc33e9c7SLukasz Bartosik 
1778bc33e9c7SLukasz Bartosik free_bitmap:
1779bc33e9c7SLukasz Bartosik 	rte_free(bitmap);
1780bc33e9c7SLukasz Bartosik free_em_conf:
1781bc33e9c7SLukasz Bartosik 	free(em_conf);
1782bc33e9c7SLukasz Bartosik free_conf:
1783bc33e9c7SLukasz Bartosik 	free(conf);
1784bc33e9c7SLukasz Bartosik 	return NULL;
1785bc33e9c7SLukasz Bartosik }
1786bc33e9c7SLukasz Bartosik 
1787bc33e9c7SLukasz Bartosik void
1788bc33e9c7SLukasz Bartosik eh_conf_uninit(struct eh_conf *conf)
1789bc33e9c7SLukasz Bartosik {
1790bc33e9c7SLukasz Bartosik 	struct eventmode_conf *em_conf = NULL;
1791bc33e9c7SLukasz Bartosik 
1792bc33e9c7SLukasz Bartosik 	if (!conf || !conf->mode_params)
1793bc33e9c7SLukasz Bartosik 		return;
1794bc33e9c7SLukasz Bartosik 
1795bc33e9c7SLukasz Bartosik 	/* Get eventmode conf */
1796bc33e9c7SLukasz Bartosik 	em_conf = conf->mode_params;
1797bc33e9c7SLukasz Bartosik 
1798bc33e9c7SLukasz Bartosik 	/* Free evenmode configuration memory */
1799bc33e9c7SLukasz Bartosik 	rte_free(em_conf->eth_core_mask);
1800bc33e9c7SLukasz Bartosik 	free(em_conf);
1801bc33e9c7SLukasz Bartosik 	free(conf);
1802bc33e9c7SLukasz Bartosik }
1803bc33e9c7SLukasz Bartosik 
18044ce38479SAnoob Joseph void
18054ce38479SAnoob Joseph eh_display_conf(struct eh_conf *conf)
18064ce38479SAnoob Joseph {
18074ce38479SAnoob Joseph 	struct eventmode_conf *em_conf;
18084ce38479SAnoob Joseph 
18094ce38479SAnoob Joseph 	if (conf == NULL) {
18104ce38479SAnoob Joseph 		EH_LOG_ERR("Invalid event helper configuration");
18114ce38479SAnoob Joseph 		return;
18124ce38479SAnoob Joseph 	}
18134ce38479SAnoob Joseph 
18144ce38479SAnoob Joseph 	if (conf->mode != EH_PKT_TRANSFER_MODE_EVENT)
18154ce38479SAnoob Joseph 		return;
18164ce38479SAnoob Joseph 
18174ce38479SAnoob Joseph 	if (conf->mode_params == NULL) {
18184ce38479SAnoob Joseph 		EH_LOG_ERR("Invalid event mode parameters");
18194ce38479SAnoob Joseph 		return;
18204ce38479SAnoob Joseph 	}
18214ce38479SAnoob Joseph 
18224ce38479SAnoob Joseph 	/* Get eventmode conf */
18234ce38479SAnoob Joseph 	em_conf = (struct eventmode_conf *)(conf->mode_params);
18244ce38479SAnoob Joseph 
18254ce38479SAnoob Joseph 	/* Display user exposed operating modes */
18264ce38479SAnoob Joseph 	eh_display_operating_mode(em_conf);
18274ce38479SAnoob Joseph 
18284ce38479SAnoob Joseph 	/* Display event device conf */
18294ce38479SAnoob Joseph 	eh_display_event_dev_conf(em_conf);
18304ce38479SAnoob Joseph 
18314ce38479SAnoob Joseph 	/* Display Rx adapter conf */
18324ce38479SAnoob Joseph 	eh_display_rx_adapter_conf(em_conf);
18334ce38479SAnoob Joseph 
18344ce38479SAnoob Joseph 	/* Display Tx adapter conf */
18354ce38479SAnoob Joseph 	eh_display_tx_adapter_conf(em_conf);
18364ce38479SAnoob Joseph 
18374ce38479SAnoob Joseph 	/* Display event-lcore link */
18384ce38479SAnoob Joseph 	eh_display_link_conf(em_conf);
18394ce38479SAnoob Joseph }
18404ce38479SAnoob Joseph 
1841e0b0e55cSAnoob Joseph int32_t
1842e0b0e55cSAnoob Joseph eh_devs_init(struct eh_conf *conf)
1843e0b0e55cSAnoob Joseph {
1844e0b0e55cSAnoob Joseph 	struct eventmode_conf *em_conf;
1845e0b0e55cSAnoob Joseph 	uint16_t port_id;
1846e0b0e55cSAnoob Joseph 	int ret;
1847e0b0e55cSAnoob Joseph 
1848e0b0e55cSAnoob Joseph 	if (conf == NULL) {
1849e0b0e55cSAnoob Joseph 		EH_LOG_ERR("Invalid event helper configuration");
1850e0b0e55cSAnoob Joseph 		return -EINVAL;
1851e0b0e55cSAnoob Joseph 	}
1852e0b0e55cSAnoob Joseph 
1853e0b0e55cSAnoob Joseph 	if (conf->mode != EH_PKT_TRANSFER_MODE_EVENT)
1854e0b0e55cSAnoob Joseph 		return 0;
1855e0b0e55cSAnoob Joseph 
1856e0b0e55cSAnoob Joseph 	if (conf->mode_params == NULL) {
1857e0b0e55cSAnoob Joseph 		EH_LOG_ERR("Invalid event mode parameters");
1858e0b0e55cSAnoob Joseph 		return -EINVAL;
1859e0b0e55cSAnoob Joseph 	}
1860e0b0e55cSAnoob Joseph 
1861e0b0e55cSAnoob Joseph 	/* Get eventmode conf */
1862e0b0e55cSAnoob Joseph 	em_conf = conf->mode_params;
1863e0b0e55cSAnoob Joseph 
186402afed59SAnoob Joseph 	/* Eventmode conf would need eth portmask */
186502afed59SAnoob Joseph 	em_conf->eth_portmask = conf->eth_portmask;
186602afed59SAnoob Joseph 
1867e0b0e55cSAnoob Joseph 	/* Validate the requested config */
1868e0b0e55cSAnoob Joseph 	ret = eh_validate_conf(em_conf);
1869e0b0e55cSAnoob Joseph 	if (ret < 0) {
1870e0b0e55cSAnoob Joseph 		EH_LOG_ERR("Failed to validate the requested config %d", ret);
1871e0b0e55cSAnoob Joseph 		return ret;
1872e0b0e55cSAnoob Joseph 	}
1873e0b0e55cSAnoob Joseph 
18744ce38479SAnoob Joseph 	/* Display the current configuration */
18754ce38479SAnoob Joseph 	eh_display_conf(conf);
18764ce38479SAnoob Joseph 
1877e0b0e55cSAnoob Joseph 	/* Stop eth devices before setting up adapter */
1878e0b0e55cSAnoob Joseph 	RTE_ETH_FOREACH_DEV(port_id) {
1879e0b0e55cSAnoob Joseph 
1880e0b0e55cSAnoob Joseph 		/* Use only the ports enabled */
1881e0b0e55cSAnoob Joseph 		if ((conf->eth_portmask & (1 << port_id)) == 0)
1882e0b0e55cSAnoob Joseph 			continue;
1883e0b0e55cSAnoob Joseph 
1884b55efbabSIvan Ilchenko 		ret = rte_eth_dev_stop(port_id);
1885b55efbabSIvan Ilchenko 		if (ret != 0) {
1886b55efbabSIvan Ilchenko 			EH_LOG_ERR("Failed to stop port %u, err: %d",
1887b55efbabSIvan Ilchenko 					port_id, ret);
1888b55efbabSIvan Ilchenko 			return ret;
1889b55efbabSIvan Ilchenko 		}
1890e0b0e55cSAnoob Joseph 	}
1891e0b0e55cSAnoob Joseph 
1892e0b0e55cSAnoob Joseph 	/* Setup eventdev */
1893e0b0e55cSAnoob Joseph 	ret = eh_initialize_eventdev(em_conf);
1894e0b0e55cSAnoob Joseph 	if (ret < 0) {
1895e0b0e55cSAnoob Joseph 		EH_LOG_ERR("Failed to initialize event dev %d", ret);
1896e0b0e55cSAnoob Joseph 		return ret;
1897e0b0e55cSAnoob Joseph 	}
1898e0b0e55cSAnoob Joseph 
18990dbe550aSVolodymyr Fialko 	/* Setup event crypto adapter */
19000dbe550aSVolodymyr Fialko 	ret = eh_initialize_crypto_adapter(em_conf);
19010dbe550aSVolodymyr Fialko 	if (ret < 0) {
19020dbe550aSVolodymyr Fialko 		EH_LOG_ERR("Failed to start event dev %d", ret);
19030dbe550aSVolodymyr Fialko 		return ret;
19040dbe550aSVolodymyr Fialko 	}
19050dbe550aSVolodymyr Fialko 
190602afed59SAnoob Joseph 	/* Setup Rx adapter */
190702afed59SAnoob Joseph 	ret = eh_initialize_rx_adapter(em_conf);
190802afed59SAnoob Joseph 	if (ret < 0) {
190902afed59SAnoob Joseph 		EH_LOG_ERR("Failed to initialize rx adapter %d", ret);
191002afed59SAnoob Joseph 		return ret;
191102afed59SAnoob Joseph 	}
191202afed59SAnoob Joseph 
19131d89ccf3SAnoob Joseph 	/* Setup Tx adapter */
19141d89ccf3SAnoob Joseph 	ret = eh_initialize_tx_adapter(em_conf);
19151d89ccf3SAnoob Joseph 	if (ret < 0) {
19161d89ccf3SAnoob Joseph 		EH_LOG_ERR("Failed to initialize tx adapter %d", ret);
19171d89ccf3SAnoob Joseph 		return ret;
19181d89ccf3SAnoob Joseph 	}
19191d89ccf3SAnoob Joseph 
1920986c2c9eSNithin Dabilpuram 	/* Start eventdev */
1921986c2c9eSNithin Dabilpuram 	ret = eh_start_eventdev(em_conf);
1922986c2c9eSNithin Dabilpuram 	if (ret < 0) {
1923986c2c9eSNithin Dabilpuram 		EH_LOG_ERR("Failed to start event dev %d", ret);
1924986c2c9eSNithin Dabilpuram 		return ret;
1925986c2c9eSNithin Dabilpuram 	}
1926986c2c9eSNithin Dabilpuram 
19270dbe550aSVolodymyr Fialko 	/* Start event crypto adapter */
19280dbe550aSVolodymyr Fialko 	ret = eh_start_crypto_adapter(em_conf);
19290dbe550aSVolodymyr Fialko 	if (ret < 0) {
19300dbe550aSVolodymyr Fialko 		EH_LOG_ERR("Failed to start event crypto dev %d", ret);
19310dbe550aSVolodymyr Fialko 		return ret;
19320dbe550aSVolodymyr Fialko 	}
19330dbe550aSVolodymyr Fialko 
19340dbe550aSVolodymyr Fialko 
1935e0b0e55cSAnoob Joseph 	/* Start eth devices after setting up adapter */
1936e0b0e55cSAnoob Joseph 	RTE_ETH_FOREACH_DEV(port_id) {
1937e0b0e55cSAnoob Joseph 
1938e0b0e55cSAnoob Joseph 		/* Use only the ports enabled */
1939e0b0e55cSAnoob Joseph 		if ((conf->eth_portmask & (1 << port_id)) == 0)
1940e0b0e55cSAnoob Joseph 			continue;
1941e0b0e55cSAnoob Joseph 
1942e0b0e55cSAnoob Joseph 		ret = rte_eth_dev_start(port_id);
1943e0b0e55cSAnoob Joseph 		if (ret < 0) {
1944e0b0e55cSAnoob Joseph 			EH_LOG_ERR("Failed to start eth dev %d, %d",
1945e0b0e55cSAnoob Joseph 				   port_id, ret);
1946e0b0e55cSAnoob Joseph 			return ret;
1947e0b0e55cSAnoob Joseph 		}
1948e0b0e55cSAnoob Joseph 	}
1949e0b0e55cSAnoob Joseph 
1950e0b0e55cSAnoob Joseph 	return 0;
1951e0b0e55cSAnoob Joseph }
1952e0b0e55cSAnoob Joseph 
1953e0b0e55cSAnoob Joseph int32_t
1954e0b0e55cSAnoob Joseph eh_devs_uninit(struct eh_conf *conf)
1955e0b0e55cSAnoob Joseph {
1956e0b0e55cSAnoob Joseph 	struct eventmode_conf *em_conf;
195702afed59SAnoob Joseph 	int ret, i, j;
1958e0b0e55cSAnoob Joseph 	uint16_t id;
1959e0b0e55cSAnoob Joseph 
1960e0b0e55cSAnoob Joseph 	if (conf == NULL) {
1961e0b0e55cSAnoob Joseph 		EH_LOG_ERR("Invalid event helper configuration");
1962e0b0e55cSAnoob Joseph 		return -EINVAL;
1963e0b0e55cSAnoob Joseph 	}
1964e0b0e55cSAnoob Joseph 
1965e0b0e55cSAnoob Joseph 	if (conf->mode != EH_PKT_TRANSFER_MODE_EVENT)
1966e0b0e55cSAnoob Joseph 		return 0;
1967e0b0e55cSAnoob Joseph 
1968e0b0e55cSAnoob Joseph 	if (conf->mode_params == NULL) {
1969e0b0e55cSAnoob Joseph 		EH_LOG_ERR("Invalid event mode parameters");
1970e0b0e55cSAnoob Joseph 		return -EINVAL;
1971e0b0e55cSAnoob Joseph 	}
1972e0b0e55cSAnoob Joseph 
1973e0b0e55cSAnoob Joseph 	/* Get eventmode conf */
1974e0b0e55cSAnoob Joseph 	em_conf = conf->mode_params;
1975e0b0e55cSAnoob Joseph 
197602afed59SAnoob Joseph 	/* Stop and release rx adapters */
197702afed59SAnoob Joseph 	for (i = 0; i < em_conf->nb_rx_adapter; i++) {
197802afed59SAnoob Joseph 
197902afed59SAnoob Joseph 		id = em_conf->rx_adapter[i].adapter_id;
198002afed59SAnoob Joseph 		ret = rte_event_eth_rx_adapter_stop(id);
198102afed59SAnoob Joseph 		if (ret < 0) {
198202afed59SAnoob Joseph 			EH_LOG_ERR("Failed to stop rx adapter %d", ret);
198302afed59SAnoob Joseph 			return ret;
198402afed59SAnoob Joseph 		}
198502afed59SAnoob Joseph 
198602afed59SAnoob Joseph 		for (j = 0; j < em_conf->rx_adapter[i].nb_connections; j++) {
198702afed59SAnoob Joseph 
198802afed59SAnoob Joseph 			ret = rte_event_eth_rx_adapter_queue_del(id,
198902afed59SAnoob Joseph 				em_conf->rx_adapter[i].conn[j].ethdev_id, -1);
199002afed59SAnoob Joseph 			if (ret < 0) {
199102afed59SAnoob Joseph 				EH_LOG_ERR(
199202afed59SAnoob Joseph 				       "Failed to remove rx adapter queues %d",
199302afed59SAnoob Joseph 				       ret);
199402afed59SAnoob Joseph 				return ret;
199502afed59SAnoob Joseph 			}
199602afed59SAnoob Joseph 		}
199702afed59SAnoob Joseph 
199802afed59SAnoob Joseph 		ret = rte_event_eth_rx_adapter_free(id);
199902afed59SAnoob Joseph 		if (ret < 0) {
200002afed59SAnoob Joseph 			EH_LOG_ERR("Failed to free rx adapter %d", ret);
200102afed59SAnoob Joseph 			return ret;
200202afed59SAnoob Joseph 		}
200302afed59SAnoob Joseph 	}
200402afed59SAnoob Joseph 
20050dbe550aSVolodymyr Fialko 	/* Stop event crypto adapter */
20060dbe550aSVolodymyr Fialko 	ret = eh_stop_crypto_adapter(em_conf);
20070dbe550aSVolodymyr Fialko 	if (ret < 0) {
20080dbe550aSVolodymyr Fialko 		EH_LOG_ERR("Failed to start event crypto dev %d", ret);
20090dbe550aSVolodymyr Fialko 		return ret;
20100dbe550aSVolodymyr Fialko 	}
20110dbe550aSVolodymyr Fialko 
2012e0b0e55cSAnoob Joseph 	/* Stop and release event devices */
2013e0b0e55cSAnoob Joseph 	for (i = 0; i < em_conf->nb_eventdev; i++) {
2014e0b0e55cSAnoob Joseph 
2015e0b0e55cSAnoob Joseph 		id = em_conf->eventdev_config[i].eventdev_id;
2016e0b0e55cSAnoob Joseph 		rte_event_dev_stop(id);
2017e0b0e55cSAnoob Joseph 
2018e0b0e55cSAnoob Joseph 		ret = rte_event_dev_close(id);
2019e0b0e55cSAnoob Joseph 		if (ret < 0) {
2020e0b0e55cSAnoob Joseph 			EH_LOG_ERR("Failed to close event dev %d, %d", id, ret);
2021e0b0e55cSAnoob Joseph 			return ret;
2022e0b0e55cSAnoob Joseph 		}
2023e0b0e55cSAnoob Joseph 	}
2024e0b0e55cSAnoob Joseph 
20251d89ccf3SAnoob Joseph 	/* Stop and release tx adapters */
20261d89ccf3SAnoob Joseph 	for (i = 0; i < em_conf->nb_tx_adapter; i++) {
20271d89ccf3SAnoob Joseph 
20281d89ccf3SAnoob Joseph 		id = em_conf->tx_adapter[i].adapter_id;
20291d89ccf3SAnoob Joseph 		ret = rte_event_eth_tx_adapter_stop(id);
20301d89ccf3SAnoob Joseph 		if (ret < 0) {
20311d89ccf3SAnoob Joseph 			EH_LOG_ERR("Failed to stop tx adapter %d", ret);
20321d89ccf3SAnoob Joseph 			return ret;
20331d89ccf3SAnoob Joseph 		}
20341d89ccf3SAnoob Joseph 
20351d89ccf3SAnoob Joseph 		for (j = 0; j < em_conf->tx_adapter[i].nb_connections; j++) {
20361d89ccf3SAnoob Joseph 
20371d89ccf3SAnoob Joseph 			ret = rte_event_eth_tx_adapter_queue_del(id,
20381d89ccf3SAnoob Joseph 				em_conf->tx_adapter[i].conn[j].ethdev_id, -1);
20391d89ccf3SAnoob Joseph 			if (ret < 0) {
20401d89ccf3SAnoob Joseph 				EH_LOG_ERR(
20411d89ccf3SAnoob Joseph 					"Failed to remove tx adapter queues %d",
20421d89ccf3SAnoob Joseph 					ret);
20431d89ccf3SAnoob Joseph 				return ret;
20441d89ccf3SAnoob Joseph 			}
20451d89ccf3SAnoob Joseph 		}
20461d89ccf3SAnoob Joseph 
20471d89ccf3SAnoob Joseph 		ret = rte_event_eth_tx_adapter_free(id);
20481d89ccf3SAnoob Joseph 		if (ret < 0) {
20491d89ccf3SAnoob Joseph 			EH_LOG_ERR("Failed to free tx adapter %d", ret);
20501d89ccf3SAnoob Joseph 			return ret;
20511d89ccf3SAnoob Joseph 		}
20521d89ccf3SAnoob Joseph 	}
20531d89ccf3SAnoob Joseph 
2054e0b0e55cSAnoob Joseph 	return 0;
2055e0b0e55cSAnoob Joseph }
20561d89ccf3SAnoob Joseph 
20571bf6baacSLukasz Bartosik void
20581bf6baacSLukasz Bartosik eh_launch_worker(struct eh_conf *conf, struct eh_app_worker_params *app_wrkr,
20591bf6baacSLukasz Bartosik 		uint8_t nb_wrkr_param)
20601bf6baacSLukasz Bartosik {
20611bf6baacSLukasz Bartosik 	struct eh_app_worker_params *match_wrkr;
20621bf6baacSLukasz Bartosik 	struct eh_event_link_info *links = NULL;
20631bf6baacSLukasz Bartosik 	struct eventmode_conf *em_conf;
20641bf6baacSLukasz Bartosik 	uint32_t lcore_id;
20651bf6baacSLukasz Bartosik 	uint8_t nb_links;
20661bf6baacSLukasz Bartosik 
20671bf6baacSLukasz Bartosik 	if (conf == NULL) {
20681bf6baacSLukasz Bartosik 		EH_LOG_ERR("Invalid event helper configuration");
20691bf6baacSLukasz Bartosik 		return;
20701bf6baacSLukasz Bartosik 	}
20711bf6baacSLukasz Bartosik 
20721bf6baacSLukasz Bartosik 	if (conf->mode_params == NULL) {
20731bf6baacSLukasz Bartosik 		EH_LOG_ERR("Invalid event mode parameters");
20741bf6baacSLukasz Bartosik 		return;
20751bf6baacSLukasz Bartosik 	}
20761bf6baacSLukasz Bartosik 
20771bf6baacSLukasz Bartosik 	/* Get eventmode conf */
20781bf6baacSLukasz Bartosik 	em_conf = conf->mode_params;
20791bf6baacSLukasz Bartosik 
20801bf6baacSLukasz Bartosik 	/* Get core ID */
20811bf6baacSLukasz Bartosik 	lcore_id = rte_lcore_id();
20821bf6baacSLukasz Bartosik 
20831bf6baacSLukasz Bartosik 	/* Check if this is eth core */
20841bf6baacSLukasz Bartosik 	if (rte_bitmap_get(em_conf->eth_core_mask, lcore_id)) {
20851bf6baacSLukasz Bartosik 		eh_start_worker_eth_core(em_conf, lcore_id);
20861bf6baacSLukasz Bartosik 		return;
20871bf6baacSLukasz Bartosik 	}
20881bf6baacSLukasz Bartosik 
20891bf6baacSLukasz Bartosik 	if (app_wrkr == NULL || nb_wrkr_param == 0) {
20901bf6baacSLukasz Bartosik 		EH_LOG_ERR("Invalid args");
20911bf6baacSLukasz Bartosik 		return;
20921bf6baacSLukasz Bartosik 	}
20931bf6baacSLukasz Bartosik 
20941bf6baacSLukasz Bartosik 	/*
20951bf6baacSLukasz Bartosik 	 * This is a regular worker thread. The application registers
20961bf6baacSLukasz Bartosik 	 * multiple workers with various capabilities. Run worker
20971bf6baacSLukasz Bartosik 	 * based on the selected capabilities of the event
20981bf6baacSLukasz Bartosik 	 * device configured.
20991bf6baacSLukasz Bartosik 	 */
21001bf6baacSLukasz Bartosik 
21011bf6baacSLukasz Bartosik 	/* Get the first matching worker for the event device */
21021bf6baacSLukasz Bartosik 	match_wrkr = eh_find_worker(lcore_id, conf, app_wrkr, nb_wrkr_param);
21031bf6baacSLukasz Bartosik 	if (match_wrkr == NULL) {
21041bf6baacSLukasz Bartosik 		EH_LOG_ERR("Failed to match worker registered for lcore %d",
21051bf6baacSLukasz Bartosik 			   lcore_id);
21061bf6baacSLukasz Bartosik 		goto clean_and_exit;
21071bf6baacSLukasz Bartosik 	}
21081bf6baacSLukasz Bartosik 
21091bf6baacSLukasz Bartosik 	/* Verify sanity of the matched worker */
21101bf6baacSLukasz Bartosik 	if (eh_verify_match_worker(match_wrkr) != 1) {
21111bf6baacSLukasz Bartosik 		EH_LOG_ERR("Failed to validate the matched worker");
21121bf6baacSLukasz Bartosik 		goto clean_and_exit;
21131bf6baacSLukasz Bartosik 	}
21141bf6baacSLukasz Bartosik 
21151bf6baacSLukasz Bartosik 	/* Get worker links */
21161bf6baacSLukasz Bartosik 	nb_links = eh_get_event_lcore_links(lcore_id, conf, &links);
21171bf6baacSLukasz Bartosik 
21181bf6baacSLukasz Bartosik 	/* Launch the worker thread */
21191bf6baacSLukasz Bartosik 	match_wrkr->worker_thread(links, nb_links);
21201bf6baacSLukasz Bartosik 
21211bf6baacSLukasz Bartosik 	/* Free links info memory */
21221bf6baacSLukasz Bartosik 	free(links);
21231bf6baacSLukasz Bartosik 
21241bf6baacSLukasz Bartosik clean_and_exit:
21251bf6baacSLukasz Bartosik 
21261bf6baacSLukasz Bartosik 	/* Flag eth_cores to stop, if started */
21271bf6baacSLukasz Bartosik 	eh_stop_worker_eth_core();
21281bf6baacSLukasz Bartosik }
21291bf6baacSLukasz Bartosik 
21301d89ccf3SAnoob Joseph uint8_t
21311d89ccf3SAnoob Joseph eh_get_tx_queue(struct eh_conf *conf, uint8_t eventdev_id)
21321d89ccf3SAnoob Joseph {
21331d89ccf3SAnoob Joseph 	struct eventdev_params *eventdev_config;
21341d89ccf3SAnoob Joseph 	struct eventmode_conf *em_conf;
21351d89ccf3SAnoob Joseph 
21361d89ccf3SAnoob Joseph 	if (conf == NULL) {
21371d89ccf3SAnoob Joseph 		EH_LOG_ERR("Invalid event helper configuration");
21381d89ccf3SAnoob Joseph 		return -EINVAL;
21391d89ccf3SAnoob Joseph 	}
21401d89ccf3SAnoob Joseph 
21411d89ccf3SAnoob Joseph 	if (conf->mode_params == NULL) {
21421d89ccf3SAnoob Joseph 		EH_LOG_ERR("Invalid event mode parameters");
21431d89ccf3SAnoob Joseph 		return -EINVAL;
21441d89ccf3SAnoob Joseph 	}
21451d89ccf3SAnoob Joseph 
21461d89ccf3SAnoob Joseph 	/* Get eventmode conf */
21471d89ccf3SAnoob Joseph 	em_conf = conf->mode_params;
21481d89ccf3SAnoob Joseph 
21491d89ccf3SAnoob Joseph 	/* Get event device conf */
21501d89ccf3SAnoob Joseph 	eventdev_config = eh_get_eventdev_params(em_conf, eventdev_id);
21511d89ccf3SAnoob Joseph 
21521d89ccf3SAnoob Joseph 	if (eventdev_config == NULL) {
21531d89ccf3SAnoob Joseph 		EH_LOG_ERR("Failed to read eventdev config");
21541d89ccf3SAnoob Joseph 		return -EINVAL;
21551d89ccf3SAnoob Joseph 	}
21561d89ccf3SAnoob Joseph 
21571d89ccf3SAnoob Joseph 	/*
21581d89ccf3SAnoob Joseph 	 * The last queue is reserved to be used as atomic queue for the
21591d89ccf3SAnoob Joseph 	 * last stage (eth packet tx stage)
21601d89ccf3SAnoob Joseph 	 */
21611d89ccf3SAnoob Joseph 	return eventdev_config->nb_eventqueue - 1;
21621d89ccf3SAnoob Joseph }
2163