OSDN Git Service

drm/i915: Update PMINTRMSK on VLV/CHV after sysfs min/max freq change
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 23 Jan 2015 19:04:23 +0000 (21:04 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 27 Jan 2015 08:51:16 +0000 (09:51 +0100)
Currently we don't call valleyview_set_rps() when changing the min/max
limits through sysfs if the current frequency is still within the new
limits. However that means we sometimes forget to update PMINTRMSK.
Eg. if the current frequency is at the old minimum, and then we reduce
the minum further we should then enable the 'down' interrupts in PMINTRMSK
but currently we don't.

Fix it up by always calling valleyview_set_rps() (just like we do for
!vlv/chv platforms). This also allows the code to be simplified a bit.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_sysfs.c

index 1ca944b..1a1e5aa 100644 (file)
@@ -374,17 +374,17 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
 
        dev_priv->rps.max_freq_softlimit = val;
 
-       if (dev_priv->rps.cur_freq > val) {
-               if (IS_VALLEYVIEW(dev))
-                       valleyview_set_rps(dev, val);
-               else
-                       gen6_set_rps(dev, val);
-       } else if (!IS_VALLEYVIEW(dev)) {
-               /* We still need gen6_set_rps to process the new max_delay and
-                * update the interrupt limits even though frequency request is
-                * unchanged. */
-               gen6_set_rps(dev, dev_priv->rps.cur_freq);
-       }
+       val = clamp_t(int, dev_priv->rps.cur_freq,
+                     dev_priv->rps.min_freq_softlimit,
+                     dev_priv->rps.max_freq_softlimit);
+
+       /* We still need *_set_rps to process the new max_delay and
+        * update the interrupt limits and PMINTRMSK even though
+        * frequency request may be unchanged. */
+       if (IS_VALLEYVIEW(dev))
+               valleyview_set_rps(dev, val);
+       else
+               gen6_set_rps(dev, val);
 
        mutex_unlock(&dev_priv->rps.hw_lock);
 
@@ -442,17 +442,17 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
 
        dev_priv->rps.min_freq_softlimit = val;
 
-       if (dev_priv->rps.cur_freq < val) {
-               if (IS_VALLEYVIEW(dev))
-                       valleyview_set_rps(dev, val);
-               else
-                       gen6_set_rps(dev, val);
-       } else if (!IS_VALLEYVIEW(dev)) {
-               /* We still need gen6_set_rps to process the new min_delay and
-                * update the interrupt limits even though frequency request is
-                * unchanged. */
-               gen6_set_rps(dev, dev_priv->rps.cur_freq);
-       }
+       val = clamp_t(int, dev_priv->rps.cur_freq,
+                     dev_priv->rps.min_freq_softlimit,
+                     dev_priv->rps.max_freq_softlimit);
+
+       /* We still need *_set_rps to process the new min_delay and
+        * update the interrupt limits and PMINTRMSK even though
+        * frequency request may be unchanged. */
+       if (IS_VALLEYVIEW(dev))
+               valleyview_set_rps(dev, val);
+       else
+               gen6_set_rps(dev, val);
 
        mutex_unlock(&dev_priv->rps.hw_lock);