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