aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorImre Deak <imre.deak@intel.com>2014-11-05 13:48:31 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-11-14 04:29:15 -0500
commita72fbc3a14f071d75bccb07ab5148d44f0af77eb (patch)
tree8eb63111cb569853b91723fe67df9ee8ad3a5c6b
parent952890098a14043fe7acc5f595c6306c69baf40d (diff)
drm/i915: unify gen6/gen8 pm irq helpers
The helpers to enable/disable PM IRQs for GEN6 and GEN8 are the same except for the PM interrupt mask register, so abstract away this register in the GEN6 versions and use these everywhere. No functional change. Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c59
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c2
3 files changed, 11 insertions, 52 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 5fff2870a17b..cf991bdebf54 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -200,6 +200,11 @@ void gen5_disable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask)
200 ilk_update_gt_irq(dev_priv, mask, 0); 200 ilk_update_gt_irq(dev_priv, mask, 0);
201} 201}
202 202
203static u32 gen6_pm_imr(struct drm_i915_private *dev_priv)
204{
205 return INTEL_INFO(dev_priv)->gen >= 8 ? GEN8_GT_IMR(2) : GEN6_PMIMR;
206}
207
203/** 208/**
204 * snb_update_pm_irq - update GEN6_PMIMR 209 * snb_update_pm_irq - update GEN6_PMIMR
205 * @dev_priv: driver private 210 * @dev_priv: driver private
@@ -223,8 +228,8 @@ static void snb_update_pm_irq(struct drm_i915_private *dev_priv,
223 228
224 if (new_val != dev_priv->pm_irq_mask) { 229 if (new_val != dev_priv->pm_irq_mask) {
225 dev_priv->pm_irq_mask = new_val; 230 dev_priv->pm_irq_mask = new_val;
226 I915_WRITE(GEN6_PMIMR, dev_priv->pm_irq_mask); 231 I915_WRITE(gen6_pm_imr(dev_priv), dev_priv->pm_irq_mask);
227 POSTING_READ(GEN6_PMIMR); 232 POSTING_READ(gen6_pm_imr(dev_priv));
228 } 233 }
229} 234}
230 235
@@ -239,46 +244,6 @@ void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
239} 244}
240 245
241/** 246/**
242 * bdw_update_pm_irq - update GT interrupt 2
243 * @dev_priv: driver private
244 * @interrupt_mask: mask of interrupt bits to update
245 * @enabled_irq_mask: mask of interrupt bits to enable
246 *
247 * Copied from the snb function, updated with relevant register offsets
248 */
249static void bdw_update_pm_irq(struct drm_i915_private *dev_priv,
250 uint32_t interrupt_mask,
251 uint32_t enabled_irq_mask)
252{
253 uint32_t new_val;
254
255 assert_spin_locked(&dev_priv->irq_lock);
256
257 if (WARN_ON(!intel_irqs_enabled(dev_priv)))
258 return;
259
260 new_val = dev_priv->pm_irq_mask;
261 new_val &= ~interrupt_mask;
262 new_val |= (~enabled_irq_mask & interrupt_mask);
263
264 if (new_val != dev_priv->pm_irq_mask) {
265 dev_priv->pm_irq_mask = new_val;
266 I915_WRITE(GEN8_GT_IMR(2), dev_priv->pm_irq_mask);
267 POSTING_READ(GEN8_GT_IMR(2));
268 }
269}
270
271void gen8_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
272{
273 bdw_update_pm_irq(dev_priv, mask, mask);
274}
275
276void gen8_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
277{
278 bdw_update_pm_irq(dev_priv, mask, 0);
279}
280
281/**
282 * ibx_display_interrupt_update - update SDEIMR 247 * ibx_display_interrupt_update - update SDEIMR
283 * @dev_priv: driver private 248 * @dev_priv: driver private
284 * @interrupt_mask: mask of interrupt bits to update 249 * @interrupt_mask: mask of interrupt bits to update
@@ -1118,12 +1083,8 @@ static void gen6_pm_rps_work(struct work_struct *work)
1118 spin_lock_irq(&dev_priv->irq_lock); 1083 spin_lock_irq(&dev_priv->irq_lock);
1119 pm_iir = dev_priv->rps.pm_iir; 1084 pm_iir = dev_priv->rps.pm_iir;
1120 dev_priv->rps.pm_iir = 0; 1085 dev_priv->rps.pm_iir = 0;
1121 if (INTEL_INFO(dev_priv->dev)->gen >= 8) 1086 /* Make sure not to corrupt PMIMR state used by ringbuffer on GEN6 */
1122 gen8_enable_pm_irq(dev_priv, dev_priv->pm_rps_events); 1087 gen6_enable_pm_irq(dev_priv, dev_priv->pm_rps_events);
1123 else {
1124 /* Make sure not to corrupt PMIMR state used by ringbuffer */
1125 gen6_enable_pm_irq(dev_priv, dev_priv->pm_rps_events);
1126 }
1127 spin_unlock_irq(&dev_priv->irq_lock); 1088 spin_unlock_irq(&dev_priv->irq_lock);
1128 1089
1129 /* Make sure we didn't queue anything we're not going to process. */ 1090 /* Make sure we didn't queue anything we're not going to process. */
@@ -1332,7 +1293,7 @@ static void gen8_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir)
1332 1293
1333 spin_lock(&dev_priv->irq_lock); 1294 spin_lock(&dev_priv->irq_lock);
1334 dev_priv->rps.pm_iir |= pm_iir & dev_priv->pm_rps_events; 1295 dev_priv->rps.pm_iir |= pm_iir & dev_priv->pm_rps_events;
1335 gen8_disable_pm_irq(dev_priv, pm_iir & dev_priv->pm_rps_events); 1296 gen6_disable_pm_irq(dev_priv, pm_iir & dev_priv->pm_rps_events);
1336 spin_unlock(&dev_priv->irq_lock); 1297 spin_unlock(&dev_priv->irq_lock);
1337 1298
1338 queue_work(dev_priv->wq, &dev_priv->rps.work); 1299 queue_work(dev_priv->wq, &dev_priv->rps.work);
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 5c622ad2e9aa..d93697a41a13 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -784,8 +784,6 @@ void gen5_enable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask);
784void gen5_disable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask); 784void gen5_disable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask);
785void gen6_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask); 785void gen6_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask);
786void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask); 786void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask);
787void gen8_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask);
788void gen8_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask);
789void intel_runtime_pm_disable_interrupts(struct drm_i915_private *dev_priv); 787void intel_runtime_pm_disable_interrupts(struct drm_i915_private *dev_priv);
790void intel_runtime_pm_enable_interrupts(struct drm_i915_private *dev_priv); 788void intel_runtime_pm_enable_interrupts(struct drm_i915_private *dev_priv);
791static inline bool intel_irqs_enabled(struct drm_i915_private *dev_priv) 789static inline bool intel_irqs_enabled(struct drm_i915_private *dev_priv)
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 5764936e3a22..9851af776aad 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -4669,7 +4669,7 @@ static void gen8_enable_rps_interrupts(struct drm_device *dev)
4669 4669
4670 spin_lock_irq(&dev_priv->irq_lock); 4670 spin_lock_irq(&dev_priv->irq_lock);
4671 WARN_ON(dev_priv->rps.pm_iir); 4671 WARN_ON(dev_priv->rps.pm_iir);
4672 gen8_enable_pm_irq(dev_priv, dev_priv->pm_rps_events); 4672 gen6_enable_pm_irq(dev_priv, dev_priv->pm_rps_events);
4673 I915_WRITE(GEN8_GT_IIR(2), dev_priv->pm_rps_events); 4673 I915_WRITE(GEN8_GT_IIR(2), dev_priv->pm_rps_events);
4674 spin_unlock_irq(&dev_priv->irq_lock); 4674 spin_unlock_irq(&dev_priv->irq_lock);
4675} 4675}