Author | Tokens | Token Proportion | Commits | Commit Proportion |
---|---|---|---|---|
Andi Shyti | 347 | 85.26% | 2 | 50.00% |
Ashutosh Dixit | 60 | 14.74% | 2 | 50.00% |
Total | 407 | 4 |
// SPDX-License-Identifier: MIT /* * Copyright © 2022 Intel Corporation */ #include <drm/drm_device.h> #include <linux/device.h> #include <linux/kobject.h> #include <linux/printk.h> #include <linux/sysfs.h> #include "i915_drv.h" #include "i915_sysfs.h" #include "intel_gt.h" #include "intel_gt_sysfs.h" #include "intel_gt_sysfs_pm.h" #include "intel_gt_types.h" #include "intel_rc6.h" bool is_object_gt(struct kobject *kobj) { return !strncmp(kobj->name, "gt", 2); } struct intel_gt *intel_gt_sysfs_get_drvdata(struct device *dev, const char *name) { struct kobject *kobj = &dev->kobj; /* * We are interested at knowing from where the interface * has been called, whether it's called from gt/ or from * the parent directory. * From the interface position it depends also the value of * the private data. * If the interface is called from gt/ then private data is * of the "struct intel_gt *" type, otherwise it's * a * "struct drm_i915_private *" type. */ if (!is_object_gt(kobj)) { struct drm_i915_private *i915 = kdev_minor_to_i915(dev); return to_gt(i915); } return kobj_to_gt(kobj); } static struct kobject *gt_get_parent_obj(struct intel_gt *gt) { return >->i915->drm.primary->kdev->kobj; } static ssize_t id_show(struct device *dev, struct device_attribute *attr, char *buf) { struct intel_gt *gt = intel_gt_sysfs_get_drvdata(dev, attr->attr.name); return sysfs_emit(buf, "%u\n", gt->info.id); } static DEVICE_ATTR_RO(id); static struct attribute *id_attrs[] = { &dev_attr_id.attr, NULL, }; ATTRIBUTE_GROUPS(id); /* A kobject needs a release() method even if it does nothing */ static void kobj_gt_release(struct kobject *kobj) { } static struct kobj_type kobj_gt_type = { .release = kobj_gt_release, .sysfs_ops = &kobj_sysfs_ops, .default_groups = id_groups, }; void intel_gt_sysfs_register(struct intel_gt *gt) { /* * We need to make things right with the * ABI compatibility. The files were originally * generated under the parent directory. * * We generate the files only for gt 0 * to avoid duplicates. */ if (gt_is_root(gt)) intel_gt_sysfs_pm_init(gt, gt_get_parent_obj(gt)); /* init and xfer ownership to sysfs tree */ if (kobject_init_and_add(>->sysfs_gt, &kobj_gt_type, gt->i915->sysfs_gt, "gt%d", gt->info.id)) goto exit_fail; gt->sysfs_defaults = kobject_create_and_add(".defaults", >->sysfs_gt); if (!gt->sysfs_defaults) goto exit_fail; intel_gt_sysfs_pm_init(gt, >->sysfs_gt); return; exit_fail: kobject_put(>->sysfs_gt); drm_warn(>->i915->drm, "failed to initialize gt%d sysfs root\n", gt->info.id); } void intel_gt_sysfs_unregister(struct intel_gt *gt) { kobject_put(gt->sysfs_defaults); kobject_put(>->sysfs_gt); }
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with Cregit http://github.com/cregit/cregit
Version 2.0-RC1