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 8d60b4185SPavan Nikhilesh /* See http://dpdk.org/doc/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 18*032a965aSPavan 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) { 32*032a965aSPavan 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 44*032a965aSPavan Nikhilesh static __rte_noinline int 45314bcf58SPavan Nikhilesh pipeline_queue_worker_single_stage_fwd(void *arg) 46314bcf58SPavan Nikhilesh { 47f26320a6SPavan Nikhilesh PIPELINE_WORKER_SINGLE_STAGE_INIT; 48*032a965aSPavan 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 58*032a965aSPavan Nikhilesh ev.queue_id = tx_queue[ev.mbuf->port]; 59*032a965aSPavan 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 68*032a965aSPavan 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) { 85*032a965aSPavan 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 101*032a965aSPavan 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; 105*032a965aSPavan 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); 118*032a965aSPavan Nikhilesh ev[i].queue_id = tx_queue[ev[i].mbuf->port]; 119*032a965aSPavan 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); 124*032a965aSPavan Nikhilesh w->processed_pkts += nb_rx; 125314bcf58SPavan Nikhilesh } 126314bcf58SPavan Nikhilesh 127314bcf58SPavan Nikhilesh return 0; 128314bcf58SPavan Nikhilesh } 129314bcf58SPavan Nikhilesh 130314bcf58SPavan Nikhilesh 131*032a965aSPavan Nikhilesh static __rte_noinline int 132314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_tx(void *arg) 133314bcf58SPavan Nikhilesh { 134f26320a6SPavan Nikhilesh PIPELINE_WORKER_MULTI_STAGE_INIT; 135*032a965aSPavan 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 147*032a965aSPavan Nikhilesh if (ev.queue_id == tx_queue[ev.mbuf->port]) { 148*032a965aSPavan Nikhilesh pipeline_event_tx(dev, port, &ev); 149314bcf58SPavan Nikhilesh w->processed_pkts++; 150314bcf58SPavan Nikhilesh continue; 151314bcf58SPavan Nikhilesh } 152314bcf58SPavan Nikhilesh 153*032a965aSPavan Nikhilesh ev.queue_id++; 154*032a965aSPavan Nikhilesh pipeline_fwd_event(&ev, cq_id != last_queue ? 155*032a965aSPavan Nikhilesh sched_type_list[cq_id] : 156*032a965aSPavan Nikhilesh RTE_SCHED_TYPE_ATOMIC); 157314bcf58SPavan Nikhilesh pipeline_event_enqueue(dev, port, &ev); 158314bcf58SPavan Nikhilesh } 159*032a965aSPavan Nikhilesh 160314bcf58SPavan Nikhilesh return 0; 161314bcf58SPavan Nikhilesh } 162314bcf58SPavan Nikhilesh 163*032a965aSPavan Nikhilesh static __rte_noinline int 164314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_fwd(void *arg) 165314bcf58SPavan Nikhilesh { 166f26320a6SPavan Nikhilesh PIPELINE_WORKER_MULTI_STAGE_INIT; 167*032a965aSPavan 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) { 180*032a965aSPavan Nikhilesh ev.queue_id = tx_queue[ev.mbuf->port]; 181*032a965aSPavan Nikhilesh rte_event_eth_tx_adapter_txq_set(ev.mbuf, 0); 182314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC); 183314bcf58SPavan Nikhilesh w->processed_pkts++; 184314bcf58SPavan Nikhilesh } else { 185314bcf58SPavan Nikhilesh ev.queue_id++; 186314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev, sched_type_list[cq_id]); 187314bcf58SPavan Nikhilesh } 188314bcf58SPavan Nikhilesh 189314bcf58SPavan Nikhilesh pipeline_event_enqueue(dev, port, &ev); 190314bcf58SPavan Nikhilesh } 191*032a965aSPavan Nikhilesh 192314bcf58SPavan Nikhilesh return 0; 193314bcf58SPavan Nikhilesh } 194314bcf58SPavan Nikhilesh 195*032a965aSPavan 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; 199*032a965aSPavan 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 214*032a965aSPavan Nikhilesh if (ev[i].queue_id == tx_queue[ev[i].mbuf->port]) { 215*032a965aSPavan 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++; 222*032a965aSPavan Nikhilesh pipeline_fwd_event(&ev[i], cq_id != last_queue ? 223*032a965aSPavan Nikhilesh sched_type_list[cq_id] : 224*032a965aSPavan Nikhilesh RTE_SCHED_TYPE_ATOMIC); 225314bcf58SPavan Nikhilesh } 226314bcf58SPavan Nikhilesh 227314bcf58SPavan Nikhilesh pipeline_event_enqueue_burst(dev, port, ev, nb_rx); 228314bcf58SPavan Nikhilesh } 229*032a965aSPavan Nikhilesh 230314bcf58SPavan Nikhilesh return 0; 231314bcf58SPavan Nikhilesh } 232314bcf58SPavan Nikhilesh 233*032a965aSPavan 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; 237*032a965aSPavan Nikhilesh const uint8_t *tx_queue = t->tx_evqueue_id; 238314bcf58SPavan Nikhilesh 239314bcf58SPavan Nikhilesh while (t->done == false) { 240314bcf58SPavan Nikhilesh uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev, 241314bcf58SPavan Nikhilesh BURST_SIZE, 0); 242314bcf58SPavan Nikhilesh 243314bcf58SPavan Nikhilesh if (!nb_rx) { 244314bcf58SPavan Nikhilesh rte_pause(); 245314bcf58SPavan Nikhilesh continue; 246314bcf58SPavan Nikhilesh } 247314bcf58SPavan Nikhilesh 248314bcf58SPavan Nikhilesh for (i = 0; i < nb_rx; i++) { 249314bcf58SPavan Nikhilesh rte_prefetch0(ev[i + 1].mbuf); 250314bcf58SPavan Nikhilesh cq_id = ev[i].queue_id % nb_stages; 251314bcf58SPavan Nikhilesh 252314bcf58SPavan Nikhilesh if (cq_id == last_queue) { 253*032a965aSPavan Nikhilesh ev[i].queue_id = tx_queue[ev[i].mbuf->port]; 254*032a965aSPavan Nikhilesh rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0); 255314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], 256314bcf58SPavan Nikhilesh RTE_SCHED_TYPE_ATOMIC); 257314bcf58SPavan Nikhilesh w->processed_pkts++; 258314bcf58SPavan Nikhilesh } else { 259314bcf58SPavan Nikhilesh ev[i].queue_id++; 260314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], 261314bcf58SPavan Nikhilesh sched_type_list[cq_id]); 262314bcf58SPavan Nikhilesh } 263314bcf58SPavan Nikhilesh } 264314bcf58SPavan Nikhilesh 265314bcf58SPavan Nikhilesh pipeline_event_enqueue_burst(dev, port, ev, nb_rx); 266314bcf58SPavan Nikhilesh } 267*032a965aSPavan Nikhilesh 268314bcf58SPavan Nikhilesh return 0; 269314bcf58SPavan Nikhilesh } 270314bcf58SPavan Nikhilesh 271314bcf58SPavan Nikhilesh static int 272d60b4185SPavan Nikhilesh worker_wrapper(void *arg) 273d60b4185SPavan Nikhilesh { 274314bcf58SPavan Nikhilesh struct worker_data *w = arg; 275314bcf58SPavan Nikhilesh struct evt_options *opt = w->t->opt; 276314bcf58SPavan Nikhilesh const bool burst = evt_has_burst_mode(w->dev_id); 277*032a965aSPavan Nikhilesh const bool internal_port = w->t->internal_port; 278314bcf58SPavan Nikhilesh const uint8_t nb_stages = opt->nb_stages; 279314bcf58SPavan Nikhilesh RTE_SET_USED(opt); 280314bcf58SPavan Nikhilesh 281314bcf58SPavan Nikhilesh if (nb_stages == 1) { 282*032a965aSPavan Nikhilesh if (!burst && internal_port) 283314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_tx(arg); 284*032a965aSPavan Nikhilesh else if (!burst && !internal_port) 285314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_fwd(arg); 286*032a965aSPavan Nikhilesh else if (burst && internal_port) 287314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_burst_tx(arg); 288*032a965aSPavan Nikhilesh else if (burst && !internal_port) 289314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_burst_fwd( 290314bcf58SPavan Nikhilesh arg); 291314bcf58SPavan Nikhilesh } else { 292*032a965aSPavan Nikhilesh if (!burst && internal_port) 293314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_tx(arg); 294*032a965aSPavan Nikhilesh else if (!burst && !internal_port) 295314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_fwd(arg); 296*032a965aSPavan Nikhilesh else if (burst && internal_port) 297314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_burst_tx(arg); 298*032a965aSPavan Nikhilesh else if (burst && !internal_port) 299314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_burst_fwd(arg); 300314bcf58SPavan Nikhilesh 301314bcf58SPavan Nikhilesh } 302d60b4185SPavan Nikhilesh rte_panic("invalid worker\n"); 303d60b4185SPavan Nikhilesh } 304d60b4185SPavan Nikhilesh 305d60b4185SPavan Nikhilesh static int 306d60b4185SPavan Nikhilesh pipeline_queue_launch_lcores(struct evt_test *test, struct evt_options *opt) 307d60b4185SPavan Nikhilesh { 308d60b4185SPavan Nikhilesh return pipeline_launch_lcores(test, opt, worker_wrapper); 309d60b4185SPavan Nikhilesh } 310d60b4185SPavan Nikhilesh 311d60b4185SPavan Nikhilesh static int 312d60b4185SPavan Nikhilesh pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt) 313d60b4185SPavan Nikhilesh { 314d60b4185SPavan Nikhilesh int ret; 315d60b4185SPavan Nikhilesh int nb_ports; 316d60b4185SPavan Nikhilesh int nb_queues; 317d60b4185SPavan Nikhilesh int nb_stages = opt->nb_stages; 318d60b4185SPavan Nikhilesh uint8_t queue; 319*032a965aSPavan Nikhilesh uint8_t tx_evport_id = 0; 320*032a965aSPavan Nikhilesh uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS]; 321d60b4185SPavan Nikhilesh uint8_t queue_arr[RTE_EVENT_MAX_QUEUES_PER_DEV]; 322d60b4185SPavan Nikhilesh uint8_t nb_worker_queues = 0; 323*032a965aSPavan Nikhilesh uint16_t prod = 0; 324*032a965aSPavan Nikhilesh struct rte_event_dev_info info; 325*032a965aSPavan Nikhilesh struct test_pipeline *t = evt_test_priv(test); 326d60b4185SPavan Nikhilesh 327d60b4185SPavan Nikhilesh nb_ports = evt_nr_active_lcores(opt->wlcores); 328d9a42a69SThomas Monjalon nb_queues = rte_eth_dev_count_avail() * (nb_stages); 329d60b4185SPavan Nikhilesh 330*032a965aSPavan Nikhilesh /* One queue for Tx adapter per port */ 331d9a42a69SThomas Monjalon nb_queues += rte_eth_dev_count_avail(); 332d60b4185SPavan Nikhilesh 333*032a965aSPavan Nikhilesh memset(tx_evqueue_id, 0, sizeof(uint8_t) * RTE_MAX_ETHPORTS); 334*032a965aSPavan Nikhilesh memset(queue_arr, 0, sizeof(uint8_t) * RTE_EVENT_MAX_QUEUES_PER_DEV); 335d60b4185SPavan Nikhilesh 336*032a965aSPavan Nikhilesh rte_event_dev_info_get(opt->dev_id, &info); 337d60b4185SPavan Nikhilesh const struct rte_event_dev_config config = { 338d60b4185SPavan Nikhilesh .nb_event_queues = nb_queues, 339d60b4185SPavan Nikhilesh .nb_event_ports = nb_ports, 340d60b4185SPavan Nikhilesh .nb_events_limit = info.max_num_events, 341d60b4185SPavan Nikhilesh .nb_event_queue_flows = opt->nb_flows, 342d60b4185SPavan Nikhilesh .nb_event_port_dequeue_depth = 343d60b4185SPavan Nikhilesh info.max_event_port_dequeue_depth, 344d60b4185SPavan Nikhilesh .nb_event_port_enqueue_depth = 345d60b4185SPavan Nikhilesh info.max_event_port_enqueue_depth, 346d60b4185SPavan Nikhilesh }; 347d60b4185SPavan Nikhilesh ret = rte_event_dev_configure(opt->dev_id, &config); 348d60b4185SPavan Nikhilesh if (ret) { 349d60b4185SPavan Nikhilesh evt_err("failed to configure eventdev %d", opt->dev_id); 350d60b4185SPavan Nikhilesh return ret; 351d60b4185SPavan Nikhilesh } 352d60b4185SPavan Nikhilesh 353d60b4185SPavan Nikhilesh struct rte_event_queue_conf q_conf = { 354d60b4185SPavan Nikhilesh .priority = RTE_EVENT_DEV_PRIORITY_NORMAL, 355d60b4185SPavan Nikhilesh .nb_atomic_flows = opt->nb_flows, 356d60b4185SPavan Nikhilesh .nb_atomic_order_sequences = opt->nb_flows, 357d60b4185SPavan Nikhilesh }; 358d60b4185SPavan Nikhilesh /* queue configurations */ 359d60b4185SPavan Nikhilesh for (queue = 0; queue < nb_queues; queue++) { 360d60b4185SPavan Nikhilesh uint8_t slot; 361d60b4185SPavan Nikhilesh 362*032a965aSPavan Nikhilesh q_conf.event_queue_cfg = 0; 363d60b4185SPavan Nikhilesh slot = queue % (nb_stages + 1); 364*032a965aSPavan Nikhilesh if (slot == nb_stages) { 365d60b4185SPavan Nikhilesh q_conf.schedule_type = RTE_SCHED_TYPE_ATOMIC; 366*032a965aSPavan Nikhilesh if (!t->internal_port) { 367d60b4185SPavan Nikhilesh q_conf.event_queue_cfg = 368d60b4185SPavan Nikhilesh RTE_EVENT_QUEUE_CFG_SINGLE_LINK; 369*032a965aSPavan Nikhilesh } 370*032a965aSPavan Nikhilesh tx_evqueue_id[prod++] = queue; 371d60b4185SPavan Nikhilesh } else { 372*032a965aSPavan Nikhilesh q_conf.schedule_type = opt->sched_type_list[slot]; 373d60b4185SPavan Nikhilesh queue_arr[nb_worker_queues] = queue; 374d60b4185SPavan Nikhilesh nb_worker_queues++; 375d60b4185SPavan Nikhilesh } 376d60b4185SPavan Nikhilesh 377d60b4185SPavan Nikhilesh ret = rte_event_queue_setup(opt->dev_id, queue, &q_conf); 378d60b4185SPavan Nikhilesh if (ret) { 379d60b4185SPavan Nikhilesh evt_err("failed to setup queue=%d", queue); 380d60b4185SPavan Nikhilesh return ret; 381d60b4185SPavan Nikhilesh } 382d60b4185SPavan Nikhilesh } 383d60b4185SPavan Nikhilesh 384535c630cSPavan Nikhilesh if (opt->wkr_deq_dep > info.max_event_port_dequeue_depth) 385535c630cSPavan Nikhilesh opt->wkr_deq_dep = info.max_event_port_dequeue_depth; 386535c630cSPavan Nikhilesh 387d60b4185SPavan Nikhilesh /* port configuration */ 388d60b4185SPavan Nikhilesh const struct rte_event_port_conf p_conf = { 389d60b4185SPavan Nikhilesh .dequeue_depth = opt->wkr_deq_dep, 390d60b4185SPavan Nikhilesh .enqueue_depth = info.max_event_port_dequeue_depth, 391d60b4185SPavan Nikhilesh .new_event_threshold = info.max_num_events, 392d60b4185SPavan Nikhilesh }; 393d60b4185SPavan Nikhilesh 394*032a965aSPavan Nikhilesh if (!t->internal_port) { 395d60b4185SPavan Nikhilesh ret = pipeline_event_port_setup(test, opt, queue_arr, 396d60b4185SPavan Nikhilesh nb_worker_queues, p_conf); 397d60b4185SPavan Nikhilesh if (ret) 398d60b4185SPavan Nikhilesh return ret; 399d60b4185SPavan Nikhilesh } else 400d60b4185SPavan Nikhilesh ret = pipeline_event_port_setup(test, opt, NULL, nb_queues, 401d60b4185SPavan Nikhilesh p_conf); 402d60b4185SPavan Nikhilesh 403d60b4185SPavan Nikhilesh if (ret) 404d60b4185SPavan Nikhilesh return ret; 405d60b4185SPavan Nikhilesh /* 406d60b4185SPavan Nikhilesh * The pipelines are setup in the following manner: 407d60b4185SPavan Nikhilesh * 408d60b4185SPavan Nikhilesh * eth_dev_count = 2, nb_stages = 2. 409d60b4185SPavan Nikhilesh * 410d60b4185SPavan Nikhilesh * queues = 6 411d60b4185SPavan Nikhilesh * stride = 3 412d60b4185SPavan Nikhilesh * 413d60b4185SPavan Nikhilesh * event queue pipelines: 414d60b4185SPavan Nikhilesh * eth0 -> q0 -> q1 -> (q2->tx) 415d60b4185SPavan Nikhilesh * eth1 -> q3 -> q4 -> (q5->tx) 416d60b4185SPavan Nikhilesh * 417*032a965aSPavan Nikhilesh * q2, q5 configured as ATOMIC | SINGLE_LINK 418d60b4185SPavan Nikhilesh * 419d60b4185SPavan Nikhilesh */ 420*032a965aSPavan Nikhilesh ret = pipeline_event_rx_adapter_setup(opt, nb_stages + 1, p_conf); 421*032a965aSPavan Nikhilesh if (ret) 422*032a965aSPavan Nikhilesh return ret; 423*032a965aSPavan Nikhilesh 424*032a965aSPavan Nikhilesh ret = pipeline_event_tx_adapter_setup(opt, p_conf); 425d60b4185SPavan Nikhilesh if (ret) 426d60b4185SPavan Nikhilesh return ret; 427d60b4185SPavan Nikhilesh 428d60b4185SPavan Nikhilesh if (!evt_has_distributed_sched(opt->dev_id)) { 429d60b4185SPavan Nikhilesh uint32_t service_id; 430d60b4185SPavan Nikhilesh rte_event_dev_service_id_get(opt->dev_id, &service_id); 431d60b4185SPavan Nikhilesh ret = evt_service_setup(service_id); 432d60b4185SPavan Nikhilesh if (ret) { 433d60b4185SPavan Nikhilesh evt_err("No service lcore found to run event dev."); 434d60b4185SPavan Nikhilesh return ret; 435d60b4185SPavan Nikhilesh } 436d60b4185SPavan Nikhilesh } 437d60b4185SPavan Nikhilesh 438*032a965aSPavan Nikhilesh /* Connect the tx_evqueue_id to the Tx adapter port */ 439*032a965aSPavan Nikhilesh if (!t->internal_port) { 440*032a965aSPavan Nikhilesh RTE_ETH_FOREACH_DEV(prod) { 441*032a965aSPavan Nikhilesh ret = rte_event_eth_tx_adapter_event_port_get(prod, 442*032a965aSPavan Nikhilesh &tx_evport_id); 443*032a965aSPavan Nikhilesh if (ret) { 444*032a965aSPavan Nikhilesh evt_err("Unable to get Tx adptr[%d] evprt[%d]", 445*032a965aSPavan Nikhilesh prod, tx_evport_id); 446*032a965aSPavan Nikhilesh return ret; 447*032a965aSPavan Nikhilesh } 448*032a965aSPavan Nikhilesh 449*032a965aSPavan Nikhilesh if (rte_event_port_link(opt->dev_id, tx_evport_id, 450*032a965aSPavan Nikhilesh &tx_evqueue_id[prod], 451*032a965aSPavan Nikhilesh NULL, 1) != 1) { 452*032a965aSPavan Nikhilesh evt_err("Unable to link Tx adptr[%d] evprt[%d]", 453*032a965aSPavan Nikhilesh prod, tx_evport_id); 454*032a965aSPavan Nikhilesh return ret; 455*032a965aSPavan Nikhilesh } 456*032a965aSPavan Nikhilesh } 457*032a965aSPavan Nikhilesh } 458*032a965aSPavan Nikhilesh 459*032a965aSPavan Nikhilesh RTE_ETH_FOREACH_DEV(prod) { 460*032a965aSPavan Nikhilesh ret = rte_eth_dev_start(prod); 461*032a965aSPavan Nikhilesh if (ret) { 462*032a965aSPavan Nikhilesh evt_err("Ethernet dev [%d] failed to start." 463*032a965aSPavan Nikhilesh " Using synthetic producer", prod); 464*032a965aSPavan Nikhilesh return ret; 465*032a965aSPavan Nikhilesh } 466*032a965aSPavan Nikhilesh 467*032a965aSPavan Nikhilesh } 468*032a965aSPavan Nikhilesh 469d60b4185SPavan Nikhilesh ret = rte_event_dev_start(opt->dev_id); 470d60b4185SPavan Nikhilesh if (ret) { 471d60b4185SPavan Nikhilesh evt_err("failed to start eventdev %d", opt->dev_id); 472d60b4185SPavan Nikhilesh return ret; 473d60b4185SPavan Nikhilesh } 474d60b4185SPavan Nikhilesh 475*032a965aSPavan Nikhilesh RTE_ETH_FOREACH_DEV(prod) { 476*032a965aSPavan Nikhilesh ret = rte_event_eth_rx_adapter_start(prod); 477*032a965aSPavan Nikhilesh if (ret) { 478*032a965aSPavan Nikhilesh evt_err("Rx adapter[%d] start failed", prod); 479*032a965aSPavan Nikhilesh return ret; 480*032a965aSPavan Nikhilesh } 481*032a965aSPavan Nikhilesh 482*032a965aSPavan Nikhilesh ret = rte_event_eth_tx_adapter_start(prod); 483*032a965aSPavan Nikhilesh if (ret) { 484*032a965aSPavan Nikhilesh evt_err("Tx adapter[%d] start failed", prod); 485*032a965aSPavan Nikhilesh return ret; 486*032a965aSPavan Nikhilesh } 487*032a965aSPavan Nikhilesh } 488*032a965aSPavan Nikhilesh 489*032a965aSPavan Nikhilesh memcpy(t->tx_evqueue_id, tx_evqueue_id, sizeof(uint8_t) * 490*032a965aSPavan Nikhilesh RTE_MAX_ETHPORTS); 491*032a965aSPavan Nikhilesh 492d60b4185SPavan Nikhilesh return 0; 493d60b4185SPavan Nikhilesh } 494d60b4185SPavan Nikhilesh 495d60b4185SPavan Nikhilesh static void 496d60b4185SPavan Nikhilesh pipeline_queue_opt_dump(struct evt_options *opt) 497d60b4185SPavan Nikhilesh { 498d60b4185SPavan Nikhilesh pipeline_opt_dump(opt, pipeline_queue_nb_event_queues(opt)); 499d60b4185SPavan Nikhilesh } 500d60b4185SPavan Nikhilesh 501d60b4185SPavan Nikhilesh static int 502d60b4185SPavan Nikhilesh pipeline_queue_opt_check(struct evt_options *opt) 503d60b4185SPavan Nikhilesh { 504d60b4185SPavan Nikhilesh return pipeline_opt_check(opt, pipeline_queue_nb_event_queues(opt)); 505d60b4185SPavan Nikhilesh } 506d60b4185SPavan Nikhilesh 507d60b4185SPavan Nikhilesh static bool 508d60b4185SPavan Nikhilesh pipeline_queue_capability_check(struct evt_options *opt) 509d60b4185SPavan Nikhilesh { 510d60b4185SPavan Nikhilesh struct rte_event_dev_info dev_info; 511d60b4185SPavan Nikhilesh 512d60b4185SPavan Nikhilesh rte_event_dev_info_get(opt->dev_id, &dev_info); 513d60b4185SPavan Nikhilesh if (dev_info.max_event_queues < pipeline_queue_nb_event_queues(opt) || 514d60b4185SPavan Nikhilesh dev_info.max_event_ports < 515d60b4185SPavan Nikhilesh evt_nr_active_lcores(opt->wlcores)) { 516d60b4185SPavan Nikhilesh evt_err("not enough eventdev queues=%d/%d or ports=%d/%d", 517d60b4185SPavan Nikhilesh pipeline_queue_nb_event_queues(opt), 518d60b4185SPavan Nikhilesh dev_info.max_event_queues, 519d60b4185SPavan Nikhilesh evt_nr_active_lcores(opt->wlcores), 520d60b4185SPavan Nikhilesh dev_info.max_event_ports); 521d60b4185SPavan Nikhilesh } 522d60b4185SPavan Nikhilesh 523d60b4185SPavan Nikhilesh return true; 524d60b4185SPavan Nikhilesh } 525d60b4185SPavan Nikhilesh 526d60b4185SPavan Nikhilesh static const struct evt_test_ops pipeline_queue = { 527d60b4185SPavan Nikhilesh .cap_check = pipeline_queue_capability_check, 528d60b4185SPavan Nikhilesh .opt_check = pipeline_queue_opt_check, 529d60b4185SPavan Nikhilesh .opt_dump = pipeline_queue_opt_dump, 530d60b4185SPavan Nikhilesh .test_setup = pipeline_test_setup, 531d60b4185SPavan Nikhilesh .mempool_setup = pipeline_mempool_setup, 532d60b4185SPavan Nikhilesh .ethdev_setup = pipeline_ethdev_setup, 533d60b4185SPavan Nikhilesh .eventdev_setup = pipeline_queue_eventdev_setup, 534d60b4185SPavan Nikhilesh .launch_lcores = pipeline_queue_launch_lcores, 535d60b4185SPavan Nikhilesh .eventdev_destroy = pipeline_eventdev_destroy, 536d60b4185SPavan Nikhilesh .mempool_destroy = pipeline_mempool_destroy, 537d60b4185SPavan Nikhilesh .ethdev_destroy = pipeline_ethdev_destroy, 538d60b4185SPavan Nikhilesh .test_result = pipeline_test_result, 539d60b4185SPavan Nikhilesh .test_destroy = pipeline_test_destroy, 540d60b4185SPavan Nikhilesh }; 541d60b4185SPavan Nikhilesh 542d60b4185SPavan Nikhilesh EVT_TEST_REGISTER(pipeline_queue); 543