1d60b4185SPavan Nikhilesh /* 2d60b4185SPavan Nikhilesh * SPDX-License-Identifier: BSD-3-Clause 3d60b4185SPavan Nikhilesh * Copyright 2017 Cavium, Inc. 4d60b4185SPavan Nikhilesh */ 5d60b4185SPavan Nikhilesh 6d60b4185SPavan Nikhilesh #include "test_pipeline_common.h" 7d60b4185SPavan Nikhilesh 843d162bcSThomas Monjalon /* See http://doc.dpdk.org/guides/tools/testeventdev.html for test details */ 9d60b4185SPavan Nikhilesh 10d60b4185SPavan Nikhilesh static __rte_always_inline int 11d60b4185SPavan Nikhilesh pipeline_queue_nb_event_queues(struct evt_options *opt) 12d60b4185SPavan Nikhilesh { 13d9a42a69SThomas Monjalon uint16_t eth_count = rte_eth_dev_count_avail(); 14d60b4185SPavan Nikhilesh 15d60b4185SPavan Nikhilesh return (eth_count * opt->nb_stages) + eth_count; 16d60b4185SPavan Nikhilesh } 17d60b4185SPavan Nikhilesh 18032a965aSPavan Nikhilesh static __rte_noinline int 19314bcf58SPavan Nikhilesh pipeline_queue_worker_single_stage_tx(void *arg) 20314bcf58SPavan Nikhilesh { 21f26320a6SPavan Nikhilesh PIPELINE_WORKER_SINGLE_STAGE_INIT; 22314bcf58SPavan Nikhilesh 23314bcf58SPavan Nikhilesh while (t->done == false) { 24314bcf58SPavan Nikhilesh uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0); 25314bcf58SPavan Nikhilesh 26314bcf58SPavan Nikhilesh if (!event) { 27314bcf58SPavan Nikhilesh rte_pause(); 28314bcf58SPavan Nikhilesh continue; 29314bcf58SPavan Nikhilesh } 30314bcf58SPavan Nikhilesh 31314bcf58SPavan Nikhilesh if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) { 32032a965aSPavan Nikhilesh pipeline_event_tx(dev, port, &ev); 33314bcf58SPavan Nikhilesh w->processed_pkts++; 34314bcf58SPavan Nikhilesh } else { 35314bcf58SPavan Nikhilesh ev.queue_id++; 36314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC); 37314bcf58SPavan Nikhilesh pipeline_event_enqueue(dev, port, &ev); 38314bcf58SPavan Nikhilesh } 39314bcf58SPavan Nikhilesh } 40314bcf58SPavan Nikhilesh 41314bcf58SPavan Nikhilesh return 0; 42314bcf58SPavan Nikhilesh } 43314bcf58SPavan Nikhilesh 44032a965aSPavan Nikhilesh static __rte_noinline int 45314bcf58SPavan Nikhilesh pipeline_queue_worker_single_stage_fwd(void *arg) 46314bcf58SPavan Nikhilesh { 47f26320a6SPavan Nikhilesh PIPELINE_WORKER_SINGLE_STAGE_INIT; 48032a965aSPavan Nikhilesh const uint8_t *tx_queue = t->tx_evqueue_id; 49314bcf58SPavan Nikhilesh 50314bcf58SPavan Nikhilesh while (t->done == false) { 51314bcf58SPavan Nikhilesh uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0); 52314bcf58SPavan Nikhilesh 53314bcf58SPavan Nikhilesh if (!event) { 54314bcf58SPavan Nikhilesh rte_pause(); 55314bcf58SPavan Nikhilesh continue; 56314bcf58SPavan Nikhilesh } 57314bcf58SPavan Nikhilesh 58032a965aSPavan Nikhilesh ev.queue_id = tx_queue[ev.mbuf->port]; 59032a965aSPavan Nikhilesh rte_event_eth_tx_adapter_txq_set(ev.mbuf, 0); 60314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC); 61314bcf58SPavan Nikhilesh pipeline_event_enqueue(dev, port, &ev); 62314bcf58SPavan Nikhilesh w->processed_pkts++; 63314bcf58SPavan Nikhilesh } 64314bcf58SPavan Nikhilesh 65314bcf58SPavan Nikhilesh return 0; 66314bcf58SPavan Nikhilesh } 67314bcf58SPavan Nikhilesh 68032a965aSPavan Nikhilesh static __rte_noinline int 69314bcf58SPavan Nikhilesh pipeline_queue_worker_single_stage_burst_tx(void *arg) 70314bcf58SPavan Nikhilesh { 71f26320a6SPavan Nikhilesh PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT; 72314bcf58SPavan Nikhilesh 73314bcf58SPavan Nikhilesh while (t->done == false) { 74314bcf58SPavan Nikhilesh uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev, 75314bcf58SPavan Nikhilesh BURST_SIZE, 0); 76314bcf58SPavan Nikhilesh 77314bcf58SPavan Nikhilesh if (!nb_rx) { 78314bcf58SPavan Nikhilesh rte_pause(); 79314bcf58SPavan Nikhilesh continue; 80314bcf58SPavan Nikhilesh } 81314bcf58SPavan Nikhilesh 82314bcf58SPavan Nikhilesh for (i = 0; i < nb_rx; i++) { 83314bcf58SPavan Nikhilesh rte_prefetch0(ev[i + 1].mbuf); 84314bcf58SPavan Nikhilesh if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) { 85032a965aSPavan Nikhilesh pipeline_event_tx(dev, port, &ev[i]); 86314bcf58SPavan Nikhilesh ev[i].op = RTE_EVENT_OP_RELEASE; 87314bcf58SPavan Nikhilesh w->processed_pkts++; 88314bcf58SPavan Nikhilesh } else { 89314bcf58SPavan Nikhilesh ev[i].queue_id++; 90314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], 91314bcf58SPavan Nikhilesh RTE_SCHED_TYPE_ATOMIC); 92314bcf58SPavan Nikhilesh } 93314bcf58SPavan Nikhilesh } 94314bcf58SPavan Nikhilesh 95314bcf58SPavan Nikhilesh pipeline_event_enqueue_burst(dev, port, ev, nb_rx); 96314bcf58SPavan Nikhilesh } 97314bcf58SPavan Nikhilesh 98314bcf58SPavan Nikhilesh return 0; 99314bcf58SPavan Nikhilesh } 100314bcf58SPavan Nikhilesh 101032a965aSPavan Nikhilesh static __rte_noinline int 102314bcf58SPavan Nikhilesh pipeline_queue_worker_single_stage_burst_fwd(void *arg) 103314bcf58SPavan Nikhilesh { 104f26320a6SPavan Nikhilesh PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT; 105032a965aSPavan Nikhilesh const uint8_t *tx_queue = t->tx_evqueue_id; 106314bcf58SPavan Nikhilesh 107314bcf58SPavan Nikhilesh while (t->done == false) { 108314bcf58SPavan Nikhilesh uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev, 109314bcf58SPavan Nikhilesh BURST_SIZE, 0); 110314bcf58SPavan Nikhilesh 111314bcf58SPavan Nikhilesh if (!nb_rx) { 112314bcf58SPavan Nikhilesh rte_pause(); 113314bcf58SPavan Nikhilesh continue; 114314bcf58SPavan Nikhilesh } 115314bcf58SPavan Nikhilesh 116314bcf58SPavan Nikhilesh for (i = 0; i < nb_rx; i++) { 117314bcf58SPavan Nikhilesh rte_prefetch0(ev[i + 1].mbuf); 118032a965aSPavan Nikhilesh ev[i].queue_id = tx_queue[ev[i].mbuf->port]; 119032a965aSPavan Nikhilesh rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0); 120314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], RTE_SCHED_TYPE_ATOMIC); 121314bcf58SPavan Nikhilesh } 122314bcf58SPavan Nikhilesh 123314bcf58SPavan Nikhilesh pipeline_event_enqueue_burst(dev, port, ev, nb_rx); 124032a965aSPavan Nikhilesh w->processed_pkts += nb_rx; 125314bcf58SPavan Nikhilesh } 126314bcf58SPavan Nikhilesh 127314bcf58SPavan Nikhilesh return 0; 128314bcf58SPavan Nikhilesh } 129314bcf58SPavan Nikhilesh 130314bcf58SPavan Nikhilesh 131032a965aSPavan Nikhilesh static __rte_noinline int 132314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_tx(void *arg) 133314bcf58SPavan Nikhilesh { 134f26320a6SPavan Nikhilesh PIPELINE_WORKER_MULTI_STAGE_INIT; 135032a965aSPavan Nikhilesh const uint8_t *tx_queue = t->tx_evqueue_id; 136314bcf58SPavan Nikhilesh 137314bcf58SPavan Nikhilesh while (t->done == false) { 138314bcf58SPavan Nikhilesh uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0); 139314bcf58SPavan Nikhilesh 140314bcf58SPavan Nikhilesh if (!event) { 141314bcf58SPavan Nikhilesh rte_pause(); 142314bcf58SPavan Nikhilesh continue; 143314bcf58SPavan Nikhilesh } 144314bcf58SPavan Nikhilesh 145314bcf58SPavan Nikhilesh cq_id = ev.queue_id % nb_stages; 146314bcf58SPavan Nikhilesh 147032a965aSPavan Nikhilesh if (ev.queue_id == tx_queue[ev.mbuf->port]) { 148032a965aSPavan Nikhilesh pipeline_event_tx(dev, port, &ev); 149314bcf58SPavan Nikhilesh w->processed_pkts++; 150314bcf58SPavan Nikhilesh continue; 151314bcf58SPavan Nikhilesh } 152314bcf58SPavan Nikhilesh 153032a965aSPavan Nikhilesh ev.queue_id++; 154032a965aSPavan Nikhilesh pipeline_fwd_event(&ev, cq_id != last_queue ? 155032a965aSPavan Nikhilesh sched_type_list[cq_id] : 156032a965aSPavan Nikhilesh RTE_SCHED_TYPE_ATOMIC); 157314bcf58SPavan Nikhilesh pipeline_event_enqueue(dev, port, &ev); 158314bcf58SPavan Nikhilesh } 159032a965aSPavan Nikhilesh 160314bcf58SPavan Nikhilesh return 0; 161314bcf58SPavan Nikhilesh } 162314bcf58SPavan Nikhilesh 163032a965aSPavan Nikhilesh static __rte_noinline int 164314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_fwd(void *arg) 165314bcf58SPavan Nikhilesh { 166f26320a6SPavan Nikhilesh PIPELINE_WORKER_MULTI_STAGE_INIT; 167032a965aSPavan Nikhilesh const uint8_t *tx_queue = t->tx_evqueue_id; 168314bcf58SPavan Nikhilesh 169314bcf58SPavan Nikhilesh while (t->done == false) { 170314bcf58SPavan Nikhilesh uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0); 171314bcf58SPavan Nikhilesh 172314bcf58SPavan Nikhilesh if (!event) { 173314bcf58SPavan Nikhilesh rte_pause(); 174314bcf58SPavan Nikhilesh continue; 175314bcf58SPavan Nikhilesh } 176314bcf58SPavan Nikhilesh 177314bcf58SPavan Nikhilesh cq_id = ev.queue_id % nb_stages; 178314bcf58SPavan Nikhilesh 179314bcf58SPavan Nikhilesh if (cq_id == last_queue) { 180032a965aSPavan Nikhilesh ev.queue_id = tx_queue[ev.mbuf->port]; 181032a965aSPavan Nikhilesh rte_event_eth_tx_adapter_txq_set(ev.mbuf, 0); 182314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC); 183*e0c05737SFeifei Wang pipeline_event_enqueue(dev, port, &ev); 184314bcf58SPavan Nikhilesh w->processed_pkts++; 185314bcf58SPavan Nikhilesh } else { 186314bcf58SPavan Nikhilesh ev.queue_id++; 187314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev, sched_type_list[cq_id]); 188314bcf58SPavan Nikhilesh pipeline_event_enqueue(dev, port, &ev); 189314bcf58SPavan Nikhilesh } 190*e0c05737SFeifei Wang } 191032a965aSPavan Nikhilesh 192314bcf58SPavan Nikhilesh return 0; 193314bcf58SPavan Nikhilesh } 194314bcf58SPavan Nikhilesh 195032a965aSPavan Nikhilesh static __rte_noinline int 196314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_burst_tx(void *arg) 197314bcf58SPavan Nikhilesh { 198f26320a6SPavan Nikhilesh PIPELINE_WORKER_MULTI_STAGE_BURST_INIT; 199032a965aSPavan Nikhilesh const uint8_t *tx_queue = t->tx_evqueue_id; 200314bcf58SPavan Nikhilesh 201314bcf58SPavan Nikhilesh while (t->done == false) { 202314bcf58SPavan Nikhilesh uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev, 203314bcf58SPavan Nikhilesh BURST_SIZE, 0); 204314bcf58SPavan Nikhilesh 205314bcf58SPavan Nikhilesh if (!nb_rx) { 206314bcf58SPavan Nikhilesh rte_pause(); 207314bcf58SPavan Nikhilesh continue; 208314bcf58SPavan Nikhilesh } 209314bcf58SPavan Nikhilesh 210314bcf58SPavan Nikhilesh for (i = 0; i < nb_rx; i++) { 211314bcf58SPavan Nikhilesh rte_prefetch0(ev[i + 1].mbuf); 212314bcf58SPavan Nikhilesh cq_id = ev[i].queue_id % nb_stages; 213314bcf58SPavan Nikhilesh 214032a965aSPavan Nikhilesh if (ev[i].queue_id == tx_queue[ev[i].mbuf->port]) { 215032a965aSPavan Nikhilesh pipeline_event_tx(dev, port, &ev[i]); 216314bcf58SPavan Nikhilesh ev[i].op = RTE_EVENT_OP_RELEASE; 217314bcf58SPavan Nikhilesh w->processed_pkts++; 218314bcf58SPavan Nikhilesh continue; 219314bcf58SPavan Nikhilesh } 220314bcf58SPavan Nikhilesh 221314bcf58SPavan Nikhilesh ev[i].queue_id++; 222032a965aSPavan Nikhilesh pipeline_fwd_event(&ev[i], cq_id != last_queue ? 223032a965aSPavan Nikhilesh sched_type_list[cq_id] : 224032a965aSPavan Nikhilesh RTE_SCHED_TYPE_ATOMIC); 225314bcf58SPavan Nikhilesh } 226314bcf58SPavan Nikhilesh 227314bcf58SPavan Nikhilesh pipeline_event_enqueue_burst(dev, port, ev, nb_rx); 228314bcf58SPavan Nikhilesh } 229032a965aSPavan Nikhilesh 230314bcf58SPavan Nikhilesh return 0; 231314bcf58SPavan Nikhilesh } 232314bcf58SPavan Nikhilesh 233032a965aSPavan Nikhilesh static __rte_noinline int 234314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_burst_fwd(void *arg) 235314bcf58SPavan Nikhilesh { 236f26320a6SPavan Nikhilesh PIPELINE_WORKER_MULTI_STAGE_BURST_INIT; 237032a965aSPavan Nikhilesh const uint8_t *tx_queue = t->tx_evqueue_id; 238314bcf58SPavan Nikhilesh 239314bcf58SPavan Nikhilesh while (t->done == false) { 240*e0c05737SFeifei Wang uint16_t processed_pkts = 0; 241314bcf58SPavan Nikhilesh uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev, 242314bcf58SPavan Nikhilesh BURST_SIZE, 0); 243314bcf58SPavan Nikhilesh 244314bcf58SPavan Nikhilesh if (!nb_rx) { 245314bcf58SPavan Nikhilesh rte_pause(); 246314bcf58SPavan Nikhilesh continue; 247314bcf58SPavan Nikhilesh } 248314bcf58SPavan Nikhilesh 249314bcf58SPavan Nikhilesh for (i = 0; i < nb_rx; i++) { 250314bcf58SPavan Nikhilesh rte_prefetch0(ev[i + 1].mbuf); 251314bcf58SPavan Nikhilesh cq_id = ev[i].queue_id % nb_stages; 252314bcf58SPavan Nikhilesh 253314bcf58SPavan Nikhilesh if (cq_id == last_queue) { 254032a965aSPavan Nikhilesh ev[i].queue_id = tx_queue[ev[i].mbuf->port]; 255032a965aSPavan Nikhilesh rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0); 256314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], 257314bcf58SPavan Nikhilesh RTE_SCHED_TYPE_ATOMIC); 258*e0c05737SFeifei Wang processed_pkts++; 259314bcf58SPavan Nikhilesh } else { 260314bcf58SPavan Nikhilesh ev[i].queue_id++; 261314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], 262314bcf58SPavan Nikhilesh sched_type_list[cq_id]); 263314bcf58SPavan Nikhilesh } 264314bcf58SPavan Nikhilesh } 265314bcf58SPavan Nikhilesh 266314bcf58SPavan Nikhilesh pipeline_event_enqueue_burst(dev, port, ev, nb_rx); 267*e0c05737SFeifei Wang w->processed_pkts += processed_pkts; 268314bcf58SPavan Nikhilesh } 269032a965aSPavan Nikhilesh 270314bcf58SPavan Nikhilesh return 0; 271314bcf58SPavan Nikhilesh } 272314bcf58SPavan Nikhilesh 273314bcf58SPavan Nikhilesh static int 274d60b4185SPavan Nikhilesh worker_wrapper(void *arg) 275d60b4185SPavan Nikhilesh { 276314bcf58SPavan Nikhilesh struct worker_data *w = arg; 277314bcf58SPavan Nikhilesh struct evt_options *opt = w->t->opt; 278314bcf58SPavan Nikhilesh const bool burst = evt_has_burst_mode(w->dev_id); 279032a965aSPavan Nikhilesh const bool internal_port = w->t->internal_port; 280314bcf58SPavan Nikhilesh const uint8_t nb_stages = opt->nb_stages; 281314bcf58SPavan Nikhilesh RTE_SET_USED(opt); 282314bcf58SPavan Nikhilesh 283314bcf58SPavan Nikhilesh if (nb_stages == 1) { 284032a965aSPavan Nikhilesh if (!burst && internal_port) 285314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_tx(arg); 286032a965aSPavan Nikhilesh else if (!burst && !internal_port) 287314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_fwd(arg); 288032a965aSPavan Nikhilesh else if (burst && internal_port) 289314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_burst_tx(arg); 290032a965aSPavan Nikhilesh else if (burst && !internal_port) 291314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_burst_fwd( 292314bcf58SPavan Nikhilesh arg); 293314bcf58SPavan Nikhilesh } else { 294032a965aSPavan Nikhilesh if (!burst && internal_port) 295314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_tx(arg); 296032a965aSPavan Nikhilesh else if (!burst && !internal_port) 297314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_fwd(arg); 298032a965aSPavan Nikhilesh else if (burst && internal_port) 299314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_burst_tx(arg); 300032a965aSPavan Nikhilesh else if (burst && !internal_port) 301314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_burst_fwd(arg); 302314bcf58SPavan Nikhilesh 303314bcf58SPavan Nikhilesh } 304d60b4185SPavan Nikhilesh rte_panic("invalid worker\n"); 305d60b4185SPavan Nikhilesh } 306d60b4185SPavan Nikhilesh 307d60b4185SPavan Nikhilesh static int 308d60b4185SPavan Nikhilesh pipeline_queue_launch_lcores(struct evt_test *test, struct evt_options *opt) 309d60b4185SPavan Nikhilesh { 310d60b4185SPavan Nikhilesh return pipeline_launch_lcores(test, opt, worker_wrapper); 311d60b4185SPavan Nikhilesh } 312d60b4185SPavan Nikhilesh 313d60b4185SPavan Nikhilesh static int 314d60b4185SPavan Nikhilesh pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt) 315d60b4185SPavan Nikhilesh { 316d60b4185SPavan Nikhilesh int ret; 317d60b4185SPavan Nikhilesh int nb_ports; 318d60b4185SPavan Nikhilesh int nb_queues; 319d60b4185SPavan Nikhilesh int nb_stages = opt->nb_stages; 320d60b4185SPavan Nikhilesh uint8_t queue; 321032a965aSPavan Nikhilesh uint8_t tx_evport_id = 0; 322032a965aSPavan Nikhilesh uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS]; 323d60b4185SPavan Nikhilesh uint8_t queue_arr[RTE_EVENT_MAX_QUEUES_PER_DEV]; 324d60b4185SPavan Nikhilesh uint8_t nb_worker_queues = 0; 325032a965aSPavan Nikhilesh uint16_t prod = 0; 326032a965aSPavan Nikhilesh struct rte_event_dev_info info; 327032a965aSPavan Nikhilesh struct test_pipeline *t = evt_test_priv(test); 328d60b4185SPavan Nikhilesh 329d60b4185SPavan Nikhilesh nb_ports = evt_nr_active_lcores(opt->wlcores); 330d9a42a69SThomas Monjalon nb_queues = rte_eth_dev_count_avail() * (nb_stages); 331d60b4185SPavan Nikhilesh 332032a965aSPavan Nikhilesh /* One queue for Tx adapter per port */ 333d9a42a69SThomas Monjalon nb_queues += rte_eth_dev_count_avail(); 334d60b4185SPavan Nikhilesh 335032a965aSPavan Nikhilesh memset(tx_evqueue_id, 0, sizeof(uint8_t) * RTE_MAX_ETHPORTS); 336032a965aSPavan Nikhilesh memset(queue_arr, 0, sizeof(uint8_t) * RTE_EVENT_MAX_QUEUES_PER_DEV); 337d60b4185SPavan Nikhilesh 338032a965aSPavan Nikhilesh rte_event_dev_info_get(opt->dev_id, &info); 339f0959283SPavan Nikhilesh ret = evt_configure_eventdev(opt, nb_queues, nb_ports); 340d60b4185SPavan Nikhilesh if (ret) { 341d60b4185SPavan Nikhilesh evt_err("failed to configure eventdev %d", opt->dev_id); 342d60b4185SPavan Nikhilesh return ret; 343d60b4185SPavan Nikhilesh } 344d60b4185SPavan Nikhilesh 345d60b4185SPavan Nikhilesh struct rte_event_queue_conf q_conf = { 346d60b4185SPavan Nikhilesh .priority = RTE_EVENT_DEV_PRIORITY_NORMAL, 347d60b4185SPavan Nikhilesh .nb_atomic_flows = opt->nb_flows, 348d60b4185SPavan Nikhilesh .nb_atomic_order_sequences = opt->nb_flows, 349d60b4185SPavan Nikhilesh }; 350d60b4185SPavan Nikhilesh /* queue configurations */ 351d60b4185SPavan Nikhilesh for (queue = 0; queue < nb_queues; queue++) { 352d60b4185SPavan Nikhilesh uint8_t slot; 353d60b4185SPavan Nikhilesh 354032a965aSPavan Nikhilesh q_conf.event_queue_cfg = 0; 355d60b4185SPavan Nikhilesh slot = queue % (nb_stages + 1); 356032a965aSPavan Nikhilesh if (slot == nb_stages) { 357d60b4185SPavan Nikhilesh q_conf.schedule_type = RTE_SCHED_TYPE_ATOMIC; 358032a965aSPavan Nikhilesh if (!t->internal_port) { 359d60b4185SPavan Nikhilesh q_conf.event_queue_cfg = 360d60b4185SPavan Nikhilesh RTE_EVENT_QUEUE_CFG_SINGLE_LINK; 361032a965aSPavan Nikhilesh } 362032a965aSPavan Nikhilesh tx_evqueue_id[prod++] = queue; 363d60b4185SPavan Nikhilesh } else { 364032a965aSPavan Nikhilesh q_conf.schedule_type = opt->sched_type_list[slot]; 365d60b4185SPavan Nikhilesh queue_arr[nb_worker_queues] = queue; 366d60b4185SPavan Nikhilesh nb_worker_queues++; 367d60b4185SPavan Nikhilesh } 368d60b4185SPavan Nikhilesh 369d60b4185SPavan Nikhilesh ret = rte_event_queue_setup(opt->dev_id, queue, &q_conf); 370d60b4185SPavan Nikhilesh if (ret) { 371d60b4185SPavan Nikhilesh evt_err("failed to setup queue=%d", queue); 372d60b4185SPavan Nikhilesh return ret; 373d60b4185SPavan Nikhilesh } 374d60b4185SPavan Nikhilesh } 375d60b4185SPavan Nikhilesh 376535c630cSPavan Nikhilesh if (opt->wkr_deq_dep > info.max_event_port_dequeue_depth) 377535c630cSPavan Nikhilesh opt->wkr_deq_dep = info.max_event_port_dequeue_depth; 378535c630cSPavan Nikhilesh 379d60b4185SPavan Nikhilesh /* port configuration */ 380d60b4185SPavan Nikhilesh const struct rte_event_port_conf p_conf = { 381d60b4185SPavan Nikhilesh .dequeue_depth = opt->wkr_deq_dep, 382d60b4185SPavan Nikhilesh .enqueue_depth = info.max_event_port_dequeue_depth, 383d60b4185SPavan Nikhilesh .new_event_threshold = info.max_num_events, 384d60b4185SPavan Nikhilesh }; 385d60b4185SPavan Nikhilesh 386032a965aSPavan Nikhilesh if (!t->internal_port) { 387d60b4185SPavan Nikhilesh ret = pipeline_event_port_setup(test, opt, queue_arr, 388d60b4185SPavan Nikhilesh nb_worker_queues, p_conf); 389d60b4185SPavan Nikhilesh if (ret) 390d60b4185SPavan Nikhilesh return ret; 391d60b4185SPavan Nikhilesh } else 392d60b4185SPavan Nikhilesh ret = pipeline_event_port_setup(test, opt, NULL, nb_queues, 393d60b4185SPavan Nikhilesh p_conf); 394d60b4185SPavan Nikhilesh 395d60b4185SPavan Nikhilesh if (ret) 396d60b4185SPavan Nikhilesh return ret; 397d60b4185SPavan Nikhilesh /* 398d60b4185SPavan Nikhilesh * The pipelines are setup in the following manner: 399d60b4185SPavan Nikhilesh * 400d60b4185SPavan Nikhilesh * eth_dev_count = 2, nb_stages = 2. 401d60b4185SPavan Nikhilesh * 402d60b4185SPavan Nikhilesh * queues = 6 403d60b4185SPavan Nikhilesh * stride = 3 404d60b4185SPavan Nikhilesh * 405d60b4185SPavan Nikhilesh * event queue pipelines: 406d60b4185SPavan Nikhilesh * eth0 -> q0 -> q1 -> (q2->tx) 407d60b4185SPavan Nikhilesh * eth1 -> q3 -> q4 -> (q5->tx) 408d60b4185SPavan Nikhilesh * 409032a965aSPavan Nikhilesh * q2, q5 configured as ATOMIC | SINGLE_LINK 410d60b4185SPavan Nikhilesh * 411d60b4185SPavan Nikhilesh */ 412032a965aSPavan Nikhilesh ret = pipeline_event_rx_adapter_setup(opt, nb_stages + 1, p_conf); 413032a965aSPavan Nikhilesh if (ret) 414032a965aSPavan Nikhilesh return ret; 415032a965aSPavan Nikhilesh 416032a965aSPavan Nikhilesh ret = pipeline_event_tx_adapter_setup(opt, p_conf); 417d60b4185SPavan Nikhilesh if (ret) 418d60b4185SPavan Nikhilesh return ret; 419d60b4185SPavan Nikhilesh 420d60b4185SPavan Nikhilesh if (!evt_has_distributed_sched(opt->dev_id)) { 421d60b4185SPavan Nikhilesh uint32_t service_id; 422d60b4185SPavan Nikhilesh rte_event_dev_service_id_get(opt->dev_id, &service_id); 423d60b4185SPavan Nikhilesh ret = evt_service_setup(service_id); 424d60b4185SPavan Nikhilesh if (ret) { 425d60b4185SPavan Nikhilesh evt_err("No service lcore found to run event dev."); 426d60b4185SPavan Nikhilesh return ret; 427d60b4185SPavan Nikhilesh } 428d60b4185SPavan Nikhilesh } 429d60b4185SPavan Nikhilesh 430032a965aSPavan Nikhilesh /* Connect the tx_evqueue_id to the Tx adapter port */ 431032a965aSPavan Nikhilesh if (!t->internal_port) { 432032a965aSPavan Nikhilesh RTE_ETH_FOREACH_DEV(prod) { 433032a965aSPavan Nikhilesh ret = rte_event_eth_tx_adapter_event_port_get(prod, 434032a965aSPavan Nikhilesh &tx_evport_id); 435032a965aSPavan Nikhilesh if (ret) { 436032a965aSPavan Nikhilesh evt_err("Unable to get Tx adptr[%d] evprt[%d]", 437032a965aSPavan Nikhilesh prod, tx_evport_id); 438032a965aSPavan Nikhilesh return ret; 439032a965aSPavan Nikhilesh } 440032a965aSPavan Nikhilesh 441032a965aSPavan Nikhilesh if (rte_event_port_link(opt->dev_id, tx_evport_id, 442032a965aSPavan Nikhilesh &tx_evqueue_id[prod], 443032a965aSPavan Nikhilesh NULL, 1) != 1) { 444032a965aSPavan Nikhilesh evt_err("Unable to link Tx adptr[%d] evprt[%d]", 445032a965aSPavan Nikhilesh prod, tx_evport_id); 446032a965aSPavan Nikhilesh return ret; 447032a965aSPavan Nikhilesh } 448032a965aSPavan Nikhilesh } 449032a965aSPavan Nikhilesh } 450032a965aSPavan Nikhilesh 45166b82db2SPavan Nikhilesh ret = rte_event_dev_start(opt->dev_id); 45266b82db2SPavan Nikhilesh if (ret) { 45366b82db2SPavan Nikhilesh evt_err("failed to start eventdev %d", opt->dev_id); 45466b82db2SPavan Nikhilesh return ret; 45566b82db2SPavan Nikhilesh } 45666b82db2SPavan Nikhilesh 45766b82db2SPavan Nikhilesh 458032a965aSPavan Nikhilesh RTE_ETH_FOREACH_DEV(prod) { 459032a965aSPavan Nikhilesh ret = rte_eth_dev_start(prod); 460032a965aSPavan Nikhilesh if (ret) { 461032a965aSPavan Nikhilesh evt_err("Ethernet dev [%d] failed to start." 462032a965aSPavan Nikhilesh " Using synthetic producer", prod); 463032a965aSPavan Nikhilesh return ret; 464032a965aSPavan Nikhilesh } 465032a965aSPavan Nikhilesh 466032a965aSPavan Nikhilesh } 467032a965aSPavan Nikhilesh 468032a965aSPavan Nikhilesh RTE_ETH_FOREACH_DEV(prod) { 469032a965aSPavan Nikhilesh ret = rte_event_eth_rx_adapter_start(prod); 470032a965aSPavan Nikhilesh if (ret) { 471032a965aSPavan Nikhilesh evt_err("Rx adapter[%d] start failed", prod); 472032a965aSPavan Nikhilesh return ret; 473032a965aSPavan Nikhilesh } 474032a965aSPavan Nikhilesh 475032a965aSPavan Nikhilesh ret = rte_event_eth_tx_adapter_start(prod); 476032a965aSPavan Nikhilesh if (ret) { 477032a965aSPavan Nikhilesh evt_err("Tx adapter[%d] start failed", prod); 478032a965aSPavan Nikhilesh return ret; 479032a965aSPavan Nikhilesh } 480032a965aSPavan Nikhilesh } 481032a965aSPavan Nikhilesh 482032a965aSPavan Nikhilesh memcpy(t->tx_evqueue_id, tx_evqueue_id, sizeof(uint8_t) * 483032a965aSPavan Nikhilesh RTE_MAX_ETHPORTS); 484032a965aSPavan Nikhilesh 485d60b4185SPavan Nikhilesh return 0; 486d60b4185SPavan Nikhilesh } 487d60b4185SPavan Nikhilesh 488d60b4185SPavan Nikhilesh static void 489d60b4185SPavan Nikhilesh pipeline_queue_opt_dump(struct evt_options *opt) 490d60b4185SPavan Nikhilesh { 491d60b4185SPavan Nikhilesh pipeline_opt_dump(opt, pipeline_queue_nb_event_queues(opt)); 492d60b4185SPavan Nikhilesh } 493d60b4185SPavan Nikhilesh 494d60b4185SPavan Nikhilesh static int 495d60b4185SPavan Nikhilesh pipeline_queue_opt_check(struct evt_options *opt) 496d60b4185SPavan Nikhilesh { 497d60b4185SPavan Nikhilesh return pipeline_opt_check(opt, pipeline_queue_nb_event_queues(opt)); 498d60b4185SPavan Nikhilesh } 499d60b4185SPavan Nikhilesh 500d60b4185SPavan Nikhilesh static bool 501d60b4185SPavan Nikhilesh pipeline_queue_capability_check(struct evt_options *opt) 502d60b4185SPavan Nikhilesh { 503d60b4185SPavan Nikhilesh struct rte_event_dev_info dev_info; 504d60b4185SPavan Nikhilesh 505d60b4185SPavan Nikhilesh rte_event_dev_info_get(opt->dev_id, &dev_info); 506d60b4185SPavan Nikhilesh if (dev_info.max_event_queues < pipeline_queue_nb_event_queues(opt) || 507d60b4185SPavan Nikhilesh dev_info.max_event_ports < 508d60b4185SPavan Nikhilesh evt_nr_active_lcores(opt->wlcores)) { 509d60b4185SPavan Nikhilesh evt_err("not enough eventdev queues=%d/%d or ports=%d/%d", 510d60b4185SPavan Nikhilesh pipeline_queue_nb_event_queues(opt), 511d60b4185SPavan Nikhilesh dev_info.max_event_queues, 512d60b4185SPavan Nikhilesh evt_nr_active_lcores(opt->wlcores), 513d60b4185SPavan Nikhilesh dev_info.max_event_ports); 514d60b4185SPavan Nikhilesh } 515d60b4185SPavan Nikhilesh 516d60b4185SPavan Nikhilesh return true; 517d60b4185SPavan Nikhilesh } 518d60b4185SPavan Nikhilesh 519d60b4185SPavan Nikhilesh static const struct evt_test_ops pipeline_queue = { 520d60b4185SPavan Nikhilesh .cap_check = pipeline_queue_capability_check, 521d60b4185SPavan Nikhilesh .opt_check = pipeline_queue_opt_check, 522d60b4185SPavan Nikhilesh .opt_dump = pipeline_queue_opt_dump, 523d60b4185SPavan Nikhilesh .test_setup = pipeline_test_setup, 524d60b4185SPavan Nikhilesh .mempool_setup = pipeline_mempool_setup, 525d60b4185SPavan Nikhilesh .ethdev_setup = pipeline_ethdev_setup, 526d60b4185SPavan Nikhilesh .eventdev_setup = pipeline_queue_eventdev_setup, 527d60b4185SPavan Nikhilesh .launch_lcores = pipeline_queue_launch_lcores, 528d60b4185SPavan Nikhilesh .eventdev_destroy = pipeline_eventdev_destroy, 529d60b4185SPavan Nikhilesh .mempool_destroy = pipeline_mempool_destroy, 530d60b4185SPavan Nikhilesh .ethdev_destroy = pipeline_ethdev_destroy, 531d60b4185SPavan Nikhilesh .test_result = pipeline_test_result, 532d60b4185SPavan Nikhilesh .test_destroy = pipeline_test_destroy, 533d60b4185SPavan Nikhilesh }; 534d60b4185SPavan Nikhilesh 535d60b4185SPavan Nikhilesh EVT_TEST_REGISTER(pipeline_queue); 536