1 /* $NetBSD: drm_vblank.c,v 1.16 2021/12/26 21:00:14 riastradh Exp $ */ 2 3 /* 4 * drm_irq.c IRQ and vblank support 5 * 6 * \author Rickard E. (Rik) Faith <faith (at) valinux.com> 7 * \author Gareth Hughes <gareth (at) valinux.com> 8 * 9 * Permission is hereby granted, free of charge, to any person obtaining a 10 * copy of this software and associated documentation files (the "Software"), 11 * to deal in the Software without restriction, including without limitation 12 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13 * and/or sell copies of the Software, and to permit persons to whom the 14 * Software is furnished to do so, subject to the following conditions: 15 * 16 * The above copyright notice and this permission notice (including the next 17 * paragraph) shall be included in all copies or substantial portions of the 18 * Software. 19 * 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 24 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 25 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 * OTHER DEALINGS IN THE SOFTWARE. 27 */ 28 29 #include <sys/cdefs.h> 30 __KERNEL_RCSID(0, "$NetBSD: drm_vblank.c,v 1.16 2021/12/26 21:00:14 riastradh Exp $"); 31 32 #include <linux/export.h> 33 #include <linux/moduleparam.h> 34 #include <linux/math64.h> 35 36 #include <drm/drm_crtc.h> 37 #include <drm/drm_drv.h> 38 #include <drm/drm_framebuffer.h> 39 #include <drm/drm_print.h> 40 #include <drm/drm_vblank.h> 41 42 #include "drm_internal.h" 43 #include "drm_trace.h" 44 45 /** 46 * DOC: vblank handling 47 * 48 * Vertical blanking plays a major role in graphics rendering. To achieve 49 * tear-free display, users must synchronize page flips and/or rendering to 50 * vertical blanking. The DRM API offers ioctls to perform page flips 51 * synchronized to vertical blanking and wait for vertical blanking. 52 * 53 * The DRM core handles most of the vertical blanking management logic, which 54 * involves filtering out spurious interrupts, keeping race-free blanking 55 * counters, coping with counter wrap-around and resets and keeping use counts. 56 * It relies on the driver to generate vertical blanking interrupts and 57 * optionally provide a hardware vertical blanking counter. 58 * 59 * Drivers must initialize the vertical blanking handling core with a call to 60 * drm_vblank_init(). Minimally, a driver needs to implement 61 * &drm_crtc_funcs.enable_vblank and &drm_crtc_funcs.disable_vblank plus call 62 * drm_crtc_handle_vblank() in its vblank interrupt handler for working vblank 63 * support. 64 * 65 * Vertical blanking interrupts can be enabled by the DRM core or by drivers 66 * themselves (for instance to handle page flipping operations). The DRM core 67 * maintains a vertical blanking use count to ensure that the interrupts are not 68 * disabled while a user still needs them. To increment the use count, drivers 69 * call drm_crtc_vblank_get() and release the vblank reference again with 70 * drm_crtc_vblank_put(). In between these two calls vblank interrupts are 71 * guaranteed to be enabled. 72 * 73 * On many hardware disabling the vblank interrupt cannot be done in a race-free 74 * manner, see &drm_driver.vblank_disable_immediate and 75 * &drm_driver.max_vblank_count. In that case the vblank core only disables the 76 * vblanks after a timer has expired, which can be configured through the 77 * ``vblankoffdelay`` module parameter. 78 * 79 * Lock order: event_lock -> vblank_time_lock 80 */ 81 82 /* Retry timestamp calculation up to 3 times to satisfy 83 * drm_timestamp_precision before giving up. 84 */ 85 #define DRM_TIMESTAMP_MAXRETRIES 3 86 87 /* Threshold in nanoseconds for detection of redundant 88 * vblank irq in drm_handle_vblank(). 1 msec should be ok. 89 */ 90 #define DRM_REDUNDANT_VBLIRQ_THRESH_NS 1000000 91 92 static bool 93 drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe, 94 ktime_t *tvblank, bool in_vblank_irq); 95 96 static unsigned int drm_timestamp_precision = 20; /* Default to 20 usecs. */ 97 98 static int drm_vblank_offdelay = 5000; /* Default to 5000 msecs. */ 99 100 module_param_named(vblankoffdelay, drm_vblank_offdelay, int, 0600); 101 module_param_named(timestamp_precision_usec, drm_timestamp_precision, int, 0600); 102 MODULE_PARM_DESC(vblankoffdelay, "Delay until vblank irq auto-disable [msecs] (0: never disable, <0: disable immediately)"); 103 MODULE_PARM_DESC(timestamp_precision_usec, "Max. error on timestamps [usecs]"); 104 105 static void store_vblank(struct drm_device *dev, unsigned int pipe, 106 u32 vblank_count_inc, 107 ktime_t t_vblank, u32 last) 108 { 109 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 110 111 assert_spin_locked(&dev->vblank_time_lock); 112 113 vblank->last = last; 114 115 write_seqlock(&vblank->seqlock); 116 vblank->time = t_vblank; 117 atomic64_add(vblank_count_inc, &vblank->count); 118 write_sequnlock(&vblank->seqlock); 119 } 120 121 static u32 drm_max_vblank_count(struct drm_device *dev, unsigned int pipe) 122 { 123 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 124 125 return vblank->max_vblank_count ?: dev->max_vblank_count; 126 } 127 128 /* 129 * "No hw counter" fallback implementation of .get_vblank_counter() hook, 130 * if there is no useable hardware frame counter available. 131 */ 132 static u32 drm_vblank_no_hw_counter(struct drm_device *dev, unsigned int pipe) 133 { 134 WARN_ON_ONCE(drm_max_vblank_count(dev, pipe) != 0); 135 return 0; 136 } 137 138 static u32 __get_vblank_counter(struct drm_device *dev, unsigned int pipe) 139 { 140 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 141 struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe); 142 143 if (WARN_ON(!crtc)) 144 return 0; 145 146 if (crtc->funcs->get_vblank_counter) 147 return crtc->funcs->get_vblank_counter(crtc); 148 } 149 150 if (dev->driver->get_vblank_counter) 151 return dev->driver->get_vblank_counter(dev, pipe); 152 153 return drm_vblank_no_hw_counter(dev, pipe); 154 } 155 156 /* 157 * Reset the stored timestamp for the current vblank count to correspond 158 * to the last vblank occurred. 159 * 160 * Only to be called from drm_crtc_vblank_on(). 161 * 162 * Note: caller must hold &drm_device.vbl_lock since this reads & writes 163 * device vblank fields. 164 */ 165 static void drm_reset_vblank_timestamp(struct drm_device *dev, unsigned int pipe) 166 { 167 u32 cur_vblank; 168 bool rc; 169 ktime_t t_vblank; 170 int count = DRM_TIMESTAMP_MAXRETRIES; 171 172 assert_spin_locked(&dev->event_lock); 173 174 spin_lock(&dev->vblank_time_lock); 175 176 /* 177 * sample the current counter to avoid random jumps 178 * when drm_vblank_enable() applies the diff 179 */ 180 do { 181 cur_vblank = __get_vblank_counter(dev, pipe); 182 rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, false); 183 } while (cur_vblank != __get_vblank_counter(dev, pipe) && --count > 0); 184 185 /* 186 * Only reinitialize corresponding vblank timestamp if high-precision query 187 * available and didn't fail. Otherwise reinitialize delayed at next vblank 188 * interrupt and assign 0 for now, to mark the vblanktimestamp as invalid. 189 */ 190 if (!rc) 191 t_vblank = 0; 192 193 /* 194 * +1 to make sure user will never see the same 195 * vblank counter value before and after a modeset 196 */ 197 store_vblank(dev, pipe, 1, t_vblank, cur_vblank); 198 199 spin_unlock(&dev->vblank_time_lock); 200 } 201 202 /* 203 * Call back into the driver to update the appropriate vblank counter 204 * (specified by @pipe). Deal with wraparound, if it occurred, and 205 * update the last read value so we can deal with wraparound on the next 206 * call if necessary. 207 * 208 * Only necessary when going from off->on, to account for frames we 209 * didn't get an interrupt for. 210 * 211 * Note: caller must hold &drm_device.vbl_lock since this reads & writes 212 * device vblank fields. 213 */ 214 static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe, 215 bool in_vblank_irq) 216 { 217 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 218 u32 cur_vblank, diff; 219 bool rc; 220 ktime_t t_vblank; 221 int count = DRM_TIMESTAMP_MAXRETRIES; 222 int framedur_ns = vblank->framedur_ns; 223 u32 max_vblank_count = drm_max_vblank_count(dev, pipe); 224 225 assert_spin_locked(&dev->event_lock); 226 227 /* 228 * Interrupts were disabled prior to this call, so deal with counter 229 * wrap if needed. 230 * NOTE! It's possible we lost a full dev->max_vblank_count + 1 events 231 * here if the register is small or we had vblank interrupts off for 232 * a long time. 233 * 234 * We repeat the hardware vblank counter & timestamp query until 235 * we get consistent results. This to prevent races between gpu 236 * updating its hardware counter while we are retrieving the 237 * corresponding vblank timestamp. 238 */ 239 do { 240 cur_vblank = __get_vblank_counter(dev, pipe); 241 rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, in_vblank_irq); 242 } while (cur_vblank != __get_vblank_counter(dev, pipe) && --count > 0); 243 244 if (max_vblank_count) { 245 /* trust the hw counter when it's around */ 246 diff = (cur_vblank - vblank->last) & max_vblank_count; 247 } else if (rc && framedur_ns) { 248 u64 diff_ns = ktime_to_ns(ktime_sub(t_vblank, vblank->time)); 249 250 /* 251 * Figure out how many vblanks we've missed based 252 * on the difference in the timestamps and the 253 * frame/field duration. 254 */ 255 256 DRM_DEBUG_VBL("crtc %u: Calculating number of vblanks." 257 " diff_ns = %lld, framedur_ns = %d)\n", 258 pipe, (long long) diff_ns, framedur_ns); 259 260 diff = DIV_ROUND_CLOSEST_ULL(diff_ns, framedur_ns); 261 262 if (diff == 0 && in_vblank_irq) 263 DRM_DEBUG_VBL("crtc %u: Redundant vblirq ignored\n", 264 pipe); 265 } else { 266 /* some kind of default for drivers w/o accurate vbl timestamping */ 267 diff = in_vblank_irq ? 1 : 0; 268 } 269 270 /* 271 * Within a drm_vblank_pre_modeset - drm_vblank_post_modeset 272 * interval? If so then vblank irqs keep running and it will likely 273 * happen that the hardware vblank counter is not trustworthy as it 274 * might reset at some point in that interval and vblank timestamps 275 * are not trustworthy either in that interval. Iow. this can result 276 * in a bogus diff >> 1 which must be avoided as it would cause 277 * random large forward jumps of the software vblank counter. 278 */ 279 if (diff > 1 && (vblank->inmodeset & 0x2)) { 280 DRM_DEBUG_VBL("clamping vblank bump to 1 on crtc %u: diffr=%u" 281 " due to pre-modeset.\n", pipe, diff); 282 diff = 1; 283 } 284 285 DRM_DEBUG_VBL("updating vblank count on crtc %u:" 286 " current=%"PRIu64", diff=%u, hw=%u hw_last=%u\n", 287 pipe, atomic64_read(&vblank->count), diff, 288 cur_vblank, vblank->last); 289 290 if (diff == 0) { 291 WARN_ON_ONCE(cur_vblank != vblank->last); 292 return; 293 } 294 295 /* 296 * Only reinitialize corresponding vblank timestamp if high-precision query 297 * available and didn't fail, or we were called from the vblank interrupt. 298 * Otherwise reinitialize delayed at next vblank interrupt and assign 0 299 * for now, to mark the vblanktimestamp as invalid. 300 */ 301 if (!rc && !in_vblank_irq) 302 t_vblank = 0; 303 304 store_vblank(dev, pipe, diff, t_vblank, cur_vblank); 305 } 306 307 static u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe) 308 { 309 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 310 u64 count; 311 312 if (WARN_ON(pipe >= dev->num_crtcs)) 313 return 0; 314 315 count = atomic64_read(&vblank->count); 316 317 /* 318 * This read barrier corresponds to the implicit write barrier of the 319 * write seqlock in store_vblank(). Note that this is the only place 320 * where we need an explicit barrier, since all other access goes 321 * through drm_vblank_count_and_time(), which already has the required 322 * read barrier curtesy of the read seqlock. 323 */ 324 smp_rmb(); 325 326 return count; 327 } 328 329 /** 330 * drm_crtc_accurate_vblank_count - retrieve the master vblank counter 331 * @crtc: which counter to retrieve 332 * 333 * This function is similar to drm_crtc_vblank_count() but this function 334 * interpolates to handle a race with vblank interrupts using the high precision 335 * timestamping support. 336 * 337 * This is mostly useful for hardware that can obtain the scanout position, but 338 * doesn't have a hardware frame counter. 339 */ 340 u64 drm_crtc_accurate_vblank_count(struct drm_crtc *crtc) 341 { 342 struct drm_device *dev = crtc->dev; 343 unsigned int pipe = drm_crtc_index(crtc); 344 u64 vblank; 345 unsigned long flags; 346 347 assert_spin_locked(&dev->event_lock); 348 349 WARN_ONCE(drm_debug_enabled(DRM_UT_VBL) && !dev->driver->get_vblank_timestamp, 350 "This function requires support for accurate vblank timestamps."); 351 352 spin_lock_irqsave(&dev->vblank_time_lock, flags); 353 354 drm_update_vblank_count(dev, pipe, false); 355 vblank = drm_vblank_count(dev, pipe); 356 357 spin_unlock_irqrestore(&dev->vblank_time_lock, flags); 358 359 return vblank; 360 } 361 EXPORT_SYMBOL(drm_crtc_accurate_vblank_count); 362 363 static void __disable_vblank(struct drm_device *dev, unsigned int pipe) 364 { 365 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 366 struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe); 367 368 if (WARN_ON(!crtc)) 369 return; 370 371 if (crtc->funcs->disable_vblank) { 372 crtc->funcs->disable_vblank(crtc); 373 return; 374 } 375 } 376 377 dev->driver->disable_vblank(dev, pipe); 378 } 379 380 /* 381 * Disable vblank irq's on crtc, make sure that last vblank count 382 * of hardware and corresponding consistent software vblank counter 383 * are preserved, even if there are any spurious vblank irq's after 384 * disable. 385 */ 386 void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe) 387 { 388 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 389 unsigned long irqflags; 390 391 assert_spin_locked(&dev->event_lock); 392 393 /* Prevent vblank irq processing while disabling vblank irqs, 394 * so no updates of timestamps or count can happen after we've 395 * disabled. Needed to prevent races in case of delayed irq's. 396 */ 397 spin_lock_irqsave(&dev->vblank_time_lock, irqflags); 398 399 /* 400 * Update vblank count and disable vblank interrupts only if the 401 * interrupts were enabled. This avoids calling the ->disable_vblank() 402 * operation in atomic context with the hardware potentially runtime 403 * suspended. 404 */ 405 if (!vblank->enabled) 406 goto out; 407 408 /* 409 * Update the count and timestamp to maintain the 410 * appearance that the counter has been ticking all along until 411 * this time. This makes the count account for the entire time 412 * between drm_crtc_vblank_on() and drm_crtc_vblank_off(). 413 */ 414 drm_update_vblank_count(dev, pipe, false); 415 __disable_vblank(dev, pipe); 416 vblank->enabled = false; 417 418 out: 419 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags); 420 } 421 422 static void 423 vblank_disable_locked(struct drm_vblank_crtc *vblank, struct drm_device *dev, 424 unsigned int pipe) 425 { 426 427 BUG_ON(vblank != &dev->vblank[pipe]); 428 assert_spin_locked(&dev->event_lock); 429 430 if (atomic_read(&vblank->refcount) == 0 && vblank->enabled) { 431 DRM_DEBUG("disabling vblank on crtc %u\n", pipe); 432 drm_vblank_disable_and_save(dev, pipe); 433 } 434 } 435 436 static void vblank_disable_fn(struct timer_list *t) 437 { 438 struct drm_vblank_crtc *vblank = from_timer(vblank, t, disable_timer); 439 struct drm_device *dev = vblank->dev; 440 unsigned int pipe = vblank->pipe; 441 unsigned long irqflags; 442 443 spin_lock_irqsave(&dev->event_lock, irqflags); 444 if (atomic_read(&vblank->refcount) == 0 && vblank->enabled) { 445 DRM_DEBUG("disabling vblank on crtc %u\n", pipe); 446 drm_vblank_disable_and_save(dev, pipe); 447 } 448 spin_unlock_irqrestore(&dev->event_lock, irqflags); 449 } 450 451 void drm_vblank_cleanup(struct drm_device *dev) 452 { 453 unsigned int pipe; 454 455 /* Bail if the driver didn't call drm_vblank_init() */ 456 if (dev->num_crtcs == 0) 457 return; 458 459 for (pipe = 0; pipe < dev->num_crtcs; pipe++) { 460 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 461 462 WARN_ON(READ_ONCE(vblank->enabled) && 463 drm_core_check_feature(dev, DRIVER_MODESET)); 464 465 del_timer_sync(&vblank->disable_timer); 466 seqlock_destroy(&vblank->seqlock); 467 } 468 469 kfree(dev->vblank); 470 471 dev->num_crtcs = 0; 472 473 spin_lock_destroy(&dev->vblank_time_lock); 474 } 475 476 /** 477 * drm_vblank_init - initialize vblank support 478 * @dev: DRM device 479 * @num_crtcs: number of CRTCs supported by @dev 480 * 481 * This function initializes vblank support for @num_crtcs display pipelines. 482 * Cleanup is handled by the DRM core, or through calling drm_dev_fini() for 483 * drivers with a &drm_driver.release callback. 484 * 485 * Returns: 486 * Zero on success or a negative error code on failure. 487 */ 488 int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs) 489 { 490 int ret = -ENOMEM; 491 unsigned int i; 492 493 spin_lock_init(&dev->vblank_time_lock); 494 495 dev->num_crtcs = num_crtcs; 496 497 dev->vblank = kcalloc(num_crtcs, sizeof(*dev->vblank), GFP_KERNEL); 498 if (!dev->vblank) 499 goto err; 500 501 for (i = 0; i < num_crtcs; i++) { 502 struct drm_vblank_crtc *vblank = &dev->vblank[i]; 503 504 vblank->dev = dev; 505 vblank->pipe = i; 506 DRM_INIT_WAITQUEUE(&vblank->queue, "drmvblnq"); 507 timer_setup(&vblank->disable_timer, vblank_disable_fn, 0); 508 seqlock_init(&vblank->seqlock); 509 } 510 511 DRM_INFO("Supports vblank timestamp caching Rev 2 (21.10.2013).\n"); 512 513 /* Driver specific high-precision vblank timestamping supported? */ 514 if (dev->driver->get_vblank_timestamp) 515 DRM_INFO("Driver supports precise vblank timestamp query.\n"); 516 else 517 DRM_INFO("No driver support for vblank timestamp query.\n"); 518 519 /* Must have precise timestamping for reliable vblank instant disable */ 520 if (dev->vblank_disable_immediate && !dev->driver->get_vblank_timestamp) { 521 dev->vblank_disable_immediate = false; 522 DRM_INFO("Setting vblank_disable_immediate to false because " 523 "get_vblank_timestamp == NULL\n"); 524 } 525 526 return 0; 527 528 err: 529 dev->num_crtcs = 0; 530 return ret; 531 } 532 EXPORT_SYMBOL(drm_vblank_init); 533 534 /** 535 * drm_crtc_vblank_waitqueue - get vblank waitqueue for the CRTC 536 * @crtc: which CRTC's vblank waitqueue to retrieve 537 * 538 * This function returns a pointer to the vblank waitqueue for the CRTC. 539 * Drivers can use this to implement vblank waits using wait_event() and related 540 * functions. 541 */ 542 drm_waitqueue_t *drm_crtc_vblank_waitqueue(struct drm_crtc *crtc) 543 { 544 return &crtc->dev->vblank[drm_crtc_index(crtc)].queue; 545 } 546 EXPORT_SYMBOL(drm_crtc_vblank_waitqueue); 547 548 549 /** 550 * drm_calc_timestamping_constants - calculate vblank timestamp constants 551 * @crtc: drm_crtc whose timestamp constants should be updated. 552 * @mode: display mode containing the scanout timings 553 * 554 * Calculate and store various constants which are later needed by vblank and 555 * swap-completion timestamping, e.g, by 556 * drm_calc_vbltimestamp_from_scanoutpos(). They are derived from CRTC's true 557 * scanout timing, so they take things like panel scaling or other adjustments 558 * into account. 559 */ 560 void drm_calc_timestamping_constants(struct drm_crtc *crtc, 561 const struct drm_display_mode *mode) 562 { 563 struct drm_device *dev = crtc->dev; 564 unsigned int pipe = drm_crtc_index(crtc); 565 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 566 int linedur_ns = 0, framedur_ns = 0; 567 int dotclock = mode->crtc_clock; 568 569 if (!dev->num_crtcs) 570 return; 571 572 if (WARN_ON(pipe >= dev->num_crtcs)) 573 return; 574 575 /* Valid dotclock? */ 576 if (dotclock > 0) { 577 int frame_size = mode->crtc_htotal * mode->crtc_vtotal; 578 579 /* 580 * Convert scanline length in pixels and video 581 * dot clock to line duration and frame duration 582 * in nanoseconds: 583 */ 584 linedur_ns = div_u64((u64) mode->crtc_htotal * 1000000, dotclock); 585 framedur_ns = div_u64((u64) frame_size * 1000000, dotclock); 586 587 /* 588 * Fields of interlaced scanout modes are only half a frame duration. 589 */ 590 if (mode->flags & DRM_MODE_FLAG_INTERLACE) 591 framedur_ns /= 2; 592 } else 593 DRM_ERROR("crtc %u: Can't calculate constants, dotclock = 0!\n", 594 crtc->base.id); 595 596 vblank->linedur_ns = linedur_ns; 597 vblank->framedur_ns = framedur_ns; 598 vblank->hwmode = *mode; 599 600 DRM_DEBUG("crtc %u: hwmode: htotal %d, vtotal %d, vdisplay %d\n", 601 crtc->base.id, mode->crtc_htotal, 602 mode->crtc_vtotal, mode->crtc_vdisplay); 603 DRM_DEBUG("crtc %u: clock %d kHz framedur %d linedur %d\n", 604 crtc->base.id, dotclock, framedur_ns, linedur_ns); 605 } 606 EXPORT_SYMBOL(drm_calc_timestamping_constants); 607 608 /** 609 * drm_calc_vbltimestamp_from_scanoutpos - precise vblank timestamp helper 610 * @dev: DRM device 611 * @pipe: index of CRTC whose vblank timestamp to retrieve 612 * @max_error: Desired maximum allowable error in timestamps (nanosecs) 613 * On return contains true maximum error of timestamp 614 * @vblank_time: Pointer to time which should receive the timestamp 615 * @in_vblank_irq: 616 * True when called from drm_crtc_handle_vblank(). Some drivers 617 * need to apply some workarounds for gpu-specific vblank irq quirks 618 * if flag is set. 619 * 620 * Implements calculation of exact vblank timestamps from given drm_display_mode 621 * timings and current video scanout position of a CRTC. This can be directly 622 * used as the &drm_driver.get_vblank_timestamp implementation of a kms driver 623 * if &drm_driver.get_scanout_position is implemented. 624 * 625 * The current implementation only handles standard video modes. For double scan 626 * and interlaced modes the driver is supposed to adjust the hardware mode 627 * (taken from &drm_crtc_state.adjusted mode for atomic modeset drivers) to 628 * match the scanout position reported. 629 * 630 * Note that atomic drivers must call drm_calc_timestamping_constants() before 631 * enabling a CRTC. The atomic helpers already take care of that in 632 * drm_atomic_helper_update_legacy_modeset_state(). 633 * 634 * Returns: 635 * 636 * Returns true on success, and false on failure, i.e. when no accurate 637 * timestamp could be acquired. 638 */ 639 bool drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, 640 unsigned int pipe, 641 int *max_error, 642 ktime_t *vblank_time, 643 bool in_vblank_irq) 644 { 645 struct timespec64 ts_etime, ts_vblank_time; 646 ktime_t stime, etime; 647 bool vbl_status; 648 struct drm_crtc *crtc; 649 const struct drm_display_mode *mode; 650 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 651 int vpos, hpos, i; 652 int delta_ns, duration_ns; 653 654 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 655 return false; 656 657 crtc = drm_crtc_from_index(dev, pipe); 658 659 if (pipe >= dev->num_crtcs || !crtc) { 660 DRM_ERROR("Invalid crtc %u\n", pipe); 661 return false; 662 } 663 664 /* Scanout position query not supported? Should not happen. */ 665 if (!dev->driver->get_scanout_position) { 666 DRM_ERROR("Called from driver w/o get_scanout_position()!?\n"); 667 return false; 668 } 669 670 if (drm_drv_uses_atomic_modeset(dev)) 671 mode = &vblank->hwmode; 672 else 673 mode = &crtc->hwmode; 674 675 /* If mode timing undefined, just return as no-op: 676 * Happens during initial modesetting of a crtc. 677 */ 678 if (mode->crtc_clock == 0) { 679 DRM_DEBUG("crtc %u: Noop due to uninitialized mode.\n", pipe); 680 WARN_ON_ONCE(drm_drv_uses_atomic_modeset(dev)); 681 682 return false; 683 } 684 685 /* Get current scanout position with system timestamp. 686 * Repeat query up to DRM_TIMESTAMP_MAXRETRIES times 687 * if single query takes longer than max_error nanoseconds. 688 * 689 * This guarantees a tight bound on maximum error if 690 * code gets preempted or delayed for some reason. 691 */ 692 for (i = 0; i < DRM_TIMESTAMP_MAXRETRIES; i++) { 693 /* 694 * Get vertical and horizontal scanout position vpos, hpos, 695 * and bounding timestamps stime, etime, pre/post query. 696 */ 697 vbl_status = dev->driver->get_scanout_position(dev, pipe, 698 in_vblank_irq, 699 &vpos, &hpos, 700 &stime, &etime, 701 mode); 702 703 /* Return as no-op if scanout query unsupported or failed. */ 704 if (!vbl_status) { 705 DRM_DEBUG("crtc %u : scanoutpos query failed.\n", 706 pipe); 707 return false; 708 } 709 710 /* Compute uncertainty in timestamp of scanout position query. */ 711 duration_ns = ktime_to_ns(etime) - ktime_to_ns(stime); 712 713 /* Accept result with < max_error nsecs timing uncertainty. */ 714 if (duration_ns <= *max_error) 715 break; 716 } 717 718 /* Noisy system timing? */ 719 if (i == DRM_TIMESTAMP_MAXRETRIES) { 720 DRM_DEBUG("crtc %u: Noisy timestamp %d us > %d us [%d reps].\n", 721 pipe, duration_ns/1000, *max_error/1000, i); 722 } 723 724 /* Return upper bound of timestamp precision error. */ 725 *max_error = duration_ns; 726 727 /* Convert scanout position into elapsed time at raw_time query 728 * since start of scanout at first display scanline. delta_ns 729 * can be negative if start of scanout hasn't happened yet. 730 */ 731 delta_ns = div_s64(1000000LL * (vpos * mode->crtc_htotal + hpos), 732 mode->crtc_clock); 733 734 /* Subtract time delta from raw timestamp to get final 735 * vblank_time timestamp for end of vblank. 736 */ 737 *vblank_time = ktime_sub_ns(etime, delta_ns); 738 739 if (!drm_debug_enabled(DRM_UT_VBL)) 740 return true; 741 742 ts_etime = ktime_to_timespec64(etime); 743 ts_vblank_time = ktime_to_timespec64(*vblank_time); 744 745 DRM_DEBUG_VBL("crtc %u : v p(%d,%d)@ %"PRId64".%06ld -> %"PRId64".%06ld [e %d us, %d rep]\n", 746 pipe, hpos, vpos, 747 (u64)ts_etime.tv_sec, ts_etime.tv_nsec / 1000, 748 (u64)ts_vblank_time.tv_sec, ts_vblank_time.tv_nsec / 1000, 749 duration_ns / 1000, i); 750 751 return true; 752 } 753 EXPORT_SYMBOL(drm_calc_vbltimestamp_from_scanoutpos); 754 755 /** 756 * drm_get_last_vbltimestamp - retrieve raw timestamp for the most recent 757 * vblank interval 758 * @dev: DRM device 759 * @pipe: index of CRTC whose vblank timestamp to retrieve 760 * @tvblank: Pointer to target time which should receive the timestamp 761 * @in_vblank_irq: 762 * True when called from drm_crtc_handle_vblank(). Some drivers 763 * need to apply some workarounds for gpu-specific vblank irq quirks 764 * if flag is set. 765 * 766 * Fetches the system timestamp corresponding to the time of the most recent 767 * vblank interval on specified CRTC. May call into kms-driver to 768 * compute the timestamp with a high-precision GPU specific method. 769 * 770 * Returns zero if timestamp originates from uncorrected do_gettimeofday() 771 * call, i.e., it isn't very precisely locked to the true vblank. 772 * 773 * Returns: 774 * True if timestamp is considered to be very precise, false otherwise. 775 */ 776 static bool 777 drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe, 778 ktime_t *tvblank, bool in_vblank_irq) 779 { 780 bool ret = false; 781 782 /* Define requested maximum error on timestamps (nanoseconds). */ 783 int max_error = (int) drm_timestamp_precision * 1000; 784 785 /* Query driver if possible and precision timestamping enabled. */ 786 if (dev->driver->get_vblank_timestamp && (max_error > 0)) 787 ret = dev->driver->get_vblank_timestamp(dev, pipe, &max_error, 788 tvblank, in_vblank_irq); 789 790 /* GPU high precision timestamp query unsupported or failed. 791 * Return current monotonic/gettimeofday timestamp as best estimate. 792 */ 793 if (!ret) 794 *tvblank = ktime_get(); 795 796 return ret; 797 } 798 799 /** 800 * drm_crtc_vblank_count - retrieve "cooked" vblank counter value 801 * @crtc: which counter to retrieve 802 * 803 * Fetches the "cooked" vblank count value that represents the number of 804 * vblank events since the system was booted, including lost events due to 805 * modesetting activity. Note that this timer isn't correct against a racing 806 * vblank interrupt (since it only reports the software vblank counter), see 807 * drm_crtc_accurate_vblank_count() for such use-cases. 808 * 809 * Note that for a given vblank counter value drm_crtc_handle_vblank() 810 * and drm_crtc_vblank_count() or drm_crtc_vblank_count_and_time() 811 * provide a barrier: Any writes done before calling 812 * drm_crtc_handle_vblank() will be visible to callers of the later 813 * functions, iff the vblank count is the same or a later one. 814 * 815 * See also &drm_vblank_crtc.count. 816 * 817 * Returns: 818 * The software vblank counter. 819 */ 820 u64 drm_crtc_vblank_count(struct drm_crtc *crtc) 821 { 822 return drm_vblank_count(crtc->dev, drm_crtc_index(crtc)); 823 } 824 EXPORT_SYMBOL(drm_crtc_vblank_count); 825 826 /** 827 * drm_vblank_count_and_time - retrieve "cooked" vblank counter value and the 828 * system timestamp corresponding to that vblank counter value. 829 * @dev: DRM device 830 * @pipe: index of CRTC whose counter to retrieve 831 * @vblanktime: Pointer to ktime_t to receive the vblank timestamp. 832 * 833 * Fetches the "cooked" vblank count value that represents the number of 834 * vblank events since the system was booted, including lost events due to 835 * modesetting activity. Returns corresponding system timestamp of the time 836 * of the vblank interval that corresponds to the current vblank counter value. 837 * 838 * This is the legacy version of drm_crtc_vblank_count_and_time(). 839 */ 840 static u64 drm_vblank_count_and_time(struct drm_device *dev, unsigned int pipe, 841 ktime_t *vblanktime) 842 { 843 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 844 u64 vblank_count; 845 unsigned int seq; 846 847 if (WARN_ON(pipe >= dev->num_crtcs)) { 848 *vblanktime = 0; 849 return 0; 850 } 851 852 do { 853 seq = read_seqbegin(&vblank->seqlock); 854 vblank_count = atomic64_read(&vblank->count); 855 *vblanktime = vblank->time; 856 } while (read_seqretry(&vblank->seqlock, seq)); 857 858 return vblank_count; 859 } 860 861 /** 862 * drm_crtc_vblank_count_and_time - retrieve "cooked" vblank counter value 863 * and the system timestamp corresponding to that vblank counter value 864 * @crtc: which counter to retrieve 865 * @vblanktime: Pointer to time to receive the vblank timestamp. 866 * 867 * Fetches the "cooked" vblank count value that represents the number of 868 * vblank events since the system was booted, including lost events due to 869 * modesetting activity. Returns corresponding system timestamp of the time 870 * of the vblank interval that corresponds to the current vblank counter value. 871 * 872 * Note that for a given vblank counter value drm_crtc_handle_vblank() 873 * and drm_crtc_vblank_count() or drm_crtc_vblank_count_and_time() 874 * provide a barrier: Any writes done before calling 875 * drm_crtc_handle_vblank() will be visible to callers of the later 876 * functions, iff the vblank count is the same or a later one. 877 * 878 * See also &drm_vblank_crtc.count. 879 */ 880 u64 drm_crtc_vblank_count_and_time(struct drm_crtc *crtc, 881 ktime_t *vblanktime) 882 { 883 return drm_vblank_count_and_time(crtc->dev, drm_crtc_index(crtc), 884 vblanktime); 885 } 886 EXPORT_SYMBOL(drm_crtc_vblank_count_and_time); 887 888 static void send_vblank_event(struct drm_device *dev, 889 struct drm_pending_vblank_event *e, 890 u64 seq, ktime_t now) 891 { 892 struct timespec64 tv; 893 894 switch (e->event.base.type) { 895 case DRM_EVENT_VBLANK: 896 case DRM_EVENT_FLIP_COMPLETE: 897 tv = ktime_to_timespec64(now); 898 e->event.vbl.sequence = seq; 899 /* 900 * e->event is a user space structure, with hardcoded unsigned 901 * 32-bit seconds/microseconds. This is safe as we always use 902 * monotonic timestamps since linux-4.15 903 */ 904 e->event.vbl.tv_sec = tv.tv_sec; 905 e->event.vbl.tv_usec = tv.tv_nsec / 1000; 906 break; 907 case DRM_EVENT_CRTC_SEQUENCE: 908 if (seq) 909 e->event.seq.sequence = seq; 910 e->event.seq.time_ns = ktime_to_ns(now); 911 break; 912 } 913 trace_drm_vblank_event_delivered(e->base.file_priv, e->pipe, seq); 914 drm_send_event_locked(dev, &e->base); 915 } 916 917 /** 918 * drm_crtc_arm_vblank_event - arm vblank event after pageflip 919 * @crtc: the source CRTC of the vblank event 920 * @e: the event to send 921 * 922 * A lot of drivers need to generate vblank events for the very next vblank 923 * interrupt. For example when the page flip interrupt happens when the page 924 * flip gets armed, but not when it actually executes within the next vblank 925 * period. This helper function implements exactly the required vblank arming 926 * behaviour. 927 * 928 * NOTE: Drivers using this to send out the &drm_crtc_state.event as part of an 929 * atomic commit must ensure that the next vblank happens at exactly the same 930 * time as the atomic commit is committed to the hardware. This function itself 931 * does **not** protect against the next vblank interrupt racing with either this 932 * function call or the atomic commit operation. A possible sequence could be: 933 * 934 * 1. Driver commits new hardware state into vblank-synchronized registers. 935 * 2. A vblank happens, committing the hardware state. Also the corresponding 936 * vblank interrupt is fired off and fully processed by the interrupt 937 * handler. 938 * 3. The atomic commit operation proceeds to call drm_crtc_arm_vblank_event(). 939 * 4. The event is only send out for the next vblank, which is wrong. 940 * 941 * An equivalent race can happen when the driver calls 942 * drm_crtc_arm_vblank_event() before writing out the new hardware state. 943 * 944 * The only way to make this work safely is to prevent the vblank from firing 945 * (and the hardware from committing anything else) until the entire atomic 946 * commit sequence has run to completion. If the hardware does not have such a 947 * feature (e.g. using a "go" bit), then it is unsafe to use this functions. 948 * Instead drivers need to manually send out the event from their interrupt 949 * handler by calling drm_crtc_send_vblank_event() and make sure that there's no 950 * possible race with the hardware committing the atomic update. 951 * 952 * Caller must hold a vblank reference for the event @e acquired by a 953 * drm_crtc_vblank_get(), which will be dropped when the next vblank arrives. 954 */ 955 void drm_crtc_arm_vblank_event(struct drm_crtc *crtc, 956 struct drm_pending_vblank_event *e) 957 { 958 struct drm_device *dev = crtc->dev; 959 unsigned int pipe = drm_crtc_index(crtc); 960 961 assert_spin_locked(&dev->event_lock); 962 963 e->pipe = pipe; 964 e->sequence = drm_crtc_accurate_vblank_count(crtc) + 1; 965 list_add_tail(&e->base.link, &dev->vblank_event_list); 966 } 967 EXPORT_SYMBOL(drm_crtc_arm_vblank_event); 968 969 /** 970 * drm_crtc_send_vblank_event - helper to send vblank event after pageflip 971 * @crtc: the source CRTC of the vblank event 972 * @e: the event to send 973 * 974 * Updates sequence # and timestamp on event for the most recently processed 975 * vblank, and sends it to userspace. Caller must hold event lock. 976 * 977 * See drm_crtc_arm_vblank_event() for a helper which can be used in certain 978 * situation, especially to send out events for atomic commit operations. 979 */ 980 void drm_crtc_send_vblank_event(struct drm_crtc *crtc, 981 struct drm_pending_vblank_event *e) 982 { 983 struct drm_device *dev = crtc->dev; 984 u64 seq; 985 unsigned int pipe = drm_crtc_index(crtc); 986 ktime_t now; 987 988 if (dev->num_crtcs > 0) { 989 seq = drm_vblank_count_and_time(dev, pipe, &now); 990 } else { 991 seq = 0; 992 993 now = ktime_get(); 994 } 995 e->pipe = pipe; 996 send_vblank_event(dev, e, seq, now); 997 } 998 EXPORT_SYMBOL(drm_crtc_send_vblank_event); 999 1000 static int __enable_vblank(struct drm_device *dev, unsigned int pipe) 1001 { 1002 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 1003 struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe); 1004 1005 if (WARN_ON(!crtc)) 1006 return 0; 1007 1008 if (crtc->funcs->enable_vblank) 1009 return crtc->funcs->enable_vblank(crtc); 1010 } 1011 1012 return dev->driver->enable_vblank(dev, pipe); 1013 } 1014 1015 static int drm_vblank_enable(struct drm_device *dev, unsigned int pipe) 1016 { 1017 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1018 int ret = 0; 1019 1020 assert_spin_locked(&dev->event_lock); 1021 1022 spin_lock(&dev->vblank_time_lock); 1023 1024 if (!vblank->enabled) { 1025 /* 1026 * Enable vblank irqs under vblank_time_lock protection. 1027 * All vblank count & timestamp updates are held off 1028 * until we are done reinitializing master counter and 1029 * timestamps. Filtercode in drm_handle_vblank() will 1030 * prevent double-accounting of same vblank interval. 1031 */ 1032 ret = __enable_vblank(dev, pipe); 1033 DRM_DEBUG("enabling vblank on crtc %u, ret: %d\n", pipe, ret); 1034 if (ret) { 1035 atomic_dec(&vblank->refcount); 1036 } else { 1037 drm_update_vblank_count(dev, pipe, 0); 1038 /* drm_update_vblank_count() includes a wmb so we just 1039 * need to ensure that the compiler emits the write 1040 * to mark the vblank as enabled after the call 1041 * to drm_update_vblank_count(). 1042 */ 1043 WRITE_ONCE(vblank->enabled, true); 1044 } 1045 } 1046 1047 spin_unlock(&dev->vblank_time_lock); 1048 1049 return ret; 1050 } 1051 1052 static int drm_vblank_get_locked(struct drm_device *dev, unsigned int pipe) 1053 { 1054 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1055 int ret = 0; 1056 1057 assert_spin_locked(&dev->event_lock); 1058 1059 if (!dev->num_crtcs) 1060 return -EINVAL; 1061 1062 if (WARN_ON(pipe >= dev->num_crtcs)) 1063 return -EINVAL; 1064 1065 /* Going from 0->1 means we have to enable interrupts again */ 1066 if (atomic_add_return(1, &vblank->refcount) == 1) { 1067 ret = drm_vblank_enable(dev, pipe); 1068 } else { 1069 if (!vblank->enabled) { 1070 atomic_dec(&vblank->refcount); 1071 ret = -EINVAL; 1072 } 1073 } 1074 1075 return ret; 1076 } 1077 1078 static int drm_vblank_get(struct drm_device *dev, unsigned int pipe) 1079 { 1080 int ret; 1081 1082 spin_lock(&dev->event_lock); 1083 ret = drm_vblank_get_locked(dev, pipe); 1084 spin_unlock(&dev->event_lock); 1085 1086 return ret; 1087 } 1088 1089 /** 1090 * drm_crtc_vblank_get - get a reference count on vblank events 1091 * @crtc: which CRTC to own 1092 * 1093 * Acquire a reference count on vblank events to avoid having them disabled 1094 * while in use. 1095 * 1096 * Returns: 1097 * Zero on success or a negative error code on failure. 1098 */ 1099 int drm_crtc_vblank_get(struct drm_crtc *crtc) 1100 { 1101 return drm_vblank_get(crtc->dev, drm_crtc_index(crtc)); 1102 } 1103 EXPORT_SYMBOL(drm_crtc_vblank_get); 1104 1105 int drm_crtc_vblank_get_locked(struct drm_crtc *crtc) 1106 { 1107 return drm_vblank_get_locked(crtc->dev, drm_crtc_index(crtc)); 1108 } 1109 EXPORT_SYMBOL(drm_crtc_vblank_get_locked); 1110 1111 static void drm_vblank_put_locked(struct drm_device *dev, unsigned int pipe) 1112 { 1113 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1114 1115 assert_spin_locked(&dev->event_lock); 1116 1117 if (WARN_ON(pipe >= dev->num_crtcs)) 1118 return; 1119 1120 if (WARN_ON(atomic_read(&vblank->refcount) == 0)) 1121 return; 1122 1123 /* Last user schedules interrupt disable */ 1124 if (atomic_dec_and_test(&vblank->refcount)) { 1125 if (drm_vblank_offdelay == 0) 1126 return; 1127 else if (drm_vblank_offdelay < 0) 1128 vblank_disable_locked(vblank, dev, pipe); 1129 else if (!dev->vblank_disable_immediate) 1130 mod_timer(&vblank->disable_timer, 1131 jiffies + ((drm_vblank_offdelay * HZ)/1000)); 1132 } 1133 } 1134 1135 static void drm_vblank_put(struct drm_device *dev, unsigned int pipe) 1136 { 1137 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1138 1139 if (WARN_ON(pipe >= dev->num_crtcs)) 1140 return; 1141 1142 if (WARN_ON(atomic_read(&vblank->refcount) == 0)) 1143 return; 1144 1145 /* Last user schedules interrupt disable */ 1146 if (atomic_dec_and_test(&vblank->refcount)) { 1147 if (drm_vblank_offdelay == 0) 1148 return; 1149 else if (drm_vblank_offdelay < 0) 1150 vblank_disable_fn(&vblank->disable_timer); 1151 else if (!dev->vblank_disable_immediate) 1152 mod_timer(&vblank->disable_timer, 1153 jiffies + ((drm_vblank_offdelay * HZ)/1000)); 1154 } 1155 } 1156 1157 /** 1158 * drm_crtc_vblank_put - give up ownership of vblank events 1159 * @crtc: which counter to give up 1160 * 1161 * Release ownership of a given vblank counter, turning off interrupts 1162 * if possible. Disable interrupts after drm_vblank_offdelay milliseconds. 1163 */ 1164 void drm_crtc_vblank_put(struct drm_crtc *crtc) 1165 { 1166 drm_vblank_put(crtc->dev, drm_crtc_index(crtc)); 1167 } 1168 EXPORT_SYMBOL(drm_crtc_vblank_put); 1169 1170 void drm_crtc_vblank_put_locked(struct drm_crtc *crtc) 1171 { 1172 drm_vblank_put_locked(crtc->dev, drm_crtc_index(crtc)); 1173 } 1174 1175 /** 1176 * drm_wait_one_vblank - wait for one vblank 1177 * @dev: DRM device 1178 * @pipe: CRTC index 1179 * 1180 * This waits for one vblank to pass on @pipe, using the irq driver interfaces. 1181 * It is a failure to call this when the vblank irq for @pipe is disabled, e.g. 1182 * due to lack of driver support or because the crtc is off. 1183 * 1184 * This is the legacy version of drm_crtc_wait_one_vblank(). 1185 */ 1186 void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe) 1187 { 1188 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1189 int ret; 1190 u64 last; 1191 1192 if (WARN_ON(pipe >= dev->num_crtcs)) 1193 return; 1194 1195 spin_lock(&dev->event_lock); 1196 1197 ret = drm_vblank_get_locked(dev, pipe); 1198 if (WARN(ret, "vblank not available on crtc %i, ret=%i\n", pipe, ret)) 1199 goto out; 1200 1201 last = drm_vblank_count(dev, pipe); 1202 DRM_SPIN_TIMED_WAIT_UNTIL(ret, &vblank->queue, &dev->event_lock, 1203 msecs_to_jiffies(100), 1204 last != drm_vblank_count(dev, pipe)); 1205 1206 WARN(ret == 0, "vblank wait timed out on crtc %i\n", pipe); 1207 1208 drm_vblank_put_locked(dev, pipe); 1209 out: spin_unlock(&dev->event_lock); 1210 } 1211 EXPORT_SYMBOL(drm_wait_one_vblank); 1212 1213 /** 1214 * drm_crtc_wait_one_vblank - wait for one vblank 1215 * @crtc: DRM crtc 1216 * 1217 * This waits for one vblank to pass on @crtc, using the irq driver interfaces. 1218 * It is a failure to call this when the vblank irq for @crtc is disabled, e.g. 1219 * due to lack of driver support or because the crtc is off. 1220 */ 1221 void drm_crtc_wait_one_vblank(struct drm_crtc *crtc) 1222 { 1223 drm_wait_one_vblank(crtc->dev, drm_crtc_index(crtc)); 1224 } 1225 EXPORT_SYMBOL(drm_crtc_wait_one_vblank); 1226 1227 /** 1228 * drm_crtc_vblank_off - disable vblank events on a CRTC 1229 * @crtc: CRTC in question 1230 * 1231 * Drivers can use this function to shut down the vblank interrupt handling when 1232 * disabling a crtc. This function ensures that the latest vblank frame count is 1233 * stored so that drm_vblank_on can restore it again. 1234 * 1235 * Drivers must use this function when the hardware vblank counter can get 1236 * reset, e.g. when suspending or disabling the @crtc in general. 1237 */ 1238 void drm_crtc_vblank_off(struct drm_crtc *crtc) 1239 { 1240 struct drm_device *dev = crtc->dev; 1241 unsigned int pipe = drm_crtc_index(crtc); 1242 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1243 struct drm_pending_vblank_event *e, *t; 1244 1245 ktime_t now; 1246 unsigned long irqflags; 1247 u64 seq; 1248 1249 if (WARN_ON(pipe >= dev->num_crtcs)) 1250 return; 1251 1252 spin_lock_irqsave(&dev->event_lock, irqflags); 1253 1254 DRM_DEBUG_VBL("crtc %d, vblank enabled %d, inmodeset %d\n", 1255 pipe, vblank->enabled, vblank->inmodeset); 1256 1257 /* Avoid redundant vblank disables without previous 1258 * drm_crtc_vblank_on(). */ 1259 if (drm_core_check_feature(dev, DRIVER_ATOMIC) || !vblank->inmodeset) 1260 drm_vblank_disable_and_save(dev, pipe); 1261 1262 DRM_SPIN_WAKEUP_ONE(&vblank->queue, &dev->event_lock); 1263 1264 /* 1265 * Prevent subsequent drm_vblank_get() from re-enabling 1266 * the vblank interrupt by bumping the refcount. 1267 */ 1268 if (!vblank->inmodeset) { 1269 atomic_inc(&vblank->refcount); 1270 vblank->inmodeset = 1; 1271 } 1272 1273 /* Send any queued vblank events, lest the natives grow disquiet */ 1274 seq = drm_vblank_count_and_time(dev, pipe, &now); 1275 1276 list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) { 1277 if (e->pipe != pipe) 1278 continue; 1279 DRM_DEBUG("Sending premature vblank event on disable: " 1280 "wanted %"PRIu64", current %"PRIu64"\n", 1281 e->sequence, seq); 1282 list_del(&e->base.link); 1283 drm_vblank_put(dev, pipe); 1284 send_vblank_event(dev, e, seq, now); 1285 } 1286 spin_unlock_irqrestore(&dev->event_lock, irqflags); 1287 1288 /* Will be reset by the modeset helpers when re-enabling the crtc by 1289 * calling drm_calc_timestamping_constants(). */ 1290 vblank->hwmode.crtc_clock = 0; 1291 } 1292 EXPORT_SYMBOL(drm_crtc_vblank_off); 1293 1294 /** 1295 * drm_crtc_vblank_reset - reset vblank state to off on a CRTC 1296 * @crtc: CRTC in question 1297 * 1298 * Drivers can use this function to reset the vblank state to off at load time. 1299 * Drivers should use this together with the drm_crtc_vblank_off() and 1300 * drm_crtc_vblank_on() functions. The difference compared to 1301 * drm_crtc_vblank_off() is that this function doesn't save the vblank counter 1302 * and hence doesn't need to call any driver hooks. 1303 * 1304 * This is useful for recovering driver state e.g. on driver load, or on resume. 1305 */ 1306 void drm_crtc_vblank_reset(struct drm_crtc *crtc) 1307 { 1308 struct drm_device *dev = crtc->dev; 1309 unsigned long irqflags; 1310 unsigned int pipe = drm_crtc_index(crtc); 1311 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1312 1313 spin_lock_irqsave(&dev->event_lock, irqflags); 1314 /* 1315 * Prevent subsequent drm_vblank_get() from enabling the vblank 1316 * interrupt by bumping the refcount. 1317 */ 1318 if (!vblank->inmodeset) { 1319 atomic_inc(&vblank->refcount); 1320 vblank->inmodeset = 1; 1321 } 1322 WARN_ON(!list_empty(&dev->vblank_event_list)); 1323 spin_unlock_irqrestore(&dev->event_lock, irqflags); 1324 } 1325 EXPORT_SYMBOL(drm_crtc_vblank_reset); 1326 1327 /** 1328 * drm_crtc_set_max_vblank_count - configure the hw max vblank counter value 1329 * @crtc: CRTC in question 1330 * @max_vblank_count: max hardware vblank counter value 1331 * 1332 * Update the maximum hardware vblank counter value for @crtc 1333 * at runtime. Useful for hardware where the operation of the 1334 * hardware vblank counter depends on the currently active 1335 * display configuration. 1336 * 1337 * For example, if the hardware vblank counter does not work 1338 * when a specific connector is active the maximum can be set 1339 * to zero. And when that specific connector isn't active the 1340 * maximum can again be set to the appropriate non-zero value. 1341 * 1342 * If used, must be called before drm_vblank_on(). 1343 */ 1344 void drm_crtc_set_max_vblank_count(struct drm_crtc *crtc, 1345 u32 max_vblank_count) 1346 { 1347 struct drm_device *dev = crtc->dev; 1348 unsigned int pipe = drm_crtc_index(crtc); 1349 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1350 1351 WARN_ON(dev->max_vblank_count); 1352 WARN_ON(!READ_ONCE(vblank->inmodeset)); 1353 1354 vblank->max_vblank_count = max_vblank_count; 1355 } 1356 EXPORT_SYMBOL(drm_crtc_set_max_vblank_count); 1357 1358 /** 1359 * drm_crtc_vblank_on - enable vblank events on a CRTC 1360 * @crtc: CRTC in question 1361 * 1362 * This functions restores the vblank interrupt state captured with 1363 * drm_crtc_vblank_off() again and is generally called when enabling @crtc. Note 1364 * that calls to drm_crtc_vblank_on() and drm_crtc_vblank_off() can be 1365 * unbalanced and so can also be unconditionally called in driver load code to 1366 * reflect the current hardware state of the crtc. 1367 */ 1368 void drm_crtc_vblank_on(struct drm_crtc *crtc) 1369 { 1370 struct drm_device *dev = crtc->dev; 1371 unsigned int pipe = drm_crtc_index(crtc); 1372 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1373 unsigned long irqflags; 1374 1375 if (WARN_ON(pipe >= dev->num_crtcs)) 1376 return; 1377 1378 spin_lock_irqsave(&dev->event_lock, irqflags); 1379 DRM_DEBUG_VBL("crtc %d, vblank enabled %d, inmodeset %d\n", 1380 pipe, vblank->enabled, vblank->inmodeset); 1381 1382 /* Drop our private "prevent drm_vblank_get" refcount */ 1383 if (vblank->inmodeset) { 1384 atomic_dec(&vblank->refcount); 1385 vblank->inmodeset = 0; 1386 } 1387 1388 drm_reset_vblank_timestamp(dev, pipe); 1389 1390 /* 1391 * re-enable interrupts if there are users left, or the 1392 * user wishes vblank interrupts to be enabled all the time. 1393 */ 1394 if (atomic_read(&vblank->refcount) != 0 || drm_vblank_offdelay == 0) 1395 WARN_ON(drm_vblank_enable(dev, pipe)); 1396 spin_unlock_irqrestore(&dev->event_lock, irqflags); 1397 } 1398 EXPORT_SYMBOL(drm_crtc_vblank_on); 1399 1400 /** 1401 * drm_vblank_restore - estimate missed vblanks and update vblank count. 1402 * @dev: DRM device 1403 * @pipe: CRTC index 1404 * 1405 * Power manamement features can cause frame counter resets between vblank 1406 * disable and enable. Drivers can use this function in their 1407 * &drm_crtc_funcs.enable_vblank implementation to estimate missed vblanks since 1408 * the last &drm_crtc_funcs.disable_vblank using timestamps and update the 1409 * vblank counter. 1410 * 1411 * This function is the legacy version of drm_crtc_vblank_restore(). 1412 */ 1413 void drm_vblank_restore(struct drm_device *dev, unsigned int pipe) 1414 { 1415 ktime_t t_vblank; 1416 struct drm_vblank_crtc *vblank; 1417 int framedur_ns; 1418 u64 diff_ns; 1419 u32 cur_vblank, diff = 1; 1420 int count = DRM_TIMESTAMP_MAXRETRIES; 1421 1422 if (WARN_ON(pipe >= dev->num_crtcs)) 1423 return; 1424 1425 assert_spin_locked(&dev->event_lock); 1426 assert_spin_locked(&dev->vblank_time_lock); 1427 1428 vblank = &dev->vblank[pipe]; 1429 WARN_ONCE(drm_debug_enabled(DRM_UT_VBL) && !vblank->framedur_ns, 1430 "Cannot compute missed vblanks without frame duration\n"); 1431 framedur_ns = vblank->framedur_ns; 1432 1433 do { 1434 cur_vblank = __get_vblank_counter(dev, pipe); 1435 drm_get_last_vbltimestamp(dev, pipe, &t_vblank, false); 1436 } while (cur_vblank != __get_vblank_counter(dev, pipe) && --count > 0); 1437 1438 diff_ns = ktime_to_ns(ktime_sub(t_vblank, vblank->time)); 1439 if (framedur_ns) 1440 diff = DIV_ROUND_CLOSEST_ULL(diff_ns, framedur_ns); 1441 1442 1443 DRM_DEBUG_VBL("missed %d vblanks in %"PRId64" ns, frame duration=%d ns, hw_diff=%d\n", 1444 diff, diff_ns, framedur_ns, cur_vblank - vblank->last); 1445 store_vblank(dev, pipe, diff, t_vblank, cur_vblank); 1446 } 1447 EXPORT_SYMBOL(drm_vblank_restore); 1448 1449 /** 1450 * drm_crtc_vblank_restore - estimate missed vblanks and update vblank count. 1451 * @crtc: CRTC in question 1452 * 1453 * Power manamement features can cause frame counter resets between vblank 1454 * disable and enable. Drivers can use this function in their 1455 * &drm_crtc_funcs.enable_vblank implementation to estimate missed vblanks since 1456 * the last &drm_crtc_funcs.disable_vblank using timestamps and update the 1457 * vblank counter. 1458 */ 1459 void drm_crtc_vblank_restore(struct drm_crtc *crtc) 1460 { 1461 drm_vblank_restore(crtc->dev, drm_crtc_index(crtc)); 1462 } 1463 EXPORT_SYMBOL(drm_crtc_vblank_restore); 1464 1465 static void drm_legacy_vblank_pre_modeset(struct drm_device *dev, 1466 unsigned int pipe) 1467 { 1468 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1469 1470 /* vblank is not initialized (IRQ not installed ?), or has been freed */ 1471 if (!dev->num_crtcs) 1472 return; 1473 1474 if (WARN_ON(pipe >= dev->num_crtcs)) 1475 return; 1476 1477 /* 1478 * To avoid all the problems that might happen if interrupts 1479 * were enabled/disabled around or between these calls, we just 1480 * have the kernel take a reference on the CRTC (just once though 1481 * to avoid corrupting the count if multiple, mismatch calls occur), 1482 * so that interrupts remain enabled in the interim. 1483 */ 1484 if (!vblank->inmodeset) { 1485 vblank->inmodeset = 0x1; 1486 if (drm_vblank_get(dev, pipe) == 0) 1487 vblank->inmodeset |= 0x2; 1488 } 1489 } 1490 1491 static void drm_legacy_vblank_post_modeset(struct drm_device *dev, 1492 unsigned int pipe) 1493 { 1494 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1495 unsigned long irqflags; 1496 1497 /* vblank is not initialized (IRQ not installed ?), or has been freed */ 1498 if (!dev->num_crtcs) 1499 return; 1500 1501 if (WARN_ON(pipe >= dev->num_crtcs)) 1502 return; 1503 1504 if (vblank->inmodeset) { 1505 spin_lock_irqsave(&dev->event_lock, irqflags); 1506 drm_reset_vblank_timestamp(dev, pipe); 1507 spin_unlock_irqrestore(&dev->event_lock, irqflags); 1508 1509 if (vblank->inmodeset & 0x2) 1510 drm_vblank_put(dev, pipe); 1511 1512 vblank->inmodeset = 0; 1513 } 1514 } 1515 1516 int drm_legacy_modeset_ctl_ioctl(struct drm_device *dev, void *data, 1517 struct drm_file *file_priv) 1518 { 1519 struct drm_modeset_ctl *modeset = data; 1520 unsigned int pipe; 1521 1522 /* If drm_vblank_init() hasn't been called yet, just no-op */ 1523 if (!dev->num_crtcs) 1524 return 0; 1525 1526 /* KMS drivers handle this internally */ 1527 if (!drm_core_check_feature(dev, DRIVER_LEGACY)) 1528 return 0; 1529 1530 pipe = modeset->crtc; 1531 if (pipe >= dev->num_crtcs) 1532 return -EINVAL; 1533 1534 switch (modeset->cmd) { 1535 case _DRM_PRE_MODESET: 1536 drm_legacy_vblank_pre_modeset(dev, pipe); 1537 break; 1538 case _DRM_POST_MODESET: 1539 drm_legacy_vblank_post_modeset(dev, pipe); 1540 break; 1541 default: 1542 return -EINVAL; 1543 } 1544 1545 return 0; 1546 } 1547 1548 static inline bool vblank_passed(u64 seq, u64 ref) 1549 { 1550 return (seq - ref) <= (1 << 23); 1551 } 1552 1553 static int drm_queue_vblank_event(struct drm_device *dev, unsigned int pipe, 1554 u64 req_seq, 1555 union drm_wait_vblank *vblwait, 1556 struct drm_file *file_priv) 1557 { 1558 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1559 struct drm_pending_vblank_event *e; 1560 ktime_t now; 1561 unsigned long flags; 1562 u64 seq; 1563 int ret; 1564 1565 e = kzalloc(sizeof(*e), GFP_KERNEL); 1566 if (e == NULL) { 1567 ret = -ENOMEM; 1568 goto err_put; 1569 } 1570 1571 e->pipe = pipe; 1572 e->event.base.type = DRM_EVENT_VBLANK; 1573 e->event.base.length = sizeof(e->event.vbl); 1574 e->event.vbl.user_data = vblwait->request.signal; 1575 e->event.vbl.crtc_id = 0; 1576 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 1577 struct drm_crtc *crtc = drm_crtc_from_index(dev, pipe); 1578 if (crtc) 1579 e->event.vbl.crtc_id = crtc->base.id; 1580 } 1581 1582 spin_lock_irqsave(&dev->event_lock, flags); 1583 1584 /* 1585 * drm_crtc_vblank_off() might have been called after we called 1586 * drm_vblank_get(). drm_crtc_vblank_off() holds event_lock around the 1587 * vblank disable, so no need for further locking. The reference from 1588 * drm_vblank_get() protects against vblank disable from another source. 1589 */ 1590 if (!READ_ONCE(vblank->enabled)) { 1591 ret = -EINVAL; 1592 goto err_unlock; 1593 } 1594 1595 ret = drm_event_reserve_init_locked(dev, file_priv, &e->base, 1596 &e->event.base); 1597 1598 if (ret) 1599 goto err_unlock; 1600 1601 seq = drm_vblank_count_and_time(dev, pipe, &now); 1602 1603 DRM_DEBUG("event on vblank count %"PRIu64", current %"PRIu64", crtc %u\n", 1604 req_seq, seq, pipe); 1605 1606 trace_drm_vblank_event_queued(file_priv, pipe, req_seq); 1607 1608 e->sequence = req_seq; 1609 if (vblank_passed(seq, req_seq)) { 1610 drm_vblank_put(dev, pipe); 1611 send_vblank_event(dev, e, seq, now); 1612 vblwait->reply.sequence = seq; 1613 } else { 1614 /* drm_handle_vblank_events will call drm_vblank_put */ 1615 list_add_tail(&e->base.link, &dev->vblank_event_list); 1616 vblwait->reply.sequence = req_seq; 1617 } 1618 1619 spin_unlock_irqrestore(&dev->event_lock, flags); 1620 1621 return 0; 1622 1623 err_unlock: 1624 spin_unlock_irqrestore(&dev->event_lock, flags); 1625 kfree(e); 1626 err_put: 1627 drm_vblank_put(dev, pipe); 1628 return ret; 1629 } 1630 1631 static bool drm_wait_vblank_is_query(union drm_wait_vblank *vblwait) 1632 { 1633 if (vblwait->request.sequence) 1634 return false; 1635 1636 return _DRM_VBLANK_RELATIVE == 1637 (vblwait->request.type & (_DRM_VBLANK_TYPES_MASK | 1638 _DRM_VBLANK_EVENT | 1639 _DRM_VBLANK_NEXTONMISS)); 1640 } 1641 1642 /* 1643 * Widen a 32-bit param to 64-bits. 1644 * 1645 * \param narrow 32-bit value (missing upper 32 bits) 1646 * \param near 64-bit value that should be 'close' to near 1647 * 1648 * This function returns a 64-bit value using the lower 32-bits from 1649 * 'narrow' and constructing the upper 32-bits so that the result is 1650 * as close as possible to 'near'. 1651 */ 1652 1653 static u64 widen_32_to_64(u32 narrow, u64 near) 1654 { 1655 return near + (s32) (narrow - near); 1656 } 1657 1658 static void drm_wait_vblank_reply(struct drm_device *dev, unsigned int pipe, 1659 struct drm_wait_vblank_reply *reply) 1660 { 1661 ktime_t now; 1662 struct timespec64 ts; 1663 1664 /* 1665 * drm_wait_vblank_reply is a UAPI structure that uses 'long' 1666 * to store the seconds. This is safe as we always use monotonic 1667 * timestamps since linux-4.15. 1668 */ 1669 reply->sequence = drm_vblank_count_and_time(dev, pipe, &now); 1670 ts = ktime_to_timespec64(now); 1671 reply->tval_sec = (u32)ts.tv_sec; 1672 reply->tval_usec = ts.tv_nsec / 1000; 1673 } 1674 1675 int drm_wait_vblank_ioctl(struct drm_device *dev, void *data, 1676 struct drm_file *file_priv) 1677 { 1678 struct drm_crtc *crtc; 1679 struct drm_vblank_crtc *vblank; 1680 union drm_wait_vblank *vblwait = data; 1681 int ret; 1682 u64 req_seq, seq; 1683 unsigned int pipe_index; 1684 unsigned int flags, pipe, high_pipe; 1685 1686 if (!dev->irq_enabled) 1687 return -EOPNOTSUPP; 1688 1689 if (vblwait->request.type & _DRM_VBLANK_SIGNAL) 1690 return -EINVAL; 1691 1692 if (vblwait->request.type & 1693 ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK | 1694 _DRM_VBLANK_HIGH_CRTC_MASK)) { 1695 DRM_DEBUG("Unsupported type value 0x%x, supported mask 0x%x\n", 1696 vblwait->request.type, 1697 (_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK | 1698 _DRM_VBLANK_HIGH_CRTC_MASK)); 1699 return -EINVAL; 1700 } 1701 1702 flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK; 1703 high_pipe = (vblwait->request.type & _DRM_VBLANK_HIGH_CRTC_MASK); 1704 if (high_pipe) 1705 pipe_index = high_pipe >> _DRM_VBLANK_HIGH_CRTC_SHIFT; 1706 else 1707 pipe_index = flags & _DRM_VBLANK_SECONDARY ? 1 : 0; 1708 1709 /* Convert lease-relative crtc index into global crtc index */ 1710 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 1711 pipe = 0; 1712 drm_for_each_crtc(crtc, dev) { 1713 if (drm_lease_held(file_priv, crtc->base.id)) { 1714 if (pipe_index == 0) 1715 break; 1716 pipe_index--; 1717 } 1718 pipe++; 1719 } 1720 } else { 1721 pipe = pipe_index; 1722 } 1723 1724 if (pipe >= dev->num_crtcs) 1725 return -EINVAL; 1726 1727 vblank = &dev->vblank[pipe]; 1728 1729 /* If the counter is currently enabled and accurate, short-circuit 1730 * queries to return the cached timestamp of the last vblank. 1731 */ 1732 if (dev->vblank_disable_immediate && 1733 drm_wait_vblank_is_query(vblwait) && 1734 READ_ONCE(vblank->enabled)) { 1735 drm_wait_vblank_reply(dev, pipe, &vblwait->reply); 1736 return 0; 1737 } 1738 1739 ret = drm_vblank_get(dev, pipe); 1740 if (ret) { 1741 DRM_DEBUG("crtc %d failed to acquire vblank counter, %d\n", pipe, ret); 1742 return ret; 1743 } 1744 seq = drm_vblank_count(dev, pipe); 1745 1746 switch (vblwait->request.type & _DRM_VBLANK_TYPES_MASK) { 1747 case _DRM_VBLANK_RELATIVE: 1748 req_seq = seq + vblwait->request.sequence; 1749 vblwait->request.sequence = req_seq; 1750 vblwait->request.type &= ~_DRM_VBLANK_RELATIVE; 1751 break; 1752 case _DRM_VBLANK_ABSOLUTE: 1753 req_seq = widen_32_to_64(vblwait->request.sequence, seq); 1754 break; 1755 default: 1756 ret = -EINVAL; 1757 goto done; 1758 } 1759 1760 if ((flags & _DRM_VBLANK_NEXTONMISS) && 1761 vblank_passed(seq, req_seq)) { 1762 req_seq = seq + 1; 1763 vblwait->request.type &= ~_DRM_VBLANK_NEXTONMISS; 1764 vblwait->request.sequence = req_seq; 1765 } 1766 1767 if (flags & _DRM_VBLANK_EVENT) { 1768 /* must hold on to the vblank ref until the event fires 1769 * drm_vblank_put will be called asynchronously 1770 */ 1771 return drm_queue_vblank_event(dev, pipe, req_seq, vblwait, file_priv); 1772 } 1773 1774 if (req_seq != seq) { 1775 int wait; 1776 1777 DRM_DEBUG("waiting on vblank count %"PRIu64", crtc %u\n", 1778 req_seq, pipe); 1779 spin_lock(&dev->event_lock); 1780 DRM_SPIN_TIMED_WAIT_UNTIL(wait, &vblank->queue, 1781 &dev->event_lock, msecs_to_jiffies(3000), 1782 (vblank_passed(drm_vblank_count(dev, pipe), req_seq) || 1783 !READ_ONCE(vblank->enabled))); 1784 spin_unlock(&dev->event_lock); 1785 1786 switch (wait) { 1787 case 0: 1788 /* timeout */ 1789 ret = -EBUSY; 1790 break; 1791 case -ERESTARTSYS: 1792 /* interrupted by signal */ 1793 ret = -EINTR; 1794 break; 1795 default: 1796 ret = 0; 1797 break; 1798 } 1799 } 1800 1801 if (ret != -EINTR) { 1802 drm_wait_vblank_reply(dev, pipe, &vblwait->reply); 1803 1804 DRM_DEBUG("crtc %d returning %u to client\n", 1805 pipe, vblwait->reply.sequence); 1806 } else { 1807 DRM_DEBUG("crtc %d vblank wait interrupted by signal\n", pipe); 1808 } 1809 1810 done: 1811 drm_vblank_put(dev, pipe); 1812 return ret; 1813 } 1814 1815 static void drm_handle_vblank_events(struct drm_device *dev, unsigned int pipe) 1816 { 1817 struct drm_pending_vblank_event *e, *t; 1818 ktime_t now; 1819 u64 seq; 1820 1821 assert_spin_locked(&dev->event_lock); 1822 1823 seq = drm_vblank_count_and_time(dev, pipe, &now); 1824 1825 list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) { 1826 if (e->pipe != pipe) 1827 continue; 1828 if (!vblank_passed(seq, e->sequence)) 1829 continue; 1830 1831 DRM_DEBUG("vblank event on %"PRIu64", current %"PRIu64"\n", 1832 e->sequence, seq); 1833 1834 list_del(&e->base.link); 1835 drm_vblank_put(dev, pipe); 1836 send_vblank_event(dev, e, seq, now); 1837 } 1838 1839 trace_drm_vblank_event(pipe, seq, now, 1840 dev->driver->get_vblank_timestamp != NULL); 1841 } 1842 1843 /** 1844 * drm_handle_vblank - handle a vblank event 1845 * @dev: DRM device 1846 * @pipe: index of CRTC where this event occurred 1847 * 1848 * Drivers should call this routine in their vblank interrupt handlers to 1849 * update the vblank counter and send any signals that may be pending. 1850 * 1851 * This is the legacy version of drm_crtc_handle_vblank(). 1852 */ 1853 bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe) 1854 { 1855 struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1856 unsigned long irqflags; 1857 bool disable_irq; 1858 1859 if (WARN_ON_ONCE(!dev->num_crtcs)) 1860 return false; 1861 1862 if (WARN_ON(pipe >= dev->num_crtcs)) 1863 return false; 1864 1865 spin_lock_irqsave(&dev->event_lock, irqflags); 1866 1867 /* Need timestamp lock to prevent concurrent execution with 1868 * vblank enable/disable, as this would cause inconsistent 1869 * or corrupted timestamps and vblank counts. 1870 */ 1871 spin_lock(&dev->vblank_time_lock); 1872 1873 /* Vblank irq handling disabled. Nothing to do. */ 1874 if (!vblank->enabled) { 1875 spin_unlock(&dev->vblank_time_lock); 1876 spin_unlock_irqrestore(&dev->event_lock, irqflags); 1877 return false; 1878 } 1879 1880 drm_update_vblank_count(dev, pipe, true); 1881 1882 spin_unlock(&dev->vblank_time_lock); 1883 1884 DRM_SPIN_WAKEUP_ONE(&vblank->queue, &dev->event_lock); 1885 1886 /* With instant-off, we defer disabling the interrupt until after 1887 * we finish processing the following vblank after all events have 1888 * been signaled. The disable has to be last (after 1889 * drm_handle_vblank_events) so that the timestamp is always accurate. 1890 */ 1891 disable_irq = (dev->vblank_disable_immediate && 1892 drm_vblank_offdelay > 0 && 1893 !atomic_read(&vblank->refcount)); 1894 1895 drm_handle_vblank_events(dev, pipe); 1896 1897 spin_unlock_irqrestore(&dev->event_lock, irqflags); 1898 1899 if (disable_irq) 1900 vblank_disable_fn(&vblank->disable_timer); 1901 1902 return true; 1903 } 1904 EXPORT_SYMBOL(drm_handle_vblank); 1905 1906 /** 1907 * drm_crtc_handle_vblank - handle a vblank event 1908 * @crtc: where this event occurred 1909 * 1910 * Drivers should call this routine in their vblank interrupt handlers to 1911 * update the vblank counter and send any signals that may be pending. 1912 * 1913 * This is the native KMS version of drm_handle_vblank(). 1914 * 1915 * Note that for a given vblank counter value drm_crtc_handle_vblank() 1916 * and drm_crtc_vblank_count() or drm_crtc_vblank_count_and_time() 1917 * provide a barrier: Any writes done before calling 1918 * drm_crtc_handle_vblank() will be visible to callers of the later 1919 * functions, iff the vblank count is the same or a later one. 1920 * 1921 * See also &drm_vblank_crtc.count. 1922 * 1923 * Returns: 1924 * True if the event was successfully handled, false on failure. 1925 */ 1926 bool drm_crtc_handle_vblank(struct drm_crtc *crtc) 1927 { 1928 return drm_handle_vblank(crtc->dev, drm_crtc_index(crtc)); 1929 } 1930 EXPORT_SYMBOL(drm_crtc_handle_vblank); 1931 1932 /* 1933 * Get crtc VBLANK count. 1934 * 1935 * \param dev DRM device 1936 * \param data user arguement, pointing to a drm_crtc_get_sequence structure. 1937 * \param file_priv drm file private for the user's open file descriptor 1938 */ 1939 1940 int drm_crtc_get_sequence_ioctl(struct drm_device *dev, void *data, 1941 struct drm_file *file_priv) 1942 { 1943 struct drm_crtc *crtc; 1944 struct drm_vblank_crtc *vblank; 1945 int pipe; 1946 struct drm_crtc_get_sequence *get_seq = data; 1947 ktime_t now; 1948 bool vblank_enabled; 1949 int ret; 1950 1951 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 1952 return -EOPNOTSUPP; 1953 1954 if (!dev->irq_enabled) 1955 return -EOPNOTSUPP; 1956 1957 crtc = drm_crtc_find(dev, file_priv, get_seq->crtc_id); 1958 if (!crtc) 1959 return -ENOENT; 1960 1961 pipe = drm_crtc_index(crtc); 1962 1963 vblank = &dev->vblank[pipe]; 1964 vblank_enabled = dev->vblank_disable_immediate && READ_ONCE(vblank->enabled); 1965 1966 if (!vblank_enabled) { 1967 ret = drm_crtc_vblank_get(crtc); 1968 if (ret) { 1969 DRM_DEBUG("crtc %d failed to acquire vblank counter, %d\n", pipe, ret); 1970 return ret; 1971 } 1972 } 1973 drm_modeset_lock(&crtc->mutex, NULL); 1974 if (crtc->state) 1975 get_seq->active = crtc->state->enable; 1976 else 1977 get_seq->active = crtc->enabled; 1978 drm_modeset_unlock(&crtc->mutex); 1979 get_seq->sequence = drm_vblank_count_and_time(dev, pipe, &now); 1980 get_seq->sequence_ns = ktime_to_ns(now); 1981 if (!vblank_enabled) 1982 drm_crtc_vblank_put(crtc); 1983 return 0; 1984 } 1985 1986 /* 1987 * Queue a event for VBLANK sequence 1988 * 1989 * \param dev DRM device 1990 * \param data user arguement, pointing to a drm_crtc_queue_sequence structure. 1991 * \param file_priv drm file private for the user's open file descriptor 1992 */ 1993 1994 int drm_crtc_queue_sequence_ioctl(struct drm_device *dev, void *data, 1995 struct drm_file *file_priv) 1996 { 1997 struct drm_crtc *crtc; 1998 struct drm_vblank_crtc *vblank; 1999 int pipe; 2000 struct drm_crtc_queue_sequence *queue_seq = data; 2001 ktime_t now; 2002 struct drm_pending_vblank_event *e; 2003 u32 flags; 2004 u64 seq; 2005 u64 req_seq; 2006 int ret; 2007 unsigned long spin_flags; 2008 2009 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 2010 return -EOPNOTSUPP; 2011 2012 if (!dev->irq_enabled) 2013 return -EOPNOTSUPP; 2014 2015 crtc = drm_crtc_find(dev, file_priv, queue_seq->crtc_id); 2016 if (!crtc) 2017 return -ENOENT; 2018 2019 flags = queue_seq->flags; 2020 /* Check valid flag bits */ 2021 if (flags & ~(DRM_CRTC_SEQUENCE_RELATIVE| 2022 DRM_CRTC_SEQUENCE_NEXT_ON_MISS)) 2023 return -EINVAL; 2024 2025 pipe = drm_crtc_index(crtc); 2026 2027 vblank = &dev->vblank[pipe]; 2028 2029 e = kzalloc(sizeof(*e), GFP_KERNEL); 2030 if (e == NULL) 2031 return -ENOMEM; 2032 2033 ret = drm_crtc_vblank_get(crtc); 2034 if (ret) { 2035 DRM_DEBUG("crtc %d failed to acquire vblank counter, %d\n", pipe, ret); 2036 goto err_free; 2037 } 2038 2039 seq = drm_vblank_count_and_time(dev, pipe, &now); 2040 req_seq = queue_seq->sequence; 2041 2042 if (flags & DRM_CRTC_SEQUENCE_RELATIVE) 2043 req_seq += seq; 2044 2045 if ((flags & DRM_CRTC_SEQUENCE_NEXT_ON_MISS) && vblank_passed(seq, req_seq)) 2046 req_seq = seq + 1; 2047 2048 e->pipe = pipe; 2049 e->event.base.type = DRM_EVENT_CRTC_SEQUENCE; 2050 e->event.base.length = sizeof(e->event.seq); 2051 e->event.seq.user_data = queue_seq->user_data; 2052 2053 spin_lock_irqsave(&dev->event_lock, spin_flags); 2054 2055 /* 2056 * drm_crtc_vblank_off() might have been called after we called 2057 * drm_crtc_vblank_get(). drm_crtc_vblank_off() holds event_lock around the 2058 * vblank disable, so no need for further locking. The reference from 2059 * drm_crtc_vblank_get() protects against vblank disable from another source. 2060 */ 2061 if (!READ_ONCE(vblank->enabled)) { 2062 ret = -EINVAL; 2063 goto err_unlock; 2064 } 2065 2066 ret = drm_event_reserve_init_locked(dev, file_priv, &e->base, 2067 &e->event.base); 2068 2069 if (ret) 2070 goto err_unlock; 2071 2072 e->sequence = req_seq; 2073 2074 if (vblank_passed(seq, req_seq)) { 2075 drm_crtc_vblank_put(crtc); 2076 send_vblank_event(dev, e, seq, now); 2077 queue_seq->sequence = seq; 2078 } else { 2079 /* drm_handle_vblank_events will call drm_vblank_put */ 2080 list_add_tail(&e->base.link, &dev->vblank_event_list); 2081 queue_seq->sequence = req_seq; 2082 } 2083 2084 spin_unlock_irqrestore(&dev->event_lock, spin_flags); 2085 return 0; 2086 2087 err_unlock: 2088 spin_unlock_irqrestore(&dev->event_lock, spin_flags); 2089 drm_crtc_vblank_put(crtc); 2090 err_free: 2091 kfree(e); 2092 return ret; 2093 } 2094