New upstream version 18.08
[deb_dpdk.git] / app / test-bbdev / test_bbdev.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Intel Corporation
3  */
4
5 #include <rte_common.h>
6 #include <rte_hexdump.h>
7 #include <rte_mbuf.h>
8 #include <rte_malloc.h>
9 #include <rte_memcpy.h>
10 #include <rte_cycles.h>
11
12 #include <rte_bus_vdev.h>
13
14 #include <rte_bbdev.h>
15 #include <rte_bbdev_op.h>
16 #include <rte_bbdev_pmd.h>
17
18 #include "main.h"
19
20
21 #define BBDEV_NAME_NULL          ("bbdev_null")
22
23 struct bbdev_testsuite_params {
24         struct rte_bbdev_queue_conf qconf;
25 };
26
27 static struct bbdev_testsuite_params testsuite_params;
28
29 static uint8_t null_dev_id;
30
31 static int
32 testsuite_setup(void)
33 {
34         uint8_t nb_devs;
35         int ret;
36         char buf[RTE_BBDEV_NAME_MAX_LEN];
37
38         /* Create test device */
39         snprintf(buf, sizeof(buf), "%s_unittest", BBDEV_NAME_NULL);
40         ret = rte_vdev_init(buf, NULL);
41         TEST_ASSERT(ret == 0, "Failed to create instance of pmd: %s", buf);
42
43         nb_devs = rte_bbdev_count();
44         TEST_ASSERT(nb_devs != 0, "No devices found");
45
46         /* Most recently created device is our device */
47         null_dev_id = nb_devs - 1;
48
49         return TEST_SUCCESS;
50 }
51
52 static void
53 testsuite_teardown(void)
54 {
55         char buf[RTE_BBDEV_NAME_MAX_LEN];
56
57         snprintf(buf, sizeof(buf), "%s_unittest", BBDEV_NAME_NULL);
58         rte_vdev_uninit(buf);
59 }
60
61 static int
62 ut_setup(void)
63 {
64         struct bbdev_testsuite_params *ts_params = &testsuite_params;
65         uint8_t num_queues;
66
67         /* Valid queue configuration */
68         ts_params->qconf.priority = 0;
69         ts_params->qconf.socket = SOCKET_ID_ANY;
70         ts_params->qconf.deferred_start = 1;
71
72         num_queues = 1;
73         TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(null_dev_id, num_queues,
74                         SOCKET_ID_ANY), "Failed to setup queues for bbdev %u",
75                         0);
76
77         /* Start the device */
78         TEST_ASSERT_SUCCESS(rte_bbdev_start(null_dev_id),
79                         "Failed to start bbdev %u", 0);
80
81         return TEST_SUCCESS;
82 }
83
84 static void
85 ut_teardown(void)
86 {
87         rte_bbdev_close(null_dev_id);
88 }
89
90 static int
91 test_bbdev_configure_invalid_dev_id(void)
92 {
93         uint8_t dev_id;
94         uint8_t num_queues;
95
96         num_queues = 1;
97         for (dev_id = 0; dev_id < RTE_BBDEV_MAX_DEVS; dev_id++) {
98                 if (!rte_bbdev_is_valid(dev_id)) {
99                         TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id,
100                                         num_queues, SOCKET_ID_ANY),
101                                         "Failed test for rte_bbdev_setup_queues: "
102                                         "invalid dev_num %u", dev_id);
103                         TEST_ASSERT(rte_bbdev_intr_enable(dev_id) == -ENODEV,
104                                         "Failed test for rte_bbdev_intr_enable: "
105                                         "invalid dev_num %u", dev_id);
106                         break;
107                 }
108         }
109
110         return TEST_SUCCESS;
111 }
112
113 static int
114 test_bbdev_configure_invalid_num_queues(void)
115 {
116         struct rte_bbdev_info info;
117         uint8_t dev_id, num_devs;
118         uint8_t num_queues;
119         int return_value;
120
121         TEST_ASSERT((num_devs = rte_bbdev_count()) >= 1,
122                         "Need at least %d devices for test", 1);
123
124         /* valid num_queues values */
125         num_queues = 8;
126
127         /* valid dev_id values */
128         dev_id = null_dev_id;
129
130         /* Stop the device in case it's started so it can be configured */
131         rte_bbdev_stop(dev_id);
132
133         TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 0, SOCKET_ID_ANY),
134                         "Failed test for rte_bbdev_setup_queues: "
135                         "invalid num_queues %d", 0);
136
137         TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, num_queues,
138                         SOCKET_ID_ANY),
139                         "Failed test for rte_bbdev_setup_queues: "
140                         "invalid dev_num %u", dev_id);
141
142         TEST_ASSERT_FAIL(return_value = rte_bbdev_info_get(dev_id, NULL),
143                          "Failed test for rte_bbdev_info_get: "
144                          "returned value:%i", return_value);
145
146         TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info),
147                         "Failed test for rte_bbdev_info_get: "
148                         "invalid return value:%i", return_value);
149
150         TEST_ASSERT(info.num_queues == num_queues,
151                         "Failed test for rte_bbdev_info_get: "
152                         "invalid num_queues:%u", info.num_queues);
153
154         num_queues = info.drv.max_num_queues;
155         TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, num_queues,
156                         SOCKET_ID_ANY),
157                         "Failed test for rte_bbdev_setup_queues: "
158                         "invalid num_queues: %u", num_queues);
159
160         num_queues++;
161         TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, num_queues,
162                         SOCKET_ID_ANY),
163                         "Failed test for rte_bbdev_setup_queues: "
164                         "invalid num_queues: %u", num_queues);
165
166         return TEST_SUCCESS;
167 }
168
169 static int
170 test_bbdev_configure_stop_device(void)
171 {
172         struct rte_bbdev_info info;
173         uint8_t dev_id;
174         int return_value;
175
176         /* valid dev_id values */
177         dev_id = null_dev_id;
178
179         /* Stop the device so it can be configured */
180         rte_bbdev_stop(dev_id);
181
182         TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info),
183                         "Failed test for rte_bbdev_info_get: "
184                         "invalid return value from "
185                         "rte_bbdev_info_get function: %i", return_value);
186
187         TEST_ASSERT_SUCCESS(info.started, "Failed test for rte_bbdev_info_get: "
188                         "started value: %u", info.started);
189
190         TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id,
191                         info.drv.max_num_queues, SOCKET_ID_ANY),
192                         "Failed test for rte_bbdev_setup_queues: "
193                         "device should be stopped, dev_id: %u", dev_id);
194
195         return_value = rte_bbdev_intr_enable(dev_id);
196         TEST_ASSERT(return_value != -EBUSY,
197                         "Failed test for rte_bbdev_intr_enable: device should be stopped, dev_id: %u",
198                         dev_id);
199
200         /* Start the device so it cannot be configured */
201         TEST_ASSERT_FAIL(rte_bbdev_start(RTE_BBDEV_MAX_DEVS),
202                         "Failed to start bbdev %u", dev_id);
203
204         TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id),
205                         "Failed to start bbdev %u", dev_id);
206
207         TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info),
208                         "Failed test for rte_bbdev_info_get: "
209                         "invalid return value from "
210                         "rte_bbdev_info_get function: %i", return_value);
211
212         TEST_ASSERT_FAIL(info.started, "Failed test for rte_bbdev_info_get: "
213                         "started value: %u", info.started);
214
215         TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id,
216                         info.drv.max_num_queues, SOCKET_ID_ANY),
217                         "Failed test for rte_bbdev_setup_queues: "
218                         "device should be started, dev_id: %u", dev_id);
219
220         return_value = rte_bbdev_intr_enable(dev_id);
221         TEST_ASSERT(return_value == -EBUSY,
222                         "Failed test for rte_bbdev_intr_enable: device should be started, dev_id: %u",
223                         dev_id);
224
225         /* Stop again the device so it can be once again configured */
226         TEST_ASSERT_FAIL(rte_bbdev_stop(RTE_BBDEV_MAX_DEVS),
227                         "Failed to start bbdev %u", dev_id);
228
229         TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id), "Failed to stop bbdev %u",
230                         dev_id);
231
232         TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info),
233                         "Failed test for rte_bbdev_info_get: "
234                         "invalid return value from "
235                         "rte_bbdev_info_get function: %i", return_value);
236
237         TEST_ASSERT_SUCCESS(info.started, "Failed test for rte_bbdev_info_get: "
238                         "started value: %u", info.started);
239
240         TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id,
241                         info.drv.max_num_queues, SOCKET_ID_ANY),
242                         "Failed test for rte_bbdev_setup_queues: "
243                         "device should be stopped, dev_id: %u", dev_id);
244
245         return_value = rte_bbdev_intr_enable(dev_id);
246         TEST_ASSERT(return_value != -EBUSY,
247                         "Failed test for rte_bbdev_intr_enable: device should be stopped, dev_id: %u",
248                         dev_id);
249
250         return TEST_SUCCESS;
251 }
252
253 static int
254 test_bbdev_configure_stop_queue(void)
255 {
256         struct bbdev_testsuite_params *ts_params = &testsuite_params;
257         struct rte_bbdev_info info;
258         struct rte_bbdev_queue_info qinfo;
259         uint8_t dev_id;
260         uint16_t queue_id;
261         int return_value;
262
263         /* Valid dev_id values */
264         dev_id = null_dev_id;
265
266         /* Valid queue_id values */
267         queue_id = 0;
268
269         rte_bbdev_stop(dev_id);
270         TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info),
271                         "Failed test for rte_bbdev_info_get: "
272                         "invalid return value:%i", return_value);
273
274         /* Valid queue configuration */
275         ts_params->qconf.queue_size = info.drv.queue_size_lim;
276         ts_params->qconf.priority = info.drv.max_ul_queue_priority;
277
278         /* Device - started; queue - started */
279         rte_bbdev_start(dev_id);
280
281         TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
282                         &ts_params->qconf),
283                         "Failed test for rte_bbdev_queue_configure: "
284                         "queue:%u on device:%u should be stopped",
285                          queue_id, dev_id);
286
287         /* Device - stopped; queue - started */
288         rte_bbdev_stop(dev_id);
289
290         TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
291                         &ts_params->qconf),
292                         "Failed test for rte_bbdev_queue_configure: "
293                         "queue:%u on device:%u should be stopped",
294                          queue_id, dev_id);
295
296         TEST_ASSERT_FAIL(rte_bbdev_queue_stop(RTE_BBDEV_MAX_DEVS, queue_id),
297                         "Failed test for rte_bbdev_queue_stop "
298                         "invalid dev_id ");
299
300         TEST_ASSERT_FAIL(rte_bbdev_queue_stop(dev_id, RTE_MAX_QUEUES_PER_PORT),
301                         "Failed test for rte_bbdev_queue_stop "
302                         "invalid queue_id ");
303
304         /* Device - stopped; queue - stopped */
305         rte_bbdev_queue_stop(dev_id, queue_id);
306
307         TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id,
308                         &ts_params->qconf),
309                         "Failed test for rte_bbdev_queue_configure: "
310                         "queue:%u on device:%u should be stopped", queue_id,
311                         dev_id);
312
313         TEST_ASSERT_SUCCESS(return_value = rte_bbdev_queue_info_get(dev_id,
314                         queue_id, &qinfo),
315                         "Failed test for rte_bbdev_info_get: "
316                         "invalid return value from "
317                         "rte_bbdev_queue_info_get function: %i", return_value);
318
319         TEST_ASSERT(qinfo.conf.socket == ts_params->qconf.socket,
320                         "Failed test for rte_bbdev_queue_info_get: "
321                         "invalid queue_size:%u", qinfo.conf.socket);
322
323         TEST_ASSERT(qinfo.conf.queue_size == ts_params->qconf.queue_size,
324                         "Failed test for rte_bbdev_queue_info_get: "
325                         "invalid queue_size:%u", qinfo.conf.queue_size);
326
327         TEST_ASSERT(qinfo.conf.priority == ts_params->qconf.priority,
328                         "Failed test for rte_bbdev_queue_info_get: "
329                         "invalid queue_size:%u", qinfo.conf.priority);
330
331         TEST_ASSERT(qinfo.conf.deferred_start ==
332                         ts_params->qconf.deferred_start,
333                         "Failed test for rte_bbdev_queue_info_get: "
334                         "invalid queue_size:%u", qinfo.conf.deferred_start);
335
336         /* Device - started; queue - stopped */
337         rte_bbdev_start(dev_id);
338         rte_bbdev_queue_stop(dev_id, queue_id);
339
340         TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
341                         &ts_params->qconf),
342                         "Failed test for rte_bbdev_queue_configure: "
343                         "queue:%u on device:%u should be stopped", queue_id,
344                         dev_id);
345
346         rte_bbdev_stop(dev_id);
347
348         /* After rte_bbdev_start(dev_id):
349          * - queue should be still stopped if deferred_start ==
350          */
351         rte_bbdev_start(dev_id);
352
353         TEST_ASSERT_SUCCESS(return_value = rte_bbdev_queue_info_get(dev_id,
354                         queue_id, &qinfo),
355                         "Failed test for rte_bbdev_info_get: "
356                         "invalid return value from "
357                         "rte_bbdev_queue_info_get function: %i", return_value);
358
359         TEST_ASSERT(qinfo.started == 0,
360                         "Failed test for rte_bbdev_queue_info_get: "
361                         "invalid value for qinfo.started:%u", qinfo.started);
362
363         rte_bbdev_stop(dev_id);
364
365         /* After rte_bbdev_start(dev_id):
366          * - queue should be started if deferred_start ==
367          */
368         ts_params->qconf.deferred_start = 0;
369         rte_bbdev_queue_configure(dev_id, queue_id, &ts_params->qconf);
370         rte_bbdev_start(dev_id);
371
372         TEST_ASSERT_SUCCESS(return_value = rte_bbdev_queue_info_get(dev_id,
373                         queue_id, &qinfo),
374                         "Failed test for rte_bbdev_info_get: "
375                         "invalid return value from "
376                         "rte_bbdev_queue_info_get function: %i", return_value);
377
378         TEST_ASSERT(qinfo.started == 1,
379                         "Failed test for rte_bbdev_queue_info_get: "
380                         "invalid value for qinfo.started:%u", qinfo.started);
381
382         return TEST_SUCCESS;
383 }
384
385 static int
386 test_bbdev_configure_invalid_queue_configure(void)
387 {
388         struct bbdev_testsuite_params *ts_params = &testsuite_params;
389         int return_value;
390         struct rte_bbdev_info info;
391         uint8_t dev_id;
392         uint16_t queue_id;
393
394         /* Valid dev_id values */
395         dev_id = null_dev_id;
396
397         /* Valid queue_id values */
398         queue_id = 0;
399
400         rte_bbdev_stop(dev_id);
401
402         TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info),
403                         "Failed test for rte_bbdev_info_get: "
404                         "invalid return value:%i", return_value);
405
406         rte_bbdev_queue_stop(dev_id, queue_id);
407
408         ts_params->qconf.queue_size = info.drv.queue_size_lim + 1;
409         TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
410                         &ts_params->qconf),
411                         "Failed test for rte_bbdev_queue_configure: "
412                         "invalid value qconf.queue_size: %u",
413                         ts_params->qconf.queue_size);
414
415         ts_params->qconf.queue_size = info.drv.queue_size_lim;
416         ts_params->qconf.priority = info.drv.max_ul_queue_priority;
417         queue_id = info.num_queues;
418         TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
419                         &ts_params->qconf),
420                         "Failed test for rte_bbdev_queue_configure: "
421                         "invalid value queue_id: %u", queue_id);
422
423         queue_id = 0;
424         TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, NULL),
425                         "Failed test for rte_bbdev_queue_configure: "
426                         "NULL qconf structure ");
427
428         ts_params->qconf.socket = RTE_MAX_NUMA_NODES;
429         TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
430                         &ts_params->qconf),
431                         "Failed test for rte_bbdev_queue_configure: "
432                         "invalid socket number ");
433
434         ts_params->qconf.socket = SOCKET_ID_ANY;
435         TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id,
436                         &ts_params->qconf),
437                         "Failed test for rte_bbdev_queue_configure: "
438                         "invalid value qconf.queue_size: %u",
439                         ts_params->qconf.queue_size);
440
441         TEST_ASSERT_FAIL(rte_bbdev_queue_configure(RTE_BBDEV_MAX_DEVS, queue_id,
442                         &ts_params->qconf),
443                         "Failed test for rte_bbdev_queue_configure: "
444                         "invalid dev_id");
445
446         TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, NULL),
447                         "Failed test for rte_bbdev_queue_configure: "
448                         "invalid value qconf.queue_size: %u",
449                         ts_params->qconf.queue_size);
450
451         return TEST_SUCCESS;
452 }
453
454 static int
455 test_bbdev_op_pool(void)
456 {
457         struct rte_mempool *mp;
458
459         unsigned int dec_size = sizeof(struct rte_bbdev_dec_op);
460         unsigned int enc_size = sizeof(struct rte_bbdev_enc_op);
461
462         const char *pool_dec = "Test_DEC";
463         const char *pool_enc = "Test_ENC";
464
465         /* Valid pool configuration */
466         uint32_t size = 256;
467         uint32_t cache_size = 128;
468
469         TEST_ASSERT(rte_bbdev_op_pool_create(NULL,
470                         RTE_BBDEV_OP_TURBO_DEC, size, cache_size, 0) == NULL,
471                         "Failed test for rte_bbdev_op_pool_create: "
472                         "NULL name parameter");
473
474         TEST_ASSERT((mp = rte_bbdev_op_pool_create(pool_dec,
475                         RTE_BBDEV_OP_TURBO_DEC, size, cache_size, 0)) != NULL,
476                         "Failed test for rte_bbdev_op_pool_create: "
477                         "returned value is empty");
478
479         TEST_ASSERT(mp->size == size,
480                         "Failed test for rte_bbdev_op_pool_create: "
481                         "invalid size of the mempool, mp->size: %u", mp->size);
482
483         TEST_ASSERT(mp->cache_size == cache_size,
484                         "Failed test for rte_bbdev_op_pool_create: "
485                         "invalid size of the mempool, mp->size: %u",
486                         mp->cache_size);
487
488         TEST_ASSERT_SUCCESS(strcmp(mp->name, pool_dec),
489                         "Failed test for rte_bbdev_op_pool_create: "
490                         "invalid name of mempool, mp->name: %s", mp->name);
491
492         TEST_ASSERT(mp->elt_size == dec_size,
493                         "Failed test for rte_bbdev_op_pool_create: "
494                         "invalid element size for RTE_BBDEV_OP_TURBO_DEC, "
495                         "mp->elt_size: %u", mp->elt_size);
496
497         rte_mempool_free(mp);
498
499         TEST_ASSERT((mp = rte_bbdev_op_pool_create(pool_enc,
500                         RTE_BBDEV_OP_TURBO_ENC, size, cache_size, 0)) != NULL,
501                          "Failed test for rte_bbdev_op_pool_create: "
502                         "returned value is empty");
503
504         TEST_ASSERT(mp->elt_size == enc_size,
505                         "Failed test for rte_bbdev_op_pool_create: "
506                         "invalid element size for RTE_BBDEV_OP_TURBO_ENC, "
507                         "mp->elt_size: %u", mp->elt_size);
508
509         rte_mempool_free(mp);
510
511         TEST_ASSERT((mp = rte_bbdev_op_pool_create("Test_NONE",
512                         RTE_BBDEV_OP_NONE, size, cache_size, 0)) != NULL,
513                         "Failed test for rte_bbdev_op_pool_create: "
514                         "returned value is empty for RTE_BBDEV_OP_NONE");
515
516         TEST_ASSERT(mp->elt_size == (enc_size > dec_size ? enc_size : dec_size),
517                         "Failed test for rte_bbdev_op_pool_create: "
518                         "invalid  size for RTE_BBDEV_OP_NONE, mp->elt_size: %u",
519                         mp->elt_size);
520
521         rte_mempool_free(mp);
522
523         TEST_ASSERT((mp = rte_bbdev_op_pool_create("Test_INV",
524                         RTE_BBDEV_OP_TYPE_COUNT, size, cache_size, 0)) == NULL,
525                         "Failed test for rte_bbdev_op_pool_create: "
526                         "returned value is not NULL for invalid type");
527
528         /* Invalid pool configuration */
529         size = 128;
530         cache_size = 256;
531
532         TEST_ASSERT((mp = rte_bbdev_op_pool_create("Test_InvSize",
533                         RTE_BBDEV_OP_NONE, size, cache_size, 0)) == NULL,
534                         "Failed test for rte_bbdev_op_pool_create: "
535                         "returned value should be empty "
536                         "because size of per-lcore local cache "
537                         "is greater than size of the mempool.");
538
539         return TEST_SUCCESS;
540 }
541
542 /**
543  *  Create pool of OP types RTE_BBDEV_OP_NONE, RTE_BBDEV_OP_TURBO_DEC and
544  *  RTE_BBDEV_OP_TURBO_ENC and check that only ops of that type can be
545  *  allocated
546  */
547 static int
548 test_bbdev_op_type(void)
549 {
550         struct rte_mempool *mp_dec;
551
552         const unsigned int OPS_COUNT = 32;
553         struct rte_bbdev_dec_op *dec_ops_arr[OPS_COUNT];
554         struct rte_bbdev_enc_op *enc_ops_arr[OPS_COUNT];
555
556         const char *pool_dec = "Test_op_dec";
557
558         /* Valid pool configuration */
559         uint32_t num_elements = 256;
560         uint32_t cache_size = 128;
561
562         /* mempool type : RTE_BBDEV_OP_TURBO_DEC */
563         mp_dec = rte_bbdev_op_pool_create(pool_dec,
564                         RTE_BBDEV_OP_TURBO_DEC, num_elements, cache_size, 0);
565         TEST_ASSERT(mp_dec != NULL, "Failed to create %s mempool", pool_dec);
566
567         TEST_ASSERT(rte_bbdev_dec_op_alloc_bulk(mp_dec, dec_ops_arr, 1) == 0,
568                         "Failed test for rte_bbdev_op_alloc_bulk TURBO_DEC: "
569                         "OPs type: RTE_BBDEV_OP_TURBO_DEC");
570
571         TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_dec, enc_ops_arr, 1) != 0,
572                         "Failed test for rte_bbdev_op_alloc_bulk TURBO_DEC: "
573                         "OPs type: RTE_BBDEV_OP_TURBO_ENC");
574
575         rte_mempool_free(mp_dec);
576
577         return TEST_SUCCESS;
578 }
579
580 static int
581 test_bbdev_op_pool_size(void)
582 {
583         struct rte_mempool *mp_none;
584
585         const unsigned int OPS_COUNT = 128;
586         struct rte_bbdev_enc_op *ops_enc_arr[OPS_COUNT];
587         struct rte_bbdev_enc_op *ops_ext_arr[OPS_COUNT];
588         struct rte_bbdev_enc_op *ops_ext2_arr[OPS_COUNT];
589
590         const char *pool_none = "Test_pool_size";
591
592         /* Valid pool configuration */
593         uint32_t num_elements = 256;
594         uint32_t cache_size = 0;
595
596         /* Create mempool type : RTE_BBDEV_OP_TURBO_ENC, size : 256 */
597         mp_none = rte_bbdev_op_pool_create(pool_none, RTE_BBDEV_OP_TURBO_ENC,
598                         num_elements, cache_size, 0);
599         TEST_ASSERT(mp_none != NULL, "Failed to create %s mempool", pool_none);
600
601         /* Add 128 RTE_BBDEV_OP_TURBO_ENC ops */
602         rte_bbdev_enc_op_alloc_bulk(mp_none, ops_enc_arr, OPS_COUNT);
603
604         /* Add 128 RTE_BBDEV_OP_TURBO_ENC ops */
605         TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_none, ops_ext_arr,
606                         OPS_COUNT) == 0,
607                         "Failed test for allocating bbdev ops: "
608                         "Mempool size: 256, Free : 128, Attempted to add: 128");
609
610         /* Try adding 128 more RTE_BBDEV_OP_TURBO_ENC ops, this should fail */
611         TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_none, ops_ext2_arr,
612                         OPS_COUNT) != 0,
613                         "Failed test for allocating bbdev ops: "
614                         "Mempool size: 256, Free : 0, Attempted to add: 128");
615
616         /* Free-up 128 RTE_BBDEV_OP_TURBO_ENC ops */
617         rte_bbdev_enc_op_free_bulk(ops_enc_arr, OPS_COUNT);
618
619         /* Try adding 128 RTE_BBDEV_OP_TURBO_DEC ops, this should succeed */
620         /* Cache size > 0 causes reallocation of ops size > 127 fail */
621         TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_none, ops_ext2_arr,
622                         OPS_COUNT) == 0,
623                         "Failed test for allocating ops after mempool freed:  "
624                         "Mempool size: 256, Free : 128, Attempted to add: 128");
625
626         rte_mempool_free(mp_none);
627
628         return TEST_SUCCESS;
629 }
630
631 static int
632 test_bbdev_count(void)
633 {
634         uint8_t num_devs, num_valid_devs = 0;
635
636         for (num_devs = 0; num_devs < RTE_BBDEV_MAX_DEVS; num_devs++) {
637                 if (rte_bbdev_is_valid(num_devs))
638                         num_valid_devs++;
639         }
640
641         num_devs = rte_bbdev_count();
642         TEST_ASSERT(num_valid_devs == num_devs,
643                         "Failed test for rte_bbdev_is_valid: "
644                         "invalid num_devs %u ", num_devs);
645
646         return TEST_SUCCESS;
647 }
648
649 static int
650 test_bbdev_stats(void)
651 {
652         uint8_t dev_id = null_dev_id;
653         uint16_t queue_id = 0;
654         struct rte_bbdev_dec_op *dec_ops[4096] = { 0 };
655         struct rte_bbdev_dec_op *dec_proc_ops[4096] = { 0 };
656         struct rte_bbdev_enc_op *enc_ops[4096] = { 0 };
657         struct rte_bbdev_enc_op *enc_proc_ops[4096] = { 0 };
658         uint16_t num_ops = 236;
659         struct rte_bbdev_stats stats;
660         struct bbdev_testsuite_params *ts_params = &testsuite_params;
661
662         TEST_ASSERT_SUCCESS(rte_bbdev_queue_stop(dev_id, queue_id),
663                         "Failed to stop queue %u on device %u ", queue_id,
664                         dev_id);
665         TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id),
666                         "Failed to stop bbdev %u ", dev_id);
667
668         TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id,
669                         &ts_params->qconf),
670                         "Failed to configure queue %u on device %u ",
671                         queue_id, dev_id);
672
673         TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id),
674                         "Failed to start bbdev %u ", dev_id);
675
676         TEST_ASSERT_SUCCESS(rte_bbdev_queue_start(dev_id, queue_id),
677                         "Failed to start queue %u on device %u ", queue_id,
678                         dev_id);
679
680         TEST_ASSERT_SUCCESS(rte_bbdev_queue_start(dev_id, queue_id),
681                         "Failed to start queue %u on device %u ", queue_id,
682                         dev_id);
683
684         /* Tests after enqueue operation */
685         rte_bbdev_enqueue_enc_ops(dev_id, queue_id, enc_ops, num_ops);
686         rte_bbdev_enqueue_dec_ops(dev_id, queue_id, dec_ops, num_ops);
687
688         TEST_ASSERT_FAIL(rte_bbdev_stats_get(RTE_BBDEV_MAX_DEVS, &stats),
689                         "Failed test for rte_bbdev_stats_get on device %u ",
690                         dev_id);
691
692         TEST_ASSERT_FAIL(rte_bbdev_stats_get(dev_id, NULL),
693                         "Failed test for rte_bbdev_stats_get on device %u ",
694                         dev_id);
695
696         TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats),
697                         "Failed test for rte_bbdev_stats_get on device %u ",
698                         dev_id);
699
700         TEST_ASSERT(stats.enqueued_count == 2 * num_ops,
701                         "Failed test for rte_bbdev_enqueue_ops: "
702                         "invalid enqueued_count %" PRIu64 " ",
703                         stats.enqueued_count);
704
705         TEST_ASSERT(stats.dequeued_count == 0,
706                         "Failed test for rte_bbdev_stats_reset: "
707                         "invalid dequeued_count %" PRIu64 " ",
708                         stats.dequeued_count);
709
710         /* Tests after dequeue operation */
711         rte_bbdev_dequeue_enc_ops(dev_id, queue_id, enc_proc_ops, num_ops);
712         rte_bbdev_dequeue_dec_ops(dev_id, queue_id, dec_proc_ops, num_ops);
713
714         TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats),
715                         "Failed test for rte_bbdev_stats_get on device %u ",
716                         dev_id);
717
718         TEST_ASSERT(stats.dequeued_count == 2 * num_ops,
719                         "Failed test for rte_bbdev_dequeue_ops: "
720                         "invalid enqueued_count %" PRIu64 " ",
721                         stats.dequeued_count);
722
723         TEST_ASSERT(stats.enqueue_err_count == 0,
724                         "Failed test for rte_bbdev_stats_reset: "
725                         "invalid enqueue_err_count %" PRIu64 " ",
726                         stats.enqueue_err_count);
727
728         TEST_ASSERT(stats.dequeue_err_count == 0,
729                         "Failed test for rte_bbdev_stats_reset: "
730                         "invalid dequeue_err_count %" PRIu64 " ",
731                         stats.dequeue_err_count);
732
733         /* Tests after reset operation */
734         TEST_ASSERT_FAIL(rte_bbdev_stats_reset(RTE_BBDEV_MAX_DEVS),
735                         "Failed to reset statistic for device %u ", dev_id);
736
737         TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id),
738                         "Failed to reset statistic for device %u ", dev_id);
739         TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats),
740                         "Failed test for rte_bbdev_stats_get on device %u ",
741                         dev_id);
742
743         TEST_ASSERT(stats.enqueued_count == 0,
744                         "Failed test for rte_bbdev_stats_reset: "
745                         "invalid enqueued_count %" PRIu64 " ",
746                         stats.enqueued_count);
747
748         TEST_ASSERT(stats.dequeued_count == 0,
749                         "Failed test for rte_bbdev_stats_reset: "
750                         "invalid dequeued_count %" PRIu64 " ",
751                         stats.dequeued_count);
752
753         TEST_ASSERT(stats.enqueue_err_count == 0,
754                         "Failed test for rte_bbdev_stats_reset: "
755                         "invalid enqueue_err_count %" PRIu64 " ",
756                         stats.enqueue_err_count);
757
758         TEST_ASSERT(stats.dequeue_err_count == 0,
759                         "Failed test for rte_bbdev_stats_reset: "
760                         "invalid dequeue_err_count %" PRIu64 " ",
761                         stats.dequeue_err_count);
762
763         return TEST_SUCCESS;
764 }
765
766 static int
767 test_bbdev_driver_init(void)
768 {
769         struct rte_bbdev *dev1, *dev2;
770         const char *name = "dev_name";
771         char name_tmp[16];
772         int num_devs, num_devs_tmp;
773
774         dev1 = rte_bbdev_allocate(NULL);
775         TEST_ASSERT(dev1 == NULL,
776                         "Failed initialize bbdev driver with NULL name");
777
778         dev1 = rte_bbdev_allocate(name);
779         TEST_ASSERT(dev1 != NULL, "Failed to initialize bbdev driver");
780
781         dev2 = rte_bbdev_allocate(name);
782         TEST_ASSERT(dev2 == NULL,
783                         "Failed to initialize bbdev driver: "
784                         "driver with the same name has been initialized before");
785
786         num_devs = rte_bbdev_count() - 1;
787         num_devs_tmp = num_devs;
788
789         /* Initialize the maximum amount of devices */
790         do {
791                 sprintf(name_tmp, "%s%i", "name_", num_devs);
792                 dev2 = rte_bbdev_allocate(name_tmp);
793                 TEST_ASSERT(dev2 != NULL,
794                                 "Failed to initialize bbdev driver");
795                 ++num_devs;
796         } while (num_devs < (RTE_BBDEV_MAX_DEVS - 1));
797
798         sprintf(name_tmp, "%s%i", "name_", num_devs);
799         dev2 = rte_bbdev_allocate(name_tmp);
800         TEST_ASSERT(dev2 == NULL, "Failed to initialize bbdev driver number %d "
801                         "more drivers than RTE_BBDEV_MAX_DEVS: %d ", num_devs,
802                         RTE_BBDEV_MAX_DEVS);
803
804         num_devs--;
805
806         while (num_devs >= num_devs_tmp) {
807                 sprintf(name_tmp, "%s%i", "name_", num_devs);
808                 dev2 = rte_bbdev_get_named_dev(name_tmp);
809                 TEST_ASSERT_SUCCESS(rte_bbdev_release(dev2),
810                                 "Failed to uninitialize bbdev driver %s ",
811                                 name_tmp);
812                 num_devs--;
813         }
814
815         TEST_ASSERT(dev1->data->dev_id < RTE_BBDEV_MAX_DEVS,
816                         "Failed test rte_bbdev_allocate: "
817                         "invalid dev_id %" PRIu8 ", max number of devices %d ",
818                         dev1->data->dev_id, RTE_BBDEV_MAX_DEVS);
819
820         TEST_ASSERT(dev1->state == RTE_BBDEV_INITIALIZED,
821                         "Failed test rte_bbdev_allocate: "
822                         "invalid state %d (0 - RTE_BBDEV_UNUSED, 1 - RTE_BBDEV_INITIALIZED",
823                         dev1->state);
824
825         TEST_ASSERT_FAIL(rte_bbdev_release(NULL),
826                         "Failed to uninitialize bbdev driver with NULL bbdev");
827
828         sprintf(name_tmp, "%s", "invalid_name");
829         dev2 = rte_bbdev_get_named_dev(name_tmp);
830         TEST_ASSERT_FAIL(rte_bbdev_release(dev2),
831                         "Failed to uninitialize bbdev driver with invalid name");
832
833         dev2 = rte_bbdev_get_named_dev(name);
834         TEST_ASSERT_SUCCESS(rte_bbdev_release(dev2),
835                         "Failed to uninitialize bbdev driver: %s ", name);
836
837         return TEST_SUCCESS;
838 }
839
840 static void
841 event_callback(uint16_t dev_id, enum rte_bbdev_event_type type, void *param,
842                 void *ret_param)
843 {
844         RTE_SET_USED(dev_id);
845         RTE_SET_USED(ret_param);
846
847         if (param == NULL)
848                 return;
849
850         if (type == RTE_BBDEV_EVENT_UNKNOWN ||
851                         type == RTE_BBDEV_EVENT_ERROR ||
852                         type == RTE_BBDEV_EVENT_MAX)
853                 *(int *)param = type;
854 }
855
856 static int
857 test_bbdev_callback(void)
858 {
859         struct rte_bbdev *dev1, *dev2;
860         const char *name = "dev_name1";
861         const char *name2 = "dev_name2";
862         int event_status;
863         uint8_t invalid_dev_id = RTE_BBDEV_MAX_DEVS;
864         enum rte_bbdev_event_type invalid_event_type = RTE_BBDEV_EVENT_MAX;
865         uint8_t dev_id;
866
867         dev1 = rte_bbdev_allocate(name);
868         TEST_ASSERT(dev1 != NULL, "Failed to initialize bbdev driver");
869
870         /*
871          * RTE_BBDEV_EVENT_UNKNOWN - unregistered
872          * RTE_BBDEV_EVENT_ERROR - unregistered
873          */
874         event_status = -1;
875         rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL);
876         rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL);
877         TEST_ASSERT(event_status == -1,
878                         "Failed test for rte_bbdev_pmd_callback_process: "
879                         "events were not registered ");
880
881         TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev1->data->dev_id,
882                         RTE_BBDEV_EVENT_MAX, event_callback, NULL),
883                         "Failed to callback register for RTE_BBDEV_EVENT_MAX ");
884
885         TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev1->data->dev_id,
886                         RTE_BBDEV_EVENT_MAX, event_callback, NULL),
887                         "Failed to unregister RTE_BBDEV_EVENT_MAX ");
888
889         /*
890          * RTE_BBDEV_EVENT_UNKNOWN - registered
891          * RTE_BBDEV_EVENT_ERROR - unregistered
892          */
893         TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev1->data->dev_id,
894                         RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status),
895                         "Failed to callback rgstr for RTE_BBDEV_EVENT_UNKNOWN");
896
897         rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL);
898         TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN,
899                         "Failed test for rte_bbdev_pmd_callback_process "
900                         "for RTE_BBDEV_EVENT_UNKNOWN ");
901
902         rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL);
903         TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN,
904                         "Failed test for rte_bbdev_pmd_callback_process: "
905                         "event RTE_BBDEV_EVENT_ERROR was not registered ");
906
907         /*
908          * RTE_BBDEV_EVENT_UNKNOWN - registered
909          * RTE_BBDEV_EVENT_ERROR - registered
910          */
911         TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev1->data->dev_id,
912                         RTE_BBDEV_EVENT_ERROR, event_callback, &event_status),
913                         "Failed to callback rgstr for RTE_BBDEV_EVENT_ERROR ");
914
915         TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev1->data->dev_id,
916                         RTE_BBDEV_EVENT_ERROR, event_callback, &event_status),
917                         "Failed to callback register for RTE_BBDEV_EVENT_ERROR"
918                         "(re-registration) ");
919
920         event_status = -1;
921         rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL);
922         TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN,
923                         "Failed test for rte_bbdev_pmd_callback_process "
924                         "for RTE_BBDEV_EVENT_UNKNOWN ");
925
926         rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL);
927         TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_ERROR,
928                         "Failed test for rte_bbdev_pmd_callback_process "
929                         "for RTE_BBDEV_EVENT_ERROR ");
930
931         /*
932          * RTE_BBDEV_EVENT_UNKNOWN - registered
933          * RTE_BBDEV_EVENT_ERROR - unregistered
934          */
935         TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev1->data->dev_id,
936                         RTE_BBDEV_EVENT_ERROR, event_callback, &event_status),
937                         "Failed to unregister RTE_BBDEV_EVENT_ERROR ");
938
939         event_status = -1;
940         rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL);
941         TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN,
942                         "Failed test for rte_bbdev_pmd_callback_process "
943                         "for RTE_BBDEV_EVENT_UNKNOWN ");
944
945         rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL);
946         TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN,
947                         "Failed test for rte_bbdev_pmd_callback_process: "
948                         "event RTE_BBDEV_EVENT_ERROR was unregistered ");
949
950         /* rte_bbdev_callback_register with invalid inputs */
951         TEST_ASSERT_FAIL(rte_bbdev_callback_register(invalid_dev_id,
952                         RTE_BBDEV_EVENT_ERROR, event_callback, &event_status),
953                         "Failed test for rte_bbdev_callback_register "
954                         "for invalid_dev_id ");
955
956         TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev1->data->dev_id,
957                         invalid_event_type, event_callback, &event_status),
958                         "Failed to callback register for invalid event type ");
959
960         TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev1->data->dev_id,
961                         RTE_BBDEV_EVENT_ERROR, NULL, &event_status),
962                         "Failed to callback register - no callback function ");
963
964         /* The impact of devices on each other */
965         dev2 = rte_bbdev_allocate(name2);
966         TEST_ASSERT(dev2 != NULL,
967                         "Failed to initialize bbdev driver");
968
969         /*
970          * dev2:
971          * RTE_BBDEV_EVENT_UNKNOWN - unregistered
972          * RTE_BBDEV_EVENT_ERROR - unregistered
973          */
974         event_status = -1;
975         rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL);
976         rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_ERROR, NULL);
977         TEST_ASSERT(event_status == -1,
978                         "Failed test for rte_bbdev_pmd_callback_process: "
979                         "events were not registered ");
980
981         /*
982          * dev1: RTE_BBDEV_EVENT_ERROR - unregistered
983          * dev2: RTE_BBDEV_EVENT_ERROR - registered
984          */
985         TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev2->data->dev_id,
986                         RTE_BBDEV_EVENT_ERROR, event_callback, &event_status),
987                         "Failed to callback rgstr for RTE_BBDEV_EVENT_ERROR");
988
989         rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL);
990         TEST_ASSERT(event_status == -1,
991                 "Failed test for rte_bbdev_pmd_callback_process in dev1 "
992                 "for RTE_BBDEV_EVENT_ERROR ");
993
994         rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_ERROR, NULL);
995         TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_ERROR,
996                 "Failed test for rte_bbdev_pmd_callback_process in dev2 "
997                 "for RTE_BBDEV_EVENT_ERROR ");
998
999         /*
1000          * dev1: RTE_BBDEV_EVENT_UNKNOWN - registered
1001          * dev2: RTE_BBDEV_EVENT_UNKNOWN - unregistered
1002          */
1003         TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev2->data->dev_id,
1004                         RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status),
1005                         "Failed to callback register for RTE_BBDEV_EVENT_UNKNOWN "
1006                         "in dev 2 ");
1007
1008         rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL);
1009         TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN,
1010                         "Failed test for rte_bbdev_pmd_callback_process in dev2"
1011                         " for RTE_BBDEV_EVENT_UNKNOWN ");
1012
1013         TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev2->data->dev_id,
1014                         RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status),
1015                         "Failed to unregister RTE_BBDEV_EVENT_UNKNOWN ");
1016
1017         TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev2->data->dev_id,
1018                         RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status),
1019                         "Failed to unregister RTE_BBDEV_EVENT_UNKNOWN : "
1020                         "unregister function called once again ");
1021
1022         event_status = -1;
1023         rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL);
1024         TEST_ASSERT(event_status == -1,
1025                         "Failed test for rte_bbdev_pmd_callback_process in dev2"
1026                 " for RTE_BBDEV_EVENT_UNKNOWN ");
1027
1028         rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL);
1029         TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN,
1030                         "Failed test for rte_bbdev_pmd_callback_process in dev2 "
1031                         "for RTE_BBDEV_EVENT_UNKNOWN ");
1032
1033         /* rte_bbdev_pmd_callback_process with invalid inputs */
1034         rte_bbdev_pmd_callback_process(NULL, RTE_BBDEV_EVENT_UNKNOWN, NULL);
1035
1036         event_status = -1;
1037         rte_bbdev_pmd_callback_process(dev1, invalid_event_type, NULL);
1038         TEST_ASSERT(event_status == -1,
1039                         "Failed test for rte_bbdev_pmd_callback_process: "
1040                         "for invalid event type ");
1041
1042         /* rte_dev_callback_unregister with invalid inputs */
1043         TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(invalid_dev_id,
1044                         RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status),
1045                         "Failed test for rte_dev_callback_unregister "
1046                         "for invalid_dev_id ");
1047
1048         TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev1->data->dev_id,
1049                         invalid_event_type, event_callback, &event_status),
1050                         "Failed rte_dev_callback_unregister "
1051                         "for invalid event type ");
1052
1053         TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev1->data->dev_id,
1054                         invalid_event_type, NULL, &event_status),
1055                         "Failed rte_dev_callback_unregister "
1056                         "when no callback function ");
1057
1058         dev_id = dev1->data->dev_id;
1059
1060         rte_bbdev_release(dev1);
1061         rte_bbdev_release(dev2);
1062
1063         TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev_id,
1064                         RTE_BBDEV_EVENT_ERROR, event_callback, &event_status),
1065                         "Failed test for rte_bbdev_callback_register: "
1066                         "function called after rte_bbdev_driver_uninit .");
1067
1068         TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev_id,
1069                         RTE_BBDEV_EVENT_ERROR, event_callback, &event_status),
1070                         "Failed test for rte_dev_callback_unregister: "
1071                         "function called after rte_bbdev_driver_uninit. ");
1072
1073         event_status = -1;
1074         rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL);
1075         rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL);
1076         rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL);
1077         rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_ERROR, NULL);
1078         TEST_ASSERT(event_status == -1,
1079                         "Failed test for rte_bbdev_pmd_callback_process: "
1080                         "callback function was called after rte_bbdev_driver_uninit");
1081
1082         return TEST_SUCCESS;
1083 }
1084
1085 static int
1086 test_bbdev_invalid_driver(void)
1087 {
1088         struct rte_bbdev dev1, *dev2;
1089         uint8_t dev_id = null_dev_id;
1090         uint16_t queue_id = 0;
1091         struct rte_bbdev_stats stats;
1092         struct bbdev_testsuite_params *ts_params = &testsuite_params;
1093         struct rte_bbdev_queue_info qinfo;
1094         struct rte_bbdev_ops dev_ops_tmp;
1095
1096         TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id), "Failed to stop bbdev %u ",
1097                         dev_id);
1098
1099         dev1 = rte_bbdev_devices[dev_id];
1100         dev2 = &rte_bbdev_devices[dev_id];
1101
1102         /* Tests for rte_bbdev_setup_queues */
1103         dev2->dev_ops = NULL;
1104         TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 1, SOCKET_ID_ANY),
1105                         "Failed test for rte_bbdev_setup_queues: "
1106                         "NULL dev_ops structure ");
1107         dev2->dev_ops = dev1.dev_ops;
1108
1109         dev_ops_tmp = *dev2->dev_ops;
1110         dev_ops_tmp.info_get = NULL;
1111         dev2->dev_ops = &dev_ops_tmp;
1112         TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 1, SOCKET_ID_ANY),
1113                         "Failed test for rte_bbdev_setup_queues: "
1114                         "NULL info_get ");
1115         dev2->dev_ops = dev1.dev_ops;
1116
1117         dev_ops_tmp = *dev2->dev_ops;
1118         dev_ops_tmp.queue_release = NULL;
1119         dev2->dev_ops = &dev_ops_tmp;
1120         TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 1, SOCKET_ID_ANY),
1121                         "Failed test for rte_bbdev_setup_queues: "
1122                         "NULL queue_release ");
1123         dev2->dev_ops = dev1.dev_ops;
1124
1125         dev2->data->socket_id = SOCKET_ID_ANY;
1126         TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, 1,
1127                         SOCKET_ID_ANY), "Failed to configure bbdev %u", dev_id);
1128
1129         /* Test for rte_bbdev_queue_configure */
1130         dev2->dev_ops = NULL;
1131         TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
1132                         &ts_params->qconf),
1133                         "Failed to configure queue %u on device %u "
1134                         "with NULL dev_ops structure ", queue_id, dev_id);
1135         dev2->dev_ops = dev1.dev_ops;
1136
1137         dev_ops_tmp = *dev2->dev_ops;
1138         dev_ops_tmp.queue_setup = NULL;
1139         dev2->dev_ops = &dev_ops_tmp;
1140         TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
1141                         &ts_params->qconf),
1142                         "Failed to configure queue %u on device %u "
1143                         "with NULL queue_setup ", queue_id, dev_id);
1144         dev2->dev_ops = dev1.dev_ops;
1145
1146         dev_ops_tmp = *dev2->dev_ops;
1147         dev_ops_tmp.info_get = NULL;
1148         dev2->dev_ops = &dev_ops_tmp;
1149         TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
1150                         &ts_params->qconf),
1151                         "Failed to configure queue %u on device %u "
1152                         "with NULL info_get ", queue_id, dev_id);
1153         dev2->dev_ops = dev1.dev_ops;
1154
1155         TEST_ASSERT_FAIL(rte_bbdev_queue_configure(RTE_BBDEV_MAX_DEVS,
1156                         queue_id, &ts_params->qconf),
1157                         "Failed to configure queue %u on device %u ",
1158                         queue_id, dev_id);
1159
1160         TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id,
1161                         &ts_params->qconf),
1162                         "Failed to configure queue %u on device %u ",
1163                         queue_id, dev_id);
1164
1165         /* Test for rte_bbdev_queue_info_get */
1166         dev2->dev_ops = NULL;
1167         TEST_ASSERT_SUCCESS(rte_bbdev_queue_info_get(dev_id, queue_id, &qinfo),
1168                         "Failed test for rte_bbdev_info_get: "
1169                         "NULL dev_ops structure  ");
1170         dev2->dev_ops = dev1.dev_ops;
1171
1172         TEST_ASSERT_FAIL(rte_bbdev_queue_info_get(RTE_BBDEV_MAX_DEVS,
1173                         queue_id, &qinfo),
1174                         "Failed test for rte_bbdev_info_get: "
1175                         "invalid dev_id ");
1176
1177         TEST_ASSERT_FAIL(rte_bbdev_queue_info_get(dev_id,
1178                         RTE_MAX_QUEUES_PER_PORT, &qinfo),
1179                         "Failed test for rte_bbdev_info_get: "
1180                         "invalid queue_id ");
1181
1182         TEST_ASSERT_FAIL(rte_bbdev_queue_info_get(dev_id, queue_id, NULL),
1183                         "Failed test for rte_bbdev_info_get: "
1184                         "invalid dev_info ");
1185
1186         /* Test for rte_bbdev_start */
1187         dev2->dev_ops = NULL;
1188         TEST_ASSERT_FAIL(rte_bbdev_start(dev_id),
1189                         "Failed to start bbdev %u "
1190                         "with NULL dev_ops structure ", dev_id);
1191         dev2->dev_ops = dev1.dev_ops;
1192
1193         TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id),
1194                         "Failed to start bbdev %u ", dev_id);
1195
1196         /* Test for rte_bbdev_queue_start */
1197         dev2->dev_ops = NULL;
1198         TEST_ASSERT_FAIL(rte_bbdev_queue_start(dev_id, queue_id),
1199                         "Failed to start queue %u on device %u: "
1200                         "NULL dev_ops structure", queue_id, dev_id);
1201         dev2->dev_ops = dev1.dev_ops;
1202
1203         TEST_ASSERT_SUCCESS(rte_bbdev_queue_start(dev_id, queue_id),
1204                         "Failed to start queue %u on device %u ", queue_id,
1205                         dev_id);
1206
1207         /* Tests for rte_bbdev_stats_get */
1208         dev2->dev_ops = NULL;
1209         TEST_ASSERT_FAIL(rte_bbdev_stats_get(dev_id, &stats),
1210                         "Failed test for rte_bbdev_stats_get on device %u ",
1211                         dev_id);
1212         dev2->dev_ops = dev1.dev_ops;
1213
1214         dev_ops_tmp = *dev2->dev_ops;
1215         dev_ops_tmp.stats_reset = NULL;
1216         dev2->dev_ops = &dev_ops_tmp;
1217         TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats),
1218                         "Failed test for rte_bbdev_stats_get: "
1219                         "NULL stats_get ");
1220         dev2->dev_ops = dev1.dev_ops;
1221
1222         TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats),
1223                         "Failed test for rte_bbdev_stats_get on device %u ",
1224                         dev_id);
1225
1226         /*
1227          * Tests for:
1228          * rte_bbdev_callback_register,
1229          * rte_bbdev_pmd_callback_process,
1230          * rte_dev_callback_unregister
1231          */
1232         dev2->dev_ops = NULL;
1233         TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev_id,
1234                         RTE_BBDEV_EVENT_UNKNOWN, event_callback, NULL),
1235                         "Failed to callback rgstr for RTE_BBDEV_EVENT_UNKNOWN");
1236         rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL);
1237
1238         TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev_id,
1239                         RTE_BBDEV_EVENT_UNKNOWN, event_callback, NULL),
1240                         "Failed to unregister RTE_BBDEV_EVENT_ERROR ");
1241         dev2->dev_ops = dev1.dev_ops;
1242
1243         /* Tests for rte_bbdev_stats_reset */
1244         dev2->dev_ops = NULL;
1245         TEST_ASSERT_FAIL(rte_bbdev_stats_reset(dev_id),
1246                         "Failed to reset statistic for device %u ", dev_id);
1247         dev2->dev_ops = dev1.dev_ops;
1248
1249         dev_ops_tmp = *dev2->dev_ops;
1250         dev_ops_tmp.stats_reset = NULL;
1251         dev2->dev_ops = &dev_ops_tmp;
1252         TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id),
1253                         "Failed test for rte_bbdev_stats_reset: "
1254                         "NULL stats_reset ");
1255         dev2->dev_ops = dev1.dev_ops;
1256
1257         TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id),
1258                         "Failed to reset statistic for device %u ", dev_id);
1259
1260         /* Tests for rte_bbdev_queue_stop */
1261         dev2->dev_ops = NULL;
1262         TEST_ASSERT_FAIL(rte_bbdev_queue_stop(dev_id, queue_id),
1263                         "Failed to stop queue %u on device %u: "
1264                         "NULL dev_ops structure", queue_id, dev_id);
1265         dev2->dev_ops = dev1.dev_ops;
1266
1267         TEST_ASSERT_SUCCESS(rte_bbdev_queue_stop(dev_id, queue_id),
1268                         "Failed to stop queue %u on device %u ", queue_id,
1269                         dev_id);
1270
1271         /* Tests for rte_bbdev_stop */
1272         dev2->dev_ops = NULL;
1273         TEST_ASSERT_FAIL(rte_bbdev_stop(dev_id),
1274                         "Failed to stop bbdev %u with NULL dev_ops structure ",
1275                         dev_id);
1276         dev2->dev_ops = dev1.dev_ops;
1277
1278         TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id),
1279                         "Failed to stop bbdev %u ", dev_id);
1280
1281         /* Tests for rte_bbdev_close */
1282         TEST_ASSERT_FAIL(rte_bbdev_close(RTE_BBDEV_MAX_DEVS),
1283                         "Failed to close bbdev with invalid dev_id");
1284
1285         dev2->dev_ops = NULL;
1286         TEST_ASSERT_FAIL(rte_bbdev_close(dev_id),
1287                         "Failed to close bbdev %u with NULL dev_ops structure ",
1288                         dev_id);
1289         dev2->dev_ops = dev1.dev_ops;
1290
1291         TEST_ASSERT_SUCCESS(rte_bbdev_close(dev_id),
1292                         "Failed to close bbdev %u ", dev_id);
1293
1294         return TEST_SUCCESS;
1295 }
1296
1297 static int
1298 test_bbdev_get_named_dev(void)
1299 {
1300         struct rte_bbdev *dev, *dev_tmp;
1301         const char *name = "name";
1302
1303         dev = rte_bbdev_allocate(name);
1304         TEST_ASSERT(dev != NULL, "Failed to initialize bbdev driver");
1305
1306         dev_tmp = rte_bbdev_get_named_dev(NULL);
1307         TEST_ASSERT(dev_tmp == NULL, "Failed test for rte_bbdev_get_named_dev: "
1308                         "function called with NULL parameter");
1309
1310         dev_tmp = rte_bbdev_get_named_dev(name);
1311
1312         TEST_ASSERT(dev == dev_tmp, "Failed test for rte_bbdev_get_named_dev: "
1313                         "wrong device was returned ");
1314
1315         TEST_ASSERT_SUCCESS(rte_bbdev_release(dev),
1316                         "Failed to uninitialize bbdev driver %s ", name);
1317
1318         return TEST_SUCCESS;
1319 }
1320
1321 static struct unit_test_suite bbdev_null_testsuite = {
1322         .suite_name = "BBDEV NULL Unit Test Suite",
1323         .setup = testsuite_setup,
1324         .teardown = testsuite_teardown,
1325         .unit_test_cases = {
1326
1327                 TEST_CASE(test_bbdev_configure_invalid_dev_id),
1328
1329                 TEST_CASE_ST(ut_setup, ut_teardown,
1330                                 test_bbdev_configure_invalid_num_queues),
1331
1332                 TEST_CASE_ST(ut_setup, ut_teardown,
1333                                 test_bbdev_configure_stop_device),
1334
1335                 TEST_CASE_ST(ut_setup, ut_teardown,
1336                                 test_bbdev_configure_stop_queue),
1337
1338                 TEST_CASE_ST(ut_setup, ut_teardown,
1339                                 test_bbdev_configure_invalid_queue_configure),
1340
1341                 TEST_CASE_ST(ut_setup, ut_teardown,
1342                                 test_bbdev_op_pool),
1343
1344                 TEST_CASE_ST(ut_setup, ut_teardown,
1345                                 test_bbdev_op_type),
1346
1347                 TEST_CASE_ST(ut_setup, ut_teardown,
1348                                 test_bbdev_op_pool_size),
1349
1350                 TEST_CASE_ST(ut_setup, ut_teardown,
1351                                 test_bbdev_stats),
1352
1353                 TEST_CASE_ST(ut_setup, ut_teardown,
1354                                 test_bbdev_driver_init),
1355
1356                 TEST_CASE_ST(ut_setup, ut_teardown,
1357                                 test_bbdev_callback),
1358
1359                 TEST_CASE_ST(ut_setup, ut_teardown,
1360                                 test_bbdev_invalid_driver),
1361
1362                 TEST_CASE_ST(ut_setup, ut_teardown,
1363                                 test_bbdev_get_named_dev),
1364
1365                 TEST_CASE(test_bbdev_count),
1366
1367                 TEST_CASES_END() /**< NULL terminate unit test array */
1368         }
1369 };
1370
1371 REGISTER_TEST_COMMAND(unittest, bbdev_null_testsuite);