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