2 * Copyright (c) 2006-2008 Intel Corporation
3 * Copyright (c) 2007 Dave Airlie <airlied@linux.ie>
4 * Copyright (c) 2008 Red Hat Inc.
6 * DRM core CRTC related functions
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.
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
28 * Eric Anholt <eric@anholt.net>
29 * Dave Airlie <airlied@linux.ie>
30 * Jesse Barnes <jesse.barnes@intel.com>
32 #include <linux/ctype.h>
33 #include <linux/list.h>
34 #include <linux/slab.h>
35 #include <linux/export.h>
37 #include <drm/drm_crtc.h>
38 #include <drm/drm_edid.h>
39 #include <drm/drm_fourcc.h>
40 #include <drm/drm_modeset_lock.h>
41 #include <drm/drm_atomic.h>
42 #include <drm/drm_auth.h>
43 #include <drm/drm_framebuffer.h>
45 #include "drm_crtc_internal.h"
46 #include "drm_internal.h"
51 static const struct drm_prop_enum_list drm_plane_type_enum_list
[] = {
52 { DRM_PLANE_TYPE_OVERLAY
, "Overlay" },
53 { DRM_PLANE_TYPE_PRIMARY
, "Primary" },
54 { DRM_PLANE_TYPE_CURSOR
, "Cursor" },
61 * drm_crtc_force_disable - Forcibly turn off a CRTC
62 * @crtc: CRTC to turn off
65 * Zero on success, error code on failure.
67 int drm_crtc_force_disable(struct drm_crtc
*crtc
)
69 struct drm_mode_set set
= {
73 return drm_mode_set_config_internal(&set
);
75 EXPORT_SYMBOL(drm_crtc_force_disable
);
78 * drm_crtc_force_disable_all - Forcibly turn off all enabled CRTCs
79 * @dev: DRM device whose CRTCs to turn off
81 * Drivers may want to call this on unload to ensure that all displays are
82 * unlit and the GPU is in a consistent, low power state. Takes modeset locks.
85 * Zero on success, error code on failure.
87 int drm_crtc_force_disable_all(struct drm_device
*dev
)
89 struct drm_crtc
*crtc
;
92 drm_modeset_lock_all(dev
);
93 drm_for_each_crtc(crtc
, dev
)
95 ret
= drm_crtc_force_disable(crtc
);
100 drm_modeset_unlock_all(dev
);
103 EXPORT_SYMBOL(drm_crtc_force_disable_all
);
105 DEFINE_WW_CLASS(crtc_ww_class
);
107 static unsigned int drm_num_crtcs(struct drm_device
*dev
)
109 unsigned int num
= 0;
110 struct drm_crtc
*tmp
;
112 drm_for_each_crtc(tmp
, dev
) {
119 static int drm_crtc_register_all(struct drm_device
*dev
)
121 struct drm_crtc
*crtc
;
124 drm_for_each_crtc(crtc
, dev
) {
125 if (crtc
->funcs
->late_register
)
126 ret
= crtc
->funcs
->late_register(crtc
);
134 static void drm_crtc_unregister_all(struct drm_device
*dev
)
136 struct drm_crtc
*crtc
;
138 drm_for_each_crtc(crtc
, dev
) {
139 if (crtc
->funcs
->early_unregister
)
140 crtc
->funcs
->early_unregister(crtc
);
145 * drm_crtc_init_with_planes - Initialise a new CRTC object with
146 * specified primary and cursor planes.
148 * @crtc: CRTC object to init
149 * @primary: Primary plane for CRTC
150 * @cursor: Cursor plane for CRTC
151 * @funcs: callbacks for the new CRTC
152 * @name: printf style format string for the CRTC name, or NULL for default name
154 * Inits a new object created as base part of a driver crtc object. Drivers
155 * should use this function instead of drm_crtc_init(), which is only provided
156 * for backwards compatibility with drivers which do not yet support universal
157 * planes). For really simple hardware which has only 1 plane look at
158 * drm_simple_display_pipe_init() instead.
161 * Zero on success, error code on failure.
163 int drm_crtc_init_with_planes(struct drm_device
*dev
, struct drm_crtc
*crtc
,
164 struct drm_plane
*primary
,
165 struct drm_plane
*cursor
,
166 const struct drm_crtc_funcs
*funcs
,
167 const char *name
, ...)
169 struct drm_mode_config
*config
= &dev
->mode_config
;
172 WARN_ON(primary
&& primary
->type
!= DRM_PLANE_TYPE_PRIMARY
);
173 WARN_ON(cursor
&& cursor
->type
!= DRM_PLANE_TYPE_CURSOR
);
178 INIT_LIST_HEAD(&crtc
->commit_list
);
179 spin_lock_init(&crtc
->commit_lock
);
181 drm_modeset_lock_init(&crtc
->mutex
);
182 ret
= drm_mode_object_get(dev
, &crtc
->base
, DRM_MODE_OBJECT_CRTC
);
190 crtc
->name
= kvasprintf(GFP_KERNEL
, name
, ap
);
193 crtc
->name
= kasprintf(GFP_KERNEL
, "crtc-%d",
197 drm_mode_object_unregister(dev
, &crtc
->base
);
201 crtc
->base
.properties
= &crtc
->properties
;
203 list_add_tail(&crtc
->head
, &config
->crtc_list
);
204 crtc
->index
= config
->num_crtc
++;
206 crtc
->primary
= primary
;
207 crtc
->cursor
= cursor
;
209 primary
->possible_crtcs
= 1 << drm_crtc_index(crtc
);
211 cursor
->possible_crtcs
= 1 << drm_crtc_index(crtc
);
213 if (drm_core_check_feature(dev
, DRIVER_ATOMIC
)) {
214 drm_object_attach_property(&crtc
->base
, config
->prop_active
, 0);
215 drm_object_attach_property(&crtc
->base
, config
->prop_mode_id
, 0);
220 EXPORT_SYMBOL(drm_crtc_init_with_planes
);
223 * drm_crtc_cleanup - Clean up the core crtc usage
224 * @crtc: CRTC to cleanup
226 * This function cleans up @crtc and removes it from the DRM mode setting
227 * core. Note that the function does *not* free the crtc structure itself,
228 * this is the responsibility of the caller.
230 void drm_crtc_cleanup(struct drm_crtc
*crtc
)
232 struct drm_device
*dev
= crtc
->dev
;
234 /* Note that the crtc_list is considered to be static; should we
235 * remove the drm_crtc at runtime we would have to decrement all
236 * the indices on the drm_crtc after us in the crtc_list.
239 kfree(crtc
->gamma_store
);
240 crtc
->gamma_store
= NULL
;
242 drm_modeset_lock_fini(&crtc
->mutex
);
244 drm_mode_object_unregister(dev
, &crtc
->base
);
245 list_del(&crtc
->head
);
246 dev
->mode_config
.num_crtc
--;
248 WARN_ON(crtc
->state
&& !crtc
->funcs
->atomic_destroy_state
);
249 if (crtc
->state
&& crtc
->funcs
->atomic_destroy_state
)
250 crtc
->funcs
->atomic_destroy_state(crtc
, crtc
->state
);
254 memset(crtc
, 0, sizeof(*crtc
));
256 EXPORT_SYMBOL(drm_crtc_cleanup
);
258 int drm_modeset_register_all(struct drm_device
*dev
)
262 ret
= drm_plane_register_all(dev
);
266 ret
= drm_crtc_register_all(dev
);
270 ret
= drm_encoder_register_all(dev
);
274 ret
= drm_connector_register_all(dev
);
281 drm_encoder_unregister_all(dev
);
283 drm_crtc_unregister_all(dev
);
285 drm_plane_unregister_all(dev
);
290 void drm_modeset_unregister_all(struct drm_device
*dev
)
292 drm_connector_unregister_all(dev
);
293 drm_encoder_unregister_all(dev
);
294 drm_crtc_unregister_all(dev
);
295 drm_plane_unregister_all(dev
);
298 static int drm_mode_create_standard_properties(struct drm_device
*dev
)
300 struct drm_property
*prop
;
303 ret
= drm_connector_create_standard_properties(dev
);
307 prop
= drm_property_create_enum(dev
, DRM_MODE_PROP_IMMUTABLE
,
308 "type", drm_plane_type_enum_list
,
309 ARRAY_SIZE(drm_plane_type_enum_list
));
312 dev
->mode_config
.plane_type_property
= prop
;
314 prop
= drm_property_create_range(dev
, DRM_MODE_PROP_ATOMIC
,
315 "SRC_X", 0, UINT_MAX
);
318 dev
->mode_config
.prop_src_x
= prop
;
320 prop
= drm_property_create_range(dev
, DRM_MODE_PROP_ATOMIC
,
321 "SRC_Y", 0, UINT_MAX
);
324 dev
->mode_config
.prop_src_y
= prop
;
326 prop
= drm_property_create_range(dev
, DRM_MODE_PROP_ATOMIC
,
327 "SRC_W", 0, UINT_MAX
);
330 dev
->mode_config
.prop_src_w
= prop
;
332 prop
= drm_property_create_range(dev
, DRM_MODE_PROP_ATOMIC
,
333 "SRC_H", 0, UINT_MAX
);
336 dev
->mode_config
.prop_src_h
= prop
;
338 prop
= drm_property_create_signed_range(dev
, DRM_MODE_PROP_ATOMIC
,
339 "CRTC_X", INT_MIN
, INT_MAX
);
342 dev
->mode_config
.prop_crtc_x
= prop
;
344 prop
= drm_property_create_signed_range(dev
, DRM_MODE_PROP_ATOMIC
,
345 "CRTC_Y", INT_MIN
, INT_MAX
);
348 dev
->mode_config
.prop_crtc_y
= prop
;
350 prop
= drm_property_create_range(dev
, DRM_MODE_PROP_ATOMIC
,
351 "CRTC_W", 0, INT_MAX
);
354 dev
->mode_config
.prop_crtc_w
= prop
;
356 prop
= drm_property_create_range(dev
, DRM_MODE_PROP_ATOMIC
,
357 "CRTC_H", 0, INT_MAX
);
360 dev
->mode_config
.prop_crtc_h
= prop
;
362 prop
= drm_property_create_object(dev
, DRM_MODE_PROP_ATOMIC
,
363 "FB_ID", DRM_MODE_OBJECT_FB
);
366 dev
->mode_config
.prop_fb_id
= prop
;
368 prop
= drm_property_create_object(dev
, DRM_MODE_PROP_ATOMIC
,
369 "CRTC_ID", DRM_MODE_OBJECT_CRTC
);
372 dev
->mode_config
.prop_crtc_id
= prop
;
374 prop
= drm_property_create_bool(dev
, DRM_MODE_PROP_ATOMIC
,
378 dev
->mode_config
.prop_active
= prop
;
380 prop
= drm_property_create(dev
,
381 DRM_MODE_PROP_ATOMIC
| DRM_MODE_PROP_BLOB
,
385 dev
->mode_config
.prop_mode_id
= prop
;
387 prop
= drm_property_create(dev
,
392 dev
->mode_config
.degamma_lut_property
= prop
;
394 prop
= drm_property_create_range(dev
,
395 DRM_MODE_PROP_IMMUTABLE
,
396 "DEGAMMA_LUT_SIZE", 0, UINT_MAX
);
399 dev
->mode_config
.degamma_lut_size_property
= prop
;
401 prop
= drm_property_create(dev
,
406 dev
->mode_config
.ctm_property
= prop
;
408 prop
= drm_property_create(dev
,
413 dev
->mode_config
.gamma_lut_property
= prop
;
415 prop
= drm_property_create_range(dev
,
416 DRM_MODE_PROP_IMMUTABLE
,
417 "GAMMA_LUT_SIZE", 0, UINT_MAX
);
420 dev
->mode_config
.gamma_lut_size_property
= prop
;
426 * drm_mode_getresources - get graphics configuration
427 * @dev: drm device for the ioctl
428 * @data: data pointer for the ioctl
429 * @file_priv: drm file for the ioctl call
431 * Construct a set of configuration description structures and return
432 * them to the user, including CRTC, connector and framebuffer configuration.
434 * Called by the user via ioctl.
437 * Zero on success, negative errno on failure.
439 int drm_mode_getresources(struct drm_device
*dev
, void *data
,
440 struct drm_file
*file_priv
)
442 struct drm_mode_card_res
*card_res
= data
;
443 struct list_head
*lh
;
444 struct drm_framebuffer
*fb
;
445 struct drm_connector
*connector
;
446 struct drm_crtc
*crtc
;
447 struct drm_encoder
*encoder
;
449 int connector_count
= 0;
452 int encoder_count
= 0;
454 uint32_t __user
*fb_id
;
455 uint32_t __user
*crtc_id
;
456 uint32_t __user
*connector_id
;
457 uint32_t __user
*encoder_id
;
459 if (!drm_core_check_feature(dev
, DRIVER_MODESET
))
463 mutex_lock(&file_priv
->fbs_lock
);
465 * For the non-control nodes we need to limit the list of resources
466 * by IDs in the group list for this node
468 list_for_each(lh
, &file_priv
->fbs
)
471 /* handle this in 4 parts */
473 if (card_res
->count_fbs
>= fb_count
) {
475 fb_id
= (uint32_t __user
*)(unsigned long)card_res
->fb_id_ptr
;
476 list_for_each_entry(fb
, &file_priv
->fbs
, filp_head
) {
477 if (put_user(fb
->base
.id
, fb_id
+ copied
)) {
478 mutex_unlock(&file_priv
->fbs_lock
);
484 card_res
->count_fbs
= fb_count
;
485 mutex_unlock(&file_priv
->fbs_lock
);
487 /* mode_config.mutex protects the connector list against e.g. DP MST
488 * connector hot-adding. CRTC/Plane lists are invariant. */
489 mutex_lock(&dev
->mode_config
.mutex
);
490 drm_for_each_crtc(crtc
, dev
)
493 drm_for_each_connector(connector
, dev
)
496 drm_for_each_encoder(encoder
, dev
)
499 card_res
->max_height
= dev
->mode_config
.max_height
;
500 card_res
->min_height
= dev
->mode_config
.min_height
;
501 card_res
->max_width
= dev
->mode_config
.max_width
;
502 card_res
->min_width
= dev
->mode_config
.min_width
;
505 if (card_res
->count_crtcs
>= crtc_count
) {
507 crtc_id
= (uint32_t __user
*)(unsigned long)card_res
->crtc_id_ptr
;
508 drm_for_each_crtc(crtc
, dev
) {
509 if (put_user(crtc
->base
.id
, crtc_id
+ copied
)) {
516 card_res
->count_crtcs
= crtc_count
;
519 if (card_res
->count_encoders
>= encoder_count
) {
521 encoder_id
= (uint32_t __user
*)(unsigned long)card_res
->encoder_id_ptr
;
522 drm_for_each_encoder(encoder
, dev
) {
523 if (put_user(encoder
->base
.id
, encoder_id
+
531 card_res
->count_encoders
= encoder_count
;
534 if (card_res
->count_connectors
>= connector_count
) {
536 connector_id
= (uint32_t __user
*)(unsigned long)card_res
->connector_id_ptr
;
537 drm_for_each_connector(connector
, dev
) {
538 if (put_user(connector
->base
.id
,
539 connector_id
+ copied
)) {
546 card_res
->count_connectors
= connector_count
;
549 mutex_unlock(&dev
->mode_config
.mutex
);
554 * drm_mode_getcrtc - get CRTC configuration
555 * @dev: drm device for the ioctl
556 * @data: data pointer for the ioctl
557 * @file_priv: drm file for the ioctl call
559 * Construct a CRTC configuration structure to return to the user.
561 * Called by the user via ioctl.
564 * Zero on success, negative errno on failure.
566 int drm_mode_getcrtc(struct drm_device
*dev
,
567 void *data
, struct drm_file
*file_priv
)
569 struct drm_mode_crtc
*crtc_resp
= data
;
570 struct drm_crtc
*crtc
;
572 if (!drm_core_check_feature(dev
, DRIVER_MODESET
))
575 crtc
= drm_crtc_find(dev
, crtc_resp
->crtc_id
);
579 drm_modeset_lock_crtc(crtc
, crtc
->primary
);
580 crtc_resp
->gamma_size
= crtc
->gamma_size
;
581 if (crtc
->primary
->fb
)
582 crtc_resp
->fb_id
= crtc
->primary
->fb
->base
.id
;
584 crtc_resp
->fb_id
= 0;
587 crtc_resp
->x
= crtc
->primary
->state
->src_x
>> 16;
588 crtc_resp
->y
= crtc
->primary
->state
->src_y
>> 16;
589 if (crtc
->state
->enable
) {
590 drm_mode_convert_to_umode(&crtc_resp
->mode
, &crtc
->state
->mode
);
591 crtc_resp
->mode_valid
= 1;
594 crtc_resp
->mode_valid
= 0;
597 crtc_resp
->x
= crtc
->x
;
598 crtc_resp
->y
= crtc
->y
;
600 drm_mode_convert_to_umode(&crtc_resp
->mode
, &crtc
->mode
);
601 crtc_resp
->mode_valid
= 1;
604 crtc_resp
->mode_valid
= 0;
607 drm_modeset_unlock_crtc(crtc
);
613 * drm_mode_set_config_internal - helper to call ->set_config
614 * @set: modeset config to set
616 * This is a little helper to wrap internal calls to the ->set_config driver
617 * interface. The only thing it adds is correct refcounting dance.
620 * Zero on success, negative errno on failure.
622 int drm_mode_set_config_internal(struct drm_mode_set
*set
)
624 struct drm_crtc
*crtc
= set
->crtc
;
625 struct drm_framebuffer
*fb
;
626 struct drm_crtc
*tmp
;
630 * NOTE: ->set_config can also disable other crtcs (if we steal all
631 * connectors from it), hence we need to refcount the fbs across all
632 * crtcs. Atomic modeset will have saner semantics ...
634 drm_for_each_crtc(tmp
, crtc
->dev
)
635 tmp
->primary
->old_fb
= tmp
->primary
->fb
;
639 ret
= crtc
->funcs
->set_config(set
);
641 crtc
->primary
->crtc
= crtc
;
642 crtc
->primary
->fb
= fb
;
645 drm_for_each_crtc(tmp
, crtc
->dev
) {
646 if (tmp
->primary
->fb
)
647 drm_framebuffer_reference(tmp
->primary
->fb
);
648 if (tmp
->primary
->old_fb
)
649 drm_framebuffer_unreference(tmp
->primary
->old_fb
);
650 tmp
->primary
->old_fb
= NULL
;
655 EXPORT_SYMBOL(drm_mode_set_config_internal
);
658 * drm_crtc_get_hv_timing - Fetches hdisplay/vdisplay for given mode
659 * @mode: mode to query
660 * @hdisplay: hdisplay value to fill in
661 * @vdisplay: vdisplay value to fill in
663 * The vdisplay value will be doubled if the specified mode is a stereo mode of
664 * the appropriate layout.
666 void drm_crtc_get_hv_timing(const struct drm_display_mode
*mode
,
667 int *hdisplay
, int *vdisplay
)
669 struct drm_display_mode adjusted
;
671 drm_mode_copy(&adjusted
, mode
);
672 drm_mode_set_crtcinfo(&adjusted
, CRTC_STEREO_DOUBLE_ONLY
);
673 *hdisplay
= adjusted
.crtc_hdisplay
;
674 *vdisplay
= adjusted
.crtc_vdisplay
;
676 EXPORT_SYMBOL(drm_crtc_get_hv_timing
);
679 * drm_crtc_check_viewport - Checks that a framebuffer is big enough for the
681 * @crtc: CRTC that framebuffer will be displayed on
684 * @mode: mode that framebuffer will be displayed under
685 * @fb: framebuffer to check size of
687 int drm_crtc_check_viewport(const struct drm_crtc
*crtc
,
689 const struct drm_display_mode
*mode
,
690 const struct drm_framebuffer
*fb
)
693 int hdisplay
, vdisplay
;
695 drm_crtc_get_hv_timing(mode
, &hdisplay
, &vdisplay
);
698 crtc
->primary
->state
->rotation
& (DRM_ROTATE_90
|
700 swap(hdisplay
, vdisplay
);
702 return drm_framebuffer_check_src_coords(x
<< 16, y
<< 16,
703 hdisplay
<< 16, vdisplay
<< 16,
706 EXPORT_SYMBOL(drm_crtc_check_viewport
);
709 * drm_mode_setcrtc - set CRTC configuration
710 * @dev: drm device for the ioctl
711 * @data: data pointer for the ioctl
712 * @file_priv: drm file for the ioctl call
714 * Build a new CRTC configuration based on user request.
716 * Called by the user via ioctl.
719 * Zero on success, negative errno on failure.
721 int drm_mode_setcrtc(struct drm_device
*dev
, void *data
,
722 struct drm_file
*file_priv
)
724 struct drm_mode_config
*config
= &dev
->mode_config
;
725 struct drm_mode_crtc
*crtc_req
= data
;
726 struct drm_crtc
*crtc
;
727 struct drm_connector
**connector_set
= NULL
, *connector
;
728 struct drm_framebuffer
*fb
= NULL
;
729 struct drm_display_mode
*mode
= NULL
;
730 struct drm_mode_set set
;
731 uint32_t __user
*set_connectors_ptr
;
735 if (!drm_core_check_feature(dev
, DRIVER_MODESET
))
739 * Universal plane src offsets are only 16.16, prevent havoc for
740 * drivers using universal plane code internally.
742 if (crtc_req
->x
& 0xffff0000 || crtc_req
->y
& 0xffff0000)
745 drm_modeset_lock_all(dev
);
746 crtc
= drm_crtc_find(dev
, crtc_req
->crtc_id
);
748 DRM_DEBUG_KMS("Unknown CRTC ID %d\n", crtc_req
->crtc_id
);
752 DRM_DEBUG_KMS("[CRTC:%d:%s]\n", crtc
->base
.id
, crtc
->name
);
754 if (crtc_req
->mode_valid
) {
755 /* If we have a mode we need a framebuffer. */
756 /* If we pass -1, set the mode with the currently bound fb */
757 if (crtc_req
->fb_id
== -1) {
758 if (!crtc
->primary
->fb
) {
759 DRM_DEBUG_KMS("CRTC doesn't have current FB\n");
763 fb
= crtc
->primary
->fb
;
764 /* Make refcounting symmetric with the lookup path. */
765 drm_framebuffer_reference(fb
);
767 fb
= drm_framebuffer_lookup(dev
, crtc_req
->fb_id
);
769 DRM_DEBUG_KMS("Unknown FB ID%d\n",
776 mode
= drm_mode_create(dev
);
782 ret
= drm_mode_convert_umode(mode
, &crtc_req
->mode
);
784 DRM_DEBUG_KMS("Invalid mode\n");
789 * Check whether the primary plane supports the fb pixel format.
790 * Drivers not implementing the universal planes API use a
791 * default formats list provided by the DRM core which doesn't
792 * match real hardware capabilities. Skip the check in that
795 if (!crtc
->primary
->format_default
) {
796 ret
= drm_plane_check_pixel_format(crtc
->primary
,
799 char *format_name
= drm_get_format_name(fb
->pixel_format
);
800 DRM_DEBUG_KMS("Invalid pixel format %s\n", format_name
);
806 ret
= drm_crtc_check_viewport(crtc
, crtc_req
->x
, crtc_req
->y
,
813 if (crtc_req
->count_connectors
== 0 && mode
) {
814 DRM_DEBUG_KMS("Count connectors is 0 but mode set\n");
819 if (crtc_req
->count_connectors
> 0 && (!mode
|| !fb
)) {
820 DRM_DEBUG_KMS("Count connectors is %d but no mode or fb set\n",
821 crtc_req
->count_connectors
);
826 if (crtc_req
->count_connectors
> 0) {
829 /* Avoid unbounded kernel memory allocation */
830 if (crtc_req
->count_connectors
> config
->num_connector
) {
835 connector_set
= kmalloc_array(crtc_req
->count_connectors
,
836 sizeof(struct drm_connector
*),
838 if (!connector_set
) {
843 for (i
= 0; i
< crtc_req
->count_connectors
; i
++) {
844 connector_set
[i
] = NULL
;
845 set_connectors_ptr
= (uint32_t __user
*)(unsigned long)crtc_req
->set_connectors_ptr
;
846 if (get_user(out_id
, &set_connectors_ptr
[i
])) {
851 connector
= drm_connector_lookup(dev
, out_id
);
853 DRM_DEBUG_KMS("Connector id %d unknown\n",
858 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
862 connector_set
[i
] = connector
;
870 set
.connectors
= connector_set
;
871 set
.num_connectors
= crtc_req
->count_connectors
;
873 ret
= drm_mode_set_config_internal(&set
);
877 drm_framebuffer_unreference(fb
);
880 for (i
= 0; i
< crtc_req
->count_connectors
; i
++) {
881 if (connector_set
[i
])
882 drm_connector_unreference(connector_set
[i
]);
885 kfree(connector_set
);
886 drm_mode_destroy(dev
, mode
);
887 drm_modeset_unlock_all(dev
);
891 int drm_mode_crtc_set_obj_prop(struct drm_mode_object
*obj
,
892 struct drm_property
*property
,
896 struct drm_crtc
*crtc
= obj_to_crtc(obj
);
898 if (crtc
->funcs
->set_property
)
899 ret
= crtc
->funcs
->set_property(crtc
, property
, value
);
901 drm_object_property_set_value(obj
, property
, value
);
907 * drm_mode_config_reset - call ->reset callbacks
910 * This functions calls all the crtc's, encoder's and connector's ->reset
911 * callback. Drivers can use this in e.g. their driver load or resume code to
912 * reset hardware and software state.
914 void drm_mode_config_reset(struct drm_device
*dev
)
916 struct drm_crtc
*crtc
;
917 struct drm_plane
*plane
;
918 struct drm_encoder
*encoder
;
919 struct drm_connector
*connector
;
921 drm_for_each_plane(plane
, dev
)
922 if (plane
->funcs
->reset
)
923 plane
->funcs
->reset(plane
);
925 drm_for_each_crtc(crtc
, dev
)
926 if (crtc
->funcs
->reset
)
927 crtc
->funcs
->reset(crtc
);
929 drm_for_each_encoder(encoder
, dev
)
930 if (encoder
->funcs
->reset
)
931 encoder
->funcs
->reset(encoder
);
933 mutex_lock(&dev
->mode_config
.mutex
);
934 drm_for_each_connector(connector
, dev
)
935 if (connector
->funcs
->reset
)
936 connector
->funcs
->reset(connector
);
937 mutex_unlock(&dev
->mode_config
.mutex
);
939 EXPORT_SYMBOL(drm_mode_config_reset
);
942 * drm_mode_create_dumb_ioctl - create a dumb backing storage buffer
945 * @file_priv: DRM file info
947 * This creates a new dumb buffer in the driver's backing storage manager (GEM,
948 * TTM or something else entirely) and returns the resulting buffer handle. This
949 * handle can then be wrapped up into a framebuffer modeset object.
951 * Note that userspace is not allowed to use such objects for render
952 * acceleration - drivers must create their own private ioctls for such a use
955 * Called by the user via ioctl.
958 * Zero on success, negative errno on failure.
960 int drm_mode_create_dumb_ioctl(struct drm_device
*dev
,
961 void *data
, struct drm_file
*file_priv
)
963 struct drm_mode_create_dumb
*args
= data
;
964 u32 cpp
, stride
, size
;
966 if (!dev
->driver
->dumb_create
)
968 if (!args
->width
|| !args
->height
|| !args
->bpp
)
971 /* overflow checks for 32bit size calculations */
972 /* NOTE: DIV_ROUND_UP() can overflow */
973 cpp
= DIV_ROUND_UP(args
->bpp
, 8);
974 if (!cpp
|| cpp
> 0xffffffffU
/ args
->width
)
976 stride
= cpp
* args
->width
;
977 if (args
->height
> 0xffffffffU
/ stride
)
980 /* test for wrap-around */
981 size
= args
->height
* stride
;
982 if (PAGE_ALIGN(size
) == 0)
986 * handle, pitch and size are output parameters. Zero them out to
987 * prevent drivers from accidentally using uninitialized data. Since
988 * not all existing userspace is clearing these fields properly we
989 * cannot reject IOCTL with garbage in them.
995 return dev
->driver
->dumb_create(file_priv
, dev
, args
);
999 * drm_mode_mmap_dumb_ioctl - create an mmap offset for a dumb backing storage buffer
1002 * @file_priv: DRM file info
1004 * Allocate an offset in the drm device node's address space to be able to
1005 * memory map a dumb buffer.
1007 * Called by the user via ioctl.
1010 * Zero on success, negative errno on failure.
1012 int drm_mode_mmap_dumb_ioctl(struct drm_device
*dev
,
1013 void *data
, struct drm_file
*file_priv
)
1015 struct drm_mode_map_dumb
*args
= data
;
1017 /* call driver ioctl to get mmap offset */
1018 if (!dev
->driver
->dumb_map_offset
)
1021 return dev
->driver
->dumb_map_offset(file_priv
, dev
, args
->handle
, &args
->offset
);
1025 * drm_mode_destroy_dumb_ioctl - destroy a dumb backing strage buffer
1028 * @file_priv: DRM file info
1030 * This destroys the userspace handle for the given dumb backing storage buffer.
1031 * Since buffer objects must be reference counted in the kernel a buffer object
1032 * won't be immediately freed if a framebuffer modeset object still uses it.
1034 * Called by the user via ioctl.
1037 * Zero on success, negative errno on failure.
1039 int drm_mode_destroy_dumb_ioctl(struct drm_device
*dev
,
1040 void *data
, struct drm_file
*file_priv
)
1042 struct drm_mode_destroy_dumb
*args
= data
;
1044 if (!dev
->driver
->dumb_destroy
)
1047 return dev
->driver
->dumb_destroy(file_priv
, dev
, args
->handle
);
1051 * drm_mode_config_init - initialize DRM mode_configuration structure
1054 * Initialize @dev's mode_config structure, used for tracking the graphics
1055 * configuration of @dev.
1057 * Since this initializes the modeset locks, no locking is possible. Which is no
1058 * problem, since this should happen single threaded at init time. It is the
1059 * driver's problem to ensure this guarantee.
1062 void drm_mode_config_init(struct drm_device
*dev
)
1064 mutex_init(&dev
->mode_config
.mutex
);
1065 drm_modeset_lock_init(&dev
->mode_config
.connection_mutex
);
1066 mutex_init(&dev
->mode_config
.idr_mutex
);
1067 mutex_init(&dev
->mode_config
.fb_lock
);
1068 mutex_init(&dev
->mode_config
.blob_lock
);
1069 INIT_LIST_HEAD(&dev
->mode_config
.fb_list
);
1070 INIT_LIST_HEAD(&dev
->mode_config
.crtc_list
);
1071 INIT_LIST_HEAD(&dev
->mode_config
.connector_list
);
1072 INIT_LIST_HEAD(&dev
->mode_config
.encoder_list
);
1073 INIT_LIST_HEAD(&dev
->mode_config
.property_list
);
1074 INIT_LIST_HEAD(&dev
->mode_config
.property_blob_list
);
1075 INIT_LIST_HEAD(&dev
->mode_config
.plane_list
);
1076 idr_init(&dev
->mode_config
.crtc_idr
);
1077 idr_init(&dev
->mode_config
.tile_idr
);
1078 ida_init(&dev
->mode_config
.connector_ida
);
1080 drm_modeset_lock_all(dev
);
1081 drm_mode_create_standard_properties(dev
);
1082 drm_modeset_unlock_all(dev
);
1084 /* Just to be sure */
1085 dev
->mode_config
.num_fb
= 0;
1086 dev
->mode_config
.num_connector
= 0;
1087 dev
->mode_config
.num_crtc
= 0;
1088 dev
->mode_config
.num_encoder
= 0;
1089 dev
->mode_config
.num_overlay_plane
= 0;
1090 dev
->mode_config
.num_total_plane
= 0;
1092 EXPORT_SYMBOL(drm_mode_config_init
);
1095 * drm_mode_config_cleanup - free up DRM mode_config info
1098 * Free up all the connectors and CRTCs associated with this DRM device, then
1099 * free up the framebuffers and associated buffer objects.
1101 * Note that since this /should/ happen single-threaded at driver/device
1102 * teardown time, no locking is required. It's the driver's job to ensure that
1103 * this guarantee actually holds true.
1105 * FIXME: cleanup any dangling user buffer objects too
1107 void drm_mode_config_cleanup(struct drm_device
*dev
)
1109 struct drm_connector
*connector
, *ot
;
1110 struct drm_crtc
*crtc
, *ct
;
1111 struct drm_encoder
*encoder
, *enct
;
1112 struct drm_framebuffer
*fb
, *fbt
;
1113 struct drm_property
*property
, *pt
;
1114 struct drm_property_blob
*blob
, *bt
;
1115 struct drm_plane
*plane
, *plt
;
1117 list_for_each_entry_safe(encoder
, enct
, &dev
->mode_config
.encoder_list
,
1119 encoder
->funcs
->destroy(encoder
);
1122 list_for_each_entry_safe(connector
, ot
,
1123 &dev
->mode_config
.connector_list
, head
) {
1124 connector
->funcs
->destroy(connector
);
1127 list_for_each_entry_safe(property
, pt
, &dev
->mode_config
.property_list
,
1129 drm_property_destroy(dev
, property
);
1132 list_for_each_entry_safe(plane
, plt
, &dev
->mode_config
.plane_list
,
1134 plane
->funcs
->destroy(plane
);
1137 list_for_each_entry_safe(crtc
, ct
, &dev
->mode_config
.crtc_list
, head
) {
1138 crtc
->funcs
->destroy(crtc
);
1141 list_for_each_entry_safe(blob
, bt
, &dev
->mode_config
.property_blob_list
,
1143 drm_property_unreference_blob(blob
);
1147 * Single-threaded teardown context, so it's not required to grab the
1148 * fb_lock to protect against concurrent fb_list access. Contrary, it
1149 * would actually deadlock with the drm_framebuffer_cleanup function.
1151 * Also, if there are any framebuffers left, that's a driver leak now,
1152 * so politely WARN about this.
1154 WARN_ON(!list_empty(&dev
->mode_config
.fb_list
));
1155 list_for_each_entry_safe(fb
, fbt
, &dev
->mode_config
.fb_list
, head
) {
1156 drm_framebuffer_free(&fb
->base
.refcount
);
1159 ida_destroy(&dev
->mode_config
.connector_ida
);
1160 idr_destroy(&dev
->mode_config
.tile_idr
);
1161 idr_destroy(&dev
->mode_config
.crtc_idr
);
1162 drm_modeset_lock_fini(&dev
->mode_config
.connection_mutex
);
1164 EXPORT_SYMBOL(drm_mode_config_cleanup
);
1169 * Tile groups are used to represent tiled monitors with a unique
1170 * integer identifier. Tiled monitors using DisplayID v1.3 have
1171 * a unique 8-byte handle, we store this in a tile group, so we
1172 * have a common identifier for all tiles in a monitor group.
1174 static void drm_tile_group_free(struct kref
*kref
)
1176 struct drm_tile_group
*tg
= container_of(kref
, struct drm_tile_group
, refcount
);
1177 struct drm_device
*dev
= tg
->dev
;
1178 mutex_lock(&dev
->mode_config
.idr_mutex
);
1179 idr_remove(&dev
->mode_config
.tile_idr
, tg
->id
);
1180 mutex_unlock(&dev
->mode_config
.idr_mutex
);
1185 * drm_mode_put_tile_group - drop a reference to a tile group.
1187 * @tg: tile group to drop reference to.
1189 * drop reference to tile group and free if 0.
1191 void drm_mode_put_tile_group(struct drm_device
*dev
,
1192 struct drm_tile_group
*tg
)
1194 kref_put(&tg
->refcount
, drm_tile_group_free
);
1198 * drm_mode_get_tile_group - get a reference to an existing tile group
1200 * @topology: 8-bytes unique per monitor.
1202 * Use the unique bytes to get a reference to an existing tile group.
1205 * tile group or NULL if not found.
1207 struct drm_tile_group
*drm_mode_get_tile_group(struct drm_device
*dev
,
1210 struct drm_tile_group
*tg
;
1212 mutex_lock(&dev
->mode_config
.idr_mutex
);
1213 idr_for_each_entry(&dev
->mode_config
.tile_idr
, tg
, id
) {
1214 if (!memcmp(tg
->group_data
, topology
, 8)) {
1215 if (!kref_get_unless_zero(&tg
->refcount
))
1217 mutex_unlock(&dev
->mode_config
.idr_mutex
);
1221 mutex_unlock(&dev
->mode_config
.idr_mutex
);
1224 EXPORT_SYMBOL(drm_mode_get_tile_group
);
1227 * drm_mode_create_tile_group - create a tile group from a displayid description
1229 * @topology: 8-bytes unique per monitor.
1231 * Create a tile group for the unique monitor, and get a unique
1232 * identifier for the tile group.
1235 * new tile group or error.
1237 struct drm_tile_group
*drm_mode_create_tile_group(struct drm_device
*dev
,
1240 struct drm_tile_group
*tg
;
1243 tg
= kzalloc(sizeof(*tg
), GFP_KERNEL
);
1245 return ERR_PTR(-ENOMEM
);
1247 kref_init(&tg
->refcount
);
1248 memcpy(tg
->group_data
, topology
, 8);
1251 mutex_lock(&dev
->mode_config
.idr_mutex
);
1252 ret
= idr_alloc(&dev
->mode_config
.tile_idr
, tg
, 1, 0, GFP_KERNEL
);
1260 mutex_unlock(&dev
->mode_config
.idr_mutex
);
1263 EXPORT_SYMBOL(drm_mode_create_tile_group
);