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