153a3b7e8SJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause 253a3b7e8SJerin Jacob * Copyright(c) 2017 Cavium, Inc 368cdc3dfSJerin Jacob */ 468cdc3dfSJerin Jacob 568cdc3dfSJerin Jacob #ifndef _EVT_COMMON_ 668cdc3dfSJerin Jacob #define _EVT_COMMON_ 768cdc3dfSJerin Jacob 868cdc3dfSJerin Jacob #include <rte_common.h> 968cdc3dfSJerin Jacob #include <rte_debug.h> 1068cdc3dfSJerin Jacob #include <rte_eventdev.h> 1157305d79SPavan Nikhilesh #include <rte_service.h> 1268cdc3dfSJerin Jacob 1368cdc3dfSJerin Jacob #define CLNRM "\x1b[0m" 1468cdc3dfSJerin Jacob #define CLRED "\x1b[31m" 1568cdc3dfSJerin Jacob #define CLGRN "\x1b[32m" 1668cdc3dfSJerin Jacob #define CLYEL "\x1b[33m" 1768cdc3dfSJerin Jacob 1868cdc3dfSJerin Jacob #define evt_err(fmt, args...) \ 1968cdc3dfSJerin Jacob fprintf(stderr, CLRED"error: %s() "fmt CLNRM "\n", __func__, ## args) 2068cdc3dfSJerin Jacob 2168cdc3dfSJerin Jacob #define evt_info(fmt, args...) \ 2268cdc3dfSJerin Jacob fprintf(stdout, CLYEL""fmt CLNRM "\n", ## args) 2368cdc3dfSJerin Jacob 2468cdc3dfSJerin Jacob #define EVT_STR_FMT 20 2568cdc3dfSJerin Jacob 2668cdc3dfSJerin Jacob #define evt_dump(str, fmt, val...) \ 2768cdc3dfSJerin Jacob printf("\t%-*s : "fmt"\n", EVT_STR_FMT, str, ## val) 2868cdc3dfSJerin Jacob 2968cdc3dfSJerin Jacob #define evt_dump_begin(str) printf("\t%-*s : {", EVT_STR_FMT, str) 3068cdc3dfSJerin Jacob 3168cdc3dfSJerin Jacob #define evt_dump_end printf("\b}\n") 3268cdc3dfSJerin Jacob 3368cdc3dfSJerin Jacob #define EVT_MAX_STAGES 64 3468cdc3dfSJerin Jacob #define EVT_MAX_PORTS 256 3568cdc3dfSJerin Jacob #define EVT_MAX_QUEUES 256 3668cdc3dfSJerin Jacob 37f0959283SPavan Nikhilesh enum evt_prod_type { 38f0959283SPavan Nikhilesh EVT_PROD_TYPE_NONE, 39f0959283SPavan Nikhilesh EVT_PROD_TYPE_SYNT, /* Producer type Synthetic i.e. CPU. */ 40f0959283SPavan Nikhilesh EVT_PROD_TYPE_ETH_RX_ADPTR, /* Producer type Eth Rx Adapter. */ 41f0959283SPavan Nikhilesh EVT_PROD_TYPE_EVENT_TIMER_ADPTR, /* Producer type Timer Adapter. */ 42f0959283SPavan Nikhilesh EVT_PROD_TYPE_MAX, 43f0959283SPavan Nikhilesh }; 44f0959283SPavan Nikhilesh 45f0959283SPavan Nikhilesh struct evt_options { 46f0959283SPavan Nikhilesh #define EVT_TEST_NAME_MAX_LEN 32 47f0959283SPavan Nikhilesh char test_name[EVT_TEST_NAME_MAX_LEN]; 48f0959283SPavan Nikhilesh bool plcores[RTE_MAX_LCORE]; 49f0959283SPavan Nikhilesh bool wlcores[RTE_MAX_LCORE]; 50f0959283SPavan Nikhilesh int pool_sz; 51*fc8b96fbSPavan Nikhilesh int socket_id; 52f0959283SPavan Nikhilesh int nb_stages; 53f0959283SPavan Nikhilesh int verbose_level; 54*fc8b96fbSPavan Nikhilesh uint8_t dev_id; 55*fc8b96fbSPavan Nikhilesh uint8_t timdev_cnt; 56f0959283SPavan Nikhilesh uint8_t nb_timer_adptrs; 57*fc8b96fbSPavan Nikhilesh uint8_t timdev_use_burst; 58*fc8b96fbSPavan Nikhilesh uint8_t sched_type_list[EVT_MAX_STAGES]; 59*fc8b96fbSPavan Nikhilesh uint16_t mbuf_sz; 60*fc8b96fbSPavan Nikhilesh uint16_t wkr_deq_dep; 61*fc8b96fbSPavan Nikhilesh uint32_t nb_flows; 62*fc8b96fbSPavan Nikhilesh uint32_t tx_first; 63*fc8b96fbSPavan Nikhilesh uint32_t max_pkt_sz; 64*fc8b96fbSPavan Nikhilesh uint32_t deq_tmo_nsec; 65*fc8b96fbSPavan Nikhilesh uint32_t q_priority:1; 66*fc8b96fbSPavan Nikhilesh uint32_t fwd_latency:1; 67*fc8b96fbSPavan Nikhilesh uint64_t nb_pkts; 68f0959283SPavan Nikhilesh uint64_t nb_timers; 69*fc8b96fbSPavan Nikhilesh uint64_t expiry_nsec; 70*fc8b96fbSPavan Nikhilesh uint64_t max_tmo_nsec; 71f0959283SPavan Nikhilesh uint64_t timer_tick_nsec; 72f0959283SPavan Nikhilesh uint64_t optm_timer_tick_nsec; 73f0959283SPavan Nikhilesh enum evt_prod_type prod_type; 74f0959283SPavan Nikhilesh }; 75f0959283SPavan Nikhilesh 7668cdc3dfSJerin Jacob static inline bool 7768cdc3dfSJerin Jacob evt_has_distributed_sched(uint8_t dev_id) 7868cdc3dfSJerin Jacob { 7968cdc3dfSJerin Jacob struct rte_event_dev_info dev_info; 8068cdc3dfSJerin Jacob 8168cdc3dfSJerin Jacob rte_event_dev_info_get(dev_id, &dev_info); 8268cdc3dfSJerin Jacob return (dev_info.event_dev_cap & RTE_EVENT_DEV_CAP_DISTRIBUTED_SCHED) ? 8368cdc3dfSJerin Jacob true : false; 8468cdc3dfSJerin Jacob } 8568cdc3dfSJerin Jacob 8668cdc3dfSJerin Jacob static inline bool 8768cdc3dfSJerin Jacob evt_has_burst_mode(uint8_t dev_id) 8868cdc3dfSJerin Jacob { 8968cdc3dfSJerin Jacob struct rte_event_dev_info dev_info; 9068cdc3dfSJerin Jacob 9168cdc3dfSJerin Jacob rte_event_dev_info_get(dev_id, &dev_info); 9268cdc3dfSJerin Jacob return (dev_info.event_dev_cap & RTE_EVENT_DEV_CAP_BURST_MODE) ? 9368cdc3dfSJerin Jacob true : false; 9468cdc3dfSJerin Jacob } 9568cdc3dfSJerin Jacob 9668cdc3dfSJerin Jacob 9768cdc3dfSJerin Jacob static inline bool 9868cdc3dfSJerin Jacob evt_has_all_types_queue(uint8_t dev_id) 9968cdc3dfSJerin Jacob { 10068cdc3dfSJerin Jacob struct rte_event_dev_info dev_info; 10168cdc3dfSJerin Jacob 10268cdc3dfSJerin Jacob rte_event_dev_info_get(dev_id, &dev_info); 10368cdc3dfSJerin Jacob return (dev_info.event_dev_cap & RTE_EVENT_DEV_CAP_QUEUE_ALL_TYPES) ? 10468cdc3dfSJerin Jacob true : false; 10568cdc3dfSJerin Jacob } 10668cdc3dfSJerin Jacob 10757305d79SPavan Nikhilesh static inline int 108b0333c55SPavan Nikhilesh evt_service_setup(uint32_t service_id) 10957305d79SPavan Nikhilesh { 11057305d79SPavan Nikhilesh int32_t core_cnt; 11157305d79SPavan Nikhilesh unsigned int lcore = 0; 11257305d79SPavan Nikhilesh uint32_t core_array[RTE_MAX_LCORE]; 11357305d79SPavan Nikhilesh uint8_t cnt; 11457305d79SPavan Nikhilesh uint8_t min_cnt = UINT8_MAX; 11557305d79SPavan Nikhilesh 11657305d79SPavan Nikhilesh if (!rte_service_lcore_count()) 11757305d79SPavan Nikhilesh return -ENOENT; 11857305d79SPavan Nikhilesh 11957305d79SPavan Nikhilesh core_cnt = rte_service_lcore_list(core_array, 12057305d79SPavan Nikhilesh RTE_MAX_LCORE); 12157305d79SPavan Nikhilesh if (core_cnt < 0) 12257305d79SPavan Nikhilesh return -ENOENT; 12357305d79SPavan Nikhilesh /* Get the core which has least number of services running. */ 12457305d79SPavan Nikhilesh while (core_cnt--) { 12557305d79SPavan Nikhilesh /* Reset default mapping */ 12657305d79SPavan Nikhilesh rte_service_map_lcore_set(service_id, 12757305d79SPavan Nikhilesh core_array[core_cnt], 0); 12857305d79SPavan Nikhilesh cnt = rte_service_lcore_count_services( 12957305d79SPavan Nikhilesh core_array[core_cnt]); 13057305d79SPavan Nikhilesh if (cnt < min_cnt) { 13157305d79SPavan Nikhilesh lcore = core_array[core_cnt]; 13257305d79SPavan Nikhilesh min_cnt = cnt; 13357305d79SPavan Nikhilesh } 13457305d79SPavan Nikhilesh } 13557305d79SPavan Nikhilesh if (rte_service_map_lcore_set(service_id, lcore, 1)) 13657305d79SPavan Nikhilesh return -ENOENT; 137b0333c55SPavan Nikhilesh 13857305d79SPavan Nikhilesh return 0; 13957305d79SPavan Nikhilesh } 14057305d79SPavan Nikhilesh 141f0959283SPavan Nikhilesh static inline int 142f0959283SPavan Nikhilesh evt_configure_eventdev(struct evt_options *opt, uint8_t nb_queues, 143f0959283SPavan Nikhilesh uint8_t nb_ports) 144f0959283SPavan Nikhilesh { 145f0959283SPavan Nikhilesh struct rte_event_dev_info info; 146f0959283SPavan Nikhilesh int ret; 147f0959283SPavan Nikhilesh 148f0959283SPavan Nikhilesh memset(&info, 0, sizeof(struct rte_event_dev_info)); 149f0959283SPavan Nikhilesh ret = rte_event_dev_info_get(opt->dev_id, &info); 150f0959283SPavan Nikhilesh if (ret) { 151f0959283SPavan Nikhilesh evt_err("failed to get eventdev info %d", opt->dev_id); 152f0959283SPavan Nikhilesh return ret; 153f0959283SPavan Nikhilesh } 154f0959283SPavan Nikhilesh 155f0959283SPavan Nikhilesh if (opt->deq_tmo_nsec) { 156f0959283SPavan Nikhilesh if (opt->deq_tmo_nsec < info.min_dequeue_timeout_ns) { 157f0959283SPavan Nikhilesh opt->deq_tmo_nsec = info.min_dequeue_timeout_ns; 158f0959283SPavan Nikhilesh evt_info("dequeue_timeout_ns too low, using %d", 159f0959283SPavan Nikhilesh opt->deq_tmo_nsec); 160f0959283SPavan Nikhilesh } 161f0959283SPavan Nikhilesh if (opt->deq_tmo_nsec > info.max_dequeue_timeout_ns) { 162f0959283SPavan Nikhilesh opt->deq_tmo_nsec = info.max_dequeue_timeout_ns; 163f0959283SPavan Nikhilesh evt_info("dequeue_timeout_ns too high, using %d", 164f0959283SPavan Nikhilesh opt->deq_tmo_nsec); 165f0959283SPavan Nikhilesh } 166f0959283SPavan Nikhilesh } 167f0959283SPavan Nikhilesh 168f0959283SPavan Nikhilesh const struct rte_event_dev_config config = { 169f0959283SPavan Nikhilesh .dequeue_timeout_ns = opt->deq_tmo_nsec, 170f0959283SPavan Nikhilesh .nb_event_queues = nb_queues, 171f0959283SPavan Nikhilesh .nb_event_ports = nb_ports, 172f0959283SPavan Nikhilesh .nb_events_limit = info.max_num_events, 173f0959283SPavan Nikhilesh .nb_event_queue_flows = opt->nb_flows, 174f0959283SPavan Nikhilesh .nb_event_port_dequeue_depth = 175f0959283SPavan Nikhilesh info.max_event_port_dequeue_depth, 176f0959283SPavan Nikhilesh .nb_event_port_enqueue_depth = 177f0959283SPavan Nikhilesh info.max_event_port_enqueue_depth, 178f0959283SPavan Nikhilesh }; 179f0959283SPavan Nikhilesh 180f0959283SPavan Nikhilesh return rte_event_dev_configure(opt->dev_id, &config); 181f0959283SPavan Nikhilesh } 182f0959283SPavan Nikhilesh 18368cdc3dfSJerin Jacob #endif /* _EVT_COMMON_*/ 184