Load classification is used for predictive governor to control eu/slice/subslice based on workloads. sysfs is provided to enable/disable the feature V2: * Fix code style. * Move predictive_load_timer into a drm_i915_private structure. * Make generic function to set optimum config. (Tvrtko Ursulin) V3: * Rebase. * Fix race condition for predictive load set. * Add slack to start hrtimer for more power efficient. (Tvrtko Ursulin) V4: * Fix data type and initialization of mutex to protect predictive load state. * Move predictive timer init to i915_gem_init_early. (Tvrtko Ursulin) * Move debugfs to kernel parameter. V5: * Rebase. * Remove mutex for pred_timer V6: * Rebase. * Fix warnings. V7: * Drop timer and move logic to __execlists_update_reg_state. (Tvrtko Ursulin) * Remove kernel boot param and make it to sysfs entry. (Jani Nikula) v8: * Rebase. Cc: Vipin Anand <vipin.anand@xxxxxxxxx> Signed-off-by: Ankit Navik <ankit.p.navik@xxxxxxxxx> --- drivers/gpu/drm/i915/i915_sysfs.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c index 45d32ef42787..5d76e4992c8d 100644 --- a/drivers/gpu/drm/i915/i915_sysfs.c +++ b/drivers/gpu/drm/i915/i915_sysfs.c @@ -433,12 +433,43 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev, return ret ?: count; } +static ssize_t deu_enable_show(struct device *kdev, struct device_attribute *attr, char *buf) +{ + struct drm_i915_private *i915 = kdev_minor_to_i915(kdev); + + return snprintf(buf, PAGE_SIZE, "%u\n", i915->predictive_load_enable); +} + +static ssize_t deu_enable_store(struct device *kdev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct drm_i915_private *i915 = kdev_minor_to_i915(kdev); + ssize_t ret; + u32 val; + + ret = kstrtou32(buf, 0, &val); + if (ret) + return ret; + + /* Check invalid values */ + if (val != 0 && val != 1) + ret = -EINVAL; + + i915->predictive_load_enable = val; + + return count; +} + static DEVICE_ATTR_RO(gt_act_freq_mhz); static DEVICE_ATTR_RO(gt_cur_freq_mhz); static DEVICE_ATTR_RW(gt_boost_freq_mhz); static DEVICE_ATTR_RW(gt_max_freq_mhz); static DEVICE_ATTR_RW(gt_min_freq_mhz); +static DEVICE_ATTR_RW(deu_enable); + static DEVICE_ATTR_RO(vlv_rpe_freq_mhz); static ssize_t gt_rp_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf); @@ -474,6 +505,7 @@ static const struct attribute * const gen6_attrs[] = { &dev_attr_gt_RP0_freq_mhz.attr, &dev_attr_gt_RP1_freq_mhz.attr, &dev_attr_gt_RPn_freq_mhz.attr, + &dev_attr_deu_enable.attr, NULL, }; -- 2.7.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx