129369778SSrikanth Yalavarthi /* SPDX-License-Identifier: BSD-3-Clause
229369778SSrikanth Yalavarthi * Copyright (c) 2022 Marvell.
329369778SSrikanth Yalavarthi */
429369778SSrikanth Yalavarthi
529369778SSrikanth Yalavarthi #include <errno.h>
629369778SSrikanth Yalavarthi
729369778SSrikanth Yalavarthi #include <rte_common.h>
8fccf444cSSrikanth Yalavarthi #include <rte_malloc.h>
929369778SSrikanth Yalavarthi #include <rte_memory.h>
1029369778SSrikanth Yalavarthi #include <rte_mldev.h>
1129369778SSrikanth Yalavarthi
1229369778SSrikanth Yalavarthi #include "ml_common.h"
1329369778SSrikanth Yalavarthi #include "test_common.h"
1429369778SSrikanth Yalavarthi
15fccf444cSSrikanth Yalavarthi #include <fcntl.h>
16fccf444cSSrikanth Yalavarthi #include <sys/mman.h>
17fccf444cSSrikanth Yalavarthi #include <sys/stat.h>
18fccf444cSSrikanth Yalavarthi #include <unistd.h>
19fccf444cSSrikanth Yalavarthi
20fccf444cSSrikanth Yalavarthi int
ml_read_file(char * file,size_t * size,char ** buffer)21fccf444cSSrikanth Yalavarthi ml_read_file(char *file, size_t *size, char **buffer)
22fccf444cSSrikanth Yalavarthi {
23fccf444cSSrikanth Yalavarthi char *file_buffer = NULL;
24fccf444cSSrikanth Yalavarthi struct stat file_stat;
25fccf444cSSrikanth Yalavarthi char *file_map;
26fccf444cSSrikanth Yalavarthi int ret;
27fccf444cSSrikanth Yalavarthi int fd;
28fccf444cSSrikanth Yalavarthi
29fccf444cSSrikanth Yalavarthi fd = open(file, O_RDONLY);
30fccf444cSSrikanth Yalavarthi if (fd == -1) {
31fccf444cSSrikanth Yalavarthi ml_err("Failed to open file: %s\n", file);
32fccf444cSSrikanth Yalavarthi return -errno;
33fccf444cSSrikanth Yalavarthi }
34fccf444cSSrikanth Yalavarthi
35fccf444cSSrikanth Yalavarthi if (fstat(fd, &file_stat) != 0) {
36fccf444cSSrikanth Yalavarthi ml_err("fstat failed for file: %s\n", file);
37854f380fSSrikanth Yalavarthi close(fd);
38fccf444cSSrikanth Yalavarthi return -errno;
39fccf444cSSrikanth Yalavarthi }
40fccf444cSSrikanth Yalavarthi
41fccf444cSSrikanth Yalavarthi file_buffer = malloc(file_stat.st_size);
42fccf444cSSrikanth Yalavarthi if (file_buffer == NULL) {
43fccf444cSSrikanth Yalavarthi ml_err("Failed to allocate memory: %s\n", file);
44fccf444cSSrikanth Yalavarthi ret = -ENOMEM;
45fccf444cSSrikanth Yalavarthi goto error;
46fccf444cSSrikanth Yalavarthi }
47fccf444cSSrikanth Yalavarthi
48fccf444cSSrikanth Yalavarthi file_map = mmap(0, file_stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
49fccf444cSSrikanth Yalavarthi if (file_map == MAP_FAILED) {
50fccf444cSSrikanth Yalavarthi ml_err("Failed to map file: %s\n", file);
51fccf444cSSrikanth Yalavarthi ret = -errno;
52fccf444cSSrikanth Yalavarthi goto error;
53fccf444cSSrikanth Yalavarthi }
54fccf444cSSrikanth Yalavarthi
55fccf444cSSrikanth Yalavarthi rte_memcpy(file_buffer, file_map, file_stat.st_size);
56fccf444cSSrikanth Yalavarthi munmap(file_map, file_stat.st_size);
57fccf444cSSrikanth Yalavarthi close(fd);
58fccf444cSSrikanth Yalavarthi
59fccf444cSSrikanth Yalavarthi *size = file_stat.st_size;
60fccf444cSSrikanth Yalavarthi *buffer = file_buffer;
61fccf444cSSrikanth Yalavarthi
62fccf444cSSrikanth Yalavarthi return 0;
63fccf444cSSrikanth Yalavarthi
64fccf444cSSrikanth Yalavarthi error:
65fccf444cSSrikanth Yalavarthi free(file_buffer);
66fccf444cSSrikanth Yalavarthi close(fd);
67fccf444cSSrikanth Yalavarthi
68fccf444cSSrikanth Yalavarthi return ret;
69fccf444cSSrikanth Yalavarthi }
70fccf444cSSrikanth Yalavarthi
7129369778SSrikanth Yalavarthi bool
ml_test_cap_check(struct ml_options * opt)7229369778SSrikanth Yalavarthi ml_test_cap_check(struct ml_options *opt)
7329369778SSrikanth Yalavarthi {
7429369778SSrikanth Yalavarthi struct rte_ml_dev_info dev_info;
7529369778SSrikanth Yalavarthi
7629369778SSrikanth Yalavarthi rte_ml_dev_info_get(opt->dev_id, &dev_info);
7729369778SSrikanth Yalavarthi if (dev_info.max_models == 0) {
7829369778SSrikanth Yalavarthi ml_err("Not enough mldev models supported = %u", dev_info.max_models);
7929369778SSrikanth Yalavarthi return false;
8029369778SSrikanth Yalavarthi }
8129369778SSrikanth Yalavarthi
8229369778SSrikanth Yalavarthi return true;
8329369778SSrikanth Yalavarthi }
8429369778SSrikanth Yalavarthi
8529369778SSrikanth Yalavarthi int
ml_test_opt_check(struct ml_options * opt)8629369778SSrikanth Yalavarthi ml_test_opt_check(struct ml_options *opt)
8729369778SSrikanth Yalavarthi {
8829369778SSrikanth Yalavarthi uint16_t dev_count;
8929369778SSrikanth Yalavarthi int socket_id;
9029369778SSrikanth Yalavarthi
9129369778SSrikanth Yalavarthi RTE_SET_USED(opt);
9229369778SSrikanth Yalavarthi
9329369778SSrikanth Yalavarthi dev_count = rte_ml_dev_count();
9429369778SSrikanth Yalavarthi if (dev_count == 0) {
9529369778SSrikanth Yalavarthi ml_err("No ML devices found");
9629369778SSrikanth Yalavarthi return -ENODEV;
9729369778SSrikanth Yalavarthi }
9829369778SSrikanth Yalavarthi
9928a4a819SSrikanth Yalavarthi if ((opt->dev_id >= dev_count) || (opt->dev_id < 0)) {
10028a4a819SSrikanth Yalavarthi ml_err("Invalid option, dev_id = %d", opt->dev_id);
10129369778SSrikanth Yalavarthi return -EINVAL;
10229369778SSrikanth Yalavarthi }
10329369778SSrikanth Yalavarthi
10429369778SSrikanth Yalavarthi socket_id = rte_ml_dev_socket_id(opt->dev_id);
10528a4a819SSrikanth Yalavarthi if ((opt->socket_id != SOCKET_ID_ANY) && (opt->socket_id != socket_id)) {
10629369778SSrikanth Yalavarthi ml_err("Invalid option, socket_id = %d\n", opt->socket_id);
10729369778SSrikanth Yalavarthi return -EINVAL;
10829369778SSrikanth Yalavarthi }
10929369778SSrikanth Yalavarthi
110*7c4da162SSrikanth Yalavarthi if (opt->queue_pairs == 0) {
111*7c4da162SSrikanth Yalavarthi ml_err("Invalid option, queue_pairs = %d", opt->queue_pairs);
112*7c4da162SSrikanth Yalavarthi return -EINVAL;
113*7c4da162SSrikanth Yalavarthi }
114*7c4da162SSrikanth Yalavarthi
115*7c4da162SSrikanth Yalavarthi if (opt->queue_size == 0) {
116*7c4da162SSrikanth Yalavarthi ml_err("Invalid option, queue_size = %d", opt->queue_size);
117*7c4da162SSrikanth Yalavarthi return -EINVAL;
118*7c4da162SSrikanth Yalavarthi }
119*7c4da162SSrikanth Yalavarthi
12029369778SSrikanth Yalavarthi return 0;
12129369778SSrikanth Yalavarthi }
12229369778SSrikanth Yalavarthi
12329369778SSrikanth Yalavarthi void
ml_test_opt_dump(struct ml_options * opt)12429369778SSrikanth Yalavarthi ml_test_opt_dump(struct ml_options *opt)
12529369778SSrikanth Yalavarthi {
12629369778SSrikanth Yalavarthi ml_options_dump(opt);
12729369778SSrikanth Yalavarthi }
12829369778SSrikanth Yalavarthi
12929369778SSrikanth Yalavarthi int
ml_test_device_configure(struct ml_test * test,struct ml_options * opt)13029369778SSrikanth Yalavarthi ml_test_device_configure(struct ml_test *test, struct ml_options *opt)
13129369778SSrikanth Yalavarthi {
13229369778SSrikanth Yalavarthi struct test_common *t = ml_test_priv(test);
13329369778SSrikanth Yalavarthi struct rte_ml_dev_config dev_config;
13429369778SSrikanth Yalavarthi int ret;
13529369778SSrikanth Yalavarthi
13629369778SSrikanth Yalavarthi ret = rte_ml_dev_info_get(opt->dev_id, &t->dev_info);
13729369778SSrikanth Yalavarthi if (ret != 0) {
13829369778SSrikanth Yalavarthi ml_err("Failed to get mldev info, dev_id = %d\n", opt->dev_id);
13929369778SSrikanth Yalavarthi return ret;
14029369778SSrikanth Yalavarthi }
14129369778SSrikanth Yalavarthi
14229369778SSrikanth Yalavarthi /* configure device */
14329369778SSrikanth Yalavarthi dev_config.socket_id = opt->socket_id;
14429369778SSrikanth Yalavarthi dev_config.nb_models = t->dev_info.max_models;
145c0e87165SSrikanth Yalavarthi dev_config.nb_queue_pairs = opt->queue_pairs;
14629369778SSrikanth Yalavarthi ret = rte_ml_dev_configure(opt->dev_id, &dev_config);
14729369778SSrikanth Yalavarthi if (ret != 0) {
14829369778SSrikanth Yalavarthi ml_err("Failed to configure ml device, dev_id = %d\n", opt->dev_id);
14929369778SSrikanth Yalavarthi return ret;
15029369778SSrikanth Yalavarthi }
15129369778SSrikanth Yalavarthi
15229369778SSrikanth Yalavarthi return 0;
15329369778SSrikanth Yalavarthi }
15429369778SSrikanth Yalavarthi
15529369778SSrikanth Yalavarthi int
ml_test_device_close(struct ml_test * test,struct ml_options * opt)15629369778SSrikanth Yalavarthi ml_test_device_close(struct ml_test *test, struct ml_options *opt)
15729369778SSrikanth Yalavarthi {
15829369778SSrikanth Yalavarthi struct test_common *t = ml_test_priv(test);
15929369778SSrikanth Yalavarthi int ret = 0;
16029369778SSrikanth Yalavarthi
16129369778SSrikanth Yalavarthi RTE_SET_USED(t);
16229369778SSrikanth Yalavarthi
16329369778SSrikanth Yalavarthi /* close device */
16429369778SSrikanth Yalavarthi ret = rte_ml_dev_close(opt->dev_id);
16529369778SSrikanth Yalavarthi if (ret != 0)
16629369778SSrikanth Yalavarthi ml_err("Failed to close ML device, dev_id = %d\n", opt->dev_id);
16729369778SSrikanth Yalavarthi
16829369778SSrikanth Yalavarthi return ret;
16929369778SSrikanth Yalavarthi }
17029369778SSrikanth Yalavarthi
17129369778SSrikanth Yalavarthi int
ml_test_device_start(struct ml_test * test,struct ml_options * opt)17229369778SSrikanth Yalavarthi ml_test_device_start(struct ml_test *test, struct ml_options *opt)
17329369778SSrikanth Yalavarthi {
17429369778SSrikanth Yalavarthi struct test_common *t = ml_test_priv(test);
17529369778SSrikanth Yalavarthi int ret;
17629369778SSrikanth Yalavarthi
17729369778SSrikanth Yalavarthi RTE_SET_USED(t);
17829369778SSrikanth Yalavarthi
17929369778SSrikanth Yalavarthi /* start device */
18029369778SSrikanth Yalavarthi ret = rte_ml_dev_start(opt->dev_id);
18129369778SSrikanth Yalavarthi if (ret != 0) {
18229369778SSrikanth Yalavarthi ml_err("Failed to start ml device, dev_id = %d\n", opt->dev_id);
18329369778SSrikanth Yalavarthi return ret;
18429369778SSrikanth Yalavarthi }
18529369778SSrikanth Yalavarthi
18629369778SSrikanth Yalavarthi return 0;
18729369778SSrikanth Yalavarthi }
18829369778SSrikanth Yalavarthi
18929369778SSrikanth Yalavarthi int
ml_test_device_stop(struct ml_test * test,struct ml_options * opt)19029369778SSrikanth Yalavarthi ml_test_device_stop(struct ml_test *test, struct ml_options *opt)
19129369778SSrikanth Yalavarthi {
19229369778SSrikanth Yalavarthi struct test_common *t = ml_test_priv(test);
19329369778SSrikanth Yalavarthi int ret = 0;
19429369778SSrikanth Yalavarthi
19529369778SSrikanth Yalavarthi RTE_SET_USED(t);
19629369778SSrikanth Yalavarthi
19729369778SSrikanth Yalavarthi /* stop device */
19829369778SSrikanth Yalavarthi ret = rte_ml_dev_stop(opt->dev_id);
19929369778SSrikanth Yalavarthi if (ret != 0)
20029369778SSrikanth Yalavarthi ml_err("Failed to stop ML device, dev_id = %d\n", opt->dev_id);
20129369778SSrikanth Yalavarthi
20229369778SSrikanth Yalavarthi return ret;
20329369778SSrikanth Yalavarthi }
204