Commit a5c71fd5 authored by Tejas Upadhyay's avatar Tejas Upadhyay Committed by Lucas De Marchi
Browse files

drm/xe/hw_engine: define sysfs_ops on all directories



Sysfs_ops needs to be defined on all directories which
can have attr files with set/get method. Add sysfs_ops
to even those directories which is currently empty but
would have attr files with set/get method in future.
Leave .default with default sysfs_ops as it will never
have setter method.

V2(Himal/Rodrigo):
 - use single sysfs_ops for all dir and attr with set/get
 - add default ops as ./default does not need runtime pm at all

Fixes: 3f0e1465 ("drm/xe: Runtime PM wake on every sysfs call")
Reviewed-by: default avatarHimal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250327122647.886637-1-tejas.upadhyay@intel.com


Signed-off-by: default avatarTejas Upadhyay <tejas.upadhyay@intel.com>
(cherry picked from commit 40780b97)
Signed-off-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
parent 20659d31
Loading
Loading
Loading
Loading
+52 −56
Original line number Diff line number Diff line
@@ -32,14 +32,61 @@ bool xe_hw_engine_timeout_in_range(u64 timeout, u64 min, u64 max)
	return timeout >= min && timeout <= max;
}

static void kobj_xe_hw_engine_release(struct kobject *kobj)
static void xe_hw_engine_sysfs_kobj_release(struct kobject *kobj)
{
	kfree(kobj);
}

static ssize_t xe_hw_engine_class_sysfs_attr_show(struct kobject *kobj,
						  struct attribute *attr,
						  char *buf)
{
	struct xe_device *xe = kobj_to_xe(kobj);
	struct kobj_attribute *kattr;
	ssize_t ret = -EIO;

	kattr = container_of(attr, struct kobj_attribute, attr);
	if (kattr->show) {
		xe_pm_runtime_get(xe);
		ret = kattr->show(kobj, kattr, buf);
		xe_pm_runtime_put(xe);
	}

	return ret;
}

static ssize_t xe_hw_engine_class_sysfs_attr_store(struct kobject *kobj,
						   struct attribute *attr,
						   const char *buf,
						   size_t count)
{
	struct xe_device *xe = kobj_to_xe(kobj);
	struct kobj_attribute *kattr;
	ssize_t ret = -EIO;

	kattr = container_of(attr, struct kobj_attribute, attr);
	if (kattr->store) {
		xe_pm_runtime_get(xe);
		ret = kattr->store(kobj, kattr, buf, count);
		xe_pm_runtime_put(xe);
	}

	return ret;
}

static const struct sysfs_ops xe_hw_engine_class_sysfs_ops = {
	.show = xe_hw_engine_class_sysfs_attr_show,
	.store = xe_hw_engine_class_sysfs_attr_store,
};

static const struct kobj_type kobj_xe_hw_engine_type = {
	.release = kobj_xe_hw_engine_release,
	.sysfs_ops = &kobj_sysfs_ops
	.release = xe_hw_engine_sysfs_kobj_release,
	.sysfs_ops = &xe_hw_engine_class_sysfs_ops,
};

static const struct kobj_type kobj_xe_hw_engine_type_def = {
	.release = xe_hw_engine_sysfs_kobj_release,
	.sysfs_ops = &kobj_sysfs_ops,
};

static ssize_t job_timeout_max_store(struct kobject *kobj,
@@ -543,7 +590,7 @@ static int xe_add_hw_engine_class_defaults(struct xe_device *xe,
	if (!kobj)
		return -ENOMEM;

	kobject_init(kobj, &kobj_xe_hw_engine_type);
	kobject_init(kobj, &kobj_xe_hw_engine_type_def);
	err = kobject_add(kobj, parent, "%s", ".defaults");
	if (err)
		goto err_object;
@@ -559,57 +606,6 @@ static int xe_add_hw_engine_class_defaults(struct xe_device *xe,
	return err;
}

static void xe_hw_engine_sysfs_kobj_release(struct kobject *kobj)
{
	kfree(kobj);
}

static ssize_t xe_hw_engine_class_sysfs_attr_show(struct kobject *kobj,
						  struct attribute *attr,
						  char *buf)
{
	struct xe_device *xe = kobj_to_xe(kobj);
	struct kobj_attribute *kattr;
	ssize_t ret = -EIO;

	kattr = container_of(attr, struct kobj_attribute, attr);
	if (kattr->show) {
		xe_pm_runtime_get(xe);
		ret = kattr->show(kobj, kattr, buf);
		xe_pm_runtime_put(xe);
	}

	return ret;
}

static ssize_t xe_hw_engine_class_sysfs_attr_store(struct kobject *kobj,
						   struct attribute *attr,
						   const char *buf,
						   size_t count)
{
	struct xe_device *xe = kobj_to_xe(kobj);
	struct kobj_attribute *kattr;
	ssize_t ret = -EIO;

	kattr = container_of(attr, struct kobj_attribute, attr);
	if (kattr->store) {
		xe_pm_runtime_get(xe);
		ret = kattr->store(kobj, kattr, buf, count);
		xe_pm_runtime_put(xe);
	}

	return ret;
}

static const struct sysfs_ops xe_hw_engine_class_sysfs_ops = {
	.show = xe_hw_engine_class_sysfs_attr_show,
	.store = xe_hw_engine_class_sysfs_attr_store,
};

static const struct kobj_type xe_hw_engine_sysfs_kobj_type = {
	.release = xe_hw_engine_sysfs_kobj_release,
	.sysfs_ops = &xe_hw_engine_class_sysfs_ops,
};

static void hw_engine_class_sysfs_fini(void *arg)
{
@@ -640,7 +636,7 @@ int xe_hw_engine_class_sysfs_init(struct xe_gt *gt)
	if (!kobj)
		return -ENOMEM;

	kobject_init(kobj, &xe_hw_engine_sysfs_kobj_type);
	kobject_init(kobj, &kobj_xe_hw_engine_type);

	err = kobject_add(kobj, gt->sysfs, "engines");
	if (err)