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 w->processed_pkts++; 87314bcf58SPavan Nikhilesh } else { 88314bcf58SPavan Nikhilesh ev[i].queue_id++; 89314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], 90314bcf58SPavan Nikhilesh RTE_SCHED_TYPE_ATOMIC); 91*21b1ca48SFeifei Wang pipeline_event_enqueue_burst(dev, port, ev, 92*21b1ca48SFeifei Wang nb_rx); 93314bcf58SPavan Nikhilesh } 94314bcf58SPavan Nikhilesh } 95314bcf58SPavan Nikhilesh } 96314bcf58SPavan Nikhilesh 97314bcf58SPavan Nikhilesh return 0; 98314bcf58SPavan Nikhilesh } 99314bcf58SPavan Nikhilesh 100032a965aSPavan Nikhilesh static __rte_noinline int 101314bcf58SPavan Nikhilesh pipeline_queue_worker_single_stage_burst_fwd(void *arg) 102314bcf58SPavan Nikhilesh { 103f26320a6SPavan Nikhilesh PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT; 104032a965aSPavan Nikhilesh const uint8_t *tx_queue = t->tx_evqueue_id; 105314bcf58SPavan Nikhilesh 106314bcf58SPavan Nikhilesh while (t->done == false) { 107314bcf58SPavan Nikhilesh uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev, 108314bcf58SPavan Nikhilesh BURST_SIZE, 0); 109314bcf58SPavan Nikhilesh 110314bcf58SPavan Nikhilesh if (!nb_rx) { 111314bcf58SPavan Nikhilesh rte_pause(); 112314bcf58SPavan Nikhilesh continue; 113314bcf58SPavan Nikhilesh } 114314bcf58SPavan Nikhilesh 115314bcf58SPavan Nikhilesh for (i = 0; i < nb_rx; i++) { 116314bcf58SPavan Nikhilesh rte_prefetch0(ev[i + 1].mbuf); 117032a965aSPavan Nikhilesh ev[i].queue_id = tx_queue[ev[i].mbuf->port]; 118032a965aSPavan Nikhilesh rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0); 119314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], RTE_SCHED_TYPE_ATOMIC); 120314bcf58SPavan Nikhilesh } 121314bcf58SPavan Nikhilesh 122314bcf58SPavan Nikhilesh pipeline_event_enqueue_burst(dev, port, ev, nb_rx); 123032a965aSPavan Nikhilesh w->processed_pkts += nb_rx; 124314bcf58SPavan Nikhilesh } 125314bcf58SPavan Nikhilesh 126314bcf58SPavan Nikhilesh return 0; 127314bcf58SPavan Nikhilesh } 128314bcf58SPavan Nikhilesh 129314bcf58SPavan Nikhilesh 130032a965aSPavan Nikhilesh static __rte_noinline int 131314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_tx(void *arg) 132314bcf58SPavan Nikhilesh { 133f26320a6SPavan Nikhilesh PIPELINE_WORKER_MULTI_STAGE_INIT; 134032a965aSPavan Nikhilesh const uint8_t *tx_queue = t->tx_evqueue_id; 135314bcf58SPavan Nikhilesh 136314bcf58SPavan Nikhilesh while (t->done == false) { 137314bcf58SPavan Nikhilesh uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0); 138314bcf58SPavan Nikhilesh 139314bcf58SPavan Nikhilesh if (!event) { 140314bcf58SPavan Nikhilesh rte_pause(); 141314bcf58SPavan Nikhilesh continue; 142314bcf58SPavan Nikhilesh } 143314bcf58SPavan Nikhilesh 144314bcf58SPavan Nikhilesh cq_id = ev.queue_id % nb_stages; 145314bcf58SPavan Nikhilesh 146032a965aSPavan Nikhilesh if (ev.queue_id == tx_queue[ev.mbuf->port]) { 147032a965aSPavan Nikhilesh pipeline_event_tx(dev, port, &ev); 148314bcf58SPavan Nikhilesh w->processed_pkts++; 149314bcf58SPavan Nikhilesh continue; 150314bcf58SPavan Nikhilesh } 151314bcf58SPavan Nikhilesh 152032a965aSPavan Nikhilesh ev.queue_id++; 153032a965aSPavan Nikhilesh pipeline_fwd_event(&ev, cq_id != last_queue ? 154032a965aSPavan Nikhilesh sched_type_list[cq_id] : 155032a965aSPavan Nikhilesh RTE_SCHED_TYPE_ATOMIC); 156314bcf58SPavan Nikhilesh pipeline_event_enqueue(dev, port, &ev); 157314bcf58SPavan Nikhilesh } 158032a965aSPavan Nikhilesh 159314bcf58SPavan Nikhilesh return 0; 160314bcf58SPavan Nikhilesh } 161314bcf58SPavan Nikhilesh 162032a965aSPavan Nikhilesh static __rte_noinline int 163314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_fwd(void *arg) 164314bcf58SPavan Nikhilesh { 165f26320a6SPavan Nikhilesh PIPELINE_WORKER_MULTI_STAGE_INIT; 166032a965aSPavan Nikhilesh const uint8_t *tx_queue = t->tx_evqueue_id; 167314bcf58SPavan Nikhilesh 168314bcf58SPavan Nikhilesh while (t->done == false) { 169314bcf58SPavan Nikhilesh uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0); 170314bcf58SPavan Nikhilesh 171314bcf58SPavan Nikhilesh if (!event) { 172314bcf58SPavan Nikhilesh rte_pause(); 173314bcf58SPavan Nikhilesh continue; 174314bcf58SPavan Nikhilesh } 175314bcf58SPavan Nikhilesh 176314bcf58SPavan Nikhilesh cq_id = ev.queue_id % nb_stages; 177314bcf58SPavan Nikhilesh 178314bcf58SPavan Nikhilesh if (cq_id == last_queue) { 179032a965aSPavan Nikhilesh ev.queue_id = tx_queue[ev.mbuf->port]; 180032a965aSPavan Nikhilesh rte_event_eth_tx_adapter_txq_set(ev.mbuf, 0); 181314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC); 182e0c05737SFeifei Wang pipeline_event_enqueue(dev, port, &ev); 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 pipeline_event_enqueue(dev, port, &ev); 188314bcf58SPavan Nikhilesh } 189e0c05737SFeifei Wang } 190032a965aSPavan Nikhilesh 191314bcf58SPavan Nikhilesh return 0; 192314bcf58SPavan Nikhilesh } 193314bcf58SPavan Nikhilesh 194032a965aSPavan Nikhilesh static __rte_noinline int 195314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_burst_tx(void *arg) 196314bcf58SPavan Nikhilesh { 197f26320a6SPavan Nikhilesh PIPELINE_WORKER_MULTI_STAGE_BURST_INIT; 198032a965aSPavan Nikhilesh const uint8_t *tx_queue = t->tx_evqueue_id; 199314bcf58SPavan Nikhilesh 200314bcf58SPavan Nikhilesh while (t->done == false) { 201314bcf58SPavan Nikhilesh uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev, 202314bcf58SPavan Nikhilesh BURST_SIZE, 0); 203314bcf58SPavan Nikhilesh 204314bcf58SPavan Nikhilesh if (!nb_rx) { 205314bcf58SPavan Nikhilesh rte_pause(); 206314bcf58SPavan Nikhilesh continue; 207314bcf58SPavan Nikhilesh } 208314bcf58SPavan Nikhilesh 209314bcf58SPavan Nikhilesh for (i = 0; i < nb_rx; i++) { 210314bcf58SPavan Nikhilesh rte_prefetch0(ev[i + 1].mbuf); 211314bcf58SPavan Nikhilesh cq_id = ev[i].queue_id % nb_stages; 212314bcf58SPavan Nikhilesh 213032a965aSPavan Nikhilesh if (ev[i].queue_id == tx_queue[ev[i].mbuf->port]) { 214032a965aSPavan Nikhilesh pipeline_event_tx(dev, port, &ev[i]); 215314bcf58SPavan Nikhilesh w->processed_pkts++; 216314bcf58SPavan Nikhilesh continue; 217314bcf58SPavan Nikhilesh } 218314bcf58SPavan Nikhilesh 219314bcf58SPavan Nikhilesh ev[i].queue_id++; 220032a965aSPavan Nikhilesh pipeline_fwd_event(&ev[i], cq_id != last_queue ? 221032a965aSPavan Nikhilesh sched_type_list[cq_id] : 222032a965aSPavan Nikhilesh RTE_SCHED_TYPE_ATOMIC); 223314bcf58SPavan Nikhilesh pipeline_event_enqueue_burst(dev, port, ev, nb_rx); 224314bcf58SPavan Nikhilesh } 225*21b1ca48SFeifei Wang } 226032a965aSPavan Nikhilesh 227314bcf58SPavan Nikhilesh return 0; 228314bcf58SPavan Nikhilesh } 229314bcf58SPavan Nikhilesh 230032a965aSPavan Nikhilesh static __rte_noinline int 231314bcf58SPavan Nikhilesh pipeline_queue_worker_multi_stage_burst_fwd(void *arg) 232314bcf58SPavan Nikhilesh { 233f26320a6SPavan Nikhilesh PIPELINE_WORKER_MULTI_STAGE_BURST_INIT; 234032a965aSPavan Nikhilesh const uint8_t *tx_queue = t->tx_evqueue_id; 235314bcf58SPavan Nikhilesh 236314bcf58SPavan Nikhilesh while (t->done == false) { 237e0c05737SFeifei Wang uint16_t processed_pkts = 0; 238314bcf58SPavan Nikhilesh uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev, 239314bcf58SPavan Nikhilesh BURST_SIZE, 0); 240314bcf58SPavan Nikhilesh 241314bcf58SPavan Nikhilesh if (!nb_rx) { 242314bcf58SPavan Nikhilesh rte_pause(); 243314bcf58SPavan Nikhilesh continue; 244314bcf58SPavan Nikhilesh } 245314bcf58SPavan Nikhilesh 246314bcf58SPavan Nikhilesh for (i = 0; i < nb_rx; i++) { 247314bcf58SPavan Nikhilesh rte_prefetch0(ev[i + 1].mbuf); 248314bcf58SPavan Nikhilesh cq_id = ev[i].queue_id % nb_stages; 249314bcf58SPavan Nikhilesh 250314bcf58SPavan Nikhilesh if (cq_id == last_queue) { 251032a965aSPavan Nikhilesh ev[i].queue_id = tx_queue[ev[i].mbuf->port]; 252032a965aSPavan Nikhilesh rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0); 253314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], 254314bcf58SPavan Nikhilesh RTE_SCHED_TYPE_ATOMIC); 255e0c05737SFeifei Wang processed_pkts++; 256314bcf58SPavan Nikhilesh } else { 257314bcf58SPavan Nikhilesh ev[i].queue_id++; 258314bcf58SPavan Nikhilesh pipeline_fwd_event(&ev[i], 259314bcf58SPavan Nikhilesh sched_type_list[cq_id]); 260314bcf58SPavan Nikhilesh } 261314bcf58SPavan Nikhilesh } 262314bcf58SPavan Nikhilesh 263314bcf58SPavan Nikhilesh pipeline_event_enqueue_burst(dev, port, ev, nb_rx); 264e0c05737SFeifei Wang w->processed_pkts += processed_pkts; 265314bcf58SPavan Nikhilesh } 266032a965aSPavan Nikhilesh 267314bcf58SPavan Nikhilesh return 0; 268314bcf58SPavan Nikhilesh } 269314bcf58SPavan Nikhilesh 270314bcf58SPavan Nikhilesh static int 271d60b4185SPavan Nikhilesh worker_wrapper(void *arg) 272d60b4185SPavan Nikhilesh { 273314bcf58SPavan Nikhilesh struct worker_data *w = arg; 274314bcf58SPavan Nikhilesh struct evt_options *opt = w->t->opt; 275314bcf58SPavan Nikhilesh const bool burst = evt_has_burst_mode(w->dev_id); 276032a965aSPavan Nikhilesh const bool internal_port = w->t->internal_port; 277314bcf58SPavan Nikhilesh const uint8_t nb_stages = opt->nb_stages; 278314bcf58SPavan Nikhilesh RTE_SET_USED(opt); 279314bcf58SPavan Nikhilesh 280314bcf58SPavan Nikhilesh if (nb_stages == 1) { 281032a965aSPavan Nikhilesh if (!burst && internal_port) 282314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_tx(arg); 283032a965aSPavan Nikhilesh else if (!burst && !internal_port) 284314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_fwd(arg); 285032a965aSPavan Nikhilesh else if (burst && internal_port) 286314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_burst_tx(arg); 287032a965aSPavan Nikhilesh else if (burst && !internal_port) 288314bcf58SPavan Nikhilesh return pipeline_queue_worker_single_stage_burst_fwd( 289314bcf58SPavan Nikhilesh arg); 290314bcf58SPavan Nikhilesh } else { 291032a965aSPavan Nikhilesh if (!burst && internal_port) 292314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_tx(arg); 293032a965aSPavan Nikhilesh else if (!burst && !internal_port) 294314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_fwd(arg); 295032a965aSPavan Nikhilesh else if (burst && internal_port) 296314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_burst_tx(arg); 297032a965aSPavan Nikhilesh else if (burst && !internal_port) 298314bcf58SPavan Nikhilesh return pipeline_queue_worker_multi_stage_burst_fwd(arg); 299314bcf58SPavan Nikhilesh 300314bcf58SPavan Nikhilesh } 301d60b4185SPavan Nikhilesh rte_panic("invalid worker\n"); 302d60b4185SPavan Nikhilesh } 303d60b4185SPavan Nikhilesh 304d60b4185SPavan Nikhilesh static int 305d60b4185SPavan Nikhilesh pipeline_queue_launch_lcores(struct evt_test *test, struct evt_options *opt) 306d60b4185SPavan Nikhilesh { 307d60b4185SPavan Nikhilesh return pipeline_launch_lcores(test, opt, worker_wrapper); 308d60b4185SPavan Nikhilesh } 309d60b4185SPavan Nikhilesh 310d60b4185SPavan Nikhilesh static int 311d60b4185SPavan Nikhilesh pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt) 312d60b4185SPavan Nikhilesh { 313d60b4185SPavan Nikhilesh int ret; 314d60b4185SPavan Nikhilesh int nb_ports; 315d60b4185SPavan Nikhilesh int nb_queues; 316d60b4185SPavan Nikhilesh int nb_stages = opt->nb_stages; 317d60b4185SPavan Nikhilesh uint8_t queue; 318032a965aSPavan Nikhilesh uint8_t tx_evport_id = 0; 319032a965aSPavan Nikhilesh uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS]; 320d60b4185SPavan Nikhilesh uint8_t queue_arr[RTE_EVENT_MAX_QUEUES_PER_DEV]; 321d60b4185SPavan Nikhilesh uint8_t nb_worker_queues = 0; 322032a965aSPavan Nikhilesh uint16_t prod = 0; 323032a965aSPavan Nikhilesh struct rte_event_dev_info info; 324032a965aSPavan Nikhilesh struct test_pipeline *t = evt_test_priv(test); 325d60b4185SPavan Nikhilesh 326d60b4185SPavan Nikhilesh nb_ports = evt_nr_active_lcores(opt->wlcores); 327d9a42a69SThomas Monjalon nb_queues = rte_eth_dev_count_avail() * (nb_stages); 328d60b4185SPavan Nikhilesh 329032a965aSPavan Nikhilesh /* One queue for Tx adapter per port */ 330d9a42a69SThomas Monjalon nb_queues += rte_eth_dev_count_avail(); 331d60b4185SPavan Nikhilesh 332032a965aSPavan Nikhilesh memset(tx_evqueue_id, 0, sizeof(uint8_t) * RTE_MAX_ETHPORTS); 333032a965aSPavan Nikhilesh memset(queue_arr, 0, sizeof(uint8_t) * RTE_EVENT_MAX_QUEUES_PER_DEV); 334d60b4185SPavan Nikhilesh 335032a965aSPavan Nikhilesh rte_event_dev_info_get(opt->dev_id, &info); 336f0959283SPavan Nikhilesh ret = evt_configure_eventdev(opt, nb_queues, nb_ports); 337d60b4185SPavan Nikhilesh if (ret) { 338d60b4185SPavan Nikhilesh evt_err("failed to configure eventdev %d", opt->dev_id); 339d60b4185SPavan Nikhilesh return ret; 340d60b4185SPavan Nikhilesh } 341d60b4185SPavan Nikhilesh 342d60b4185SPavan Nikhilesh struct rte_event_queue_conf q_conf = { 343d60b4185SPavan Nikhilesh .priority = RTE_EVENT_DEV_PRIORITY_NORMAL, 344d60b4185SPavan Nikhilesh .nb_atomic_flows = opt->nb_flows, 345d60b4185SPavan Nikhilesh .nb_atomic_order_sequences = opt->nb_flows, 346d60b4185SPavan Nikhilesh }; 347d60b4185SPavan Nikhilesh /* queue configurations */ 348d60b4185SPavan Nikhilesh for (queue = 0; queue < nb_queues; queue++) { 349d60b4185SPavan Nikhilesh uint8_t slot; 350d60b4185SPavan Nikhilesh 351032a965aSPavan Nikhilesh q_conf.event_queue_cfg = 0; 352d60b4185SPavan Nikhilesh slot = queue % (nb_stages + 1); 353032a965aSPavan Nikhilesh if (slot == nb_stages) { 354d60b4185SPavan Nikhilesh q_conf.schedule_type = RTE_SCHED_TYPE_ATOMIC; 355032a965aSPavan Nikhilesh if (!t->internal_port) { 356d60b4185SPavan Nikhilesh q_conf.event_queue_cfg = 357d60b4185SPavan Nikhilesh RTE_EVENT_QUEUE_CFG_SINGLE_LINK; 358032a965aSPavan Nikhilesh } 359032a965aSPavan Nikhilesh tx_evqueue_id[prod++] = queue; 360d60b4185SPavan Nikhilesh } else { 361032a965aSPavan Nikhilesh q_conf.schedule_type = opt->sched_type_list[slot]; 362d60b4185SPavan Nikhilesh queue_arr[nb_worker_queues] = queue; 363d60b4185SPavan Nikhilesh nb_worker_queues++; 364d60b4185SPavan Nikhilesh } 365d60b4185SPavan Nikhilesh 366d60b4185SPavan Nikhilesh ret = rte_event_queue_setup(opt->dev_id, queue, &q_conf); 367d60b4185SPavan Nikhilesh if (ret) { 368d60b4185SPavan Nikhilesh evt_err("failed to setup queue=%d", queue); 369d60b4185SPavan Nikhilesh return ret; 370d60b4185SPavan Nikhilesh } 371d60b4185SPavan Nikhilesh } 372d60b4185SPavan Nikhilesh 373535c630cSPavan Nikhilesh if (opt->wkr_deq_dep > info.max_event_port_dequeue_depth) 374535c630cSPavan Nikhilesh opt->wkr_deq_dep = info.max_event_port_dequeue_depth; 375535c630cSPavan Nikhilesh 376d60b4185SPavan Nikhilesh /* port configuration */ 377d60b4185SPavan Nikhilesh const struct rte_event_port_conf p_conf = { 378d60b4185SPavan Nikhilesh .dequeue_depth = opt->wkr_deq_dep, 379d60b4185SPavan Nikhilesh .enqueue_depth = info.max_event_port_dequeue_depth, 380d60b4185SPavan Nikhilesh .new_event_threshold = info.max_num_events, 381d60b4185SPavan Nikhilesh }; 382d60b4185SPavan Nikhilesh 383032a965aSPavan Nikhilesh if (!t->internal_port) { 384d60b4185SPavan Nikhilesh ret = pipeline_event_port_setup(test, opt, queue_arr, 385d60b4185SPavan Nikhilesh nb_worker_queues, p_conf); 386d60b4185SPavan Nikhilesh if (ret) 387d60b4185SPavan Nikhilesh return ret; 388d60b4185SPavan Nikhilesh } else 389d60b4185SPavan Nikhilesh ret = pipeline_event_port_setup(test, opt, NULL, nb_queues, 390d60b4185SPavan Nikhilesh p_conf); 391d60b4185SPavan Nikhilesh 392d60b4185SPavan Nikhilesh if (ret) 393d60b4185SPavan Nikhilesh return ret; 394d60b4185SPavan Nikhilesh /* 395d60b4185SPavan Nikhilesh * The pipelines are setup in the following manner: 396d60b4185SPavan Nikhilesh * 397d60b4185SPavan Nikhilesh * eth_dev_count = 2, nb_stages = 2. 398d60b4185SPavan Nikhilesh * 399d60b4185SPavan Nikhilesh * queues = 6 400d60b4185SPavan Nikhilesh * stride = 3 401d60b4185SPavan Nikhilesh * 402d60b4185SPavan Nikhilesh * event queue pipelines: 403d60b4185SPavan Nikhilesh * eth0 -> q0 -> q1 -> (q2->tx) 404d60b4185SPavan Nikhilesh * eth1 -> q3 -> q4 -> (q5->tx) 405d60b4185SPavan Nikhilesh * 406032a965aSPavan Nikhilesh * q2, q5 configured as ATOMIC | SINGLE_LINK 407d60b4185SPavan Nikhilesh * 408d60b4185SPavan Nikhilesh */ 409032a965aSPavan Nikhilesh ret = pipeline_event_rx_adapter_setup(opt, nb_stages + 1, p_conf); 410032a965aSPavan Nikhilesh if (ret) 411032a965aSPavan Nikhilesh return ret; 412032a965aSPavan Nikhilesh 413032a965aSPavan Nikhilesh ret = pipeline_event_tx_adapter_setup(opt, p_conf); 414d60b4185SPavan Nikhilesh if (ret) 415d60b4185SPavan Nikhilesh return ret; 416d60b4185SPavan Nikhilesh 417d60b4185SPavan Nikhilesh if (!evt_has_distributed_sched(opt->dev_id)) { 418d60b4185SPavan Nikhilesh uint32_t service_id; 419d60b4185SPavan Nikhilesh rte_event_dev_service_id_get(opt->dev_id, &service_id); 420d60b4185SPavan Nikhilesh ret = evt_service_setup(service_id); 421d60b4185SPavan Nikhilesh if (ret) { 422d60b4185SPavan Nikhilesh evt_err("No service lcore found to run event dev."); 423d60b4185SPavan Nikhilesh return ret; 424d60b4185SPavan Nikhilesh } 425d60b4185SPavan Nikhilesh } 426d60b4185SPavan Nikhilesh 427032a965aSPavan Nikhilesh /* Connect the tx_evqueue_id to the Tx adapter port */ 428032a965aSPavan Nikhilesh if (!t->internal_port) { 429032a965aSPavan Nikhilesh RTE_ETH_FOREACH_DEV(prod) { 430032a965aSPavan Nikhilesh ret = rte_event_eth_tx_adapter_event_port_get(prod, 431032a965aSPavan Nikhilesh &tx_evport_id); 432032a965aSPavan Nikhilesh if (ret) { 433032a965aSPavan Nikhilesh evt_err("Unable to get Tx adptr[%d] evprt[%d]", 434032a965aSPavan Nikhilesh prod, tx_evport_id); 435032a965aSPavan Nikhilesh return ret; 436032a965aSPavan Nikhilesh } 437032a965aSPavan Nikhilesh 438032a965aSPavan Nikhilesh if (rte_event_port_link(opt->dev_id, tx_evport_id, 439032a965aSPavan Nikhilesh &tx_evqueue_id[prod], 440032a965aSPavan Nikhilesh NULL, 1) != 1) { 441032a965aSPavan Nikhilesh evt_err("Unable to link Tx adptr[%d] evprt[%d]", 442032a965aSPavan Nikhilesh prod, tx_evport_id); 443032a965aSPavan Nikhilesh return ret; 444032a965aSPavan Nikhilesh } 445032a965aSPavan Nikhilesh } 446032a965aSPavan Nikhilesh } 447032a965aSPavan Nikhilesh 44866b82db2SPavan Nikhilesh ret = rte_event_dev_start(opt->dev_id); 44966b82db2SPavan Nikhilesh if (ret) { 45066b82db2SPavan Nikhilesh evt_err("failed to start eventdev %d", opt->dev_id); 45166b82db2SPavan Nikhilesh return ret; 45266b82db2SPavan Nikhilesh } 45366b82db2SPavan Nikhilesh 45466b82db2SPavan Nikhilesh 455032a965aSPavan Nikhilesh RTE_ETH_FOREACH_DEV(prod) { 456032a965aSPavan Nikhilesh ret = rte_eth_dev_start(prod); 457032a965aSPavan Nikhilesh if (ret) { 458032a965aSPavan Nikhilesh evt_err("Ethernet dev [%d] failed to start." 459032a965aSPavan Nikhilesh " Using synthetic producer", prod); 460032a965aSPavan Nikhilesh return ret; 461032a965aSPavan Nikhilesh } 462032a965aSPavan Nikhilesh 463032a965aSPavan Nikhilesh } 464032a965aSPavan Nikhilesh 465032a965aSPavan Nikhilesh RTE_ETH_FOREACH_DEV(prod) { 466032a965aSPavan Nikhilesh ret = rte_event_eth_rx_adapter_start(prod); 467032a965aSPavan Nikhilesh if (ret) { 468032a965aSPavan Nikhilesh evt_err("Rx adapter[%d] start failed", prod); 469032a965aSPavan Nikhilesh return ret; 470032a965aSPavan Nikhilesh } 471032a965aSPavan Nikhilesh 472032a965aSPavan Nikhilesh ret = rte_event_eth_tx_adapter_start(prod); 473032a965aSPavan Nikhilesh if (ret) { 474032a965aSPavan Nikhilesh evt_err("Tx adapter[%d] start failed", prod); 475032a965aSPavan Nikhilesh return ret; 476032a965aSPavan Nikhilesh } 477032a965aSPavan Nikhilesh } 478032a965aSPavan Nikhilesh 479032a965aSPavan Nikhilesh memcpy(t->tx_evqueue_id, tx_evqueue_id, sizeof(uint8_t) * 480032a965aSPavan Nikhilesh RTE_MAX_ETHPORTS); 481032a965aSPavan Nikhilesh 482d60b4185SPavan Nikhilesh return 0; 483d60b4185SPavan Nikhilesh } 484d60b4185SPavan Nikhilesh 485d60b4185SPavan Nikhilesh static void 486d60b4185SPavan Nikhilesh pipeline_queue_opt_dump(struct evt_options *opt) 487d60b4185SPavan Nikhilesh { 488d60b4185SPavan Nikhilesh pipeline_opt_dump(opt, pipeline_queue_nb_event_queues(opt)); 489d60b4185SPavan Nikhilesh } 490d60b4185SPavan Nikhilesh 491d60b4185SPavan Nikhilesh static int 492d60b4185SPavan Nikhilesh pipeline_queue_opt_check(struct evt_options *opt) 493d60b4185SPavan Nikhilesh { 494d60b4185SPavan Nikhilesh return pipeline_opt_check(opt, pipeline_queue_nb_event_queues(opt)); 495d60b4185SPavan Nikhilesh } 496d60b4185SPavan Nikhilesh 497d60b4185SPavan Nikhilesh static bool 498d60b4185SPavan Nikhilesh pipeline_queue_capability_check(struct evt_options *opt) 499d60b4185SPavan Nikhilesh { 500d60b4185SPavan Nikhilesh struct rte_event_dev_info dev_info; 501d60b4185SPavan Nikhilesh 502d60b4185SPavan Nikhilesh rte_event_dev_info_get(opt->dev_id, &dev_info); 503d60b4185SPavan Nikhilesh if (dev_info.max_event_queues < pipeline_queue_nb_event_queues(opt) || 504d60b4185SPavan Nikhilesh dev_info.max_event_ports < 505d60b4185SPavan Nikhilesh evt_nr_active_lcores(opt->wlcores)) { 506d60b4185SPavan Nikhilesh evt_err("not enough eventdev queues=%d/%d or ports=%d/%d", 507d60b4185SPavan Nikhilesh pipeline_queue_nb_event_queues(opt), 508d60b4185SPavan Nikhilesh dev_info.max_event_queues, 509d60b4185SPavan Nikhilesh evt_nr_active_lcores(opt->wlcores), 510d60b4185SPavan Nikhilesh dev_info.max_event_ports); 511d60b4185SPavan Nikhilesh } 512d60b4185SPavan Nikhilesh 513d60b4185SPavan Nikhilesh return true; 514d60b4185SPavan Nikhilesh } 515d60b4185SPavan Nikhilesh 516d60b4185SPavan Nikhilesh static const struct evt_test_ops pipeline_queue = { 517d60b4185SPavan Nikhilesh .cap_check = pipeline_queue_capability_check, 518d60b4185SPavan Nikhilesh .opt_check = pipeline_queue_opt_check, 519d60b4185SPavan Nikhilesh .opt_dump = pipeline_queue_opt_dump, 520d60b4185SPavan Nikhilesh .test_setup = pipeline_test_setup, 521d60b4185SPavan Nikhilesh .mempool_setup = pipeline_mempool_setup, 522d60b4185SPavan Nikhilesh .ethdev_setup = pipeline_ethdev_setup, 523d60b4185SPavan Nikhilesh .eventdev_setup = pipeline_queue_eventdev_setup, 524d60b4185SPavan Nikhilesh .launch_lcores = pipeline_queue_launch_lcores, 525d60b4185SPavan Nikhilesh .eventdev_destroy = pipeline_eventdev_destroy, 526d60b4185SPavan Nikhilesh .mempool_destroy = pipeline_mempool_destroy, 527d60b4185SPavan Nikhilesh .ethdev_destroy = pipeline_ethdev_destroy, 528d60b4185SPavan Nikhilesh .test_result = pipeline_test_result, 529d60b4185SPavan Nikhilesh .test_destroy = pipeline_test_destroy, 530d60b4185SPavan Nikhilesh }; 531d60b4185SPavan Nikhilesh 532d60b4185SPavan Nikhilesh EVT_TEST_REGISTER(pipeline_queue); 533