linux/drivers/gpu/drm/drm_crtc.c
<<
>>
Prefs
   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_crtc.h>
  39#include <drm/drm_edid.h>
  40#include <drm/drm_fourcc.h>
  41#include <drm/drm_modeset_lock.h>
  42#include <drm/drm_atomic.h>
  43#include <drm/drm_auth.h>
  44#include <drm/drm_debugfs_crc.h>
  45#include <drm/drm_drv.h>
  46#include <drm/drm_print.h>
  47#include <drm/drm_file.h>
  48
  49#include "drm_crtc_internal.h"
  50#include "drm_internal.h"
  51
  52/**
  53 * DOC: overview
  54 *
  55 * A CRTC represents the overall display pipeline. It receives pixel data from
  56 * &drm_plane and blends them together. The &drm_display_mode is also attached
  57 * to the CRTC, specifying display timings. On the output side the data is fed
  58 * to one or more &drm_encoder, which are then each connected to one
  59 * &drm_connector.
  60 *
  61 * To create a CRTC, a KMS drivers allocates and zeroes an instances of
  62 * &struct drm_crtc (possibly as part of a larger structure) and registers it
  63 * with a call to drm_crtc_init_with_planes().
  64 *
  65 * The CRTC is also the entry point for legacy modeset operations, see
  66 * &drm_crtc_funcs.set_config, legacy plane operations, see
  67 * &drm_crtc_funcs.page_flip and &drm_crtc_funcs.cursor_set2, and other legacy
  68 * operations like &drm_crtc_funcs.gamma_set. For atomic drivers all these
  69 * features are controlled through &drm_property and
  70 * &drm_mode_config_funcs.atomic_check and &drm_mode_config_funcs.atomic_check.
  71 */
  72
  73/**
  74 * drm_crtc_from_index - find the registered CRTC at an index
  75 * @dev: DRM device
  76 * @idx: index of registered CRTC to find for
  77 *
  78 * Given a CRTC index, return the registered CRTC from DRM device's
  79 * list of CRTCs with matching index. This is the inverse of drm_crtc_index().
  80 * It's useful in the vblank callbacks (like &drm_driver.enable_vblank or
  81 * &drm_driver.disable_vblank), since that still deals with indices instead
  82 * of pointers to &struct drm_crtc."
  83 */
  84struct drm_crtc *drm_crtc_from_index(struct drm_device *dev, int idx)
  85{
  86        struct drm_crtc *crtc;
  87
  88        drm_for_each_crtc(crtc, dev)
  89                if (idx == crtc->index)
  90                        return crtc;
  91
  92        return NULL;
  93}
  94EXPORT_SYMBOL(drm_crtc_from_index);
  95
  96/**
  97 * drm_crtc_force_disable - Forcibly turn off a CRTC
  98 * @crtc: CRTC to turn off
  99 *
 100 * Note: This should only be used by non-atomic legacy drivers.
 101 *
 102 * Returns:
 103 * Zero on success, error code on failure.
 104 */
 105int drm_crtc_force_disable(struct drm_crtc *crtc)
 106{
 107        struct drm_mode_set set = {
 108                .crtc = crtc,
 109        };
 110
 111        WARN_ON(drm_drv_uses_atomic_modeset(crtc->dev));
 112
 113        return drm_mode_set_config_internal(&set);
 114}
 115EXPORT_SYMBOL(drm_crtc_force_disable);
 116
 117/**
 118 * drm_crtc_force_disable_all - Forcibly turn off all enabled CRTCs
 119 * @dev: DRM device whose CRTCs to turn off
 120 *
 121 * Drivers may want to call this on unload to ensure that all displays are
 122 * unlit and the GPU is in a consistent, low power state. Takes modeset locks.
 123 *
 124 * Note: This should only be used by non-atomic legacy drivers. For an atomic
 125 * version look at drm_atomic_helper_shutdown().
 126 *
 127 * Returns:
 128 * Zero on success, error code on failure.
 129 */
 130int drm_crtc_force_disable_all(struct drm_device *dev)
 131{
 132        struct drm_crtc *crtc;
 133        int ret = 0;
 134
 135        drm_modeset_lock_all(dev);
 136        drm_for_each_crtc(crtc, dev)
 137                if (crtc->enabled) {
 138                        ret = drm_crtc_force_disable(crtc);
 139                        if (ret)
 140                                goto out;
 141                }
 142out:
 143        drm_modeset_unlock_all(dev);
 144        return ret;
 145}
 146EXPORT_SYMBOL(drm_crtc_force_disable_all);
 147
 148static unsigned int drm_num_crtcs(struct drm_device *dev)
 149{
 150        unsigned int num = 0;
 151        struct drm_crtc *tmp;
 152
 153        drm_for_each_crtc(tmp, dev) {
 154                num++;
 155        }
 156
 157        return num;
 158}
 159
 160int drm_crtc_register_all(struct drm_device *dev)
 161{
 162        struct drm_crtc *crtc;
 163        int ret = 0;
 164
 165        drm_for_each_crtc(crtc, dev) {
 166                if (drm_debugfs_crtc_add(crtc))
 167                        DRM_ERROR("Failed to initialize debugfs entry for CRTC '%s'.\n",
 168                                  crtc->name);
 169
 170                if (crtc->funcs->late_register)
 171                        ret = crtc->funcs->late_register(crtc);
 172                if (ret)
 173                        return ret;
 174        }
 175
 176        return 0;
 177}
 178
 179void drm_crtc_unregister_all(struct drm_device *dev)
 180{
 181        struct drm_crtc *crtc;
 182
 183        drm_for_each_crtc(crtc, dev) {
 184                if (crtc->funcs->early_unregister)
 185                        crtc->funcs->early_unregister(crtc);
 186                drm_debugfs_crtc_remove(crtc);
 187        }
 188}
 189
 190static int drm_crtc_crc_init(struct drm_crtc *crtc)
 191{
 192#ifdef CONFIG_DEBUG_FS
 193        spin_lock_init(&crtc->crc.lock);
 194        init_waitqueue_head(&crtc->crc.wq);
 195        crtc->crc.source = kstrdup("auto", GFP_KERNEL);
 196        if (!crtc->crc.source)
 197                return -ENOMEM;
 198#endif
 199        return 0;
 200}
 201
 202static void drm_crtc_crc_fini(struct drm_crtc *crtc)
 203{
 204#ifdef CONFIG_DEBUG_FS
 205        kfree(crtc->crc.source);
 206#endif
 207}
 208
 209static const struct dma_fence_ops drm_crtc_fence_ops;
 210
 211static struct drm_crtc *fence_to_crtc(struct dma_fence *fence)
 212{
 213        BUG_ON(fence->ops != &drm_crtc_fence_ops);
 214        return container_of(fence->lock, struct drm_crtc, fence_lock);
 215}
 216
 217static const char *drm_crtc_fence_get_driver_name(struct dma_fence *fence)
 218{
 219        struct drm_crtc *crtc = fence_to_crtc(fence);
 220
 221        return crtc->dev->driver->name;
 222}
 223
 224static const char *drm_crtc_fence_get_timeline_name(struct dma_fence *fence)
 225{
 226        struct drm_crtc *crtc = fence_to_crtc(fence);
 227
 228        return crtc->timeline_name;
 229}
 230
 231static const struct dma_fence_ops drm_crtc_fence_ops = {
 232        .get_driver_name = drm_crtc_fence_get_driver_name,
 233        .get_timeline_name = drm_crtc_fence_get_timeline_name,
 234};
 235
 236struct dma_fence *drm_crtc_create_fence(struct drm_crtc *crtc)
 237{
 238        struct dma_fence *fence;
 239
 240        fence = kzalloc(sizeof(*fence), GFP_KERNEL);
 241        if (!fence)
 242                return NULL;
 243
 244        dma_fence_init(fence, &drm_crtc_fence_ops, &crtc->fence_lock,
 245                       crtc->fence_context, ++crtc->fence_seqno);
 246
 247        return fence;
 248}
 249
 250/**
 251 * drm_crtc_init_with_planes - Initialise a new CRTC object with
 252 *    specified primary and cursor planes.
 253 * @dev: DRM device
 254 * @crtc: CRTC object to init
 255 * @primary: Primary plane for CRTC
 256 * @cursor: Cursor plane for CRTC
 257 * @funcs: callbacks for the new CRTC
 258 * @name: printf style format string for the CRTC name, or NULL for default name
 259 *
 260 * Inits a new object created as base part of a driver crtc object. Drivers
 261 * should use this function instead of drm_crtc_init(), which is only provided
 262 * for backwards compatibility with drivers which do not yet support universal
 263 * planes). For really simple hardware which has only 1 plane look at
 264 * drm_simple_display_pipe_init() instead.
 265 *
 266 * Returns:
 267 * Zero on success, error code on failure.
 268 */
 269int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc,
 270                              struct drm_plane *primary,
 271                              struct drm_plane *cursor,
 272                              const struct drm_crtc_funcs *funcs,
 273                              const char *name, ...)
 274{
 275        struct drm_mode_config *config = &dev->mode_config;
 276        int ret;
 277
 278        WARN_ON(primary && primary->type != DRM_PLANE_TYPE_PRIMARY);
 279        WARN_ON(cursor && cursor->type != DRM_PLANE_TYPE_CURSOR);
 280
 281        /* crtc index is used with 32bit bitmasks */
 282        if (WARN_ON(config->num_crtc >= 32))
 283                return -EINVAL;
 284
 285        WARN_ON(drm_drv_uses_atomic_modeset(dev) &&
 286                (!funcs->atomic_destroy_state ||
 287                 !funcs->atomic_duplicate_state));
 288
 289        crtc->dev = dev;
 290        crtc->funcs = funcs;
 291
 292        INIT_LIST_HEAD(&crtc->commit_list);
 293        spin_lock_init(&crtc->commit_lock);
 294
 295        drm_modeset_lock_init(&crtc->mutex);
 296        ret = drm_mode_object_add(dev, &crtc->base, DRM_MODE_OBJECT_CRTC);
 297        if (ret)
 298                return ret;
 299
 300        if (name) {
 301                va_list ap;
 302
 303                va_start(ap, name);
 304                crtc->name = kvasprintf(GFP_KERNEL, name, ap);
 305                va_end(ap);
 306        } else {
 307                crtc->name = kasprintf(GFP_KERNEL, "crtc-%d",
 308                                       drm_num_crtcs(dev));
 309        }
 310        if (!crtc->name) {
 311                drm_mode_object_unregister(dev, &crtc->base);
 312                return -ENOMEM;
 313        }
 314
 315        crtc->fence_context = dma_fence_context_alloc(1);
 316        spin_lock_init(&crtc->fence_lock);
 317        snprintf(crtc->timeline_name, sizeof(crtc->timeline_name),
 318                 "CRTC:%d-%s", crtc->base.id, crtc->name);
 319
 320        crtc->base.properties = &crtc->properties;
 321
 322        list_add_tail(&crtc->head, &config->crtc_list);
 323        crtc->index = config->num_crtc++;
 324
 325        crtc->primary = primary;
 326        crtc->cursor = cursor;
 327        if (primary && !primary->possible_crtcs)
 328                primary->possible_crtcs = drm_crtc_mask(crtc);
 329        if (cursor && !cursor->possible_crtcs)
 330                cursor->possible_crtcs = drm_crtc_mask(crtc);
 331
 332        ret = drm_crtc_crc_init(crtc);
 333        if (ret) {
 334                drm_mode_object_unregister(dev, &crtc->base);
 335                return ret;
 336        }
 337
 338        if (drm_core_check_feature(dev, DRIVER_ATOMIC)) {
 339                drm_object_attach_property(&crtc->base, config->prop_active, 0);
 340                drm_object_attach_property(&crtc->base, config->prop_mode_id, 0);
 341                drm_object_attach_property(&crtc->base,
 342                                           config->prop_out_fence_ptr, 0);
 343                drm_object_attach_property(&crtc->base,
 344                                           config->prop_vrr_enabled, 0);
 345        }
 346
 347        return 0;
 348}
 349EXPORT_SYMBOL(drm_crtc_init_with_planes);
 350
 351/**
 352 * drm_crtc_cleanup - Clean up the core crtc usage
 353 * @crtc: CRTC to cleanup
 354 *
 355 * This function cleans up @crtc and removes it from the DRM mode setting
 356 * core. Note that the function does *not* free the crtc structure itself,
 357 * this is the responsibility of the caller.
 358 */
 359void drm_crtc_cleanup(struct drm_crtc *crtc)
 360{
 361        struct drm_device *dev = crtc->dev;
 362
 363        /* Note that the crtc_list is considered to be static; should we
 364         * remove the drm_crtc at runtime we would have to decrement all
 365         * the indices on the drm_crtc after us in the crtc_list.
 366         */
 367
 368        drm_crtc_crc_fini(crtc);
 369
 370        kfree(crtc->gamma_store);
 371        crtc->gamma_store = NULL;
 372
 373        drm_modeset_lock_fini(&crtc->mutex);
 374
 375        drm_mode_object_unregister(dev, &crtc->base);
 376        list_del(&crtc->head);
 377        dev->mode_config.num_crtc--;
 378
 379        WARN_ON(crtc->state && !crtc->funcs->atomic_destroy_state);
 380        if (crtc->state && crtc->funcs->atomic_destroy_state)
 381                crtc->funcs->atomic_destroy_state(crtc, crtc->state);
 382
 383        kfree(crtc->name);
 384
 385        memset(crtc, 0, sizeof(*crtc));
 386}
 387EXPORT_SYMBOL(drm_crtc_cleanup);
 388
 389/**
 390 * drm_mode_getcrtc - get CRTC configuration
 391 * @dev: drm device for the ioctl
 392 * @data: data pointer for the ioctl
 393 * @file_priv: drm file for the ioctl call
 394 *
 395 * Construct a CRTC configuration structure to return to the user.
 396 *
 397 * Called by the user via ioctl.
 398 *
 399 * Returns:
 400 * Zero on success, negative errno on failure.
 401 */
 402int drm_mode_getcrtc(struct drm_device *dev,
 403                     void *data, struct drm_file *file_priv)
 404{
 405        struct drm_mode_crtc *crtc_resp = data;
 406        struct drm_crtc *crtc;
 407        struct drm_plane *plane;
 408
 409        if (!drm_core_check_feature(dev, DRIVER_MODESET))
 410                return -EOPNOTSUPP;
 411
 412        crtc = drm_crtc_find(dev, file_priv, crtc_resp->crtc_id);
 413        if (!crtc)
 414                return -ENOENT;
 415
 416        plane = crtc->primary;
 417
 418        crtc_resp->gamma_size = crtc->gamma_size;
 419
 420        drm_modeset_lock(&plane->mutex, NULL);
 421        if (plane->state && plane->state->fb)
 422                crtc_resp->fb_id = plane->state->fb->base.id;
 423        else if (!plane->state && plane->fb)
 424                crtc_resp->fb_id = plane->fb->base.id;
 425        else
 426                crtc_resp->fb_id = 0;
 427
 428        if (plane->state) {
 429                crtc_resp->x = plane->state->src_x >> 16;
 430                crtc_resp->y = plane->state->src_y >> 16;
 431        }
 432        drm_modeset_unlock(&plane->mutex);
 433
 434        drm_modeset_lock(&crtc->mutex, NULL);
 435        if (crtc->state) {
 436                if (crtc->state->enable) {
 437                        drm_mode_convert_to_umode(&crtc_resp->mode, &crtc->state->mode);
 438                        crtc_resp->mode_valid = 1;
 439                } else {
 440                        crtc_resp->mode_valid = 0;
 441                }
 442        } else {
 443                crtc_resp->x = crtc->x;
 444                crtc_resp->y = crtc->y;
 445
 446                if (crtc->enabled) {
 447                        drm_mode_convert_to_umode(&crtc_resp->mode, &crtc->mode);
 448                        crtc_resp->mode_valid = 1;
 449
 450                } else {
 451                        crtc_resp->mode_valid = 0;
 452                }
 453        }
 454        if (!file_priv->aspect_ratio_allowed)
 455                crtc_resp->mode.flags &= ~DRM_MODE_FLAG_PIC_AR_MASK;
 456        drm_modeset_unlock(&crtc->mutex);
 457
 458        return 0;
 459}
 460
 461static int __drm_mode_set_config_internal(struct drm_mode_set *set,
 462                                          struct drm_modeset_acquire_ctx *ctx)
 463{
 464        struct drm_crtc *crtc = set->crtc;
 465        struct drm_framebuffer *fb;
 466        struct drm_crtc *tmp;
 467        int ret;
 468
 469        WARN_ON(drm_drv_uses_atomic_modeset(crtc->dev));
 470
 471        /*
 472         * NOTE: ->set_config can also disable other crtcs (if we steal all
 473         * connectors from it), hence we need to refcount the fbs across all
 474         * crtcs. Atomic modeset will have saner semantics ...
 475         */
 476        drm_for_each_crtc(tmp, crtc->dev) {
 477                struct drm_plane *plane = tmp->primary;
 478
 479                plane->old_fb = plane->fb;
 480        }
 481
 482        fb = set->fb;
 483
 484        ret = crtc->funcs->set_config(set, ctx);
 485        if (ret == 0) {
 486                struct drm_plane *plane = crtc->primary;
 487
 488                plane->crtc = fb ? crtc : NULL;
 489                plane->fb = fb;
 490        }
 491
 492        drm_for_each_crtc(tmp, crtc->dev) {
 493                struct drm_plane *plane = tmp->primary;
 494
 495                if (plane->fb)
 496                        drm_framebuffer_get(plane->fb);
 497                if (plane->old_fb)
 498                        drm_framebuffer_put(plane->old_fb);
 499                plane->old_fb = NULL;
 500        }
 501
 502        return ret;
 503}
 504
 505/**
 506 * drm_mode_set_config_internal - helper to call &drm_mode_config_funcs.set_config
 507 * @set: modeset config to set
 508 *
 509 * This is a little helper to wrap internal calls to the
 510 * &drm_mode_config_funcs.set_config driver interface. The only thing it adds is
 511 * correct refcounting dance.
 512 *
 513 * This should only be used by non-atomic legacy drivers.
 514 *
 515 * Returns:
 516 * Zero on success, negative errno on failure.
 517 */
 518int drm_mode_set_config_internal(struct drm_mode_set *set)
 519{
 520        WARN_ON(drm_drv_uses_atomic_modeset(set->crtc->dev));
 521
 522        return __drm_mode_set_config_internal(set, NULL);
 523}
 524EXPORT_SYMBOL(drm_mode_set_config_internal);
 525
 526/**
 527 * drm_crtc_check_viewport - Checks that a framebuffer is big enough for the
 528 *     CRTC viewport
 529 * @crtc: CRTC that framebuffer will be displayed on
 530 * @x: x panning
 531 * @y: y panning
 532 * @mode: mode that framebuffer will be displayed under
 533 * @fb: framebuffer to check size of
 534 */
 535int drm_crtc_check_viewport(const struct drm_crtc *crtc,
 536                            int x, int y,
 537                            const struct drm_display_mode *mode,
 538                            const struct drm_framebuffer *fb)
 539
 540{
 541        int hdisplay, vdisplay;
 542
 543        drm_mode_get_hv_timing(mode, &hdisplay, &vdisplay);
 544
 545        if (crtc->state &&
 546            drm_rotation_90_or_270(crtc->primary->state->rotation))
 547                swap(hdisplay, vdisplay);
 548
 549        return drm_framebuffer_check_src_coords(x << 16, y << 16,
 550                                                hdisplay << 16, vdisplay << 16,
 551                                                fb);
 552}
 553EXPORT_SYMBOL(drm_crtc_check_viewport);
 554
 555/**
 556 * drm_mode_setcrtc - set CRTC configuration
 557 * @dev: drm device for the ioctl
 558 * @data: data pointer for the ioctl
 559 * @file_priv: drm file for the ioctl call
 560 *
 561 * Build a new CRTC configuration based on user request.
 562 *
 563 * Called by the user via ioctl.
 564 *
 565 * Returns:
 566 * Zero on success, negative errno on failure.
 567 */
 568int drm_mode_setcrtc(struct drm_device *dev, void *data,
 569                     struct drm_file *file_priv)
 570{
 571        struct drm_mode_config *config = &dev->mode_config;
 572        struct drm_mode_crtc *crtc_req = data;
 573        struct drm_crtc *crtc;
 574        struct drm_plane *plane;
 575        struct drm_connector **connector_set = NULL, *connector;
 576        struct drm_framebuffer *fb = NULL;
 577        struct drm_display_mode *mode = NULL;
 578        struct drm_mode_set set;
 579        uint32_t __user *set_connectors_ptr;
 580        struct drm_modeset_acquire_ctx ctx;
 581        int ret;
 582        int i;
 583
 584        if (!drm_core_check_feature(dev, DRIVER_MODESET))
 585                return -EOPNOTSUPP;
 586
 587        /*
 588         * Universal plane src offsets are only 16.16, prevent havoc for
 589         * drivers using universal plane code internally.
 590         */
 591        if (crtc_req->x & 0xffff0000 || crtc_req->y & 0xffff0000)
 592                return -ERANGE;
 593
 594        crtc = drm_crtc_find(dev, file_priv, crtc_req->crtc_id);
 595        if (!crtc) {
 596                DRM_DEBUG_KMS("Unknown CRTC ID %d\n", crtc_req->crtc_id);
 597                return -ENOENT;
 598        }
 599        DRM_DEBUG_KMS("[CRTC:%d:%s]\n", crtc->base.id, crtc->name);
 600
 601        plane = crtc->primary;
 602
 603        mutex_lock(&crtc->dev->mode_config.mutex);
 604        DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx,
 605                                   DRM_MODESET_ACQUIRE_INTERRUPTIBLE, ret);
 606
 607        if (crtc_req->mode_valid) {
 608                /* If we have a mode we need a framebuffer. */
 609                /* If we pass -1, set the mode with the currently bound fb */
 610                if (crtc_req->fb_id == -1) {
 611                        struct drm_framebuffer *old_fb;
 612
 613                        if (plane->state)
 614                                old_fb = plane->state->fb;
 615                        else
 616                                old_fb = plane->fb;
 617
 618                        if (!old_fb) {
 619                                DRM_DEBUG_KMS("CRTC doesn't have current FB\n");
 620                                ret = -EINVAL;
 621                                goto out;
 622                        }
 623
 624                        fb = old_fb;
 625                        /* Make refcounting symmetric with the lookup path. */
 626                        drm_framebuffer_get(fb);
 627                } else {
 628                        fb = drm_framebuffer_lookup(dev, file_priv, crtc_req->fb_id);
 629                        if (!fb) {
 630                                DRM_DEBUG_KMS("Unknown FB ID%d\n",
 631                                                crtc_req->fb_id);
 632                                ret = -ENOENT;
 633                                goto out;
 634                        }
 635                }
 636
 637                mode = drm_mode_create(dev);
 638                if (!mode) {
 639                        ret = -ENOMEM;
 640                        goto out;
 641                }
 642                if (!file_priv->aspect_ratio_allowed &&
 643                    (crtc_req->mode.flags & DRM_MODE_FLAG_PIC_AR_MASK) != DRM_MODE_FLAG_PIC_AR_NONE) {
 644                        DRM_DEBUG_KMS("Unexpected aspect-ratio flag bits\n");
 645                        ret = -EINVAL;
 646                        goto out;
 647                }
 648
 649
 650                ret = drm_mode_convert_umode(dev, mode, &crtc_req->mode);
 651                if (ret) {
 652                        DRM_DEBUG_KMS("Invalid mode (ret=%d, status=%s)\n",
 653                                      ret, drm_get_mode_status_name(mode->status));
 654                        drm_mode_debug_printmodeline(mode);
 655                        goto out;
 656                }
 657
 658                /*
 659                 * Check whether the primary plane supports the fb pixel format.
 660                 * Drivers not implementing the universal planes API use a
 661                 * default formats list provided by the DRM core which doesn't
 662                 * match real hardware capabilities. Skip the check in that
 663                 * case.
 664                 */
 665                if (!plane->format_default) {
 666                        ret = drm_plane_check_pixel_format(plane,
 667                                                           fb->format->format,
 668                                                           fb->modifier);
 669                        if (ret) {
 670                                struct drm_format_name_buf format_name;
 671                                DRM_DEBUG_KMS("Invalid pixel format %s, modifier 0x%llx\n",
 672                                              drm_get_format_name(fb->format->format,
 673                                                                  &format_name),
 674                                              fb->modifier);
 675                                goto out;
 676                        }
 677                }
 678
 679                ret = drm_crtc_check_viewport(crtc, crtc_req->x, crtc_req->y,
 680                                              mode, fb);
 681                if (ret)
 682                        goto out;
 683
 684        }
 685
 686        if (crtc_req->count_connectors == 0 && mode) {
 687                DRM_DEBUG_KMS("Count connectors is 0 but mode set\n");
 688                ret = -EINVAL;
 689                goto out;
 690        }
 691
 692        if (crtc_req->count_connectors > 0 && (!mode || !fb)) {
 693                DRM_DEBUG_KMS("Count connectors is %d but no mode or fb set\n",
 694                          crtc_req->count_connectors);
 695                ret = -EINVAL;
 696                goto out;
 697        }
 698
 699        if (crtc_req->count_connectors > 0) {
 700                u32 out_id;
 701
 702                /* Avoid unbounded kernel memory allocation */
 703                if (crtc_req->count_connectors > config->num_connector) {
 704                        ret = -EINVAL;
 705                        goto out;
 706                }
 707
 708                connector_set = kmalloc_array(crtc_req->count_connectors,
 709                                              sizeof(struct drm_connector *),
 710                                              GFP_KERNEL);
 711                if (!connector_set) {
 712                        ret = -ENOMEM;
 713                        goto out;
 714                }
 715
 716                for (i = 0; i < crtc_req->count_connectors; i++) {
 717                        connector_set[i] = NULL;
 718                        set_connectors_ptr = (uint32_t __user *)(unsigned long)crtc_req->set_connectors_ptr;
 719                        if (get_user(out_id, &set_connectors_ptr[i])) {
 720                                ret = -EFAULT;
 721                                goto out;
 722                        }
 723
 724                        connector = drm_connector_lookup(dev, file_priv, out_id);
 725                        if (!connector) {
 726                                DRM_DEBUG_KMS("Connector id %d unknown\n",
 727                                                out_id);
 728                                ret = -ENOENT;
 729                                goto out;
 730                        }
 731                        DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
 732                                        connector->base.id,
 733                                        connector->name);
 734
 735                        connector_set[i] = connector;
 736                }
 737        }
 738
 739        set.crtc = crtc;
 740        set.x = crtc_req->x;
 741        set.y = crtc_req->y;
 742        set.mode = mode;
 743        set.connectors = connector_set;
 744        set.num_connectors = crtc_req->count_connectors;
 745        set.fb = fb;
 746
 747        if (drm_drv_uses_atomic_modeset(dev))
 748                ret = crtc->funcs->set_config(&set, &ctx);
 749        else
 750                ret = __drm_mode_set_config_internal(&set, &ctx);
 751
 752out:
 753        if (fb)
 754                drm_framebuffer_put(fb);
 755
 756        if (connector_set) {
 757                for (i = 0; i < crtc_req->count_connectors; i++) {
 758                        if (connector_set[i])
 759                                drm_connector_put(connector_set[i]);
 760                }
 761        }
 762        kfree(connector_set);
 763        drm_mode_destroy(dev, mode);
 764
 765        /* In case we need to retry... */
 766        connector_set = NULL;
 767        fb = NULL;
 768        mode = NULL;
 769
 770        DRM_MODESET_LOCK_ALL_END(ctx, ret);
 771        mutex_unlock(&crtc->dev->mode_config.mutex);
 772
 773        return ret;
 774}
 775
 776int drm_mode_crtc_set_obj_prop(struct drm_mode_object *obj,
 777                               struct drm_property *property,
 778                               uint64_t value)
 779{
 780        int ret = -EINVAL;
 781        struct drm_crtc *crtc = obj_to_crtc(obj);
 782
 783        if (crtc->funcs->set_property)
 784                ret = crtc->funcs->set_property(crtc, property, value);
 785        if (!ret)
 786                drm_object_property_set_value(obj, property, value);
 787
 788        return ret;
 789}
 790