11ef7e181SThomas Monjalon /* SPDX-License-Identifier: BSD-3-Clause 21ef7e181SThomas Monjalon * Copyright(c) 2017 Intel Corporation 31ef7e181SThomas Monjalon */ 41ef7e181SThomas Monjalon 572b452c5SDmitry Kozlyuk #include <stdlib.h> 61ef7e181SThomas Monjalon #include <string.h> 71ef7e181SThomas Monjalon 81ef7e181SThomas Monjalon #include <rte_common.h> 94851ef2bSDavid Marchand #include <bus_vdev_driver.h> 101ef7e181SThomas Monjalon #include <rte_malloc.h> 111ef7e181SThomas Monjalon #include <rte_ring.h> 121ef7e181SThomas Monjalon #include <rte_kvargs.h> 131ef7e181SThomas Monjalon 141ef7e181SThomas Monjalon #include <rte_bbdev.h> 151ef7e181SThomas Monjalon #include <rte_bbdev_pmd.h> 161ef7e181SThomas Monjalon 177ce00bf3SKamil Chalupnik #define DRIVER_NAME baseband_null 181ef7e181SThomas Monjalon 19eeded204SDavid Marchand RTE_LOG_REGISTER_DEFAULT(bbdev_null_logtype, NOTICE); 20*2b843cacSDavid Marchand #define RTE_LOGTYPE_BBDEV_NULL bbdev_null_logtype 211ef7e181SThomas Monjalon 221ef7e181SThomas Monjalon /* Helper macro for logging */ 23*2b843cacSDavid Marchand #define rte_bbdev_log(level, ...) \ 24*2b843cacSDavid Marchand RTE_LOG_LINE(level, BBDEV_NULL, __VA_ARGS__) 251ef7e181SThomas Monjalon 261ef7e181SThomas Monjalon #define rte_bbdev_log_debug(fmt, ...) \ 271ef7e181SThomas Monjalon rte_bbdev_log(DEBUG, RTE_STR(__LINE__) ":%s() " fmt, __func__, \ 281ef7e181SThomas Monjalon ##__VA_ARGS__) 291ef7e181SThomas Monjalon 301ef7e181SThomas Monjalon /* Initialisation params structure that can be used by null BBDEV driver */ 311ef7e181SThomas Monjalon struct bbdev_null_params { 321ef7e181SThomas Monjalon int socket_id; /*< Null BBDEV socket */ 331ef7e181SThomas Monjalon uint16_t queues_num; /*< Null BBDEV queues number */ 341ef7e181SThomas Monjalon }; 351ef7e181SThomas Monjalon 367be78d02SJosh Soref /* Acceptable params for null BBDEV devices */ 371ef7e181SThomas Monjalon #define BBDEV_NULL_MAX_NB_QUEUES_ARG "max_nb_queues" 381ef7e181SThomas Monjalon #define BBDEV_NULL_SOCKET_ID_ARG "socket_id" 391ef7e181SThomas Monjalon 401ef7e181SThomas Monjalon static const char * const bbdev_null_valid_params[] = { 411ef7e181SThomas Monjalon BBDEV_NULL_MAX_NB_QUEUES_ARG, 421ef7e181SThomas Monjalon BBDEV_NULL_SOCKET_ID_ARG 431ef7e181SThomas Monjalon }; 441ef7e181SThomas Monjalon 451ef7e181SThomas Monjalon /* private data structure */ 461ef7e181SThomas Monjalon struct bbdev_private { 471ef7e181SThomas Monjalon unsigned int max_nb_queues; /**< Max number of queues */ 481ef7e181SThomas Monjalon }; 491ef7e181SThomas Monjalon 501ef7e181SThomas Monjalon /* queue */ 5127595cd8STyler Retzlaff struct __rte_cache_aligned bbdev_queue { 521ef7e181SThomas Monjalon struct rte_ring *processed_pkts; /* Ring for processed packets */ 5327595cd8STyler Retzlaff }; 541ef7e181SThomas Monjalon 551ef7e181SThomas Monjalon /* Get device info */ 561ef7e181SThomas Monjalon static void 571ef7e181SThomas Monjalon info_get(struct rte_bbdev *dev, struct rte_bbdev_driver_info *dev_info) 581ef7e181SThomas Monjalon { 591ef7e181SThomas Monjalon struct bbdev_private *internals = dev->data->dev_private; 601ef7e181SThomas Monjalon 611ef7e181SThomas Monjalon static const struct rte_bbdev_op_cap bbdev_capabilities[] = { 621ef7e181SThomas Monjalon RTE_BBDEV_END_OF_CAPABILITIES_LIST(), 631ef7e181SThomas Monjalon }; 641ef7e181SThomas Monjalon 651ef7e181SThomas Monjalon static struct rte_bbdev_queue_conf default_queue_conf = { 661ef7e181SThomas Monjalon .queue_size = RTE_BBDEV_QUEUE_SIZE_LIMIT, 671ef7e181SThomas Monjalon }; 681ef7e181SThomas Monjalon 691ef7e181SThomas Monjalon default_queue_conf.socket = dev->data->socket_id; 701ef7e181SThomas Monjalon 711ef7e181SThomas Monjalon dev_info->driver_name = RTE_STR(DRIVER_NAME); 721ef7e181SThomas Monjalon dev_info->max_num_queues = internals->max_nb_queues; 731ef7e181SThomas Monjalon dev_info->queue_size_lim = RTE_BBDEV_QUEUE_SIZE_LIMIT; 741ef7e181SThomas Monjalon dev_info->hardware_accelerated = false; 7558a695c6SKamil Chalupnik dev_info->max_dl_queue_priority = 0; 7658a695c6SKamil Chalupnik dev_info->max_ul_queue_priority = 0; 771ef7e181SThomas Monjalon dev_info->default_queue_conf = default_queue_conf; 781ef7e181SThomas Monjalon dev_info->capabilities = bbdev_capabilities; 791ef7e181SThomas Monjalon dev_info->cpu_flag_reqs = NULL; 801ef7e181SThomas Monjalon dev_info->min_alignment = 0; 811ef7e181SThomas Monjalon 82ab4e1909SNicolas Chautru /* BBDEV null device does not process the data, so 83ab4e1909SNicolas Chautru * endianness setting is not relevant, but setting it 84ab4e1909SNicolas Chautru * here for code completeness. 85ab4e1909SNicolas Chautru */ 86ab4e1909SNicolas Chautru dev_info->data_endianness = RTE_LITTLE_ENDIAN; 871be86f2eSNicolas Chautru dev_info->device_status = RTE_BBDEV_DEV_NOT_SUPPORTED; 88ab4e1909SNicolas Chautru 891ef7e181SThomas Monjalon rte_bbdev_log_debug("got device info from %u", dev->data->dev_id); 901ef7e181SThomas Monjalon } 911ef7e181SThomas Monjalon 921ef7e181SThomas Monjalon /* Release queue */ 931ef7e181SThomas Monjalon static int 941ef7e181SThomas Monjalon q_release(struct rte_bbdev *dev, uint16_t q_id) 951ef7e181SThomas Monjalon { 961ef7e181SThomas Monjalon struct bbdev_queue *q = dev->data->queues[q_id].queue_private; 971ef7e181SThomas Monjalon 981ef7e181SThomas Monjalon if (q != NULL) { 991ef7e181SThomas Monjalon rte_ring_free(q->processed_pkts); 1001ef7e181SThomas Monjalon rte_free(q); 1011ef7e181SThomas Monjalon dev->data->queues[q_id].queue_private = NULL; 1021ef7e181SThomas Monjalon } 1031ef7e181SThomas Monjalon 1041ef7e181SThomas Monjalon rte_bbdev_log_debug("released device queue %u:%u", 1051ef7e181SThomas Monjalon dev->data->dev_id, q_id); 1061ef7e181SThomas Monjalon return 0; 1071ef7e181SThomas Monjalon } 1081ef7e181SThomas Monjalon 1091ef7e181SThomas Monjalon /* Setup a queue */ 1101ef7e181SThomas Monjalon static int 1111ef7e181SThomas Monjalon q_setup(struct rte_bbdev *dev, uint16_t q_id, 1121ef7e181SThomas Monjalon const struct rte_bbdev_queue_conf *queue_conf) 1131ef7e181SThomas Monjalon { 1141ef7e181SThomas Monjalon struct bbdev_queue *q; 1151ef7e181SThomas Monjalon char ring_name[RTE_RING_NAMESIZE]; 1161ef7e181SThomas Monjalon snprintf(ring_name, RTE_RING_NAMESIZE, RTE_STR(DRIVER_NAME) "%u:%u", 1171ef7e181SThomas Monjalon dev->data->dev_id, q_id); 1181ef7e181SThomas Monjalon 1191ef7e181SThomas Monjalon /* Allocate the queue data structure. */ 1201ef7e181SThomas Monjalon q = rte_zmalloc_socket(RTE_STR(DRIVER_NAME), sizeof(*q), 1211ef7e181SThomas Monjalon RTE_CACHE_LINE_SIZE, queue_conf->socket); 1221ef7e181SThomas Monjalon if (q == NULL) { 1231ef7e181SThomas Monjalon rte_bbdev_log(ERR, "Failed to allocate queue memory"); 1241ef7e181SThomas Monjalon return -ENOMEM; 1251ef7e181SThomas Monjalon } 1261ef7e181SThomas Monjalon 1271ef7e181SThomas Monjalon q->processed_pkts = rte_ring_create(ring_name, queue_conf->queue_size, 1281ef7e181SThomas Monjalon queue_conf->socket, RING_F_SP_ENQ | RING_F_SC_DEQ); 1291ef7e181SThomas Monjalon if (q->processed_pkts == NULL) { 1301ef7e181SThomas Monjalon rte_bbdev_log(ERR, "Failed to create ring"); 1311ef7e181SThomas Monjalon goto free_q; 1321ef7e181SThomas Monjalon } 1331ef7e181SThomas Monjalon 1341ef7e181SThomas Monjalon dev->data->queues[q_id].queue_private = q; 1351ef7e181SThomas Monjalon rte_bbdev_log_debug("setup device queue %s", ring_name); 1361ef7e181SThomas Monjalon return 0; 1371ef7e181SThomas Monjalon 1381ef7e181SThomas Monjalon free_q: 1391ef7e181SThomas Monjalon rte_free(q); 1401ef7e181SThomas Monjalon return -EFAULT; 1411ef7e181SThomas Monjalon } 1421ef7e181SThomas Monjalon 1431ef7e181SThomas Monjalon static const struct rte_bbdev_ops pmd_ops = { 1441ef7e181SThomas Monjalon .info_get = info_get, 1451ef7e181SThomas Monjalon .queue_setup = q_setup, 1461ef7e181SThomas Monjalon .queue_release = q_release 1471ef7e181SThomas Monjalon }; 1481ef7e181SThomas Monjalon 1491ef7e181SThomas Monjalon /* Enqueue decode burst */ 1501ef7e181SThomas Monjalon static uint16_t 1511ef7e181SThomas Monjalon enqueue_dec_ops(struct rte_bbdev_queue_data *q_data, 1521ef7e181SThomas Monjalon struct rte_bbdev_dec_op **ops, uint16_t nb_ops) 1531ef7e181SThomas Monjalon { 1541ef7e181SThomas Monjalon struct bbdev_queue *q = q_data->queue_private; 1551ef7e181SThomas Monjalon uint16_t nb_enqueued = rte_ring_enqueue_burst(q->processed_pkts, 1561ef7e181SThomas Monjalon (void **)ops, nb_ops, NULL); 1571ef7e181SThomas Monjalon 1581ef7e181SThomas Monjalon q_data->queue_stats.enqueue_err_count += nb_ops - nb_enqueued; 1591ef7e181SThomas Monjalon q_data->queue_stats.enqueued_count += nb_enqueued; 1601ef7e181SThomas Monjalon 1611ef7e181SThomas Monjalon return nb_enqueued; 1621ef7e181SThomas Monjalon } 1631ef7e181SThomas Monjalon 1641ef7e181SThomas Monjalon /* Enqueue encode burst */ 1651ef7e181SThomas Monjalon static uint16_t 1661ef7e181SThomas Monjalon enqueue_enc_ops(struct rte_bbdev_queue_data *q_data, 1671ef7e181SThomas Monjalon struct rte_bbdev_enc_op **ops, uint16_t nb_ops) 1681ef7e181SThomas Monjalon { 1691ef7e181SThomas Monjalon struct bbdev_queue *q = q_data->queue_private; 1701ef7e181SThomas Monjalon uint16_t nb_enqueued = rte_ring_enqueue_burst(q->processed_pkts, 1711ef7e181SThomas Monjalon (void **)ops, nb_ops, NULL); 1721ef7e181SThomas Monjalon 1731ef7e181SThomas Monjalon q_data->queue_stats.enqueue_err_count += nb_ops - nb_enqueued; 1741ef7e181SThomas Monjalon q_data->queue_stats.enqueued_count += nb_enqueued; 1751ef7e181SThomas Monjalon 1761ef7e181SThomas Monjalon return nb_enqueued; 1771ef7e181SThomas Monjalon } 1781ef7e181SThomas Monjalon 1791ef7e181SThomas Monjalon /* Dequeue decode burst */ 1801ef7e181SThomas Monjalon static uint16_t 1811ef7e181SThomas Monjalon dequeue_dec_ops(struct rte_bbdev_queue_data *q_data, 1821ef7e181SThomas Monjalon struct rte_bbdev_dec_op **ops, uint16_t nb_ops) 1831ef7e181SThomas Monjalon { 1841ef7e181SThomas Monjalon struct bbdev_queue *q = q_data->queue_private; 1851ef7e181SThomas Monjalon uint16_t nb_dequeued = rte_ring_dequeue_burst(q->processed_pkts, 1861ef7e181SThomas Monjalon (void **)ops, nb_ops, NULL); 1871ef7e181SThomas Monjalon q_data->queue_stats.dequeued_count += nb_dequeued; 1881ef7e181SThomas Monjalon 1891ef7e181SThomas Monjalon return nb_dequeued; 1901ef7e181SThomas Monjalon } 1911ef7e181SThomas Monjalon 1921ef7e181SThomas Monjalon /* Dequeue encode burst */ 1931ef7e181SThomas Monjalon static uint16_t 1941ef7e181SThomas Monjalon dequeue_enc_ops(struct rte_bbdev_queue_data *q_data, 1951ef7e181SThomas Monjalon struct rte_bbdev_enc_op **ops, uint16_t nb_ops) 1961ef7e181SThomas Monjalon { 1971ef7e181SThomas Monjalon struct bbdev_queue *q = q_data->queue_private; 1981ef7e181SThomas Monjalon uint16_t nb_dequeued = rte_ring_dequeue_burst(q->processed_pkts, 1991ef7e181SThomas Monjalon (void **)ops, nb_ops, NULL); 2001ef7e181SThomas Monjalon q_data->queue_stats.dequeued_count += nb_dequeued; 2011ef7e181SThomas Monjalon 2021ef7e181SThomas Monjalon return nb_dequeued; 2031ef7e181SThomas Monjalon } 2041ef7e181SThomas Monjalon 2051ef7e181SThomas Monjalon /* Parse 16bit integer from string argument */ 2061ef7e181SThomas Monjalon static inline int 2071ef7e181SThomas Monjalon parse_u16_arg(const char *key, const char *value, void *extra_args) 2081ef7e181SThomas Monjalon { 2091ef7e181SThomas Monjalon uint16_t *u16 = extra_args; 2101ef7e181SThomas Monjalon unsigned int long result; 2111ef7e181SThomas Monjalon 2121ef7e181SThomas Monjalon if ((value == NULL) || (extra_args == NULL)) 2131ef7e181SThomas Monjalon return -EINVAL; 2141ef7e181SThomas Monjalon errno = 0; 2151ef7e181SThomas Monjalon result = strtoul(value, NULL, 0); 2161ef7e181SThomas Monjalon if ((result >= (1 << 16)) || (errno != 0)) { 2171ef7e181SThomas Monjalon rte_bbdev_log(ERR, "Invalid value %lu for %s", result, key); 2181ef7e181SThomas Monjalon return -ERANGE; 2191ef7e181SThomas Monjalon } 2201ef7e181SThomas Monjalon *u16 = (uint16_t)result; 2211ef7e181SThomas Monjalon return 0; 2221ef7e181SThomas Monjalon } 2231ef7e181SThomas Monjalon 2241ef7e181SThomas Monjalon /* Parse parameters used to create device */ 2251ef7e181SThomas Monjalon static int 2261ef7e181SThomas Monjalon parse_bbdev_null_params(struct bbdev_null_params *params, 2271ef7e181SThomas Monjalon const char *input_args) 2281ef7e181SThomas Monjalon { 2291ef7e181SThomas Monjalon struct rte_kvargs *kvlist = NULL; 2301ef7e181SThomas Monjalon int ret = 0; 2311ef7e181SThomas Monjalon 2321ef7e181SThomas Monjalon if (params == NULL) 2331ef7e181SThomas Monjalon return -EINVAL; 2341ef7e181SThomas Monjalon if (input_args) { 2351ef7e181SThomas Monjalon kvlist = rte_kvargs_parse(input_args, bbdev_null_valid_params); 2361ef7e181SThomas Monjalon if (kvlist == NULL) 2371ef7e181SThomas Monjalon return -EFAULT; 2381ef7e181SThomas Monjalon 2391ef7e181SThomas Monjalon ret = rte_kvargs_process(kvlist, bbdev_null_valid_params[0], 2401ef7e181SThomas Monjalon &parse_u16_arg, ¶ms->queues_num); 2411ef7e181SThomas Monjalon if (ret < 0) 2421ef7e181SThomas Monjalon goto exit; 2431ef7e181SThomas Monjalon 2441ef7e181SThomas Monjalon ret = rte_kvargs_process(kvlist, bbdev_null_valid_params[1], 2451ef7e181SThomas Monjalon &parse_u16_arg, ¶ms->socket_id); 2461ef7e181SThomas Monjalon if (ret < 0) 2471ef7e181SThomas Monjalon goto exit; 2481ef7e181SThomas Monjalon 2491ef7e181SThomas Monjalon if (params->socket_id >= RTE_MAX_NUMA_NODES) { 2501ef7e181SThomas Monjalon rte_bbdev_log(ERR, "Invalid socket, must be < %u", 2511ef7e181SThomas Monjalon RTE_MAX_NUMA_NODES); 2521ef7e181SThomas Monjalon goto exit; 2531ef7e181SThomas Monjalon } 2541ef7e181SThomas Monjalon } 2551ef7e181SThomas Monjalon 2561ef7e181SThomas Monjalon exit: 2571ef7e181SThomas Monjalon rte_kvargs_free(kvlist); 2581ef7e181SThomas Monjalon return ret; 2591ef7e181SThomas Monjalon } 2601ef7e181SThomas Monjalon 2611ef7e181SThomas Monjalon /* Create device */ 2621ef7e181SThomas Monjalon static int 2631ef7e181SThomas Monjalon null_bbdev_create(struct rte_vdev_device *vdev, 2641ef7e181SThomas Monjalon struct bbdev_null_params *init_params) 2651ef7e181SThomas Monjalon { 2661ef7e181SThomas Monjalon struct rte_bbdev *bbdev; 2671ef7e181SThomas Monjalon const char *name = rte_vdev_device_name(vdev); 2681ef7e181SThomas Monjalon 2691ef7e181SThomas Monjalon bbdev = rte_bbdev_allocate(name); 2701ef7e181SThomas Monjalon if (bbdev == NULL) 2711ef7e181SThomas Monjalon return -ENODEV; 2721ef7e181SThomas Monjalon 2731ef7e181SThomas Monjalon bbdev->data->dev_private = rte_zmalloc_socket(name, 2741ef7e181SThomas Monjalon sizeof(struct bbdev_private), RTE_CACHE_LINE_SIZE, 2751ef7e181SThomas Monjalon init_params->socket_id); 2761ef7e181SThomas Monjalon if (bbdev->data->dev_private == NULL) { 2771ef7e181SThomas Monjalon rte_bbdev_release(bbdev); 2781ef7e181SThomas Monjalon return -ENOMEM; 2791ef7e181SThomas Monjalon } 2801ef7e181SThomas Monjalon 2811ef7e181SThomas Monjalon bbdev->dev_ops = &pmd_ops; 2821ef7e181SThomas Monjalon bbdev->device = &vdev->device; 2831ef7e181SThomas Monjalon bbdev->data->socket_id = init_params->socket_id; 2841ef7e181SThomas Monjalon bbdev->intr_handle = NULL; 2851ef7e181SThomas Monjalon 2861ef7e181SThomas Monjalon /* register rx/tx burst functions for data path */ 2871ef7e181SThomas Monjalon bbdev->dequeue_enc_ops = dequeue_enc_ops; 2881ef7e181SThomas Monjalon bbdev->dequeue_dec_ops = dequeue_dec_ops; 2891ef7e181SThomas Monjalon bbdev->enqueue_enc_ops = enqueue_enc_ops; 2901ef7e181SThomas Monjalon bbdev->enqueue_dec_ops = enqueue_dec_ops; 2911ef7e181SThomas Monjalon ((struct bbdev_private *) bbdev->data->dev_private)->max_nb_queues = 2921ef7e181SThomas Monjalon init_params->queues_num; 2931ef7e181SThomas Monjalon 2941ef7e181SThomas Monjalon return 0; 2951ef7e181SThomas Monjalon } 2961ef7e181SThomas Monjalon 2971ef7e181SThomas Monjalon /* Initialise device */ 2981ef7e181SThomas Monjalon static int 2991ef7e181SThomas Monjalon null_bbdev_probe(struct rte_vdev_device *vdev) 3001ef7e181SThomas Monjalon { 3011ef7e181SThomas Monjalon struct bbdev_null_params init_params = { 3021ef7e181SThomas Monjalon rte_socket_id(), 3031ef7e181SThomas Monjalon RTE_BBDEV_DEFAULT_MAX_NB_QUEUES 3041ef7e181SThomas Monjalon }; 3051ef7e181SThomas Monjalon const char *name; 3061ef7e181SThomas Monjalon const char *input_args; 3071ef7e181SThomas Monjalon 3081ef7e181SThomas Monjalon if (vdev == NULL) 3091ef7e181SThomas Monjalon return -EINVAL; 3101ef7e181SThomas Monjalon 3111ef7e181SThomas Monjalon name = rte_vdev_device_name(vdev); 3121ef7e181SThomas Monjalon if (name == NULL) 3131ef7e181SThomas Monjalon return -EINVAL; 3141ef7e181SThomas Monjalon 3151ef7e181SThomas Monjalon input_args = rte_vdev_device_args(vdev); 3161ef7e181SThomas Monjalon parse_bbdev_null_params(&init_params, input_args); 3171ef7e181SThomas Monjalon 3181ef7e181SThomas Monjalon rte_bbdev_log_debug("Init %s on NUMA node %d with max queues: %d", 3191ef7e181SThomas Monjalon name, init_params.socket_id, init_params.queues_num); 3201ef7e181SThomas Monjalon 3211ef7e181SThomas Monjalon return null_bbdev_create(vdev, &init_params); 3221ef7e181SThomas Monjalon } 3231ef7e181SThomas Monjalon 3241ef7e181SThomas Monjalon /* Uninitialise device */ 3251ef7e181SThomas Monjalon static int 3261ef7e181SThomas Monjalon null_bbdev_remove(struct rte_vdev_device *vdev) 3271ef7e181SThomas Monjalon { 3281ef7e181SThomas Monjalon struct rte_bbdev *bbdev; 3291ef7e181SThomas Monjalon const char *name; 3301ef7e181SThomas Monjalon 3311ef7e181SThomas Monjalon if (vdev == NULL) 3321ef7e181SThomas Monjalon return -EINVAL; 3331ef7e181SThomas Monjalon 3341ef7e181SThomas Monjalon name = rte_vdev_device_name(vdev); 3351ef7e181SThomas Monjalon if (name == NULL) 3361ef7e181SThomas Monjalon return -EINVAL; 3371ef7e181SThomas Monjalon 3381ef7e181SThomas Monjalon bbdev = rte_bbdev_get_named_dev(name); 3391ef7e181SThomas Monjalon if (bbdev == NULL) 3401ef7e181SThomas Monjalon return -EINVAL; 3411ef7e181SThomas Monjalon 3421ef7e181SThomas Monjalon rte_free(bbdev->data->dev_private); 3431ef7e181SThomas Monjalon 3441ef7e181SThomas Monjalon return rte_bbdev_release(bbdev); 3451ef7e181SThomas Monjalon } 3461ef7e181SThomas Monjalon 3471ef7e181SThomas Monjalon static struct rte_vdev_driver bbdev_null_pmd_drv = { 3481ef7e181SThomas Monjalon .probe = null_bbdev_probe, 3491ef7e181SThomas Monjalon .remove = null_bbdev_remove 3501ef7e181SThomas Monjalon }; 3511ef7e181SThomas Monjalon 3521ef7e181SThomas Monjalon RTE_PMD_REGISTER_VDEV(DRIVER_NAME, bbdev_null_pmd_drv); 3531ef7e181SThomas Monjalon RTE_PMD_REGISTER_PARAM_STRING(DRIVER_NAME, 3541ef7e181SThomas Monjalon BBDEV_NULL_MAX_NB_QUEUES_ARG"=<int> " 3551ef7e181SThomas Monjalon BBDEV_NULL_SOCKET_ID_ARG"=<int>"); 3567ce00bf3SKamil Chalupnik RTE_PMD_REGISTER_ALIAS(DRIVER_NAME, bbdev_null); 357