]> git.karo-electronics.de Git - linux-beck.git/commitdiff
i915: Make use of sarea_priv conditional.
authorKristian Høgsberg <krh@redhat.com>
Wed, 20 Aug 2008 15:20:13 +0000 (11:20 -0400)
committerDave Airlie <airlied@linux.ie>
Fri, 17 Oct 2008 21:10:51 +0000 (07:10 +1000)
We fail ioctls that depend on the sarea_priv with EINVAL.

Signed-off-by: Kristian Høgsberg <krh@redhat.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_irq.c

index d71c89f8802e08e34b7e919513c3e99aaf250a31..048da791ca664c6086d381f08e3715eb25703b32 100644 (file)
@@ -55,7 +55,8 @@ int i915_wait_ring(struct drm_device * dev, int n, const char *caller)
                if (ring->space >= n)
                        return 0;
 
-               dev_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
+               if (dev_priv->sarea_priv)
+                       dev_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
 
                if (ring->head != last_head)
                        i = 0;
@@ -128,7 +129,7 @@ void i915_kernel_lost_context(struct drm_device * dev)
        if (ring->space < 0)
                ring->space += ring->Size;
 
-       if (ring->head == ring->tail)
+       if (ring->head == ring->tail && dev_priv->sarea_priv)
                dev_priv->sarea_priv->perf_boxes |= I915_BOX_RING_EMPTY;
 }
 
@@ -433,10 +434,11 @@ static void i915_emit_breadcrumb(struct drm_device *dev)
        drm_i915_private_t *dev_priv = dev->dev_private;
        RING_LOCALS;
 
-       dev_priv->sarea_priv->last_enqueue = ++dev_priv->counter;
-
+       dev_priv->counter++;
        if (dev_priv->counter > 0x7FFFFFFFUL)
-               dev_priv->sarea_priv->last_enqueue = dev_priv->counter = 1;
+               dev_priv->counter = 0;
+       if (dev_priv->sarea_priv)
+               dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
 
        BEGIN_LP_RING(4);
        OUT_RING(MI_STORE_DWORD_INDEX);
@@ -534,6 +536,9 @@ static int i915_dispatch_flip(struct drm_device * dev)
        drm_i915_private_t *dev_priv = dev->dev_private;
        RING_LOCALS;
 
+       if (!dev_priv->sarea_priv)
+               return -EINVAL;
+
        DRM_DEBUG("%s: page=%d pfCurrentPage=%d\n",
                  __func__,
                  dev_priv->current_page,
@@ -628,7 +633,8 @@ static int i915_batchbuffer(struct drm_device *dev, void *data,
        ret = i915_dispatch_batchbuffer(dev, batch);
        mutex_unlock(&dev->struct_mutex);
 
-       sarea_priv->last_dispatch = (int)hw_status[5];
+       if (sarea_priv)
+               sarea_priv->last_dispatch = (int)hw_status[5];
        return ret;
 }
 
@@ -663,7 +669,8 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data,
                return ret;
        }
 
-       sarea_priv->last_dispatch = (int)hw_status[5];
+       if (sarea_priv)
+               sarea_priv->last_dispatch = (int)hw_status[5];
        return 0;
 }
 
index d04c526410a90bf5d186aadb90e5564a0f43cf08..ef03a59c1df870a622b4f09690b2c9feb8070d0c 100644 (file)
@@ -427,7 +427,9 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
                I915_WRITE(IMR, dev_priv->irq_mask_reg);
        (void) I915_READ(IIR); /* Flush posted writes */
 
-       dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
+       if (dev_priv->sarea_priv)
+               dev_priv->sarea_priv->last_dispatch =
+                       READ_BREADCRUMB(dev_priv);
 
        if (iir & I915_USER_INTERRUPT) {
                dev_priv->mm.irq_gem_seqno = i915_get_gem_seqno(dev);
@@ -456,10 +458,11 @@ static int i915_emit_irq(struct drm_device * dev)
 
        DRM_DEBUG("\n");
 
-       dev_priv->sarea_priv->last_enqueue = ++dev_priv->counter;
-
+       dev_priv->counter++;
        if (dev_priv->counter > 0x7FFFFFFFUL)
-               dev_priv->sarea_priv->last_enqueue = dev_priv->counter = 1;
+               dev_priv->counter = 1;
+       if (dev_priv->sarea_priv)
+               dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
 
        BEGIN_LP_RING(6);
        OUT_RING(MI_STORE_DWORD_INDEX);
@@ -503,11 +506,15 @@ static int i915_wait_irq(struct drm_device * dev, int irq_nr)
                  READ_BREADCRUMB(dev_priv));
 
        if (READ_BREADCRUMB(dev_priv) >= irq_nr) {
-               dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
+               if (dev_priv->sarea_priv) {
+                       dev_priv->sarea_priv->last_dispatch =
+                               READ_BREADCRUMB(dev_priv);
+               }
                return 0;
        }
 
-       dev_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
+       if (dev_priv->sarea_priv)
+               dev_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
 
        i915_user_irq_get(dev);
        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)
                          READ_BREADCRUMB(dev_priv), (int)dev_priv->counter);
        }
 
-       dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
+       if (dev_priv->sarea_priv)
+               dev_priv->sarea_priv->last_dispatch =
+                       READ_BREADCRUMB(dev_priv);
 
        return ret;
 }
@@ -682,7 +691,7 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
        struct list_head *list;
        int ret;
 
-       if (!dev_priv) {
+       if (!dev_priv || !dev_priv->sarea_priv) {
                DRM_ERROR("%s called with no initialization\n", __func__);
                return -EINVAL;
        }