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_crtc_set_gamma_size - set the gamma table size
908 * @crtc: CRTC to set the gamma table size for
909 * @gamma_size: size of the gamma table
911 * Drivers which support gamma tables should set this to the supported gamma
912 * table size when initializing the CRTC. Currently the drm core only supports a
913 * fixed gamma table size.
916 * Zero on success, negative errno on failure.
918 int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc,
921 uint16_t *r_base, *g_base, *b_base;
924 crtc->gamma_size = gamma_size;
926 crtc->gamma_store = kcalloc(gamma_size, sizeof(uint16_t) * 3,
928 if (!crtc->gamma_store) {
929 crtc->gamma_size = 0;
933 r_base = crtc->gamma_store;
934 g_base = r_base + gamma_size;
935 b_base = g_base + gamma_size;
936 for (i = 0; i < gamma_size; i++) {
945 EXPORT_SYMBOL(drm_mode_crtc_set_gamma_size);
948 * drm_mode_gamma_set_ioctl - set the gamma table
951 * @file_priv: DRM file info
953 * Set the gamma table of a CRTC to the one passed in by the user. Userspace can
954 * inquire the required gamma table size through drm_mode_gamma_get_ioctl.
956 * Called by the user via ioctl.
959 * Zero on success, negative errno on failure.
961 int drm_mode_gamma_set_ioctl(struct drm_device *dev,
962 void *data, struct drm_file *file_priv)
964 struct drm_mode_crtc_lut *crtc_lut = data;
965 struct drm_crtc *crtc;
966 void *r_base, *g_base, *b_base;
970 if (!drm_core_check_feature(dev, DRIVER_MODESET))
973 drm_modeset_lock_all(dev);
974 crtc = drm_crtc_find(dev, crtc_lut->crtc_id);
980 if (crtc->funcs->gamma_set == NULL) {
985 /* memcpy into gamma store */
986 if (crtc_lut->gamma_size != crtc->gamma_size) {
991 size = crtc_lut->gamma_size * (sizeof(uint16_t));
992 r_base = crtc->gamma_store;
993 if (copy_from_user(r_base, (void __user *)(unsigned long)crtc_lut->red, size)) {
998 g_base = r_base + size;
999 if (copy_from_user(g_base, (void __user *)(unsigned long)crtc_lut->green, size)) {
1004 b_base = g_base + size;
1005 if (copy_from_user(b_base, (void __user *)(unsigned long)crtc_lut->blue, size)) {
1010 ret = crtc->funcs->gamma_set(crtc, r_base, g_base, b_base, crtc->gamma_size);
1013 drm_modeset_unlock_all(dev);
1019 * drm_mode_gamma_get_ioctl - get the gamma table
1022 * @file_priv: DRM file info
1024 * Copy the current gamma table into the storage provided. This also provides
1025 * the gamma table size the driver expects, which can be used to size the
1026 * allocated storage.
1028 * Called by the user via ioctl.
1031 * Zero on success, negative errno on failure.
1033 int drm_mode_gamma_get_ioctl(struct drm_device *dev,
1034 void *data, struct drm_file *file_priv)
1036 struct drm_mode_crtc_lut *crtc_lut = data;
1037 struct drm_crtc *crtc;
1038 void *r_base, *g_base, *b_base;
1042 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1045 drm_modeset_lock_all(dev);
1046 crtc = drm_crtc_find(dev, crtc_lut->crtc_id);
1052 /* memcpy into gamma store */
1053 if (crtc_lut->gamma_size != crtc->gamma_size) {
1058 size = crtc_lut->gamma_size * (sizeof(uint16_t));
1059 r_base = crtc->gamma_store;
1060 if (copy_to_user((void __user *)(unsigned long)crtc_lut->red, r_base, size)) {
1065 g_base = r_base + size;
1066 if (copy_to_user((void __user *)(unsigned long)crtc_lut->green, g_base, size)) {
1071 b_base = g_base + size;
1072 if (copy_to_user((void __user *)(unsigned long)crtc_lut->blue, b_base, size)) {
1077 drm_modeset_unlock_all(dev);
1082 * drm_mode_config_reset - call ->reset callbacks
1085 * This functions calls all the crtc's, encoder's and connector's ->reset
1086 * callback. Drivers can use this in e.g. their driver load or resume code to
1087 * reset hardware and software state.
1089 void drm_mode_config_reset(struct drm_device *dev)
1091 struct drm_crtc *crtc;
1092 struct drm_plane *plane;
1093 struct drm_encoder *encoder;
1094 struct drm_connector *connector;
1096 drm_for_each_plane(plane, dev)
1097 if (plane->funcs->reset)
1098 plane->funcs->reset(plane);
1100 drm_for_each_crtc(crtc, dev)
1101 if (crtc->funcs->reset)
1102 crtc->funcs->reset(crtc);
1104 drm_for_each_encoder(encoder, dev)
1105 if (encoder->funcs->reset)
1106 encoder->funcs->reset(encoder);
1108 mutex_lock(&dev->mode_config.mutex);
1109 drm_for_each_connector(connector, dev)
1110 if (connector->funcs->reset)
1111 connector->funcs->reset(connector);
1112 mutex_unlock(&dev->mode_config.mutex);
1114 EXPORT_SYMBOL(drm_mode_config_reset);
1117 * drm_mode_create_dumb_ioctl - create a dumb backing storage buffer
1120 * @file_priv: DRM file info
1122 * This creates a new dumb buffer in the driver's backing storage manager (GEM,
1123 * TTM or something else entirely) and returns the resulting buffer handle. This
1124 * handle can then be wrapped up into a framebuffer modeset object.
1126 * Note that userspace is not allowed to use such objects for render
1127 * acceleration - drivers must create their own private ioctls for such a use
1130 * Called by the user via ioctl.
1133 * Zero on success, negative errno on failure.
1135 int drm_mode_create_dumb_ioctl(struct drm_device *dev,
1136 void *data, struct drm_file *file_priv)
1138 struct drm_mode_create_dumb *args = data;
1139 u32 cpp, stride, size;
1141 if (!dev->driver->dumb_create)
1143 if (!args->width || !args->height || !args->bpp)
1146 /* overflow checks for 32bit size calculations */
1147 /* NOTE: DIV_ROUND_UP() can overflow */
1148 cpp = DIV_ROUND_UP(args->bpp, 8);
1149 if (!cpp || cpp > 0xffffffffU / args->width)
1151 stride = cpp * args->width;
1152 if (args->height > 0xffffffffU / stride)
1155 /* test for wrap-around */
1156 size = args->height * stride;
1157 if (PAGE_ALIGN(size) == 0)
1161 * handle, pitch and size are output parameters. Zero them out to
1162 * prevent drivers from accidentally using uninitialized data. Since
1163 * not all existing userspace is clearing these fields properly we
1164 * cannot reject IOCTL with garbage in them.
1170 return dev->driver->dumb_create(file_priv, dev, args);
1174 * drm_mode_mmap_dumb_ioctl - create an mmap offset for a dumb backing storage buffer
1177 * @file_priv: DRM file info
1179 * Allocate an offset in the drm device node's address space to be able to
1180 * memory map a dumb buffer.
1182 * Called by the user via ioctl.
1185 * Zero on success, negative errno on failure.
1187 int drm_mode_mmap_dumb_ioctl(struct drm_device *dev,
1188 void *data, struct drm_file *file_priv)
1190 struct drm_mode_map_dumb *args = data;
1192 /* call driver ioctl to get mmap offset */
1193 if (!dev->driver->dumb_map_offset)
1196 return dev->driver->dumb_map_offset(file_priv, dev, args->handle, &args->offset);
1200 * drm_mode_destroy_dumb_ioctl - destroy a dumb backing strage buffer
1203 * @file_priv: DRM file info
1205 * This destroys the userspace handle for the given dumb backing storage buffer.
1206 * Since buffer objects must be reference counted in the kernel a buffer object
1207 * won't be immediately freed if a framebuffer modeset object still uses it.
1209 * Called by the user via ioctl.
1212 * Zero on success, negative errno on failure.
1214 int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
1215 void *data, struct drm_file *file_priv)
1217 struct drm_mode_destroy_dumb *args = data;
1219 if (!dev->driver->dumb_destroy)
1222 return dev->driver->dumb_destroy(file_priv, dev, args->handle);
1226 * drm_mode_config_init - initialize DRM mode_configuration structure
1229 * Initialize @dev's mode_config structure, used for tracking the graphics
1230 * configuration of @dev.
1232 * Since this initializes the modeset locks, no locking is possible. Which is no
1233 * problem, since this should happen single threaded at init time. It is the
1234 * driver's problem to ensure this guarantee.
1237 void drm_mode_config_init(struct drm_device *dev)
1239 mutex_init(&dev->mode_config.mutex);
1240 drm_modeset_lock_init(&dev->mode_config.connection_mutex);
1241 mutex_init(&dev->mode_config.idr_mutex);
1242 mutex_init(&dev->mode_config.fb_lock);
1243 mutex_init(&dev->mode_config.blob_lock);
1244 INIT_LIST_HEAD(&dev->mode_config.fb_list);
1245 INIT_LIST_HEAD(&dev->mode_config.crtc_list);
1246 INIT_LIST_HEAD(&dev->mode_config.connector_list);
1247 INIT_LIST_HEAD(&dev->mode_config.encoder_list);
1248 INIT_LIST_HEAD(&dev->mode_config.property_list);
1249 INIT_LIST_HEAD(&dev->mode_config.property_blob_list);
1250 INIT_LIST_HEAD(&dev->mode_config.plane_list);
1251 idr_init(&dev->mode_config.crtc_idr);
1252 idr_init(&dev->mode_config.tile_idr);
1253 ida_init(&dev->mode_config.connector_ida);
1255 drm_modeset_lock_all(dev);
1256 drm_mode_create_standard_properties(dev);
1257 drm_modeset_unlock_all(dev);
1259 /* Just to be sure */
1260 dev->mode_config.num_fb = 0;
1261 dev->mode_config.num_connector = 0;
1262 dev->mode_config.num_crtc = 0;
1263 dev->mode_config.num_encoder = 0;
1264 dev->mode_config.num_overlay_plane = 0;
1265 dev->mode_config.num_total_plane = 0;
1267 EXPORT_SYMBOL(drm_mode_config_init);
1270 * drm_mode_config_cleanup - free up DRM mode_config info
1273 * Free up all the connectors and CRTCs associated with this DRM device, then
1274 * free up the framebuffers and associated buffer objects.
1276 * Note that since this /should/ happen single-threaded at driver/device
1277 * teardown time, no locking is required. It's the driver's job to ensure that
1278 * this guarantee actually holds true.
1280 * FIXME: cleanup any dangling user buffer objects too
1282 void drm_mode_config_cleanup(struct drm_device *dev)
1284 struct drm_connector *connector, *ot;
1285 struct drm_crtc *crtc, *ct;
1286 struct drm_encoder *encoder, *enct;
1287 struct drm_framebuffer *fb, *fbt;
1288 struct drm_property *property, *pt;
1289 struct drm_property_blob *blob, *bt;
1290 struct drm_plane *plane, *plt;
1292 list_for_each_entry_safe(encoder, enct, &dev->mode_config.encoder_list,
1294 encoder->funcs->destroy(encoder);
1297 list_for_each_entry_safe(connector, ot,
1298 &dev->mode_config.connector_list, head) {
1299 connector->funcs->destroy(connector);
1302 list_for_each_entry_safe(property, pt, &dev->mode_config.property_list,
1304 drm_property_destroy(dev, property);
1307 list_for_each_entry_safe(plane, plt, &dev->mode_config.plane_list,
1309 plane->funcs->destroy(plane);
1312 list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) {
1313 crtc->funcs->destroy(crtc);
1316 list_for_each_entry_safe(blob, bt, &dev->mode_config.property_blob_list,
1318 drm_property_unreference_blob(blob);
1322 * Single-threaded teardown context, so it's not required to grab the
1323 * fb_lock to protect against concurrent fb_list access. Contrary, it
1324 * would actually deadlock with the drm_framebuffer_cleanup function.
1326 * Also, if there are any framebuffers left, that's a driver leak now,
1327 * so politely WARN about this.
1329 WARN_ON(!list_empty(&dev->mode_config.fb_list));
1330 list_for_each_entry_safe(fb, fbt, &dev->mode_config.fb_list, head) {
1331 drm_framebuffer_free(&fb->base.refcount);
1334 ida_destroy(&dev->mode_config.connector_ida);
1335 idr_destroy(&dev->mode_config.tile_idr);
1336 idr_destroy(&dev->mode_config.crtc_idr);
1337 drm_modeset_lock_fini(&dev->mode_config.connection_mutex);
1339 EXPORT_SYMBOL(drm_mode_config_cleanup);
1344 * Tile groups are used to represent tiled monitors with a unique
1345 * integer identifier. Tiled monitors using DisplayID v1.3 have
1346 * a unique 8-byte handle, we store this in a tile group, so we
1347 * have a common identifier for all tiles in a monitor group.
1349 static void drm_tile_group_free(struct kref *kref)
1351 struct drm_tile_group *tg = container_of(kref, struct drm_tile_group, refcount);
1352 struct drm_device *dev = tg->dev;
1353 mutex_lock(&dev->mode_config.idr_mutex);
1354 idr_remove(&dev->mode_config.tile_idr, tg->id);
1355 mutex_unlock(&dev->mode_config.idr_mutex);
1360 * drm_mode_put_tile_group - drop a reference to a tile group.
1362 * @tg: tile group to drop reference to.
1364 * drop reference to tile group and free if 0.
1366 void drm_mode_put_tile_group(struct drm_device *dev,
1367 struct drm_tile_group *tg)
1369 kref_put(&tg->refcount, drm_tile_group_free);
1373 * drm_mode_get_tile_group - get a reference to an existing tile group
1375 * @topology: 8-bytes unique per monitor.
1377 * Use the unique bytes to get a reference to an existing tile group.
1380 * tile group or NULL if not found.
1382 struct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev,
1385 struct drm_tile_group *tg;
1387 mutex_lock(&dev->mode_config.idr_mutex);
1388 idr_for_each_entry(&dev->mode_config.tile_idr, tg, id) {
1389 if (!memcmp(tg->group_data, topology, 8)) {
1390 if (!kref_get_unless_zero(&tg->refcount))
1392 mutex_unlock(&dev->mode_config.idr_mutex);
1396 mutex_unlock(&dev->mode_config.idr_mutex);
1399 EXPORT_SYMBOL(drm_mode_get_tile_group);
1402 * drm_mode_create_tile_group - create a tile group from a displayid description
1404 * @topology: 8-bytes unique per monitor.
1406 * Create a tile group for the unique monitor, and get a unique
1407 * identifier for the tile group.
1410 * new tile group or error.
1412 struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
1415 struct drm_tile_group *tg;
1418 tg = kzalloc(sizeof(*tg), GFP_KERNEL);
1420 return ERR_PTR(-ENOMEM);
1422 kref_init(&tg->refcount);
1423 memcpy(tg->group_data, topology, 8);
1426 mutex_lock(&dev->mode_config.idr_mutex);
1427 ret = idr_alloc(&dev->mode_config.tile_idr, tg, 1, 0, GFP_KERNEL);
1435 mutex_unlock(&dev->mode_config.idr_mutex);
1438 EXPORT_SYMBOL(drm_mode_create_tile_group);
1441 * drm_crtc_enable_color_mgmt - enable color management properties
1443 * @degamma_lut_size: the size of the degamma lut (before CSC)
1444 * @has_ctm: whether to attach ctm_property for CSC matrix
1445 * @gamma_lut_size: the size of the gamma lut (after CSC)
1447 * This function lets the driver enable the color correction
1448 * properties on a CRTC. This includes 3 degamma, csc and gamma
1449 * properties that userspace can set and 2 size properties to inform
1450 * the userspace of the lut sizes. Each of the properties are
1451 * optional. The gamma and degamma properties are only attached if
1452 * their size is not 0 and ctm_property is only attached if has_ctm is
1455 void drm_crtc_enable_color_mgmt(struct drm_crtc *crtc,
1456 uint degamma_lut_size,
1458 uint gamma_lut_size)
1460 struct drm_device *dev = crtc->dev;
1461 struct drm_mode_config *config = &dev->mode_config;
1463 if (degamma_lut_size) {
1464 drm_object_attach_property(&crtc->base,
1465 config->degamma_lut_property, 0);
1466 drm_object_attach_property(&crtc->base,
1467 config->degamma_lut_size_property,
1472 drm_object_attach_property(&crtc->base,
1473 config->ctm_property, 0);
1475 if (gamma_lut_size) {
1476 drm_object_attach_property(&crtc->base,
1477 config->gamma_lut_property, 0);
1478 drm_object_attach_property(&crtc->base,
1479 config->gamma_lut_size_property,
1483 EXPORT_SYMBOL(drm_crtc_enable_color_mgmt);