aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_pm.c
diff options
context:
space:
mode:
authorSagar Arun Kamble <sagar.a.kamble@intel.com>2017-10-10 17:30:09 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2017-10-11 03:57:05 -0400
commitfc77426a8d69d6a706378a53b18c882578af44e5 (patch)
tree45161fb1fc45aadd1851b55d98fb010ab102d35a /drivers/gpu/drm/i915/intel_pm.c
parent0870a2a4a3d0aab568ce5729bd99f43f96825f85 (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.c116
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
6806static void gen6_enable_rps(struct drm_i915_private *dev_priv) 6804static 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
7992void intel_disable_gt_powersave(struct drm_i915_private *dev_priv) 7980static 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); 7994static 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
8010void 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
8031void intel_enable_gt_powersave(struct drm_i915_private *dev_priv) 8035static 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 */ 8051static 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
8079void 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);