Skip to content

Commit

Permalink
drm/i915: add i915_lp_ring_sync helper
Browse files Browse the repository at this point in the history
This just waits until the hw passed the current ring position with
cmd execution. This slightly changes the existing i915_wait_request
function to make uninterruptible waiting possible - no point in
returning to userspace while mucking around with the overlay, that
piece of hw is just too fragile.

Also replace a magic 0 with the symbolic constant (and kill the then
superflous comment) while I was looking at the code.

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Eric Anholt <eric@anholt.net>
  • Loading branch information
Daniel Vetter authored and Eric Anholt committed Nov 5, 2009
1 parent 7a9c906 commit 48764bf
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 11 deletions.
1 change: 1 addition & 0 deletions drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ void i915_gem_cleanup_ringbuffer(struct drm_device *dev);
int i915_gem_do_init(struct drm_device *dev, unsigned long start,
unsigned long end);
int i915_gem_idle(struct drm_device *dev);
int i915_lp_ring_sync(struct drm_device *dev);
int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
int i915_gem_object_set_to_gtt_domain(struct drm_gem_object *obj,
int write);
Expand Down
49 changes: 39 additions & 10 deletions drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -1820,12 +1820,8 @@ i915_gem_retire_work_handler(struct work_struct *work)
mutex_unlock(&dev->struct_mutex);
}

/**
* Waits for a sequence number to be signaled, and cleans up the
* request and object lists appropriately for that event.
*/
static int
i915_wait_request(struct drm_device *dev, uint32_t seqno)
i915_do_wait_request(struct drm_device *dev, uint32_t seqno, int interruptible)
{
drm_i915_private_t *dev_priv = dev->dev_private;
u32 ier;
Expand All @@ -1852,10 +1848,15 @@ i915_wait_request(struct drm_device *dev, uint32_t seqno)

dev_priv->mm.waiting_gem_seqno = seqno;
i915_user_irq_get(dev);
ret = wait_event_interruptible(dev_priv->irq_queue,
i915_seqno_passed(i915_get_gem_seqno(dev),
seqno) ||
atomic_read(&dev_priv->mm.wedged));
if (interruptible)
ret = wait_event_interruptible(dev_priv->irq_queue,
i915_seqno_passed(i915_get_gem_seqno(dev), seqno) ||
atomic_read(&dev_priv->mm.wedged));
else
wait_event(dev_priv->irq_queue,
i915_seqno_passed(i915_get_gem_seqno(dev), seqno) ||
atomic_read(&dev_priv->mm.wedged));

i915_user_irq_put(dev);
dev_priv->mm.waiting_gem_seqno = 0;

Expand All @@ -1879,6 +1880,34 @@ i915_wait_request(struct drm_device *dev, uint32_t seqno)
return ret;
}

/**
* Waits for a sequence number to be signaled, and cleans up the
* request and object lists appropriately for that event.
*/
static int
i915_wait_request(struct drm_device *dev, uint32_t seqno)
{
return i915_do_wait_request(dev, seqno, 1);
}

/**
* Waits for the ring to finish up to the latest request. Usefull for waiting
* for flip events, e.g for the overlay support. */
int i915_lp_ring_sync(struct drm_device *dev)
{
uint32_t seqno;
int ret;

seqno = i915_add_request(dev, NULL, 0);

if (seqno == 0)
return -ENOMEM;

ret = i915_do_wait_request(dev, seqno, 0);
BUG_ON(ret == -ERESTARTSYS);
return ret;
}

static void
i915_gem_flush(struct drm_device *dev,
uint32_t invalidate_domains,
Expand Down Expand Up @@ -1947,7 +1976,7 @@ i915_gem_flush(struct drm_device *dev,
#endif
BEGIN_LP_RING(2);
OUT_RING(cmd);
OUT_RING(0); /* noop */
OUT_RING(MI_NOOP);
ADVANCE_LP_RING();
}
}
Expand Down
2 changes: 1 addition & 1 deletion include/drm/drm_os_linux.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,5 +123,5 @@ do { \
remove_wait_queue(&(queue), &entry); \
} while (0)

#define DRM_WAKEUP( queue ) wake_up_interruptible( queue )
#define DRM_WAKEUP( queue ) wake_up( queue )
#define DRM_INIT_WAITQUEUE( queue ) init_waitqueue_head( queue )

0 comments on commit 48764bf

Please sign in to comment.