Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 12:05:09 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/dist/drm: drm_atomic_helper.c drm_irq.c
            drm_vblank.c
        src/sys/external/bsd/drm2/dist/drm/i915/display: intel_sprite.c
        src/sys/external/bsd/drm2/dist/include/drm: drm_device.h drm_vblank.h

Log Message:
drm: Merge vbl_lock into event_lock.

These aren't functionally very different, and most uses of vbl_lock
were inserted as local changes to make proper condition variables
anyway.  Requiring both locks made cv_wait difficult because it only
unlocks and relocks one at a time, and this also led to annoying lock
order reversal.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 \
    src/sys/external/bsd/drm2/dist/drm/drm_atomic_helper.c
cvs rdiff -u -r1.17 -r1.18 src/sys/external/bsd/drm2/dist/drm/drm_irq.c
cvs rdiff -u -r1.11 -r1.12 src/sys/external/bsd/drm2/dist/drm/drm_vblank.c
cvs rdiff -u -r1.5 -r1.6 \
    src/sys/external/bsd/drm2/dist/drm/i915/display/intel_sprite.c
cvs rdiff -u -r1.7 -r1.8 \
    src/sys/external/bsd/drm2/dist/include/drm/drm_device.h
cvs rdiff -u -r1.10 -r1.11 \
    src/sys/external/bsd/drm2/dist/include/drm/drm_vblank.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/drm_atomic_helper.c
diff -u src/sys/external/bsd/drm2/dist/drm/drm_atomic_helper.c:1.8 src/sys/external/bsd/drm2/dist/drm/drm_atomic_helper.c:1.9
--- src/sys/external/bsd/drm2/dist/drm/drm_atomic_helper.c:1.8	Sun Dec 19 00:55:43 2021
+++ src/sys/external/bsd/drm2/dist/drm/drm_atomic_helper.c	Sun Dec 19 12:05:08 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_atomic_helper.c,v 1.8 2021/12/19 00:55:43 riastradh Exp $	*/
+/*	$NetBSD: drm_atomic_helper.c,v 1.9 2021/12/19 12:05:08 riastradh Exp $	*/
 
 /*
  * Copyright (C) 2014 Red Hat
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_atomic_helper.c,v 1.8 2021/12/19 00:55:43 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_atomic_helper.c,v 1.9 2021/12/19 12:05:08 riastradh Exp $");
 
 #include <linux/dma-fence.h>
 #include <linux/ktime.h>
@@ -1466,12 +1466,13 @@ drm_atomic_helper_wait_for_vblanks(struc
 			continue;
 
 #ifdef __NetBSD__
-		spin_lock(&dev->vbl_lock);
-		DRM_SPIN_WAIT_ON(ret, &dev->vblank[i].queue, &dev->vbl_lock,
+		spin_lock(&dev->event_lock);
+		DRM_SPIN_WAIT_ON(ret, &dev->vblank[i].queue,
+		    &dev->event_lock,
 		    msecs_to_jiffies(50),
 		    (old_state->crtcs[i].last_vblank_count !=
 			drm_crtc_vblank_count(crtc)));
-		spin_unlock(&dev->vbl_lock);
+		spin_unlock(&dev->event_lock);
 #else
 		ret = wait_event_timeout(dev->vblank[i].queue,
 				old_state->crtcs[i].last_vblank_count !=

Index: src/sys/external/bsd/drm2/dist/drm/drm_irq.c
diff -u src/sys/external/bsd/drm2/dist/drm/drm_irq.c:1.17 src/sys/external/bsd/drm2/dist/drm/drm_irq.c:1.18
--- src/sys/external/bsd/drm2/dist/drm/drm_irq.c:1.17	Sat Dec 18 23:44:57 2021
+++ src/sys/external/bsd/drm2/dist/drm/drm_irq.c	Sun Dec 19 12:05:08 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_irq.c,v 1.17 2021/12/18 23:44:57 riastradh Exp $	*/
+/*	$NetBSD: drm_irq.c,v 1.18 2021/12/19 12:05:08 riastradh Exp $	*/
 
 /*
  * drm_irq.c IRQ and vblank support
@@ -55,7 +55,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_irq.c,v 1.17 2021/12/18 23:44:57 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_irq.c,v 1.18 2021/12/19 12:05:08 riastradh Exp $");
 
 #include <linux/export.h>
 #include <linux/interrupt.h>	/* For task queue support */
