@@ -19,13 +19,72 @@
RTE_LOG_REGISTER(bbdev_la12xx_logtype, pmd.bb.la12xx, NOTICE);
+/* Initialisation params structure that can be used by LA12xx BBDEV driver */
+struct bbdev_la12xx_params {
+ uint8_t queues_num; /*< LA12xx BBDEV queues number */
+};
+
+#define BBDEV_LA12XX_MAX_NB_QUEUES_ARG "max_nb_queues"
+
+static const char * const bbdev_la12xx_valid_params[] = {
+ BBDEV_LA12XX_MAX_NB_QUEUES_ARG,
+};
+
/* private data structure */
struct bbdev_la12xx_private {
unsigned int max_nb_queues; /**< Max number of queues */
};
+static inline int
+parse_u16_arg(const char *key, const char *value, void *extra_args)
+{
+ uint16_t *u16 = extra_args;
+
+ unsigned int long result;
+ if ((value == NULL) || (extra_args == NULL))
+ return -EINVAL;
+ errno = 0;
+ result = strtoul(value, NULL, 0);
+ if ((result >= (1 << 16)) || (errno != 0)) {
+ BBDEV_LA12XX_PMD_ERR("Invalid value %lu for %s", result, key);
+ return -ERANGE;
+ }
+ *u16 = (uint16_t)result;
+ return 0;
+}
+
+/* Parse parameters used to create device */
+static int
+parse_bbdev_la12xx_params(struct bbdev_la12xx_params *params,
+ const char *input_args)
+{
+ struct rte_kvargs *kvlist = NULL;
+ int ret = 0;
+
+ if (params == NULL)
+ return -EINVAL;
+ if (input_args) {
+ kvlist = rte_kvargs_parse(input_args,
+ bbdev_la12xx_valid_params);
+ if (kvlist == NULL)
+ return -EFAULT;
+
+ ret = rte_kvargs_process(kvlist, bbdev_la12xx_valid_params[0],
+ &parse_u16_arg, ¶ms->queues_num);
+ if (ret < 0)
+ goto exit;
+
+ }
+
+exit:
+ if (kvlist)
+ rte_kvargs_free(kvlist);
+ return ret;
+}
+
/* Create device */
static int
-la12xx_bbdev_create(struct rte_vdev_device *vdev)
+la12xx_bbdev_create(struct rte_vdev_device *vdev,
+ struct bbdev_la12xx_params *init_params)
{
struct rte_bbdev *bbdev;
const char *name = rte_vdev_device_name(vdev);
@@ -62,7 +121,11 @@ la12xx_bbdev_create(struct rte_vdev_device *vdev)
static int
la12xx_bbdev_probe(struct rte_vdev_device *vdev)
{
+ struct bbdev_la12xx_params init_params = {
+ RTE_BBDEV_DEFAULT_MAX_NB_QUEUES
+ };
const char *name;
+ const char *input_args;
PMD_INIT_FUNC_TRACE();
@@ -73,7 +136,10 @@ la12xx_bbdev_probe(struct rte_vdev_device *vdev)
if (name == NULL)
return -EINVAL;
- return la12xx_bbdev_create(vdev);
+ input_args = rte_vdev_device_args(vdev);
+ parse_bbdev_la12xx_params(&init_params, input_args);
+
+ return la12xx_bbdev_create(vdev, &init_params);
}
/* Uninitialise device */
@@ -107,4 +173,6 @@ static struct rte_vdev_driver bbdev_la12xx_pmd_drv = {
};
RTE_PMD_REGISTER_VDEV(DRIVER_NAME, bbdev_la12xx_pmd_drv);
+RTE_PMD_REGISTER_PARAM_STRING(DRIVER_NAME,
+ BBDEV_LA12XX_MAX_NB_QUEUES_ARG"=<int>");
RTE_PMD_REGISTER_ALIAS(DRIVER_NAME, bbdev_la12xx);