xref: /linux/drivers/gpu/drm/xe/xe_gt_sysfs.c (revision dd08ebf6c3525a7ea2186e636df064ea47281987)
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2022 Intel Corporation
4  */
5 
6 #include <linux/kobject.h>
7 #include <linux/sysfs.h>
8 #include <drm/drm_managed.h>
9 #include "xe_gt.h"
10 #include "xe_gt_sysfs.h"
11 
12 static void xe_gt_sysfs_kobj_release(struct kobject *kobj)
13 {
14 	kfree(kobj);
15 }
16 
17 static struct kobj_type xe_gt_sysfs_kobj_type = {
18 	.release = xe_gt_sysfs_kobj_release,
19 	.sysfs_ops = &kobj_sysfs_ops,
20 };
21 
22 static void gt_sysfs_fini(struct drm_device *drm, void *arg)
23 {
24 	struct xe_gt *gt = arg;
25 
26 	kobject_put(gt->sysfs);
27 }
28 
29 int xe_gt_sysfs_init(struct xe_gt *gt)
30 {
31 	struct device *dev = gt_to_xe(gt)->drm.dev;
32 	struct kobj_gt *kg;
33 	int err;
34 
35 	kg = kzalloc(sizeof(*kg), GFP_KERNEL);
36 	if (!kg)
37 		return -ENOMEM;
38 
39 	kobject_init(&kg->base, &xe_gt_sysfs_kobj_type);
40 	kg->gt = gt;
41 
42 	err = kobject_add(&kg->base, &dev->kobj, "gt%d", gt->info.id);
43 	if (err) {
44 		kobject_put(&kg->base);
45 		return err;
46 	}
47 
48 	gt->sysfs = &kg->base;
49 
50 	err = drmm_add_action_or_reset(&gt_to_xe(gt)->drm, gt_sysfs_fini, gt);
51 	if (err)
52 		return err;
53 
54 	return 0;
55 }
56