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