xref: /dpdk/app/test/test_event_timer_adapter.c (revision 97b914f4e715565d53d38ac6e04815b9be5e58a9)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Cavium, Inc
3  * Copyright(c) 2017-2018 Intel Corporation.
4  */
5 
6 #include "test.h"
7 
8 #include <math.h>
9 
10 #include <rte_common.h>
11 #include <rte_cycles.h>
12 #include <rte_debug.h>
13 #include <rte_eal.h>
14 #include <rte_ethdev.h>
15 
16 #ifdef RTE_EXEC_ENV_WINDOWS
17 static int
18 test_event_timer_adapter_func(void)
19 {
20 	printf("event_timer_adapter not supported on Windows, skipping test\n");
21 	return TEST_SKIPPED;
22 }
23 
24 #else
25 
26 #include <rte_eventdev.h>
27 #include <rte_event_timer_adapter.h>
28 #include <rte_mempool.h>
29 #include <rte_launch.h>
30 #include <rte_lcore.h>
31 #include <rte_per_lcore.h>
32 #include <rte_random.h>
33 #include <rte_bus_vdev.h>
34 #include <rte_service.h>
35 #include <stdbool.h>
36 
37 /* 4K timers corresponds to sw evdev max inflight events */
38 #define MAX_TIMERS  (4 * 1024)
39 #define BKT_TCK_NSEC
40 
41 #define NSECPERSEC 1E9
42 #define BATCH_SIZE 16
43 /* Both the app lcore and adapter ports are linked to this queue */
44 #define TEST_QUEUE_ID 0
45 /* Port the application dequeues from */
46 #define TEST_PORT_ID 0
47 #define TEST_ADAPTER_ID 0
48 
49 /* Handle log statements in same manner as test macros */
50 #define LOG_DBG(...)	RTE_LOG(DEBUG, EAL, __VA_ARGS__)
51 
52 static int evdev;
53 static struct rte_event_timer_adapter *timdev;
54 static struct rte_mempool *eventdev_test_mempool;
55 static struct rte_ring *timer_producer_ring;
56 static uint64_t global_bkt_tck_ns;
57 static uint64_t global_info_bkt_tck_ns;
58 static volatile uint8_t arm_done;
59 
60 #define CALC_TICKS(tks)					\
61 	ceil((double)(tks * global_bkt_tck_ns) / global_info_bkt_tck_ns)
62 
63 
64 static bool using_services;
65 static uint32_t test_lcore1;
66 static uint32_t test_lcore2;
67 static uint32_t test_lcore3;
68 static uint32_t sw_evdev_slcore;
69 static uint32_t sw_adptr_slcore;
70 
71 static inline void
72 devconf_set_default_sane_values(struct rte_event_dev_config *dev_conf,
73 		struct rte_event_dev_info *info)
74 {
75 	memset(dev_conf, 0, sizeof(struct rte_event_dev_config));
76 	dev_conf->dequeue_timeout_ns = info->min_dequeue_timeout_ns;
77 	dev_conf->nb_event_ports = 1;
78 	dev_conf->nb_event_queues = 1;
79 	dev_conf->nb_event_queue_flows = info->max_event_queue_flows;
80 	dev_conf->nb_event_port_dequeue_depth =
81 		info->max_event_port_dequeue_depth;
82 	dev_conf->nb_event_port_enqueue_depth =
83 		info->max_event_port_enqueue_depth;
84 	dev_conf->nb_event_port_enqueue_depth =
85 		info->max_event_port_enqueue_depth;
86 	dev_conf->nb_events_limit =
87 		info->max_num_events;
88 }
89 
90 static inline int
91 eventdev_setup(void)
92 {
93 	int ret;
94 	struct rte_event_dev_config dev_conf;
95 	struct rte_event_dev_info info;
96 	uint32_t service_id;
97 
98 	ret = rte_event_dev_info_get(evdev, &info);
99 	TEST_ASSERT_SUCCESS(ret, "Failed to get event dev info");
100 	TEST_ASSERT(info.max_num_events < 0 ||
101 			info.max_num_events >= (int32_t)MAX_TIMERS,
102 			"ERROR max_num_events=%d < max_events=%d",
103 			info.max_num_events, MAX_TIMERS);
104 
105 	devconf_set_default_sane_values(&dev_conf, &info);
106 	ret = rte_event_dev_configure(evdev, &dev_conf);
107 	TEST_ASSERT_SUCCESS(ret, "Failed to configure eventdev");
108 
109 	ret = rte_event_queue_setup(evdev, 0, NULL);
110 	TEST_ASSERT_SUCCESS(ret, "Failed to setup queue=%d", 0);
111 
112 	/* Configure event port */
113 	ret = rte_event_port_setup(evdev, 0, NULL);
114 	TEST_ASSERT_SUCCESS(ret, "Failed to setup port=%d", 0);
115 	ret = rte_event_port_link(evdev, 0, NULL, NULL, 0);
116 	TEST_ASSERT(ret >= 0, "Failed to link all queues port=%d", 0);
117 
118 	/* If this is a software event device, map and start its service */
119 	if (rte_event_dev_service_id_get(evdev, &service_id) == 0) {
120 		TEST_ASSERT_SUCCESS(rte_service_lcore_add(sw_evdev_slcore),
121 				"Failed to add service core");
122 		TEST_ASSERT_SUCCESS(rte_service_lcore_start(
123 				sw_evdev_slcore),
124 				"Failed to start service core");
125 		TEST_ASSERT_SUCCESS(rte_service_map_lcore_set(
126 				service_id, sw_evdev_slcore, 1),
127 				"Failed to map evdev service");
128 		TEST_ASSERT_SUCCESS(rte_service_runstate_set(
129 				service_id, 1),
130 				"Failed to start evdev service");
131 	}
132 
133 	ret = rte_event_dev_start(evdev);
134 	TEST_ASSERT_SUCCESS(ret, "Failed to start device");
135 
136 	return TEST_SUCCESS;
137 }
138 
139 static int
140 testsuite_setup(void)
141 {
142 	/* Some of the multithreaded tests require 3 other lcores to run */
143 	unsigned int required_lcore_count = 4;
144 	uint32_t service_id;
145 
146 	/* To make it easier to map services later if needed, just reset
147 	 * service core state.
148 	 */
149 	(void) rte_service_lcore_reset_all();
150 
151 	if (!rte_event_dev_count()) {
152 		/* If there is no hardware eventdev, or no software vdev was
153 		 * specified on the command line, create an instance of
154 		 * event_sw.
155 		 */
156 		LOG_DBG("Failed to find a valid event device... testing with"
157 			" event_sw device\n");
158 		TEST_ASSERT_SUCCESS(rte_vdev_init("event_sw0", NULL),
159 					"Error creating eventdev");
160 		evdev = rte_event_dev_get_dev_id("event_sw0");
161 	}
162 
163 	if (rte_event_dev_service_id_get(evdev, &service_id) == 0) {
164 		/* A software event device will use a software event timer
165 		 * adapter as well. 2 more cores required to convert to
166 		 * service cores.
167 		 */
168 		required_lcore_count += 2;
169 		using_services = true;
170 	}
171 
172 	if (rte_lcore_count() < required_lcore_count) {
173 		printf("Not enough cores for event_timer_adapter_test, expecting at least %u\n",
174 		       required_lcore_count);
175 		return TEST_SKIPPED;
176 	}
177 
178 	/* Assign lcores for various tasks */
179 	test_lcore1 = rte_get_next_lcore(-1, 1, 0);
180 	test_lcore2 = rte_get_next_lcore(test_lcore1, 1, 0);
181 	test_lcore3 = rte_get_next_lcore(test_lcore2, 1, 0);
182 	if (using_services) {
183 		sw_evdev_slcore = rte_get_next_lcore(test_lcore3, 1, 0);
184 		sw_adptr_slcore = rte_get_next_lcore(sw_evdev_slcore, 1, 0);
185 	}
186 
187 	return eventdev_setup();
188 }
189 
190 static void
191 testsuite_teardown(void)
192 {
193 	rte_event_dev_stop(evdev);
194 	rte_event_dev_close(evdev);
195 }
196 
197 static int
198 setup_adapter_service(struct rte_event_timer_adapter *adptr)
199 {
200 	uint32_t adapter_service_id;
201 	int ret;
202 
203 	/* retrieve service ids */
204 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_service_id_get(adptr,
205 			&adapter_service_id), "Failed to get event timer "
206 			"adapter service id");
207 	/* add a service core and start it */
208 	ret = rte_service_lcore_add(sw_adptr_slcore);
209 	TEST_ASSERT(ret == 0 || ret == -EALREADY,
210 			"Failed to add service core");
211 	ret = rte_service_lcore_start(sw_adptr_slcore);
212 	TEST_ASSERT(ret == 0 || ret == -EALREADY,
213 			"Failed to start service core");
214 
215 	/* map services to it */
216 	TEST_ASSERT_SUCCESS(rte_service_map_lcore_set(adapter_service_id,
217 			sw_adptr_slcore, 1),
218 			"Failed to map adapter service");
219 
220 	/* set services to running */
221 	TEST_ASSERT_SUCCESS(rte_service_runstate_set(adapter_service_id, 1),
222 			"Failed to start event timer adapter service");
223 
224 	return TEST_SUCCESS;
225 }
226 
227 static int
228 test_port_conf_cb(uint16_t id, uint8_t event_dev_id, uint8_t *event_port_id,
229 		  void *conf_arg)
230 {
231 	struct rte_event_dev_config dev_conf;
232 	struct rte_event_dev_info info;
233 	struct rte_event_port_conf *port_conf, def_port_conf = {0};
234 	uint32_t started;
235 	static int port_allocated;
236 	static uint8_t port_id;
237 	int ret;
238 
239 	if (port_allocated) {
240 		*event_port_id = port_id;
241 		return 0;
242 	}
243 
244 	RTE_SET_USED(id);
245 
246 	ret = rte_event_dev_attr_get(event_dev_id, RTE_EVENT_DEV_ATTR_STARTED,
247 				     &started);
248 	if (ret < 0)
249 		return ret;
250 
251 	if (started)
252 		rte_event_dev_stop(event_dev_id);
253 
254 	ret = rte_event_dev_info_get(evdev, &info);
255 	if (ret < 0)
256 		return ret;
257 
258 	devconf_set_default_sane_values(&dev_conf, &info);
259 
260 	port_id = dev_conf.nb_event_ports;
261 	dev_conf.nb_event_ports++;
262 
263 	ret = rte_event_dev_configure(event_dev_id, &dev_conf);
264 	if (ret < 0) {
265 		if (started)
266 			rte_event_dev_start(event_dev_id);
267 		return ret;
268 	}
269 
270 	if (conf_arg != NULL)
271 		port_conf = conf_arg;
272 	else {
273 		port_conf = &def_port_conf;
274 		ret = rte_event_port_default_conf_get(event_dev_id, port_id,
275 						      port_conf);
276 		if (ret < 0)
277 			return ret;
278 	}
279 
280 	ret = rte_event_port_setup(event_dev_id, port_id, port_conf);
281 	if (ret < 0)
282 		return ret;
283 
284 	*event_port_id = port_id;
285 
286 	if (started)
287 		rte_event_dev_start(event_dev_id);
288 
289 	/* Reuse this port number next time this is called */
290 	port_allocated = 1;
291 
292 	return 0;
293 }
294 
295 static int
296 _timdev_setup(uint64_t max_tmo_ns, uint64_t bkt_tck_ns, uint64_t flags)
297 {
298 	struct rte_event_timer_adapter_info info;
299 	struct rte_event_timer_adapter_conf config = {
300 		.event_dev_id = evdev,
301 		.timer_adapter_id = TEST_ADAPTER_ID,
302 		.timer_tick_ns = bkt_tck_ns,
303 		.max_tmo_ns = max_tmo_ns,
304 		.nb_timers = MAX_TIMERS * 10,
305 		.flags = flags,
306 	};
307 	uint32_t caps = 0;
308 	const char *pool_name = "timdev_test_pool";
309 
310 	global_bkt_tck_ns = bkt_tck_ns;
311 
312 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_caps_get(evdev, &caps),
313 				"failed to get adapter capabilities");
314 
315 	if (flags & RTE_EVENT_TIMER_ADAPTER_F_PERIODIC &&
316 	    !(caps & RTE_EVENT_TIMER_ADAPTER_CAP_PERIODIC))
317 		return -ENOTSUP;
318 
319 	if (!(caps & RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT)) {
320 		timdev = rte_event_timer_adapter_create_ext(&config,
321 							    test_port_conf_cb,
322 							    NULL);
323 		setup_adapter_service(timdev);
324 		using_services = true;
325 	} else
326 		timdev = rte_event_timer_adapter_create(&config);
327 
328 	TEST_ASSERT_NOT_NULL(timdev,
329 			"failed to create event timer ring");
330 
331 	TEST_ASSERT_EQUAL(rte_event_timer_adapter_start(timdev), 0,
332 			"failed to Start event timer adapter");
333 
334 	/* Create event timer mempool */
335 	eventdev_test_mempool = rte_mempool_create(pool_name,
336 			MAX_TIMERS * 2,
337 			sizeof(struct rte_event_timer), /* element size*/
338 			0, /* cache size*/
339 			0, NULL, NULL, NULL, NULL,
340 			rte_socket_id(), 0);
341 	if (!eventdev_test_mempool) {
342 		printf("ERROR creating mempool\n");
343 		return TEST_FAILED;
344 	}
345 
346 	rte_event_timer_adapter_get_info(timdev, &info);
347 
348 	global_info_bkt_tck_ns = info.min_resolution_ns;
349 
350 	return TEST_SUCCESS;
351 }
352 
353 static int
354 timdev_setup_usec(void)
355 {
356 	uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES;
357 
358 	return using_services ?
359 		/* Max timeout is 10,000us and bucket interval is 100us */
360 		_timdev_setup(1E7, 1E5, flags) :
361 		/* Max timeout is 100us and bucket interval is 1us */
362 		_timdev_setup(1E5, 1E3, flags);
363 }
364 
365 static int
366 timdev_setup_usec_multicore(void)
367 {
368 	uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES;
369 
370 	return using_services ?
371 		/* Max timeout is 10,000us and bucket interval is 100us */
372 		_timdev_setup(1E7, 1E5, flags) :
373 		/* Max timeout is 100us and bucket interval is 1us */
374 		_timdev_setup(1E5, 1E3, flags);
375 }
376 
377 static int
378 timdev_setup_msec(void)
379 {
380 	uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES;
381 
382 	/* Max timeout is 3 mins, and bucket interval is 100 ms */
383 	return _timdev_setup(180 * NSECPERSEC, NSECPERSEC / 10, flags);
384 }
385 
386 static int
387 timdev_setup_msec_periodic(void)
388 {
389 	uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES |
390 			 RTE_EVENT_TIMER_ADAPTER_F_PERIODIC;
391 
392 	/* Periodic mode with 100 ms resolution */
393 	return _timdev_setup(0, NSECPERSEC / 10, flags);
394 }
395 
396 static int
397 timdev_setup_sec(void)
398 {
399 	uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES;
400 
401 	/* Max timeout is 100sec and bucket interval is 1sec */
402 	return _timdev_setup(1E11, 1E9, flags);
403 }
404 
405 static int
406 timdev_setup_sec_periodic(void)
407 {
408 	uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES |
409 			 RTE_EVENT_TIMER_ADAPTER_F_PERIODIC;
410 
411 	/* Periodic mode with 1 sec resolution */
412 	return _timdev_setup(0, NSECPERSEC, flags);
413 }
414 
415 static int
416 timdev_setup_sec_multicore(void)
417 {
418 	uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES;
419 
420 	/* Max timeout is 100sec and bucket interval is 1sec */
421 	return _timdev_setup(1E11, 1E9, flags);
422 }
423 
424 static void
425 timdev_teardown(void)
426 {
427 	rte_event_timer_adapter_stop(timdev);
428 	rte_event_timer_adapter_free(timdev);
429 
430 	rte_mempool_free(eventdev_test_mempool);
431 }
432 
433 static inline int
434 test_timer_state(void)
435 {
436 	struct rte_event_timer *ev_tim;
437 	struct rte_event ev;
438 	const struct rte_event_timer tim = {
439 		.ev.op = RTE_EVENT_OP_NEW,
440 		.ev.queue_id = 0,
441 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
442 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
443 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
444 		.state = RTE_EVENT_TIMER_NOT_ARMED,
445 	};
446 
447 
448 	rte_mempool_get(eventdev_test_mempool, (void **)&ev_tim);
449 	*ev_tim = tim;
450 	ev_tim->ev.event_ptr = ev_tim;
451 	ev_tim->timeout_ticks = CALC_TICKS(120);
452 
453 	TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim, 1), 0,
454 			"Armed timer exceeding max_timeout.");
455 	TEST_ASSERT_EQUAL(ev_tim->state, RTE_EVENT_TIMER_ERROR_TOOLATE,
456 			"Improper timer state set expected %d returned %d",
457 			RTE_EVENT_TIMER_ERROR_TOOLATE, ev_tim->state);
458 
459 	ev_tim->state = RTE_EVENT_TIMER_NOT_ARMED;
460 	ev_tim->timeout_ticks = CALC_TICKS(10);
461 
462 	TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim, 1), 1,
463 			"Failed to arm timer with proper timeout.");
464 	TEST_ASSERT_EQUAL(ev_tim->state, RTE_EVENT_TIMER_ARMED,
465 			"Improper timer state set expected %d returned %d",
466 			RTE_EVENT_TIMER_ARMED, ev_tim->state);
467 
468 	if (!using_services)
469 		rte_delay_us(20);
470 	else
471 		rte_delay_us(1000 + 200);
472 	TEST_ASSERT_EQUAL(rte_event_dequeue_burst(evdev, 0, &ev, 1, 0), 1,
473 			"Armed timer failed to trigger.");
474 
475 	ev_tim->state = RTE_EVENT_TIMER_NOT_ARMED;
476 	ev_tim->timeout_ticks = CALC_TICKS(90);
477 	TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim, 1), 1,
478 			"Failed to arm timer with proper timeout.");
479 	TEST_ASSERT_EQUAL(rte_event_timer_cancel_burst(timdev, &ev_tim, 1),
480 			1, "Failed to cancel armed timer");
481 	TEST_ASSERT_EQUAL(ev_tim->state, RTE_EVENT_TIMER_CANCELED,
482 			"Improper timer state set expected %d returned %d",
483 			RTE_EVENT_TIMER_CANCELED, ev_tim->state);
484 
485 	rte_mempool_put(eventdev_test_mempool, (void *)ev_tim);
486 
487 	return TEST_SUCCESS;
488 }
489 
490 static inline int
491 _arm_timers(uint64_t timeout_tcks, uint64_t timers)
492 {
493 	uint64_t i;
494 	struct rte_event_timer *ev_tim;
495 	const struct rte_event_timer tim = {
496 		.ev.op = RTE_EVENT_OP_NEW,
497 		.ev.queue_id = 0,
498 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
499 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
500 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
501 		.state = RTE_EVENT_TIMER_NOT_ARMED,
502 		.timeout_ticks = CALC_TICKS(timeout_tcks),
503 	};
504 
505 	for (i = 0; i < timers; i++) {
506 
507 		TEST_ASSERT_SUCCESS(rte_mempool_get(eventdev_test_mempool,
508 					(void **)&ev_tim),
509 				"mempool alloc failed");
510 		*ev_tim = tim;
511 		ev_tim->ev.event_ptr = ev_tim;
512 
513 		TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim,
514 					1), 1, "Failed to arm timer %d",
515 				rte_errno);
516 	}
517 
518 	return TEST_SUCCESS;
519 }
520 
521 static inline int
522 _wait_timer_triggers(uint64_t wait_sec, uint64_t arm_count,
523 		uint64_t cancel_count)
524 {
525 	uint8_t valid_event;
526 	uint64_t events = 0;
527 	uint64_t wait_start, max_wait;
528 	struct rte_event ev;
529 
530 	max_wait = rte_get_timer_hz() * wait_sec;
531 	wait_start = rte_get_timer_cycles();
532 	while (1) {
533 		if (rte_get_timer_cycles() - wait_start > max_wait) {
534 			if (events + cancel_count != arm_count)
535 				TEST_ASSERT_SUCCESS(max_wait,
536 					"Max time limit for timers exceeded.");
537 			break;
538 		}
539 
540 		valid_event = rte_event_dequeue_burst(evdev, 0, &ev, 1, 0);
541 		if (!valid_event)
542 			continue;
543 
544 		rte_mempool_put(eventdev_test_mempool, ev.event_ptr);
545 		events++;
546 	}
547 
548 	return TEST_SUCCESS;
549 }
550 
551 static inline int
552 test_timer_arm(void)
553 {
554 	TEST_ASSERT_SUCCESS(_arm_timers(20, MAX_TIMERS),
555 			"Failed to arm timers");
556 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(10, MAX_TIMERS, 0),
557 			"Timer triggered count doesn't match arm count");
558 	return TEST_SUCCESS;
559 }
560 
561 static inline int
562 test_timer_arm_periodic(void)
563 {
564 	TEST_ASSERT_SUCCESS(_arm_timers(1, MAX_TIMERS),
565 			    "Failed to arm timers");
566 	/* With a resolution of 100ms and wait time of 1sec,
567 	 * there will be 10 * MAX_TIMERS periodic timer triggers.
568 	 */
569 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(1, 10 * MAX_TIMERS, 0),
570 			    "Timer triggered count doesn't match arm count");
571 	return TEST_SUCCESS;
572 }
573 
574 static int
575 _arm_wrapper(void *arg)
576 {
577 	RTE_SET_USED(arg);
578 
579 	TEST_ASSERT_SUCCESS(_arm_timers(20, MAX_TIMERS),
580 			"Failed to arm timers");
581 
582 	return TEST_SUCCESS;
583 }
584 
585 static inline int
586 test_timer_arm_multicore(void)
587 {
588 
589 	uint32_t lcore_1 = rte_get_next_lcore(-1, 1, 0);
590 	uint32_t lcore_2 = rte_get_next_lcore(lcore_1, 1, 0);
591 
592 	rte_eal_remote_launch(_arm_wrapper, NULL, lcore_1);
593 	rte_eal_remote_launch(_arm_wrapper, NULL, lcore_2);
594 
595 	rte_eal_mp_wait_lcore();
596 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(10, MAX_TIMERS * 2, 0),
597 			"Timer triggered count doesn't match arm count");
598 
599 	return TEST_SUCCESS;
600 }
601 
602 #define MAX_BURST 16
603 static inline int
604 _arm_timers_burst(uint64_t timeout_tcks, uint64_t timers)
605 {
606 	uint64_t i;
607 	int j;
608 	struct rte_event_timer *ev_tim[MAX_BURST];
609 	const struct rte_event_timer tim = {
610 		.ev.op = RTE_EVENT_OP_NEW,
611 		.ev.queue_id = 0,
612 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
613 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
614 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
615 		.state = RTE_EVENT_TIMER_NOT_ARMED,
616 		.timeout_ticks = CALC_TICKS(timeout_tcks),
617 	};
618 
619 	for (i = 0; i < timers / MAX_BURST; i++) {
620 		TEST_ASSERT_SUCCESS(rte_mempool_get_bulk(
621 				eventdev_test_mempool,
622 				(void **)ev_tim, MAX_BURST),
623 				"mempool alloc failed");
624 
625 		for (j = 0; j < MAX_BURST; j++) {
626 			*ev_tim[j] = tim;
627 			ev_tim[j]->ev.event_ptr = ev_tim[j];
628 		}
629 
630 		TEST_ASSERT_EQUAL(rte_event_timer_arm_tmo_tick_burst(timdev,
631 				ev_tim, tim.timeout_ticks, MAX_BURST),
632 				MAX_BURST, "Failed to arm timer %d", rte_errno);
633 	}
634 
635 	return TEST_SUCCESS;
636 }
637 
638 static inline int
639 test_timer_arm_burst(void)
640 {
641 	TEST_ASSERT_SUCCESS(_arm_timers_burst(20, MAX_TIMERS),
642 			"Failed to arm timers");
643 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(10, MAX_TIMERS, 0),
644 			"Timer triggered count doesn't match arm count");
645 
646 	return TEST_SUCCESS;
647 }
648 
649 static inline int
650 test_timer_arm_burst_periodic(void)
651 {
652 	TEST_ASSERT_SUCCESS(_arm_timers_burst(1, MAX_TIMERS),
653 			    "Failed to arm timers");
654 	/* With a resolution of 100ms and wait time of 1sec,
655 	 * there will be 10 * MAX_TIMERS periodic timer triggers.
656 	 */
657 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(1, 10 * MAX_TIMERS, 0),
658 			    "Timer triggered count doesn't match arm count");
659 
660 	return TEST_SUCCESS;
661 }
662 
663 static int
664 _arm_wrapper_burst(void *arg)
665 {
666 	RTE_SET_USED(arg);
667 
668 	TEST_ASSERT_SUCCESS(_arm_timers_burst(20, MAX_TIMERS),
669 			"Failed to arm timers");
670 
671 	return TEST_SUCCESS;
672 }
673 
674 static inline int
675 test_timer_arm_burst_multicore(void)
676 {
677 	rte_eal_remote_launch(_arm_wrapper_burst, NULL, test_lcore1);
678 	rte_eal_remote_launch(_arm_wrapper_burst, NULL, test_lcore2);
679 
680 	rte_eal_mp_wait_lcore();
681 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(10, MAX_TIMERS * 2, 0),
682 			"Timer triggered count doesn't match arm count");
683 
684 	return TEST_SUCCESS;
685 }
686 
687 static inline int
688 test_timer_cancel_periodic(void)
689 {
690 	uint64_t i;
691 	struct rte_event_timer *ev_tim;
692 	const struct rte_event_timer tim = {
693 		.ev.op = RTE_EVENT_OP_NEW,
694 		.ev.queue_id = 0,
695 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
696 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
697 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
698 		.state = RTE_EVENT_TIMER_NOT_ARMED,
699 		.timeout_ticks = CALC_TICKS(1),
700 	};
701 
702 	for (i = 0; i < MAX_TIMERS; i++) {
703 		TEST_ASSERT_SUCCESS(rte_mempool_get(eventdev_test_mempool,
704 					(void **)&ev_tim),
705 				"mempool alloc failed");
706 		*ev_tim = tim;
707 		ev_tim->ev.event_ptr = ev_tim;
708 
709 		TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim,
710 					1), 1, "Failed to arm timer %d",
711 				rte_errno);
712 
713 		rte_delay_us(100 + (i % 5000));
714 
715 		TEST_ASSERT_EQUAL(rte_event_timer_cancel_burst(timdev,
716 					&ev_tim, 1), 1,
717 				"Failed to cancel event timer %d", rte_errno);
718 		rte_mempool_put(eventdev_test_mempool, ev_tim);
719 	}
720 
721 
722 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(30, MAX_TIMERS,
723 				MAX_TIMERS),
724 		"Timer triggered count doesn't match arm, cancel count");
725 
726 	return TEST_SUCCESS;
727 }
728 
729 static inline int
730 test_timer_cancel(void)
731 {
732 	uint64_t i;
733 	struct rte_event_timer *ev_tim;
734 	const struct rte_event_timer tim = {
735 		.ev.op = RTE_EVENT_OP_NEW,
736 		.ev.queue_id = 0,
737 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
738 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
739 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
740 		.state = RTE_EVENT_TIMER_NOT_ARMED,
741 		.timeout_ticks = CALC_TICKS(20),
742 	};
743 
744 	for (i = 0; i < MAX_TIMERS; i++) {
745 		TEST_ASSERT_SUCCESS(rte_mempool_get(eventdev_test_mempool,
746 					(void **)&ev_tim),
747 				"mempool alloc failed");
748 		*ev_tim = tim;
749 		ev_tim->ev.event_ptr = ev_tim;
750 
751 		TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim,
752 					1), 1, "Failed to arm timer %d",
753 				rte_errno);
754 
755 		rte_delay_us(100 + (i % 5000));
756 
757 		TEST_ASSERT_EQUAL(rte_event_timer_cancel_burst(timdev,
758 					&ev_tim, 1), 1,
759 				"Failed to cancel event timer %d", rte_errno);
760 		rte_mempool_put(eventdev_test_mempool, ev_tim);
761 	}
762 
763 
764 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(30, MAX_TIMERS,
765 				MAX_TIMERS),
766 		"Timer triggered count doesn't match arm, cancel count");
767 
768 	return TEST_SUCCESS;
769 }
770 
771 static int
772 _cancel_producer(uint64_t timeout_tcks, uint64_t timers)
773 {
774 	uint64_t i;
775 	struct rte_event_timer *ev_tim;
776 	const struct rte_event_timer tim = {
777 		.ev.op = RTE_EVENT_OP_NEW,
778 		.ev.queue_id = 0,
779 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
780 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
781 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
782 		.state = RTE_EVENT_TIMER_NOT_ARMED,
783 		.timeout_ticks = CALC_TICKS(timeout_tcks),
784 	};
785 
786 	for (i = 0; i < timers; i++) {
787 		TEST_ASSERT_SUCCESS(rte_mempool_get(eventdev_test_mempool,
788 					(void **)&ev_tim),
789 				"mempool alloc failed");
790 
791 		*ev_tim = tim;
792 		ev_tim->ev.event_ptr = ev_tim;
793 
794 		TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim,
795 					1), 1, "Failed to arm timer %d",
796 				rte_errno);
797 
798 		TEST_ASSERT_EQUAL(ev_tim->state, RTE_EVENT_TIMER_ARMED,
799 				  "Failed to arm event timer");
800 
801 		while (rte_ring_enqueue(timer_producer_ring, ev_tim) != 0)
802 			;
803 	}
804 
805 	return TEST_SUCCESS;
806 }
807 
808 static int
809 _cancel_producer_burst(uint64_t timeout_tcks, uint64_t timers)
810 {
811 
812 	uint64_t i;
813 	int j, ret;
814 	struct rte_event_timer *ev_tim[MAX_BURST];
815 	const struct rte_event_timer tim = {
816 		.ev.op = RTE_EVENT_OP_NEW,
817 		.ev.queue_id = 0,
818 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
819 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
820 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
821 		.state = RTE_EVENT_TIMER_NOT_ARMED,
822 		.timeout_ticks = CALC_TICKS(timeout_tcks),
823 	};
824 	int arm_count = 0;
825 
826 	for (i = 0; i < timers / MAX_BURST; i++) {
827 		TEST_ASSERT_SUCCESS(rte_mempool_get_bulk(
828 				eventdev_test_mempool,
829 				(void **)ev_tim, MAX_BURST),
830 				"mempool alloc failed");
831 
832 		for (j = 0; j < MAX_BURST; j++) {
833 			*ev_tim[j] = tim;
834 			ev_tim[j]->ev.event_ptr = ev_tim[j];
835 		}
836 
837 		TEST_ASSERT_EQUAL(rte_event_timer_arm_tmo_tick_burst(timdev,
838 				ev_tim, tim.timeout_ticks, MAX_BURST),
839 				MAX_BURST, "Failed to arm timer %d", rte_errno);
840 
841 		for (j = 0; j < MAX_BURST; j++)
842 			TEST_ASSERT_EQUAL(ev_tim[j]->state,
843 					  RTE_EVENT_TIMER_ARMED,
844 					  "Event timer not armed, state = %d",
845 					  ev_tim[j]->state);
846 
847 		ret = rte_ring_enqueue_bulk(timer_producer_ring,
848 				(void **)ev_tim, MAX_BURST, NULL);
849 		TEST_ASSERT_EQUAL(ret, MAX_BURST,
850 				"Failed to enqueue event timers to ring");
851 		arm_count += ret;
852 	}
853 
854 	TEST_ASSERT_EQUAL(arm_count, MAX_TIMERS,
855 			  "Failed to arm expected number of event timers");
856 
857 	return TEST_SUCCESS;
858 }
859 
860 static int
861 _cancel_producer_wrapper(void *args)
862 {
863 	RTE_SET_USED(args);
864 
865 	return _cancel_producer(20, MAX_TIMERS);
866 }
867 
868 static int
869 _cancel_producer_burst_wrapper(void *args)
870 {
871 	RTE_SET_USED(args);
872 
873 	return _cancel_producer_burst(100, MAX_TIMERS);
874 }
875 
876 static int
877 _cancel_thread(void *args)
878 {
879 	RTE_SET_USED(args);
880 	struct rte_event_timer *ev_tim = NULL;
881 	uint64_t cancel_count = 0;
882 	uint16_t ret;
883 
884 	while (!arm_done || rte_ring_count(timer_producer_ring) > 0) {
885 		if (rte_ring_dequeue(timer_producer_ring, (void **)&ev_tim))
886 			continue;
887 
888 		ret = rte_event_timer_cancel_burst(timdev, &ev_tim, 1);
889 		TEST_ASSERT_EQUAL(ret, 1, "Failed to cancel timer");
890 		rte_mempool_put(eventdev_test_mempool, (void *)ev_tim);
891 		cancel_count++;
892 	}
893 
894 	return TEST_SUCCESS;
895 }
896 
897 static int
898 _cancel_burst_thread(void *args)
899 {
900 	RTE_SET_USED(args);
901 
902 	int ret, i, n;
903 	struct rte_event_timer *ev_tim[MAX_BURST];
904 	uint64_t cancel_count = 0;
905 	uint64_t dequeue_count = 0;
906 
907 	while (!arm_done || rte_ring_count(timer_producer_ring) > 0) {
908 		n = rte_ring_dequeue_burst(timer_producer_ring,
909 				(void **)ev_tim, MAX_BURST, NULL);
910 		if (!n)
911 			continue;
912 
913 		dequeue_count += n;
914 
915 		for (i = 0; i < n; i++)
916 			TEST_ASSERT_EQUAL(ev_tim[i]->state,
917 					  RTE_EVENT_TIMER_ARMED,
918 					  "Event timer not armed, state = %d",
919 					  ev_tim[i]->state);
920 
921 		ret = rte_event_timer_cancel_burst(timdev, ev_tim, n);
922 		TEST_ASSERT_EQUAL(n, ret, "Failed to cancel complete burst of "
923 				  "event timers");
924 		rte_mempool_put_bulk(eventdev_test_mempool, (void **)ev_tim,
925 				RTE_MIN(ret, MAX_BURST));
926 
927 		cancel_count += ret;
928 	}
929 
930 	TEST_ASSERT_EQUAL(cancel_count, MAX_TIMERS,
931 			  "Failed to cancel expected number of timers: "
932 			  "expected = %d, cancel_count = %"PRIu64", "
933 			  "dequeue_count = %"PRIu64"\n", MAX_TIMERS,
934 			  cancel_count, dequeue_count);
935 
936 	return TEST_SUCCESS;
937 }
938 
939 static inline int
940 test_timer_cancel_multicore(void)
941 {
942 	arm_done = 0;
943 	timer_producer_ring = rte_ring_create("timer_cancel_queue",
944 			MAX_TIMERS * 2, rte_socket_id(), 0);
945 	TEST_ASSERT_NOT_NULL(timer_producer_ring,
946 			"Unable to reserve memory for ring");
947 
948 	rte_eal_remote_launch(_cancel_thread, NULL, test_lcore3);
949 	rte_eal_remote_launch(_cancel_producer_wrapper, NULL, test_lcore1);
950 	rte_eal_remote_launch(_cancel_producer_wrapper, NULL, test_lcore2);
951 
952 	rte_eal_wait_lcore(test_lcore1);
953 	rte_eal_wait_lcore(test_lcore2);
954 	arm_done = 1;
955 	rte_eal_wait_lcore(test_lcore3);
956 	rte_ring_free(timer_producer_ring);
957 
958 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(30, MAX_TIMERS * 2,
959 			MAX_TIMERS * 2),
960 			"Timer triggered count doesn't match arm count");
961 
962 	return TEST_SUCCESS;
963 }
964 
965 static inline int
966 test_timer_cancel_burst_multicore(void)
967 {
968 	arm_done = 0;
969 	timer_producer_ring = rte_ring_create("timer_cancel_queue",
970 			MAX_TIMERS * 2, rte_socket_id(), 0);
971 	TEST_ASSERT_NOT_NULL(timer_producer_ring,
972 			"Unable to reserve memory for ring");
973 
974 	rte_eal_remote_launch(_cancel_burst_thread, NULL, test_lcore2);
975 	rte_eal_remote_launch(_cancel_producer_burst_wrapper, NULL,
976 			test_lcore1);
977 
978 	rte_eal_wait_lcore(test_lcore1);
979 	arm_done = 1;
980 	rte_eal_wait_lcore(test_lcore2);
981 	rte_ring_free(timer_producer_ring);
982 
983 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(30, MAX_TIMERS,
984 			MAX_TIMERS),
985 			"Timer triggered count doesn't match arm count");
986 
987 	return TEST_SUCCESS;
988 }
989 
990 static inline int
991 test_timer_cancel_random(void)
992 {
993 	uint64_t i;
994 	uint64_t events_canceled = 0;
995 	struct rte_event_timer *ev_tim;
996 	const struct rte_event_timer tim = {
997 		.ev.op = RTE_EVENT_OP_NEW,
998 		.ev.queue_id = 0,
999 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1000 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1001 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1002 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1003 		.timeout_ticks = CALC_TICKS(20),
1004 	};
1005 
1006 	for (i = 0; i < MAX_TIMERS; i++) {
1007 
1008 		TEST_ASSERT_SUCCESS(rte_mempool_get(eventdev_test_mempool,
1009 					(void **)&ev_tim),
1010 				"mempool alloc failed");
1011 		*ev_tim = tim;
1012 		ev_tim->ev.event_ptr = ev_tim;
1013 
1014 		TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim,
1015 					1), 1, "Failed to arm timer %d",
1016 				rte_errno);
1017 
1018 		if (rte_rand() & 1) {
1019 			rte_delay_us(100 + (i % 5000));
1020 			TEST_ASSERT_EQUAL(rte_event_timer_cancel_burst(
1021 						timdev,
1022 						&ev_tim, 1), 1,
1023 				"Failed to cancel event timer %d", rte_errno);
1024 			rte_mempool_put(eventdev_test_mempool, ev_tim);
1025 			events_canceled++;
1026 		}
1027 	}
1028 
1029 	TEST_ASSERT_SUCCESS(_wait_timer_triggers(30, MAX_TIMERS,
1030 				events_canceled),
1031 		       "Timer triggered count doesn't match arm, cancel count");
1032 
1033 	return TEST_SUCCESS;
1034 }
1035 
1036 /* Check that the adapter can be created correctly */
1037 static int
1038 adapter_create(void)
1039 {
1040 	int adapter_id = 0;
1041 	struct rte_event_timer_adapter *adapter, *adapter2;
1042 
1043 	struct rte_event_timer_adapter_conf conf = {
1044 		.event_dev_id = evdev + 1,  // invalid event dev id
1045 		.timer_adapter_id = adapter_id,
1046 		.clk_src = RTE_EVENT_TIMER_ADAPTER_CPU_CLK,
1047 		.timer_tick_ns = NSECPERSEC / 10,
1048 		.max_tmo_ns = 180 * NSECPERSEC,
1049 		.nb_timers = MAX_TIMERS,
1050 		.flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES,
1051 	};
1052 	uint32_t caps = 0;
1053 
1054 	/* Test invalid conf */
1055 	adapter = rte_event_timer_adapter_create(&conf);
1056 	TEST_ASSERT_NULL(adapter, "Created adapter with invalid "
1057 			"event device id");
1058 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Incorrect errno value for "
1059 			"invalid event device id");
1060 
1061 	/* Test valid conf */
1062 	conf.event_dev_id = evdev;
1063 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_caps_get(evdev, &caps),
1064 			"failed to get adapter capabilities");
1065 	if (!(caps & RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT))
1066 		adapter = rte_event_timer_adapter_create_ext(&conf,
1067 				test_port_conf_cb,
1068 				NULL);
1069 	else
1070 		adapter = rte_event_timer_adapter_create(&conf);
1071 	TEST_ASSERT_NOT_NULL(adapter, "Failed to create adapter with valid "
1072 			"configuration");
1073 
1074 	/* Test existing id */
1075 	adapter2 = rte_event_timer_adapter_create(&conf);
1076 	TEST_ASSERT_NULL(adapter2, "Created adapter with in-use id");
1077 	TEST_ASSERT(rte_errno == EEXIST, "Incorrect errno value for existing "
1078 			"id");
1079 
1080 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_free(adapter),
1081 			"Failed to free adapter");
1082 
1083 	return TEST_SUCCESS;
1084 }
1085 
1086 
1087 /* Test that adapter can be freed correctly. */
1088 static int
1089 adapter_free(void)
1090 {
1091 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_stop(timdev),
1092 			"Failed to stop adapter");
1093 
1094 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_free(timdev),
1095 			"Failed to free valid adapter");
1096 
1097 	/* Test free of already freed adapter */
1098 	TEST_ASSERT_FAIL(rte_event_timer_adapter_free(timdev),
1099 			"Freed adapter that was already freed");
1100 
1101 	/* Test free of null adapter */
1102 	timdev = NULL;
1103 	TEST_ASSERT_FAIL(rte_event_timer_adapter_free(timdev),
1104 			"Freed null adapter");
1105 
1106 	rte_mempool_free(eventdev_test_mempool);
1107 
1108 	return TEST_SUCCESS;
1109 }
1110 
1111 /* Test that adapter info can be retrieved and is correct. */
1112 static int
1113 adapter_get_info(void)
1114 {
1115 	struct rte_event_timer_adapter_info info;
1116 
1117 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_get_info(timdev, &info),
1118 			"Failed to get adapter info");
1119 
1120 	if (using_services)
1121 		TEST_ASSERT_EQUAL(info.event_dev_port_id, 1,
1122 				"Expected port id = 1, got port id = %d",
1123 				info.event_dev_port_id);
1124 
1125 	return TEST_SUCCESS;
1126 }
1127 
1128 /* Test adapter lookup via adapter ID. */
1129 static int
1130 adapter_lookup(void)
1131 {
1132 	struct rte_event_timer_adapter *adapter;
1133 
1134 	adapter = rte_event_timer_adapter_lookup(TEST_ADAPTER_ID);
1135 	TEST_ASSERT_NOT_NULL(adapter, "Failed to lookup adapter");
1136 
1137 	return TEST_SUCCESS;
1138 }
1139 
1140 static int
1141 adapter_start(void)
1142 {
1143 	TEST_ASSERT_SUCCESS(_timdev_setup(180 * NSECPERSEC, NSECPERSEC / 10,
1144 					  RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES),
1145 			    "Failed to start adapter");
1146 	TEST_ASSERT_EQUAL(rte_event_timer_adapter_start(timdev), -EALREADY,
1147 			"Timer adapter started without call to stop.");
1148 
1149 	return TEST_SUCCESS;
1150 }
1151 
1152 /* Test that adapter stops correctly. */
1153 static int
1154 adapter_stop(void)
1155 {
1156 	struct rte_event_timer_adapter *l_adapter = NULL;
1157 
1158 	/* Test adapter stop */
1159 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_stop(timdev),
1160 			"Failed to stop event adapter");
1161 
1162 	TEST_ASSERT_FAIL(rte_event_timer_adapter_stop(l_adapter),
1163 			"Erroneously stopped null event adapter");
1164 
1165 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_free(timdev),
1166 			"Failed to free adapter");
1167 
1168 	rte_mempool_free(eventdev_test_mempool);
1169 
1170 	return TEST_SUCCESS;
1171 }
1172 
1173 /* Test increment and reset of ev_enq_count stat */
1174 static int
1175 stat_inc_reset_ev_enq(void)
1176 {
1177 	int ret, i, n;
1178 	int num_evtims = MAX_TIMERS;
1179 	struct rte_event_timer *evtims[num_evtims];
1180 	struct rte_event evs[BATCH_SIZE];
1181 	struct rte_event_timer_adapter_stats stats;
1182 	const struct rte_event_timer init_tim = {
1183 		.ev.op = RTE_EVENT_OP_NEW,
1184 		.ev.queue_id = TEST_QUEUE_ID,
1185 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1186 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1187 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1188 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1189 		.timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1190 	};
1191 
1192 	ret = rte_mempool_get_bulk(eventdev_test_mempool, (void **)evtims,
1193 				   num_evtims);
1194 	TEST_ASSERT_EQUAL(ret, 0, "Failed to get array of timer objs: ret = %d",
1195 			  ret);
1196 
1197 	for (i = 0; i < num_evtims; i++) {
1198 		*evtims[i] = init_tim;
1199 		evtims[i]->ev.event_ptr = evtims[i];
1200 	}
1201 
1202 	ret = rte_event_timer_adapter_stats_get(timdev, &stats);
1203 	TEST_ASSERT_EQUAL(ret, 0, "Failed to get stats");
1204 	TEST_ASSERT_EQUAL((int)stats.ev_enq_count, 0, "Stats not clear at "
1205 			  "startup");
1206 
1207 	/* Test with the max value for the adapter */
1208 	ret = rte_event_timer_arm_burst(timdev, evtims, num_evtims);
1209 	TEST_ASSERT_EQUAL(ret, num_evtims,
1210 			  "Failed to arm all event timers: attempted = %d, "
1211 			  "succeeded = %d, rte_errno = %s",
1212 			  num_evtims, ret, rte_strerror(rte_errno));
1213 
1214 	rte_delay_ms(1000);
1215 
1216 #define MAX_TRIES num_evtims
1217 	int sum = 0;
1218 	int tries = 0;
1219 	bool done = false;
1220 	while (!done) {
1221 		sum += rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs,
1222 					       RTE_DIM(evs), 10);
1223 		if (sum >= num_evtims || ++tries >= MAX_TRIES)
1224 			done = true;
1225 
1226 		rte_delay_ms(10);
1227 	}
1228 
1229 	TEST_ASSERT_EQUAL(sum, num_evtims, "Expected %d timer expiry events, "
1230 			  "got %d", num_evtims, sum);
1231 
1232 	TEST_ASSERT(tries < MAX_TRIES, "Exceeded max tries");
1233 
1234 	rte_delay_ms(100);
1235 
1236 	/* Make sure the eventdev is still empty */
1237 	n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs),
1238 				      10);
1239 
1240 	TEST_ASSERT_EQUAL(n, 0, "Dequeued unexpected number of timer expiry "
1241 			  "events from event device");
1242 
1243 	/* Check stats again */
1244 	ret = rte_event_timer_adapter_stats_get(timdev, &stats);
1245 	TEST_ASSERT_EQUAL(ret, 0, "Failed to get stats");
1246 	TEST_ASSERT_EQUAL((int)stats.ev_enq_count, num_evtims,
1247 			  "Expected enqueue stat = %d; got %d", num_evtims,
1248 			  (int)stats.ev_enq_count);
1249 
1250 	/* Reset and check again */
1251 	ret = rte_event_timer_adapter_stats_reset(timdev);
1252 	TEST_ASSERT_EQUAL(ret, 0, "Failed to reset stats");
1253 
1254 	ret = rte_event_timer_adapter_stats_get(timdev, &stats);
1255 	TEST_ASSERT_EQUAL(ret, 0, "Failed to get stats");
1256 	TEST_ASSERT_EQUAL((int)stats.ev_enq_count, 0,
1257 			  "Expected enqueue stat = %d; got %d", 0,
1258 			  (int)stats.ev_enq_count);
1259 
1260 	rte_mempool_put_bulk(eventdev_test_mempool, (void **)evtims,
1261 			     num_evtims);
1262 
1263 	return TEST_SUCCESS;
1264 }
1265 
1266 /* Test various cases in arming timers */
1267 static int
1268 event_timer_arm(void)
1269 {
1270 	uint16_t n;
1271 	int ret;
1272 	struct rte_event_timer_adapter *adapter = timdev;
1273 	struct rte_event_timer *evtim = NULL;
1274 	struct rte_event evs[BATCH_SIZE];
1275 	const struct rte_event_timer init_tim = {
1276 		.ev.op = RTE_EVENT_OP_NEW,
1277 		.ev.queue_id = TEST_QUEUE_ID,
1278 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1279 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1280 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1281 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1282 		.timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1283 	};
1284 
1285 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1286 	if (evtim == NULL) {
1287 		/* Failed to get an event timer object */
1288 		return TEST_FAILED;
1289 	}
1290 
1291 	/* Set up a timer */
1292 	*evtim = init_tim;
1293 	evtim->ev.event_ptr = evtim;
1294 
1295 	/* Test single timer arm succeeds */
1296 	ret = rte_event_timer_arm_burst(adapter, &evtim, 1);
1297 	TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s\n",
1298 			  rte_strerror(rte_errno));
1299 	TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ARMED, "Event timer "
1300 			  "in incorrect state");
1301 
1302 	/* Test arm of armed timer fails */
1303 	ret = rte_event_timer_arm_burst(adapter, &evtim, 1);
1304 	TEST_ASSERT_EQUAL(ret, 0, "expected return value from "
1305 			  "rte_event_timer_arm_burst: 0, got: %d", ret);
1306 	TEST_ASSERT_EQUAL(rte_errno, EALREADY, "Unexpected rte_errno value "
1307 			  "after arming already armed timer");
1308 
1309 	/* Let timer expire */
1310 	rte_delay_ms(1000);
1311 
1312 	n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1313 	TEST_ASSERT_EQUAL(n, 1, "Failed to dequeue expected number of expiry "
1314 			  "events from event device");
1315 
1316 	rte_mempool_put(eventdev_test_mempool, evtim);
1317 
1318 	return TEST_SUCCESS;
1319 }
1320 
1321 /* This test checks that repeated references to the same event timer in the
1322  * arm request work as expected; only the first one through should succeed.
1323  */
1324 static int
1325 event_timer_arm_double(void)
1326 {
1327 	uint16_t n;
1328 	int ret;
1329 	struct rte_event_timer_adapter *adapter = timdev;
1330 	struct rte_event_timer *evtim = NULL;
1331 	struct rte_event evs[BATCH_SIZE];
1332 	const struct rte_event_timer init_tim = {
1333 		.ev.op = RTE_EVENT_OP_NEW,
1334 		.ev.queue_id = TEST_QUEUE_ID,
1335 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1336 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1337 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1338 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1339 		.timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1340 	};
1341 
1342 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1343 	if (evtim == NULL) {
1344 		/* Failed to get an event timer object */
1345 		return TEST_FAILED;
1346 	}
1347 
1348 	/* Set up a timer */
1349 	*evtim = init_tim;
1350 	evtim->ev.event_ptr = evtim;
1351 
1352 	struct rte_event_timer *evtim_arr[] = {evtim, evtim};
1353 	ret = rte_event_timer_arm_burst(adapter, evtim_arr, RTE_DIM(evtim_arr));
1354 	TEST_ASSERT_EQUAL(ret, 1, "Unexpected return value from "
1355 			  "rte_event_timer_arm_burst");
1356 	TEST_ASSERT_EQUAL(rte_errno, EALREADY, "Unexpected rte_errno value "
1357 			  "after double-arm");
1358 
1359 	/* Let timer expire */
1360 	rte_delay_ms(600);
1361 
1362 	n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1363 	TEST_ASSERT_EQUAL(n, 1, "Dequeued incorrect number of expiry events - "
1364 			  "expected: 1, actual: %d", n);
1365 
1366 	rte_mempool_put(eventdev_test_mempool, evtim);
1367 
1368 	return TEST_SUCCESS;
1369 }
1370 
1371 /* Test the timer expiry event is generated at the expected time.  */
1372 static int
1373 event_timer_arm_expiry(void)
1374 {
1375 	uint16_t n;
1376 	int ret;
1377 	struct rte_event_timer_adapter *adapter = timdev;
1378 	struct rte_event_timer *evtim = NULL;
1379 	struct rte_event_timer *evtim2 = NULL;
1380 	struct rte_event evs[BATCH_SIZE];
1381 	const struct rte_event_timer init_tim = {
1382 		.ev.op = RTE_EVENT_OP_NEW,
1383 		.ev.queue_id = TEST_QUEUE_ID,
1384 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1385 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1386 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1387 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1388 	};
1389 
1390 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1391 	if (evtim == NULL) {
1392 		/* Failed to get an event timer object */
1393 		return TEST_FAILED;
1394 	}
1395 
1396 	/* Set up an event timer */
1397 	*evtim = init_tim;
1398 	evtim->timeout_ticks = CALC_TICKS(30),	// expire in 3 secs
1399 	evtim->ev.event_ptr = evtim;
1400 
1401 	ret = rte_event_timer_arm_burst(adapter, &evtim, 1);
1402 	TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s",
1403 			  rte_strerror(rte_errno));
1404 	TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ARMED, "Event "
1405 			  "timer in incorrect state");
1406 
1407 	rte_delay_ms(2999);
1408 
1409 	n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1410 	TEST_ASSERT_EQUAL(n, 0, "Dequeued unexpected timer expiry event");
1411 
1412 	/* Delay 100 ms to account for the adapter tick window - should let us
1413 	 * dequeue one event
1414 	 */
1415 	rte_delay_ms(100);
1416 
1417 	n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1418 	TEST_ASSERT_EQUAL(n, 1, "Dequeued incorrect number (%d) of timer "
1419 			  "expiry events", n);
1420 	TEST_ASSERT_EQUAL(evs[0].event_type, RTE_EVENT_TYPE_TIMER,
1421 			  "Dequeued unexpected type of event");
1422 
1423 	/* Check that we recover the original event timer and then free it */
1424 	evtim2 = evs[0].event_ptr;
1425 	TEST_ASSERT_EQUAL(evtim, evtim2,
1426 			  "Failed to recover pointer to original event timer");
1427 	rte_mempool_put(eventdev_test_mempool, evtim2);
1428 
1429 	return TEST_SUCCESS;
1430 }
1431 
1432 /* Check that rearming a timer works as expected. */
1433 static int
1434 event_timer_arm_rearm(void)
1435 {
1436 	uint16_t n;
1437 	int ret;
1438 	struct rte_event_timer *evtim = NULL;
1439 	struct rte_event_timer *evtim2 = NULL;
1440 	struct rte_event evs[BATCH_SIZE];
1441 	const struct rte_event_timer init_tim = {
1442 		.ev.op = RTE_EVENT_OP_NEW,
1443 		.ev.queue_id = TEST_QUEUE_ID,
1444 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1445 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1446 		.ev.event_type = RTE_EVENT_TYPE_TIMER,
1447 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1448 	};
1449 
1450 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1451 	if (evtim == NULL) {
1452 		/* Failed to get an event timer object */
1453 		return TEST_FAILED;
1454 	}
1455 
1456 	/* Set up a timer */
1457 	*evtim = init_tim;
1458 	evtim->timeout_ticks = CALC_TICKS(1);  // expire in 0.1 sec
1459 	evtim->ev.event_ptr = evtim;
1460 
1461 	/* Arm it */
1462 	ret = rte_event_timer_arm_burst(timdev, &evtim, 1);
1463 	TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s\n",
1464 			  rte_strerror(rte_errno));
1465 
1466 	/* Add 100ms to account for the adapter tick window */
1467 	rte_delay_ms(100 + 100);
1468 
1469 	n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1470 	TEST_ASSERT_EQUAL(n, 1, "Failed to dequeue expected number of expiry "
1471 			  "events from event device");
1472 
1473 	/* Recover the timer through the event that was dequeued. */
1474 	evtim2 = evs[0].event_ptr;
1475 	TEST_ASSERT_EQUAL(evtim, evtim2,
1476 			  "Failed to recover pointer to original event timer");
1477 
1478 	/* Need to reset state in case implementation can't do it */
1479 	evtim2->state = RTE_EVENT_TIMER_NOT_ARMED;
1480 
1481 	/* Rearm it */
1482 	ret = rte_event_timer_arm_burst(timdev, &evtim2, 1);
1483 	TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s\n",
1484 			  rte_strerror(rte_errno));
1485 
1486 	/* Add 100ms to account for the adapter tick window */
1487 	rte_delay_ms(100 + 100);
1488 
1489 	n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1490 	TEST_ASSERT_EQUAL(n, 1, "Failed to dequeue expected number of expiry "
1491 			  "events from event device");
1492 
1493 	/* Free it */
1494 	evtim2 = evs[0].event_ptr;
1495 	TEST_ASSERT_EQUAL(evtim, evtim2,
1496 			  "Failed to recover pointer to original event timer");
1497 	rte_mempool_put(eventdev_test_mempool, evtim2);
1498 
1499 	return TEST_SUCCESS;
1500 }
1501 
1502 /* Check that the adapter handles the max specified number of timers as
1503  * expected.
1504  */
1505 static int
1506 event_timer_arm_max(void)
1507 {
1508 	int ret, i, n;
1509 	int num_evtims = MAX_TIMERS;
1510 	struct rte_event_timer *evtims[num_evtims];
1511 	struct rte_event evs[BATCH_SIZE];
1512 	const struct rte_event_timer init_tim = {
1513 		.ev.op = RTE_EVENT_OP_NEW,
1514 		.ev.queue_id = TEST_QUEUE_ID,
1515 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1516 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1517 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1518 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1519 		.timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1520 	};
1521 
1522 	ret = rte_mempool_get_bulk(eventdev_test_mempool, (void **)evtims,
1523 				   num_evtims);
1524 	TEST_ASSERT_EQUAL(ret, 0, "Failed to get array of timer objs: ret = %d",
1525 			  ret);
1526 
1527 	for (i = 0; i < num_evtims; i++) {
1528 		*evtims[i] = init_tim;
1529 		evtims[i]->ev.event_ptr = evtims[i];
1530 	}
1531 
1532 	/* Test with the max value for the adapter */
1533 	ret = rte_event_timer_arm_burst(timdev, evtims, num_evtims);
1534 	TEST_ASSERT_EQUAL(ret, num_evtims,
1535 			  "Failed to arm all event timers: attempted = %d, "
1536 			  "succeeded = %d, rte_errno = %s",
1537 			  num_evtims, ret, rte_strerror(rte_errno));
1538 
1539 	rte_delay_ms(1000);
1540 
1541 #define MAX_TRIES num_evtims
1542 	int sum = 0;
1543 	int tries = 0;
1544 	bool done = false;
1545 	while (!done) {
1546 		sum += rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs,
1547 					       RTE_DIM(evs), 10);
1548 		if (sum >= num_evtims || ++tries >= MAX_TRIES)
1549 			done = true;
1550 
1551 		rte_delay_ms(10);
1552 	}
1553 
1554 	TEST_ASSERT_EQUAL(sum, num_evtims, "Expected %d timer expiry events, "
1555 			  "got %d", num_evtims, sum);
1556 
1557 	TEST_ASSERT(tries < MAX_TRIES, "Exceeded max tries");
1558 
1559 	rte_delay_ms(100);
1560 
1561 	/* Make sure the eventdev is still empty */
1562 	n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs),
1563 				    10);
1564 
1565 	TEST_ASSERT_EQUAL(n, 0, "Dequeued unexpected number of timer expiry "
1566 			  "events from event device");
1567 
1568 	rte_mempool_put_bulk(eventdev_test_mempool, (void **)evtims,
1569 			     num_evtims);
1570 
1571 	return TEST_SUCCESS;
1572 }
1573 
1574 /* Check that creating an event timer with incorrect event sched type fails. */
1575 static int
1576 event_timer_arm_invalid_sched_type(void)
1577 {
1578 	int ret;
1579 	struct rte_event_timer *evtim = NULL;
1580 	const struct rte_event_timer init_tim = {
1581 		.ev.op = RTE_EVENT_OP_NEW,
1582 		.ev.queue_id = TEST_QUEUE_ID,
1583 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1584 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1585 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1586 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1587 		.timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1588 	};
1589 
1590 	if (!using_services)
1591 		return -ENOTSUP;
1592 
1593 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1594 	if (evtim == NULL) {
1595 		/* Failed to get an event timer object */
1596 		return TEST_FAILED;
1597 	}
1598 
1599 	*evtim = init_tim;
1600 	evtim->ev.event_ptr = evtim;
1601 	evtim->ev.sched_type = RTE_SCHED_TYPE_PARALLEL; // bad sched type
1602 
1603 	ret = rte_event_timer_arm_burst(timdev, &evtim, 1);
1604 	TEST_ASSERT_EQUAL(ret, 0, "Expected to fail timer arm with invalid "
1605 			  "sched type, but didn't");
1606 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Unexpected rte_errno value after"
1607 			  " arm fail with invalid queue");
1608 
1609 	rte_mempool_put(eventdev_test_mempool, &evtim);
1610 
1611 	return TEST_SUCCESS;
1612 }
1613 
1614 /* Check that creating an event timer with a timeout value that is too small or
1615  * too big fails.
1616  */
1617 static int
1618 event_timer_arm_invalid_timeout(void)
1619 {
1620 	int ret;
1621 	struct rte_event_timer *evtim = NULL;
1622 	const struct rte_event_timer init_tim = {
1623 		.ev.op = RTE_EVENT_OP_NEW,
1624 		.ev.queue_id = TEST_QUEUE_ID,
1625 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1626 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1627 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1628 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1629 		.timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1630 	};
1631 
1632 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1633 	if (evtim == NULL) {
1634 		/* Failed to get an event timer object */
1635 		return TEST_FAILED;
1636 	}
1637 
1638 	*evtim = init_tim;
1639 	evtim->ev.event_ptr = evtim;
1640 	evtim->timeout_ticks = 0;  // timeout too small
1641 
1642 	ret = rte_event_timer_arm_burst(timdev, &evtim, 1);
1643 	TEST_ASSERT_EQUAL(ret, 0, "Expected to fail timer arm with invalid "
1644 			  "timeout, but didn't");
1645 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Unexpected rte_errno value after"
1646 			  " arm fail with invalid timeout");
1647 	TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ERROR_TOOEARLY,
1648 			  "Unexpected event timer state");
1649 
1650 	*evtim = init_tim;
1651 	evtim->ev.event_ptr = evtim;
1652 	evtim->timeout_ticks = CALC_TICKS(1801);  // timeout too big
1653 
1654 	ret = rte_event_timer_arm_burst(timdev, &evtim, 1);
1655 	TEST_ASSERT_EQUAL(ret, 0, "Expected to fail timer arm with invalid "
1656 			  "timeout, but didn't");
1657 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Unexpected rte_errno value after"
1658 			  " arm fail with invalid timeout");
1659 	TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ERROR_TOOLATE,
1660 			  "Unexpected event timer state");
1661 
1662 	rte_mempool_put(eventdev_test_mempool, evtim);
1663 
1664 	return TEST_SUCCESS;
1665 }
1666 
1667 static int
1668 event_timer_cancel(void)
1669 {
1670 	uint16_t n;
1671 	int ret;
1672 	struct rte_event_timer_adapter *adapter = timdev;
1673 	struct rte_event_timer *evtim = NULL;
1674 	struct rte_event evs[BATCH_SIZE];
1675 	const struct rte_event_timer init_tim = {
1676 		.ev.op = RTE_EVENT_OP_NEW,
1677 		.ev.queue_id = TEST_QUEUE_ID,
1678 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1679 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1680 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1681 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1682 	};
1683 
1684 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1685 	if (evtim == NULL) {
1686 		/* Failed to get an event timer object */
1687 		return TEST_FAILED;
1688 	}
1689 
1690 	/* Check that cancelling an uninited timer fails */
1691 	ret = rte_event_timer_cancel_burst(adapter, &evtim, 1);
1692 	TEST_ASSERT_EQUAL(ret, 0, "Succeeded unexpectedly in canceling "
1693 			  "uninited timer");
1694 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Unexpected rte_errno value after "
1695 			  "cancelling uninited timer");
1696 
1697 	/* Set up a timer */
1698 	*evtim = init_tim;
1699 	evtim->ev.event_ptr = evtim;
1700 	evtim->timeout_ticks = CALC_TICKS(30);  // expire in 3 sec
1701 
1702 	/* Check that cancelling an inited but unarmed timer fails */
1703 	ret = rte_event_timer_cancel_burst(adapter, &evtim, 1);
1704 	TEST_ASSERT_EQUAL(ret, 0, "Succeeded unexpectedly in canceling "
1705 			  "unarmed timer");
1706 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Unexpected rte_errno value after "
1707 			  "cancelling unarmed timer");
1708 
1709 	ret = rte_event_timer_arm_burst(adapter, &evtim, 1);
1710 	TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s\n",
1711 			  rte_strerror(rte_errno));
1712 	TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ARMED,
1713 			  "evtim in incorrect state");
1714 
1715 	/* Delay 1 sec */
1716 	rte_delay_ms(1000);
1717 
1718 	ret = rte_event_timer_cancel_burst(adapter, &evtim, 1);
1719 	TEST_ASSERT_EQUAL(ret, 1, "Failed to cancel event_timer: %s\n",
1720 			  rte_strerror(rte_errno));
1721 	TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_CANCELED,
1722 			  "evtim in incorrect state");
1723 
1724 	rte_delay_ms(3000);
1725 
1726 	/* Make sure that no expiry event was generated */
1727 	n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1728 	TEST_ASSERT_EQUAL(n, 0, "Dequeued unexpected timer expiry event\n");
1729 
1730 	rte_mempool_put(eventdev_test_mempool, evtim);
1731 
1732 	return TEST_SUCCESS;
1733 }
1734 
1735 static int
1736 event_timer_cancel_double(void)
1737 {
1738 	uint16_t n;
1739 	int ret;
1740 	struct rte_event_timer_adapter *adapter = timdev;
1741 	struct rte_event_timer *evtim = NULL;
1742 	struct rte_event evs[BATCH_SIZE];
1743 	const struct rte_event_timer init_tim = {
1744 		.ev.op = RTE_EVENT_OP_NEW,
1745 		.ev.queue_id = TEST_QUEUE_ID,
1746 		.ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1747 		.ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1748 		.ev.event_type =  RTE_EVENT_TYPE_TIMER,
1749 		.state = RTE_EVENT_TIMER_NOT_ARMED,
1750 		.timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1751 	};
1752 
1753 	rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1754 	if (evtim == NULL) {
1755 		/* Failed to get an event timer object */
1756 		return TEST_FAILED;
1757 	}
1758 
1759 	/* Set up a timer */
1760 	*evtim = init_tim;
1761 	evtim->ev.event_ptr = evtim;
1762 	evtim->timeout_ticks = CALC_TICKS(30);  // expire in 3 sec
1763 
1764 	ret = rte_event_timer_arm_burst(adapter, &evtim, 1);
1765 	TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s\n",
1766 			  rte_strerror(rte_errno));
1767 	TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ARMED,
1768 			  "timer in unexpected state");
1769 
1770 	/* Now, test that referencing the same timer twice in the same call
1771 	 * fails
1772 	 */
1773 	struct rte_event_timer *evtim_arr[] = {evtim, evtim};
1774 	ret = rte_event_timer_cancel_burst(adapter, evtim_arr,
1775 					   RTE_DIM(evtim_arr));
1776 
1777 	/* Two requests to cancel same timer, only one should succeed */
1778 	TEST_ASSERT_EQUAL(ret, 1, "Succeeded unexpectedly in canceling timer "
1779 			  "twice");
1780 
1781 	TEST_ASSERT_EQUAL(rte_errno, EALREADY, "Unexpected rte_errno value "
1782 			  "after double-cancel: rte_errno = %d", rte_errno);
1783 
1784 	rte_delay_ms(3000);
1785 
1786 	/* Still make sure that no expiry event was generated */
1787 	n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1788 	TEST_ASSERT_EQUAL(n, 0, "Dequeued unexpected timer expiry event\n");
1789 
1790 	rte_mempool_put(eventdev_test_mempool, evtim);
1791 
1792 	return TEST_SUCCESS;
1793 }
1794 
1795 /* Check that event timer adapter tick resolution works as expected by testing
1796  * the number of adapter ticks that occur within a particular time interval.
1797  */
1798 static int
1799 adapter_tick_resolution(void)
1800 {
1801 	struct rte_event_timer_adapter_stats stats;
1802 	uint64_t adapter_tick_count;
1803 
1804 	/* Only run this test in the software driver case */
1805 	if (!using_services)
1806 		return -ENOTSUP;
1807 
1808 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_stats_reset(timdev),
1809 				"Failed to reset stats");
1810 
1811 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_stats_get(timdev,
1812 			&stats), "Failed to get adapter stats");
1813 	TEST_ASSERT_EQUAL(stats.adapter_tick_count, 0, "Adapter tick count "
1814 			"not zeroed out");
1815 
1816 	/* Delay 1 second; should let at least 10 ticks occur with the default
1817 	 * adapter configuration used by this test.
1818 	 */
1819 	rte_delay_ms(1000);
1820 
1821 	TEST_ASSERT_SUCCESS(rte_event_timer_adapter_stats_get(timdev,
1822 			&stats), "Failed to get adapter stats");
1823 
1824 	adapter_tick_count = stats.adapter_tick_count;
1825 	TEST_ASSERT(adapter_tick_count >= 10 && adapter_tick_count <= 12,
1826 			"Expected 10-12 adapter ticks, got %"PRIu64"\n",
1827 			adapter_tick_count);
1828 
1829 	return TEST_SUCCESS;
1830 }
1831 
1832 static int
1833 adapter_create_max(void)
1834 {
1835 	int i;
1836 	uint32_t svc_start_count, svc_end_count;
1837 	struct rte_event_timer_adapter *adapters[
1838 					RTE_EVENT_TIMER_ADAPTER_NUM_MAX + 1];
1839 
1840 	struct rte_event_timer_adapter_conf conf = {
1841 		.event_dev_id = evdev,
1842 		// timer_adapter_id set in loop
1843 		.clk_src = RTE_EVENT_TIMER_ADAPTER_CPU_CLK,
1844 		.timer_tick_ns = NSECPERSEC / 10,
1845 		.max_tmo_ns = 180 * NSECPERSEC,
1846 		.nb_timers = MAX_TIMERS,
1847 		.flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES,
1848 	};
1849 
1850 	if (!using_services)
1851 		return -ENOTSUP;
1852 
1853 	svc_start_count = rte_service_get_count();
1854 
1855 	/* This test expects that there are sufficient service IDs available
1856 	 * to be allocated. I.e., RTE_EVENT_TIMER_ADAPTER_NUM_MAX may need to
1857 	 * be less than RTE_SERVICE_NUM_MAX if anything else uses a service
1858 	 * (the SW event device, for example).
1859 	 */
1860 	for (i = 0; i < RTE_EVENT_TIMER_ADAPTER_NUM_MAX; i++) {
1861 		conf.timer_adapter_id = i;
1862 		adapters[i] = rte_event_timer_adapter_create_ext(&conf,
1863 				test_port_conf_cb, NULL);
1864 		TEST_ASSERT_NOT_NULL(adapters[i], "Failed to create adapter "
1865 				"%d", i);
1866 	}
1867 
1868 	conf.timer_adapter_id = i;
1869 	adapters[i] = rte_event_timer_adapter_create(&conf);
1870 	TEST_ASSERT_NULL(adapters[i], "Created too many adapters");
1871 
1872 	/* Check that at least RTE_EVENT_TIMER_ADAPTER_NUM_MAX services
1873 	 * have been created
1874 	 */
1875 	svc_end_count = rte_service_get_count();
1876 	TEST_ASSERT_EQUAL(svc_end_count - svc_start_count,
1877 			RTE_EVENT_TIMER_ADAPTER_NUM_MAX,
1878 			"Failed to create expected number of services");
1879 
1880 	for (i = 0; i < RTE_EVENT_TIMER_ADAPTER_NUM_MAX; i++)
1881 		TEST_ASSERT_SUCCESS(rte_event_timer_adapter_free(adapters[i]),
1882 				"Failed to free adapter %d", i);
1883 
1884 	/* Check that service count is back to where it was at start */
1885 	svc_end_count = rte_service_get_count();
1886 	TEST_ASSERT_EQUAL(svc_start_count, svc_end_count, "Failed to release "
1887 			  "correct number of services");
1888 
1889 	return TEST_SUCCESS;
1890 }
1891 
1892 static struct unit_test_suite event_timer_adptr_functional_testsuite  = {
1893 	.suite_name = "event timer functional test suite",
1894 	.setup = testsuite_setup,
1895 	.teardown = testsuite_teardown,
1896 	.unit_test_cases = {
1897 		TEST_CASE_ST(timdev_setup_usec, timdev_teardown,
1898 				test_timer_state),
1899 		TEST_CASE_ST(timdev_setup_usec, timdev_teardown,
1900 				test_timer_arm),
1901 		TEST_CASE_ST(timdev_setup_msec_periodic, timdev_teardown,
1902 				test_timer_arm_periodic),
1903 		TEST_CASE_ST(timdev_setup_usec, timdev_teardown,
1904 				test_timer_arm_burst),
1905 		TEST_CASE_ST(timdev_setup_msec_periodic, timdev_teardown,
1906 				test_timer_arm_burst_periodic),
1907 		TEST_CASE_ST(timdev_setup_sec, timdev_teardown,
1908 				test_timer_cancel),
1909 		TEST_CASE_ST(timdev_setup_sec_periodic, timdev_teardown,
1910 				test_timer_cancel_periodic),
1911 		TEST_CASE_ST(timdev_setup_sec, timdev_teardown,
1912 				test_timer_cancel_random),
1913 		TEST_CASE_ST(timdev_setup_usec_multicore, timdev_teardown,
1914 				test_timer_arm_multicore),
1915 		TEST_CASE_ST(timdev_setup_usec_multicore, timdev_teardown,
1916 				test_timer_arm_burst_multicore),
1917 		TEST_CASE_ST(timdev_setup_sec_multicore, timdev_teardown,
1918 				test_timer_cancel_multicore),
1919 		TEST_CASE_ST(timdev_setup_sec_multicore, timdev_teardown,
1920 				test_timer_cancel_burst_multicore),
1921 		TEST_CASE(adapter_create),
1922 		TEST_CASE_ST(timdev_setup_msec, NULL, adapter_free),
1923 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1924 				adapter_get_info),
1925 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1926 				adapter_lookup),
1927 		TEST_CASE_ST(NULL, timdev_teardown,
1928 				adapter_start),
1929 		TEST_CASE_ST(timdev_setup_msec, NULL,
1930 				adapter_stop),
1931 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1932 				stat_inc_reset_ev_enq),
1933 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1934 			     event_timer_arm),
1935 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1936 			     event_timer_arm_double),
1937 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1938 			     event_timer_arm_expiry),
1939 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1940 				event_timer_arm_rearm),
1941 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1942 				event_timer_arm_max),
1943 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1944 				event_timer_arm_invalid_sched_type),
1945 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1946 				event_timer_arm_invalid_timeout),
1947 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1948 				event_timer_cancel),
1949 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1950 				event_timer_cancel_double),
1951 		TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1952 				adapter_tick_resolution),
1953 		TEST_CASE(adapter_create_max),
1954 		TEST_CASES_END() /**< NULL terminate unit test array */
1955 	}
1956 };
1957 
1958 static int
1959 test_event_timer_adapter_func(void)
1960 {
1961 	return unit_test_suite_runner(&event_timer_adptr_functional_testsuite);
1962 }
1963 
1964 #endif /* !RTE_EXEC_ENV_WINDOWS */
1965 
1966 REGISTER_TEST_COMMAND(event_timer_adapter_test, test_event_timer_adapter_func);
1967