[Intel-gfx] [PATCH 2/2] drm/i915: Add current GPU freq to sysfs

Daniel Vetter daniel at ffwll.ch
Mon Sep 3 10:41:48 CEST 2012


On Sun, Sep 02, 2012 at 12:24:41AM -0700, Ben Widawsky wrote:
> Userspace applications such as PowerTOP are interesting in being able to
> read the current GPU frequency. The patch itself sets up a generic array
> for gen6 attributes so we can easily add other items in the future (and
> it also happens to be just about the cleanest way to do this).
> 
> The patch is a nice addition to
> commit 1ac02185dff3afac146d745ba220dc6672d1d162
> Author: Daniel Vetter <daniel.vetter at ffwll.ch>
> Date:   Thu Aug 30 13:26:48 2012 +0200
> 
>     drm/i915: add a tracepoint for gpu frequency changes
> 
> Reading the GPU frequncy can be done by reading a file like:
> /sys/class/drm/card0/render_frequency_mhz
> 
> CC: Arjan van de Ven <arjan at linux.intel.com>
> Signed-off-by: Ben Widawsky <ben at bwidawsk.net>

I've just noticed that your sloppy maintainer totally missed to pick up
Jesse's gt power consumption interface:

http://lists.freedesktop.org/archives/intel-gfx/2012-June/018404.html

Hence a bikeshed for the sysfs filename:
- render_ prefix is not accurate, this is for all of gt. I hence vote for
  a gt_
- I think calling it gt_cur_freq would make sense in case we'll expose
  _min/_max limits through sysfs, too.
- Also, calling it _cur_freq withouth MHz keeps in style with the
  frequency knobs exposed by cpus ...

Now I guess I should go back to my trace point patch and adjust it to
expose plain Hz, too ... Anyone got some bikeshed on this?
-Daniel

> ---
>  drivers/gpu/drm/i915/i915_sysfs.c | 31 +++++++++++++++++++++++++++++++
>  1 file changed, 31 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
> index da733a3..0cb479d 100644
> --- a/drivers/gpu/drm/i915/i915_sysfs.c
> +++ b/drivers/gpu/drm/i915/i915_sysfs.c
> @@ -203,6 +203,30 @@ static struct bin_attribute dpf_attrs = {
>  	.mmap = NULL
>  };
>  
> +static ssize_t render_frequency_mhz_show(struct device *dev,
> +				     struct device_attribute *attr, char *buf)
> +{
> +	struct drm_minor *dminor = container_of(dev, struct drm_minor, kdev);
> +	struct drm_device *drm_dev = dminor->dev;
> +	struct drm_i915_private *dev_priv = drm_dev->dev_private;
> +	int ret;
> +
> +	ret = i915_mutex_lock_interruptible(drm_dev);
> +	if (ret)
> +		return ret;
> +
> +	ret = dev_priv->rps.cur_delay * 50;
> +	mutex_unlock(&drm_dev->struct_mutex);
> +
> +	return snprintf(buf, PAGE_SIZE, "%d", ret);
> +}
> +
> +static struct device_attribute gen6_attrs[] = {
> +	__ATTR_RO(render_frequency_mhz),
> +	__ATTR_NULL,
> +};
> +
> +
>  void i915_setup_sysfs(struct drm_device *dev)
>  {
>  	int ret;
> @@ -220,10 +244,17 @@ void i915_setup_sysfs(struct drm_device *dev)
>  		if (ret)
>  			DRM_ERROR("l3 parity sysfs setup failed\n");
>  	}
> +
> +	if (INTEL_INFO(dev)->gen >= 6) {
> +		ret = device_create_file(&dev->primary->kdev, gen6_attrs);
> +		if (ret)
> +			DRM_ERROR("gen6 sysfs setup failed\n");
> +	}
>  }
>  
>  void i915_teardown_sysfs(struct drm_device *dev)
>  {
> +	device_remove_file(&dev->primary->kdev, gen6_attrs);
>  	device_remove_bin_file(&dev->primary->kdev,  &dpf_attrs);
>  	sysfs_unmerge_group(&dev->primary->kdev.kobj, &rc6_attr_group);
>  }
> -- 
> 1.7.12
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Mail: daniel at ffwll.ch
Mobile: +41 (0)79 365 57 48



More information about the Intel-gfx mailing list