f-stack/dpdk/app/test-bbdev/test_bbdev.c

1372 lines
42 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2017 Intel Corporation
*/
#include <rte_common.h>
#include <rte_hexdump.h>
#include <rte_mbuf.h>
#include <rte_malloc.h>
#include <rte_memcpy.h>
#include <rte_cycles.h>
#include <rte_bus_vdev.h>
#include <rte_bbdev.h>
#include <rte_bbdev_op.h>
#include <rte_bbdev_pmd.h>
#include "main.h"
#define BBDEV_NAME_NULL ("bbdev_null")
struct bbdev_testsuite_params {
struct rte_bbdev_queue_conf qconf;
};
static struct bbdev_testsuite_params testsuite_params;
static uint8_t null_dev_id;
static int
testsuite_setup(void)
{
uint8_t nb_devs;
int ret;
char buf[RTE_BBDEV_NAME_MAX_LEN];
/* Create test device */
snprintf(buf, sizeof(buf), "%s_unittest", BBDEV_NAME_NULL);
ret = rte_vdev_init(buf, NULL);
TEST_ASSERT(ret == 0, "Failed to create instance of pmd: %s", buf);
nb_devs = rte_bbdev_count();
TEST_ASSERT(nb_devs != 0, "No devices found");
/* Most recently created device is our device */
null_dev_id = nb_devs - 1;
return TEST_SUCCESS;
}
static void
testsuite_teardown(void)
{
char buf[RTE_BBDEV_NAME_MAX_LEN];
snprintf(buf, sizeof(buf), "%s_unittest", BBDEV_NAME_NULL);
rte_vdev_uninit(buf);
}
static int
ut_setup(void)
{
struct bbdev_testsuite_params *ts_params = &testsuite_params;
uint8_t num_queues;
/* Valid queue configuration */
ts_params->qconf.priority = 0;
ts_params->qconf.socket = SOCKET_ID_ANY;
ts_params->qconf.deferred_start = 1;
num_queues = 1;
TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(null_dev_id, num_queues,
SOCKET_ID_ANY), "Failed to setup queues for bbdev %u",
0);
/* Start the device */
TEST_ASSERT_SUCCESS(rte_bbdev_start(null_dev_id),
"Failed to start bbdev %u", 0);
return TEST_SUCCESS;
}
static void
ut_teardown(void)
{
rte_bbdev_close(null_dev_id);
}
static int
test_bbdev_configure_invalid_dev_id(void)
{
uint8_t dev_id;
uint8_t num_queues;
num_queues = 1;
for (dev_id = 0; dev_id < RTE_BBDEV_MAX_DEVS; dev_id++) {
if (!rte_bbdev_is_valid(dev_id)) {
TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id,
num_queues, SOCKET_ID_ANY),
"Failed test for rte_bbdev_setup_queues: "
"invalid dev_num %u", dev_id);
TEST_ASSERT(rte_bbdev_intr_enable(dev_id) == -ENODEV,
"Failed test for rte_bbdev_intr_enable: "
"invalid dev_num %u", dev_id);
break;
}
}
return TEST_SUCCESS;
}
static int
test_bbdev_configure_invalid_num_queues(void)
{
struct rte_bbdev_info info;
uint8_t dev_id, num_devs;
uint8_t num_queues;
int return_value;
TEST_ASSERT((num_devs = rte_bbdev_count()) >= 1,
"Need at least %d devices for test", 1);
/* valid num_queues values */
num_queues = 8;
/* valid dev_id values */
dev_id = null_dev_id;
/* Stop the device in case it's started so it can be configured */
rte_bbdev_stop(dev_id);
TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 0, SOCKET_ID_ANY),
"Failed test for rte_bbdev_setup_queues: "
"invalid num_queues %d", 0);
TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, num_queues,
SOCKET_ID_ANY),
"Failed test for rte_bbdev_setup_queues: "
"invalid dev_num %u", dev_id);
TEST_ASSERT_FAIL(return_value = rte_bbdev_info_get(dev_id, NULL),
"Failed test for rte_bbdev_info_get: "
"returned value:%i", return_value);
TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info),
"Failed test for rte_bbdev_info_get: "
"invalid return value:%i", return_value);
TEST_ASSERT(info.num_queues == num_queues,
"Failed test for rte_bbdev_info_get: "
"invalid num_queues:%u", info.num_queues);
num_queues = info.drv.max_num_queues;
TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, num_queues,
SOCKET_ID_ANY),
"Failed test for rte_bbdev_setup_queues: "
"invalid num_queues: %u", num_queues);
num_queues++;
TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, num_queues,
SOCKET_ID_ANY),
"Failed test for rte_bbdev_setup_queues: "
"invalid num_queues: %u", num_queues);
return TEST_SUCCESS;
}
static int
test_bbdev_configure_stop_device(void)
{
struct rte_bbdev_info info;
uint8_t dev_id;
int return_value;
/* valid dev_id values */
dev_id = null_dev_id;
/* Stop the device so it can be configured */
rte_bbdev_stop(dev_id);
TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info),
"Failed test for rte_bbdev_info_get: "
"invalid return value from "
"rte_bbdev_info_get function: %i", return_value);
TEST_ASSERT_SUCCESS(info.started, "Failed test for rte_bbdev_info_get: "
"started value: %u", info.started);
TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id,
info.drv.max_num_queues, SOCKET_ID_ANY),
"Failed test for rte_bbdev_setup_queues: "
"device should be stopped, dev_id: %u", dev_id);
return_value = rte_bbdev_intr_enable(dev_id);
TEST_ASSERT(return_value != -EBUSY,
"Failed test for rte_bbdev_intr_enable: device should be stopped, dev_id: %u",
dev_id);
/* Start the device so it cannot be configured */
TEST_ASSERT_FAIL(rte_bbdev_start(RTE_BBDEV_MAX_DEVS),
"Failed to start bbdev %u", dev_id);
TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id),
"Failed to start bbdev %u", dev_id);
TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info),
"Failed test for rte_bbdev_info_get: "
"invalid return value from "
"rte_bbdev_info_get function: %i", return_value);
TEST_ASSERT_FAIL(info.started, "Failed test for rte_bbdev_info_get: "
"started value: %u", info.started);
TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id,
info.drv.max_num_queues, SOCKET_ID_ANY),
"Failed test for rte_bbdev_setup_queues: "
"device should be started, dev_id: %u", dev_id);
return_value = rte_bbdev_intr_enable(dev_id);
TEST_ASSERT(return_value == -EBUSY,
"Failed test for rte_bbdev_intr_enable: device should be started, dev_id: %u",
dev_id);
/* Stop again the device so it can be once again configured */
TEST_ASSERT_FAIL(rte_bbdev_stop(RTE_BBDEV_MAX_DEVS),
"Failed to start bbdev %u", dev_id);
TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id), "Failed to stop bbdev %u",
dev_id);
TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info),
"Failed test for rte_bbdev_info_get: "
"invalid return value from "
"rte_bbdev_info_get function: %i", return_value);
TEST_ASSERT_SUCCESS(info.started, "Failed test for rte_bbdev_info_get: "
"started value: %u", info.started);
TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id,
info.drv.max_num_queues, SOCKET_ID_ANY),
"Failed test for rte_bbdev_setup_queues: "
"device should be stopped, dev_id: %u", dev_id);
return_value = rte_bbdev_intr_enable(dev_id);
TEST_ASSERT(return_value != -EBUSY,
"Failed test for rte_bbdev_intr_enable: device should be stopped, dev_id: %u",
dev_id);
return TEST_SUCCESS;
}
static int
test_bbdev_configure_stop_queue(void)
{
struct bbdev_testsuite_params *ts_params = &testsuite_params;
struct rte_bbdev_info info;
struct rte_bbdev_queue_info qinfo;
uint8_t dev_id;
uint16_t queue_id;
int return_value;
/* Valid dev_id values */
dev_id = null_dev_id;
/* Valid queue_id values */
queue_id = 0;
rte_bbdev_stop(dev_id);
TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info),
"Failed test for rte_bbdev_info_get: "
"invalid return value:%i", return_value);
/* Valid queue configuration */
ts_params->qconf.queue_size = info.drv.queue_size_lim;
ts_params->qconf.priority = info.drv.max_ul_queue_priority;
/* Device - started; queue - started */
rte_bbdev_start(dev_id);
TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
&ts_params->qconf),
"Failed test for rte_bbdev_queue_configure: "
"queue:%u on device:%u should be stopped",
queue_id, dev_id);
/* Device - stopped; queue - started */
rte_bbdev_stop(dev_id);
TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
&ts_params->qconf),
"Failed test for rte_bbdev_queue_configure: "
"queue:%u on device:%u should be stopped",
queue_id, dev_id);
TEST_ASSERT_FAIL(rte_bbdev_queue_stop(RTE_BBDEV_MAX_DEVS, queue_id),
"Failed test for rte_bbdev_queue_stop "
"invalid dev_id ");
TEST_ASSERT_FAIL(rte_bbdev_queue_stop(dev_id, RTE_MAX_QUEUES_PER_PORT),
"Failed test for rte_bbdev_queue_stop "
"invalid queue_id ");
/* Device - stopped; queue - stopped */
rte_bbdev_queue_stop(dev_id, queue_id);
TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id,
&ts_params->qconf),
"Failed test for rte_bbdev_queue_configure: "
"queue:%u on device:%u should be stopped", queue_id,
dev_id);
TEST_ASSERT_SUCCESS(return_value = rte_bbdev_queue_info_get(dev_id,
queue_id, &qinfo),
"Failed test for rte_bbdev_info_get: "
"invalid return value from "
"rte_bbdev_queue_info_get function: %i", return_value);
TEST_ASSERT(qinfo.conf.socket == ts_params->qconf.socket,
"Failed test for rte_bbdev_queue_info_get: "
"invalid queue_size:%u", qinfo.conf.socket);
TEST_ASSERT(qinfo.conf.queue_size == ts_params->qconf.queue_size,
"Failed test for rte_bbdev_queue_info_get: "
"invalid queue_size:%u", qinfo.conf.queue_size);
TEST_ASSERT(qinfo.conf.priority == ts_params->qconf.priority,
"Failed test for rte_bbdev_queue_info_get: "
"invalid queue_size:%u", qinfo.conf.priority);
TEST_ASSERT(qinfo.conf.deferred_start ==
ts_params->qconf.deferred_start,
"Failed test for rte_bbdev_queue_info_get: "
"invalid queue_size:%u", qinfo.conf.deferred_start);
/* Device - started; queue - stopped */
rte_bbdev_start(dev_id);
rte_bbdev_queue_stop(dev_id, queue_id);
TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
&ts_params->qconf),
"Failed test for rte_bbdev_queue_configure: "
"queue:%u on device:%u should be stopped", queue_id,
dev_id);
rte_bbdev_stop(dev_id);
/* After rte_bbdev_start(dev_id):
* - queue should be still stopped if deferred_start ==
*/
rte_bbdev_start(dev_id);
TEST_ASSERT_SUCCESS(return_value = rte_bbdev_queue_info_get(dev_id,
queue_id, &qinfo),
"Failed test for rte_bbdev_info_get: "
"invalid return value from "
"rte_bbdev_queue_info_get function: %i", return_value);
TEST_ASSERT(qinfo.started == 0,
"Failed test for rte_bbdev_queue_info_get: "
"invalid value for qinfo.started:%u", qinfo.started);
rte_bbdev_stop(dev_id);
/* After rte_bbdev_start(dev_id):
* - queue should be started if deferred_start ==
*/
ts_params->qconf.deferred_start = 0;
rte_bbdev_queue_configure(dev_id, queue_id, &ts_params->qconf);
rte_bbdev_start(dev_id);
TEST_ASSERT_SUCCESS(return_value = rte_bbdev_queue_info_get(dev_id,
queue_id, &qinfo),
"Failed test for rte_bbdev_info_get: "
"invalid return value from "
"rte_bbdev_queue_info_get function: %i", return_value);
TEST_ASSERT(qinfo.started == 1,
"Failed test for rte_bbdev_queue_info_get: "
"invalid value for qinfo.started:%u", qinfo.started);
return TEST_SUCCESS;
}
static int
test_bbdev_configure_invalid_queue_configure(void)
{
struct bbdev_testsuite_params *ts_params = &testsuite_params;
int return_value;
struct rte_bbdev_info info;
uint8_t dev_id;
uint16_t queue_id;
/* Valid dev_id values */
dev_id = null_dev_id;
/* Valid queue_id values */
queue_id = 0;
rte_bbdev_stop(dev_id);
TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info),
"Failed test for rte_bbdev_info_get: "
"invalid return value:%i", return_value);
rte_bbdev_queue_stop(dev_id, queue_id);
ts_params->qconf.queue_size = info.drv.queue_size_lim + 1;
TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
&ts_params->qconf),
"Failed test for rte_bbdev_queue_configure: "
"invalid value qconf.queue_size: %u",
ts_params->qconf.queue_size);
ts_params->qconf.queue_size = info.drv.queue_size_lim;
ts_params->qconf.priority = info.drv.max_ul_queue_priority;
queue_id = info.num_queues;
TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
&ts_params->qconf),
"Failed test for rte_bbdev_queue_configure: "
"invalid value queue_id: %u", queue_id);
queue_id = 0;
TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, NULL),
"Failed test for rte_bbdev_queue_configure: "
"NULL qconf structure ");
ts_params->qconf.socket = RTE_MAX_NUMA_NODES;
TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
&ts_params->qconf),
"Failed test for rte_bbdev_queue_configure: "
"invalid socket number ");
ts_params->qconf.socket = SOCKET_ID_ANY;
TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id,
&ts_params->qconf),
"Failed test for rte_bbdev_queue_configure: "
"invalid value qconf.queue_size: %u",
ts_params->qconf.queue_size);
TEST_ASSERT_FAIL(rte_bbdev_queue_configure(RTE_BBDEV_MAX_DEVS, queue_id,
&ts_params->qconf),
"Failed test for rte_bbdev_queue_configure: "
"invalid dev_id");
TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, NULL),
"Failed test for rte_bbdev_queue_configure: "
"invalid value qconf.queue_size: %u",
ts_params->qconf.queue_size);
return TEST_SUCCESS;
}
static int
test_bbdev_op_pool(void)
{
struct rte_mempool *mp;
unsigned int dec_size = sizeof(struct rte_bbdev_dec_op);
unsigned int enc_size = sizeof(struct rte_bbdev_enc_op);
const char *pool_dec = "Test_DEC";
const char *pool_enc = "Test_ENC";
/* Valid pool configuration */
uint32_t size = 256;
uint32_t cache_size = 128;
TEST_ASSERT(rte_bbdev_op_pool_create(NULL,
RTE_BBDEV_OP_TURBO_DEC, size, cache_size, 0) == NULL,
"Failed test for rte_bbdev_op_pool_create: "
"NULL name parameter");
TEST_ASSERT((mp = rte_bbdev_op_pool_create(pool_dec,
RTE_BBDEV_OP_TURBO_DEC, size, cache_size, 0)) != NULL,
"Failed test for rte_bbdev_op_pool_create: "
"returned value is empty");
TEST_ASSERT(mp->size == size,
"Failed test for rte_bbdev_op_pool_create: "
"invalid size of the mempool, mp->size: %u", mp->size);
TEST_ASSERT(mp->cache_size == cache_size,
"Failed test for rte_bbdev_op_pool_create: "
"invalid size of the mempool, mp->size: %u",
mp->cache_size);
TEST_ASSERT_SUCCESS(strcmp(mp->name, pool_dec),
"Failed test for rte_bbdev_op_pool_create: "
"invalid name of mempool, mp->name: %s", mp->name);
TEST_ASSERT(mp->elt_size == dec_size,
"Failed test for rte_bbdev_op_pool_create: "
"invalid element size for RTE_BBDEV_OP_TURBO_DEC, "
"mp->elt_size: %u", mp->elt_size);
rte_mempool_free(mp);
TEST_ASSERT((mp = rte_bbdev_op_pool_create(pool_enc,
RTE_BBDEV_OP_TURBO_ENC, size, cache_size, 0)) != NULL,
"Failed test for rte_bbdev_op_pool_create: "
"returned value is empty");
TEST_ASSERT(mp->elt_size == enc_size,
"Failed test for rte_bbdev_op_pool_create: "
"invalid element size for RTE_BBDEV_OP_TURBO_ENC, "
"mp->elt_size: %u", mp->elt_size);
rte_mempool_free(mp);
TEST_ASSERT((mp = rte_bbdev_op_pool_create("Test_NONE",
RTE_BBDEV_OP_NONE, size, cache_size, 0)) != NULL,
"Failed test for rte_bbdev_op_pool_create: "
"returned value is empty for RTE_BBDEV_OP_NONE");
TEST_ASSERT(mp->elt_size == (enc_size > dec_size ? enc_size : dec_size),
"Failed test for rte_bbdev_op_pool_create: "
"invalid size for RTE_BBDEV_OP_NONE, mp->elt_size: %u",
mp->elt_size);
rte_mempool_free(mp);
TEST_ASSERT((mp = rte_bbdev_op_pool_create("Test_INV",
RTE_BBDEV_OP_TYPE_COUNT, size, cache_size, 0)) == NULL,
"Failed test for rte_bbdev_op_pool_create: "
"returned value is not NULL for invalid type");
/* Invalid pool configuration */
size = 128;
cache_size = 256;
TEST_ASSERT((mp = rte_bbdev_op_pool_create("Test_InvSize",
RTE_BBDEV_OP_NONE, size, cache_size, 0)) == NULL,
"Failed test for rte_bbdev_op_pool_create: "
"returned value should be empty "
"because size of per-lcore local cache "
"is greater than size of the mempool.");
return TEST_SUCCESS;
}
/**
* Create pool of OP types RTE_BBDEV_OP_NONE, RTE_BBDEV_OP_TURBO_DEC and
* RTE_BBDEV_OP_TURBO_ENC and check that only ops of that type can be
* allocated
*/
static int
test_bbdev_op_type(void)
{
struct rte_mempool *mp_dec;
const unsigned int OPS_COUNT = 32;
struct rte_bbdev_dec_op *dec_ops_arr[OPS_COUNT];
struct rte_bbdev_enc_op *enc_ops_arr[OPS_COUNT];
const char *pool_dec = "Test_op_dec";
/* Valid pool configuration */
uint32_t num_elements = 256;
uint32_t cache_size = 128;
/* mempool type : RTE_BBDEV_OP_TURBO_DEC */
mp_dec = rte_bbdev_op_pool_create(pool_dec,
RTE_BBDEV_OP_TURBO_DEC, num_elements, cache_size, 0);
TEST_ASSERT(mp_dec != NULL, "Failed to create %s mempool", pool_dec);
TEST_ASSERT(rte_bbdev_dec_op_alloc_bulk(mp_dec, dec_ops_arr, 1) == 0,
"Failed test for rte_bbdev_op_alloc_bulk TURBO_DEC: "
"OPs type: RTE_BBDEV_OP_TURBO_DEC");
TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_dec, enc_ops_arr, 1) != 0,
"Failed test for rte_bbdev_op_alloc_bulk TURBO_DEC: "
"OPs type: RTE_BBDEV_OP_TURBO_ENC");
rte_mempool_free(mp_dec);
return TEST_SUCCESS;
}
static int
test_bbdev_op_pool_size(void)
{
struct rte_mempool *mp_none;
const unsigned int OPS_COUNT = 128;
struct rte_bbdev_enc_op *ops_enc_arr[OPS_COUNT];
struct rte_bbdev_enc_op *ops_ext_arr[OPS_COUNT];
struct rte_bbdev_enc_op *ops_ext2_arr[OPS_COUNT];
const char *pool_none = "Test_pool_size";
/* Valid pool configuration */
uint32_t num_elements = 256;
uint32_t cache_size = 0;
/* Create mempool type : RTE_BBDEV_OP_TURBO_ENC, size : 256 */
mp_none = rte_bbdev_op_pool_create(pool_none, RTE_BBDEV_OP_TURBO_ENC,
num_elements, cache_size, 0);
TEST_ASSERT(mp_none != NULL, "Failed to create %s mempool", pool_none);
/* Add 128 RTE_BBDEV_OP_TURBO_ENC ops */
rte_bbdev_enc_op_alloc_bulk(mp_none, ops_enc_arr, OPS_COUNT);
/* Add 128 RTE_BBDEV_OP_TURBO_ENC ops */
TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_none, ops_ext_arr,
OPS_COUNT) == 0,
"Failed test for allocating bbdev ops: "
"Mempool size: 256, Free : 128, Attempted to add: 128");
/* Try adding 128 more RTE_BBDEV_OP_TURBO_ENC ops, this should fail */
TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_none, ops_ext2_arr,
OPS_COUNT) != 0,
"Failed test for allocating bbdev ops: "
"Mempool size: 256, Free : 0, Attempted to add: 128");
/* Free-up 128 RTE_BBDEV_OP_TURBO_ENC ops */
rte_bbdev_enc_op_free_bulk(ops_enc_arr, OPS_COUNT);
/* Try adding 128 RTE_BBDEV_OP_TURBO_DEC ops, this should succeed */
/* Cache size > 0 causes reallocation of ops size > 127 fail */
TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_none, ops_ext2_arr,
OPS_COUNT) == 0,
"Failed test for allocating ops after mempool freed: "
"Mempool size: 256, Free : 128, Attempted to add: 128");
rte_mempool_free(mp_none);
return TEST_SUCCESS;
}
static int
test_bbdev_count(void)
{
uint8_t num_devs, num_valid_devs = 0;
for (num_devs = 0; num_devs < RTE_BBDEV_MAX_DEVS; num_devs++) {
if (rte_bbdev_is_valid(num_devs))
num_valid_devs++;
}
num_devs = rte_bbdev_count();
TEST_ASSERT(num_valid_devs == num_devs,
"Failed test for rte_bbdev_is_valid: "
"invalid num_devs %u ", num_devs);
return TEST_SUCCESS;
}
static int
test_bbdev_stats(void)
{
uint8_t dev_id = null_dev_id;
uint16_t queue_id = 0;
struct rte_bbdev_dec_op *dec_ops[4096] = { 0 };
struct rte_bbdev_dec_op *dec_proc_ops[4096] = { 0 };
struct rte_bbdev_enc_op *enc_ops[4096] = { 0 };
struct rte_bbdev_enc_op *enc_proc_ops[4096] = { 0 };
uint16_t num_ops = 236;
struct rte_bbdev_stats stats;
struct bbdev_testsuite_params *ts_params = &testsuite_params;
TEST_ASSERT_SUCCESS(rte_bbdev_queue_stop(dev_id, queue_id),
"Failed to stop queue %u on device %u ", queue_id,
dev_id);
TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id),
"Failed to stop bbdev %u ", dev_id);
TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id,
&ts_params->qconf),
"Failed to configure queue %u on device %u ",
queue_id, dev_id);
TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id),
"Failed to start bbdev %u ", dev_id);
TEST_ASSERT_SUCCESS(rte_bbdev_queue_start(dev_id, queue_id),
"Failed to start queue %u on device %u ", queue_id,
dev_id);
TEST_ASSERT_SUCCESS(rte_bbdev_queue_start(dev_id, queue_id),
"Failed to start queue %u on device %u ", queue_id,
dev_id);
/* Tests after enqueue operation */
rte_bbdev_enqueue_enc_ops(dev_id, queue_id, enc_ops, num_ops);
rte_bbdev_enqueue_dec_ops(dev_id, queue_id, dec_ops, num_ops);
TEST_ASSERT_FAIL(rte_bbdev_stats_get(RTE_BBDEV_MAX_DEVS, &stats),
"Failed test for rte_bbdev_stats_get on device %u ",
dev_id);
TEST_ASSERT_FAIL(rte_bbdev_stats_get(dev_id, NULL),
"Failed test for rte_bbdev_stats_get on device %u ",
dev_id);
TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats),
"Failed test for rte_bbdev_stats_get on device %u ",
dev_id);
TEST_ASSERT(stats.enqueued_count == 2 * num_ops,
"Failed test for rte_bbdev_enqueue_ops: "
"invalid enqueued_count %" PRIu64 " ",
stats.enqueued_count);
TEST_ASSERT(stats.dequeued_count == 0,
"Failed test for rte_bbdev_stats_reset: "
"invalid dequeued_count %" PRIu64 " ",
stats.dequeued_count);
/* Tests after dequeue operation */
rte_bbdev_dequeue_enc_ops(dev_id, queue_id, enc_proc_ops, num_ops);
rte_bbdev_dequeue_dec_ops(dev_id, queue_id, dec_proc_ops, num_ops);
TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats),
"Failed test for rte_bbdev_stats_get on device %u ",
dev_id);
TEST_ASSERT(stats.dequeued_count == 2 * num_ops,
"Failed test for rte_bbdev_dequeue_ops: "
"invalid enqueued_count %" PRIu64 " ",
stats.dequeued_count);
TEST_ASSERT(stats.enqueue_err_count == 0,
"Failed test for rte_bbdev_stats_reset: "
"invalid enqueue_err_count %" PRIu64 " ",
stats.enqueue_err_count);
TEST_ASSERT(stats.dequeue_err_count == 0,
"Failed test for rte_bbdev_stats_reset: "
"invalid dequeue_err_count %" PRIu64 " ",
stats.dequeue_err_count);
/* Tests after reset operation */
TEST_ASSERT_FAIL(rte_bbdev_stats_reset(RTE_BBDEV_MAX_DEVS),
"Failed to reset statistic for device %u ", dev_id);
TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id),
"Failed to reset statistic for device %u ", dev_id);
TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats),
"Failed test for rte_bbdev_stats_get on device %u ",
dev_id);
TEST_ASSERT(stats.enqueued_count == 0,
"Failed test for rte_bbdev_stats_reset: "
"invalid enqueued_count %" PRIu64 " ",
stats.enqueued_count);
TEST_ASSERT(stats.dequeued_count == 0,
"Failed test for rte_bbdev_stats_reset: "
"invalid dequeued_count %" PRIu64 " ",
stats.dequeued_count);
TEST_ASSERT(stats.enqueue_err_count == 0,
"Failed test for rte_bbdev_stats_reset: "
"invalid enqueue_err_count %" PRIu64 " ",
stats.enqueue_err_count);
TEST_ASSERT(stats.dequeue_err_count == 0,
"Failed test for rte_bbdev_stats_reset: "
"invalid dequeue_err_count %" PRIu64 " ",
stats.dequeue_err_count);
return TEST_SUCCESS;
}
static int
test_bbdev_driver_init(void)
{
struct rte_bbdev *dev1, *dev2;
const char *name = "dev_name";
char name_tmp[16];
int num_devs, num_devs_tmp;
dev1 = rte_bbdev_allocate(NULL);
TEST_ASSERT(dev1 == NULL,
"Failed initialize bbdev driver with NULL name");
dev1 = rte_bbdev_allocate(name);
TEST_ASSERT(dev1 != NULL, "Failed to initialize bbdev driver");
dev2 = rte_bbdev_allocate(name);
TEST_ASSERT(dev2 == NULL,
"Failed to initialize bbdev driver: "
"driver with the same name has been initialized before");
num_devs = rte_bbdev_count() - 1;
num_devs_tmp = num_devs;
/* Initialize the maximum amount of devices */
do {
sprintf(name_tmp, "%s%i", "name_", num_devs);
dev2 = rte_bbdev_allocate(name_tmp);
TEST_ASSERT(dev2 != NULL,
"Failed to initialize bbdev driver");
++num_devs;
} while (num_devs < (RTE_BBDEV_MAX_DEVS - 1));
sprintf(name_tmp, "%s%i", "name_", num_devs);
dev2 = rte_bbdev_allocate(name_tmp);
TEST_ASSERT(dev2 == NULL, "Failed to initialize bbdev driver number %d "
"more drivers than RTE_BBDEV_MAX_DEVS: %d ", num_devs,
RTE_BBDEV_MAX_DEVS);
num_devs--;
while (num_devs >= num_devs_tmp) {
sprintf(name_tmp, "%s%i", "name_", num_devs);
dev2 = rte_bbdev_get_named_dev(name_tmp);
TEST_ASSERT_SUCCESS(rte_bbdev_release(dev2),
"Failed to uninitialize bbdev driver %s ",
name_tmp);
num_devs--;
}
TEST_ASSERT(dev1->data->dev_id < RTE_BBDEV_MAX_DEVS,
"Failed test rte_bbdev_allocate: "
"invalid dev_id %" PRIu8 ", max number of devices %d ",
dev1->data->dev_id, RTE_BBDEV_MAX_DEVS);
TEST_ASSERT(dev1->state == RTE_BBDEV_INITIALIZED,
"Failed test rte_bbdev_allocate: "
"invalid state %d (0 - RTE_BBDEV_UNUSED, 1 - RTE_BBDEV_INITIALIZED",
dev1->state);
TEST_ASSERT_FAIL(rte_bbdev_release(NULL),
"Failed to uninitialize bbdev driver with NULL bbdev");
sprintf(name_tmp, "%s", "invalid_name");
dev2 = rte_bbdev_get_named_dev(name_tmp);
TEST_ASSERT_FAIL(rte_bbdev_release(dev2),
"Failed to uninitialize bbdev driver with invalid name");
dev2 = rte_bbdev_get_named_dev(name);
TEST_ASSERT_SUCCESS(rte_bbdev_release(dev2),
"Failed to uninitialize bbdev driver: %s ", name);
return TEST_SUCCESS;
}
static void
event_callback(uint16_t dev_id, enum rte_bbdev_event_type type, void *param,
void *ret_param)
{
RTE_SET_USED(dev_id);
RTE_SET_USED(ret_param);
if (param == NULL)
return;
if (type == RTE_BBDEV_EVENT_UNKNOWN ||
type == RTE_BBDEV_EVENT_ERROR ||
type == RTE_BBDEV_EVENT_MAX)
*(int *)param = type;
}
static int
test_bbdev_callback(void)
{
struct rte_bbdev *dev1, *dev2;
const char *name = "dev_name1";
const char *name2 = "dev_name2";
int event_status;
uint8_t invalid_dev_id = RTE_BBDEV_MAX_DEVS;
enum rte_bbdev_event_type invalid_event_type = RTE_BBDEV_EVENT_MAX;
uint8_t dev_id;
dev1 = rte_bbdev_allocate(name);
TEST_ASSERT(dev1 != NULL, "Failed to initialize bbdev driver");
/*
* RTE_BBDEV_EVENT_UNKNOWN - unregistered
* RTE_BBDEV_EVENT_ERROR - unregistered
*/
event_status = -1;
rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL);
rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL);
TEST_ASSERT(event_status == -1,
"Failed test for rte_bbdev_pmd_callback_process: "
"events were not registered ");
TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev1->data->dev_id,
RTE_BBDEV_EVENT_MAX, event_callback, NULL),
"Failed to callback register for RTE_BBDEV_EVENT_MAX ");
TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev1->data->dev_id,
RTE_BBDEV_EVENT_MAX, event_callback, NULL),
"Failed to unregister RTE_BBDEV_EVENT_MAX ");
/*
* RTE_BBDEV_EVENT_UNKNOWN - registered
* RTE_BBDEV_EVENT_ERROR - unregistered
*/
TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev1->data->dev_id,
RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status),
"Failed to callback rgstr for RTE_BBDEV_EVENT_UNKNOWN");
rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL);
TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN,
"Failed test for rte_bbdev_pmd_callback_process "
"for RTE_BBDEV_EVENT_UNKNOWN ");
rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL);
TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN,
"Failed test for rte_bbdev_pmd_callback_process: "
"event RTE_BBDEV_EVENT_ERROR was not registered ");
/*
* RTE_BBDEV_EVENT_UNKNOWN - registered
* RTE_BBDEV_EVENT_ERROR - registered
*/
TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev1->data->dev_id,
RTE_BBDEV_EVENT_ERROR, event_callback, &event_status),
"Failed to callback rgstr for RTE_BBDEV_EVENT_ERROR ");
TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev1->data->dev_id,
RTE_BBDEV_EVENT_ERROR, event_callback, &event_status),
"Failed to callback register for RTE_BBDEV_EVENT_ERROR"
"(re-registration) ");
event_status = -1;
rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL);
TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN,
"Failed test for rte_bbdev_pmd_callback_process "
"for RTE_BBDEV_EVENT_UNKNOWN ");
rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL);
TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_ERROR,
"Failed test for rte_bbdev_pmd_callback_process "
"for RTE_BBDEV_EVENT_ERROR ");
/*
* RTE_BBDEV_EVENT_UNKNOWN - registered
* RTE_BBDEV_EVENT_ERROR - unregistered
*/
TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev1->data->dev_id,
RTE_BBDEV_EVENT_ERROR, event_callback, &event_status),
"Failed to unregister RTE_BBDEV_EVENT_ERROR ");
event_status = -1;
rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL);
TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN,
"Failed test for rte_bbdev_pmd_callback_process "
"for RTE_BBDEV_EVENT_UNKNOWN ");
rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL);
TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN,
"Failed test for rte_bbdev_pmd_callback_process: "
"event RTE_BBDEV_EVENT_ERROR was unregistered ");
/* rte_bbdev_callback_register with invalid inputs */
TEST_ASSERT_FAIL(rte_bbdev_callback_register(invalid_dev_id,
RTE_BBDEV_EVENT_ERROR, event_callback, &event_status),
"Failed test for rte_bbdev_callback_register "
"for invalid_dev_id ");
TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev1->data->dev_id,
invalid_event_type, event_callback, &event_status),
"Failed to callback register for invalid event type ");
TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev1->data->dev_id,
RTE_BBDEV_EVENT_ERROR, NULL, &event_status),
"Failed to callback register - no callback function ");
/* The impact of devices on each other */
dev2 = rte_bbdev_allocate(name2);
TEST_ASSERT(dev2 != NULL,
"Failed to initialize bbdev driver");
/*
* dev2:
* RTE_BBDEV_EVENT_UNKNOWN - unregistered
* RTE_BBDEV_EVENT_ERROR - unregistered
*/
event_status = -1;
rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL);
rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_ERROR, NULL);
TEST_ASSERT(event_status == -1,
"Failed test for rte_bbdev_pmd_callback_process: "
"events were not registered ");
/*
* dev1: RTE_BBDEV_EVENT_ERROR - unregistered
* dev2: RTE_BBDEV_EVENT_ERROR - registered
*/
TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev2->data->dev_id,
RTE_BBDEV_EVENT_ERROR, event_callback, &event_status),
"Failed to callback rgstr for RTE_BBDEV_EVENT_ERROR");
rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL);
TEST_ASSERT(event_status == -1,
"Failed test for rte_bbdev_pmd_callback_process in dev1 "
"for RTE_BBDEV_EVENT_ERROR ");
rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_ERROR, NULL);
TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_ERROR,
"Failed test for rte_bbdev_pmd_callback_process in dev2 "
"for RTE_BBDEV_EVENT_ERROR ");
/*
* dev1: RTE_BBDEV_EVENT_UNKNOWN - registered
* dev2: RTE_BBDEV_EVENT_UNKNOWN - unregistered
*/
TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev2->data->dev_id,
RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status),
"Failed to callback register for RTE_BBDEV_EVENT_UNKNOWN "
"in dev 2 ");
rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL);
TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN,
"Failed test for rte_bbdev_pmd_callback_process in dev2"
" for RTE_BBDEV_EVENT_UNKNOWN ");
TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev2->data->dev_id,
RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status),
"Failed to unregister RTE_BBDEV_EVENT_UNKNOWN ");
TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev2->data->dev_id,
RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status),
"Failed to unregister RTE_BBDEV_EVENT_UNKNOWN : "
"unregister function called once again ");
event_status = -1;
rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL);
TEST_ASSERT(event_status == -1,
"Failed test for rte_bbdev_pmd_callback_process in dev2"
" for RTE_BBDEV_EVENT_UNKNOWN ");
rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL);
TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN,
"Failed test for rte_bbdev_pmd_callback_process in dev2 "
"for RTE_BBDEV_EVENT_UNKNOWN ");
/* rte_bbdev_pmd_callback_process with invalid inputs */
rte_bbdev_pmd_callback_process(NULL, RTE_BBDEV_EVENT_UNKNOWN, NULL);
event_status = -1;
rte_bbdev_pmd_callback_process(dev1, invalid_event_type, NULL);
TEST_ASSERT(event_status == -1,
"Failed test for rte_bbdev_pmd_callback_process: "
"for invalid event type ");
/* rte_dev_callback_unregister with invalid inputs */
TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(invalid_dev_id,
RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status),
"Failed test for rte_dev_callback_unregister "
"for invalid_dev_id ");
TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev1->data->dev_id,
invalid_event_type, event_callback, &event_status),
"Failed rte_dev_callback_unregister "
"for invalid event type ");
TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev1->data->dev_id,
invalid_event_type, NULL, &event_status),
"Failed rte_dev_callback_unregister "
"when no callback function ");
dev_id = dev1->data->dev_id;
rte_bbdev_release(dev1);
rte_bbdev_release(dev2);
TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev_id,
RTE_BBDEV_EVENT_ERROR, event_callback, &event_status),
"Failed test for rte_bbdev_callback_register: "
"function called after rte_bbdev_driver_uninit .");
TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev_id,
RTE_BBDEV_EVENT_ERROR, event_callback, &event_status),
"Failed test for rte_dev_callback_unregister: "
"function called after rte_bbdev_driver_uninit. ");
event_status = -1;
rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL);
rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL);
rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL);
rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_ERROR, NULL);
TEST_ASSERT(event_status == -1,
"Failed test for rte_bbdev_pmd_callback_process: "
"callback function was called after rte_bbdev_driver_uninit");
return TEST_SUCCESS;
}
static int
test_bbdev_invalid_driver(void)
{
struct rte_bbdev dev1, *dev2;
uint8_t dev_id = null_dev_id;
uint16_t queue_id = 0;
struct rte_bbdev_stats stats;
struct bbdev_testsuite_params *ts_params = &testsuite_params;
struct rte_bbdev_queue_info qinfo;
struct rte_bbdev_ops dev_ops_tmp;
TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id), "Failed to stop bbdev %u ",
dev_id);
dev1 = rte_bbdev_devices[dev_id];
dev2 = &rte_bbdev_devices[dev_id];
/* Tests for rte_bbdev_setup_queues */
dev2->dev_ops = NULL;
TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 1, SOCKET_ID_ANY),
"Failed test for rte_bbdev_setup_queues: "
"NULL dev_ops structure ");
dev2->dev_ops = dev1.dev_ops;
dev_ops_tmp = *dev2->dev_ops;
dev_ops_tmp.info_get = NULL;
dev2->dev_ops = &dev_ops_tmp;
TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 1, SOCKET_ID_ANY),
"Failed test for rte_bbdev_setup_queues: "
"NULL info_get ");
dev2->dev_ops = dev1.dev_ops;
dev_ops_tmp = *dev2->dev_ops;
dev_ops_tmp.queue_release = NULL;
dev2->dev_ops = &dev_ops_tmp;
TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 1, SOCKET_ID_ANY),
"Failed test for rte_bbdev_setup_queues: "
"NULL queue_release ");
dev2->dev_ops = dev1.dev_ops;
dev2->data->socket_id = SOCKET_ID_ANY;
TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, 1,
SOCKET_ID_ANY), "Failed to configure bbdev %u", dev_id);
/* Test for rte_bbdev_queue_configure */
dev2->dev_ops = NULL;
TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
&ts_params->qconf),
"Failed to configure queue %u on device %u "
"with NULL dev_ops structure ", queue_id, dev_id);
dev2->dev_ops = dev1.dev_ops;
dev_ops_tmp = *dev2->dev_ops;
dev_ops_tmp.queue_setup = NULL;
dev2->dev_ops = &dev_ops_tmp;
TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
&ts_params->qconf),
"Failed to configure queue %u on device %u "
"with NULL queue_setup ", queue_id, dev_id);
dev2->dev_ops = dev1.dev_ops;
dev_ops_tmp = *dev2->dev_ops;
dev_ops_tmp.info_get = NULL;
dev2->dev_ops = &dev_ops_tmp;
TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id,
&ts_params->qconf),
"Failed to configure queue %u on device %u "
"with NULL info_get ", queue_id, dev_id);
dev2->dev_ops = dev1.dev_ops;
TEST_ASSERT_FAIL(rte_bbdev_queue_configure(RTE_BBDEV_MAX_DEVS,
queue_id, &ts_params->qconf),
"Failed to configure queue %u on device %u ",
queue_id, dev_id);
TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id,
&ts_params->qconf),
"Failed to configure queue %u on device %u ",
queue_id, dev_id);
/* Test for rte_bbdev_queue_info_get */
dev2->dev_ops = NULL;
TEST_ASSERT_SUCCESS(rte_bbdev_queue_info_get(dev_id, queue_id, &qinfo),
"Failed test for rte_bbdev_info_get: "
"NULL dev_ops structure ");
dev2->dev_ops = dev1.dev_ops;
TEST_ASSERT_FAIL(rte_bbdev_queue_info_get(RTE_BBDEV_MAX_DEVS,
queue_id, &qinfo),
"Failed test for rte_bbdev_info_get: "
"invalid dev_id ");
TEST_ASSERT_FAIL(rte_bbdev_queue_info_get(dev_id,
RTE_MAX_QUEUES_PER_PORT, &qinfo),
"Failed test for rte_bbdev_info_get: "
"invalid queue_id ");
TEST_ASSERT_FAIL(rte_bbdev_queue_info_get(dev_id, queue_id, NULL),
"Failed test for rte_bbdev_info_get: "
"invalid dev_info ");
/* Test for rte_bbdev_start */
dev2->dev_ops = NULL;
TEST_ASSERT_FAIL(rte_bbdev_start(dev_id),
"Failed to start bbdev %u "
"with NULL dev_ops structure ", dev_id);
dev2->dev_ops = dev1.dev_ops;
TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id),
"Failed to start bbdev %u ", dev_id);
/* Test for rte_bbdev_queue_start */
dev2->dev_ops = NULL;
TEST_ASSERT_FAIL(rte_bbdev_queue_start(dev_id, queue_id),
"Failed to start queue %u on device %u: "
"NULL dev_ops structure", queue_id, dev_id);
dev2->dev_ops = dev1.dev_ops;
TEST_ASSERT_SUCCESS(rte_bbdev_queue_start(dev_id, queue_id),
"Failed to start queue %u on device %u ", queue_id,
dev_id);
/* Tests for rte_bbdev_stats_get */
dev2->dev_ops = NULL;
TEST_ASSERT_FAIL(rte_bbdev_stats_get(dev_id, &stats),
"Failed test for rte_bbdev_stats_get on device %u ",
dev_id);
dev2->dev_ops = dev1.dev_ops;
dev_ops_tmp = *dev2->dev_ops;
dev_ops_tmp.stats_reset = NULL;
dev2->dev_ops = &dev_ops_tmp;
TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats),
"Failed test for rte_bbdev_stats_get: "
"NULL stats_get ");
dev2->dev_ops = dev1.dev_ops;
TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats),
"Failed test for rte_bbdev_stats_get on device %u ",
dev_id);
/*
* Tests for:
* rte_bbdev_callback_register,
* rte_bbdev_pmd_callback_process,
* rte_dev_callback_unregister
*/
dev2->dev_ops = NULL;
TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev_id,
RTE_BBDEV_EVENT_UNKNOWN, event_callback, NULL),
"Failed to callback rgstr for RTE_BBDEV_EVENT_UNKNOWN");
rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL);
TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev_id,
RTE_BBDEV_EVENT_UNKNOWN, event_callback, NULL),
"Failed to unregister RTE_BBDEV_EVENT_ERROR ");
dev2->dev_ops = dev1.dev_ops;
/* Tests for rte_bbdev_stats_reset */
dev2->dev_ops = NULL;
TEST_ASSERT_FAIL(rte_bbdev_stats_reset(dev_id),
"Failed to reset statistic for device %u ", dev_id);
dev2->dev_ops = dev1.dev_ops;
dev_ops_tmp = *dev2->dev_ops;
dev_ops_tmp.stats_reset = NULL;
dev2->dev_ops = &dev_ops_tmp;
TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id),
"Failed test for rte_bbdev_stats_reset: "
"NULL stats_reset ");
dev2->dev_ops = dev1.dev_ops;
TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id),
"Failed to reset statistic for device %u ", dev_id);
/* Tests for rte_bbdev_queue_stop */
dev2->dev_ops = NULL;
TEST_ASSERT_FAIL(rte_bbdev_queue_stop(dev_id, queue_id),
"Failed to stop queue %u on device %u: "
"NULL dev_ops structure", queue_id, dev_id);
dev2->dev_ops = dev1.dev_ops;
TEST_ASSERT_SUCCESS(rte_bbdev_queue_stop(dev_id, queue_id),
"Failed to stop queue %u on device %u ", queue_id,
dev_id);
/* Tests for rte_bbdev_stop */
dev2->dev_ops = NULL;
TEST_ASSERT_FAIL(rte_bbdev_stop(dev_id),
"Failed to stop bbdev %u with NULL dev_ops structure ",
dev_id);
dev2->dev_ops = dev1.dev_ops;
TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id),
"Failed to stop bbdev %u ", dev_id);
/* Tests for rte_bbdev_close */
TEST_ASSERT_FAIL(rte_bbdev_close(RTE_BBDEV_MAX_DEVS),
"Failed to close bbdev with invalid dev_id");
dev2->dev_ops = NULL;
TEST_ASSERT_FAIL(rte_bbdev_close(dev_id),
"Failed to close bbdev %u with NULL dev_ops structure ",
dev_id);
dev2->dev_ops = dev1.dev_ops;
TEST_ASSERT_SUCCESS(rte_bbdev_close(dev_id),
"Failed to close bbdev %u ", dev_id);
return TEST_SUCCESS;
}
static int
test_bbdev_get_named_dev(void)
{
struct rte_bbdev *dev, *dev_tmp;
const char *name = "name";
dev = rte_bbdev_allocate(name);
TEST_ASSERT(dev != NULL, "Failed to initialize bbdev driver");
dev_tmp = rte_bbdev_get_named_dev(NULL);
TEST_ASSERT(dev_tmp == NULL, "Failed test for rte_bbdev_get_named_dev: "
"function called with NULL parameter");
dev_tmp = rte_bbdev_get_named_dev(name);
TEST_ASSERT(dev == dev_tmp, "Failed test for rte_bbdev_get_named_dev: "
"wrong device was returned ");
TEST_ASSERT_SUCCESS(rte_bbdev_release(dev),
"Failed to uninitialize bbdev driver %s ", name);
return TEST_SUCCESS;
}
static struct unit_test_suite bbdev_null_testsuite = {
.suite_name = "BBDEV NULL Unit Test Suite",
.setup = testsuite_setup,
.teardown = testsuite_teardown,
.unit_test_cases = {
TEST_CASE(test_bbdev_configure_invalid_dev_id),
TEST_CASE_ST(ut_setup, ut_teardown,
test_bbdev_configure_invalid_num_queues),
TEST_CASE_ST(ut_setup, ut_teardown,
test_bbdev_configure_stop_device),
TEST_CASE_ST(ut_setup, ut_teardown,
test_bbdev_configure_stop_queue),
TEST_CASE_ST(ut_setup, ut_teardown,
test_bbdev_configure_invalid_queue_configure),
TEST_CASE_ST(ut_setup, ut_teardown,
test_bbdev_op_pool),
TEST_CASE_ST(ut_setup, ut_teardown,
test_bbdev_op_type),
TEST_CASE_ST(ut_setup, ut_teardown,
test_bbdev_op_pool_size),
TEST_CASE_ST(ut_setup, ut_teardown,
test_bbdev_stats),
TEST_CASE_ST(ut_setup, ut_teardown,
test_bbdev_driver_init),
TEST_CASE_ST(ut_setup, ut_teardown,
test_bbdev_callback),
TEST_CASE_ST(ut_setup, ut_teardown,
test_bbdev_invalid_driver),
TEST_CASE_ST(ut_setup, ut_teardown,
test_bbdev_get_named_dev),
TEST_CASE(test_bbdev_count),
TEST_CASES_END() /**< NULL terminate unit test array */
}
};
REGISTER_TEST_COMMAND(unittest, bbdev_null_testsuite);