intel-gfx.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] drm/i915: add GPU frequency control file
@ 2011-07-27 17:17 Jesse Barnes
  2011-07-27 17:46 ` Andrew Lutomirski
  0 siblings, 1 reply; 3+ messages in thread
From: Jesse Barnes @ 2011-07-27 17:17 UTC (permalink / raw)
  To: intel-gfx

Mainly for use in debugging and benchmarking, this file allows the user
to control the max frequency used by the GPU.  Frequency may still vary
based on workload (if the frequency is set to higher than the minimum)
but won't go over the newly set value.

Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
---
 drivers/gpu/drm/i915/i915_debugfs.c |   90 +++++++++++++++++++++++++++++++++++
 1 files changed, 90 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index e2662497..bdc7c21 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -1338,6 +1338,76 @@ static const struct file_operations i915_wedged_fops = {
 	.llseek = default_llseek,
 };
 
+static int
+i915_freq_open(struct inode *inode,
+		   struct file *filp)
+{
+	filp->private_data = inode->i_private;
+	return 0;
+}
+
+static ssize_t
+i915_freq_read(struct file *filp,
+		   char __user *ubuf,
+		   size_t max,
+		   loff_t *ppos)
+{
+	struct drm_device *dev = filp->private_data;
+	drm_i915_private_t *dev_priv = dev->dev_private;
+	char buf[80];
+	int len;
+
+	len = snprintf(buf, sizeof (buf),
+		       "freq: %d\n", dev_priv->max_delay * 50);
+
+	if (len > sizeof (buf))
+		len = sizeof (buf);
+
+	return simple_read_from_buffer(ubuf, max, ppos, buf, len);
+}
+
+static ssize_t
+i915_freq_write(struct file *filp,
+		  const char __user *ubuf,
+		  size_t cnt,
+		  loff_t *ppos)
+{
+	struct drm_device *dev = filp->private_data;
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	char buf[20];
+	int val = 1;
+
+	if (cnt > 0) {
+		if (cnt > sizeof (buf) - 1)
+			return -EINVAL;
+
+		if (copy_from_user(buf, ubuf, cnt))
+			return -EFAULT;
+		buf[cnt] = 0;
+
+		val = simple_strtoul(buf, NULL, 0);
+	}
+
+	DRM_DEBUG_DRIVER("Manually setting freq to %d\n", val);
+
+	/*
+	 * Turbo will still be enabled, but won't go above the set value.
+	 */
+	dev_priv->max_delay = val / 50;
+
+	gen6_set_rps(dev, val / 50);
+
+	return cnt;
+}
+
+static const struct file_operations i915_freq_fops = {
+	.owner = THIS_MODULE,
+	.open = i915_freq_open,
+	.read = i915_freq_read,
+	.write = i915_freq_write,
+	.llseek = default_llseek,
+};
+
 /* As the drm_debugfs_init() routines are called before dev->dev_private is
  * allocated we need to hook into the minor for release. */
 static int
@@ -1437,6 +1507,21 @@ static int i915_forcewake_create(struct dentry *root, struct drm_minor *minor)
 	return drm_add_fake_info_node(minor, ent, &i915_forcewake_fops);
 }
 
+static int i915_freq_create(struct dentry *root, struct drm_minor *minor)
+{
+	struct drm_device *dev = minor->dev;
+	struct dentry *ent;
+
+	ent = debugfs_create_file("i915_freq",
+				  S_IRUGO | S_IWUSR,
+				  root, dev,
+				  &i915_freq_fops);
+	if (IS_ERR(ent))
+		return PTR_ERR(ent);
+
+	return drm_add_fake_info_node(minor, ent, &i915_freq_fops);
+}
+
 static struct drm_info_list i915_debugfs_list[] = {
 	{"i915_capabilities", i915_capabilities, 0},
 	{"i915_gem_objects", i915_gem_object_info, 0},
@@ -1490,6 +1575,9 @@ int i915_debugfs_init(struct drm_minor *minor)
 	ret = i915_forcewake_create(minor->debugfs_root, minor);
 	if (ret)
 		return ret;
+	ret = i915_freq_create(minor->debugfs_root, minor);
+	if (ret)
+		return ret;
 
 	return drm_debugfs_create_files(i915_debugfs_list,
 					I915_DEBUGFS_ENTRIES,
@@ -1504,6 +1592,8 @@ void i915_debugfs_cleanup(struct drm_minor *minor)
 				 1, minor);
 	drm_debugfs_remove_files((struct drm_info_list *) &i915_wedged_fops,
 				 1, minor);
+	drm_debugfs_remove_files((struct drm_info_list *) &i915_freq_fops,
+				 1, minor);
 }
 
 #endif /* CONFIG_DEBUG_FS */
-- 
1.7.4.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] drm/i915: add GPU frequency control file
  2011-07-27 17:17 [PATCH] drm/i915: add GPU frequency control file Jesse Barnes
@ 2011-07-27 17:46 ` Andrew Lutomirski
  2011-07-27 17:48   ` Jesse Barnes
  0 siblings, 1 reply; 3+ messages in thread
From: Andrew Lutomirski @ 2011-07-27 17:46 UTC (permalink / raw)
  To: Jesse Barnes; +Cc: intel-gfx

On Wed, Jul 27, 2011 at 1:17 PM, Jesse Barnes <jbarnes@virtuousgeek.org> wrote:
> Mainly for use in debugging and benchmarking, this file allows the user
> to control the max frequency used by the GPU.  Frequency may still vary
> based on workload (if the frequency is set to higher than the minimum)
> but won't go over the newly set value.

Would i915_max_freq be a better name?

--Andy

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] drm/i915: add GPU frequency control file
  2011-07-27 17:46 ` Andrew Lutomirski
@ 2011-07-27 17:48   ` Jesse Barnes
  0 siblings, 0 replies; 3+ messages in thread
From: Jesse Barnes @ 2011-07-27 17:48 UTC (permalink / raw)
  To: Andrew Lutomirski; +Cc: intel-gfx

On Wed, 27 Jul 2011 13:46:32 -0400
Andrew Lutomirski <luto@mit.edu> wrote:

> On Wed, Jul 27, 2011 at 1:17 PM, Jesse Barnes <jbarnes@virtuousgeek.org> wrote:
> > Mainly for use in debugging and benchmarking, this file allows the user
> > to control the max frequency used by the GPU.  Frequency may still vary
> > based on workload (if the frequency is set to higher than the minimum)
> > but won't go over the newly set value.
> 
> Would i915_max_freq be a better name?

Yeah probably... lemme respin.

-- 
Jesse Barnes, Intel Open Source Technology Center

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-07-27 17:48 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-27 17:17 [PATCH] drm/i915: add GPU frequency control file Jesse Barnes
2011-07-27 17:46 ` Andrew Lutomirski
2011-07-27 17:48   ` Jesse Barnes

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).