xref: /dpdk/app/test-bbdev/test_bbdev.c (revision e977e4199a8d6bab72cf94e154adcad1fb964e5e)
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);
1372