xref: /dpdk/app/test-eventdev/test_pipeline_atq.c (revision f0b68c0b2af72465559445ac7548bfe0f1c005e3)
16bf570a9SPavan Nikhilesh /*
26bf570a9SPavan Nikhilesh  * SPDX-License-Identifier: BSD-3-Clause
36bf570a9SPavan Nikhilesh  * Copyright 2017 Cavium, Inc.
46bf570a9SPavan Nikhilesh  */
56bf570a9SPavan Nikhilesh 
66bf570a9SPavan Nikhilesh #include "test_pipeline_common.h"
76bf570a9SPavan Nikhilesh 
843d162bcSThomas Monjalon /* See http://doc.dpdk.org/guides/tools/testeventdev.html for test details */
96bf570a9SPavan Nikhilesh 
106bf570a9SPavan Nikhilesh static __rte_always_inline int
pipeline_atq_nb_event_queues(struct evt_options * opt)116bf570a9SPavan Nikhilesh pipeline_atq_nb_event_queues(struct evt_options *opt)
126bf570a9SPavan Nikhilesh {
136bf570a9SPavan Nikhilesh 	RTE_SET_USED(opt);
146bf570a9SPavan Nikhilesh 
15d9a42a69SThomas Monjalon 	return rte_eth_dev_count_avail();
166bf570a9SPavan Nikhilesh }
176bf570a9SPavan Nikhilesh 
182eaa37b8SPavan Nikhilesh typedef int (*pipeline_atq_worker_t)(void *arg);
192eaa37b8SPavan Nikhilesh 
20032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_single_stage_tx(void * arg)217a310364SPavan Nikhilesh pipeline_atq_worker_single_stage_tx(void *arg)
227a310364SPavan Nikhilesh {
23f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
24*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
257a310364SPavan Nikhilesh 
267a310364SPavan Nikhilesh 	while (t->done == false) {
27*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
287a310364SPavan Nikhilesh 
29*f0b68c0bSPavan Nikhilesh 		if (!deq) {
307a310364SPavan Nikhilesh 			rte_pause();
317a310364SPavan Nikhilesh 			continue;
327a310364SPavan Nikhilesh 		}
337a310364SPavan Nikhilesh 
34*f0b68c0bSPavan Nikhilesh 		deq = pipeline_event_tx(dev, port, &ev, t);
357a310364SPavan Nikhilesh 		w->processed_pkts++;
367a310364SPavan Nikhilesh 	}
37*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
387a310364SPavan Nikhilesh 
397a310364SPavan Nikhilesh 	return 0;
407a310364SPavan Nikhilesh }
417a310364SPavan Nikhilesh 
42032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_single_stage_fwd(void * arg)437a310364SPavan Nikhilesh pipeline_atq_worker_single_stage_fwd(void *arg)
447a310364SPavan Nikhilesh {
45f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
46032a965aSPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
47*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
487a310364SPavan Nikhilesh 
497a310364SPavan Nikhilesh 	while (t->done == false) {
50*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
517a310364SPavan Nikhilesh 
52*f0b68c0bSPavan Nikhilesh 		if (!deq) {
537a310364SPavan Nikhilesh 			rte_pause();
547a310364SPavan Nikhilesh 			continue;
557a310364SPavan Nikhilesh 		}
567a310364SPavan Nikhilesh 
57032a965aSPavan Nikhilesh 		ev.queue_id = tx_queue[ev.mbuf->port];
587a310364SPavan Nikhilesh 		pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
59*f0b68c0bSPavan Nikhilesh 		enq = pipeline_event_enqueue(dev, port, &ev, t);
60032a965aSPavan Nikhilesh 		w->processed_pkts++;
617a310364SPavan Nikhilesh 	}
62*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
637a310364SPavan Nikhilesh 
647a310364SPavan Nikhilesh 	return 0;
657a310364SPavan Nikhilesh }
667a310364SPavan Nikhilesh 
67032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_single_stage_burst_tx(void * arg)687a310364SPavan Nikhilesh pipeline_atq_worker_single_stage_burst_tx(void *arg)
697a310364SPavan Nikhilesh {
70f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
71*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
727a310364SPavan Nikhilesh 
737a310364SPavan Nikhilesh 	while (t->done == false) {
74*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
757a310364SPavan Nikhilesh 
767a310364SPavan Nikhilesh 		if (!nb_rx) {
777a310364SPavan Nikhilesh 			rte_pause();
787a310364SPavan Nikhilesh 			continue;
797a310364SPavan Nikhilesh 		}
807a310364SPavan Nikhilesh 
817a310364SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
827a310364SPavan Nikhilesh 			rte_prefetch0(ev[i + 1].mbuf);
83032a965aSPavan Nikhilesh 			rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
847a310364SPavan Nikhilesh 		}
857a310364SPavan Nikhilesh 
86*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_tx_burst(dev, port, ev, nb_rx, t);
87*f0b68c0bSPavan Nikhilesh 		w->processed_pkts += nb_tx;
887a310364SPavan Nikhilesh 	}
89*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
907a310364SPavan Nikhilesh 
917a310364SPavan Nikhilesh 	return 0;
927a310364SPavan Nikhilesh }
937a310364SPavan Nikhilesh 
94032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_single_stage_burst_fwd(void * arg)957a310364SPavan Nikhilesh pipeline_atq_worker_single_stage_burst_fwd(void *arg)
967a310364SPavan Nikhilesh {
97f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
98032a965aSPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
99*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
1007a310364SPavan Nikhilesh 
1017a310364SPavan Nikhilesh 	while (t->done == false) {
102*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
1037a310364SPavan Nikhilesh 
1047a310364SPavan Nikhilesh 		if (!nb_rx) {
1057a310364SPavan Nikhilesh 			rte_pause();
1067a310364SPavan Nikhilesh 			continue;
1077a310364SPavan Nikhilesh 		}
1087a310364SPavan Nikhilesh 
1097a310364SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
1107a310364SPavan Nikhilesh 			rte_prefetch0(ev[i + 1].mbuf);
111032a965aSPavan Nikhilesh 			rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
112032a965aSPavan Nikhilesh 			ev[i].queue_id = tx_queue[ev[i].mbuf->port];
1137a310364SPavan Nikhilesh 			pipeline_fwd_event(&ev[i], RTE_SCHED_TYPE_ATOMIC);
1147a310364SPavan Nikhilesh 		}
1157a310364SPavan Nikhilesh 
116*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_enqueue_burst(dev, port, ev, nb_rx, t);
117*f0b68c0bSPavan Nikhilesh 		w->processed_pkts += nb_tx;
1187a310364SPavan Nikhilesh 	}
119*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
1207a310364SPavan Nikhilesh 
1217a310364SPavan Nikhilesh 	return 0;
1227a310364SPavan Nikhilesh }
1237a310364SPavan Nikhilesh 
124032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_single_stage_tx_vector(void * arg)1252eaa37b8SPavan Nikhilesh pipeline_atq_worker_single_stage_tx_vector(void *arg)
1262eaa37b8SPavan Nikhilesh {
1272eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
128*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
1292eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
1302eaa37b8SPavan Nikhilesh 
1312eaa37b8SPavan Nikhilesh 	while (!t->done) {
132*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
1332eaa37b8SPavan Nikhilesh 
134*f0b68c0bSPavan Nikhilesh 		if (!deq) {
1352eaa37b8SPavan Nikhilesh 			rte_pause();
1362eaa37b8SPavan Nikhilesh 			continue;
1372eaa37b8SPavan Nikhilesh 		}
1382eaa37b8SPavan Nikhilesh 		vector_sz = ev.vec->nb_elem;
139*f0b68c0bSPavan Nikhilesh 		enq = pipeline_event_tx_vector(dev, port, &ev, t);
1402eaa37b8SPavan Nikhilesh 		w->processed_pkts += vector_sz;
1412eaa37b8SPavan Nikhilesh 	}
142*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
1432eaa37b8SPavan Nikhilesh 
1442eaa37b8SPavan Nikhilesh 	return 0;
1452eaa37b8SPavan Nikhilesh }
1462eaa37b8SPavan Nikhilesh 
1472eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_single_stage_fwd_vector(void * arg)1482eaa37b8SPavan Nikhilesh pipeline_atq_worker_single_stage_fwd_vector(void *arg)
1492eaa37b8SPavan Nikhilesh {
1502eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
1512eaa37b8SPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
152*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
1532eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
1542eaa37b8SPavan Nikhilesh 
1552eaa37b8SPavan Nikhilesh 	while (!t->done) {
156*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
1572eaa37b8SPavan Nikhilesh 
158*f0b68c0bSPavan Nikhilesh 		if (!deq) {
1592eaa37b8SPavan Nikhilesh 			rte_pause();
1602eaa37b8SPavan Nikhilesh 			continue;
1612eaa37b8SPavan Nikhilesh 		}
1622eaa37b8SPavan Nikhilesh 
1632eaa37b8SPavan Nikhilesh 		vector_sz = ev.vec->nb_elem;
1642eaa37b8SPavan Nikhilesh 		ev.queue_id = tx_queue[ev.vec->port];
1652eaa37b8SPavan Nikhilesh 		ev.vec->queue = 0;
1662eaa37b8SPavan Nikhilesh 		pipeline_fwd_event_vector(&ev, RTE_SCHED_TYPE_ATOMIC);
167*f0b68c0bSPavan Nikhilesh 		enq = pipeline_event_enqueue(dev, port, &ev, t);
1682eaa37b8SPavan Nikhilesh 		w->processed_pkts += vector_sz;
1692eaa37b8SPavan Nikhilesh 	}
170*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
1712eaa37b8SPavan Nikhilesh 
1722eaa37b8SPavan Nikhilesh 	return 0;
1732eaa37b8SPavan Nikhilesh }
1742eaa37b8SPavan Nikhilesh 
1752eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_single_stage_burst_tx_vector(void * arg)1762eaa37b8SPavan Nikhilesh pipeline_atq_worker_single_stage_burst_tx_vector(void *arg)
1772eaa37b8SPavan Nikhilesh {
1782eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
179*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
1802eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
1812eaa37b8SPavan Nikhilesh 
1822eaa37b8SPavan Nikhilesh 	while (!t->done) {
183*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
1842eaa37b8SPavan Nikhilesh 
1852eaa37b8SPavan Nikhilesh 		if (!nb_rx) {
1862eaa37b8SPavan Nikhilesh 			rte_pause();
1872eaa37b8SPavan Nikhilesh 			continue;
1882eaa37b8SPavan Nikhilesh 		}
1892eaa37b8SPavan Nikhilesh 		vector_sz = 0;
1902eaa37b8SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
1912eaa37b8SPavan Nikhilesh 			vector_sz += ev[i].vec->nb_elem;
1922eaa37b8SPavan Nikhilesh 			ev[i].vec->queue = 0;
1932eaa37b8SPavan Nikhilesh 		}
1942eaa37b8SPavan Nikhilesh 
195*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_tx_burst(dev, port, ev, nb_rx, t);
1962eaa37b8SPavan Nikhilesh 		w->processed_pkts += vector_sz;
1972eaa37b8SPavan Nikhilesh 	}
198*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
1992eaa37b8SPavan Nikhilesh 
2002eaa37b8SPavan Nikhilesh 	return 0;
2012eaa37b8SPavan Nikhilesh }
2022eaa37b8SPavan Nikhilesh 
2032eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_single_stage_burst_fwd_vector(void * arg)2042eaa37b8SPavan Nikhilesh pipeline_atq_worker_single_stage_burst_fwd_vector(void *arg)
2052eaa37b8SPavan Nikhilesh {
2062eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
2072eaa37b8SPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
208*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
2092eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
2102eaa37b8SPavan Nikhilesh 
2112eaa37b8SPavan Nikhilesh 	while (!t->done) {
212*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
2132eaa37b8SPavan Nikhilesh 
2142eaa37b8SPavan Nikhilesh 		if (!nb_rx) {
2152eaa37b8SPavan Nikhilesh 			rte_pause();
2162eaa37b8SPavan Nikhilesh 			continue;
2172eaa37b8SPavan Nikhilesh 		}
2182eaa37b8SPavan Nikhilesh 
2192eaa37b8SPavan Nikhilesh 		vector_sz = 0;
2202eaa37b8SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
2212eaa37b8SPavan Nikhilesh 			ev[i].queue_id = tx_queue[ev[i].vec->port];
2222eaa37b8SPavan Nikhilesh 			ev[i].vec->queue = 0;
2232eaa37b8SPavan Nikhilesh 			vector_sz += ev[i].vec->nb_elem;
2242eaa37b8SPavan Nikhilesh 			pipeline_fwd_event_vector(&ev[i],
2252eaa37b8SPavan Nikhilesh 						  RTE_SCHED_TYPE_ATOMIC);
2262eaa37b8SPavan Nikhilesh 		}
2272eaa37b8SPavan Nikhilesh 
228*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_enqueue_burst(dev, port, ev, nb_rx, t);
2292eaa37b8SPavan Nikhilesh 		w->processed_pkts += vector_sz;
2302eaa37b8SPavan Nikhilesh 	}
231*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
2322eaa37b8SPavan Nikhilesh 
2332eaa37b8SPavan Nikhilesh 	return 0;
2342eaa37b8SPavan Nikhilesh }
2352eaa37b8SPavan Nikhilesh 
2362eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_multi_stage_tx(void * arg)2377a310364SPavan Nikhilesh pipeline_atq_worker_multi_stage_tx(void *arg)
2387a310364SPavan Nikhilesh {
239f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_INIT;
240*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
2417a310364SPavan Nikhilesh 
2427a310364SPavan Nikhilesh 	while (t->done == false) {
243*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
2447a310364SPavan Nikhilesh 
245*f0b68c0bSPavan Nikhilesh 		if (!deq) {
2467a310364SPavan Nikhilesh 			rte_pause();
2477a310364SPavan Nikhilesh 			continue;
2487a310364SPavan Nikhilesh 		}
2497a310364SPavan Nikhilesh 
2507a310364SPavan Nikhilesh 		cq_id = ev.sub_event_type % nb_stages;
2517a310364SPavan Nikhilesh 
2527a310364SPavan Nikhilesh 		if (cq_id == last_queue) {
253*f0b68c0bSPavan Nikhilesh 			enq = pipeline_event_tx(dev, port, &ev, t);
2547a310364SPavan Nikhilesh 			w->processed_pkts++;
2557a310364SPavan Nikhilesh 			continue;
2567a310364SPavan Nikhilesh 		}
257032a965aSPavan Nikhilesh 
2587a310364SPavan Nikhilesh 		ev.sub_event_type++;
2597a310364SPavan Nikhilesh 		pipeline_fwd_event(&ev, sched_type_list[cq_id]);
260*f0b68c0bSPavan Nikhilesh 		enq = pipeline_event_enqueue(dev, port, &ev, t);
2617a310364SPavan Nikhilesh 	}
262*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
263032a965aSPavan Nikhilesh 
2647a310364SPavan Nikhilesh 	return 0;
2657a310364SPavan Nikhilesh }
2667a310364SPavan Nikhilesh 
267032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_multi_stage_fwd(void * arg)2687a310364SPavan Nikhilesh pipeline_atq_worker_multi_stage_fwd(void *arg)
2697a310364SPavan Nikhilesh {
270f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_INIT;
271032a965aSPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
272*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
2737a310364SPavan Nikhilesh 
2747a310364SPavan Nikhilesh 	while (t->done == false) {
275*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
2767a310364SPavan Nikhilesh 
277*f0b68c0bSPavan Nikhilesh 		if (!deq) {
2787a310364SPavan Nikhilesh 			rte_pause();
2797a310364SPavan Nikhilesh 			continue;
2807a310364SPavan Nikhilesh 		}
2817a310364SPavan Nikhilesh 
2827a310364SPavan Nikhilesh 		cq_id = ev.sub_event_type % nb_stages;
2837a310364SPavan Nikhilesh 
2847a310364SPavan Nikhilesh 		if (cq_id == last_queue) {
285032a965aSPavan Nikhilesh 			ev.queue_id = tx_queue[ev.mbuf->port];
2867a310364SPavan Nikhilesh 			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
287032a965aSPavan Nikhilesh 			w->processed_pkts++;
2887a310364SPavan Nikhilesh 		} else {
2897a310364SPavan Nikhilesh 			ev.sub_event_type++;
2907a310364SPavan Nikhilesh 			pipeline_fwd_event(&ev, sched_type_list[cq_id]);
2917a310364SPavan Nikhilesh 		}
2927a310364SPavan Nikhilesh 
293*f0b68c0bSPavan Nikhilesh 		enq = pipeline_event_enqueue(dev, port, &ev, t);
2947a310364SPavan Nikhilesh 	}
295*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
296032a965aSPavan Nikhilesh 
2977a310364SPavan Nikhilesh 	return 0;
2987a310364SPavan Nikhilesh }
2997a310364SPavan Nikhilesh 
300032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_multi_stage_burst_tx(void * arg)3017a310364SPavan Nikhilesh pipeline_atq_worker_multi_stage_burst_tx(void *arg)
3027a310364SPavan Nikhilesh {
303f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
304*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
3057a310364SPavan Nikhilesh 
3067a310364SPavan Nikhilesh 	while (t->done == false) {
307*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
3087a310364SPavan Nikhilesh 
3097a310364SPavan Nikhilesh 		if (!nb_rx) {
3107a310364SPavan Nikhilesh 			rte_pause();
3117a310364SPavan Nikhilesh 			continue;
3127a310364SPavan Nikhilesh 		}
3137a310364SPavan Nikhilesh 
3147a310364SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
3157a310364SPavan Nikhilesh 			rte_prefetch0(ev[i + 1].mbuf);
3167a310364SPavan Nikhilesh 			cq_id = ev[i].sub_event_type % nb_stages;
3177a310364SPavan Nikhilesh 
3187a310364SPavan Nikhilesh 			if (cq_id == last_queue) {
319*f0b68c0bSPavan Nikhilesh 				pipeline_event_tx(dev, port, &ev[i], t);
3207a310364SPavan Nikhilesh 				ev[i].op = RTE_EVENT_OP_RELEASE;
3217a310364SPavan Nikhilesh 				w->processed_pkts++;
3227a310364SPavan Nikhilesh 				continue;
3237a310364SPavan Nikhilesh 			}
3247a310364SPavan Nikhilesh 
3257a310364SPavan Nikhilesh 			ev[i].sub_event_type++;
326032a965aSPavan Nikhilesh 			pipeline_fwd_event(&ev[i], sched_type_list[cq_id]);
3277a310364SPavan Nikhilesh 		}
3287a310364SPavan Nikhilesh 
329*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_enqueue_burst(dev, port, ev, nb_rx, t);
3307a310364SPavan Nikhilesh 	}
331*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
332032a965aSPavan Nikhilesh 
3337a310364SPavan Nikhilesh 	return 0;
3347a310364SPavan Nikhilesh }
3357a310364SPavan Nikhilesh 
336032a965aSPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_multi_stage_burst_fwd(void * arg)3377a310364SPavan Nikhilesh pipeline_atq_worker_multi_stage_burst_fwd(void *arg)
3387a310364SPavan Nikhilesh {
339f26320a6SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
340032a965aSPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
341*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
3427a310364SPavan Nikhilesh 
3437a310364SPavan Nikhilesh 	while (t->done == false) {
344*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
3457a310364SPavan Nikhilesh 
3467a310364SPavan Nikhilesh 		if (!nb_rx) {
3477a310364SPavan Nikhilesh 			rte_pause();
3487a310364SPavan Nikhilesh 			continue;
3497a310364SPavan Nikhilesh 		}
3507a310364SPavan Nikhilesh 
3517a310364SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
3527a310364SPavan Nikhilesh 			rte_prefetch0(ev[i + 1].mbuf);
3537a310364SPavan Nikhilesh 			cq_id = ev[i].sub_event_type % nb_stages;
3547a310364SPavan Nikhilesh 
3557a310364SPavan Nikhilesh 			if (cq_id == last_queue) {
3567a310364SPavan Nikhilesh 				w->processed_pkts++;
357032a965aSPavan Nikhilesh 				ev[i].queue_id = tx_queue[ev[i].mbuf->port];
3587a310364SPavan Nikhilesh 				pipeline_fwd_event(&ev[i],
3597a310364SPavan Nikhilesh 						RTE_SCHED_TYPE_ATOMIC);
3607a310364SPavan Nikhilesh 			} else {
3617a310364SPavan Nikhilesh 				ev[i].sub_event_type++;
3627a310364SPavan Nikhilesh 				pipeline_fwd_event(&ev[i],
3637a310364SPavan Nikhilesh 						sched_type_list[cq_id]);
3647a310364SPavan Nikhilesh 			}
3657a310364SPavan Nikhilesh 		}
3667a310364SPavan Nikhilesh 
367*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_enqueue_burst(dev, port, ev, nb_rx, t);
3687a310364SPavan Nikhilesh 	}
369*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
370032a965aSPavan Nikhilesh 
3717a310364SPavan Nikhilesh 	return 0;
3727a310364SPavan Nikhilesh }
3737a310364SPavan Nikhilesh 
3742eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_multi_stage_tx_vector(void * arg)3752eaa37b8SPavan Nikhilesh pipeline_atq_worker_multi_stage_tx_vector(void *arg)
3762eaa37b8SPavan Nikhilesh {
3772eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_INIT;
378*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
3792eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
3802eaa37b8SPavan Nikhilesh 
3812eaa37b8SPavan Nikhilesh 	while (!t->done) {
382*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
3832eaa37b8SPavan Nikhilesh 
384*f0b68c0bSPavan Nikhilesh 		if (!deq) {
3852eaa37b8SPavan Nikhilesh 			rte_pause();
3862eaa37b8SPavan Nikhilesh 			continue;
3872eaa37b8SPavan Nikhilesh 		}
3882eaa37b8SPavan Nikhilesh 
3892eaa37b8SPavan Nikhilesh 		cq_id = ev.sub_event_type % nb_stages;
3902eaa37b8SPavan Nikhilesh 
3912eaa37b8SPavan Nikhilesh 		if (cq_id == last_queue) {
3922eaa37b8SPavan Nikhilesh 			vector_sz = ev.vec->nb_elem;
393*f0b68c0bSPavan Nikhilesh 			enq = pipeline_event_tx_vector(dev, port, &ev, t);
3942eaa37b8SPavan Nikhilesh 			w->processed_pkts += vector_sz;
3952eaa37b8SPavan Nikhilesh 			continue;
3962eaa37b8SPavan Nikhilesh 		}
3972eaa37b8SPavan Nikhilesh 
3982eaa37b8SPavan Nikhilesh 		ev.sub_event_type++;
3992eaa37b8SPavan Nikhilesh 		pipeline_fwd_event_vector(&ev, sched_type_list[cq_id]);
400*f0b68c0bSPavan Nikhilesh 		enq = pipeline_event_enqueue(dev, port, &ev, t);
4012eaa37b8SPavan Nikhilesh 	}
402*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
4032eaa37b8SPavan Nikhilesh 
4042eaa37b8SPavan Nikhilesh 	return 0;
4052eaa37b8SPavan Nikhilesh }
4062eaa37b8SPavan Nikhilesh 
4072eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_multi_stage_fwd_vector(void * arg)4082eaa37b8SPavan Nikhilesh pipeline_atq_worker_multi_stage_fwd_vector(void *arg)
4092eaa37b8SPavan Nikhilesh {
4102eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_INIT;
4112eaa37b8SPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
412*f0b68c0bSPavan Nikhilesh 	uint8_t enq = 0, deq = 0;
4132eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
4142eaa37b8SPavan Nikhilesh 
4152eaa37b8SPavan Nikhilesh 	while (!t->done) {
416*f0b68c0bSPavan Nikhilesh 		deq = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
4172eaa37b8SPavan Nikhilesh 
418*f0b68c0bSPavan Nikhilesh 		if (!deq) {
4192eaa37b8SPavan Nikhilesh 			rte_pause();
4202eaa37b8SPavan Nikhilesh 			continue;
4212eaa37b8SPavan Nikhilesh 		}
4222eaa37b8SPavan Nikhilesh 
4232eaa37b8SPavan Nikhilesh 		cq_id = ev.sub_event_type % nb_stages;
4242eaa37b8SPavan Nikhilesh 
4252eaa37b8SPavan Nikhilesh 		if (cq_id == last_queue) {
4262eaa37b8SPavan Nikhilesh 			ev.queue_id = tx_queue[ev.vec->port];
4272eaa37b8SPavan Nikhilesh 			ev.vec->queue = 0;
4282eaa37b8SPavan Nikhilesh 			vector_sz = ev.vec->nb_elem;
4292eaa37b8SPavan Nikhilesh 			pipeline_fwd_event_vector(&ev, RTE_SCHED_TYPE_ATOMIC);
430*f0b68c0bSPavan Nikhilesh 			enq = pipeline_event_enqueue(dev, port, &ev, t);
4312eaa37b8SPavan Nikhilesh 			w->processed_pkts += vector_sz;
4322eaa37b8SPavan Nikhilesh 		} else {
4332eaa37b8SPavan Nikhilesh 			ev.sub_event_type++;
4342eaa37b8SPavan Nikhilesh 			pipeline_fwd_event_vector(&ev, sched_type_list[cq_id]);
435*f0b68c0bSPavan Nikhilesh 			enq = pipeline_event_enqueue(dev, port, &ev, t);
4362eaa37b8SPavan Nikhilesh 		}
4372eaa37b8SPavan Nikhilesh 	}
438*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, &ev, enq, deq);
4392eaa37b8SPavan Nikhilesh 
4402eaa37b8SPavan Nikhilesh 	return 0;
4412eaa37b8SPavan Nikhilesh }
4422eaa37b8SPavan Nikhilesh 
4432eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_multi_stage_burst_tx_vector(void * arg)4442eaa37b8SPavan Nikhilesh pipeline_atq_worker_multi_stage_burst_tx_vector(void *arg)
4452eaa37b8SPavan Nikhilesh {
4462eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
447*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
4482eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
4492eaa37b8SPavan Nikhilesh 
4502eaa37b8SPavan Nikhilesh 	while (!t->done) {
451*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
4522eaa37b8SPavan Nikhilesh 
4532eaa37b8SPavan Nikhilesh 		if (!nb_rx) {
4542eaa37b8SPavan Nikhilesh 			rte_pause();
4552eaa37b8SPavan Nikhilesh 			continue;
4562eaa37b8SPavan Nikhilesh 		}
4572eaa37b8SPavan Nikhilesh 
4582eaa37b8SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
4592eaa37b8SPavan Nikhilesh 			cq_id = ev[i].sub_event_type % nb_stages;
4602eaa37b8SPavan Nikhilesh 
4612eaa37b8SPavan Nikhilesh 			if (cq_id == last_queue) {
4622eaa37b8SPavan Nikhilesh 				vector_sz = ev[i].vec->nb_elem;
463*f0b68c0bSPavan Nikhilesh 				pipeline_event_tx_vector(dev, port, &ev[i], t);
4642eaa37b8SPavan Nikhilesh 				ev[i].op = RTE_EVENT_OP_RELEASE;
4652eaa37b8SPavan Nikhilesh 				w->processed_pkts += vector_sz;
4662eaa37b8SPavan Nikhilesh 				continue;
4672eaa37b8SPavan Nikhilesh 			}
4682eaa37b8SPavan Nikhilesh 
4692eaa37b8SPavan Nikhilesh 			ev[i].sub_event_type++;
4702eaa37b8SPavan Nikhilesh 			pipeline_fwd_event_vector(&ev[i],
4712eaa37b8SPavan Nikhilesh 						  sched_type_list[cq_id]);
4722eaa37b8SPavan Nikhilesh 		}
4732eaa37b8SPavan Nikhilesh 
474*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_enqueue_burst(dev, port, ev, nb_rx, t);
4752eaa37b8SPavan Nikhilesh 	}
476*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
4772eaa37b8SPavan Nikhilesh 
4782eaa37b8SPavan Nikhilesh 	return 0;
4792eaa37b8SPavan Nikhilesh }
4802eaa37b8SPavan Nikhilesh 
4812eaa37b8SPavan Nikhilesh static __rte_noinline int
pipeline_atq_worker_multi_stage_burst_fwd_vector(void * arg)4822eaa37b8SPavan Nikhilesh pipeline_atq_worker_multi_stage_burst_fwd_vector(void *arg)
4832eaa37b8SPavan Nikhilesh {
4842eaa37b8SPavan Nikhilesh 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
4852eaa37b8SPavan Nikhilesh 	const uint8_t *tx_queue = t->tx_evqueue_id;
486*f0b68c0bSPavan Nikhilesh 	uint16_t nb_rx = 0, nb_tx = 0;
4872eaa37b8SPavan Nikhilesh 	uint16_t vector_sz;
4882eaa37b8SPavan Nikhilesh 
4892eaa37b8SPavan Nikhilesh 	while (!t->done) {
490*f0b68c0bSPavan Nikhilesh 		nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
4912eaa37b8SPavan Nikhilesh 
4922eaa37b8SPavan Nikhilesh 		if (!nb_rx) {
4932eaa37b8SPavan Nikhilesh 			rte_pause();
4942eaa37b8SPavan Nikhilesh 			continue;
4952eaa37b8SPavan Nikhilesh 		}
4962eaa37b8SPavan Nikhilesh 
4972eaa37b8SPavan Nikhilesh 		for (i = 0; i < nb_rx; i++) {
4982eaa37b8SPavan Nikhilesh 			cq_id = ev[i].sub_event_type % nb_stages;
4992eaa37b8SPavan Nikhilesh 
5002eaa37b8SPavan Nikhilesh 			if (cq_id == last_queue) {
5012eaa37b8SPavan Nikhilesh 				vector_sz = ev[i].vec->nb_elem;
5022eaa37b8SPavan Nikhilesh 				ev[i].queue_id = tx_queue[ev[i].vec->port];
5032eaa37b8SPavan Nikhilesh 				ev[i].vec->queue = 0;
5042eaa37b8SPavan Nikhilesh 				pipeline_fwd_event_vector(
5052eaa37b8SPavan Nikhilesh 					&ev[i], RTE_SCHED_TYPE_ATOMIC);
5062eaa37b8SPavan Nikhilesh 				w->processed_pkts += vector_sz;
5072eaa37b8SPavan Nikhilesh 			} else {
5082eaa37b8SPavan Nikhilesh 				ev[i].sub_event_type++;
5092eaa37b8SPavan Nikhilesh 				pipeline_fwd_event_vector(
5102eaa37b8SPavan Nikhilesh 					&ev[i], sched_type_list[cq_id]);
5112eaa37b8SPavan Nikhilesh 			}
5122eaa37b8SPavan Nikhilesh 		}
5132eaa37b8SPavan Nikhilesh 
514*f0b68c0bSPavan Nikhilesh 		nb_tx = pipeline_event_enqueue_burst(dev, port, ev, nb_rx, t);
5152eaa37b8SPavan Nikhilesh 	}
516*f0b68c0bSPavan Nikhilesh 	pipeline_worker_cleanup(dev, port, ev, nb_tx, nb_rx);
5172eaa37b8SPavan Nikhilesh 
5182eaa37b8SPavan Nikhilesh 	return 0;
5192eaa37b8SPavan Nikhilesh }
5202eaa37b8SPavan Nikhilesh 
5217a310364SPavan Nikhilesh static int
worker_wrapper(void * arg)5226bf570a9SPavan Nikhilesh worker_wrapper(void *arg)
5236bf570a9SPavan Nikhilesh {
5247a310364SPavan Nikhilesh 	struct worker_data *w  = arg;
5257a310364SPavan Nikhilesh 	struct evt_options *opt = w->t->opt;
5267a310364SPavan Nikhilesh 	const bool burst = evt_has_burst_mode(w->dev_id);
527032a965aSPavan Nikhilesh 	const bool internal_port = w->t->internal_port;
5287a310364SPavan Nikhilesh 	const uint8_t nb_stages = opt->nb_stages;
5292eaa37b8SPavan Nikhilesh 	/*vector/burst/internal_port*/
5302eaa37b8SPavan Nikhilesh 	const pipeline_atq_worker_t
5312eaa37b8SPavan Nikhilesh 	pipeline_atq_worker_single_stage[2][2][2] = {
5322eaa37b8SPavan Nikhilesh 		[0][0][0] = pipeline_atq_worker_single_stage_fwd,
5332eaa37b8SPavan Nikhilesh 		[0][0][1] = pipeline_atq_worker_single_stage_tx,
5342eaa37b8SPavan Nikhilesh 		[0][1][0] = pipeline_atq_worker_single_stage_burst_fwd,
5352eaa37b8SPavan Nikhilesh 		[0][1][1] = pipeline_atq_worker_single_stage_burst_tx,
5362eaa37b8SPavan Nikhilesh 		[1][0][0] = pipeline_atq_worker_single_stage_fwd_vector,
5372eaa37b8SPavan Nikhilesh 		[1][0][1] = pipeline_atq_worker_single_stage_tx_vector,
5382eaa37b8SPavan Nikhilesh 		[1][1][0] = pipeline_atq_worker_single_stage_burst_fwd_vector,
5392eaa37b8SPavan Nikhilesh 		[1][1][1] = pipeline_atq_worker_single_stage_burst_tx_vector,
5402eaa37b8SPavan Nikhilesh 	};
5412eaa37b8SPavan Nikhilesh 	const pipeline_atq_worker_t
5422eaa37b8SPavan Nikhilesh 	pipeline_atq_worker_multi_stage[2][2][2] = {
5432eaa37b8SPavan Nikhilesh 		[0][0][0] = pipeline_atq_worker_multi_stage_fwd,
5442eaa37b8SPavan Nikhilesh 		[0][0][1] = pipeline_atq_worker_multi_stage_tx,
5452eaa37b8SPavan Nikhilesh 		[0][1][0] = pipeline_atq_worker_multi_stage_burst_fwd,
5462eaa37b8SPavan Nikhilesh 		[0][1][1] = pipeline_atq_worker_multi_stage_burst_tx,
5472eaa37b8SPavan Nikhilesh 		[1][0][0] = pipeline_atq_worker_multi_stage_fwd_vector,
5482eaa37b8SPavan Nikhilesh 		[1][0][1] = pipeline_atq_worker_multi_stage_tx_vector,
5492eaa37b8SPavan Nikhilesh 		[1][1][0] = pipeline_atq_worker_multi_stage_burst_fwd_vector,
5502eaa37b8SPavan Nikhilesh 		[1][1][1] = pipeline_atq_worker_multi_stage_burst_tx_vector,
5512eaa37b8SPavan Nikhilesh 	};
5527a310364SPavan Nikhilesh 
5532eaa37b8SPavan Nikhilesh 	if (nb_stages == 1)
5542eaa37b8SPavan Nikhilesh 		return (pipeline_atq_worker_single_stage[opt->ena_vector][burst]
5552eaa37b8SPavan Nikhilesh 							[internal_port])(arg);
5562eaa37b8SPavan Nikhilesh 	else
5572eaa37b8SPavan Nikhilesh 		return (pipeline_atq_worker_multi_stage[opt->ena_vector][burst]
5582eaa37b8SPavan Nikhilesh 						       [internal_port])(arg);
559032a965aSPavan Nikhilesh 
5606bf570a9SPavan Nikhilesh 	rte_panic("invalid worker\n");
5616bf570a9SPavan Nikhilesh }
5626bf570a9SPavan Nikhilesh 
5636bf570a9SPavan Nikhilesh static int
pipeline_atq_launch_lcores(struct evt_test * test,struct evt_options * opt)5646bf570a9SPavan Nikhilesh pipeline_atq_launch_lcores(struct evt_test *test, struct evt_options *opt)
5656bf570a9SPavan Nikhilesh {
5666bf570a9SPavan Nikhilesh 	return pipeline_launch_lcores(test, opt, worker_wrapper);
5676bf570a9SPavan Nikhilesh }
5686bf570a9SPavan Nikhilesh 
5696bf570a9SPavan Nikhilesh static int
pipeline_atq_eventdev_setup(struct evt_test * test,struct evt_options * opt)5706bf570a9SPavan Nikhilesh pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
5716bf570a9SPavan Nikhilesh {
5726bf570a9SPavan Nikhilesh 	int ret;
5736bf570a9SPavan Nikhilesh 	int nb_ports;
5746bf570a9SPavan Nikhilesh 	int nb_queues;
5752eaa37b8SPavan Nikhilesh 	uint8_t queue, is_prod;
576032a965aSPavan Nikhilesh 	uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS];
5776bf570a9SPavan Nikhilesh 	uint8_t queue_arr[RTE_EVENT_MAX_QUEUES_PER_DEV];
5786bf570a9SPavan Nikhilesh 	uint8_t nb_worker_queues = 0;
579032a965aSPavan Nikhilesh 	uint8_t tx_evport_id = 0;
580032a965aSPavan Nikhilesh 	uint16_t prod = 0;
581032a965aSPavan Nikhilesh 	struct rte_event_dev_info info;
582032a965aSPavan Nikhilesh 	struct test_pipeline *t = evt_test_priv(test);
5836bf570a9SPavan Nikhilesh 
5846bf570a9SPavan Nikhilesh 	nb_ports = evt_nr_active_lcores(opt->wlcores);
585d9a42a69SThomas Monjalon 	nb_queues = rte_eth_dev_count_avail();
5866bf570a9SPavan Nikhilesh 
587032a965aSPavan Nikhilesh 	memset(tx_evqueue_id, 0, sizeof(uint8_t) * RTE_MAX_ETHPORTS);
588032a965aSPavan Nikhilesh 	memset(queue_arr, 0, sizeof(uint8_t) * RTE_EVENT_MAX_QUEUES_PER_DEV);
589032a965aSPavan Nikhilesh 	/* One queue for Tx adapter per port */
590032a965aSPavan Nikhilesh 	if (!t->internal_port) {
591032a965aSPavan Nikhilesh 		RTE_ETH_FOREACH_DEV(prod) {
592032a965aSPavan Nikhilesh 			tx_evqueue_id[prod] = nb_queues;
5936bf570a9SPavan Nikhilesh 			nb_queues++;
5946bf570a9SPavan Nikhilesh 		}
595032a965aSPavan Nikhilesh 	}
5966bf570a9SPavan Nikhilesh 
5976bf570a9SPavan Nikhilesh 	rte_event_dev_info_get(opt->dev_id, &info);
5986bf570a9SPavan Nikhilesh 
599f0959283SPavan Nikhilesh 	ret = evt_configure_eventdev(opt, nb_queues, nb_ports);
6006bf570a9SPavan Nikhilesh 	if (ret) {
6016bf570a9SPavan Nikhilesh 		evt_err("failed to configure eventdev %d", opt->dev_id);
6026bf570a9SPavan Nikhilesh 		return ret;
6036bf570a9SPavan Nikhilesh 	}
6046bf570a9SPavan Nikhilesh 
6056bf570a9SPavan Nikhilesh 	struct rte_event_queue_conf q_conf = {
6066bf570a9SPavan Nikhilesh 		.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
6076bf570a9SPavan Nikhilesh 		.nb_atomic_flows = opt->nb_flows,
6086bf570a9SPavan Nikhilesh 		.nb_atomic_order_sequences = opt->nb_flows,
6096bf570a9SPavan Nikhilesh 	};
6106bf570a9SPavan Nikhilesh 	/* queue configurations */
6116bf570a9SPavan Nikhilesh 	for (queue = 0; queue < nb_queues; queue++) {
6126bf570a9SPavan Nikhilesh 		q_conf.event_queue_cfg = RTE_EVENT_QUEUE_CFG_ALL_TYPES;
6136bf570a9SPavan Nikhilesh 
614032a965aSPavan Nikhilesh 		if (!t->internal_port) {
6152eaa37b8SPavan Nikhilesh 			is_prod = false;
616032a965aSPavan Nikhilesh 			RTE_ETH_FOREACH_DEV(prod) {
617032a965aSPavan Nikhilesh 				if (queue == tx_evqueue_id[prod]) {
6186bf570a9SPavan Nikhilesh 					q_conf.event_queue_cfg =
6196bf570a9SPavan Nikhilesh 						RTE_EVENT_QUEUE_CFG_SINGLE_LINK;
6202eaa37b8SPavan Nikhilesh 					is_prod = true;
6212eaa37b8SPavan Nikhilesh 					break;
6222eaa37b8SPavan Nikhilesh 				}
6232eaa37b8SPavan Nikhilesh 			}
6242eaa37b8SPavan Nikhilesh 			if (!is_prod) {
6256bf570a9SPavan Nikhilesh 				queue_arr[nb_worker_queues] = queue;
6266bf570a9SPavan Nikhilesh 				nb_worker_queues++;
6276bf570a9SPavan Nikhilesh 			}
6286bf570a9SPavan Nikhilesh 		}
6296bf570a9SPavan Nikhilesh 
6306bf570a9SPavan Nikhilesh 		ret = rte_event_queue_setup(opt->dev_id, queue, &q_conf);
6316bf570a9SPavan Nikhilesh 		if (ret) {
6326bf570a9SPavan Nikhilesh 			evt_err("failed to setup queue=%d", queue);
6336bf570a9SPavan Nikhilesh 			return ret;
6346bf570a9SPavan Nikhilesh 		}
6356bf570a9SPavan Nikhilesh 	}
6366bf570a9SPavan Nikhilesh 
637535c630cSPavan Nikhilesh 	if (opt->wkr_deq_dep > info.max_event_port_dequeue_depth)
638535c630cSPavan Nikhilesh 		opt->wkr_deq_dep = info.max_event_port_dequeue_depth;
639535c630cSPavan Nikhilesh 
6406bf570a9SPavan Nikhilesh 	/* port configuration */
6416bf570a9SPavan Nikhilesh 	const struct rte_event_port_conf p_conf = {
6426bf570a9SPavan Nikhilesh 		.dequeue_depth = opt->wkr_deq_dep,
6436bf570a9SPavan Nikhilesh 		.enqueue_depth = info.max_event_port_dequeue_depth,
6446bf570a9SPavan Nikhilesh 		.new_event_threshold = info.max_num_events,
6456bf570a9SPavan Nikhilesh 	};
6466bf570a9SPavan Nikhilesh 
647032a965aSPavan Nikhilesh 	if (!t->internal_port)
6486bf570a9SPavan Nikhilesh 		ret = pipeline_event_port_setup(test, opt, queue_arr,
6496bf570a9SPavan Nikhilesh 				nb_worker_queues, p_conf);
650032a965aSPavan Nikhilesh 	else
6516bf570a9SPavan Nikhilesh 		ret = pipeline_event_port_setup(test, opt, NULL, nb_queues,
6526bf570a9SPavan Nikhilesh 				p_conf);
6536bf570a9SPavan Nikhilesh 
6546bf570a9SPavan Nikhilesh 	if (ret)
6556bf570a9SPavan Nikhilesh 		return ret;
6566bf570a9SPavan Nikhilesh 
6576bf570a9SPavan Nikhilesh 	/*
6586bf570a9SPavan Nikhilesh 	 * The pipelines are setup in the following manner:
6596bf570a9SPavan Nikhilesh 	 *
6606bf570a9SPavan Nikhilesh 	 * eth_dev_count = 2, nb_stages = 2, atq mode
6616bf570a9SPavan Nikhilesh 	 *
662032a965aSPavan Nikhilesh 	 * eth0, eth1 have Internal port capability :
6636bf570a9SPavan Nikhilesh 	 *	queues = 2
6646bf570a9SPavan Nikhilesh 	 *	stride = 1
6656bf570a9SPavan Nikhilesh 	 *
6666bf570a9SPavan Nikhilesh 	 *	event queue pipelines:
667032a965aSPavan Nikhilesh 	 *	eth0 -> q0 ->Tx
668032a965aSPavan Nikhilesh 	 *	eth1 -> q1 ->Tx
6696bf570a9SPavan Nikhilesh 	 *
6706bf570a9SPavan Nikhilesh 	 *	q0, q1 are configured as ATQ so, all the different stages can
6716bf570a9SPavan Nikhilesh 	 *	be enqueued on the same queue.
6726bf570a9SPavan Nikhilesh 	 *
673032a965aSPavan Nikhilesh 	 * eth0, eth1 use Tx adapters service core :
674032a965aSPavan Nikhilesh 	 *	queues = 4
6756bf570a9SPavan Nikhilesh 	 *	stride = 1
6766bf570a9SPavan Nikhilesh 	 *
6776bf570a9SPavan Nikhilesh 	 *	event queue pipelines:
678032a965aSPavan Nikhilesh 	 *	eth0 -> q0  -> q2 -> Tx
679032a965aSPavan Nikhilesh 	 *	eth1 -> q1  -> q3 -> Tx
6806bf570a9SPavan Nikhilesh 	 *
6816bf570a9SPavan Nikhilesh 	 *	q0, q1 are configured as stated above.
682032a965aSPavan Nikhilesh 	 *	q2, q3 configured as SINGLE_LINK.
6836bf570a9SPavan Nikhilesh 	 */
6846bf570a9SPavan Nikhilesh 	ret = pipeline_event_rx_adapter_setup(opt, 1, p_conf);
6856bf570a9SPavan Nikhilesh 	if (ret)
6866bf570a9SPavan Nikhilesh 		return ret;
687032a965aSPavan Nikhilesh 	ret = pipeline_event_tx_adapter_setup(opt, p_conf);
688032a965aSPavan Nikhilesh 	if (ret)
689032a965aSPavan Nikhilesh 		return ret;
6906bf570a9SPavan Nikhilesh 
6916bf570a9SPavan Nikhilesh 	if (!evt_has_distributed_sched(opt->dev_id)) {
6926bf570a9SPavan Nikhilesh 		uint32_t service_id;
6936bf570a9SPavan Nikhilesh 		rte_event_dev_service_id_get(opt->dev_id, &service_id);
6946bf570a9SPavan Nikhilesh 		ret = evt_service_setup(service_id);
6956bf570a9SPavan Nikhilesh 		if (ret) {
6966bf570a9SPavan Nikhilesh 			evt_err("No service lcore found to run event dev.");
6976bf570a9SPavan Nikhilesh 			return ret;
6986bf570a9SPavan Nikhilesh 		}
6996bf570a9SPavan Nikhilesh 	}
7006bf570a9SPavan Nikhilesh 
701032a965aSPavan Nikhilesh 	/* Connect the tx_evqueue_id to the Tx adapter port */
702032a965aSPavan Nikhilesh 	if (!t->internal_port) {
703032a965aSPavan Nikhilesh 		RTE_ETH_FOREACH_DEV(prod) {
704032a965aSPavan Nikhilesh 			ret = rte_event_eth_tx_adapter_event_port_get(prod,
705032a965aSPavan Nikhilesh 					&tx_evport_id);
706032a965aSPavan Nikhilesh 			if (ret) {
707032a965aSPavan Nikhilesh 				evt_err("Unable to get Tx adapter[%d]", prod);
708032a965aSPavan Nikhilesh 				return ret;
709032a965aSPavan Nikhilesh 			}
710032a965aSPavan Nikhilesh 
711032a965aSPavan Nikhilesh 			if (rte_event_port_link(opt->dev_id, tx_evport_id,
712032a965aSPavan Nikhilesh 						&tx_evqueue_id[prod],
713032a965aSPavan Nikhilesh 						NULL, 1) != 1) {
714032a965aSPavan Nikhilesh 				evt_err("Unable to link Tx adptr[%d] evprt[%d]",
715032a965aSPavan Nikhilesh 						prod, tx_evport_id);
716032a965aSPavan Nikhilesh 				return ret;
717032a965aSPavan Nikhilesh 			}
718032a965aSPavan Nikhilesh 		}
719032a965aSPavan Nikhilesh 	}
720032a965aSPavan Nikhilesh 
72166b82db2SPavan Nikhilesh 	ret = rte_event_dev_start(opt->dev_id);
72266b82db2SPavan Nikhilesh 	if (ret) {
72366b82db2SPavan Nikhilesh 		evt_err("failed to start eventdev %d", opt->dev_id);
72466b82db2SPavan Nikhilesh 		return ret;
72566b82db2SPavan Nikhilesh 	}
72666b82db2SPavan Nikhilesh 
72766b82db2SPavan Nikhilesh 
728032a965aSPavan Nikhilesh 	RTE_ETH_FOREACH_DEV(prod) {
729032a965aSPavan Nikhilesh 		ret = rte_eth_dev_start(prod);
730032a965aSPavan Nikhilesh 		if (ret) {
731032a965aSPavan Nikhilesh 			evt_err("Ethernet dev [%d] failed to start."
732032a965aSPavan Nikhilesh 					" Using synthetic producer", prod);
733032a965aSPavan Nikhilesh 			return ret;
734032a965aSPavan Nikhilesh 		}
735032a965aSPavan Nikhilesh 	}
736032a965aSPavan Nikhilesh 
737032a965aSPavan Nikhilesh 	RTE_ETH_FOREACH_DEV(prod) {
738032a965aSPavan Nikhilesh 		ret = rte_event_eth_rx_adapter_start(prod);
739032a965aSPavan Nikhilesh 		if (ret) {
740032a965aSPavan Nikhilesh 			evt_err("Rx adapter[%d] start failed", prod);
741032a965aSPavan Nikhilesh 			return ret;
742032a965aSPavan Nikhilesh 		}
743032a965aSPavan Nikhilesh 
744032a965aSPavan Nikhilesh 		ret = rte_event_eth_tx_adapter_start(prod);
745032a965aSPavan Nikhilesh 		if (ret) {
746032a965aSPavan Nikhilesh 			evt_err("Tx adapter[%d] start failed", prod);
747032a965aSPavan Nikhilesh 			return ret;
748032a965aSPavan Nikhilesh 		}
749032a965aSPavan Nikhilesh 	}
750032a965aSPavan Nikhilesh 
751032a965aSPavan Nikhilesh 	memcpy(t->tx_evqueue_id, tx_evqueue_id, sizeof(uint8_t) *
752032a965aSPavan Nikhilesh 			RTE_MAX_ETHPORTS);
753032a965aSPavan Nikhilesh 
7546bf570a9SPavan Nikhilesh 	return 0;
7556bf570a9SPavan Nikhilesh }
7566bf570a9SPavan Nikhilesh 
7576bf570a9SPavan Nikhilesh static void
pipeline_atq_opt_dump(struct evt_options * opt)7586bf570a9SPavan Nikhilesh pipeline_atq_opt_dump(struct evt_options *opt)
7596bf570a9SPavan Nikhilesh {
7606bf570a9SPavan Nikhilesh 	pipeline_opt_dump(opt, pipeline_atq_nb_event_queues(opt));
7616bf570a9SPavan Nikhilesh }
7626bf570a9SPavan Nikhilesh 
7636bf570a9SPavan Nikhilesh static int
pipeline_atq_opt_check(struct evt_options * opt)7646bf570a9SPavan Nikhilesh pipeline_atq_opt_check(struct evt_options *opt)
7656bf570a9SPavan Nikhilesh {
7666bf570a9SPavan Nikhilesh 	return pipeline_opt_check(opt, pipeline_atq_nb_event_queues(opt));
7676bf570a9SPavan Nikhilesh }
7686bf570a9SPavan Nikhilesh 
7696bf570a9SPavan Nikhilesh static bool
pipeline_atq_capability_check(struct evt_options * opt)7706bf570a9SPavan Nikhilesh pipeline_atq_capability_check(struct evt_options *opt)
7716bf570a9SPavan Nikhilesh {
7726bf570a9SPavan Nikhilesh 	struct rte_event_dev_info dev_info;
7736bf570a9SPavan Nikhilesh 
7746bf570a9SPavan Nikhilesh 	rte_event_dev_info_get(opt->dev_id, &dev_info);
7756bf570a9SPavan Nikhilesh 	if (dev_info.max_event_queues < pipeline_atq_nb_event_queues(opt) ||
7766bf570a9SPavan Nikhilesh 			dev_info.max_event_ports <
7776bf570a9SPavan Nikhilesh 			evt_nr_active_lcores(opt->wlcores)) {
7786bf570a9SPavan Nikhilesh 		evt_err("not enough eventdev queues=%d/%d or ports=%d/%d",
7796bf570a9SPavan Nikhilesh 			pipeline_atq_nb_event_queues(opt),
7806bf570a9SPavan Nikhilesh 			dev_info.max_event_queues,
7816bf570a9SPavan Nikhilesh 			evt_nr_active_lcores(opt->wlcores),
7826bf570a9SPavan Nikhilesh 			dev_info.max_event_ports);
7836bf570a9SPavan Nikhilesh 	}
78417923772SApeksha Gupta 	if (!evt_has_all_types_queue(opt->dev_id))
78517923772SApeksha Gupta 		return false;
7866bf570a9SPavan Nikhilesh 
7876bf570a9SPavan Nikhilesh 	return true;
7886bf570a9SPavan Nikhilesh }
7896bf570a9SPavan Nikhilesh 
7906bf570a9SPavan Nikhilesh static const struct evt_test_ops pipeline_atq =  {
7916bf570a9SPavan Nikhilesh 	.cap_check          = pipeline_atq_capability_check,
7926bf570a9SPavan Nikhilesh 	.opt_check          = pipeline_atq_opt_check,
7936bf570a9SPavan Nikhilesh 	.opt_dump           = pipeline_atq_opt_dump,
7946bf570a9SPavan Nikhilesh 	.test_setup         = pipeline_test_setup,
7956bf570a9SPavan Nikhilesh 	.mempool_setup      = pipeline_mempool_setup,
7966bf570a9SPavan Nikhilesh 	.ethdev_setup	    = pipeline_ethdev_setup,
7976bf570a9SPavan Nikhilesh 	.eventdev_setup     = pipeline_atq_eventdev_setup,
7986bf570a9SPavan Nikhilesh 	.launch_lcores      = pipeline_atq_launch_lcores,
799a734e738SPavan Nikhilesh 	.ethdev_rx_stop     = pipeline_ethdev_rx_stop,
8006bf570a9SPavan Nikhilesh 	.eventdev_destroy   = pipeline_eventdev_destroy,
8016bf570a9SPavan Nikhilesh 	.mempool_destroy    = pipeline_mempool_destroy,
8026bf570a9SPavan Nikhilesh 	.ethdev_destroy	    = pipeline_ethdev_destroy,
8036bf570a9SPavan Nikhilesh 	.test_result        = pipeline_test_result,
8046bf570a9SPavan Nikhilesh 	.test_destroy       = pipeline_test_destroy,
8056bf570a9SPavan Nikhilesh };
8066bf570a9SPavan Nikhilesh 
8076bf570a9SPavan Nikhilesh EVT_TEST_REGISTER(pipeline_atq);
808