Intel-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
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>

      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