]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/gpu/drm/drm_irq.c
drm: Hack around CONFIG_AGP=m build failures
[mirror_ubuntu-bionic-kernel.git] / drivers / gpu / drm / drm_irq.c
CommitLineData
f5752b38
DV
1/*
2 * drm_irq.c IRQ and vblank support
1da177e4
LT
3 *
4 * \author Rickard E. (Rik) Faith <faith@valinux.com>
5 * \author Gareth Hughes <gareth@valinux.com>
6 */
7
8/*
9 * Created: Fri Mar 19 14:30:16 1999 by faith@valinux.com
10 *
11 * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas.
12 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
13 * All Rights Reserved.
14 *
15 * Permission is hereby granted, free of charge, to any person obtaining a
16 * copy of this software and associated documentation files (the "Software"),
17 * to deal in the Software without restriction, including without limitation
18 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
19 * and/or sell copies of the Software, and to permit persons to whom the
20 * Software is furnished to do so, subject to the following conditions:
21 *
22 * The above copyright notice and this permission notice (including the next
23 * paragraph) shall be included in all copies or substantial portions of the
24 * Software.
25 *
26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
29 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
30 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
31 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
32 * OTHER DEALINGS IN THE SOFTWARE.
33 */
34
760285e7 35#include <drm/drmP.h>
ac2874b9 36#include "drm_trace.h"
18882995 37#include "drm_internal.h"
1da177e4
LT
38
39#include <linux/interrupt.h> /* For task queue support */
5a0e3ad6 40#include <linux/slab.h>
1da177e4 41
28d52043 42#include <linux/vgaarb.h>
2d1a8a48 43#include <linux/export.h>
27641c3f
MK
44
45/* Access macro for slots in vblank timestamp ringbuffer. */
cc1ef118
TR
46#define vblanktimestamp(dev, pipe, count) \
47 ((dev)->vblank[pipe].time[(count) % DRM_VBLANKTIME_RBSIZE])
27641c3f
MK
48
49/* Retry timestamp calculation up to 3 times to satisfy
50 * drm_timestamp_precision before giving up.
51 */
52#define DRM_TIMESTAMP_MAXRETRIES 3
53
54/* Threshold in nanoseconds for detection of redundant
55 * vblank irq in drm_handle_vblank(). 1 msec should be ok.
56 */
57#define DRM_REDUNDANT_VBLIRQ_THRESH_NS 1000000
58
fb446a1a 59static bool
cc1ef118 60drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
fb446a1a
DV
61 struct timeval *tvblank, unsigned flags);
62
18882995
DV
63static unsigned int drm_timestamp_precision = 20; /* Default to 20 usecs. */
64
65/*
66 * Default to use monotonic timestamps for wait-for-vblank and page-flip
67 * complete events.
68 */
69unsigned int drm_timestamp_monotonic = 1;
70
71static int drm_vblank_offdelay = 5000; /* Default to 5000 msecs. */
72
73module_param_named(vblankoffdelay, drm_vblank_offdelay, int, 0600);
74module_param_named(timestamp_precision_usec, drm_timestamp_precision, int, 0600);
75module_param_named(timestamp_monotonic, drm_timestamp_monotonic, int, 0600);
76
1da248a5 77static void store_vblank(struct drm_device *dev, unsigned int pipe,
209e4dbc 78 u32 vblank_count_inc,
4dfd6486 79 struct timeval *t_vblank, u32 last)
99264a61 80{
1da248a5 81 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
99264a61
DV
82 u32 tslot;
83
84 assert_spin_locked(&dev->vblank_time_lock);
85
4dfd6486
VS
86 vblank->last = last;
87
1b2eb710
VS
88 /* All writers hold the spinlock, but readers are serialized by
89 * the latching of vblank->count below.
90 */
91 tslot = vblank->count + vblank_count_inc;
92 vblanktimestamp(dev, pipe, tslot) = *t_vblank;
99264a61
DV
93
94 /*
95 * vblank timestamp updates are protected on the write side with
96 * vblank_time_lock, but on the read side done locklessly using a
97 * sequence-lock on the vblank counter. Ensure correct ordering using
98 * memory barrriers. We need the barrier both before and also after the
99 * counter update to synchronize with the next timestamp write.
100 * The read-side barriers for this are in drm_vblank_count_and_time.
101 */
102 smp_wmb();
103 vblank->count += vblank_count_inc;
104 smp_wmb();
105}
106
4dfd6486
VS
107/**
108 * drm_reset_vblank_timestamp - reset the last timestamp to the last vblank
109 * @dev: DRM device
110 * @pipe: index of CRTC for which to reset the timestamp
111 *
112 * Reset the stored timestamp for the current vblank count to correspond
113 * to the last vblank occurred.
114 *
115 * Only to be called from drm_vblank_on().
116 *
117 * Note: caller must hold dev->vbl_lock since this reads & writes
118 * device vblank fields.
119 */
120static void drm_reset_vblank_timestamp(struct drm_device *dev, unsigned int pipe)
121{
122 u32 cur_vblank;
123 bool rc;
124 struct timeval t_vblank;
125 int count = DRM_TIMESTAMP_MAXRETRIES;
126
127 spin_lock(&dev->vblank_time_lock);
128
129 /*
130 * sample the current counter to avoid random jumps
131 * when drm_vblank_enable() applies the diff
132 */
133 do {
134 cur_vblank = dev->driver->get_vblank_counter(dev, pipe);
135 rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, 0);
136 } while (cur_vblank != dev->driver->get_vblank_counter(dev, pipe) && --count > 0);
137
138 /*
139 * Only reinitialize corresponding vblank timestamp if high-precision query
140 * available and didn't fail. Otherwise reinitialize delayed at next vblank
141 * interrupt and assign 0 for now, to mark the vblanktimestamp as invalid.
142 */
143 if (!rc)
144 t_vblank = (struct timeval) {0, 0};
145
146 /*
147 * +1 to make sure user will never see the same
148 * vblank counter value before and after a modeset
149 */
150 store_vblank(dev, pipe, 1, &t_vblank, cur_vblank);
151
152 spin_unlock(&dev->vblank_time_lock);
153}
154
13b030af
VS
155/**
156 * drm_update_vblank_count - update the master vblank counter
157 * @dev: DRM device
cc1ef118 158 * @pipe: counter to update
13b030af
VS
159 *
160 * Call back into the driver to update the appropriate vblank counter
1da248a5 161 * (specified by @pipe). Deal with wraparound, if it occurred, and
13b030af
VS
162 * update the last read value so we can deal with wraparound on the next
163 * call if necessary.
164 *
165 * Only necessary when going from off->on, to account for frames we
166 * didn't get an interrupt for.
167 *
168 * Note: caller must hold dev->vbl_lock since this reads & writes
169 * device vblank fields.
170 */
a6e610dc
VS
171static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
172 unsigned long flags)
13b030af 173{
cc1ef118 174 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
99264a61 175 u32 cur_vblank, diff;
fb446a1a 176 bool rc;
13b030af 177 struct timeval t_vblank;
facfb062 178 int count = DRM_TIMESTAMP_MAXRETRIES;
4dfd6486 179 int framedur_ns = vblank->framedur_ns;
13b030af
VS
180
181 /*
182 * Interrupts were disabled prior to this call, so deal with counter
183 * wrap if needed.
5ceecb2f 184 * NOTE! It's possible we lost a full dev->max_vblank_count + 1 events
13b030af
VS
185 * here if the register is small or we had vblank interrupts off for
186 * a long time.
187 *
188 * We repeat the hardware vblank counter & timestamp query until
189 * we get consistent results. This to prevent races between gpu
190 * updating its hardware counter while we are retrieving the
191 * corresponding vblank timestamp.
192 */
193 do {
cc1ef118 194 cur_vblank = dev->driver->get_vblank_counter(dev, pipe);
a6e610dc 195 rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, flags);
facfb062 196 } while (cur_vblank != dev->driver->get_vblank_counter(dev, pipe) && --count > 0);
13b030af 197
4dfd6486
VS
198 if (dev->max_vblank_count != 0) {
199 /* trust the hw counter when it's around */
200 diff = (cur_vblank - vblank->last) & dev->max_vblank_count;
201 } else if (rc && framedur_ns) {
202 const struct timeval *t_old;
203 u64 diff_ns;
204
205 t_old = &vblanktimestamp(dev, pipe, vblank->count);
206 diff_ns = timeval_to_ns(&t_vblank) - timeval_to_ns(t_old);
13b030af 207
4dfd6486
VS
208 /*
209 * Figure out how many vblanks we've missed based
210 * on the difference in the timestamps and the
211 * frame/field duration.
212 */
213 diff = DIV_ROUND_CLOSEST_ULL(diff_ns, framedur_ns);
214
215 if (diff == 0 && flags & DRM_CALLED_FROM_VBLIRQ)
216 DRM_DEBUG("crtc %u: Redundant vblirq ignored."
217 " diff_ns = %lld, framedur_ns = %d)\n",
218 pipe, (long long) diff_ns, framedur_ns);
219 } else {
220 /* some kind of default for drivers w/o accurate vbl timestamping */
221 diff = (flags & DRM_CALLED_FROM_VBLIRQ) != 0;
13b030af
VS
222 }
223
4dfd6486
VS
224 DRM_DEBUG("updating vblank count on crtc %u:"
225 " current=%u, diff=%u, hw=%u hw_last=%u\n",
226 pipe, vblank->count, diff, cur_vblank, vblank->last);
13b030af 227
4dfd6486
VS
228 if (diff == 0) {
229 WARN_ON_ONCE(cur_vblank != vblank->last);
da8f4396 230 return;
4dfd6486 231 }
da8f4396 232
99264a61
DV
233 /*
234 * Only reinitialize corresponding vblank timestamp if high-precision query
d66a1e38
MK
235 * available and didn't fail. Otherwise reinitialize delayed at next vblank
236 * interrupt and assign 0 for now, to mark the vblanktimestamp as invalid.
13b030af 237 */
d66a1e38
MK
238 if (!rc)
239 t_vblank = (struct timeval) {0, 0};
240
4dfd6486 241 store_vblank(dev, pipe, diff, &t_vblank, cur_vblank);
13b030af
VS
242}
243
27641c3f
MK
244/*
245 * Disable vblank irq's on crtc, make sure that last vblank count
246 * of hardware and corresponding consistent software vblank counter
247 * are preserved, even if there are any spurious vblank irq's after
248 * disable.
249 */
cc1ef118 250static void vblank_disable_and_save(struct drm_device *dev, unsigned int pipe)
27641c3f 251{
cc1ef118 252 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
27641c3f 253 unsigned long irqflags;
27641c3f
MK
254
255 /* Prevent vblank irq processing while disabling vblank irqs,
256 * so no updates of timestamps or count can happen after we've
257 * disabled. Needed to prevent races in case of delayed irq's.
27641c3f 258 */
27641c3f
MK
259 spin_lock_irqsave(&dev->vblank_time_lock, irqflags);
260
eb2ed66f
LP
261 /*
262 * Only disable vblank interrupts if they're enabled. This avoids
263 * calling the ->disable_vblank() operation in atomic context with the
264 * hardware potentially runtime suspended.
265 */
266 if (vblank->enabled) {
cc1ef118 267 dev->driver->disable_vblank(dev, pipe);
eb2ed66f
LP
268 vblank->enabled = false;
269 }
27641c3f 270
4dfd6486
VS
271 /*
272 * Always update the count and timestamp to maintain the
273 * appearance that the counter has been ticking all along until
274 * this time. This makes the count account for the entire time
275 * between drm_vblank_on() and drm_vblank_off().
27641c3f 276 */
4dfd6486 277 drm_update_vblank_count(dev, pipe, 0);
27641c3f 278
27641c3f 279 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
27641c3f
MK
280}
281
0a3e67a4
JB
282static void vblank_disable_fn(unsigned long arg)
283{
e69595c2
VS
284 struct drm_vblank_crtc *vblank = (void *)arg;
285 struct drm_device *dev = vblank->dev;
cc1ef118 286 unsigned int pipe = vblank->pipe;
0a3e67a4 287 unsigned long irqflags;
0a3e67a4
JB
288
289 if (!dev->vblank_disable_allowed)
290 return;
291
e69595c2
VS
292 spin_lock_irqsave(&dev->vbl_lock, irqflags);
293 if (atomic_read(&vblank->refcount) == 0 && vblank->enabled) {
cc1ef118
TR
294 DRM_DEBUG("disabling vblank on crtc %u\n", pipe);
295 vblank_disable_and_save(dev, pipe);
0a3e67a4 296 }
e69595c2 297 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
0a3e67a4
JB
298}
299
f5752b38
DV
300/**
301 * drm_vblank_cleanup - cleanup vblank support
302 * @dev: DRM device
303 *
304 * This function cleans up any resources allocated in drm_vblank_init.
305 */
52440211 306void drm_vblank_cleanup(struct drm_device *dev)
0a3e67a4 307{
cc1ef118 308 unsigned int pipe;
e69595c2 309
0a3e67a4
JB
310 /* Bail if the driver didn't call drm_vblank_init() */
311 if (dev->num_crtcs == 0)
312 return;
313
cc1ef118
TR
314 for (pipe = 0; pipe < dev->num_crtcs; pipe++) {
315 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
8a51d5be 316
3bff93d6
DV
317 WARN_ON(vblank->enabled &&
318 drm_core_check_feature(dev, DRIVER_MODESET));
2368ffb1 319
3bff93d6 320 del_timer_sync(&vblank->disable_timer);
e69595c2 321 }
0a3e67a4 322
5380e929 323 kfree(dev->vblank);
0a3e67a4
JB
324
325 dev->num_crtcs = 0;
326}
e77cef9c 327EXPORT_SYMBOL(drm_vblank_cleanup);
0a3e67a4 328
f5752b38
DV
329/**
330 * drm_vblank_init - initialize vblank support
cc1ef118
TR
331 * @dev: DRM device
332 * @num_crtcs: number of CRTCs supported by @dev
f5752b38
DV
333 *
334 * This function initializes vblank support for @num_crtcs display pipelines.
335 *
336 * Returns:
337 * Zero on success or a negative error code on failure.
338 */
cc1ef118 339int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs)
0a3e67a4 340{
cc1ef118
TR
341 int ret = -ENOMEM;
342 unsigned int i;
0a3e67a4 343
0a3e67a4 344 spin_lock_init(&dev->vbl_lock);
27641c3f
MK
345 spin_lock_init(&dev->vblank_time_lock);
346
0a3e67a4
JB
347 dev->num_crtcs = num_crtcs;
348
5380e929
VS
349 dev->vblank = kcalloc(num_crtcs, sizeof(*dev->vblank), GFP_KERNEL);
350 if (!dev->vblank)
0a3e67a4
JB
351 goto err;
352
e69595c2 353 for (i = 0; i < num_crtcs; i++) {
8a51d5be
VS
354 struct drm_vblank_crtc *vblank = &dev->vblank[i];
355
356 vblank->dev = dev;
cc1ef118 357 vblank->pipe = i;
8a51d5be
VS
358 init_waitqueue_head(&vblank->queue);
359 setup_timer(&vblank->disable_timer, vblank_disable_fn,
360 (unsigned long)vblank);
e69595c2 361 }
27641c3f 362
8f6fce03 363 DRM_INFO("Supports vblank timestamp caching Rev 2 (21.10.2013).\n");
27641c3f
MK
364
365 /* Driver specific high-precision vblank timestamping supported? */
366 if (dev->driver->get_vblank_timestamp)
367 DRM_INFO("Driver supports precise vblank timestamp query.\n");
368 else
369 DRM_INFO("No driver support for vblank timestamp query.\n");
370
5a8b21b2
MK
371 /* Must have precise timestamping for reliable vblank instant disable */
372 if (dev->vblank_disable_immediate && !dev->driver->get_vblank_timestamp) {
373 dev->vblank_disable_immediate = false;
374 DRM_INFO("Setting vblank_disable_immediate to false because "
375 "get_vblank_timestamp == NULL\n");
376 }
377
ba0bf120
VS
378 dev->vblank_disable_allowed = false;
379
0a3e67a4
JB
380 return 0;
381
382err:
79a093ae 383 dev->num_crtcs = 0;
0a3e67a4
JB
384 return ret;
385}
386EXPORT_SYMBOL(drm_vblank_init);
387
28d52043
DA
388static void drm_irq_vgaarb_nokms(void *cookie, bool state)
389{
390 struct drm_device *dev = cookie;
391
392 if (dev->driver->vgaarb_irq) {
393 dev->driver->vgaarb_irq(dev, state);
394 return;
395 }
396
397 if (!dev->irq_enabled)
398 return;
399
5037f8ac
JS
400 if (state) {
401 if (dev->driver->irq_uninstall)
402 dev->driver->irq_uninstall(dev);
403 } else {
404 if (dev->driver->irq_preinstall)
405 dev->driver->irq_preinstall(dev);
406 if (dev->driver->irq_postinstall)
407 dev->driver->irq_postinstall(dev);
28d52043
DA
408 }
409}
410
1da177e4 411/**
f5752b38
DV
412 * drm_irq_install - install IRQ handler
413 * @dev: DRM device
414 * @irq: IRQ number to install the handler for
1da177e4 415 *
0a3e67a4 416 * Initializes the IRQ related data. Installs the handler, calling the driver
f5752b38
DV
417 * irq_preinstall() and irq_postinstall() functions before and after the
418 * installation.
419 *
420 * This is the simplified helper interface provided for drivers with no special
421 * needs. Drivers which need to install interrupt handlers for multiple
422 * interrupts must instead set drm_device->irq_enabled to signal the DRM core
423 * that vblank interrupts are available.
424 *
425 * Returns:
426 * Zero on success or a negative error code on failure.
1da177e4 427 */
bb0f1b5c 428int drm_irq_install(struct drm_device *dev, int irq)
1da177e4 429{
4a1b0714 430 int ret;
b5e89ed5 431 unsigned long sh_flags = 0;
1da177e4
LT
432
433 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
434 return -EINVAL;
435
7c1a38e3 436 if (irq == 0)
1da177e4
LT
437 return -EINVAL;
438
1da177e4 439 /* Driver must have been initialized */
e090c53b 440 if (!dev->dev_private)
1da177e4 441 return -EINVAL;
1da177e4 442
e090c53b 443 if (dev->irq_enabled)
1da177e4 444 return -EBUSY;
4423843c 445 dev->irq_enabled = true;
1da177e4 446
7c1a38e3 447 DRM_DEBUG("irq=%d\n", irq);
1da177e4 448
b5e89ed5 449 /* Before installing handler */
5037f8ac
JS
450 if (dev->driver->irq_preinstall)
451 dev->driver->irq_preinstall(dev);
1da177e4 452
b5e89ed5 453 /* Install handler */
1da177e4 454 if (drm_core_check_feature(dev, DRIVER_IRQ_SHARED))
935f6e3a 455 sh_flags = IRQF_SHARED;
b5e89ed5 456
7c1a38e3 457 ret = request_irq(irq, dev->driver->irq_handler,
5829d183 458 sh_flags, dev->driver->name, dev);
9bfbd5cb 459
b5e89ed5 460 if (ret < 0) {
4423843c 461 dev->irq_enabled = false;
1da177e4
LT
462 return ret;
463 }
464
28d52043
DA
465 if (!drm_core_check_feature(dev, DRIVER_MODESET))
466 vga_client_register(dev->pdev, (void *)dev, drm_irq_vgaarb_nokms, NULL);
467
b5e89ed5 468 /* After installing handler */
5037f8ac
JS
469 if (dev->driver->irq_postinstall)
470 ret = dev->driver->irq_postinstall(dev);
471
0a3e67a4 472 if (ret < 0) {
4423843c 473 dev->irq_enabled = false;
e1c44acc
JS
474 if (!drm_core_check_feature(dev, DRIVER_MODESET))
475 vga_client_register(dev->pdev, NULL, NULL, NULL);
7c1a38e3
DV
476 free_irq(irq, dev);
477 } else {
478 dev->irq = irq;
0a3e67a4 479 }
1da177e4 480
0a3e67a4 481 return ret;
1da177e4 482}
0a3e67a4 483EXPORT_SYMBOL(drm_irq_install);
1da177e4
LT
484
485/**
f5752b38
DV
486 * drm_irq_uninstall - uninstall the IRQ handler
487 * @dev: DRM device
488 *
489 * Calls the driver's irq_uninstall() function and unregisters the IRQ handler.
490 * This should only be called by drivers which used drm_irq_install() to set up
491 * their interrupt handler. Other drivers must only reset
492 * drm_device->irq_enabled to false.
1da177e4 493 *
f5752b38
DV
494 * Note that for kernel modesetting drivers it is a bug if this function fails.
495 * The sanity checks are only to catch buggy user modesetting drivers which call
496 * the same function through an ioctl.
1da177e4 497 *
f5752b38
DV
498 * Returns:
499 * Zero on success or a negative error code on failure.
1da177e4 500 */
27641c3f 501int drm_irq_uninstall(struct drm_device *dev)
1da177e4 502{
dc1336ff 503 unsigned long irqflags;
4423843c
VS
504 bool irq_enabled;
505 int i;
1da177e4
LT
506
507 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
508 return -EINVAL;
509
1da177e4 510 irq_enabled = dev->irq_enabled;
4423843c 511 dev->irq_enabled = false;
1da177e4 512
dc1336ff 513 /*
3bff93d6
DV
514 * Wake up any waiters so they don't hang. This is just to paper over
515 * isssues for UMS drivers which aren't in full control of their
516 * vblank/irq handling. KMS drivers must ensure that vblanks are all
517 * disabled when uninstalling the irq handler.
dc1336ff 518 */
bde4889a
BS
519 if (dev->num_crtcs) {
520 spin_lock_irqsave(&dev->vbl_lock, irqflags);
521 for (i = 0; i < dev->num_crtcs; i++) {
8a51d5be
VS
522 struct drm_vblank_crtc *vblank = &dev->vblank[i];
523
3bff93d6
DV
524 if (!vblank->enabled)
525 continue;
526
527 WARN_ON(drm_core_check_feature(dev, DRIVER_MODESET));
528
529 vblank_disable_and_save(dev, i);
8a51d5be 530 wake_up(&vblank->queue);
bde4889a
BS
531 }
532 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
dc1336ff 533 }
dc1336ff 534
b5e89ed5 535 if (!irq_enabled)
1da177e4
LT
536 return -EINVAL;
537
7c1a38e3 538 DRM_DEBUG("irq=%d\n", dev->irq);
1da177e4 539
28d52043
DA
540 if (!drm_core_check_feature(dev, DRIVER_MODESET))
541 vga_client_register(dev->pdev, NULL, NULL, NULL);
542
5037f8ac
JS
543 if (dev->driver->irq_uninstall)
544 dev->driver->irq_uninstall(dev);
1da177e4 545
7c1a38e3 546 free_irq(dev->irq, dev);
1da177e4
LT
547
548 return 0;
549}
550EXPORT_SYMBOL(drm_irq_uninstall);
551
f5752b38 552/*
1da177e4
LT
553 * IRQ control ioctl.
554 *
555 * \param inode device inode.
6c340eac 556 * \param file_priv DRM file private.
1da177e4
LT
557 * \param cmd command.
558 * \param arg user argument, pointing to a drm_control structure.
559 * \return zero on success or a negative number on failure.
560 *
561 * Calls irq_install() or irq_uninstall() according to \p arg.
562 */
c153f45f
EA
563int drm_control(struct drm_device *dev, void *data,
564 struct drm_file *file_priv)
1da177e4 565{
c153f45f 566 struct drm_control *ctl = data;
a319c1a4 567 int ret = 0, irq;
b5e89ed5 568
27641c3f
MK
569 /* if we haven't irq we fallback for compatibility reasons -
570 * this used to be a separate function in drm_dma.h
571 */
1da177e4 572
22471cf6
DV
573 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
574 return 0;
575 if (drm_core_check_feature(dev, DRIVER_MODESET))
576 return 0;
577 /* UMS was only ever support on pci devices. */
578 if (WARN_ON(!dev->pdev))
579 return -EINVAL;
1da177e4 580
c153f45f 581 switch (ctl->func) {
1da177e4 582 case DRM_INST_HANDLER:
a319c1a4
DV
583 irq = dev->pdev->irq;
584
1da177e4 585 if (dev->if_version < DRM_IF_VERSION(1, 2) &&
a319c1a4 586 ctl->irq != irq)
1da177e4 587 return -EINVAL;
e090c53b 588 mutex_lock(&dev->struct_mutex);
bb0f1b5c 589 ret = drm_irq_install(dev, irq);
e090c53b
DV
590 mutex_unlock(&dev->struct_mutex);
591
592 return ret;
1da177e4 593 case DRM_UNINST_HANDLER:
e090c53b
DV
594 mutex_lock(&dev->struct_mutex);
595 ret = drm_irq_uninstall(dev);
596 mutex_unlock(&dev->struct_mutex);
597
598 return ret;
1da177e4
LT
599 default:
600 return -EINVAL;
601 }
602}
603
27641c3f 604/**
f5752b38
DV
605 * drm_calc_timestamping_constants - calculate vblank timestamp constants
606 * @crtc: drm_crtc whose timestamp constants should be updated.
607 * @mode: display mode containing the scanout timings
27641c3f 608 *
21b21560
VS
609 * Calculate and store various constants which are later
610 * needed by vblank and swap-completion timestamping, e.g,
611 * by drm_calc_vbltimestamp_from_scanoutpos(). They are
f5752b38 612 * derived from CRTC's true scanout timing, so they take
21b21560 613 * things like panel scaling or other adjustments into account.
27641c3f 614 */
545cdd55
VS
615void drm_calc_timestamping_constants(struct drm_crtc *crtc,
616 const struct drm_display_mode *mode)
27641c3f 617{
eba1f35d 618 struct drm_vblank_crtc *vblank = &crtc->dev->vblank[drm_crtc_index(crtc)];
20b20203 619 int linedur_ns = 0, framedur_ns = 0;
77666b72 620 int dotclock = mode->crtc_clock;
27641c3f
MK
621
622 /* Valid dotclock? */
623 if (dotclock > 0) {
0dae35a3
VS
624 int frame_size = mode->crtc_htotal * mode->crtc_vtotal;
625
626 /*
627 * Convert scanline length in pixels and video
20b20203
VS
628 * dot clock to line duration and frame duration
629 * in nanoseconds:
27641c3f 630 */
0dae35a3
VS
631 linedur_ns = div_u64((u64) mode->crtc_htotal * 1000000, dotclock);
632 framedur_ns = div_u64((u64) frame_size * 1000000, dotclock);
c0ae24c1
VS
633
634 /*
635 * Fields of interlaced scanout modes are only half a frame duration.
636 */
637 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
638 framedur_ns /= 2;
27641c3f 639 } else
cc1ef118 640 DRM_ERROR("crtc %u: Can't calculate constants, dotclock = 0!\n",
27641c3f
MK
641 crtc->base.id);
642
eba1f35d
VS
643 vblank->linedur_ns = linedur_ns;
644 vblank->framedur_ns = framedur_ns;
27641c3f 645
cc1ef118 646 DRM_DEBUG("crtc %u: hwmode: htotal %d, vtotal %d, vdisplay %d\n",
545cdd55
VS
647 crtc->base.id, mode->crtc_htotal,
648 mode->crtc_vtotal, mode->crtc_vdisplay);
20b20203
VS
649 DRM_DEBUG("crtc %u: clock %d kHz framedur %d linedur %d\n",
650 crtc->base.id, dotclock, framedur_ns, linedur_ns);
27641c3f
MK
651}
652EXPORT_SYMBOL(drm_calc_timestamping_constants);
653
654/**
f5752b38
DV
655 * drm_calc_vbltimestamp_from_scanoutpos - precise vblank timestamp helper
656 * @dev: DRM device
cc1ef118 657 * @pipe: index of CRTC whose vblank timestamp to retrieve
f5752b38
DV
658 * @max_error: Desired maximum allowable error in timestamps (nanosecs)
659 * On return contains true maximum error of timestamp
660 * @vblank_time: Pointer to struct timeval which should receive the timestamp
661 * @flags: Flags to pass to driver:
662 * 0 = Default,
663 * DRM_CALLED_FROM_VBLIRQ = If function is called from vbl IRQ handler
f5752b38
DV
664 * @mode: mode which defines the scanout timings
665 *
666 * Implements calculation of exact vblank timestamps from given drm_display_mode
667 * timings and current video scanout position of a CRTC. This can be called from
668 * within get_vblank_timestamp() implementation of a kms driver to implement the
669 * actual timestamping.
27641c3f
MK
670 *
671 * Should return timestamps conforming to the OML_sync_control OpenML
672 * extension specification. The timestamp corresponds to the end of
673 * the vblank interval, aka start of scanout of topmost-leftmost display
674 * pixel in the following video frame.
675 *
676 * Requires support for optional dev->driver->get_scanout_position()
677 * in kms driver, plus a bit of setup code to provide a drm_display_mode
678 * that corresponds to the true scanout timing.
679 *
680 * The current implementation only handles standard video modes. It
681 * returns as no operation if a doublescan or interlaced video mode is
682 * active. Higher level code is expected to handle this.
683 *
f5752b38
DV
684 * Returns:
685 * Negative value on error, failure or if not supported in current
27641c3f
MK
686 * video mode:
687 *
f5752b38 688 * -EINVAL - Invalid CRTC.
27641c3f
MK
689 * -EAGAIN - Temporary unavailable, e.g., called before initial modeset.
690 * -ENOTSUPP - Function not supported in current display mode.
691 * -EIO - Failed, e.g., due to failed scanout position query.
692 *
693 * Returns or'ed positive status flags on success:
694 *
695 * DRM_VBLANKTIME_SCANOUTPOS_METHOD - Signal this method used for timestamping.
696 * DRM_VBLANKTIME_INVBL - Timestamp taken while scanout was in vblank interval.
697 *
698 */
cc1ef118
TR
699int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
700 unsigned int pipe,
27641c3f
MK
701 int *max_error,
702 struct timeval *vblank_time,
703 unsigned flags,
7da903ef 704 const struct drm_display_mode *mode)
27641c3f 705{
e62f2f5a 706 struct timeval tv_etime;
d2cb58c8 707 ktime_t stime, etime;
ad1716ec
VS
708 unsigned int vbl_status;
709 int ret = DRM_VBLANKTIME_SCANOUTPOS_METHOD;
27641c3f 710 int vpos, hpos, i;
3bb403bf 711 int delta_ns, duration_ns;
27641c3f 712
cc1ef118
TR
713 if (pipe >= dev->num_crtcs) {
714 DRM_ERROR("Invalid crtc %u\n", pipe);
27641c3f
MK
715 return -EINVAL;
716 }
717
718 /* Scanout position query not supported? Should not happen. */
719 if (!dev->driver->get_scanout_position) {
720 DRM_ERROR("Called from driver w/o get_scanout_position()!?\n");
721 return -EIO;
722 }
723
27641c3f
MK
724 /* If mode timing undefined, just return as no-op:
725 * Happens during initial modesetting of a crtc.
726 */
3bb403bf 727 if (mode->crtc_clock == 0) {
cc1ef118 728 DRM_DEBUG("crtc %u: Noop due to uninitialized mode.\n", pipe);
27641c3f
MK
729 return -EAGAIN;
730 }
731
27641c3f
MK
732 /* Get current scanout position with system timestamp.
733 * Repeat query up to DRM_TIMESTAMP_MAXRETRIES times
734 * if single query takes longer than max_error nanoseconds.
735 *
736 * This guarantees a tight bound on maximum error if
737 * code gets preempted or delayed for some reason.
738 */
739 for (i = 0; i < DRM_TIMESTAMP_MAXRETRIES; i++) {
8f6fce03
MK
740 /*
741 * Get vertical and horizontal scanout position vpos, hpos,
742 * and bounding timestamps stime, etime, pre/post query.
743 */
3bb403bf
VS
744 vbl_status = dev->driver->get_scanout_position(dev, pipe, flags,
745 &vpos, &hpos,
746 &stime, &etime,
747 mode);
27641c3f 748
27641c3f
MK
749 /* Return as no-op if scanout query unsupported or failed. */
750 if (!(vbl_status & DRM_SCANOUTPOS_VALID)) {
ad1716ec 751 DRM_DEBUG("crtc %u : scanoutpos query failed [0x%x].\n",
cc1ef118 752 pipe, vbl_status);
27641c3f
MK
753 return -EIO;
754 }
755
8f6fce03 756 /* Compute uncertainty in timestamp of scanout position query. */
e62f2f5a 757 duration_ns = ktime_to_ns(etime) - ktime_to_ns(stime);
27641c3f
MK
758
759 /* Accept result with < max_error nsecs timing uncertainty. */
3c184f69 760 if (duration_ns <= *max_error)
27641c3f
MK
761 break;
762 }
763
764 /* Noisy system timing? */
765 if (i == DRM_TIMESTAMP_MAXRETRIES) {
cc1ef118
TR
766 DRM_DEBUG("crtc %u: Noisy timestamp %d us > %d us [%d reps].\n",
767 pipe, duration_ns/1000, *max_error/1000, i);
27641c3f
MK
768 }
769
770 /* Return upper bound of timestamp precision error. */
3c184f69 771 *max_error = duration_ns;
27641c3f
MK
772
773 /* Check if in vblank area:
774 * vpos is >=0 in video scanout area, but negative
775 * within vblank area, counting down the number of lines until
776 * start of scanout.
777 */
ad1716ec
VS
778 if (vbl_status & DRM_SCANOUTPOS_IN_VBLANK)
779 ret |= DRM_VBLANKTIME_IN_VBLANK;
27641c3f
MK
780
781 /* Convert scanout position into elapsed time at raw_time query
782 * since start of scanout at first display scanline. delta_ns
783 * can be negative if start of scanout hasn't happened yet.
784 */
3bb403bf
VS
785 delta_ns = div_s64(1000000LL * (vpos * mode->crtc_htotal + hpos),
786 mode->crtc_clock);
27641c3f 787
c61eef72 788 if (!drm_timestamp_monotonic)
d2cb58c8 789 etime = ktime_mono_to_real(etime);
c61eef72 790
e62f2f5a
ID
791 /* save this only for debugging purposes */
792 tv_etime = ktime_to_timeval(etime);
27641c3f
MK
793 /* Subtract time delta from raw timestamp to get final
794 * vblank_time timestamp for end of vblank.
795 */
e91abf80
MD
796 if (delta_ns < 0)
797 etime = ktime_add_ns(etime, -delta_ns);
798 else
799 etime = ktime_sub_ns(etime, delta_ns);
e62f2f5a 800 *vblank_time = ktime_to_timeval(etime);
27641c3f 801
ad1716ec
VS
802 DRM_DEBUG("crtc %u : v 0x%x p(%d,%d)@ %ld.%ld -> %ld.%ld [e %d us, %d rep]\n",
803 pipe, vbl_status, hpos, vpos,
e62f2f5a 804 (long)tv_etime.tv_sec, (long)tv_etime.tv_usec,
bbb0aef5 805 (long)vblank_time->tv_sec, (long)vblank_time->tv_usec,
3c184f69 806 duration_ns/1000, i);
27641c3f 807
ad1716ec 808 return ret;
27641c3f
MK
809}
810EXPORT_SYMBOL(drm_calc_vbltimestamp_from_scanoutpos);
811
c61eef72
ID
812static struct timeval get_drm_timestamp(void)
813{
814 ktime_t now;
815
d2cb58c8 816 now = drm_timestamp_monotonic ? ktime_get() : ktime_get_real();
c61eef72
ID
817 return ktime_to_timeval(now);
818}
819
27641c3f
MK
820/**
821 * drm_get_last_vbltimestamp - retrieve raw timestamp for the most recent
4dfd909f 822 * vblank interval
27641c3f 823 * @dev: DRM device
cc1ef118 824 * @pipe: index of CRTC whose vblank timestamp to retrieve
27641c3f
MK
825 * @tvblank: Pointer to target struct timeval which should receive the timestamp
826 * @flags: Flags to pass to driver:
f5752b38
DV
827 * 0 = Default,
828 * DRM_CALLED_FROM_VBLIRQ = If function is called from vbl IRQ handler
27641c3f
MK
829 *
830 * Fetches the system timestamp corresponding to the time of the most recent
f5752b38 831 * vblank interval on specified CRTC. May call into kms-driver to
27641c3f
MK
832 * compute the timestamp with a high-precision GPU specific method.
833 *
834 * Returns zero if timestamp originates from uncorrected do_gettimeofday()
835 * call, i.e., it isn't very precisely locked to the true vblank.
836 *
f5752b38 837 * Returns:
fb446a1a 838 * True if timestamp is considered to be very precise, false otherwise.
27641c3f 839 */
fb446a1a 840static bool
cc1ef118 841drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
fb446a1a 842 struct timeval *tvblank, unsigned flags)
27641c3f 843{
4a1b0714 844 int ret;
27641c3f
MK
845
846 /* Define requested maximum error on timestamps (nanoseconds). */
847 int max_error = (int) drm_timestamp_precision * 1000;
848
849 /* Query driver if possible and precision timestamping enabled. */
850 if (dev->driver->get_vblank_timestamp && (max_error > 0)) {
cc1ef118 851 ret = dev->driver->get_vblank_timestamp(dev, pipe, &max_error,
27641c3f
MK
852 tvblank, flags);
853 if (ret > 0)
fb446a1a 854 return true;
27641c3f
MK
855 }
856
857 /* GPU high precision timestamp query unsupported or failed.
c61eef72 858 * Return current monotonic/gettimeofday timestamp as best estimate.
27641c3f 859 */
c61eef72 860 *tvblank = get_drm_timestamp();
27641c3f 861
fb446a1a 862 return false;
27641c3f 863}
27641c3f 864
0a3e67a4
JB
865/**
866 * drm_vblank_count - retrieve "cooked" vblank counter value
867 * @dev: DRM device
cc1ef118 868 * @pipe: index of CRTC for which to retrieve the counter
0a3e67a4
JB
869 *
870 * Fetches the "cooked" vblank count value that represents the number of
871 * vblank events since the system was booted, including lost events due to
872 * modesetting activity.
f5752b38 873 *
96d3f91e
TR
874 * This is the legacy version of drm_crtc_vblank_count().
875 *
f5752b38
DV
876 * Returns:
877 * The software vblank counter.
0a3e67a4 878 */
cc1ef118 879u32 drm_vblank_count(struct drm_device *dev, int pipe)
0a3e67a4 880{
cc1ef118 881 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
8a51d5be 882
cc1ef118 883 if (WARN_ON(pipe >= dev->num_crtcs))
e6ae8687 884 return 0;
7d1de851 885
99264a61 886 return vblank->count;
0a3e67a4
JB
887}
888EXPORT_SYMBOL(drm_vblank_count);
889
96d3f91e
TR
890/**
891 * drm_crtc_vblank_count - retrieve "cooked" vblank counter value
892 * @crtc: which counter to retrieve
893 *
894 * Fetches the "cooked" vblank count value that represents the number of
895 * vblank events since the system was booted, including lost events due to
896 * modesetting activity.
897 *
898 * This is the native KMS version of drm_vblank_count().
899 *
900 * Returns:
901 * The software vblank counter.
902 */
903u32 drm_crtc_vblank_count(struct drm_crtc *crtc)
904{
905 return drm_vblank_count(crtc->dev, drm_crtc_index(crtc));
906}
907EXPORT_SYMBOL(drm_crtc_vblank_count);
908
27641c3f 909/**
cc1ef118
TR
910 * drm_vblank_count_and_time - retrieve "cooked" vblank counter value and the
911 * system timestamp corresponding to that vblank counter value.
27641c3f 912 * @dev: DRM device
cc1ef118 913 * @pipe: index of CRTC whose counter to retrieve
27641c3f
MK
914 * @vblanktime: Pointer to struct timeval to receive the vblank timestamp.
915 *
916 * Fetches the "cooked" vblank count value that represents the number of
917 * vblank events since the system was booted, including lost events due to
918 * modesetting activity. Returns corresponding system timestamp of the time
f5752b38 919 * of the vblank interval that corresponds to the current vblank counter value.
cf648305
TR
920 *
921 * This is the legacy version of drm_crtc_vblank_count_and_time().
27641c3f 922 */
cc1ef118 923u32 drm_vblank_count_and_time(struct drm_device *dev, unsigned int pipe,
27641c3f
MK
924 struct timeval *vblanktime)
925{
cc1ef118 926 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
facfb062 927 int count = DRM_TIMESTAMP_MAXRETRIES;
27641c3f
MK
928 u32 cur_vblank;
929
cc1ef118 930 if (WARN_ON(pipe >= dev->num_crtcs))
e6ae8687
RC
931 return 0;
932
99264a61
DV
933 /*
934 * Vblank timestamps are read lockless. To ensure consistency the vblank
935 * counter is rechecked and ordering is ensured using memory barriers.
936 * This works like a seqlock. The write-side barriers are in store_vblank.
27641c3f
MK
937 */
938 do {
99264a61
DV
939 cur_vblank = vblank->count;
940 smp_rmb();
cc1ef118 941 *vblanktime = vblanktimestamp(dev, pipe, cur_vblank);
27641c3f 942 smp_rmb();
facfb062 943 } while (cur_vblank != vblank->count && --count > 0);
27641c3f
MK
944
945 return cur_vblank;
946}
947EXPORT_SYMBOL(drm_vblank_count_and_time);
948
cf648305
TR
949/**
950 * drm_crtc_vblank_count_and_time - retrieve "cooked" vblank counter value
951 * and the system timestamp corresponding to that vblank counter value
952 * @crtc: which counter to retrieve
953 * @vblanktime: Pointer to struct timeval to receive the vblank timestamp.
954 *
955 * Fetches the "cooked" vblank count value that represents the number of
956 * vblank events since the system was booted, including lost events due to
957 * modesetting activity. Returns corresponding system timestamp of the time
958 * of the vblank interval that corresponds to the current vblank counter value.
959 *
960 * This is the native KMS version of drm_vblank_count_and_time().
961 */
962u32 drm_crtc_vblank_count_and_time(struct drm_crtc *crtc,
963 struct timeval *vblanktime)
964{
965 return drm_vblank_count_and_time(crtc->dev, drm_crtc_index(crtc),
966 vblanktime);
967}
968EXPORT_SYMBOL(drm_crtc_vblank_count_and_time);
969
c6eefa17
RC
970static void send_vblank_event(struct drm_device *dev,
971 struct drm_pending_vblank_event *e,
972 unsigned long seq, struct timeval *now)
973{
974 WARN_ON_SMP(!spin_is_locked(&dev->event_lock));
975 e->event.sequence = seq;
976 e->event.tv_sec = now->tv_sec;
977 e->event.tv_usec = now->tv_usec;
978
979 list_add_tail(&e->base.link,
980 &e->base.file_priv->event_list);
981 wake_up_interruptible(&e->base.file_priv->event_wait);
982 trace_drm_vblank_event_delivered(e->base.pid, e->pipe,
983 e->event.sequence);
984}
985
986/**
987 * drm_send_vblank_event - helper to send vblank event after pageflip
988 * @dev: DRM device
cc1ef118 989 * @pipe: CRTC index
c6eefa17
RC
990 * @e: the event to send
991 *
992 * Updates sequence # and timestamp on event, and sends it to userspace.
993 * Caller must hold event lock.
a4d7b30d
TR
994 *
995 * This is the legacy version of drm_crtc_send_vblank_event().
c6eefa17 996 */
cc1ef118
TR
997void drm_send_vblank_event(struct drm_device *dev, unsigned int pipe,
998 struct drm_pending_vblank_event *e)
c6eefa17
RC
999{
1000 struct timeval now;
1001 unsigned int seq;
4dfd909f 1002
2a7d3d6d 1003 if (dev->num_crtcs > 0) {
cc1ef118 1004 seq = drm_vblank_count_and_time(dev, pipe, &now);
c6eefa17
RC
1005 } else {
1006 seq = 0;
c61eef72
ID
1007
1008 now = get_drm_timestamp();
c6eefa17 1009 }
cc1ef118 1010 e->pipe = pipe;
c6eefa17
RC
1011 send_vblank_event(dev, e, seq, &now);
1012}
1013EXPORT_SYMBOL(drm_send_vblank_event);
1014
a4d7b30d
TR
1015/**
1016 * drm_crtc_send_vblank_event - helper to send vblank event after pageflip
1017 * @crtc: the source CRTC of the vblank event
1018 * @e: the event to send
1019 *
1020 * Updates sequence # and timestamp on event, and sends it to userspace.
1021 * Caller must hold event lock.
1022 *
1023 * This is the native KMS version of drm_send_vblank_event().
1024 */
1025void drm_crtc_send_vblank_event(struct drm_crtc *crtc,
1026 struct drm_pending_vblank_event *e)
1027{
1028 drm_send_vblank_event(crtc->dev, drm_crtc_index(crtc), e);
1029}
1030EXPORT_SYMBOL(drm_crtc_send_vblank_event);
1031
f2752282
VS
1032/**
1033 * drm_vblank_enable - enable the vblank interrupt on a CRTC
1034 * @dev: DRM device
cc1ef118 1035 * @pipe: CRTC index
c30e11fc
TR
1036 *
1037 * Returns:
1038 * Zero on success or a negative error code on failure.
f2752282 1039 */
cc1ef118 1040static int drm_vblank_enable(struct drm_device *dev, unsigned int pipe)
f2752282 1041{
cc1ef118 1042 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
f2752282
VS
1043 int ret = 0;
1044
1045 assert_spin_locked(&dev->vbl_lock);
1046
1047 spin_lock(&dev->vblank_time_lock);
1048
8a51d5be 1049 if (!vblank->enabled) {
1cfb80b1
DV
1050 /*
1051 * Enable vblank irqs under vblank_time_lock protection.
f2752282
VS
1052 * All vblank count & timestamp updates are held off
1053 * until we are done reinitializing master counter and
1054 * timestamps. Filtercode in drm_handle_vblank() will
1055 * prevent double-accounting of same vblank interval.
1056 */
cc1ef118
TR
1057 ret = dev->driver->enable_vblank(dev, pipe);
1058 DRM_DEBUG("enabling vblank on crtc %u, ret: %d\n", pipe, ret);
f2752282 1059 if (ret)
8a51d5be 1060 atomic_dec(&vblank->refcount);
f2752282 1061 else {
8a51d5be 1062 vblank->enabled = true;
a6e610dc 1063 drm_update_vblank_count(dev, pipe, 0);
f2752282
VS
1064 }
1065 }
1066
1067 spin_unlock(&dev->vblank_time_lock);
1068
1069 return ret;
1070}
1071
0a3e67a4
JB
1072/**
1073 * drm_vblank_get - get a reference count on vblank events
1074 * @dev: DRM device
cc1ef118 1075 * @pipe: index of CRTC to own
0a3e67a4
JB
1076 *
1077 * Acquire a reference count on vblank events to avoid having them disabled
1078 * while in use.
1079 *
89dd6a4b
DV
1080 * This is the legacy version of drm_crtc_vblank_get().
1081 *
f5752b38 1082 * Returns:
c30e11fc 1083 * Zero on success or a negative error code on failure.
0a3e67a4 1084 */
cc1ef118 1085int drm_vblank_get(struct drm_device *dev, unsigned int pipe)
0a3e67a4 1086{
cc1ef118 1087 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
97cbc883 1088 unsigned long irqflags;
0a3e67a4
JB
1089 int ret = 0;
1090
16e3247d
GH
1091 if (!dev->num_crtcs)
1092 return -EINVAL;
1093
cc1ef118 1094 if (WARN_ON(pipe >= dev->num_crtcs))
e6ae8687
RC
1095 return -EINVAL;
1096
0a3e67a4
JB
1097 spin_lock_irqsave(&dev->vbl_lock, irqflags);
1098 /* Going from 0->1 means we have to enable interrupts again */
8a51d5be 1099 if (atomic_add_return(1, &vblank->refcount) == 1) {
cc1ef118 1100 ret = drm_vblank_enable(dev, pipe);
778c9026 1101 } else {
8a51d5be
VS
1102 if (!vblank->enabled) {
1103 atomic_dec(&vblank->refcount);
778c9026 1104 ret = -EINVAL;
0a3e67a4
JB
1105 }
1106 }
1107 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
1108
1109 return ret;
1110}
1111EXPORT_SYMBOL(drm_vblank_get);
1112
89dd6a4b
DV
1113/**
1114 * drm_crtc_vblank_get - get a reference count on vblank events
1115 * @crtc: which CRTC to own
1116 *
1117 * Acquire a reference count on vblank events to avoid having them disabled
1118 * while in use.
1119 *
30b79f06 1120 * This is the native kms version of drm_vblank_get().
89dd6a4b
DV
1121 *
1122 * Returns:
c30e11fc 1123 * Zero on success or a negative error code on failure.
89dd6a4b
DV
1124 */
1125int drm_crtc_vblank_get(struct drm_crtc *crtc)
1126{
1127 return drm_vblank_get(crtc->dev, drm_crtc_index(crtc));
1128}
1129EXPORT_SYMBOL(drm_crtc_vblank_get);
1130
0a3e67a4 1131/**
cc1ef118 1132 * drm_vblank_put - release ownership of vblank events
0a3e67a4 1133 * @dev: DRM device
cc1ef118 1134 * @pipe: index of CRTC to release
0a3e67a4
JB
1135 *
1136 * Release ownership of a given vblank counter, turning off interrupts
27641c3f 1137 * if possible. Disable interrupts after drm_vblank_offdelay milliseconds.
89dd6a4b
DV
1138 *
1139 * This is the legacy version of drm_crtc_vblank_put().
0a3e67a4 1140 */
cc1ef118 1141void drm_vblank_put(struct drm_device *dev, unsigned int pipe)
0a3e67a4 1142{
cc1ef118 1143 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
8a51d5be 1144
cc1ef118 1145 if (WARN_ON(pipe >= dev->num_crtcs))
7f907bf2 1146 return;
b3f5e732 1147
7d1de851 1148 if (WARN_ON(atomic_read(&vblank->refcount) == 0))
e6ae8687
RC
1149 return;
1150
0a3e67a4 1151 /* Last user schedules interrupt disable */
4ed0ce3d 1152 if (atomic_dec_and_test(&vblank->refcount)) {
ab8905f1
DV
1153 if (drm_vblank_offdelay == 0)
1154 return;
1155 else if (dev->vblank_disable_immediate || drm_vblank_offdelay < 0)
4ed0ce3d 1156 vblank_disable_fn((unsigned long)vblank);
ab8905f1 1157 else
4ed0ce3d
VS
1158 mod_timer(&vblank->disable_timer,
1159 jiffies + ((drm_vblank_offdelay * HZ)/1000));
1160 }
0a3e67a4
JB
1161}
1162EXPORT_SYMBOL(drm_vblank_put);
1163
89dd6a4b
DV
1164/**
1165 * drm_crtc_vblank_put - give up ownership of vblank events
1166 * @crtc: which counter to give up
1167 *
1168 * Release ownership of a given vblank counter, turning off interrupts
1169 * if possible. Disable interrupts after drm_vblank_offdelay milliseconds.
1170 *
1171 * This is the native kms version of drm_vblank_put().
1172 */
1173void drm_crtc_vblank_put(struct drm_crtc *crtc)
1174{
1175 drm_vblank_put(crtc->dev, drm_crtc_index(crtc));
1176}
1177EXPORT_SYMBOL(drm_crtc_vblank_put);
1178
e8450f51
DV
1179/**
1180 * drm_wait_one_vblank - wait for one vblank
1181 * @dev: DRM device
cc1ef118 1182 * @pipe: CRTC index
e8450f51 1183 *
1da248a5
VS
1184 * This waits for one vblank to pass on @pipe, using the irq driver interfaces.
1185 * It is a failure to call this when the vblank irq for @pipe is disabled, e.g.
e8450f51
DV
1186 * due to lack of driver support or because the crtc is off.
1187 */
cc1ef118 1188void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe)
e8450f51 1189{
cc1ef118 1190 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
e8450f51
DV
1191 int ret;
1192 u32 last;
1193
cc1ef118 1194 if (WARN_ON(pipe >= dev->num_crtcs))
7d1de851
TR
1195 return;
1196
cc1ef118
TR
1197 ret = drm_vblank_get(dev, pipe);
1198 if (WARN(ret, "vblank not available on crtc %i, ret=%i\n", pipe, ret))
e8450f51
DV
1199 return;
1200
cc1ef118 1201 last = drm_vblank_count(dev, pipe);
e8450f51 1202
cc1ef118
TR
1203 ret = wait_event_timeout(vblank->queue,
1204 last != drm_vblank_count(dev, pipe),
e8450f51
DV
1205 msecs_to_jiffies(100));
1206
cc1ef118 1207 WARN(ret == 0, "vblank wait timed out on crtc %i\n", pipe);
e8450f51 1208
cc1ef118 1209 drm_vblank_put(dev, pipe);
e8450f51
DV
1210}
1211EXPORT_SYMBOL(drm_wait_one_vblank);
1212
1213/**
1214 * drm_crtc_wait_one_vblank - wait for one vblank
1215 * @crtc: DRM crtc
1216 *
1217 * This waits for one vblank to pass on @crtc, using the irq driver interfaces.
1218 * It is a failure to call this when the vblank irq for @crtc is disabled, e.g.
1219 * due to lack of driver support or because the crtc is off.
1220 */
1221void drm_crtc_wait_one_vblank(struct drm_crtc *crtc)
1222{
1223 drm_wait_one_vblank(crtc->dev, drm_crtc_index(crtc));
1224}
1225EXPORT_SYMBOL(drm_crtc_wait_one_vblank);
1226
c6eefa17
RC
1227/**
1228 * drm_vblank_off - disable vblank events on a CRTC
1229 * @dev: DRM device
cc1ef118 1230 * @pipe: CRTC index
c6eefa17 1231 *
f5752b38
DV
1232 * Drivers can use this function to shut down the vblank interrupt handling when
1233 * disabling a crtc. This function ensures that the latest vblank frame count is
1234 * stored so that drm_vblank_on() can restore it again.
1235 *
1236 * Drivers must use this function when the hardware vblank counter can get
1237 * reset, e.g. when suspending.
89dd6a4b
DV
1238 *
1239 * This is the legacy version of drm_crtc_vblank_off().
c6eefa17 1240 */
cc1ef118 1241void drm_vblank_off(struct drm_device *dev, unsigned int pipe)
778c9026 1242{
cc1ef118 1243 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
498548ec
CJHR
1244 struct drm_pending_vblank_event *e, *t;
1245 struct timeval now;
778c9026 1246 unsigned long irqflags;
498548ec 1247 unsigned int seq;
778c9026 1248
cc1ef118 1249 if (WARN_ON(pipe >= dev->num_crtcs))
e6ae8687
RC
1250 return;
1251
56cc279b
VS
1252 spin_lock_irqsave(&dev->event_lock, irqflags);
1253
1254 spin_lock(&dev->vbl_lock);
cc1ef118 1255 vblank_disable_and_save(dev, pipe);
8a51d5be 1256 wake_up(&vblank->queue);
498548ec 1257
56cc279b
VS
1258 /*
1259 * Prevent subsequent drm_vblank_get() from re-enabling
1260 * the vblank interrupt by bumping the refcount.
1261 */
1262 if (!vblank->inmodeset) {
1263 atomic_inc(&vblank->refcount);
1264 vblank->inmodeset = 1;
1265 }
1266 spin_unlock(&dev->vbl_lock);
1267
498548ec 1268 /* Send any queued vblank events, lest the natives grow disquiet */
cc1ef118 1269 seq = drm_vblank_count_and_time(dev, pipe, &now);
e7783ba3 1270
498548ec 1271 list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) {
cc1ef118 1272 if (e->pipe != pipe)
498548ec
CJHR
1273 continue;
1274 DRM_DEBUG("Sending premature vblank event on disable: \
1275 wanted %d, current %d\n",
1276 e->event.sequence, seq);
c6eefa17 1277 list_del(&e->base.link);
cc1ef118 1278 drm_vblank_put(dev, pipe);
c6eefa17 1279 send_vblank_event(dev, e, seq, &now);
498548ec 1280 }
56cc279b 1281 spin_unlock_irqrestore(&dev->event_lock, irqflags);
778c9026
LP
1282}
1283EXPORT_SYMBOL(drm_vblank_off);
1284
89dd6a4b
DV
1285/**
1286 * drm_crtc_vblank_off - disable vblank events on a CRTC
1287 * @crtc: CRTC in question
1288 *
1289 * Drivers can use this function to shut down the vblank interrupt handling when
1290 * disabling a crtc. This function ensures that the latest vblank frame count is
1291 * stored so that drm_vblank_on can restore it again.
1292 *
1293 * Drivers must use this function when the hardware vblank counter can get
1294 * reset, e.g. when suspending.
1295 *
1296 * This is the native kms version of drm_vblank_off().
1297 */
1298void drm_crtc_vblank_off(struct drm_crtc *crtc)
1299{
1300 drm_vblank_off(crtc->dev, drm_crtc_index(crtc));
1301}
1302EXPORT_SYMBOL(drm_crtc_vblank_off);
1303
9625604c
DV
1304/**
1305 * drm_crtc_vblank_reset - reset vblank state to off on a CRTC
2b193f02 1306 * @crtc: CRTC in question
9625604c
DV
1307 *
1308 * Drivers can use this function to reset the vblank state to off at load time.
1309 * Drivers should use this together with the drm_crtc_vblank_off() and
1310 * drm_crtc_vblank_on() functions. The difference compared to
1311 * drm_crtc_vblank_off() is that this function doesn't save the vblank counter
1312 * and hence doesn't need to call any driver hooks.
1313 */
2b193f02 1314void drm_crtc_vblank_reset(struct drm_crtc *crtc)
9625604c 1315{
2b193f02 1316 struct drm_device *dev = crtc->dev;
9625604c 1317 unsigned long irqflags;
2b193f02 1318 unsigned int pipe = drm_crtc_index(crtc);
1da248a5 1319 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
9625604c
DV
1320
1321 spin_lock_irqsave(&dev->vbl_lock, irqflags);
1322 /*
1323 * Prevent subsequent drm_vblank_get() from enabling the vblank
1324 * interrupt by bumping the refcount.
1325 */
1326 if (!vblank->inmodeset) {
1327 atomic_inc(&vblank->refcount);
1328 vblank->inmodeset = 1;
1329 }
1330 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
1331
1332 WARN_ON(!list_empty(&dev->vblank_event_list));
1333}
1334EXPORT_SYMBOL(drm_crtc_vblank_reset);
1335
f2752282
VS
1336/**
1337 * drm_vblank_on - enable vblank events on a CRTC
1338 * @dev: DRM device
cc1ef118 1339 * @pipe: CRTC index
f5752b38
DV
1340 *
1341 * This functions restores the vblank interrupt state captured with
1342 * drm_vblank_off() again. Note that calls to drm_vblank_on() and
32197aab 1343 * drm_vblank_off() can be unbalanced and so can also be unconditionally called
f5752b38 1344 * in driver load code to reflect the current hardware state of the crtc.
89dd6a4b
DV
1345 *
1346 * This is the legacy version of drm_crtc_vblank_on().
f2752282 1347 */
cc1ef118 1348void drm_vblank_on(struct drm_device *dev, unsigned int pipe)
f2752282 1349{
cc1ef118 1350 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
f2752282
VS
1351 unsigned long irqflags;
1352
cc1ef118 1353 if (WARN_ON(pipe >= dev->num_crtcs))
e6ae8687
RC
1354 return;
1355
f2752282 1356 spin_lock_irqsave(&dev->vbl_lock, irqflags);
7ffd7a68 1357 /* Drop our private "prevent drm_vblank_get" refcount */
8a51d5be
VS
1358 if (vblank->inmodeset) {
1359 atomic_dec(&vblank->refcount);
1360 vblank->inmodeset = 0;
7ffd7a68 1361 }
f8ad028c 1362
4dfd6486
VS
1363 drm_reset_vblank_timestamp(dev, pipe);
1364
cd19e52a
VS
1365 /*
1366 * re-enable interrupts if there are users left, or the
1367 * user wishes vblank interrupts to be enabled all the time.
1368 */
1369 if (atomic_read(&vblank->refcount) != 0 ||
1370 (!dev->vblank_disable_immediate && drm_vblank_offdelay == 0))
cc1ef118 1371 WARN_ON(drm_vblank_enable(dev, pipe));
f2752282
VS
1372 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
1373}
1374EXPORT_SYMBOL(drm_vblank_on);
1375
89dd6a4b
DV
1376/**
1377 * drm_crtc_vblank_on - enable vblank events on a CRTC
1378 * @crtc: CRTC in question
1379 *
1380 * This functions restores the vblank interrupt state captured with
1381 * drm_vblank_off() again. Note that calls to drm_vblank_on() and
32197aab 1382 * drm_vblank_off() can be unbalanced and so can also be unconditionally called
89dd6a4b
DV
1383 * in driver load code to reflect the current hardware state of the crtc.
1384 *
1385 * This is the native kms version of drm_vblank_on().
1386 */
1387void drm_crtc_vblank_on(struct drm_crtc *crtc)
1388{
1389 drm_vblank_on(crtc->dev, drm_crtc_index(crtc));
1390}
1391EXPORT_SYMBOL(drm_crtc_vblank_on);
1392
f453ba04
DA
1393/**
1394 * drm_vblank_pre_modeset - account for vblanks across mode sets
1395 * @dev: DRM device
cc1ef118 1396 * @pipe: CRTC index
f453ba04
DA
1397 *
1398 * Account for vblank events across mode setting events, which will likely
1399 * reset the hardware frame counter.
f5752b38
DV
1400 *
1401 * This is done by grabbing a temporary vblank reference to ensure that the
1402 * vblank interrupt keeps running across the modeset sequence. With this the
1403 * software-side vblank frame counting will ensure that there are no jumps or
1404 * discontinuities.
1405 *
1406 * Unfortunately this approach is racy and also doesn't work when the vblank
1407 * interrupt stops running, e.g. across system suspend resume. It is therefore
1408 * highly recommended that drivers use the newer drm_vblank_off() and
1409 * drm_vblank_on() instead. drm_vblank_pre_modeset() only works correctly when
1410 * using "cooked" software vblank frame counters and not relying on any hardware
1411 * counters.
1412 *
1413 * Drivers must call drm_vblank_post_modeset() when re-enabling the same crtc
1414 * again.
f453ba04 1415 */
cc1ef118 1416void drm_vblank_pre_modeset(struct drm_device *dev, unsigned int pipe)
f453ba04 1417{
cc1ef118 1418 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
8a51d5be 1419
b7ea85a4 1420 /* vblank is not initialized (IRQ not installed ?), or has been freed */
e77cef9c
JG
1421 if (!dev->num_crtcs)
1422 return;
e6ae8687 1423
cc1ef118 1424 if (WARN_ON(pipe >= dev->num_crtcs))
e6ae8687
RC
1425 return;
1426
f453ba04
DA
1427 /*
1428 * To avoid all the problems that might happen if interrupts
1429 * were enabled/disabled around or between these calls, we just
1430 * have the kernel take a reference on the CRTC (just once though
1431 * to avoid corrupting the count if multiple, mismatch calls occur),
1432 * so that interrupts remain enabled in the interim.
1433 */
8a51d5be
VS
1434 if (!vblank->inmodeset) {
1435 vblank->inmodeset = 0x1;
cc1ef118 1436 if (drm_vblank_get(dev, pipe) == 0)
8a51d5be 1437 vblank->inmodeset |= 0x2;
f453ba04
DA
1438 }
1439}
1440EXPORT_SYMBOL(drm_vblank_pre_modeset);
1441
f5752b38
DV
1442/**
1443 * drm_vblank_post_modeset - undo drm_vblank_pre_modeset changes
1444 * @dev: DRM device
cc1ef118 1445 * @pipe: CRTC index
f5752b38
DV
1446 *
1447 * This function again drops the temporary vblank reference acquired in
1448 * drm_vblank_pre_modeset.
1449 */
cc1ef118 1450void drm_vblank_post_modeset(struct drm_device *dev, unsigned int pipe)
f453ba04 1451{
cc1ef118 1452 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
f453ba04
DA
1453 unsigned long irqflags;
1454
b7ea85a4
HC
1455 /* vblank is not initialized (IRQ not installed ?), or has been freed */
1456 if (!dev->num_crtcs)
1457 return;
1458
cc1ef118 1459 if (WARN_ON(pipe >= dev->num_crtcs))
7d1de851
TR
1460 return;
1461
8a51d5be 1462 if (vblank->inmodeset) {
f453ba04 1463 spin_lock_irqsave(&dev->vbl_lock, irqflags);
ba0bf120 1464 dev->vblank_disable_allowed = true;
f453ba04 1465 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
b3f5e732 1466
8a51d5be 1467 if (vblank->inmodeset & 0x2)
cc1ef118 1468 drm_vblank_put(dev, pipe);
b3f5e732 1469
8a51d5be 1470 vblank->inmodeset = 0;
f453ba04
DA
1471 }
1472}
1473EXPORT_SYMBOL(drm_vblank_post_modeset);
1474
f5752b38 1475/*
0a3e67a4
JB
1476 * drm_modeset_ctl - handle vblank event counter changes across mode switch
1477 * @DRM_IOCTL_ARGS: standard ioctl arguments
1478 *
1479 * Applications should call the %_DRM_PRE_MODESET and %_DRM_POST_MODESET
1480 * ioctls around modesetting so that any lost vblank events are accounted for.
1481 *
1482 * Generally the counter will reset across mode sets. If interrupts are
1483 * enabled around this call, we don't have to do anything since the counter
1484 * will have already been incremented.
1485 */
1486int drm_modeset_ctl(struct drm_device *dev, void *data,
1487 struct drm_file *file_priv)
1488{
1489 struct drm_modeset_ctl *modeset = data;
cc1ef118 1490 unsigned int pipe;
0a3e67a4
JB
1491
1492 /* If drm_vblank_init() hasn't been called yet, just no-op */
1493 if (!dev->num_crtcs)
4a1b0714 1494 return 0;
0a3e67a4 1495
29935554
LP
1496 /* KMS drivers handle this internally */
1497 if (drm_core_check_feature(dev, DRIVER_MODESET))
1498 return 0;
1499
cc1ef118
TR
1500 pipe = modeset->crtc;
1501 if (pipe >= dev->num_crtcs)
4a1b0714 1502 return -EINVAL;
0a3e67a4 1503
0a3e67a4
JB
1504 switch (modeset->cmd) {
1505 case _DRM_PRE_MODESET:
cc1ef118 1506 drm_vblank_pre_modeset(dev, pipe);
0a3e67a4
JB
1507 break;
1508 case _DRM_POST_MODESET:
cc1ef118 1509 drm_vblank_post_modeset(dev, pipe);
0a3e67a4
JB
1510 break;
1511 default:
4a1b0714 1512 return -EINVAL;
0a3e67a4
JB
1513 }
1514
4a1b0714 1515 return 0;
0a3e67a4
JB
1516}
1517
cc1ef118 1518static int drm_queue_vblank_event(struct drm_device *dev, unsigned int pipe,
c9a9c5e0
KH
1519 union drm_wait_vblank *vblwait,
1520 struct drm_file *file_priv)
1521{
ffe7c73a 1522 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
c9a9c5e0
KH
1523 struct drm_pending_vblank_event *e;
1524 struct timeval now;
1525 unsigned long flags;
1526 unsigned int seq;
ea5d552c 1527 int ret;
c9a9c5e0 1528
f76511b9 1529 e = kzalloc(sizeof(*e), GFP_KERNEL);
ea5d552c
CW
1530 if (e == NULL) {
1531 ret = -ENOMEM;
1532 goto err_put;
1533 }
c9a9c5e0
KH
1534
1535 e->pipe = pipe;
b9c2c9ae 1536 e->base.pid = current->pid;
c9a9c5e0 1537 e->event.base.type = DRM_EVENT_VBLANK;
f76511b9 1538 e->event.base.length = sizeof(e->event);
c9a9c5e0
KH
1539 e->event.user_data = vblwait->request.signal;
1540 e->base.event = &e->event.base;
1541 e->base.file_priv = file_priv;
1542 e->base.destroy = (void (*) (struct drm_pending_event *)) kfree;
1543
c9a9c5e0
KH
1544 spin_lock_irqsave(&dev->event_lock, flags);
1545
ffe7c73a
VS
1546 /*
1547 * drm_vblank_off() might have been called after we called
1548 * drm_vblank_get(). drm_vblank_off() holds event_lock
1549 * around the vblank disable, so no need for further locking.
1550 * The reference from drm_vblank_get() protects against
1551 * vblank disable from another source.
1552 */
1553 if (!vblank->enabled) {
1554 ret = -EINVAL;
1555 goto err_unlock;
1556 }
1557
f76511b9 1558 if (file_priv->event_space < sizeof(e->event)) {
ea5d552c
CW
1559 ret = -EBUSY;
1560 goto err_unlock;
c9a9c5e0
KH
1561 }
1562
f76511b9 1563 file_priv->event_space -= sizeof(e->event);
27641c3f
MK
1564 seq = drm_vblank_count_and_time(dev, pipe, &now);
1565
c9a9c5e0
KH
1566 if ((vblwait->request.type & _DRM_VBLANK_NEXTONMISS) &&
1567 (seq - vblwait->request.sequence) <= (1 << 23)) {
1568 vblwait->request.sequence = seq + 1;
4a921645 1569 vblwait->reply.sequence = vblwait->request.sequence;
c9a9c5e0
KH
1570 }
1571
cc1ef118 1572 DRM_DEBUG("event on vblank count %d, current %d, crtc %u\n",
c9a9c5e0
KH
1573 vblwait->request.sequence, seq, pipe);
1574
b9c2c9ae
JB
1575 trace_drm_vblank_event_queued(current->pid, pipe,
1576 vblwait->request.sequence);
1577
c9a9c5e0
KH
1578 e->event.sequence = vblwait->request.sequence;
1579 if ((seq - vblwait->request.sequence) <= (1 << 23)) {
6f331623 1580 drm_vblank_put(dev, pipe);
c6eefa17 1581 send_vblank_event(dev, e, seq, &now);
000fa7cf 1582 vblwait->reply.sequence = seq;
c9a9c5e0 1583 } else {
a6778e9e 1584 /* drm_handle_vblank_events will call drm_vblank_put */
c9a9c5e0 1585 list_add_tail(&e->base.link, &dev->vblank_event_list);
000fa7cf 1586 vblwait->reply.sequence = vblwait->request.sequence;
c9a9c5e0
KH
1587 }
1588
1589 spin_unlock_irqrestore(&dev->event_lock, flags);
1590
1591 return 0;
ea5d552c
CW
1592
1593err_unlock:
1594 spin_unlock_irqrestore(&dev->event_lock, flags);
1595 kfree(e);
1596err_put:
6f331623 1597 drm_vblank_put(dev, pipe);
ea5d552c 1598 return ret;
c9a9c5e0
KH
1599}
1600
f5752b38 1601/*
1da177e4
LT
1602 * Wait for VBLANK.
1603 *
1604 * \param inode device inode.
6c340eac 1605 * \param file_priv DRM file private.
1da177e4
LT
1606 * \param cmd command.
1607 * \param data user argument, pointing to a drm_wait_vblank structure.
1608 * \return zero on success or a negative number on failure.
1609 *
30b23634
EA
1610 * This function enables the vblank interrupt on the pipe requested, then
1611 * sleeps waiting for the requested sequence number to occur, and drops
f5752b38 1612 * the vblank interrupt refcount afterwards. (vblank IRQ disable follows that
30b23634 1613 * after a timeout with no further vblank waits scheduled).
1da177e4 1614 */
0a3e67a4
JB
1615int drm_wait_vblank(struct drm_device *dev, void *data,
1616 struct drm_file *file_priv)
1da177e4 1617{
8a51d5be 1618 struct drm_vblank_crtc *vblank;
c153f45f 1619 union drm_wait_vblank *vblwait = data;
4a1b0714 1620 int ret;
cc1ef118 1621 unsigned int flags, seq, pipe, high_pipe;
1da177e4 1622
4984979b
DV
1623 if (!dev->irq_enabled)
1624 return -EINVAL;
1da177e4 1625
30b23634
EA
1626 if (vblwait->request.type & _DRM_VBLANK_SIGNAL)
1627 return -EINVAL;
1628
c153f45f 1629 if (vblwait->request.type &
19b01b5f
IH
1630 ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK |
1631 _DRM_VBLANK_HIGH_CRTC_MASK)) {
776c9443 1632 DRM_ERROR("Unsupported type value 0x%x, supported mask 0x%x\n",
c153f45f 1633 vblwait->request.type,
19b01b5f
IH
1634 (_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK |
1635 _DRM_VBLANK_HIGH_CRTC_MASK));
776c9443
MD
1636 return -EINVAL;
1637 }
1638
c153f45f 1639 flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK;
cc1ef118
TR
1640 high_pipe = (vblwait->request.type & _DRM_VBLANK_HIGH_CRTC_MASK);
1641 if (high_pipe)
1642 pipe = high_pipe >> _DRM_VBLANK_HIGH_CRTC_SHIFT;
19b01b5f 1643 else
cc1ef118
TR
1644 pipe = flags & _DRM_VBLANK_SECONDARY ? 1 : 0;
1645 if (pipe >= dev->num_crtcs)
776c9443
MD
1646 return -EINVAL;
1647
cc1ef118 1648 vblank = &dev->vblank[pipe];
8a51d5be 1649
cc1ef118 1650 ret = drm_vblank_get(dev, pipe);
0a3e67a4 1651 if (ret) {
8d3457ec 1652 DRM_DEBUG("failed to acquire vblank counter, %d\n", ret);
0a3e67a4
JB
1653 return ret;
1654 }
cc1ef118 1655 seq = drm_vblank_count(dev, pipe);
776c9443 1656
c153f45f 1657 switch (vblwait->request.type & _DRM_VBLANK_TYPES_MASK) {
1da177e4 1658 case _DRM_VBLANK_RELATIVE:
c153f45f
EA
1659 vblwait->request.sequence += seq;
1660 vblwait->request.type &= ~_DRM_VBLANK_RELATIVE;
1da177e4
LT
1661 case _DRM_VBLANK_ABSOLUTE:
1662 break;
1663 default:
0a3e67a4
JB
1664 ret = -EINVAL;
1665 goto done;
1da177e4
LT
1666 }
1667
a6778e9e
IH
1668 if (flags & _DRM_VBLANK_EVENT) {
1669 /* must hold on to the vblank ref until the event fires
1670 * drm_vblank_put will be called asynchronously
1671 */
cc1ef118 1672 return drm_queue_vblank_event(dev, pipe, vblwait, file_priv);
a6778e9e 1673 }
c9a9c5e0 1674
ab285d74 1675 if ((flags & _DRM_VBLANK_NEXTONMISS) &&
c153f45f
EA
1676 (seq - vblwait->request.sequence) <= (1<<23)) {
1677 vblwait->request.sequence = seq + 1;
ab285d74
MD
1678 }
1679
cc1ef118
TR
1680 DRM_DEBUG("waiting on vblank count %d, crtc %u\n",
1681 vblwait->request.sequence, pipe);
8a51d5be
VS
1682 vblank->last_wait = vblwait->request.sequence;
1683 DRM_WAIT_ON(ret, vblank->queue, 3 * HZ,
cc1ef118 1684 (((drm_vblank_count(dev, pipe) -
30b23634 1685 vblwait->request.sequence) <= (1 << 23)) ||
8a51d5be 1686 !vblank->enabled ||
30b23634 1687 !dev->irq_enabled));
1da177e4 1688
30b23634
EA
1689 if (ret != -EINTR) {
1690 struct timeval now;
1da177e4 1691
cc1ef118 1692 vblwait->reply.sequence = drm_vblank_count_and_time(dev, pipe, &now);
30b23634
EA
1693 vblwait->reply.tval_sec = now.tv_sec;
1694 vblwait->reply.tval_usec = now.tv_usec;
27641c3f 1695
30b23634
EA
1696 DRM_DEBUG("returning %d to client\n",
1697 vblwait->reply.sequence);
1da177e4 1698 } else {
30b23634 1699 DRM_DEBUG("vblank wait interrupted by signal\n");
1da177e4
LT
1700 }
1701
0a3e67a4 1702done:
cc1ef118 1703 drm_vblank_put(dev, pipe);
1da177e4
LT
1704 return ret;
1705}
1706
cc1ef118 1707static void drm_handle_vblank_events(struct drm_device *dev, unsigned int pipe)
c9a9c5e0
KH
1708{
1709 struct drm_pending_vblank_event *e, *t;
1710 struct timeval now;
c9a9c5e0
KH
1711 unsigned int seq;
1712
56cc279b 1713 assert_spin_locked(&dev->event_lock);
c9a9c5e0 1714
cc1ef118 1715 seq = drm_vblank_count_and_time(dev, pipe, &now);
c9a9c5e0
KH
1716
1717 list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) {
cc1ef118 1718 if (e->pipe != pipe)
c9a9c5e0
KH
1719 continue;
1720 if ((seq - e->event.sequence) > (1<<23))
1721 continue;
1722
1723 DRM_DEBUG("vblank event on %d, current %d\n",
1724 e->event.sequence, seq);
1725
c6eefa17 1726 list_del(&e->base.link);
cc1ef118 1727 drm_vblank_put(dev, pipe);
c6eefa17 1728 send_vblank_event(dev, e, seq, &now);
c9a9c5e0
KH
1729 }
1730
cc1ef118 1731 trace_drm_vblank_event(pipe, seq);
c9a9c5e0
KH
1732}
1733
0a3e67a4
JB
1734/**
1735 * drm_handle_vblank - handle a vblank event
1736 * @dev: DRM device
cc1ef118 1737 * @pipe: index of CRTC where this event occurred
0a3e67a4
JB
1738 *
1739 * Drivers should call this routine in their vblank interrupt handlers to
1740 * update the vblank counter and send any signals that may be pending.
115ebcd4
TR
1741 *
1742 * This is the legacy version of drm_crtc_handle_vblank().
0a3e67a4 1743 */
cc1ef118 1744bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe)
0a3e67a4 1745{
cc1ef118 1746 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
27641c3f
MK
1747 unsigned long irqflags;
1748
ee3c7795 1749 if (WARN_ON_ONCE(!dev->num_crtcs))
78c6e170 1750 return false;
c9a9c5e0 1751
cc1ef118 1752 if (WARN_ON(pipe >= dev->num_crtcs))
e6ae8687
RC
1753 return false;
1754
56cc279b
VS
1755 spin_lock_irqsave(&dev->event_lock, irqflags);
1756
27641c3f
MK
1757 /* Need timestamp lock to prevent concurrent execution with
1758 * vblank enable/disable, as this would cause inconsistent
1759 * or corrupted timestamps and vblank counts.
1760 */
56cc279b 1761 spin_lock(&dev->vblank_time_lock);
27641c3f
MK
1762
1763 /* Vblank irq handling disabled. Nothing to do. */
8a51d5be 1764 if (!vblank->enabled) {
56cc279b
VS
1765 spin_unlock(&dev->vblank_time_lock);
1766 spin_unlock_irqrestore(&dev->event_lock, irqflags);
78c6e170 1767 return false;
27641c3f
MK
1768 }
1769
4dfd6486 1770 drm_update_vblank_count(dev, pipe, DRM_CALLED_FROM_VBLIRQ);
27641c3f 1771
56cc279b
VS
1772 spin_unlock(&dev->vblank_time_lock);
1773
8a51d5be 1774 wake_up(&vblank->queue);
cc1ef118 1775 drm_handle_vblank_events(dev, pipe);
27641c3f 1776
56cc279b
VS
1777 spin_unlock_irqrestore(&dev->event_lock, irqflags);
1778
78c6e170 1779 return true;
0a3e67a4
JB
1780}
1781EXPORT_SYMBOL(drm_handle_vblank);
115ebcd4
TR
1782
1783/**
1784 * drm_crtc_handle_vblank - handle a vblank event
1785 * @crtc: where this event occurred
1786 *
1787 * Drivers should call this routine in their vblank interrupt handlers to
1788 * update the vblank counter and send any signals that may be pending.
1789 *
1790 * This is the native KMS version of drm_handle_vblank().
1791 *
1792 * Returns:
1793 * True if the event was successfully handled, false on failure.
1794 */
1795bool drm_crtc_handle_vblank(struct drm_crtc *crtc)
1796{
1797 return drm_handle_vblank(crtc->dev, drm_crtc_index(crtc));
1798}
1799EXPORT_SYMBOL(drm_crtc_handle_vblank);