diff options
author | Sagar Arun Kamble <sagar.a.kamble@intel.com> | 2017-10-10 17:30:06 -0400 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2017-10-11 03:56:59 -0400 |
commit | 562d9bae08a10335368bf54ea5cc7e4f6185bccc (patch) | |
tree | bed8838c1e250e1104b3d224f9e81ae484fa4b16 /drivers/gpu/drm/i915/intel_pm.c | |
parent | 9f817501bd7facfe2bffacd637f4332e5991e57a (diff) |
drm/i915: Name structure in dev_priv that contains RPS/RC6 state as "gt_pm"
Prepared substructure rps for RPS related state. autoenable_work is
used for RC6 too hence it is defined outside rps structure. As we do
this lot many functions are refactored to use intel_rps *rps to access
rps related members. Hence renamed intel_rps_client pointer variables
to rps_client in various functions.
v2: Rebase.
v3: s/pm/gt_pm (Chris)
Refactored access to rps structure by declaring struct intel_rps * in
many functions.
Signed-off-by: Sagar Arun Kamble <sagar.a.kamble@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Imre Deak <imre.deak@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: Radoslaw Szwichtenberg <radoslaw.szwichtenberg@intel.com> #1
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/1507360055-19948-9-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-8-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 | 315 |
1 files changed, 174 insertions, 141 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 512f2b0513e0..9097489e1993 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -5988,6 +5988,7 @@ static void ironlake_disable_drps(struct drm_i915_private *dev_priv) | |||
5988 | */ | 5988 | */ |
5989 | static u32 intel_rps_limits(struct drm_i915_private *dev_priv, u8 val) | 5989 | static u32 intel_rps_limits(struct drm_i915_private *dev_priv, u8 val) |
5990 | { | 5990 | { |
5991 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
5991 | u32 limits; | 5992 | u32 limits; |
5992 | 5993 | ||
5993 | /* Only set the down limit when we've reached the lowest level to avoid | 5994 | /* Only set the down limit when we've reached the lowest level to avoid |
@@ -5997,13 +5998,13 @@ static u32 intel_rps_limits(struct drm_i915_private *dev_priv, u8 val) | |||
5997 | * frequency, if the down threshold expires in that window we will not | 5998 | * frequency, if the down threshold expires in that window we will not |
5998 | * receive a down interrupt. */ | 5999 | * receive a down interrupt. */ |
5999 | if (INTEL_GEN(dev_priv) >= 9) { | 6000 | if (INTEL_GEN(dev_priv) >= 9) { |
6000 | limits = (dev_priv->rps.max_freq_softlimit) << 23; | 6001 | limits = (rps->max_freq_softlimit) << 23; |
6001 | if (val <= dev_priv->rps.min_freq_softlimit) | 6002 | if (val <= rps->min_freq_softlimit) |
6002 | limits |= (dev_priv->rps.min_freq_softlimit) << 14; | 6003 | limits |= (rps->min_freq_softlimit) << 14; |
6003 | } else { | 6004 | } else { |
6004 | limits = dev_priv->rps.max_freq_softlimit << 24; | 6005 | limits = rps->max_freq_softlimit << 24; |
6005 | if (val <= dev_priv->rps.min_freq_softlimit) | 6006 | if (val <= rps->min_freq_softlimit) |
6006 | limits |= dev_priv->rps.min_freq_softlimit << 16; | 6007 | limits |= rps->min_freq_softlimit << 16; |
6007 | } | 6008 | } |
6008 | 6009 | ||
6009 | return limits; | 6010 | return limits; |
@@ -6011,39 +6012,40 @@ static u32 intel_rps_limits(struct drm_i915_private *dev_priv, u8 val) | |||
6011 | 6012 | ||
6012 | static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val) | 6013 | static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val) |
6013 | { | 6014 | { |
6015 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
6014 | int new_power; | 6016 | int new_power; |
6015 | u32 threshold_up = 0, threshold_down = 0; /* in % */ | 6017 | u32 threshold_up = 0, threshold_down = 0; /* in % */ |
6016 | u32 ei_up = 0, ei_down = 0; | 6018 | u32 ei_up = 0, ei_down = 0; |
6017 | 6019 | ||
6018 | new_power = dev_priv->rps.power; | 6020 | new_power = rps->power; |
6019 | switch (dev_priv->rps.power) { | 6021 | switch (rps->power) { |
6020 | case LOW_POWER: | 6022 | case LOW_POWER: |
6021 | if (val > dev_priv->rps.efficient_freq + 1 && | 6023 | if (val > rps->efficient_freq + 1 && |
6022 | val > dev_priv->rps.cur_freq) | 6024 | val > rps->cur_freq) |
6023 | new_power = BETWEEN; | 6025 | new_power = BETWEEN; |
6024 | break; | 6026 | break; |
6025 | 6027 | ||
6026 | case BETWEEN: | 6028 | case BETWEEN: |
6027 | if (val <= dev_priv->rps.efficient_freq && | 6029 | if (val <= rps->efficient_freq && |
6028 | val < dev_priv->rps.cur_freq) | 6030 | val < rps->cur_freq) |
6029 | new_power = LOW_POWER; | 6031 | new_power = LOW_POWER; |
6030 | else if (val >= dev_priv->rps.rp0_freq && | 6032 | else if (val >= rps->rp0_freq && |
6031 | val > dev_priv->rps.cur_freq) | 6033 | val > rps->cur_freq) |
6032 | new_power = HIGH_POWER; | 6034 | new_power = HIGH_POWER; |
6033 | break; | 6035 | break; |
6034 | 6036 | ||
6035 | case HIGH_POWER: | 6037 | case HIGH_POWER: |
6036 | if (val < (dev_priv->rps.rp1_freq + dev_priv->rps.rp0_freq) >> 1 && | 6038 | if (val < (rps->rp1_freq + rps->rp0_freq) >> 1 && |
6037 | val < dev_priv->rps.cur_freq) | 6039 | val < rps->cur_freq) |
6038 | new_power = BETWEEN; | 6040 | new_power = BETWEEN; |
6039 | break; | 6041 | break; |
6040 | } | 6042 | } |
6041 | /* Max/min bins are special */ | 6043 | /* Max/min bins are special */ |
6042 | if (val <= dev_priv->rps.min_freq_softlimit) | 6044 | if (val <= rps->min_freq_softlimit) |
6043 | new_power = LOW_POWER; | 6045 | new_power = LOW_POWER; |
6044 | if (val >= dev_priv->rps.max_freq_softlimit) | 6046 | if (val >= rps->max_freq_softlimit) |
6045 | new_power = HIGH_POWER; | 6047 | new_power = HIGH_POWER; |
6046 | if (new_power == dev_priv->rps.power) | 6048 | if (new_power == rps->power) |
6047 | return; | 6049 | return; |
6048 | 6050 | ||
6049 | /* Note the units here are not exactly 1us, but 1280ns. */ | 6051 | /* Note the units here are not exactly 1us, but 1280ns. */ |
@@ -6106,20 +6108,21 @@ static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val) | |||
6106 | GEN6_RP_DOWN_IDLE_AVG); | 6108 | GEN6_RP_DOWN_IDLE_AVG); |
6107 | 6109 | ||
6108 | skip_hw_write: | 6110 | skip_hw_write: |
6109 | dev_priv->rps.power = new_power; | 6111 | rps->power = new_power; |
6110 | dev_priv->rps.up_threshold = threshold_up; | 6112 | rps->up_threshold = threshold_up; |
6111 | dev_priv->rps.down_threshold = threshold_down; | 6113 | rps->down_threshold = threshold_down; |
6112 | dev_priv->rps.last_adj = 0; | 6114 | rps->last_adj = 0; |
6113 | } | 6115 | } |
6114 | 6116 | ||
6115 | static u32 gen6_rps_pm_mask(struct drm_i915_private *dev_priv, u8 val) | 6117 | static u32 gen6_rps_pm_mask(struct drm_i915_private *dev_priv, u8 val) |
6116 | { | 6118 | { |
6119 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
6117 | u32 mask = 0; | 6120 | u32 mask = 0; |
6118 | 6121 | ||
6119 | /* We use UP_EI_EXPIRED interupts for both up/down in manual mode */ | 6122 | /* We use UP_EI_EXPIRED interupts for both up/down in manual mode */ |
6120 | if (val > dev_priv->rps.min_freq_softlimit) | 6123 | if (val > rps->min_freq_softlimit) |
6121 | mask |= GEN6_PM_RP_UP_EI_EXPIRED | GEN6_PM_RP_DOWN_THRESHOLD | GEN6_PM_RP_DOWN_TIMEOUT; | 6124 | mask |= GEN6_PM_RP_UP_EI_EXPIRED | GEN6_PM_RP_DOWN_THRESHOLD | GEN6_PM_RP_DOWN_TIMEOUT; |
6122 | if (val < dev_priv->rps.max_freq_softlimit) | 6125 | if (val < rps->max_freq_softlimit) |
6123 | mask |= GEN6_PM_RP_UP_EI_EXPIRED | GEN6_PM_RP_UP_THRESHOLD; | 6126 | mask |= GEN6_PM_RP_UP_EI_EXPIRED | GEN6_PM_RP_UP_THRESHOLD; |
6124 | 6127 | ||
6125 | mask &= dev_priv->pm_rps_events; | 6128 | mask &= dev_priv->pm_rps_events; |
@@ -6132,10 +6135,12 @@ static u32 gen6_rps_pm_mask(struct drm_i915_private *dev_priv, u8 val) | |||
6132 | * update the GEN6_RP_INTERRUPT_LIMITS register accordingly. */ | 6135 | * update the GEN6_RP_INTERRUPT_LIMITS register accordingly. */ |
6133 | static int gen6_set_rps(struct drm_i915_private *dev_priv, u8 val) | 6136 | static int gen6_set_rps(struct drm_i915_private *dev_priv, u8 val) |
6134 | { | 6137 | { |
6138 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
6139 | |||
6135 | /* min/max delay may still have been modified so be sure to | 6140 | /* min/max delay may still have been modified so be sure to |
6136 | * write the limits value. | 6141 | * write the limits value. |
6137 | */ | 6142 | */ |
6138 | if (val != dev_priv->rps.cur_freq) { | 6143 | if (val != rps->cur_freq) { |
6139 | gen6_set_rps_thresholds(dev_priv, val); | 6144 | gen6_set_rps_thresholds(dev_priv, val); |
6140 | 6145 | ||
6141 | if (INTEL_GEN(dev_priv) >= 9) | 6146 | if (INTEL_GEN(dev_priv) >= 9) |
@@ -6157,7 +6162,7 @@ static int gen6_set_rps(struct drm_i915_private *dev_priv, u8 val) | |||
6157 | I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, intel_rps_limits(dev_priv, val)); | 6162 | I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, intel_rps_limits(dev_priv, val)); |
6158 | I915_WRITE(GEN6_PMINTRMSK, gen6_rps_pm_mask(dev_priv, val)); | 6163 | I915_WRITE(GEN6_PMINTRMSK, gen6_rps_pm_mask(dev_priv, val)); |
6159 | 6164 | ||
6160 | dev_priv->rps.cur_freq = val; | 6165 | rps->cur_freq = val; |
6161 | trace_intel_gpu_freq_change(intel_gpu_freq(dev_priv, val)); | 6166 | trace_intel_gpu_freq_change(intel_gpu_freq(dev_priv, val)); |
6162 | 6167 | ||
6163 | return 0; | 6168 | return 0; |
@@ -6173,7 +6178,7 @@ static int valleyview_set_rps(struct drm_i915_private *dev_priv, u8 val) | |||
6173 | 6178 | ||
6174 | I915_WRITE(GEN6_PMINTRMSK, gen6_rps_pm_mask(dev_priv, val)); | 6179 | I915_WRITE(GEN6_PMINTRMSK, gen6_rps_pm_mask(dev_priv, val)); |
6175 | 6180 | ||
6176 | if (val != dev_priv->rps.cur_freq) { | 6181 | if (val != dev_priv->gt_pm.rps.cur_freq) { |
6177 | err = vlv_punit_write(dev_priv, PUNIT_REG_GPU_FREQ_REQ, val); | 6182 | err = vlv_punit_write(dev_priv, PUNIT_REG_GPU_FREQ_REQ, val); |
6178 | if (err) | 6183 | if (err) |
6179 | return err; | 6184 | return err; |
@@ -6181,7 +6186,7 @@ static int valleyview_set_rps(struct drm_i915_private *dev_priv, u8 val) | |||
6181 | gen6_set_rps_thresholds(dev_priv, val); | 6186 | gen6_set_rps_thresholds(dev_priv, val); |
6182 | } | 6187 | } |
6183 | 6188 | ||
6184 | dev_priv->rps.cur_freq = val; | 6189 | dev_priv->gt_pm.rps.cur_freq = val; |
6185 | trace_intel_gpu_freq_change(intel_gpu_freq(dev_priv, val)); | 6190 | trace_intel_gpu_freq_change(intel_gpu_freq(dev_priv, val)); |
6186 | 6191 | ||
6187 | return 0; | 6192 | return 0; |
@@ -6196,10 +6201,11 @@ static int valleyview_set_rps(struct drm_i915_private *dev_priv, u8 val) | |||
6196 | */ | 6201 | */ |
6197 | static void vlv_set_rps_idle(struct drm_i915_private *dev_priv) | 6202 | static void vlv_set_rps_idle(struct drm_i915_private *dev_priv) |
6198 | { | 6203 | { |
6199 | u32 val = dev_priv->rps.idle_freq; | 6204 | struct intel_rps *rps = &dev_priv->gt_pm.rps; |
6205 | u32 val = rps->idle_freq; | ||
6200 | int err; | 6206 | int err; |
6201 | 6207 | ||
6202 | if (dev_priv->rps.cur_freq <= val) | 6208 | if (rps->cur_freq <= val) |
6203 | return; | 6209 | return; |
6204 | 6210 | ||
6205 | /* The punit delays the write of the frequency and voltage until it | 6211 | /* The punit delays the write of the frequency and voltage until it |
@@ -6224,27 +6230,29 @@ static void vlv_set_rps_idle(struct drm_i915_private *dev_priv) | |||
6224 | 6230 | ||
6225 | void gen6_rps_busy(struct drm_i915_private *dev_priv) | 6231 | void gen6_rps_busy(struct drm_i915_private *dev_priv) |
6226 | { | 6232 | { |
6233 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
6234 | |||
6227 | mutex_lock(&dev_priv->pcu_lock); | 6235 | mutex_lock(&dev_priv->pcu_lock); |
6228 | if (dev_priv->rps.enabled) { | 6236 | if (rps->enabled) { |
6229 | u8 freq; | 6237 | u8 freq; |
6230 | 6238 | ||
6231 | if (dev_priv->pm_rps_events & GEN6_PM_RP_UP_EI_EXPIRED) | 6239 | if (dev_priv->pm_rps_events & GEN6_PM_RP_UP_EI_EXPIRED) |
6232 | gen6_rps_reset_ei(dev_priv); | 6240 | gen6_rps_reset_ei(dev_priv); |
6233 | I915_WRITE(GEN6_PMINTRMSK, | 6241 | I915_WRITE(GEN6_PMINTRMSK, |
6234 | gen6_rps_pm_mask(dev_priv, dev_priv->rps.cur_freq)); | 6242 | gen6_rps_pm_mask(dev_priv, rps->cur_freq)); |
6235 | 6243 | ||
6236 | gen6_enable_rps_interrupts(dev_priv); | 6244 | gen6_enable_rps_interrupts(dev_priv); |
6237 | 6245 | ||
6238 | /* Use the user's desired frequency as a guide, but for better | 6246 | /* Use the user's desired frequency as a guide, but for better |
6239 | * performance, jump directly to RPe as our starting frequency. | 6247 | * performance, jump directly to RPe as our starting frequency. |
6240 | */ | 6248 | */ |
6241 | freq = max(dev_priv->rps.cur_freq, | 6249 | freq = max(rps->cur_freq, |
6242 | dev_priv->rps.efficient_freq); | 6250 | rps->efficient_freq); |
6243 | 6251 | ||
6244 | if (intel_set_rps(dev_priv, | 6252 | if (intel_set_rps(dev_priv, |
6245 | clamp(freq, | 6253 | clamp(freq, |
6246 | dev_priv->rps.min_freq_softlimit, | 6254 | rps->min_freq_softlimit, |
6247 | dev_priv->rps.max_freq_softlimit))) | 6255 | rps->max_freq_softlimit))) |
6248 | DRM_DEBUG_DRIVER("Failed to set idle frequency\n"); | 6256 | DRM_DEBUG_DRIVER("Failed to set idle frequency\n"); |
6249 | } | 6257 | } |
6250 | mutex_unlock(&dev_priv->pcu_lock); | 6258 | mutex_unlock(&dev_priv->pcu_lock); |
@@ -6252,6 +6260,8 @@ void gen6_rps_busy(struct drm_i915_private *dev_priv) | |||
6252 | 6260 | ||
6253 | void gen6_rps_idle(struct drm_i915_private *dev_priv) | 6261 | void gen6_rps_idle(struct drm_i915_private *dev_priv) |
6254 | { | 6262 | { |
6263 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
6264 | |||
6255 | /* Flush our bottom-half so that it does not race with us | 6265 | /* Flush our bottom-half so that it does not race with us |
6256 | * setting the idle frequency and so that it is bounded by | 6266 | * setting the idle frequency and so that it is bounded by |
6257 | * our rpm wakeref. And then disable the interrupts to stop any | 6267 | * our rpm wakeref. And then disable the interrupts to stop any |
@@ -6260,12 +6270,12 @@ void gen6_rps_idle(struct drm_i915_private *dev_priv) | |||
6260 | gen6_disable_rps_interrupts(dev_priv); | 6270 | gen6_disable_rps_interrupts(dev_priv); |
6261 | 6271 | ||
6262 | mutex_lock(&dev_priv->pcu_lock); | 6272 | mutex_lock(&dev_priv->pcu_lock); |
6263 | if (dev_priv->rps.enabled) { | 6273 | if (rps->enabled) { |
6264 | if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) | 6274 | if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) |
6265 | vlv_set_rps_idle(dev_priv); | 6275 | vlv_set_rps_idle(dev_priv); |
6266 | else | 6276 | else |
6267 | gen6_set_rps(dev_priv, dev_priv->rps.idle_freq); | 6277 | gen6_set_rps(dev_priv, rps->idle_freq); |
6268 | dev_priv->rps.last_adj = 0; | 6278 | rps->last_adj = 0; |
6269 | I915_WRITE(GEN6_PMINTRMSK, | 6279 | I915_WRITE(GEN6_PMINTRMSK, |
6270 | gen6_sanitize_rps_pm_mask(dev_priv, ~0)); | 6280 | gen6_sanitize_rps_pm_mask(dev_priv, ~0)); |
6271 | } | 6281 | } |
@@ -6273,22 +6283,22 @@ void gen6_rps_idle(struct drm_i915_private *dev_priv) | |||
6273 | } | 6283 | } |
6274 | 6284 | ||
6275 | void gen6_rps_boost(struct drm_i915_gem_request *rq, | 6285 | void gen6_rps_boost(struct drm_i915_gem_request *rq, |
6276 | struct intel_rps_client *rps) | 6286 | struct intel_rps_client *rps_client) |
6277 | { | 6287 | { |
6278 | struct drm_i915_private *i915 = rq->i915; | 6288 | struct intel_rps *rps = &rq->i915->gt_pm.rps; |
6279 | unsigned long flags; | 6289 | unsigned long flags; |
6280 | bool boost; | 6290 | bool boost; |
6281 | 6291 | ||
6282 | /* This is intentionally racy! We peek at the state here, then | 6292 | /* This is intentionally racy! We peek at the state here, then |
6283 | * validate inside the RPS worker. | 6293 | * validate inside the RPS worker. |
6284 | */ | 6294 | */ |
6285 | if (!i915->rps.enabled) | 6295 | if (!rps->enabled) |
6286 | return; | 6296 | return; |
6287 | 6297 | ||
6288 | boost = false; | 6298 | boost = false; |
6289 | spin_lock_irqsave(&rq->lock, flags); | 6299 | spin_lock_irqsave(&rq->lock, flags); |
6290 | if (!rq->waitboost && !i915_gem_request_completed(rq)) { | 6300 | if (!rq->waitboost && !i915_gem_request_completed(rq)) { |
6291 | atomic_inc(&i915->rps.num_waiters); | 6301 | atomic_inc(&rps->num_waiters); |
6292 | rq->waitboost = true; | 6302 | rq->waitboost = true; |
6293 | boost = true; | 6303 | boost = true; |
6294 | } | 6304 | } |
@@ -6296,22 +6306,23 @@ void gen6_rps_boost(struct drm_i915_gem_request *rq, | |||
6296 | if (!boost) | 6306 | if (!boost) |
6297 | return; | 6307 | return; |
6298 | 6308 | ||
6299 | if (READ_ONCE(i915->rps.cur_freq) < i915->rps.boost_freq) | 6309 | if (READ_ONCE(rps->cur_freq) < rps->boost_freq) |
6300 | schedule_work(&i915->rps.work); | 6310 | schedule_work(&rps->work); |
6301 | 6311 | ||
6302 | atomic_inc(rps ? &rps->boosts : &i915->rps.boosts); | 6312 | atomic_inc(rps_client ? &rps_client->boosts : &rps->boosts); |
6303 | } | 6313 | } |
6304 | 6314 | ||
6305 | int intel_set_rps(struct drm_i915_private *dev_priv, u8 val) | 6315 | int intel_set_rps(struct drm_i915_private *dev_priv, u8 val) |
6306 | { | 6316 | { |
6317 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
6307 | int err; | 6318 | int err; |
6308 | 6319 | ||
6309 | lockdep_assert_held(&dev_priv->pcu_lock); | 6320 | lockdep_assert_held(&dev_priv->pcu_lock); |
6310 | GEM_BUG_ON(val > dev_priv->rps.max_freq); | 6321 | GEM_BUG_ON(val > rps->max_freq); |
6311 | GEM_BUG_ON(val < dev_priv->rps.min_freq); | 6322 | GEM_BUG_ON(val < rps->min_freq); |
6312 | 6323 | ||
6313 | if (!dev_priv->rps.enabled) { | 6324 | if (!rps->enabled) { |
6314 | dev_priv->rps.cur_freq = val; | 6325 | rps->cur_freq = val; |
6315 | return 0; | 6326 | return 0; |
6316 | } | 6327 | } |
6317 | 6328 | ||
@@ -6493,24 +6504,26 @@ int sanitize_rc6_option(struct drm_i915_private *dev_priv, int enable_rc6) | |||
6493 | 6504 | ||
6494 | static void gen6_init_rps_frequencies(struct drm_i915_private *dev_priv) | 6505 | static void gen6_init_rps_frequencies(struct drm_i915_private *dev_priv) |
6495 | { | 6506 | { |
6507 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
6508 | |||
6496 | /* All of these values are in units of 50MHz */ | 6509 | /* All of these values are in units of 50MHz */ |
6497 | 6510 | ||
6498 | /* static values from HW: RP0 > RP1 > RPn (min_freq) */ | 6511 | /* static values from HW: RP0 > RP1 > RPn (min_freq) */ |
6499 | if (IS_GEN9_LP(dev_priv)) { | 6512 | if (IS_GEN9_LP(dev_priv)) { |
6500 | u32 rp_state_cap = I915_READ(BXT_RP_STATE_CAP); | 6513 | u32 rp_state_cap = I915_READ(BXT_RP_STATE_CAP); |
6501 | dev_priv->rps.rp0_freq = (rp_state_cap >> 16) & 0xff; | 6514 | rps->rp0_freq = (rp_state_cap >> 16) & 0xff; |
6502 | dev_priv->rps.rp1_freq = (rp_state_cap >> 8) & 0xff; | 6515 | rps->rp1_freq = (rp_state_cap >> 8) & 0xff; |
6503 | dev_priv->rps.min_freq = (rp_state_cap >> 0) & 0xff; | 6516 | rps->min_freq = (rp_state_cap >> 0) & 0xff; |
6504 | } else { | 6517 | } else { |
6505 | u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP); | 6518 | u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP); |
6506 | dev_priv->rps.rp0_freq = (rp_state_cap >> 0) & 0xff; | 6519 | rps->rp0_freq = (rp_state_cap >> 0) & 0xff; |
6507 | dev_priv->rps.rp1_freq = (rp_state_cap >> 8) & 0xff; | 6520 | rps->rp1_freq = (rp_state_cap >> 8) & 0xff; |
6508 | dev_priv->rps.min_freq = (rp_state_cap >> 16) & 0xff; | 6521 | rps->min_freq = (rp_state_cap >> 16) & 0xff; |
6509 | } | 6522 | } |
6510 | /* hw_max = RP0 until we check for overclocking */ | 6523 | /* hw_max = RP0 until we check for overclocking */ |
6511 | dev_priv->rps.max_freq = dev_priv->rps.rp0_freq; | 6524 | rps->max_freq = rps->rp0_freq; |
6512 | 6525 | ||
6513 | dev_priv->rps.efficient_freq = dev_priv->rps.rp1_freq; | 6526 | rps->efficient_freq = rps->rp1_freq; |
6514 | if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv) || | 6527 | if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv) || |
6515 | IS_GEN9_BC(dev_priv) || IS_CANNONLAKE(dev_priv)) { | 6528 | IS_GEN9_BC(dev_priv) || IS_CANNONLAKE(dev_priv)) { |
6516 | u32 ddcc_status = 0; | 6529 | u32 ddcc_status = 0; |
@@ -6518,33 +6531,34 @@ static void gen6_init_rps_frequencies(struct drm_i915_private *dev_priv) | |||
6518 | if (sandybridge_pcode_read(dev_priv, | 6531 | if (sandybridge_pcode_read(dev_priv, |
6519 | HSW_PCODE_DYNAMIC_DUTY_CYCLE_CONTROL, | 6532 | HSW_PCODE_DYNAMIC_DUTY_CYCLE_CONTROL, |
6520 | &ddcc_status) == 0) | 6533 | &ddcc_status) == 0) |
6521 | dev_priv->rps.efficient_freq = | 6534 | rps->efficient_freq = |
6522 | clamp_t(u8, | 6535 | clamp_t(u8, |
6523 | ((ddcc_status >> 8) & 0xff), | 6536 | ((ddcc_status >> 8) & 0xff), |
6524 | dev_priv->rps.min_freq, | 6537 | rps->min_freq, |
6525 | dev_priv->rps.max_freq); | 6538 | rps->max_freq); |
6526 | } | 6539 | } |
6527 | 6540 | ||
6528 | if (IS_GEN9_BC(dev_priv) || IS_CANNONLAKE(dev_priv)) { | 6541 | if (IS_GEN9_BC(dev_priv) || IS_CANNONLAKE(dev_priv)) { |
6529 | /* Store the frequency values in 16.66 MHZ units, which is | 6542 | /* Store the frequency values in 16.66 MHZ units, which is |
6530 | * the natural hardware unit for SKL | 6543 | * the natural hardware unit for SKL |
6531 | */ | 6544 | */ |
6532 | dev_priv->rps.rp0_freq *= GEN9_FREQ_SCALER; | 6545 | rps->rp0_freq *= GEN9_FREQ_SCALER; |
6533 | dev_priv->rps.rp1_freq *= GEN9_FREQ_SCALER; | 6546 | rps->rp1_freq *= GEN9_FREQ_SCALER; |
6534 | dev_priv->rps.min_freq *= GEN9_FREQ_SCALER; | 6547 | rps->min_freq *= GEN9_FREQ_SCALER; |
6535 | dev_priv->rps.max_freq *= GEN9_FREQ_SCALER; | 6548 | rps->max_freq *= GEN9_FREQ_SCALER; |
6536 | dev_priv->rps.efficient_freq *= GEN9_FREQ_SCALER; | 6549 | rps->efficient_freq *= GEN9_FREQ_SCALER; |
6537 | } | 6550 | } |
6538 | } | 6551 | } |
6539 | 6552 | ||
6540 | static void reset_rps(struct drm_i915_private *dev_priv, | 6553 | static void reset_rps(struct drm_i915_private *dev_priv, |
6541 | int (*set)(struct drm_i915_private *, u8)) | 6554 | int (*set)(struct drm_i915_private *, u8)) |
6542 | { | 6555 | { |
6543 | u8 freq = dev_priv->rps.cur_freq; | 6556 | struct intel_rps *rps = &dev_priv->gt_pm.rps; |
6557 | u8 freq = rps->cur_freq; | ||
6544 | 6558 | ||
6545 | /* force a reset */ | 6559 | /* force a reset */ |
6546 | dev_priv->rps.power = -1; | 6560 | rps->power = -1; |
6547 | dev_priv->rps.cur_freq = -1; | 6561 | rps->cur_freq = -1; |
6548 | 6562 | ||
6549 | if (set(dev_priv, freq)) | 6563 | if (set(dev_priv, freq)) |
6550 | DRM_ERROR("Failed to reset RPS to initial values\n"); | 6564 | DRM_ERROR("Failed to reset RPS to initial values\n"); |
@@ -6557,7 +6571,7 @@ static void gen9_enable_rps(struct drm_i915_private *dev_priv) | |||
6557 | 6571 | ||
6558 | /* Program defaults and thresholds for RPS*/ | 6572 | /* Program defaults and thresholds for RPS*/ |
6559 | I915_WRITE(GEN6_RC_VIDEO_FREQ, | 6573 | I915_WRITE(GEN6_RC_VIDEO_FREQ, |
6560 | GEN9_FREQUENCY(dev_priv->rps.rp1_freq)); | 6574 | GEN9_FREQUENCY(dev_priv->gt_pm.rps.rp1_freq)); |
6561 | 6575 | ||
6562 | /* 1 second timeout*/ | 6576 | /* 1 second timeout*/ |
6563 | I915_WRITE(GEN6_RP_DOWN_TIMEOUT, | 6577 | I915_WRITE(GEN6_RP_DOWN_TIMEOUT, |
@@ -6670,20 +6684,22 @@ static void gen8_enable_rc6(struct drm_i915_private *dev_priv) | |||
6670 | 6684 | ||
6671 | static void gen8_enable_rps(struct drm_i915_private *dev_priv) | 6685 | static void gen8_enable_rps(struct drm_i915_private *dev_priv) |
6672 | { | 6686 | { |
6687 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
6688 | |||
6673 | intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); | 6689 | intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); |
6674 | 6690 | ||
6675 | /* 1 Program defaults and thresholds for RPS*/ | 6691 | /* 1 Program defaults and thresholds for RPS*/ |
6676 | I915_WRITE(GEN6_RPNSWREQ, | 6692 | I915_WRITE(GEN6_RPNSWREQ, |
6677 | HSW_FREQUENCY(dev_priv->rps.rp1_freq)); | 6693 | HSW_FREQUENCY(rps->rp1_freq)); |
6678 | I915_WRITE(GEN6_RC_VIDEO_FREQ, | 6694 | I915_WRITE(GEN6_RC_VIDEO_FREQ, |
6679 | HSW_FREQUENCY(dev_priv->rps.rp1_freq)); | 6695 | HSW_FREQUENCY(rps->rp1_freq)); |
6680 | /* NB: Docs say 1s, and 1000000 - which aren't equivalent */ | 6696 | /* NB: Docs say 1s, and 1000000 - which aren't equivalent */ |
6681 | I915_WRITE(GEN6_RP_DOWN_TIMEOUT, 100000000 / 128); /* 1 second timeout */ | 6697 | I915_WRITE(GEN6_RP_DOWN_TIMEOUT, 100000000 / 128); /* 1 second timeout */ |
6682 | 6698 | ||
6683 | /* Docs recommend 900MHz, and 300 MHz respectively */ | 6699 | /* Docs recommend 900MHz, and 300 MHz respectively */ |
6684 | I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, | 6700 | I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, |
6685 | dev_priv->rps.max_freq_softlimit << 24 | | 6701 | rps->max_freq_softlimit << 24 | |
6686 | dev_priv->rps.min_freq_softlimit << 16); | 6702 | rps->min_freq_softlimit << 16); |
6687 | 6703 | ||
6688 | I915_WRITE(GEN6_RP_UP_THRESHOLD, 7600000 / 128); /* 76ms busyness per EI, 90% */ | 6704 | I915_WRITE(GEN6_RP_UP_THRESHOLD, 7600000 / 128); /* 76ms busyness per EI, 90% */ |
6689 | I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 31300000 / 128); /* 313ms busyness per EI, 70%*/ | 6705 | I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 31300000 / 128); /* 313ms busyness per EI, 70%*/ |
@@ -6810,6 +6826,7 @@ static void gen6_enable_rps(struct drm_i915_private *dev_priv) | |||
6810 | 6826 | ||
6811 | static void gen6_update_ring_freq(struct drm_i915_private *dev_priv) | 6827 | static void gen6_update_ring_freq(struct drm_i915_private *dev_priv) |
6812 | { | 6828 | { |
6829 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
6813 | int min_freq = 15; | 6830 | int min_freq = 15; |
6814 | unsigned int gpu_freq; | 6831 | unsigned int gpu_freq; |
6815 | unsigned int max_ia_freq, min_ring_freq; | 6832 | unsigned int max_ia_freq, min_ring_freq; |
@@ -6840,11 +6857,11 @@ static void gen6_update_ring_freq(struct drm_i915_private *dev_priv) | |||
6840 | 6857 | ||
6841 | if (IS_GEN9_BC(dev_priv) || IS_CANNONLAKE(dev_priv)) { | 6858 | if (IS_GEN9_BC(dev_priv) || IS_CANNONLAKE(dev_priv)) { |
6842 | /* Convert GT frequency to 50 HZ units */ | 6859 | /* Convert GT frequency to 50 HZ units */ |
6843 | min_gpu_freq = dev_priv->rps.min_freq / GEN9_FREQ_SCALER; | 6860 | min_gpu_freq = rps->min_freq / GEN9_FREQ_SCALER; |
6844 | max_gpu_freq = dev_priv->rps.max_freq / GEN9_FREQ_SCALER; | 6861 | max_gpu_freq = rps->max_freq / GEN9_FREQ_SCALER; |
6845 | } else { | 6862 | } else { |
6846 | min_gpu_freq = dev_priv->rps.min_freq; | 6863 | min_gpu_freq = rps->min_freq; |
6847 | max_gpu_freq = dev_priv->rps.max_freq; | 6864 | max_gpu_freq = rps->max_freq; |
6848 | } | 6865 | } |
6849 | 6866 | ||
6850 | /* | 6867 | /* |
@@ -7095,17 +7112,18 @@ static void valleyview_cleanup_pctx(struct drm_i915_private *dev_priv) | |||
7095 | 7112 | ||
7096 | static void vlv_init_gpll_ref_freq(struct drm_i915_private *dev_priv) | 7113 | static void vlv_init_gpll_ref_freq(struct drm_i915_private *dev_priv) |
7097 | { | 7114 | { |
7098 | dev_priv->rps.gpll_ref_freq = | 7115 | dev_priv->gt_pm.rps.gpll_ref_freq = |
7099 | vlv_get_cck_clock(dev_priv, "GPLL ref", | 7116 | vlv_get_cck_clock(dev_priv, "GPLL ref", |
7100 | CCK_GPLL_CLOCK_CONTROL, | 7117 | CCK_GPLL_CLOCK_CONTROL, |
7101 | dev_priv->czclk_freq); | 7118 | dev_priv->czclk_freq); |
7102 | 7119 | ||
7103 | DRM_DEBUG_DRIVER("GPLL reference freq: %d kHz\n", | 7120 | DRM_DEBUG_DRIVER("GPLL reference freq: %d kHz\n", |
7104 | dev_priv->rps.gpll_ref_freq); | 7121 | dev_priv->gt_pm.rps.gpll_ref_freq); |
7105 | } | 7122 | } |
7106 | 7123 | ||
7107 | static void valleyview_init_gt_powersave(struct drm_i915_private *dev_priv) | 7124 | static void valleyview_init_gt_powersave(struct drm_i915_private *dev_priv) |
7108 | { | 7125 | { |
7126 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
7109 | u32 val; | 7127 | u32 val; |
7110 | 7128 | ||
7111 | valleyview_setup_pctx(dev_priv); | 7129 | valleyview_setup_pctx(dev_priv); |
@@ -7127,30 +7145,31 @@ static void valleyview_init_gt_powersave(struct drm_i915_private *dev_priv) | |||
7127 | } | 7145 | } |
7128 | DRM_DEBUG_DRIVER("DDR speed: %d MHz\n", dev_priv->mem_freq); | 7146 | DRM_DEBUG_DRIVER("DDR speed: %d MHz\n", dev_priv->mem_freq); |
7129 | 7147 | ||
7130 | dev_priv->rps.max_freq = valleyview_rps_max_freq(dev_priv); | 7148 | rps->max_freq = valleyview_rps_max_freq(dev_priv); |
7131 | dev_priv->rps.rp0_freq = dev_priv->rps.max_freq; | 7149 | rps->rp0_freq = rps->max_freq; |
7132 | DRM_DEBUG_DRIVER("max GPU freq: %d MHz (%u)\n", | 7150 | DRM_DEBUG_DRIVER("max GPU freq: %d MHz (%u)\n", |
7133 | intel_gpu_freq(dev_priv, dev_priv->rps.max_freq), | 7151 | intel_gpu_freq(dev_priv, rps->max_freq), |
7134 | dev_priv->rps.max_freq); | 7152 | rps->max_freq); |
7135 | 7153 | ||
7136 | dev_priv->rps.efficient_freq = valleyview_rps_rpe_freq(dev_priv); | 7154 | rps->efficient_freq = valleyview_rps_rpe_freq(dev_priv); |
7137 | DRM_DEBUG_DRIVER("RPe GPU freq: %d MHz (%u)\n", | 7155 | DRM_DEBUG_DRIVER("RPe GPU freq: %d MHz (%u)\n", |
7138 | intel_gpu_freq(dev_priv, dev_priv->rps.efficient_freq), | 7156 | intel_gpu_freq(dev_priv, rps->efficient_freq), |
7139 | dev_priv->rps.efficient_freq); | 7157 | rps->efficient_freq); |
7140 | 7158 | ||
7141 | dev_priv->rps.rp1_freq = valleyview_rps_guar_freq(dev_priv); | 7159 | rps->rp1_freq = valleyview_rps_guar_freq(dev_priv); |
7142 | DRM_DEBUG_DRIVER("RP1(Guar Freq) GPU freq: %d MHz (%u)\n", | 7160 | DRM_DEBUG_DRIVER("RP1(Guar Freq) GPU freq: %d MHz (%u)\n", |
7143 | intel_gpu_freq(dev_priv, dev_priv->rps.rp1_freq), | 7161 | intel_gpu_freq(dev_priv, rps->rp1_freq), |
7144 | dev_priv->rps.rp1_freq); | 7162 | rps->rp1_freq); |
7145 | 7163 | ||
7146 | dev_priv->rps.min_freq = valleyview_rps_min_freq(dev_priv); | 7164 | rps->min_freq = valleyview_rps_min_freq(dev_priv); |
7147 | DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n", | 7165 | DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n", |
7148 | intel_gpu_freq(dev_priv, dev_priv->rps.min_freq), | 7166 | intel_gpu_freq(dev_priv, rps->min_freq), |
7149 | dev_priv->rps.min_freq); | 7167 | rps->min_freq); |
7150 | } | 7168 | } |
7151 | 7169 | ||
7152 | static void cherryview_init_gt_powersave(struct drm_i915_private *dev_priv) | 7170 | static void cherryview_init_gt_powersave(struct drm_i915_private *dev_priv) |
7153 | { | 7171 | { |
7172 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
7154 | u32 val; | 7173 | u32 val; |
7155 | 7174 | ||
7156 | cherryview_setup_pctx(dev_priv); | 7175 | cherryview_setup_pctx(dev_priv); |
@@ -7171,31 +7190,29 @@ static void cherryview_init_gt_powersave(struct drm_i915_private *dev_priv) | |||
7171 | } | 7190 | } |
7172 | DRM_DEBUG_DRIVER("DDR speed: %d MHz\n", dev_priv->mem_freq); | 7191 | DRM_DEBUG_DRIVER("DDR speed: %d MHz\n", dev_priv->mem_freq); |
7173 | 7192 | ||
7174 | dev_priv->rps.max_freq = cherryview_rps_max_freq(dev_priv); | 7193 | rps->max_freq = cherryview_rps_max_freq(dev_priv); |
7175 | dev_priv->rps.rp0_freq = dev_priv->rps.max_freq; | 7194 | rps->rp0_freq = rps->max_freq; |
7176 | DRM_DEBUG_DRIVER("max GPU freq: %d MHz (%u)\n", | 7195 | DRM_DEBUG_DRIVER("max GPU freq: %d MHz (%u)\n", |
7177 | intel_gpu_freq(dev_priv, dev_priv->rps.max_freq), | 7196 | intel_gpu_freq(dev_priv, rps->max_freq), |
7178 | dev_priv->rps.max_freq); | 7197 | rps->max_freq); |
7179 | 7198 | ||
7180 | dev_priv->rps.efficient_freq = cherryview_rps_rpe_freq(dev_priv); | 7199 | rps->efficient_freq = cherryview_rps_rpe_freq(dev_priv); |
7181 | DRM_DEBUG_DRIVER("RPe GPU freq: %d MHz (%u)\n", | 7200 | DRM_DEBUG_DRIVER("RPe GPU freq: %d MHz (%u)\n", |
7182 | intel_gpu_freq(dev_priv, dev_priv->rps.efficient_freq), | 7201 | intel_gpu_freq(dev_priv, rps->efficient_freq), |
7183 | dev_priv->rps.efficient_freq); | 7202 | rps->efficient_freq); |
7184 | 7203 | ||
7185 | dev_priv->rps.rp1_freq = cherryview_rps_guar_freq(dev_priv); | 7204 | rps->rp1_freq = cherryview_rps_guar_freq(dev_priv); |
7186 | DRM_DEBUG_DRIVER("RP1(Guar) GPU freq: %d MHz (%u)\n", | 7205 | DRM_DEBUG_DRIVER("RP1(Guar) GPU freq: %d MHz (%u)\n", |
7187 | intel_gpu_freq(dev_priv, dev_priv->rps.rp1_freq), | 7206 | intel_gpu_freq(dev_priv, rps->rp1_freq), |
7188 | dev_priv->rps.rp1_freq); | 7207 | rps->rp1_freq); |
7189 | 7208 | ||
7190 | dev_priv->rps.min_freq = cherryview_rps_min_freq(dev_priv); | 7209 | rps->min_freq = cherryview_rps_min_freq(dev_priv); |
7191 | DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n", | 7210 | DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n", |
7192 | intel_gpu_freq(dev_priv, dev_priv->rps.min_freq), | 7211 | intel_gpu_freq(dev_priv, rps->min_freq), |
7193 | dev_priv->rps.min_freq); | 7212 | rps->min_freq); |
7194 | 7213 | ||
7195 | WARN_ONCE((dev_priv->rps.max_freq | | 7214 | WARN_ONCE((rps->max_freq | rps->efficient_freq | rps->rp1_freq | |
7196 | dev_priv->rps.efficient_freq | | 7215 | rps->min_freq) & 1, |
7197 | dev_priv->rps.rp1_freq | | ||
7198 | dev_priv->rps.min_freq) & 1, | ||
7199 | "Odd GPU freq values\n"); | 7216 | "Odd GPU freq values\n"); |
7200 | } | 7217 | } |
7201 | 7218 | ||
@@ -7584,7 +7601,7 @@ static unsigned long __i915_gfx_val(struct drm_i915_private *dev_priv) | |||
7584 | 7601 | ||
7585 | lockdep_assert_held(&mchdev_lock); | 7602 | lockdep_assert_held(&mchdev_lock); |
7586 | 7603 | ||
7587 | pxvid = I915_READ(PXVFREQ(dev_priv->rps.cur_freq)); | 7604 | pxvid = I915_READ(PXVFREQ(dev_priv->gt_pm.rps.cur_freq)); |
7588 | pxvid = (pxvid >> 24) & 0x7f; | 7605 | pxvid = (pxvid >> 24) & 0x7f; |
7589 | ext_v = pvid_to_extvid(dev_priv, pxvid); | 7606 | ext_v = pvid_to_extvid(dev_priv, pxvid); |
7590 | 7607 | ||
@@ -7871,6 +7888,8 @@ static void intel_init_emon(struct drm_i915_private *dev_priv) | |||
7871 | 7888 | ||
7872 | void intel_init_gt_powersave(struct drm_i915_private *dev_priv) | 7889 | void intel_init_gt_powersave(struct drm_i915_private *dev_priv) |
7873 | { | 7890 | { |
7891 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
7892 | |||
7874 | /* | 7893 | /* |
7875 | * RPM depends on RC6 to save restore the GT HW context, so make RC6 a | 7894 | * RPM depends on RC6 to save restore the GT HW context, so make RC6 a |
7876 | * requirement. | 7895 | * requirement. |
@@ -7892,16 +7911,16 @@ void intel_init_gt_powersave(struct drm_i915_private *dev_priv) | |||
7892 | gen6_init_rps_frequencies(dev_priv); | 7911 | gen6_init_rps_frequencies(dev_priv); |
7893 | 7912 | ||
7894 | /* Derive initial user preferences/limits from the hardware limits */ | 7913 | /* Derive initial user preferences/limits from the hardware limits */ |
7895 | dev_priv->rps.idle_freq = dev_priv->rps.min_freq; | 7914 | rps->idle_freq = rps->min_freq; |
7896 | dev_priv->rps.cur_freq = dev_priv->rps.idle_freq; | 7915 | rps->cur_freq = rps->idle_freq; |
7897 | 7916 | ||
7898 | dev_priv->rps.max_freq_softlimit = dev_priv->rps.max_freq; | 7917 | rps->max_freq_softlimit = rps->max_freq; |
7899 | dev_priv->rps.min_freq_softlimit = dev_priv->rps.min_freq; | 7918 | rps->min_freq_softlimit = rps->min_freq; |
7900 | 7919 | ||
7901 | if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) | 7920 | if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) |
7902 | dev_priv->rps.min_freq_softlimit = | 7921 | rps->min_freq_softlimit = |
7903 | max_t(int, | 7922 | max_t(int, |
7904 | dev_priv->rps.efficient_freq, | 7923 | rps->efficient_freq, |
7905 | intel_freq_opcode(dev_priv, 450)); | 7924 | intel_freq_opcode(dev_priv, 450)); |
7906 | 7925 | ||
7907 | /* After setting max-softlimit, find the overclock max freq */ | 7926 | /* After setting max-softlimit, find the overclock max freq */ |
@@ -7912,14 +7931,14 @@ void intel_init_gt_powersave(struct drm_i915_private *dev_priv) | |||
7912 | sandybridge_pcode_read(dev_priv, GEN6_READ_OC_PARAMS, ¶ms); | 7931 | sandybridge_pcode_read(dev_priv, GEN6_READ_OC_PARAMS, ¶ms); |
7913 | if (params & BIT(31)) { /* OC supported */ | 7932 | if (params & BIT(31)) { /* OC supported */ |
7914 | DRM_DEBUG_DRIVER("Overclocking supported, max: %dMHz, overclock: %dMHz\n", | 7933 | DRM_DEBUG_DRIVER("Overclocking supported, max: %dMHz, overclock: %dMHz\n", |
7915 | (dev_priv->rps.max_freq & 0xff) * 50, | 7934 | (rps->max_freq & 0xff) * 50, |
7916 | (params & 0xff) * 50); | 7935 | (params & 0xff) * 50); |
7917 | dev_priv->rps.max_freq = params & 0xff; | 7936 | rps->max_freq = params & 0xff; |
7918 | } | 7937 | } |
7919 | } | 7938 | } |
7920 | 7939 | ||
7921 | /* Finally allow us to boost to max by default */ | 7940 | /* Finally allow us to boost to max by default */ |
7922 | dev_priv->rps.boost_freq = dev_priv->rps.max_freq; | 7941 | rps->boost_freq = rps->max_freq; |
7923 | 7942 | ||
7924 | mutex_unlock(&dev_priv->pcu_lock); | 7943 | mutex_unlock(&dev_priv->pcu_lock); |
7925 | mutex_unlock(&dev_priv->drm.struct_mutex); | 7944 | mutex_unlock(&dev_priv->drm.struct_mutex); |
@@ -7949,7 +7968,7 @@ void intel_suspend_gt_powersave(struct drm_i915_private *dev_priv) | |||
7949 | if (INTEL_GEN(dev_priv) < 6) | 7968 | if (INTEL_GEN(dev_priv) < 6) |
7950 | return; | 7969 | return; |
7951 | 7970 | ||
7952 | if (cancel_delayed_work_sync(&dev_priv->rps.autoenable_work)) | 7971 | if (cancel_delayed_work_sync(&dev_priv->gt_pm.autoenable_work)) |
7953 | intel_runtime_pm_put(dev_priv); | 7972 | intel_runtime_pm_put(dev_priv); |
7954 | 7973 | ||
7955 | /* gen6_rps_idle() will be called later to disable interrupts */ | 7974 | /* gen6_rps_idle() will be called later to disable interrupts */ |
@@ -7957,7 +7976,7 @@ void intel_suspend_gt_powersave(struct drm_i915_private *dev_priv) | |||
7957 | 7976 | ||
7958 | void intel_sanitize_gt_powersave(struct drm_i915_private *dev_priv) | 7977 | void intel_sanitize_gt_powersave(struct drm_i915_private *dev_priv) |
7959 | { | 7978 | { |
7960 | dev_priv->rps.enabled = true; /* force disabling */ | 7979 | dev_priv->gt_pm.rps.enabled = true; /* force disabling */ |
7961 | intel_disable_gt_powersave(dev_priv); | 7980 | intel_disable_gt_powersave(dev_priv); |
7962 | 7981 | ||
7963 | gen6_reset_rps_interrupts(dev_priv); | 7982 | gen6_reset_rps_interrupts(dev_priv); |
@@ -7965,7 +7984,9 @@ void intel_sanitize_gt_powersave(struct drm_i915_private *dev_priv) | |||
7965 | 7984 | ||
7966 | void intel_disable_gt_powersave(struct drm_i915_private *dev_priv) | 7985 | void intel_disable_gt_powersave(struct drm_i915_private *dev_priv) |
7967 | { | 7986 | { |
7968 | if (!READ_ONCE(dev_priv->rps.enabled)) | 7987 | struct intel_rps *rps = &dev_priv->gt_pm.rps; |
7988 | |||
7989 | if (!READ_ONCE(rps->enabled)) | ||
7969 | return; | 7990 | return; |
7970 | 7991 | ||
7971 | mutex_lock(&dev_priv->pcu_lock); | 7992 | mutex_lock(&dev_priv->pcu_lock); |
@@ -7986,16 +8007,18 @@ void intel_disable_gt_powersave(struct drm_i915_private *dev_priv) | |||
7986 | ironlake_disable_drps(dev_priv); | 8007 | ironlake_disable_drps(dev_priv); |
7987 | } | 8008 | } |
7988 | 8009 | ||
7989 | dev_priv->rps.enabled = false; | 8010 | rps->enabled = false; |
7990 | mutex_unlock(&dev_priv->pcu_lock); | 8011 | mutex_unlock(&dev_priv->pcu_lock); |
7991 | } | 8012 | } |
7992 | 8013 | ||
7993 | void intel_enable_gt_powersave(struct drm_i915_private *dev_priv) | 8014 | void intel_enable_gt_powersave(struct drm_i915_private *dev_priv) |
7994 | { | 8015 | { |
8016 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
8017 | |||
7995 | /* We shouldn't be disabling as we submit, so this should be less | 8018 | /* We shouldn't be disabling as we submit, so this should be less |
7996 | * racy than it appears! | 8019 | * racy than it appears! |
7997 | */ | 8020 | */ |
7998 | if (READ_ONCE(dev_priv->rps.enabled)) | 8021 | if (READ_ONCE(rps->enabled)) |
7999 | return; | 8022 | return; |
8000 | 8023 | ||
8001 | /* Powersaving is controlled by the host when inside a VM */ | 8024 | /* Powersaving is controlled by the host when inside a VM */ |
@@ -8028,24 +8051,26 @@ void intel_enable_gt_powersave(struct drm_i915_private *dev_priv) | |||
8028 | intel_init_emon(dev_priv); | 8051 | intel_init_emon(dev_priv); |
8029 | } | 8052 | } |
8030 | 8053 | ||
8031 | WARN_ON(dev_priv->rps.max_freq < dev_priv->rps.min_freq); | 8054 | WARN_ON(rps->max_freq < rps->min_freq); |
8032 | WARN_ON(dev_priv->rps.idle_freq > dev_priv->rps.max_freq); | 8055 | WARN_ON(rps->idle_freq > rps->max_freq); |
8033 | 8056 | ||
8034 | WARN_ON(dev_priv->rps.efficient_freq < dev_priv->rps.min_freq); | 8057 | WARN_ON(rps->efficient_freq < rps->min_freq); |
8035 | WARN_ON(dev_priv->rps.efficient_freq > dev_priv->rps.max_freq); | 8058 | WARN_ON(rps->efficient_freq > rps->max_freq); |
8036 | 8059 | ||
8037 | dev_priv->rps.enabled = true; | 8060 | rps->enabled = true; |
8038 | mutex_unlock(&dev_priv->pcu_lock); | 8061 | mutex_unlock(&dev_priv->pcu_lock); |
8039 | } | 8062 | } |
8040 | 8063 | ||
8041 | static void __intel_autoenable_gt_powersave(struct work_struct *work) | 8064 | static void __intel_autoenable_gt_powersave(struct work_struct *work) |
8042 | { | 8065 | { |
8043 | struct drm_i915_private *dev_priv = | 8066 | struct drm_i915_private *dev_priv = |
8044 | container_of(work, typeof(*dev_priv), rps.autoenable_work.work); | 8067 | container_of(work, |
8068 | typeof(*dev_priv), | ||
8069 | gt_pm.autoenable_work.work); | ||
8045 | struct intel_engine_cs *rcs; | 8070 | struct intel_engine_cs *rcs; |
8046 | struct drm_i915_gem_request *req; | 8071 | struct drm_i915_gem_request *req; |
8047 | 8072 | ||
8048 | if (READ_ONCE(dev_priv->rps.enabled)) | 8073 | if (READ_ONCE(dev_priv->gt_pm.rps.enabled)) |
8049 | goto out; | 8074 | goto out; |
8050 | 8075 | ||
8051 | rcs = dev_priv->engine[RCS]; | 8076 | rcs = dev_priv->engine[RCS]; |
@@ -8075,7 +8100,7 @@ out: | |||
8075 | 8100 | ||
8076 | void intel_autoenable_gt_powersave(struct drm_i915_private *dev_priv) | 8101 | void intel_autoenable_gt_powersave(struct drm_i915_private *dev_priv) |
8077 | { | 8102 | { |
8078 | if (READ_ONCE(dev_priv->rps.enabled)) | 8103 | if (READ_ONCE(dev_priv->gt_pm.rps.enabled)) |
8079 | return; | 8104 | return; |
8080 | 8105 | ||
8081 | if (IS_IRONLAKE_M(dev_priv)) { | 8106 | if (IS_IRONLAKE_M(dev_priv)) { |
@@ -8095,7 +8120,7 @@ void intel_autoenable_gt_powersave(struct drm_i915_private *dev_priv) | |||
8095 | * runtime resume it's necessary). | 8120 | * runtime resume it's necessary). |
8096 | */ | 8121 | */ |
8097 | if (queue_delayed_work(dev_priv->wq, | 8122 | if (queue_delayed_work(dev_priv->wq, |
8098 | &dev_priv->rps.autoenable_work, | 8123 | &dev_priv->gt_pm.autoenable_work, |
8099 | round_jiffies_up_relative(HZ))) | 8124 | round_jiffies_up_relative(HZ))) |
8100 | intel_runtime_pm_get_noresume(dev_priv); | 8125 | intel_runtime_pm_get_noresume(dev_priv); |
8101 | } | 8126 | } |
@@ -9289,31 +9314,39 @@ out: | |||
9289 | 9314 | ||
9290 | static int byt_gpu_freq(struct drm_i915_private *dev_priv, int val) | 9315 | static int byt_gpu_freq(struct drm_i915_private *dev_priv, int val) |
9291 | { | 9316 | { |
9317 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
9318 | |||
9292 | /* | 9319 | /* |
9293 | * N = val - 0xb7 | 9320 | * N = val - 0xb7 |
9294 | * Slow = Fast = GPLL ref * N | 9321 | * Slow = Fast = GPLL ref * N |
9295 | */ | 9322 | */ |
9296 | return DIV_ROUND_CLOSEST(dev_priv->rps.gpll_ref_freq * (val - 0xb7), 1000); | 9323 | return DIV_ROUND_CLOSEST(rps->gpll_ref_freq * (val - 0xb7), 1000); |
9297 | } | 9324 | } |
9298 | 9325 | ||
9299 | static int byt_freq_opcode(struct drm_i915_private *dev_priv, int val) | 9326 | static int byt_freq_opcode(struct drm_i915_private *dev_priv, int val) |
9300 | { | 9327 | { |
9301 | return DIV_ROUND_CLOSEST(1000 * val, dev_priv->rps.gpll_ref_freq) + 0xb7; | 9328 | struct intel_rps *rps = &dev_priv->gt_pm.rps; |
9329 | |||
9330 | return DIV_ROUND_CLOSEST(1000 * val, rps->gpll_ref_freq) + 0xb7; | ||
9302 | } | 9331 | } |
9303 | 9332 | ||
9304 | static int chv_gpu_freq(struct drm_i915_private *dev_priv, int val) | 9333 | static int chv_gpu_freq(struct drm_i915_private *dev_priv, int val) |
9305 | { | 9334 | { |
9335 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
9336 | |||
9306 | /* | 9337 | /* |
9307 | * N = val / 2 | 9338 | * N = val / 2 |
9308 | * CU (slow) = CU2x (fast) / 2 = GPLL ref * N / 2 | 9339 | * CU (slow) = CU2x (fast) / 2 = GPLL ref * N / 2 |
9309 | */ | 9340 | */ |
9310 | return DIV_ROUND_CLOSEST(dev_priv->rps.gpll_ref_freq * val, 2 * 2 * 1000); | 9341 | return DIV_ROUND_CLOSEST(rps->gpll_ref_freq * val, 2 * 2 * 1000); |
9311 | } | 9342 | } |
9312 | 9343 | ||
9313 | static int chv_freq_opcode(struct drm_i915_private *dev_priv, int val) | 9344 | static int chv_freq_opcode(struct drm_i915_private *dev_priv, int val) |
9314 | { | 9345 | { |
9346 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | ||
9347 | |||
9315 | /* CHV needs even values */ | 9348 | /* CHV needs even values */ |
9316 | return DIV_ROUND_CLOSEST(2 * 1000 * val, dev_priv->rps.gpll_ref_freq) * 2; | 9349 | return DIV_ROUND_CLOSEST(2 * 1000 * val, rps->gpll_ref_freq) * 2; |
9317 | } | 9350 | } |
9318 | 9351 | ||
9319 | int intel_gpu_freq(struct drm_i915_private *dev_priv, int val) | 9352 | int intel_gpu_freq(struct drm_i915_private *dev_priv, int val) |
@@ -9346,9 +9379,9 @@ void intel_pm_setup(struct drm_i915_private *dev_priv) | |||
9346 | { | 9379 | { |
9347 | mutex_init(&dev_priv->pcu_lock); | 9380 | mutex_init(&dev_priv->pcu_lock); |
9348 | 9381 | ||
9349 | INIT_DELAYED_WORK(&dev_priv->rps.autoenable_work, | 9382 | INIT_DELAYED_WORK(&dev_priv->gt_pm.autoenable_work, |
9350 | __intel_autoenable_gt_powersave); | 9383 | __intel_autoenable_gt_powersave); |
9351 | atomic_set(&dev_priv->rps.num_waiters, 0); | 9384 | atomic_set(&dev_priv->gt_pm.rps.num_waiters, 0); |
9352 | 9385 | ||
9353 | dev_priv->runtime_pm.suspended = false; | 9386 | dev_priv->runtime_pm.suspended = false; |
9354 | atomic_set(&dev_priv->runtime_pm.wakeref_count, 0); | 9387 | atomic_set(&dev_priv->runtime_pm.wakeref_count, 0); |