161e9524aSPavan Nikhilesh /*
261e9524aSPavan Nikhilesh * SPDX-License-Identifier: BSD-3-Clause
361e9524aSPavan Nikhilesh * Copyright 2017 Cavium, Inc.
461e9524aSPavan Nikhilesh */
561e9524aSPavan Nikhilesh
661e9524aSPavan Nikhilesh #ifndef _TEST_PIPELINE_COMMON_
761e9524aSPavan Nikhilesh #define _TEST_PIPELINE_COMMON_
861e9524aSPavan Nikhilesh
961e9524aSPavan Nikhilesh #include <stdio.h>
1061e9524aSPavan Nikhilesh #include <stdbool.h>
1161e9524aSPavan Nikhilesh #include <unistd.h>
1261e9524aSPavan Nikhilesh
1361e9524aSPavan Nikhilesh #include <rte_cycles.h>
1461e9524aSPavan Nikhilesh #include <rte_ethdev.h>
15c9043624SPavan Nikhilesh #include <rte_ether.h>
1661e9524aSPavan Nikhilesh #include <rte_event_eth_rx_adapter.h>
17032a965aSPavan Nikhilesh #include <rte_event_eth_tx_adapter.h>
18a734e738SPavan Nikhilesh #include <rte_eventdev.h>
1961e9524aSPavan Nikhilesh #include <rte_lcore.h>
2061e9524aSPavan Nikhilesh #include <rte_malloc.h>
2161e9524aSPavan Nikhilesh #include <rte_mempool.h>
2261e9524aSPavan Nikhilesh #include <rte_prefetch.h>
23f853a011SPavan Nikhilesh #include <rte_service.h>
24f853a011SPavan Nikhilesh #include <rte_service_component.h>
25a734e738SPavan Nikhilesh #include <rte_spinlock.h>
26c9043624SPavan Nikhilesh #include <rte_udp.h>
2761e9524aSPavan Nikhilesh
2861e9524aSPavan Nikhilesh #include "evt_common.h"
2961e9524aSPavan Nikhilesh #include "evt_options.h"
3061e9524aSPavan Nikhilesh #include "evt_test.h"
3161e9524aSPavan Nikhilesh
3261e9524aSPavan Nikhilesh struct test_pipeline;
3361e9524aSPavan Nikhilesh
34*0efea35aSTyler Retzlaff struct __rte_cache_aligned worker_data {
3561e9524aSPavan Nikhilesh uint64_t processed_pkts;
3661e9524aSPavan Nikhilesh uint8_t dev_id;
3761e9524aSPavan Nikhilesh uint8_t port_id;
3861e9524aSPavan Nikhilesh struct test_pipeline *t;
39*0efea35aSTyler Retzlaff };
4061e9524aSPavan Nikhilesh
41*0efea35aSTyler Retzlaff struct __rte_cache_aligned test_pipeline {
4261e9524aSPavan Nikhilesh /* Don't change the offset of "done". Signal handler use this memory
4361e9524aSPavan Nikhilesh * to terminate all lcores work.
4461e9524aSPavan Nikhilesh */
4561e9524aSPavan Nikhilesh int done;
4661e9524aSPavan Nikhilesh uint8_t nb_workers;
47032a965aSPavan Nikhilesh uint8_t internal_port;
48032a965aSPavan Nikhilesh uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS];
4961e9524aSPavan Nikhilesh enum evt_test_result result;
5061e9524aSPavan Nikhilesh uint32_t nb_flows;
5161e9524aSPavan Nikhilesh uint64_t outstand_pkts;
52dbd4defeSPavan Nikhilesh struct rte_mempool *pool[RTE_MAX_ETHPORTS];
5361e9524aSPavan Nikhilesh struct worker_data worker[EVT_MAX_PORTS];
5461e9524aSPavan Nikhilesh struct evt_options *opt;
55*0efea35aSTyler Retzlaff alignas(RTE_CACHE_LINE_SIZE) uint8_t sched_type_list[EVT_MAX_STAGES];
56*0efea35aSTyler Retzlaff };
5761e9524aSPavan Nikhilesh
58f853a011SPavan Nikhilesh #define BURST_SIZE 16
59f853a011SPavan Nikhilesh
60f26320a6SPavan Nikhilesh #define PIPELINE_WORKER_SINGLE_STAGE_INIT \
61314bcf58SPavan Nikhilesh struct worker_data *w = arg; \
62314bcf58SPavan Nikhilesh struct test_pipeline *t = w->t; \
63314bcf58SPavan Nikhilesh const uint8_t dev = w->dev_id; \
64314bcf58SPavan Nikhilesh const uint8_t port = w->port_id; \
65*0efea35aSTyler Retzlaff alignas(RTE_CACHE_LINE_SIZE) struct rte_event ev
66314bcf58SPavan Nikhilesh
67f26320a6SPavan Nikhilesh #define PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT \
68314bcf58SPavan Nikhilesh int i; \
69314bcf58SPavan Nikhilesh struct worker_data *w = arg; \
70314bcf58SPavan Nikhilesh struct test_pipeline *t = w->t; \
71314bcf58SPavan Nikhilesh const uint8_t dev = w->dev_id; \
72314bcf58SPavan Nikhilesh const uint8_t port = w->port_id; \
73*0efea35aSTyler Retzlaff alignas(RTE_CACHE_LINE_SIZE) struct rte_event ev[BURST_SIZE + 1]
74314bcf58SPavan Nikhilesh
75f26320a6SPavan Nikhilesh #define PIPELINE_WORKER_MULTI_STAGE_INIT \
76314bcf58SPavan Nikhilesh struct worker_data *w = arg; \
77314bcf58SPavan Nikhilesh struct test_pipeline *t = w->t; \
78314bcf58SPavan Nikhilesh uint8_t cq_id; \
79314bcf58SPavan Nikhilesh const uint8_t dev = w->dev_id; \
80314bcf58SPavan Nikhilesh const uint8_t port = w->port_id; \
81314bcf58SPavan Nikhilesh const uint8_t last_queue = t->opt->nb_stages - 1; \
82314bcf58SPavan Nikhilesh uint8_t *const sched_type_list = &t->sched_type_list[0]; \
83032a965aSPavan Nikhilesh const uint8_t nb_stages = t->opt->nb_stages + 1; \
84*0efea35aSTyler Retzlaff alignas(RTE_CACHE_LINE_SIZE) struct rte_event ev
85314bcf58SPavan Nikhilesh
86f26320a6SPavan Nikhilesh #define PIPELINE_WORKER_MULTI_STAGE_BURST_INIT \
87314bcf58SPavan Nikhilesh int i; \
88314bcf58SPavan Nikhilesh struct worker_data *w = arg; \
89314bcf58SPavan Nikhilesh struct test_pipeline *t = w->t; \
90314bcf58SPavan Nikhilesh uint8_t cq_id; \
91314bcf58SPavan Nikhilesh const uint8_t dev = w->dev_id; \
92314bcf58SPavan Nikhilesh const uint8_t port = w->port_id; \
93314bcf58SPavan Nikhilesh const uint8_t last_queue = t->opt->nb_stages - 1; \
94314bcf58SPavan Nikhilesh uint8_t *const sched_type_list = &t->sched_type_list[0]; \
95032a965aSPavan Nikhilesh const uint8_t nb_stages = t->opt->nb_stages + 1; \
96*0efea35aSTyler Retzlaff alignas(RTE_CACHE_LINE_SIZE) struct rte_event ev[BURST_SIZE + 1]
97314bcf58SPavan Nikhilesh
98314bcf58SPavan Nikhilesh static __rte_always_inline void
pipeline_fwd_event(struct rte_event * ev,uint8_t sched)99314bcf58SPavan Nikhilesh pipeline_fwd_event(struct rte_event *ev, uint8_t sched)
100314bcf58SPavan Nikhilesh {
101314bcf58SPavan Nikhilesh ev->event_type = RTE_EVENT_TYPE_CPU;
102314bcf58SPavan Nikhilesh ev->op = RTE_EVENT_OP_FORWARD;
103314bcf58SPavan Nikhilesh ev->sched_type = sched;
104314bcf58SPavan Nikhilesh }
105314bcf58SPavan Nikhilesh
106314bcf58SPavan Nikhilesh static __rte_always_inline void
pipeline_fwd_event_vector(struct rte_event * ev,uint8_t sched)1072eaa37b8SPavan Nikhilesh pipeline_fwd_event_vector(struct rte_event *ev, uint8_t sched)
1082eaa37b8SPavan Nikhilesh {
1092eaa37b8SPavan Nikhilesh ev->event_type = RTE_EVENT_TYPE_CPU_VECTOR;
1102eaa37b8SPavan Nikhilesh ev->op = RTE_EVENT_OP_FORWARD;
1112eaa37b8SPavan Nikhilesh ev->sched_type = sched;
1122eaa37b8SPavan Nikhilesh }
1132eaa37b8SPavan Nikhilesh
114f0b68c0bSPavan Nikhilesh static __rte_always_inline uint8_t
pipeline_event_tx(const uint8_t dev,const uint8_t port,struct rte_event * const ev,struct test_pipeline * t)115032a965aSPavan Nikhilesh pipeline_event_tx(const uint8_t dev, const uint8_t port,
116f0b68c0bSPavan Nikhilesh struct rte_event *const ev, struct test_pipeline *t)
117032a965aSPavan Nikhilesh {
118f0b68c0bSPavan Nikhilesh uint8_t enq;
119f0b68c0bSPavan Nikhilesh
120032a965aSPavan Nikhilesh rte_event_eth_tx_adapter_txq_set(ev->mbuf, 0);
121f0b68c0bSPavan Nikhilesh do {
122f0b68c0bSPavan Nikhilesh enq = rte_event_eth_tx_adapter_enqueue(dev, port, ev, 1, 0);
123f0b68c0bSPavan Nikhilesh } while (!enq && !t->done);
124f0b68c0bSPavan Nikhilesh
125f0b68c0bSPavan Nikhilesh return enq;
126032a965aSPavan Nikhilesh }
127032a965aSPavan Nikhilesh
128f0b68c0bSPavan Nikhilesh static __rte_always_inline uint8_t
pipeline_event_tx_vector(const uint8_t dev,const uint8_t port,struct rte_event * const ev,struct test_pipeline * t)1292eaa37b8SPavan Nikhilesh pipeline_event_tx_vector(const uint8_t dev, const uint8_t port,
130f0b68c0bSPavan Nikhilesh struct rte_event *const ev, struct test_pipeline *t)
1312eaa37b8SPavan Nikhilesh {
132f0b68c0bSPavan Nikhilesh uint8_t enq;
1332eaa37b8SPavan Nikhilesh
134f0b68c0bSPavan Nikhilesh ev->vec->queue = 0;
135f0b68c0bSPavan Nikhilesh do {
136f0b68c0bSPavan Nikhilesh enq = rte_event_eth_tx_adapter_enqueue(dev, port, ev, 1, 0);
137f0b68c0bSPavan Nikhilesh } while (!enq && !t->done);
138f0b68c0bSPavan Nikhilesh
139f0b68c0bSPavan Nikhilesh return enq;
1402eaa37b8SPavan Nikhilesh }
1412eaa37b8SPavan Nikhilesh
142f0b68c0bSPavan Nikhilesh static __rte_always_inline uint16_t
pipeline_event_tx_burst(const uint8_t dev,const uint8_t port,struct rte_event * ev,const uint16_t nb_rx,struct test_pipeline * t)143032a965aSPavan Nikhilesh pipeline_event_tx_burst(const uint8_t dev, const uint8_t port,
144f0b68c0bSPavan Nikhilesh struct rte_event *ev, const uint16_t nb_rx,
145f0b68c0bSPavan Nikhilesh struct test_pipeline *t)
146032a965aSPavan Nikhilesh {
147032a965aSPavan Nikhilesh uint16_t enq;
148032a965aSPavan Nikhilesh
149b21302a1SNipun Gupta enq = rte_event_eth_tx_adapter_enqueue(dev, port, ev, nb_rx, 0);
150f0b68c0bSPavan Nikhilesh while (enq < nb_rx && !t->done) {
151032a965aSPavan Nikhilesh enq += rte_event_eth_tx_adapter_enqueue(dev, port,
152b21302a1SNipun Gupta ev + enq, nb_rx - enq, 0);
153032a965aSPavan Nikhilesh }
154f0b68c0bSPavan Nikhilesh
155f0b68c0bSPavan Nikhilesh return enq;
156032a965aSPavan Nikhilesh }
157032a965aSPavan Nikhilesh
158f0b68c0bSPavan Nikhilesh static __rte_always_inline uint8_t
pipeline_event_enqueue(const uint8_t dev,const uint8_t port,struct rte_event * ev,struct test_pipeline * t)159314bcf58SPavan Nikhilesh pipeline_event_enqueue(const uint8_t dev, const uint8_t port,
160f0b68c0bSPavan Nikhilesh struct rte_event *ev, struct test_pipeline *t)
161314bcf58SPavan Nikhilesh {
162f0b68c0bSPavan Nikhilesh uint8_t enq;
163f0b68c0bSPavan Nikhilesh
164f0b68c0bSPavan Nikhilesh do {
165f0b68c0bSPavan Nikhilesh enq = rte_event_enqueue_burst(dev, port, ev, 1);
166f0b68c0bSPavan Nikhilesh } while (!enq && !t->done);
167f0b68c0bSPavan Nikhilesh
168f0b68c0bSPavan Nikhilesh return enq;
169314bcf58SPavan Nikhilesh }
170314bcf58SPavan Nikhilesh
171f0b68c0bSPavan Nikhilesh static __rte_always_inline uint16_t
pipeline_event_enqueue_burst(const uint8_t dev,const uint8_t port,struct rte_event * ev,const uint16_t nb_rx,struct test_pipeline * t)172314bcf58SPavan Nikhilesh pipeline_event_enqueue_burst(const uint8_t dev, const uint8_t port,
173f0b68c0bSPavan Nikhilesh struct rte_event *ev, const uint16_t nb_rx,
174f0b68c0bSPavan Nikhilesh struct test_pipeline *t)
175314bcf58SPavan Nikhilesh {
176314bcf58SPavan Nikhilesh uint16_t enq;
177314bcf58SPavan Nikhilesh
178314bcf58SPavan Nikhilesh enq = rte_event_enqueue_burst(dev, port, ev, nb_rx);
179f0b68c0bSPavan Nikhilesh while (enq < nb_rx && !t->done) {
180314bcf58SPavan Nikhilesh enq += rte_event_enqueue_burst(dev, port,
181314bcf58SPavan Nikhilesh ev + enq, nb_rx - enq);
182314bcf58SPavan Nikhilesh }
183f0b68c0bSPavan Nikhilesh
184f0b68c0bSPavan Nikhilesh return enq;
185314bcf58SPavan Nikhilesh }
186314bcf58SPavan Nikhilesh
187f0b68c0bSPavan Nikhilesh
18838f842bcSPavan Nikhilesh static inline int
pipeline_nb_event_ports(struct evt_options * opt)18938f842bcSPavan Nikhilesh pipeline_nb_event_ports(struct evt_options *opt)
19038f842bcSPavan Nikhilesh {
19138f842bcSPavan Nikhilesh return evt_nr_active_lcores(opt->wlcores);
19238f842bcSPavan Nikhilesh }
19338f842bcSPavan Nikhilesh
19438f842bcSPavan Nikhilesh int pipeline_test_result(struct evt_test *test, struct evt_options *opt);
19538f842bcSPavan Nikhilesh int pipeline_opt_check(struct evt_options *opt, uint64_t nb_queues);
19661e9524aSPavan Nikhilesh int pipeline_test_setup(struct evt_test *test, struct evt_options *opt);
19776f98e02SPavan Nikhilesh int pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt);
198385cefd9SPavan Nikhilesh int pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
199385cefd9SPavan Nikhilesh struct rte_event_port_conf prod_conf);
200032a965aSPavan Nikhilesh int pipeline_event_tx_adapter_setup(struct evt_options *opt,
201032a965aSPavan Nikhilesh struct rte_event_port_conf prod_conf);
202e4131b79SPavan Nikhilesh int pipeline_mempool_setup(struct evt_test *test, struct evt_options *opt);
203385cefd9SPavan Nikhilesh int pipeline_event_port_setup(struct evt_test *test, struct evt_options *opt,
204385cefd9SPavan Nikhilesh uint8_t *queue_arr, uint8_t nb_queues,
205385cefd9SPavan Nikhilesh const struct rte_event_port_conf p_conf);
206d4c003f5SPavan Nikhilesh int pipeline_launch_lcores(struct evt_test *test, struct evt_options *opt,
207d4c003f5SPavan Nikhilesh int (*worker)(void *));
20838f842bcSPavan Nikhilesh void pipeline_opt_dump(struct evt_options *opt, uint8_t nb_queues);
20961e9524aSPavan Nikhilesh void pipeline_test_destroy(struct evt_test *test, struct evt_options *opt);
21076f98e02SPavan Nikhilesh void pipeline_eventdev_destroy(struct evt_test *test, struct evt_options *opt);
21176f98e02SPavan Nikhilesh void pipeline_ethdev_destroy(struct evt_test *test, struct evt_options *opt);
212a734e738SPavan Nikhilesh void pipeline_ethdev_rx_stop(struct evt_test *test, struct evt_options *opt);
213e4131b79SPavan Nikhilesh void pipeline_mempool_destroy(struct evt_test *test, struct evt_options *opt);
214f0b68c0bSPavan Nikhilesh void pipeline_worker_cleanup(uint8_t dev, uint8_t port, struct rte_event ev[],
215f0b68c0bSPavan Nikhilesh uint16_t enq, uint16_t deq);
21661e9524aSPavan Nikhilesh
21761e9524aSPavan Nikhilesh #endif /* _TEST_PIPELINE_COMMON_ */
218