@@ -13,6 +13,7 @@ sources = files(
'ml_test.c',
'parser.c',
'test_common.c',
+ 'test_device_ops.c',
)
deps += ['mldev']
@@ -24,7 +24,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;
@@ -66,7 +66,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
new file mode 100644
@@ -0,0 +1,234 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2022 Marvell.
+ */
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <rte_common.h>
+#include <rte_malloc.h>
+#include <rte_mldev.h>
+
+#include "ml_common.h"
+#include "ml_options.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);
new file mode 100644
@@ -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_ */