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> 12*de2bc16eSShijith 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") 37*de2bc16eSShijith Thotton #define EVT_PROD_CRYPTODEV ("prod_type_cryptodev") 38d008f20bSPavan Nikhilesh #define EVT_PROD_TIMERDEV ("prod_type_timerdev") 3917b22d0bSPavan Nikhilesh #define EVT_PROD_TIMERDEV_BURST ("prod_type_timerdev_burst") 40*de2bc16eSShijith Thotton #define EVT_CRYPTO_ADPTR_MODE ("crypto_adptr_mode") 4198c62921SPavan Nikhilesh #define EVT_NB_TIMERS ("nb_timers") 4298c62921SPavan Nikhilesh #define EVT_NB_TIMER_ADPTRS ("nb_timer_adptrs") 439e596d88SPavan Nikhilesh #define EVT_TIMER_TICK_NSEC ("timer_tick_nsec") 4498c62921SPavan Nikhilesh #define EVT_MAX_TMO_NSEC ("max_tmo_nsec") 459e596d88SPavan Nikhilesh #define EVT_EXPIRY_NSEC ("expiry_nsec") 46fc8b96fbSPavan Nikhilesh #define EVT_MBUF_SZ ("mbuf_sz") 47fc8b96fbSPavan Nikhilesh #define EVT_MAX_PKT_SZ ("max_pkt_sz") 4820841a25SRashmi Shetty #define EVT_PROD_ENQ_BURST_SZ ("prod_enq_burst_sz") 492eaa37b8SPavan Nikhilesh #define EVT_NB_ETH_QUEUES ("nb_eth_queues") 502eaa37b8SPavan Nikhilesh #define EVT_ENA_VECTOR ("enable_vector") 512eaa37b8SPavan Nikhilesh #define EVT_VECTOR_SZ ("vector_size") 522eaa37b8SPavan Nikhilesh #define EVT_VECTOR_TMO ("vector_tmo_ns") 53dbd4defeSPavan Nikhilesh #define EVT_PER_PORT_POOL ("per_port_pool") 544afd440eSGuduri Prathyusha #define EVT_HELP ("help") 554afd440eSGuduri Prathyusha 560add6c27SJerin Jacob void evt_options_default(struct evt_options *opt); 574afd440eSGuduri Prathyusha int evt_options_parse(struct evt_options *opt, int argc, char **argv); 5889e84026SJerin Jacob void evt_options_dump(struct evt_options *opt); 590add6c27SJerin Jacob 603c59fb10SJerin Jacob /* options check helpers */ 613c59fb10SJerin Jacob static inline bool 623c59fb10SJerin Jacob evt_lcores_has_overlap(bool lcores[], int lcore) 633c59fb10SJerin Jacob { 643c59fb10SJerin Jacob if (lcores[lcore] == true) { 653c59fb10SJerin Jacob evt_err("lcore overlaps at %d", lcore); 663c59fb10SJerin Jacob return true; 673c59fb10SJerin Jacob } 683c59fb10SJerin Jacob 693c59fb10SJerin Jacob return false; 703c59fb10SJerin Jacob } 713c59fb10SJerin Jacob 723c59fb10SJerin Jacob static inline bool 733c59fb10SJerin Jacob evt_lcores_has_overlap_multi(bool lcoresx[], bool lcoresy[]) 743c59fb10SJerin Jacob { 753c59fb10SJerin Jacob int i; 763c59fb10SJerin Jacob 773c59fb10SJerin Jacob for (i = 0; i < RTE_MAX_LCORE; i++) { 783c59fb10SJerin Jacob if (lcoresx[i] && lcoresy[i]) { 793c59fb10SJerin Jacob evt_err("lcores overlaps at %d", i); 803c59fb10SJerin Jacob return true; 813c59fb10SJerin Jacob } 823c59fb10SJerin Jacob } 833c59fb10SJerin Jacob return false; 843c59fb10SJerin Jacob } 853c59fb10SJerin Jacob 863c59fb10SJerin Jacob static inline bool 873c59fb10SJerin Jacob evt_has_active_lcore(bool lcores[]) 883c59fb10SJerin Jacob { 893c59fb10SJerin Jacob int i; 903c59fb10SJerin Jacob 913c59fb10SJerin Jacob for (i = 0; i < RTE_MAX_LCORE; i++) 923c59fb10SJerin Jacob if (lcores[i]) 933c59fb10SJerin Jacob return true; 943c59fb10SJerin Jacob return false; 953c59fb10SJerin Jacob } 963c59fb10SJerin Jacob 973c59fb10SJerin Jacob static inline int 983c59fb10SJerin Jacob evt_nr_active_lcores(bool lcores[]) 993c59fb10SJerin Jacob { 1003c59fb10SJerin Jacob int i; 1013c59fb10SJerin Jacob int c = 0; 1023c59fb10SJerin Jacob 1033c59fb10SJerin Jacob for (i = 0; i < RTE_MAX_LCORE; i++) 1043c59fb10SJerin Jacob if (lcores[i]) 1053c59fb10SJerin Jacob c++; 1063c59fb10SJerin Jacob return c; 1073c59fb10SJerin Jacob } 1083c59fb10SJerin Jacob 1093c59fb10SJerin Jacob static inline int 1103c59fb10SJerin Jacob evt_get_first_active_lcore(bool lcores[]) 1113c59fb10SJerin Jacob { 1123c59fb10SJerin Jacob int i; 1133c59fb10SJerin Jacob 1143c59fb10SJerin Jacob for (i = 0; i < RTE_MAX_LCORE; i++) 1153c59fb10SJerin Jacob if (lcores[i]) 1163c59fb10SJerin Jacob return i; 1173c59fb10SJerin Jacob return -1; 1183c59fb10SJerin Jacob } 1193c59fb10SJerin Jacob 1203c59fb10SJerin Jacob static inline bool 1213c59fb10SJerin Jacob evt_has_disabled_lcore(bool lcores[]) 1223c59fb10SJerin Jacob { 1233c59fb10SJerin Jacob int i; 1243c59fb10SJerin Jacob 1253c59fb10SJerin Jacob for (i = 0; i < RTE_MAX_LCORE; i++) 1263c59fb10SJerin Jacob if ((lcores[i] == true) && !(rte_lcore_is_enabled(i))) 1273c59fb10SJerin Jacob return true; 1283c59fb10SJerin Jacob return false; 1293c59fb10SJerin Jacob } 1303c59fb10SJerin Jacob 1313c59fb10SJerin Jacob static inline bool 1323c59fb10SJerin Jacob evt_has_invalid_stage(struct evt_options *opt) 1333c59fb10SJerin Jacob { 1343c59fb10SJerin Jacob if (!opt->nb_stages) { 1353c59fb10SJerin Jacob evt_err("need minimum one stage, check --stlist"); 1363c59fb10SJerin Jacob return true; 1373c59fb10SJerin Jacob } 1383c59fb10SJerin Jacob if (opt->nb_stages > EVT_MAX_STAGES) { 1393c59fb10SJerin Jacob evt_err("requested changes are beyond EVT_MAX_STAGES=%d", 1403c59fb10SJerin Jacob EVT_MAX_STAGES); 1413c59fb10SJerin Jacob return true; 1423c59fb10SJerin Jacob } 1433c59fb10SJerin Jacob return false; 1443c59fb10SJerin Jacob } 1453c59fb10SJerin Jacob 1463c59fb10SJerin Jacob static inline bool 1473c59fb10SJerin Jacob evt_has_invalid_sched_type(struct evt_options *opt) 1483c59fb10SJerin Jacob { 1493c59fb10SJerin Jacob int i; 1503c59fb10SJerin Jacob 1513c59fb10SJerin Jacob for (i = 0; i < opt->nb_stages; i++) { 1523c59fb10SJerin Jacob if (opt->sched_type_list[i] > RTE_SCHED_TYPE_PARALLEL) { 1533c59fb10SJerin Jacob evt_err("invalid sched_type %d at %d", 1543c59fb10SJerin Jacob opt->sched_type_list[i], i); 1553c59fb10SJerin Jacob return true; 1563c59fb10SJerin Jacob } 1573c59fb10SJerin Jacob } 1583c59fb10SJerin Jacob return false; 1593c59fb10SJerin Jacob } 1603c59fb10SJerin Jacob 16189e84026SJerin Jacob /* option dump helpers */ 16289e84026SJerin Jacob static inline void 16389e84026SJerin Jacob evt_dump_worker_lcores(struct evt_options *opt) 16489e84026SJerin Jacob { 16589e84026SJerin Jacob int c; 16689e84026SJerin Jacob 16789e84026SJerin Jacob evt_dump_begin("worker lcores"); 16889e84026SJerin Jacob for (c = 0; c < RTE_MAX_LCORE; c++) { 16989e84026SJerin Jacob if (opt->wlcores[c]) 17089e84026SJerin Jacob printf("%d ", c); 17189e84026SJerin Jacob } 17289e84026SJerin Jacob evt_dump_end; 17389e84026SJerin Jacob } 17489e84026SJerin Jacob 17589e84026SJerin Jacob static inline void 17689e84026SJerin Jacob evt_dump_producer_lcores(struct evt_options *opt) 17789e84026SJerin Jacob { 17889e84026SJerin Jacob int c; 17989e84026SJerin Jacob 18089e84026SJerin Jacob evt_dump_begin("producer lcores"); 18189e84026SJerin Jacob for (c = 0; c < RTE_MAX_LCORE; c++) { 18289e84026SJerin Jacob if (opt->plcores[c]) 18389e84026SJerin Jacob printf("%d ", c); 18489e84026SJerin Jacob } 18589e84026SJerin Jacob evt_dump_end; 18689e84026SJerin Jacob } 18789e84026SJerin Jacob 18889e84026SJerin Jacob static inline void 18989e84026SJerin Jacob evt_dump_nb_flows(struct evt_options *opt) 19089e84026SJerin Jacob { 19189e84026SJerin Jacob evt_dump("nb_flows", "%d", opt->nb_flows); 19289e84026SJerin Jacob } 19389e84026SJerin Jacob 19489e84026SJerin Jacob static inline void 19589e84026SJerin Jacob evt_dump_worker_dequeue_depth(struct evt_options *opt) 19689e84026SJerin Jacob { 19789e84026SJerin Jacob evt_dump("worker deq depth", "%d", opt->wkr_deq_dep); 19889e84026SJerin Jacob } 19989e84026SJerin Jacob 20089e84026SJerin Jacob static inline void 20189e84026SJerin Jacob evt_dump_nb_stages(struct evt_options *opt) 20289e84026SJerin Jacob { 20389e84026SJerin Jacob evt_dump("nb_stages", "%d", opt->nb_stages); 20489e84026SJerin Jacob } 20589e84026SJerin Jacob 20689e84026SJerin Jacob static inline void 20789e84026SJerin Jacob evt_dump_fwd_latency(struct evt_options *opt) 20889e84026SJerin Jacob { 20989e84026SJerin Jacob evt_dump("fwd_latency", "%s", EVT_BOOL_FMT(opt->fwd_latency)); 21089e84026SJerin Jacob } 21189e84026SJerin Jacob 21289e84026SJerin Jacob static inline void 21389e84026SJerin Jacob evt_dump_queue_priority(struct evt_options *opt) 21489e84026SJerin Jacob { 21589e84026SJerin Jacob evt_dump("queue_priority", "%s", EVT_BOOL_FMT(opt->q_priority)); 21689e84026SJerin Jacob } 21789e84026SJerin Jacob 21889e84026SJerin Jacob static inline const char* 21989e84026SJerin Jacob evt_sched_type_2_str(uint8_t sched_type) 22089e84026SJerin Jacob { 22189e84026SJerin Jacob 22289e84026SJerin Jacob if (sched_type == RTE_SCHED_TYPE_ORDERED) 22389e84026SJerin Jacob return "O"; 22489e84026SJerin Jacob else if (sched_type == RTE_SCHED_TYPE_ATOMIC) 22589e84026SJerin Jacob return "A"; 22689e84026SJerin Jacob else if (sched_type == RTE_SCHED_TYPE_PARALLEL) 22789e84026SJerin Jacob return "P"; 22889e84026SJerin Jacob else 22989e84026SJerin Jacob return "I"; 23089e84026SJerin Jacob } 23189e84026SJerin Jacob 23289e84026SJerin Jacob static inline void 23389e84026SJerin Jacob evt_dump_sched_type_list(struct evt_options *opt) 23489e84026SJerin Jacob { 23589e84026SJerin Jacob int i; 23689e84026SJerin Jacob 23789e84026SJerin Jacob evt_dump_begin("sched_type_list"); 23889e84026SJerin Jacob for (i = 0; i < opt->nb_stages; i++) 23989e84026SJerin Jacob printf("%s ", evt_sched_type_2_str(opt->sched_type_list[i])); 24089e84026SJerin Jacob 24189e84026SJerin Jacob evt_dump_end; 24289e84026SJerin Jacob } 2433c59fb10SJerin Jacob 2449fdc9986SPavan Nikhilesh static inline const char * 2459fdc9986SPavan Nikhilesh evt_prod_id_to_name(enum evt_prod_type prod_type) 2469fdc9986SPavan Nikhilesh { 2479fdc9986SPavan Nikhilesh switch (prod_type) { 2489fdc9986SPavan Nikhilesh default: 2499fdc9986SPavan Nikhilesh case EVT_PROD_TYPE_SYNT: 2509fdc9986SPavan Nikhilesh return "Synthetic producer lcores"; 2519fdc9986SPavan Nikhilesh case EVT_PROD_TYPE_ETH_RX_ADPTR: 2529fdc9986SPavan Nikhilesh return "Ethdev Rx Adapter"; 2539fdc9986SPavan Nikhilesh case EVT_PROD_TYPE_EVENT_TIMER_ADPTR: 2549fdc9986SPavan Nikhilesh return "Event timer adapter"; 255*de2bc16eSShijith Thotton case EVT_PROD_TYPE_EVENT_CRYPTO_ADPTR: 256*de2bc16eSShijith Thotton return "Event crypto adapter"; 2579fdc9986SPavan Nikhilesh } 2589fdc9986SPavan Nikhilesh 2599fdc9986SPavan Nikhilesh return ""; 2609fdc9986SPavan Nikhilesh } 2619fdc9986SPavan Nikhilesh 262b01974daSPavan Nikhilesh #define EVT_PROD_MAX_NAME_LEN 50 263b01974daSPavan Nikhilesh static inline void 264b01974daSPavan Nikhilesh evt_dump_producer_type(struct evt_options *opt) 265b01974daSPavan Nikhilesh { 266b01974daSPavan Nikhilesh char name[EVT_PROD_MAX_NAME_LEN]; 267b01974daSPavan Nikhilesh 268b01974daSPavan Nikhilesh switch (opt->prod_type) { 269b01974daSPavan Nikhilesh default: 270b01974daSPavan Nikhilesh case EVT_PROD_TYPE_SYNT: 271b01974daSPavan Nikhilesh snprintf(name, EVT_PROD_MAX_NAME_LEN, 272b01974daSPavan Nikhilesh "Synthetic producer lcores"); 273b01974daSPavan Nikhilesh break; 274b01974daSPavan Nikhilesh case EVT_PROD_TYPE_ETH_RX_ADPTR: 275b01974daSPavan Nikhilesh snprintf(name, EVT_PROD_MAX_NAME_LEN, 276b01974daSPavan Nikhilesh "Ethdev Rx Adapter producers"); 277d9a42a69SThomas Monjalon evt_dump("nb_ethdev", "%d", rte_eth_dev_count_avail()); 278d008f20bSPavan Nikhilesh break; 279d008f20bSPavan Nikhilesh case EVT_PROD_TYPE_EVENT_TIMER_ADPTR: 28017b22d0bSPavan Nikhilesh if (opt->timdev_use_burst) 28117b22d0bSPavan Nikhilesh snprintf(name, EVT_PROD_MAX_NAME_LEN, 28217b22d0bSPavan Nikhilesh "Event timer adapter burst mode producer"); 28317b22d0bSPavan Nikhilesh else 284d008f20bSPavan Nikhilesh snprintf(name, EVT_PROD_MAX_NAME_LEN, 285d008f20bSPavan Nikhilesh "Event timer adapter producer"); 286d008f20bSPavan Nikhilesh evt_dump("nb_timer_adapters", "%d", opt->nb_timer_adptrs); 287d008f20bSPavan Nikhilesh evt_dump("max_tmo_nsec", "%"PRIu64"", opt->max_tmo_nsec); 288d008f20bSPavan Nikhilesh evt_dump("expiry_nsec", "%"PRIu64"", opt->expiry_nsec); 289d008f20bSPavan Nikhilesh if (opt->optm_timer_tick_nsec) 2909e596d88SPavan Nikhilesh evt_dump("optm_timer_tick_nsec", "%"PRIu64"", 291d008f20bSPavan Nikhilesh opt->optm_timer_tick_nsec); 292d008f20bSPavan Nikhilesh else 2939e596d88SPavan Nikhilesh evt_dump("timer_tick_nsec", "%"PRIu64"", 294d008f20bSPavan Nikhilesh opt->timer_tick_nsec); 295b01974daSPavan Nikhilesh break; 296*de2bc16eSShijith Thotton case EVT_PROD_TYPE_EVENT_CRYPTO_ADPTR: 297*de2bc16eSShijith Thotton snprintf(name, EVT_PROD_MAX_NAME_LEN, 298*de2bc16eSShijith Thotton "Event crypto adapter producers"); 299*de2bc16eSShijith Thotton evt_dump("crypto adapter mode", "%s", 300*de2bc16eSShijith Thotton opt->crypto_adptr_mode ? "OP_FORWARD" : "OP_NEW"); 301*de2bc16eSShijith Thotton evt_dump("nb_cryptodev", "%u", rte_cryptodev_count()); 302*de2bc16eSShijith Thotton break; 303b01974daSPavan Nikhilesh } 304b01974daSPavan Nikhilesh evt_dump("prod_type", "%s", name); 305b01974daSPavan Nikhilesh } 306b01974daSPavan Nikhilesh 3070add6c27SJerin Jacob #endif /* _EVT_OPTIONS_ */ 308