Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/riastradh-drm2]: src/sys/external/bsd/drm2/dist/drm/i915 Convert struct ...
details: https://anonhg.NetBSD.org/src/rev/c98dafa646c3
branches: riastradh-drm2
changeset: 788291:c98dafa646c3
user: riastradh <riastradh%NetBSD.org@localhost>
date: Wed Jul 24 03:06:00 2013 +0000
description:
Convert struct intel_ringbuffer::irq_queue to drm waitqueues.
diffstat:
sys/external/bsd/drm2/dist/drm/i915/i915_dma.c | 6 ++++
sys/external/bsd/drm2/dist/drm/i915/i915_gem.c | 10 ++++++++
sys/external/bsd/drm2/dist/drm/i915/i915_irq.c | 22 ++++++++++++++++++
sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.c | 4 +++
sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.h | 4 +++
5 files changed, 46 insertions(+), 0 deletions(-)
diffs (137 lines):
diff -r fd4cf94df0c5 -r c98dafa646c3 sys/external/bsd/drm2/dist/drm/i915/i915_dma.c
--- a/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c Wed Jul 24 03:05:41 2013 +0000
+++ b/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c Wed Jul 24 03:06:00 2013 +0000
@@ -802,8 +802,14 @@
master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
if (ring->irq_get(ring)) {
+#ifdef __NetBSD__
+ DRM_TIMED_WAIT_UNTIL(ret, &ring->irq_queue, &drm_global_mutex,
+ 3 * DRM_HZ,
+ READ_BREADCRUMB(dev_priv) >= irq_nr);
+#else
DRM_WAIT_ON(ret, ring->irq_queue, 3 * DRM_HZ,
READ_BREADCRUMB(dev_priv) >= irq_nr);
+#endif
ring->irq_put(ring);
} else if (wait_for(READ_BREADCRUMB(dev_priv) >= irq_nr, 3000))
ret = -EBUSY;
diff -r fd4cf94df0c5 -r c98dafa646c3 sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
--- a/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c Wed Jul 24 03:05:41 2013 +0000
+++ b/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c Wed Jul 24 03:06:00 2013 +0000
@@ -1028,6 +1028,15 @@
(i915_seqno_passed(ring->get_seqno(ring, false), seqno) || \
atomic_read(&dev_priv->mm.wedged))
do {
+#ifdef __NetBSD__
+ /*
+ * XXX This wait is always interruptible; we should
+ * heed the flag `interruptible'.
+ */
+ DRM_TIMED_WAIT_UNTIL(end, &ring->irq_queue, &drm_global_mutex,
+ timeout_jiffies,
+ EXIT_COND);
+#else
if (interruptible)
end = wait_event_interruptible_timeout(ring->irq_queue,
EXIT_COND,
@@ -1036,6 +1045,7 @@
end = wait_event_timeout(ring->irq_queue, EXIT_COND,
timeout_jiffies);
+#endif
ret = i915_gem_check_wedge(dev_priv, interruptible);
if (ret)
end = ret;
diff -r fd4cf94df0c5 -r c98dafa646c3 sys/external/bsd/drm2/dist/drm/i915/i915_irq.c
--- a/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c Wed Jul 24 03:05:41 2013 +0000
+++ b/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c Wed Jul 24 03:06:00 2013 +0000
@@ -353,7 +353,11 @@
trace_i915_gem_request_complete(ring, ring->get_seqno(ring, false));
+#ifdef __NetBSD__
+ DRM_WAKEUP_ALL(&ring->irq_queue, &drm_global_mutex);
+#else
wake_up_all(&ring->irq_queue);
+#endif
if (i915_enable_hangcheck) {
dev_priv->hangcheck_count = 0;
mod_timer(&dev_priv->hangcheck_timer,
@@ -1151,7 +1155,12 @@
error->instdone[ring->id] = I915_READ(INSTDONE);
}
+#ifdef __NetBSD__
+ error->waiting[ring->id] = DRM_WAITERS_P(&ring->irq_queue,
+ &drm_global_mutex);
+#else
error->waiting[ring->id] = waitqueue_active(&ring->irq_queue);
+#endif
error->instpm[ring->id] = I915_READ(RING_INSTPM(ring->mmio_base));
error->seqno[ring->id] = ring->get_seqno(ring, false);
error->acthd[ring->id] = intel_ring_get_active_head(ring);
@@ -1466,7 +1475,11 @@
* Wakeup waiting processes so they don't hang
*/
for_each_ring(ring, dev_priv, i)
+#ifdef __NetBSD__
+ DRM_WAKEUP_ALL(&ring->irq_queue, &drm_global_mutex);
+#else
wake_up_all(&ring->irq_queue);
+#endif
}
queue_work(dev_priv->wq, &dev_priv->error_work);
@@ -1671,12 +1684,21 @@
i915_seqno_passed(ring->get_seqno(ring, false),
ring_last_seqno(ring))) {
/* Issue a wake-up to catch stuck h/w. */
+#ifdef __NetBSD__
+ if (DRM_WAITERS_P(&ring->irq_queue, &drm_global_mutex)) {
+ DRM_ERROR("Hangcheck timer elapsed... %s idle\n",
+ ring->name);
+ DRM_WAKEUP_ALL(&ring->irq_queue, &drm_global_mutex);
+ *err = true;
+ }
+#else
if (waitqueue_active(&ring->irq_queue)) {
DRM_ERROR("Hangcheck timer elapsed... %s idle\n",
ring->name);
wake_up_all(&ring->irq_queue);
*err = true;
}
+#endif
return true;
}
return false;
diff -r fd4cf94df0c5 -r c98dafa646c3 sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.c
--- a/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.c Wed Jul 24 03:05:41 2013 +0000
+++ b/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.c Wed Jul 24 03:06:00 2013 +0000
@@ -1151,7 +1151,11 @@
ring->size = 32 * PAGE_SIZE;
memset(ring->sync_seqno, 0, sizeof(ring->sync_seqno));
+#ifdef __NetBSD__
+ DRM_INIT_WAITQUEUE(&ring->irq_queue, "i915irq");
+#else
init_waitqueue_head(&ring->irq_queue);
+#endif
if (I915_NEED_GFX_HWS(dev)) {
ret = init_status_page(ring);
diff -r fd4cf94df0c5 -r c98dafa646c3 sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.h
--- a/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.h Wed Jul 24 03:05:41 2013 +0000
+++ b/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.h Wed Jul 24 03:06:00 2013 +0000
@@ -133,7 +133,11 @@
u32 outstanding_lazy_request;
bool gpu_caches_dirty;
+#ifdef __NetBSD__
+ drm_waitqueue_t irq_queue;
+#else
wait_queue_head_t irq_queue;
+#endif
/**
* Do an explicit TLB flush before MI_SET_CONTEXT
Home |
Main Index |
Thread Index |
Old Index