[Accel-config] [PATCH] accel-config: Add API to return uacce device path

ramesh.thomas at intel.com
Newsgroups dev.linux.lists.accel-config
Message-ID <[email protected]>
From: Ramesh Thomas <ramesh.thomas(a)intel.com>

Return path to uacce device path for user wqs. This includes support for
legacy mode device names.

Signed-off-by: Ramesh Thomas <ramesh.thomas(a)intel.com>
---
 accfg/lib/libaccel-config.sym |  5 ++++
 accfg/lib/libaccfg.c          | 55 +++++++++++++++++++++++++++++++++++
 accfg/libaccel_config.h       |  1 +
 3 files changed, 61 insertions(+)

diff --git a/accfg/lib/libaccel-config.sym b/accfg/lib/libaccel-config.sym
index 4de2a49..a28ac97 100644
--- a/accfg/lib/libaccel-config.sym
+++ b/accfg/lib/libaccel-config.sym
@@ -141,3 +141,8 @@ global:
 	accfg_remove_mdev;
 	accfg_device_get_mdev_enabled;
 } LIBACCFG_6;
+
+LIBACCFG_8 {
+global:
+	accfg_wq_get_uacce_path;
+} LIBACCFG_7;
diff --git a/accfg/lib/libaccfg.c b/accfg/lib/libaccfg.c
index 1d89d4c..dd0219c 100644
--- a/accfg/lib/libaccfg.c
+++ b/accfg/lib/libaccfg.c
@@ -25,6 +25,7 @@
 #include <ccan/build_assert/build_assert.h>
 #include <util/sysfs.h>
 #include <accfg/libaccel_config.h>
+#include <fnmatch.h>
 #include "private.h"
 
 #define MDEV_POSTFIX "mdev_supported_types"
@@ -2099,6 +2100,60 @@ ACCFG_EXPORT int accfg_wq_size_boundary(struct accfg_device *device,
 	return 0;
 }
 
+ACCFG_EXPORT int accfg_wq_get_uacce_path(struct accfg_wq *wq, char *buf,
+		size_t size)
+{
+	struct dirent **d;
+	int n, n1;
+	char *f;
+	char p[PATH_MAX];
+	struct accfg_ctx *ctx;
+	int rc = 0;
+
+	ctx = accfg_device_get_ctx(wq->device);
+
+	sprintf(p, "/dev/%s", wq->device->bus_type_str);
+	n1 = n = scandir(p, &d, NULL, alphasort);
+	if (n < 0) {
+		err(ctx, "UACCE device path not found %s\n", p);
+		return -ENOENT;
+	}
+
+	sprintf(p, "%s-*", accfg_wq_get_devname(wq));
+
+	while (n--) {
+		f = &d[n]->d_name[0];
+
+		if (!fnmatch(p, f, 0) || !strcmp(accfg_wq_get_devname(wq), f))
+			break;
+	}
+
+	if (n < 0) {
+		err(ctx, "UACCE device for %s not found at /dev/%s\n",
+				accfg_wq_get_devname(wq),
+				wq->device->bus_type_str);
+		rc = -ENOENT;
+		goto ext_uacce;
+	}
+
+	n = sprintf(p, "/dev/%s/%s", wq->device->bus_type_str, f);
+
+	if ((size_t)n >= size) {
+		err(ctx, "Buffer size too small. Need %d bytes\n", n + 1);
+		rc = -ERANGE;
+		goto ext_uacce;
+	}
+
+	strcpy(buf, p);
+
+ext_uacce:
+	while (n1--)
+		free(d[n1]);
+	free(d);
+
+	return rc;
+}
+
 #define accfg_wq_set_field(wq, val, field) \
 ACCFG_EXPORT int accfg_wq_set_##field( \
 		struct accfg_wq *wq, int val) \
diff --git a/accfg/libaccel_config.h b/accfg/libaccel_config.h
index 94aef80..e61fd40 100644
--- a/accfg/libaccel_config.h
+++ b/accfg/libaccel_config.h
@@ -276,6 +276,7 @@ int accfg_wq_enable(struct accfg_wq *wq);
 int accfg_wq_disable(struct accfg_wq *wq, bool force);
 int accfg_wq_priority_boundary(struct accfg_wq *wq);
 int accfg_wq_size_boundary(struct accfg_device *device, int wq_num);
+int accfg_wq_get_uacce_path(struct accfg_wq *wq, char *buf, size_t size);
 
 /* libaccfg function for engine */
 struct accfg_engine;
-- 
2.26.3
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.