aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_irq.c
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 /drivers/gpu/drm/i915/i915_irq.c
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>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_irq.c')
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c59
1 files changed, 10 insertions, 49 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);