drm/i915: Set adjustment to zero on Up/Down interrupts if freq is already max/min
authorSagar Arun Kamble <sagar.a.kamble@intel.com>
Fri, 20 Jan 2017 03:48:24 +0000 (09:18 +0530)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 20 Jan 2017 09:32:47 +0000 (09:32 +0000)
When we reach the user's RPS limits, stop requesting an adjustment. Even
though we will clamp the requested frequency later, we rely on interrupt
masking to disable further adjustments in the same direction. Even
though it is unlikely (one scenario is a bug in the driver, another is
careful manipulation through the uAPI) if we keep exponentially
increasing the adjustment value, it will wrap and cause a negative
adjustment.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Sagar Arun Kamble <sagar.a.kamble@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1484884104-28134-2-git-send-email-sagar.a.kamble@intel.com
drivers/gpu/drm/i915/i915_irq.c

index ce5663d94839acb604cd60f25508fe5a2e769776..6fefc34ef602e9ee758c980bb37e2b1d63e6746c 100644 (file)
@@ -1170,6 +1170,9 @@ static void gen6_pm_rps_work(struct work_struct *work)
                        adj *= 2;
                else /* CHV needs even encode values */
                        adj = IS_CHERRYVIEW(dev_priv) ? 2 : 1;
+
+               if (new_delay >= dev_priv->rps.max_freq_softlimit)
+                       adj = 0;
                /*
                 * For better performance, jump directly
                 * to RPe if we're below it.
@@ -1191,6 +1194,9 @@ static void gen6_pm_rps_work(struct work_struct *work)
                        adj *= 2;
                else /* CHV needs even encode values */
                        adj = IS_CHERRYVIEW(dev_priv) ? -2 : -1;
+
+               if (new_delay <= dev_priv->rps.min_freq_softlimit)
+                       adj = 0;
        } else { /* unknown event */
                adj = 0;
        }