#include "xe_migrate.h"
 #include "xe_sa.h"
 #include "xe_tile.h"
+#include "xe_tile_sysfs.h"
 #include "xe_ttm_vram_mgr.h"
 
 /**
        if (IS_ERR(tile->mem.kernel_bb_pool))
                err = PTR_ERR(tile->mem.kernel_bb_pool);
 
+       xe_tile_sysfs_init(tile);
+
 err_mem_access:
        xe_device_mem_access_put(tile_to_xe(tile));
        return err;
 
--- /dev/null
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#include <linux/kobject.h>
+#include <linux/sysfs.h>
+#include <drm/drm_managed.h>
+
+#include "xe_tile.h"
+#include "xe_tile_sysfs.h"
+
+static void xe_tile_sysfs_kobj_release(struct kobject *kobj)
+{
+       kfree(kobj);
+}
+
+static const struct kobj_type xe_tile_sysfs_kobj_type = {
+       .release = xe_tile_sysfs_kobj_release,
+       .sysfs_ops = &kobj_sysfs_ops,
+};
+
+static void tile_sysfs_fini(struct drm_device *drm, void *arg)
+{
+       struct xe_tile *tile = arg;
+
+       kobject_put(tile->sysfs);
+}
+
+void xe_tile_sysfs_init(struct xe_tile *tile)
+{
+       struct xe_device *xe = tile_to_xe(tile);
+       struct device *dev = xe->drm.dev;
+       struct kobj_tile *kt;
+       int err;
+
+       kt = kzalloc(sizeof(*kt), GFP_KERNEL);
+       if (!kt)
+               return;
+
+       kobject_init(&kt->base, &xe_tile_sysfs_kobj_type);
+       kt->tile = tile;
+
+       err = kobject_add(&kt->base, &dev->kobj, "tile%d", tile->id);
+       if (err) {
+               kobject_put(&kt->base);
+               drm_warn(&xe->drm, "failed to register TILE sysfs directory, err: %d\n", err);
+               return;
+       }
+
+       tile->sysfs = &kt->base;
+
+       err = drmm_add_action_or_reset(&xe->drm, tile_sysfs_fini, tile);
+       if (err) {
+               drm_warn(&xe->drm, "%s: drmm_add_action_or_reset failed, err: %d\n",
+                        __func__, err);
+               return;
+       }
+}
 
--- /dev/null
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#ifndef _XE_TILE_SYSFS_H_
+#define _XE_TILE_SYSFS_H_
+
+#include "xe_tile_sysfs_types.h"
+
+void xe_tile_sysfs_init(struct xe_tile *tile);
+
+static inline struct xe_tile *
+kobj_to_tile(struct kobject *kobj)
+{
+       return container_of(kobj, struct kobj_tile, base)->tile;
+}
+
+#endif /* _XE_TILE_SYSFS_H_ */
 
--- /dev/null
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#ifndef _XE_TILE_SYSFS_TYPES_H_
+#define _XE_TILE_SYSFS_TYPES_H_
+
+#include <linux/kobject.h>
+
+struct xe_tile;
+
+/**
+ * struct kobj_tile - A tile's kobject struct that connects the kobject
+ * and the TILE
+ *
+ * When dealing with multiple TILEs, this struct helps to understand which
+ * TILE needs to be addressed on a given sysfs call.
+ */
+struct kobj_tile {
+       /** @base: The actual kobject */
+       struct kobject base;
+       /** @tile: A pointer to the tile itself */
+       struct xe_tile *tile;
+};
+
+#endif /* _XE_TILE_SYSFS_TYPES_H_ */