raw/skeleton: remove compile-time constant for device id
[dpdk.git] / drivers / raw / skeleton_rawdev / skeleton_rawdev.c
index 3da7fe1..709be76 100644 (file)
@@ -32,7 +32,7 @@
 int skeleton_pmd_logtype;
 
 /* Count of instances */
-uint16_t skeldev_init_once;
+static uint16_t skeldev_init_once;
 
 /**< Rawdev Skeleton dummy driver name */
 #define SKELETON_PMD_RAWDEV_NAME rawdev_skeleton
@@ -305,6 +305,18 @@ static int skeleton_rawdev_queue_release(struct rte_rawdev *dev,
        return ret;
 }
 
+static uint16_t skeleton_rawdev_queue_count(struct rte_rawdev *dev)
+{
+       struct skeleton_rawdev *skeldev;
+
+       SKELETON_PMD_FUNC_TRACE();
+
+       RTE_FUNC_PTR_OR_ERR_RET(dev, -EINVAL);
+
+       skeldev = skeleton_rawdev_get_priv(dev);
+       return skeldev->num_queues;
+}
+
 static int skeleton_rawdev_get_attr(struct rte_rawdev *dev,
                                    const char *attr_name,
                                    uint64_t *attr_value)
@@ -524,6 +536,7 @@ static const struct rte_rawdev_ops skeleton_rawdev_ops = {
        .queue_def_conf = skeleton_rawdev_queue_def_conf,
        .queue_setup = skeleton_rawdev_queue_setup,
        .queue_release = skeleton_rawdev_queue_release,
+       .queue_count = skeleton_rawdev_queue_count,
 
        .attr_get = skeleton_rawdev_get_attr,
        .attr_set = skeleton_rawdev_set_attr,
@@ -542,6 +555,8 @@ static const struct rte_rawdev_ops skeleton_rawdev_ops = {
        .firmware_version_get = skeleton_rawdev_firmware_version_get,
        .firmware_load = skeleton_rawdev_firmware_load,
        .firmware_unload = skeleton_rawdev_firmware_unload,
+
+       .dev_selftest = test_rawdev_skeldev,
 };
 
 static int
@@ -570,7 +585,6 @@ skeleton_rawdev_create(const char *name,
 
        rawdev->dev_ops = &skeleton_rawdev_ops;
        rawdev->device = &vdev->device;
-       rawdev->driver_name = vdev->device.driver->name;
 
        skeldev = skeleton_rawdev_get_priv(rawdev);
 
@@ -631,14 +645,68 @@ skeleton_rawdev_destroy(const char *name)
        return 0;
 }
 
+static int
+skeldev_get_selftest(const char *key __rte_unused,
+                    const char *value,
+                    void *opaque)
+{
+       int *flag = opaque;
+       *flag = atoi(value);
+       return 0;
+}
+
+static int
+skeldev_parse_vdev_args(struct rte_vdev_device *vdev)
+{
+       int selftest = 0;
+       const char *name;
+       const char *params;
+
+       static const char *const args[] = {
+               SKELETON_SELFTEST_ARG,
+               NULL
+       };
+
+       name = rte_vdev_device_name(vdev);
+
+       params = rte_vdev_device_args(vdev);
+       if (params != NULL && params[0] != '\0') {
+               struct rte_kvargs *kvlist = rte_kvargs_parse(params, args);
+
+               if (!kvlist) {
+                       SKELETON_PMD_INFO(
+                               "Ignoring unsupported params supplied '%s'",
+                               name);
+               } else {
+                       int ret = rte_kvargs_process(kvlist,
+                                       SKELETON_SELFTEST_ARG,
+                                       skeldev_get_selftest, &selftest);
+                       if (ret != 0 || (selftest < 0 || selftest > 1)) {
+                               SKELETON_PMD_ERR("%s: Error in parsing args",
+                                                name);
+                               rte_kvargs_free(kvlist);
+                               ret = -1; /* enforce if selftest is invalid */
+                               return ret;
+                       }
+               }
+
+               rte_kvargs_free(kvlist);
+       }
+
+       return selftest;
+}
+
 static int
 skeleton_rawdev_probe(struct rte_vdev_device *vdev)
 {
        const char *name;
-       int ret = 0;
+       int selftest = 0, ret = 0;
 
 
        name = rte_vdev_device_name(vdev);
+       if (name == NULL)
+               return -EINVAL;
+
        /* More than one instance is not supported */
        if (skeldev_init_once) {
                SKELETON_PMD_ERR("Multiple instance not supported for %s",
@@ -648,7 +716,18 @@ skeleton_rawdev_probe(struct rte_vdev_device *vdev)
 
        SKELETON_PMD_INFO("Init %s on NUMA node %d", name, rte_socket_id());
 
+       selftest = skeldev_parse_vdev_args(vdev);
+       /* In case of invalid argument, selftest != 1; ignore other values */
+
        ret = skeleton_rawdev_create(name, vdev, rte_socket_id());
+       if (!ret) {
+               /* In case command line argument for 'selftest' was passed;
+                * if invalid arguments were passed, execution continues but
+                * without selftest.
+                */
+               if (selftest == 1)
+                       test_rawdev_skeldev();
+       }
 
        /* Device instance created; Second instance not possible */
        skeldev_init_once = 1;
@@ -663,6 +742,8 @@ skeleton_rawdev_remove(struct rte_vdev_device *vdev)
        int ret;
 
        name = rte_vdev_device_name(vdev);
+       if (name == NULL)
+               return -1;
 
        SKELETON_PMD_INFO("Closing %s on NUMA node %d", name, rte_socket_id());
 
@@ -680,10 +761,7 @@ static struct rte_vdev_driver skeleton_pmd_drv = {
 
 RTE_PMD_REGISTER_VDEV(SKELETON_PMD_RAWDEV_NAME, skeleton_pmd_drv);
 
-RTE_INIT(skeleton_pmd_init_log);
-
-static void
-skeleton_pmd_init_log(void)
+RTE_INIT(skeleton_pmd_init_log)
 {
        skeleton_pmd_logtype = rte_log_register("rawdev.skeleton");
        if (skeleton_pmd_logtype >= 0)