Added test case to validate device handling operations. Device ops
test is a collection of multiple sub-tests. Enabled sub-test to
validate device reconfiguration. Set device_ops as the default test.

Signed-off-by: Srikanth Yalavarthi <syalavar...@marvell.com>
---
 app/test-mldev/meson.build       |   1 +
 app/test-mldev/ml_options.c      |   5 +-
 app/test-mldev/ml_options.h      |   2 +
 app/test-mldev/test_device_ops.c | 228 +++++++++++++++++++++++++++++++
 app/test-mldev/test_device_ops.h |  17 +++
 5 files changed, 251 insertions(+), 2 deletions(-)
 create mode 100644 app/test-mldev/test_device_ops.c
 create mode 100644 app/test-mldev/test_device_ops.h

diff --git a/app/test-mldev/meson.build b/app/test-mldev/meson.build
index 964bb9ddc4..60ea23d142 100644
--- a/app/test-mldev/meson.build
+++ b/app/test-mldev/meson.build
@@ -13,6 +13,7 @@ sources = files(
         'ml_test.c',
         'parser.c',
         'test_common.c',
+        'test_device_ops.c',
 )
 
 deps += ['mldev']
diff --git a/app/test-mldev/ml_options.c b/app/test-mldev/ml_options.c
index 521e9a2f97..b0837dde14 100644
--- a/app/test-mldev/ml_options.c
+++ b/app/test-mldev/ml_options.c
@@ -19,7 +19,7 @@ void
 ml_options_default(struct ml_options *opt)
 {
        memset(opt, 0, sizeof(*opt));
-       strlcpy(opt->test_name, "ml_test", ML_TEST_NAME_MAX_LEN);
+       strlcpy(opt->test_name, "device_ops", ML_TEST_NAME_MAX_LEN);
        opt->dev_id = 0;
        opt->socket_id = SOCKET_ID_ANY;
        opt->debug = false;
@@ -61,7 +61,8 @@ ml_parse_socket_id(struct ml_options *opt, const char *arg)
 static void
 ml_dump_test_options(const char *testname)
 {
-       RTE_SET_USED(testname);
+       if (strcmp(testname, "device_ops") == 0)
+               printf("\n");
 }
 
 static void
diff --git a/app/test-mldev/ml_options.h b/app/test-mldev/ml_options.h
index 05311a9a47..6899cc2f88 100644
--- a/app/test-mldev/ml_options.h
+++ b/app/test-mldev/ml_options.h
@@ -9,6 +9,7 @@
 #include <stdint.h>
 
 #define ML_TEST_NAME_MAX_LEN 32
+#define ML_TEST_MAX_MODELS   8
 
 /* Options names */
 #define ML_TEST             ("test")
@@ -21,6 +22,7 @@ struct ml_options {
        char test_name[ML_TEST_NAME_MAX_LEN];
        int16_t dev_id;
        int socket_id;
+       uint8_t nb_filelist;
        bool debug;
 };
 
diff --git a/app/test-mldev/test_device_ops.c b/app/test-mldev/test_device_ops.c
new file mode 100644
index 0000000000..be0c5f0780
--- /dev/null
+++ b/app/test-mldev/test_device_ops.c
@@ -0,0 +1,228 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2022 Marvell.
+ */
+
+#include <errno.h>
+
+#include <rte_common.h>
+#include <rte_malloc.h>
+#include <rte_mldev.h>
+
+#include "test_device_ops.h"
+
+static bool
+test_device_cap_check(struct ml_options *opt)
+{
+       if (!ml_test_cap_check(opt))
+               return false;
+
+       return true;
+}
+
+static int
+test_device_opt_check(struct ml_options *opt)
+{
+       int ret;
+
+       /* check common opts */
+       ret = ml_test_opt_check(opt);
+       if (ret != 0)
+               return ret;
+
+       return 0;
+}
+
+static void
+test_device_opt_dump(struct ml_options *opt)
+{
+       /* dump common opts */
+       ml_test_opt_dump(opt);
+}
+
+static int
+test_device_setup(struct ml_test *test, struct ml_options *opt)
+{
+       struct test_device *t;
+       void *test_device;
+       int ret = 0;
+
+       /* allocate for test structure */
+       test_device = rte_zmalloc_socket(test->name, sizeof(struct test_device),
+                                        RTE_CACHE_LINE_SIZE, opt->socket_id);
+       if (test_device == NULL) {
+               ml_err("failed to allocate memory for test_model");
+               ret = -ENOMEM;
+               goto error;
+       }
+       test->test_priv = test_device;
+       t = ml_test_priv(test);
+
+       t->cmn.result = ML_TEST_FAILED;
+       t->cmn.opt = opt;
+
+       /* get device info */
+       ret = rte_ml_dev_info_get(opt->dev_id, &t->cmn.dev_info);
+       if (ret < 0) {
+               ml_err("failed to get device info");
+               goto error;
+       }
+
+       return 0;
+
+error:
+       if (test_device != NULL)
+               rte_free(test_device);
+
+       return ret;
+}
+
+static void
+test_device_destroy(struct ml_test *test, struct ml_options *opt)
+{
+       struct test_device *t;
+
+       RTE_SET_USED(opt);
+
+       t = ml_test_priv(test);
+       if (t != NULL)
+               rte_free(t);
+}
+
+static int
+test_device_reconfigure(struct ml_test *test, struct ml_options *opt)
+{
+       struct rte_ml_dev_config dev_config;
+       struct rte_ml_dev_qp_conf qp_conf;
+       struct test_device *t;
+       uint16_t qp_id = 0;
+       int ret = 0;
+
+       t = ml_test_priv(test);
+
+       /* configure with default options */
+       ret = ml_test_device_configure(test, opt);
+       if (ret != 0)
+               return ret;
+
+       /* setup one queue pair with nb_desc = 1 */
+       qp_conf.nb_desc = 1;
+       qp_conf.cb = NULL;
+
+       ret = rte_ml_dev_queue_pair_setup(opt->dev_id, qp_id, &qp_conf, 
opt->socket_id);
+       if (ret != 0) {
+               ml_err("Failed to setup ML device queue-pair, dev_id = %d, 
qp_id = %u\n",
+                      opt->dev_id, qp_id);
+               goto error;
+       }
+
+       /* start device */
+       ret = ml_test_device_start(test, opt);
+       if (ret != 0)
+               goto error;
+
+       /* stop device */
+       ret = ml_test_device_stop(test, opt);
+       if (ret != 0) {
+               ml_err("Failed to stop device");
+               goto error;
+       }
+
+       /* reconfigure device based on dev_info */
+       dev_config.socket_id = opt->socket_id;
+       dev_config.nb_models = t->cmn.dev_info.max_models;
+       dev_config.nb_queue_pairs = t->cmn.dev_info.max_queue_pairs;
+       ret = rte_ml_dev_configure(opt->dev_id, &dev_config);
+       if (ret != 0) {
+               ml_err("Failed to reconfigure ML device, dev_id = %d\n", 
opt->dev_id);
+               return ret;
+       }
+
+       /* setup queue pairs */
+       for (qp_id = 0; qp_id < t->cmn.dev_info.max_queue_pairs; qp_id++) {
+               qp_conf.nb_desc = t->cmn.dev_info.max_desc;
+               qp_conf.cb = NULL;
+
+               ret = rte_ml_dev_queue_pair_setup(opt->dev_id, qp_id, &qp_conf, 
opt->socket_id);
+               if (ret != 0) {
+                       ml_err("Failed to setup ML device queue-pair, dev_id = 
%d, qp_id = %u\n",
+                              opt->dev_id, qp_id);
+                       goto error;
+               }
+       }
+
+       /* start device */
+       ret = ml_test_device_start(test, opt);
+       if (ret != 0)
+               goto error;
+
+       /* stop device */
+       ret = ml_test_device_stop(test, opt);
+       if (ret != 0)
+               goto error;
+
+       /* close device */
+       ret = ml_test_device_close(test, opt);
+       if (ret != 0)
+               return ret;
+
+       return 0;
+
+error:
+       ml_test_device_close(test, opt);
+
+       return ret;
+}
+
+static int
+test_device_driver(struct ml_test *test, struct ml_options *opt)
+{
+       struct test_device *t;
+       int ret = 0;
+
+       t = ml_test_priv(test);
+
+       /* sub-test: device reconfigure */
+       ret = test_device_reconfigure(test, opt);
+       if (ret != 0) {
+               printf("\n");
+               printf("Model Device Reconfigure Test: " CLRED "%s" CLNRM "\n", 
"Failed");
+               goto error;
+       } else {
+               printf("\n");
+               printf("Model Device Reconfigure Test: " CLYEL "%s" CLNRM "\n", 
"Passed");
+       }
+
+       printf("\n");
+
+       t->cmn.result = ML_TEST_SUCCESS;
+
+       return 0;
+
+error:
+       t->cmn.result = ML_TEST_FAILED;
+       return -1;
+}
+
+static int
+test_device_result(struct ml_test *test, struct ml_options *opt)
+{
+       struct test_device *t;
+
+       RTE_SET_USED(opt);
+
+       t = ml_test_priv(test);
+
+       return t->cmn.result;
+}
+
+static const struct ml_test_ops device_ops = {
+       .cap_check = test_device_cap_check,
+       .opt_check = test_device_opt_check,
+       .opt_dump = test_device_opt_dump,
+       .test_setup = test_device_setup,
+       .test_destroy = test_device_destroy,
+       .test_driver = test_device_driver,
+       .test_result = test_device_result,
+};
+
+ML_TEST_REGISTER(device_ops);
diff --git a/app/test-mldev/test_device_ops.h b/app/test-mldev/test_device_ops.h
new file mode 100644
index 0000000000..115b1072a2
--- /dev/null
+++ b/app/test-mldev/test_device_ops.h
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2022 Marvell.
+ */
+
+#ifndef _ML_TEST_DEVICE_OPS_
+#define _ML_TEST_DEVICE_OPS_
+
+#include <rte_common.h>
+
+#include "test_common.h"
+
+struct test_device {
+       /* common data */
+       struct test_common cmn;
+} __rte_cache_aligned;
+
+#endif /* _ML_TEST_DEVICE_OPS_ */
-- 
2.17.1

Reply via email to