diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_irq.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 25 |
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 | } |