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