1 // SPDX-License-Identifier: MIT 2 /* 3 * Copyright © 2023 Intel Corporation 4 */ 5 6 #include <linux/kobject.h> 7 #include <linux/sysfs.h> 8 #include <drm/drm_managed.h> 9 10 #include "xe_pm.h" 11 #include "xe_tile.h" 12 #include "xe_tile_sysfs.h" 13 #include "xe_vram_freq.h" 14 15 static void xe_tile_sysfs_kobj_release(struct kobject *kobj) 16 { 17 kfree(kobj); 18 } 19 20 static const struct kobj_type xe_tile_sysfs_kobj_type = { 21 .release = xe_tile_sysfs_kobj_release, 22 .sysfs_ops = &kobj_sysfs_ops, 23 }; 24 25 static void tile_sysfs_fini(struct drm_device *drm, void *arg) 26 { 27 struct xe_tile *tile = arg; 28 29 kobject_put(tile->sysfs); 30 } 31 32 void xe_tile_sysfs_init(struct xe_tile *tile) 33 { 34 struct xe_device *xe = tile_to_xe(tile); 35 struct device *dev = xe->drm.dev; 36 struct kobj_tile *kt; 37 int err; 38 39 kt = kzalloc(sizeof(*kt), GFP_KERNEL); 40 if (!kt) 41 return; 42 43 kobject_init(&kt->base, &xe_tile_sysfs_kobj_type); 44 kt->tile = tile; 45 46 err = kobject_add(&kt->base, &dev->kobj, "tile%d", tile->id); 47 if (err) { 48 kobject_put(&kt->base); 49 drm_warn(&xe->drm, "failed to register TILE sysfs directory, err: %d\n", err); 50 return; 51 } 52 53 tile->sysfs = &kt->base; 54 55 xe_vram_freq_sysfs_init(tile); 56 57 err = drmm_add_action_or_reset(&xe->drm, tile_sysfs_fini, tile); 58 if (err) 59 drm_warn(&xe->drm, "%s: drmm_add_action_or_reset failed, err: %d\n", 60 __func__, err); 61 } 62