xref: /dpdk/app/test/test_event_timer_adapter.c (revision 14758e9a334c652b0257963b213a1fde24b458a0)
1a9de470cSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2a9de470cSBruce Richardson  * Copyright(c) 2017 Cavium, Inc
3a9de470cSBruce Richardson  * Copyright(c) 2017-2018 Intel Corporation.
4a9de470cSBruce Richardson  */
5a9de470cSBruce Richardson 
63c60274cSJie Zhou #include "test.h"
73c60274cSJie Zhou 
841f27795SPavan Nikhilesh #include <math.h>
941f27795SPavan Nikhilesh 
10a9de470cSBruce Richardson #include <rte_common.h>
11a9de470cSBruce Richardson #include <rte_cycles.h>
12a9de470cSBruce Richardson #include <rte_debug.h>
13a9de470cSBruce Richardson #include <rte_eal.h>
14a9de470cSBruce Richardson #include <rte_ethdev.h>
153c60274cSJie Zhou 
163c60274cSJie Zhou #ifdef RTE_EXEC_ENV_WINDOWS
173c60274cSJie Zhou static int
test_event_timer_adapter_func(void)183c60274cSJie Zhou test_event_timer_adapter_func(void)
193c60274cSJie Zhou {
203c60274cSJie Zhou 	printf("event_timer_adapter not supported on Windows, skipping test\n");
213c60274cSJie Zhou 	return TEST_SKIPPED;
223c60274cSJie Zhou }
233c60274cSJie Zhou 
243c60274cSJie Zhou #else
253c60274cSJie Zhou 
26a9de470cSBruce Richardson #include <rte_eventdev.h>
27a9de470cSBruce Richardson #include <rte_event_timer_adapter.h>
28a9de470cSBruce Richardson #include <rte_mempool.h>
29a9de470cSBruce Richardson #include <rte_launch.h>
30a9de470cSBruce Richardson #include <rte_lcore.h>
31a9de470cSBruce Richardson #include <rte_per_lcore.h>
32a9de470cSBruce Richardson #include <rte_random.h>
33a9de470cSBruce Richardson #include <rte_bus_vdev.h>
34a9de470cSBruce Richardson #include <rte_service.h>
35a9de470cSBruce Richardson #include <stdbool.h>
36a9de470cSBruce Richardson 
37a9de470cSBruce Richardson /* 4K timers corresponds to sw evdev max inflight events */
38a9de470cSBruce Richardson #define MAX_TIMERS  (4 * 1024)
39a9de470cSBruce Richardson #define BKT_TCK_NSEC
40a9de470cSBruce Richardson 
41a9de470cSBruce Richardson #define NSECPERSEC 1E9
42a9de470cSBruce Richardson #define BATCH_SIZE 16
43a9de470cSBruce Richardson /* Both the app lcore and adapter ports are linked to this queue */
44a9de470cSBruce Richardson #define TEST_QUEUE_ID 0
45a9de470cSBruce Richardson /* Port the application dequeues from */
46a9de470cSBruce Richardson #define TEST_PORT_ID 0
47a9de470cSBruce Richardson #define TEST_ADAPTER_ID 0
48a9de470cSBruce Richardson 
49a9de470cSBruce Richardson /* Handle log statements in same manner as test macros */
50a9de470cSBruce Richardson #define LOG_DBG(...)	RTE_LOG(DEBUG, EAL, __VA_ARGS__)
51a9de470cSBruce Richardson 
52a9de470cSBruce Richardson static int evdev;
53a9de470cSBruce Richardson static struct rte_event_timer_adapter *timdev;
54a9de470cSBruce Richardson static struct rte_mempool *eventdev_test_mempool;
55a9de470cSBruce Richardson static struct rte_ring *timer_producer_ring;
56a9de470cSBruce Richardson static uint64_t global_bkt_tck_ns;
572385a7f5SPavan Nikhilesh static uint64_t global_info_bkt_tck_ns;
58a9de470cSBruce Richardson static volatile uint8_t arm_done;
59a9de470cSBruce Richardson 
60fb9c2133SShijith Thotton #define CALC_TICKS(tks) ceil((double)((tks) * global_bkt_tck_ns) / global_info_bkt_tck_ns)
612385a7f5SPavan Nikhilesh 
62fb9c2133SShijith Thotton /* Wait double timeout ticks for software and an extra tick for hardware */
63fb9c2133SShijith Thotton #define WAIT_TICKS(tks) (using_services ? 2 * (tks) : tks + 1)
642385a7f5SPavan Nikhilesh 
65a9de470cSBruce Richardson static bool using_services;
66a9de470cSBruce Richardson static uint32_t test_lcore1;
67a9de470cSBruce Richardson static uint32_t test_lcore2;
68a9de470cSBruce Richardson static uint32_t test_lcore3;
69a9de470cSBruce Richardson static uint32_t sw_evdev_slcore;
70a9de470cSBruce Richardson static uint32_t sw_adptr_slcore;
71a9de470cSBruce Richardson 
72a9de470cSBruce Richardson static inline void
devconf_set_default_sane_values(struct rte_event_dev_config * dev_conf,struct rte_event_dev_info * info)73a9de470cSBruce Richardson devconf_set_default_sane_values(struct rte_event_dev_config *dev_conf,
74a9de470cSBruce Richardson 		struct rte_event_dev_info *info)
75a9de470cSBruce Richardson {
76a9de470cSBruce Richardson 	memset(dev_conf, 0, sizeof(struct rte_event_dev_config));
77a9de470cSBruce Richardson 	dev_conf->dequeue_timeout_ns = info->min_dequeue_timeout_ns;
78a9de470cSBruce Richardson 	dev_conf->nb_event_ports = 1;
79a9de470cSBruce Richardson 	dev_conf->nb_event_queues = 1;
80a9de470cSBruce Richardson 	dev_conf->nb_event_queue_flows = info->max_event_queue_flows;
81a9de470cSBruce Richardson 	dev_conf->nb_event_port_dequeue_depth =
82a9de470cSBruce Richardson 		info->max_event_port_dequeue_depth;
83a9de470cSBruce Richardson 	dev_conf->nb_event_port_enqueue_depth =
84a9de470cSBruce Richardson 		info->max_event_port_enqueue_depth;
85a9de470cSBruce Richardson 	dev_conf->nb_event_port_enqueue_depth =
86a9de470cSBruce Richardson 		info->max_event_port_enqueue_depth;
87a9de470cSBruce Richardson 	dev_conf->nb_events_limit =
88a9de470cSBruce Richardson 		info->max_num_events;
89a9de470cSBruce Richardson }
90a9de470cSBruce Richardson 
91a9de470cSBruce Richardson static inline int
eventdev_setup(void)92a9de470cSBruce Richardson eventdev_setup(void)
93a9de470cSBruce Richardson {
94a9de470cSBruce Richardson 	int ret;
95a9de470cSBruce Richardson 	struct rte_event_dev_config dev_conf;
96a9de470cSBruce Richardson 	struct rte_event_dev_info info;
97a9de470cSBruce Richardson 	uint32_t service_id;
98a9de470cSBruce Richardson 
99a9de470cSBruce Richardson 	ret = rte_event_dev_info_get(evdev, &info);
100a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(ret, "Failed to get event dev info");
1012385a7f5SPavan Nikhilesh 	TEST_ASSERT(info.max_num_events < 0 ||
1022385a7f5SPavan Nikhilesh 			info.max_num_events >= (int32_t)MAX_TIMERS,
103a9de470cSBruce Richardson 			"ERROR max_num_events=%d < max_events=%d",
104a9de470cSBruce Richardson 			info.max_num_events, MAX_TIMERS);
105a9de470cSBruce Richardson 
106a9de470cSBruce Richardson 	devconf_set_default_sane_values(&dev_conf, &info);
107a9de470cSBruce Richardson 	ret = rte_event_dev_configure(evdev, &dev_conf);
108a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(ret, "Failed to configure eventdev");
109a9de470cSBruce Richardson 
110a9de470cSBruce Richardson 	ret = rte_event_queue_setup(evdev, 0, NULL);
111a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(ret, "Failed to setup queue=%d", 0);
112a9de470cSBruce Richardson 
113a9de470cSBruce Richardson 	/* Configure event port */
114a9de470cSBruce Richardson 	ret = rte_event_port_setup(evdev, 0, NULL);
115a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(ret, "Failed to setup port=%d", 0);
116a9de470cSBruce Richardson 	ret = rte_event_port_link(evdev, 0, NULL, NULL, 0);
117a9de470cSBruce Richardson 	TEST_ASSERT(ret >= 0, "Failed to link all queues port=%d", 0);
118a9de470cSBruce Richardson 
119a9de470cSBruce Richardson 	/* If this is a software event device, map and start its service */
120a9de470cSBruce Richardson 	if (rte_event_dev_service_id_get(evdev, &service_id) == 0) {
121a9de470cSBruce Richardson 		TEST_ASSERT_SUCCESS(rte_service_lcore_add(sw_evdev_slcore),
122a9de470cSBruce Richardson 				"Failed to add service core");
123a9de470cSBruce Richardson 		TEST_ASSERT_SUCCESS(rte_service_lcore_start(
124a9de470cSBruce Richardson 				sw_evdev_slcore),
125a9de470cSBruce Richardson 				"Failed to start service core");
126a9de470cSBruce Richardson 		TEST_ASSERT_SUCCESS(rte_service_map_lcore_set(
127a9de470cSBruce Richardson 				service_id, sw_evdev_slcore, 1),
128a9de470cSBruce Richardson 				"Failed to map evdev service");
129a9de470cSBruce Richardson 		TEST_ASSERT_SUCCESS(rte_service_runstate_set(
130a9de470cSBruce Richardson 				service_id, 1),
131a9de470cSBruce Richardson 				"Failed to start evdev service");
132a9de470cSBruce Richardson 	}
133a9de470cSBruce Richardson 
134a9de470cSBruce Richardson 	ret = rte_event_dev_start(evdev);
135a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(ret, "Failed to start device");
136a9de470cSBruce Richardson 
137a9de470cSBruce Richardson 	return TEST_SUCCESS;
138a9de470cSBruce Richardson }
139a9de470cSBruce Richardson 
140a9de470cSBruce Richardson static int
testsuite_setup(void)141a9de470cSBruce Richardson testsuite_setup(void)
142a9de470cSBruce Richardson {
143a9de470cSBruce Richardson 	/* Some of the multithreaded tests require 3 other lcores to run */
144a9de470cSBruce Richardson 	unsigned int required_lcore_count = 4;
145a9de470cSBruce Richardson 	uint32_t service_id;
146a9de470cSBruce Richardson 
147a9de470cSBruce Richardson 	/* To make it easier to map services later if needed, just reset
148a9de470cSBruce Richardson 	 * service core state.
149a9de470cSBruce Richardson 	 */
150a9de470cSBruce Richardson 	(void) rte_service_lcore_reset_all();
151a9de470cSBruce Richardson 
152a9de470cSBruce Richardson 	if (!rte_event_dev_count()) {
153a9de470cSBruce Richardson 		/* If there is no hardware eventdev, or no software vdev was
154a9de470cSBruce Richardson 		 * specified on the command line, create an instance of
155a9de470cSBruce Richardson 		 * event_sw.
156a9de470cSBruce Richardson 		 */
157a9de470cSBruce Richardson 		LOG_DBG("Failed to find a valid event device... testing with"
158a9de470cSBruce Richardson 			" event_sw device\n");
159a9de470cSBruce Richardson 		TEST_ASSERT_SUCCESS(rte_vdev_init("event_sw0", NULL),
160a9de470cSBruce Richardson 					"Error creating eventdev");
161a9de470cSBruce Richardson 		evdev = rte_event_dev_get_dev_id("event_sw0");
162a9de470cSBruce Richardson 	}
163a9de470cSBruce Richardson 
164a9de470cSBruce Richardson 	if (rte_event_dev_service_id_get(evdev, &service_id) == 0) {
165a9de470cSBruce Richardson 		/* A software event device will use a software event timer
166a9de470cSBruce Richardson 		 * adapter as well. 2 more cores required to convert to
167a9de470cSBruce Richardson 		 * service cores.
168a9de470cSBruce Richardson 		 */
169a9de470cSBruce Richardson 		required_lcore_count += 2;
170a9de470cSBruce Richardson 		using_services = true;
171a9de470cSBruce Richardson 	}
172a9de470cSBruce Richardson 
173a9de470cSBruce Richardson 	if (rte_lcore_count() < required_lcore_count) {
174e0f4a0edSDavid Marchand 		printf("Not enough cores for event_timer_adapter_test, expecting at least %u\n",
175e0f4a0edSDavid Marchand 		       required_lcore_count);
176e0f4a0edSDavid Marchand 		return TEST_SKIPPED;
177a9de470cSBruce Richardson 	}
178a9de470cSBruce Richardson 
179a9de470cSBruce Richardson 	/* Assign lcores for various tasks */
180a9de470cSBruce Richardson 	test_lcore1 = rte_get_next_lcore(-1, 1, 0);
181a9de470cSBruce Richardson 	test_lcore2 = rte_get_next_lcore(test_lcore1, 1, 0);
182a9de470cSBruce Richardson 	test_lcore3 = rte_get_next_lcore(test_lcore2, 1, 0);
183a9de470cSBruce Richardson 	if (using_services) {
184a9de470cSBruce Richardson 		sw_evdev_slcore = rte_get_next_lcore(test_lcore3, 1, 0);
185a9de470cSBruce Richardson 		sw_adptr_slcore = rte_get_next_lcore(sw_evdev_slcore, 1, 0);
186a9de470cSBruce Richardson 	}
187a9de470cSBruce Richardson 
188a9de470cSBruce Richardson 	return eventdev_setup();
189a9de470cSBruce Richardson }
190a9de470cSBruce Richardson 
191a9de470cSBruce Richardson static void
testsuite_teardown(void)192a9de470cSBruce Richardson testsuite_teardown(void)
193a9de470cSBruce Richardson {
194a9de470cSBruce Richardson 	rte_event_dev_stop(evdev);
195a9de470cSBruce Richardson 	rte_event_dev_close(evdev);
196a9de470cSBruce Richardson }
197a9de470cSBruce Richardson 
198a9de470cSBruce Richardson static int
setup_adapter_service(struct rte_event_timer_adapter * adptr)199a9de470cSBruce Richardson setup_adapter_service(struct rte_event_timer_adapter *adptr)
200a9de470cSBruce Richardson {
201a9de470cSBruce Richardson 	uint32_t adapter_service_id;
202a9de470cSBruce Richardson 	int ret;
203a9de470cSBruce Richardson 
204a9de470cSBruce Richardson 	/* retrieve service ids */
205a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_service_id_get(adptr,
206a9de470cSBruce Richardson 			&adapter_service_id), "Failed to get event timer "
207a9de470cSBruce Richardson 			"adapter service id");
208a9de470cSBruce Richardson 	/* add a service core and start it */
209a9de470cSBruce Richardson 	ret = rte_service_lcore_add(sw_adptr_slcore);
210a9de470cSBruce Richardson 	TEST_ASSERT(ret == 0 || ret == -EALREADY,
211a9de470cSBruce Richardson 			"Failed to add service core");
212a9de470cSBruce Richardson 	ret = rte_service_lcore_start(sw_adptr_slcore);
213a9de470cSBruce Richardson 	TEST_ASSERT(ret == 0 || ret == -EALREADY,
214a9de470cSBruce Richardson 			"Failed to start service core");
215a9de470cSBruce Richardson 
216a9de470cSBruce Richardson 	/* map services to it */
217a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_service_map_lcore_set(adapter_service_id,
218a9de470cSBruce Richardson 			sw_adptr_slcore, 1),
219a9de470cSBruce Richardson 			"Failed to map adapter service");
220a9de470cSBruce Richardson 
221a9de470cSBruce Richardson 	/* set services to running */
222a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_service_runstate_set(adapter_service_id, 1),
223a9de470cSBruce Richardson 			"Failed to start event timer adapter service");
224a9de470cSBruce Richardson 
225a9de470cSBruce Richardson 	return TEST_SUCCESS;
226a9de470cSBruce Richardson }
227a9de470cSBruce Richardson 
228a9de470cSBruce Richardson static int
test_port_conf_cb(uint16_t id,uint8_t event_dev_id,uint8_t * event_port_id,void * conf_arg)229a9de470cSBruce Richardson test_port_conf_cb(uint16_t id, uint8_t event_dev_id, uint8_t *event_port_id,
230a9de470cSBruce Richardson 		  void *conf_arg)
231a9de470cSBruce Richardson {
232a9de470cSBruce Richardson 	struct rte_event_dev_config dev_conf;
233a9de470cSBruce Richardson 	struct rte_event_dev_info info;
234a9de470cSBruce Richardson 	struct rte_event_port_conf *port_conf, def_port_conf = {0};
235a9de470cSBruce Richardson 	uint32_t started;
236a9de470cSBruce Richardson 	static int port_allocated;
237a9de470cSBruce Richardson 	static uint8_t port_id;
238a9de470cSBruce Richardson 	int ret;
239a9de470cSBruce Richardson 
240a9de470cSBruce Richardson 	if (port_allocated) {
241a9de470cSBruce Richardson 		*event_port_id = port_id;
242a9de470cSBruce Richardson 		return 0;
243a9de470cSBruce Richardson 	}
244a9de470cSBruce Richardson 
245a9de470cSBruce Richardson 	RTE_SET_USED(id);
246a9de470cSBruce Richardson 
247a9de470cSBruce Richardson 	ret = rte_event_dev_attr_get(event_dev_id, RTE_EVENT_DEV_ATTR_STARTED,
248a9de470cSBruce Richardson 				     &started);
249a9de470cSBruce Richardson 	if (ret < 0)
250a9de470cSBruce Richardson 		return ret;
251a9de470cSBruce Richardson 
252a9de470cSBruce Richardson 	if (started)
253a9de470cSBruce Richardson 		rte_event_dev_stop(event_dev_id);
254a9de470cSBruce Richardson 
255a9de470cSBruce Richardson 	ret = rte_event_dev_info_get(evdev, &info);
256a9de470cSBruce Richardson 	if (ret < 0)
257a9de470cSBruce Richardson 		return ret;
258a9de470cSBruce Richardson 
259a9de470cSBruce Richardson 	devconf_set_default_sane_values(&dev_conf, &info);
260a9de470cSBruce Richardson 
261a9de470cSBruce Richardson 	port_id = dev_conf.nb_event_ports;
262a9de470cSBruce Richardson 	dev_conf.nb_event_ports++;
263a9de470cSBruce Richardson 
264a9de470cSBruce Richardson 	ret = rte_event_dev_configure(event_dev_id, &dev_conf);
265a9de470cSBruce Richardson 	if (ret < 0) {
266a9de470cSBruce Richardson 		if (started)
267a9de470cSBruce Richardson 			rte_event_dev_start(event_dev_id);
268a9de470cSBruce Richardson 		return ret;
269a9de470cSBruce Richardson 	}
270a9de470cSBruce Richardson 
271a9de470cSBruce Richardson 	if (conf_arg != NULL)
272a9de470cSBruce Richardson 		port_conf = conf_arg;
273a9de470cSBruce Richardson 	else {
274a9de470cSBruce Richardson 		port_conf = &def_port_conf;
275a9de470cSBruce Richardson 		ret = rte_event_port_default_conf_get(event_dev_id, port_id,
276a9de470cSBruce Richardson 						      port_conf);
277a9de470cSBruce Richardson 		if (ret < 0)
278a9de470cSBruce Richardson 			return ret;
279a9de470cSBruce Richardson 	}
280a9de470cSBruce Richardson 
281a9de470cSBruce Richardson 	ret = rte_event_port_setup(event_dev_id, port_id, port_conf);
282a9de470cSBruce Richardson 	if (ret < 0)
283a9de470cSBruce Richardson 		return ret;
284a9de470cSBruce Richardson 
285a9de470cSBruce Richardson 	*event_port_id = port_id;
286a9de470cSBruce Richardson 
287a9de470cSBruce Richardson 	if (started)
288a9de470cSBruce Richardson 		rte_event_dev_start(event_dev_id);
289a9de470cSBruce Richardson 
290a9de470cSBruce Richardson 	/* Reuse this port number next time this is called */
291a9de470cSBruce Richardson 	port_allocated = 1;
292a9de470cSBruce Richardson 
293a9de470cSBruce Richardson 	return 0;
294a9de470cSBruce Richardson }
295a9de470cSBruce Richardson 
296a9de470cSBruce Richardson static int
_timdev_setup(uint64_t max_tmo_ns,uint64_t bkt_tck_ns,uint64_t flags)2977d761b07SShijith Thotton _timdev_setup(uint64_t max_tmo_ns, uint64_t bkt_tck_ns, uint64_t flags)
298a9de470cSBruce Richardson {
2992385a7f5SPavan Nikhilesh 	struct rte_event_timer_adapter_info info;
300a9de470cSBruce Richardson 	struct rte_event_timer_adapter_conf config = {
301a9de470cSBruce Richardson 		.event_dev_id = evdev,
302a9de470cSBruce Richardson 		.timer_adapter_id = TEST_ADAPTER_ID,
303a9de470cSBruce Richardson 		.timer_tick_ns = bkt_tck_ns,
304a9de470cSBruce Richardson 		.max_tmo_ns = max_tmo_ns,
305a9de470cSBruce Richardson 		.nb_timers = MAX_TIMERS * 10,
3067d761b07SShijith Thotton 		.flags = flags,
307a9de470cSBruce Richardson 	};
308a9de470cSBruce Richardson 	uint32_t caps = 0;
309a9de470cSBruce Richardson 	const char *pool_name = "timdev_test_pool";
310a9de470cSBruce Richardson 
311a9de470cSBruce Richardson 	global_bkt_tck_ns = bkt_tck_ns;
312a9de470cSBruce Richardson 
313a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_caps_get(evdev, &caps),
314a9de470cSBruce Richardson 				"failed to get adapter capabilities");
3157d761b07SShijith Thotton 
3167d761b07SShijith Thotton 	if (flags & RTE_EVENT_TIMER_ADAPTER_F_PERIODIC &&
3175d28b660SShijith Thotton 	    !(caps & RTE_EVENT_TIMER_ADAPTER_CAP_PERIODIC))
3185d28b660SShijith Thotton 		return -ENOTSUP;
3197d761b07SShijith Thotton 
320a9de470cSBruce Richardson 	if (!(caps & RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT)) {
321a9de470cSBruce Richardson 		timdev = rte_event_timer_adapter_create_ext(&config,
322a9de470cSBruce Richardson 							    test_port_conf_cb,
323a9de470cSBruce Richardson 							    NULL);
324a9de470cSBruce Richardson 		setup_adapter_service(timdev);
325a9de470cSBruce Richardson 		using_services = true;
326a9de470cSBruce Richardson 	} else
327a9de470cSBruce Richardson 		timdev = rte_event_timer_adapter_create(&config);
328a9de470cSBruce Richardson 
329a9de470cSBruce Richardson 	TEST_ASSERT_NOT_NULL(timdev,
330a9de470cSBruce Richardson 			"failed to create event timer ring");
331a9de470cSBruce Richardson 
332a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(rte_event_timer_adapter_start(timdev), 0,
333a9de470cSBruce Richardson 			"failed to Start event timer adapter");
334a9de470cSBruce Richardson 
335a9de470cSBruce Richardson 	/* Create event timer mempool */
336a9de470cSBruce Richardson 	eventdev_test_mempool = rte_mempool_create(pool_name,
337a9de470cSBruce Richardson 			MAX_TIMERS * 2,
338a9de470cSBruce Richardson 			sizeof(struct rte_event_timer), /* element size*/
339a9de470cSBruce Richardson 			0, /* cache size*/
340a9de470cSBruce Richardson 			0, NULL, NULL, NULL, NULL,
341a9de470cSBruce Richardson 			rte_socket_id(), 0);
342a9de470cSBruce Richardson 	if (!eventdev_test_mempool) {
343a9de470cSBruce Richardson 		printf("ERROR creating mempool\n");
344a9de470cSBruce Richardson 		return TEST_FAILED;
345a9de470cSBruce Richardson 	}
346a9de470cSBruce Richardson 
3472385a7f5SPavan Nikhilesh 	rte_event_timer_adapter_get_info(timdev, &info);
3482385a7f5SPavan Nikhilesh 
3492385a7f5SPavan Nikhilesh 	global_info_bkt_tck_ns = info.min_resolution_ns;
3502385a7f5SPavan Nikhilesh 
351a9de470cSBruce Richardson 	return TEST_SUCCESS;
352a9de470cSBruce Richardson }
353a9de470cSBruce Richardson 
354a9de470cSBruce Richardson static int
timdev_setup_usec(void)355a9de470cSBruce Richardson timdev_setup_usec(void)
356a9de470cSBruce Richardson {
3577d761b07SShijith Thotton 	uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES;
3587d761b07SShijith Thotton 
359a9de470cSBruce Richardson 	return using_services ?
360a9de470cSBruce Richardson 		/* Max timeout is 10,000us and bucket interval is 100us */
3617d761b07SShijith Thotton 		_timdev_setup(1E7, 1E5, flags) :
362a9de470cSBruce Richardson 		/* Max timeout is 100us and bucket interval is 1us */
3637d761b07SShijith Thotton 		_timdev_setup(1E5, 1E3, flags);
364a9de470cSBruce Richardson }
365a9de470cSBruce Richardson 
366a9de470cSBruce Richardson static int
timdev_setup_usec_multicore(void)367a9de470cSBruce Richardson timdev_setup_usec_multicore(void)
368a9de470cSBruce Richardson {
3697d761b07SShijith Thotton 	uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES;
3707d761b07SShijith Thotton 
371a9de470cSBruce Richardson 	return using_services ?
372a9de470cSBruce Richardson 		/* Max timeout is 10,000us and bucket interval is 100us */
3737d761b07SShijith Thotton 		_timdev_setup(1E7, 1E5, flags) :
374a9de470cSBruce Richardson 		/* Max timeout is 100us and bucket interval is 1us */
3757d761b07SShijith Thotton 		_timdev_setup(1E5, 1E3, flags);
376a9de470cSBruce Richardson }
377a9de470cSBruce Richardson 
378a9de470cSBruce Richardson static int
timdev_setup_msec(void)379a9de470cSBruce Richardson timdev_setup_msec(void)
380a9de470cSBruce Richardson {
3817d761b07SShijith Thotton 	uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES;
3827d761b07SShijith Thotton 
3837d761b07SShijith Thotton 	/* Max timeout is 3 mins, and bucket interval is 100 ms */
3847d761b07SShijith Thotton 	return _timdev_setup(180 * NSECPERSEC, NSECPERSEC / 10, flags);
3857d761b07SShijith Thotton }
3867d761b07SShijith Thotton 
3877d761b07SShijith Thotton static int
timdev_setup_msec_periodic(void)3887d761b07SShijith Thotton timdev_setup_msec_periodic(void)
3897d761b07SShijith Thotton {
3903d9d8adfSNaga Harish K S V 	uint32_t caps = 0;
3913d9d8adfSNaga Harish K S V 	uint64_t max_tmo_ns;
3923d9d8adfSNaga Harish K S V 
3937d761b07SShijith Thotton 	uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES |
3947d761b07SShijith Thotton 			 RTE_EVENT_TIMER_ADAPTER_F_PERIODIC;
3957d761b07SShijith Thotton 
3963d9d8adfSNaga Harish K S V 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_caps_get(evdev, &caps),
3973d9d8adfSNaga Harish K S V 				"failed to get adapter capabilities");
3983d9d8adfSNaga Harish K S V 
3993d9d8adfSNaga Harish K S V 	if (caps & RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT)
4003d9d8adfSNaga Harish K S V 		max_tmo_ns = 0;
4013d9d8adfSNaga Harish K S V 	else
4023d9d8adfSNaga Harish K S V 		max_tmo_ns = 180 * NSECPERSEC;
4033d9d8adfSNaga Harish K S V 
4047d761b07SShijith Thotton 	/* Periodic mode with 100 ms resolution */
4053d9d8adfSNaga Harish K S V 	return _timdev_setup(max_tmo_ns, NSECPERSEC / 10, flags);
406a9de470cSBruce Richardson }
407a9de470cSBruce Richardson 
408a9de470cSBruce Richardson static int
timdev_setup_sec(void)409a9de470cSBruce Richardson timdev_setup_sec(void)
410a9de470cSBruce Richardson {
4117d761b07SShijith Thotton 	uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES;
4127d761b07SShijith Thotton 
413a9de470cSBruce Richardson 	/* Max timeout is 100sec and bucket interval is 1sec */
4147d761b07SShijith Thotton 	return _timdev_setup(1E11, 1E9, flags);
4157d761b07SShijith Thotton }
4167d761b07SShijith Thotton 
4177d761b07SShijith Thotton static int
timdev_setup_sec_periodic(void)4187d761b07SShijith Thotton timdev_setup_sec_periodic(void)
4197d761b07SShijith Thotton {
4207d761b07SShijith Thotton 	uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES |
4217d761b07SShijith Thotton 			 RTE_EVENT_TIMER_ADAPTER_F_PERIODIC;
4227d761b07SShijith Thotton 
4237d761b07SShijith Thotton 	/* Periodic mode with 1 sec resolution */
4243d9d8adfSNaga Harish K S V 	return _timdev_setup(180 * NSECPERSEC, NSECPERSEC, flags);
425a9de470cSBruce Richardson }
426a9de470cSBruce Richardson 
427a9de470cSBruce Richardson static int
timdev_setup_sec_multicore(void)428a9de470cSBruce Richardson timdev_setup_sec_multicore(void)
429a9de470cSBruce Richardson {
4307d761b07SShijith Thotton 	uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES;
4317d761b07SShijith Thotton 
432a9de470cSBruce Richardson 	/* Max timeout is 100sec and bucket interval is 1sec */
4337d761b07SShijith Thotton 	return _timdev_setup(1E11, 1E9, flags);
434a9de470cSBruce Richardson }
435a9de470cSBruce Richardson 
436a9de470cSBruce Richardson static void
timdev_teardown(void)437a9de470cSBruce Richardson timdev_teardown(void)
438a9de470cSBruce Richardson {
439a9de470cSBruce Richardson 	rte_event_timer_adapter_stop(timdev);
440a9de470cSBruce Richardson 	rte_event_timer_adapter_free(timdev);
441a9de470cSBruce Richardson 
442a9de470cSBruce Richardson 	rte_mempool_free(eventdev_test_mempool);
443a9de470cSBruce Richardson }
444a9de470cSBruce Richardson 
445fb9c2133SShijith Thotton static inline uint16_t
timeout_event_dequeue(struct rte_event * evs,uint64_t nb_evs,uint64_t ticks)446fb9c2133SShijith Thotton timeout_event_dequeue(struct rte_event *evs, uint64_t nb_evs, uint64_t ticks)
447fb9c2133SShijith Thotton {
448fb9c2133SShijith Thotton 	uint16_t ev_cnt = 0;
449fb9c2133SShijith Thotton 	uint64_t end_cycle;
450fb9c2133SShijith Thotton 
451fb9c2133SShijith Thotton 	if (using_services && nb_evs == MAX_TIMERS)
452fb9c2133SShijith Thotton 		ticks = 2 * ticks;
453fb9c2133SShijith Thotton 
454fb9c2133SShijith Thotton 	end_cycle = rte_rdtsc() + ticks * global_bkt_tck_ns * rte_get_tsc_hz() / 1E9;
455fb9c2133SShijith Thotton 
456fb9c2133SShijith Thotton 	while (ev_cnt < nb_evs && rte_rdtsc() < end_cycle) {
457fb9c2133SShijith Thotton 		ev_cnt += rte_event_dequeue_burst(evdev, TEST_PORT_ID, &evs[ev_cnt], nb_evs, 0);
458fb9c2133SShijith Thotton 		rte_pause();
459fb9c2133SShijith Thotton 	}
460fb9c2133SShijith Thotton 
461fb9c2133SShijith Thotton 	return ev_cnt;
462fb9c2133SShijith Thotton }
463fb9c2133SShijith Thotton 
464a9de470cSBruce Richardson static inline int
test_timer_state(void)465a9de470cSBruce Richardson test_timer_state(void)
466a9de470cSBruce Richardson {
467a9de470cSBruce Richardson 	struct rte_event_timer *ev_tim;
468fb9c2133SShijith Thotton 	const uint64_t max_ticks = 100;
469fb9c2133SShijith Thotton 	uint64_t ticks, wait_ticks;
470a9de470cSBruce Richardson 	struct rte_event ev;
471a9de470cSBruce Richardson 	const struct rte_event_timer tim = {
472a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
473a9de470cSBruce Richardson 		.ev.queue_id = 0,
474a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
475a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
476a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
477a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
478a9de470cSBruce Richardson 	};
479a9de470cSBruce Richardson 
480a9de470cSBruce Richardson 	rte_mempool_get(eventdev_test_mempool, (void **)&ev_tim);
481a9de470cSBruce Richardson 	*ev_tim = tim;
482a9de470cSBruce Richardson 	ev_tim->ev.event_ptr = ev_tim;
483fb9c2133SShijith Thotton 	ev_tim->timeout_ticks = CALC_TICKS(max_ticks + 20);
484a9de470cSBruce Richardson 
485a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim, 1), 0,
486a9de470cSBruce Richardson 			"Armed timer exceeding max_timeout.");
487a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ev_tim->state, RTE_EVENT_TIMER_ERROR_TOOLATE,
488a9de470cSBruce Richardson 			"Improper timer state set expected %d returned %d",
489a9de470cSBruce Richardson 			RTE_EVENT_TIMER_ERROR_TOOLATE, ev_tim->state);
490a9de470cSBruce Richardson 
491fb9c2133SShijith Thotton 	ticks = 10;
492a9de470cSBruce Richardson 	ev_tim->state = RTE_EVENT_TIMER_NOT_ARMED;
493fb9c2133SShijith Thotton 	ev_tim->timeout_ticks = CALC_TICKS(ticks);
494a9de470cSBruce Richardson 
495a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim, 1), 1,
496a9de470cSBruce Richardson 			"Failed to arm timer with proper timeout.");
497a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ev_tim->state, RTE_EVENT_TIMER_ARMED,
498a9de470cSBruce Richardson 			"Improper timer state set expected %d returned %d",
499a9de470cSBruce Richardson 			RTE_EVENT_TIMER_ARMED, ev_tim->state);
500a9de470cSBruce Richardson 
501a9de470cSBruce Richardson 	if (!using_services)
502fb9c2133SShijith Thotton 		wait_ticks = 2 * ticks;
503a9de470cSBruce Richardson 	else
504fb9c2133SShijith Thotton 		wait_ticks = ticks;
505fb9c2133SShijith Thotton 
506fb9c2133SShijith Thotton 	TEST_ASSERT_EQUAL(timeout_event_dequeue(&ev, 1, WAIT_TICKS(wait_ticks)), 1,
507a9de470cSBruce Richardson 			  "Armed timer failed to trigger.");
508a9de470cSBruce Richardson 
509a9de470cSBruce Richardson 	ev_tim->state = RTE_EVENT_TIMER_NOT_ARMED;
510fb9c2133SShijith Thotton 	ev_tim->timeout_ticks = CALC_TICKS(max_ticks - 10);
511a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim, 1), 1,
512a9de470cSBruce Richardson 			"Failed to arm timer with proper timeout.");
513a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(rte_event_timer_cancel_burst(timdev, &ev_tim, 1),
514a9de470cSBruce Richardson 			1, "Failed to cancel armed timer");
515a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ev_tim->state, RTE_EVENT_TIMER_CANCELED,
516a9de470cSBruce Richardson 			"Improper timer state set expected %d returned %d",
517a9de470cSBruce Richardson 			RTE_EVENT_TIMER_CANCELED, ev_tim->state);
518a9de470cSBruce Richardson 
519a9de470cSBruce Richardson 	rte_mempool_put(eventdev_test_mempool, (void *)ev_tim);
520a9de470cSBruce Richardson 
521a9de470cSBruce Richardson 	return TEST_SUCCESS;
522a9de470cSBruce Richardson }
523a9de470cSBruce Richardson 
524a9de470cSBruce Richardson static inline int
_arm_timers(uint64_t timeout_tcks,uint64_t timers)525a9de470cSBruce Richardson _arm_timers(uint64_t timeout_tcks, uint64_t timers)
526a9de470cSBruce Richardson {
527a9de470cSBruce Richardson 	uint64_t i;
528a9de470cSBruce Richardson 	struct rte_event_timer *ev_tim;
529a9de470cSBruce Richardson 	const struct rte_event_timer tim = {
530a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
531a9de470cSBruce Richardson 		.ev.queue_id = 0,
532a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
533a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
534a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
535a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
5362385a7f5SPavan Nikhilesh 		.timeout_ticks = CALC_TICKS(timeout_tcks),
537a9de470cSBruce Richardson 	};
538a9de470cSBruce Richardson 
539a9de470cSBruce Richardson 	for (i = 0; i < timers; i++) {
540a9de470cSBruce Richardson 
541a9de470cSBruce Richardson 		TEST_ASSERT_SUCCESS(rte_mempool_get(eventdev_test_mempool,
542a9de470cSBruce Richardson 					(void **)&ev_tim),
543a9de470cSBruce Richardson 				"mempool alloc failed");
544a9de470cSBruce Richardson 		*ev_tim = tim;
545a9de470cSBruce Richardson 		ev_tim->ev.event_ptr = ev_tim;
546a9de470cSBruce Richardson 
547a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim,
548a9de470cSBruce Richardson 					1), 1, "Failed to arm timer %d",
549a9de470cSBruce Richardson 				rte_errno);
550a9de470cSBruce Richardson 	}
551a9de470cSBruce Richardson 
552a9de470cSBruce Richardson 	return TEST_SUCCESS;
553a9de470cSBruce Richardson }
554a9de470cSBruce Richardson 
555a9de470cSBruce Richardson static inline int
_wait_timer_triggers(uint64_t wait_sec,uint64_t arm_count,uint64_t cancel_count)556a9de470cSBruce Richardson _wait_timer_triggers(uint64_t wait_sec, uint64_t arm_count,
557a9de470cSBruce Richardson 		uint64_t cancel_count)
558a9de470cSBruce Richardson {
559a9de470cSBruce Richardson 	uint8_t valid_event;
560a9de470cSBruce Richardson 	uint64_t events = 0;
561a9de470cSBruce Richardson 	uint64_t wait_start, max_wait;
562a9de470cSBruce Richardson 	struct rte_event ev;
563a9de470cSBruce Richardson 
564a9de470cSBruce Richardson 	max_wait = rte_get_timer_hz() * wait_sec;
565a9de470cSBruce Richardson 	wait_start = rte_get_timer_cycles();
566a9de470cSBruce Richardson 	while (1) {
567a9de470cSBruce Richardson 		if (rte_get_timer_cycles() - wait_start > max_wait) {
568a9de470cSBruce Richardson 			if (events + cancel_count != arm_count)
569a9de470cSBruce Richardson 				TEST_ASSERT_SUCCESS(max_wait,
570a9de470cSBruce Richardson 					"Max time limit for timers exceeded.");
571a9de470cSBruce Richardson 			break;
572a9de470cSBruce Richardson 		}
573a9de470cSBruce Richardson 
574a9de470cSBruce Richardson 		valid_event = rte_event_dequeue_burst(evdev, 0, &ev, 1, 0);
575a9de470cSBruce Richardson 		if (!valid_event)
576a9de470cSBruce Richardson 			continue;
577a9de470cSBruce Richardson 
578a9de470cSBruce Richardson 		rte_mempool_put(eventdev_test_mempool, ev.event_ptr);
579a9de470cSBruce Richardson 		events++;
580a9de470cSBruce Richardson 	}
581a9de470cSBruce Richardson 
582a9de470cSBruce Richardson 	return TEST_SUCCESS;
583a9de470cSBruce Richardson }
584a9de470cSBruce Richardson 
585a9de470cSBruce Richardson static inline int
test_timer_arm(void)586a9de470cSBruce Richardson test_timer_arm(void)
587a9de470cSBruce Richardson {
588a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(_arm_timers(20, MAX_TIMERS),
589a9de470cSBruce Richardson 			"Failed to arm timers");
590a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(10, MAX_TIMERS, 0),
591a9de470cSBruce Richardson 			"Timer triggered count doesn't match arm count");
592a9de470cSBruce Richardson 	return TEST_SUCCESS;
593a9de470cSBruce Richardson }
594a9de470cSBruce Richardson 
5957d761b07SShijith Thotton static inline int
test_timer_arm_periodic(void)5967d761b07SShijith Thotton test_timer_arm_periodic(void)
5977d761b07SShijith Thotton {
5983d9d8adfSNaga Harish K S V 	uint32_t caps = 0;
5993d9d8adfSNaga Harish K S V 	uint32_t timeout_count = 0;
6003d9d8adfSNaga Harish K S V 
6017d761b07SShijith Thotton 	TEST_ASSERT_SUCCESS(_arm_timers(1, MAX_TIMERS),
6027d761b07SShijith Thotton 			    "Failed to arm timers");
6037d761b07SShijith Thotton 	/* With a resolution of 100ms and wait time of 1sec,
6047d761b07SShijith Thotton 	 * there will be 10 * MAX_TIMERS periodic timer triggers.
6057d761b07SShijith Thotton 	 */
6063d9d8adfSNaga Harish K S V 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_caps_get(evdev, &caps),
6073d9d8adfSNaga Harish K S V 				"failed to get adapter capabilities");
6083d9d8adfSNaga Harish K S V 
6093d9d8adfSNaga Harish K S V 	if (caps & RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT)
6103d9d8adfSNaga Harish K S V 		timeout_count = 10;
6113d9d8adfSNaga Harish K S V 	else
6123d9d8adfSNaga Harish K S V 		timeout_count = 9;
6133d9d8adfSNaga Harish K S V 
6143d9d8adfSNaga Harish K S V 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(1, timeout_count * MAX_TIMERS, 0),
6157d761b07SShijith Thotton 			    "Timer triggered count doesn't match arm count");
6167d761b07SShijith Thotton 	return TEST_SUCCESS;
6177d761b07SShijith Thotton }
6187d761b07SShijith Thotton 
619a9de470cSBruce Richardson static int
_arm_wrapper(void * arg)620a9de470cSBruce Richardson _arm_wrapper(void *arg)
621a9de470cSBruce Richardson {
622a9de470cSBruce Richardson 	RTE_SET_USED(arg);
623a9de470cSBruce Richardson 
624a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(_arm_timers(20, MAX_TIMERS),
625a9de470cSBruce Richardson 			"Failed to arm timers");
626a9de470cSBruce Richardson 
627a9de470cSBruce Richardson 	return TEST_SUCCESS;
628a9de470cSBruce Richardson }
629a9de470cSBruce Richardson 
630a9de470cSBruce Richardson static inline int
test_timer_arm_multicore(void)631a9de470cSBruce Richardson test_timer_arm_multicore(void)
632a9de470cSBruce Richardson {
633a9de470cSBruce Richardson 
634a9de470cSBruce Richardson 	uint32_t lcore_1 = rte_get_next_lcore(-1, 1, 0);
635a9de470cSBruce Richardson 	uint32_t lcore_2 = rte_get_next_lcore(lcore_1, 1, 0);
636a9de470cSBruce Richardson 
637a9de470cSBruce Richardson 	rte_eal_remote_launch(_arm_wrapper, NULL, lcore_1);
638a9de470cSBruce Richardson 	rte_eal_remote_launch(_arm_wrapper, NULL, lcore_2);
639a9de470cSBruce Richardson 
640a9de470cSBruce Richardson 	rte_eal_mp_wait_lcore();
641a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(10, MAX_TIMERS * 2, 0),
642a9de470cSBruce Richardson 			"Timer triggered count doesn't match arm count");
643a9de470cSBruce Richardson 
644a9de470cSBruce Richardson 	return TEST_SUCCESS;
645a9de470cSBruce Richardson }
646a9de470cSBruce Richardson 
647a9de470cSBruce Richardson #define MAX_BURST 16
648a9de470cSBruce Richardson static inline int
_arm_timers_burst(uint64_t timeout_tcks,uint64_t timers)649a9de470cSBruce Richardson _arm_timers_burst(uint64_t timeout_tcks, uint64_t timers)
650a9de470cSBruce Richardson {
651a9de470cSBruce Richardson 	uint64_t i;
652a9de470cSBruce Richardson 	int j;
653a9de470cSBruce Richardson 	struct rte_event_timer *ev_tim[MAX_BURST];
654a9de470cSBruce Richardson 	const struct rte_event_timer tim = {
655a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
656a9de470cSBruce Richardson 		.ev.queue_id = 0,
657a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
658a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
659a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
660a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
6612385a7f5SPavan Nikhilesh 		.timeout_ticks = CALC_TICKS(timeout_tcks),
662a9de470cSBruce Richardson 	};
663a9de470cSBruce Richardson 
664a9de470cSBruce Richardson 	for (i = 0; i < timers / MAX_BURST; i++) {
665a9de470cSBruce Richardson 		TEST_ASSERT_SUCCESS(rte_mempool_get_bulk(
666a9de470cSBruce Richardson 				eventdev_test_mempool,
667a9de470cSBruce Richardson 				(void **)ev_tim, MAX_BURST),
668a9de470cSBruce Richardson 				"mempool alloc failed");
669a9de470cSBruce Richardson 
670a9de470cSBruce Richardson 		for (j = 0; j < MAX_BURST; j++) {
671a9de470cSBruce Richardson 			*ev_tim[j] = tim;
672a9de470cSBruce Richardson 			ev_tim[j]->ev.event_ptr = ev_tim[j];
673a9de470cSBruce Richardson 		}
674a9de470cSBruce Richardson 
675a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(rte_event_timer_arm_tmo_tick_burst(timdev,
676a9de470cSBruce Richardson 				ev_tim, tim.timeout_ticks, MAX_BURST),
677a9de470cSBruce Richardson 				MAX_BURST, "Failed to arm timer %d", rte_errno);
678a9de470cSBruce Richardson 	}
679a9de470cSBruce Richardson 
680a9de470cSBruce Richardson 	return TEST_SUCCESS;
681a9de470cSBruce Richardson }
682a9de470cSBruce Richardson 
683a9de470cSBruce Richardson static inline int
test_timer_arm_burst(void)684a9de470cSBruce Richardson test_timer_arm_burst(void)
685a9de470cSBruce Richardson {
686a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(_arm_timers_burst(20, MAX_TIMERS),
687a9de470cSBruce Richardson 			"Failed to arm timers");
688a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(10, MAX_TIMERS, 0),
689a9de470cSBruce Richardson 			"Timer triggered count doesn't match arm count");
690a9de470cSBruce Richardson 
691a9de470cSBruce Richardson 	return TEST_SUCCESS;
692a9de470cSBruce Richardson }
693a9de470cSBruce Richardson 
6947d761b07SShijith Thotton static inline int
test_timer_arm_burst_periodic(void)6957d761b07SShijith Thotton test_timer_arm_burst_periodic(void)
6967d761b07SShijith Thotton {
6973d9d8adfSNaga Harish K S V 	uint32_t caps = 0;
6983d9d8adfSNaga Harish K S V 	uint32_t timeout_count = 0;
6993d9d8adfSNaga Harish K S V 
7007d761b07SShijith Thotton 	TEST_ASSERT_SUCCESS(_arm_timers_burst(1, MAX_TIMERS),
7017d761b07SShijith Thotton 			    "Failed to arm timers");
7027d761b07SShijith Thotton 	/* With a resolution of 100ms and wait time of 1sec,
7037d761b07SShijith Thotton 	 * there will be 10 * MAX_TIMERS periodic timer triggers.
7047d761b07SShijith Thotton 	 */
7053d9d8adfSNaga Harish K S V 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_caps_get(evdev, &caps),
7063d9d8adfSNaga Harish K S V 				"failed to get adapter capabilities");
7073d9d8adfSNaga Harish K S V 
7083d9d8adfSNaga Harish K S V 	if (caps & RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT)
7093d9d8adfSNaga Harish K S V 		timeout_count = 10;
7103d9d8adfSNaga Harish K S V 	else
7113d9d8adfSNaga Harish K S V 		timeout_count = 9;
7123d9d8adfSNaga Harish K S V 
7133d9d8adfSNaga Harish K S V 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(1, timeout_count * MAX_TIMERS, 0),
7147d761b07SShijith Thotton 			    "Timer triggered count doesn't match arm count");
7157d761b07SShijith Thotton 
7167d761b07SShijith Thotton 	return TEST_SUCCESS;
7177d761b07SShijith Thotton }
7187d761b07SShijith Thotton 
719a9de470cSBruce Richardson static int
_arm_wrapper_burst(void * arg)720a9de470cSBruce Richardson _arm_wrapper_burst(void *arg)
721a9de470cSBruce Richardson {
722a9de470cSBruce Richardson 	RTE_SET_USED(arg);
723a9de470cSBruce Richardson 
724a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(_arm_timers_burst(20, MAX_TIMERS),
725a9de470cSBruce Richardson 			"Failed to arm timers");
726a9de470cSBruce Richardson 
727a9de470cSBruce Richardson 	return TEST_SUCCESS;
728a9de470cSBruce Richardson }
729a9de470cSBruce Richardson 
730a9de470cSBruce Richardson static inline int
test_timer_arm_burst_multicore(void)731a9de470cSBruce Richardson test_timer_arm_burst_multicore(void)
732a9de470cSBruce Richardson {
733a9de470cSBruce Richardson 	rte_eal_remote_launch(_arm_wrapper_burst, NULL, test_lcore1);
734a9de470cSBruce Richardson 	rte_eal_remote_launch(_arm_wrapper_burst, NULL, test_lcore2);
735a9de470cSBruce Richardson 
736a9de470cSBruce Richardson 	rte_eal_mp_wait_lcore();
737a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(10, MAX_TIMERS * 2, 0),
738a9de470cSBruce Richardson 			"Timer triggered count doesn't match arm count");
739a9de470cSBruce Richardson 
740a9de470cSBruce Richardson 	return TEST_SUCCESS;
741a9de470cSBruce Richardson }
742a9de470cSBruce Richardson 
743a9de470cSBruce Richardson static inline int
test_timer_cancel_periodic(void)7447d761b07SShijith Thotton test_timer_cancel_periodic(void)
7457d761b07SShijith Thotton {
7467d761b07SShijith Thotton 	uint64_t i;
7477d761b07SShijith Thotton 	struct rte_event_timer *ev_tim;
7487d761b07SShijith Thotton 	const struct rte_event_timer tim = {
7497d761b07SShijith Thotton 		.ev.op = RTE_EVENT_OP_NEW,
7507d761b07SShijith Thotton 		.ev.queue_id = 0,
7517d761b07SShijith Thotton 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
7527d761b07SShijith Thotton 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
7537d761b07SShijith Thotton 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
7547d761b07SShijith Thotton 		.state = RTE_EVENT_TIMER_NOT_ARMED,
7557d761b07SShijith Thotton 		.timeout_ticks = CALC_TICKS(1),
7567d761b07SShijith Thotton 	};
7577d761b07SShijith Thotton 
7587d761b07SShijith Thotton 	for (i = 0; i < MAX_TIMERS; i++) {
7597d761b07SShijith Thotton 		TEST_ASSERT_SUCCESS(rte_mempool_get(eventdev_test_mempool,
7607d761b07SShijith Thotton 					(void **)&ev_tim),
7617d761b07SShijith Thotton 				"mempool alloc failed");
7627d761b07SShijith Thotton 		*ev_tim = tim;
7637d761b07SShijith Thotton 		ev_tim->ev.event_ptr = ev_tim;
7647d761b07SShijith Thotton 
7657d761b07SShijith Thotton 		TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim,
7667d761b07SShijith Thotton 					1), 1, "Failed to arm timer %d",
7677d761b07SShijith Thotton 				rte_errno);
7687d761b07SShijith Thotton 
7697d761b07SShijith Thotton 		rte_delay_us(100 + (i % 5000));
7707d761b07SShijith Thotton 
7717d761b07SShijith Thotton 		TEST_ASSERT_EQUAL(rte_event_timer_cancel_burst(timdev,
7727d761b07SShijith Thotton 					&ev_tim, 1), 1,
7737d761b07SShijith Thotton 				"Failed to cancel event timer %d", rte_errno);
7747d761b07SShijith Thotton 		rte_mempool_put(eventdev_test_mempool, ev_tim);
7757d761b07SShijith Thotton 	}
7767d761b07SShijith Thotton 
7777d761b07SShijith Thotton 
7787d761b07SShijith Thotton 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(30, MAX_TIMERS,
7797d761b07SShijith Thotton 				MAX_TIMERS),
7807d761b07SShijith Thotton 		"Timer triggered count doesn't match arm, cancel count");
7817d761b07SShijith Thotton 
7827d761b07SShijith Thotton 	return TEST_SUCCESS;
7837d761b07SShijith Thotton }
7847d761b07SShijith Thotton 
7857d761b07SShijith Thotton static inline int
test_timer_cancel(void)786a9de470cSBruce Richardson test_timer_cancel(void)
787a9de470cSBruce Richardson {
788a9de470cSBruce Richardson 	uint64_t i;
789a9de470cSBruce Richardson 	struct rte_event_timer *ev_tim;
790a9de470cSBruce Richardson 	const struct rte_event_timer tim = {
791a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
792a9de470cSBruce Richardson 		.ev.queue_id = 0,
793a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
794a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
795a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
796a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
7972385a7f5SPavan Nikhilesh 		.timeout_ticks = CALC_TICKS(20),
798a9de470cSBruce Richardson 	};
799a9de470cSBruce Richardson 
800a9de470cSBruce Richardson 	for (i = 0; i < MAX_TIMERS; i++) {
801a9de470cSBruce Richardson 		TEST_ASSERT_SUCCESS(rte_mempool_get(eventdev_test_mempool,
802a9de470cSBruce Richardson 					(void **)&ev_tim),
803a9de470cSBruce Richardson 				"mempool alloc failed");
804a9de470cSBruce Richardson 		*ev_tim = tim;
805a9de470cSBruce Richardson 		ev_tim->ev.event_ptr = ev_tim;
806a9de470cSBruce Richardson 
807a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim,
808a9de470cSBruce Richardson 					1), 1, "Failed to arm timer %d",
809a9de470cSBruce Richardson 				rte_errno);
810a9de470cSBruce Richardson 
811a9de470cSBruce Richardson 		rte_delay_us(100 + (i % 5000));
812a9de470cSBruce Richardson 
813a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(rte_event_timer_cancel_burst(timdev,
814a9de470cSBruce Richardson 					&ev_tim, 1), 1,
815a9de470cSBruce Richardson 				"Failed to cancel event timer %d", rte_errno);
816a9de470cSBruce Richardson 		rte_mempool_put(eventdev_test_mempool, ev_tim);
817a9de470cSBruce Richardson 	}
818a9de470cSBruce Richardson 
819a9de470cSBruce Richardson 
820a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(30, MAX_TIMERS,
821a9de470cSBruce Richardson 				MAX_TIMERS),
822a9de470cSBruce Richardson 		"Timer triggered count doesn't match arm, cancel count");
823a9de470cSBruce Richardson 
824a9de470cSBruce Richardson 	return TEST_SUCCESS;
825a9de470cSBruce Richardson }
826a9de470cSBruce Richardson 
827a9de470cSBruce Richardson static int
_cancel_producer(uint64_t timeout_tcks,uint64_t timers)828a9de470cSBruce Richardson _cancel_producer(uint64_t timeout_tcks, uint64_t timers)
829a9de470cSBruce Richardson {
830a9de470cSBruce Richardson 	uint64_t i;
831a9de470cSBruce Richardson 	struct rte_event_timer *ev_tim;
832a9de470cSBruce Richardson 	const struct rte_event_timer tim = {
833a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
834a9de470cSBruce Richardson 		.ev.queue_id = 0,
835a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
836a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
837a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
838a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
8392385a7f5SPavan Nikhilesh 		.timeout_ticks = CALC_TICKS(timeout_tcks),
840a9de470cSBruce Richardson 	};
841a9de470cSBruce Richardson 
842a9de470cSBruce Richardson 	for (i = 0; i < timers; i++) {
843a9de470cSBruce Richardson 		TEST_ASSERT_SUCCESS(rte_mempool_get(eventdev_test_mempool,
844a9de470cSBruce Richardson 					(void **)&ev_tim),
845a9de470cSBruce Richardson 				"mempool alloc failed");
846a9de470cSBruce Richardson 
847a9de470cSBruce Richardson 		*ev_tim = tim;
848a9de470cSBruce Richardson 		ev_tim->ev.event_ptr = ev_tim;
849a9de470cSBruce Richardson 
850a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim,
851a9de470cSBruce Richardson 					1), 1, "Failed to arm timer %d",
852a9de470cSBruce Richardson 				rte_errno);
853a9de470cSBruce Richardson 
854a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ev_tim->state, RTE_EVENT_TIMER_ARMED,
855a9de470cSBruce Richardson 				  "Failed to arm event timer");
856a9de470cSBruce Richardson 
857a9de470cSBruce Richardson 		while (rte_ring_enqueue(timer_producer_ring, ev_tim) != 0)
858a9de470cSBruce Richardson 			;
859a9de470cSBruce Richardson 	}
860a9de470cSBruce Richardson 
861a9de470cSBruce Richardson 	return TEST_SUCCESS;
862a9de470cSBruce Richardson }
863a9de470cSBruce Richardson 
864a9de470cSBruce Richardson static int
_cancel_producer_burst(uint64_t timeout_tcks,uint64_t timers)865a9de470cSBruce Richardson _cancel_producer_burst(uint64_t timeout_tcks, uint64_t timers)
866a9de470cSBruce Richardson {
867a9de470cSBruce Richardson 
868a9de470cSBruce Richardson 	uint64_t i;
869a9de470cSBruce Richardson 	int j, ret;
870a9de470cSBruce Richardson 	struct rte_event_timer *ev_tim[MAX_BURST];
871a9de470cSBruce Richardson 	const struct rte_event_timer tim = {
872a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
873a9de470cSBruce Richardson 		.ev.queue_id = 0,
874a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
875a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
876a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
877a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
8782385a7f5SPavan Nikhilesh 		.timeout_ticks = CALC_TICKS(timeout_tcks),
879a9de470cSBruce Richardson 	};
880a9de470cSBruce Richardson 	int arm_count = 0;
881a9de470cSBruce Richardson 
882a9de470cSBruce Richardson 	for (i = 0; i < timers / MAX_BURST; i++) {
883a9de470cSBruce Richardson 		TEST_ASSERT_SUCCESS(rte_mempool_get_bulk(
884a9de470cSBruce Richardson 				eventdev_test_mempool,
885a9de470cSBruce Richardson 				(void **)ev_tim, MAX_BURST),
886a9de470cSBruce Richardson 				"mempool alloc failed");
887a9de470cSBruce Richardson 
888a9de470cSBruce Richardson 		for (j = 0; j < MAX_BURST; j++) {
889a9de470cSBruce Richardson 			*ev_tim[j] = tim;
890a9de470cSBruce Richardson 			ev_tim[j]->ev.event_ptr = ev_tim[j];
891a9de470cSBruce Richardson 		}
892a9de470cSBruce Richardson 
893a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(rte_event_timer_arm_tmo_tick_burst(timdev,
894a9de470cSBruce Richardson 				ev_tim, tim.timeout_ticks, MAX_BURST),
895a9de470cSBruce Richardson 				MAX_BURST, "Failed to arm timer %d", rte_errno);
896a9de470cSBruce Richardson 
897a9de470cSBruce Richardson 		for (j = 0; j < MAX_BURST; j++)
898a9de470cSBruce Richardson 			TEST_ASSERT_EQUAL(ev_tim[j]->state,
899a9de470cSBruce Richardson 					  RTE_EVENT_TIMER_ARMED,
900a9de470cSBruce Richardson 					  "Event timer not armed, state = %d",
901a9de470cSBruce Richardson 					  ev_tim[j]->state);
902a9de470cSBruce Richardson 
903a9de470cSBruce Richardson 		ret = rte_ring_enqueue_bulk(timer_producer_ring,
904a9de470cSBruce Richardson 				(void **)ev_tim, MAX_BURST, NULL);
905a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ret, MAX_BURST,
906a9de470cSBruce Richardson 				"Failed to enqueue event timers to ring");
907a9de470cSBruce Richardson 		arm_count += ret;
908a9de470cSBruce Richardson 	}
909a9de470cSBruce Richardson 
910a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(arm_count, MAX_TIMERS,
911a9de470cSBruce Richardson 			  "Failed to arm expected number of event timers");
912a9de470cSBruce Richardson 
913a9de470cSBruce Richardson 	return TEST_SUCCESS;
914a9de470cSBruce Richardson }
915a9de470cSBruce Richardson 
916a9de470cSBruce Richardson static int
_cancel_producer_wrapper(void * args)917a9de470cSBruce Richardson _cancel_producer_wrapper(void *args)
918a9de470cSBruce Richardson {
919a9de470cSBruce Richardson 	RTE_SET_USED(args);
920a9de470cSBruce Richardson 
921a9de470cSBruce Richardson 	return _cancel_producer(20, MAX_TIMERS);
922a9de470cSBruce Richardson }
923a9de470cSBruce Richardson 
924a9de470cSBruce Richardson static int
_cancel_producer_burst_wrapper(void * args)925a9de470cSBruce Richardson _cancel_producer_burst_wrapper(void *args)
926a9de470cSBruce Richardson {
927a9de470cSBruce Richardson 	RTE_SET_USED(args);
928a9de470cSBruce Richardson 
929a9de470cSBruce Richardson 	return _cancel_producer_burst(100, MAX_TIMERS);
930a9de470cSBruce Richardson }
931a9de470cSBruce Richardson 
932a9de470cSBruce Richardson static int
_cancel_thread(void * args)933a9de470cSBruce Richardson _cancel_thread(void *args)
934a9de470cSBruce Richardson {
935a9de470cSBruce Richardson 	RTE_SET_USED(args);
936a9de470cSBruce Richardson 	struct rte_event_timer *ev_tim = NULL;
937a9de470cSBruce Richardson 	uint16_t ret;
938a9de470cSBruce Richardson 
939a9de470cSBruce Richardson 	while (!arm_done || rte_ring_count(timer_producer_ring) > 0) {
940a9de470cSBruce Richardson 		if (rte_ring_dequeue(timer_producer_ring, (void **)&ev_tim))
941a9de470cSBruce Richardson 			continue;
942a9de470cSBruce Richardson 
943a9de470cSBruce Richardson 		ret = rte_event_timer_cancel_burst(timdev, &ev_tim, 1);
944a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(ret, 1, "Failed to cancel timer");
945a9de470cSBruce Richardson 		rte_mempool_put(eventdev_test_mempool, (void *)ev_tim);
946a9de470cSBruce Richardson 	}
947a9de470cSBruce Richardson 
948a9de470cSBruce Richardson 	return TEST_SUCCESS;
949a9de470cSBruce Richardson }
950a9de470cSBruce Richardson 
951a9de470cSBruce Richardson static int
_cancel_burst_thread(void * args)952a9de470cSBruce Richardson _cancel_burst_thread(void *args)
953a9de470cSBruce Richardson {
954a9de470cSBruce Richardson 	RTE_SET_USED(args);
955a9de470cSBruce Richardson 
956a9de470cSBruce Richardson 	int ret, i, n;
957a9de470cSBruce Richardson 	struct rte_event_timer *ev_tim[MAX_BURST];
958a9de470cSBruce Richardson 	uint64_t cancel_count = 0;
959a9de470cSBruce Richardson 	uint64_t dequeue_count = 0;
960a9de470cSBruce Richardson 
961a9de470cSBruce Richardson 	while (!arm_done || rte_ring_count(timer_producer_ring) > 0) {
962a9de470cSBruce Richardson 		n = rte_ring_dequeue_burst(timer_producer_ring,
963a9de470cSBruce Richardson 				(void **)ev_tim, MAX_BURST, NULL);
964a9de470cSBruce Richardson 		if (!n)
965a9de470cSBruce Richardson 			continue;
966a9de470cSBruce Richardson 
967a9de470cSBruce Richardson 		dequeue_count += n;
968a9de470cSBruce Richardson 
969a9de470cSBruce Richardson 		for (i = 0; i < n; i++)
970a9de470cSBruce Richardson 			TEST_ASSERT_EQUAL(ev_tim[i]->state,
971a9de470cSBruce Richardson 					  RTE_EVENT_TIMER_ARMED,
972a9de470cSBruce Richardson 					  "Event timer not armed, state = %d",
973a9de470cSBruce Richardson 					  ev_tim[i]->state);
974a9de470cSBruce Richardson 
975a9de470cSBruce Richardson 		ret = rte_event_timer_cancel_burst(timdev, ev_tim, n);
976a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(n, ret, "Failed to cancel complete burst of "
977a9de470cSBruce Richardson 				  "event timers");
978a9de470cSBruce Richardson 		rte_mempool_put_bulk(eventdev_test_mempool, (void **)ev_tim,
979a9de470cSBruce Richardson 				RTE_MIN(ret, MAX_BURST));
980a9de470cSBruce Richardson 
981a9de470cSBruce Richardson 		cancel_count += ret;
982a9de470cSBruce Richardson 	}
983a9de470cSBruce Richardson 
984a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(cancel_count, MAX_TIMERS,
985a9de470cSBruce Richardson 			  "Failed to cancel expected number of timers: "
986a9de470cSBruce Richardson 			  "expected = %d, cancel_count = %"PRIu64", "
987a9de470cSBruce Richardson 			  "dequeue_count = %"PRIu64"\n", MAX_TIMERS,
988a9de470cSBruce Richardson 			  cancel_count, dequeue_count);
989a9de470cSBruce Richardson 
990a9de470cSBruce Richardson 	return TEST_SUCCESS;
991a9de470cSBruce Richardson }
992a9de470cSBruce Richardson 
993a9de470cSBruce Richardson static inline int
test_timer_cancel_multicore(void)994a9de470cSBruce Richardson test_timer_cancel_multicore(void)
995a9de470cSBruce Richardson {
996a9de470cSBruce Richardson 	arm_done = 0;
997a9de470cSBruce Richardson 	timer_producer_ring = rte_ring_create("timer_cancel_queue",
998a9de470cSBruce Richardson 			MAX_TIMERS * 2, rte_socket_id(), 0);
999a9de470cSBruce Richardson 	TEST_ASSERT_NOT_NULL(timer_producer_ring,
1000a9de470cSBruce Richardson 			"Unable to reserve memory for ring");
1001a9de470cSBruce Richardson 
1002a9de470cSBruce Richardson 	rte_eal_remote_launch(_cancel_thread, NULL, test_lcore3);
1003a9de470cSBruce Richardson 	rte_eal_remote_launch(_cancel_producer_wrapper, NULL, test_lcore1);
1004a9de470cSBruce Richardson 	rte_eal_remote_launch(_cancel_producer_wrapper, NULL, test_lcore2);
1005a9de470cSBruce Richardson 
1006a9de470cSBruce Richardson 	rte_eal_wait_lcore(test_lcore1);
1007a9de470cSBruce Richardson 	rte_eal_wait_lcore(test_lcore2);
1008a9de470cSBruce Richardson 	arm_done = 1;
1009a9de470cSBruce Richardson 	rte_eal_wait_lcore(test_lcore3);
1010a9de470cSBruce Richardson 	rte_ring_free(timer_producer_ring);
1011a9de470cSBruce Richardson 
1012a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(30, MAX_TIMERS * 2,
1013a9de470cSBruce Richardson 			MAX_TIMERS * 2),
1014a9de470cSBruce Richardson 			"Timer triggered count doesn't match arm count");
1015a9de470cSBruce Richardson 
1016a9de470cSBruce Richardson 	return TEST_SUCCESS;
1017a9de470cSBruce Richardson }
1018a9de470cSBruce Richardson 
1019a9de470cSBruce Richardson static inline int
test_timer_cancel_burst_multicore(void)1020a9de470cSBruce Richardson test_timer_cancel_burst_multicore(void)
1021a9de470cSBruce Richardson {
1022a9de470cSBruce Richardson 	arm_done = 0;
1023a9de470cSBruce Richardson 	timer_producer_ring = rte_ring_create("timer_cancel_queue",
1024a9de470cSBruce Richardson 			MAX_TIMERS * 2, rte_socket_id(), 0);
1025a9de470cSBruce Richardson 	TEST_ASSERT_NOT_NULL(timer_producer_ring,
1026a9de470cSBruce Richardson 			"Unable to reserve memory for ring");
1027a9de470cSBruce Richardson 
1028a9de470cSBruce Richardson 	rte_eal_remote_launch(_cancel_burst_thread, NULL, test_lcore2);
1029a9de470cSBruce Richardson 	rte_eal_remote_launch(_cancel_producer_burst_wrapper, NULL,
1030a9de470cSBruce Richardson 			test_lcore1);
1031a9de470cSBruce Richardson 
1032a9de470cSBruce Richardson 	rte_eal_wait_lcore(test_lcore1);
1033a9de470cSBruce Richardson 	arm_done = 1;
1034a9de470cSBruce Richardson 	rte_eal_wait_lcore(test_lcore2);
1035a9de470cSBruce Richardson 	rte_ring_free(timer_producer_ring);
1036a9de470cSBruce Richardson 
1037a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(30, MAX_TIMERS,
1038a9de470cSBruce Richardson 			MAX_TIMERS),
1039a9de470cSBruce Richardson 			"Timer triggered count doesn't match arm count");
1040a9de470cSBruce Richardson 
1041a9de470cSBruce Richardson 	return TEST_SUCCESS;
1042a9de470cSBruce Richardson }
1043a9de470cSBruce Richardson 
1044a9de470cSBruce Richardson static inline int
test_timer_cancel_random(void)1045a9de470cSBruce Richardson test_timer_cancel_random(void)
1046a9de470cSBruce Richardson {
1047a9de470cSBruce Richardson 	uint64_t i;
1048a9de470cSBruce Richardson 	uint64_t events_canceled = 0;
1049a9de470cSBruce Richardson 	struct rte_event_timer *ev_tim;
1050a9de470cSBruce Richardson 	const struct rte_event_timer tim = {
1051a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
1052a9de470cSBruce Richardson 		.ev.queue_id = 0,
1053a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1054a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1055a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1056a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
10572385a7f5SPavan Nikhilesh 		.timeout_ticks = CALC_TICKS(20),
1058a9de470cSBruce Richardson 	};
1059a9de470cSBruce Richardson 
1060a9de470cSBruce Richardson 	for (i = 0; i < MAX_TIMERS; i++) {
1061a9de470cSBruce Richardson 
1062a9de470cSBruce Richardson 		TEST_ASSERT_SUCCESS(rte_mempool_get(eventdev_test_mempool,
1063a9de470cSBruce Richardson 					(void **)&ev_tim),
1064a9de470cSBruce Richardson 				"mempool alloc failed");
1065a9de470cSBruce Richardson 		*ev_tim = tim;
1066a9de470cSBruce Richardson 		ev_tim->ev.event_ptr = ev_tim;
1067a9de470cSBruce Richardson 
1068a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim,
1069a9de470cSBruce Richardson 					1), 1, "Failed to arm timer %d",
1070a9de470cSBruce Richardson 				rte_errno);
1071a9de470cSBruce Richardson 
1072a9de470cSBruce Richardson 		if (rte_rand() & 1) {
1073a9de470cSBruce Richardson 			rte_delay_us(100 + (i % 5000));
1074a9de470cSBruce Richardson 			TEST_ASSERT_EQUAL(rte_event_timer_cancel_burst(
1075a9de470cSBruce Richardson 						timdev,
1076a9de470cSBruce Richardson 						&ev_tim, 1), 1,
1077a9de470cSBruce Richardson 				"Failed to cancel event timer %d", rte_errno);
1078a9de470cSBruce Richardson 			rte_mempool_put(eventdev_test_mempool, ev_tim);
1079a9de470cSBruce Richardson 			events_canceled++;
1080a9de470cSBruce Richardson 		}
1081a9de470cSBruce Richardson 	}
1082a9de470cSBruce Richardson 
1083a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(30, MAX_TIMERS,
1084a9de470cSBruce Richardson 				events_canceled),
1085a9de470cSBruce Richardson 		       "Timer triggered count doesn't match arm, cancel count");
1086a9de470cSBruce Richardson 
1087a9de470cSBruce Richardson 	return TEST_SUCCESS;
1088a9de470cSBruce Richardson }
1089a9de470cSBruce Richardson 
1090a9de470cSBruce Richardson /* Check that the adapter can be created correctly */
1091a9de470cSBruce Richardson static int
adapter_create(void)1092a9de470cSBruce Richardson adapter_create(void)
1093a9de470cSBruce Richardson {
1094a9de470cSBruce Richardson 	int adapter_id = 0;
1095a9de470cSBruce Richardson 	struct rte_event_timer_adapter *adapter, *adapter2;
1096a9de470cSBruce Richardson 
1097a9de470cSBruce Richardson 	struct rte_event_timer_adapter_conf conf = {
1098a9de470cSBruce Richardson 		.event_dev_id = evdev + 1,  // invalid event dev id
1099a9de470cSBruce Richardson 		.timer_adapter_id = adapter_id,
1100a9de470cSBruce Richardson 		.clk_src = RTE_EVENT_TIMER_ADAPTER_CPU_CLK,
1101a9de470cSBruce Richardson 		.timer_tick_ns = NSECPERSEC / 10,
1102a9de470cSBruce Richardson 		.max_tmo_ns = 180 * NSECPERSEC,
1103a9de470cSBruce Richardson 		.nb_timers = MAX_TIMERS,
11042385a7f5SPavan Nikhilesh 		.flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES,
1105a9de470cSBruce Richardson 	};
1106a9de470cSBruce Richardson 	uint32_t caps = 0;
1107a9de470cSBruce Richardson 
1108a9de470cSBruce Richardson 	/* Test invalid conf */
1109a9de470cSBruce Richardson 	adapter = rte_event_timer_adapter_create(&conf);
1110a9de470cSBruce Richardson 	TEST_ASSERT_NULL(adapter, "Created adapter with invalid "
1111a9de470cSBruce Richardson 			"event device id");
1112a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Incorrect errno value for "
1113a9de470cSBruce Richardson 			"invalid event device id");
1114a9de470cSBruce Richardson 
1115a9de470cSBruce Richardson 	/* Test valid conf */
1116a9de470cSBruce Richardson 	conf.event_dev_id = evdev;
1117a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_caps_get(evdev, &caps),
1118a9de470cSBruce Richardson 			"failed to get adapter capabilities");
1119a9de470cSBruce Richardson 	if (!(caps & RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT))
1120a9de470cSBruce Richardson 		adapter = rte_event_timer_adapter_create_ext(&conf,
1121a9de470cSBruce Richardson 				test_port_conf_cb,
1122a9de470cSBruce Richardson 				NULL);
1123a9de470cSBruce Richardson 	else
1124a9de470cSBruce Richardson 		adapter = rte_event_timer_adapter_create(&conf);
1125a9de470cSBruce Richardson 	TEST_ASSERT_NOT_NULL(adapter, "Failed to create adapter with valid "
1126a9de470cSBruce Richardson 			"configuration");
1127a9de470cSBruce Richardson 
1128a9de470cSBruce Richardson 	/* Test existing id */
1129a9de470cSBruce Richardson 	adapter2 = rte_event_timer_adapter_create(&conf);
1130a9de470cSBruce Richardson 	TEST_ASSERT_NULL(adapter2, "Created adapter with in-use id");
1131a9de470cSBruce Richardson 	TEST_ASSERT(rte_errno == EEXIST, "Incorrect errno value for existing "
1132a9de470cSBruce Richardson 			"id");
1133a9de470cSBruce Richardson 
1134a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_free(adapter),
1135a9de470cSBruce Richardson 			"Failed to free adapter");
1136a9de470cSBruce Richardson 
1137a9de470cSBruce Richardson 	return TEST_SUCCESS;
1138a9de470cSBruce Richardson }
1139a9de470cSBruce Richardson 
1140a9de470cSBruce Richardson 
1141a9de470cSBruce Richardson /* Test that adapter can be freed correctly. */
1142a9de470cSBruce Richardson static int
adapter_free(void)1143a9de470cSBruce Richardson adapter_free(void)
1144a9de470cSBruce Richardson {
1145a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_stop(timdev),
1146a9de470cSBruce Richardson 			"Failed to stop adapter");
1147a9de470cSBruce Richardson 
1148a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_free(timdev),
1149a9de470cSBruce Richardson 			"Failed to free valid adapter");
1150a9de470cSBruce Richardson 
1151a9de470cSBruce Richardson 	/* Test free of already freed adapter */
1152a9de470cSBruce Richardson 	TEST_ASSERT_FAIL(rte_event_timer_adapter_free(timdev),
1153a9de470cSBruce Richardson 			"Freed adapter that was already freed");
1154a9de470cSBruce Richardson 
1155a9de470cSBruce Richardson 	/* Test free of null adapter */
1156a9de470cSBruce Richardson 	timdev = NULL;
1157a9de470cSBruce Richardson 	TEST_ASSERT_FAIL(rte_event_timer_adapter_free(timdev),
1158a9de470cSBruce Richardson 			"Freed null adapter");
1159a9de470cSBruce Richardson 
1160a9de470cSBruce Richardson 	rte_mempool_free(eventdev_test_mempool);
1161a9de470cSBruce Richardson 
1162a9de470cSBruce Richardson 	return TEST_SUCCESS;
1163a9de470cSBruce Richardson }
1164a9de470cSBruce Richardson 
1165a9de470cSBruce Richardson /* Test that adapter info can be retrieved and is correct. */
1166a9de470cSBruce Richardson static int
adapter_get_info(void)1167a9de470cSBruce Richardson adapter_get_info(void)
1168a9de470cSBruce Richardson {
1169a9de470cSBruce Richardson 	struct rte_event_timer_adapter_info info;
1170a9de470cSBruce Richardson 
1171a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_get_info(timdev, &info),
1172a9de470cSBruce Richardson 			"Failed to get adapter info");
1173a9de470cSBruce Richardson 
1174a9de470cSBruce Richardson 	if (using_services)
1175a9de470cSBruce Richardson 		TEST_ASSERT_EQUAL(info.event_dev_port_id, 1,
1176a9de470cSBruce Richardson 				"Expected port id = 1, got port id = %d",
1177a9de470cSBruce Richardson 				info.event_dev_port_id);
1178a9de470cSBruce Richardson 
1179a9de470cSBruce Richardson 	return TEST_SUCCESS;
1180a9de470cSBruce Richardson }
1181a9de470cSBruce Richardson 
1182a9de470cSBruce Richardson /* Test adapter lookup via adapter ID. */
1183a9de470cSBruce Richardson static int
adapter_lookup(void)1184a9de470cSBruce Richardson adapter_lookup(void)
1185a9de470cSBruce Richardson {
1186a9de470cSBruce Richardson 	struct rte_event_timer_adapter *adapter;
1187a9de470cSBruce Richardson 
1188a9de470cSBruce Richardson 	adapter = rte_event_timer_adapter_lookup(TEST_ADAPTER_ID);
1189a9de470cSBruce Richardson 	TEST_ASSERT_NOT_NULL(adapter, "Failed to lookup adapter");
1190a9de470cSBruce Richardson 
1191a9de470cSBruce Richardson 	return TEST_SUCCESS;
1192a9de470cSBruce Richardson }
1193a9de470cSBruce Richardson 
1194a9de470cSBruce Richardson static int
adapter_start(void)1195a9de470cSBruce Richardson adapter_start(void)
1196a9de470cSBruce Richardson {
11977d761b07SShijith Thotton 	TEST_ASSERT_SUCCESS(_timdev_setup(180 * NSECPERSEC, NSECPERSEC / 10,
11987d761b07SShijith Thotton 					  RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES),
1199a9de470cSBruce Richardson 			    "Failed to start adapter");
1200d69d0858SPavan Nikhilesh 	TEST_ASSERT_EQUAL(rte_event_timer_adapter_start(timdev), -EALREADY,
1201d69d0858SPavan Nikhilesh 			"Timer adapter started without call to stop.");
1202a9de470cSBruce Richardson 
1203a9de470cSBruce Richardson 	return TEST_SUCCESS;
1204a9de470cSBruce Richardson }
1205a9de470cSBruce Richardson 
1206a9de470cSBruce Richardson /* Test that adapter stops correctly. */
1207a9de470cSBruce Richardson static int
adapter_stop(void)1208a9de470cSBruce Richardson adapter_stop(void)
1209a9de470cSBruce Richardson {
1210a9de470cSBruce Richardson 	struct rte_event_timer_adapter *l_adapter = NULL;
1211a9de470cSBruce Richardson 
1212a9de470cSBruce Richardson 	/* Test adapter stop */
1213a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_stop(timdev),
1214a9de470cSBruce Richardson 			"Failed to stop event adapter");
1215a9de470cSBruce Richardson 
1216a9de470cSBruce Richardson 	TEST_ASSERT_FAIL(rte_event_timer_adapter_stop(l_adapter),
1217a9de470cSBruce Richardson 			"Erroneously stopped null event adapter");
1218a9de470cSBruce Richardson 
1219a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_free(timdev),
1220a9de470cSBruce Richardson 			"Failed to free adapter");
1221a9de470cSBruce Richardson 
1222a9de470cSBruce Richardson 	rte_mempool_free(eventdev_test_mempool);
1223a9de470cSBruce Richardson 
1224a9de470cSBruce Richardson 	return TEST_SUCCESS;
1225a9de470cSBruce Richardson }
1226a9de470cSBruce Richardson 
1227a9de470cSBruce Richardson /* Test increment and reset of ev_enq_count stat */
1228a9de470cSBruce Richardson static int
stat_inc_reset_ev_enq(void)1229a9de470cSBruce Richardson stat_inc_reset_ev_enq(void)
1230a9de470cSBruce Richardson {
1231a9de470cSBruce Richardson 	int ret, i, n;
1232a9de470cSBruce Richardson 	int num_evtims = MAX_TIMERS;
1233a9de470cSBruce Richardson 	struct rte_event_timer *evtims[num_evtims];
1234fb9c2133SShijith Thotton 	struct rte_event evs[num_evtims];
1235a9de470cSBruce Richardson 	struct rte_event_timer_adapter_stats stats;
1236fb9c2133SShijith Thotton 	uint64_t ticks = 5;
1237a9de470cSBruce Richardson 	const struct rte_event_timer init_tim = {
1238a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
1239a9de470cSBruce Richardson 		.ev.queue_id = TEST_QUEUE_ID,
1240a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1241a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1242a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1243a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1244fb9c2133SShijith Thotton 		.timeout_ticks = CALC_TICKS(ticks), /**< expire in .5 sec */
1245a9de470cSBruce Richardson 	};
1246a9de470cSBruce Richardson 
1247a9de470cSBruce Richardson 	ret = rte_mempool_get_bulk(eventdev_test_mempool, (void **)evtims,
1248a9de470cSBruce Richardson 				   num_evtims);
1249a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 0, "Failed to get array of timer objs: ret = %d",
1250a9de470cSBruce Richardson 			  ret);
1251a9de470cSBruce Richardson 
1252a9de470cSBruce Richardson 	for (i = 0; i < num_evtims; i++) {
1253a9de470cSBruce Richardson 		*evtims[i] = init_tim;
1254a9de470cSBruce Richardson 		evtims[i]->ev.event_ptr = evtims[i];
1255a9de470cSBruce Richardson 	}
1256a9de470cSBruce Richardson 
1257a9de470cSBruce Richardson 	ret = rte_event_timer_adapter_stats_get(timdev, &stats);
1258a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 0, "Failed to get stats");
1259a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL((int)stats.ev_enq_count, 0, "Stats not clear at "
1260a9de470cSBruce Richardson 			  "startup");
1261a9de470cSBruce Richardson 
1262a9de470cSBruce Richardson 	/* Test with the max value for the adapter */
1263a9de470cSBruce Richardson 	ret = rte_event_timer_arm_burst(timdev, evtims, num_evtims);
1264a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, num_evtims,
1265a9de470cSBruce Richardson 			  "Failed to arm all event timers: attempted = %d, "
1266a9de470cSBruce Richardson 			  "succeeded = %d, rte_errno = %s",
1267a9de470cSBruce Richardson 			  num_evtims, ret, rte_strerror(rte_errno));
1268a9de470cSBruce Richardson 
1269fb9c2133SShijith Thotton 	n = timeout_event_dequeue(evs, RTE_DIM(evs), WAIT_TICKS(ticks));
1270fb9c2133SShijith Thotton 	TEST_ASSERT_EQUAL(n, num_evtims, "Expected %d timer expiry events, got %d",
1271fb9c2133SShijith Thotton 			  num_evtims, n);
1272a9de470cSBruce Richardson 
1273a9de470cSBruce Richardson 	/* Make sure the eventdev is still empty */
1274fb9c2133SShijith Thotton 	n = timeout_event_dequeue(evs, 1, WAIT_TICKS(1));
1275a9de470cSBruce Richardson 
1276a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(n, 0, "Dequeued unexpected number of timer expiry "
1277a9de470cSBruce Richardson 			  "events from event device");
1278a9de470cSBruce Richardson 
1279a9de470cSBruce Richardson 	/* Check stats again */
1280a9de470cSBruce Richardson 	ret = rte_event_timer_adapter_stats_get(timdev, &stats);
1281a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 0, "Failed to get stats");
1282a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL((int)stats.ev_enq_count, num_evtims,
1283a9de470cSBruce Richardson 			  "Expected enqueue stat = %d; got %d", num_evtims,
1284a9de470cSBruce Richardson 			  (int)stats.ev_enq_count);
1285a9de470cSBruce Richardson 
1286a9de470cSBruce Richardson 	/* Reset and check again */
1287a9de470cSBruce Richardson 	ret = rte_event_timer_adapter_stats_reset(timdev);
1288a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 0, "Failed to reset stats");
1289a9de470cSBruce Richardson 
1290a9de470cSBruce Richardson 	ret = rte_event_timer_adapter_stats_get(timdev, &stats);
1291a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 0, "Failed to get stats");
1292a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL((int)stats.ev_enq_count, 0,
1293a9de470cSBruce Richardson 			  "Expected enqueue stat = %d; got %d", 0,
1294a9de470cSBruce Richardson 			  (int)stats.ev_enq_count);
1295a9de470cSBruce Richardson 
1296a9de470cSBruce Richardson 	rte_mempool_put_bulk(eventdev_test_mempool, (void **)evtims,
1297a9de470cSBruce Richardson 			     num_evtims);
1298a9de470cSBruce Richardson 
1299a9de470cSBruce Richardson 	return TEST_SUCCESS;
1300a9de470cSBruce Richardson }
1301a9de470cSBruce Richardson 
1302a9de470cSBruce Richardson /* Test various cases in arming timers */
1303a9de470cSBruce Richardson static int
event_timer_arm(void)1304a9de470cSBruce Richardson event_timer_arm(void)
1305a9de470cSBruce Richardson {
1306a9de470cSBruce Richardson 	uint16_t n;
1307a9de470cSBruce Richardson 	int ret;
1308a9de470cSBruce Richardson 	struct rte_event_timer_adapter *adapter = timdev;
1309a9de470cSBruce Richardson 	struct rte_event_timer *evtim = NULL;
1310a9de470cSBruce Richardson 	struct rte_event evs[BATCH_SIZE];
1311fb9c2133SShijith Thotton 	uint64_t ticks = 5;
1312a9de470cSBruce Richardson 	const struct rte_event_timer init_tim = {
1313a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
1314a9de470cSBruce Richardson 		.ev.queue_id = TEST_QUEUE_ID,
1315a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1316a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1317a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1318a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1319fb9c2133SShijith Thotton 		.timeout_ticks = CALC_TICKS(ticks), /**< expire in .5 sec */
1320a9de470cSBruce Richardson 	};
1321a9de470cSBruce Richardson 
1322a9de470cSBruce Richardson 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1323a9de470cSBruce Richardson 	if (evtim == NULL) {
1324a9de470cSBruce Richardson 		/* Failed to get an event timer object */
1325a9de470cSBruce Richardson 		return TEST_FAILED;
1326a9de470cSBruce Richardson 	}
1327a9de470cSBruce Richardson 
1328a9de470cSBruce Richardson 	/* Set up a timer */
1329a9de470cSBruce Richardson 	*evtim = init_tim;
1330a9de470cSBruce Richardson 	evtim->ev.event_ptr = evtim;
1331a9de470cSBruce Richardson 
1332a9de470cSBruce Richardson 	/* Test single timer arm succeeds */
1333a9de470cSBruce Richardson 	ret = rte_event_timer_arm_burst(adapter, &evtim, 1);
1334a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s\n",
1335a9de470cSBruce Richardson 			  rte_strerror(rte_errno));
1336a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ARMED, "Event timer "
1337a9de470cSBruce Richardson 			  "in incorrect state");
1338a9de470cSBruce Richardson 
1339a9de470cSBruce Richardson 	/* Test arm of armed timer fails */
1340a9de470cSBruce Richardson 	ret = rte_event_timer_arm_burst(adapter, &evtim, 1);
1341a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 0, "expected return value from "
1342a9de470cSBruce Richardson 			  "rte_event_timer_arm_burst: 0, got: %d", ret);
1343a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(rte_errno, EALREADY, "Unexpected rte_errno value "
1344a9de470cSBruce Richardson 			  "after arming already armed timer");
1345a9de470cSBruce Richardson 
1346fb9c2133SShijith Thotton 	n = timeout_event_dequeue(evs, RTE_DIM(evs), WAIT_TICKS(ticks));
1347a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(n, 1, "Failed to dequeue expected number of expiry "
1348a9de470cSBruce Richardson 			  "events from event device");
1349a9de470cSBruce Richardson 
1350a9de470cSBruce Richardson 	rte_mempool_put(eventdev_test_mempool, evtim);
1351a9de470cSBruce Richardson 
1352a9de470cSBruce Richardson 	return TEST_SUCCESS;
1353a9de470cSBruce Richardson }
1354a9de470cSBruce Richardson 
1355a9de470cSBruce Richardson /* This test checks that repeated references to the same event timer in the
1356a9de470cSBruce Richardson  * arm request work as expected; only the first one through should succeed.
1357a9de470cSBruce Richardson  */
1358a9de470cSBruce Richardson static int
event_timer_arm_double(void)1359a9de470cSBruce Richardson event_timer_arm_double(void)
1360a9de470cSBruce Richardson {
1361a9de470cSBruce Richardson 	uint16_t n;
1362a9de470cSBruce Richardson 	int ret;
1363a9de470cSBruce Richardson 	struct rte_event_timer_adapter *adapter = timdev;
1364a9de470cSBruce Richardson 	struct rte_event_timer *evtim = NULL;
1365a9de470cSBruce Richardson 	struct rte_event evs[BATCH_SIZE];
1366fb9c2133SShijith Thotton 	uint64_t ticks = 5;
1367a9de470cSBruce Richardson 	const struct rte_event_timer init_tim = {
1368a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
1369a9de470cSBruce Richardson 		.ev.queue_id = TEST_QUEUE_ID,
1370a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1371a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1372a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1373a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1374fb9c2133SShijith Thotton 		.timeout_ticks = CALC_TICKS(ticks), /**< expire in .5 sec */
1375a9de470cSBruce Richardson 	};
1376a9de470cSBruce Richardson 
1377a9de470cSBruce Richardson 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1378a9de470cSBruce Richardson 	if (evtim == NULL) {
1379a9de470cSBruce Richardson 		/* Failed to get an event timer object */
1380a9de470cSBruce Richardson 		return TEST_FAILED;
1381a9de470cSBruce Richardson 	}
1382a9de470cSBruce Richardson 
1383a9de470cSBruce Richardson 	/* Set up a timer */
1384a9de470cSBruce Richardson 	*evtim = init_tim;
1385a9de470cSBruce Richardson 	evtim->ev.event_ptr = evtim;
1386a9de470cSBruce Richardson 
1387a9de470cSBruce Richardson 	struct rte_event_timer *evtim_arr[] = {evtim, evtim};
1388a9de470cSBruce Richardson 	ret = rte_event_timer_arm_burst(adapter, evtim_arr, RTE_DIM(evtim_arr));
1389a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 1, "Unexpected return value from "
1390a9de470cSBruce Richardson 			  "rte_event_timer_arm_burst");
1391a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(rte_errno, EALREADY, "Unexpected rte_errno value "
1392a9de470cSBruce Richardson 			  "after double-arm");
1393a9de470cSBruce Richardson 
1394fb9c2133SShijith Thotton 	n = timeout_event_dequeue(evs, RTE_DIM(evs), WAIT_TICKS(ticks));
1395a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(n, 1, "Dequeued incorrect number of expiry events - "
1396a9de470cSBruce Richardson 			  "expected: 1, actual: %d", n);
1397a9de470cSBruce Richardson 
1398a9de470cSBruce Richardson 	rte_mempool_put(eventdev_test_mempool, evtim);
1399a9de470cSBruce Richardson 
1400a9de470cSBruce Richardson 	return TEST_SUCCESS;
1401a9de470cSBruce Richardson }
1402a9de470cSBruce Richardson 
1403a9de470cSBruce Richardson /* Test the timer expiry event is generated at the expected time.  */
1404a9de470cSBruce Richardson static int
event_timer_arm_expiry(void)1405a9de470cSBruce Richardson event_timer_arm_expiry(void)
1406a9de470cSBruce Richardson {
1407a9de470cSBruce Richardson 	uint16_t n;
1408a9de470cSBruce Richardson 	int ret;
1409a9de470cSBruce Richardson 	struct rte_event_timer_adapter *adapter = timdev;
1410a9de470cSBruce Richardson 	struct rte_event_timer *evtim = NULL;
1411a9de470cSBruce Richardson 	struct rte_event_timer *evtim2 = NULL;
1412a9de470cSBruce Richardson 	struct rte_event evs[BATCH_SIZE];
1413a9de470cSBruce Richardson 	const struct rte_event_timer init_tim = {
1414a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
1415a9de470cSBruce Richardson 		.ev.queue_id = TEST_QUEUE_ID,
1416a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1417a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1418a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1419a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1420a9de470cSBruce Richardson 	};
1421fb9c2133SShijith Thotton 	uint64_t ticks = 30;
1422a9de470cSBruce Richardson 
1423a9de470cSBruce Richardson 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1424a9de470cSBruce Richardson 	if (evtim == NULL) {
1425a9de470cSBruce Richardson 		/* Failed to get an event timer object */
1426a9de470cSBruce Richardson 		return TEST_FAILED;
1427a9de470cSBruce Richardson 	}
1428a9de470cSBruce Richardson 
1429a9de470cSBruce Richardson 	/* Set up an event timer */
1430a9de470cSBruce Richardson 	*evtim = init_tim;
1431fb9c2133SShijith Thotton 	evtim->timeout_ticks = CALC_TICKS(ticks); /**< expire in 3 secs */
1432a9de470cSBruce Richardson 	evtim->ev.event_ptr = evtim;
1433a9de470cSBruce Richardson 
1434a9de470cSBruce Richardson 	ret = rte_event_timer_arm_burst(adapter, &evtim, 1);
1435a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s",
1436a9de470cSBruce Richardson 			  rte_strerror(rte_errno));
1437a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ARMED, "Event "
1438a9de470cSBruce Richardson 			  "timer in incorrect state");
1439a9de470cSBruce Richardson 
1440fb9c2133SShijith Thotton 	n = timeout_event_dequeue(evs, RTE_DIM(evs), ticks - 1);
1441a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(n, 0, "Dequeued unexpected timer expiry event");
1442a9de470cSBruce Richardson 
1443fb9c2133SShijith Thotton 	n = timeout_event_dequeue(evs, RTE_DIM(evs), WAIT_TICKS(1));
1444a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(n, 1, "Dequeued incorrect number (%d) of timer "
1445a9de470cSBruce Richardson 			  "expiry events", n);
1446a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(evs[0].event_type, RTE_EVENT_TYPE_TIMER,
1447a9de470cSBruce Richardson 			  "Dequeued unexpected type of event");
1448a9de470cSBruce Richardson 
1449a9de470cSBruce Richardson 	/* Check that we recover the original event timer and then free it */
1450a9de470cSBruce Richardson 	evtim2 = evs[0].event_ptr;
1451a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(evtim, evtim2,
1452a9de470cSBruce Richardson 			  "Failed to recover pointer to original event timer");
1453a9de470cSBruce Richardson 	rte_mempool_put(eventdev_test_mempool, evtim2);
1454a9de470cSBruce Richardson 
1455a9de470cSBruce Richardson 	return TEST_SUCCESS;
1456a9de470cSBruce Richardson }
1457a9de470cSBruce Richardson 
1458a9de470cSBruce Richardson /* Check that rearming a timer works as expected. */
1459a9de470cSBruce Richardson static int
event_timer_arm_rearm(void)1460a9de470cSBruce Richardson event_timer_arm_rearm(void)
1461a9de470cSBruce Richardson {
1462a9de470cSBruce Richardson 	uint16_t n;
1463a9de470cSBruce Richardson 	int ret;
1464a9de470cSBruce Richardson 	struct rte_event_timer *evtim = NULL;
1465a9de470cSBruce Richardson 	struct rte_event_timer *evtim2 = NULL;
1466a9de470cSBruce Richardson 	struct rte_event evs[BATCH_SIZE];
1467a9de470cSBruce Richardson 	const struct rte_event_timer init_tim = {
1468a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
1469a9de470cSBruce Richardson 		.ev.queue_id = TEST_QUEUE_ID,
1470a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1471a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1472a9de470cSBruce Richardson 		.ev.event_type = RTE_EVENT_TYPE_TIMER,
1473a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1474a9de470cSBruce Richardson 	};
1475fb9c2133SShijith Thotton 	uint64_t ticks = 1;
1476a9de470cSBruce Richardson 
1477a9de470cSBruce Richardson 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1478a9de470cSBruce Richardson 	if (evtim == NULL) {
1479a9de470cSBruce Richardson 		/* Failed to get an event timer object */
1480a9de470cSBruce Richardson 		return TEST_FAILED;
1481a9de470cSBruce Richardson 	}
1482a9de470cSBruce Richardson 
1483a9de470cSBruce Richardson 	/* Set up a timer */
1484a9de470cSBruce Richardson 	*evtim = init_tim;
1485fb9c2133SShijith Thotton 	evtim->timeout_ticks = CALC_TICKS(ticks); /**< expire in 0.1 sec */
1486a9de470cSBruce Richardson 	evtim->ev.event_ptr = evtim;
1487a9de470cSBruce Richardson 
1488a9de470cSBruce Richardson 	/* Arm it */
1489a9de470cSBruce Richardson 	ret = rte_event_timer_arm_burst(timdev, &evtim, 1);
1490a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s\n",
1491a9de470cSBruce Richardson 			  rte_strerror(rte_errno));
1492a9de470cSBruce Richardson 
1493fb9c2133SShijith Thotton 	n = timeout_event_dequeue(evs, RTE_DIM(evs), WAIT_TICKS(ticks));
1494a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(n, 1, "Failed to dequeue expected number of expiry "
1495a9de470cSBruce Richardson 			  "events from event device");
1496a9de470cSBruce Richardson 
1497a9de470cSBruce Richardson 	/* Recover the timer through the event that was dequeued. */
1498a9de470cSBruce Richardson 	evtim2 = evs[0].event_ptr;
1499a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(evtim, evtim2,
1500a9de470cSBruce Richardson 			  "Failed to recover pointer to original event timer");
1501a9de470cSBruce Richardson 
1502a9de470cSBruce Richardson 	/* Need to reset state in case implementation can't do it */
1503a9de470cSBruce Richardson 	evtim2->state = RTE_EVENT_TIMER_NOT_ARMED;
1504a9de470cSBruce Richardson 
1505a9de470cSBruce Richardson 	/* Rearm it */
1506a9de470cSBruce Richardson 	ret = rte_event_timer_arm_burst(timdev, &evtim2, 1);
1507a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s\n",
1508a9de470cSBruce Richardson 			  rte_strerror(rte_errno));
1509a9de470cSBruce Richardson 
1510fb9c2133SShijith Thotton 	n = timeout_event_dequeue(evs, RTE_DIM(evs), WAIT_TICKS(ticks));
1511a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(n, 1, "Failed to dequeue expected number of expiry "
1512a9de470cSBruce Richardson 			  "events from event device");
1513a9de470cSBruce Richardson 
1514a9de470cSBruce Richardson 	/* Free it */
1515a9de470cSBruce Richardson 	evtim2 = evs[0].event_ptr;
1516a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(evtim, evtim2,
1517a9de470cSBruce Richardson 			  "Failed to recover pointer to original event timer");
1518a9de470cSBruce Richardson 	rte_mempool_put(eventdev_test_mempool, evtim2);
1519a9de470cSBruce Richardson 
1520a9de470cSBruce Richardson 	return TEST_SUCCESS;
1521a9de470cSBruce Richardson }
1522a9de470cSBruce Richardson 
1523a9de470cSBruce Richardson /* Check that the adapter handles the max specified number of timers as
1524a9de470cSBruce Richardson  * expected.
1525a9de470cSBruce Richardson  */
1526a9de470cSBruce Richardson static int
event_timer_arm_max(void)1527a9de470cSBruce Richardson event_timer_arm_max(void)
1528a9de470cSBruce Richardson {
1529a9de470cSBruce Richardson 	int ret, i, n;
1530a9de470cSBruce Richardson 	int num_evtims = MAX_TIMERS;
1531a9de470cSBruce Richardson 	struct rte_event_timer *evtims[num_evtims];
1532fb9c2133SShijith Thotton 	struct rte_event evs[num_evtims];
1533fb9c2133SShijith Thotton 	uint64_t ticks = 5;
1534a9de470cSBruce Richardson 	const struct rte_event_timer init_tim = {
1535a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
1536a9de470cSBruce Richardson 		.ev.queue_id = TEST_QUEUE_ID,
1537a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1538a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1539a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1540a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1541fb9c2133SShijith Thotton 		.timeout_ticks = CALC_TICKS(ticks), /**< expire in .5 sec */
1542a9de470cSBruce Richardson 	};
1543a9de470cSBruce Richardson 
1544a9de470cSBruce Richardson 	ret = rte_mempool_get_bulk(eventdev_test_mempool, (void **)evtims,
1545a9de470cSBruce Richardson 				   num_evtims);
1546a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 0, "Failed to get array of timer objs: ret = %d",
1547a9de470cSBruce Richardson 			  ret);
1548a9de470cSBruce Richardson 
1549a9de470cSBruce Richardson 	for (i = 0; i < num_evtims; i++) {
1550a9de470cSBruce Richardson 		*evtims[i] = init_tim;
1551a9de470cSBruce Richardson 		evtims[i]->ev.event_ptr = evtims[i];
1552a9de470cSBruce Richardson 	}
1553a9de470cSBruce Richardson 
1554a9de470cSBruce Richardson 	/* Test with the max value for the adapter */
1555a9de470cSBruce Richardson 	ret = rte_event_timer_arm_burst(timdev, evtims, num_evtims);
1556a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, num_evtims,
1557a9de470cSBruce Richardson 			  "Failed to arm all event timers: attempted = %d, "
1558a9de470cSBruce Richardson 			  "succeeded = %d, rte_errno = %s",
1559a9de470cSBruce Richardson 			  num_evtims, ret, rte_strerror(rte_errno));
1560a9de470cSBruce Richardson 
1561fb9c2133SShijith Thotton 	n = timeout_event_dequeue(evs, RTE_DIM(evs), WAIT_TICKS(ticks));
1562fb9c2133SShijith Thotton 	TEST_ASSERT_EQUAL(n, num_evtims, "Expected %d timer expiry events, got %d",
1563fb9c2133SShijith Thotton 			  num_evtims, n);
1564a9de470cSBruce Richardson 
1565a9de470cSBruce Richardson 	/* Make sure the eventdev is still empty */
1566fb9c2133SShijith Thotton 	n = timeout_event_dequeue(evs, 1, WAIT_TICKS(1));
1567a9de470cSBruce Richardson 
1568a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(n, 0, "Dequeued unexpected number of timer expiry "
1569a9de470cSBruce Richardson 			  "events from event device");
1570a9de470cSBruce Richardson 
1571a9de470cSBruce Richardson 	rte_mempool_put_bulk(eventdev_test_mempool, (void **)evtims,
1572a9de470cSBruce Richardson 			     num_evtims);
1573a9de470cSBruce Richardson 
1574a9de470cSBruce Richardson 	return TEST_SUCCESS;
1575a9de470cSBruce Richardson }
1576a9de470cSBruce Richardson 
1577a9de470cSBruce Richardson /* Check that creating an event timer with incorrect event sched type fails. */
1578a9de470cSBruce Richardson static int
event_timer_arm_invalid_sched_type(void)1579a9de470cSBruce Richardson event_timer_arm_invalid_sched_type(void)
1580a9de470cSBruce Richardson {
1581a9de470cSBruce Richardson 	int ret;
1582a9de470cSBruce Richardson 	struct rte_event_timer *evtim = NULL;
1583a9de470cSBruce Richardson 	const struct rte_event_timer init_tim = {
1584a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
1585a9de470cSBruce Richardson 		.ev.queue_id = TEST_QUEUE_ID,
1586a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1587a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1588a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1589a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
15902385a7f5SPavan Nikhilesh 		.timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1591a9de470cSBruce Richardson 	};
1592a9de470cSBruce Richardson 
1593a9de470cSBruce Richardson 	if (!using_services)
1594a9de470cSBruce Richardson 		return -ENOTSUP;
1595a9de470cSBruce Richardson 
1596a9de470cSBruce Richardson 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1597a9de470cSBruce Richardson 	if (evtim == NULL) {
1598a9de470cSBruce Richardson 		/* Failed to get an event timer object */
1599a9de470cSBruce Richardson 		return TEST_FAILED;
1600a9de470cSBruce Richardson 	}
1601a9de470cSBruce Richardson 
1602a9de470cSBruce Richardson 	*evtim = init_tim;
1603a9de470cSBruce Richardson 	evtim->ev.event_ptr = evtim;
1604a9de470cSBruce Richardson 	evtim->ev.sched_type = RTE_SCHED_TYPE_PARALLEL; // bad sched type
1605a9de470cSBruce Richardson 
1606a9de470cSBruce Richardson 	ret = rte_event_timer_arm_burst(timdev, &evtim, 1);
1607a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 0, "Expected to fail timer arm with invalid "
1608a9de470cSBruce Richardson 			  "sched type, but didn't");
1609a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Unexpected rte_errno value after"
1610a9de470cSBruce Richardson 			  " arm fail with invalid queue");
1611a9de470cSBruce Richardson 
1612a9de470cSBruce Richardson 	rte_mempool_put(eventdev_test_mempool, &evtim);
1613a9de470cSBruce Richardson 
1614a9de470cSBruce Richardson 	return TEST_SUCCESS;
1615a9de470cSBruce Richardson }
1616a9de470cSBruce Richardson 
1617a9de470cSBruce Richardson /* Check that creating an event timer with a timeout value that is too small or
1618a9de470cSBruce Richardson  * too big fails.
1619a9de470cSBruce Richardson  */
1620a9de470cSBruce Richardson static int
event_timer_arm_invalid_timeout(void)1621a9de470cSBruce Richardson event_timer_arm_invalid_timeout(void)
1622a9de470cSBruce Richardson {
1623a9de470cSBruce Richardson 	int ret;
1624a9de470cSBruce Richardson 	struct rte_event_timer *evtim = NULL;
1625a9de470cSBruce Richardson 	const struct rte_event_timer init_tim = {
1626a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
1627a9de470cSBruce Richardson 		.ev.queue_id = TEST_QUEUE_ID,
1628a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1629a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1630a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1631a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
16322385a7f5SPavan Nikhilesh 		.timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1633a9de470cSBruce Richardson 	};
1634a9de470cSBruce Richardson 
1635a9de470cSBruce Richardson 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1636a9de470cSBruce Richardson 	if (evtim == NULL) {
1637a9de470cSBruce Richardson 		/* Failed to get an event timer object */
1638a9de470cSBruce Richardson 		return TEST_FAILED;
1639a9de470cSBruce Richardson 	}
1640a9de470cSBruce Richardson 
1641a9de470cSBruce Richardson 	*evtim = init_tim;
1642a9de470cSBruce Richardson 	evtim->ev.event_ptr = evtim;
1643a9de470cSBruce Richardson 	evtim->timeout_ticks = 0;  // timeout too small
1644a9de470cSBruce Richardson 
1645a9de470cSBruce Richardson 	ret = rte_event_timer_arm_burst(timdev, &evtim, 1);
1646a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 0, "Expected to fail timer arm with invalid "
1647a9de470cSBruce Richardson 			  "timeout, but didn't");
1648a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Unexpected rte_errno value after"
1649a9de470cSBruce Richardson 			  " arm fail with invalid timeout");
1650a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ERROR_TOOEARLY,
1651a9de470cSBruce Richardson 			  "Unexpected event timer state");
1652a9de470cSBruce Richardson 
1653a9de470cSBruce Richardson 	*evtim = init_tim;
1654a9de470cSBruce Richardson 	evtim->ev.event_ptr = evtim;
16552385a7f5SPavan Nikhilesh 	evtim->timeout_ticks = CALC_TICKS(1801);  // timeout too big
1656a9de470cSBruce Richardson 
1657a9de470cSBruce Richardson 	ret = rte_event_timer_arm_burst(timdev, &evtim, 1);
1658a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 0, "Expected to fail timer arm with invalid "
1659a9de470cSBruce Richardson 			  "timeout, but didn't");
1660a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Unexpected rte_errno value after"
1661a9de470cSBruce Richardson 			  " arm fail with invalid timeout");
1662a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ERROR_TOOLATE,
1663a9de470cSBruce Richardson 			  "Unexpected event timer state");
1664a9de470cSBruce Richardson 
1665a9de470cSBruce Richardson 	rte_mempool_put(eventdev_test_mempool, evtim);
1666a9de470cSBruce Richardson 
1667a9de470cSBruce Richardson 	return TEST_SUCCESS;
1668a9de470cSBruce Richardson }
1669a9de470cSBruce Richardson 
1670a9de470cSBruce Richardson static int
event_timer_cancel(void)1671a9de470cSBruce Richardson event_timer_cancel(void)
1672a9de470cSBruce Richardson {
1673a9de470cSBruce Richardson 	uint16_t n;
1674a9de470cSBruce Richardson 	int ret;
1675a9de470cSBruce Richardson 	struct rte_event_timer_adapter *adapter = timdev;
1676a9de470cSBruce Richardson 	struct rte_event_timer *evtim = NULL;
1677a9de470cSBruce Richardson 	struct rte_event evs[BATCH_SIZE];
1678a9de470cSBruce Richardson 	const struct rte_event_timer init_tim = {
1679a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
1680a9de470cSBruce Richardson 		.ev.queue_id = TEST_QUEUE_ID,
1681a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1682a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1683a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1684a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1685a9de470cSBruce Richardson 	};
1686fb9c2133SShijith Thotton 	uint64_t ticks = 30;
1687a9de470cSBruce Richardson 
1688a9de470cSBruce Richardson 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1689a9de470cSBruce Richardson 	if (evtim == NULL) {
1690a9de470cSBruce Richardson 		/* Failed to get an event timer object */
1691a9de470cSBruce Richardson 		return TEST_FAILED;
1692a9de470cSBruce Richardson 	}
1693a9de470cSBruce Richardson 
1694a9de470cSBruce Richardson 	/* Check that cancelling an uninited timer fails */
1695a9de470cSBruce Richardson 	ret = rte_event_timer_cancel_burst(adapter, &evtim, 1);
1696a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 0, "Succeeded unexpectedly in canceling "
1697a9de470cSBruce Richardson 			  "uninited timer");
1698a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Unexpected rte_errno value after "
1699a9de470cSBruce Richardson 			  "cancelling uninited timer");
1700a9de470cSBruce Richardson 
1701a9de470cSBruce Richardson 	/* Set up a timer */
1702a9de470cSBruce Richardson 	*evtim = init_tim;
1703a9de470cSBruce Richardson 	evtim->ev.event_ptr = evtim;
1704fb9c2133SShijith Thotton 	evtim->timeout_ticks = CALC_TICKS(ticks); /**< expire in 3 sec */
1705a9de470cSBruce Richardson 
1706a9de470cSBruce Richardson 	/* Check that cancelling an inited but unarmed timer fails */
1707a9de470cSBruce Richardson 	ret = rte_event_timer_cancel_burst(adapter, &evtim, 1);
1708a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 0, "Succeeded unexpectedly in canceling "
1709a9de470cSBruce Richardson 			  "unarmed timer");
1710a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Unexpected rte_errno value after "
1711a9de470cSBruce Richardson 			  "cancelling unarmed timer");
1712a9de470cSBruce Richardson 
1713a9de470cSBruce Richardson 	ret = rte_event_timer_arm_burst(adapter, &evtim, 1);
1714a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s\n",
1715a9de470cSBruce Richardson 			  rte_strerror(rte_errno));
1716a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ARMED,
1717a9de470cSBruce Richardson 			  "evtim in incorrect state");
1718a9de470cSBruce Richardson 
1719a9de470cSBruce Richardson 	/* Delay 1 sec */
1720a9de470cSBruce Richardson 	rte_delay_ms(1000);
1721a9de470cSBruce Richardson 
1722a9de470cSBruce Richardson 	ret = rte_event_timer_cancel_burst(adapter, &evtim, 1);
1723a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 1, "Failed to cancel event_timer: %s\n",
1724a9de470cSBruce Richardson 			  rte_strerror(rte_errno));
1725a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_CANCELED,
1726a9de470cSBruce Richardson 			  "evtim in incorrect state");
1727a9de470cSBruce Richardson 
1728a9de470cSBruce Richardson 	/* Make sure that no expiry event was generated */
1729fb9c2133SShijith Thotton 	n = timeout_event_dequeue(evs, RTE_DIM(evs), WAIT_TICKS(ticks));
1730a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(n, 0, "Dequeued unexpected timer expiry event\n");
1731a9de470cSBruce Richardson 
1732a9de470cSBruce Richardson 	rte_mempool_put(eventdev_test_mempool, evtim);
1733a9de470cSBruce Richardson 
1734a9de470cSBruce Richardson 	return TEST_SUCCESS;
1735a9de470cSBruce Richardson }
1736a9de470cSBruce Richardson 
1737a9de470cSBruce Richardson static int
event_timer_cancel_double(void)1738a9de470cSBruce Richardson event_timer_cancel_double(void)
1739a9de470cSBruce Richardson {
1740a9de470cSBruce Richardson 	uint16_t n;
1741a9de470cSBruce Richardson 	int ret;
1742a9de470cSBruce Richardson 	struct rte_event_timer_adapter *adapter = timdev;
1743a9de470cSBruce Richardson 	struct rte_event_timer *evtim = NULL;
1744a9de470cSBruce Richardson 	struct rte_event evs[BATCH_SIZE];
1745a9de470cSBruce Richardson 	const struct rte_event_timer init_tim = {
1746a9de470cSBruce Richardson 		.ev.op = RTE_EVENT_OP_NEW,
1747a9de470cSBruce Richardson 		.ev.queue_id = TEST_QUEUE_ID,
1748a9de470cSBruce Richardson 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1749a9de470cSBruce Richardson 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1750a9de470cSBruce Richardson 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1751a9de470cSBruce Richardson 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1752a9de470cSBruce Richardson 	};
1753fb9c2133SShijith Thotton 	uint64_t ticks = 30;
1754a9de470cSBruce Richardson 
1755a9de470cSBruce Richardson 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1756a9de470cSBruce Richardson 	if (evtim == NULL) {
1757a9de470cSBruce Richardson 		/* Failed to get an event timer object */
1758a9de470cSBruce Richardson 		return TEST_FAILED;
1759a9de470cSBruce Richardson 	}
1760a9de470cSBruce Richardson 
1761a9de470cSBruce Richardson 	/* Set up a timer */
1762a9de470cSBruce Richardson 	*evtim = init_tim;
1763a9de470cSBruce Richardson 	evtim->ev.event_ptr = evtim;
1764fb9c2133SShijith Thotton 	evtim->timeout_ticks = CALC_TICKS(ticks); /**< expire in 3 sec */
1765a9de470cSBruce Richardson 
1766a9de470cSBruce Richardson 	ret = rte_event_timer_arm_burst(adapter, &evtim, 1);
1767a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s\n",
1768a9de470cSBruce Richardson 			  rte_strerror(rte_errno));
1769a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ARMED,
1770a9de470cSBruce Richardson 			  "timer in unexpected state");
1771a9de470cSBruce Richardson 
1772a9de470cSBruce Richardson 	/* Now, test that referencing the same timer twice in the same call
1773a9de470cSBruce Richardson 	 * fails
1774a9de470cSBruce Richardson 	 */
1775a9de470cSBruce Richardson 	struct rte_event_timer *evtim_arr[] = {evtim, evtim};
1776a9de470cSBruce Richardson 	ret = rte_event_timer_cancel_burst(adapter, evtim_arr,
1777a9de470cSBruce Richardson 					   RTE_DIM(evtim_arr));
1778a9de470cSBruce Richardson 
1779a9de470cSBruce Richardson 	/* Two requests to cancel same timer, only one should succeed */
1780a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(ret, 1, "Succeeded unexpectedly in canceling timer "
1781a9de470cSBruce Richardson 			  "twice");
1782a9de470cSBruce Richardson 
1783a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(rte_errno, EALREADY, "Unexpected rte_errno value "
1784a9de470cSBruce Richardson 			  "after double-cancel: rte_errno = %d", rte_errno);
1785a9de470cSBruce Richardson 
1786a9de470cSBruce Richardson 	/* Still make sure that no expiry event was generated */
1787fb9c2133SShijith Thotton 	n = timeout_event_dequeue(evs, RTE_DIM(evs), WAIT_TICKS(ticks));
1788a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(n, 0, "Dequeued unexpected timer expiry event\n");
1789a9de470cSBruce Richardson 
1790a9de470cSBruce Richardson 	rte_mempool_put(eventdev_test_mempool, evtim);
1791a9de470cSBruce Richardson 
1792a9de470cSBruce Richardson 	return TEST_SUCCESS;
1793a9de470cSBruce Richardson }
1794a9de470cSBruce Richardson 
1795a9de470cSBruce Richardson /* Check that event timer adapter tick resolution works as expected by testing
1796a9de470cSBruce Richardson  * the number of adapter ticks that occur within a particular time interval.
1797a9de470cSBruce Richardson  */
1798a9de470cSBruce Richardson static int
adapter_tick_resolution(void)1799a9de470cSBruce Richardson adapter_tick_resolution(void)
1800a9de470cSBruce Richardson {
1801a9de470cSBruce Richardson 	struct rte_event_timer_adapter_stats stats;
1802a9de470cSBruce Richardson 	uint64_t adapter_tick_count;
1803a9de470cSBruce Richardson 
1804a9de470cSBruce Richardson 	/* Only run this test in the software driver case */
1805a9de470cSBruce Richardson 	if (!using_services)
1806a9de470cSBruce Richardson 		return -ENOTSUP;
1807a9de470cSBruce Richardson 
1808a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_stats_reset(timdev),
1809a9de470cSBruce Richardson 				"Failed to reset stats");
1810a9de470cSBruce Richardson 
1811a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_stats_get(timdev,
1812a9de470cSBruce Richardson 			&stats), "Failed to get adapter stats");
1813a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(stats.adapter_tick_count, 0, "Adapter tick count "
1814a9de470cSBruce Richardson 			"not zeroed out");
1815a9de470cSBruce Richardson 
1816a9de470cSBruce Richardson 	/* Delay 1 second; should let at least 10 ticks occur with the default
1817a9de470cSBruce Richardson 	 * adapter configuration used by this test.
1818a9de470cSBruce Richardson 	 */
1819a9de470cSBruce Richardson 	rte_delay_ms(1000);
1820a9de470cSBruce Richardson 
1821a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_stats_get(timdev,
1822a9de470cSBruce Richardson 			&stats), "Failed to get adapter stats");
1823a9de470cSBruce Richardson 
1824a9de470cSBruce Richardson 	adapter_tick_count = stats.adapter_tick_count;
1825a9de470cSBruce Richardson 	TEST_ASSERT(adapter_tick_count >= 10 && adapter_tick_count <= 12,
1826a9de470cSBruce Richardson 			"Expected 10-12 adapter ticks, got %"PRIu64"\n",
1827a9de470cSBruce Richardson 			adapter_tick_count);
1828a9de470cSBruce Richardson 
1829a9de470cSBruce Richardson 	return TEST_SUCCESS;
1830a9de470cSBruce Richardson }
1831a9de470cSBruce Richardson 
1832a9de470cSBruce Richardson static int
adapter_create_max(void)1833a9de470cSBruce Richardson adapter_create_max(void)
1834a9de470cSBruce Richardson {
1835a9de470cSBruce Richardson 	int i;
1836a9de470cSBruce Richardson 	uint32_t svc_start_count, svc_end_count;
1837a9de470cSBruce Richardson 	struct rte_event_timer_adapter *adapters[
1838a9de470cSBruce Richardson 					RTE_EVENT_TIMER_ADAPTER_NUM_MAX + 1];
1839a9de470cSBruce Richardson 
1840a9de470cSBruce Richardson 	struct rte_event_timer_adapter_conf conf = {
1841a9de470cSBruce Richardson 		.event_dev_id = evdev,
1842a9de470cSBruce Richardson 		// timer_adapter_id set in loop
1843a9de470cSBruce Richardson 		.clk_src = RTE_EVENT_TIMER_ADAPTER_CPU_CLK,
1844a9de470cSBruce Richardson 		.timer_tick_ns = NSECPERSEC / 10,
1845a9de470cSBruce Richardson 		.max_tmo_ns = 180 * NSECPERSEC,
1846a9de470cSBruce Richardson 		.nb_timers = MAX_TIMERS,
18472385a7f5SPavan Nikhilesh 		.flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES,
1848a9de470cSBruce Richardson 	};
1849a9de470cSBruce Richardson 
1850a9de470cSBruce Richardson 	if (!using_services)
1851a9de470cSBruce Richardson 		return -ENOTSUP;
1852a9de470cSBruce Richardson 
1853a9de470cSBruce Richardson 	svc_start_count = rte_service_get_count();
1854a9de470cSBruce Richardson 
1855a9de470cSBruce Richardson 	/* This test expects that there are sufficient service IDs available
1856a9de470cSBruce Richardson 	 * to be allocated. I.e., RTE_EVENT_TIMER_ADAPTER_NUM_MAX may need to
1857a9de470cSBruce Richardson 	 * be less than RTE_SERVICE_NUM_MAX if anything else uses a service
1858a9de470cSBruce Richardson 	 * (the SW event device, for example).
1859a9de470cSBruce Richardson 	 */
1860a9de470cSBruce Richardson 	for (i = 0; i < RTE_EVENT_TIMER_ADAPTER_NUM_MAX; i++) {
1861a9de470cSBruce Richardson 		conf.timer_adapter_id = i;
1862a9de470cSBruce Richardson 		adapters[i] = rte_event_timer_adapter_create_ext(&conf,
1863a9de470cSBruce Richardson 				test_port_conf_cb, NULL);
1864a9de470cSBruce Richardson 		TEST_ASSERT_NOT_NULL(adapters[i], "Failed to create adapter "
1865a9de470cSBruce Richardson 				"%d", i);
1866a9de470cSBruce Richardson 	}
1867a9de470cSBruce Richardson 
1868a9de470cSBruce Richardson 	conf.timer_adapter_id = i;
1869a9de470cSBruce Richardson 	adapters[i] = rte_event_timer_adapter_create(&conf);
1870a9de470cSBruce Richardson 	TEST_ASSERT_NULL(adapters[i], "Created too many adapters");
1871a9de470cSBruce Richardson 
1872a9de470cSBruce Richardson 	/* Check that at least RTE_EVENT_TIMER_ADAPTER_NUM_MAX services
1873a9de470cSBruce Richardson 	 * have been created
1874a9de470cSBruce Richardson 	 */
1875a9de470cSBruce Richardson 	svc_end_count = rte_service_get_count();
1876a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(svc_end_count - svc_start_count,
1877a9de470cSBruce Richardson 			RTE_EVENT_TIMER_ADAPTER_NUM_MAX,
1878a9de470cSBruce Richardson 			"Failed to create expected number of services");
1879a9de470cSBruce Richardson 
1880a9de470cSBruce Richardson 	for (i = 0; i < RTE_EVENT_TIMER_ADAPTER_NUM_MAX; i++)
1881a9de470cSBruce Richardson 		TEST_ASSERT_SUCCESS(rte_event_timer_adapter_free(adapters[i]),
1882a9de470cSBruce Richardson 				"Failed to free adapter %d", i);
1883a9de470cSBruce Richardson 
1884a9de470cSBruce Richardson 	/* Check that service count is back to where it was at start */
1885a9de470cSBruce Richardson 	svc_end_count = rte_service_get_count();
1886a9de470cSBruce Richardson 	TEST_ASSERT_EQUAL(svc_start_count, svc_end_count, "Failed to release "
1887a9de470cSBruce Richardson 			  "correct number of services");
1888a9de470cSBruce Richardson 
1889a9de470cSBruce Richardson 	return TEST_SUCCESS;
1890a9de470cSBruce Richardson }
1891a9de470cSBruce Richardson 
18920727ff34SErik Gabriel Carrillo static inline int
test_timer_ticks_remaining(void)18930727ff34SErik Gabriel Carrillo test_timer_ticks_remaining(void)
18940727ff34SErik Gabriel Carrillo {
18950727ff34SErik Gabriel Carrillo 	uint64_t ticks_remaining = UINT64_MAX;
18960727ff34SErik Gabriel Carrillo 	struct rte_event_timer *ev_tim;
18970727ff34SErik Gabriel Carrillo 	struct rte_event ev;
18980727ff34SErik Gabriel Carrillo 	int ret, i;
18990727ff34SErik Gabriel Carrillo 	const struct rte_event_timer tim = {
19000727ff34SErik Gabriel Carrillo 		.ev.op = RTE_EVENT_OP_NEW,
19010727ff34SErik Gabriel Carrillo 		.ev.queue_id = 0,
19020727ff34SErik Gabriel Carrillo 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
19030727ff34SErik Gabriel Carrillo 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
19040727ff34SErik Gabriel Carrillo 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
19050727ff34SErik Gabriel Carrillo 		.state = RTE_EVENT_TIMER_NOT_ARMED,
19060727ff34SErik Gabriel Carrillo 	};
19070727ff34SErik Gabriel Carrillo 
19080727ff34SErik Gabriel Carrillo 	rte_mempool_get(eventdev_test_mempool, (void **)&ev_tim);
19090727ff34SErik Gabriel Carrillo 	*ev_tim = tim;
19100727ff34SErik Gabriel Carrillo 	ev_tim->ev.event_ptr = ev_tim;
19110727ff34SErik Gabriel Carrillo #define TEST_TICKS 5
19120727ff34SErik Gabriel Carrillo 	ev_tim->timeout_ticks = CALC_TICKS(TEST_TICKS);
19130727ff34SErik Gabriel Carrillo 
19140727ff34SErik Gabriel Carrillo 	ret = rte_event_timer_remaining_ticks_get(timdev, ev_tim,
19150727ff34SErik Gabriel Carrillo 						  &ticks_remaining);
19160727ff34SErik Gabriel Carrillo 	if (ret == -ENOTSUP) {
19170727ff34SErik Gabriel Carrillo 		rte_mempool_put(eventdev_test_mempool, (void *)ev_tim);
19180727ff34SErik Gabriel Carrillo 		printf("API not supported, skipping test\n");
19190727ff34SErik Gabriel Carrillo 		return TEST_SKIPPED;
19200727ff34SErik Gabriel Carrillo 	}
19210727ff34SErik Gabriel Carrillo 
19220727ff34SErik Gabriel Carrillo 	/* Test that unarmed timer returns error */
19230727ff34SErik Gabriel Carrillo 	TEST_ASSERT_FAIL(ret,
19240727ff34SErik Gabriel Carrillo 			 "Didn't fail to get ticks for unarmed event timer");
19250727ff34SErik Gabriel Carrillo 
19260727ff34SErik Gabriel Carrillo 	TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim, 1), 1,
19270727ff34SErik Gabriel Carrillo 			  "Failed to arm timer with proper timeout.");
19280727ff34SErik Gabriel Carrillo 	TEST_ASSERT_EQUAL(ev_tim->state, RTE_EVENT_TIMER_ARMED,
19290727ff34SErik Gabriel Carrillo 			  "Improper timer state set expected %d returned %d",
19300727ff34SErik Gabriel Carrillo 			  RTE_EVENT_TIMER_ARMED, ev_tim->state);
19310727ff34SErik Gabriel Carrillo 
19320727ff34SErik Gabriel Carrillo 	for (i = 0; i < TEST_TICKS; i++) {
19330727ff34SErik Gabriel Carrillo 		ret = rte_event_timer_remaining_ticks_get(timdev, ev_tim,
19340727ff34SErik Gabriel Carrillo 							  &ticks_remaining);
19350727ff34SErik Gabriel Carrillo 		if (ret < 0)
19360727ff34SErik Gabriel Carrillo 			return TEST_FAILED;
19370727ff34SErik Gabriel Carrillo 
19380727ff34SErik Gabriel Carrillo 		TEST_ASSERT_EQUAL((int)ticks_remaining, TEST_TICKS - i,
19390727ff34SErik Gabriel Carrillo 				  "Expected %d ticks remaining, got %"PRIu64"",
19400727ff34SErik Gabriel Carrillo 				  TEST_TICKS - i, ticks_remaining);
19410727ff34SErik Gabriel Carrillo 
19420727ff34SErik Gabriel Carrillo 		rte_delay_ms(100);
19430727ff34SErik Gabriel Carrillo 	}
19440727ff34SErik Gabriel Carrillo 
1945fb9c2133SShijith Thotton 	TEST_ASSERT_EQUAL(timeout_event_dequeue(&ev, 1, WAIT_TICKS(1)), 1,
19460727ff34SErik Gabriel Carrillo 			  "Armed timer failed to trigger.");
1947*14758e9aSPavan Nikhilesh 
1948*14758e9aSPavan Nikhilesh 	if (ev_tim->state != RTE_EVENT_TIMER_NOT_ARMED)
1949*14758e9aSPavan Nikhilesh 		ev_tim->state = RTE_EVENT_TIMER_NOT_ARMED;
19500727ff34SErik Gabriel Carrillo 
19510727ff34SErik Gabriel Carrillo 	/* Test that timer that fired returns error */
19520727ff34SErik Gabriel Carrillo 	TEST_ASSERT_FAIL(rte_event_timer_remaining_ticks_get(timdev, ev_tim,
19530727ff34SErik Gabriel Carrillo 							   &ticks_remaining),
19540727ff34SErik Gabriel Carrillo 			 "Didn't fail to get ticks for unarmed event timer");
19550727ff34SErik Gabriel Carrillo 
19560727ff34SErik Gabriel Carrillo 	rte_mempool_put(eventdev_test_mempool, (void *)ev_tim);
19570727ff34SErik Gabriel Carrillo 
19580727ff34SErik Gabriel Carrillo #undef TEST_TICKS
19590727ff34SErik Gabriel Carrillo 	return TEST_SUCCESS;
19600727ff34SErik Gabriel Carrillo }
19610727ff34SErik Gabriel Carrillo 
19620727ff34SErik Gabriel Carrillo 
1963a9de470cSBruce Richardson static struct unit_test_suite event_timer_adptr_functional_testsuite  = {
1964a9de470cSBruce Richardson 	.suite_name = "event timer functional test suite",
1965a9de470cSBruce Richardson 	.setup = testsuite_setup,
1966a9de470cSBruce Richardson 	.teardown = testsuite_teardown,
1967a9de470cSBruce Richardson 	.unit_test_cases = {
1968a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_usec, timdev_teardown,
1969a9de470cSBruce Richardson 				test_timer_state),
1970a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_usec, timdev_teardown,
1971a9de470cSBruce Richardson 				test_timer_arm),
19727d761b07SShijith Thotton 		TEST_CASE_ST(timdev_setup_msec_periodic, timdev_teardown,
19737d761b07SShijith Thotton 				test_timer_arm_periodic),
1974a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_usec, timdev_teardown,
1975a9de470cSBruce Richardson 				test_timer_arm_burst),
19767d761b07SShijith Thotton 		TEST_CASE_ST(timdev_setup_msec_periodic, timdev_teardown,
19777d761b07SShijith Thotton 				test_timer_arm_burst_periodic),
1978a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_sec, timdev_teardown,
1979a9de470cSBruce Richardson 				test_timer_cancel),
19807d761b07SShijith Thotton 		TEST_CASE_ST(timdev_setup_sec_periodic, timdev_teardown,
19817d761b07SShijith Thotton 				test_timer_cancel_periodic),
1982a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_sec, timdev_teardown,
1983a9de470cSBruce Richardson 				test_timer_cancel_random),
1984a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_usec_multicore, timdev_teardown,
1985a9de470cSBruce Richardson 				test_timer_arm_multicore),
1986a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_usec_multicore, timdev_teardown,
1987a9de470cSBruce Richardson 				test_timer_arm_burst_multicore),
1988a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_sec_multicore, timdev_teardown,
1989a9de470cSBruce Richardson 				test_timer_cancel_multicore),
1990a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_sec_multicore, timdev_teardown,
1991a9de470cSBruce Richardson 				test_timer_cancel_burst_multicore),
1992a9de470cSBruce Richardson 		TEST_CASE(adapter_create),
1993a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_msec, NULL, adapter_free),
1994a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1995a9de470cSBruce Richardson 				adapter_get_info),
1996a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1997a9de470cSBruce Richardson 				adapter_lookup),
1998a9de470cSBruce Richardson 		TEST_CASE_ST(NULL, timdev_teardown,
1999a9de470cSBruce Richardson 				adapter_start),
2000a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_msec, NULL,
2001a9de470cSBruce Richardson 				adapter_stop),
2002a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
2003a9de470cSBruce Richardson 				stat_inc_reset_ev_enq),
2004a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
2005a9de470cSBruce Richardson 			     event_timer_arm),
2006a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
2007a9de470cSBruce Richardson 			     event_timer_arm_double),
2008a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
2009a9de470cSBruce Richardson 			     event_timer_arm_expiry),
2010a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
2011a9de470cSBruce Richardson 				event_timer_arm_rearm),
2012a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
2013a9de470cSBruce Richardson 				event_timer_arm_max),
2014a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
2015a9de470cSBruce Richardson 				event_timer_arm_invalid_sched_type),
2016a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
2017a9de470cSBruce Richardson 				event_timer_arm_invalid_timeout),
2018a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
2019a9de470cSBruce Richardson 				event_timer_cancel),
2020a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
2021a9de470cSBruce Richardson 				event_timer_cancel_double),
2022a9de470cSBruce Richardson 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
2023a9de470cSBruce Richardson 				adapter_tick_resolution),
2024a9de470cSBruce Richardson 		TEST_CASE(adapter_create_max),
20250727ff34SErik Gabriel Carrillo 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
20260727ff34SErik Gabriel Carrillo 				test_timer_ticks_remaining),
2027a9de470cSBruce Richardson 		TEST_CASES_END() /**< NULL terminate unit test array */
2028a9de470cSBruce Richardson 	}
2029a9de470cSBruce Richardson };
2030a9de470cSBruce Richardson 
2031a9de470cSBruce Richardson static int
test_event_timer_adapter_func(void)2032a9de470cSBruce Richardson test_event_timer_adapter_func(void)
2033a9de470cSBruce Richardson {
2034a9de470cSBruce Richardson 	return unit_test_suite_runner(&event_timer_adptr_functional_testsuite);
2035a9de470cSBruce Richardson }
2036a9de470cSBruce Richardson 
20373c60274cSJie Zhou #endif /* !RTE_EXEC_ENV_WINDOWS */
20383c60274cSJie Zhou 
2039a9de470cSBruce Richardson REGISTER_TEST_COMMAND(event_timer_adapter_test, test_event_timer_adapter_func);
2040