Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c99b058f authored by Kristian Høgsberg's avatar Kristian Høgsberg Committed by Dave Airlie
Browse files

i915: Make use of sarea_priv conditional.



We fail ioctls that depend on the sarea_priv with EINVAL.

Signed-off-by: default avatarKristian Høgsberg <krh@redhat.com>
Signed-off-by: default avatarEric Anholt <eric@anholt.net>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 546b0974
Loading
Loading
Loading
Loading
+14 −7
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ int i915_wait_ring(struct drm_device * dev, int n, const char *caller)
		if (ring->space >= n)
			return 0;

		if (dev_priv->sarea_priv)
			dev_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;

		if (ring->head != last_head)
@@ -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,6 +633,7 @@ static int i915_batchbuffer(struct drm_device *dev, void *data,
	ret = i915_dispatch_batchbuffer(dev, batch);
	mutex_unlock(&dev->struct_mutex);

	if (sarea_priv)
		sarea_priv->last_dispatch = (int)hw_status[5];
	return ret;
}
@@ -663,6 +669,7 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data,
		return ret;
	}

	if (sarea_priv)
		sarea_priv->last_dispatch = (int)hw_status[5];
	return 0;
}
+17 −8
Original line number Diff line number Diff line
@@ -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,10 +506,14 @@ 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;
	}

	if (dev_priv->sarea_priv)
		dev_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;

	i915_user_irq_get(dev);
@@ -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;
	}