diff options
author | Sagar Arun Kamble <sagar.a.kamble@intel.com> | 2017-10-10 17:30:09 -0400 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2017-10-11 03:57:05 -0400 |
commit | fc77426a8d69d6a706378a53b18c882578af44e5 (patch) | |
tree | 45161fb1fc45aadd1851b55d98fb010ab102d35a /drivers/gpu/drm/i915/intel_pm.c | |
parent | 0870a2a4a3d0aab568ce5729bd99f43f96825f85 (diff) |
drm/i915: Create generic functions to control RC6, RPS
Prepared generic functions intel_enable_rc6, intel_disable_rc6,
intel_enable_rps and intel_disable_rps functions to setup RC6/RPS
based on platforms.
v2: Make intel_enable/disable_rc6/rps static. (Chris)
v3: Added lockdep_assert_held(dev_priv->pcu_lock) in new generic
functions. (Chris)
Removed WARN_ON(&dev_priv->pcu_lock) from lower level functions as generic
function now has lockdep_assert. Rebase.
Signed-off-by: Sagar Arun Kamble <sagar.a.kamble@intel.com>
Cc: Imre Deak <imre.deak@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Radoslaw Szwichtenberg <radoslaw.szwichtenberg@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/1507360055-19948-12-git-send-email-sagar.a.kamble@intel.com
Acked-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20171010213010.7415-11-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 116 |
1 files changed, 70 insertions, 46 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 238d405e2fb2..a4d431d3980a 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -6731,8 +6731,6 @@ static void gen6_enable_rc6(struct drm_i915_private *dev_priv) | |||
6731 | int rc6_mode; | 6731 | int rc6_mode; |
6732 | int ret; | 6732 | int ret; |
6733 | 6733 | ||
6734 | WARN_ON(!mutex_is_locked(&dev_priv->pcu_lock)); | ||
6735 | |||
6736 | I915_WRITE(GEN6_RC_STATE, 0); | 6734 | I915_WRITE(GEN6_RC_STATE, 0); |
6737 | 6735 | ||
6738 | /* Clear the DBG now so we don't confuse earlier errors */ | 6736 | /* Clear the DBG now so we don't confuse earlier errors */ |
@@ -6805,8 +6803,6 @@ static void gen6_enable_rc6(struct drm_i915_private *dev_priv) | |||
6805 | 6803 | ||
6806 | static void gen6_enable_rps(struct drm_i915_private *dev_priv) | 6804 | static void gen6_enable_rps(struct drm_i915_private *dev_priv) |
6807 | { | 6805 | { |
6808 | WARN_ON(!mutex_is_locked(&dev_priv->pcu_lock)); | ||
6809 | |||
6810 | /* Here begins a magic sequence of register writes to enable | 6806 | /* Here begins a magic sequence of register writes to enable |
6811 | * auto-downclocking. | 6807 | * auto-downclocking. |
6812 | * | 6808 | * |
@@ -7227,8 +7223,6 @@ static void cherryview_enable_rc6(struct drm_i915_private *dev_priv) | |||
7227 | enum intel_engine_id id; | 7223 | enum intel_engine_id id; |
7228 | u32 gtfifodbg, rc6_mode = 0, pcbr; | 7224 | u32 gtfifodbg, rc6_mode = 0, pcbr; |
7229 | 7225 | ||
7230 | WARN_ON(!mutex_is_locked(&dev_priv->pcu_lock)); | ||
7231 | |||
7232 | gtfifodbg = I915_READ(GTFIFODBG) & ~(GT_FIFO_SBDEDICATE_FREE_ENTRY_CHV | | 7226 | gtfifodbg = I915_READ(GTFIFODBG) & ~(GT_FIFO_SBDEDICATE_FREE_ENTRY_CHV | |
7233 | GT_FIFO_FREE_ENTRIES_CHV); | 7227 | GT_FIFO_FREE_ENTRIES_CHV); |
7234 | if (gtfifodbg) { | 7228 | if (gtfifodbg) { |
@@ -7281,8 +7275,6 @@ static void cherryview_enable_rps(struct drm_i915_private *dev_priv) | |||
7281 | { | 7275 | { |
7282 | u32 val; | 7276 | u32 val; |
7283 | 7277 | ||
7284 | WARN_ON(!mutex_is_locked(&dev_priv->pcu_lock)); | ||
7285 | |||
7286 | intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); | 7278 | intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); |
7287 | 7279 | ||
7288 | /* 1: Program defaults and thresholds for RPS*/ | 7280 | /* 1: Program defaults and thresholds for RPS*/ |
@@ -7327,8 +7319,6 @@ static void valleyview_enable_rc6(struct drm_i915_private *dev_priv) | |||
7327 | enum intel_engine_id id; | 7319 | enum intel_engine_id id; |
7328 | u32 gtfifodbg, rc6_mode = 0; | 7320 | u32 gtfifodbg, rc6_mode = 0; |
7329 | 7321 | ||
7330 | WARN_ON(!mutex_is_locked(&dev_priv->pcu_lock)); | ||
7331 | |||
7332 | valleyview_check_pctx(dev_priv); | 7322 | valleyview_check_pctx(dev_priv); |
7333 | 7323 | ||
7334 | gtfifodbg = I915_READ(GTFIFODBG); | 7324 | gtfifodbg = I915_READ(GTFIFODBG); |
@@ -7374,8 +7364,6 @@ static void valleyview_enable_rps(struct drm_i915_private *dev_priv) | |||
7374 | { | 7364 | { |
7375 | u32 val; | 7365 | u32 val; |
7376 | 7366 | ||
7377 | WARN_ON(!mutex_is_locked(&dev_priv->pcu_lock)); | ||
7378 | |||
7379 | intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); | 7367 | intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); |
7380 | 7368 | ||
7381 | I915_WRITE(GEN6_RP_DOWN_TIMEOUT, 1000000); | 7369 | I915_WRITE(GEN6_RP_DOWN_TIMEOUT, 1000000); |
@@ -7989,31 +7977,47 @@ static inline void intel_disable_llc_pstate(struct drm_i915_private *i915) | |||
7989 | /* Currently there is no HW configuration to be done to disable. */ | 7977 | /* Currently there is no HW configuration to be done to disable. */ |
7990 | } | 7978 | } |
7991 | 7979 | ||
7992 | void intel_disable_gt_powersave(struct drm_i915_private *dev_priv) | 7980 | static void intel_disable_rc6(struct drm_i915_private *dev_priv) |
7993 | { | 7981 | { |
7994 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | 7982 | lockdep_assert_held(&dev_priv->pcu_lock); |
7995 | 7983 | ||
7996 | if (!READ_ONCE(rps->enabled)) | 7984 | if (INTEL_GEN(dev_priv) >= 9) |
7997 | return; | 7985 | gen9_disable_rc6(dev_priv); |
7986 | else if (IS_CHERRYVIEW(dev_priv)) | ||
7987 | cherryview_disable_rc6(dev_priv); | ||
7988 | else if (IS_VALLEYVIEW(dev_priv)) | ||
7989 | valleyview_disable_rc6(dev_priv); | ||
7990 | else if (INTEL_GEN(dev_priv) >= 6) | ||
7991 | gen6_disable_rc6(dev_priv); | ||
7992 | } | ||
7998 | 7993 | ||
7999 | mutex_lock(&dev_priv->pcu_lock); | 7994 | static void intel_disable_rps(struct drm_i915_private *dev_priv) |
7995 | { | ||
7996 | lockdep_assert_held(&dev_priv->pcu_lock); | ||
8000 | 7997 | ||
8001 | if (INTEL_GEN(dev_priv) >= 9) { | 7998 | if (INTEL_GEN(dev_priv) >= 9) |
8002 | gen9_disable_rc6(dev_priv); | ||
8003 | gen9_disable_rps(dev_priv); | 7999 | gen9_disable_rps(dev_priv); |
8004 | } else if (IS_CHERRYVIEW(dev_priv)) { | 8000 | else if (IS_CHERRYVIEW(dev_priv)) |
8005 | cherryview_disable_rc6(dev_priv); | ||
8006 | cherryview_disable_rps(dev_priv); | 8001 | cherryview_disable_rps(dev_priv); |
8007 | } else if (IS_VALLEYVIEW(dev_priv)) { | 8002 | else if (IS_VALLEYVIEW(dev_priv)) |
8008 | valleyview_disable_rc6(dev_priv); | ||
8009 | valleyview_disable_rps(dev_priv); | 8003 | valleyview_disable_rps(dev_priv); |
8010 | } else if (INTEL_GEN(dev_priv) >= 6) { | 8004 | else if (INTEL_GEN(dev_priv) >= 6) |
8011 | gen6_disable_rc6(dev_priv); | ||
8012 | gen6_disable_rps(dev_priv); | 8005 | gen6_disable_rps(dev_priv); |
8013 | } else if (IS_IRONLAKE_M(dev_priv)) { | 8006 | else if (IS_IRONLAKE_M(dev_priv)) |
8014 | ironlake_disable_drps(dev_priv); | 8007 | ironlake_disable_drps(dev_priv); |
8015 | } | 8008 | } |
8009 | |||
8010 | void intel_disable_gt_powersave(struct drm_i915_private *dev_priv) | ||
8011 | { | ||
8012 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
8016 | 8013 | ||
8014 | if (!READ_ONCE(rps->enabled)) | ||
8015 | return; | ||
8016 | |||
8017 | mutex_lock(&dev_priv->pcu_lock); | ||
8018 | |||
8019 | intel_disable_rc6(dev_priv); | ||
8020 | intel_disable_rps(dev_priv); | ||
8017 | if (HAS_LLC(dev_priv)) | 8021 | if (HAS_LLC(dev_priv)) |
8018 | intel_disable_llc_pstate(dev_priv); | 8022 | intel_disable_llc_pstate(dev_priv); |
8019 | 8023 | ||
@@ -8028,50 +8032,70 @@ static inline void intel_enable_llc_pstate(struct drm_i915_private *i915) | |||
8028 | gen6_update_ring_freq(i915); | 8032 | gen6_update_ring_freq(i915); |
8029 | } | 8033 | } |
8030 | 8034 | ||
8031 | void intel_enable_gt_powersave(struct drm_i915_private *dev_priv) | 8035 | static void intel_enable_rc6(struct drm_i915_private *dev_priv) |
8032 | { | 8036 | { |
8033 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | 8037 | lockdep_assert_held(&dev_priv->pcu_lock); |
8034 | 8038 | ||
8035 | /* We shouldn't be disabling as we submit, so this should be less | 8039 | if (IS_CHERRYVIEW(dev_priv)) |
8036 | * racy than it appears! | 8040 | cherryview_enable_rc6(dev_priv); |
8037 | */ | 8041 | else if (IS_VALLEYVIEW(dev_priv)) |
8038 | if (READ_ONCE(rps->enabled)) | 8042 | valleyview_enable_rc6(dev_priv); |
8039 | return; | 8043 | else if (INTEL_GEN(dev_priv) >= 9) |
8044 | gen9_enable_rc6(dev_priv); | ||
8045 | else if (IS_BROADWELL(dev_priv)) | ||
8046 | gen8_enable_rc6(dev_priv); | ||
8047 | else if (INTEL_GEN(dev_priv) >= 6) | ||
8048 | gen6_enable_rc6(dev_priv); | ||
8049 | } | ||
8040 | 8050 | ||
8041 | /* Powersaving is controlled by the host when inside a VM */ | 8051 | static void intel_enable_rps(struct drm_i915_private *dev_priv) |
8042 | if (intel_vgpu_active(dev_priv)) | 8052 | { |
8043 | return; | 8053 | struct intel_rps *rps = &dev_priv->gt_pm.rps; |
8044 | 8054 | ||
8045 | mutex_lock(&dev_priv->pcu_lock); | 8055 | lockdep_assert_held(&dev_priv->pcu_lock); |
8046 | 8056 | ||
8047 | if (IS_CHERRYVIEW(dev_priv)) { | 8057 | if (IS_CHERRYVIEW(dev_priv)) { |
8048 | cherryview_enable_rc6(dev_priv); | ||
8049 | cherryview_enable_rps(dev_priv); | 8058 | cherryview_enable_rps(dev_priv); |
8050 | } else if (IS_VALLEYVIEW(dev_priv)) { | 8059 | } else if (IS_VALLEYVIEW(dev_priv)) { |
8051 | valleyview_enable_rc6(dev_priv); | ||
8052 | valleyview_enable_rps(dev_priv); | 8060 | valleyview_enable_rps(dev_priv); |
8053 | } else if (INTEL_GEN(dev_priv) >= 9) { | 8061 | } else if (INTEL_GEN(dev_priv) >= 9) { |
8054 | gen9_enable_rc6(dev_priv); | ||
8055 | gen9_enable_rps(dev_priv); | 8062 | gen9_enable_rps(dev_priv); |
8056 | } else if (IS_BROADWELL(dev_priv)) { | 8063 | } else if (IS_BROADWELL(dev_priv)) { |
8057 | gen8_enable_rc6(dev_priv); | ||
8058 | gen8_enable_rps(dev_priv); | 8064 | gen8_enable_rps(dev_priv); |
8059 | } else if (INTEL_GEN(dev_priv) >= 6) { | 8065 | } else if (INTEL_GEN(dev_priv) >= 6) { |
8060 | gen6_enable_rc6(dev_priv); | ||
8061 | gen6_enable_rps(dev_priv); | 8066 | gen6_enable_rps(dev_priv); |
8062 | } else if (IS_IRONLAKE_M(dev_priv)) { | 8067 | } else if (IS_IRONLAKE_M(dev_priv)) { |
8063 | ironlake_enable_drps(dev_priv); | 8068 | ironlake_enable_drps(dev_priv); |
8064 | intel_init_emon(dev_priv); | 8069 | intel_init_emon(dev_priv); |
8065 | } | 8070 | } |
8066 | 8071 | ||
8067 | if (HAS_LLC(dev_priv)) | ||
8068 | intel_enable_llc_pstate(dev_priv); | ||
8069 | |||
8070 | WARN_ON(rps->max_freq < rps->min_freq); | 8072 | WARN_ON(rps->max_freq < rps->min_freq); |
8071 | WARN_ON(rps->idle_freq > rps->max_freq); | 8073 | WARN_ON(rps->idle_freq > rps->max_freq); |
8072 | 8074 | ||
8073 | WARN_ON(rps->efficient_freq < rps->min_freq); | 8075 | WARN_ON(rps->efficient_freq < rps->min_freq); |
8074 | WARN_ON(rps->efficient_freq > rps->max_freq); | 8076 | WARN_ON(rps->efficient_freq > rps->max_freq); |
8077 | } | ||
8078 | |||
8079 | void intel_enable_gt_powersave(struct drm_i915_private *dev_priv) | ||
8080 | { | ||
8081 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
8082 | |||
8083 | /* We shouldn't be disabling as we submit, so this should be less | ||
8084 | * racy than it appears! | ||
8085 | */ | ||
8086 | if (READ_ONCE(rps->enabled)) | ||
8087 | return; | ||
8088 | |||
8089 | /* Powersaving is controlled by the host when inside a VM */ | ||
8090 | if (intel_vgpu_active(dev_priv)) | ||
8091 | return; | ||
8092 | |||
8093 | mutex_lock(&dev_priv->pcu_lock); | ||
8094 | |||
8095 | intel_enable_rc6(dev_priv); | ||
8096 | intel_enable_rps(dev_priv); | ||
8097 | if (HAS_LLC(dev_priv)) | ||
8098 | intel_enable_llc_pstate(dev_priv); | ||
8075 | 8099 | ||
8076 | rps->enabled = true; | 8100 | rps->enabled = true; |
8077 | mutex_unlock(&dev_priv->pcu_lock); | 8101 | mutex_unlock(&dev_priv->pcu_lock); |