All of lore.kernel.org
 help / color / mirror / Atom feed
* [Accel-config] [PATCH v2 02/12] accel-config: Create mdev structures and load mdevs into device context
@ 2020-12-05  5:38 ramesh.thomas
  0 siblings, 0 replies; only message in thread
From: ramesh.thomas @ 2020-12-05  5:38 UTC (permalink / raw)
  To: accel-config

[-- Attachment #1: Type: text/plain, Size: 4636 bytes --]

From: Ramesh Thomas <ramesh.thomas(a)intel.com>

Lays the foundation for the mdev implementation

- Create private and exported structures for mdev types and mdev list
- Create routines to scan and classify mdevs in sysfs
- Store mdev details in device contexts during init

Signed-off-by: Ramesh Thomas <ramesh.thomas(a)intel.com>
---
 accfg/lib/libaccfg.c    | 81 +++++++++++++++++++++++++++++++++++++++++
 accfg/lib/private.h     |  8 ++++
 accfg/libaccel_config.h |  7 ++++
 3 files changed, 96 insertions(+)

diff --git a/accfg/lib/libaccfg.c b/accfg/lib/libaccfg.c
index 8b35602..27f097f 100644
--- a/accfg/lib/libaccfg.c
+++ b/accfg/lib/libaccfg.c
@@ -43,6 +43,12 @@ ACCFG_EXPORT char *accfg_basenames[] = {
 	NULL
 };
 
+ACCFG_EXPORT char *accfg_mdev_basenames[] = {
+	[ACCFG_MDEV_TYPE_1_DWQ]      = "1dwq",
+	[ACCFG_MDEV_TYPE_1_SWQ]      = "1swq",
+	NULL
+};
+
 enum {
 	ACCFG_CMD_STATUS_MAX = 0x45,
 };
@@ -407,6 +413,77 @@ static int device_parse_type(struct accfg_device *device)
 	return 0;
 }
 
+static int mdev_str_to_type(char *mdev_type_str)
+{
+	char **b;
+	char *s;
+	int l, i;
+
+	s = strchr(mdev_type_str, '-');
+	if (!s)
+		s = mdev_type_str;
+	else
+		s++;
+	l = (int) (strchrnul(s, '-') - s);
+
+	for (b = accfg_mdev_basenames, i = 0; *b != NULL; b++, i++)
+		if (!strncmp(*b, s, l))
+			return i;
+
+	return ACCFG_MDEV_TYPE_UNKNOWN;
+}
+
+static int add_device_mdevs(struct accfg_ctx *ctx, struct accfg_device *dev)
+{
+	struct accfg_device_mdev *dev_mdev;
+	uuid_t uu;
+	struct dirent **d;
+	char *f, *mdev_type_str;
+	char p[PATH_MAX];
+	char mdev_path[PATH_MAX];
+	int n, n1, rc = 0;
+
+	n1 = n = scandir(dev->mdev_path, &d, NULL, alphasort);
+	if (n < 0) {
+		err(ctx, "scandir failed\n");
+		return -ENOENT;
+	}
+
+	while (n--) {
+		f = &d[n]->d_name[0];
+		if (*f == '.' || uuid_parse(f, uu))
+			continue;
+		sprintf(p, "%s/%s/mdev_type", dev->mdev_path, f);
+		if (!realpath(p, mdev_path))
+			continue;
+		dev_mdev = calloc(1,
+			sizeof(struct accfg_device_mdev));
+		if (!dev_mdev) {
+			err(ctx, "allocation failed\n");
+			rc = -ENOMEM;
+			goto exit_add_mdev;
+		}
+		uuid_copy(dev_mdev->uuid, uu);
+		mdev_type_str = strrchr(mdev_path, '/') + 1;
+		dev_mdev->device = dev;
+		dev_mdev->type = mdev_str_to_type(mdev_type_str);
+		if (dev_mdev->type == ACCFG_MDEV_TYPE_UNKNOWN) {
+			err(ctx, "mdev type error\n");
+			free(dev_mdev);
+			rc = -EINVAL;
+			goto exit_add_mdev;
+		}
+		list_add_tail(&dev->mdev_list, &dev_mdev->list);
+	}
+
+exit_add_mdev:
+	while (n1--)
+		free(d[n1]);
+	free(d);
+
+	return rc;
+}
+
 static void *add_device(void *parent, int id, const char *ctl_base, char *dev_prefix)
 {
 	struct accfg_ctx *ctx = parent;
@@ -439,6 +516,7 @@ static void *add_device(void *parent, int id, const char *ctl_base, char *dev_pr
 	list_head_init(&device->groups);
 	list_head_init(&device->wqs);
 	list_head_init(&device->engines);
+	list_head_init(&device->mdev_list);
 
 	device->ctx = ctx;
 	device->id = id;
@@ -501,6 +579,9 @@ static void *add_device(void *parent, int id, const char *ctl_base, char *dev_pr
 	list_add_tail(&ctx->devices, &device->list);
 	free(path);
 
+	if (add_device_mdevs(ctx, device))
+		goto err_dev_path;
+
 	return device;
 
 err_dev_path:
diff --git a/accfg/lib/private.h b/accfg/lib/private.h
index 365d484..305d73e 100644
--- a/accfg/lib/private.h
+++ b/accfg/lib/private.h
@@ -35,6 +35,7 @@ struct accfg_device {
 	char *device_type_str;
 	enum accfg_device_type type;
         size_t buf_len;
+	struct list_head mdev_list;
 
 	/* Device Attributes */
 	struct accfg_error errors;
@@ -56,6 +57,13 @@ struct accfg_device {
 	char *pasid_enabled;
 };
 
+struct accfg_device_mdev {
+	struct accfg_device *device;
+	uuid_t uuid;
+	enum accfg_mdev_type type;
+	struct list_node list;
+};
+
 struct accfg_group {
         struct accfg_device *device;
         int id;
diff --git a/accfg/libaccel_config.h b/accfg/libaccel_config.h
index f85670c..e89bd40 100644
--- a/accfg/libaccel_config.h
+++ b/accfg/libaccel_config.h
@@ -67,6 +67,12 @@ enum accfg_control_flag {
 	ACCFG_WQ_DISABLE,
 };
 
+enum accfg_mdev_type {
+	ACCFG_MDEV_TYPE_1_DWQ,
+	ACCFG_MDEV_TYPE_1_SWQ,
+	ACCFG_MDEV_TYPE_UNKNOWN,
+};
+
 /* no need to save device error */
 struct accfg_error {
         uint64_t val[4];
@@ -78,6 +84,7 @@ struct dev_parameters {
 };
 
 extern char *accfg_basenames[];
+extern char *accfg_mdev_basenames[];
 
 struct group_parameters {
 	unsigned int tokens_reserved;
-- 
2.26.2

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2020-12-05  5:38 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-05  5:38 [Accel-config] [PATCH v2 02/12] accel-config: Create mdev structures and load mdevs into device context ramesh.thomas

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.