153a3b7e8SJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause 253a3b7e8SJerin Jacob * Copyright(c) 2017 Cavium, Inc 30add6c27SJerin Jacob */ 40add6c27SJerin Jacob 50add6c27SJerin Jacob #ifndef _EVT_OPTIONS_ 60add6c27SJerin Jacob #define _EVT_OPTIONS_ 70add6c27SJerin Jacob 80add6c27SJerin Jacob #include <stdio.h> 90add6c27SJerin Jacob #include <stdbool.h> 100add6c27SJerin Jacob 110add6c27SJerin Jacob #include <rte_common.h> 12de2bc16eSShijith Thotton #include <rte_cryptodev.h> 13d008f20bSPavan Nikhilesh #include <rte_ethdev.h> 140add6c27SJerin Jacob #include <rte_eventdev.h> 150add6c27SJerin Jacob #include <rte_lcore.h> 160add6c27SJerin Jacob 170add6c27SJerin Jacob #include "evt_common.h" 180add6c27SJerin Jacob 1989e84026SJerin Jacob #define EVT_BOOL_FMT(x) ((x) ? "true" : "false") 2089e84026SJerin Jacob 214afd440eSGuduri Prathyusha #define EVT_VERBOSE ("verbose") 224afd440eSGuduri Prathyusha #define EVT_DEVICE ("dev") 234afd440eSGuduri Prathyusha #define EVT_TEST ("test") 244afd440eSGuduri Prathyusha #define EVT_PROD_LCORES ("plcores") 254afd440eSGuduri Prathyusha #define EVT_WORK_LCORES ("wlcores") 264afd440eSGuduri Prathyusha #define EVT_NB_FLOWS ("nb_flows") 274afd440eSGuduri Prathyusha #define EVT_SOCKET_ID ("socket_id") 284afd440eSGuduri Prathyusha #define EVT_POOL_SZ ("pool_sz") 294afd440eSGuduri Prathyusha #define EVT_WKR_DEQ_DEP ("worker_deq_depth") 304afd440eSGuduri Prathyusha #define EVT_NB_PKTS ("nb_pkts") 314afd440eSGuduri Prathyusha #define EVT_NB_STAGES ("nb_stages") 324afd440eSGuduri Prathyusha #define EVT_SCHED_TYPE_LIST ("stlist") 334afd440eSGuduri Prathyusha #define EVT_FWD_LATENCY ("fwd_latency") 344afd440eSGuduri Prathyusha #define EVT_QUEUE_PRIORITY ("queue_priority") 35f0959283SPavan Nikhilesh #define EVT_DEQ_TMO_NSEC ("deq_tmo_nsec") 36b01974daSPavan Nikhilesh #define EVT_PROD_ETHDEV ("prod_type_ethdev") 37de2bc16eSShijith Thotton #define EVT_PROD_CRYPTODEV ("prod_type_cryptodev") 38b25a66c4SAmit Prakash Shukla #define EVT_PROD_DMADEV ("prod_type_dmadev") 39d008f20bSPavan Nikhilesh #define EVT_PROD_TIMERDEV ("prod_type_timerdev") 4017b22d0bSPavan Nikhilesh #define EVT_PROD_TIMERDEV_BURST ("prod_type_timerdev_burst") 41b25a66c4SAmit Prakash Shukla #define EVT_DMA_ADPTR_MODE ("dma_adptr_mode") 42de2bc16eSShijith Thotton #define EVT_CRYPTO_ADPTR_MODE ("crypto_adptr_mode") 438f5b5495SAkhil Goyal #define EVT_CRYPTO_OP_TYPE ("crypto_op_type") 44750ab9d5SAakash Sasidharan #define EVT_CRYPTO_CIPHER_ALG ("crypto_cipher_alg") 45750ab9d5SAakash Sasidharan #define EVT_CRYPTO_CIPHER_KEY ("crypto_cipher_key") 46750ab9d5SAakash Sasidharan #define EVT_CRYPTO_CIPHER_IV_SZ ("crypto_cipher_iv_sz") 4798c62921SPavan Nikhilesh #define EVT_NB_TIMERS ("nb_timers") 4898c62921SPavan Nikhilesh #define EVT_NB_TIMER_ADPTRS ("nb_timer_adptrs") 499e596d88SPavan Nikhilesh #define EVT_TIMER_TICK_NSEC ("timer_tick_nsec") 5098c62921SPavan Nikhilesh #define EVT_MAX_TMO_NSEC ("max_tmo_nsec") 519e596d88SPavan Nikhilesh #define EVT_EXPIRY_NSEC ("expiry_nsec") 52fc8b96fbSPavan Nikhilesh #define EVT_MBUF_SZ ("mbuf_sz") 53fc8b96fbSPavan Nikhilesh #define EVT_MAX_PKT_SZ ("max_pkt_sz") 5420841a25SRashmi Shetty #define EVT_PROD_ENQ_BURST_SZ ("prod_enq_burst_sz") 552eaa37b8SPavan Nikhilesh #define EVT_NB_ETH_QUEUES ("nb_eth_queues") 562eaa37b8SPavan Nikhilesh #define EVT_ENA_VECTOR ("enable_vector") 572eaa37b8SPavan Nikhilesh #define EVT_VECTOR_SZ ("vector_size") 582eaa37b8SPavan Nikhilesh #define EVT_VECTOR_TMO ("vector_tmo_ns") 59dbd4defeSPavan Nikhilesh #define EVT_PER_PORT_POOL ("per_port_pool") 60c9043624SPavan Nikhilesh #define EVT_TX_FIRST ("tx_first") 61c9043624SPavan Nikhilesh #define EVT_TX_PKT_SZ ("tx_pkt_sz") 62*7a7a04d3SPavan Nikhilesh #define EVT_PRESCHEDULE ("preschedule") 634afd440eSGuduri Prathyusha #define EVT_HELP ("help") 644afd440eSGuduri Prathyusha 650add6c27SJerin Jacob void evt_options_default(struct evt_options *opt); 664afd440eSGuduri Prathyusha int evt_options_parse(struct evt_options *opt, int argc, char **argv); 6789e84026SJerin Jacob void evt_options_dump(struct evt_options *opt); 680add6c27SJerin Jacob 693c59fb10SJerin Jacob /* options check helpers */ 703c59fb10SJerin Jacob static inline bool 713c59fb10SJerin Jacob evt_lcores_has_overlap(bool lcores[], int lcore) 723c59fb10SJerin Jacob { 733c59fb10SJerin Jacob if (lcores[lcore] == true) { 743c59fb10SJerin Jacob evt_err("lcore overlaps at %d", lcore); 753c59fb10SJerin Jacob return true; 763c59fb10SJerin Jacob } 773c59fb10SJerin Jacob 783c59fb10SJerin Jacob return false; 793c59fb10SJerin Jacob } 803c59fb10SJerin Jacob 813c59fb10SJerin Jacob static inline bool 823c59fb10SJerin Jacob evt_lcores_has_overlap_multi(bool lcoresx[], bool lcoresy[]) 833c59fb10SJerin Jacob { 843c59fb10SJerin Jacob int i; 853c59fb10SJerin Jacob 863c59fb10SJerin Jacob for (i = 0; i < RTE_MAX_LCORE; i++) { 873c59fb10SJerin Jacob if (lcoresx[i] && lcoresy[i]) { 883c59fb10SJerin Jacob evt_err("lcores overlaps at %d", i); 893c59fb10SJerin Jacob return true; 903c59fb10SJerin Jacob } 913c59fb10SJerin Jacob } 923c59fb10SJerin Jacob return false; 933c59fb10SJerin Jacob } 943c59fb10SJerin Jacob 953c59fb10SJerin Jacob static inline bool 963c59fb10SJerin Jacob evt_has_active_lcore(bool lcores[]) 973c59fb10SJerin Jacob { 983c59fb10SJerin Jacob int i; 993c59fb10SJerin Jacob 1003c59fb10SJerin Jacob for (i = 0; i < RTE_MAX_LCORE; i++) 1013c59fb10SJerin Jacob if (lcores[i]) 1023c59fb10SJerin Jacob return true; 1033c59fb10SJerin Jacob return false; 1043c59fb10SJerin Jacob } 1053c59fb10SJerin Jacob 1063c59fb10SJerin Jacob static inline int 1073c59fb10SJerin Jacob evt_nr_active_lcores(bool lcores[]) 1083c59fb10SJerin Jacob { 1093c59fb10SJerin Jacob int i; 1103c59fb10SJerin Jacob int c = 0; 1113c59fb10SJerin Jacob 1123c59fb10SJerin Jacob for (i = 0; i < RTE_MAX_LCORE; i++) 1133c59fb10SJerin Jacob if (lcores[i]) 1143c59fb10SJerin Jacob c++; 1153c59fb10SJerin Jacob return c; 1163c59fb10SJerin Jacob } 1173c59fb10SJerin Jacob 1183c59fb10SJerin Jacob static inline int 1193c59fb10SJerin Jacob evt_get_first_active_lcore(bool lcores[]) 1203c59fb10SJerin Jacob { 1213c59fb10SJerin Jacob int i; 1223c59fb10SJerin Jacob 1233c59fb10SJerin Jacob for (i = 0; i < RTE_MAX_LCORE; i++) 1243c59fb10SJerin Jacob if (lcores[i]) 1253c59fb10SJerin Jacob return i; 1263c59fb10SJerin Jacob return -1; 1273c59fb10SJerin Jacob } 1283c59fb10SJerin Jacob 1293c59fb10SJerin Jacob static inline bool 1303c59fb10SJerin Jacob evt_has_disabled_lcore(bool lcores[]) 1313c59fb10SJerin Jacob { 1323c59fb10SJerin Jacob int i; 1333c59fb10SJerin Jacob 1343c59fb10SJerin Jacob for (i = 0; i < RTE_MAX_LCORE; i++) 1353c59fb10SJerin Jacob if ((lcores[i] == true) && !(rte_lcore_is_enabled(i))) 1363c59fb10SJerin Jacob return true; 1373c59fb10SJerin Jacob return false; 1383c59fb10SJerin Jacob } 1393c59fb10SJerin Jacob 1403c59fb10SJerin Jacob static inline bool 1413c59fb10SJerin Jacob evt_has_invalid_stage(struct evt_options *opt) 1423c59fb10SJerin Jacob { 1433c59fb10SJerin Jacob if (!opt->nb_stages) { 1443c59fb10SJerin Jacob evt_err("need minimum one stage, check --stlist"); 1453c59fb10SJerin Jacob return true; 1463c59fb10SJerin Jacob } 1473c59fb10SJerin Jacob if (opt->nb_stages > EVT_MAX_STAGES) { 1483c59fb10SJerin Jacob evt_err("requested changes are beyond EVT_MAX_STAGES=%d", 1493c59fb10SJerin Jacob EVT_MAX_STAGES); 1503c59fb10SJerin Jacob return true; 1513c59fb10SJerin Jacob } 1523c59fb10SJerin Jacob return false; 1533c59fb10SJerin Jacob } 1543c59fb10SJerin Jacob 1553c59fb10SJerin Jacob static inline bool 1563c59fb10SJerin Jacob evt_has_invalid_sched_type(struct evt_options *opt) 1573c59fb10SJerin Jacob { 1583c59fb10SJerin Jacob int i; 1593c59fb10SJerin Jacob 1603c59fb10SJerin Jacob for (i = 0; i < opt->nb_stages; i++) { 1613c59fb10SJerin Jacob if (opt->sched_type_list[i] > RTE_SCHED_TYPE_PARALLEL) { 1623c59fb10SJerin Jacob evt_err("invalid sched_type %d at %d", 1633c59fb10SJerin Jacob opt->sched_type_list[i], i); 1643c59fb10SJerin Jacob return true; 1653c59fb10SJerin Jacob } 1663c59fb10SJerin Jacob } 1673c59fb10SJerin Jacob return false; 1683c59fb10SJerin Jacob } 1693c59fb10SJerin Jacob 17089e84026SJerin Jacob /* option dump helpers */ 17189e84026SJerin Jacob static inline void 17289e84026SJerin Jacob evt_dump_worker_lcores(struct evt_options *opt) 17389e84026SJerin Jacob { 17489e84026SJerin Jacob int c; 17589e84026SJerin Jacob 17689e84026SJerin Jacob evt_dump_begin("worker lcores"); 17789e84026SJerin Jacob for (c = 0; c < RTE_MAX_LCORE; c++) { 17889e84026SJerin Jacob if (opt->wlcores[c]) 17989e84026SJerin Jacob printf("%d ", c); 18089e84026SJerin Jacob } 18189e84026SJerin Jacob evt_dump_end; 18289e84026SJerin Jacob } 18389e84026SJerin Jacob 18489e84026SJerin Jacob static inline void 18589e84026SJerin Jacob evt_dump_producer_lcores(struct evt_options *opt) 18689e84026SJerin Jacob { 18789e84026SJerin Jacob int c; 18889e84026SJerin Jacob 18989e84026SJerin Jacob evt_dump_begin("producer lcores"); 19089e84026SJerin Jacob for (c = 0; c < RTE_MAX_LCORE; c++) { 19189e84026SJerin Jacob if (opt->plcores[c]) 19289e84026SJerin Jacob printf("%d ", c); 19389e84026SJerin Jacob } 19489e84026SJerin Jacob evt_dump_end; 19589e84026SJerin Jacob } 19689e84026SJerin Jacob 19789e84026SJerin Jacob static inline void 19889e84026SJerin Jacob evt_dump_nb_flows(struct evt_options *opt) 19989e84026SJerin Jacob { 20089e84026SJerin Jacob evt_dump("nb_flows", "%d", opt->nb_flows); 20189e84026SJerin Jacob } 20289e84026SJerin Jacob 20389e84026SJerin Jacob static inline void 20489e84026SJerin Jacob evt_dump_worker_dequeue_depth(struct evt_options *opt) 20589e84026SJerin Jacob { 20689e84026SJerin Jacob evt_dump("worker deq depth", "%d", opt->wkr_deq_dep); 20789e84026SJerin Jacob } 20889e84026SJerin Jacob 20989e84026SJerin Jacob static inline void 21089e84026SJerin Jacob evt_dump_nb_stages(struct evt_options *opt) 21189e84026SJerin Jacob { 21289e84026SJerin Jacob evt_dump("nb_stages", "%d", opt->nb_stages); 21389e84026SJerin Jacob } 21489e84026SJerin Jacob 21589e84026SJerin Jacob static inline void 21689e84026SJerin Jacob evt_dump_fwd_latency(struct evt_options *opt) 21789e84026SJerin Jacob { 21889e84026SJerin Jacob evt_dump("fwd_latency", "%s", EVT_BOOL_FMT(opt->fwd_latency)); 21989e84026SJerin Jacob } 22089e84026SJerin Jacob 22189e84026SJerin Jacob static inline void 22289e84026SJerin Jacob evt_dump_queue_priority(struct evt_options *opt) 22389e84026SJerin Jacob { 22489e84026SJerin Jacob evt_dump("queue_priority", "%s", EVT_BOOL_FMT(opt->q_priority)); 22589e84026SJerin Jacob } 22689e84026SJerin Jacob 22789e84026SJerin Jacob static inline const char* 22889e84026SJerin Jacob evt_sched_type_2_str(uint8_t sched_type) 22989e84026SJerin Jacob { 23089e84026SJerin Jacob 23189e84026SJerin Jacob if (sched_type == RTE_SCHED_TYPE_ORDERED) 23289e84026SJerin Jacob return "O"; 23389e84026SJerin Jacob else if (sched_type == RTE_SCHED_TYPE_ATOMIC) 23489e84026SJerin Jacob return "A"; 23589e84026SJerin Jacob else if (sched_type == RTE_SCHED_TYPE_PARALLEL) 23689e84026SJerin Jacob return "P"; 23789e84026SJerin Jacob else 23889e84026SJerin Jacob return "I"; 23989e84026SJerin Jacob } 24089e84026SJerin Jacob 24189e84026SJerin Jacob static inline void 24289e84026SJerin Jacob evt_dump_sched_type_list(struct evt_options *opt) 24389e84026SJerin Jacob { 24489e84026SJerin Jacob int i; 24589e84026SJerin Jacob 24689e84026SJerin Jacob evt_dump_begin("sched_type_list"); 24789e84026SJerin Jacob for (i = 0; i < opt->nb_stages; i++) 24889e84026SJerin Jacob printf("%s ", evt_sched_type_2_str(opt->sched_type_list[i])); 24989e84026SJerin Jacob 25089e84026SJerin Jacob evt_dump_end; 25189e84026SJerin Jacob } 2523c59fb10SJerin Jacob 2539fdc9986SPavan Nikhilesh static inline const char * 2549fdc9986SPavan Nikhilesh evt_prod_id_to_name(enum evt_prod_type prod_type) 2559fdc9986SPavan Nikhilesh { 2569fdc9986SPavan Nikhilesh switch (prod_type) { 2579fdc9986SPavan Nikhilesh default: 2589fdc9986SPavan Nikhilesh case EVT_PROD_TYPE_SYNT: 2599fdc9986SPavan Nikhilesh return "Synthetic producer lcores"; 2609fdc9986SPavan Nikhilesh case EVT_PROD_TYPE_ETH_RX_ADPTR: 2619fdc9986SPavan Nikhilesh return "Ethdev Rx Adapter"; 2629fdc9986SPavan Nikhilesh case EVT_PROD_TYPE_EVENT_TIMER_ADPTR: 2639fdc9986SPavan Nikhilesh return "Event timer adapter"; 264de2bc16eSShijith Thotton case EVT_PROD_TYPE_EVENT_CRYPTO_ADPTR: 265de2bc16eSShijith Thotton return "Event crypto adapter"; 266b25a66c4SAmit Prakash Shukla case EVT_PROD_TYPE_EVENT_DMA_ADPTR: 267b25a66c4SAmit Prakash Shukla return "Event dma adapter"; 2689fdc9986SPavan Nikhilesh } 2699fdc9986SPavan Nikhilesh 2709fdc9986SPavan Nikhilesh return ""; 2719fdc9986SPavan Nikhilesh } 2729fdc9986SPavan Nikhilesh 273b01974daSPavan Nikhilesh #define EVT_PROD_MAX_NAME_LEN 50 274b01974daSPavan Nikhilesh static inline void 275b01974daSPavan Nikhilesh evt_dump_producer_type(struct evt_options *opt) 276b01974daSPavan Nikhilesh { 277b01974daSPavan Nikhilesh char name[EVT_PROD_MAX_NAME_LEN]; 278b01974daSPavan Nikhilesh 279b01974daSPavan Nikhilesh switch (opt->prod_type) { 280b01974daSPavan Nikhilesh default: 281b01974daSPavan Nikhilesh case EVT_PROD_TYPE_SYNT: 282b01974daSPavan Nikhilesh snprintf(name, EVT_PROD_MAX_NAME_LEN, 283b01974daSPavan Nikhilesh "Synthetic producer lcores"); 284b01974daSPavan Nikhilesh break; 285b01974daSPavan Nikhilesh case EVT_PROD_TYPE_ETH_RX_ADPTR: 286b01974daSPavan Nikhilesh snprintf(name, EVT_PROD_MAX_NAME_LEN, 287b01974daSPavan Nikhilesh "Ethdev Rx Adapter producers"); 288d9a42a69SThomas Monjalon evt_dump("nb_ethdev", "%d", rte_eth_dev_count_avail()); 289d008f20bSPavan Nikhilesh break; 290d008f20bSPavan Nikhilesh case EVT_PROD_TYPE_EVENT_TIMER_ADPTR: 29117b22d0bSPavan Nikhilesh if (opt->timdev_use_burst) 29217b22d0bSPavan Nikhilesh snprintf(name, EVT_PROD_MAX_NAME_LEN, 29317b22d0bSPavan Nikhilesh "Event timer adapter burst mode producer"); 29417b22d0bSPavan Nikhilesh else 295d008f20bSPavan Nikhilesh snprintf(name, EVT_PROD_MAX_NAME_LEN, 296d008f20bSPavan Nikhilesh "Event timer adapter producer"); 297d008f20bSPavan Nikhilesh evt_dump("nb_timer_adapters", "%d", opt->nb_timer_adptrs); 298d008f20bSPavan Nikhilesh evt_dump("max_tmo_nsec", "%"PRIu64"", opt->max_tmo_nsec); 299d008f20bSPavan Nikhilesh evt_dump("expiry_nsec", "%"PRIu64"", opt->expiry_nsec); 300d008f20bSPavan Nikhilesh if (opt->optm_timer_tick_nsec) 3019e596d88SPavan Nikhilesh evt_dump("optm_timer_tick_nsec", "%"PRIu64"", 302d008f20bSPavan Nikhilesh opt->optm_timer_tick_nsec); 303d008f20bSPavan Nikhilesh else 3049e596d88SPavan Nikhilesh evt_dump("timer_tick_nsec", "%"PRIu64"", 305d008f20bSPavan Nikhilesh opt->timer_tick_nsec); 306b01974daSPavan Nikhilesh break; 307de2bc16eSShijith Thotton case EVT_PROD_TYPE_EVENT_CRYPTO_ADPTR: 308de2bc16eSShijith Thotton snprintf(name, EVT_PROD_MAX_NAME_LEN, 309de2bc16eSShijith Thotton "Event crypto adapter producers"); 310de2bc16eSShijith Thotton evt_dump("crypto adapter mode", "%s", 311de2bc16eSShijith Thotton opt->crypto_adptr_mode ? "OP_FORWARD" : "OP_NEW"); 3128f5b5495SAkhil Goyal evt_dump("crypto op type", "%s", 3138f5b5495SAkhil Goyal (opt->crypto_op_type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) ? 3148f5b5495SAkhil Goyal "SYMMETRIC" : "ASYMMETRIC"); 315de2bc16eSShijith Thotton evt_dump("nb_cryptodev", "%u", rte_cryptodev_count()); 316750ab9d5SAakash Sasidharan if (opt->crypto_op_type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) { 317750ab9d5SAakash Sasidharan evt_dump("cipher algo", "%s", 318750ab9d5SAakash Sasidharan rte_cryptodev_get_cipher_algo_string(opt->crypto_cipher_alg)); 319750ab9d5SAakash Sasidharan evt_dump("cipher key sz", "%u", 320750ab9d5SAakash Sasidharan opt->crypto_cipher_key_sz); 321750ab9d5SAakash Sasidharan evt_dump("cipher iv sz", "%u", opt->crypto_cipher_iv_sz); 322750ab9d5SAakash Sasidharan } 323de2bc16eSShijith Thotton break; 324b25a66c4SAmit Prakash Shukla case EVT_PROD_TYPE_EVENT_DMA_ADPTR: 325b25a66c4SAmit Prakash Shukla snprintf(name, EVT_PROD_MAX_NAME_LEN, 326b25a66c4SAmit Prakash Shukla "Event dma adapter producers"); 327b25a66c4SAmit Prakash Shukla evt_dump("dma adapter mode", "%s", 328b25a66c4SAmit Prakash Shukla opt->dma_adptr_mode ? "OP_FORWARD" : "OP_NEW"); 329b25a66c4SAmit Prakash Shukla evt_dump("nb_dmadev", "%u", rte_dma_count_avail()); 330b25a66c4SAmit Prakash Shukla break; 331b25a66c4SAmit Prakash Shukla 332b01974daSPavan Nikhilesh } 333b01974daSPavan Nikhilesh evt_dump("prod_type", "%s", name); 334b01974daSPavan Nikhilesh } 335b01974daSPavan Nikhilesh 3360add6c27SJerin Jacob #endif /* _EVT_OPTIONS_ */ 337