[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