[Intel-gfx] [PATCH] drm/i915: Configurable GT idle frequency

Vanshidhar Konda vanshidhar.r.konda at intel.com
Tue Apr 16 00:33:30 UTC 2019


On Mon, Apr 15, 2019 at 04:05:26PM -0700, Bob Paauwe wrote:
>There are real-time use cases where having deterministic CPU processes
>can be more important than GPU power/performance. Parking the GPU at a
>specific freqency by setting idle, min and max prohibits the normal
>dynamic GPU frequency switching which can introduce significant PCI-E
>latency. This adds the ability to configure the GPU "idle" frequecy
>using the same method that already exists for minimum and maximum
>frequencies.
>
>In addition, parking the idle frequency may reduce spool up latencies
>on GPU workloads.
>
>Signed-off-by: Bob Paauwe <bob.j.paauwe at intel.com>
>---
> drivers/gpu/drm/i915/i915_sysfs.c | 60 +++++++++++++++++++++++++++++++
> 1 file changed, 60 insertions(+)
>
>diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
>index 41313005af42..62612c23d514 100644
>--- a/drivers/gpu/drm/i915/i915_sysfs.c
>+++ b/drivers/gpu/drm/i915/i915_sysfs.c
>@@ -454,11 +454,69 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
> 	return ret ?: count;
> }
>
>+static ssize_t gt_idle_freq_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf)
>+{
>+	struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
>+
>+	return snprintf(buf, PAGE_SIZE, "%d\n",
>+			intel_gpu_freq(dev_priv,
>+				       dev_priv->gt_pm.rps.idle_freq));
>+}
>+
>+static ssize_t gt_idle_freq_mhz_store(struct device *kdev,
>+				      struct device_attribute *attr,
>+				      const char *buf, size_t count)
>+{
>+	struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
>+	struct intel_rps *rps = &dev_priv->gt_pm.rps;
>+	intel_wakeref_t wakeref;
>+	u32 val;

val can probably just be u8. max_freq, min_freq, etc. are only u8 in
struct intel_rps *rps.

>+	ssize_t ret;
>+
>+	ret = kstrtou32(buf, 0, &val);
>+	if (ret)
>+		return ret;
>+
>+	wakeref = intel_runtime_pm_get(dev_priv);
>+
>+	mutex_lock(&dev_priv->pcu_lock);
>+
>+	val = intel_freq_opcode(dev_priv, val);
>+
>+	if (val < rps->min_freq ||
>+	    val > rps->max_freq ||
>+	    val > rps->max_freq_softlimit) {
>+		mutex_unlock(&dev_priv->pcu_lock);
>+		intel_runtime_pm_put(dev_priv, wakeref);
>+		return -EINVAL;
>+	}
>+
>+	rps->idle_freq = val;
>+
>+	val = clamp_t(int, rps->cur_freq,
>+		      rps->idle_freq,
>+		      rps->max_freq_softlimit);

This should probably be clamped to u8 instead of int.

Vanshi

>+
>+	/*
>+	 * If the current freq is at the old idle freq we should
>+	 * ajust it to the new idle.  Calling *_set_rps will also
>+	 * update the interrupt limits and PMINTRMSK if ncessary.
>+	 */
>+	ret = intel_set_rps(dev_priv, val);
>+
>+	mutex_unlock(&dev_priv->pcu_lock);
>+
>+	intel_runtime_pm_put(dev_priv, wakeref);
>+
>+	return ret ?: 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(gt_idle_freq_mhz);
>
> static DEVICE_ATTR_RO(vlv_rpe_freq_mhz);
>
>@@ -492,6 +550,7 @@ static const struct attribute * const gen6_attrs[] = {
> 	&dev_attr_gt_boost_freq_mhz.attr,
> 	&dev_attr_gt_max_freq_mhz.attr,
> 	&dev_attr_gt_min_freq_mhz.attr,
>+	&dev_attr_gt_idle_freq_mhz.attr,
> 	&dev_attr_gt_RP0_freq_mhz.attr,
> 	&dev_attr_gt_RP1_freq_mhz.attr,
> 	&dev_attr_gt_RPn_freq_mhz.attr,
>@@ -504,6 +563,7 @@ static const struct attribute * const vlv_attrs[] = {
> 	&dev_attr_gt_boost_freq_mhz.attr,
> 	&dev_attr_gt_max_freq_mhz.attr,
> 	&dev_attr_gt_min_freq_mhz.attr,
>+	&dev_attr_gt_idle_freq_mhz.attr,
> 	&dev_attr_gt_RP0_freq_mhz.attr,
> 	&dev_attr_gt_RP1_freq_mhz.attr,
> 	&dev_attr_gt_RPn_freq_mhz.attr,
>-- 
>2.19.2
>
>_______________________________________________
>Intel-gfx mailing list
>Intel-gfx at lists.freedesktop.org
>https://lists.freedesktop.org/mailman/listinfo/intel-gfx


More information about the Intel-gfx mailing list