1 /* 2 * \author Rickard E. (Rik) Faith <faith@valinux.com> 3 * \author Daryll Strauss <daryll@valinux.com> 4 * \author Gareth Hughes <gareth@valinux.com> 5 */ 6 7 /* 8 * Created: Mon Jan 4 08:58:31 1999 by faith@valinux.com 9 * 10 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. 11 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 12 * All Rights Reserved. 13 * 14 * Permission is hereby granted, free of charge, to any person obtaining a 15 * copy of this software and associated documentation files (the "Software"), 16 * to deal in the Software without restriction, including without limitation 17 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 18 * and/or sell copies of the Software, and to permit persons to whom the 19 * Software is furnished to do so, subject to the following conditions: 20 * 21 * The above copyright notice and this permission notice (including the next 22 * paragraph) shall be included in all copies or substantial portions of the 23 * Software. 24 * 25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 28 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 29 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 30 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 31 * OTHER DEALINGS IN THE SOFTWARE. 32 */ 33 34 #include <linux/anon_inodes.h> 35 #include <linux/dma-fence.h> 36 #include <linux/file.h> 37 #include <linux/module.h> 38 #include <linux/pci.h> 39 #include <linux/poll.h> 40 #include <linux/slab.h> 41 42 #include <drm/drm_client.h> 43 #include <drm/drm_drv.h> 44 #include <drm/drm_file.h> 45 #include <drm/drm_print.h> 46 47 #include "drm_crtc_internal.h" 48 #include "drm_internal.h" 49 #include "drm_legacy.h" 50 51 /* from BKL pushdown */ 52 DEFINE_MUTEX(drm_global_mutex); 53 54 bool drm_dev_needs_global_mutex(struct drm_device *dev) 55 { 56 /* 57 * Legacy drivers rely on all kinds of BKL locking semantics, don't 58 * bother. They also still need BKL locking for their ioctls, so better 59 * safe than sorry. 60 */ 61 if (drm_core_check_feature(dev, DRIVER_LEGACY)) 62 return true; 63 64 /* 65 * The deprecated ->load callback must be called after the driver is 66 * already registered. This means such drivers rely on the BKL to make 67 * sure an open can't proceed until the driver is actually fully set up. 68 * Similar hilarity holds for the unload callback. 69 */ 70 if (dev->driver->load || dev->driver->unload) 71 return true; 72 73 /* 74 * Drivers with the lastclose callback assume that it's synchronized 75 * against concurrent opens, which again needs the BKL. The proper fix 76 * is to use the drm_client infrastructure with proper locking for each 77 * client. 78 */ 79 if (dev->driver->lastclose) 80 return true; 81 82 return false; 83 } 84 85 /** 86 * DOC: file operations 87 * 88 * Drivers must define the file operations structure that forms the DRM 89 * userspace API entry point, even though most of those operations are 90 * implemented in the DRM core. The resulting &struct file_operations must be 91 * stored in the &drm_driver.fops field. The mandatory functions are drm_open(), 92 * drm_read(), drm_ioctl() and drm_compat_ioctl() if CONFIG_COMPAT is enabled 93 * Note that drm_compat_ioctl will be NULL if CONFIG_COMPAT=n, so there's no 94 * need to sprinkle #ifdef into the code. Drivers which implement private ioctls 95 * that require 32/64 bit compatibility support must provide their own 96 * &file_operations.compat_ioctl handler that processes private ioctls and calls 97 * drm_compat_ioctl() for core ioctls. 98 * 99 * In addition drm_read() and drm_poll() provide support for DRM events. DRM 100 * events are a generic and extensible means to send asynchronous events to 101 * userspace through the file descriptor. They are used to send vblank event and 102 * page flip completions by the KMS API. But drivers can also use it for their 103 * own needs, e.g. to signal completion of rendering. 104 * 105 * For the driver-side event interface see drm_event_reserve_init() and 106 * drm_send_event() as the main starting points. 107 * 108 * The memory mapping implementation will vary depending on how the driver 109 * manages memory. Legacy drivers will use the deprecated drm_legacy_mmap() 110 * function, modern drivers should use one of the provided memory-manager 111 * specific implementations. For GEM-based drivers this is drm_gem_mmap(). 112 * 113 * No other file operations are supported by the DRM userspace API. Overall the 114 * following is an example &file_operations structure:: 115 * 116 * static const example_drm_fops = { 117 * .owner = THIS_MODULE, 118 * .open = drm_open, 119 * .release = drm_release, 120 * .unlocked_ioctl = drm_ioctl, 121 * .compat_ioctl = drm_compat_ioctl, // NULL if CONFIG_COMPAT=n 122 * .poll = drm_poll, 123 * .read = drm_read, 124 * .llseek = no_llseek, 125 * .mmap = drm_gem_mmap, 126 * }; 127 * 128 * For plain GEM based drivers there is the DEFINE_DRM_GEM_FOPS() macro, and for 129 * DMA based drivers there is the DEFINE_DRM_GEM_DMA_FOPS() macro to make this 130 * simpler. 131 * 132 * The driver's &file_operations must be stored in &drm_driver.fops. 133 * 134 * For driver-private IOCTL handling see the more detailed discussion in 135 * :ref:`IOCTL support in the userland interfaces chapter<drm_driver_ioctl>`. 136 */ 137 138 /** 139 * drm_file_alloc - allocate file context 140 * @minor: minor to allocate on 141 * 142 * This allocates a new DRM file context. It is not linked into any context and 143 * can be used by the caller freely. Note that the context keeps a pointer to 144 * @minor, so it must be freed before @minor is. 145 * 146 * RETURNS: 147 * Pointer to newly allocated context, ERR_PTR on failure. 148 */ 149 struct drm_file *drm_file_alloc(struct drm_minor *minor) 150 { 151 struct drm_device *dev = minor->dev; 152 struct drm_file *file; 153 int ret; 154 155 file = kzalloc(sizeof(*file), GFP_KERNEL); 156 if (!file) 157 return ERR_PTR(-ENOMEM); 158 159 file->pid = get_pid(task_pid(current)); 160 file->minor = minor; 161 162 /* for compatibility root is always authenticated */ 163 file->authenticated = capable(CAP_SYS_ADMIN); 164 165 INIT_LIST_HEAD(&file->lhead); 166 INIT_LIST_HEAD(&file->fbs); 167 mutex_init(&file->fbs_lock); 168 INIT_LIST_HEAD(&file->blobs); 169 INIT_LIST_HEAD(&file->pending_event_list); 170 INIT_LIST_HEAD(&file->event_list); 171 init_waitqueue_head(&file->event_wait); 172 file->event_space = 4096; /* set aside 4k for event buffer */ 173 174 spin_lock_init(&file->master_lookup_lock); 175 mutex_init(&file->event_read_lock); 176 177 if (drm_core_check_feature(dev, DRIVER_GEM)) 178 drm_gem_open(dev, file); 179 180 if (drm_core_check_feature(dev, DRIVER_SYNCOBJ)) 181 drm_syncobj_open(file); 182 183 drm_prime_init_file_private(&file->prime); 184 185 if (dev->driver->open) { 186 ret = dev->driver->open(dev, file); 187 if (ret < 0) 188 goto out_prime_destroy; 189 } 190 191 return file; 192 193 out_prime_destroy: 194 drm_prime_destroy_file_private(&file->prime); 195 if (drm_core_check_feature(dev, DRIVER_SYNCOBJ)) 196 drm_syncobj_release(file); 197 if (drm_core_check_feature(dev, DRIVER_GEM)) 198 drm_gem_release(dev, file); 199 put_pid(file->pid); 200 kfree(file); 201 202 return ERR_PTR(ret); 203 } 204 205 static void drm_events_release(struct drm_file *file_priv) 206 { 207 struct drm_device *dev = file_priv->minor->dev; 208 struct drm_pending_event *e, *et; 209 unsigned long flags; 210 211 spin_lock_irqsave(&dev->event_lock, flags); 212 213 /* Unlink pending events */ 214 list_for_each_entry_safe(e, et, &file_priv->pending_event_list, 215 pending_link) { 216 list_del(&e->pending_link); 217 e->file_priv = NULL; 218 } 219 220 /* Remove unconsumed events */ 221 list_for_each_entry_safe(e, et, &file_priv->event_list, link) { 222 list_del(&e->link); 223 kfree(e); 224 } 225 226 spin_unlock_irqrestore(&dev->event_lock, flags); 227 } 228 229 /** 230 * drm_file_free - free file context 231 * @file: context to free, or NULL 232 * 233 * This destroys and deallocates a DRM file context previously allocated via 234 * drm_file_alloc(). The caller must make sure to unlink it from any contexts 235 * before calling this. 236 * 237 * If NULL is passed, this is a no-op. 238 */ 239 void drm_file_free(struct drm_file *file) 240 { 241 struct drm_device *dev; 242 243 if (!file) 244 return; 245 246 dev = file->minor->dev; 247 248 drm_dbg_core(dev, "comm=\"%s\", pid=%d, dev=0x%lx, open_count=%d\n", 249 current->comm, task_pid_nr(current), 250 (long)old_encode_dev(file->minor->kdev->devt), 251 atomic_read(&dev->open_count)); 252 253 #ifdef CONFIG_DRM_LEGACY 254 if (drm_core_check_feature(dev, DRIVER_LEGACY) && 255 dev->driver->preclose) 256 dev->driver->preclose(dev, file); 257 #endif 258 259 if (drm_core_check_feature(dev, DRIVER_LEGACY)) 260 drm_legacy_lock_release(dev, file->filp); 261 262 if (drm_core_check_feature(dev, DRIVER_HAVE_DMA)) 263 drm_legacy_reclaim_buffers(dev, file); 264 265 drm_events_release(file); 266 267 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 268 drm_fb_release(file); 269 drm_property_destroy_user_blobs(dev, file); 270 } 271 272 if (drm_core_check_feature(dev, DRIVER_SYNCOBJ)) 273 drm_syncobj_release(file); 274 275 if (drm_core_check_feature(dev, DRIVER_GEM)) 276 drm_gem_release(dev, file); 277 278 drm_legacy_ctxbitmap_flush(dev, file); 279 280 if (drm_is_primary_client(file)) 281 drm_master_release(file); 282 283 if (dev->driver->postclose) 284 dev->driver->postclose(dev, file); 285 286 drm_prime_destroy_file_private(&file->prime); 287 288 WARN_ON(!list_empty(&file->event_list)); 289 290 put_pid(file->pid); 291 kfree(file); 292 } 293 294 static void drm_close_helper(struct file *filp) 295 { 296 struct drm_file *file_priv = filp->private_data; 297 struct drm_device *dev = file_priv->minor->dev; 298 299 mutex_lock(&dev->filelist_mutex); 300 list_del(&file_priv->lhead); 301 mutex_unlock(&dev->filelist_mutex); 302 303 drm_file_free(file_priv); 304 } 305 306 /* 307 * Check whether DRI will run on this CPU. 308 * 309 * \return non-zero if the DRI will run on this CPU, or zero otherwise. 310 */ 311 static int drm_cpu_valid(void) 312 { 313 #if defined(__sparc__) && !defined(__sparc_v9__) 314 return 0; /* No cmpxchg before v9 sparc. */ 315 #endif 316 return 1; 317 } 318 319 /* 320 * Called whenever a process opens a drm node 321 * 322 * \param filp file pointer. 323 * \param minor acquired minor-object. 324 * \return zero on success or a negative number on failure. 325 * 326 * Creates and initializes a drm_file structure for the file private data in \p 327 * filp and add it into the double linked list in \p dev. 328 */ 329 int drm_open_helper(struct file *filp, struct drm_minor *minor) 330 { 331 struct drm_device *dev = minor->dev; 332 struct drm_file *priv; 333 int ret; 334 335 if (filp->f_flags & O_EXCL) 336 return -EBUSY; /* No exclusive opens */ 337 if (!drm_cpu_valid()) 338 return -EINVAL; 339 if (dev->switch_power_state != DRM_SWITCH_POWER_ON && 340 dev->switch_power_state != DRM_SWITCH_POWER_DYNAMIC_OFF) 341 return -EINVAL; 342 343 drm_dbg_core(dev, "comm=\"%s\", pid=%d, minor=%d\n", 344 current->comm, task_pid_nr(current), minor->index); 345 346 priv = drm_file_alloc(minor); 347 if (IS_ERR(priv)) 348 return PTR_ERR(priv); 349 350 if (drm_is_primary_client(priv)) { 351 ret = drm_master_open(priv); 352 if (ret) { 353 drm_file_free(priv); 354 return ret; 355 } 356 } 357 358 filp->private_data = priv; 359 filp->f_mode |= FMODE_UNSIGNED_OFFSET; 360 priv->filp = filp; 361 362 mutex_lock(&dev->filelist_mutex); 363 list_add(&priv->lhead, &dev->filelist); 364 mutex_unlock(&dev->filelist_mutex); 365 366 #ifdef CONFIG_DRM_LEGACY 367 #ifdef __alpha__ 368 /* 369 * Default the hose 370 */ 371 if (!dev->hose) { 372 struct pci_dev *pci_dev; 373 374 pci_dev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, NULL); 375 if (pci_dev) { 376 dev->hose = pci_dev->sysdata; 377 pci_dev_put(pci_dev); 378 } 379 if (!dev->hose) { 380 struct pci_bus *b = list_entry(pci_root_buses.next, 381 struct pci_bus, node); 382 if (b) 383 dev->hose = b->sysdata; 384 } 385 } 386 #endif 387 #endif 388 389 return 0; 390 } 391 392 /** 393 * drm_open - open method for DRM file 394 * @inode: device inode 395 * @filp: file pointer. 396 * 397 * This function must be used by drivers as their &file_operations.open method. 398 * It looks up the correct DRM device and instantiates all the per-file 399 * resources for it. It also calls the &drm_driver.open driver callback. 400 * 401 * RETURNS: 402 * 403 * 0 on success or negative errno value on failure. 404 */ 405 int drm_open(struct inode *inode, struct file *filp) 406 { 407 struct drm_device *dev; 408 struct drm_minor *minor; 409 int retcode; 410 int need_setup = 0; 411 412 minor = drm_minor_acquire(iminor(inode)); 413 if (IS_ERR(minor)) 414 return PTR_ERR(minor); 415 416 dev = minor->dev; 417 if (drm_dev_needs_global_mutex(dev)) 418 mutex_lock(&drm_global_mutex); 419 420 if (!atomic_fetch_inc(&dev->open_count)) 421 need_setup = 1; 422 423 /* share address_space across all char-devs of a single device */ 424 filp->f_mapping = dev->anon_inode->i_mapping; 425 426 retcode = drm_open_helper(filp, minor); 427 if (retcode) 428 goto err_undo; 429 if (need_setup) { 430 retcode = drm_legacy_setup(dev); 431 if (retcode) { 432 drm_close_helper(filp); 433 goto err_undo; 434 } 435 } 436 437 if (drm_dev_needs_global_mutex(dev)) 438 mutex_unlock(&drm_global_mutex); 439 440 return 0; 441 442 err_undo: 443 atomic_dec(&dev->open_count); 444 if (drm_dev_needs_global_mutex(dev)) 445 mutex_unlock(&drm_global_mutex); 446 drm_minor_release(minor); 447 return retcode; 448 } 449 EXPORT_SYMBOL(drm_open); 450 451 void drm_lastclose(struct drm_device * dev) 452 { 453 drm_dbg_core(dev, "\n"); 454 455 if (dev->driver->lastclose) 456 dev->driver->lastclose(dev); 457 drm_dbg_core(dev, "driver lastclose completed\n"); 458 459 if (drm_core_check_feature(dev, DRIVER_LEGACY)) 460 drm_legacy_dev_reinit(dev); 461 462 drm_client_dev_restore(dev); 463 } 464 465 /** 466 * drm_release - release method for DRM file 467 * @inode: device inode 468 * @filp: file pointer. 469 * 470 * This function must be used by drivers as their &file_operations.release 471 * method. It frees any resources associated with the open file, and calls the 472 * &drm_driver.postclose driver callback. If this is the last open file for the 473 * DRM device also proceeds to call the &drm_driver.lastclose driver callback. 474 * 475 * RETURNS: 476 * 477 * Always succeeds and returns 0. 478 */ 479 int drm_release(struct inode *inode, struct file *filp) 480 { 481 struct drm_file *file_priv = filp->private_data; 482 struct drm_minor *minor = file_priv->minor; 483 struct drm_device *dev = minor->dev; 484 485 if (drm_dev_needs_global_mutex(dev)) 486 mutex_lock(&drm_global_mutex); 487 488 drm_dbg_core(dev, "open_count = %d\n", atomic_read(&dev->open_count)); 489 490 drm_close_helper(filp); 491 492 if (atomic_dec_and_test(&dev->open_count)) 493 drm_lastclose(dev); 494 495 if (drm_dev_needs_global_mutex(dev)) 496 mutex_unlock(&drm_global_mutex); 497 498 drm_minor_release(minor); 499 500 return 0; 501 } 502 EXPORT_SYMBOL(drm_release); 503 504 /** 505 * drm_release_noglobal - release method for DRM file 506 * @inode: device inode 507 * @filp: file pointer. 508 * 509 * This function may be used by drivers as their &file_operations.release 510 * method. It frees any resources associated with the open file prior to taking 511 * the drm_global_mutex, which then calls the &drm_driver.postclose driver 512 * callback. If this is the last open file for the DRM device also proceeds to 513 * call the &drm_driver.lastclose driver callback. 514 * 515 * RETURNS: 516 * 517 * Always succeeds and returns 0. 518 */ 519 int drm_release_noglobal(struct inode *inode, struct file *filp) 520 { 521 struct drm_file *file_priv = filp->private_data; 522 struct drm_minor *minor = file_priv->minor; 523 struct drm_device *dev = minor->dev; 524 525 drm_close_helper(filp); 526 527 if (atomic_dec_and_mutex_lock(&dev->open_count, &drm_global_mutex)) { 528 drm_lastclose(dev); 529 mutex_unlock(&drm_global_mutex); 530 } 531 532 drm_minor_release(minor); 533 534 return 0; 535 } 536 EXPORT_SYMBOL(drm_release_noglobal); 537 538 /** 539 * drm_read - read method for DRM file 540 * @filp: file pointer 541 * @buffer: userspace destination pointer for the read 542 * @count: count in bytes to read 543 * @offset: offset to read 544 * 545 * This function must be used by drivers as their &file_operations.read 546 * method if they use DRM events for asynchronous signalling to userspace. 547 * Since events are used by the KMS API for vblank and page flip completion this 548 * means all modern display drivers must use it. 549 * 550 * @offset is ignored, DRM events are read like a pipe. Polling support is 551 * provided by drm_poll(). 552 * 553 * This function will only ever read a full event. Therefore userspace must 554 * supply a big enough buffer to fit any event to ensure forward progress. Since 555 * the maximum event space is currently 4K it's recommended to just use that for 556 * safety. 557 * 558 * RETURNS: 559 * 560 * Number of bytes read (always aligned to full events, and can be 0) or a 561 * negative error code on failure. 562 */ 563 ssize_t drm_read(struct file *filp, char __user *buffer, 564 size_t count, loff_t *offset) 565 { 566 struct drm_file *file_priv = filp->private_data; 567 struct drm_device *dev = file_priv->minor->dev; 568 ssize_t ret; 569 570 ret = mutex_lock_interruptible(&file_priv->event_read_lock); 571 if (ret) 572 return ret; 573 574 for (;;) { 575 struct drm_pending_event *e = NULL; 576 577 spin_lock_irq(&dev->event_lock); 578 if (!list_empty(&file_priv->event_list)) { 579 e = list_first_entry(&file_priv->event_list, 580 struct drm_pending_event, link); 581 file_priv->event_space += e->event->length; 582 list_del(&e->link); 583 } 584 spin_unlock_irq(&dev->event_lock); 585 586 if (e == NULL) { 587 if (ret) 588 break; 589 590 if (filp->f_flags & O_NONBLOCK) { 591 ret = -EAGAIN; 592 break; 593 } 594 595 mutex_unlock(&file_priv->event_read_lock); 596 ret = wait_event_interruptible(file_priv->event_wait, 597 !list_empty(&file_priv->event_list)); 598 if (ret >= 0) 599 ret = mutex_lock_interruptible(&file_priv->event_read_lock); 600 if (ret) 601 return ret; 602 } else { 603 unsigned length = e->event->length; 604 605 if (length > count - ret) { 606 put_back_event: 607 spin_lock_irq(&dev->event_lock); 608 file_priv->event_space -= length; 609 list_add(&e->link, &file_priv->event_list); 610 spin_unlock_irq(&dev->event_lock); 611 wake_up_interruptible_poll(&file_priv->event_wait, 612 EPOLLIN | EPOLLRDNORM); 613 break; 614 } 615 616 if (copy_to_user(buffer + ret, e->event, length)) { 617 if (ret == 0) 618 ret = -EFAULT; 619 goto put_back_event; 620 } 621 622 ret += length; 623 kfree(e); 624 } 625 } 626 mutex_unlock(&file_priv->event_read_lock); 627 628 return ret; 629 } 630 EXPORT_SYMBOL(drm_read); 631 632 /** 633 * drm_poll - poll method for DRM file 634 * @filp: file pointer 635 * @wait: poll waiter table 636 * 637 * This function must be used by drivers as their &file_operations.read method 638 * if they use DRM events for asynchronous signalling to userspace. Since 639 * events are used by the KMS API for vblank and page flip completion this means 640 * all modern display drivers must use it. 641 * 642 * See also drm_read(). 643 * 644 * RETURNS: 645 * 646 * Mask of POLL flags indicating the current status of the file. 647 */ 648 __poll_t drm_poll(struct file *filp, struct poll_table_struct *wait) 649 { 650 struct drm_file *file_priv = filp->private_data; 651 __poll_t mask = 0; 652 653 poll_wait(filp, &file_priv->event_wait, wait); 654 655 if (!list_empty(&file_priv->event_list)) 656 mask |= EPOLLIN | EPOLLRDNORM; 657 658 return mask; 659 } 660 EXPORT_SYMBOL(drm_poll); 661 662 /** 663 * drm_event_reserve_init_locked - init a DRM event and reserve space for it 664 * @dev: DRM device 665 * @file_priv: DRM file private data 666 * @p: tracking structure for the pending event 667 * @e: actual event data to deliver to userspace 668 * 669 * This function prepares the passed in event for eventual delivery. If the event 670 * doesn't get delivered (because the IOCTL fails later on, before queuing up 671 * anything) then the even must be cancelled and freed using 672 * drm_event_cancel_free(). Successfully initialized events should be sent out 673 * using drm_send_event() or drm_send_event_locked() to signal completion of the 674 * asynchronous event to userspace. 675 * 676 * If callers embedded @p into a larger structure it must be allocated with 677 * kmalloc and @p must be the first member element. 678 * 679 * This is the locked version of drm_event_reserve_init() for callers which 680 * already hold &drm_device.event_lock. 681 * 682 * RETURNS: 683 * 684 * 0 on success or a negative error code on failure. 685 */ 686 int drm_event_reserve_init_locked(struct drm_device *dev, 687 struct drm_file *file_priv, 688 struct drm_pending_event *p, 689 struct drm_event *e) 690 { 691 if (file_priv->event_space < e->length) 692 return -ENOMEM; 693 694 file_priv->event_space -= e->length; 695 696 p->event = e; 697 list_add(&p->pending_link, &file_priv->pending_event_list); 698 p->file_priv = file_priv; 699 700 return 0; 701 } 702 EXPORT_SYMBOL(drm_event_reserve_init_locked); 703 704 /** 705 * drm_event_reserve_init - init a DRM event and reserve space for it 706 * @dev: DRM device 707 * @file_priv: DRM file private data 708 * @p: tracking structure for the pending event 709 * @e: actual event data to deliver to userspace 710 * 711 * This function prepares the passed in event for eventual delivery. If the event 712 * doesn't get delivered (because the IOCTL fails later on, before queuing up 713 * anything) then the even must be cancelled and freed using 714 * drm_event_cancel_free(). Successfully initialized events should be sent out 715 * using drm_send_event() or drm_send_event_locked() to signal completion of the 716 * asynchronous event to userspace. 717 * 718 * If callers embedded @p into a larger structure it must be allocated with 719 * kmalloc and @p must be the first member element. 720 * 721 * Callers which already hold &drm_device.event_lock should use 722 * drm_event_reserve_init_locked() instead. 723 * 724 * RETURNS: 725 * 726 * 0 on success or a negative error code on failure. 727 */ 728 int drm_event_reserve_init(struct drm_device *dev, 729 struct drm_file *file_priv, 730 struct drm_pending_event *p, 731 struct drm_event *e) 732 { 733 unsigned long flags; 734 int ret; 735 736 spin_lock_irqsave(&dev->event_lock, flags); 737 ret = drm_event_reserve_init_locked(dev, file_priv, p, e); 738 spin_unlock_irqrestore(&dev->event_lock, flags); 739 740 return ret; 741 } 742 EXPORT_SYMBOL(drm_event_reserve_init); 743 744 /** 745 * drm_event_cancel_free - free a DRM event and release its space 746 * @dev: DRM device 747 * @p: tracking structure for the pending event 748 * 749 * This function frees the event @p initialized with drm_event_reserve_init() 750 * and releases any allocated space. It is used to cancel an event when the 751 * nonblocking operation could not be submitted and needed to be aborted. 752 */ 753 void drm_event_cancel_free(struct drm_device *dev, 754 struct drm_pending_event *p) 755 { 756 unsigned long flags; 757 758 spin_lock_irqsave(&dev->event_lock, flags); 759 if (p->file_priv) { 760 p->file_priv->event_space += p->event->length; 761 list_del(&p->pending_link); 762 } 763 spin_unlock_irqrestore(&dev->event_lock, flags); 764 765 if (p->fence) 766 dma_fence_put(p->fence); 767 768 kfree(p); 769 } 770 EXPORT_SYMBOL(drm_event_cancel_free); 771 772 static void drm_send_event_helper(struct drm_device *dev, 773 struct drm_pending_event *e, ktime_t timestamp) 774 { 775 assert_spin_locked(&dev->event_lock); 776 777 if (e->completion) { 778 complete_all(e->completion); 779 e->completion_release(e->completion); 780 e->completion = NULL; 781 } 782 783 if (e->fence) { 784 if (timestamp) 785 dma_fence_signal_timestamp(e->fence, timestamp); 786 else 787 dma_fence_signal(e->fence); 788 dma_fence_put(e->fence); 789 } 790 791 if (!e->file_priv) { 792 kfree(e); 793 return; 794 } 795 796 list_del(&e->pending_link); 797 list_add_tail(&e->link, 798 &e->file_priv->event_list); 799 wake_up_interruptible_poll(&e->file_priv->event_wait, 800 EPOLLIN | EPOLLRDNORM); 801 } 802 803 /** 804 * drm_send_event_timestamp_locked - send DRM event to file descriptor 805 * @dev: DRM device 806 * @e: DRM event to deliver 807 * @timestamp: timestamp to set for the fence event in kernel's CLOCK_MONOTONIC 808 * time domain 809 * 810 * This function sends the event @e, initialized with drm_event_reserve_init(), 811 * to its associated userspace DRM file. Callers must already hold 812 * &drm_device.event_lock. 813 * 814 * Note that the core will take care of unlinking and disarming events when the 815 * corresponding DRM file is closed. Drivers need not worry about whether the 816 * DRM file for this event still exists and can call this function upon 817 * completion of the asynchronous work unconditionally. 818 */ 819 void drm_send_event_timestamp_locked(struct drm_device *dev, 820 struct drm_pending_event *e, ktime_t timestamp) 821 { 822 drm_send_event_helper(dev, e, timestamp); 823 } 824 EXPORT_SYMBOL(drm_send_event_timestamp_locked); 825 826 /** 827 * drm_send_event_locked - send DRM event to file descriptor 828 * @dev: DRM device 829 * @e: DRM event to deliver 830 * 831 * This function sends the event @e, initialized with drm_event_reserve_init(), 832 * to its associated userspace DRM file. Callers must already hold 833 * &drm_device.event_lock, see drm_send_event() for the unlocked version. 834 * 835 * Note that the core will take care of unlinking and disarming events when the 836 * corresponding DRM file is closed. Drivers need not worry about whether the 837 * DRM file for this event still exists and can call this function upon 838 * completion of the asynchronous work unconditionally. 839 */ 840 void drm_send_event_locked(struct drm_device *dev, struct drm_pending_event *e) 841 { 842 drm_send_event_helper(dev, e, 0); 843 } 844 EXPORT_SYMBOL(drm_send_event_locked); 845 846 /** 847 * drm_send_event - send DRM event to file descriptor 848 * @dev: DRM device 849 * @e: DRM event to deliver 850 * 851 * This function sends the event @e, initialized with drm_event_reserve_init(), 852 * to its associated userspace DRM file. This function acquires 853 * &drm_device.event_lock, see drm_send_event_locked() for callers which already 854 * hold this lock. 855 * 856 * Note that the core will take care of unlinking and disarming events when the 857 * corresponding DRM file is closed. Drivers need not worry about whether the 858 * DRM file for this event still exists and can call this function upon 859 * completion of the asynchronous work unconditionally. 860 */ 861 void drm_send_event(struct drm_device *dev, struct drm_pending_event *e) 862 { 863 unsigned long irqflags; 864 865 spin_lock_irqsave(&dev->event_lock, irqflags); 866 drm_send_event_helper(dev, e, 0); 867 spin_unlock_irqrestore(&dev->event_lock, irqflags); 868 } 869 EXPORT_SYMBOL(drm_send_event); 870 871 /** 872 * mock_drm_getfile - Create a new struct file for the drm device 873 * @minor: drm minor to wrap (e.g. #drm_device.primary) 874 * @flags: file creation mode (O_RDWR etc) 875 * 876 * This create a new struct file that wraps a DRM file context around a 877 * DRM minor. This mimicks userspace opening e.g. /dev/dri/card0, but without 878 * invoking userspace. The struct file may be operated on using its f_op 879 * (the drm_device.driver.fops) to mimick userspace operations, or be supplied 880 * to userspace facing functions as an internal/anonymous client. 881 * 882 * RETURNS: 883 * Pointer to newly created struct file, ERR_PTR on failure. 884 */ 885 struct file *mock_drm_getfile(struct drm_minor *minor, unsigned int flags) 886 { 887 struct drm_device *dev = minor->dev; 888 struct drm_file *priv; 889 struct file *file; 890 891 priv = drm_file_alloc(minor); 892 if (IS_ERR(priv)) 893 return ERR_CAST(priv); 894 895 file = anon_inode_getfile("drm", dev->driver->fops, priv, flags); 896 if (IS_ERR(file)) { 897 drm_file_free(priv); 898 return file; 899 } 900 901 /* Everyone shares a single global address space */ 902 file->f_mapping = dev->anon_inode->i_mapping; 903 904 drm_dev_get(dev); 905 priv->filp = file; 906 907 return file; 908 } 909 EXPORT_SYMBOL_FOR_TESTS_ONLY(mock_drm_getfile); 910