aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorTom O'Rourke <Tom.O'Rourke@intel.com>2013-09-16 17:56:43 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-10-10 08:23:39 -0400
commit5c9669cee534cbb834d51aae115267f5e561b622 (patch)
tree12b901434fc7dc686b5fb645384bb9f754b26a0a /drivers/gpu/drm/i915
parent09e14bf3ba4b72be4d57d99e3620beae4fb1ecd8 (diff)
drm/i915: Finish enabling rps before use by sysfs or debugfs
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>
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c12
-rw-r--r--drivers/gpu/drm/i915/i915_sysfs.c10
2 files changed, 22 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 5fd6a5db6eb5..a569597125db 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -847,6 +847,8 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused)
847 drm_i915_private_t *dev_priv = dev->dev_private; 847 drm_i915_private_t *dev_priv = dev->dev_private;
848 int ret; 848 int ret;
849 849
850 flush_delayed_work(&dev_priv->rps.delayed_resume_work);
851
850 if (IS_GEN5(dev)) { 852 if (IS_GEN5(dev)) {
851 u16 rgvswctl = I915_READ16(MEMSWCTL); 853 u16 rgvswctl = I915_READ16(MEMSWCTL);
852 u16 rgvstat = I915_READ16(MEMSTAT_ILK); 854 u16 rgvstat = I915_READ16(MEMSTAT_ILK);
@@ -1325,6 +1327,8 @@ static int i915_ring_freq_table(struct seq_file *m, void *unused)
1325 return 0; 1327 return 0;
1326 } 1328 }
1327 1329
1330 flush_delayed_work(&dev_priv->rps.delayed_resume_work);
1331
1328 ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock); 1332 ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock);
1329 if (ret) 1333 if (ret)
1330 return ret; 1334 return ret;
@@ -1940,6 +1944,8 @@ i915_max_freq_get(void *data, u64 *val)
1940 if (!(IS_GEN6(dev) || IS_GEN7(dev))) 1944 if (!(IS_GEN6(dev) || IS_GEN7(dev)))
1941 return -ENODEV; 1945 return -ENODEV;
1942 1946
1947 flush_delayed_work(&dev_priv->rps.delayed_resume_work);
1948
1943 ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock); 1949 ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock);
1944 if (ret) 1950 if (ret)
1945 return ret; 1951 return ret;
@@ -1964,6 +1970,8 @@ i915_max_freq_set(void *data, u64 val)
1964 if (!(IS_GEN6(dev) || IS_GEN7(dev))) 1970 if (!(IS_GEN6(dev) || IS_GEN7(dev)))
1965 return -ENODEV; 1971 return -ENODEV;
1966 1972
1973 flush_delayed_work(&dev_priv->rps.delayed_resume_work);
1974
1967 DRM_DEBUG_DRIVER("Manually setting max freq to %llu\n", val); 1975 DRM_DEBUG_DRIVER("Manually setting max freq to %llu\n", val);
1968 1976
1969 ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock); 1977 ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock);
@@ -2002,6 +2010,8 @@ i915_min_freq_get(void *data, u64 *val)
2002 if (!(IS_GEN6(dev) || IS_GEN7(dev))) 2010 if (!(IS_GEN6(dev) || IS_GEN7(dev)))
2003 return -ENODEV; 2011 return -ENODEV;
2004 2012
2013 flush_delayed_work(&dev_priv->rps.delayed_resume_work);
2014
2005 ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock); 2015 ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock);
2006 if (ret) 2016 if (ret)
2007 return ret; 2017 return ret;
@@ -2026,6 +2036,8 @@ i915_min_freq_set(void *data, u64 val)
2026 if (!(IS_GEN6(dev) || IS_GEN7(dev))) 2036 if (!(IS_GEN6(dev) || IS_GEN7(dev)))
2027 return -ENODEV; 2037 return -ENODEV;
2028 2038
2039 flush_delayed_work(&dev_priv->rps.delayed_resume_work);
2040
2029 DRM_DEBUG_DRIVER("Manually setting min freq to %llu\n", val); 2041 DRM_DEBUG_DRIVER("Manually setting min freq to %llu\n", val);
2030 2042
2031 ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock); 2043 ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock);
diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
index 8003886361b8..9ff1e4d96909 100644
--- a/drivers/gpu/drm/i915/i915_sysfs.c
+++ b/drivers/gpu/drm/i915/i915_sysfs.c
@@ -251,6 +251,8 @@ static ssize_t gt_cur_freq_mhz_show(struct device *kdev,
251 struct drm_i915_private *dev_priv = dev->dev_private; 251 struct drm_i915_private *dev_priv = dev->dev_private;
252 int ret; 252 int ret;
253 253
254 flush_delayed_work(&dev_priv->rps.delayed_resume_work);
255
254 mutex_lock(&dev_priv->rps.hw_lock); 256 mutex_lock(&dev_priv->rps.hw_lock);
255 if (IS_VALLEYVIEW(dev_priv->dev)) { 257 if (IS_VALLEYVIEW(dev_priv->dev)) {
256 u32 freq; 258 u32 freq;
@@ -283,6 +285,8 @@ static ssize_t gt_max_freq_mhz_show(struct device *kdev, struct device_attribute
283 struct drm_i915_private *dev_priv = dev->dev_private; 285 struct drm_i915_private *dev_priv = dev->dev_private;
284 int ret; 286 int ret;
285 287
288 flush_delayed_work(&dev_priv->rps.delayed_resume_work);
289
286 mutex_lock(&dev_priv->rps.hw_lock); 290 mutex_lock(&dev_priv->rps.hw_lock);
287 if (IS_VALLEYVIEW(dev_priv->dev)) 291 if (IS_VALLEYVIEW(dev_priv->dev))
288 ret = vlv_gpu_freq(dev_priv->mem_freq, dev_priv->rps.max_delay); 292 ret = vlv_gpu_freq(dev_priv->mem_freq, dev_priv->rps.max_delay);
@@ -307,6 +311,8 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
307 if (ret) 311 if (ret)
308 return ret; 312 return ret;
309 313
314 flush_delayed_work(&dev_priv->rps.delayed_resume_work);
315
310 mutex_lock(&dev_priv->rps.hw_lock); 316 mutex_lock(&dev_priv->rps.hw_lock);
311 317
312 if (IS_VALLEYVIEW(dev_priv->dev)) { 318 if (IS_VALLEYVIEW(dev_priv->dev)) {
@@ -355,6 +361,8 @@ static ssize_t gt_min_freq_mhz_show(struct device *kdev, struct device_attribute
355 struct drm_i915_private *dev_priv = dev->dev_private; 361 struct drm_i915_private *dev_priv = dev->dev_private;
356 int ret; 362 int ret;
357 363
364 flush_delayed_work(&dev_priv->rps.delayed_resume_work);
365
358 mutex_lock(&dev_priv->rps.hw_lock); 366 mutex_lock(&dev_priv->rps.hw_lock);
359 if (IS_VALLEYVIEW(dev_priv->dev)) 367 if (IS_VALLEYVIEW(dev_priv->dev))
360 ret = vlv_gpu_freq(dev_priv->mem_freq, dev_priv->rps.min_delay); 368 ret = vlv_gpu_freq(dev_priv->mem_freq, dev_priv->rps.min_delay);
@@ -379,6 +387,8 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
379 if (ret) 387 if (ret)
380 return ret; 388 return ret;
381 389
390 flush_delayed_work(&dev_priv->rps.delayed_resume_work);
391
382 mutex_lock(&dev_priv->rps.hw_lock); 392 mutex_lock(&dev_priv->rps.hw_lock);
383 393
384 if (IS_VALLEYVIEW(dev)) { 394 if (IS_VALLEYVIEW(dev)) {