[Intel-xe] [PATCH V7 1/6] drm/xe: Add sysfs entries for engines under its GT

Niranjana Vishwanathapura niranjana.vishwanathapura at intel.com
Wed Jul 26 06:23:36 UTC 2023


On Tue, Jul 25, 2023 at 05:19:58PM +0530, Tejas Upadhyay wrote:
>Add engines sysfs directory under its GT and
>create sub directory for all engine class
>(note its not per instance) present on GT.
>
>For example,
>DUT# cat /sys/class/drm/cardX/device/tileN/gtN/engines/
>bcs/ ccs/
>
>V4 :
>   - Rebase to resolve conflicts - CI
>V3 :
>   - Move code in its own file
>   - Rename API name
>V2 :
>   - Correct class mask logic - Himal
>   - Remove extra parenthesis
>
>Signed-off-by: Tejas Upadhyay <tejas.upadhyay at intel.com>
>---
> drivers/gpu/drm/xe/Makefile                |   1 +
> drivers/gpu/drm/xe/xe_engine_class_sysfs.c | 111 +++++++++++++++++++++
> drivers/gpu/drm/xe/xe_engine_class_sysfs.h |  13 +++
> drivers/gpu/drm/xe/xe_gt.c                 |   7 ++
> 4 files changed, 132 insertions(+)
> create mode 100644 drivers/gpu/drm/xe/xe_engine_class_sysfs.c
> create mode 100644 drivers/gpu/drm/xe/xe_engine_class_sysfs.h
>
>diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
>index 4ea9e3150c20..7ced39ee52f8 100644
>--- a/drivers/gpu/drm/xe/Makefile
>+++ b/drivers/gpu/drm/xe/Makefile
>@@ -52,6 +52,7 @@ xe-y += xe_bb.o \
> 	xe_device_sysfs.o \
> 	xe_dma_buf.o \
> 	xe_engine.o \
>+	xe_engine_class_sysfs.o \
> 	xe_exec.o \
> 	xe_execlist.o \
> 	xe_force_wake.o \
>diff --git a/drivers/gpu/drm/xe/xe_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_engine_class_sysfs.c
>new file mode 100644
>index 000000000000..9959b0362d71
>--- /dev/null
>+++ b/drivers/gpu/drm/xe/xe_engine_class_sysfs.c
>@@ -0,0 +1,111 @@
>+// SPDX-License-Identifier: MIT
>+/*
>+ * Copyright © 2023 Intel Corporation
>+ */
>+
>+#include <drm/drm_managed.h>
>+#include <linux/kobject.h>
>+#include <linux/sysfs.h>
>+
>+#include "xe_engine_class_sysfs.h"
>+
>+static void kobj_xe_engine_release(struct kobject *kobj)
>+{
>+	kfree(kobj);
>+}
>+
>+static const struct kobj_type kobj_xe_engine_type = {
>+	.release = kobj_xe_engine_release,
>+	.sysfs_ops = &kobj_sysfs_ops
>+};
>+
>+static struct kobject *
>+kobj_xe_engine(struct kobject *parent, char *name)
>+{
>+	struct kobject *kobj;
>+
>+	kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
>+	if (!kobj)
>+		return NULL;
>+
>+	kobject_init(kobj, &kobj_xe_engine_type);
>+	if (kobject_add(kobj, parent, "%s", name)) {
>+		kobject_put(kobj);
>+		return NULL;
>+	}
>+
>+	return kobj;
>+}
>+
>+static void xe_engine_sysfs_kobj_release(struct kobject *kobj)
>+{
>+	kfree(kobj);
>+}
>+
>+static const struct kobj_type xe_engine_sysfs_kobj_type = {
>+	.release = xe_engine_sysfs_kobj_release,
>+	.sysfs_ops = &kobj_sysfs_ops,
>+};
>+
>+int xe_engine_class_sysfs_init(struct xe_gt *gt)
>+{
>+	struct xe_hw_engine *hwe;
>+	enum xe_hw_engine_id id;
>+	struct kobject *kobj;
>+	u16 class_mask = 0;
>+	int err = 0;
>+
>+	kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
>+	if (!kobj)
>+		return -ENOMEM;
>+
>+	kobject_init(kobj, &xe_engine_sysfs_kobj_type);
>+
>+	err = kobject_add(kobj, gt->sysfs, "engines");
>+	if (err) {
>+		kobject_put(kobj);
>+		return err;
>+	}
>+
>+	for_each_hw_engine(hwe, gt, id) {
>+		char name[MAX_ENGINE_CLASS_NAME_LEN];
>+		struct kobject *khwe;
>+
>+		if (hwe->class == XE_ENGINE_CLASS_OTHER ||
>+		    hwe->class == XE_ENGINE_CLASS_MAX)
>+			continue;
>+
>+		if ((class_mask >> hwe->class) & 1)
>+			continue;
>+
>+		class_mask |= 1 << hwe->class;
>+
>+		switch (hwe->class) {
>+		case XE_ENGINE_CLASS_RENDER:
>+			strcpy(name, "rcs");
>+			break;
>+		case XE_ENGINE_CLASS_VIDEO_DECODE:
>+			strcpy(name, "vcs");
>+			break;
>+		case XE_ENGINE_CLASS_VIDEO_ENHANCE:
>+			strcpy(name, "vecs");
>+			break;
>+		case XE_ENGINE_CLASS_COPY:
>+			strcpy(name, "bcs");
>+			break;
>+		case XE_ENGINE_CLASS_COMPUTE:
>+			strcpy(name, "ccs");
>+			break;
>+		default:
>+			kobject_put(kobj);
>+			return -EINVAL;
>+		}
>+
>+		khwe = kobj_xe_engine(kobj, name);
>+		if (!khwe) {
>+			kobject_put(kobj);
>+			return -EINVAL;
>+		}

NIT...having khwe here and replace it keclass in next patch
seems like patches are not self contained. May be it is better
to start with keclass in this patch itself?

Niranjana

>+	}
>+	return err;
>+}
>diff --git a/drivers/gpu/drm/xe/xe_engine_class_sysfs.h b/drivers/gpu/drm/xe/xe_engine_class_sysfs.h
>new file mode 100644
>index 000000000000..f195dacc1ec6
>--- /dev/null
>+++ b/drivers/gpu/drm/xe/xe_engine_class_sysfs.h
>@@ -0,0 +1,13 @@
>+/* SPDX-License-Identifier: MIT */
>+/*
>+ * Copyright © 2023 Intel Corporation
>+ */
>+
>+#ifndef _XE_ENGINE_CLASS_SYSFS_H_
>+#define _XE_ENGINE_CLASS_SYSFS_H__
>+
>+#include "xe_gt.h"
>+
>+#define MAX_ENGINE_CLASS_NAME_LEN    16
>+int xe_engine_class_sysfs_init(struct xe_gt *gt);
>+#endif
>diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c
>index 3e32d38aeeea..a8176de9f536 100644
>--- a/drivers/gpu/drm/xe/xe_gt.c
>+++ b/drivers/gpu/drm/xe/xe_gt.c
>@@ -14,6 +14,7 @@
> #include "xe_bo.h"
> #include "xe_device.h"
> #include "xe_engine.h"
>+#include "xe_engine_class_sysfs.h"
> #include "xe_execlist.h"
> #include "xe_force_wake.h"
> #include "xe_ggtt.h"
>@@ -322,6 +323,12 @@ static int gt_fw_domain_init(struct xe_gt *gt)
> 	if (err)
> 		goto err_force_wake;
>
>+	err = xe_engine_class_sysfs_init(gt);
>+	if (err)
>+		drm_warn(&gt_to_xe(gt)->drm,
>+			 "failed to register engines sysfs directory, err: %d\n",
>+			 err);
>+
> 	err = xe_force_wake_put(gt_to_fw(gt), XE_FW_GT);
> 	XE_WARN_ON(err);
> 	xe_device_mem_access_put(gt_to_xe(gt));
>-- 
>2.25.1
>


More information about the Intel-xe mailing list