[Intel-gfx] [PATCH] drm/i915: Configurable GT idle frequency
Vanshidhar Konda
vanshidhar.r.konda at intel.com
Tue Apr 16 15:48:52 UTC 2019
On Tue, Apr 16, 2019 at 08:30:22AM -0700, Bob Paauwe wrote:
>On Mon, 15 Apr 2019 17:33:30 -0700
>Vanshidhar Konda <vanshidhar.r.konda at intel.com> wrote:
>
>> 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.
>
>Using u32 is consistent with all the other _store functions in the file
>and changing it would also mean changing the kstrtou32 call below. I'd
>rather this function stay consistent with the min/max/boost frequency
>functions. Changing to u8 would be a separate change and should be
>applied to all the similar functions.
>
Thanks for pointing that out.
I recently joined the team, so not sure if you would like someone else
to review as well.
Reviewed-by: Vanshidhar Konda <vanshidhar.r.konda at intel.com>
>>
>> >+ 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.
>
>Similar to above, this is consistent with the other similar functions.
>
>>
>> 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
>
>
>
>--
>--
>Bob Paauwe
>Bob.J.Paauwe at intel.com
>IOTG / PED Software Organization
>Intel Corp. Folsom, CA
>(916) 356-6193
>
More information about the Intel-gfx
mailing list