Wed Jul 24 03:06:00 2013 UTC ()
Convert struct intel_ringbuffer::irq_queue to drm waitqueues.


(riastradh)
diff -r1.1.1.1.2.7 -r1.1.1.1.2.8 src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c
diff -r1.1.1.1.2.2 -r1.1.1.1.2.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
diff -r1.1.1.1.2.2 -r1.1.1.1.2.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c
diff -r1.1.1.1.2.4 -r1.1.1.1.2.5 src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.c
diff -r1.1.1.1.2.5 -r1.1.1.1.2.6 src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.h

cvs diff -r1.1.1.1.2.7 -r1.1.1.1.2.8 src/sys/external/bsd/drm2/dist/drm/i915/Attic/i915_dma.c (expand / switch to context diff)
--- src/sys/external/bsd/drm2/dist/drm/i915/Attic/i915_dma.c 2013/07/24 03:05:41 1.1.1.1.2.7
+++ src/sys/external/bsd/drm2/dist/drm/i915/Attic/i915_dma.c 2013/07/24 03:06:00 1.1.1.1.2.8
@@ -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;

cvs diff -r1.1.1.1.2.2 -r1.1.1.1.2.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c (expand / switch to context diff)
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c 2013/07/23 21:28:22 1.1.1.1.2.2
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c 2013/07/24 03:06:00 1.1.1.1.2.3
@@ -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;

cvs diff -r1.1.1.1.2.2 -r1.1.1.1.2.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c (expand / switch to context diff)
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c 2013/07/23 21:28:22 1.1.1.1.2.2
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c 2013/07/24 03:06:00 1.1.1.1.2.3
@@ -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;

cvs diff -r1.1.1.1.2.4 -r1.1.1.1.2.5 src/sys/external/bsd/drm2/dist/drm/i915/Attic/intel_ringbuffer.c (expand / switch to context diff)
--- src/sys/external/bsd/drm2/dist/drm/i915/Attic/intel_ringbuffer.c 2013/07/24 03:05:41 1.1.1.1.2.4
+++ src/sys/external/bsd/drm2/dist/drm/i915/Attic/intel_ringbuffer.c 2013/07/24 03:06:00 1.1.1.1.2.5
@@ -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);

cvs diff -r1.1.1.1.2.5 -r1.1.1.1.2.6 src/sys/external/bsd/drm2/dist/drm/i915/Attic/intel_ringbuffer.h (expand / switch to context diff)
--- src/sys/external/bsd/drm2/dist/drm/i915/Attic/intel_ringbuffer.h 2013/07/24 03:05:41 1.1.1.1.2.5
+++ src/sys/external/bsd/drm2/dist/drm/i915/Attic/intel_ringbuffer.h 2013/07/24 03:06:00 1.1.1.1.2.6
@@ -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