Skip to content

Commit

Permalink
drm/i915: Finish enabling rps before use by sysfs or debugfs
Browse files Browse the repository at this point in the history
Enabling rps (turbo setup) was put in a work queue because it may
take quite awhile.  This change flushes the work queue to initialize
rps values before use by sysfs or debugfs.  Specifically,
rps.delayed_resume_work is flushed before using rps.hw_max,
rps.max_delay, rps.min_delay, or rps.cur_delay.

This change fixes a problem in sysfs where show functions using
uninitialized values show incorrect values and store functions
using uninitialized values in range checks incorrectly fail to
store valid input values.  This change also addresses similar use
before initialized problems in debugfs.

Signed-off-by: Tom O'Rourke <Tom.O'Rourke@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
  • Loading branch information
Tom O'Rourke authored and Daniel Vetter committed Oct 10, 2013
1 parent 09e14bf commit 5c9669c
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
12 changes: 12 additions & 0 deletions drivers/gpu/drm/i915/i915_debugfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -847,6 +847,8 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused)
drm_i915_private_t *dev_priv = dev->dev_private;
int ret;

flush_delayed_work(&dev_priv->rps.delayed_resume_work);

if (IS_GEN5(dev)) {
u16 rgvswctl = I915_READ16(MEMSWCTL);
u16 rgvstat = I915_READ16(MEMSTAT_ILK);
Expand Down Expand Up @@ -1325,6 +1327,8 @@ static int i915_ring_freq_table(struct seq_file *m, void *unused)
return 0;
}

flush_delayed_work(&dev_priv->rps.delayed_resume_work);

ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock);
if (ret)
return ret;
Expand Down Expand Up @@ -1940,6 +1944,8 @@ i915_max_freq_get(void *data, u64 *val)
if (!(IS_GEN6(dev) || IS_GEN7(dev)))
return -ENODEV;

flush_delayed_work(&dev_priv->rps.delayed_resume_work);

ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock);
if (ret)
return ret;
Expand All @@ -1964,6 +1970,8 @@ i915_max_freq_set(void *data, u64 val)
if (!(IS_GEN6(dev) || IS_GEN7(dev)))
return -ENODEV;

flush_delayed_work(&dev_priv->rps.delayed_resume_work);

DRM_DEBUG_DRIVER("Manually setting max freq to %llu\n", val);

ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock);
Expand Down Expand Up @@ -2002,6 +2010,8 @@ i915_min_freq_get(void *data, u64 *val)
if (!(IS_GEN6(dev) || IS_GEN7(dev)))
return -ENODEV;

flush_delayed_work(&dev_priv->rps.delayed_resume_work);

ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock);
if (ret)
return ret;
Expand All @@ -2026,6 +2036,8 @@ i915_min_freq_set(void *data, u64 val)
if (!(IS_GEN6(dev) || IS_GEN7(dev)))
return -ENODEV;

flush_delayed_work(&dev_priv->rps.delayed_resume_work);

DRM_DEBUG_DRIVER("Manually setting min freq to %llu\n", val);

ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock);
Expand Down
10 changes: 10 additions & 0 deletions drivers/gpu/drm/i915/i915_sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,8 @@ static ssize_t gt_cur_freq_mhz_show(struct device *kdev,
struct drm_i915_private *dev_priv = dev->dev_private;
int ret;

flush_delayed_work(&dev_priv->rps.delayed_resume_work);

mutex_lock(&dev_priv->rps.hw_lock);
if (IS_VALLEYVIEW(dev_priv->dev)) {
u32 freq;
Expand Down Expand Up @@ -283,6 +285,8 @@ static ssize_t gt_max_freq_mhz_show(struct device *kdev, struct device_attribute
struct drm_i915_private *dev_priv = dev->dev_private;
int ret;

flush_delayed_work(&dev_priv->rps.delayed_resume_work);

mutex_lock(&dev_priv->rps.hw_lock);
if (IS_VALLEYVIEW(dev_priv->dev))
ret = vlv_gpu_freq(dev_priv->mem_freq, dev_priv->rps.max_delay);
Expand All @@ -307,6 +311,8 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
if (ret)
return ret;

flush_delayed_work(&dev_priv->rps.delayed_resume_work);

mutex_lock(&dev_priv->rps.hw_lock);

if (IS_VALLEYVIEW(dev_priv->dev)) {
Expand Down Expand Up @@ -355,6 +361,8 @@ static ssize_t gt_min_freq_mhz_show(struct device *kdev, struct device_attribute
struct drm_i915_private *dev_priv = dev->dev_private;
int ret;

flush_delayed_work(&dev_priv->rps.delayed_resume_work);

mutex_lock(&dev_priv->rps.hw_lock);
if (IS_VALLEYVIEW(dev_priv->dev))
ret = vlv_gpu_freq(dev_priv->mem_freq, dev_priv->rps.min_delay);
Expand All @@ -379,6 +387,8 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
if (ret)
return ret;

flush_delayed_work(&dev_priv->rps.delayed_resume_work);

mutex_lock(&dev_priv->rps.hw_lock);

if (IS_VALLEYVIEW(dev)) {
Expand Down

0 comments on commit 5c9669c

Please sign in to comment.