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_delay);
 
        mutex_unlock(&dev_priv->rps.hw_lock);
 
                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_delay);
 
        mutex_unlock(&dev_priv->rps.hw_lock);
 
 
        dev_priv->rps.last_adj = 0;
 }
 
+/* gen6_set_rps is called to update the frequency request, but should also be
+ * called when the range (min_delay and max_delay) is modified so that we can
+ * update the GEN6_RP_INTERRUPT_LIMITS register accordingly. */
 void gen6_set_rps(struct drm_device *dev, u8 val)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        WARN_ON(val > dev_priv->rps.max_delay);
        WARN_ON(val < dev_priv->rps.min_delay);
 
-       if (val == dev_priv->rps.cur_delay)
+       if (val == dev_priv->rps.cur_delay) {
+               /* min/max delay may still have been modified so be sure to
+                * write the limits value */
+               I915_WRITE(GEN6_RP_INTERRUPT_LIMITS,
+                          gen6_rps_limits(dev_priv, val));
+
                return;
+       }
 
        gen6_set_rps_thresholds(dev_priv, val);