Home | History | Annotate | Line # | Download | only in drm
drm_irq.c revision 1.5
      1 /**
      2  * \file drm_irq.c
      3  * IRQ support
      4  *
      5  * \author Rickard E. (Rik) Faith <faith (at) valinux.com>
      6  * \author Gareth Hughes <gareth (at) valinux.com>
      7  */
      8 
      9 /*
     10  * Created: Fri Mar 19 14:30:16 1999 by faith (at) valinux.com
     11  *
     12  * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas.
     13  * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
     14  * All Rights Reserved.
     15  *
     16  * Permission is hereby granted, free of charge, to any person obtaining a
     17  * copy of this software and associated documentation files (the "Software"),
     18  * to deal in the Software without restriction, including without limitation
     19  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     20  * and/or sell copies of the Software, and to permit persons to whom the
     21  * Software is furnished to do so, subject to the following conditions:
     22  *
     23  * The above copyright notice and this permission notice (including the next
     24  * paragraph) shall be included in all copies or substantial portions of the
     25  * Software.
     26  *
     27  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     28  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     29  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     30  * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
     31  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     32  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     33  * OTHER DEALINGS IN THE SOFTWARE.
     34  */
     35 
     36 #include <drm/drmP.h>
     37 #include "drm_trace.h"
     38 
     39 #include <linux/interrupt.h>	/* For task queue support */
     40 #include <linux/slab.h>
     41 
     42 #include <linux/vgaarb.h>
     43 #include <linux/export.h>
     44 
     45 #include <linux/atomic.h>
     46 #include <linux/ktime.h>
     47 #include <linux/math64.h>
     48 #include <linux/preempt.h>
     49 #include <linux/sched.h>
     50 
     51 #include <asm/bug.h>
     52 #include <asm/param.h>
     53 
     54 #ifdef __NetBSD__		/* XXX hurk -- selnotify &c. */
     55 #include <sys/poll.h>
     56 #include <sys/select.h>
     57 #endif
     58 
     59 /* Access macro for slots in vblank timestamp ringbuffer. */
     60 #define vblanktimestamp(dev, crtc, count) \
     61 	((dev)->vblank[crtc].time[(count) % DRM_VBLANKTIME_RBSIZE])
     62 
     63 /* Retry timestamp calculation up to 3 times to satisfy
     64  * drm_timestamp_precision before giving up.
     65  */
     66 #define DRM_TIMESTAMP_MAXRETRIES 3
     67 
     68 /* Threshold in nanoseconds for detection of redundant
     69  * vblank irq in drm_handle_vblank(). 1 msec should be ok.
     70  */
     71 #define DRM_REDUNDANT_VBLIRQ_THRESH_NS 1000000
     72 
     73 /**
     74  * Get interrupt from bus id.
     75  *
     76  * \param inode device inode.
     77  * \param file_priv DRM file private.
     78  * \param cmd command.
     79  * \param arg user argument, pointing to a drm_irq_busid structure.
     80  * \return zero on success or a negative number on failure.
     81  *
     82  * Finds the PCI device with the specified bus id and gets its IRQ number.
     83  * This IOCTL is deprecated, and will now return EINVAL for any busid not equal
     84  * to that of the device that this DRM instance attached to.
     85  */
     86 int drm_irq_by_busid(struct drm_device *dev, void *data,
     87 		     struct drm_file *file_priv)
     88 {
     89 	struct drm_irq_busid *p = data;
     90 
     91 	if (!dev->driver->bus->irq_by_busid)
     92 		return -EINVAL;
     93 
     94 	if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
     95 		return -EINVAL;
     96 
     97 	return dev->driver->bus->irq_by_busid(dev, p);
     98 }
     99 
    100 /*
    101  * Clear vblank timestamp buffer for a crtc.
    102  */
    103 static void clear_vblank_timestamps(struct drm_device *dev, int crtc)
    104 {
    105 	memset(dev->vblank[crtc].time, 0, sizeof(dev->vblank[crtc].time));
    106 }
    107 
    108 /*
    109  * Disable vblank irq's on crtc, make sure that last vblank count
    110  * of hardware and corresponding consistent software vblank counter
    111  * are preserved, even if there are any spurious vblank irq's after
    112  * disable.
    113  */
    114 static void vblank_disable_and_save(struct drm_device *dev, int crtc)
    115 {
    116 	unsigned long irqflags;
    117 	u32 vblcount;
    118 	s64 diff_ns;
    119 	int vblrc;
    120 	struct timeval tvblank;
    121 	int count = DRM_TIMESTAMP_MAXRETRIES;
    122 
    123 	/* Prevent vblank irq processing while disabling vblank irqs,
    124 	 * so no updates of timestamps or count can happen after we've
    125 	 * disabled. Needed to prevent races in case of delayed irq's.
    126 	 */
    127 	spin_lock_irqsave(&dev->vblank_time_lock, irqflags);
    128 
    129 	dev->driver->disable_vblank(dev, crtc);
    130 	dev->vblank[crtc].enabled = false;
    131 
    132 	/* No further vblank irq's will be processed after
    133 	 * this point. Get current hardware vblank count and
    134 	 * vblank timestamp, repeat until they are consistent.
    135 	 *
    136 	 * FIXME: There is still a race condition here and in
    137 	 * drm_update_vblank_count() which can cause off-by-one
    138 	 * reinitialization of software vblank counter. If gpu
    139 	 * vblank counter doesn't increment exactly at the leading
    140 	 * edge of a vblank interval, then we can lose 1 count if
    141 	 * we happen to execute between start of vblank and the
    142 	 * delayed gpu counter increment.
    143 	 */
    144 	do {
    145 		dev->vblank[crtc].last = dev->driver->get_vblank_counter(dev, crtc);
    146 		vblrc = drm_get_last_vbltimestamp(dev, crtc, &tvblank, 0);
    147 	} while (dev->vblank[crtc].last != dev->driver->get_vblank_counter(dev, crtc) && (--count) && vblrc);
    148 
    149 	if (!count)
    150 		vblrc = 0;
    151 
    152 	/* Compute time difference to stored timestamp of last vblank
    153 	 * as updated by last invocation of drm_handle_vblank() in vblank irq.
    154 	 */
    155 	vblcount = atomic_read(&dev->vblank[crtc].count);
    156 	diff_ns = timeval_to_ns(&tvblank) -
    157 		  timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount));
    158 
    159 	/* If there is at least 1 msec difference between the last stored
    160 	 * timestamp and tvblank, then we are currently executing our
    161 	 * disable inside a new vblank interval, the tvblank timestamp
    162 	 * corresponds to this new vblank interval and the irq handler
    163 	 * for this vblank didn't run yet and won't run due to our disable.
    164 	 * Therefore we need to do the job of drm_handle_vblank() and
    165 	 * increment the vblank counter by one to account for this vblank.
    166 	 *
    167 	 * Skip this step if there isn't any high precision timestamp
    168 	 * available. In that case we can't account for this and just
    169 	 * hope for the best.
    170 	 */
    171 	if ((vblrc > 0) && (abs64(diff_ns) > 1000000)) {
    172 		atomic_inc(&dev->vblank[crtc].count);
    173 		smp_mb__after_atomic_inc();
    174 	}
    175 
    176 	/* Invalidate all timestamps while vblank irq's are off. */
    177 	clear_vblank_timestamps(dev, crtc);
    178 
    179 	spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
    180 }
    181 
    182 static void vblank_disable_fn(unsigned long arg)
    183 {
    184 	struct drm_device *dev = (struct drm_device *)arg;
    185 	unsigned long irqflags;
    186 	int i;
    187 
    188 	if (!dev->vblank_disable_allowed)
    189 		return;
    190 
    191 	for (i = 0; i < dev->num_crtcs; i++) {
    192 		spin_lock_irqsave(&dev->vbl_lock, irqflags);
    193 		if (atomic_read(&dev->vblank[i].refcount) == 0 &&
    194 		    dev->vblank[i].enabled) {
    195 			DRM_DEBUG("disabling vblank on crtc %d\n", i);
    196 			vblank_disable_and_save(dev, i);
    197 		}
    198 		spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
    199 	}
    200 }
    201 
    202 void drm_vblank_cleanup(struct drm_device *dev)
    203 {
    204 	/* Bail if the driver didn't call drm_vblank_init() */
    205 	if (dev->num_crtcs == 0)
    206 		return;
    207 
    208 	del_timer_sync(&dev->vblank_disable_timer);
    209 #ifdef __NetBSD__
    210 	teardown_timer(&dev->vblank_disable_timer);
    211 #endif
    212 
    213 	vblank_disable_fn((unsigned long)dev);
    214 
    215 #ifdef __NetBSD__
    216     {
    217 	unsigned int i;
    218 	for (i = 0; i < dev->num_crtcs; i++)
    219 		DRM_DESTROY_WAITQUEUE(&dev->vblank[i].queue);
    220     }
    221 #endif
    222 
    223 	kfree(dev->vblank);
    224 
    225 	dev->num_crtcs = 0;
    226 
    227 #ifdef __NetBSD__
    228 	spin_lock_destroy(&dev->vblank_time_lock);
    229 	spin_lock_destroy(&dev->vbl_lock);
    230 #endif
    231 }
    232 EXPORT_SYMBOL(drm_vblank_cleanup);
    233 
    234 int drm_vblank_init(struct drm_device *dev, int num_crtcs)
    235 {
    236 	int i, ret = -ENOMEM;
    237 
    238 	setup_timer(&dev->vblank_disable_timer, vblank_disable_fn,
    239 		    (unsigned long)dev);
    240 	spin_lock_init(&dev->vbl_lock);
    241 	spin_lock_init(&dev->vblank_time_lock);
    242 
    243 	dev->num_crtcs = num_crtcs;
    244 
    245 	dev->vblank = kcalloc(num_crtcs, sizeof(*dev->vblank), GFP_KERNEL);
    246 	if (!dev->vblank)
    247 		goto err;
    248 
    249 	for (i = 0; i < num_crtcs; i++)
    250 #ifdef __NetBSD__
    251 		DRM_INIT_WAITQUEUE(&dev->vblank[i].queue, "drmvblnq");
    252 #else
    253 		init_waitqueue_head(&dev->vblank[i].queue);
    254 #endif
    255 
    256 	DRM_INFO("Supports vblank timestamp caching Rev 2 (21.10.2013).\n");
    257 
    258 	/* Driver specific high-precision vblank timestamping supported? */
    259 	if (dev->driver->get_vblank_timestamp)
    260 		DRM_INFO("Driver supports precise vblank timestamp query.\n");
    261 	else
    262 		DRM_INFO("No driver support for vblank timestamp query.\n");
    263 
    264 	dev->vblank_disable_allowed = false;
    265 
    266 	return 0;
    267 
    268 err:
    269 	drm_vblank_cleanup(dev);
    270 	return ret;
    271 }
    272 EXPORT_SYMBOL(drm_vblank_init);
    273 
    274 static void drm_irq_vgaarb_nokms(void *cookie, bool state)
    275 {
    276 	struct drm_device *dev = cookie;
    277 
    278 	if (dev->driver->vgaarb_irq) {
    279 		dev->driver->vgaarb_irq(dev, state);
    280 		return;
    281 	}
    282 
    283 	if (!dev->irq_enabled)
    284 		return;
    285 
    286 	if (state) {
    287 		if (dev->driver->irq_uninstall)
    288 			dev->driver->irq_uninstall(dev);
    289 	} else {
    290 		if (dev->driver->irq_preinstall)
    291 			dev->driver->irq_preinstall(dev);
    292 		if (dev->driver->irq_postinstall)
    293 			dev->driver->irq_postinstall(dev);
    294 	}
    295 }
    296 
    297 /**
    298  * Install IRQ handler.
    299  *
    300  * \param dev DRM device.
    301  *
    302  * Initializes the IRQ related data. Installs the handler, calling the driver
    303  * \c irq_preinstall() and \c irq_postinstall() functions
    304  * before and after the installation.
    305  */
    306 int drm_irq_install(struct drm_device *dev)
    307 {
    308 	int ret;
    309 	unsigned long sh_flags = 0;
    310 	const char *irqname;
    311 
    312 	if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
    313 		return -EINVAL;
    314 
    315 	if (drm_dev_to_irq(dev) == 0)
    316 		return -EINVAL;
    317 
    318 	mutex_lock(&dev->struct_mutex);
    319 
    320 	/* Driver must have been initialized */
    321 	if (!dev->dev_private) {
    322 		mutex_unlock(&dev->struct_mutex);
    323 		return -EINVAL;
    324 	}
    325 
    326 	if (dev->irq_enabled) {
    327 		mutex_unlock(&dev->struct_mutex);
    328 		return -EBUSY;
    329 	}
    330 	dev->irq_enabled = true;
    331 	mutex_unlock(&dev->struct_mutex);
    332 
    333 	DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev));
    334 
    335 	/* Before installing handler */
    336 	if (dev->driver->irq_preinstall)
    337 		dev->driver->irq_preinstall(dev);
    338 
    339 	/* Install handler */
    340 	if (drm_core_check_feature(dev, DRIVER_IRQ_SHARED))
    341 		sh_flags = IRQF_SHARED;
    342 
    343 	if (dev->devname)
    344 		irqname = dev->devname;
    345 	else
    346 		irqname = dev->driver->name;
    347 
    348 #ifdef __NetBSD__
    349 	ret = (*dev->driver->bus->irq_install)(dev, dev->driver->irq_handler,
    350 	    sh_flags, irqname, dev, &dev->irq_cookie);
    351 #else
    352 	ret = request_irq(drm_dev_to_irq(dev), dev->driver->irq_handler,
    353 			  sh_flags, irqname, dev);
    354 #endif
    355 
    356 	if (ret < 0) {
    357 		mutex_lock(&dev->struct_mutex);
    358 		dev->irq_enabled = false;
    359 		mutex_unlock(&dev->struct_mutex);
    360 		return ret;
    361 	}
    362 
    363 	if (!drm_core_check_feature(dev, DRIVER_MODESET))
    364 		vga_client_register(dev->pdev, (void *)dev, drm_irq_vgaarb_nokms, NULL);
    365 
    366 	/* After installing handler */
    367 	if (dev->driver->irq_postinstall)
    368 		ret = dev->driver->irq_postinstall(dev);
    369 
    370 	if (ret < 0) {
    371 		mutex_lock(&dev->struct_mutex);
    372 		dev->irq_enabled = false;
    373 		mutex_unlock(&dev->struct_mutex);
    374 		if (!drm_core_check_feature(dev, DRIVER_MODESET))
    375 			vga_client_register(dev->pdev, NULL, NULL, NULL);
    376 #ifdef __NetBSD__
    377 		(*dev->driver->bus->irq_uninstall)(dev, dev->irq_cookie);
    378 #else
    379 		free_irq(drm_dev_to_irq(dev), dev);
    380 #endif
    381 	}
    382 
    383 	return ret;
    384 }
    385 EXPORT_SYMBOL(drm_irq_install);
    386 
    387 /**
    388  * Uninstall the IRQ handler.
    389  *
    390  * \param dev DRM device.
    391  *
    392  * Calls the driver's \c irq_uninstall() function, and stops the irq.
    393  */
    394 int drm_irq_uninstall(struct drm_device *dev)
    395 {
    396 	unsigned long irqflags;
    397 	bool irq_enabled;
    398 	int i;
    399 
    400 	if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
    401 		return -EINVAL;
    402 
    403 	mutex_lock(&dev->struct_mutex);
    404 	irq_enabled = dev->irq_enabled;
    405 	dev->irq_enabled = false;
    406 	mutex_unlock(&dev->struct_mutex);
    407 
    408 	/*
    409 	 * Wake up any waiters so they don't hang.
    410 	 */
    411 	if (dev->num_crtcs) {
    412 		spin_lock_irqsave(&dev->vbl_lock, irqflags);
    413 		for (i = 0; i < dev->num_crtcs; i++) {
    414 #ifdef __NetBSD__
    415 			DRM_SPIN_WAKEUP_ONE(&dev->vblank[i].queue,
    416 			    &dev->vbl_lock);
    417 #else
    418 			wake_up(&dev->vblank[i].queue);
    419 #endif
    420 			dev->vblank[i].enabled = false;
    421 			dev->vblank[i].last =
    422 				dev->driver->get_vblank_counter(dev, i);
    423 		}
    424 		spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
    425 	}
    426 
    427 	if (!irq_enabled)
    428 		return -EINVAL;
    429 
    430 	DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev));
    431 
    432 	if (!drm_core_check_feature(dev, DRIVER_MODESET))
    433 		vga_client_register(dev->pdev, NULL, NULL, NULL);
    434 
    435 	if (dev->driver->irq_uninstall)
    436 		dev->driver->irq_uninstall(dev);
    437 
    438 #ifdef __NetBSD__
    439 	(*dev->driver->bus->irq_uninstall)(dev, dev->irq_cookie);
    440 #else
    441 	free_irq(drm_dev_to_irq(dev), dev);
    442 #endif
    443 
    444 	return 0;
    445 }
    446 EXPORT_SYMBOL(drm_irq_uninstall);
    447 
    448 /**
    449  * IRQ control ioctl.
    450  *
    451  * \param inode device inode.
    452  * \param file_priv DRM file private.
    453  * \param cmd command.
    454  * \param arg user argument, pointing to a drm_control structure.
    455  * \return zero on success or a negative number on failure.
    456  *
    457  * Calls irq_install() or irq_uninstall() according to \p arg.
    458  */
    459 int drm_control(struct drm_device *dev, void *data,
    460 		struct drm_file *file_priv)
    461 {
    462 	struct drm_control *ctl = data;
    463 
    464 	/* if we haven't irq we fallback for compatibility reasons -
    465 	 * this used to be a separate function in drm_dma.h
    466 	 */
    467 
    468 
    469 	switch (ctl->func) {
    470 	case DRM_INST_HANDLER:
    471 		if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
    472 			return 0;
    473 		if (drm_core_check_feature(dev, DRIVER_MODESET))
    474 			return 0;
    475 		if (dev->if_version < DRM_IF_VERSION(1, 2) &&
    476 		    ctl->irq != drm_dev_to_irq(dev))
    477 			return -EINVAL;
    478 		return drm_irq_install(dev);
    479 	case DRM_UNINST_HANDLER:
    480 		if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
    481 			return 0;
    482 		if (drm_core_check_feature(dev, DRIVER_MODESET))
    483 			return 0;
    484 		return drm_irq_uninstall(dev);
    485 	default:
    486 		return -EINVAL;
    487 	}
    488 }
    489 
    490 /**
    491  * drm_calc_timestamping_constants - Calculate vblank timestamp constants
    492  *
    493  * @crtc drm_crtc whose timestamp constants should be updated.
    494  * @mode display mode containing the scanout timings
    495  *
    496  * Calculate and store various constants which are later
    497  * needed by vblank and swap-completion timestamping, e.g,
    498  * by drm_calc_vbltimestamp_from_scanoutpos(). They are
    499  * derived from crtc's true scanout timing, so they take
    500  * things like panel scaling or other adjustments into account.
    501  */
    502 void drm_calc_timestamping_constants(struct drm_crtc *crtc,
    503 				     const struct drm_display_mode *mode)
    504 {
    505 	int linedur_ns = 0, pixeldur_ns = 0, framedur_ns = 0;
    506 	int dotclock = mode->crtc_clock;
    507 
    508 	/* Valid dotclock? */
    509 	if (dotclock > 0) {
    510 		int frame_size = mode->crtc_htotal * mode->crtc_vtotal;
    511 
    512 		/*
    513 		 * Convert scanline length in pixels and video
    514 		 * dot clock to line duration, frame duration
    515 		 * and pixel duration in nanoseconds:
    516 		 */
    517 		pixeldur_ns = 1000000 / dotclock;
    518 		linedur_ns  = div_u64((u64) mode->crtc_htotal * 1000000, dotclock);
    519 		framedur_ns = div_u64((u64) frame_size * 1000000, dotclock);
    520 
    521 		/*
    522 		 * Fields of interlaced scanout modes are only half a frame duration.
    523 		 */
    524 		if (mode->flags & DRM_MODE_FLAG_INTERLACE)
    525 			framedur_ns /= 2;
    526 	} else
    527 		DRM_ERROR("crtc %d: Can't calculate constants, dotclock = 0!\n",
    528 			  crtc->base.id);
    529 
    530 	crtc->pixeldur_ns = pixeldur_ns;
    531 	crtc->linedur_ns  = linedur_ns;
    532 	crtc->framedur_ns = framedur_ns;
    533 
    534 	DRM_DEBUG("crtc %d: hwmode: htotal %d, vtotal %d, vdisplay %d\n",
    535 		  crtc->base.id, mode->crtc_htotal,
    536 		  mode->crtc_vtotal, mode->crtc_vdisplay);
    537 	DRM_DEBUG("crtc %d: clock %d kHz framedur %d linedur %d, pixeldur %d\n",
    538 		  crtc->base.id, dotclock, framedur_ns,
    539 		  linedur_ns, pixeldur_ns);
    540 }
    541 EXPORT_SYMBOL(drm_calc_timestamping_constants);
    542 
    543 /**
    544  * drm_calc_vbltimestamp_from_scanoutpos - helper routine for kms
    545  * drivers. Implements calculation of exact vblank timestamps from
    546  * given drm_display_mode timings and current video scanout position
    547  * of a crtc. This can be called from within get_vblank_timestamp()
    548  * implementation of a kms driver to implement the actual timestamping.
    549  *
    550  * Should return timestamps conforming to the OML_sync_control OpenML
    551  * extension specification. The timestamp corresponds to the end of
    552  * the vblank interval, aka start of scanout of topmost-leftmost display
    553  * pixel in the following video frame.
    554  *
    555  * Requires support for optional dev->driver->get_scanout_position()
    556  * in kms driver, plus a bit of setup code to provide a drm_display_mode
    557  * that corresponds to the true scanout timing.
    558  *
    559  * The current implementation only handles standard video modes. It
    560  * returns as no operation if a doublescan or interlaced video mode is
    561  * active. Higher level code is expected to handle this.
    562  *
    563  * @dev: DRM device.
    564  * @crtc: Which crtc's vblank timestamp to retrieve.
    565  * @max_error: Desired maximum allowable error in timestamps (nanosecs).
    566  *             On return contains true maximum error of timestamp.
    567  * @vblank_time: Pointer to struct timeval which should receive the timestamp.
    568  * @flags: Flags to pass to driver:
    569  *         0 = Default.
    570  *         DRM_CALLED_FROM_VBLIRQ = If function is called from vbl irq handler.
    571  * @refcrtc: drm_crtc* of crtc which defines scanout timing.
    572  * @mode: mode which defines the scanout timings
    573  *
    574  * Returns negative value on error, failure or if not supported in current
    575  * video mode:
    576  *
    577  * -EINVAL   - Invalid crtc.
    578  * -EAGAIN   - Temporary unavailable, e.g., called before initial modeset.
    579  * -ENOTSUPP - Function not supported in current display mode.
    580  * -EIO      - Failed, e.g., due to failed scanout position query.
    581  *
    582  * Returns or'ed positive status flags on success:
    583  *
    584  * DRM_VBLANKTIME_SCANOUTPOS_METHOD - Signal this method used for timestamping.
    585  * DRM_VBLANKTIME_INVBL - Timestamp taken while scanout was in vblank interval.
    586  *
    587  */
    588 int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc,
    589 					  int *max_error,
    590 					  struct timeval *vblank_time,
    591 					  unsigned flags,
    592 					  const struct drm_crtc *refcrtc,
    593 					  const struct drm_display_mode *mode)
    594 {
    595 	ktime_t stime, etime, mono_time_offset;
    596 	struct timeval tv_etime;
    597 	int vbl_status;
    598 	int vpos, hpos, i;
    599 	int framedur_ns, linedur_ns, pixeldur_ns, delta_ns, duration_ns;
    600 	bool invbl;
    601 
    602 	if (crtc < 0 || crtc >= dev->num_crtcs) {
    603 		DRM_ERROR("Invalid crtc %d\n", crtc);
    604 		return -EINVAL;
    605 	}
    606 
    607 	/* Scanout position query not supported? Should not happen. */
    608 	if (!dev->driver->get_scanout_position) {
    609 		DRM_ERROR("Called from driver w/o get_scanout_position()!?\n");
    610 		return -EIO;
    611 	}
    612 
    613 	/* Durations of frames, lines, pixels in nanoseconds. */
    614 	framedur_ns = refcrtc->framedur_ns;
    615 	linedur_ns  = refcrtc->linedur_ns;
    616 	pixeldur_ns = refcrtc->pixeldur_ns;
    617 
    618 	/* If mode timing undefined, just return as no-op:
    619 	 * Happens during initial modesetting of a crtc.
    620 	 */
    621 	if (framedur_ns == 0) {
    622 		DRM_DEBUG("crtc %d: Noop due to uninitialized mode.\n", crtc);
    623 		return -EAGAIN;
    624 	}
    625 
    626 	/* Get current scanout position with system timestamp.
    627 	 * Repeat query up to DRM_TIMESTAMP_MAXRETRIES times
    628 	 * if single query takes longer than max_error nanoseconds.
    629 	 *
    630 	 * This guarantees a tight bound on maximum error if
    631 	 * code gets preempted or delayed for some reason.
    632 	 */
    633 	for (i = 0; i < DRM_TIMESTAMP_MAXRETRIES; i++) {
    634 		/*
    635 		 * Get vertical and horizontal scanout position vpos, hpos,
    636 		 * and bounding timestamps stime, etime, pre/post query.
    637 		 */
    638 		vbl_status = dev->driver->get_scanout_position(dev, crtc, flags, &vpos,
    639 							       &hpos, &stime, &etime);
    640 
    641 		/*
    642 		 * Get correction for CLOCK_MONOTONIC -> CLOCK_REALTIME if
    643 		 * CLOCK_REALTIME is requested.
    644 		 */
    645 		if (!drm_timestamp_monotonic)
    646 			mono_time_offset = ktime_get_monotonic_offset();
    647 
    648 		/* Return as no-op if scanout query unsupported or failed. */
    649 		if (!(vbl_status & DRM_SCANOUTPOS_VALID)) {
    650 			DRM_DEBUG("crtc %d : scanoutpos query failed [%d].\n",
    651 				  crtc, vbl_status);
    652 			return -EIO;
    653 		}
    654 
    655 		/* Compute uncertainty in timestamp of scanout position query. */
    656 		duration_ns = ktime_to_ns(etime) - ktime_to_ns(stime);
    657 
    658 		/* Accept result with <  max_error nsecs timing uncertainty. */
    659 		if (duration_ns <= *max_error)
    660 			break;
    661 	}
    662 
    663 	/* Noisy system timing? */
    664 	if (i == DRM_TIMESTAMP_MAXRETRIES) {
    665 		DRM_DEBUG("crtc %d: Noisy timestamp %d us > %d us [%d reps].\n",
    666 			  crtc, duration_ns/1000, *max_error/1000, i);
    667 	}
    668 
    669 	/* Return upper bound of timestamp precision error. */
    670 	*max_error = duration_ns;
    671 
    672 	/* Check if in vblank area:
    673 	 * vpos is >=0 in video scanout area, but negative
    674 	 * within vblank area, counting down the number of lines until
    675 	 * start of scanout.
    676 	 */
    677 	invbl = vbl_status & DRM_SCANOUTPOS_INVBL;
    678 
    679 	/* Convert scanout position into elapsed time at raw_time query
    680 	 * since start of scanout at first display scanline. delta_ns
    681 	 * can be negative if start of scanout hasn't happened yet.
    682 	 */
    683 	delta_ns = vpos * linedur_ns + hpos * pixeldur_ns;
    684 
    685 	if (!drm_timestamp_monotonic)
    686 		etime = ktime_sub(etime, mono_time_offset);
    687 
    688 	/* save this only for debugging purposes */
    689 	tv_etime = ktime_to_timeval(etime);
    690 	/* Subtract time delta from raw timestamp to get final
    691 	 * vblank_time timestamp for end of vblank.
    692 	 */
    693 	if (delta_ns < 0)
    694 		etime = ktime_add_ns(etime, -delta_ns);
    695 	else
    696 		etime = ktime_sub_ns(etime, delta_ns);
    697 	*vblank_time = ktime_to_timeval(etime);
    698 
    699 	DRM_DEBUG("crtc %d : v %d p(%d,%d)@ %ld.%ld -> %ld.%ld [e %d us, %d rep]\n",
    700 		  crtc, (int)vbl_status, hpos, vpos,
    701 		  (long)tv_etime.tv_sec, (long)tv_etime.tv_usec,
    702 		  (long)vblank_time->tv_sec, (long)vblank_time->tv_usec,
    703 		  duration_ns/1000, i);
    704 
    705 	vbl_status = DRM_VBLANKTIME_SCANOUTPOS_METHOD;
    706 	if (invbl)
    707 		vbl_status |= DRM_VBLANKTIME_INVBL;
    708 
    709 	return vbl_status;
    710 }
    711 EXPORT_SYMBOL(drm_calc_vbltimestamp_from_scanoutpos);
    712 
    713 static struct timeval get_drm_timestamp(void)
    714 {
    715 	ktime_t now;
    716 
    717 	now = ktime_get();
    718 	if (!drm_timestamp_monotonic)
    719 		now = ktime_sub(now, ktime_get_monotonic_offset());
    720 
    721 	return ktime_to_timeval(now);
    722 }
    723 
    724 /**
    725  * drm_get_last_vbltimestamp - retrieve raw timestamp for the most recent
    726  * vblank interval.
    727  *
    728  * @dev: DRM device
    729  * @crtc: which crtc's vblank timestamp to retrieve
    730  * @tvblank: Pointer to target struct timeval which should receive the timestamp
    731  * @flags: Flags to pass to driver:
    732  *         0 = Default.
    733  *         DRM_CALLED_FROM_VBLIRQ = If function is called from vbl irq handler.
    734  *
    735  * Fetches the system timestamp corresponding to the time of the most recent
    736  * vblank interval on specified crtc. May call into kms-driver to
    737  * compute the timestamp with a high-precision GPU specific method.
    738  *
    739  * Returns zero if timestamp originates from uncorrected do_gettimeofday()
    740  * call, i.e., it isn't very precisely locked to the true vblank.
    741  *
    742  * Returns non-zero if timestamp is considered to be very precise.
    743  */
    744 u32 drm_get_last_vbltimestamp(struct drm_device *dev, int crtc,
    745 			      struct timeval *tvblank, unsigned flags)
    746 {
    747 	int ret;
    748 
    749 	/* Define requested maximum error on timestamps (nanoseconds). */
    750 	int max_error = (int) drm_timestamp_precision * 1000;
    751 
    752 	/* Query driver if possible and precision timestamping enabled. */
    753 	if (dev->driver->get_vblank_timestamp && (max_error > 0)) {
    754 		ret = dev->driver->get_vblank_timestamp(dev, crtc, &max_error,
    755 							tvblank, flags);
    756 		if (ret > 0)
    757 			return (u32) ret;
    758 	}
    759 
    760 	/* GPU high precision timestamp query unsupported or failed.
    761 	 * Return current monotonic/gettimeofday timestamp as best estimate.
    762 	 */
    763 	*tvblank = get_drm_timestamp();
    764 
    765 	return 0;
    766 }
    767 EXPORT_SYMBOL(drm_get_last_vbltimestamp);
    768 
    769 /**
    770  * drm_vblank_count - retrieve "cooked" vblank counter value
    771  * @dev: DRM device
    772  * @crtc: which counter to retrieve
    773  *
    774  * Fetches the "cooked" vblank count value that represents the number of
    775  * vblank events since the system was booted, including lost events due to
    776  * modesetting activity.
    777  */
    778 u32 drm_vblank_count(struct drm_device *dev, int crtc)
    779 {
    780 	return atomic_read(&dev->vblank[crtc].count);
    781 }
    782 EXPORT_SYMBOL(drm_vblank_count);
    783 
    784 /**
    785  * drm_vblank_count_and_time - retrieve "cooked" vblank counter value
    786  * and the system timestamp corresponding to that vblank counter value.
    787  *
    788  * @dev: DRM device
    789  * @crtc: which counter to retrieve
    790  * @vblanktime: Pointer to struct timeval to receive the vblank timestamp.
    791  *
    792  * Fetches the "cooked" vblank count value that represents the number of
    793  * vblank events since the system was booted, including lost events due to
    794  * modesetting activity. Returns corresponding system timestamp of the time
    795  * of the vblank interval that corresponds to the current value vblank counter
    796  * value.
    797  */
    798 u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc,
    799 			      struct timeval *vblanktime)
    800 {
    801 	u32 cur_vblank;
    802 
    803 	/* Read timestamp from slot of _vblank_time ringbuffer
    804 	 * that corresponds to current vblank count. Retry if
    805 	 * count has incremented during readout. This works like
    806 	 * a seqlock.
    807 	 */
    808 	do {
    809 		cur_vblank = atomic_read(&dev->vblank[crtc].count);
    810 		*vblanktime = vblanktimestamp(dev, crtc, cur_vblank);
    811 		smp_rmb();
    812 	} while (cur_vblank != atomic_read(&dev->vblank[crtc].count));
    813 
    814 	return cur_vblank;
    815 }
    816 EXPORT_SYMBOL(drm_vblank_count_and_time);
    817 
    818 static void send_vblank_event(struct drm_device *dev,
    819 		struct drm_pending_vblank_event *e,
    820 		unsigned long seq, struct timeval *now)
    821 {
    822 	WARN_ON_SMP(!spin_is_locked(&dev->event_lock));
    823 	e->event.sequence = seq;
    824 	e->event.tv_sec = now->tv_sec;
    825 	e->event.tv_usec = now->tv_usec;
    826 
    827 	list_add_tail(&e->base.link,
    828 		      &e->base.file_priv->event_list);
    829 #ifdef __NetBSD__
    830 	DRM_SPIN_WAKEUP_ONE(&e->base.file_priv->event_wait, &dev->event_lock);
    831 	selnotify(&e->base.file_priv->event_selq, (POLLIN | POLLRDNORM),
    832 	    NOTE_SUBMIT);
    833 #else
    834 	wake_up_interruptible(&e->base.file_priv->event_wait);
    835 #endif
    836 	trace_drm_vblank_event_delivered(e->base.pid, e->pipe,
    837 					 e->event.sequence);
    838 }
    839 
    840 /**
    841  * drm_send_vblank_event - helper to send vblank event after pageflip
    842  * @dev: DRM device
    843  * @crtc: CRTC in question
    844  * @e: the event to send
    845  *
    846  * Updates sequence # and timestamp on event, and sends it to userspace.
    847  * Caller must hold event lock.
    848  */
    849 void drm_send_vblank_event(struct drm_device *dev, int crtc,
    850 		struct drm_pending_vblank_event *e)
    851 {
    852 	struct timeval now;
    853 	unsigned int seq;
    854 	if (crtc >= 0) {
    855 		seq = drm_vblank_count_and_time(dev, crtc, &now);
    856 	} else {
    857 		seq = 0;
    858 
    859 		now = get_drm_timestamp();
    860 	}
    861 	e->pipe = crtc;
    862 	send_vblank_event(dev, e, seq, &now);
    863 }
    864 EXPORT_SYMBOL(drm_send_vblank_event);
    865 
    866 /**
    867  * drm_update_vblank_count - update the master vblank counter
    868  * @dev: DRM device
    869  * @crtc: counter to update
    870  *
    871  * Call back into the driver to update the appropriate vblank counter
    872  * (specified by @crtc).  Deal with wraparound, if it occurred, and
    873  * update the last read value so we can deal with wraparound on the next
    874  * call if necessary.
    875  *
    876  * Only necessary when going from off->on, to account for frames we
    877  * didn't get an interrupt for.
    878  *
    879  * Note: caller must hold dev->vbl_lock since this reads & writes
    880  * device vblank fields.
    881  */
    882 static void drm_update_vblank_count(struct drm_device *dev, int crtc)
    883 {
    884 	u32 cur_vblank, diff, tslot, rc;
    885 	struct timeval t_vblank;
    886 
    887 	/*
    888 	 * Interrupts were disabled prior to this call, so deal with counter
    889 	 * wrap if needed.
    890 	 * NOTE!  It's possible we lost a full dev->max_vblank_count events
    891 	 * here if the register is small or we had vblank interrupts off for
    892 	 * a long time.
    893 	 *
    894 	 * We repeat the hardware vblank counter & timestamp query until
    895 	 * we get consistent results. This to prevent races between gpu
    896 	 * updating its hardware counter while we are retrieving the
    897 	 * corresponding vblank timestamp.
    898 	 */
    899 	do {
    900 		cur_vblank = dev->driver->get_vblank_counter(dev, crtc);
    901 		rc = drm_get_last_vbltimestamp(dev, crtc, &t_vblank, 0);
    902 	} while (cur_vblank != dev->driver->get_vblank_counter(dev, crtc));
    903 
    904 	/* Deal with counter wrap */
    905 	diff = cur_vblank - dev->vblank[crtc].last;
    906 	if (cur_vblank < dev->vblank[crtc].last) {
    907 		diff += dev->max_vblank_count;
    908 
    909 		DRM_DEBUG("last_vblank[%d]=0x%x, cur_vblank=0x%x => diff=0x%x\n",
    910 			  crtc, dev->vblank[crtc].last, cur_vblank, diff);
    911 	}
    912 
    913 	DRM_DEBUG("enabling vblank interrupts on crtc %d, missed %d\n",
    914 		  crtc, diff);
    915 
    916 	/* Reinitialize corresponding vblank timestamp if high-precision query
    917 	 * available. Skip this step if query unsupported or failed. Will
    918 	 * reinitialize delayed at next vblank interrupt in that case.
    919 	 */
    920 	if (rc) {
    921 		tslot = atomic_read(&dev->vblank[crtc].count) + diff;
    922 		vblanktimestamp(dev, crtc, tslot) = t_vblank;
    923 	}
    924 
    925 	smp_mb__before_atomic_inc();
    926 	atomic_add(diff, &dev->vblank[crtc].count);
    927 	smp_mb__after_atomic_inc();
    928 }
    929 
    930 /**
    931  * drm_vblank_get - get a reference count on vblank events
    932  * @dev: DRM device
    933  * @crtc: which CRTC to own
    934  *
    935  * Acquire a reference count on vblank events to avoid having them disabled
    936  * while in use.
    937  *
    938  * RETURNS
    939  * Zero on success, nonzero on failure.
    940  */
    941 int drm_vblank_get(struct drm_device *dev, int crtc)
    942 {
    943 	unsigned long irqflags, irqflags2;
    944 	int ret = 0;
    945 
    946 	spin_lock_irqsave(&dev->vbl_lock, irqflags);
    947 	/* Going from 0->1 means we have to enable interrupts again */
    948 	if (atomic_add_return(1, &dev->vblank[crtc].refcount) == 1) {
    949 		spin_lock_irqsave(&dev->vblank_time_lock, irqflags2);
    950 		if (!dev->vblank[crtc].enabled) {
    951 			/* Enable vblank irqs under vblank_time_lock protection.
    952 			 * All vblank count & timestamp updates are held off
    953 			 * until we are done reinitializing master counter and
    954 			 * timestamps. Filtercode in drm_handle_vblank() will
    955 			 * prevent double-accounting of same vblank interval.
    956 			 */
    957 			ret = dev->driver->enable_vblank(dev, crtc);
    958 			DRM_DEBUG("enabling vblank on crtc %d, ret: %d\n",
    959 				  crtc, ret);
    960 			if (ret)
    961 				atomic_dec(&dev->vblank[crtc].refcount);
    962 			else {
    963 				dev->vblank[crtc].enabled = true;
    964 				drm_update_vblank_count(dev, crtc);
    965 			}
    966 		}
    967 		spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags2);
    968 	} else {
    969 		if (!dev->vblank[crtc].enabled) {
    970 			atomic_dec(&dev->vblank[crtc].refcount);
    971 			ret = -EINVAL;
    972 		}
    973 	}
    974 	spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
    975 
    976 	return ret;
    977 }
    978 EXPORT_SYMBOL(drm_vblank_get);
    979 
    980 /**
    981  * drm_vblank_put - give up ownership of vblank events
    982  * @dev: DRM device
    983  * @crtc: which counter to give up
    984  *
    985  * Release ownership of a given vblank counter, turning off interrupts
    986  * if possible. Disable interrupts after drm_vblank_offdelay milliseconds.
    987  */
    988 void drm_vblank_put(struct drm_device *dev, int crtc)
    989 {
    990 	BUG_ON(atomic_read(&dev->vblank[crtc].refcount) == 0);
    991 
    992 	/* Last user schedules interrupt disable */
    993 	if (atomic_dec_and_test(&dev->vblank[crtc].refcount) &&
    994 	    (drm_vblank_offdelay > 0))
    995 		mod_timer(&dev->vblank_disable_timer,
    996 			  jiffies + ((drm_vblank_offdelay * HZ)/1000));
    997 }
    998 EXPORT_SYMBOL(drm_vblank_put);
    999 
   1000 /**
   1001  * drm_vblank_off - disable vblank events on a CRTC
   1002  * @dev: DRM device
   1003  * @crtc: CRTC in question
   1004  *
   1005  * Caller must hold event lock.
   1006  */
   1007 void drm_vblank_off(struct drm_device *dev, int crtc)
   1008 {
   1009 	struct drm_pending_vblank_event *e, *t;
   1010 	struct timeval now;
   1011 	unsigned long irqflags;
   1012 	unsigned int seq;
   1013 
   1014 	spin_lock_irqsave(&dev->vbl_lock, irqflags);
   1015 	vblank_disable_and_save(dev, crtc);
   1016 #ifdef __NetBSD__
   1017 	DRM_SPIN_WAKEUP_ONE(&dev->vblank[crtc].queue, &dev->vbl_lock);
   1018 #else
   1019 	wake_up(&dev->vblank[crtc].queue);
   1020 #endif
   1021 
   1022 	/* Send any queued vblank events, lest the natives grow disquiet */
   1023 	seq = drm_vblank_count_and_time(dev, crtc, &now);
   1024 
   1025 	spin_lock(&dev->event_lock);
   1026 	list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) {
   1027 		if (e->pipe != crtc)
   1028 			continue;
   1029 		DRM_DEBUG("Sending premature vblank event on disable: \
   1030 			  wanted %d, current %d\n",
   1031 			  e->event.sequence, seq);
   1032 		list_del(&e->base.link);
   1033 		drm_vblank_put(dev, e->pipe);
   1034 		send_vblank_event(dev, e, seq, &now);
   1035 	}
   1036 	spin_unlock(&dev->event_lock);
   1037 
   1038 	spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
   1039 }
   1040 EXPORT_SYMBOL(drm_vblank_off);
   1041 
   1042 /**
   1043  * drm_vblank_pre_modeset - account for vblanks across mode sets
   1044  * @dev: DRM device
   1045  * @crtc: CRTC in question
   1046  *
   1047  * Account for vblank events across mode setting events, which will likely
   1048  * reset the hardware frame counter.
   1049  */
   1050 void drm_vblank_pre_modeset(struct drm_device *dev, int crtc)
   1051 {
   1052 	/* vblank is not initialized (IRQ not installed ?), or has been freed */
   1053 	if (!dev->num_crtcs)
   1054 		return;
   1055 	/*
   1056 	 * To avoid all the problems that might happen if interrupts
   1057 	 * were enabled/disabled around or between these calls, we just
   1058 	 * have the kernel take a reference on the CRTC (just once though
   1059 	 * to avoid corrupting the count if multiple, mismatch calls occur),
   1060 	 * so that interrupts remain enabled in the interim.
   1061 	 */
   1062 	if (!dev->vblank[crtc].inmodeset) {
   1063 		dev->vblank[crtc].inmodeset = 0x1;
   1064 		if (drm_vblank_get(dev, crtc) == 0)
   1065 			dev->vblank[crtc].inmodeset |= 0x2;
   1066 	}
   1067 }
   1068 EXPORT_SYMBOL(drm_vblank_pre_modeset);
   1069 
   1070 void drm_vblank_post_modeset(struct drm_device *dev, int crtc)
   1071 {
   1072 	unsigned long irqflags;
   1073 
   1074 	/* vblank is not initialized (IRQ not installed ?), or has been freed */
   1075 	if (!dev->num_crtcs)
   1076 		return;
   1077 
   1078 	if (dev->vblank[crtc].inmodeset) {
   1079 		spin_lock_irqsave(&dev->vbl_lock, irqflags);
   1080 		dev->vblank_disable_allowed = true;
   1081 		spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
   1082 
   1083 		if (dev->vblank[crtc].inmodeset & 0x2)
   1084 			drm_vblank_put(dev, crtc);
   1085 
   1086 		dev->vblank[crtc].inmodeset = 0;
   1087 	}
   1088 }
   1089 EXPORT_SYMBOL(drm_vblank_post_modeset);
   1090 
   1091 /**
   1092  * drm_modeset_ctl - handle vblank event counter changes across mode switch
   1093  * @DRM_IOCTL_ARGS: standard ioctl arguments
   1094  *
   1095  * Applications should call the %_DRM_PRE_MODESET and %_DRM_POST_MODESET
   1096  * ioctls around modesetting so that any lost vblank events are accounted for.
   1097  *
   1098  * Generally the counter will reset across mode sets.  If interrupts are
   1099  * enabled around this call, we don't have to do anything since the counter
   1100  * will have already been incremented.
   1101  */
   1102 int drm_modeset_ctl(struct drm_device *dev, void *data,
   1103 		    struct drm_file *file_priv)
   1104 {
   1105 	struct drm_modeset_ctl *modeset = data;
   1106 	unsigned int crtc;
   1107 
   1108 	/* If drm_vblank_init() hasn't been called yet, just no-op */
   1109 	if (!dev->num_crtcs)
   1110 		return 0;
   1111 
   1112 	/* KMS drivers handle this internally */
   1113 	if (drm_core_check_feature(dev, DRIVER_MODESET))
   1114 		return 0;
   1115 
   1116 	crtc = modeset->crtc;
   1117 	if (crtc >= dev->num_crtcs)
   1118 		return -EINVAL;
   1119 
   1120 	switch (modeset->cmd) {
   1121 	case _DRM_PRE_MODESET:
   1122 		drm_vblank_pre_modeset(dev, crtc);
   1123 		break;
   1124 	case _DRM_POST_MODESET:
   1125 		drm_vblank_post_modeset(dev, crtc);
   1126 		break;
   1127 	default:
   1128 		return -EINVAL;
   1129 	}
   1130 
   1131 	return 0;
   1132 }
   1133 
   1134 static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
   1135 				  union drm_wait_vblank *vblwait,
   1136 				  struct drm_file *file_priv)
   1137 {
   1138 	struct drm_pending_vblank_event *e;
   1139 	struct timeval now;
   1140 	unsigned long flags;
   1141 	unsigned int seq;
   1142 	int ret;
   1143 
   1144 	e = kzalloc(sizeof *e, GFP_KERNEL);
   1145 	if (e == NULL) {
   1146 		ret = -ENOMEM;
   1147 		goto err_put;
   1148 	}
   1149 
   1150 	e->pipe = pipe;
   1151 #ifdef __NetBSD__
   1152 	e->base.pid = curproc->p_pid;
   1153 #else
   1154 	e->base.pid = current->pid;
   1155 #endif
   1156 	e->event.base.type = DRM_EVENT_VBLANK;
   1157 	e->event.base.length = sizeof e->event;
   1158 	e->event.user_data = vblwait->request.signal;
   1159 	e->base.event = &e->event.base;
   1160 	e->base.file_priv = file_priv;
   1161 	e->base.destroy = (void (*) (struct drm_pending_event *)) kfree;
   1162 
   1163 	spin_lock_irqsave(&dev->event_lock, flags);
   1164 
   1165 	if (file_priv->event_space < sizeof e->event) {
   1166 		ret = -EBUSY;
   1167 		goto err_unlock;
   1168 	}
   1169 
   1170 	file_priv->event_space -= sizeof e->event;
   1171 	seq = drm_vblank_count_and_time(dev, pipe, &now);
   1172 
   1173 	if ((vblwait->request.type & _DRM_VBLANK_NEXTONMISS) &&
   1174 	    (seq - vblwait->request.sequence) <= (1 << 23)) {
   1175 		vblwait->request.sequence = seq + 1;
   1176 		vblwait->reply.sequence = vblwait->request.sequence;
   1177 	}
   1178 
   1179 	DRM_DEBUG("event on vblank count %d, current %d, crtc %d\n",
   1180 		  vblwait->request.sequence, seq, pipe);
   1181 
   1182 #ifdef __NetBSD__
   1183 	trace_drm_vblank_event_queued(curproc->p_pid, pipe,
   1184 				      vblwait->request.sequence);
   1185 #else
   1186 	trace_drm_vblank_event_queued(current->pid, pipe,
   1187 				      vblwait->request.sequence);
   1188 #endif
   1189 
   1190 	e->event.sequence = vblwait->request.sequence;
   1191 	if ((seq - vblwait->request.sequence) <= (1 << 23)) {
   1192 		drm_vblank_put(dev, pipe);
   1193 		send_vblank_event(dev, e, seq, &now);
   1194 		vblwait->reply.sequence = seq;
   1195 	} else {
   1196 		/* drm_handle_vblank_events will call drm_vblank_put */
   1197 		list_add_tail(&e->base.link, &dev->vblank_event_list);
   1198 		vblwait->reply.sequence = vblwait->request.sequence;
   1199 	}
   1200 
   1201 	spin_unlock_irqrestore(&dev->event_lock, flags);
   1202 
   1203 	return 0;
   1204 
   1205 err_unlock:
   1206 	spin_unlock_irqrestore(&dev->event_lock, flags);
   1207 	kfree(e);
   1208 err_put:
   1209 	drm_vblank_put(dev, pipe);
   1210 	return ret;
   1211 }
   1212 
   1213 /**
   1214  * Wait for VBLANK.
   1215  *
   1216  * \param inode device inode.
   1217  * \param file_priv DRM file private.
   1218  * \param cmd command.
   1219  * \param data user argument, pointing to a drm_wait_vblank structure.
   1220  * \return zero on success or a negative number on failure.
   1221  *
   1222  * This function enables the vblank interrupt on the pipe requested, then
   1223  * sleeps waiting for the requested sequence number to occur, and drops
   1224  * the vblank interrupt refcount afterwards. (vblank irq disable follows that
   1225  * after a timeout with no further vblank waits scheduled).
   1226  */
   1227 int drm_wait_vblank(struct drm_device *dev, void *data,
   1228 		    struct drm_file *file_priv)
   1229 {
   1230 	union drm_wait_vblank *vblwait = data;
   1231 	int ret;
   1232 	unsigned int flags, seq, crtc, high_crtc;
   1233 
   1234 	if (drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
   1235 		if ((!drm_dev_to_irq(dev)) || (!dev->irq_enabled))
   1236 			return -EINVAL;
   1237 
   1238 	if (vblwait->request.type & _DRM_VBLANK_SIGNAL)
   1239 		return -EINVAL;
   1240 
   1241 	if (vblwait->request.type &
   1242 	    ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK |
   1243 	      _DRM_VBLANK_HIGH_CRTC_MASK)) {
   1244 		DRM_ERROR("Unsupported type value 0x%x, supported mask 0x%x\n",
   1245 			  vblwait->request.type,
   1246 			  (_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK |
   1247 			   _DRM_VBLANK_HIGH_CRTC_MASK));
   1248 		return -EINVAL;
   1249 	}
   1250 
   1251 	flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK;
   1252 	high_crtc = (vblwait->request.type & _DRM_VBLANK_HIGH_CRTC_MASK);
   1253 	if (high_crtc)
   1254 		crtc = high_crtc >> _DRM_VBLANK_HIGH_CRTC_SHIFT;
   1255 	else
   1256 		crtc = flags & _DRM_VBLANK_SECONDARY ? 1 : 0;
   1257 	if (crtc >= dev->num_crtcs)
   1258 		return -EINVAL;
   1259 
   1260 	ret = drm_vblank_get(dev, crtc);
   1261 	if (ret) {
   1262 		DRM_DEBUG("failed to acquire vblank counter, %d\n", ret);
   1263 		return ret;
   1264 	}
   1265 	seq = drm_vblank_count(dev, crtc);
   1266 
   1267 	switch (vblwait->request.type & _DRM_VBLANK_TYPES_MASK) {
   1268 	case _DRM_VBLANK_RELATIVE:
   1269 		vblwait->request.sequence += seq;
   1270 		vblwait->request.type &= ~_DRM_VBLANK_RELATIVE;
   1271 	case _DRM_VBLANK_ABSOLUTE:
   1272 		break;
   1273 	default:
   1274 		ret = -EINVAL;
   1275 		goto done;
   1276 	}
   1277 
   1278 	if (flags & _DRM_VBLANK_EVENT) {
   1279 		/* must hold on to the vblank ref until the event fires
   1280 		 * drm_vblank_put will be called asynchronously
   1281 		 */
   1282 		return drm_queue_vblank_event(dev, crtc, vblwait, file_priv);
   1283 	}
   1284 
   1285 	if ((flags & _DRM_VBLANK_NEXTONMISS) &&
   1286 	    (seq - vblwait->request.sequence) <= (1<<23)) {
   1287 		vblwait->request.sequence = seq + 1;
   1288 	}
   1289 
   1290 	DRM_DEBUG("waiting on vblank count %d, crtc %d\n",
   1291 		  vblwait->request.sequence, crtc);
   1292 	dev->vblank[crtc].last_wait = vblwait->request.sequence;
   1293 #ifdef __NetBSD__
   1294     {
   1295 	unsigned long irqflags;
   1296 	spin_lock_irqsave(&dev->vbl_lock, irqflags);
   1297 	DRM_SPIN_TIMED_WAIT_UNTIL(ret, &dev->vblank[crtc].queue,
   1298 	    &dev->vbl_lock,
   1299 	    (3 * HZ),
   1300 	    (((drm_vblank_count(dev, crtc) -
   1301 		    vblwait->request.sequence) <= (1 << 23)) ||
   1302 		!dev->irq_enabled));
   1303 	spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
   1304 	if (0 < ret)
   1305 		/*
   1306 		 * ret is ticks remaining on success in this case, but
   1307 		 * caller just wants 0 for success.
   1308 		 */
   1309 		ret = 0;
   1310     }
   1311 #else
   1312 	DRM_WAIT_ON(ret, dev->vblank[crtc].queue, 3 * HZ,
   1313 		    (((drm_vblank_count(dev, crtc) -
   1314 		       vblwait->request.sequence) <= (1 << 23)) ||
   1315 		     !dev->irq_enabled));
   1316 #endif
   1317 
   1318 	if (ret != -EINTR) {
   1319 		struct timeval now;
   1320 
   1321 		vblwait->reply.sequence = drm_vblank_count_and_time(dev, crtc, &now);
   1322 		vblwait->reply.tval_sec = now.tv_sec;
   1323 		vblwait->reply.tval_usec = now.tv_usec;
   1324 
   1325 		DRM_DEBUG("returning %d to client\n",
   1326 			  vblwait->reply.sequence);
   1327 	} else {
   1328 		DRM_DEBUG("vblank wait interrupted by signal\n");
   1329 	}
   1330 
   1331 done:
   1332 	drm_vblank_put(dev, crtc);
   1333 	return ret;
   1334 }
   1335 
   1336 static void drm_handle_vblank_events(struct drm_device *dev, int crtc)
   1337 {
   1338 	struct drm_pending_vblank_event *e, *t;
   1339 	struct timeval now;
   1340 	unsigned long flags;
   1341 	unsigned int seq;
   1342 
   1343 	seq = drm_vblank_count_and_time(dev, crtc, &now);
   1344 
   1345 	spin_lock_irqsave(&dev->event_lock, flags);
   1346 
   1347 	list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) {
   1348 		if (e->pipe != crtc)
   1349 			continue;
   1350 		if ((seq - e->event.sequence) > (1<<23))
   1351 			continue;
   1352 
   1353 		DRM_DEBUG("vblank event on %d, current %d\n",
   1354 			  e->event.sequence, seq);
   1355 
   1356 		list_del(&e->base.link);
   1357 		drm_vblank_put(dev, e->pipe);
   1358 		send_vblank_event(dev, e, seq, &now);
   1359 	}
   1360 
   1361 	spin_unlock_irqrestore(&dev->event_lock, flags);
   1362 
   1363 	trace_drm_vblank_event(crtc, seq);
   1364 }
   1365 
   1366 /**
   1367  * drm_handle_vblank - handle a vblank event
   1368  * @dev: DRM device
   1369  * @crtc: where this event occurred
   1370  *
   1371  * Drivers should call this routine in their vblank interrupt handlers to
   1372  * update the vblank counter and send any signals that may be pending.
   1373  */
   1374 bool drm_handle_vblank(struct drm_device *dev, int crtc)
   1375 {
   1376 	u32 vblcount;
   1377 	s64 diff_ns;
   1378 	struct timeval tvblank;
   1379 	unsigned long irqflags;
   1380 #ifdef __NetBSD__		/* XXX vblank locking */
   1381 	unsigned long irqflags_vbl_lock;
   1382 #endif
   1383 
   1384 	if (!dev->num_crtcs)
   1385 		return false;
   1386 
   1387 #ifdef __NetBSD__		/* XXX vblank locking */
   1388 	spin_lock_irqsave(&dev->vbl_lock, irqflags_vbl_lock);
   1389 #endif
   1390 
   1391 	/* Need timestamp lock to prevent concurrent execution with
   1392 	 * vblank enable/disable, as this would cause inconsistent
   1393 	 * or corrupted timestamps and vblank counts.
   1394 	 */
   1395 	spin_lock_irqsave(&dev->vblank_time_lock, irqflags);
   1396 
   1397 	/* Vblank irq handling disabled. Nothing to do. */
   1398 	if (!dev->vblank[crtc].enabled) {
   1399 		spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
   1400 #ifdef __NetBSD__		/* XXX vblank locking */
   1401 		spin_unlock_irqrestore(&dev->vbl_lock, irqflags_vbl_lock);
   1402 #endif
   1403 		return false;
   1404 	}
   1405 
   1406 	/* Fetch corresponding timestamp for this vblank interval from
   1407 	 * driver and store it in proper slot of timestamp ringbuffer.
   1408 	 */
   1409 
   1410 	/* Get current timestamp and count. */
   1411 	vblcount = atomic_read(&dev->vblank[crtc].count);
   1412 	drm_get_last_vbltimestamp(dev, crtc, &tvblank, DRM_CALLED_FROM_VBLIRQ);
   1413 
   1414 	/* Compute time difference to timestamp of last vblank */
   1415 	diff_ns = timeval_to_ns(&tvblank) -
   1416 		  timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount));
   1417 
   1418 	/* Update vblank timestamp and count if at least
   1419 	 * DRM_REDUNDANT_VBLIRQ_THRESH_NS nanoseconds
   1420 	 * difference between last stored timestamp and current
   1421 	 * timestamp. A smaller difference means basically
   1422 	 * identical timestamps. Happens if this vblank has
   1423 	 * been already processed and this is a redundant call,
   1424 	 * e.g., due to spurious vblank interrupts. We need to
   1425 	 * ignore those for accounting.
   1426 	 */
   1427 	if (abs64(diff_ns) > DRM_REDUNDANT_VBLIRQ_THRESH_NS) {
   1428 		/* Store new timestamp in ringbuffer. */
   1429 		vblanktimestamp(dev, crtc, vblcount + 1) = tvblank;
   1430 
   1431 		/* Increment cooked vblank count. This also atomically commits
   1432 		 * the timestamp computed above.
   1433 		 */
   1434 		smp_mb__before_atomic_inc();
   1435 		atomic_inc(&dev->vblank[crtc].count);
   1436 		smp_mb__after_atomic_inc();
   1437 	} else {
   1438 		DRM_DEBUG("crtc %d: Redundant vblirq ignored. diff_ns = %d\n",
   1439 			  crtc, (int) diff_ns);
   1440 	}
   1441 
   1442 #ifdef __NetBSD__
   1443 	DRM_SPIN_WAKEUP_ONE(&dev->vblank[crtc].queue, &dev->vbl_lock);
   1444 #else
   1445 	wake_up(&dev->vblank[crtc].queue);
   1446 #endif
   1447 	drm_handle_vblank_events(dev, crtc);
   1448 
   1449 	spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
   1450 #ifdef __NetBSD__		/* XXX vblank locking */
   1451 	spin_unlock_irqrestore(&dev->vbl_lock, irqflags_vbl_lock);
   1452 #endif
   1453 	return true;
   1454 }
   1455 EXPORT_SYMBOL(drm_handle_vblank);
   1456