1 /* 2 * Copyright (c) 2006-2008 Intel Corporation 3 * Copyright (c) 2007 Dave Airlie <airlied@linux.ie> 4 * Copyright (c) 2008 Red Hat Inc. 5 * 6 * DRM core CRTC related functions 7 * 8 * Permission to use, copy, modify, distribute, and sell this software and its 9 * documentation for any purpose is hereby granted without fee, provided that 10 * the above copyright notice appear in all copies and that both that copyright 11 * notice and this permission notice appear in supporting documentation, and 12 * that the name of the copyright holders not be used in advertising or 13 * publicity pertaining to distribution of the software without specific, 14 * written prior permission. The copyright holders make no representations 15 * about the suitability of this software for any purpose. It is provided "as 16 * is" without express or implied warranty. 17 * 18 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 19 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 20 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 21 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 22 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 23 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 24 * OF THIS SOFTWARE. 25 * 26 * Authors: 27 * Keith Packard 28 * Eric Anholt <eric@anholt.net> 29 * Dave Airlie <airlied@linux.ie> 30 * Jesse Barnes <jesse.barnes@intel.com> 31 */ 32 #include <linux/ctype.h> 33 #include <linux/list.h> 34 #include <linux/slab.h> 35 #include <linux/export.h> 36 #include <linux/dma-fence.h> 37 #include <linux/uaccess.h> 38 #include <drm/drm_blend.h> 39 #include <drm/drm_crtc.h> 40 #include <drm/drm_edid.h> 41 #include <drm/drm_fourcc.h> 42 #include <drm/drm_framebuffer.h> 43 #include <drm/drm_managed.h> 44 #include <drm/drm_modeset_lock.h> 45 #include <drm/drm_atomic.h> 46 #include <drm/drm_auth.h> 47 #include <drm/drm_debugfs_crc.h> 48 #include <drm/drm_drv.h> 49 #include <drm/drm_print.h> 50 #include <drm/drm_file.h> 51 52 #include "drm_crtc_internal.h" 53 #include "drm_internal.h" 54 55 /** 56 * DOC: overview 57 * 58 * A CRTC represents the overall display pipeline. It receives pixel data from 59 * &drm_plane and blends them together. The &drm_display_mode is also attached 60 * to the CRTC, specifying display timings. On the output side the data is fed 61 * to one or more &drm_encoder, which are then each connected to one 62 * &drm_connector. 63 * 64 * To create a CRTC, a KMS drivers allocates and zeroes an instances of 65 * &struct drm_crtc (possibly as part of a larger structure) and registers it 66 * with a call to drm_crtc_init_with_planes(). 67 * 68 * The CRTC is also the entry point for legacy modeset operations, see 69 * &drm_crtc_funcs.set_config, legacy plane operations, see 70 * &drm_crtc_funcs.page_flip and &drm_crtc_funcs.cursor_set2, and other legacy 71 * operations like &drm_crtc_funcs.gamma_set. For atomic drivers all these 72 * features are controlled through &drm_property and 73 * &drm_mode_config_funcs.atomic_check. 74 */ 75 76 /** 77 * drm_crtc_from_index - find the registered CRTC at an index 78 * @dev: DRM device 79 * @idx: index of registered CRTC to find for 80 * 81 * Given a CRTC index, return the registered CRTC from DRM device's 82 * list of CRTCs with matching index. This is the inverse of drm_crtc_index(). 83 * It's useful in the vblank callbacks (like &drm_driver.enable_vblank or 84 * &drm_driver.disable_vblank), since that still deals with indices instead 85 * of pointers to &struct drm_crtc." 86 */ 87 struct drm_crtc *drm_crtc_from_index(struct drm_device *dev, int idx) 88 { 89 struct drm_crtc *crtc; 90 91 drm_for_each_crtc(crtc, dev) 92 if (idx == crtc->index) 93 return crtc; 94 95 return NULL; 96 } 97 EXPORT_SYMBOL(drm_crtc_from_index); 98 99 int drm_crtc_force_disable(struct drm_crtc *crtc) 100 { 101 struct drm_mode_set set = { 102 .crtc = crtc, 103 }; 104 105 WARN_ON(drm_drv_uses_atomic_modeset(crtc->dev)); 106 107 return drm_mode_set_config_internal(&set); 108 } 109 110 static unsigned int drm_num_crtcs(struct drm_device *dev) 111 { 112 unsigned int num = 0; 113 struct drm_crtc *tmp; 114 115 drm_for_each_crtc(tmp, dev) { 116 num++; 117 } 118 119 return num; 120 } 121 122 int drm_crtc_register_all(struct drm_device *dev) 123 { 124 struct drm_crtc *crtc; 125 int ret = 0; 126 127 drm_for_each_crtc(crtc, dev) { 128 drm_debugfs_crtc_add(crtc); 129 130 if (crtc->funcs->late_register) 131 ret = crtc->funcs->late_register(crtc); 132 if (ret) 133 return ret; 134 } 135 136 return 0; 137 } 138 139 void drm_crtc_unregister_all(struct drm_device *dev) 140 { 141 struct drm_crtc *crtc; 142 143 drm_for_each_crtc(crtc, dev) { 144 if (crtc->funcs->early_unregister) 145 crtc->funcs->early_unregister(crtc); 146 drm_debugfs_crtc_remove(crtc); 147 } 148 } 149 150 static int drm_crtc_crc_init(struct drm_crtc *crtc) 151 { 152 #ifdef CONFIG_DEBUG_FS 153 spin_lock_init(&crtc->crc.lock); 154 init_waitqueue_head(&crtc->crc.wq); 155 crtc->crc.source = kstrdup("auto", GFP_KERNEL); 156 if (!crtc->crc.source) 157 return -ENOMEM; 158 #endif 159 return 0; 160 } 161 162 static void drm_crtc_crc_fini(struct drm_crtc *crtc) 163 { 164 #ifdef CONFIG_DEBUG_FS 165 kfree(crtc->crc.source); 166 #endif 167 } 168 169 static const struct dma_fence_ops drm_crtc_fence_ops; 170 171 static struct drm_crtc *fence_to_crtc(struct dma_fence *fence) 172 { 173 BUG_ON(fence->ops != &drm_crtc_fence_ops); 174 return container_of(fence->lock, struct drm_crtc, fence_lock); 175 } 176 177 static const char *drm_crtc_fence_get_driver_name(struct dma_fence *fence) 178 { 179 struct drm_crtc *crtc = fence_to_crtc(fence); 180 181 return crtc->dev->driver->name; 182 } 183 184 static const char *drm_crtc_fence_get_timeline_name(struct dma_fence *fence) 185 { 186 struct drm_crtc *crtc = fence_to_crtc(fence); 187 188 return crtc->timeline_name; 189 } 190 191 static const struct dma_fence_ops drm_crtc_fence_ops = { 192 .get_driver_name = drm_crtc_fence_get_driver_name, 193 .get_timeline_name = drm_crtc_fence_get_timeline_name, 194 }; 195 196 struct dma_fence *drm_crtc_create_fence(struct drm_crtc *crtc) 197 { 198 struct dma_fence *fence; 199 200 fence = kzalloc(sizeof(*fence), GFP_KERNEL); 201 if (!fence) 202 return NULL; 203 204 dma_fence_init(fence, &drm_crtc_fence_ops, &crtc->fence_lock, 205 crtc->fence_context, ++crtc->fence_seqno); 206 207 return fence; 208 } 209 210 /** 211 * DOC: standard CRTC properties 212 * 213 * DRM CRTCs have a few standardized properties: 214 * 215 * ACTIVE: 216 * Atomic property for setting the power state of the CRTC. When set to 1 217 * the CRTC will actively display content. When set to 0 the CRTC will be 218 * powered off. There is no expectation that user-space will reset CRTC 219 * resources like the mode and planes when setting ACTIVE to 0. 220 * 221 * User-space can rely on an ACTIVE change to 1 to never fail an atomic 222 * test as long as no other property has changed. If a change to ACTIVE 223 * fails an atomic test, this is a driver bug. For this reason setting 224 * ACTIVE to 0 must not release internal resources (like reserved memory 225 * bandwidth or clock generators). 226 * 227 * Note that the legacy DPMS property on connectors is internally routed 228 * to control this property for atomic drivers. 229 * MODE_ID: 230 * Atomic property for setting the CRTC display timings. The value is the 231 * ID of a blob containing the DRM mode info. To disable the CRTC, 232 * user-space must set this property to 0. 233 * 234 * Setting MODE_ID to 0 will release reserved resources for the CRTC. 235 * SCALING_FILTER: 236 * Atomic property for setting the scaling filter for CRTC scaler 237 * 238 * The value of this property can be one of the following: 239 * 240 * Default: 241 * Driver's default scaling filter 242 * Nearest Neighbor: 243 * Nearest Neighbor scaling filter 244 */ 245 246 __printf(6, 0) 247 static int __drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc, 248 struct drm_plane *primary, 249 struct drm_plane *cursor, 250 const struct drm_crtc_funcs *funcs, 251 const char *name, va_list ap) 252 { 253 struct drm_mode_config *config = &dev->mode_config; 254 int ret; 255 256 WARN_ON(primary && primary->type != DRM_PLANE_TYPE_PRIMARY); 257 WARN_ON(cursor && cursor->type != DRM_PLANE_TYPE_CURSOR); 258 259 /* crtc index is used with 32bit bitmasks */ 260 if (WARN_ON(config->num_crtc >= 32)) 261 return -EINVAL; 262 263 WARN_ON(drm_drv_uses_atomic_modeset(dev) && 264 (!funcs->atomic_destroy_state || 265 !funcs->atomic_duplicate_state)); 266 267 crtc->dev = dev; 268 crtc->funcs = funcs; 269 270 INIT_LIST_HEAD(&crtc->commit_list); 271 spin_lock_init(&crtc->commit_lock); 272 273 drm_modeset_lock_init(&crtc->mutex); 274 ret = drm_mode_object_add(dev, &crtc->base, DRM_MODE_OBJECT_CRTC); 275 if (ret) 276 return ret; 277 278 if (name) { 279 crtc->name = kvasprintf(GFP_KERNEL, name, ap); 280 } else { 281 crtc->name = kasprintf(GFP_KERNEL, "crtc-%d", 282 drm_num_crtcs(dev)); 283 } 284 if (!crtc->name) { 285 drm_mode_object_unregister(dev, &crtc->base); 286 return -ENOMEM; 287 } 288 289 crtc->fence_context = dma_fence_context_alloc(1); 290 spin_lock_init(&crtc->fence_lock); 291 snprintf(crtc->timeline_name, sizeof(crtc->timeline_name), 292 "CRTC:%d-%s", crtc->base.id, crtc->name); 293 294 crtc->base.properties = &crtc->properties; 295 296 list_add_tail(&crtc->head, &config->crtc_list); 297 crtc->index = config->num_crtc++; 298 299 crtc->primary = primary; 300 crtc->cursor = cursor; 301 if (primary && !primary->possible_crtcs) 302 primary->possible_crtcs = drm_crtc_mask(crtc); 303 if (cursor && !cursor->possible_crtcs) 304 cursor->possible_crtcs = drm_crtc_mask(crtc); 305 306 ret = drm_crtc_crc_init(crtc); 307 if (ret) { 308 drm_mode_object_unregister(dev, &crtc->base); 309 return ret; 310 } 311 312 if (drm_core_check_feature(dev, DRIVER_ATOMIC)) { 313 drm_object_attach_property(&crtc->base, config->prop_active, 0); 314 drm_object_attach_property(&crtc->base, config->prop_mode_id, 0); 315 drm_object_attach_property(&crtc->base, 316 config->prop_out_fence_ptr, 0); 317 drm_object_attach_property(&crtc->base, 318 config->prop_vrr_enabled, 0); 319 } 320 321 return 0; 322 } 323 324 /** 325 * drm_crtc_init_with_planes - Initialise a new CRTC object with 326 * specified primary and cursor planes. 327 * @dev: DRM device 328 * @crtc: CRTC object to init 329 * @primary: Primary plane for CRTC 330 * @cursor: Cursor plane for CRTC 331 * @funcs: callbacks for the new CRTC 332 * @name: printf style format string for the CRTC name, or NULL for default name 333 * 334 * Inits a new object created as base part of a driver crtc object. Drivers 335 * should use this function instead of drm_crtc_init(), which is only provided 336 * for backwards compatibility with drivers which do not yet support universal 337 * planes). For really simple hardware which has only 1 plane look at 338 * drm_simple_display_pipe_init() instead. 339 * The &drm_crtc_funcs.destroy hook should call drm_crtc_cleanup() and kfree() 340 * the crtc structure. The crtc structure should not be allocated with 341 * devm_kzalloc(). 342 * 343 * The @primary and @cursor planes are only relevant for legacy uAPI, see 344 * &drm_crtc.primary and &drm_crtc.cursor. 345 * 346 * Note: consider using drmm_crtc_alloc_with_planes() instead of 347 * drm_crtc_init_with_planes() to let the DRM managed resource infrastructure 348 * take care of cleanup and deallocation. 349 * 350 * Returns: 351 * Zero on success, error code on failure. 352 */ 353 int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc, 354 struct drm_plane *primary, 355 struct drm_plane *cursor, 356 const struct drm_crtc_funcs *funcs, 357 const char *name, ...) 358 { 359 va_list ap; 360 int ret; 361 362 WARN_ON(!funcs->destroy); 363 364 va_start(ap, name); 365 ret = __drm_crtc_init_with_planes(dev, crtc, primary, cursor, funcs, 366 name, ap); 367 va_end(ap); 368 369 return ret; 370 } 371 EXPORT_SYMBOL(drm_crtc_init_with_planes); 372 373 static void drmm_crtc_alloc_with_planes_cleanup(struct drm_device *dev, 374 void *ptr) 375 { 376 struct drm_crtc *crtc = ptr; 377 378 drm_crtc_cleanup(crtc); 379 } 380 381 void *__drmm_crtc_alloc_with_planes(struct drm_device *dev, 382 size_t size, size_t offset, 383 struct drm_plane *primary, 384 struct drm_plane *cursor, 385 const struct drm_crtc_funcs *funcs, 386 const char *name, ...) 387 { 388 void *container; 389 struct drm_crtc *crtc; 390 va_list ap; 391 int ret; 392 393 if (WARN_ON(!funcs || funcs->destroy)) 394 return ERR_PTR(-EINVAL); 395 396 container = drmm_kzalloc(dev, size, GFP_KERNEL); 397 if (!container) 398 return ERR_PTR(-ENOMEM); 399 400 crtc = container + offset; 401 402 va_start(ap, name); 403 ret = __drm_crtc_init_with_planes(dev, crtc, primary, cursor, funcs, 404 name, ap); 405 va_end(ap); 406 if (ret) 407 return ERR_PTR(ret); 408 409 ret = drmm_add_action_or_reset(dev, drmm_crtc_alloc_with_planes_cleanup, 410 crtc); 411 if (ret) 412 return ERR_PTR(ret); 413 414 return container; 415 } 416 EXPORT_SYMBOL(__drmm_crtc_alloc_with_planes); 417 418 /** 419 * drm_crtc_cleanup - Clean up the core crtc usage 420 * @crtc: CRTC to cleanup 421 * 422 * This function cleans up @crtc and removes it from the DRM mode setting 423 * core. Note that the function does *not* free the crtc structure itself, 424 * this is the responsibility of the caller. 425 */ 426 void drm_crtc_cleanup(struct drm_crtc *crtc) 427 { 428 struct drm_device *dev = crtc->dev; 429 430 /* Note that the crtc_list is considered to be static; should we 431 * remove the drm_crtc at runtime we would have to decrement all 432 * the indices on the drm_crtc after us in the crtc_list. 433 */ 434 435 drm_crtc_crc_fini(crtc); 436 437 kfree(crtc->gamma_store); 438 crtc->gamma_store = NULL; 439 440 drm_modeset_lock_fini(&crtc->mutex); 441 442 drm_mode_object_unregister(dev, &crtc->base); 443 list_del(&crtc->head); 444 dev->mode_config.num_crtc--; 445 446 WARN_ON(crtc->state && !crtc->funcs->atomic_destroy_state); 447 if (crtc->state && crtc->funcs->atomic_destroy_state) 448 crtc->funcs->atomic_destroy_state(crtc, crtc->state); 449 450 kfree(crtc->name); 451 452 memset(crtc, 0, sizeof(*crtc)); 453 } 454 EXPORT_SYMBOL(drm_crtc_cleanup); 455 456 /** 457 * drm_mode_getcrtc - get CRTC configuration 458 * @dev: drm device for the ioctl 459 * @data: data pointer for the ioctl 460 * @file_priv: drm file for the ioctl call 461 * 462 * Construct a CRTC configuration structure to return to the user. 463 * 464 * Called by the user via ioctl. 465 * 466 * Returns: 467 * Zero on success, negative errno on failure. 468 */ 469 int drm_mode_getcrtc(struct drm_device *dev, 470 void *data, struct drm_file *file_priv) 471 { 472 struct drm_mode_crtc *crtc_resp = data; 473 struct drm_crtc *crtc; 474 struct drm_plane *plane; 475 476 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 477 return -EOPNOTSUPP; 478 479 crtc = drm_crtc_find(dev, file_priv, crtc_resp->crtc_id); 480 if (!crtc) 481 return -ENOENT; 482 483 plane = crtc->primary; 484 485 crtc_resp->gamma_size = crtc->gamma_size; 486 487 drm_modeset_lock(&plane->mutex, NULL); 488 if (plane->state && plane->state->fb) 489 crtc_resp->fb_id = plane->state->fb->base.id; 490 else if (!plane->state && plane->fb) 491 crtc_resp->fb_id = plane->fb->base.id; 492 else 493 crtc_resp->fb_id = 0; 494 495 if (plane->state) { 496 crtc_resp->x = plane->state->src_x >> 16; 497 crtc_resp->y = plane->state->src_y >> 16; 498 } 499 drm_modeset_unlock(&plane->mutex); 500 501 drm_modeset_lock(&crtc->mutex, NULL); 502 if (crtc->state) { 503 if (crtc->state->enable) { 504 drm_mode_convert_to_umode(&crtc_resp->mode, &crtc->state->mode); 505 crtc_resp->mode_valid = 1; 506 } else { 507 crtc_resp->mode_valid = 0; 508 } 509 } else { 510 crtc_resp->x = crtc->x; 511 crtc_resp->y = crtc->y; 512 513 if (crtc->enabled) { 514 drm_mode_convert_to_umode(&crtc_resp->mode, &crtc->mode); 515 crtc_resp->mode_valid = 1; 516 517 } else { 518 crtc_resp->mode_valid = 0; 519 } 520 } 521 if (!file_priv->aspect_ratio_allowed) 522 crtc_resp->mode.flags &= ~DRM_MODE_FLAG_PIC_AR_MASK; 523 drm_modeset_unlock(&crtc->mutex); 524 525 return 0; 526 } 527 528 static int __drm_mode_set_config_internal(struct drm_mode_set *set, 529 struct drm_modeset_acquire_ctx *ctx) 530 { 531 struct drm_crtc *crtc = set->crtc; 532 struct drm_framebuffer *fb; 533 struct drm_crtc *tmp; 534 int ret; 535 536 WARN_ON(drm_drv_uses_atomic_modeset(crtc->dev)); 537 538 /* 539 * NOTE: ->set_config can also disable other crtcs (if we steal all 540 * connectors from it), hence we need to refcount the fbs across all 541 * crtcs. Atomic modeset will have saner semantics ... 542 */ 543 drm_for_each_crtc(tmp, crtc->dev) { 544 struct drm_plane *plane = tmp->primary; 545 546 plane->old_fb = plane->fb; 547 } 548 549 fb = set->fb; 550 551 ret = crtc->funcs->set_config(set, ctx); 552 if (ret == 0) { 553 struct drm_plane *plane = crtc->primary; 554 555 plane->crtc = fb ? crtc : NULL; 556 plane->fb = fb; 557 } 558 559 drm_for_each_crtc(tmp, crtc->dev) { 560 struct drm_plane *plane = tmp->primary; 561 562 if (plane->fb) 563 drm_framebuffer_get(plane->fb); 564 if (plane->old_fb) 565 drm_framebuffer_put(plane->old_fb); 566 plane->old_fb = NULL; 567 } 568 569 return ret; 570 } 571 572 /** 573 * drm_mode_set_config_internal - helper to call &drm_mode_config_funcs.set_config 574 * @set: modeset config to set 575 * 576 * This is a little helper to wrap internal calls to the 577 * &drm_mode_config_funcs.set_config driver interface. The only thing it adds is 578 * correct refcounting dance. 579 * 580 * This should only be used by non-atomic legacy drivers. 581 * 582 * Returns: 583 * Zero on success, negative errno on failure. 584 */ 585 int drm_mode_set_config_internal(struct drm_mode_set *set) 586 { 587 WARN_ON(drm_drv_uses_atomic_modeset(set->crtc->dev)); 588 589 return __drm_mode_set_config_internal(set, NULL); 590 } 591 EXPORT_SYMBOL(drm_mode_set_config_internal); 592 593 /** 594 * drm_crtc_check_viewport - Checks that a framebuffer is big enough for the 595 * CRTC viewport 596 * @crtc: CRTC that framebuffer will be displayed on 597 * @x: x panning 598 * @y: y panning 599 * @mode: mode that framebuffer will be displayed under 600 * @fb: framebuffer to check size of 601 */ 602 int drm_crtc_check_viewport(const struct drm_crtc *crtc, 603 int x, int y, 604 const struct drm_display_mode *mode, 605 const struct drm_framebuffer *fb) 606 607 { 608 int hdisplay, vdisplay; 609 610 drm_mode_get_hv_timing(mode, &hdisplay, &vdisplay); 611 612 if (crtc->state && 613 drm_rotation_90_or_270(crtc->primary->state->rotation)) 614 swap(hdisplay, vdisplay); 615 616 return drm_framebuffer_check_src_coords(x << 16, y << 16, 617 hdisplay << 16, vdisplay << 16, 618 fb); 619 } 620 EXPORT_SYMBOL(drm_crtc_check_viewport); 621 622 /** 623 * drm_mode_setcrtc - set CRTC configuration 624 * @dev: drm device for the ioctl 625 * @data: data pointer for the ioctl 626 * @file_priv: drm file for the ioctl call 627 * 628 * Build a new CRTC configuration based on user request. 629 * 630 * Called by the user via ioctl. 631 * 632 * Returns: 633 * Zero on success, negative errno on failure. 634 */ 635 int drm_mode_setcrtc(struct drm_device *dev, void *data, 636 struct drm_file *file_priv) 637 { 638 struct drm_mode_config *config = &dev->mode_config; 639 struct drm_mode_crtc *crtc_req = data; 640 struct drm_crtc *crtc; 641 struct drm_plane *plane; 642 struct drm_connector **connector_set = NULL, *connector; 643 struct drm_framebuffer *fb = NULL; 644 struct drm_display_mode *mode = NULL; 645 struct drm_mode_set set; 646 uint32_t __user *set_connectors_ptr; 647 struct drm_modeset_acquire_ctx ctx; 648 int ret; 649 int i; 650 651 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 652 return -EOPNOTSUPP; 653 654 /* 655 * Universal plane src offsets are only 16.16, prevent havoc for 656 * drivers using universal plane code internally. 657 */ 658 if (crtc_req->x & 0xffff0000 || crtc_req->y & 0xffff0000) 659 return -ERANGE; 660 661 crtc = drm_crtc_find(dev, file_priv, crtc_req->crtc_id); 662 if (!crtc) { 663 DRM_DEBUG_KMS("Unknown CRTC ID %d\n", crtc_req->crtc_id); 664 return -ENOENT; 665 } 666 DRM_DEBUG_KMS("[CRTC:%d:%s]\n", crtc->base.id, crtc->name); 667 668 plane = crtc->primary; 669 670 /* allow disabling with the primary plane leased */ 671 if (crtc_req->mode_valid && !drm_lease_held(file_priv, plane->base.id)) 672 return -EACCES; 673 674 DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx, 675 DRM_MODESET_ACQUIRE_INTERRUPTIBLE, ret); 676 677 if (crtc_req->mode_valid) { 678 /* If we have a mode we need a framebuffer. */ 679 /* If we pass -1, set the mode with the currently bound fb */ 680 if (crtc_req->fb_id == -1) { 681 struct drm_framebuffer *old_fb; 682 683 if (plane->state) 684 old_fb = plane->state->fb; 685 else 686 old_fb = plane->fb; 687 688 if (!old_fb) { 689 DRM_DEBUG_KMS("CRTC doesn't have current FB\n"); 690 ret = -EINVAL; 691 goto out; 692 } 693 694 fb = old_fb; 695 /* Make refcounting symmetric with the lookup path. */ 696 drm_framebuffer_get(fb); 697 } else { 698 fb = drm_framebuffer_lookup(dev, file_priv, crtc_req->fb_id); 699 if (!fb) { 700 DRM_DEBUG_KMS("Unknown FB ID%d\n", 701 crtc_req->fb_id); 702 ret = -ENOENT; 703 goto out; 704 } 705 } 706 707 mode = drm_mode_create(dev); 708 if (!mode) { 709 ret = -ENOMEM; 710 goto out; 711 } 712 if (!file_priv->aspect_ratio_allowed && 713 (crtc_req->mode.flags & DRM_MODE_FLAG_PIC_AR_MASK) != DRM_MODE_FLAG_PIC_AR_NONE) { 714 DRM_DEBUG_KMS("Unexpected aspect-ratio flag bits\n"); 715 ret = -EINVAL; 716 goto out; 717 } 718 719 720 ret = drm_mode_convert_umode(dev, mode, &crtc_req->mode); 721 if (ret) { 722 DRM_DEBUG_KMS("Invalid mode (ret=%d, status=%s)\n", 723 ret, drm_get_mode_status_name(mode->status)); 724 drm_mode_debug_printmodeline(mode); 725 goto out; 726 } 727 728 /* 729 * Check whether the primary plane supports the fb pixel format. 730 * Drivers not implementing the universal planes API use a 731 * default formats list provided by the DRM core which doesn't 732 * match real hardware capabilities. Skip the check in that 733 * case. 734 */ 735 if (!plane->format_default) { 736 ret = drm_plane_check_pixel_format(plane, 737 fb->format->format, 738 fb->modifier); 739 if (ret) { 740 DRM_DEBUG_KMS("Invalid pixel format %p4cc, modifier 0x%llx\n", 741 &fb->format->format, 742 fb->modifier); 743 goto out; 744 } 745 } 746 747 ret = drm_crtc_check_viewport(crtc, crtc_req->x, crtc_req->y, 748 mode, fb); 749 if (ret) 750 goto out; 751 752 } 753 754 if (crtc_req->count_connectors == 0 && mode) { 755 DRM_DEBUG_KMS("Count connectors is 0 but mode set\n"); 756 ret = -EINVAL; 757 goto out; 758 } 759 760 if (crtc_req->count_connectors > 0 && (!mode || !fb)) { 761 DRM_DEBUG_KMS("Count connectors is %d but no mode or fb set\n", 762 crtc_req->count_connectors); 763 ret = -EINVAL; 764 goto out; 765 } 766 767 if (crtc_req->count_connectors > 0) { 768 u32 out_id; 769 770 /* Avoid unbounded kernel memory allocation */ 771 if (crtc_req->count_connectors > config->num_connector) { 772 ret = -EINVAL; 773 goto out; 774 } 775 776 connector_set = kmalloc_array(crtc_req->count_connectors, 777 sizeof(struct drm_connector *), 778 GFP_KERNEL); 779 if (!connector_set) { 780 ret = -ENOMEM; 781 goto out; 782 } 783 784 for (i = 0; i < crtc_req->count_connectors; i++) { 785 connector_set[i] = NULL; 786 set_connectors_ptr = (uint32_t __user *)(unsigned long)crtc_req->set_connectors_ptr; 787 if (get_user(out_id, &set_connectors_ptr[i])) { 788 ret = -EFAULT; 789 goto out; 790 } 791 792 connector = drm_connector_lookup(dev, file_priv, out_id); 793 if (!connector) { 794 DRM_DEBUG_KMS("Connector id %d unknown\n", 795 out_id); 796 ret = -ENOENT; 797 goto out; 798 } 799 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", 800 connector->base.id, 801 connector->name); 802 803 connector_set[i] = connector; 804 } 805 } 806 807 set.crtc = crtc; 808 set.x = crtc_req->x; 809 set.y = crtc_req->y; 810 set.mode = mode; 811 set.connectors = connector_set; 812 set.num_connectors = crtc_req->count_connectors; 813 set.fb = fb; 814 815 if (drm_drv_uses_atomic_modeset(dev)) 816 ret = crtc->funcs->set_config(&set, &ctx); 817 else 818 ret = __drm_mode_set_config_internal(&set, &ctx); 819 820 out: 821 if (fb) 822 drm_framebuffer_put(fb); 823 824 if (connector_set) { 825 for (i = 0; i < crtc_req->count_connectors; i++) { 826 if (connector_set[i]) 827 drm_connector_put(connector_set[i]); 828 } 829 } 830 kfree(connector_set); 831 drm_mode_destroy(dev, mode); 832 833 /* In case we need to retry... */ 834 connector_set = NULL; 835 fb = NULL; 836 mode = NULL; 837 838 DRM_MODESET_LOCK_ALL_END(dev, ctx, ret); 839 840 return ret; 841 } 842 843 int drm_mode_crtc_set_obj_prop(struct drm_mode_object *obj, 844 struct drm_property *property, 845 uint64_t value) 846 { 847 int ret = -EINVAL; 848 struct drm_crtc *crtc = obj_to_crtc(obj); 849 850 if (crtc->funcs->set_property) 851 ret = crtc->funcs->set_property(crtc, property, value); 852 if (!ret) 853 drm_object_property_set_value(obj, property, value); 854 855 return ret; 856 } 857 858 /** 859 * drm_crtc_create_scaling_filter_property - create a new scaling filter 860 * property 861 * 862 * @crtc: drm CRTC 863 * @supported_filters: bitmask of supported scaling filters, must include 864 * BIT(DRM_SCALING_FILTER_DEFAULT). 865 * 866 * This function lets driver to enable the scaling filter property on a given 867 * CRTC. 868 * 869 * RETURNS: 870 * Zero for success or -errno 871 */ 872 int drm_crtc_create_scaling_filter_property(struct drm_crtc *crtc, 873 unsigned int supported_filters) 874 { 875 struct drm_property *prop = 876 drm_create_scaling_filter_prop(crtc->dev, supported_filters); 877 878 if (IS_ERR(prop)) 879 return PTR_ERR(prop); 880 881 drm_object_attach_property(&crtc->base, prop, 882 DRM_SCALING_FILTER_DEFAULT); 883 crtc->scaling_filter_property = prop; 884 885 return 0; 886 } 887 EXPORT_SYMBOL(drm_crtc_create_scaling_filter_property); 888