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);