xref: /dpdk/app/test-eventdev/evt_common.h (revision fc8b96fbc060ad72d5f1d555ae9c4eac93669d5c)
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