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