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