if (!xe)
                return -EINVAL;
 
+       xe_pm_runtime_get(xe);
        ret = sysfs_emit(buf, "%d\n", xe->d3cold.vram_threshold);
+       xe_pm_runtime_put(xe);
 
        return ret;
 }
 
        drm_dbg(&xe->drm, "vram_d3cold_threshold: %u\n", vram_d3cold_threshold);
 
+       xe_pm_runtime_get(xe);
        ret = xe_pm_set_vram_threshold(xe, vram_d3cold_threshold);
+       xe_pm_runtime_put(xe);
 
        return ret ?: count;
 }
 
 #include "xe_gt_sysfs.h"
 #include "xe_gt_throttle_sysfs.h"
 #include "xe_guc_pc.h"
+#include "xe_pm.h"
 
 /**
  * DOC: Xe GT Frequency Management
        return &kobj_to_gt(dev->kobj.parent)->uc.guc.pc;
 }
 
+static struct xe_device *
+dev_to_xe(struct device *dev)
+{
+       return gt_to_xe(kobj_to_gt(dev->kobj.parent));
+}
+
 static ssize_t act_freq_show(struct device *dev,
                             struct device_attribute *attr, char *buf)
 {
        struct xe_guc_pc *pc = dev_to_pc(dev);
+       u32 freq;
+
+       xe_pm_runtime_get(dev_to_xe(dev));
+       freq = xe_guc_pc_get_act_freq(pc);
+       xe_pm_runtime_put(dev_to_xe(dev));
 
-       return sysfs_emit(buf, "%d\n", xe_guc_pc_get_act_freq(pc));
+       return sysfs_emit(buf, "%d\n", freq);
 }
 static DEVICE_ATTR_RO(act_freq);
 
        u32 freq;
        ssize_t ret;
 
+       xe_pm_runtime_get(dev_to_xe(dev));
        ret = xe_guc_pc_get_cur_freq(pc, &freq);
+       xe_pm_runtime_put(dev_to_xe(dev));
        if (ret)
                return ret;
 
                             struct device_attribute *attr, char *buf)
 {
        struct xe_guc_pc *pc = dev_to_pc(dev);
+       u32 freq;
+
+       xe_pm_runtime_get(dev_to_xe(dev));
+       freq = xe_guc_pc_get_rp0_freq(pc);
+       xe_pm_runtime_put(dev_to_xe(dev));
 
-       return sysfs_emit(buf, "%d\n", xe_guc_pc_get_rp0_freq(pc));
+       return sysfs_emit(buf, "%d\n", freq);
 }
 static DEVICE_ATTR_RO(rp0_freq);
 
                             struct device_attribute *attr, char *buf)
 {
        struct xe_guc_pc *pc = dev_to_pc(dev);
+       u32 freq;
+
+       xe_pm_runtime_get(dev_to_xe(dev));
+       freq = xe_guc_pc_get_rpe_freq(pc);
+       xe_pm_runtime_put(dev_to_xe(dev));
 
-       return sysfs_emit(buf, "%d\n", xe_guc_pc_get_rpe_freq(pc));
+       return sysfs_emit(buf, "%d\n", freq);
 }
 static DEVICE_ATTR_RO(rpe_freq);
 
        u32 freq;
        ssize_t ret;
 
+       xe_pm_runtime_get(dev_to_xe(dev));
        ret = xe_guc_pc_get_min_freq(pc, &freq);
+       xe_pm_runtime_put(dev_to_xe(dev));
        if (ret)
                return ret;
 
        if (ret)
                return ret;
 
+       xe_pm_runtime_get(dev_to_xe(dev));
        ret = xe_guc_pc_set_min_freq(pc, freq);
+       xe_pm_runtime_put(dev_to_xe(dev));
        if (ret)
                return ret;
 
        u32 freq;
        ssize_t ret;
 
+       xe_pm_runtime_get(dev_to_xe(dev));
        ret = xe_guc_pc_get_max_freq(pc, &freq);
+       xe_pm_runtime_put(dev_to_xe(dev));
        if (ret)
                return ret;
 
        if (ret)
                return ret;
 
+       xe_pm_runtime_get(dev_to_xe(dev));
        ret = xe_guc_pc_set_max_freq(pc, freq);
+       xe_pm_runtime_put(dev_to_xe(dev));
        if (ret)
                return ret;
 
 
 #include "xe_guc_pc.h"
 #include "regs/xe_gt_regs.h"
 #include "xe_mmio.h"
+#include "xe_pm.h"
 
 /**
  * DOC: Xe GT Idle
        return >idle_to_gt(gtidle)->uc.guc.pc;
 }
 
+static struct xe_device *
+pc_to_xe(struct xe_guc_pc *pc)
+{
+       struct xe_guc *guc = container_of(pc, struct xe_guc, pc);
+       struct xe_gt *gt = container_of(guc, struct xe_gt, uc.guc);
+
+       return gt_to_xe(gt);
+}
+
 static const char *gt_idle_state_to_string(enum xe_gt_idle_state state)
 {
        switch (state) {
                         struct device_attribute *attr, char *buff)
 {
        struct xe_gt_idle *gtidle = dev_to_gtidle(dev);
+       struct xe_guc_pc *pc = gtidle_to_pc(gtidle);
+       ssize_t ret;
+
+       xe_pm_runtime_get(pc_to_xe(pc));
+       ret = sysfs_emit(buff, "%s\n", gtidle->name);
+       xe_pm_runtime_put(pc_to_xe(pc));
 
-       return sysfs_emit(buff, "%s\n", gtidle->name);
+       return ret;
 }
 static DEVICE_ATTR_RO(name);
 
        struct xe_guc_pc *pc = gtidle_to_pc(gtidle);
        enum xe_gt_idle_state state;
 
+       xe_pm_runtime_get(pc_to_xe(pc));
        state = gtidle->idle_status(pc);
+       xe_pm_runtime_put(pc_to_xe(pc));
 
        return sysfs_emit(buff, "%s\n", gt_idle_state_to_string(state));
 }
        struct xe_guc_pc *pc = gtidle_to_pc(gtidle);
        u64 residency;
 
+       xe_pm_runtime_get(pc_to_xe(pc));
        residency = gtidle->idle_residency(pc);
+       xe_pm_runtime_put(pc_to_xe(pc));
+
        return sysfs_emit(buff, "%llu\n", get_residency_ms(gtidle, residency));
 }
 static DEVICE_ATTR_RO(idle_residency_ms);
 
 #include "xe_gt_sysfs.h"
 #include "xe_gt_throttle_sysfs.h"
 #include "xe_mmio.h"
+#include "xe_pm.h"
 
 /**
  * DOC: Xe GT Throttle
 {
        u32 reg;
 
+       xe_pm_runtime_get(gt_to_xe(gt));
        if (xe_gt_is_media_type(gt))
                reg = xe_mmio_read32(gt, MTL_MEDIA_PERF_LIMIT_REASONS);
        else
                reg = xe_mmio_read32(gt, GT0_PERF_LIMIT_REASONS);
+       xe_pm_runtime_put(gt_to_xe(gt));
 
        return reg;
 }
 
 
 #include "xe_gt.h"
 #include "xe_hw_engine_class_sysfs.h"
+#include "xe_pm.h"
 
 #define MAX_ENGINE_CLASS_NAME_LEN    16
 static int xe_add_hw_engine_class_defaults(struct xe_device *xe,
                kobject_put(&keclass->base);
                return NULL;
        }
+       keclass->xe = xe;
 
        err = drmm_add_action_or_reset(&xe->drm, kobj_xe_hw_engine_class_fini,
                                       &keclass->base);
        kfree(kobj);
 }
 
+#include "xe_pm.h"
+
+static inline struct xe_device *pdev_to_xe_device(struct pci_dev *pdev)
+{
+       return pci_get_drvdata(pdev);
+}
+
+static inline struct xe_device *to_xe_device(const struct drm_device *dev)
+{
+       return container_of(dev, struct xe_device, drm);
+}
+
+static ssize_t xe_hw_engine_class_sysfs_attr_show(struct kobject *kobj,
+                                                 struct attribute *attr,
+                                                 char *buf)
+{
+       struct xe_device *xe = kobj_to_xe(kobj);
+       struct kobj_attribute *kattr;
+       ssize_t ret = -EIO;
+
+       kattr = container_of(attr, struct kobj_attribute, attr);
+       if (kattr->show) {
+               xe_pm_runtime_get(xe);
+               ret = kattr->show(kobj, kattr, buf);
+               xe_pm_runtime_put(xe);
+       }
+
+       return ret;
+}
+
+static ssize_t xe_hw_engine_class_sysfs_attr_store(struct kobject *kobj,
+                                                  struct attribute *attr,
+                                                  const char *buf,
+                                                  size_t count)
+{
+       struct xe_device *xe = kobj_to_xe(kobj);
+       struct kobj_attribute *kattr;
+       ssize_t ret = -EIO;
+
+       kattr = container_of(attr, struct kobj_attribute, attr);
+       if (kattr->store) {
+               xe_pm_runtime_get(xe);
+               ret = kattr->store(kobj, kattr, buf, count);
+               xe_pm_runtime_put(xe);
+       }
+
+       return ret;
+}
+
+static const struct sysfs_ops xe_hw_engine_class_sysfs_ops = {
+       .show = xe_hw_engine_class_sysfs_attr_show,
+       .store = xe_hw_engine_class_sysfs_attr_store,
+};
+
 static const struct kobj_type xe_hw_engine_sysfs_kobj_type = {
        .release = xe_hw_engine_sysfs_kobj_release,
-       .sysfs_ops = &kobj_sysfs_ops,
+       .sysfs_ops = &xe_hw_engine_class_sysfs_ops,
 };
 
 static void hw_engine_class_sysfs_fini(struct drm_device *drm, void *arg)
 
        struct kobject base;
        /** @eclass: A pointer to the hw engine class interface */
        struct xe_hw_engine_class_intf *eclass;
+       /** @xe: A pointer to the xe device */
+       struct xe_device *xe;
 };
 
 static inline struct xe_hw_engine_class_intf *kobj_to_eclass(struct kobject *kobj)
        return container_of(kobj, struct kobj_eclass, base)->eclass;
 }
 
+static inline struct xe_device *kobj_to_xe(struct kobject *kobj)
+{
+       return container_of(kobj, struct kobj_eclass, base)->xe;
+}
+
 #endif
 
 #include <linux/sysfs.h>
 #include <drm/drm_managed.h>
 
+#include "xe_pm.h"
 #include "xe_tile.h"
 #include "xe_tile_sysfs.h"
 #include "xe_vram_freq.h"