xref: /dpdk/lib/bbdev/rte_bbdev.c (revision 353e3639d458f5cdaf3d938aade25579fa490b1b)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright(c) 2017 Intel Corporation
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #include <stdint.h>
699a2dd95SBruce Richardson #include <string.h>
799a2dd95SBruce Richardson #include <stdbool.h>
899a2dd95SBruce Richardson 
999a2dd95SBruce Richardson #include <rte_common.h>
1099a2dd95SBruce Richardson #include <rte_errno.h>
1199a2dd95SBruce Richardson #include <rte_log.h>
1299a2dd95SBruce Richardson #include <rte_eal.h>
1399a2dd95SBruce Richardson #include <rte_malloc.h>
1499a2dd95SBruce Richardson #include <rte_mempool.h>
1599a2dd95SBruce Richardson #include <rte_memzone.h>
1699a2dd95SBruce Richardson #include <rte_lcore.h>
1799a2dd95SBruce Richardson #include <rte_spinlock.h>
1899a2dd95SBruce Richardson #include <rte_interrupts.h>
1999a2dd95SBruce Richardson 
2099a2dd95SBruce Richardson #include "rte_bbdev_op.h"
2199a2dd95SBruce Richardson #include "rte_bbdev.h"
2299a2dd95SBruce Richardson #include "rte_bbdev_pmd.h"
2399a2dd95SBruce Richardson 
2499a2dd95SBruce Richardson #define DEV_NAME "BBDEV"
2599a2dd95SBruce Richardson 
26e70212ccSNicolas Chautru /* Number of supported operation types in *rte_bbdev_op_type*. */
27089148fcSNicolas Chautru #define BBDEV_OP_TYPE_COUNT 7
2899a2dd95SBruce Richardson 
2999a2dd95SBruce Richardson /* BBDev library logging ID */
30eeded204SDavid Marchand RTE_LOG_REGISTER_DEFAULT(bbdev_logtype, NOTICE);
3197433132SDavid Marchand #define RTE_LOGTYPE_BBDEV bbdev_logtype
3299a2dd95SBruce Richardson 
3399a2dd95SBruce Richardson /* Helper macro for logging */
3497433132SDavid Marchand #define rte_bbdev_log(level, ...) \
3597433132SDavid Marchand 	RTE_LOG_LINE(level, BBDEV, "" __VA_ARGS__)
3699a2dd95SBruce Richardson 
3799a2dd95SBruce Richardson #define rte_bbdev_log_debug(fmt, ...) \
3899a2dd95SBruce Richardson 	rte_bbdev_log(DEBUG, RTE_STR(__LINE__) ":%s() " fmt, __func__, \
3999a2dd95SBruce Richardson 		##__VA_ARGS__)
4099a2dd95SBruce Richardson 
4199a2dd95SBruce Richardson /* Helper macro to check dev_id is valid */
4299a2dd95SBruce Richardson #define VALID_DEV_OR_RET_ERR(dev, dev_id) do { \
4399a2dd95SBruce Richardson 	if (dev == NULL) { \
4499a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "device %u is invalid", dev_id); \
4599a2dd95SBruce Richardson 		return -ENODEV; \
4699a2dd95SBruce Richardson 	} \
4799a2dd95SBruce Richardson } while (0)
4899a2dd95SBruce Richardson 
4999a2dd95SBruce Richardson /* Helper macro to check dev_ops is valid */
5099a2dd95SBruce Richardson #define VALID_DEV_OPS_OR_RET_ERR(dev, dev_id) do { \
5199a2dd95SBruce Richardson 	if (dev->dev_ops == NULL) { \
5299a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "NULL dev_ops structure in device %u", \
5399a2dd95SBruce Richardson 				dev_id); \
5499a2dd95SBruce Richardson 		return -ENODEV; \
5599a2dd95SBruce Richardson 	} \
5699a2dd95SBruce Richardson } while (0)
5799a2dd95SBruce Richardson 
5899a2dd95SBruce Richardson /* Helper macro to check that driver implements required function pointer */
5999a2dd95SBruce Richardson #define VALID_FUNC_OR_RET_ERR(func, dev_id) do { \
6099a2dd95SBruce Richardson 	if (func == NULL) { \
6199a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "device %u does not support %s", \
6299a2dd95SBruce Richardson 				dev_id, #func); \
6399a2dd95SBruce Richardson 		return -ENOTSUP; \
6499a2dd95SBruce Richardson 	} \
6599a2dd95SBruce Richardson } while (0)
6699a2dd95SBruce Richardson 
6799a2dd95SBruce Richardson /* Helper macro to check that queue is valid */
6899a2dd95SBruce Richardson #define VALID_QUEUE_OR_RET_ERR(queue_id, dev) do { \
6999a2dd95SBruce Richardson 	if (queue_id >= dev->data->num_queues) { \
7099a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "Invalid queue_id %u for device %u", \
7199a2dd95SBruce Richardson 				queue_id, dev->data->dev_id); \
7299a2dd95SBruce Richardson 		return -ERANGE; \
7399a2dd95SBruce Richardson 	} \
7499a2dd95SBruce Richardson } while (0)
7599a2dd95SBruce Richardson 
7699a2dd95SBruce Richardson /* List of callback functions registered by an application */
7799a2dd95SBruce Richardson struct rte_bbdev_callback {
7899a2dd95SBruce Richardson 	TAILQ_ENTRY(rte_bbdev_callback) next;  /* Callbacks list */
7999a2dd95SBruce Richardson 	rte_bbdev_cb_fn cb_fn;  /* Callback address */
8099a2dd95SBruce Richardson 	void *cb_arg;  /* Parameter for callback */
8199a2dd95SBruce Richardson 	void *ret_param;  /* Return parameter */
8299a2dd95SBruce Richardson 	enum rte_bbdev_event_type event; /* Interrupt event type */
8399a2dd95SBruce Richardson 	uint32_t active; /* Callback is executing */
8499a2dd95SBruce Richardson };
8599a2dd95SBruce Richardson 
8699a2dd95SBruce Richardson /* spinlock for bbdev device callbacks */
8799a2dd95SBruce Richardson static rte_spinlock_t rte_bbdev_cb_lock = RTE_SPINLOCK_INITIALIZER;
8899a2dd95SBruce Richardson 
8999a2dd95SBruce Richardson /*
9099a2dd95SBruce Richardson  * Global array of all devices. This is not static because it's used by the
9199a2dd95SBruce Richardson  * inline enqueue and dequeue functions
9299a2dd95SBruce Richardson  */
9399a2dd95SBruce Richardson struct rte_bbdev rte_bbdev_devices[RTE_BBDEV_MAX_DEVS];
9499a2dd95SBruce Richardson 
9599a2dd95SBruce Richardson /* Global array with rte_bbdev_data structures */
9699a2dd95SBruce Richardson static struct rte_bbdev_data *rte_bbdev_data;
9799a2dd95SBruce Richardson 
9899a2dd95SBruce Richardson /* Memzone name for global bbdev data pool */
9999a2dd95SBruce Richardson static const char *MZ_RTE_BBDEV_DATA = "rte_bbdev_data";
10099a2dd95SBruce Richardson 
10199a2dd95SBruce Richardson /* Number of currently valid devices */
10299a2dd95SBruce Richardson static uint16_t num_devs;
10399a2dd95SBruce Richardson 
10499a2dd95SBruce Richardson /* Return pointer to device structure, with validity check */
10599a2dd95SBruce Richardson static struct rte_bbdev *
10699a2dd95SBruce Richardson get_dev(uint16_t dev_id)
10799a2dd95SBruce Richardson {
10899a2dd95SBruce Richardson 	if (rte_bbdev_is_valid(dev_id))
10999a2dd95SBruce Richardson 		return &rte_bbdev_devices[dev_id];
11099a2dd95SBruce Richardson 	return NULL;
11199a2dd95SBruce Richardson }
11299a2dd95SBruce Richardson 
11399a2dd95SBruce Richardson /* Allocate global data array */
11499a2dd95SBruce Richardson static int
11599a2dd95SBruce Richardson rte_bbdev_data_alloc(void)
11699a2dd95SBruce Richardson {
11799a2dd95SBruce Richardson 	const unsigned int flags = 0;
11899a2dd95SBruce Richardson 	const struct rte_memzone *mz;
11999a2dd95SBruce Richardson 
12099a2dd95SBruce Richardson 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
12199a2dd95SBruce Richardson 		mz = rte_memzone_reserve(MZ_RTE_BBDEV_DATA,
12299a2dd95SBruce Richardson 				RTE_BBDEV_MAX_DEVS * sizeof(*rte_bbdev_data),
12399a2dd95SBruce Richardson 				rte_socket_id(), flags);
12499a2dd95SBruce Richardson 	} else
12599a2dd95SBruce Richardson 		mz = rte_memzone_lookup(MZ_RTE_BBDEV_DATA);
12699a2dd95SBruce Richardson 	if (mz == NULL) {
12799a2dd95SBruce Richardson 		rte_bbdev_log(CRIT,
12899a2dd95SBruce Richardson 				"Cannot allocate memzone for bbdev port data");
12999a2dd95SBruce Richardson 		return -ENOMEM;
13099a2dd95SBruce Richardson 	}
13199a2dd95SBruce Richardson 
13299a2dd95SBruce Richardson 	rte_bbdev_data = mz->addr;
13399a2dd95SBruce Richardson 	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
13499a2dd95SBruce Richardson 		memset(rte_bbdev_data, 0,
13599a2dd95SBruce Richardson 				RTE_BBDEV_MAX_DEVS * sizeof(*rte_bbdev_data));
13699a2dd95SBruce Richardson 	return 0;
13799a2dd95SBruce Richardson }
13899a2dd95SBruce Richardson 
13999a2dd95SBruce Richardson /*
1404a6672c2SStephen Hemminger  * Find data allocated for the device or if not found return first unused bbdev
14199a2dd95SBruce Richardson  * data. If all structures are in use and none is used by the device return
14299a2dd95SBruce Richardson  * NULL.
14399a2dd95SBruce Richardson  */
14499a2dd95SBruce Richardson static struct rte_bbdev_data *
14599a2dd95SBruce Richardson find_bbdev_data(const char *name)
14699a2dd95SBruce Richardson {
14799a2dd95SBruce Richardson 	uint16_t data_id;
14899a2dd95SBruce Richardson 
14999a2dd95SBruce Richardson 	for (data_id = 0; data_id < RTE_BBDEV_MAX_DEVS; ++data_id) {
15099a2dd95SBruce Richardson 		if (strlen(rte_bbdev_data[data_id].name) == 0) {
15199a2dd95SBruce Richardson 			memset(&rte_bbdev_data[data_id], 0,
15299a2dd95SBruce Richardson 					sizeof(struct rte_bbdev_data));
15399a2dd95SBruce Richardson 			return &rte_bbdev_data[data_id];
15499a2dd95SBruce Richardson 		} else if (strncmp(rte_bbdev_data[data_id].name, name,
15599a2dd95SBruce Richardson 				RTE_BBDEV_NAME_MAX_LEN) == 0)
15699a2dd95SBruce Richardson 			return &rte_bbdev_data[data_id];
15799a2dd95SBruce Richardson 	}
15899a2dd95SBruce Richardson 
15999a2dd95SBruce Richardson 	return NULL;
16099a2dd95SBruce Richardson }
16199a2dd95SBruce Richardson 
16299a2dd95SBruce Richardson /* Find lowest device id with no attached device */
16399a2dd95SBruce Richardson static uint16_t
16499a2dd95SBruce Richardson find_free_dev_id(void)
16599a2dd95SBruce Richardson {
16699a2dd95SBruce Richardson 	uint16_t i;
16799a2dd95SBruce Richardson 	for (i = 0; i < RTE_BBDEV_MAX_DEVS; i++) {
16899a2dd95SBruce Richardson 		if (rte_bbdev_devices[i].state == RTE_BBDEV_UNUSED)
16999a2dd95SBruce Richardson 			return i;
17099a2dd95SBruce Richardson 	}
17199a2dd95SBruce Richardson 	return RTE_BBDEV_MAX_DEVS;
17299a2dd95SBruce Richardson }
17399a2dd95SBruce Richardson 
17499a2dd95SBruce Richardson struct rte_bbdev *
17599a2dd95SBruce Richardson rte_bbdev_allocate(const char *name)
17699a2dd95SBruce Richardson {
17799a2dd95SBruce Richardson 	int ret;
17899a2dd95SBruce Richardson 	struct rte_bbdev *bbdev;
17999a2dd95SBruce Richardson 	uint16_t dev_id;
18099a2dd95SBruce Richardson 
18199a2dd95SBruce Richardson 	if (name == NULL) {
18299a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "Invalid null device name");
18399a2dd95SBruce Richardson 		return NULL;
18499a2dd95SBruce Richardson 	}
18599a2dd95SBruce Richardson 
18699a2dd95SBruce Richardson 	if (rte_bbdev_get_named_dev(name) != NULL) {
18799a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "Device \"%s\" is already allocated", name);
18899a2dd95SBruce Richardson 		return NULL;
18999a2dd95SBruce Richardson 	}
19099a2dd95SBruce Richardson 
19199a2dd95SBruce Richardson 	dev_id = find_free_dev_id();
19299a2dd95SBruce Richardson 	if (dev_id == RTE_BBDEV_MAX_DEVS) {
19399a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "Reached maximum number of devices");
19499a2dd95SBruce Richardson 		return NULL;
19599a2dd95SBruce Richardson 	}
19699a2dd95SBruce Richardson 
19799a2dd95SBruce Richardson 	bbdev = &rte_bbdev_devices[dev_id];
19899a2dd95SBruce Richardson 
19999a2dd95SBruce Richardson 	if (rte_bbdev_data == NULL) {
20099a2dd95SBruce Richardson 		ret = rte_bbdev_data_alloc();
20199a2dd95SBruce Richardson 		if (ret != 0)
20299a2dd95SBruce Richardson 			return NULL;
20399a2dd95SBruce Richardson 	}
20499a2dd95SBruce Richardson 
20599a2dd95SBruce Richardson 	bbdev->data = find_bbdev_data(name);
20699a2dd95SBruce Richardson 	if (bbdev->data == NULL) {
20799a2dd95SBruce Richardson 		rte_bbdev_log(ERR,
20899a2dd95SBruce Richardson 				"Max BBDevs already allocated in multi-process environment!");
20999a2dd95SBruce Richardson 		return NULL;
21099a2dd95SBruce Richardson 	}
21199a2dd95SBruce Richardson 
212ece492b4STyler Retzlaff 	rte_atomic_fetch_add_explicit(&bbdev->data->process_cnt, 1, rte_memory_order_relaxed);
21399a2dd95SBruce Richardson 	bbdev->data->dev_id = dev_id;
21499a2dd95SBruce Richardson 	bbdev->state = RTE_BBDEV_INITIALIZED;
21599a2dd95SBruce Richardson 
21699a2dd95SBruce Richardson 	ret = snprintf(bbdev->data->name, RTE_BBDEV_NAME_MAX_LEN, "%s", name);
21799a2dd95SBruce Richardson 	if ((ret < 0) || (ret >= RTE_BBDEV_NAME_MAX_LEN)) {
21899a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "Copying device name \"%s\" failed", name);
21999a2dd95SBruce Richardson 		return NULL;
22099a2dd95SBruce Richardson 	}
22199a2dd95SBruce Richardson 
22299a2dd95SBruce Richardson 	/* init user callbacks */
22399a2dd95SBruce Richardson 	TAILQ_INIT(&(bbdev->list_cbs));
22499a2dd95SBruce Richardson 
22599a2dd95SBruce Richardson 	num_devs++;
22699a2dd95SBruce Richardson 
22799a2dd95SBruce Richardson 	rte_bbdev_log_debug("Initialised device %s (id = %u). Num devices = %u",
22899a2dd95SBruce Richardson 			name, dev_id, num_devs);
22999a2dd95SBruce Richardson 
23099a2dd95SBruce Richardson 	return bbdev;
23199a2dd95SBruce Richardson }
23299a2dd95SBruce Richardson 
23399a2dd95SBruce Richardson int
23499a2dd95SBruce Richardson rte_bbdev_release(struct rte_bbdev *bbdev)
23599a2dd95SBruce Richardson {
23699a2dd95SBruce Richardson 	uint16_t dev_id;
23799a2dd95SBruce Richardson 	struct rte_bbdev_callback *cb, *next;
23899a2dd95SBruce Richardson 
23999a2dd95SBruce Richardson 	if (bbdev == NULL) {
24099a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "NULL bbdev");
24199a2dd95SBruce Richardson 		return -ENODEV;
24299a2dd95SBruce Richardson 	}
24399a2dd95SBruce Richardson 	dev_id = bbdev->data->dev_id;
24499a2dd95SBruce Richardson 
24599a2dd95SBruce Richardson 	/* free all callbacks from the device's list */
24699a2dd95SBruce Richardson 	for (cb = TAILQ_FIRST(&bbdev->list_cbs); cb != NULL; cb = next) {
24799a2dd95SBruce Richardson 
24899a2dd95SBruce Richardson 		next = TAILQ_NEXT(cb, next);
24999a2dd95SBruce Richardson 		TAILQ_REMOVE(&(bbdev->list_cbs), cb, next);
25099a2dd95SBruce Richardson 		rte_free(cb);
25199a2dd95SBruce Richardson 	}
25299a2dd95SBruce Richardson 
25399a2dd95SBruce Richardson 	/* clear shared BBDev Data if no process is using the device anymore */
254ece492b4STyler Retzlaff 	if (rte_atomic_fetch_sub_explicit(&bbdev->data->process_cnt, 1,
255ece492b4STyler Retzlaff 			      rte_memory_order_relaxed) - 1 == 0)
25699a2dd95SBruce Richardson 		memset(bbdev->data, 0, sizeof(*bbdev->data));
25799a2dd95SBruce Richardson 
25899a2dd95SBruce Richardson 	memset(bbdev, 0, sizeof(*bbdev));
25999a2dd95SBruce Richardson 	num_devs--;
26099a2dd95SBruce Richardson 	bbdev->state = RTE_BBDEV_UNUSED;
26199a2dd95SBruce Richardson 
26299a2dd95SBruce Richardson 	rte_bbdev_log_debug(
26399a2dd95SBruce Richardson 			"Un-initialised device id = %u. Num devices = %u",
26499a2dd95SBruce Richardson 			dev_id, num_devs);
26599a2dd95SBruce Richardson 	return 0;
26699a2dd95SBruce Richardson }
26799a2dd95SBruce Richardson 
26899a2dd95SBruce Richardson struct rte_bbdev *
26999a2dd95SBruce Richardson rte_bbdev_get_named_dev(const char *name)
27099a2dd95SBruce Richardson {
27199a2dd95SBruce Richardson 	unsigned int i;
27299a2dd95SBruce Richardson 
27399a2dd95SBruce Richardson 	if (name == NULL) {
27499a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "NULL driver name");
27599a2dd95SBruce Richardson 		return NULL;
27699a2dd95SBruce Richardson 	}
27799a2dd95SBruce Richardson 
27899a2dd95SBruce Richardson 	for (i = 0; i < RTE_BBDEV_MAX_DEVS; i++) {
27999a2dd95SBruce Richardson 		struct rte_bbdev *dev = get_dev(i);
28099a2dd95SBruce Richardson 		if (dev && (strncmp(dev->data->name,
28199a2dd95SBruce Richardson 				name, RTE_BBDEV_NAME_MAX_LEN) == 0))
28299a2dd95SBruce Richardson 			return dev;
28399a2dd95SBruce Richardson 	}
28499a2dd95SBruce Richardson 
28599a2dd95SBruce Richardson 	return NULL;
28699a2dd95SBruce Richardson }
28799a2dd95SBruce Richardson 
28899a2dd95SBruce Richardson uint16_t
28999a2dd95SBruce Richardson rte_bbdev_count(void)
29099a2dd95SBruce Richardson {
29199a2dd95SBruce Richardson 	return num_devs;
29299a2dd95SBruce Richardson }
29399a2dd95SBruce Richardson 
29499a2dd95SBruce Richardson bool
29599a2dd95SBruce Richardson rte_bbdev_is_valid(uint16_t dev_id)
29699a2dd95SBruce Richardson {
29799a2dd95SBruce Richardson 	if ((dev_id < RTE_BBDEV_MAX_DEVS) &&
29899a2dd95SBruce Richardson 		rte_bbdev_devices[dev_id].state == RTE_BBDEV_INITIALIZED)
29999a2dd95SBruce Richardson 		return true;
30099a2dd95SBruce Richardson 	return false;
30199a2dd95SBruce Richardson }
30299a2dd95SBruce Richardson 
30399a2dd95SBruce Richardson uint16_t
30499a2dd95SBruce Richardson rte_bbdev_find_next(uint16_t dev_id)
30599a2dd95SBruce Richardson {
30699a2dd95SBruce Richardson 	dev_id++;
30799a2dd95SBruce Richardson 	for (; dev_id < RTE_BBDEV_MAX_DEVS; dev_id++)
30899a2dd95SBruce Richardson 		if (rte_bbdev_is_valid(dev_id))
30999a2dd95SBruce Richardson 			break;
31099a2dd95SBruce Richardson 	return dev_id;
31199a2dd95SBruce Richardson }
31299a2dd95SBruce Richardson 
31399a2dd95SBruce Richardson int
31499a2dd95SBruce Richardson rte_bbdev_setup_queues(uint16_t dev_id, uint16_t num_queues, int socket_id)
31599a2dd95SBruce Richardson {
31699a2dd95SBruce Richardson 	unsigned int i;
31799a2dd95SBruce Richardson 	int ret;
31899a2dd95SBruce Richardson 	struct rte_bbdev_driver_info dev_info;
31999a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
32099a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
32199a2dd95SBruce Richardson 
32299a2dd95SBruce Richardson 	VALID_DEV_OPS_OR_RET_ERR(dev, dev_id);
32399a2dd95SBruce Richardson 
32499a2dd95SBruce Richardson 	if (dev->data->started) {
32599a2dd95SBruce Richardson 		rte_bbdev_log(ERR,
32699a2dd95SBruce Richardson 				"Device %u cannot be configured when started",
32799a2dd95SBruce Richardson 				dev_id);
32899a2dd95SBruce Richardson 		return -EBUSY;
32999a2dd95SBruce Richardson 	}
33099a2dd95SBruce Richardson 
33199a2dd95SBruce Richardson 	/* Get device driver information to get max number of queues */
33299a2dd95SBruce Richardson 	VALID_FUNC_OR_RET_ERR(dev->dev_ops->info_get, dev_id);
33399a2dd95SBruce Richardson 	memset(&dev_info, 0, sizeof(dev_info));
33499a2dd95SBruce Richardson 	dev->dev_ops->info_get(dev, &dev_info);
33599a2dd95SBruce Richardson 
33699a2dd95SBruce Richardson 	if ((num_queues == 0) || (num_queues > dev_info.max_num_queues)) {
33799a2dd95SBruce Richardson 		rte_bbdev_log(ERR,
33899a2dd95SBruce Richardson 				"Device %u supports 0 < N <= %u queues, not %u",
33999a2dd95SBruce Richardson 				dev_id, dev_info.max_num_queues, num_queues);
34099a2dd95SBruce Richardson 		return -EINVAL;
34199a2dd95SBruce Richardson 	}
34299a2dd95SBruce Richardson 
34399a2dd95SBruce Richardson 	/* If re-configuration, get driver to free existing internal memory */
34499a2dd95SBruce Richardson 	if (dev->data->queues != NULL) {
34599a2dd95SBruce Richardson 		VALID_FUNC_OR_RET_ERR(dev->dev_ops->queue_release, dev_id);
34699a2dd95SBruce Richardson 		for (i = 0; i < dev->data->num_queues; i++) {
34799a2dd95SBruce Richardson 			int ret = dev->dev_ops->queue_release(dev, i);
34899a2dd95SBruce Richardson 			if (ret < 0) {
34999a2dd95SBruce Richardson 				rte_bbdev_log(ERR,
35099a2dd95SBruce Richardson 						"Device %u queue %u release failed",
35199a2dd95SBruce Richardson 						dev_id, i);
35299a2dd95SBruce Richardson 				return ret;
35399a2dd95SBruce Richardson 			}
35499a2dd95SBruce Richardson 		}
35599a2dd95SBruce Richardson 		/* Call optional device close */
35699a2dd95SBruce Richardson 		if (dev->dev_ops->close) {
35799a2dd95SBruce Richardson 			ret = dev->dev_ops->close(dev);
35899a2dd95SBruce Richardson 			if (ret < 0) {
35999a2dd95SBruce Richardson 				rte_bbdev_log(ERR,
36099a2dd95SBruce Richardson 						"Device %u couldn't be closed",
36199a2dd95SBruce Richardson 						dev_id);
36299a2dd95SBruce Richardson 				return ret;
36399a2dd95SBruce Richardson 			}
36499a2dd95SBruce Richardson 		}
36599a2dd95SBruce Richardson 		rte_free(dev->data->queues);
36699a2dd95SBruce Richardson 	}
36799a2dd95SBruce Richardson 
36899a2dd95SBruce Richardson 	/* Allocate queue pointers */
36999a2dd95SBruce Richardson 	dev->data->queues = rte_calloc_socket(DEV_NAME, num_queues,
37099a2dd95SBruce Richardson 			sizeof(dev->data->queues[0]), RTE_CACHE_LINE_SIZE,
37199a2dd95SBruce Richardson 				dev->data->socket_id);
37299a2dd95SBruce Richardson 	if (dev->data->queues == NULL) {
37399a2dd95SBruce Richardson 		rte_bbdev_log(ERR,
37499a2dd95SBruce Richardson 				"calloc of %u queues for device %u on socket %i failed",
37599a2dd95SBruce Richardson 				num_queues, dev_id, dev->data->socket_id);
37699a2dd95SBruce Richardson 		return -ENOMEM;
37799a2dd95SBruce Richardson 	}
37899a2dd95SBruce Richardson 
37999a2dd95SBruce Richardson 	dev->data->num_queues = num_queues;
38099a2dd95SBruce Richardson 
38199a2dd95SBruce Richardson 	/* Call optional device configuration */
38299a2dd95SBruce Richardson 	if (dev->dev_ops->setup_queues) {
38399a2dd95SBruce Richardson 		ret = dev->dev_ops->setup_queues(dev, num_queues, socket_id);
38499a2dd95SBruce Richardson 		if (ret < 0) {
38599a2dd95SBruce Richardson 			rte_bbdev_log(ERR,
38699a2dd95SBruce Richardson 					"Device %u memory configuration failed",
38799a2dd95SBruce Richardson 					dev_id);
38899a2dd95SBruce Richardson 			goto error;
38999a2dd95SBruce Richardson 		}
39099a2dd95SBruce Richardson 	}
39199a2dd95SBruce Richardson 
39299a2dd95SBruce Richardson 	rte_bbdev_log_debug("Device %u set up with %u queues", dev_id,
39399a2dd95SBruce Richardson 			num_queues);
39499a2dd95SBruce Richardson 	return 0;
39599a2dd95SBruce Richardson 
39699a2dd95SBruce Richardson error:
39799a2dd95SBruce Richardson 	dev->data->num_queues = 0;
39899a2dd95SBruce Richardson 	rte_free(dev->data->queues);
39999a2dd95SBruce Richardson 	dev->data->queues = NULL;
40099a2dd95SBruce Richardson 	return ret;
40199a2dd95SBruce Richardson }
40299a2dd95SBruce Richardson 
40399a2dd95SBruce Richardson int
40499a2dd95SBruce Richardson rte_bbdev_intr_enable(uint16_t dev_id)
40599a2dd95SBruce Richardson {
40699a2dd95SBruce Richardson 	int ret;
40799a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
40899a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
40999a2dd95SBruce Richardson 
41099a2dd95SBruce Richardson 	VALID_DEV_OPS_OR_RET_ERR(dev, dev_id);
41199a2dd95SBruce Richardson 
41299a2dd95SBruce Richardson 	if (dev->data->started) {
41399a2dd95SBruce Richardson 		rte_bbdev_log(ERR,
41499a2dd95SBruce Richardson 				"Device %u cannot be configured when started",
41599a2dd95SBruce Richardson 				dev_id);
41699a2dd95SBruce Richardson 		return -EBUSY;
41799a2dd95SBruce Richardson 	}
41899a2dd95SBruce Richardson 
41999a2dd95SBruce Richardson 	if (dev->dev_ops->intr_enable) {
42099a2dd95SBruce Richardson 		ret = dev->dev_ops->intr_enable(dev);
42199a2dd95SBruce Richardson 		if (ret < 0) {
42299a2dd95SBruce Richardson 			rte_bbdev_log(ERR,
42399a2dd95SBruce Richardson 					"Device %u interrupts configuration failed",
42499a2dd95SBruce Richardson 					dev_id);
42599a2dd95SBruce Richardson 			return ret;
42699a2dd95SBruce Richardson 		}
42799a2dd95SBruce Richardson 		rte_bbdev_log_debug("Enabled interrupts for dev %u", dev_id);
42899a2dd95SBruce Richardson 		return 0;
42999a2dd95SBruce Richardson 	}
43099a2dd95SBruce Richardson 
43199a2dd95SBruce Richardson 	rte_bbdev_log(ERR, "Device %u doesn't support interrupts", dev_id);
43299a2dd95SBruce Richardson 	return -ENOTSUP;
43399a2dd95SBruce Richardson }
43499a2dd95SBruce Richardson 
43599a2dd95SBruce Richardson int
43699a2dd95SBruce Richardson rte_bbdev_queue_configure(uint16_t dev_id, uint16_t queue_id,
43799a2dd95SBruce Richardson 		const struct rte_bbdev_queue_conf *conf)
43899a2dd95SBruce Richardson {
43999a2dd95SBruce Richardson 	int ret = 0;
44099a2dd95SBruce Richardson 	struct rte_bbdev_driver_info dev_info;
44199a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
44299a2dd95SBruce Richardson 	const struct rte_bbdev_op_cap *p;
44399a2dd95SBruce Richardson 	struct rte_bbdev_queue_conf *stored_conf;
44499a2dd95SBruce Richardson 	const char *op_type_str;
445e797d009SNicolas Chautru 	unsigned int max_priority;
44699a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
44799a2dd95SBruce Richardson 
44899a2dd95SBruce Richardson 	VALID_DEV_OPS_OR_RET_ERR(dev, dev_id);
44999a2dd95SBruce Richardson 
45099a2dd95SBruce Richardson 	VALID_QUEUE_OR_RET_ERR(queue_id, dev);
45199a2dd95SBruce Richardson 
45299a2dd95SBruce Richardson 	if (dev->data->queues[queue_id].started || dev->data->started) {
45399a2dd95SBruce Richardson 		rte_bbdev_log(ERR,
45499a2dd95SBruce Richardson 				"Queue %u of device %u cannot be configured when started",
45599a2dd95SBruce Richardson 				queue_id, dev_id);
45699a2dd95SBruce Richardson 		return -EBUSY;
45799a2dd95SBruce Richardson 	}
45899a2dd95SBruce Richardson 
45999a2dd95SBruce Richardson 	VALID_FUNC_OR_RET_ERR(dev->dev_ops->queue_release, dev_id);
46099a2dd95SBruce Richardson 	VALID_FUNC_OR_RET_ERR(dev->dev_ops->queue_setup, dev_id);
46199a2dd95SBruce Richardson 
46299a2dd95SBruce Richardson 	/* Get device driver information to verify config is valid */
46399a2dd95SBruce Richardson 	VALID_FUNC_OR_RET_ERR(dev->dev_ops->info_get, dev_id);
46499a2dd95SBruce Richardson 	memset(&dev_info, 0, sizeof(dev_info));
46599a2dd95SBruce Richardson 	dev->dev_ops->info_get(dev, &dev_info);
46699a2dd95SBruce Richardson 
46799a2dd95SBruce Richardson 	/* Check configuration is valid */
46899a2dd95SBruce Richardson 	if (conf != NULL) {
46999a2dd95SBruce Richardson 		if ((conf->op_type == RTE_BBDEV_OP_NONE) &&
47099a2dd95SBruce Richardson 				(dev_info.capabilities[0].type ==
47199a2dd95SBruce Richardson 				RTE_BBDEV_OP_NONE)) {
47299a2dd95SBruce Richardson 			ret = 1;
47399a2dd95SBruce Richardson 		} else {
47499a2dd95SBruce Richardson 			for (p = dev_info.capabilities;
47599a2dd95SBruce Richardson 					p->type != RTE_BBDEV_OP_NONE; p++) {
47699a2dd95SBruce Richardson 				if (conf->op_type == p->type) {
47799a2dd95SBruce Richardson 					ret = 1;
47899a2dd95SBruce Richardson 					break;
47999a2dd95SBruce Richardson 				}
48099a2dd95SBruce Richardson 			}
48199a2dd95SBruce Richardson 		}
48299a2dd95SBruce Richardson 		if (ret == 0) {
48399a2dd95SBruce Richardson 			rte_bbdev_log(ERR, "Invalid operation type");
48499a2dd95SBruce Richardson 			return -EINVAL;
48599a2dd95SBruce Richardson 		}
48699a2dd95SBruce Richardson 		if (conf->queue_size > dev_info.queue_size_lim) {
48799a2dd95SBruce Richardson 			rte_bbdev_log(ERR,
48899a2dd95SBruce Richardson 					"Size (%u) of queue %u of device %u must be: <= %u",
48999a2dd95SBruce Richardson 					conf->queue_size, queue_id, dev_id,
49099a2dd95SBruce Richardson 					dev_info.queue_size_lim);
49199a2dd95SBruce Richardson 			return -EINVAL;
49299a2dd95SBruce Richardson 		}
49399a2dd95SBruce Richardson 		if (!rte_is_power_of_2(conf->queue_size)) {
49499a2dd95SBruce Richardson 			rte_bbdev_log(ERR,
49599a2dd95SBruce Richardson 					"Size (%u) of queue %u of device %u must be a power of 2",
49699a2dd95SBruce Richardson 					conf->queue_size, queue_id, dev_id);
49799a2dd95SBruce Richardson 			return -EINVAL;
49899a2dd95SBruce Richardson 		}
499e797d009SNicolas Chautru 		if ((uint8_t)conf->op_type >= RTE_BBDEV_OP_TYPE_SIZE_MAX) {
50099a2dd95SBruce Richardson 			rte_bbdev_log(ERR,
501e797d009SNicolas Chautru 					"Invalid operation type (%u) ", conf->op_type);
50299a2dd95SBruce Richardson 			return -EINVAL;
50399a2dd95SBruce Richardson 		}
504e797d009SNicolas Chautru 		max_priority = dev_info.queue_priority[conf->op_type];
505e797d009SNicolas Chautru 		if (conf->priority > max_priority) {
50699a2dd95SBruce Richardson 			rte_bbdev_log(ERR,
50799a2dd95SBruce Richardson 					"Priority (%u) of queue %u of bbdev %u must be <= %u",
508e797d009SNicolas Chautru 					conf->priority, queue_id, dev_id, max_priority);
50999a2dd95SBruce Richardson 			return -EINVAL;
51099a2dd95SBruce Richardson 		}
51199a2dd95SBruce Richardson 	}
51299a2dd95SBruce Richardson 
51399a2dd95SBruce Richardson 	/* Release existing queue (in case of queue reconfiguration) */
51499a2dd95SBruce Richardson 	if (dev->data->queues[queue_id].queue_private != NULL) {
51599a2dd95SBruce Richardson 		ret = dev->dev_ops->queue_release(dev, queue_id);
51699a2dd95SBruce Richardson 		if (ret < 0) {
51799a2dd95SBruce Richardson 			rte_bbdev_log(ERR, "Device %u queue %u release failed",
51899a2dd95SBruce Richardson 					dev_id, queue_id);
51999a2dd95SBruce Richardson 			return ret;
52099a2dd95SBruce Richardson 		}
52199a2dd95SBruce Richardson 	}
52299a2dd95SBruce Richardson 
52399a2dd95SBruce Richardson 	/* Get driver to setup the queue */
52499a2dd95SBruce Richardson 	ret = dev->dev_ops->queue_setup(dev, queue_id, (conf != NULL) ?
52599a2dd95SBruce Richardson 			conf : &dev_info.default_queue_conf);
52699a2dd95SBruce Richardson 	if (ret < 0) {
5275f13f4c0SNicolas Chautru 		/* This may happen when trying different priority levels */
5285f13f4c0SNicolas Chautru 		rte_bbdev_log(INFO,
5295f13f4c0SNicolas Chautru 				"Device %u queue %u setup failed",
5305f13f4c0SNicolas Chautru 				dev_id, queue_id);
53199a2dd95SBruce Richardson 		return ret;
53299a2dd95SBruce Richardson 	}
53399a2dd95SBruce Richardson 
53499a2dd95SBruce Richardson 	/* Store configuration */
53599a2dd95SBruce Richardson 	stored_conf = &dev->data->queues[queue_id].conf;
53699a2dd95SBruce Richardson 	memcpy(stored_conf,
53799a2dd95SBruce Richardson 			(conf != NULL) ? conf : &dev_info.default_queue_conf,
53899a2dd95SBruce Richardson 			sizeof(*stored_conf));
53999a2dd95SBruce Richardson 
54099a2dd95SBruce Richardson 	op_type_str = rte_bbdev_op_type_str(stored_conf->op_type);
54199a2dd95SBruce Richardson 	if (op_type_str == NULL)
54299a2dd95SBruce Richardson 		return -EINVAL;
54399a2dd95SBruce Richardson 
54499a2dd95SBruce Richardson 	rte_bbdev_log_debug("Configured dev%uq%u (size=%u, type=%s, prio=%u)",
54599a2dd95SBruce Richardson 			dev_id, queue_id, stored_conf->queue_size, op_type_str,
54699a2dd95SBruce Richardson 			stored_conf->priority);
54799a2dd95SBruce Richardson 
54899a2dd95SBruce Richardson 	return 0;
54999a2dd95SBruce Richardson }
55099a2dd95SBruce Richardson 
55199a2dd95SBruce Richardson int
55299a2dd95SBruce Richardson rte_bbdev_start(uint16_t dev_id)
55399a2dd95SBruce Richardson {
55499a2dd95SBruce Richardson 	int i;
55599a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
55699a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
55799a2dd95SBruce Richardson 
55899a2dd95SBruce Richardson 	VALID_DEV_OPS_OR_RET_ERR(dev, dev_id);
55999a2dd95SBruce Richardson 
56099a2dd95SBruce Richardson 	if (dev->data->started) {
56199a2dd95SBruce Richardson 		rte_bbdev_log_debug("Device %u is already started", dev_id);
56299a2dd95SBruce Richardson 		return 0;
56399a2dd95SBruce Richardson 	}
56499a2dd95SBruce Richardson 
56599a2dd95SBruce Richardson 	if (dev->dev_ops->start) {
56699a2dd95SBruce Richardson 		int ret = dev->dev_ops->start(dev);
56799a2dd95SBruce Richardson 		if (ret < 0) {
56899a2dd95SBruce Richardson 			rte_bbdev_log(ERR, "Device %u start failed", dev_id);
56999a2dd95SBruce Richardson 			return ret;
57099a2dd95SBruce Richardson 		}
57199a2dd95SBruce Richardson 	}
57299a2dd95SBruce Richardson 
57399a2dd95SBruce Richardson 	/* Store new state */
57499a2dd95SBruce Richardson 	for (i = 0; i < dev->data->num_queues; i++)
57599a2dd95SBruce Richardson 		if (!dev->data->queues[i].conf.deferred_start)
57699a2dd95SBruce Richardson 			dev->data->queues[i].started = true;
57799a2dd95SBruce Richardson 	dev->data->started = true;
57899a2dd95SBruce Richardson 
57999a2dd95SBruce Richardson 	rte_bbdev_log_debug("Started device %u", dev_id);
58099a2dd95SBruce Richardson 	return 0;
58199a2dd95SBruce Richardson }
58299a2dd95SBruce Richardson 
58399a2dd95SBruce Richardson int
58499a2dd95SBruce Richardson rte_bbdev_stop(uint16_t dev_id)
58599a2dd95SBruce Richardson {
58699a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
58799a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
58899a2dd95SBruce Richardson 
58999a2dd95SBruce Richardson 	VALID_DEV_OPS_OR_RET_ERR(dev, dev_id);
59099a2dd95SBruce Richardson 
59199a2dd95SBruce Richardson 	if (!dev->data->started) {
59299a2dd95SBruce Richardson 		rte_bbdev_log_debug("Device %u is already stopped", dev_id);
59399a2dd95SBruce Richardson 		return 0;
59499a2dd95SBruce Richardson 	}
59599a2dd95SBruce Richardson 
59699a2dd95SBruce Richardson 	if (dev->dev_ops->stop)
59799a2dd95SBruce Richardson 		dev->dev_ops->stop(dev);
59899a2dd95SBruce Richardson 	dev->data->started = false;
59999a2dd95SBruce Richardson 
60099a2dd95SBruce Richardson 	rte_bbdev_log_debug("Stopped device %u", dev_id);
60199a2dd95SBruce Richardson 	return 0;
60299a2dd95SBruce Richardson }
60399a2dd95SBruce Richardson 
60499a2dd95SBruce Richardson int
60599a2dd95SBruce Richardson rte_bbdev_close(uint16_t dev_id)
60699a2dd95SBruce Richardson {
60799a2dd95SBruce Richardson 	int ret;
60899a2dd95SBruce Richardson 	uint16_t i;
60999a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
61099a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
61199a2dd95SBruce Richardson 
61299a2dd95SBruce Richardson 	VALID_DEV_OPS_OR_RET_ERR(dev, dev_id);
61399a2dd95SBruce Richardson 
61499a2dd95SBruce Richardson 	if (dev->data->started) {
61599a2dd95SBruce Richardson 		ret = rte_bbdev_stop(dev_id);
61699a2dd95SBruce Richardson 		if (ret < 0) {
61799a2dd95SBruce Richardson 			rte_bbdev_log(ERR, "Device %u stop failed", dev_id);
61899a2dd95SBruce Richardson 			return ret;
61999a2dd95SBruce Richardson 		}
62099a2dd95SBruce Richardson 	}
62199a2dd95SBruce Richardson 
62299a2dd95SBruce Richardson 	/* Free memory used by queues */
62399a2dd95SBruce Richardson 	for (i = 0; i < dev->data->num_queues; i++) {
62499a2dd95SBruce Richardson 		ret = dev->dev_ops->queue_release(dev, i);
62599a2dd95SBruce Richardson 		if (ret < 0) {
62699a2dd95SBruce Richardson 			rte_bbdev_log(ERR, "Device %u queue %u release failed",
62799a2dd95SBruce Richardson 					dev_id, i);
62899a2dd95SBruce Richardson 			return ret;
62999a2dd95SBruce Richardson 		}
63099a2dd95SBruce Richardson 	}
63199a2dd95SBruce Richardson 	rte_free(dev->data->queues);
63299a2dd95SBruce Richardson 
63399a2dd95SBruce Richardson 	if (dev->dev_ops->close) {
63499a2dd95SBruce Richardson 		ret = dev->dev_ops->close(dev);
63599a2dd95SBruce Richardson 		if (ret < 0) {
63699a2dd95SBruce Richardson 			rte_bbdev_log(ERR, "Device %u close failed", dev_id);
63799a2dd95SBruce Richardson 			return ret;
63899a2dd95SBruce Richardson 		}
63999a2dd95SBruce Richardson 	}
64099a2dd95SBruce Richardson 
64199a2dd95SBruce Richardson 	/* Clear configuration */
64299a2dd95SBruce Richardson 	dev->data->queues = NULL;
64399a2dd95SBruce Richardson 	dev->data->num_queues = 0;
64499a2dd95SBruce Richardson 
64599a2dd95SBruce Richardson 	rte_bbdev_log_debug("Closed device %u", dev_id);
64699a2dd95SBruce Richardson 	return 0;
64799a2dd95SBruce Richardson }
64899a2dd95SBruce Richardson 
64999a2dd95SBruce Richardson int
65099a2dd95SBruce Richardson rte_bbdev_queue_start(uint16_t dev_id, uint16_t queue_id)
65199a2dd95SBruce Richardson {
65299a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
65399a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
65499a2dd95SBruce Richardson 
65599a2dd95SBruce Richardson 	VALID_DEV_OPS_OR_RET_ERR(dev, dev_id);
65699a2dd95SBruce Richardson 
65799a2dd95SBruce Richardson 	VALID_QUEUE_OR_RET_ERR(queue_id, dev);
65899a2dd95SBruce Richardson 
65999a2dd95SBruce Richardson 	if (dev->data->queues[queue_id].started) {
66099a2dd95SBruce Richardson 		rte_bbdev_log_debug("Queue %u of device %u already started",
66199a2dd95SBruce Richardson 				queue_id, dev_id);
66299a2dd95SBruce Richardson 		return 0;
66399a2dd95SBruce Richardson 	}
66499a2dd95SBruce Richardson 
66599a2dd95SBruce Richardson 	if (dev->dev_ops->queue_start) {
66699a2dd95SBruce Richardson 		int ret = dev->dev_ops->queue_start(dev, queue_id);
66799a2dd95SBruce Richardson 		if (ret < 0) {
66899a2dd95SBruce Richardson 			rte_bbdev_log(ERR, "Device %u queue %u start failed",
66999a2dd95SBruce Richardson 					dev_id, queue_id);
67099a2dd95SBruce Richardson 			return ret;
67199a2dd95SBruce Richardson 		}
67299a2dd95SBruce Richardson 	}
67399a2dd95SBruce Richardson 	dev->data->queues[queue_id].started = true;
67499a2dd95SBruce Richardson 
67599a2dd95SBruce Richardson 	rte_bbdev_log_debug("Started queue %u of device %u", queue_id, dev_id);
67699a2dd95SBruce Richardson 	return 0;
67799a2dd95SBruce Richardson }
67899a2dd95SBruce Richardson 
67999a2dd95SBruce Richardson int
68099a2dd95SBruce Richardson rte_bbdev_queue_stop(uint16_t dev_id, uint16_t queue_id)
68199a2dd95SBruce Richardson {
68299a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
68399a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
68499a2dd95SBruce Richardson 
68599a2dd95SBruce Richardson 	VALID_DEV_OPS_OR_RET_ERR(dev, dev_id);
68699a2dd95SBruce Richardson 
68799a2dd95SBruce Richardson 	VALID_QUEUE_OR_RET_ERR(queue_id, dev);
68899a2dd95SBruce Richardson 
68999a2dd95SBruce Richardson 	if (!dev->data->queues[queue_id].started) {
69099a2dd95SBruce Richardson 		rte_bbdev_log_debug("Queue %u of device %u already stopped",
69199a2dd95SBruce Richardson 				queue_id, dev_id);
69299a2dd95SBruce Richardson 		return 0;
69399a2dd95SBruce Richardson 	}
69499a2dd95SBruce Richardson 
69599a2dd95SBruce Richardson 	if (dev->dev_ops->queue_stop) {
69699a2dd95SBruce Richardson 		int ret = dev->dev_ops->queue_stop(dev, queue_id);
69799a2dd95SBruce Richardson 		if (ret < 0) {
69899a2dd95SBruce Richardson 			rte_bbdev_log(ERR, "Device %u queue %u stop failed",
69999a2dd95SBruce Richardson 					dev_id, queue_id);
70099a2dd95SBruce Richardson 			return ret;
70199a2dd95SBruce Richardson 		}
70299a2dd95SBruce Richardson 	}
70399a2dd95SBruce Richardson 	dev->data->queues[queue_id].started = false;
70499a2dd95SBruce Richardson 
70599a2dd95SBruce Richardson 	rte_bbdev_log_debug("Stopped queue %u of device %u", queue_id, dev_id);
70699a2dd95SBruce Richardson 	return 0;
70799a2dd95SBruce Richardson }
70899a2dd95SBruce Richardson 
70999a2dd95SBruce Richardson /* Get device statistics */
71099a2dd95SBruce Richardson static void
71199a2dd95SBruce Richardson get_stats_from_queues(struct rte_bbdev *dev, struct rte_bbdev_stats *stats)
71299a2dd95SBruce Richardson {
71399a2dd95SBruce Richardson 	unsigned int q_id;
71499a2dd95SBruce Richardson 	for (q_id = 0; q_id < dev->data->num_queues; q_id++) {
71599a2dd95SBruce Richardson 		struct rte_bbdev_stats *q_stats =
71699a2dd95SBruce Richardson 				&dev->data->queues[q_id].queue_stats;
71799a2dd95SBruce Richardson 
71899a2dd95SBruce Richardson 		stats->enqueued_count += q_stats->enqueued_count;
71999a2dd95SBruce Richardson 		stats->dequeued_count += q_stats->dequeued_count;
72099a2dd95SBruce Richardson 		stats->enqueue_err_count += q_stats->enqueue_err_count;
72199a2dd95SBruce Richardson 		stats->dequeue_err_count += q_stats->dequeue_err_count;
7224f08028cSNicolas Chautru 		stats->enqueue_warn_count += q_stats->enqueue_warn_count;
7234f08028cSNicolas Chautru 		stats->dequeue_warn_count += q_stats->dequeue_warn_count;
72499a2dd95SBruce Richardson 	}
72599a2dd95SBruce Richardson 	rte_bbdev_log_debug("Got stats on %u", dev->data->dev_id);
72699a2dd95SBruce Richardson }
72799a2dd95SBruce Richardson 
72899a2dd95SBruce Richardson static void
72999a2dd95SBruce Richardson reset_stats_in_queues(struct rte_bbdev *dev)
73099a2dd95SBruce Richardson {
73199a2dd95SBruce Richardson 	unsigned int q_id;
73299a2dd95SBruce Richardson 	for (q_id = 0; q_id < dev->data->num_queues; q_id++) {
73399a2dd95SBruce Richardson 		struct rte_bbdev_stats *q_stats =
73499a2dd95SBruce Richardson 				&dev->data->queues[q_id].queue_stats;
73599a2dd95SBruce Richardson 
73699a2dd95SBruce Richardson 		memset(q_stats, 0, sizeof(*q_stats));
73799a2dd95SBruce Richardson 	}
73899a2dd95SBruce Richardson 	rte_bbdev_log_debug("Reset stats on %u", dev->data->dev_id);
73999a2dd95SBruce Richardson }
74099a2dd95SBruce Richardson 
74199a2dd95SBruce Richardson int
74299a2dd95SBruce Richardson rte_bbdev_stats_get(uint16_t dev_id, struct rte_bbdev_stats *stats)
74399a2dd95SBruce Richardson {
74499a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
74599a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
74699a2dd95SBruce Richardson 
74799a2dd95SBruce Richardson 	VALID_DEV_OPS_OR_RET_ERR(dev, dev_id);
74899a2dd95SBruce Richardson 
74999a2dd95SBruce Richardson 	if (stats == NULL) {
75099a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "NULL stats structure");
75199a2dd95SBruce Richardson 		return -EINVAL;
75299a2dd95SBruce Richardson 	}
75399a2dd95SBruce Richardson 
75499a2dd95SBruce Richardson 	memset(stats, 0, sizeof(*stats));
75599a2dd95SBruce Richardson 	if (dev->dev_ops->stats_get != NULL)
75699a2dd95SBruce Richardson 		dev->dev_ops->stats_get(dev, stats);
75799a2dd95SBruce Richardson 	else
75899a2dd95SBruce Richardson 		get_stats_from_queues(dev, stats);
75999a2dd95SBruce Richardson 
76099a2dd95SBruce Richardson 	rte_bbdev_log_debug("Retrieved stats of device %u", dev_id);
76199a2dd95SBruce Richardson 	return 0;
76299a2dd95SBruce Richardson }
76399a2dd95SBruce Richardson 
76499a2dd95SBruce Richardson int
76599a2dd95SBruce Richardson rte_bbdev_stats_reset(uint16_t dev_id)
76699a2dd95SBruce Richardson {
76799a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
76899a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
76999a2dd95SBruce Richardson 
77099a2dd95SBruce Richardson 	VALID_DEV_OPS_OR_RET_ERR(dev, dev_id);
77199a2dd95SBruce Richardson 
77299a2dd95SBruce Richardson 	if (dev->dev_ops->stats_reset != NULL)
77399a2dd95SBruce Richardson 		dev->dev_ops->stats_reset(dev);
77499a2dd95SBruce Richardson 	else
77599a2dd95SBruce Richardson 		reset_stats_in_queues(dev);
77699a2dd95SBruce Richardson 
77799a2dd95SBruce Richardson 	rte_bbdev_log_debug("Reset stats of device %u", dev_id);
77899a2dd95SBruce Richardson 	return 0;
77999a2dd95SBruce Richardson }
78099a2dd95SBruce Richardson 
78199a2dd95SBruce Richardson int
78299a2dd95SBruce Richardson rte_bbdev_info_get(uint16_t dev_id, struct rte_bbdev_info *dev_info)
78399a2dd95SBruce Richardson {
78499a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
78599a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
78699a2dd95SBruce Richardson 
78799a2dd95SBruce Richardson 	VALID_FUNC_OR_RET_ERR(dev->dev_ops->info_get, dev_id);
78899a2dd95SBruce Richardson 
78999a2dd95SBruce Richardson 	if (dev_info == NULL) {
79099a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "NULL dev info structure");
79199a2dd95SBruce Richardson 		return -EINVAL;
79299a2dd95SBruce Richardson 	}
79399a2dd95SBruce Richardson 
79499a2dd95SBruce Richardson 	/* Copy data maintained by device interface layer */
79599a2dd95SBruce Richardson 	memset(dev_info, 0, sizeof(*dev_info));
79699a2dd95SBruce Richardson 	dev_info->dev_name = dev->data->name;
79799a2dd95SBruce Richardson 	dev_info->num_queues = dev->data->num_queues;
79899a2dd95SBruce Richardson 	dev_info->device = dev->device;
79999a2dd95SBruce Richardson 	dev_info->socket_id = dev->data->socket_id;
80099a2dd95SBruce Richardson 	dev_info->started = dev->data->started;
80199a2dd95SBruce Richardson 
80299a2dd95SBruce Richardson 	/* Copy data maintained by device driver layer */
80399a2dd95SBruce Richardson 	dev->dev_ops->info_get(dev, &dev_info->drv);
80499a2dd95SBruce Richardson 
80599a2dd95SBruce Richardson 	rte_bbdev_log_debug("Retrieved info of device %u", dev_id);
80699a2dd95SBruce Richardson 	return 0;
80799a2dd95SBruce Richardson }
80899a2dd95SBruce Richardson 
80999a2dd95SBruce Richardson int
81099a2dd95SBruce Richardson rte_bbdev_queue_info_get(uint16_t dev_id, uint16_t queue_id,
81199a2dd95SBruce Richardson 		struct rte_bbdev_queue_info *queue_info)
81299a2dd95SBruce Richardson {
81399a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
81499a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
81599a2dd95SBruce Richardson 
81699a2dd95SBruce Richardson 	VALID_QUEUE_OR_RET_ERR(queue_id, dev);
81799a2dd95SBruce Richardson 
81899a2dd95SBruce Richardson 	if (queue_info == NULL) {
81999a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "NULL queue info structure");
82099a2dd95SBruce Richardson 		return -EINVAL;
82199a2dd95SBruce Richardson 	}
82299a2dd95SBruce Richardson 
82399a2dd95SBruce Richardson 	/* Copy data to output */
82499a2dd95SBruce Richardson 	memset(queue_info, 0, sizeof(*queue_info));
82599a2dd95SBruce Richardson 	queue_info->conf = dev->data->queues[queue_id].conf;
82699a2dd95SBruce Richardson 	queue_info->started = dev->data->queues[queue_id].started;
82799a2dd95SBruce Richardson 
82899a2dd95SBruce Richardson 	rte_bbdev_log_debug("Retrieved info of queue %u of device %u",
82999a2dd95SBruce Richardson 			queue_id, dev_id);
83099a2dd95SBruce Richardson 	return 0;
83199a2dd95SBruce Richardson }
83299a2dd95SBruce Richardson 
83399a2dd95SBruce Richardson /* Calculate size needed to store bbdev_op, depending on type */
83499a2dd95SBruce Richardson static unsigned int
83599a2dd95SBruce Richardson get_bbdev_op_size(enum rte_bbdev_op_type type)
83699a2dd95SBruce Richardson {
83799a2dd95SBruce Richardson 	unsigned int result = 0;
83899a2dd95SBruce Richardson 	switch (type) {
83999a2dd95SBruce Richardson 	case RTE_BBDEV_OP_NONE:
84099a2dd95SBruce Richardson 		result = RTE_MAX(sizeof(struct rte_bbdev_dec_op),
84199a2dd95SBruce Richardson 				sizeof(struct rte_bbdev_enc_op));
84299a2dd95SBruce Richardson 		break;
84399a2dd95SBruce Richardson 	case RTE_BBDEV_OP_TURBO_DEC:
84499a2dd95SBruce Richardson 		result = sizeof(struct rte_bbdev_dec_op);
84599a2dd95SBruce Richardson 		break;
84699a2dd95SBruce Richardson 	case RTE_BBDEV_OP_TURBO_ENC:
84799a2dd95SBruce Richardson 		result = sizeof(struct rte_bbdev_enc_op);
84899a2dd95SBruce Richardson 		break;
84999a2dd95SBruce Richardson 	case RTE_BBDEV_OP_LDPC_DEC:
85099a2dd95SBruce Richardson 		result = sizeof(struct rte_bbdev_dec_op);
85199a2dd95SBruce Richardson 		break;
85299a2dd95SBruce Richardson 	case RTE_BBDEV_OP_LDPC_ENC:
85399a2dd95SBruce Richardson 		result = sizeof(struct rte_bbdev_enc_op);
85499a2dd95SBruce Richardson 		break;
8559d393325SNicolas Chautru 	case RTE_BBDEV_OP_FFT:
8569d393325SNicolas Chautru 		result = sizeof(struct rte_bbdev_fft_op);
8579d393325SNicolas Chautru 		break;
858089148fcSNicolas Chautru 	case RTE_BBDEV_OP_MLDTS:
859089148fcSNicolas Chautru 		result = sizeof(struct rte_bbdev_mldts_op);
860089148fcSNicolas Chautru 		break;
86199a2dd95SBruce Richardson 	default:
86299a2dd95SBruce Richardson 		break;
86399a2dd95SBruce Richardson 	}
86499a2dd95SBruce Richardson 
86599a2dd95SBruce Richardson 	return result;
86699a2dd95SBruce Richardson }
86799a2dd95SBruce Richardson 
86899a2dd95SBruce Richardson /* Initialise a bbdev_op structure */
86999a2dd95SBruce Richardson static void
87099a2dd95SBruce Richardson bbdev_op_init(struct rte_mempool *mempool, void *arg, void *element,
87199a2dd95SBruce Richardson 		__rte_unused unsigned int n)
87299a2dd95SBruce Richardson {
87399a2dd95SBruce Richardson 	enum rte_bbdev_op_type type = *(enum rte_bbdev_op_type *)arg;
87499a2dd95SBruce Richardson 
87599a2dd95SBruce Richardson 	if (type == RTE_BBDEV_OP_TURBO_DEC || type == RTE_BBDEV_OP_LDPC_DEC) {
87699a2dd95SBruce Richardson 		struct rte_bbdev_dec_op *op = element;
87799a2dd95SBruce Richardson 		memset(op, 0, mempool->elt_size);
87899a2dd95SBruce Richardson 		op->mempool = mempool;
87999a2dd95SBruce Richardson 	} else if (type == RTE_BBDEV_OP_TURBO_ENC ||
88099a2dd95SBruce Richardson 			type == RTE_BBDEV_OP_LDPC_ENC) {
88199a2dd95SBruce Richardson 		struct rte_bbdev_enc_op *op = element;
88299a2dd95SBruce Richardson 		memset(op, 0, mempool->elt_size);
88399a2dd95SBruce Richardson 		op->mempool = mempool;
8849d393325SNicolas Chautru 	} else if (type == RTE_BBDEV_OP_FFT) {
8859d393325SNicolas Chautru 		struct rte_bbdev_fft_op *op = element;
8869d393325SNicolas Chautru 		memset(op, 0, mempool->elt_size);
8879d393325SNicolas Chautru 		op->mempool = mempool;
888089148fcSNicolas Chautru 	} else if (type == RTE_BBDEV_OP_MLDTS) {
889089148fcSNicolas Chautru 		struct rte_bbdev_mldts_op *op = element;
890089148fcSNicolas Chautru 		memset(op, 0, mempool->elt_size);
891089148fcSNicolas Chautru 		op->mempool = mempool;
89299a2dd95SBruce Richardson 	}
89399a2dd95SBruce Richardson }
89499a2dd95SBruce Richardson 
89599a2dd95SBruce Richardson struct rte_mempool *
89699a2dd95SBruce Richardson rte_bbdev_op_pool_create(const char *name, enum rte_bbdev_op_type type,
89799a2dd95SBruce Richardson 		unsigned int num_elements, unsigned int cache_size,
89899a2dd95SBruce Richardson 		int socket_id)
89999a2dd95SBruce Richardson {
90099a2dd95SBruce Richardson 	struct rte_bbdev_op_pool_private *priv;
90199a2dd95SBruce Richardson 	struct rte_mempool *mp;
90299a2dd95SBruce Richardson 	const char *op_type_str;
90399a2dd95SBruce Richardson 
90499a2dd95SBruce Richardson 	if (name == NULL) {
90599a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "NULL name for op pool");
90699a2dd95SBruce Richardson 		return NULL;
90799a2dd95SBruce Richardson 	}
90899a2dd95SBruce Richardson 
909e70212ccSNicolas Chautru 	if (type >= BBDEV_OP_TYPE_COUNT) {
91099a2dd95SBruce Richardson 		rte_bbdev_log(ERR,
91199a2dd95SBruce Richardson 				"Invalid op type (%u), should be less than %u",
912e70212ccSNicolas Chautru 				type, BBDEV_OP_TYPE_COUNT);
91399a2dd95SBruce Richardson 		return NULL;
91499a2dd95SBruce Richardson 	}
91599a2dd95SBruce Richardson 
91699a2dd95SBruce Richardson 	mp = rte_mempool_create(name, num_elements, get_bbdev_op_size(type),
91799a2dd95SBruce Richardson 			cache_size, sizeof(struct rte_bbdev_op_pool_private),
91899a2dd95SBruce Richardson 			NULL, NULL, bbdev_op_init, &type, socket_id, 0);
91999a2dd95SBruce Richardson 	if (mp == NULL) {
92099a2dd95SBruce Richardson 		rte_bbdev_log(ERR,
92199a2dd95SBruce Richardson 				"Failed to create op pool %s (num ops=%u, op size=%u) with error: %s",
92299a2dd95SBruce Richardson 				name, num_elements, get_bbdev_op_size(type),
92399a2dd95SBruce Richardson 				rte_strerror(rte_errno));
92499a2dd95SBruce Richardson 		return NULL;
92599a2dd95SBruce Richardson 	}
92699a2dd95SBruce Richardson 
92799a2dd95SBruce Richardson 	op_type_str = rte_bbdev_op_type_str(type);
92899a2dd95SBruce Richardson 	if (op_type_str == NULL)
92999a2dd95SBruce Richardson 		return NULL;
93099a2dd95SBruce Richardson 
93199a2dd95SBruce Richardson 	rte_bbdev_log_debug(
93299a2dd95SBruce Richardson 			"Op pool %s created for %u ops (type=%s, cache=%u, socket=%u, size=%u)",
93399a2dd95SBruce Richardson 			name, num_elements, op_type_str, cache_size, socket_id,
93499a2dd95SBruce Richardson 			get_bbdev_op_size(type));
93599a2dd95SBruce Richardson 
93699a2dd95SBruce Richardson 	priv = (struct rte_bbdev_op_pool_private *)rte_mempool_get_priv(mp);
93799a2dd95SBruce Richardson 	priv->type = type;
93899a2dd95SBruce Richardson 
93999a2dd95SBruce Richardson 	return mp;
94099a2dd95SBruce Richardson }
94199a2dd95SBruce Richardson 
94299a2dd95SBruce Richardson int
94399a2dd95SBruce Richardson rte_bbdev_callback_register(uint16_t dev_id, enum rte_bbdev_event_type event,
94499a2dd95SBruce Richardson 		rte_bbdev_cb_fn cb_fn, void *cb_arg)
94599a2dd95SBruce Richardson {
94699a2dd95SBruce Richardson 	struct rte_bbdev_callback *user_cb;
94799a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
94899a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
94999a2dd95SBruce Richardson 
95099a2dd95SBruce Richardson 	if (event >= RTE_BBDEV_EVENT_MAX) {
95199a2dd95SBruce Richardson 		rte_bbdev_log(ERR,
95299a2dd95SBruce Richardson 				"Invalid event type (%u), should be less than %u",
95399a2dd95SBruce Richardson 				event, RTE_BBDEV_EVENT_MAX);
95499a2dd95SBruce Richardson 		return -EINVAL;
95599a2dd95SBruce Richardson 	}
95699a2dd95SBruce Richardson 
95799a2dd95SBruce Richardson 	if (cb_fn == NULL) {
95899a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "NULL callback function");
95999a2dd95SBruce Richardson 		return -EINVAL;
96099a2dd95SBruce Richardson 	}
96199a2dd95SBruce Richardson 
96299a2dd95SBruce Richardson 	rte_spinlock_lock(&rte_bbdev_cb_lock);
96399a2dd95SBruce Richardson 
96499a2dd95SBruce Richardson 	TAILQ_FOREACH(user_cb, &(dev->list_cbs), next) {
96599a2dd95SBruce Richardson 		if (user_cb->cb_fn == cb_fn &&
96699a2dd95SBruce Richardson 				user_cb->cb_arg == cb_arg &&
96799a2dd95SBruce Richardson 				user_cb->event == event)
96899a2dd95SBruce Richardson 			break;
96999a2dd95SBruce Richardson 	}
97099a2dd95SBruce Richardson 
97199a2dd95SBruce Richardson 	/* create a new callback. */
97299a2dd95SBruce Richardson 	if (user_cb == NULL) {
97399a2dd95SBruce Richardson 		user_cb = rte_zmalloc("INTR_USER_CALLBACK",
97499a2dd95SBruce Richardson 				sizeof(struct rte_bbdev_callback), 0);
97599a2dd95SBruce Richardson 		if (user_cb != NULL) {
97699a2dd95SBruce Richardson 			user_cb->cb_fn = cb_fn;
97799a2dd95SBruce Richardson 			user_cb->cb_arg = cb_arg;
97899a2dd95SBruce Richardson 			user_cb->event = event;
97999a2dd95SBruce Richardson 			TAILQ_INSERT_TAIL(&(dev->list_cbs), user_cb, next);
98099a2dd95SBruce Richardson 		}
98199a2dd95SBruce Richardson 	}
98299a2dd95SBruce Richardson 
98399a2dd95SBruce Richardson 	rte_spinlock_unlock(&rte_bbdev_cb_lock);
98499a2dd95SBruce Richardson 	return (user_cb == NULL) ? -ENOMEM : 0;
98599a2dd95SBruce Richardson }
98699a2dd95SBruce Richardson 
98799a2dd95SBruce Richardson int
98899a2dd95SBruce Richardson rte_bbdev_callback_unregister(uint16_t dev_id, enum rte_bbdev_event_type event,
98999a2dd95SBruce Richardson 		rte_bbdev_cb_fn cb_fn, void *cb_arg)
99099a2dd95SBruce Richardson {
99199a2dd95SBruce Richardson 	int ret = 0;
99299a2dd95SBruce Richardson 	struct rte_bbdev_callback *cb, *next;
99399a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
99499a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
99599a2dd95SBruce Richardson 
99699a2dd95SBruce Richardson 	if (event >= RTE_BBDEV_EVENT_MAX) {
99799a2dd95SBruce Richardson 		rte_bbdev_log(ERR,
99899a2dd95SBruce Richardson 				"Invalid event type (%u), should be less than %u",
99999a2dd95SBruce Richardson 				event, RTE_BBDEV_EVENT_MAX);
100099a2dd95SBruce Richardson 		return -EINVAL;
100199a2dd95SBruce Richardson 	}
100299a2dd95SBruce Richardson 
100399a2dd95SBruce Richardson 	if (cb_fn == NULL) {
100499a2dd95SBruce Richardson 		rte_bbdev_log(ERR,
100599a2dd95SBruce Richardson 				"NULL callback function cannot be unregistered");
100699a2dd95SBruce Richardson 		return -EINVAL;
100799a2dd95SBruce Richardson 	}
100899a2dd95SBruce Richardson 
100999a2dd95SBruce Richardson 	dev = &rte_bbdev_devices[dev_id];
101099a2dd95SBruce Richardson 	rte_spinlock_lock(&rte_bbdev_cb_lock);
101199a2dd95SBruce Richardson 
101299a2dd95SBruce Richardson 	for (cb = TAILQ_FIRST(&dev->list_cbs); cb != NULL; cb = next) {
101399a2dd95SBruce Richardson 
101499a2dd95SBruce Richardson 		next = TAILQ_NEXT(cb, next);
101599a2dd95SBruce Richardson 
101699a2dd95SBruce Richardson 		if (cb->cb_fn != cb_fn || cb->event != event ||
101799a2dd95SBruce Richardson 				(cb_arg != (void *)-1 && cb->cb_arg != cb_arg))
101899a2dd95SBruce Richardson 			continue;
101999a2dd95SBruce Richardson 
102099a2dd95SBruce Richardson 		/* If this callback is not executing right now, remove it. */
102199a2dd95SBruce Richardson 		if (cb->active == 0) {
102299a2dd95SBruce Richardson 			TAILQ_REMOVE(&(dev->list_cbs), cb, next);
102399a2dd95SBruce Richardson 			rte_free(cb);
102499a2dd95SBruce Richardson 		} else
102599a2dd95SBruce Richardson 			ret = -EAGAIN;
102699a2dd95SBruce Richardson 	}
102799a2dd95SBruce Richardson 
102899a2dd95SBruce Richardson 	rte_spinlock_unlock(&rte_bbdev_cb_lock);
102999a2dd95SBruce Richardson 	return ret;
103099a2dd95SBruce Richardson }
103199a2dd95SBruce Richardson 
103299a2dd95SBruce Richardson void
103399a2dd95SBruce Richardson rte_bbdev_pmd_callback_process(struct rte_bbdev *dev,
103499a2dd95SBruce Richardson 	enum rte_bbdev_event_type event, void *ret_param)
103599a2dd95SBruce Richardson {
103699a2dd95SBruce Richardson 	struct rte_bbdev_callback *cb_lst;
103799a2dd95SBruce Richardson 	struct rte_bbdev_callback dev_cb;
103899a2dd95SBruce Richardson 
103999a2dd95SBruce Richardson 	if (dev == NULL) {
104099a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "NULL device");
104199a2dd95SBruce Richardson 		return;
104299a2dd95SBruce Richardson 	}
104399a2dd95SBruce Richardson 
104499a2dd95SBruce Richardson 	if (dev->data == NULL) {
104599a2dd95SBruce Richardson 		rte_bbdev_log(ERR, "NULL data structure");
104699a2dd95SBruce Richardson 		return;
104799a2dd95SBruce Richardson 	}
104899a2dd95SBruce Richardson 
104999a2dd95SBruce Richardson 	if (event >= RTE_BBDEV_EVENT_MAX) {
105099a2dd95SBruce Richardson 		rte_bbdev_log(ERR,
105199a2dd95SBruce Richardson 				"Invalid event type (%u), should be less than %u",
105299a2dd95SBruce Richardson 				event, RTE_BBDEV_EVENT_MAX);
105399a2dd95SBruce Richardson 		return;
105499a2dd95SBruce Richardson 	}
105599a2dd95SBruce Richardson 
105699a2dd95SBruce Richardson 	rte_spinlock_lock(&rte_bbdev_cb_lock);
105799a2dd95SBruce Richardson 	TAILQ_FOREACH(cb_lst, &(dev->list_cbs), next) {
105899a2dd95SBruce Richardson 		if (cb_lst->cb_fn == NULL || cb_lst->event != event)
105999a2dd95SBruce Richardson 			continue;
106099a2dd95SBruce Richardson 		dev_cb = *cb_lst;
106199a2dd95SBruce Richardson 		cb_lst->active = 1;
106299a2dd95SBruce Richardson 		if (ret_param != NULL)
106399a2dd95SBruce Richardson 			dev_cb.ret_param = ret_param;
106499a2dd95SBruce Richardson 
106599a2dd95SBruce Richardson 		rte_spinlock_unlock(&rte_bbdev_cb_lock);
106699a2dd95SBruce Richardson 		dev_cb.cb_fn(dev->data->dev_id, dev_cb.event,
106799a2dd95SBruce Richardson 				dev_cb.cb_arg, dev_cb.ret_param);
106899a2dd95SBruce Richardson 		rte_spinlock_lock(&rte_bbdev_cb_lock);
106999a2dd95SBruce Richardson 		cb_lst->active = 0;
107099a2dd95SBruce Richardson 	}
107199a2dd95SBruce Richardson 	rte_spinlock_unlock(&rte_bbdev_cb_lock);
107299a2dd95SBruce Richardson }
107399a2dd95SBruce Richardson 
107499a2dd95SBruce Richardson int
107599a2dd95SBruce Richardson rte_bbdev_queue_intr_enable(uint16_t dev_id, uint16_t queue_id)
107699a2dd95SBruce Richardson {
107799a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
107899a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
107999a2dd95SBruce Richardson 	VALID_QUEUE_OR_RET_ERR(queue_id, dev);
108099a2dd95SBruce Richardson 	VALID_DEV_OPS_OR_RET_ERR(dev, dev_id);
108199a2dd95SBruce Richardson 	VALID_FUNC_OR_RET_ERR(dev->dev_ops->queue_intr_enable, dev_id);
108299a2dd95SBruce Richardson 	return dev->dev_ops->queue_intr_enable(dev, queue_id);
108399a2dd95SBruce Richardson }
108499a2dd95SBruce Richardson 
108599a2dd95SBruce Richardson int
108699a2dd95SBruce Richardson rte_bbdev_queue_intr_disable(uint16_t dev_id, uint16_t queue_id)
108799a2dd95SBruce Richardson {
108899a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
108999a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
109099a2dd95SBruce Richardson 	VALID_QUEUE_OR_RET_ERR(queue_id, dev);
109199a2dd95SBruce Richardson 	VALID_DEV_OPS_OR_RET_ERR(dev, dev_id);
109299a2dd95SBruce Richardson 	VALID_FUNC_OR_RET_ERR(dev->dev_ops->queue_intr_disable, dev_id);
109399a2dd95SBruce Richardson 	return dev->dev_ops->queue_intr_disable(dev, queue_id);
109499a2dd95SBruce Richardson }
109599a2dd95SBruce Richardson 
109699a2dd95SBruce Richardson int
109799a2dd95SBruce Richardson rte_bbdev_queue_intr_ctl(uint16_t dev_id, uint16_t queue_id, int epfd, int op,
109899a2dd95SBruce Richardson 		void *data)
109999a2dd95SBruce Richardson {
110099a2dd95SBruce Richardson 	uint32_t vec;
110199a2dd95SBruce Richardson 	struct rte_bbdev *dev = get_dev(dev_id);
110299a2dd95SBruce Richardson 	struct rte_intr_handle *intr_handle;
110399a2dd95SBruce Richardson 	int ret;
110499a2dd95SBruce Richardson 
110599a2dd95SBruce Richardson 	VALID_DEV_OR_RET_ERR(dev, dev_id);
110699a2dd95SBruce Richardson 	VALID_QUEUE_OR_RET_ERR(queue_id, dev);
110799a2dd95SBruce Richardson 
110899a2dd95SBruce Richardson 	intr_handle = dev->intr_handle;
1109c2bd9367SHarman Kalra 	if (intr_handle == NULL) {
1110ae282b06SDavid Marchand 		rte_bbdev_log(ERR, "Device %u intr handle unset", dev_id);
111199a2dd95SBruce Richardson 		return -ENOTSUP;
111299a2dd95SBruce Richardson 	}
111399a2dd95SBruce Richardson 
111499a2dd95SBruce Richardson 	if (queue_id >= RTE_MAX_RXTX_INTR_VEC_ID) {
1115ae282b06SDavid Marchand 		rte_bbdev_log(ERR, "Device %u queue_id %u is too big",
111699a2dd95SBruce Richardson 				dev_id, queue_id);
111799a2dd95SBruce Richardson 		return -ENOTSUP;
111899a2dd95SBruce Richardson 	}
111999a2dd95SBruce Richardson 
1120c2bd9367SHarman Kalra 	vec = rte_intr_vec_list_index_get(intr_handle, queue_id);
112199a2dd95SBruce Richardson 	ret = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
112299a2dd95SBruce Richardson 	if (ret && (ret != -EEXIST)) {
112399a2dd95SBruce Richardson 		rte_bbdev_log(ERR,
1124ae282b06SDavid Marchand 				"dev %u q %u int ctl error op %d epfd %d vec %u",
112599a2dd95SBruce Richardson 				dev_id, queue_id, op, epfd, vec);
112699a2dd95SBruce Richardson 		return ret;
112799a2dd95SBruce Richardson 	}
112899a2dd95SBruce Richardson 
112999a2dd95SBruce Richardson 	return 0;
113099a2dd95SBruce Richardson }
113199a2dd95SBruce Richardson 
113299a2dd95SBruce Richardson 
113399a2dd95SBruce Richardson const char *
113499a2dd95SBruce Richardson rte_bbdev_op_type_str(enum rte_bbdev_op_type op_type)
113599a2dd95SBruce Richardson {
113699a2dd95SBruce Richardson 	static const char * const op_types[] = {
113799a2dd95SBruce Richardson 		"RTE_BBDEV_OP_NONE",
113899a2dd95SBruce Richardson 		"RTE_BBDEV_OP_TURBO_DEC",
113999a2dd95SBruce Richardson 		"RTE_BBDEV_OP_TURBO_ENC",
114099a2dd95SBruce Richardson 		"RTE_BBDEV_OP_LDPC_DEC",
114199a2dd95SBruce Richardson 		"RTE_BBDEV_OP_LDPC_ENC",
11429d393325SNicolas Chautru 		"RTE_BBDEV_OP_FFT",
1143089148fcSNicolas Chautru 		"RTE_BBDEV_OP_MLDTS",
114499a2dd95SBruce Richardson 	};
114599a2dd95SBruce Richardson 
1146e70212ccSNicolas Chautru 	if (op_type < BBDEV_OP_TYPE_COUNT)
114799a2dd95SBruce Richardson 		return op_types[op_type];
114899a2dd95SBruce Richardson 
114999a2dd95SBruce Richardson 	rte_bbdev_log(ERR, "Invalid operation type");
115099a2dd95SBruce Richardson 	return NULL;
115199a2dd95SBruce Richardson }
11521be86f2eSNicolas Chautru 
11531be86f2eSNicolas Chautru const char *
11541be86f2eSNicolas Chautru rte_bbdev_device_status_str(enum rte_bbdev_device_status status)
11551be86f2eSNicolas Chautru {
11561be86f2eSNicolas Chautru 	static const char * const dev_sta_string[] = {
11571be86f2eSNicolas Chautru 		"RTE_BBDEV_DEV_NOSTATUS",
11581be86f2eSNicolas Chautru 		"RTE_BBDEV_DEV_NOT_SUPPORTED",
11591be86f2eSNicolas Chautru 		"RTE_BBDEV_DEV_RESET",
11601be86f2eSNicolas Chautru 		"RTE_BBDEV_DEV_CONFIGURED",
11611be86f2eSNicolas Chautru 		"RTE_BBDEV_DEV_ACTIVE",
11621be86f2eSNicolas Chautru 		"RTE_BBDEV_DEV_FATAL_ERR",
11631be86f2eSNicolas Chautru 		"RTE_BBDEV_DEV_RESTART_REQ",
11641be86f2eSNicolas Chautru 		"RTE_BBDEV_DEV_RECONFIG_REQ",
11651be86f2eSNicolas Chautru 		"RTE_BBDEV_DEV_CORRECT_ERR",
11661be86f2eSNicolas Chautru 	};
11671be86f2eSNicolas Chautru 
1168a53a025bSNicolas Chautru 	/* Cast from enum required for clang. */
1169a53a025bSNicolas Chautru 	if ((uint8_t)status < sizeof(dev_sta_string) / sizeof(char *))
11701be86f2eSNicolas Chautru 		return dev_sta_string[status];
11711be86f2eSNicolas Chautru 
11721be86f2eSNicolas Chautru 	rte_bbdev_log(ERR, "Invalid device status");
11731be86f2eSNicolas Chautru 	return NULL;
11741be86f2eSNicolas Chautru }
11754f08028cSNicolas Chautru 
11764f08028cSNicolas Chautru const char *
11774f08028cSNicolas Chautru rte_bbdev_enqueue_status_str(enum rte_bbdev_enqueue_status status)
11784f08028cSNicolas Chautru {
11794f08028cSNicolas Chautru 	static const char * const enq_sta_string[] = {
11804f08028cSNicolas Chautru 		"RTE_BBDEV_ENQ_STATUS_NONE",
11814f08028cSNicolas Chautru 		"RTE_BBDEV_ENQ_STATUS_QUEUE_FULL",
11824f08028cSNicolas Chautru 		"RTE_BBDEV_ENQ_STATUS_RING_FULL",
11834f08028cSNicolas Chautru 		"RTE_BBDEV_ENQ_STATUS_INVALID_OP",
11844f08028cSNicolas Chautru 	};
11854f08028cSNicolas Chautru 
1186a53a025bSNicolas Chautru 	/* Cast from enum required for clang. */
1187a53a025bSNicolas Chautru 	if ((uint8_t)status < sizeof(enq_sta_string) / sizeof(char *))
11884f08028cSNicolas Chautru 		return enq_sta_string[status];
11894f08028cSNicolas Chautru 
11904f08028cSNicolas Chautru 	rte_bbdev_log(ERR, "Invalid enqueue status");
11914f08028cSNicolas Chautru 	return NULL;
11924f08028cSNicolas Chautru }
1193*353e3639SNicolas Chautru 
1194*353e3639SNicolas Chautru 
1195*353e3639SNicolas Chautru int
1196*353e3639SNicolas Chautru rte_bbdev_queue_ops_dump(uint16_t dev_id, uint16_t queue_id, FILE *f)
1197*353e3639SNicolas Chautru {
1198*353e3639SNicolas Chautru 	struct rte_bbdev_queue_data *q_data;
1199*353e3639SNicolas Chautru 	struct rte_bbdev_stats *stats;
1200*353e3639SNicolas Chautru 	uint16_t i;
1201*353e3639SNicolas Chautru 	struct rte_bbdev *dev = get_dev(dev_id);
1202*353e3639SNicolas Chautru 
1203*353e3639SNicolas Chautru 	VALID_DEV_OR_RET_ERR(dev, dev_id);
1204*353e3639SNicolas Chautru 	VALID_QUEUE_OR_RET_ERR(queue_id, dev);
1205*353e3639SNicolas Chautru 	VALID_DEV_OPS_OR_RET_ERR(dev, dev_id);
1206*353e3639SNicolas Chautru 	VALID_FUNC_OR_RET_ERR(dev->dev_ops->queue_ops_dump, dev_id);
1207*353e3639SNicolas Chautru 
1208*353e3639SNicolas Chautru 	q_data = &dev->data->queues[queue_id];
1209*353e3639SNicolas Chautru 
1210*353e3639SNicolas Chautru 	if (f == NULL)
1211*353e3639SNicolas Chautru 		return -EINVAL;
1212*353e3639SNicolas Chautru 
1213*353e3639SNicolas Chautru 	fprintf(f, "Dump of operations on %s queue %d\n",
1214*353e3639SNicolas Chautru 			dev->data->name, queue_id);
1215*353e3639SNicolas Chautru 	fprintf(f, "  Last Enqueue Status %s\n",
1216*353e3639SNicolas Chautru 			rte_bbdev_enqueue_status_str(q_data->enqueue_status));
1217*353e3639SNicolas Chautru 	for (i = 0; i < RTE_BBDEV_ENQ_STATUS_SIZE_MAX; i++)
1218*353e3639SNicolas Chautru 		if (q_data->queue_stats.enqueue_status_count[i] > 0)
1219*353e3639SNicolas Chautru 			fprintf(f, "  Enqueue Status Counters %s %" PRIu64 "\n",
1220*353e3639SNicolas Chautru 					rte_bbdev_enqueue_status_str(i),
1221*353e3639SNicolas Chautru 					q_data->queue_stats.enqueue_status_count[i]);
1222*353e3639SNicolas Chautru 	stats = &dev->data->queues[queue_id].queue_stats;
1223*353e3639SNicolas Chautru 
1224*353e3639SNicolas Chautru 	fprintf(f, "  Enqueue Count %" PRIu64 " Warning %" PRIu64 " Error %" PRIu64 "\n",
1225*353e3639SNicolas Chautru 			stats->enqueued_count, stats->enqueue_warn_count,
1226*353e3639SNicolas Chautru 			stats->enqueue_err_count);
1227*353e3639SNicolas Chautru 	fprintf(f, "  Dequeue Count %" PRIu64 " Warning %" PRIu64 " Error %" PRIu64 "\n",
1228*353e3639SNicolas Chautru 			stats->dequeued_count, stats->dequeue_warn_count,
1229*353e3639SNicolas Chautru 			stats->dequeue_err_count);
1230*353e3639SNicolas Chautru 
1231*353e3639SNicolas Chautru 	return dev->dev_ops->queue_ops_dump(dev, queue_id, f);
1232*353e3639SNicolas Chautru }
1233*353e3639SNicolas Chautru 
1234*353e3639SNicolas Chautru char *
1235*353e3639SNicolas Chautru rte_bbdev_ops_param_string(void *op, enum rte_bbdev_op_type op_type, char *str, uint32_t len)
1236*353e3639SNicolas Chautru {
1237*353e3639SNicolas Chautru 	static char partial[1024];
1238*353e3639SNicolas Chautru 	struct rte_bbdev_dec_op *op_dec;
1239*353e3639SNicolas Chautru 	struct rte_bbdev_enc_op *op_enc;
1240*353e3639SNicolas Chautru 	struct rte_bbdev_fft_op *op_fft;
1241*353e3639SNicolas Chautru 	struct rte_bbdev_mldts_op *op_mldts;
1242*353e3639SNicolas Chautru 
1243*353e3639SNicolas Chautru 	rte_iova_t add0 = 0, add1 = 0, add2 = 0, add3 = 0, add4 = 0;
1244*353e3639SNicolas Chautru 
1245*353e3639SNicolas Chautru 	if (op == NULL) {
1246*353e3639SNicolas Chautru 		snprintf(str, len, "Invalid Operation pointer\n");
1247*353e3639SNicolas Chautru 		return str;
1248*353e3639SNicolas Chautru 	}
1249*353e3639SNicolas Chautru 
1250*353e3639SNicolas Chautru 	if (op_type == RTE_BBDEV_OP_LDPC_DEC) {
1251*353e3639SNicolas Chautru 		op_dec = op;
1252*353e3639SNicolas Chautru 		if (op_dec->ldpc_dec.code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK)
1253*353e3639SNicolas Chautru 			snprintf(partial, sizeof(partial), "C %d Cab %d Ea %d Eb %d r %d",
1254*353e3639SNicolas Chautru 					op_dec->ldpc_dec.tb_params.c,
1255*353e3639SNicolas Chautru 					op_dec->ldpc_dec.tb_params.cab,
1256*353e3639SNicolas Chautru 					op_dec->ldpc_dec.tb_params.ea,
1257*353e3639SNicolas Chautru 					op_dec->ldpc_dec.tb_params.eb,
1258*353e3639SNicolas Chautru 					op_dec->ldpc_dec.tb_params.r);
1259*353e3639SNicolas Chautru 		else
1260*353e3639SNicolas Chautru 			snprintf(partial, sizeof(partial), "E %d", op_dec->ldpc_dec.cb_params.e);
1261*353e3639SNicolas Chautru 		if (op_dec->ldpc_dec.input.data != NULL)
1262*353e3639SNicolas Chautru 			add0 = rte_pktmbuf_iova_offset(op_dec->ldpc_dec.input.data, 0);
1263*353e3639SNicolas Chautru 		if (op_dec->ldpc_dec.hard_output.data != NULL)
1264*353e3639SNicolas Chautru 			add1 = rte_pktmbuf_iova_offset(op_dec->ldpc_dec.hard_output.data, 0);
1265*353e3639SNicolas Chautru 		if (op_dec->ldpc_dec.soft_output.data != NULL)
1266*353e3639SNicolas Chautru 			add2 = rte_pktmbuf_iova_offset(op_dec->ldpc_dec.soft_output.data, 0);
1267*353e3639SNicolas Chautru 		if (op_dec->ldpc_dec.harq_combined_input.data != NULL)
1268*353e3639SNicolas Chautru 			add3 = rte_pktmbuf_iova_offset(op_dec->ldpc_dec.harq_combined_input.data,
1269*353e3639SNicolas Chautru 					0);
1270*353e3639SNicolas Chautru 		if (op_dec->ldpc_dec.harq_combined_output.data != NULL)
1271*353e3639SNicolas Chautru 			add4 = rte_pktmbuf_iova_offset(op_dec->ldpc_dec.harq_combined_output.data,
1272*353e3639SNicolas Chautru 					0);
1273*353e3639SNicolas Chautru 		snprintf(str, len, "op %x st %x BG %d Zc %d Ncb %d qm %d F %d Rv %d It %d It %d "
1274*353e3639SNicolas Chautru 			"HARQin %d in %" PRIx64 " ho %" PRIx64 " so %" PRIx64 " hi %" PRIx64 " "
1275*353e3639SNicolas Chautru 			"ho %" PRIx64 " %s\n",
1276*353e3639SNicolas Chautru 			op_dec->ldpc_dec.op_flags, op_dec->status,
1277*353e3639SNicolas Chautru 			op_dec->ldpc_dec.basegraph, op_dec->ldpc_dec.z_c,
1278*353e3639SNicolas Chautru 			op_dec->ldpc_dec.n_cb, op_dec->ldpc_dec.q_m,
1279*353e3639SNicolas Chautru 			op_dec->ldpc_dec.n_filler, op_dec->ldpc_dec.rv_index,
1280*353e3639SNicolas Chautru 			op_dec->ldpc_dec.iter_max, op_dec->ldpc_dec.iter_count,
1281*353e3639SNicolas Chautru 			op_dec->ldpc_dec.harq_combined_input.length,
1282*353e3639SNicolas Chautru 			add0, add1, add2, add3, add4, partial);
1283*353e3639SNicolas Chautru 	} else if (op_type == RTE_BBDEV_OP_TURBO_DEC) {
1284*353e3639SNicolas Chautru 		op_dec = op;
1285*353e3639SNicolas Chautru 		if (op_dec->turbo_dec.code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK)
1286*353e3639SNicolas Chautru 			snprintf(partial, sizeof(partial), "C %d Cab %d Ea %d Eb %d r %d K %d",
1287*353e3639SNicolas Chautru 					op_dec->turbo_dec.tb_params.c,
1288*353e3639SNicolas Chautru 					op_dec->turbo_dec.tb_params.cab,
1289*353e3639SNicolas Chautru 					op_dec->turbo_dec.tb_params.ea,
1290*353e3639SNicolas Chautru 					op_dec->turbo_dec.tb_params.eb,
1291*353e3639SNicolas Chautru 					op_dec->turbo_dec.tb_params.r,
1292*353e3639SNicolas Chautru 					op_dec->turbo_dec.tb_params.k_neg);
1293*353e3639SNicolas Chautru 		else
1294*353e3639SNicolas Chautru 			snprintf(partial, sizeof(partial), "E %d K %d",
1295*353e3639SNicolas Chautru 					op_dec->turbo_dec.cb_params.e,
1296*353e3639SNicolas Chautru 					op_dec->turbo_dec.cb_params.k);
1297*353e3639SNicolas Chautru 		if (op_dec->turbo_dec.input.data != NULL)
1298*353e3639SNicolas Chautru 			add0 = rte_pktmbuf_iova_offset(op_dec->turbo_dec.input.data, 0);
1299*353e3639SNicolas Chautru 		if (op_dec->turbo_dec.hard_output.data != NULL)
1300*353e3639SNicolas Chautru 			add1 = rte_pktmbuf_iova_offset(op_dec->turbo_dec.hard_output.data, 0);
1301*353e3639SNicolas Chautru 		if (op_dec->turbo_dec.soft_output.data != NULL)
1302*353e3639SNicolas Chautru 			add2 = rte_pktmbuf_iova_offset(op_dec->turbo_dec.soft_output.data, 0);
1303*353e3639SNicolas Chautru 		snprintf(str, len, "op %x st %x CBM %d Iter %d map %d Rv %d ext %d "
1304*353e3639SNicolas Chautru 				"in %" PRIx64 " ho %" PRIx64 " so %" PRIx64 " %s\n",
1305*353e3639SNicolas Chautru 				op_dec->turbo_dec.op_flags, op_dec->status,
1306*353e3639SNicolas Chautru 				op_dec->turbo_dec.code_block_mode,
1307*353e3639SNicolas Chautru 				op_dec->turbo_dec.iter_max, op_dec->turbo_dec.num_maps,
1308*353e3639SNicolas Chautru 				op_dec->turbo_dec.rv_index, op_dec->turbo_dec.ext_scale,
1309*353e3639SNicolas Chautru 				add0, add1, add2, partial);
1310*353e3639SNicolas Chautru 	} else if (op_type == RTE_BBDEV_OP_LDPC_ENC) {
1311*353e3639SNicolas Chautru 		op_enc = op;
1312*353e3639SNicolas Chautru 		if (op_enc->ldpc_enc.code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK)
1313*353e3639SNicolas Chautru 			snprintf(partial, sizeof(partial), "C %d Cab %d Ea %d Eb %d r %d",
1314*353e3639SNicolas Chautru 					op_enc->ldpc_enc.tb_params.c,
1315*353e3639SNicolas Chautru 					op_enc->ldpc_enc.tb_params.cab,
1316*353e3639SNicolas Chautru 					op_enc->ldpc_enc.tb_params.ea,
1317*353e3639SNicolas Chautru 					op_enc->ldpc_enc.tb_params.eb,
1318*353e3639SNicolas Chautru 					op_enc->ldpc_enc.tb_params.r);
1319*353e3639SNicolas Chautru 		else
1320*353e3639SNicolas Chautru 			snprintf(partial, sizeof(partial), "E %d",
1321*353e3639SNicolas Chautru 					op_enc->ldpc_enc.cb_params.e);
1322*353e3639SNicolas Chautru 		if (op_enc->ldpc_enc.input.data != NULL)
1323*353e3639SNicolas Chautru 			add0 = rte_pktmbuf_iova_offset(op_enc->ldpc_enc.input.data, 0);
1324*353e3639SNicolas Chautru 		if (op_enc->ldpc_enc.output.data != NULL)
1325*353e3639SNicolas Chautru 			add1 = rte_pktmbuf_iova_offset(op_enc->ldpc_enc.output.data, 0);
1326*353e3639SNicolas Chautru 		snprintf(str, len, "op %x st %x BG %d Zc %d Ncb %d q_m %d F %d Rv %d "
1327*353e3639SNicolas Chautru 				"in %" PRIx64 " out %" PRIx64 " %s\n",
1328*353e3639SNicolas Chautru 				op_enc->ldpc_enc.op_flags, op_enc->status,
1329*353e3639SNicolas Chautru 				op_enc->ldpc_enc.basegraph, op_enc->ldpc_enc.z_c,
1330*353e3639SNicolas Chautru 				op_enc->ldpc_enc.n_cb, op_enc->ldpc_enc.q_m,
1331*353e3639SNicolas Chautru 				op_enc->ldpc_enc.n_filler, op_enc->ldpc_enc.rv_index,
1332*353e3639SNicolas Chautru 				add0, add1, partial);
1333*353e3639SNicolas Chautru 	} else if (op_type == RTE_BBDEV_OP_TURBO_ENC) {
1334*353e3639SNicolas Chautru 		op_enc = op;
1335*353e3639SNicolas Chautru 		if (op_enc->turbo_enc.code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK)
1336*353e3639SNicolas Chautru 			snprintf(partial, sizeof(partial),
1337*353e3639SNicolas Chautru 					"C %d Cab %d Ea %d Eb %d r %d K %d Ncb %d",
1338*353e3639SNicolas Chautru 					op_enc->turbo_enc.tb_params.c,
1339*353e3639SNicolas Chautru 					op_enc->turbo_enc.tb_params.cab,
1340*353e3639SNicolas Chautru 					op_enc->turbo_enc.tb_params.ea,
1341*353e3639SNicolas Chautru 					op_enc->turbo_enc.tb_params.eb,
1342*353e3639SNicolas Chautru 					op_enc->turbo_enc.tb_params.r,
1343*353e3639SNicolas Chautru 					op_enc->turbo_enc.tb_params.k_neg,
1344*353e3639SNicolas Chautru 					op_enc->turbo_enc.tb_params.ncb_neg);
1345*353e3639SNicolas Chautru 		else
1346*353e3639SNicolas Chautru 			snprintf(partial, sizeof(partial), "E %d K %d",
1347*353e3639SNicolas Chautru 					op_enc->turbo_enc.cb_params.e,
1348*353e3639SNicolas Chautru 					op_enc->turbo_enc.cb_params.k);
1349*353e3639SNicolas Chautru 		if (op_enc->turbo_enc.input.data != NULL)
1350*353e3639SNicolas Chautru 			add0 = rte_pktmbuf_iova_offset(op_enc->turbo_enc.input.data, 0);
1351*353e3639SNicolas Chautru 		if (op_enc->turbo_enc.output.data != NULL)
1352*353e3639SNicolas Chautru 			add1 = rte_pktmbuf_iova_offset(op_enc->turbo_enc.output.data, 0);
1353*353e3639SNicolas Chautru 		snprintf(str, len, "op %x st %x CBM %d Rv %d In %" PRIx64 " Out %" PRIx64 " %s\n",
1354*353e3639SNicolas Chautru 				op_enc->turbo_enc.op_flags, op_enc->status,
1355*353e3639SNicolas Chautru 				op_enc->turbo_enc.code_block_mode, op_enc->turbo_enc.rv_index,
1356*353e3639SNicolas Chautru 				add0, add1, partial);
1357*353e3639SNicolas Chautru 	} else if (op_type == RTE_BBDEV_OP_FFT) {
1358*353e3639SNicolas Chautru 		op_fft = op;
1359*353e3639SNicolas Chautru 		if (op_fft->fft.base_input.data != NULL)
1360*353e3639SNicolas Chautru 			add0 = rte_pktmbuf_iova_offset(op_fft->fft.base_input.data, 0);
1361*353e3639SNicolas Chautru 		if (op_fft->fft.base_output.data != NULL)
1362*353e3639SNicolas Chautru 			add1 = rte_pktmbuf_iova_offset(op_fft->fft.base_output.data, 0);
1363*353e3639SNicolas Chautru 		if (op_fft->fft.dewindowing_input.data != NULL)
1364*353e3639SNicolas Chautru 			add2 = rte_pktmbuf_iova_offset(op_fft->fft.dewindowing_input.data, 0);
1365*353e3639SNicolas Chautru 		if (op_fft->fft.power_meas_output.data != NULL)
1366*353e3639SNicolas Chautru 			add3 = rte_pktmbuf_iova_offset(op_fft->fft.power_meas_output.data, 0);
1367*353e3639SNicolas Chautru 		snprintf(str, len, "op %x st %x in %d inl %d out %d outl %d cs %x ants %d "
1368*353e3639SNicolas Chautru 				"idft %d dft %d cst %d ish %d dsh %d ncs %d pwsh %d fp16 %d fr %d "
1369*353e3639SNicolas Chautru 				"outde %d in %" PRIx64 " out %" PRIx64 " dw %" PRIx64 " "
1370*353e3639SNicolas Chautru 				"pm %" PRIx64 "\n",
1371*353e3639SNicolas Chautru 				op_fft->fft.op_flags, op_fft->status,
1372*353e3639SNicolas Chautru 				op_fft->fft.input_sequence_size, op_fft->fft.input_leading_padding,
1373*353e3639SNicolas Chautru 				op_fft->fft.output_sequence_size,
1374*353e3639SNicolas Chautru 				op_fft->fft.output_leading_depadding,
1375*353e3639SNicolas Chautru 				op_fft->fft.cs_bitmap, op_fft->fft.num_antennas_log2,
1376*353e3639SNicolas Chautru 				op_fft->fft.idft_log2, op_fft->fft.dft_log2,
1377*353e3639SNicolas Chautru 				op_fft->fft.cs_time_adjustment,
1378*353e3639SNicolas Chautru 				op_fft->fft.idft_shift, op_fft->fft.dft_shift,
1379*353e3639SNicolas Chautru 				op_fft->fft.ncs_reciprocal, op_fft->fft.power_shift,
1380*353e3639SNicolas Chautru 				op_fft->fft.fp16_exp_adjust, op_fft->fft.freq_resample_mode,
1381*353e3639SNicolas Chautru 				op_fft->fft.output_depadded_size, add0, add1, add2, add3);
1382*353e3639SNicolas Chautru 	} else if (op_type == RTE_BBDEV_OP_MLDTS) {
1383*353e3639SNicolas Chautru 		op_mldts = op;
1384*353e3639SNicolas Chautru 		if (op_mldts->mldts.qhy_input.data != NULL)
1385*353e3639SNicolas Chautru 			add0 = rte_pktmbuf_iova_offset(op_mldts->mldts.qhy_input.data, 0);
1386*353e3639SNicolas Chautru 		if (op_mldts->mldts.r_input.data != NULL)
1387*353e3639SNicolas Chautru 			add1 = rte_pktmbuf_iova_offset(op_mldts->mldts.r_input.data, 0);
1388*353e3639SNicolas Chautru 		if (op_mldts->mldts.output.data != NULL)
1389*353e3639SNicolas Chautru 			add2 = rte_pktmbuf_iova_offset(op_mldts->mldts.output.data, 0);
1390*353e3639SNicolas Chautru 		snprintf(str, len,
1391*353e3639SNicolas Chautru 				"op %x st %x rbs %d lay %d rrep %d crep%d qm %d %d %d %d "
1392*353e3639SNicolas Chautru 				"qhy %" PRIx64 " r %" PRIx64 " out %" PRIx64 "\n",
1393*353e3639SNicolas Chautru 				op_mldts->mldts.op_flags, op_mldts->status,
1394*353e3639SNicolas Chautru 				op_mldts->mldts.num_rbs, op_mldts->mldts.num_layers,
1395*353e3639SNicolas Chautru 				op_mldts->mldts.r_rep, op_mldts->mldts.c_rep,
1396*353e3639SNicolas Chautru 				op_mldts->mldts.q_m[0], op_mldts->mldts.q_m[1],
1397*353e3639SNicolas Chautru 				op_mldts->mldts.q_m[2], op_mldts->mldts.q_m[3],
1398*353e3639SNicolas Chautru 				add0, add1, add2);
1399*353e3639SNicolas Chautru 
1400*353e3639SNicolas Chautru 	} else {
1401*353e3639SNicolas Chautru 		snprintf(str, len, "Invalid Operation type %d\n", op_type);
1402*353e3639SNicolas Chautru 	}
1403*353e3639SNicolas Chautru 
1404*353e3639SNicolas Chautru 	return str;
1405*353e3639SNicolas Chautru }
1406