Module Name:    src
Committed By:   riastradh
Date:           Wed Jul 24 03:06:00 UTC 2013

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915 [riastradh-drm2]: i915_dma.c
            i915_gem.c i915_irq.c intel_ringbuffer.c intel_ringbuffer.h

Log Message:
Convert struct intel_ringbuffer::irq_queue to drm waitqueues.


To generate a diff of this commit:
cvs rdiff -u -r1.1.1.1.2.7 -r1.1.1.1.2.8 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c
cvs rdiff -u -r1.1.1.1.2.2 -r1.1.1.1.2.3 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c
cvs rdiff -u -r1.1.1.1.2.4 -r1.1.1.1.2.5 \
    src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.c
cvs rdiff -u -r1.1.1.1.2.5 -r1.1.1.1.2.6 \
    src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c:1.1.1.1.2.7 src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c:1.1.1.1.2.8
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c:1.1.1.1.2.7	Wed Jul 24 03:05:41 2013
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c	Wed Jul 24 03:06:00 2013
@@ -802,8 +802,14 @@ static int i915_wait_irq(struct drm_devi
 		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;

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.1.1.1.2.2 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.1.1.1.2.3
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.1.1.1.2.2	Tue Jul 23 21:28:22 2013
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c	Wed Jul 24 03:06:00 2013
@@ -1028,6 +1028,15 @@ static int __wait_seqno(struct intel_rin
 	(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 @@ static int __wait_seqno(struct intel_rin
 			end = wait_event_timeout(ring->irq_queue, EXIT_COND,
 						 timeout_jiffies);
 
+#endif
 		ret = i915_gem_check_wedge(dev_priv, interruptible);
 		if (ret)
 			end = ret;
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c:1.1.1.1.2.2 src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c:1.1.1.1.2.3
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c:1.1.1.1.2.2	Tue Jul 23 21:28:22 2013
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c	Wed Jul 24 03:06:00 2013
@@ -353,7 +353,11 @@ static void notify_ring(struct drm_devic
 
 	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 @@ static void i915_record_ring_state(struc
 		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 @@ void i915_handle_error(struct drm_device
 		 * 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 @@ static bool i915_hangcheck_ring_idle(str
 	    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;

Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.c:1.1.1.1.2.4 src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.c:1.1.1.1.2.5
--- src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.c:1.1.1.1.2.4	Wed Jul 24 03:05:41 2013
+++ src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.c	Wed Jul 24 03:06:00 2013
@@ -1151,7 +1151,11 @@ static int intel_init_ring_buffer(struct
 	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);

Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.h:1.1.1.1.2.5 src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.h:1.1.1.1.2.6
--- src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.h:1.1.1.1.2.5	Wed Jul 24 03:05:41 2013
+++ src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.h	Wed Jul 24 03:06:00 2013
@@ -133,7 +133,11 @@ struct  intel_ring_buffer {
 	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

Reply via email to