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