@@ -215,7 +215,7 @@ int drm_irq_uninstall(struct drm_device 
 	 * disabled when uninstalling the irq handler.
 	 */
 	if (dev->num_crtcs) {
-		spin_lock_irqsave(&dev->vbl_lock, irqflags);
+		spin_lock_irqsave(&dev->event_lock, irqflags);
 		for (i = 0; i < dev->num_crtcs; i++) {
 			struct drm_vblank_crtc *vblank = &dev->vblank[i];
 
@@ -226,12 +226,13 @@ int drm_irq_uninstall(struct drm_device 
 
 			drm_vblank_disable_and_save(dev, i);
 #ifdef __NetBSD__
-			DRM_SPIN_WAKEUP_ONE(&vblank->queue, &dev->vbl_lock);
+			DRM_SPIN_WAKEUP_ONE(&vblank->queue,
+			    &dev->event_lock);
 #else
 			wake_up(&vblank->queue);
 #endif
 		}
-		spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+		spin_unlock_irqrestore(&dev->event_lock, irqflags);
 	}
 
 	if (!irq_enabled)

Index: src/sys/external/bsd/drm2/dist/drm/drm_vblank.c
diff -u src/sys/external/bsd/drm2/dist/drm/drm_vblank.c:1.11 src/sys/external/bsd/drm2/dist/drm/drm_vblank.c:1.12
--- src/sys/external/bsd/drm2/dist/drm/drm_vblank.c:1.11	Sun Dec 19 11:55:47 2021
+++ src/sys/external/bsd/drm2/dist/drm/drm_vblank.c	Sun Dec 19 12:05:08 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_vblank.c,v 1.11 2021/12/19 11:55:47 riastradh Exp $	*/
+/*	$NetBSD: drm_vblank.c,v 1.12 2021/12/19 12:05:08 riastradh Exp $	*/
 
 /*
  * drm_irq.c IRQ and vblank support
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_vblank.c,v 1.11 2021/12/19 11:55:47 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_vblank.c,v 1.12 2021/12/19 12:05:08 riastradh Exp $");
 
 #include <linux/export.h>
 #include <linux/moduleparam.h>
@@ -76,7 +76,7 @@ __KERNEL_RCSID(0, "$NetBSD: drm_vblank.c
  * vblanks after a timer has expired, which can be configured through the
  * ``vblankoffdelay`` module parameter.
  *
- * Lock order: event_lock -> vbl_lock -> vblank_time_lock
+ * Lock order: event_lock -> vblank_time_lock
  */
 
 /* Retry timestamp calculation up to 3 times to satisfy
@@ -169,7 +169,7 @@ static void drm_reset_vblank_timestamp(s
 	ktime_t t_vblank;
 	int count = DRM_TIMESTAMP_MAXRETRIES;
 
-	assert_spin_locked(&dev->vbl_lock);
+	assert_spin_locked(&dev->event_lock);
 
 	spin_lock(&dev->vblank_time_lock);
 
@@ -222,7 +222,7 @@ static void drm_update_vblank_count(stru
 	int framedur_ns = vblank->framedur_ns;
 	u32 max_vblank_count = drm_max_vblank_count(dev, pipe);
 
-	assert_spin_locked(&dev->vbl_lock);
+	assert_spin_locked(&dev->event_lock);
 
 	/*
 	 * Interrupts were disabled prior to this call, so deal with counter
@@ -337,24 +337,35 @@ static u64 drm_vblank_count(struct drm_d
  * This is mostly useful for hardware that can obtain the scanout position, but
  * doesn't have a hardware frame counter.
  */
-u64 drm_crtc_accurate_vblank_count(struct drm_crtc *crtc)
+static u64 drm_crtc_accurate_vblank_count_locked(struct drm_crtc *crtc)
 {
 	struct drm_device *dev = crtc->dev;
 	unsigned int pipe = drm_crtc_index(crtc);
 	u64 vblank;
 	unsigned long flags;
 
+	assert_spin_locked(&dev->event_lock);
+
 	WARN_ONCE(drm_debug_enabled(DRM_UT_VBL) && !dev->driver->get_vblank_timestamp,
 		  "This function requires support for accurate vblank timestamps.");
 
-	spin_lock(&dev->vbl_lock);
 	spin_lock_irqsave(&dev->vblank_time_lock, flags);
 
 	drm_update_vblank_count(dev, pipe, false);
 	vblank = drm_vblank_count(dev, pipe);
 
 	spin_unlock_irqrestore(&dev->vblank_time_lock, flags);
-	spin_unlock(&dev->vbl_lock);
+
+	return vblank;
+}
+
+u64 drm_crtc_accurate_vblank_count(struct drm_crtc *crtc)
+{
+	u64 vblank;
+
+	spin_lock(&crtc->dev->event_lock);
+	vblank = drm_crtc_accurate_vblank_count_locked(crtc);
+	spin_unlock(&crtc->dev->event_lock);
 
 	return vblank;
 }
@@ -388,7 +399,7 @@ void drm_vblank_disable_and_save(struct 
 	struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
 	unsigned long irqflags;
 
-	assert_spin_locked(&dev->vbl_lock);
+	assert_spin_locked(&dev->event_lock);
 
 	/* Prevent vblank irq processing while disabling vblank irqs,
 	 * so no updates of timestamps or count can happen after we've
@@ -425,7 +436,7 @@ vblank_disable_locked(struct drm_vblank_
 {
 
 	BUG_ON(vblank != &dev->vblank[pipe]);
-	assert_spin_locked(&dev->vbl_lock);
+	assert_spin_locked(&dev->event_lock);
 
 	if (atomic_read(&vblank->refcount) == 0 && vblank->enabled) {
 		DRM_DEBUG("disabling vblank on crtc %u\n", pipe);
@@ -440,12 +451,12 @@ static void vblank_disable_fn(struct tim
 	unsigned int pipe = vblank->pipe;
 	unsigned long irqflags;
 
-	spin_lock_irqsave(&dev->vbl_lock, irqflags);
+	spin_lock_irqsave(&dev->event_lock, irqflags);
 	if (atomic_read(&vblank->refcount) == 0 && vblank->enabled) {
 		DRM_DEBUG("disabling vblank on crtc %u\n", pipe);
 		drm_vblank_disable_and_save(dev, pipe);
 	}
-	spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+	spin_unlock_irqrestore(&dev->event_lock, irqflags);
 }
 
 void drm_vblank_cleanup(struct drm_device *dev)
@@ -488,7 +499,6 @@ int drm_vblank_init(struct drm_device *d
 	int ret = -ENOMEM;
 	unsigned int i;
 
-	spin_lock_init(&dev->vbl_lock);
 	spin_lock_init(&dev->vblank_time_lock);
 
 	dev->num_crtcs = num_crtcs;
@@ -960,7 +970,7 @@ void drm_crtc_arm_vblank_event(struct dr
 	assert_spin_locked(&dev->event_lock);
 
 	e->pipe = pipe;
-	e->sequence = drm_crtc_accurate_vblank_count(crtc) + 1;
+	e->sequence = drm_crtc_accurate_vblank_count_locked(crtc) + 1;
 	list_add_tail(&e->base.link, &dev->vblank_event_list);
 }
 EXPORT_SYMBOL(drm_crtc_arm_vblank_event);
@@ -1016,7 +1026,7 @@ static int drm_vblank_enable(struct drm_
 	struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
 	int ret = 0;
 
-	assert_spin_locked(&dev->vbl_lock);
+	assert_spin_locked(&dev->event_lock);
 
 	spin_lock(&dev->vblank_time_lock);
 
@@ -1048,19 +1058,19 @@ static int drm_vblank_enable(struct drm_
 	return ret;
 }
 
-static int drm_vblank_get(struct drm_device *dev, unsigned int pipe)
+static int drm_vblank_get_locked(struct drm_device *dev, unsigned int pipe)
 {
 	struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
-	unsigned long irqflags;
 	int ret = 0;
 
+	assert_spin_locked(&dev->event_lock);
+
 	if (!dev->num_crtcs)
 		return -EINVAL;
 
 	if (WARN_ON(pipe >= dev->num_crtcs))
 		return -EINVAL;
 
-	spin_lock_irqsave(&dev->vbl_lock, irqflags);
 	/* Going from 0->1 means we have to enable interrupts again */
 	if (atomic_add_return(1, &vblank->refcount) == 1) {
 		ret = drm_vblank_enable(dev, pipe);
@@ -1070,7 +1080,17 @@ static int drm_vblank_get(struct drm_dev
 			ret = -EINVAL;
 		}
 	}
-	spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+
+	return ret;
+}
+
+static int drm_vblank_get(struct drm_device *dev, unsigned int pipe)
+{
+	int ret;
+
+	spin_lock(&dev->event_lock);
+	ret = drm_vblank_get_locked(dev, pipe);
+	spin_unlock(&dev->event_lock);
 
 	return ret;
 }
@@ -1091,11 +1111,17 @@ int drm_crtc_vblank_get(struct drm_crtc 
 }
 EXPORT_SYMBOL(drm_crtc_vblank_get);
 
+int drm_crtc_vblank_get_locked(struct drm_crtc *crtc)
+{
+	return drm_vblank_get_locked(crtc->dev, drm_crtc_index(crtc));
+}
+EXPORT_SYMBOL(drm_crtc_vblank_get_locked);
+
 static void drm_vblank_put_locked(struct drm_device *dev, unsigned int pipe)
 {
 	struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
 
-	assert_spin_locked(&dev->vbl_lock);
+	assert_spin_locked(&dev->event_lock);
 
 	if (WARN_ON(pipe >= dev->num_crtcs))
 		return;
@@ -1179,12 +1205,12 @@ void drm_wait_one_vblank(struct drm_devi
 	if (WARN(ret, "vblank not available on crtc %i, ret=%i\n", pipe, ret))
 		return;
 
-	spin_lock(&dev->vbl_lock);
+	spin_lock(&dev->event_lock);
 	last = drm_vblank_count(dev, pipe);
-	DRM_SPIN_TIMED_WAIT_UNTIL(ret, &vblank->queue, &dev->vbl_lock,
+	DRM_SPIN_TIMED_WAIT_UNTIL(ret, &vblank->queue, &dev->event_lock,
 	    msecs_to_jiffies(100),
 	    last != drm_vblank_count(dev, pipe));
-	spin_unlock(&dev->vbl_lock);
+	spin_unlock(&dev->event_lock);
 
 	WARN(ret == 0, "vblank wait timed out on crtc %i\n", pipe);
 
@@ -1233,7 +1259,6 @@ void drm_crtc_vblank_off(struct drm_crtc
 
 	spin_lock_irqsave(&dev->event_lock, irqflags);
 
-	spin_lock(&dev->vbl_lock);
 	DRM_DEBUG_VBL("crtc %d, vblank enabled %d, inmodeset %d\n",
 		      pipe, vblank->enabled, vblank->inmodeset);
 
@@ -1242,7 +1267,7 @@ void drm_crtc_vblank_off(struct drm_crtc
 	if (drm_core_check_feature(dev, DRIVER_ATOMIC) || !vblank->inmodeset)
 		drm_vblank_disable_and_save(dev, pipe);
 
-	DRM_SPIN_WAKEUP_ONE(&vblank->queue, &dev->vbl_lock);
+	DRM_SPIN_WAKEUP_ONE(&vblank->queue, &dev->event_lock);
 
 	/*
 	 * Prevent subsequent drm_vblank_get() from re-enabling
@@ -1252,7 +1277,6 @@ void drm_crtc_vblank_off(struct drm_crtc
 		atomic_inc(&vblank->refcount);
 		vblank->inmodeset = 1;
 	}
-	spin_unlock(&dev->vbl_lock);
 
 	/* Send any queued vblank events, lest the natives grow disquiet */
 	seq = drm_vblank_count_and_time(dev, pipe, &now);
@@ -1294,7 +1318,7 @@ void drm_crtc_vblank_reset(struct drm_cr
 	unsigned int pipe = drm_crtc_index(crtc);
 	struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
 
-	spin_lock_irqsave(&dev->vbl_lock, irqflags);
+	spin_lock_irqsave(&dev->event_lock, irqflags);
 	/*
 	 * Prevent subsequent drm_vblank_get() from enabling the vblank
 	 * interrupt by bumping the refcount.
@@ -1303,9 +1327,8 @@ void drm_crtc_vblank_reset(struct drm_cr
 		atomic_inc(&vblank->refcount);
 		vblank->inmodeset = 1;
 	}
-	spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
-
 	WARN_ON(!list_empty(&dev->vblank_event_list));
+	spin_unlock_irqrestore(&dev->event_lock, irqflags);
 }
 EXPORT_SYMBOL(drm_crtc_vblank_reset);
 
@@ -1360,7 +1383,7 @@ void drm_crtc_vblank_on(struct drm_crtc 
 	if (WARN_ON(pipe >= dev->num_crtcs))
 		return;
 
-	spin_lock_irqsave(&dev->vbl_lock, irqflags);
+	spin_lock_irqsave(&dev->event_lock, irqflags);
 	DRM_DEBUG_VBL("crtc %d, vblank enabled %d, inmodeset %d\n",
 		      pipe, vblank->enabled, vblank->inmodeset);
 
@@ -1378,7 +1401,7 @@ void drm_crtc_vblank_on(struct drm_crtc 
 	 */
 	if (atomic_read(&vblank->refcount) != 0 || drm_vblank_offdelay == 0)
 		WARN_ON(drm_vblank_enable(dev, pipe));
-	spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+	spin_unlock_irqrestore(&dev->event_lock, irqflags);
 }
 EXPORT_SYMBOL(drm_crtc_vblank_on);
 
@@ -1407,7 +1430,7 @@ void drm_vblank_restore(struct drm_devic
 	if (WARN_ON(pipe >= dev->num_crtcs))
 		return;
 
-	assert_spin_locked(&dev->vbl_lock);
+	assert_spin_locked(&dev->event_lock);
 	assert_spin_locked(&dev->vblank_time_lock);
 
 	vblank = &dev->vblank[pipe];
@@ -1487,9 +1510,9 @@ static void drm_legacy_vblank_post_modes
 		return;
 
 	if (vblank->inmodeset) {
-		spin_lock_irqsave(&dev->vbl_lock, irqflags);
+		spin_lock_irqsave(&dev->event_lock, irqflags);
 		drm_reset_vblank_timestamp(dev, pipe);
-		spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+		spin_unlock_irqrestore(&dev->event_lock, irqflags);
 
 		if (vblank->inmodeset & 0x2)
 			drm_vblank_put(dev, pipe);
@@ -1762,7 +1785,7 @@ int drm_wait_vblank_ioctl(struct drm_dev
 		DRM_DEBUG("waiting on vblank count %"PRIu64", crtc %u\n",
 			  req_seq, pipe);
 		DRM_SPIN_TIMED_WAIT_UNTIL(wait, &vblank->queue,
-		    &dev->vbl_lock, msecs_to_jiffies(3000),
+		    &dev->event_lock, msecs_to_jiffies(3000),
 		    (vblank_passed(drm_vblank_count(dev, pipe), req_seq) ||
 			!READ_ONCE(vblank->enabled)));
 
@@ -1847,8 +1870,6 @@ bool drm_handle_vblank(struct drm_device
 
 	spin_lock_irqsave(&dev->event_lock, irqflags);
 
-	spin_lock(&dev->vbl_lock);
-
 	/* Need timestamp lock to prevent concurrent execution with
 	 * vblank enable/disable, as this would cause inconsistent
 	 * or corrupted timestamps and vblank counts.
@@ -1857,7 +1878,6 @@ bool drm_handle_vblank(struct drm_device
 
 	/* Vblank irq handling disabled. Nothing to do. */
 	if (!vblank->enabled) {
-		spin_unlock(&dev->vbl_lock);
 		spin_unlock(&dev->vblank_time_lock);
 		spin_unlock_irqrestore(&dev->event_lock, irqflags);
 		return false;
@@ -1867,7 +1887,7 @@ bool drm_handle_vblank(struct drm_device
 
 	spin_unlock(&dev->vblank_time_lock);
 
-	DRM_SPIN_WAKEUP_ONE(&vblank->queue, &dev->vbl_lock);
+	DRM_SPIN_WAKEUP_ONE(&vblank->queue, &dev->event_lock);
 
 	/* With instant-off, we defer disabling the interrupt until after
 	 * we finish processing the following vblank after all events have
@@ -1878,8 +1898,6 @@ bool drm_handle_vblank(struct drm_device
 		       drm_vblank_offdelay > 0 &&
 		       !atomic_read(&vblank->refcount));
 
-	spin_unlock(&dev->vbl_lock);
-
 	drm_handle_vblank_events(dev, pipe);
 
 	spin_unlock_irqrestore(&dev->event_lock, irqflags);

Index: src/sys/external/bsd/drm2/dist/drm/i915/display/intel_sprite.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/display/intel_sprite.c:1.5 src/sys/external/bsd/drm2/dist/drm/i915/display/intel_sprite.c:1.6
--- src/sys/external/bsd/drm2/dist/drm/i915/display/intel_sprite.c:1.5	Sun Dec 19 12:04:42 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/display/intel_sprite.c	Sun Dec 19 12:05:09 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_sprite.c,v 1.5 2021/12/19 12:04:42 riastradh Exp $	*/
+/*	$NetBSD: intel_sprite.c,v 1.6 2021/12/19 12:05:09 riastradh Exp $	*/
 
 /*
  * Copyright © 2011 Intel Corporation
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_sprite.c,v 1.5 2021/12/19 12:04:42 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_sprite.c,v 1.6 2021/12/19 12:05:09 riastradh Exp $");
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
@@ -121,14 +121,13 @@ void intel_pipe_update_start(const struc
 		DRM_ERROR("PSR idle timed out 0x%x, atomic update may fail\n",
 			  psr_status);
 
-	spin_lock(&crtc->base.dev->event_lock);
+	spin_lock(&dev_priv->drm.event_lock);
 
 	crtc->debug.min_vbl = min;
 	crtc->debug.max_vbl = max;
 	trace_intel_pipe_update_start(crtc);
 
-	spin_lock(&dev_priv->drm.vbl_lock);
-	DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(ret, wq, &dev_priv->drm.vbl_lock,
+	DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(ret, wq, &dev_priv->drm.event_lock,
 	    timeout,
 	    (scanline = intel_get_crtc_scanline(crtc),
 		scanline < min || scanline > max));
@@ -154,7 +153,6 @@ void intel_pipe_update_start(const struc
 	 */
 	while (need_vlv_dsi_wa && scanline == vblank_start)
 		scanline = intel_get_crtc_scanline(crtc);
-	spin_unlock(&dev_priv->drm.vbl_lock);
 
 	crtc->debug.scanline_start = scanline;
 	crtc->debug.start_vbl_time = ktime_get();
@@ -164,7 +162,7 @@ void intel_pipe_update_start(const struc
 	return;
 
 irq_disable:
-	spin_lock(&crtc->base.dev->event_lock);
+	spin_lock(&dev_priv->drm.event_lock);
 }
 
 /**
@@ -184,6 +182,8 @@ void intel_pipe_update_end(struct intel_
 	ktime_t end_vbl_time = ktime_get();
 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 
+	BUG_ON(!spin_is_locked(&dev_priv->drm.event_lock));
+
 	trace_intel_pipe_update_end(crtc, end_vbl_count, scanline_end);
 
 	/* We're still in the vblank-evade critical section, this can't race.
@@ -191,15 +191,14 @@ void intel_pipe_update_end(struct intel_
 	 * event outside of the critical section - the spinlock might spin for a
 	 * while ... */
 	if (new_crtc_state->uapi.event) {
-		WARN_ON(drm_crtc_vblank_get(&crtc->base) != 0);
+		WARN_ON(drm_crtc_vblank_get_locked(&crtc->base) != 0);
 
 		drm_crtc_arm_vblank_event(&crtc->base,
 				          new_crtc_state->uapi.event);
 
 		new_crtc_state->uapi.event = NULL;
 	}
-
-	spin_unlock(&crtc->base.dev->event_lock);
+	spin_unlock(&dev_priv->drm.event_lock);
 
 	if (intel_vgpu_active(dev_priv))
 		return;

Index: src/sys/external/bsd/drm2/dist/include/drm/drm_device.h
diff -u src/sys/external/bsd/drm2/dist/include/drm/drm_device.h:1.7 src/sys/external/bsd/drm2/dist/include/drm/drm_device.h:1.8
--- src/sys/external/bsd/drm2/dist/include/drm/drm_device.h:1.7	Sun Dec 19 10:29:16 2021
+++ src/sys/external/bsd/drm2/dist/include/drm/drm_device.h	Sun Dec 19 12:05:09 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_device.h,v 1.7 2021/12/19 10:29:16 riastradh Exp $	*/
+/*	$NetBSD: drm_device.h,v 1.8 2021/12/19 12:05:09 riastradh Exp $	*/
 
 #ifndef _DRM_DEVICE_H_
 #define _DRM_DEVICE_H_
@@ -230,11 +230,13 @@ struct drm_device {
 	 *  Protects vblank count and time updates during vblank enable/disable
 	 */
 	spinlock_t vblank_time_lock;
+#ifndef __NetBSD__		/* merged into event_lock */
 	/**
 	 * @vbl_lock: Top-level vblank references lock, wraps the low-level
 	 * @vblank_time_lock.
 	 */
 	spinlock_t vbl_lock;
+#endif
 
 	/**
 	 * @max_vblank_count:

Index: src/sys/external/bsd/drm2/dist/include/drm/drm_vblank.h
diff -u src/sys/external/bsd/drm2/dist/include/drm/drm_vblank.h:1.10 src/sys/external/bsd/drm2/dist/include/drm/drm_vblank.h:1.11
--- src/sys/external/bsd/drm2/dist/include/drm/drm_vblank.h:1.10	Sun Dec 19 11:52:25 2021
+++ src/sys/external/bsd/drm2/dist/include/drm/drm_vblank.h	Sun Dec 19 12:05:09 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_vblank.h,v 1.10 2021/12/19 11:52:25 riastradh Exp $	*/
+/*	$NetBSD: drm_vblank.h,v 1.11 2021/12/19 12:05:09 riastradh Exp $	*/
 
 /*
  * Copyright 2016 Intel Corp.
@@ -227,6 +227,7 @@ void drm_vblank_set_event(struct drm_pen
 bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe);
 bool drm_crtc_handle_vblank(struct drm_crtc *crtc);
 int drm_crtc_vblank_get(struct drm_crtc *crtc);
+int drm_crtc_vblank_get_locked(struct drm_crtc *crtc);
 void drm_crtc_vblank_put(struct drm_crtc *crtc);
 void drm_crtc_vblank_put_locked(struct drm_crtc *crtc);
 void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe);

Reply via email to