OSDN Git Service

drm/i915/cnl: Get RC6 working.
authorRodrigo Vivi <rodrigo.vivi@intel.com>
Mon, 23 Oct 2017 22:46:12 +0000 (15:46 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 24 Oct 2017 17:20:29 +0000 (10:20 -0700)
On CNL, individual wake rate limit was added to each engine.

GT can only go to RC6 if both Render and Media engines are
individually qualified. So we need to set their individual
wake rate limit.

+-----------------+---------------+--------------+--------------+
|                 |    GT RC6     |  Render C6   |   Media C6   |
+-----------------+---------------+--------------+--------------+
| Wake rate limit | 0xA09C[31:16] | 0xA09C[15:0] | 0xA0A0[15:0] |
+-----------------+---------------+--------------+--------------+

v2: - Tune Render and Media wake rate values according to some extra
      info I got from HW engineers. Value can be tuned, but for now
      these are the recommended values.
    - Fix typos pointed by James.

Cc: Nathan Ciobanu <nathan.d.ciobanu@intel.com>
Cc: Wayne Boyer <wayne.boyer@intel.com>
Cc: Joe Konno <joe.konno@linux.intel.com>
Cc: David Weinehall <david.weinehall@linux.intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: James Ausmus <james.ausmus@intel.com>
Reviewed-by: David Weinehall <david.weinehall@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171023224612.27208-1-rodrigo.vivi@intel.com
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_pm.c

index 68a58cc..f138eae 100644 (file)
@@ -7905,6 +7905,7 @@ enum {
 #define GEN6_RC1_WAKE_RATE_LIMIT               _MMIO(0xA098)
 #define GEN6_RC6_WAKE_RATE_LIMIT               _MMIO(0xA09C)
 #define GEN6_RC6pp_WAKE_RATE_LIMIT             _MMIO(0xA0A0)
+#define GEN10_MEDIA_WAKE_RATE_LIMIT            _MMIO(0xA0A0)
 #define GEN6_RC_EVALUATION_INTERVAL            _MMIO(0xA0A8)
 #define GEN6_RC_IDLE_HYSTERSIS                 _MMIO(0xA0AC)
 #define GEN6_RC_SLEEP                          _MMIO(0xA0B0)
index c42a65a..1ead517 100644 (file)
@@ -6604,12 +6604,19 @@ static void gen9_enable_rc6(struct drm_i915_private *dev_priv)
        I915_WRITE(GEN6_RC_CONTROL, 0);
 
        /* 2b: Program RC6 thresholds.*/
-
-       /* WaRsDoubleRc6WrlWithCoarsePowerGating: Doubling WRL only when CPG is enabled */
-       if (IS_SKYLAKE(dev_priv))
+       if (INTEL_GEN(dev_priv) >= 10) {
+               I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 54 << 16 | 85);
+               I915_WRITE(GEN10_MEDIA_WAKE_RATE_LIMIT, 150);
+       } else if (IS_SKYLAKE(dev_priv)) {
+               /*
+                * WaRsDoubleRc6WrlWithCoarsePowerGating:skl Doubling WRL only
+                * when CPG is enabled
+                */
                I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 108 << 16);
-       else
+       } else {
                I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 54 << 16);
+       }
+
        I915_WRITE(GEN6_RC_EVALUATION_INTERVAL, 125000); /* 12500 * 1280ns */
        I915_WRITE(GEN6_RC_IDLE_HYSTERSIS, 25); /* 25 * 1280ns */
        for_each_engine(engine, dev_priv, id)