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