|
@@ -6626,9 +6626,29 @@ static void gen9_enable_rc6(struct drm_i915_private *dev_priv)
|
|
|
|
|
|
I915_WRITE(GEN6_RC_SLEEP, 0);
|
|
|
|
|
|
- /* 2c: Program Coarse Power Gating Policies. */
|
|
|
- I915_WRITE(GEN9_MEDIA_PG_IDLE_HYSTERESIS, 25);
|
|
|
- I915_WRITE(GEN9_RENDER_PG_IDLE_HYSTERESIS, 25);
|
|
|
+ /*
|
|
|
+ * 2c: Program Coarse Power Gating Policies.
|
|
|
+ *
|
|
|
+ * Bspec's guidance is to use 25us (really 25 * 1280ns) here. What we
|
|
|
+ * use instead is a more conservative estimate for the maximum time
|
|
|
+ * it takes us to service a CS interrupt and submit a new ELSP - that
|
|
|
+ * is the time which the GPU is idle waiting for the CPU to select the
|
|
|
+ * next request to execute. If the idle hysteresis is less than that
|
|
|
+ * interrupt service latency, the hardware will automatically gate
|
|
|
+ * the power well and we will then incur the wake up cost on top of
|
|
|
+ * the service latency. A similar guide from intel_pstate is that we
|
|
|
+ * do not want the enable hysteresis to less than the wakeup latency.
|
|
|
+ *
|
|
|
+ * igt/gem_exec_nop/sequential provides a rough estimate for the
|
|
|
+ * service latency, and puts it around 10us for Broadwell (and other
|
|
|
+ * big core) and around 40us for Broxton (and other low power cores).
|
|
|
+ * [Note that for legacy ringbuffer submission, this is less than 1us!]
|
|
|
+ * However, the wakeup latency on Broxton is closer to 100us. To be
|
|
|
+ * conservative, we have to factor in a context switch on top (due
|
|
|
+ * to ksoftirqd).
|
|
|
+ */
|
|
|
+ I915_WRITE(GEN9_MEDIA_PG_IDLE_HYSTERESIS, 250);
|
|
|
+ I915_WRITE(GEN9_RENDER_PG_IDLE_HYSTERESIS, 250);
|
|
|
|
|
|
/* 3a: Enable RC6 */
|
|
|
I915_WRITE(GEN6_RC6_THRESHOLD, 37500); /* 37.5/125ms per EI */
|