1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606 * Copyright(c) 2017 Cavium, Inc
32bfe3f2eSlogwang */
42bfe3f2eSlogwang
52bfe3f2eSlogwang #ifndef _EVT_COMMON_
62bfe3f2eSlogwang #define _EVT_COMMON_
72bfe3f2eSlogwang
82bfe3f2eSlogwang #include <rte_common.h>
92bfe3f2eSlogwang #include <rte_debug.h>
102bfe3f2eSlogwang #include <rte_eventdev.h>
112bfe3f2eSlogwang #include <rte_service.h>
122bfe3f2eSlogwang
132bfe3f2eSlogwang #define CLNRM "\x1b[0m"
142bfe3f2eSlogwang #define CLRED "\x1b[31m"
152bfe3f2eSlogwang #define CLGRN "\x1b[32m"
162bfe3f2eSlogwang #define CLYEL "\x1b[33m"
172bfe3f2eSlogwang
182bfe3f2eSlogwang #define evt_err(fmt, args...) \
192bfe3f2eSlogwang fprintf(stderr, CLRED"error: %s() "fmt CLNRM "\n", __func__, ## args)
202bfe3f2eSlogwang
212bfe3f2eSlogwang #define evt_info(fmt, args...) \
222bfe3f2eSlogwang fprintf(stdout, CLYEL""fmt CLNRM "\n", ## args)
232bfe3f2eSlogwang
242bfe3f2eSlogwang #define EVT_STR_FMT 20
252bfe3f2eSlogwang
262bfe3f2eSlogwang #define evt_dump(str, fmt, val...) \
272bfe3f2eSlogwang printf("\t%-*s : "fmt"\n", EVT_STR_FMT, str, ## val)
282bfe3f2eSlogwang
292bfe3f2eSlogwang #define evt_dump_begin(str) printf("\t%-*s : {", EVT_STR_FMT, str)
302bfe3f2eSlogwang
312bfe3f2eSlogwang #define evt_dump_end printf("\b}\n")
322bfe3f2eSlogwang
332bfe3f2eSlogwang #define EVT_MAX_STAGES 64
342bfe3f2eSlogwang #define EVT_MAX_PORTS 256
352bfe3f2eSlogwang #define EVT_MAX_QUEUES 256
362bfe3f2eSlogwang
374418919fSjohnjiang enum evt_prod_type {
384418919fSjohnjiang EVT_PROD_TYPE_NONE,
394418919fSjohnjiang EVT_PROD_TYPE_SYNT, /* Producer type Synthetic i.e. CPU. */
404418919fSjohnjiang EVT_PROD_TYPE_ETH_RX_ADPTR, /* Producer type Eth Rx Adapter. */
414418919fSjohnjiang EVT_PROD_TYPE_EVENT_TIMER_ADPTR, /* Producer type Timer Adapter. */
424418919fSjohnjiang EVT_PROD_TYPE_MAX,
434418919fSjohnjiang };
444418919fSjohnjiang
454418919fSjohnjiang struct evt_options {
464418919fSjohnjiang #define EVT_TEST_NAME_MAX_LEN 32
474418919fSjohnjiang char test_name[EVT_TEST_NAME_MAX_LEN];
484418919fSjohnjiang bool plcores[RTE_MAX_LCORE];
494418919fSjohnjiang bool wlcores[RTE_MAX_LCORE];
504418919fSjohnjiang int pool_sz;
514418919fSjohnjiang int socket_id;
524418919fSjohnjiang int nb_stages;
534418919fSjohnjiang int verbose_level;
544418919fSjohnjiang uint8_t dev_id;
554418919fSjohnjiang uint8_t timdev_cnt;
564418919fSjohnjiang uint8_t nb_timer_adptrs;
574418919fSjohnjiang uint8_t timdev_use_burst;
584418919fSjohnjiang uint8_t sched_type_list[EVT_MAX_STAGES];
594418919fSjohnjiang uint16_t mbuf_sz;
604418919fSjohnjiang uint16_t wkr_deq_dep;
614418919fSjohnjiang uint32_t nb_flows;
624418919fSjohnjiang uint32_t tx_first;
634418919fSjohnjiang uint32_t max_pkt_sz;
644418919fSjohnjiang uint32_t deq_tmo_nsec;
654418919fSjohnjiang uint32_t q_priority:1;
664418919fSjohnjiang uint32_t fwd_latency:1;
674418919fSjohnjiang uint64_t nb_pkts;
684418919fSjohnjiang uint64_t nb_timers;
694418919fSjohnjiang uint64_t expiry_nsec;
704418919fSjohnjiang uint64_t max_tmo_nsec;
714418919fSjohnjiang uint64_t timer_tick_nsec;
724418919fSjohnjiang uint64_t optm_timer_tick_nsec;
734418919fSjohnjiang enum evt_prod_type prod_type;
744418919fSjohnjiang };
754418919fSjohnjiang
762bfe3f2eSlogwang static inline bool
evt_has_distributed_sched(uint8_t dev_id)772bfe3f2eSlogwang evt_has_distributed_sched(uint8_t dev_id)
782bfe3f2eSlogwang {
792bfe3f2eSlogwang struct rte_event_dev_info dev_info;
802bfe3f2eSlogwang
812bfe3f2eSlogwang rte_event_dev_info_get(dev_id, &dev_info);
822bfe3f2eSlogwang return (dev_info.event_dev_cap & RTE_EVENT_DEV_CAP_DISTRIBUTED_SCHED) ?
832bfe3f2eSlogwang true : false;
842bfe3f2eSlogwang }
852bfe3f2eSlogwang
862bfe3f2eSlogwang static inline bool
evt_has_burst_mode(uint8_t dev_id)872bfe3f2eSlogwang evt_has_burst_mode(uint8_t dev_id)
882bfe3f2eSlogwang {
892bfe3f2eSlogwang struct rte_event_dev_info dev_info;
902bfe3f2eSlogwang
912bfe3f2eSlogwang rte_event_dev_info_get(dev_id, &dev_info);
922bfe3f2eSlogwang return (dev_info.event_dev_cap & RTE_EVENT_DEV_CAP_BURST_MODE) ?
932bfe3f2eSlogwang true : false;
942bfe3f2eSlogwang }
952bfe3f2eSlogwang
962bfe3f2eSlogwang
972bfe3f2eSlogwang static inline bool
evt_has_all_types_queue(uint8_t dev_id)982bfe3f2eSlogwang evt_has_all_types_queue(uint8_t dev_id)
992bfe3f2eSlogwang {
1002bfe3f2eSlogwang struct rte_event_dev_info dev_info;
1012bfe3f2eSlogwang
1022bfe3f2eSlogwang rte_event_dev_info_get(dev_id, &dev_info);
1032bfe3f2eSlogwang return (dev_info.event_dev_cap & RTE_EVENT_DEV_CAP_QUEUE_ALL_TYPES) ?
1042bfe3f2eSlogwang true : false;
1052bfe3f2eSlogwang }
1062bfe3f2eSlogwang
107*2d9fd380Sjfb8856606 static inline bool
evt_has_flow_id(uint8_t dev_id)108*2d9fd380Sjfb8856606 evt_has_flow_id(uint8_t dev_id)
109*2d9fd380Sjfb8856606 {
110*2d9fd380Sjfb8856606 struct rte_event_dev_info dev_info;
111*2d9fd380Sjfb8856606
112*2d9fd380Sjfb8856606 rte_event_dev_info_get(dev_id, &dev_info);
113*2d9fd380Sjfb8856606 return (dev_info.event_dev_cap & RTE_EVENT_DEV_CAP_CARRY_FLOW_ID) ?
114*2d9fd380Sjfb8856606 true : false;
115*2d9fd380Sjfb8856606 }
116*2d9fd380Sjfb8856606
1172bfe3f2eSlogwang static inline int
evt_service_setup(uint32_t service_id)118d30ea906Sjfb8856606 evt_service_setup(uint32_t service_id)
1192bfe3f2eSlogwang {
1202bfe3f2eSlogwang int32_t core_cnt;
1212bfe3f2eSlogwang unsigned int lcore = 0;
1222bfe3f2eSlogwang uint32_t core_array[RTE_MAX_LCORE];
1232bfe3f2eSlogwang uint8_t cnt;
1242bfe3f2eSlogwang uint8_t min_cnt = UINT8_MAX;
1252bfe3f2eSlogwang
1262bfe3f2eSlogwang if (!rte_service_lcore_count())
1272bfe3f2eSlogwang return -ENOENT;
1282bfe3f2eSlogwang
1292bfe3f2eSlogwang core_cnt = rte_service_lcore_list(core_array,
1302bfe3f2eSlogwang RTE_MAX_LCORE);
1312bfe3f2eSlogwang if (core_cnt < 0)
1322bfe3f2eSlogwang return -ENOENT;
1332bfe3f2eSlogwang /* Get the core which has least number of services running. */
1342bfe3f2eSlogwang while (core_cnt--) {
1352bfe3f2eSlogwang /* Reset default mapping */
1362bfe3f2eSlogwang rte_service_map_lcore_set(service_id,
1372bfe3f2eSlogwang core_array[core_cnt], 0);
1382bfe3f2eSlogwang cnt = rte_service_lcore_count_services(
1392bfe3f2eSlogwang core_array[core_cnt]);
1402bfe3f2eSlogwang if (cnt < min_cnt) {
1412bfe3f2eSlogwang lcore = core_array[core_cnt];
1422bfe3f2eSlogwang min_cnt = cnt;
1432bfe3f2eSlogwang }
1442bfe3f2eSlogwang }
1452bfe3f2eSlogwang if (rte_service_map_lcore_set(service_id, lcore, 1))
1462bfe3f2eSlogwang return -ENOENT;
147d30ea906Sjfb8856606
1482bfe3f2eSlogwang return 0;
1492bfe3f2eSlogwang }
1502bfe3f2eSlogwang
1514418919fSjohnjiang static inline int
evt_configure_eventdev(struct evt_options * opt,uint8_t nb_queues,uint8_t nb_ports)1524418919fSjohnjiang evt_configure_eventdev(struct evt_options *opt, uint8_t nb_queues,
1534418919fSjohnjiang uint8_t nb_ports)
1544418919fSjohnjiang {
1554418919fSjohnjiang struct rte_event_dev_info info;
1564418919fSjohnjiang int ret;
1574418919fSjohnjiang
1584418919fSjohnjiang memset(&info, 0, sizeof(struct rte_event_dev_info));
1594418919fSjohnjiang ret = rte_event_dev_info_get(opt->dev_id, &info);
1604418919fSjohnjiang if (ret) {
1614418919fSjohnjiang evt_err("failed to get eventdev info %d", opt->dev_id);
1624418919fSjohnjiang return ret;
1634418919fSjohnjiang }
1644418919fSjohnjiang
1654418919fSjohnjiang if (opt->deq_tmo_nsec) {
1664418919fSjohnjiang if (opt->deq_tmo_nsec < info.min_dequeue_timeout_ns) {
1674418919fSjohnjiang opt->deq_tmo_nsec = info.min_dequeue_timeout_ns;
1684418919fSjohnjiang evt_info("dequeue_timeout_ns too low, using %d",
1694418919fSjohnjiang opt->deq_tmo_nsec);
1704418919fSjohnjiang }
1714418919fSjohnjiang if (opt->deq_tmo_nsec > info.max_dequeue_timeout_ns) {
1724418919fSjohnjiang opt->deq_tmo_nsec = info.max_dequeue_timeout_ns;
1734418919fSjohnjiang evt_info("dequeue_timeout_ns too high, using %d",
1744418919fSjohnjiang opt->deq_tmo_nsec);
1754418919fSjohnjiang }
1764418919fSjohnjiang }
1774418919fSjohnjiang
1784418919fSjohnjiang const struct rte_event_dev_config config = {
1794418919fSjohnjiang .dequeue_timeout_ns = opt->deq_tmo_nsec,
1804418919fSjohnjiang .nb_event_queues = nb_queues,
1814418919fSjohnjiang .nb_event_ports = nb_ports,
182*2d9fd380Sjfb8856606 .nb_single_link_event_port_queues = 0,
1834418919fSjohnjiang .nb_events_limit = info.max_num_events,
1844418919fSjohnjiang .nb_event_queue_flows = opt->nb_flows,
1854418919fSjohnjiang .nb_event_port_dequeue_depth =
1864418919fSjohnjiang info.max_event_port_dequeue_depth,
1874418919fSjohnjiang .nb_event_port_enqueue_depth =
1884418919fSjohnjiang info.max_event_port_enqueue_depth,
1894418919fSjohnjiang };
1904418919fSjohnjiang
1914418919fSjohnjiang return rte_event_dev_configure(opt->dev_id, &config);
1924418919fSjohnjiang }
1934418919fSjohnjiang
1942bfe3f2eSlogwang #endif /* _EVT_COMMON_*/
195