Module Name:    src
Committed By:   riastradh
Date:           Sat Feb 28 03:23:32 UTC 2015

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/via: via_dmablit.c via_irq.c
            via_video.c

Log Message:
Fix these drm waits too, in case anyone tries to use this via code.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c \
    src/sys/external/bsd/drm2/dist/drm/via/via_irq.c \
    src/sys/external/bsd/drm2/dist/drm/via/via_video.c

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/via/via_dmablit.c
diff -u src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c:1.2 src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c:1.2	Tue Aug 26 17:28:14 2014
+++ src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c	Sat Feb 28 03:23:32 2015
@@ -600,6 +600,12 @@ via_dmablit_sync(struct drm_device *dev,
 		DRM_SPIN_TIMED_WAIT_UNTIL(ret, queue, &blitq->blit_lock,
 		    3*DRM_HZ,
 		    !via_dmablit_active(blitq, engine, handle, NULL));
+		if (ret < 0)	/* Failure: return negative error as is.  */
+			;
+		else if (ret == 0) /* Timed out: return -EBUSY like Linux.  */
+			ret = -EBUSY;
+		else		/* Succeeded (ret > 0): return 0.  */
+			ret = 0;
 	}
 	spin_unlock(&blitq->blit_lock);
 #else
@@ -878,9 +884,18 @@ via_dmablit_grab_slot(drm_via_blitq_t *b
 		DRM_SPIN_TIMED_WAIT_UNTIL(ret, &blitq->busy_queue,
 		    &blitq->blit_lock, DRM_HZ,
 		    blitq->num_free > 0);
+		if (ret < 0)	/* Failure: return negative error as is.  */
+			;
+		else if (ret == 0) /* Timed out: return -EBUSY like Linux.  */
+			ret = -EBUSY;
+		else		/* Success (ret > 0): return 0.  */
+			ret = 0;
+		/* Map -EINTR to -EAGAIN.  */
+		if (ret == -EINTR)
+			ret = -EAGAIN;
+		/* Bail on failure.  */
 		if (ret) {
-			if (ret == -EINTR)
-				ret = -EAGAIN;
+			spin_unlock_irqrestore(&blitq->blit_lock, irqsave);
 			return ret;
 		}
 #else
Index: src/sys/external/bsd/drm2/dist/drm/via/via_irq.c
diff -u src/sys/external/bsd/drm2/dist/drm/via/via_irq.c:1.2 src/sys/external/bsd/drm2/dist/drm/via/via_irq.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/via/via_irq.c:1.2	Tue Aug 26 17:28:14 2014
+++ src/sys/external/bsd/drm2/dist/drm/via/via_irq.c	Sat Feb 28 03:23:32 2015
@@ -260,6 +260,12 @@ via_driver_irq_wait(struct drm_device *d
 		    (((cur_irq_sequence = cur_irq->irq_received) -
 			*sequence) <= (1 << 23)));
 	}
+	if (ret < 0)		/* Failure: return negative error as is.  */
+		;
+	else if (ret == 0)	/* Timed out: return -EBUSY like Linux.  */
+		ret = -EBUSY;
+	else			/* Success (ret > 0): return 0.  */
+		ret = 0;
 	spin_unlock(&cur_irq->irq_lock);
 #else
 	if (masks[real_irq][2] && !force_sequence) {
Index: src/sys/external/bsd/drm2/dist/drm/via/via_video.c
diff -u src/sys/external/bsd/drm2/dist/drm/via/via_video.c:1.2 src/sys/external/bsd/drm2/dist/drm/via/via_video.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/via/via_video.c:1.2	Tue Aug 26 17:28:14 2014
+++ src/sys/external/bsd/drm2/dist/drm/via/via_video.c	Sat Feb 28 03:23:32 2015
@@ -108,6 +108,12 @@ int via_decoder_futex(struct drm_device 
 		    &dev_priv->decoder_lock[fx->lock],
 		    (fx->ms / 10) * (DRM_HZ / 100),
 		    *lock != fx->val);
+		if (ret < 0)	/* Failure: return negative error as is.  */
+			;
+		else if (ret == 0) /* Timed out: return -EBUSY like Linux.  */
+			ret = -EBUSY;
+		else		/* Success (ret > 0): return 0.  */
+			ret = 0;
 		mutex_unlock(&dev_priv->decoder_lock[fx->lock]);
 #else
 		DRM_WAIT_ON(ret, dev_priv->decoder_queue[fx->lock],

Reply via email to