aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/i915_irq.c')
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index d04c526410a..ef03a59c1df 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -427,7 +427,9 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
427 I915_WRITE(IMR, dev_priv->irq_mask_reg); 427 I915_WRITE(IMR, dev_priv->irq_mask_reg);
428 (void) I915_READ(IIR); /* Flush posted writes */ 428 (void) I915_READ(IIR); /* Flush posted writes */
429 429
430 dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv); 430 if (dev_priv->sarea_priv)
431 dev_priv->sarea_priv->last_dispatch =
432 READ_BREADCRUMB(dev_priv);
431 433
432 if (iir & I915_USER_INTERRUPT) { 434 if (iir & I915_USER_INTERRUPT) {
433 dev_priv->mm.irq_gem_seqno = i915_get_gem_seqno(dev); 435 dev_priv->mm.irq_gem_seqno = i915_get_gem_seqno(dev);
@@ -456,10 +458,11 @@ static int i915_emit_irq(struct drm_device * dev)
456 458
457 DRM_DEBUG("\n"); 459 DRM_DEBUG("\n");
458 460
459 dev_priv->sarea_priv->last_enqueue = ++dev_priv->counter; 461 dev_priv->counter++;
460
461 if (dev_priv->counter > 0x7FFFFFFFUL) 462 if (dev_priv->counter > 0x7FFFFFFFUL)
462 dev_priv->sarea_priv->last_enqueue = dev_priv->counter = 1; 463 dev_priv->counter = 1;
464 if (dev_priv->sarea_priv)
465 dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
463 466
464 BEGIN_LP_RING(6); 467 BEGIN_LP_RING(6);
465 OUT_RING(MI_STORE_DWORD_INDEX); 468 OUT_RING(MI_STORE_DWORD_INDEX);
@@ -503,11 +506,15 @@ static int i915_wait_irq(struct drm_device * dev, int irq_nr)
503 READ_BREADCRUMB(dev_priv)); 506 READ_BREADCRUMB(dev_priv));
504 507
505 if (READ_BREADCRUMB(dev_priv) >= irq_nr) { 508 if (READ_BREADCRUMB(dev_priv) >= irq_nr) {
506 dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv); 509 if (dev_priv->sarea_priv) {
510 dev_priv->sarea_priv->last_dispatch =
511 READ_BREADCRUMB(dev_priv);
512 }
507 return 0; 513 return 0;
508 } 514 }
509 515
510 dev_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT; 516 if (dev_priv->sarea_priv)
517 dev_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
511 518
512 i915_user_irq_get(dev); 519 i915_user_irq_get(dev);
513 DRM_WAIT_ON(ret, dev_priv->irq_queue, 3 * DRM_HZ, 520 DRM_WAIT_ON(ret, dev_priv->irq_queue, 3 * DRM_HZ,
@@ -519,7 +526,9 @@ static int i915_wait_irq(struct drm_device * dev, int irq_nr)
519 READ_BREADCRUMB(dev_priv), (int)dev_priv->counter); 526 READ_BREADCRUMB(dev_priv), (int)dev_priv->counter);
520 } 527 }
521 528
522 dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv); 529 if (dev_priv->sarea_priv)
530 dev_priv->sarea_priv->last_dispatch =
531 READ_BREADCRUMB(dev_priv);
523 532
524 return ret; 533 return ret;
525} 534}
@@ -682,7 +691,7 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
682 struct list_head *list; 691 struct list_head *list;
683 int ret; 692 int ret;
684 693
685 if (!dev_priv) { 694 if (!dev_priv || !dev_priv->sarea_priv) {
686 DRM_ERROR("%s called with no initialization\n", __func__); 695 DRM_ERROR("%s called with no initialization\n", __func__);
687 return -EINVAL; 696 return -EINVAL;
688 } 697 }