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