|
@@ -3242,6 +3242,27 @@ static void gen6_enable_rps_interrupts(struct drm_device *dev)
|
|
|
spin_unlock_irq(&dev_priv->irq_lock);
|
|
|
}
|
|
|
|
|
|
+static void parse_rp_state_cap(struct drm_i915_private *dev_priv, u32 rp_state_cap)
|
|
|
+{
|
|
|
+ /* All of these values are in units of 50MHz */
|
|
|
+ dev_priv->rps.cur_freq = 0;
|
|
|
+ /* static values from HW: RP0 < RPe < RP1 < RPn (min_freq) */
|
|
|
+ dev_priv->rps.rp1_freq = (rp_state_cap >> 8) & 0xff;
|
|
|
+ dev_priv->rps.rp0_freq = (rp_state_cap >> 0) & 0xff;
|
|
|
+ dev_priv->rps.min_freq = (rp_state_cap >> 16) & 0xff;
|
|
|
+ /* XXX: only BYT has a special efficient freq */
|
|
|
+ dev_priv->rps.efficient_freq = dev_priv->rps.rp1_freq;
|
|
|
+ /* hw_max = RP0 until we check for overclocking */
|
|
|
+ dev_priv->rps.max_freq = dev_priv->rps.rp0_freq;
|
|
|
+
|
|
|
+ /* Preserve min/max settings in case of re-init */
|
|
|
+ if (dev_priv->rps.max_freq_softlimit == 0)
|
|
|
+ dev_priv->rps.max_freq_softlimit = dev_priv->rps.max_freq;
|
|
|
+
|
|
|
+ if (dev_priv->rps.min_freq_softlimit == 0)
|
|
|
+ dev_priv->rps.min_freq_softlimit = dev_priv->rps.min_freq;
|
|
|
+}
|
|
|
+
|
|
|
static void gen8_enable_rps(struct drm_device *dev)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
@@ -3260,6 +3281,7 @@ static void gen8_enable_rps(struct drm_device *dev)
|
|
|
I915_WRITE(GEN6_RC_CONTROL, 0);
|
|
|
|
|
|
rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
|
|
|
+ parse_rp_state_cap(dev_priv, rp_state_cap);
|
|
|
|
|
|
/* 2b: Program RC6 thresholds.*/
|
|
|
I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 40 << 16);
|
|
@@ -3348,23 +3370,7 @@ static void gen6_enable_rps(struct drm_device *dev)
|
|
|
rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
|
|
|
gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS);
|
|
|
|
|
|
- /* All of these values are in units of 50MHz */
|
|
|
- dev_priv->rps.cur_freq = 0;
|
|
|
- /* static values from HW: RP0 < RPe < RP1 < RPn (min_freq) */
|
|
|
- dev_priv->rps.rp1_freq = (rp_state_cap >> 8) & 0xff;
|
|
|
- dev_priv->rps.rp0_freq = (rp_state_cap >> 0) & 0xff;
|
|
|
- dev_priv->rps.min_freq = (rp_state_cap >> 16) & 0xff;
|
|
|
- /* XXX: only BYT has a special efficient freq */
|
|
|
- dev_priv->rps.efficient_freq = dev_priv->rps.rp1_freq;
|
|
|
- /* hw_max = RP0 until we check for overclocking */
|
|
|
- dev_priv->rps.max_freq = dev_priv->rps.rp0_freq;
|
|
|
-
|
|
|
- /* Preserve min/max settings in case of re-init */
|
|
|
- if (dev_priv->rps.max_freq_softlimit == 0)
|
|
|
- dev_priv->rps.max_freq_softlimit = dev_priv->rps.max_freq;
|
|
|
-
|
|
|
- if (dev_priv->rps.min_freq_softlimit == 0)
|
|
|
- dev_priv->rps.min_freq_softlimit = dev_priv->rps.min_freq;
|
|
|
+ parse_rp_state_cap(dev_priv, rp_state_cap);
|
|
|
|
|
|
/* disable the counters and set deterministic thresholds */
|
|
|
I915_WRITE(GEN6_RC_CONTROL, 0);
|