Module Name:    src
Committed By:   martin
Date:           Fri Feb 27 11:23:54 UTC 2015

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915 [netbsd-7]: i915_gem.c
            intel_i2c.c
        src/sys/external/bsd/drm2/include/drm [netbsd-7]: drm_wait_netbsd.h

Log Message:
Pull up following revision(s) (requested by snj in ticket #553):
        sys/external/bsd/drm2/dist/drm/i915/i915_gem.c: revision 1.20
        sys/external/bsd/drm2/dist/drm/i915/i915_gem.c: revision 1.21
        sys/external/bsd/drm2/dist/drm/i915/i915_gem.c: revision 1.22
        sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c: revision 1.5
        sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c: revision 1.6
        sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c: revision 1.7
        sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h: revision 1.6
Fix returned timeout in wait_seqno: remaining time, not time slept.
-
Fix return code of __wait_seqno.
-
MAX(ret, 0) is 0 if ret is negative, but if ret is negative we want
to return that negative value, meaning error.  Should've been
MIN(ret, 0), but I'll just rewrite it to clarify a wee bit.
-
If the GPU reset, call i915_gem_check_wedge and always return failure
like Linux does.  Caller must retry in that case.
-
Limit scope of ret and omit needless use of it to reduce confusion.
-
Make gmbus_wait_hw_status consistently use 50ms timeout like Linux.
-
Another attempt to fix the drm timed wait blarf blugh blahhh.
...aaaaand one more fix for __wait_seqno return value.
-
Also get the sense of the condition to wait until right.


To generate a diff of this commit:
cvs rdiff -u -r1.14.2.4 -r1.14.2.5 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
cvs rdiff -u -r1.4 -r1.4.2.1 \
    src/sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c
cvs rdiff -u -r1.4.2.1 -r1.4.2.2 \
    src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.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_gem.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.14.2.4 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.14.2.5
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.14.2.4	Tue Dec 30 11:57:49 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c	Fri Feb 27 11:23:53 2015
@@ -1441,9 +1441,33 @@ __wait_seqno(struct intel_ring_buffer *r
 
 	if (!irq_test_in_progress)
 		ring->irq_put(ring);
-	if (timeout)
-		timespecsub(&after, &before, timeout);
-	return MAX(ret, 0);	/* ignore remaining ticks */
+	if (timeout) {
+		struct timespec slept;
+
+		/* Compute slept = after - before.  */
+		timespecsub(&after, &before, &slept);
+
+		/*
+		 * Return the time remaining, timeout - slept, if we
+		 * slept for less time than the timeout; or zero if we
+		 * timed out.
+		 */
+		if (timespeccmp(&slept, timeout, <))
+			timespecsub(timeout, &slept, timeout);
+		else
+			timespecclear(timeout);
+	}
+	if (wedged) {		/* GPU reset while we were waiting.  */
+		ret = i915_gem_check_wedge(&dev_priv->gpu_error,
+		    interruptible);
+		if (ret == 0)
+			ret = -EAGAIN;
+	}
+	if (ret < 0)		/* Error.  */
+		return ret;
+	if (ret == 0)		/* Seqno didn't pass.  */
+		return -ETIME;
+	return 0;		/* Seqno passed, maybe time to spare.  */
 }
 #else
 static int __wait_seqno(struct intel_ring_buffer *ring, u32 seqno,

Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c:1.4 src/sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c:1.4.2.1
--- src/sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c:1.4	Wed Jul 16 20:56:25 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c	Fri Feb 27 11:23:53 2015
@@ -269,9 +269,7 @@ gmbus_wait_hw_status(struct drm_i915_pri
 #endif
 	int reg_offset = dev_priv->gpio_mmio_base;
 	u32 gmbus2 = 0;
-#ifdef __NetBSD__
-	int ret;
-#else
+#ifndef __NetBSD__
 	DEFINE_WAIT(wait);
 #endif
 
@@ -291,21 +289,20 @@ gmbus_wait_hw_status(struct drm_i915_pri
 #ifdef __NetBSD__
 	spin_lock(&dev_priv->gmbus_wait_lock);
 	if (cold) {
-		unsigned timo = 1000;
-		ret = 0;
+		unsigned timo = 50;
+
 		while (gmbus2 = I915_READ_NOTRACE(GMBUS2 + reg_offset),
 		    !ISSET(gmbus2, (GMBUS_SATOER | gmbus2_status))) {
-			if (timo-- == 0) {
-				ret = -ETIMEDOUT;
+			if (timo-- == 0)
 				break;
-			}
-			DELAY(100);
+			DELAY(1000);
 		}
 	} else {
+		int ret;
 		DRM_SPIN_TIMED_WAIT_UNTIL(ret, &dev_priv->gmbus_wait_queue,
-		    &dev_priv->gmbus_wait_lock, 1,
+		    &dev_priv->gmbus_wait_lock, mstohz(50),
 		    (gmbus2 = I915_READ_NOTRACE(GMBUS2 + reg_offset),
-			!ISSET(gmbus2, (GMBUS_SATOER | gmbus2_status))));
+			ISSET(gmbus2, (GMBUS_SATOER | gmbus2_status))));
 	}
 	spin_unlock(&dev_priv->gmbus_wait_lock);
 #else

Index: src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h
diff -u src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h:1.4.2.1 src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h:1.4.2.2
--- src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h:1.4.2.1	Sun Sep 21 18:00:33 2014
+++ src/sys/external/bsd/drm2/include/drm/drm_wait_netbsd.h	Fri Feb 27 11:23:54 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_wait_netbsd.h,v 1.4.2.1 2014/09/21 18:00:33 snj Exp $	*/
+/*	$NetBSD: drm_wait_netbsd.h,v 1.4.2.2 2015/02/27 11:23:54 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -129,6 +129,19 @@ DRM_SPIN_WAKEUP_ALL(drm_waitqueue_t *q, 
 #define	DRM_WAIT_UNTIL(RET, Q, I, C)				\
 	_DRM_WAIT_UNTIL(RET, cv_wait_sig, Q, I, C)
 
+/*
+ * Timed wait.  Return:
+ *
+ * - 0 if condition is false after timeout,
+ * - 1 if condition is true after timeout or one tick before timeout,
+ * - number of ticks left if condition evaluated to true before timeout, or
+ * - error if failure (e.g., interrupted).
+ *
+ * XXX Comments in Linux say it returns -ERESTARTSYS if interrupted.
+ * What if by a signal without SA_RESTART?  Shouldn't it be -EINTR
+ * then?  I'm going to leave it as what cv_timedwait returned, which is
+ * ERESTART for signals with SA_RESTART and EINTR otherwise.
+ */
 #define	_DRM_TIMED_WAIT_UNTIL(RET, WAIT, Q, INTERLOCK, TICKS, CONDITION) do \
 {									\
 	extern int hardclock_ticks;					\
@@ -145,14 +158,17 @@ DRM_SPIN_WAKEUP_ALL(drm_waitqueue_t *q, 
 		/* XXX errno NetBSD->Linux */				\
 		(RET) = -WAIT((Q), &(INTERLOCK)->mtx_lock,		\
 		    _dtwu_ticks);					\
-		if (RET)						\
+		if (RET) {						\
+			if ((RET) == -EWOULDBLOCK)			\
+				(RET) = (CONDITION) ? 1 : 0;		\
 			break;						\
+		}							\
 		const int _dtwu_now = hardclock_ticks;			\
 		KASSERT(_dtwu_start <= _dtwu_now);			\
 		if ((_dtwu_now - _dtwu_start) < _dtwu_ticks) {		\
 			_dtwu_ticks -= (_dtwu_now - _dtwu_start);	\
 		} else {						\
-			(RET) = 0;					\
+			(RET) = (CONDITION) ? 1 : 0;			\
 			break;						\
 		}							\
 	}								\
@@ -210,14 +226,17 @@ DRM_SPIN_WAKEUP_ALL(drm_waitqueue_t *q, 
 		/* XXX errno NetBSD->Linux */				\
 		(RET) = -WAIT((Q), &(INTERLOCK)->sl_lock,		\
 		    _dstwu_ticks);					\
-		if (RET)						\
+		if (RET) {						\
+			if ((RET) == -EWOULDBLOCK)			\
+				(RET) = (CONDITION) ? 1 : 0;		\
 			break;						\
+		}							\
 		const int _dstwu_now = hardclock_ticks;			\
 		KASSERT(_dstwu_start <= _dstwu_now);			\
 		if ((_dstwu_now - _dstwu_start) < _dstwu_ticks) {	\
 			_dstwu_ticks -= (_dstwu_now - _dstwu_start);	\
 		} else {						\
-			(RET) = 0;					\
+			(RET) = (CONDITION) ? 1 : 0;			\
 			break;						\
 		}							\
 	}								\

Reply via email to