From: Mika Kuoppala <mika.kuoppala@linux.intel.com>
To: intel-gfx@lists.freedesktop.org
Cc: Ben Widawsky <ben@bwidawsk.net>
Subject: Re: [PATCH] drm/i915: Better overclock support
Date: Tue, 09 Apr 2013 16:42:09 +0300 [thread overview]
Message-ID: <87mwt7yg5q.fsf@gaia.fi.intel.com> (raw)
In-Reply-To: <1364957125-1089-1-git-send-email-ben@bwidawsk.net>
Ben Widawsky <ben@bwidawsk.net> writes:
> Most importantly this will allow users to set overclock frequencies in
> sysfs. Previously the max was limited by the RP0 max as opposed to the
> overclock max. This is useful if one wants to either limit the max
> overclock frequency, or set the minimum frequency to be in the overclock
> range. It also fixes an issue where if one sets the max frequency to be
> below the overclock max, they wouldn't be able to set back the proper
> overclock max.
>
> In addition I've added a couple of other bits:
> Show the overclock freq. as max in sysfs
> Print the overclock max in debugfs.
> Print a warning if the user sets the min frequency to be in the
> overclock range.
>
> In this patch I've decided to store the hw_max when we read it from the
> pcode at init. The reason I do this is the pcode reads can fail, and are
> slow.
>
> Reported-by: freezer?
> Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
> ---
> drivers/gpu/drm/i915/i915_debugfs.c | 3 +++
> drivers/gpu/drm/i915/i915_drv.h | 1 +
> drivers/gpu/drm/i915/i915_sysfs.c | 12 ++++++++----
> drivers/gpu/drm/i915/intel_pm.c | 3 ++-
> 4 files changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index 7df8351..f081bb3 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -1006,6 +1006,9 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused)
> max_freq = rp_state_cap & 0xff;
> seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n",
> max_freq * GT_FREQUENCY_MULTIPLIER);
> +
> + seq_printf(m, "Max overclocked frequency: %dMHz\n",
> + dev_priv->rps.hw_max * GT_FREQUENCY_MULTIPLIER);
> } else {
> seq_printf(m, "no P-state info available\n");
> }
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 1657d873..9b53b39c 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -648,6 +648,7 @@ struct intel_gen6_power_mgmt {
> u8 cur_delay;
> u8 min_delay;
> u8 max_delay;
> + u8 hw_max;
>
> struct delayed_work delayed_resume_work;
>
> diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
> index a3a3e22..5faf1a7 100644
> --- a/drivers/gpu/drm/i915/i915_sysfs.c
> +++ b/drivers/gpu/drm/i915/i915_sysfs.c
> @@ -226,7 +226,7 @@ static ssize_t gt_max_freq_mhz_show(struct device *kdev, struct device_attribute
> int ret;
>
> mutex_lock(&dev_priv->rps.hw_lock);
> - ret = dev_priv->rps.max_delay * GT_FREQUENCY_MULTIPLIER;
> + ret = dev_priv->rps.hw_max * GT_FREQUENCY_MULTIPLIER;
> mutex_unlock(&dev_priv->rps.hw_lock);
>
> return snprintf(buf, PAGE_SIZE, "%d\n", ret);
> @@ -251,7 +251,7 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
> mutex_lock(&dev_priv->rps.hw_lock);
>
> rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
> - hw_max = (rp_state_cap & 0xff);
> + hw_max = dev_priv->rps.hw_max;
> hw_min = ((rp_state_cap & 0xff0000) >> 16);
>
> if (val < hw_min || val > hw_max || val < dev_priv->rps.min_delay) {
> @@ -290,7 +290,7 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
> struct drm_minor *minor = container_of(kdev, struct drm_minor, kdev);
> struct drm_device *dev = minor->dev;
> struct drm_i915_private *dev_priv = dev->dev_private;
> - u32 val, rp_state_cap, hw_max, hw_min;
> + u32 val, rp_state_cap, hw_max, hw_min, non_oc_max;
> ssize_t ret;
>
> ret = kstrtou32(buf, 0, &val);
> @@ -302,7 +302,8 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
> mutex_lock(&dev_priv->rps.hw_lock);
>
> rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
> - hw_max = (rp_state_cap & 0xff);
> + hw_max = dev_priv->rps.hw_max;
> + non_oc_max = (rp_state_cap & 0xff);
> hw_min = ((rp_state_cap & 0xff0000) >> 16);
>
> if (val < hw_min || val > hw_max || val > dev_priv->rps.max_delay) {
> @@ -310,6 +311,9 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
> return -EINVAL;
> }
>
> + if (val > non_oc_max)
> + DRM_DEBUG("User selected overclocked frequency for min\n");
> +
> if (dev_priv->rps.cur_delay < val)
> gen6_set_rps(dev_priv->dev, val);
>
> diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
> index ce3db2c..2edb743 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -2555,7 +2555,7 @@ static void gen6_enable_rps(struct drm_device *dev)
> gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS);
>
> /* In units of 100MHz */
Not a problem with this patch but the above comment should be
fixed as the freq is in units of 50Mhz right?
> - dev_priv->rps.max_delay = rp_state_cap & 0xff;
> + dev_priv->rps.hw_max = dev_priv->rps.max_delay = rp_state_cap & 0xff;
> dev_priv->rps.min_delay = (rp_state_cap & 0xff0000) >> 16;
> dev_priv->rps.cur_delay = 0;
>
> @@ -2635,6 +2635,7 @@ static void gen6_enable_rps(struct drm_device *dev)
> DRM_DEBUG_DRIVER("overclocking supported, adjusting frequency max from %dMHz to %dMHz\n",
> (dev_priv->rps.max_delay & 0xff) * 50,
> (pcu_mbox & 0xff) * 50);
> + dev_priv->rps.hw_max = pcu_mbox & 0xff;
> dev_priv->rps.max_delay = pcu_mbox & 0xff;
> }
> } else {
> --
> 1.8.2
Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com>
prev parent reply other threads:[~2013-04-09 13:42 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-03 2:45 [PATCH] drm/i915: Better overclock support Ben Widawsky
2013-04-03 8:27 ` Daniel Vetter
2013-04-05 21:29 ` [PATCH 1/2] [v2] " Ben Widawsky
2013-04-05 21:29 ` [PATCH 2/2] drm/i915: Don't default to overclock max Ben Widawsky
2013-04-09 13:44 ` Mika Kuoppala
2013-04-09 16:58 ` Daniel Vetter
2013-04-09 13:42 ` Mika Kuoppala [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87mwt7yg5q.fsf@gaia.fi.intel.com \
--to=mika.kuoppala@linux.intel.com \
--cc=ben@bwidawsk.net \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox