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