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(>_to_xe(gt)->drm, gt_sysfs_fini, gt); 51 if (err) 52 return err; 53 54 return 0; 55 } 56