| .. | .. |
|---|
| 28 | 28 | * OTHER DEALINGS IN THE SOFTWARE. |
|---|
| 29 | 29 | */ |
|---|
| 30 | 30 | |
|---|
| 31 | | -#include <drm/drm_ioctl.h> |
|---|
| 32 | | -#include <drm/drmP.h> |
|---|
| 33 | | -#include <drm/drm_auth.h> |
|---|
| 34 | | -#include "drm_legacy.h" |
|---|
| 35 | | -#include "drm_internal.h" |
|---|
| 36 | | -#include "drm_crtc_internal.h" |
|---|
| 37 | | - |
|---|
| 38 | | -#include <linux/pci.h> |
|---|
| 39 | 31 | #include <linux/export.h> |
|---|
| 40 | 32 | #include <linux/nospec.h> |
|---|
| 33 | +#include <linux/pci.h> |
|---|
| 34 | +#include <linux/uaccess.h> |
|---|
| 35 | + |
|---|
| 36 | +#include <drm/drm_agpsupport.h> |
|---|
| 37 | +#include <drm/drm_auth.h> |
|---|
| 38 | +#include <drm/drm_crtc.h> |
|---|
| 39 | +#include <drm/drm_drv.h> |
|---|
| 40 | +#include <drm/drm_file.h> |
|---|
| 41 | +#include <drm/drm_ioctl.h> |
|---|
| 42 | +#include <drm/drm_print.h> |
|---|
| 43 | + |
|---|
| 44 | +#include "drm_crtc_internal.h" |
|---|
| 45 | +#include "drm_internal.h" |
|---|
| 46 | +#include "drm_legacy.h" |
|---|
| 41 | 47 | |
|---|
| 42 | 48 | /** |
|---|
| 43 | 49 | * DOC: getunique and setversion story |
|---|
| .. | .. |
|---|
| 246 | 252 | case DRM_CAP_SYNCOBJ: |
|---|
| 247 | 253 | req->value = drm_core_check_feature(dev, DRIVER_SYNCOBJ); |
|---|
| 248 | 254 | return 0; |
|---|
| 255 | + case DRM_CAP_SYNCOBJ_TIMELINE: |
|---|
| 256 | + req->value = drm_core_check_feature(dev, DRIVER_SYNCOBJ_TIMELINE); |
|---|
| 257 | + return 0; |
|---|
| 249 | 258 | } |
|---|
| 250 | 259 | |
|---|
| 251 | 260 | /* Other caps only work with KMS drivers */ |
|---|
| 252 | 261 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
|---|
| 253 | | - return -ENOTSUPP; |
|---|
| 262 | + return -EOPNOTSUPP; |
|---|
| 254 | 263 | |
|---|
| 255 | 264 | switch (req->capability) { |
|---|
| 256 | 265 | case DRM_CAP_DUMB_BUFFER: |
|---|
| .. | .. |
|---|
| 308 | 317 | { |
|---|
| 309 | 318 | struct drm_set_client_cap *req = data; |
|---|
| 310 | 319 | |
|---|
| 320 | + /* No render-only settable capabilities for now */ |
|---|
| 321 | + |
|---|
| 322 | + /* Below caps that only works with KMS drivers */ |
|---|
| 323 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
|---|
| 324 | + return -EOPNOTSUPP; |
|---|
| 325 | + |
|---|
| 311 | 326 | switch (req->capability) { |
|---|
| 312 | 327 | case DRM_CLIENT_CAP_STEREO_3D: |
|---|
| 313 | 328 | if (req->value > 1) |
|---|
| .. | .. |
|---|
| 319 | 334 | return -EINVAL; |
|---|
| 320 | 335 | file_priv->universal_planes = req->value; |
|---|
| 321 | 336 | break; |
|---|
| 322 | | - case DRM_CLIENT_CAP_SHARE_PLANES: |
|---|
| 323 | | - break; |
|---|
| 324 | 337 | case DRM_CLIENT_CAP_ATOMIC: |
|---|
| 325 | 338 | if (!drm_core_check_feature(dev, DRIVER_ATOMIC)) |
|---|
| 326 | | - return -EINVAL; |
|---|
| 339 | + return -EOPNOTSUPP; |
|---|
| 327 | 340 | /* The modesetting DDX has a totally broken idea of atomic. */ |
|---|
| 328 | 341 | if (current->comm[0] == 'X' && req->value == 1) { |
|---|
| 329 | 342 | pr_info("broken atomic modeset userspace detected, disabling atomic\n"); |
|---|
| .. | .. |
|---|
| 460 | 473 | */ |
|---|
| 461 | 474 | static int drm_copy_field(char __user *buf, size_t *buf_len, const char *value) |
|---|
| 462 | 475 | { |
|---|
| 463 | | - int len; |
|---|
| 476 | + size_t len; |
|---|
| 477 | + |
|---|
| 478 | + /* don't attempt to copy a NULL pointer */ |
|---|
| 479 | + if (WARN_ONCE(!value, "BUG: the value to copy was not set!")) { |
|---|
| 480 | + *buf_len = 0; |
|---|
| 481 | + return 0; |
|---|
| 482 | + } |
|---|
| 464 | 483 | |
|---|
| 465 | 484 | /* don't overflow userbuf */ |
|---|
| 466 | 485 | len = strlen(value); |
|---|
| .. | .. |
|---|
| 557 | 576 | .name = #ioctl \ |
|---|
| 558 | 577 | } |
|---|
| 559 | 578 | |
|---|
| 579 | +#if IS_ENABLED(CONFIG_DRM_LEGACY) |
|---|
| 580 | +#define DRM_LEGACY_IOCTL_DEF(ioctl, _func, _flags) DRM_IOCTL_DEF(ioctl, _func, _flags) |
|---|
| 581 | +#else |
|---|
| 582 | +#define DRM_LEGACY_IOCTL_DEF(ioctl, _func, _flags) DRM_IOCTL_DEF(ioctl, drm_invalid_op, _flags) |
|---|
| 583 | +#endif |
|---|
| 584 | + |
|---|
| 560 | 585 | /* Ioctl table */ |
|---|
| 561 | 586 | static const struct drm_ioctl_desc drm_ioctls[] = { |
|---|
| 562 | | - DRM_IOCTL_DEF(DRM_IOCTL_VERSION, drm_version, |
|---|
| 563 | | - DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|---|
| 564 | | - DRM_IOCTL_DEF(DRM_IOCTL_GET_UNIQUE, drm_getunique, DRM_UNLOCKED), |
|---|
| 565 | | - DRM_IOCTL_DEF(DRM_IOCTL_GET_MAGIC, drm_getmagic, DRM_UNLOCKED), |
|---|
| 587 | + DRM_IOCTL_DEF(DRM_IOCTL_VERSION, drm_version, DRM_RENDER_ALLOW), |
|---|
| 588 | + DRM_IOCTL_DEF(DRM_IOCTL_GET_UNIQUE, drm_getunique, 0), |
|---|
| 589 | + DRM_IOCTL_DEF(DRM_IOCTL_GET_MAGIC, drm_getmagic, 0), |
|---|
| 566 | 590 | DRM_IOCTL_DEF(DRM_IOCTL_IRQ_BUSID, drm_irq_by_busid, DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 567 | | - DRM_IOCTL_DEF(DRM_IOCTL_GET_MAP, drm_legacy_getmap_ioctl, DRM_UNLOCKED), |
|---|
| 568 | | - DRM_IOCTL_DEF(DRM_IOCTL_GET_CLIENT, drm_getclient, DRM_UNLOCKED), |
|---|
| 569 | | - DRM_IOCTL_DEF(DRM_IOCTL_GET_STATS, drm_getstats, DRM_UNLOCKED), |
|---|
| 570 | | - DRM_IOCTL_DEF(DRM_IOCTL_GET_CAP, drm_getcap, DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|---|
| 571 | | - DRM_IOCTL_DEF(DRM_IOCTL_SET_CLIENT_CAP, drm_setclientcap, DRM_UNLOCKED), |
|---|
| 572 | | - DRM_IOCTL_DEF(DRM_IOCTL_SET_VERSION, drm_setversion, DRM_UNLOCKED | DRM_MASTER), |
|---|
| 591 | + |
|---|
| 592 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_GET_MAP, drm_legacy_getmap_ioctl, 0), |
|---|
| 593 | + |
|---|
| 594 | + DRM_IOCTL_DEF(DRM_IOCTL_GET_CLIENT, drm_getclient, 0), |
|---|
| 595 | + DRM_IOCTL_DEF(DRM_IOCTL_GET_STATS, drm_getstats, 0), |
|---|
| 596 | + DRM_IOCTL_DEF(DRM_IOCTL_GET_CAP, drm_getcap, DRM_RENDER_ALLOW), |
|---|
| 597 | + DRM_IOCTL_DEF(DRM_IOCTL_SET_CLIENT_CAP, drm_setclientcap, 0), |
|---|
| 598 | + DRM_IOCTL_DEF(DRM_IOCTL_SET_VERSION, drm_setversion, DRM_MASTER), |
|---|
| 573 | 599 | |
|---|
| 574 | 600 | DRM_IOCTL_DEF(DRM_IOCTL_SET_UNIQUE, drm_invalid_op, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 575 | 601 | DRM_IOCTL_DEF(DRM_IOCTL_BLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 576 | 602 | DRM_IOCTL_DEF(DRM_IOCTL_UNBLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 577 | | - DRM_IOCTL_DEF(DRM_IOCTL_AUTH_MAGIC, drm_authmagic, DRM_AUTH|DRM_UNLOCKED|DRM_MASTER), |
|---|
| 603 | + DRM_IOCTL_DEF(DRM_IOCTL_AUTH_MAGIC, drm_authmagic, DRM_MASTER), |
|---|
| 578 | 604 | |
|---|
| 579 | | - DRM_IOCTL_DEF(DRM_IOCTL_ADD_MAP, drm_legacy_addmap_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 580 | | - DRM_IOCTL_DEF(DRM_IOCTL_RM_MAP, drm_legacy_rmmap_ioctl, DRM_AUTH), |
|---|
| 605 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_ADD_MAP, drm_legacy_addmap_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 606 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_RM_MAP, drm_legacy_rmmap_ioctl, DRM_AUTH), |
|---|
| 581 | 607 | |
|---|
| 582 | | - DRM_IOCTL_DEF(DRM_IOCTL_SET_SAREA_CTX, drm_legacy_setsareactx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 583 | | - DRM_IOCTL_DEF(DRM_IOCTL_GET_SAREA_CTX, drm_legacy_getsareactx, DRM_AUTH), |
|---|
| 608 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_SET_SAREA_CTX, drm_legacy_setsareactx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 609 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_GET_SAREA_CTX, drm_legacy_getsareactx, DRM_AUTH), |
|---|
| 584 | 610 | |
|---|
| 585 | | - DRM_IOCTL_DEF(DRM_IOCTL_SET_MASTER, drm_setmaster_ioctl, DRM_UNLOCKED|DRM_ROOT_ONLY), |
|---|
| 586 | | - DRM_IOCTL_DEF(DRM_IOCTL_DROP_MASTER, drm_dropmaster_ioctl, DRM_UNLOCKED|DRM_ROOT_ONLY), |
|---|
| 611 | + DRM_IOCTL_DEF(DRM_IOCTL_SET_MASTER, drm_setmaster_ioctl, 0), |
|---|
| 612 | + DRM_IOCTL_DEF(DRM_IOCTL_DROP_MASTER, drm_dropmaster_ioctl, 0), |
|---|
| 587 | 613 | |
|---|
| 588 | | - DRM_IOCTL_DEF(DRM_IOCTL_ADD_CTX, drm_legacy_addctx, DRM_AUTH|DRM_ROOT_ONLY), |
|---|
| 589 | | - DRM_IOCTL_DEF(DRM_IOCTL_RM_CTX, drm_legacy_rmctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 590 | | - DRM_IOCTL_DEF(DRM_IOCTL_MOD_CTX, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 591 | | - DRM_IOCTL_DEF(DRM_IOCTL_GET_CTX, drm_legacy_getctx, DRM_AUTH), |
|---|
| 592 | | - DRM_IOCTL_DEF(DRM_IOCTL_SWITCH_CTX, drm_legacy_switchctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 593 | | - DRM_IOCTL_DEF(DRM_IOCTL_NEW_CTX, drm_legacy_newctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 594 | | - DRM_IOCTL_DEF(DRM_IOCTL_RES_CTX, drm_legacy_resctx, DRM_AUTH), |
|---|
| 614 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_ADD_CTX, drm_legacy_addctx, DRM_AUTH|DRM_ROOT_ONLY), |
|---|
| 615 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_RM_CTX, drm_legacy_rmctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 616 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_MOD_CTX, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 617 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_GET_CTX, drm_legacy_getctx, DRM_AUTH), |
|---|
| 618 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_SWITCH_CTX, drm_legacy_switchctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 619 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_NEW_CTX, drm_legacy_newctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 620 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_RES_CTX, drm_legacy_resctx, DRM_AUTH), |
|---|
| 595 | 621 | |
|---|
| 596 | 622 | DRM_IOCTL_DEF(DRM_IOCTL_ADD_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 597 | 623 | DRM_IOCTL_DEF(DRM_IOCTL_RM_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 598 | 624 | |
|---|
| 599 | | - DRM_IOCTL_DEF(DRM_IOCTL_LOCK, drm_legacy_lock, DRM_AUTH), |
|---|
| 600 | | - DRM_IOCTL_DEF(DRM_IOCTL_UNLOCK, drm_legacy_unlock, DRM_AUTH), |
|---|
| 625 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_LOCK, drm_legacy_lock, DRM_AUTH), |
|---|
| 626 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_UNLOCK, drm_legacy_unlock, DRM_AUTH), |
|---|
| 601 | 627 | |
|---|
| 602 | 628 | DRM_IOCTL_DEF(DRM_IOCTL_FINISH, drm_noop, DRM_AUTH), |
|---|
| 603 | 629 | |
|---|
| 604 | | - DRM_IOCTL_DEF(DRM_IOCTL_ADD_BUFS, drm_legacy_addbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 605 | | - DRM_IOCTL_DEF(DRM_IOCTL_MARK_BUFS, drm_legacy_markbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 606 | | - DRM_IOCTL_DEF(DRM_IOCTL_INFO_BUFS, drm_legacy_infobufs, DRM_AUTH), |
|---|
| 607 | | - DRM_IOCTL_DEF(DRM_IOCTL_MAP_BUFS, drm_legacy_mapbufs, DRM_AUTH), |
|---|
| 608 | | - DRM_IOCTL_DEF(DRM_IOCTL_FREE_BUFS, drm_legacy_freebufs, DRM_AUTH), |
|---|
| 609 | | - DRM_IOCTL_DEF(DRM_IOCTL_DMA, drm_legacy_dma_ioctl, DRM_AUTH), |
|---|
| 610 | | - |
|---|
| 611 | | - DRM_IOCTL_DEF(DRM_IOCTL_CONTROL, drm_legacy_irq_control, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 630 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_ADD_BUFS, drm_legacy_addbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 631 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_MARK_BUFS, drm_legacy_markbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 632 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_INFO_BUFS, drm_legacy_infobufs, DRM_AUTH), |
|---|
| 633 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_MAP_BUFS, drm_legacy_mapbufs, DRM_AUTH), |
|---|
| 634 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_FREE_BUFS, drm_legacy_freebufs, DRM_AUTH), |
|---|
| 635 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_DMA, drm_legacy_dma_ioctl, DRM_AUTH), |
|---|
| 636 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_CONTROL, drm_legacy_irq_control, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 612 | 637 | |
|---|
| 613 | 638 | #if IS_ENABLED(CONFIG_AGP) |
|---|
| 614 | 639 | DRM_IOCTL_DEF(DRM_IOCTL_AGP_ACQUIRE, drm_agp_acquire_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| .. | .. |
|---|
| 621 | 646 | DRM_IOCTL_DEF(DRM_IOCTL_AGP_UNBIND, drm_agp_unbind_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 622 | 647 | #endif |
|---|
| 623 | 648 | |
|---|
| 624 | | - DRM_IOCTL_DEF(DRM_IOCTL_SG_ALLOC, drm_legacy_sg_alloc, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 625 | | - DRM_IOCTL_DEF(DRM_IOCTL_SG_FREE, drm_legacy_sg_free, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 649 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_SG_ALLOC, drm_legacy_sg_alloc, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 650 | + DRM_LEGACY_IOCTL_DEF(DRM_IOCTL_SG_FREE, drm_legacy_sg_free, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 626 | 651 | |
|---|
| 627 | 652 | DRM_IOCTL_DEF(DRM_IOCTL_WAIT_VBLANK, drm_wait_vblank_ioctl, DRM_UNLOCKED), |
|---|
| 628 | 653 | |
|---|
| .. | .. |
|---|
| 630 | 655 | |
|---|
| 631 | 656 | DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), |
|---|
| 632 | 657 | |
|---|
| 633 | | - DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|---|
| 634 | | - DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH|DRM_UNLOCKED), |
|---|
| 635 | | - DRM_IOCTL_DEF(DRM_IOCTL_GEM_OPEN, drm_gem_open_ioctl, DRM_AUTH|DRM_UNLOCKED), |
|---|
| 658 | + DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, DRM_RENDER_ALLOW), |
|---|
| 659 | + DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH), |
|---|
| 660 | + DRM_IOCTL_DEF(DRM_IOCTL_GEM_OPEN, drm_gem_open_ioctl, DRM_AUTH), |
|---|
| 636 | 661 | |
|---|
| 637 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETRESOURCES, drm_mode_getresources, DRM_UNLOCKED), |
|---|
| 662 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETRESOURCES, drm_mode_getresources, 0), |
|---|
| 638 | 663 | |
|---|
| 639 | | - DRM_IOCTL_DEF(DRM_IOCTL_PRIME_HANDLE_TO_FD, drm_prime_handle_to_fd_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|---|
| 640 | | - DRM_IOCTL_DEF(DRM_IOCTL_PRIME_FD_TO_HANDLE, drm_prime_fd_to_handle_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|---|
| 664 | + DRM_IOCTL_DEF(DRM_IOCTL_PRIME_HANDLE_TO_FD, drm_prime_handle_to_fd_ioctl, DRM_RENDER_ALLOW), |
|---|
| 665 | + DRM_IOCTL_DEF(DRM_IOCTL_PRIME_FD_TO_HANDLE, drm_prime_fd_to_handle_ioctl, DRM_RENDER_ALLOW), |
|---|
| 641 | 666 | |
|---|
| 642 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANERESOURCES, drm_mode_getplane_res, DRM_UNLOCKED), |
|---|
| 643 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCRTC, drm_mode_getcrtc, DRM_UNLOCKED), |
|---|
| 644 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETCRTC, drm_mode_setcrtc, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 645 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANE, drm_mode_getplane, DRM_UNLOCKED), |
|---|
| 646 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPLANE, drm_mode_setplane, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 647 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR, drm_mode_cursor_ioctl, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 648 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETGAMMA, drm_mode_gamma_get_ioctl, DRM_UNLOCKED), |
|---|
| 649 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETGAMMA, drm_mode_gamma_set_ioctl, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 650 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETENCODER, drm_mode_getencoder, DRM_UNLOCKED), |
|---|
| 651 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, DRM_UNLOCKED), |
|---|
| 652 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATTACHMODE, drm_noop, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 653 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_DETACHMODE, drm_noop, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 654 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPERTY, drm_mode_getproperty_ioctl, DRM_UNLOCKED), |
|---|
| 655 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPERTY, drm_connector_property_set_ioctl, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 656 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, DRM_UNLOCKED), |
|---|
| 657 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_UNLOCKED), |
|---|
| 658 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb_ioctl, DRM_UNLOCKED), |
|---|
| 659 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB2, drm_mode_addfb2, DRM_UNLOCKED), |
|---|
| 660 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb_ioctl, DRM_UNLOCKED), |
|---|
| 661 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 662 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 663 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|---|
| 664 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|---|
| 665 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|---|
| 666 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, drm_mode_obj_get_properties_ioctl, DRM_UNLOCKED), |
|---|
| 667 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_SETPROPERTY, drm_mode_obj_set_property_ioctl, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 668 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR2, drm_mode_cursor2_ioctl, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 669 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATOMIC, drm_mode_atomic_ioctl, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 670 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATEPROPBLOB, drm_mode_createblob_ioctl, DRM_UNLOCKED), |
|---|
| 671 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROYPROPBLOB, drm_mode_destroyblob_ioctl, DRM_UNLOCKED), |
|---|
| 667 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANERESOURCES, drm_mode_getplane_res, 0), |
|---|
| 668 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCRTC, drm_mode_getcrtc, 0), |
|---|
| 669 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETCRTC, drm_mode_setcrtc, DRM_MASTER), |
|---|
| 670 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANE, drm_mode_getplane, 0), |
|---|
| 671 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPLANE, drm_mode_setplane, DRM_MASTER), |
|---|
| 672 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR, drm_mode_cursor_ioctl, DRM_MASTER), |
|---|
| 673 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETGAMMA, drm_mode_gamma_get_ioctl, 0), |
|---|
| 674 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETGAMMA, drm_mode_gamma_set_ioctl, DRM_MASTER), |
|---|
| 675 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETENCODER, drm_mode_getencoder, 0), |
|---|
| 676 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, 0), |
|---|
| 677 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATTACHMODE, drm_noop, DRM_MASTER), |
|---|
| 678 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_DETACHMODE, drm_noop, DRM_MASTER), |
|---|
| 679 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPERTY, drm_mode_getproperty_ioctl, 0), |
|---|
| 680 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPERTY, drm_connector_property_set_ioctl, DRM_MASTER), |
|---|
| 681 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, 0), |
|---|
| 682 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, 0), |
|---|
| 683 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB2, drm_mode_getfb2_ioctl, 0), |
|---|
| 684 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb_ioctl, 0), |
|---|
| 685 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB2, drm_mode_addfb2_ioctl, 0), |
|---|
| 686 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb_ioctl, 0), |
|---|
| 687 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER), |
|---|
| 688 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER), |
|---|
| 689 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, DRM_RENDER_ALLOW), |
|---|
| 690 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, DRM_RENDER_ALLOW), |
|---|
| 691 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_RENDER_ALLOW), |
|---|
| 692 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, drm_mode_obj_get_properties_ioctl, 0), |
|---|
| 693 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_SETPROPERTY, drm_mode_obj_set_property_ioctl, DRM_MASTER), |
|---|
| 694 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR2, drm_mode_cursor2_ioctl, DRM_MASTER), |
|---|
| 695 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATOMIC, drm_mode_atomic_ioctl, DRM_MASTER), |
|---|
| 696 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATEPROPBLOB, drm_mode_createblob_ioctl, 0), |
|---|
| 697 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROYPROPBLOB, drm_mode_destroyblob_ioctl, 0), |
|---|
| 672 | 698 | |
|---|
| 673 | 699 | DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_CREATE, drm_syncobj_create_ioctl, |
|---|
| 674 | | - DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|---|
| 700 | + DRM_RENDER_ALLOW), |
|---|
| 675 | 701 | DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_DESTROY, drm_syncobj_destroy_ioctl, |
|---|
| 676 | | - DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|---|
| 702 | + DRM_RENDER_ALLOW), |
|---|
| 677 | 703 | DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, drm_syncobj_handle_to_fd_ioctl, |
|---|
| 678 | | - DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|---|
| 704 | + DRM_RENDER_ALLOW), |
|---|
| 679 | 705 | DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, drm_syncobj_fd_to_handle_ioctl, |
|---|
| 680 | | - DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|---|
| 706 | + DRM_RENDER_ALLOW), |
|---|
| 707 | + DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TRANSFER, drm_syncobj_transfer_ioctl, |
|---|
| 708 | + DRM_RENDER_ALLOW), |
|---|
| 681 | 709 | DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl, |
|---|
| 682 | | - DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|---|
| 710 | + DRM_RENDER_ALLOW), |
|---|
| 711 | + DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, drm_syncobj_timeline_wait_ioctl, |
|---|
| 712 | + DRM_RENDER_ALLOW), |
|---|
| 683 | 713 | DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_RESET, drm_syncobj_reset_ioctl, |
|---|
| 684 | | - DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|---|
| 714 | + DRM_RENDER_ALLOW), |
|---|
| 685 | 715 | DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_SIGNAL, drm_syncobj_signal_ioctl, |
|---|
| 686 | | - DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|---|
| 687 | | - DRM_IOCTL_DEF(DRM_IOCTL_CRTC_GET_SEQUENCE, drm_crtc_get_sequence_ioctl, DRM_UNLOCKED), |
|---|
| 688 | | - DRM_IOCTL_DEF(DRM_IOCTL_CRTC_QUEUE_SEQUENCE, drm_crtc_queue_sequence_ioctl, DRM_UNLOCKED), |
|---|
| 689 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_LEASE, drm_mode_create_lease_ioctl, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 690 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_LIST_LESSEES, drm_mode_list_lessees_ioctl, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 691 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_GET_LEASE, drm_mode_get_lease_ioctl, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 692 | | - DRM_IOCTL_DEF(DRM_IOCTL_MODE_REVOKE_LEASE, drm_mode_revoke_lease_ioctl, DRM_MASTER|DRM_UNLOCKED), |
|---|
| 716 | + DRM_RENDER_ALLOW), |
|---|
| 717 | + DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL, drm_syncobj_timeline_signal_ioctl, |
|---|
| 718 | + DRM_RENDER_ALLOW), |
|---|
| 719 | + DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_QUERY, drm_syncobj_query_ioctl, |
|---|
| 720 | + DRM_RENDER_ALLOW), |
|---|
| 721 | + DRM_IOCTL_DEF(DRM_IOCTL_CRTC_GET_SEQUENCE, drm_crtc_get_sequence_ioctl, 0), |
|---|
| 722 | + DRM_IOCTL_DEF(DRM_IOCTL_CRTC_QUEUE_SEQUENCE, drm_crtc_queue_sequence_ioctl, 0), |
|---|
| 723 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_LEASE, drm_mode_create_lease_ioctl, DRM_MASTER), |
|---|
| 724 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_LIST_LESSEES, drm_mode_list_lessees_ioctl, DRM_MASTER), |
|---|
| 725 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GET_LEASE, drm_mode_get_lease_ioctl, DRM_MASTER), |
|---|
| 726 | + DRM_IOCTL_DEF(DRM_IOCTL_MODE_REVOKE_LEASE, drm_mode_revoke_lease_ioctl, DRM_MASTER), |
|---|
| 693 | 727 | }; |
|---|
| 694 | 728 | |
|---|
| 695 | 729 | #define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls ) |
|---|
| .. | .. |
|---|
| 716 | 750 | * }; |
|---|
| 717 | 751 | * |
|---|
| 718 | 752 | * Please make sure that you follow all the best practices from |
|---|
| 719 | | - * ``Documentation/ioctl/botching-up-ioctls.txt``. Note that drm_ioctl() |
|---|
| 753 | + * ``Documentation/process/botching-up-ioctls.rst``. Note that drm_ioctl() |
|---|
| 720 | 754 | * automatically zero-extends structures, hence make sure you can add more stuff |
|---|
| 721 | 755 | * at the end, i.e. don't put a variable sized array there. |
|---|
| 722 | 756 | * |
|---|
| .. | .. |
|---|
| 757 | 791 | return retcode; |
|---|
| 758 | 792 | |
|---|
| 759 | 793 | /* Enforce sane locking for modern driver ioctls. */ |
|---|
| 760 | | - if (!drm_core_check_feature(dev, DRIVER_LEGACY) || |
|---|
| 794 | + if (likely(!drm_core_check_feature(dev, DRIVER_LEGACY)) || |
|---|
| 761 | 795 | (flags & DRM_UNLOCKED)) |
|---|
| 762 | 796 | retcode = func(dev, kdata, file_priv); |
|---|
| 763 | 797 | else { |
|---|
| .. | .. |
|---|
| 830 | 864 | out_size = 0; |
|---|
| 831 | 865 | ksize = max(max(in_size, out_size), drv_size); |
|---|
| 832 | 866 | |
|---|
| 833 | | - DRM_DEBUG("pid=%d, dev=0x%lx, auth=%d, %s\n", |
|---|
| 834 | | - task_pid_nr(current), |
|---|
| 867 | + DRM_DEBUG("comm=\"%s\" pid=%d, dev=0x%lx, auth=%d, %s\n", |
|---|
| 868 | + current->comm, task_pid_nr(current), |
|---|
| 835 | 869 | (long)old_encode_dev(file_priv->minor->kdev->devt), |
|---|
| 836 | 870 | file_priv->authenticated, ioctl->name); |
|---|
| 837 | 871 | |
|---|
| .. | .. |
|---|
| 868 | 902 | |
|---|
| 869 | 903 | err_i1: |
|---|
| 870 | 904 | if (!ioctl) |
|---|
| 871 | | - DRM_DEBUG("invalid ioctl: pid=%d, dev=0x%lx, auth=%d, cmd=0x%02x, nr=0x%02x\n", |
|---|
| 872 | | - task_pid_nr(current), |
|---|
| 905 | + DRM_DEBUG("invalid ioctl: comm=\"%s\", pid=%d, dev=0x%lx, auth=%d, cmd=0x%02x, nr=0x%02x\n", |
|---|
| 906 | + current->comm, task_pid_nr(current), |
|---|
| 873 | 907 | (long)old_encode_dev(file_priv->minor->kdev->devt), |
|---|
| 874 | 908 | file_priv->authenticated, cmd, nr); |
|---|
| 875 | 909 | |
|---|
| 876 | 910 | if (kdata != stack_kdata) |
|---|
| 877 | 911 | kfree(kdata); |
|---|
| 878 | 912 | if (retcode) |
|---|
| 879 | | - DRM_DEBUG("pid=%d, ret = %d\n", task_pid_nr(current), retcode); |
|---|
| 913 | + DRM_DEBUG("comm=\"%s\", pid=%d, ret=%d\n", current->comm, |
|---|
| 914 | + task_pid_nr(current), retcode); |
|---|
| 880 | 915 | return retcode; |
|---|
| 881 | 916 | } |
|---|
| 882 | 917 | EXPORT_SYMBOL(drm_ioctl); |
|---|