Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64...
[cascardo/linux.git] / drivers / gpu / drm / drm_crtc.c
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 <drm/drmP.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
44 #include "drm_crtc_internal.h"
45 #include "drm_internal.h"
46
47 static struct drm_framebuffer *
48 internal_framebuffer_create(struct drm_device *dev,
49                             const struct drm_mode_fb_cmd2 *r,
50                             struct drm_file *file_priv);
51
52 /* Avoid boilerplate.  I'm tired of typing. */
53 #define DRM_ENUM_NAME_FN(fnname, list)                          \
54         const char *fnname(int val)                             \
55         {                                                       \
56                 int i;                                          \
57                 for (i = 0; i < ARRAY_SIZE(list); i++) {        \
58                         if (list[i].type == val)                \
59                                 return list[i].name;            \
60                 }                                               \
61                 return "(unknown)";                             \
62         }
63
64 /*
65  * Global properties
66  */
67 static const struct drm_prop_enum_list drm_dpms_enum_list[] = {
68         { DRM_MODE_DPMS_ON, "On" },
69         { DRM_MODE_DPMS_STANDBY, "Standby" },
70         { DRM_MODE_DPMS_SUSPEND, "Suspend" },
71         { DRM_MODE_DPMS_OFF, "Off" }
72 };
73
74 DRM_ENUM_NAME_FN(drm_get_dpms_name, drm_dpms_enum_list)
75
76 static const struct drm_prop_enum_list drm_plane_type_enum_list[] = {
77         { DRM_PLANE_TYPE_OVERLAY, "Overlay" },
78         { DRM_PLANE_TYPE_PRIMARY, "Primary" },
79         { DRM_PLANE_TYPE_CURSOR, "Cursor" },
80 };
81
82 /*
83  * Optional properties
84  */
85 static const struct drm_prop_enum_list drm_scaling_mode_enum_list[] = {
86         { DRM_MODE_SCALE_NONE, "None" },
87         { DRM_MODE_SCALE_FULLSCREEN, "Full" },
88         { DRM_MODE_SCALE_CENTER, "Center" },
89         { DRM_MODE_SCALE_ASPECT, "Full aspect" },
90 };
91
92 static const struct drm_prop_enum_list drm_aspect_ratio_enum_list[] = {
93         { DRM_MODE_PICTURE_ASPECT_NONE, "Automatic" },
94         { DRM_MODE_PICTURE_ASPECT_4_3, "4:3" },
95         { DRM_MODE_PICTURE_ASPECT_16_9, "16:9" },
96 };
97
98 /*
99  * Non-global properties, but "required" for certain connectors.
100  */
101 static const struct drm_prop_enum_list drm_dvi_i_select_enum_list[] = {
102         { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */
103         { DRM_MODE_SUBCONNECTOR_DVID,      "DVI-D"     }, /* DVI-I  */
104         { DRM_MODE_SUBCONNECTOR_DVIA,      "DVI-A"     }, /* DVI-I  */
105 };
106
107 DRM_ENUM_NAME_FN(drm_get_dvi_i_select_name, drm_dvi_i_select_enum_list)
108
109 static const struct drm_prop_enum_list drm_dvi_i_subconnector_enum_list[] = {
110         { DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I and TV-out */
111         { DRM_MODE_SUBCONNECTOR_DVID,      "DVI-D"     }, /* DVI-I  */
112         { DRM_MODE_SUBCONNECTOR_DVIA,      "DVI-A"     }, /* DVI-I  */
113 };
114
115 DRM_ENUM_NAME_FN(drm_get_dvi_i_subconnector_name,
116                  drm_dvi_i_subconnector_enum_list)
117
118 static const struct drm_prop_enum_list drm_tv_select_enum_list[] = {
119         { DRM_MODE_SUBCONNECTOR_Automatic, "Automatic" }, /* DVI-I and TV-out */
120         { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
121         { DRM_MODE_SUBCONNECTOR_SVIDEO,    "SVIDEO"    }, /* TV-out */
122         { DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
123         { DRM_MODE_SUBCONNECTOR_SCART,     "SCART"     }, /* TV-out */
124 };
125
126 DRM_ENUM_NAME_FN(drm_get_tv_select_name, drm_tv_select_enum_list)
127
128 static const struct drm_prop_enum_list drm_tv_subconnector_enum_list[] = {
129         { DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I and TV-out */
130         { DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
131         { DRM_MODE_SUBCONNECTOR_SVIDEO,    "SVIDEO"    }, /* TV-out */
132         { DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
133         { DRM_MODE_SUBCONNECTOR_SCART,     "SCART"     }, /* TV-out */
134 };
135
136 DRM_ENUM_NAME_FN(drm_get_tv_subconnector_name,
137                  drm_tv_subconnector_enum_list)
138
139 static const struct drm_prop_enum_list drm_dirty_info_enum_list[] = {
140         { DRM_MODE_DIRTY_OFF,      "Off"      },
141         { DRM_MODE_DIRTY_ON,       "On"       },
142         { DRM_MODE_DIRTY_ANNOTATE, "Annotate" },
143 };
144
145 struct drm_conn_prop_enum_list {
146         int type;
147         const char *name;
148         struct ida ida;
149 };
150
151 /*
152  * Connector and encoder types.
153  */
154 static struct drm_conn_prop_enum_list drm_connector_enum_list[] = {
155         { DRM_MODE_CONNECTOR_Unknown, "Unknown" },
156         { DRM_MODE_CONNECTOR_VGA, "VGA" },
157         { DRM_MODE_CONNECTOR_DVII, "DVI-I" },
158         { DRM_MODE_CONNECTOR_DVID, "DVI-D" },
159         { DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
160         { DRM_MODE_CONNECTOR_Composite, "Composite" },
161         { DRM_MODE_CONNECTOR_SVIDEO, "SVIDEO" },
162         { DRM_MODE_CONNECTOR_LVDS, "LVDS" },
163         { DRM_MODE_CONNECTOR_Component, "Component" },
164         { DRM_MODE_CONNECTOR_9PinDIN, "DIN" },
165         { DRM_MODE_CONNECTOR_DisplayPort, "DP" },
166         { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
167         { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
168         { DRM_MODE_CONNECTOR_TV, "TV" },
169         { DRM_MODE_CONNECTOR_eDP, "eDP" },
170         { DRM_MODE_CONNECTOR_VIRTUAL, "Virtual" },
171         { DRM_MODE_CONNECTOR_DSI, "DSI" },
172         { DRM_MODE_CONNECTOR_DPI, "DPI" },
173 };
174
175 static const struct drm_prop_enum_list drm_encoder_enum_list[] = {
176         { DRM_MODE_ENCODER_NONE, "None" },
177         { DRM_MODE_ENCODER_DAC, "DAC" },
178         { DRM_MODE_ENCODER_TMDS, "TMDS" },
179         { DRM_MODE_ENCODER_LVDS, "LVDS" },
180         { DRM_MODE_ENCODER_TVDAC, "TV" },
181         { DRM_MODE_ENCODER_VIRTUAL, "Virtual" },
182         { DRM_MODE_ENCODER_DSI, "DSI" },
183         { DRM_MODE_ENCODER_DPMST, "DP MST" },
184         { DRM_MODE_ENCODER_DPI, "DPI" },
185 };
186
187 static const struct drm_prop_enum_list drm_subpixel_enum_list[] = {
188         { SubPixelUnknown, "Unknown" },
189         { SubPixelHorizontalRGB, "Horizontal RGB" },
190         { SubPixelHorizontalBGR, "Horizontal BGR" },
191         { SubPixelVerticalRGB, "Vertical RGB" },
192         { SubPixelVerticalBGR, "Vertical BGR" },
193         { SubPixelNone, "None" },
194 };
195
196 void drm_connector_ida_init(void)
197 {
198         int i;
199
200         for (i = 0; i < ARRAY_SIZE(drm_connector_enum_list); i++)
201                 ida_init(&drm_connector_enum_list[i].ida);
202 }
203
204 void drm_connector_ida_destroy(void)
205 {
206         int i;
207
208         for (i = 0; i < ARRAY_SIZE(drm_connector_enum_list); i++)
209                 ida_destroy(&drm_connector_enum_list[i].ida);
210 }
211
212 /**
213  * drm_get_connector_status_name - return a string for connector status
214  * @status: connector status to compute name of
215  *
216  * In contrast to the other drm_get_*_name functions this one here returns a
217  * const pointer and hence is threadsafe.
218  */
219 const char *drm_get_connector_status_name(enum drm_connector_status status)
220 {
221         if (status == connector_status_connected)
222                 return "connected";
223         else if (status == connector_status_disconnected)
224                 return "disconnected";
225         else
226                 return "unknown";
227 }
228 EXPORT_SYMBOL(drm_get_connector_status_name);
229
230 /**
231  * drm_get_subpixel_order_name - return a string for a given subpixel enum
232  * @order: enum of subpixel_order
233  *
234  * Note you could abuse this and return something out of bounds, but that
235  * would be a caller error.  No unscrubbed user data should make it here.
236  */
237 const char *drm_get_subpixel_order_name(enum subpixel_order order)
238 {
239         return drm_subpixel_enum_list[order].name;
240 }
241 EXPORT_SYMBOL(drm_get_subpixel_order_name);
242
243 /*
244  * Internal function to assign a slot in the object idr and optionally
245  * register the object into the idr.
246  */
247 static int drm_mode_object_get_reg(struct drm_device *dev,
248                                    struct drm_mode_object *obj,
249                                    uint32_t obj_type,
250                                    bool register_obj,
251                                    void (*obj_free_cb)(struct kref *kref))
252 {
253         int ret;
254
255         mutex_lock(&dev->mode_config.idr_mutex);
256         ret = idr_alloc(&dev->mode_config.crtc_idr, register_obj ? obj : NULL, 1, 0, GFP_KERNEL);
257         if (ret >= 0) {
258                 /*
259                  * Set up the object linking under the protection of the idr
260                  * lock so that other users can't see inconsistent state.
261                  */
262                 obj->id = ret;
263                 obj->type = obj_type;
264                 if (obj_free_cb) {
265                         obj->free_cb = obj_free_cb;
266                         kref_init(&obj->refcount);
267                 }
268         }
269         mutex_unlock(&dev->mode_config.idr_mutex);
270
271         return ret < 0 ? ret : 0;
272 }
273
274 /**
275  * drm_mode_object_get - allocate a new modeset identifier
276  * @dev: DRM device
277  * @obj: object pointer, used to generate unique ID
278  * @obj_type: object type
279  *
280  * Create a unique identifier based on @ptr in @dev's identifier space.  Used
281  * for tracking modes, CRTCs and connectors. Note that despite the _get postfix
282  * modeset identifiers are _not_ reference counted. Hence don't use this for
283  * reference counted modeset objects like framebuffers.
284  *
285  * Returns:
286  * Zero on success, error code on failure.
287  */
288 int drm_mode_object_get(struct drm_device *dev,
289                         struct drm_mode_object *obj, uint32_t obj_type)
290 {
291         return drm_mode_object_get_reg(dev, obj, obj_type, true, NULL);
292 }
293
294 static void drm_mode_object_register(struct drm_device *dev,
295                                      struct drm_mode_object *obj)
296 {
297         mutex_lock(&dev->mode_config.idr_mutex);
298         idr_replace(&dev->mode_config.crtc_idr, obj, obj->id);
299         mutex_unlock(&dev->mode_config.idr_mutex);
300 }
301
302 /**
303  * drm_mode_object_unregister - free a modeset identifer
304  * @dev: DRM device
305  * @object: object to free
306  *
307  * Free @id from @dev's unique identifier pool.
308  * This function can be called multiple times, and guards against
309  * multiple removals.
310  * These modeset identifiers are _not_ reference counted. Hence don't use this
311  * for reference counted modeset objects like framebuffers.
312  */
313 void drm_mode_object_unregister(struct drm_device *dev,
314                          struct drm_mode_object *object)
315 {
316         mutex_lock(&dev->mode_config.idr_mutex);
317         if (object->id) {
318                 idr_remove(&dev->mode_config.crtc_idr, object->id);
319                 object->id = 0;
320         }
321         mutex_unlock(&dev->mode_config.idr_mutex);
322 }
323
324 static struct drm_mode_object *_object_find(struct drm_device *dev,
325                 uint32_t id, uint32_t type)
326 {
327         struct drm_mode_object *obj = NULL;
328
329         mutex_lock(&dev->mode_config.idr_mutex);
330         obj = idr_find(&dev->mode_config.crtc_idr, id);
331         if (obj && type != DRM_MODE_OBJECT_ANY && obj->type != type)
332                 obj = NULL;
333         if (obj && obj->id != id)
334                 obj = NULL;
335
336         if (obj && obj->free_cb) {
337                 if (!kref_get_unless_zero(&obj->refcount))
338                         obj = NULL;
339         }
340         mutex_unlock(&dev->mode_config.idr_mutex);
341
342         return obj;
343 }
344
345 /**
346  * drm_mode_object_find - look up a drm object with static lifetime
347  * @dev: drm device
348  * @id: id of the mode object
349  * @type: type of the mode object
350  *
351  * This function is used to look up a modeset object. It will acquire a
352  * reference for reference counted objects. This reference must be dropped again
353  * by callind drm_mode_object_unreference().
354  */
355 struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
356                 uint32_t id, uint32_t type)
357 {
358         struct drm_mode_object *obj = NULL;
359
360         obj = _object_find(dev, id, type);
361         return obj;
362 }
363 EXPORT_SYMBOL(drm_mode_object_find);
364
365 /**
366  * drm_mode_object_unreference - decr the object refcnt
367  * @obj: mode_object
368  *
369  * This functions decrements the object's refcount if it is a refcounted modeset
370  * object. It is a no-op on any other object. This is used to drop references
371  * acquired with drm_mode_object_reference().
372  */
373 void drm_mode_object_unreference(struct drm_mode_object *obj)
374 {
375         if (obj->free_cb) {
376                 DRM_DEBUG("OBJ ID: %d (%d)\n", obj->id, atomic_read(&obj->refcount.refcount));
377                 kref_put(&obj->refcount, obj->free_cb);
378         }
379 }
380 EXPORT_SYMBOL(drm_mode_object_unreference);
381
382 /**
383  * drm_mode_object_reference - incr the object refcnt
384  * @obj: mode_object
385  *
386  * This functions increments the object's refcount if it is a refcounted modeset
387  * object. It is a no-op on any other object. References should be dropped again
388  * by calling drm_mode_object_unreference().
389  */
390 void drm_mode_object_reference(struct drm_mode_object *obj)
391 {
392         if (obj->free_cb) {
393                 DRM_DEBUG("OBJ ID: %d (%d)\n", obj->id, atomic_read(&obj->refcount.refcount));
394                 kref_get(&obj->refcount);
395         }
396 }
397 EXPORT_SYMBOL(drm_mode_object_reference);
398
399 /**
400  * drm_crtc_force_disable - Forcibly turn off a CRTC
401  * @crtc: CRTC to turn off
402  *
403  * Returns:
404  * Zero on success, error code on failure.
405  */
406 int drm_crtc_force_disable(struct drm_crtc *crtc)
407 {
408         struct drm_mode_set set = {
409                 .crtc = crtc,
410         };
411
412         return drm_mode_set_config_internal(&set);
413 }
414 EXPORT_SYMBOL(drm_crtc_force_disable);
415
416 /**
417  * drm_crtc_force_disable_all - Forcibly turn off all enabled CRTCs
418  * @dev: DRM device whose CRTCs to turn off
419  *
420  * Drivers may want to call this on unload to ensure that all displays are
421  * unlit and the GPU is in a consistent, low power state. Takes modeset locks.
422  *
423  * Returns:
424  * Zero on success, error code on failure.
425  */
426 int drm_crtc_force_disable_all(struct drm_device *dev)
427 {
428         struct drm_crtc *crtc;
429         int ret = 0;
430
431         drm_modeset_lock_all(dev);
432         drm_for_each_crtc(crtc, dev)
433                 if (crtc->enabled) {
434                         ret = drm_crtc_force_disable(crtc);
435                         if (ret)
436                                 goto out;
437                 }
438 out:
439         drm_modeset_unlock_all(dev);
440         return ret;
441 }
442 EXPORT_SYMBOL(drm_crtc_force_disable_all);
443
444 static void drm_framebuffer_free(struct kref *kref)
445 {
446         struct drm_framebuffer *fb =
447                         container_of(kref, struct drm_framebuffer, base.refcount);
448         struct drm_device *dev = fb->dev;
449
450         /*
451          * The lookup idr holds a weak reference, which has not necessarily been
452          * removed at this point. Check for that.
453          */
454         drm_mode_object_unregister(dev, &fb->base);
455
456         fb->funcs->destroy(fb);
457 }
458
459 /**
460  * drm_framebuffer_init - initialize a framebuffer
461  * @dev: DRM device
462  * @fb: framebuffer to be initialized
463  * @funcs: ... with these functions
464  *
465  * Allocates an ID for the framebuffer's parent mode object, sets its mode
466  * functions & device file and adds it to the master fd list.
467  *
468  * IMPORTANT:
469  * This functions publishes the fb and makes it available for concurrent access
470  * by other users. Which means by this point the fb _must_ be fully set up -
471  * since all the fb attributes are invariant over its lifetime, no further
472  * locking but only correct reference counting is required.
473  *
474  * Returns:
475  * Zero on success, error code on failure.
476  */
477 int drm_framebuffer_init(struct drm_device *dev, struct drm_framebuffer *fb,
478                          const struct drm_framebuffer_funcs *funcs)
479 {
480         int ret;
481
482         INIT_LIST_HEAD(&fb->filp_head);
483         fb->dev = dev;
484         fb->funcs = funcs;
485
486         ret = drm_mode_object_get_reg(dev, &fb->base, DRM_MODE_OBJECT_FB,
487                                       false, drm_framebuffer_free);
488         if (ret)
489                 goto out;
490
491         mutex_lock(&dev->mode_config.fb_lock);
492         dev->mode_config.num_fb++;
493         list_add(&fb->head, &dev->mode_config.fb_list);
494         mutex_unlock(&dev->mode_config.fb_lock);
495
496         drm_mode_object_register(dev, &fb->base);
497 out:
498         return ret;
499 }
500 EXPORT_SYMBOL(drm_framebuffer_init);
501
502 /**
503  * drm_framebuffer_lookup - look up a drm framebuffer and grab a reference
504  * @dev: drm device
505  * @id: id of the fb object
506  *
507  * If successful, this grabs an additional reference to the framebuffer -
508  * callers need to make sure to eventually unreference the returned framebuffer
509  * again, using @drm_framebuffer_unreference.
510  */
511 struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev,
512                                                uint32_t id)
513 {
514         struct drm_mode_object *obj;
515         struct drm_framebuffer *fb = NULL;
516
517         obj = _object_find(dev, id, DRM_MODE_OBJECT_FB);
518         if (obj)
519                 fb = obj_to_fb(obj);
520         return fb;
521 }
522 EXPORT_SYMBOL(drm_framebuffer_lookup);
523
524 /**
525  * drm_framebuffer_unregister_private - unregister a private fb from the lookup idr
526  * @fb: fb to unregister
527  *
528  * Drivers need to call this when cleaning up driver-private framebuffers, e.g.
529  * those used for fbdev. Note that the caller must hold a reference of it's own,
530  * i.e. the object may not be destroyed through this call (since it'll lead to a
531  * locking inversion).
532  */
533 void drm_framebuffer_unregister_private(struct drm_framebuffer *fb)
534 {
535         struct drm_device *dev;
536
537         if (!fb)
538                 return;
539
540         dev = fb->dev;
541
542         /* Mark fb as reaped and drop idr ref. */
543         drm_mode_object_unregister(dev, &fb->base);
544 }
545 EXPORT_SYMBOL(drm_framebuffer_unregister_private);
546
547 /**
548  * drm_framebuffer_cleanup - remove a framebuffer object
549  * @fb: framebuffer to remove
550  *
551  * Cleanup framebuffer. This function is intended to be used from the drivers
552  * ->destroy callback. It can also be used to clean up driver private
553  * framebuffers embedded into a larger structure.
554  *
555  * Note that this function does not remove the fb from active usuage - if it is
556  * still used anywhere, hilarity can ensue since userspace could call getfb on
557  * the id and get back -EINVAL. Obviously no concern at driver unload time.
558  *
559  * Also, the framebuffer will not be removed from the lookup idr - for
560  * user-created framebuffers this will happen in in the rmfb ioctl. For
561  * driver-private objects (e.g. for fbdev) drivers need to explicitly call
562  * drm_framebuffer_unregister_private.
563  */
564 void drm_framebuffer_cleanup(struct drm_framebuffer *fb)
565 {
566         struct drm_device *dev = fb->dev;
567
568         mutex_lock(&dev->mode_config.fb_lock);
569         list_del(&fb->head);
570         dev->mode_config.num_fb--;
571         mutex_unlock(&dev->mode_config.fb_lock);
572 }
573 EXPORT_SYMBOL(drm_framebuffer_cleanup);
574
575 /**
576  * drm_framebuffer_remove - remove and unreference a framebuffer object
577  * @fb: framebuffer to remove
578  *
579  * Scans all the CRTCs and planes in @dev's mode_config.  If they're
580  * using @fb, removes it, setting it to NULL. Then drops the reference to the
581  * passed-in framebuffer. Might take the modeset locks.
582  *
583  * Note that this function optimizes the cleanup away if the caller holds the
584  * last reference to the framebuffer. It is also guaranteed to not take the
585  * modeset locks in this case.
586  */
587 void drm_framebuffer_remove(struct drm_framebuffer *fb)
588 {
589         struct drm_device *dev;
590         struct drm_crtc *crtc;
591         struct drm_plane *plane;
592
593         if (!fb)
594                 return;
595
596         dev = fb->dev;
597
598         WARN_ON(!list_empty(&fb->filp_head));
599
600         /*
601          * drm ABI mandates that we remove any deleted framebuffers from active
602          * useage. But since most sane clients only remove framebuffers they no
603          * longer need, try to optimize this away.
604          *
605          * Since we're holding a reference ourselves, observing a refcount of 1
606          * means that we're the last holder and can skip it. Also, the refcount
607          * can never increase from 1 again, so we don't need any barriers or
608          * locks.
609          *
610          * Note that userspace could try to race with use and instate a new
611          * usage _after_ we've cleared all current ones. End result will be an
612          * in-use fb with fb-id == 0. Userspace is allowed to shoot its own foot
613          * in this manner.
614          */
615         if (drm_framebuffer_read_refcount(fb) > 1) {
616                 drm_modeset_lock_all(dev);
617                 /* remove from any CRTC */
618                 drm_for_each_crtc(crtc, dev) {
619                         if (crtc->primary->fb == fb) {
620                                 /* should turn off the crtc */
621                                 if (drm_crtc_force_disable(crtc))
622                                         DRM_ERROR("failed to reset crtc %p when fb was deleted\n", crtc);
623                         }
624                 }
625
626                 drm_for_each_plane(plane, dev) {
627                         if (plane->fb == fb)
628                                 drm_plane_force_disable(plane);
629                 }
630                 drm_modeset_unlock_all(dev);
631         }
632
633         drm_framebuffer_unreference(fb);
634 }
635 EXPORT_SYMBOL(drm_framebuffer_remove);
636
637 DEFINE_WW_CLASS(crtc_ww_class);
638
639 static unsigned int drm_num_crtcs(struct drm_device *dev)
640 {
641         unsigned int num = 0;
642         struct drm_crtc *tmp;
643
644         drm_for_each_crtc(tmp, dev) {
645                 num++;
646         }
647
648         return num;
649 }
650
651 static int drm_crtc_register_all(struct drm_device *dev)
652 {
653         struct drm_crtc *crtc;
654         int ret = 0;
655
656         drm_for_each_crtc(crtc, dev) {
657                 if (crtc->funcs->late_register)
658                         ret = crtc->funcs->late_register(crtc);
659                 if (ret)
660                         return ret;
661         }
662
663         return 0;
664 }
665
666 static void drm_crtc_unregister_all(struct drm_device *dev)
667 {
668         struct drm_crtc *crtc;
669
670         drm_for_each_crtc(crtc, dev) {
671                 if (crtc->funcs->early_unregister)
672                         crtc->funcs->early_unregister(crtc);
673         }
674 }
675
676 /**
677  * drm_crtc_init_with_planes - Initialise a new CRTC object with
678  *    specified primary and cursor planes.
679  * @dev: DRM device
680  * @crtc: CRTC object to init
681  * @primary: Primary plane for CRTC
682  * @cursor: Cursor plane for CRTC
683  * @funcs: callbacks for the new CRTC
684  * @name: printf style format string for the CRTC name, or NULL for default name
685  *
686  * Inits a new object created as base part of a driver crtc object.
687  *
688  * Returns:
689  * Zero on success, error code on failure.
690  */
691 int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc,
692                               struct drm_plane *primary,
693                               struct drm_plane *cursor,
694                               const struct drm_crtc_funcs *funcs,
695                               const char *name, ...)
696 {
697         struct drm_mode_config *config = &dev->mode_config;
698         int ret;
699
700         WARN_ON(primary && primary->type != DRM_PLANE_TYPE_PRIMARY);
701         WARN_ON(cursor && cursor->type != DRM_PLANE_TYPE_CURSOR);
702
703         crtc->dev = dev;
704         crtc->funcs = funcs;
705
706         INIT_LIST_HEAD(&crtc->commit_list);
707         spin_lock_init(&crtc->commit_lock);
708
709         drm_modeset_lock_init(&crtc->mutex);
710         ret = drm_mode_object_get(dev, &crtc->base, DRM_MODE_OBJECT_CRTC);
711         if (ret)
712                 return ret;
713
714         if (name) {
715                 va_list ap;
716
717                 va_start(ap, name);
718                 crtc->name = kvasprintf(GFP_KERNEL, name, ap);
719                 va_end(ap);
720         } else {
721                 crtc->name = kasprintf(GFP_KERNEL, "crtc-%d",
722                                        drm_num_crtcs(dev));
723         }
724         if (!crtc->name) {
725                 drm_mode_object_unregister(dev, &crtc->base);
726                 return -ENOMEM;
727         }
728
729         crtc->base.properties = &crtc->properties;
730
731         list_add_tail(&crtc->head, &config->crtc_list);
732         crtc->index = config->num_crtc++;
733
734         crtc->primary = primary;
735         crtc->cursor = cursor;
736         if (primary)
737                 primary->possible_crtcs = 1 << drm_crtc_index(crtc);
738         if (cursor)
739                 cursor->possible_crtcs = 1 << drm_crtc_index(crtc);
740
741         if (drm_core_check_feature(dev, DRIVER_ATOMIC)) {
742                 drm_object_attach_property(&crtc->base, config->prop_active, 0);
743                 drm_object_attach_property(&crtc->base, config->prop_mode_id, 0);
744         }
745
746         return 0;
747 }
748 EXPORT_SYMBOL(drm_crtc_init_with_planes);
749
750 /**
751  * drm_crtc_cleanup - Clean up the core crtc usage
752  * @crtc: CRTC to cleanup
753  *
754  * This function cleans up @crtc and removes it from the DRM mode setting
755  * core. Note that the function does *not* free the crtc structure itself,
756  * this is the responsibility of the caller.
757  */
758 void drm_crtc_cleanup(struct drm_crtc *crtc)
759 {
760         struct drm_device *dev = crtc->dev;
761
762         /* Note that the crtc_list is considered to be static; should we
763          * remove the drm_crtc at runtime we would have to decrement all
764          * the indices on the drm_crtc after us in the crtc_list.
765          */
766
767         kfree(crtc->gamma_store);
768         crtc->gamma_store = NULL;
769
770         drm_modeset_lock_fini(&crtc->mutex);
771
772         drm_mode_object_unregister(dev, &crtc->base);
773         list_del(&crtc->head);
774         dev->mode_config.num_crtc--;
775
776         WARN_ON(crtc->state && !crtc->funcs->atomic_destroy_state);
777         if (crtc->state && crtc->funcs->atomic_destroy_state)
778                 crtc->funcs->atomic_destroy_state(crtc, crtc->state);
779
780         kfree(crtc->name);
781
782         memset(crtc, 0, sizeof(*crtc));
783 }
784 EXPORT_SYMBOL(drm_crtc_cleanup);
785
786 /*
787  * drm_mode_remove - remove and free a mode
788  * @connector: connector list to modify
789  * @mode: mode to remove
790  *
791  * Remove @mode from @connector's mode list, then free it.
792  */
793 static void drm_mode_remove(struct drm_connector *connector,
794                             struct drm_display_mode *mode)
795 {
796         list_del(&mode->head);
797         drm_mode_destroy(connector->dev, mode);
798 }
799
800 /**
801  * drm_display_info_set_bus_formats - set the supported bus formats
802  * @info: display info to store bus formats in
803  * @formats: array containing the supported bus formats
804  * @num_formats: the number of entries in the fmts array
805  *
806  * Store the supported bus formats in display info structure.
807  * See MEDIA_BUS_FMT_* definitions in include/uapi/linux/media-bus-format.h for
808  * a full list of available formats.
809  */
810 int drm_display_info_set_bus_formats(struct drm_display_info *info,
811                                      const u32 *formats,
812                                      unsigned int num_formats)
813 {
814         u32 *fmts = NULL;
815
816         if (!formats && num_formats)
817                 return -EINVAL;
818
819         if (formats && num_formats) {
820                 fmts = kmemdup(formats, sizeof(*formats) * num_formats,
821                                GFP_KERNEL);
822                 if (!fmts)
823                         return -ENOMEM;
824         }
825
826         kfree(info->bus_formats);
827         info->bus_formats = fmts;
828         info->num_bus_formats = num_formats;
829
830         return 0;
831 }
832 EXPORT_SYMBOL(drm_display_info_set_bus_formats);
833
834 /**
835  * drm_connector_get_cmdline_mode - reads the user's cmdline mode
836  * @connector: connector to quwery
837  *
838  * The kernel supports per-connector configration of its consoles through
839  * use of the video= parameter. This function parses that option and
840  * extracts the user's specified mode (or enable/disable status) for a
841  * particular connector. This is typically only used during the early fbdev
842  * setup.
843  */
844 static void drm_connector_get_cmdline_mode(struct drm_connector *connector)
845 {
846         struct drm_cmdline_mode *mode = &connector->cmdline_mode;
847         char *option = NULL;
848
849         if (fb_get_options(connector->name, &option))
850                 return;
851
852         if (!drm_mode_parse_command_line_for_connector(option,
853                                                        connector,
854                                                        mode))
855                 return;
856
857         if (mode->force) {
858                 const char *s;
859
860                 switch (mode->force) {
861                 case DRM_FORCE_OFF:
862                         s = "OFF";
863                         break;
864                 case DRM_FORCE_ON_DIGITAL:
865                         s = "ON - dig";
866                         break;
867                 default:
868                 case DRM_FORCE_ON:
869                         s = "ON";
870                         break;
871                 }
872
873                 DRM_INFO("forcing %s connector %s\n", connector->name, s);
874                 connector->force = mode->force;
875         }
876
877         DRM_DEBUG_KMS("cmdline mode for connector %s %dx%d@%dHz%s%s%s\n",
878                       connector->name,
879                       mode->xres, mode->yres,
880                       mode->refresh_specified ? mode->refresh : 60,
881                       mode->rb ? " reduced blanking" : "",
882                       mode->margins ? " with margins" : "",
883                       mode->interlace ?  " interlaced" : "");
884 }
885
886 static void drm_connector_free(struct kref *kref)
887 {
888         struct drm_connector *connector =
889                 container_of(kref, struct drm_connector, base.refcount);
890         struct drm_device *dev = connector->dev;
891
892         drm_mode_object_unregister(dev, &connector->base);
893         connector->funcs->destroy(connector);
894 }
895
896 /**
897  * drm_connector_init - Init a preallocated connector
898  * @dev: DRM device
899  * @connector: the connector to init
900  * @funcs: callbacks for this connector
901  * @connector_type: user visible type of the connector
902  *
903  * Initialises a preallocated connector. Connectors should be
904  * subclassed as part of driver connector objects.
905  *
906  * Returns:
907  * Zero on success, error code on failure.
908  */
909 int drm_connector_init(struct drm_device *dev,
910                        struct drm_connector *connector,
911                        const struct drm_connector_funcs *funcs,
912                        int connector_type)
913 {
914         struct drm_mode_config *config = &dev->mode_config;
915         int ret;
916         struct ida *connector_ida =
917                 &drm_connector_enum_list[connector_type].ida;
918
919         drm_modeset_lock_all(dev);
920
921         ret = drm_mode_object_get_reg(dev, &connector->base,
922                                       DRM_MODE_OBJECT_CONNECTOR,
923                                       false, drm_connector_free);
924         if (ret)
925                 goto out_unlock;
926
927         connector->base.properties = &connector->properties;
928         connector->dev = dev;
929         connector->funcs = funcs;
930
931         ret = ida_simple_get(&config->connector_ida, 0, 0, GFP_KERNEL);
932         if (ret < 0)
933                 goto out_put;
934         connector->index = ret;
935         ret = 0;
936
937         connector->connector_type = connector_type;
938         connector->connector_type_id =
939                 ida_simple_get(connector_ida, 1, 0, GFP_KERNEL);
940         if (connector->connector_type_id < 0) {
941                 ret = connector->connector_type_id;
942                 goto out_put_id;
943         }
944         connector->name =
945                 kasprintf(GFP_KERNEL, "%s-%d",
946                           drm_connector_enum_list[connector_type].name,
947                           connector->connector_type_id);
948         if (!connector->name) {
949                 ret = -ENOMEM;
950                 goto out_put_type_id;
951         }
952
953         INIT_LIST_HEAD(&connector->probed_modes);
954         INIT_LIST_HEAD(&connector->modes);
955         connector->edid_blob_ptr = NULL;
956         connector->status = connector_status_unknown;
957
958         drm_connector_get_cmdline_mode(connector);
959
960         /* We should add connectors at the end to avoid upsetting the connector
961          * index too much. */
962         list_add_tail(&connector->head, &config->connector_list);
963         config->num_connector++;
964
965         if (connector_type != DRM_MODE_CONNECTOR_VIRTUAL)
966                 drm_object_attach_property(&connector->base,
967                                               config->edid_property,
968                                               0);
969
970         drm_object_attach_property(&connector->base,
971                                       config->dpms_property, 0);
972
973         if (drm_core_check_feature(dev, DRIVER_ATOMIC)) {
974                 drm_object_attach_property(&connector->base, config->prop_crtc_id, 0);
975         }
976
977         connector->debugfs_entry = NULL;
978 out_put_type_id:
979         if (ret)
980                 ida_remove(connector_ida, connector->connector_type_id);
981 out_put_id:
982         if (ret)
983                 ida_remove(&config->connector_ida, connector->index);
984 out_put:
985         if (ret)
986                 drm_mode_object_unregister(dev, &connector->base);
987
988 out_unlock:
989         drm_modeset_unlock_all(dev);
990
991         return ret;
992 }
993 EXPORT_SYMBOL(drm_connector_init);
994
995 /**
996  * drm_connector_cleanup - cleans up an initialised connector
997  * @connector: connector to cleanup
998  *
999  * Cleans up the connector but doesn't free the object.
1000  */
1001 void drm_connector_cleanup(struct drm_connector *connector)
1002 {
1003         struct drm_device *dev = connector->dev;
1004         struct drm_display_mode *mode, *t;
1005
1006         /* The connector should have been removed from userspace long before
1007          * it is finally destroyed.
1008          */
1009         if (WARN_ON(connector->registered))
1010                 drm_connector_unregister(connector);
1011
1012         if (connector->tile_group) {
1013                 drm_mode_put_tile_group(dev, connector->tile_group);
1014                 connector->tile_group = NULL;
1015         }
1016
1017         list_for_each_entry_safe(mode, t, &connector->probed_modes, head)
1018                 drm_mode_remove(connector, mode);
1019
1020         list_for_each_entry_safe(mode, t, &connector->modes, head)
1021                 drm_mode_remove(connector, mode);
1022
1023         ida_remove(&drm_connector_enum_list[connector->connector_type].ida,
1024                    connector->connector_type_id);
1025
1026         ida_remove(&dev->mode_config.connector_ida,
1027                    connector->index);
1028
1029         kfree(connector->display_info.bus_formats);
1030         drm_mode_object_unregister(dev, &connector->base);
1031         kfree(connector->name);
1032         connector->name = NULL;
1033         list_del(&connector->head);
1034         dev->mode_config.num_connector--;
1035
1036         WARN_ON(connector->state && !connector->funcs->atomic_destroy_state);
1037         if (connector->state && connector->funcs->atomic_destroy_state)
1038                 connector->funcs->atomic_destroy_state(connector,
1039                                                        connector->state);
1040
1041         memset(connector, 0, sizeof(*connector));
1042 }
1043 EXPORT_SYMBOL(drm_connector_cleanup);
1044
1045 /**
1046  * drm_connector_register - register a connector
1047  * @connector: the connector to register
1048  *
1049  * Register userspace interfaces for a connector
1050  *
1051  * Returns:
1052  * Zero on success, error code on failure.
1053  */
1054 int drm_connector_register(struct drm_connector *connector)
1055 {
1056         int ret;
1057
1058         if (connector->registered)
1059                 return 0;
1060
1061         ret = drm_sysfs_connector_add(connector);
1062         if (ret)
1063                 return ret;
1064
1065         ret = drm_debugfs_connector_add(connector);
1066         if (ret) {
1067                 goto err_sysfs;
1068         }
1069
1070         if (connector->funcs->late_register) {
1071                 ret = connector->funcs->late_register(connector);
1072                 if (ret)
1073                         goto err_debugfs;
1074         }
1075
1076         drm_mode_object_register(connector->dev, &connector->base);
1077
1078         connector->registered = true;
1079         return 0;
1080
1081 err_debugfs:
1082         drm_debugfs_connector_remove(connector);
1083 err_sysfs:
1084         drm_sysfs_connector_remove(connector);
1085         return ret;
1086 }
1087 EXPORT_SYMBOL(drm_connector_register);
1088
1089 /**
1090  * drm_connector_unregister - unregister a connector
1091  * @connector: the connector to unregister
1092  *
1093  * Unregister userspace interfaces for a connector
1094  */
1095 void drm_connector_unregister(struct drm_connector *connector)
1096 {
1097         if (!connector->registered)
1098                 return;
1099
1100         if (connector->funcs->early_unregister)
1101                 connector->funcs->early_unregister(connector);
1102
1103         drm_sysfs_connector_remove(connector);
1104         drm_debugfs_connector_remove(connector);
1105
1106         connector->registered = false;
1107 }
1108 EXPORT_SYMBOL(drm_connector_unregister);
1109
1110 static void drm_connector_unregister_all(struct drm_device *dev)
1111 {
1112         struct drm_connector *connector;
1113
1114         /* FIXME: taking the mode config mutex ends up in a clash with sysfs */
1115         list_for_each_entry(connector, &dev->mode_config.connector_list, head)
1116                 drm_connector_unregister(connector);
1117 }
1118
1119 static int drm_connector_register_all(struct drm_device *dev)
1120 {
1121         struct drm_connector *connector;
1122         int ret;
1123
1124         /* FIXME: taking the mode config mutex ends up in a clash with
1125          * fbcon/backlight registration */
1126         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1127                 ret = drm_connector_register(connector);
1128                 if (ret)
1129                         goto err;
1130         }
1131
1132         return 0;
1133
1134 err:
1135         mutex_unlock(&dev->mode_config.mutex);
1136         drm_connector_unregister_all(dev);
1137         return ret;
1138 }
1139
1140 static int drm_encoder_register_all(struct drm_device *dev)
1141 {
1142         struct drm_encoder *encoder;
1143         int ret = 0;
1144
1145         drm_for_each_encoder(encoder, dev) {
1146                 if (encoder->funcs->late_register)
1147                         ret = encoder->funcs->late_register(encoder);
1148                 if (ret)
1149                         return ret;
1150         }
1151
1152         return 0;
1153 }
1154
1155 static void drm_encoder_unregister_all(struct drm_device *dev)
1156 {
1157         struct drm_encoder *encoder;
1158
1159         drm_for_each_encoder(encoder, dev) {
1160                 if (encoder->funcs->early_unregister)
1161                         encoder->funcs->early_unregister(encoder);
1162         }
1163 }
1164
1165 /**
1166  * drm_encoder_init - Init a preallocated encoder
1167  * @dev: drm device
1168  * @encoder: the encoder to init
1169  * @funcs: callbacks for this encoder
1170  * @encoder_type: user visible type of the encoder
1171  * @name: printf style format string for the encoder name, or NULL for default name
1172  *
1173  * Initialises a preallocated encoder. Encoder should be
1174  * subclassed as part of driver encoder objects.
1175  *
1176  * Returns:
1177  * Zero on success, error code on failure.
1178  */
1179 int drm_encoder_init(struct drm_device *dev,
1180                       struct drm_encoder *encoder,
1181                       const struct drm_encoder_funcs *funcs,
1182                       int encoder_type, const char *name, ...)
1183 {
1184         int ret;
1185
1186         drm_modeset_lock_all(dev);
1187
1188         ret = drm_mode_object_get(dev, &encoder->base, DRM_MODE_OBJECT_ENCODER);
1189         if (ret)
1190                 goto out_unlock;
1191
1192         encoder->dev = dev;
1193         encoder->encoder_type = encoder_type;
1194         encoder->funcs = funcs;
1195         if (name) {
1196                 va_list ap;
1197
1198                 va_start(ap, name);
1199                 encoder->name = kvasprintf(GFP_KERNEL, name, ap);
1200                 va_end(ap);
1201         } else {
1202                 encoder->name = kasprintf(GFP_KERNEL, "%s-%d",
1203                                           drm_encoder_enum_list[encoder_type].name,
1204                                           encoder->base.id);
1205         }
1206         if (!encoder->name) {
1207                 ret = -ENOMEM;
1208                 goto out_put;
1209         }
1210
1211         list_add_tail(&encoder->head, &dev->mode_config.encoder_list);
1212         encoder->index = dev->mode_config.num_encoder++;
1213
1214 out_put:
1215         if (ret)
1216                 drm_mode_object_unregister(dev, &encoder->base);
1217
1218 out_unlock:
1219         drm_modeset_unlock_all(dev);
1220
1221         return ret;
1222 }
1223 EXPORT_SYMBOL(drm_encoder_init);
1224
1225 /**
1226  * drm_encoder_cleanup - cleans up an initialised encoder
1227  * @encoder: encoder to cleanup
1228  *
1229  * Cleans up the encoder but doesn't free the object.
1230  */
1231 void drm_encoder_cleanup(struct drm_encoder *encoder)
1232 {
1233         struct drm_device *dev = encoder->dev;
1234
1235         /* Note that the encoder_list is considered to be static; should we
1236          * remove the drm_encoder at runtime we would have to decrement all
1237          * the indices on the drm_encoder after us in the encoder_list.
1238          */
1239
1240         drm_modeset_lock_all(dev);
1241         drm_mode_object_unregister(dev, &encoder->base);
1242         kfree(encoder->name);
1243         list_del(&encoder->head);
1244         dev->mode_config.num_encoder--;
1245         drm_modeset_unlock_all(dev);
1246
1247         memset(encoder, 0, sizeof(*encoder));
1248 }
1249 EXPORT_SYMBOL(drm_encoder_cleanup);
1250
1251 static unsigned int drm_num_planes(struct drm_device *dev)
1252 {
1253         unsigned int num = 0;
1254         struct drm_plane *tmp;
1255
1256         drm_for_each_plane(tmp, dev) {
1257                 num++;
1258         }
1259
1260         return num;
1261 }
1262
1263 /**
1264  * drm_universal_plane_init - Initialize a new universal plane object
1265  * @dev: DRM device
1266  * @plane: plane object to init
1267  * @possible_crtcs: bitmask of possible CRTCs
1268  * @funcs: callbacks for the new plane
1269  * @formats: array of supported formats (%DRM_FORMAT_*)
1270  * @format_count: number of elements in @formats
1271  * @type: type of plane (overlay, primary, cursor)
1272  * @name: printf style format string for the plane name, or NULL for default name
1273  *
1274  * Initializes a plane object of type @type.
1275  *
1276  * Returns:
1277  * Zero on success, error code on failure.
1278  */
1279 int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane,
1280                              unsigned long possible_crtcs,
1281                              const struct drm_plane_funcs *funcs,
1282                              const uint32_t *formats, unsigned int format_count,
1283                              enum drm_plane_type type,
1284                              const char *name, ...)
1285 {
1286         struct drm_mode_config *config = &dev->mode_config;
1287         int ret;
1288
1289         ret = drm_mode_object_get(dev, &plane->base, DRM_MODE_OBJECT_PLANE);
1290         if (ret)
1291                 return ret;
1292
1293         drm_modeset_lock_init(&plane->mutex);
1294
1295         plane->base.properties = &plane->properties;
1296         plane->dev = dev;
1297         plane->funcs = funcs;
1298         plane->format_types = kmalloc_array(format_count, sizeof(uint32_t),
1299                                             GFP_KERNEL);
1300         if (!plane->format_types) {
1301                 DRM_DEBUG_KMS("out of memory when allocating plane\n");
1302                 drm_mode_object_unregister(dev, &plane->base);
1303                 return -ENOMEM;
1304         }
1305
1306         if (name) {
1307                 va_list ap;
1308
1309                 va_start(ap, name);
1310                 plane->name = kvasprintf(GFP_KERNEL, name, ap);
1311                 va_end(ap);
1312         } else {
1313                 plane->name = kasprintf(GFP_KERNEL, "plane-%d",
1314                                         drm_num_planes(dev));
1315         }
1316         if (!plane->name) {
1317                 kfree(plane->format_types);
1318                 drm_mode_object_unregister(dev, &plane->base);
1319                 return -ENOMEM;
1320         }
1321
1322         memcpy(plane->format_types, formats, format_count * sizeof(uint32_t));
1323         plane->format_count = format_count;
1324         plane->possible_crtcs = possible_crtcs;
1325         plane->type = type;
1326
1327         list_add_tail(&plane->head, &config->plane_list);
1328         plane->index = config->num_total_plane++;
1329         if (plane->type == DRM_PLANE_TYPE_OVERLAY)
1330                 config->num_overlay_plane++;
1331
1332         drm_object_attach_property(&plane->base,
1333                                    config->plane_type_property,
1334                                    plane->type);
1335
1336         if (drm_core_check_feature(dev, DRIVER_ATOMIC)) {
1337                 drm_object_attach_property(&plane->base, config->prop_fb_id, 0);
1338                 drm_object_attach_property(&plane->base, config->prop_crtc_id, 0);
1339                 drm_object_attach_property(&plane->base, config->prop_crtc_x, 0);
1340                 drm_object_attach_property(&plane->base, config->prop_crtc_y, 0);
1341                 drm_object_attach_property(&plane->base, config->prop_crtc_w, 0);
1342                 drm_object_attach_property(&plane->base, config->prop_crtc_h, 0);
1343                 drm_object_attach_property(&plane->base, config->prop_src_x, 0);
1344                 drm_object_attach_property(&plane->base, config->prop_src_y, 0);
1345                 drm_object_attach_property(&plane->base, config->prop_src_w, 0);
1346                 drm_object_attach_property(&plane->base, config->prop_src_h, 0);
1347         }
1348
1349         return 0;
1350 }
1351 EXPORT_SYMBOL(drm_universal_plane_init);
1352
1353 static int drm_plane_register_all(struct drm_device *dev)
1354 {
1355         struct drm_plane *plane;
1356         int ret = 0;
1357
1358         drm_for_each_plane(plane, dev) {
1359                 if (plane->funcs->late_register)
1360                         ret = plane->funcs->late_register(plane);
1361                 if (ret)
1362                         return ret;
1363         }
1364
1365         return 0;
1366 }
1367
1368 static void drm_plane_unregister_all(struct drm_device *dev)
1369 {
1370         struct drm_plane *plane;
1371
1372         drm_for_each_plane(plane, dev) {
1373                 if (plane->funcs->early_unregister)
1374                         plane->funcs->early_unregister(plane);
1375         }
1376 }
1377
1378 /**
1379  * drm_plane_init - Initialize a legacy plane
1380  * @dev: DRM device
1381  * @plane: plane object to init
1382  * @possible_crtcs: bitmask of possible CRTCs
1383  * @funcs: callbacks for the new plane
1384  * @formats: array of supported formats (%DRM_FORMAT_*)
1385  * @format_count: number of elements in @formats
1386  * @is_primary: plane type (primary vs overlay)
1387  *
1388  * Legacy API to initialize a DRM plane.
1389  *
1390  * New drivers should call drm_universal_plane_init() instead.
1391  *
1392  * Returns:
1393  * Zero on success, error code on failure.
1394  */
1395 int drm_plane_init(struct drm_device *dev, struct drm_plane *plane,
1396                    unsigned long possible_crtcs,
1397                    const struct drm_plane_funcs *funcs,
1398                    const uint32_t *formats, unsigned int format_count,
1399                    bool is_primary)
1400 {
1401         enum drm_plane_type type;
1402
1403         type = is_primary ? DRM_PLANE_TYPE_PRIMARY : DRM_PLANE_TYPE_OVERLAY;
1404         return drm_universal_plane_init(dev, plane, possible_crtcs, funcs,
1405                                         formats, format_count, type, NULL);
1406 }
1407 EXPORT_SYMBOL(drm_plane_init);
1408
1409 /**
1410  * drm_plane_cleanup - Clean up the core plane usage
1411  * @plane: plane to cleanup
1412  *
1413  * This function cleans up @plane and removes it from the DRM mode setting
1414  * core. Note that the function does *not* free the plane structure itself,
1415  * this is the responsibility of the caller.
1416  */
1417 void drm_plane_cleanup(struct drm_plane *plane)
1418 {
1419         struct drm_device *dev = plane->dev;
1420
1421         drm_modeset_lock_all(dev);
1422         kfree(plane->format_types);
1423         drm_mode_object_unregister(dev, &plane->base);
1424
1425         BUG_ON(list_empty(&plane->head));
1426
1427         /* Note that the plane_list is considered to be static; should we
1428          * remove the drm_plane at runtime we would have to decrement all
1429          * the indices on the drm_plane after us in the plane_list.
1430          */
1431
1432         list_del(&plane->head);
1433         dev->mode_config.num_total_plane--;
1434         if (plane->type == DRM_PLANE_TYPE_OVERLAY)
1435                 dev->mode_config.num_overlay_plane--;
1436         drm_modeset_unlock_all(dev);
1437
1438         WARN_ON(plane->state && !plane->funcs->atomic_destroy_state);
1439         if (plane->state && plane->funcs->atomic_destroy_state)
1440                 plane->funcs->atomic_destroy_state(plane, plane->state);
1441
1442         kfree(plane->name);
1443
1444         memset(plane, 0, sizeof(*plane));
1445 }
1446 EXPORT_SYMBOL(drm_plane_cleanup);
1447
1448 /**
1449  * drm_plane_from_index - find the registered plane at an index
1450  * @dev: DRM device
1451  * @idx: index of registered plane to find for
1452  *
1453  * Given a plane index, return the registered plane from DRM device's
1454  * list of planes with matching index.
1455  */
1456 struct drm_plane *
1457 drm_plane_from_index(struct drm_device *dev, int idx)
1458 {
1459         struct drm_plane *plane;
1460
1461         drm_for_each_plane(plane, dev)
1462                 if (idx == plane->index)
1463                         return plane;
1464
1465         return NULL;
1466 }
1467 EXPORT_SYMBOL(drm_plane_from_index);
1468
1469 /**
1470  * drm_plane_force_disable - Forcibly disable a plane
1471  * @plane: plane to disable
1472  *
1473  * Forces the plane to be disabled.
1474  *
1475  * Used when the plane's current framebuffer is destroyed,
1476  * and when restoring fbdev mode.
1477  */
1478 void drm_plane_force_disable(struct drm_plane *plane)
1479 {
1480         int ret;
1481
1482         if (!plane->fb)
1483                 return;
1484
1485         plane->old_fb = plane->fb;
1486         ret = plane->funcs->disable_plane(plane);
1487         if (ret) {
1488                 DRM_ERROR("failed to disable plane with busy fb\n");
1489                 plane->old_fb = NULL;
1490                 return;
1491         }
1492         /* disconnect the plane from the fb and crtc: */
1493         drm_framebuffer_unreference(plane->old_fb);
1494         plane->old_fb = NULL;
1495         plane->fb = NULL;
1496         plane->crtc = NULL;
1497 }
1498 EXPORT_SYMBOL(drm_plane_force_disable);
1499
1500 int drm_modeset_register_all(struct drm_device *dev)
1501 {
1502         int ret;
1503
1504         ret = drm_plane_register_all(dev);
1505         if (ret)
1506                 goto err_plane;
1507
1508         ret = drm_crtc_register_all(dev);
1509         if  (ret)
1510                 goto err_crtc;
1511
1512         ret = drm_encoder_register_all(dev);
1513         if (ret)
1514                 goto err_encoder;
1515
1516         ret = drm_connector_register_all(dev);
1517         if (ret)
1518                 goto err_connector;
1519
1520         return 0;
1521
1522 err_connector:
1523         drm_encoder_unregister_all(dev);
1524 err_encoder:
1525         drm_crtc_unregister_all(dev);
1526 err_crtc:
1527         drm_plane_unregister_all(dev);
1528 err_plane:
1529         return ret;
1530 }
1531
1532 void drm_modeset_unregister_all(struct drm_device *dev)
1533 {
1534         drm_connector_unregister_all(dev);
1535         drm_encoder_unregister_all(dev);
1536         drm_crtc_unregister_all(dev);
1537         drm_plane_unregister_all(dev);
1538 }
1539
1540 static int drm_mode_create_standard_properties(struct drm_device *dev)
1541 {
1542         struct drm_property *prop;
1543
1544         /*
1545          * Standard properties (apply to all connectors)
1546          */
1547         prop = drm_property_create(dev, DRM_MODE_PROP_BLOB |
1548                                    DRM_MODE_PROP_IMMUTABLE,
1549                                    "EDID", 0);
1550         if (!prop)
1551                 return -ENOMEM;
1552         dev->mode_config.edid_property = prop;
1553
1554         prop = drm_property_create_enum(dev, 0,
1555                                    "DPMS", drm_dpms_enum_list,
1556                                    ARRAY_SIZE(drm_dpms_enum_list));
1557         if (!prop)
1558                 return -ENOMEM;
1559         dev->mode_config.dpms_property = prop;
1560
1561         prop = drm_property_create(dev,
1562                                    DRM_MODE_PROP_BLOB |
1563                                    DRM_MODE_PROP_IMMUTABLE,
1564                                    "PATH", 0);
1565         if (!prop)
1566                 return -ENOMEM;
1567         dev->mode_config.path_property = prop;
1568
1569         prop = drm_property_create(dev,
1570                                    DRM_MODE_PROP_BLOB |
1571                                    DRM_MODE_PROP_IMMUTABLE,
1572                                    "TILE", 0);
1573         if (!prop)
1574                 return -ENOMEM;
1575         dev->mode_config.tile_property = prop;
1576
1577         prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
1578                                         "type", drm_plane_type_enum_list,
1579                                         ARRAY_SIZE(drm_plane_type_enum_list));
1580         if (!prop)
1581                 return -ENOMEM;
1582         dev->mode_config.plane_type_property = prop;
1583
1584         prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
1585                         "SRC_X", 0, UINT_MAX);
1586         if (!prop)
1587                 return -ENOMEM;
1588         dev->mode_config.prop_src_x = prop;
1589
1590         prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
1591                         "SRC_Y", 0, UINT_MAX);
1592         if (!prop)
1593                 return -ENOMEM;
1594         dev->mode_config.prop_src_y = prop;
1595
1596         prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
1597                         "SRC_W", 0, UINT_MAX);
1598         if (!prop)
1599                 return -ENOMEM;
1600         dev->mode_config.prop_src_w = prop;
1601
1602         prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
1603                         "SRC_H", 0, UINT_MAX);
1604         if (!prop)
1605                 return -ENOMEM;
1606         dev->mode_config.prop_src_h = prop;
1607
1608         prop = drm_property_create_signed_range(dev, DRM_MODE_PROP_ATOMIC,
1609                         "CRTC_X", INT_MIN, INT_MAX);
1610         if (!prop)
1611                 return -ENOMEM;
1612         dev->mode_config.prop_crtc_x = prop;
1613
1614         prop = drm_property_create_signed_range(dev, DRM_MODE_PROP_ATOMIC,
1615                         "CRTC_Y", INT_MIN, INT_MAX);
1616         if (!prop)
1617                 return -ENOMEM;
1618         dev->mode_config.prop_crtc_y = prop;
1619
1620         prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
1621                         "CRTC_W", 0, INT_MAX);
1622         if (!prop)
1623                 return -ENOMEM;
1624         dev->mode_config.prop_crtc_w = prop;
1625
1626         prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
1627                         "CRTC_H", 0, INT_MAX);
1628         if (!prop)
1629                 return -ENOMEM;
1630         dev->mode_config.prop_crtc_h = prop;
1631
1632         prop = drm_property_create_object(dev, DRM_MODE_PROP_ATOMIC,
1633                         "FB_ID", DRM_MODE_OBJECT_FB);
1634         if (!prop)
1635                 return -ENOMEM;
1636         dev->mode_config.prop_fb_id = prop;
1637
1638         prop = drm_property_create_object(dev, DRM_MODE_PROP_ATOMIC,
1639                         "CRTC_ID", DRM_MODE_OBJECT_CRTC);
1640         if (!prop)
1641                 return -ENOMEM;
1642         dev->mode_config.prop_crtc_id = prop;
1643
1644         prop = drm_property_create_bool(dev, DRM_MODE_PROP_ATOMIC,
1645                         "ACTIVE");
1646         if (!prop)
1647                 return -ENOMEM;
1648         dev->mode_config.prop_active = prop;
1649
1650         prop = drm_property_create(dev,
1651                         DRM_MODE_PROP_ATOMIC | DRM_MODE_PROP_BLOB,
1652                         "MODE_ID", 0);
1653         if (!prop)
1654                 return -ENOMEM;
1655         dev->mode_config.prop_mode_id = prop;
1656
1657         prop = drm_property_create(dev,
1658                         DRM_MODE_PROP_BLOB,
1659                         "DEGAMMA_LUT", 0);
1660         if (!prop)
1661                 return -ENOMEM;
1662         dev->mode_config.degamma_lut_property = prop;
1663
1664         prop = drm_property_create_range(dev,
1665                         DRM_MODE_PROP_IMMUTABLE,
1666                         "DEGAMMA_LUT_SIZE", 0, UINT_MAX);
1667         if (!prop)
1668                 return -ENOMEM;
1669         dev->mode_config.degamma_lut_size_property = prop;
1670
1671         prop = drm_property_create(dev,
1672                         DRM_MODE_PROP_BLOB,
1673                         "CTM", 0);
1674         if (!prop)
1675                 return -ENOMEM;
1676         dev->mode_config.ctm_property = prop;
1677
1678         prop = drm_property_create(dev,
1679                         DRM_MODE_PROP_BLOB,
1680                         "GAMMA_LUT", 0);
1681         if (!prop)
1682                 return -ENOMEM;
1683         dev->mode_config.gamma_lut_property = prop;
1684
1685         prop = drm_property_create_range(dev,
1686                         DRM_MODE_PROP_IMMUTABLE,
1687                         "GAMMA_LUT_SIZE", 0, UINT_MAX);
1688         if (!prop)
1689                 return -ENOMEM;
1690         dev->mode_config.gamma_lut_size_property = prop;
1691
1692         return 0;
1693 }
1694
1695 /**
1696  * drm_mode_create_dvi_i_properties - create DVI-I specific connector properties
1697  * @dev: DRM device
1698  *
1699  * Called by a driver the first time a DVI-I connector is made.
1700  */
1701 int drm_mode_create_dvi_i_properties(struct drm_device *dev)
1702 {
1703         struct drm_property *dvi_i_selector;
1704         struct drm_property *dvi_i_subconnector;
1705
1706         if (dev->mode_config.dvi_i_select_subconnector_property)
1707                 return 0;
1708
1709         dvi_i_selector =
1710                 drm_property_create_enum(dev, 0,
1711                                     "select subconnector",
1712                                     drm_dvi_i_select_enum_list,
1713                                     ARRAY_SIZE(drm_dvi_i_select_enum_list));
1714         dev->mode_config.dvi_i_select_subconnector_property = dvi_i_selector;
1715
1716         dvi_i_subconnector = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
1717                                     "subconnector",
1718                                     drm_dvi_i_subconnector_enum_list,
1719                                     ARRAY_SIZE(drm_dvi_i_subconnector_enum_list));
1720         dev->mode_config.dvi_i_subconnector_property = dvi_i_subconnector;
1721
1722         return 0;
1723 }
1724 EXPORT_SYMBOL(drm_mode_create_dvi_i_properties);
1725
1726 /**
1727  * drm_create_tv_properties - create TV specific connector properties
1728  * @dev: DRM device
1729  * @num_modes: number of different TV formats (modes) supported
1730  * @modes: array of pointers to strings containing name of each format
1731  *
1732  * Called by a driver's TV initialization routine, this function creates
1733  * the TV specific connector properties for a given device.  Caller is
1734  * responsible for allocating a list of format names and passing them to
1735  * this routine.
1736  */
1737 int drm_mode_create_tv_properties(struct drm_device *dev,
1738                                   unsigned int num_modes,
1739                                   const char * const modes[])
1740 {
1741         struct drm_property *tv_selector;
1742         struct drm_property *tv_subconnector;
1743         unsigned int i;
1744
1745         if (dev->mode_config.tv_select_subconnector_property)
1746                 return 0;
1747
1748         /*
1749          * Basic connector properties
1750          */
1751         tv_selector = drm_property_create_enum(dev, 0,
1752                                           "select subconnector",
1753                                           drm_tv_select_enum_list,
1754                                           ARRAY_SIZE(drm_tv_select_enum_list));
1755         if (!tv_selector)
1756                 goto nomem;
1757
1758         dev->mode_config.tv_select_subconnector_property = tv_selector;
1759
1760         tv_subconnector =
1761                 drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
1762                                     "subconnector",
1763                                     drm_tv_subconnector_enum_list,
1764                                     ARRAY_SIZE(drm_tv_subconnector_enum_list));
1765         if (!tv_subconnector)
1766                 goto nomem;
1767         dev->mode_config.tv_subconnector_property = tv_subconnector;
1768
1769         /*
1770          * Other, TV specific properties: margins & TV modes.
1771          */
1772         dev->mode_config.tv_left_margin_property =
1773                 drm_property_create_range(dev, 0, "left margin", 0, 100);
1774         if (!dev->mode_config.tv_left_margin_property)
1775                 goto nomem;
1776
1777         dev->mode_config.tv_right_margin_property =
1778                 drm_property_create_range(dev, 0, "right margin", 0, 100);
1779         if (!dev->mode_config.tv_right_margin_property)
1780                 goto nomem;
1781
1782         dev->mode_config.tv_top_margin_property =
1783                 drm_property_create_range(dev, 0, "top margin", 0, 100);
1784         if (!dev->mode_config.tv_top_margin_property)
1785                 goto nomem;
1786
1787         dev->mode_config.tv_bottom_margin_property =
1788                 drm_property_create_range(dev, 0, "bottom margin", 0, 100);
1789         if (!dev->mode_config.tv_bottom_margin_property)
1790                 goto nomem;
1791
1792         dev->mode_config.tv_mode_property =
1793                 drm_property_create(dev, DRM_MODE_PROP_ENUM,
1794                                     "mode", num_modes);
1795         if (!dev->mode_config.tv_mode_property)
1796                 goto nomem;
1797
1798         for (i = 0; i < num_modes; i++)
1799                 drm_property_add_enum(dev->mode_config.tv_mode_property, i,
1800                                       i, modes[i]);
1801
1802         dev->mode_config.tv_brightness_property =
1803                 drm_property_create_range(dev, 0, "brightness", 0, 100);
1804         if (!dev->mode_config.tv_brightness_property)
1805                 goto nomem;
1806
1807         dev->mode_config.tv_contrast_property =
1808                 drm_property_create_range(dev, 0, "contrast", 0, 100);
1809         if (!dev->mode_config.tv_contrast_property)
1810                 goto nomem;
1811
1812         dev->mode_config.tv_flicker_reduction_property =
1813                 drm_property_create_range(dev, 0, "flicker reduction", 0, 100);
1814         if (!dev->mode_config.tv_flicker_reduction_property)
1815                 goto nomem;
1816
1817         dev->mode_config.tv_overscan_property =
1818                 drm_property_create_range(dev, 0, "overscan", 0, 100);
1819         if (!dev->mode_config.tv_overscan_property)
1820                 goto nomem;
1821
1822         dev->mode_config.tv_saturation_property =
1823                 drm_property_create_range(dev, 0, "saturation", 0, 100);
1824         if (!dev->mode_config.tv_saturation_property)
1825                 goto nomem;
1826
1827         dev->mode_config.tv_hue_property =
1828                 drm_property_create_range(dev, 0, "hue", 0, 100);
1829         if (!dev->mode_config.tv_hue_property)
1830                 goto nomem;
1831
1832         return 0;
1833 nomem:
1834         return -ENOMEM;
1835 }
1836 EXPORT_SYMBOL(drm_mode_create_tv_properties);
1837
1838 /**
1839  * drm_mode_create_scaling_mode_property - create scaling mode property
1840  * @dev: DRM device
1841  *
1842  * Called by a driver the first time it's needed, must be attached to desired
1843  * connectors.
1844  */
1845 int drm_mode_create_scaling_mode_property(struct drm_device *dev)
1846 {
1847         struct drm_property *scaling_mode;
1848
1849         if (dev->mode_config.scaling_mode_property)
1850                 return 0;
1851
1852         scaling_mode =
1853                 drm_property_create_enum(dev, 0, "scaling mode",
1854                                 drm_scaling_mode_enum_list,
1855                                     ARRAY_SIZE(drm_scaling_mode_enum_list));
1856
1857         dev->mode_config.scaling_mode_property = scaling_mode;
1858
1859         return 0;
1860 }
1861 EXPORT_SYMBOL(drm_mode_create_scaling_mode_property);
1862
1863 /**
1864  * drm_mode_create_aspect_ratio_property - create aspect ratio property
1865  * @dev: DRM device
1866  *
1867  * Called by a driver the first time it's needed, must be attached to desired
1868  * connectors.
1869  *
1870  * Returns:
1871  * Zero on success, negative errno on failure.
1872  */
1873 int drm_mode_create_aspect_ratio_property(struct drm_device *dev)
1874 {
1875         if (dev->mode_config.aspect_ratio_property)
1876                 return 0;
1877
1878         dev->mode_config.aspect_ratio_property =
1879                 drm_property_create_enum(dev, 0, "aspect ratio",
1880                                 drm_aspect_ratio_enum_list,
1881                                 ARRAY_SIZE(drm_aspect_ratio_enum_list));
1882
1883         if (dev->mode_config.aspect_ratio_property == NULL)
1884                 return -ENOMEM;
1885
1886         return 0;
1887 }
1888 EXPORT_SYMBOL(drm_mode_create_aspect_ratio_property);
1889
1890 /**
1891  * drm_mode_create_dirty_property - create dirty property
1892  * @dev: DRM device
1893  *
1894  * Called by a driver the first time it's needed, must be attached to desired
1895  * connectors.
1896  */
1897 int drm_mode_create_dirty_info_property(struct drm_device *dev)
1898 {
1899         struct drm_property *dirty_info;
1900
1901         if (dev->mode_config.dirty_info_property)
1902                 return 0;
1903
1904         dirty_info =
1905                 drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
1906                                     "dirty",
1907                                     drm_dirty_info_enum_list,
1908                                     ARRAY_SIZE(drm_dirty_info_enum_list));
1909         dev->mode_config.dirty_info_property = dirty_info;
1910
1911         return 0;
1912 }
1913 EXPORT_SYMBOL(drm_mode_create_dirty_info_property);
1914
1915 /**
1916  * drm_mode_create_suggested_offset_properties - create suggests offset properties
1917  * @dev: DRM device
1918  *
1919  * Create the the suggested x/y offset property for connectors.
1920  */
1921 int drm_mode_create_suggested_offset_properties(struct drm_device *dev)
1922 {
1923         if (dev->mode_config.suggested_x_property && dev->mode_config.suggested_y_property)
1924                 return 0;
1925
1926         dev->mode_config.suggested_x_property =
1927                 drm_property_create_range(dev, DRM_MODE_PROP_IMMUTABLE, "suggested X", 0, 0xffffffff);
1928
1929         dev->mode_config.suggested_y_property =
1930                 drm_property_create_range(dev, DRM_MODE_PROP_IMMUTABLE, "suggested Y", 0, 0xffffffff);
1931
1932         if (dev->mode_config.suggested_x_property == NULL ||
1933             dev->mode_config.suggested_y_property == NULL)
1934                 return -ENOMEM;
1935         return 0;
1936 }
1937 EXPORT_SYMBOL(drm_mode_create_suggested_offset_properties);
1938
1939 /**
1940  * drm_mode_getresources - get graphics configuration
1941  * @dev: drm device for the ioctl
1942  * @data: data pointer for the ioctl
1943  * @file_priv: drm file for the ioctl call
1944  *
1945  * Construct a set of configuration description structures and return
1946  * them to the user, including CRTC, connector and framebuffer configuration.
1947  *
1948  * Called by the user via ioctl.
1949  *
1950  * Returns:
1951  * Zero on success, negative errno on failure.
1952  */
1953 int drm_mode_getresources(struct drm_device *dev, void *data,
1954                           struct drm_file *file_priv)
1955 {
1956         struct drm_mode_card_res *card_res = data;
1957         struct list_head *lh;
1958         struct drm_framebuffer *fb;
1959         struct drm_connector *connector;
1960         struct drm_crtc *crtc;
1961         struct drm_encoder *encoder;
1962         int ret = 0;
1963         int connector_count = 0;
1964         int crtc_count = 0;
1965         int fb_count = 0;
1966         int encoder_count = 0;
1967         int copied = 0;
1968         uint32_t __user *fb_id;
1969         uint32_t __user *crtc_id;
1970         uint32_t __user *connector_id;
1971         uint32_t __user *encoder_id;
1972
1973         if (!drm_core_check_feature(dev, DRIVER_MODESET))
1974                 return -EINVAL;
1975
1976
1977         mutex_lock(&file_priv->fbs_lock);
1978         /*
1979          * For the non-control nodes we need to limit the list of resources
1980          * by IDs in the group list for this node
1981          */
1982         list_for_each(lh, &file_priv->fbs)
1983                 fb_count++;
1984
1985         /* handle this in 4 parts */
1986         /* FBs */
1987         if (card_res->count_fbs >= fb_count) {
1988                 copied = 0;
1989                 fb_id = (uint32_t __user *)(unsigned long)card_res->fb_id_ptr;
1990                 list_for_each_entry(fb, &file_priv->fbs, filp_head) {
1991                         if (put_user(fb->base.id, fb_id + copied)) {
1992                                 mutex_unlock(&file_priv->fbs_lock);
1993                                 return -EFAULT;
1994                         }
1995                         copied++;
1996                 }
1997         }
1998         card_res->count_fbs = fb_count;
1999         mutex_unlock(&file_priv->fbs_lock);
2000
2001         /* mode_config.mutex protects the connector list against e.g. DP MST
2002          * connector hot-adding. CRTC/Plane lists are invariant. */
2003         mutex_lock(&dev->mode_config.mutex);
2004         drm_for_each_crtc(crtc, dev)
2005                 crtc_count++;
2006
2007         drm_for_each_connector(connector, dev)
2008                 connector_count++;
2009
2010         drm_for_each_encoder(encoder, dev)
2011                 encoder_count++;
2012
2013         card_res->max_height = dev->mode_config.max_height;
2014         card_res->min_height = dev->mode_config.min_height;
2015         card_res->max_width = dev->mode_config.max_width;
2016         card_res->min_width = dev->mode_config.min_width;
2017
2018         /* CRTCs */
2019         if (card_res->count_crtcs >= crtc_count) {
2020                 copied = 0;
2021                 crtc_id = (uint32_t __user *)(unsigned long)card_res->crtc_id_ptr;
2022                 drm_for_each_crtc(crtc, dev) {
2023                         if (put_user(crtc->base.id, crtc_id + copied)) {
2024                                 ret = -EFAULT;
2025                                 goto out;
2026                         }
2027                         copied++;
2028                 }
2029         }
2030         card_res->count_crtcs = crtc_count;
2031
2032         /* Encoders */
2033         if (card_res->count_encoders >= encoder_count) {
2034                 copied = 0;
2035                 encoder_id = (uint32_t __user *)(unsigned long)card_res->encoder_id_ptr;
2036                 drm_for_each_encoder(encoder, dev) {
2037                         if (put_user(encoder->base.id, encoder_id +
2038                                      copied)) {
2039                                 ret = -EFAULT;
2040                                 goto out;
2041                         }
2042                         copied++;
2043                 }
2044         }
2045         card_res->count_encoders = encoder_count;
2046
2047         /* Connectors */
2048         if (card_res->count_connectors >= connector_count) {
2049                 copied = 0;
2050                 connector_id = (uint32_t __user *)(unsigned long)card_res->connector_id_ptr;
2051                 drm_for_each_connector(connector, dev) {
2052                         if (put_user(connector->base.id,
2053                                      connector_id + copied)) {
2054                                 ret = -EFAULT;
2055                                 goto out;
2056                         }
2057                         copied++;
2058                 }
2059         }
2060         card_res->count_connectors = connector_count;
2061
2062 out:
2063         mutex_unlock(&dev->mode_config.mutex);
2064         return ret;
2065 }
2066
2067 /**
2068  * drm_mode_getcrtc - get CRTC configuration
2069  * @dev: drm device for the ioctl
2070  * @data: data pointer for the ioctl
2071  * @file_priv: drm file for the ioctl call
2072  *
2073  * Construct a CRTC configuration structure to return to the user.
2074  *
2075  * Called by the user via ioctl.
2076  *
2077  * Returns:
2078  * Zero on success, negative errno on failure.
2079  */
2080 int drm_mode_getcrtc(struct drm_device *dev,
2081                      void *data, struct drm_file *file_priv)
2082 {
2083         struct drm_mode_crtc *crtc_resp = data;
2084         struct drm_crtc *crtc;
2085
2086         if (!drm_core_check_feature(dev, DRIVER_MODESET))
2087                 return -EINVAL;
2088
2089         crtc = drm_crtc_find(dev, crtc_resp->crtc_id);
2090         if (!crtc)
2091                 return -ENOENT;
2092
2093         drm_modeset_lock_crtc(crtc, crtc->primary);
2094         crtc_resp->gamma_size = crtc->gamma_size;
2095         if (crtc->primary->fb)
2096                 crtc_resp->fb_id = crtc->primary->fb->base.id;
2097         else
2098                 crtc_resp->fb_id = 0;
2099
2100         if (crtc->state) {
2101                 crtc_resp->x = crtc->primary->state->src_x >> 16;
2102                 crtc_resp->y = crtc->primary->state->src_y >> 16;
2103                 if (crtc->state->enable) {
2104                         drm_mode_convert_to_umode(&crtc_resp->mode, &crtc->state->mode);
2105                         crtc_resp->mode_valid = 1;
2106
2107                 } else {
2108                         crtc_resp->mode_valid = 0;
2109                 }
2110         } else {
2111                 crtc_resp->x = crtc->x;
2112                 crtc_resp->y = crtc->y;
2113                 if (crtc->enabled) {
2114                         drm_mode_convert_to_umode(&crtc_resp->mode, &crtc->mode);
2115                         crtc_resp->mode_valid = 1;
2116
2117                 } else {
2118                         crtc_resp->mode_valid = 0;
2119                 }
2120         }
2121         drm_modeset_unlock_crtc(crtc);
2122
2123         return 0;
2124 }
2125
2126 static bool drm_mode_expose_to_userspace(const struct drm_display_mode *mode,
2127                                          const struct drm_file *file_priv)
2128 {
2129         /*
2130          * If user-space hasn't configured the driver to expose the stereo 3D
2131          * modes, don't expose them.
2132          */
2133         if (!file_priv->stereo_allowed && drm_mode_is_stereo(mode))
2134                 return false;
2135
2136         return true;
2137 }
2138
2139 static struct drm_encoder *drm_connector_get_encoder(struct drm_connector *connector)
2140 {
2141         /* For atomic drivers only state objects are synchronously updated and
2142          * protected by modeset locks, so check those first. */
2143         if (connector->state)
2144                 return connector->state->best_encoder;
2145         return connector->encoder;
2146 }
2147
2148 /* helper for getconnector and getproperties ioctls */
2149 static int get_properties(struct drm_mode_object *obj, bool atomic,
2150                 uint32_t __user *prop_ptr, uint64_t __user *prop_values,
2151                 uint32_t *arg_count_props)
2152 {
2153         int props_count;
2154         int i, ret, copied;
2155
2156         props_count = obj->properties->count;
2157         if (!atomic)
2158                 props_count -= obj->properties->atomic_count;
2159
2160         if ((*arg_count_props >= props_count) && props_count) {
2161                 for (i = 0, copied = 0; copied < props_count; i++) {
2162                         struct drm_property *prop = obj->properties->properties[i];
2163                         uint64_t val;
2164
2165                         if ((prop->flags & DRM_MODE_PROP_ATOMIC) && !atomic)
2166                                 continue;
2167
2168                         ret = drm_object_property_get_value(obj, prop, &val);
2169                         if (ret)
2170                                 return ret;
2171
2172                         if (put_user(prop->base.id, prop_ptr + copied))
2173                                 return -EFAULT;
2174
2175                         if (put_user(val, prop_values + copied))
2176                                 return -EFAULT;
2177
2178                         copied++;
2179                 }
2180         }
2181         *arg_count_props = props_count;
2182
2183         return 0;
2184 }
2185
2186 /**
2187  * drm_mode_getconnector - get connector configuration
2188  * @dev: drm device for the ioctl
2189  * @data: data pointer for the ioctl
2190  * @file_priv: drm file for the ioctl call
2191  *
2192  * Construct a connector configuration structure to return to the user.
2193  *
2194  * Called by the user via ioctl.
2195  *
2196  * Returns:
2197  * Zero on success, negative errno on failure.
2198  */
2199 int drm_mode_getconnector(struct drm_device *dev, void *data,
2200                           struct drm_file *file_priv)
2201 {
2202         struct drm_mode_get_connector *out_resp = data;
2203         struct drm_connector *connector;
2204         struct drm_encoder *encoder;
2205         struct drm_display_mode *mode;
2206         int mode_count = 0;
2207         int encoders_count = 0;
2208         int ret = 0;
2209         int copied = 0;
2210         int i;
2211         struct drm_mode_modeinfo u_mode;
2212         struct drm_mode_modeinfo __user *mode_ptr;
2213         uint32_t __user *encoder_ptr;
2214
2215         if (!drm_core_check_feature(dev, DRIVER_MODESET))
2216                 return -EINVAL;
2217
2218         memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo));
2219
2220         mutex_lock(&dev->mode_config.mutex);
2221
2222         connector = drm_connector_lookup(dev, out_resp->connector_id);
2223         if (!connector) {
2224                 ret = -ENOENT;
2225                 goto out_unlock;
2226         }
2227
2228         for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++)
2229                 if (connector->encoder_ids[i] != 0)
2230                         encoders_count++;
2231
2232         if (out_resp->count_modes == 0) {
2233                 connector->funcs->fill_modes(connector,
2234                                              dev->mode_config.max_width,
2235                                              dev->mode_config.max_height);
2236         }
2237
2238         /* delayed so we get modes regardless of pre-fill_modes state */
2239         list_for_each_entry(mode, &connector->modes, head)
2240                 if (drm_mode_expose_to_userspace(mode, file_priv))
2241                         mode_count++;
2242
2243         out_resp->connector_id = connector->base.id;
2244         out_resp->connector_type = connector->connector_type;
2245         out_resp->connector_type_id = connector->connector_type_id;
2246         out_resp->mm_width = connector->display_info.width_mm;
2247         out_resp->mm_height = connector->display_info.height_mm;
2248         out_resp->subpixel = connector->display_info.subpixel_order;
2249         out_resp->connection = connector->status;
2250
2251         drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
2252         encoder = drm_connector_get_encoder(connector);
2253         if (encoder)
2254                 out_resp->encoder_id = encoder->base.id;
2255         else
2256                 out_resp->encoder_id = 0;
2257
2258         /*
2259          * This ioctl is called twice, once to determine how much space is
2260          * needed, and the 2nd time to fill it.
2261          */
2262         if ((out_resp->count_modes >= mode_count) && mode_count) {
2263                 copied = 0;
2264                 mode_ptr = (struct drm_mode_modeinfo __user *)(unsigned long)out_resp->modes_ptr;
2265                 list_for_each_entry(mode, &connector->modes, head) {
2266                         if (!drm_mode_expose_to_userspace(mode, file_priv))
2267                                 continue;
2268
2269                         drm_mode_convert_to_umode(&u_mode, mode);
2270                         if (copy_to_user(mode_ptr + copied,
2271                                          &u_mode, sizeof(u_mode))) {
2272                                 ret = -EFAULT;
2273                                 goto out;
2274                         }
2275                         copied++;
2276                 }
2277         }
2278         out_resp->count_modes = mode_count;
2279
2280         ret = get_properties(&connector->base, file_priv->atomic,
2281                         (uint32_t __user *)(unsigned long)(out_resp->props_ptr),
2282                         (uint64_t __user *)(unsigned long)(out_resp->prop_values_ptr),
2283                         &out_resp->count_props);
2284         if (ret)
2285                 goto out;
2286
2287         if ((out_resp->count_encoders >= encoders_count) && encoders_count) {
2288                 copied = 0;
2289                 encoder_ptr = (uint32_t __user *)(unsigned long)(out_resp->encoders_ptr);
2290                 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
2291                         if (connector->encoder_ids[i] != 0) {
2292                                 if (put_user(connector->encoder_ids[i],
2293                                              encoder_ptr + copied)) {
2294                                         ret = -EFAULT;
2295                                         goto out;
2296                                 }
2297                                 copied++;
2298                         }
2299                 }
2300         }
2301         out_resp->count_encoders = encoders_count;
2302
2303 out:
2304         drm_modeset_unlock(&dev->mode_config.connection_mutex);
2305
2306         drm_connector_unreference(connector);
2307 out_unlock:
2308         mutex_unlock(&dev->mode_config.mutex);
2309
2310         return ret;
2311 }
2312
2313 static struct drm_crtc *drm_encoder_get_crtc(struct drm_encoder *encoder)
2314 {
2315         struct drm_connector *connector;
2316         struct drm_device *dev = encoder->dev;
2317         bool uses_atomic = false;
2318
2319         /* For atomic drivers only state objects are synchronously updated and
2320          * protected by modeset locks, so check those first. */
2321         drm_for_each_connector(connector, dev) {
2322                 if (!connector->state)
2323                         continue;
2324
2325                 uses_atomic = true;
2326
2327                 if (connector->state->best_encoder != encoder)
2328                         continue;
2329
2330                 return connector->state->crtc;
2331         }
2332
2333         /* Don't return stale data (e.g. pending async disable). */
2334         if (uses_atomic)
2335                 return NULL;
2336
2337         return encoder->crtc;
2338 }
2339
2340 /**
2341  * drm_mode_getencoder - get encoder configuration
2342  * @dev: drm device for the ioctl
2343  * @data: data pointer for the ioctl
2344  * @file_priv: drm file for the ioctl call
2345  *
2346  * Construct a encoder configuration structure to return to the user.
2347  *
2348  * Called by the user via ioctl.
2349  *
2350  * Returns:
2351  * Zero on success, negative errno on failure.
2352  */
2353 int drm_mode_getencoder(struct drm_device *dev, void *data,
2354                         struct drm_file *file_priv)
2355 {
2356         struct drm_mode_get_encoder *enc_resp = data;
2357         struct drm_encoder *encoder;
2358         struct drm_crtc *crtc;
2359
2360         if (!drm_core_check_feature(dev, DRIVER_MODESET))
2361                 return -EINVAL;
2362
2363         encoder = drm_encoder_find(dev, enc_resp->encoder_id);
2364         if (!encoder)
2365                 return -ENOENT;
2366
2367         drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
2368         crtc = drm_encoder_get_crtc(encoder);
2369         if (crtc)
2370                 enc_resp->crtc_id = crtc->base.id;
2371         else
2372                 enc_resp->crtc_id = 0;
2373         drm_modeset_unlock(&dev->mode_config.connection_mutex);
2374
2375         enc_resp->encoder_type = encoder->encoder_type;
2376         enc_resp->encoder_id = encoder->base.id;
2377         enc_resp->possible_crtcs = encoder->possible_crtcs;
2378         enc_resp->possible_clones = encoder->possible_clones;
2379
2380         return 0;
2381 }
2382
2383 /**
2384  * drm_mode_getplane_res - enumerate all plane resources
2385  * @dev: DRM device
2386  * @data: ioctl data
2387  * @file_priv: DRM file info
2388  *
2389  * Construct a list of plane ids to return to the user.
2390  *
2391  * Called by the user via ioctl.
2392  *
2393  * Returns:
2394  * Zero on success, negative errno on failure.
2395  */
2396 int drm_mode_getplane_res(struct drm_device *dev, void *data,
2397                           struct drm_file *file_priv)
2398 {
2399         struct drm_mode_get_plane_res *plane_resp = data;
2400         struct drm_mode_config *config;
2401         struct drm_plane *plane;
2402         uint32_t __user *plane_ptr;
2403         int copied = 0;
2404         unsigned num_planes;
2405
2406         if (!drm_core_check_feature(dev, DRIVER_MODESET))
2407                 return -EINVAL;
2408
2409         config = &dev->mode_config;
2410
2411         if (file_priv->universal_planes)
2412                 num_planes = config->num_total_plane;
2413         else
2414                 num_planes = config->num_overlay_plane;
2415
2416         /*
2417          * This ioctl is called twice, once to determine how much space is
2418          * needed, and the 2nd time to fill it.
2419          */
2420         if (num_planes &&
2421             (plane_resp->count_planes >= num_planes)) {
2422                 plane_ptr = (uint32_t __user *)(unsigned long)plane_resp->plane_id_ptr;
2423
2424                 /* Plane lists are invariant, no locking needed. */
2425                 drm_for_each_plane(plane, dev) {
2426                         /*
2427                          * Unless userspace set the 'universal planes'
2428                          * capability bit, only advertise overlays.
2429                          */
2430                         if (plane->type != DRM_PLANE_TYPE_OVERLAY &&
2431                             !file_priv->universal_planes)
2432                                 continue;
2433
2434                         if (put_user(plane->base.id, plane_ptr + copied))
2435                                 return -EFAULT;
2436                         copied++;
2437                 }
2438         }
2439         plane_resp->count_planes = num_planes;
2440
2441         return 0;
2442 }
2443
2444 /**
2445  * drm_mode_getplane - get plane configuration
2446  * @dev: DRM device
2447  * @data: ioctl data
2448  * @file_priv: DRM file info
2449  *
2450  * Construct a plane configuration structure to return to the user.
2451  *
2452  * Called by the user via ioctl.
2453  *
2454  * Returns:
2455  * Zero on success, negative errno on failure.
2456  */
2457 int drm_mode_getplane(struct drm_device *dev, void *data,
2458                       struct drm_file *file_priv)
2459 {
2460         struct drm_mode_get_plane *plane_resp = data;
2461         struct drm_plane *plane;
2462         uint32_t __user *format_ptr;
2463
2464         if (!drm_core_check_feature(dev, DRIVER_MODESET))
2465                 return -EINVAL;
2466
2467         plane = drm_plane_find(dev, plane_resp->plane_id);
2468         if (!plane)
2469                 return -ENOENT;
2470
2471         drm_modeset_lock(&plane->mutex, NULL);
2472         if (plane->crtc)
2473                 plane_resp->crtc_id = plane->crtc->base.id;
2474         else
2475                 plane_resp->crtc_id = 0;
2476
2477         if (plane->fb)
2478                 plane_resp->fb_id = plane->fb->base.id;
2479         else
2480                 plane_resp->fb_id = 0;
2481         drm_modeset_unlock(&plane->mutex);
2482
2483         plane_resp->plane_id = plane->base.id;
2484         plane_resp->possible_crtcs = plane->possible_crtcs;
2485         plane_resp->gamma_size = 0;
2486
2487         /*
2488          * This ioctl is called twice, once to determine how much space is
2489          * needed, and the 2nd time to fill it.
2490          */
2491         if (plane->format_count &&
2492             (plane_resp->count_format_types >= plane->format_count)) {
2493                 format_ptr = (uint32_t __user *)(unsigned long)plane_resp->format_type_ptr;
2494                 if (copy_to_user(format_ptr,
2495                                  plane->format_types,
2496                                  sizeof(uint32_t) * plane->format_count)) {
2497                         return -EFAULT;
2498                 }
2499         }
2500         plane_resp->count_format_types = plane->format_count;
2501
2502         return 0;
2503 }
2504
2505 /**
2506  * drm_plane_check_pixel_format - Check if the plane supports the pixel format
2507  * @plane: plane to check for format support
2508  * @format: the pixel format
2509  *
2510  * Returns:
2511  * Zero of @plane has @format in its list of supported pixel formats, -EINVAL
2512  * otherwise.
2513  */
2514 int drm_plane_check_pixel_format(const struct drm_plane *plane, u32 format)
2515 {
2516         unsigned int i;
2517
2518         for (i = 0; i < plane->format_count; i++) {
2519                 if (format == plane->format_types[i])
2520                         return 0;
2521         }
2522
2523         return -EINVAL;
2524 }
2525
2526 static int check_src_coords(uint32_t src_x, uint32_t src_y,
2527                             uint32_t src_w, uint32_t src_h,
2528                             const struct drm_framebuffer *fb)
2529 {
2530         unsigned int fb_width, fb_height;
2531
2532         fb_width = fb->width << 16;
2533         fb_height = fb->height << 16;
2534
2535         /* Make sure source coordinates are inside the fb. */
2536         if (src_w > fb_width ||
2537             src_x > fb_width - src_w ||
2538             src_h > fb_height ||
2539             src_y > fb_height - src_h) {
2540                 DRM_DEBUG_KMS("Invalid source coordinates "
2541                               "%u.%06ux%u.%06u+%u.%06u+%u.%06u\n",
2542                               src_w >> 16, ((src_w & 0xffff) * 15625) >> 10,
2543                               src_h >> 16, ((src_h & 0xffff) * 15625) >> 10,
2544                               src_x >> 16, ((src_x & 0xffff) * 15625) >> 10,
2545                               src_y >> 16, ((src_y & 0xffff) * 15625) >> 10);
2546                 return -ENOSPC;
2547         }
2548
2549         return 0;
2550 }
2551
2552 /*
2553  * setplane_internal - setplane handler for internal callers
2554  *
2555  * Note that we assume an extra reference has already been taken on fb.  If the
2556  * update fails, this reference will be dropped before return; if it succeeds,
2557  * the previous framebuffer (if any) will be unreferenced instead.
2558  *
2559  * src_{x,y,w,h} are provided in 16.16 fixed point format
2560  */
2561 static int __setplane_internal(struct drm_plane *plane,
2562                                struct drm_crtc *crtc,
2563                                struct drm_framebuffer *fb,
2564                                int32_t crtc_x, int32_t crtc_y,
2565                                uint32_t crtc_w, uint32_t crtc_h,
2566                                /* src_{x,y,w,h} values are 16.16 fixed point */
2567                                uint32_t src_x, uint32_t src_y,
2568                                uint32_t src_w, uint32_t src_h)
2569 {
2570         int ret = 0;
2571
2572         /* No fb means shut it down */
2573         if (!fb) {
2574                 plane->old_fb = plane->fb;
2575                 ret = plane->funcs->disable_plane(plane);
2576                 if (!ret) {
2577                         plane->crtc = NULL;
2578                         plane->fb = NULL;
2579                 } else {
2580                         plane->old_fb = NULL;
2581                 }
2582                 goto out;
2583         }
2584
2585         /* Check whether this plane is usable on this CRTC */
2586         if (!(plane->possible_crtcs & drm_crtc_mask(crtc))) {
2587                 DRM_DEBUG_KMS("Invalid crtc for plane\n");
2588                 ret = -EINVAL;
2589                 goto out;
2590         }
2591
2592         /* Check whether this plane supports the fb pixel format. */
2593         ret = drm_plane_check_pixel_format(plane, fb->pixel_format);
2594         if (ret) {
2595                 DRM_DEBUG_KMS("Invalid pixel format %s\n",
2596                               drm_get_format_name(fb->pixel_format));
2597                 goto out;
2598         }
2599
2600         /* Give drivers some help against integer overflows */
2601         if (crtc_w > INT_MAX ||
2602             crtc_x > INT_MAX - (int32_t) crtc_w ||
2603             crtc_h > INT_MAX ||
2604             crtc_y > INT_MAX - (int32_t) crtc_h) {
2605                 DRM_DEBUG_KMS("Invalid CRTC coordinates %ux%u+%d+%d\n",
2606                               crtc_w, crtc_h, crtc_x, crtc_y);
2607                 ret = -ERANGE;
2608                 goto out;
2609         }
2610
2611         ret = check_src_coords(src_x, src_y, src_w, src_h, fb);
2612         if (ret)
2613                 goto out;
2614
2615         plane->old_fb = plane->fb;
2616         ret = plane->funcs->update_plane(plane, crtc, fb,
2617                                          crtc_x, crtc_y, crtc_w, crtc_h,
2618                                          src_x, src_y, src_w, src_h);
2619         if (!ret) {
2620                 plane->crtc = crtc;
2621                 plane->fb = fb;
2622                 fb = NULL;
2623         } else {
2624                 plane->old_fb = NULL;
2625         }
2626
2627 out:
2628         if (fb)
2629                 drm_framebuffer_unreference(fb);
2630         if (plane->old_fb)
2631                 drm_framebuffer_unreference(plane->old_fb);
2632         plane->old_fb = NULL;
2633
2634         return ret;
2635 }
2636
2637 static int setplane_internal(struct drm_plane *plane,
2638                              struct drm_crtc *crtc,
2639                              struct drm_framebuffer *fb,
2640                              int32_t crtc_x, int32_t crtc_y,
2641                              uint32_t crtc_w, uint32_t crtc_h,
2642                              /* src_{x,y,w,h} values are 16.16 fixed point */
2643                              uint32_t src_x, uint32_t src_y,
2644                              uint32_t src_w, uint32_t src_h)
2645 {
2646         int ret;
2647
2648         drm_modeset_lock_all(plane->dev);
2649         ret = __setplane_internal(plane, crtc, fb,
2650                                   crtc_x, crtc_y, crtc_w, crtc_h,
2651                                   src_x, src_y, src_w, src_h);
2652         drm_modeset_unlock_all(plane->dev);
2653
2654         return ret;
2655 }
2656
2657 /**
2658  * drm_mode_setplane - configure a plane's configuration
2659  * @dev: DRM device
2660  * @data: ioctl data*
2661  * @file_priv: DRM file info
2662  *
2663  * Set plane configuration, including placement, fb, scaling, and other factors.
2664  * Or pass a NULL fb to disable (planes may be disabled without providing a
2665  * valid crtc).
2666  *
2667  * Returns:
2668  * Zero on success, negative errno on failure.
2669  */
2670 int drm_mode_setplane(struct drm_device *dev, void *data,
2671                       struct drm_file *file_priv)
2672 {
2673         struct drm_mode_set_plane *plane_req = data;
2674         struct drm_plane *plane;
2675         struct drm_crtc *crtc = NULL;
2676         struct drm_framebuffer *fb = NULL;
2677
2678         if (!drm_core_check_feature(dev, DRIVER_MODESET))
2679                 return -EINVAL;
2680
2681         /*
2682          * First, find the plane, crtc, and fb objects.  If not available,
2683          * we don't bother to call the driver.
2684          */
2685         plane = drm_plane_find(dev, plane_req->plane_id);
2686         if (!plane) {
2687                 DRM_DEBUG_KMS("Unknown plane ID %d\n",
2688                               plane_req->plane_id);
2689                 return -ENOENT;
2690         }
2691
2692         if (plane_req->fb_id) {
2693                 fb = drm_framebuffer_lookup(dev, plane_req->fb_id);
2694                 if (!fb) {
2695                         DRM_DEBUG_KMS("Unknown framebuffer ID %d\n",
2696                                       plane_req->fb_id);
2697                         return -ENOENT;
2698                 }
2699
2700                 crtc = drm_crtc_find(dev, plane_req->crtc_id);
2701                 if (!crtc) {
2702                         DRM_DEBUG_KMS("Unknown crtc ID %d\n",
2703                                       plane_req->crtc_id);
2704                         return -ENOENT;
2705                 }
2706         }
2707
2708         /*
2709          * setplane_internal will take care of deref'ing either the old or new
2710          * framebuffer depending on success.
2711          */
2712         return setplane_internal(plane, crtc, fb,
2713                                  plane_req->crtc_x, plane_req->crtc_y,
2714                                  plane_req->crtc_w, plane_req->crtc_h,
2715                                  plane_req->src_x, plane_req->src_y,
2716                                  plane_req->src_w, plane_req->src_h);
2717 }
2718
2719 /**
2720  * drm_mode_set_config_internal - helper to call ->set_config
2721  * @set: modeset config to set
2722  *
2723  * This is a little helper to wrap internal calls to the ->set_config driver
2724  * interface. The only thing it adds is correct refcounting dance.
2725  *
2726  * Returns:
2727  * Zero on success, negative errno on failure.
2728  */
2729 int drm_mode_set_config_internal(struct drm_mode_set *set)
2730 {
2731         struct drm_crtc *crtc = set->crtc;
2732         struct drm_framebuffer *fb;
2733         struct drm_crtc *tmp;
2734         int ret;
2735
2736         /*
2737          * NOTE: ->set_config can also disable other crtcs (if we steal all
2738          * connectors from it), hence we need to refcount the fbs across all
2739          * crtcs. Atomic modeset will have saner semantics ...
2740          */
2741         drm_for_each_crtc(tmp, crtc->dev)
2742                 tmp->primary->old_fb = tmp->primary->fb;
2743
2744         fb = set->fb;
2745
2746         ret = crtc->funcs->set_config(set);
2747         if (ret == 0) {
2748                 crtc->primary->crtc = crtc;
2749                 crtc->primary->fb = fb;
2750         }
2751
2752         drm_for_each_crtc(tmp, crtc->dev) {
2753                 if (tmp->primary->fb)
2754                         drm_framebuffer_reference(tmp->primary->fb);
2755                 if (tmp->primary->old_fb)
2756                         drm_framebuffer_unreference(tmp->primary->old_fb);
2757                 tmp->primary->old_fb = NULL;
2758         }
2759
2760         return ret;
2761 }
2762 EXPORT_SYMBOL(drm_mode_set_config_internal);
2763
2764 /**
2765  * drm_crtc_get_hv_timing - Fetches hdisplay/vdisplay for given mode
2766  * @mode: mode to query
2767  * @hdisplay: hdisplay value to fill in
2768  * @vdisplay: vdisplay value to fill in
2769  *
2770  * The vdisplay value will be doubled if the specified mode is a stereo mode of
2771  * the appropriate layout.
2772  */
2773 void drm_crtc_get_hv_timing(const struct drm_display_mode *mode,
2774                             int *hdisplay, int *vdisplay)
2775 {
2776         struct drm_display_mode adjusted;
2777
2778         drm_mode_copy(&adjusted, mode);
2779         drm_mode_set_crtcinfo(&adjusted, CRTC_STEREO_DOUBLE_ONLY);
2780         *hdisplay = adjusted.crtc_hdisplay;
2781         *vdisplay = adjusted.crtc_vdisplay;
2782 }
2783 EXPORT_SYMBOL(drm_crtc_get_hv_timing);
2784
2785 /**
2786  * drm_crtc_check_viewport - Checks that a framebuffer is big enough for the
2787  *     CRTC viewport
2788  * @crtc: CRTC that framebuffer will be displayed on
2789  * @x: x panning
2790  * @y: y panning
2791  * @mode: mode that framebuffer will be displayed under
2792  * @fb: framebuffer to check size of
2793  */
2794 int drm_crtc_check_viewport(const struct drm_crtc *crtc,
2795                             int x, int y,
2796                             const struct drm_display_mode *mode,
2797                             const struct drm_framebuffer *fb)
2798
2799 {
2800         int hdisplay, vdisplay;
2801
2802         drm_crtc_get_hv_timing(mode, &hdisplay, &vdisplay);
2803
2804         if (crtc->state &&
2805             crtc->primary->state->rotation & (BIT(DRM_ROTATE_90) |
2806                                               BIT(DRM_ROTATE_270)))
2807                 swap(hdisplay, vdisplay);
2808
2809         return check_src_coords(x << 16, y << 16,
2810                                 hdisplay << 16, vdisplay << 16, fb);
2811 }
2812 EXPORT_SYMBOL(drm_crtc_check_viewport);
2813
2814 /**
2815  * drm_mode_setcrtc - set CRTC configuration
2816  * @dev: drm device for the ioctl
2817  * @data: data pointer for the ioctl
2818  * @file_priv: drm file for the ioctl call
2819  *
2820  * Build a new CRTC configuration based on user request.
2821  *
2822  * Called by the user via ioctl.
2823  *
2824  * Returns:
2825  * Zero on success, negative errno on failure.
2826  */
2827 int drm_mode_setcrtc(struct drm_device *dev, void *data,
2828                      struct drm_file *file_priv)
2829 {
2830         struct drm_mode_config *config = &dev->mode_config;
2831         struct drm_mode_crtc *crtc_req = data;
2832         struct drm_crtc *crtc;
2833         struct drm_connector **connector_set = NULL, *connector;
2834         struct drm_framebuffer *fb = NULL;
2835         struct drm_display_mode *mode = NULL;
2836         struct drm_mode_set set;
2837         uint32_t __user *set_connectors_ptr;
2838         int ret;
2839         int i;
2840
2841         if (!drm_core_check_feature(dev, DRIVER_MODESET))
2842                 return -EINVAL;
2843
2844         /*
2845          * Universal plane src offsets are only 16.16, prevent havoc for
2846          * drivers using universal plane code internally.
2847          */
2848         if (crtc_req->x & 0xffff0000 || crtc_req->y & 0xffff0000)
2849                 return -ERANGE;
2850
2851         drm_modeset_lock_all(dev);
2852         crtc = drm_crtc_find(dev, crtc_req->crtc_id);
2853         if (!crtc) {
2854                 DRM_DEBUG_KMS("Unknown CRTC ID %d\n", crtc_req->crtc_id);
2855                 ret = -ENOENT;
2856                 goto out;
2857         }
2858         DRM_DEBUG_KMS("[CRTC:%d:%s]\n", crtc->base.id, crtc->name);
2859
2860         if (crtc_req->mode_valid) {
2861                 /* If we have a mode we need a framebuffer. */
2862                 /* If we pass -1, set the mode with the currently bound fb */
2863                 if (crtc_req->fb_id == -1) {
2864                         if (!crtc->primary->fb) {
2865                                 DRM_DEBUG_KMS("CRTC doesn't have current FB\n");
2866                                 ret = -EINVAL;
2867                                 goto out;
2868                         }
2869                         fb = crtc->primary->fb;
2870                         /* Make refcounting symmetric with the lookup path. */
2871                         drm_framebuffer_reference(fb);
2872                 } else {
2873                         fb = drm_framebuffer_lookup(dev, crtc_req->fb_id);
2874                         if (!fb) {
2875                                 DRM_DEBUG_KMS("Unknown FB ID%d\n",
2876                                                 crtc_req->fb_id);
2877                                 ret = -ENOENT;
2878                                 goto out;
2879                         }
2880                 }
2881
2882                 mode = drm_mode_create(dev);
2883                 if (!mode) {
2884                         ret = -ENOMEM;
2885                         goto out;
2886                 }
2887
2888                 ret = drm_mode_convert_umode(mode, &crtc_req->mode);
2889                 if (ret) {
2890                         DRM_DEBUG_KMS("Invalid mode\n");
2891                         goto out;
2892                 }
2893
2894                 /*
2895                  * Check whether the primary plane supports the fb pixel format.
2896                  * Drivers not implementing the universal planes API use a
2897                  * default formats list provided by the DRM core which doesn't
2898                  * match real hardware capabilities. Skip the check in that
2899                  * case.
2900                  */
2901                 if (!crtc->primary->format_default) {
2902                         ret = drm_plane_check_pixel_format(crtc->primary,
2903                                                            fb->pixel_format);
2904                         if (ret) {
2905                                 DRM_DEBUG_KMS("Invalid pixel format %s\n",
2906                                         drm_get_format_name(fb->pixel_format));
2907                                 goto out;
2908                         }
2909                 }
2910
2911                 ret = drm_crtc_check_viewport(crtc, crtc_req->x, crtc_req->y,
2912                                               mode, fb);
2913                 if (ret)
2914                         goto out;
2915
2916         }
2917
2918         if (crtc_req->count_connectors == 0 && mode) {
2919                 DRM_DEBUG_KMS("Count connectors is 0 but mode set\n");
2920                 ret = -EINVAL;
2921                 goto out;
2922         }
2923
2924         if (crtc_req->count_connectors > 0 && (!mode || !fb)) {
2925                 DRM_DEBUG_KMS("Count connectors is %d but no mode or fb set\n",
2926                           crtc_req->count_connectors);
2927                 ret = -EINVAL;
2928                 goto out;
2929         }
2930
2931         if (crtc_req->count_connectors > 0) {
2932                 u32 out_id;
2933
2934                 /* Avoid unbounded kernel memory allocation */
2935                 if (crtc_req->count_connectors > config->num_connector) {
2936                         ret = -EINVAL;
2937                         goto out;
2938                 }
2939
2940                 connector_set = kmalloc_array(crtc_req->count_connectors,
2941                                               sizeof(struct drm_connector *),
2942                                               GFP_KERNEL);
2943                 if (!connector_set) {
2944                         ret = -ENOMEM;
2945                         goto out;
2946                 }
2947
2948                 for (i = 0; i < crtc_req->count_connectors; i++) {
2949                         connector_set[i] = NULL;
2950                         set_connectors_ptr = (uint32_t __user *)(unsigned long)crtc_req->set_connectors_ptr;
2951                         if (get_user(out_id, &set_connectors_ptr[i])) {
2952                                 ret = -EFAULT;
2953                                 goto out;
2954                         }
2955
2956                         connector = drm_connector_lookup(dev, out_id);
2957                         if (!connector) {
2958                                 DRM_DEBUG_KMS("Connector id %d unknown\n",
2959                                                 out_id);
2960                                 ret = -ENOENT;
2961                                 goto out;
2962                         }
2963                         DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
2964                                         connector->base.id,
2965                                         connector->name);
2966
2967                         connector_set[i] = connector;
2968                 }
2969         }
2970
2971         set.crtc = crtc;
2972         set.x = crtc_req->x;
2973         set.y = crtc_req->y;
2974         set.mode = mode;
2975         set.connectors = connector_set;
2976         set.num_connectors = crtc_req->count_connectors;
2977         set.fb = fb;
2978         ret = drm_mode_set_config_internal(&set);
2979
2980 out:
2981         if (fb)
2982                 drm_framebuffer_unreference(fb);
2983
2984         if (connector_set) {
2985                 for (i = 0; i < crtc_req->count_connectors; i++) {
2986                         if (connector_set[i])
2987                                 drm_connector_unreference(connector_set[i]);
2988                 }
2989         }
2990         kfree(connector_set);
2991         drm_mode_destroy(dev, mode);
2992         drm_modeset_unlock_all(dev);
2993         return ret;
2994 }
2995
2996 /**
2997  * drm_mode_cursor_universal - translate legacy cursor ioctl call into a
2998  *     universal plane handler call
2999  * @crtc: crtc to update cursor for
3000  * @req: data pointer for the ioctl
3001  * @file_priv: drm file for the ioctl call
3002  *
3003  * Legacy cursor ioctl's work directly with driver buffer handles.  To
3004  * translate legacy ioctl calls into universal plane handler calls, we need to
3005  * wrap the native buffer handle in a drm_framebuffer.
3006  *
3007  * Note that we assume any handle passed to the legacy ioctls was a 32-bit ARGB
3008  * buffer with a pitch of 4*width; the universal plane interface should be used
3009  * directly in cases where the hardware can support other buffer settings and
3010  * userspace wants to make use of these capabilities.
3011  *
3012  * Returns:
3013  * Zero on success, negative errno on failure.
3014  */
3015 static int drm_mode_cursor_universal(struct drm_crtc *crtc,
3016                                      struct drm_mode_cursor2 *req,
3017                                      struct drm_file *file_priv)
3018 {
3019         struct drm_device *dev = crtc->dev;
3020         struct drm_framebuffer *fb = NULL;
3021         struct drm_mode_fb_cmd2 fbreq = {
3022                 .width = req->width,
3023                 .height = req->height,
3024                 .pixel_format = DRM_FORMAT_ARGB8888,
3025                 .pitches = { req->width * 4 },
3026                 .handles = { req->handle },
3027         };
3028         int32_t crtc_x, crtc_y;
3029         uint32_t crtc_w = 0, crtc_h = 0;
3030         uint32_t src_w = 0, src_h = 0;
3031         int ret = 0;
3032
3033         BUG_ON(!crtc->cursor);
3034         WARN_ON(crtc->cursor->crtc != crtc && crtc->cursor->crtc != NULL);
3035
3036         /*
3037          * Obtain fb we'll be using (either new or existing) and take an extra
3038          * reference to it if fb != null.  setplane will take care of dropping
3039          * the reference if the plane update fails.
3040          */
3041         if (req->flags & DRM_MODE_CURSOR_BO) {
3042                 if (req->handle) {
3043                         fb = internal_framebuffer_create(dev, &fbreq, file_priv);
3044                         if (IS_ERR(fb)) {
3045                                 DRM_DEBUG_KMS("failed to wrap cursor buffer in drm framebuffer\n");
3046                                 return PTR_ERR(fb);
3047                         }
3048                         fb->hot_x = req->hot_x;
3049                         fb->hot_y = req->hot_y;
3050                 } else {
3051                         fb = NULL;
3052                 }
3053         } else {
3054                 fb = crtc->cursor->fb;
3055                 if (fb)
3056                         drm_framebuffer_reference(fb);
3057         }
3058
3059         if (req->flags & DRM_MODE_CURSOR_MOVE) {
3060                 crtc_x = req->x;
3061                 crtc_y = req->y;
3062         } else {
3063                 crtc_x = crtc->cursor_x;
3064                 crtc_y = crtc->cursor_y;
3065         }
3066
3067         if (fb) {
3068                 crtc_w = fb->width;
3069                 crtc_h = fb->height;
3070                 src_w = fb->width << 16;
3071                 src_h = fb->height << 16;
3072         }
3073
3074         /*
3075          * setplane_internal will take care of deref'ing either the old or new
3076          * framebuffer depending on success.
3077          */
3078         ret = __setplane_internal(crtc->cursor, crtc, fb,
3079                                 crtc_x, crtc_y, crtc_w, crtc_h,
3080                                 0, 0, src_w, src_h);
3081
3082         /* Update successful; save new cursor position, if necessary */
3083         if (ret == 0 && req->flags & DRM_MODE_CURSOR_MOVE) {
3084                 crtc->cursor_x = req->x;
3085                 crtc->cursor_y = req->y;
3086         }
3087
3088         return ret;
3089 }
3090
3091 static int drm_mode_cursor_common(struct drm_device *dev,
3092                                   struct drm_mode_cursor2 *req,
3093                                   struct drm_file *file_priv)
3094 {
3095         struct drm_crtc *crtc;
3096         int ret = 0;
3097
3098         if (!drm_core_check_feature(dev, DRIVER_MODESET))
3099                 return -EINVAL;
3100
3101         if (!req->flags || (~DRM_MODE_CURSOR_FLAGS & req->flags))
3102                 return -EINVAL;
3103
3104         crtc = drm_crtc_find(dev, req->crtc_id);
3105         if (!crtc) {
3106                 DRM_DEBUG_KMS("Unknown CRTC ID %d\n", req->crtc_id);
3107                 return -ENOENT;
3108         }
3109
3110         /*
3111          * If this crtc has a universal cursor plane, call that plane's update
3112          * handler rather than using legacy cursor handlers.
3113          */
3114         drm_modeset_lock_crtc(crtc, crtc->cursor);
3115         if (crtc->cursor) {
3116                 ret = drm_mode_cursor_universal(crtc, req, file_priv);
3117                 goto out;
3118         }
3119
3120         if (req->flags & DRM_MODE_CURSOR_BO) {
3121                 if (!crtc->funcs->cursor_set && !crtc->funcs->cursor_set2) {
3122                         ret = -ENXIO;
3123                         goto out;
3124                 }
3125                 /* Turns off the cursor if handle is 0 */
3126                 if (crtc->funcs->cursor_set2)
3127                         ret = crtc->funcs->cursor_set2(crtc, file_priv, req->handle,
3128                                                       req->width, req->height, req->hot_x, req->hot_y);
3129                 else
3130                         ret = crtc->funcs->cursor_set(crtc, file_priv, req->handle,
3131                                                       req->width, req->height);
3132         }
3133
3134         if (req->flags & DRM_MODE_CURSOR_MOVE) {
3135                 if (crtc->funcs->cursor_move) {
3136                         ret = crtc->funcs->cursor_move(crtc, req->x, req->y);
3137                 } else {
3138                         ret = -EFAULT;
3139                         goto out;
3140                 }
3141         }
3142 out:
3143         drm_modeset_unlock_crtc(crtc);
3144
3145         return ret;
3146
3147 }
3148
3149
3150 /**
3151  * drm_mode_cursor_ioctl - set CRTC's cursor configuration
3152  * @dev: drm device for the ioctl
3153  * @data: data pointer for the ioctl
3154  * @file_priv: drm file for the ioctl call
3155  *
3156  * Set the cursor configuration based on user request.
3157  *
3158  * Called by the user via ioctl.
3159  *
3160  * Returns:
3161  * Zero on success, negative errno on failure.
3162  */
3163 int drm_mode_cursor_ioctl(struct drm_device *dev,
3164                           void *data, struct drm_file *file_priv)
3165 {
3166         struct drm_mode_cursor *req = data;
3167         struct drm_mode_cursor2 new_req;
3168
3169         memcpy(&new_req, req, sizeof(struct drm_mode_cursor));
3170         new_req.hot_x = new_req.hot_y = 0;
3171
3172         return drm_mode_cursor_common(dev, &new_req, file_priv);
3173 }
3174
3175 /**
3176  * drm_mode_cursor2_ioctl - set CRTC's cursor configuration
3177  * @dev: drm device for the ioctl
3178  * @data: data pointer for the ioctl
3179  * @file_priv: drm file for the ioctl call
3180  *
3181  * Set the cursor configuration based on user request. This implements the 2nd
3182  * version of the cursor ioctl, which allows userspace to additionally specify
3183  * the hotspot of the pointer.
3184  *
3185  * Called by the user via ioctl.
3186  *
3187  * Returns:
3188  * Zero on success, negative errno on failure.
3189  */
3190 int drm_mode_cursor2_ioctl(struct drm_device *dev,
3191                            void *data, struct drm_file *file_priv)
3192 {
3193         struct drm_mode_cursor2 *req = data;
3194
3195         return drm_mode_cursor_common(dev, req, file_priv);
3196 }
3197
3198 /**
3199  * drm_mode_legacy_fb_format - compute drm fourcc code from legacy description
3200  * @bpp: bits per pixels
3201  * @depth: bit depth per pixel
3202  *
3203  * Computes a drm fourcc pixel format code for the given @bpp/@depth values.
3204  * Useful in fbdev emulation code, since that deals in those values.
3205  */
3206 uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth)
3207 {
3208         uint32_t fmt;
3209
3210         switch (bpp) {
3211         case 8:
3212                 fmt = DRM_FORMAT_C8;
3213                 break;
3214         case 16:
3215                 if (depth == 15)
3216                         fmt = DRM_FORMAT_XRGB1555;
3217                 else
3218                         fmt = DRM_FORMAT_RGB565;
3219                 break;
3220         case 24:
3221                 fmt = DRM_FORMAT_RGB888;
3222                 break;
3223         case 32:
3224                 if (depth == 24)
3225                         fmt = DRM_FORMAT_XRGB8888;
3226                 else if (depth == 30)
3227                         fmt = DRM_FORMAT_XRGB2101010;
3228                 else
3229                         fmt = DRM_FORMAT_ARGB8888;
3230                 break;
3231         default:
3232                 DRM_ERROR("bad bpp, assuming x8r8g8b8 pixel format\n");
3233                 fmt = DRM_FORMAT_XRGB8888;
3234                 break;
3235         }
3236
3237         return fmt;
3238 }
3239 EXPORT_SYMBOL(drm_mode_legacy_fb_format);
3240
3241 /**
3242  * drm_mode_addfb - add an FB to the graphics configuration
3243  * @dev: drm device for the ioctl
3244  * @data: data pointer for the ioctl
3245  * @file_priv: drm file for the ioctl call
3246  *
3247  * Add a new FB to the specified CRTC, given a user request. This is the
3248  * original addfb ioctl which only supported RGB formats.
3249  *
3250  * Called by the user via ioctl.
3251  *
3252  * Returns:
3253  * Zero on success, negative errno on failure.
3254  */
3255 int drm_mode_addfb(struct drm_device *dev,
3256                    void *data, struct drm_file *file_priv)
3257 {
3258         struct drm_mode_fb_cmd *or = data;
3259         struct drm_mode_fb_cmd2 r = {};
3260         int ret;
3261
3262         /* convert to new format and call new ioctl */
3263         r.fb_id = or->fb_id;
3264         r.width = or->width;
3265         r.height = or->height;
3266         r.pitches[0] = or->pitch;
3267         r.pixel_format = drm_mode_legacy_fb_format(or->bpp, or->depth);
3268         r.handles[0] = or->handle;
3269
3270         ret = drm_mode_addfb2(dev, &r, file_priv);
3271         if (ret)
3272                 return ret;
3273
3274         or->fb_id = r.fb_id;
3275
3276         return 0;
3277 }
3278
3279 static int format_check(const struct drm_mode_fb_cmd2 *r)
3280 {
3281         uint32_t format = r->pixel_format & ~DRM_FORMAT_BIG_ENDIAN;
3282
3283         switch (format) {
3284         case DRM_FORMAT_C8:
3285         case DRM_FORMAT_RGB332:
3286         case DRM_FORMAT_BGR233:
3287         case DRM_FORMAT_XRGB4444:
3288         case DRM_FORMAT_XBGR4444:
3289         case DRM_FORMAT_RGBX4444:
3290         case DRM_FORMAT_BGRX4444:
3291         case DRM_FORMAT_ARGB4444:
3292         case DRM_FORMAT_ABGR4444:
3293         case DRM_FORMAT_RGBA4444:
3294         case DRM_FORMAT_BGRA4444:
3295         case DRM_FORMAT_XRGB1555:
3296         case DRM_FORMAT_XBGR1555:
3297         case DRM_FORMAT_RGBX5551:
3298         case DRM_FORMAT_BGRX5551:
3299         case DRM_FORMAT_ARGB1555:
3300         case DRM_FORMAT_ABGR1555:
3301         case DRM_FORMAT_RGBA5551:
3302         case DRM_FORMAT_BGRA5551:
3303         case DRM_FORMAT_RGB565:
3304         case DRM_FORMAT_BGR565:
3305         case DRM_FORMAT_RGB888:
3306         case DRM_FORMAT_BGR888:
3307         case DRM_FORMAT_XRGB8888:
3308         case DRM_FORMAT_XBGR8888:
3309         case DRM_FORMAT_RGBX8888:
3310         case DRM_FORMAT_BGRX8888:
3311         case DRM_FORMAT_ARGB8888:
3312         case DRM_FORMAT_ABGR8888:
3313         case DRM_FORMAT_RGBA8888:
3314         case DRM_FORMAT_BGRA8888:
3315         case DRM_FORMAT_XRGB2101010:
3316         case DRM_FORMAT_XBGR2101010:
3317         case DRM_FORMAT_RGBX1010102:
3318         case DRM_FORMAT_BGRX1010102:
3319         case DRM_FORMAT_ARGB2101010:
3320         case DRM_FORMAT_ABGR2101010:
3321         case DRM_FORMAT_RGBA1010102:
3322         case DRM_FORMAT_BGRA1010102:
3323         case DRM_FORMAT_YUYV:
3324         case DRM_FORMAT_YVYU:
3325         case DRM_FORMAT_UYVY:
3326         case DRM_FORMAT_VYUY:
3327         case DRM_FORMAT_AYUV:
3328         case DRM_FORMAT_NV12:
3329         case DRM_FORMAT_NV21:
3330         case DRM_FORMAT_NV16:
3331         case DRM_FORMAT_NV61:
3332         case DRM_FORMAT_NV24:
3333         case DRM_FORMAT_NV42:
3334         case DRM_FORMAT_YUV410:
3335         case DRM_FORMAT_YVU410:
3336         case DRM_FORMAT_YUV411:
3337         case DRM_FORMAT_YVU411:
3338         case DRM_FORMAT_YUV420:
3339         case DRM_FORMAT_YVU420:
3340         case DRM_FORMAT_YUV422:
3341         case DRM_FORMAT_YVU422:
3342         case DRM_FORMAT_YUV444:
3343         case DRM_FORMAT_YVU444:
3344                 return 0;
3345         default:
3346                 DRM_DEBUG_KMS("invalid pixel format %s\n",
3347                               drm_get_format_name(r->pixel_format));
3348                 return -EINVAL;
3349         }
3350 }
3351
3352 static int framebuffer_check(const struct drm_mode_fb_cmd2 *r)
3353 {
3354         int ret, hsub, vsub, num_planes, i;
3355
3356         ret = format_check(r);
3357         if (ret) {
3358                 DRM_DEBUG_KMS("bad framebuffer format %s\n",
3359                               drm_get_format_name(r->pixel_format));
3360                 return ret;
3361         }
3362
3363         hsub = drm_format_horz_chroma_subsampling(r->pixel_format);
3364         vsub = drm_format_vert_chroma_subsampling(r->pixel_format);
3365         num_planes = drm_format_num_planes(r->pixel_format);
3366
3367         if (r->width == 0 || r->width % hsub) {
3368                 DRM_DEBUG_KMS("bad framebuffer width %u\n", r->width);
3369                 return -EINVAL;
3370         }
3371
3372         if (r->height == 0 || r->height % vsub) {
3373                 DRM_DEBUG_KMS("bad framebuffer height %u\n", r->height);
3374                 return -EINVAL;
3375         }
3376
3377         for (i = 0; i < num_planes; i++) {
3378                 unsigned int width = r->width / (i != 0 ? hsub : 1);
3379                 unsigned int height = r->height / (i != 0 ? vsub : 1);
3380                 unsigned int cpp = drm_format_plane_cpp(r->pixel_format, i);
3381
3382                 if (!r->handles[i]) {
3383                         DRM_DEBUG_KMS("no buffer object handle for plane %d\n", i);
3384                         return -EINVAL;
3385                 }
3386
3387                 if ((uint64_t) width * cpp > UINT_MAX)
3388                         return -ERANGE;
3389
3390                 if ((uint64_t) height * r->pitches[i] + r->offsets[i] > UINT_MAX)
3391                         return -ERANGE;
3392
3393                 if (r->pitches[i] < width * cpp) {
3394                         DRM_DEBUG_KMS("bad pitch %u for plane %d\n", r->pitches[i], i);
3395                         return -EINVAL;
3396                 }
3397
3398                 if (r->modifier[i] && !(r->flags & DRM_MODE_FB_MODIFIERS)) {
3399                         DRM_DEBUG_KMS("bad fb modifier %llu for plane %d\n",
3400                                       r->modifier[i], i);
3401                         return -EINVAL;
3402                 }
3403
3404                 /* modifier specific checks: */
3405                 switch (r->modifier[i]) {
3406                 case DRM_FORMAT_MOD_SAMSUNG_64_32_TILE:
3407                         /* NOTE: the pitch restriction may be lifted later if it turns
3408                          * out that no hw has this restriction:
3409                          */
3410                         if (r->pixel_format != DRM_FORMAT_NV12 ||
3411                                         width % 128 || height % 32 ||
3412                                         r->pitches[i] % 128) {
3413                                 DRM_DEBUG_KMS("bad modifier data for plane %d\n", i);
3414                                 return -EINVAL;
3415                         }
3416                         break;
3417
3418                 default:
3419                         break;
3420                 }
3421         }
3422
3423         for (i = num_planes; i < 4; i++) {
3424                 if (r->modifier[i]) {
3425                         DRM_DEBUG_KMS("non-zero modifier for unused plane %d\n", i);
3426                         return -EINVAL;
3427                 }
3428
3429                 /* Pre-FB_MODIFIERS userspace didn't clear the structs properly. */
3430                 if (!(r->flags & DRM_MODE_FB_MODIFIERS))
3431                         continue;
3432
3433                 if (r->handles[i]) {
3434                         DRM_DEBUG_KMS("buffer object handle for unused plane %d\n", i);
3435                         return -EINVAL;
3436                 }
3437
3438                 if (r->pitches[i]) {
3439                         DRM_DEBUG_KMS("non-zero pitch for unused plane %d\n", i);
3440                         return -EINVAL;
3441                 }
3442
3443                 if (r->offsets[i]) {
3444                         DRM_DEBUG_KMS("non-zero offset for unused plane %d\n", i);
3445                         return -EINVAL;
3446                 }
3447         }
3448
3449         return 0;
3450 }
3451
3452 static struct drm_framebuffer *
3453 internal_framebuffer_create(struct drm_device *dev,
3454                             const struct drm_mode_fb_cmd2 *r,
3455                             struct drm_file *file_priv)
3456 {
3457         struct drm_mode_config *config = &dev->mode_config;
3458         struct drm_framebuffer *fb;
3459         int ret;
3460
3461         if (r->flags & ~(DRM_MODE_FB_INTERLACED | DRM_MODE_FB_MODIFIERS)) {
3462                 DRM_DEBUG_KMS("bad framebuffer flags 0x%08x\n", r->flags);
3463                 return ERR_PTR(-EINVAL);
3464         }
3465
3466         if ((config->min_width > r->width) || (r->width > config->max_width)) {
3467                 DRM_DEBUG_KMS("bad framebuffer width %d, should be >= %d && <= %d\n",
3468                           r->width, config->min_width, config->max_width);
3469                 return ERR_PTR(-EINVAL);
3470         }
3471         if ((config->min_height > r->height) || (r->height > config->max_height)) {
3472                 DRM_DEBUG_KMS("bad framebuffer height %d, should be >= %d && <= %d\n",
3473                           r->height, config->min_height, config->max_height);
3474                 return ERR_PTR(-EINVAL);
3475         }
3476
3477         if (r->flags & DRM_MODE_FB_MODIFIERS &&
3478             !dev->mode_config.allow_fb_modifiers) {
3479                 DRM_DEBUG_KMS("driver does not support fb modifiers\n");
3480                 return ERR_PTR(-EINVAL);
3481         }
3482
3483         ret = framebuffer_check(r);
3484         if (ret)
3485                 return ERR_PTR(ret);
3486
3487         fb = dev->mode_config.funcs->fb_create(dev, file_priv, r);
3488         if (IS_ERR(fb)) {
3489                 DRM_DEBUG_KMS("could not create framebuffer\n");
3490                 return fb;
3491         }
3492
3493         return fb;
3494 }
3495
3496 /**
3497  * drm_mode_addfb2 - add an FB to the graphics configuration
3498  * @dev: drm device for the ioctl
3499  * @data: data pointer for the ioctl
3500  * @file_priv: drm file for the ioctl call
3501  *
3502  * Add a new FB to the specified CRTC, given a user request with format. This is
3503  * the 2nd version of the addfb ioctl, which supports multi-planar framebuffers
3504  * and uses fourcc codes as pixel format specifiers.
3505  *
3506  * Called by the user via ioctl.
3507  *
3508  * Returns:
3509  * Zero on success, negative errno on failure.
3510  */
3511 int drm_mode_addfb2(struct drm_device *dev,
3512                     void *data, struct drm_file *file_priv)
3513 {
3514         struct drm_mode_fb_cmd2 *r = data;
3515         struct drm_framebuffer *fb;
3516
3517         if (!drm_core_check_feature(dev, DRIVER_MODESET))
3518                 return -EINVAL;
3519
3520         fb = internal_framebuffer_create(dev, r, file_priv);
3521         if (IS_ERR(fb))
3522                 return PTR_ERR(fb);
3523
3524         DRM_DEBUG_KMS("[FB:%d]\n", fb->base.id);
3525         r->fb_id = fb->base.id;
3526
3527         /* Transfer ownership to the filp for reaping on close */
3528         mutex_lock(&file_priv->fbs_lock);
3529         list_add(&fb->filp_head, &file_priv->fbs);
3530         mutex_unlock(&file_priv->fbs_lock);
3531
3532         return 0;
3533 }
3534
3535 struct drm_mode_rmfb_work {
3536         struct work_struct work;
3537         struct list_head fbs;
3538 };
3539
3540 static void drm_mode_rmfb_work_fn(struct work_struct *w)
3541 {
3542         struct drm_mode_rmfb_work *arg = container_of(w, typeof(*arg), work);
3543
3544         while (!list_empty(&arg->fbs)) {
3545                 struct drm_framebuffer *fb =
3546                         list_first_entry(&arg->fbs, typeof(*fb), filp_head);
3547
3548                 list_del_init(&fb->filp_head);
3549                 drm_framebuffer_remove(fb);
3550         }
3551 }
3552
3553 /**
3554  * drm_mode_rmfb - remove an FB from the configuration
3555  * @dev: drm device for the ioctl
3556  * @data: data pointer for the ioctl
3557  * @file_priv: drm file for the ioctl call
3558  *
3559  * Remove the FB specified by the user.
3560  *
3561  * Called by the user via ioctl.
3562  *
3563  * Returns:
3564  * Zero on success, negative errno on failure.
3565  */
3566 int drm_mode_rmfb(struct drm_device *dev,
3567                    void *data, struct drm_file *file_priv)
3568 {
3569         struct drm_framebuffer *fb = NULL;
3570         struct drm_framebuffer *fbl = NULL;
3571         uint32_t *id = data;
3572         int found = 0;
3573
3574         if (!drm_core_check_feature(dev, DRIVER_MODESET))
3575                 return -EINVAL;
3576
3577         fb = drm_framebuffer_lookup(dev, *id);
3578         if (!fb)
3579                 return -ENOENT;
3580
3581         mutex_lock(&file_priv->fbs_lock);
3582         list_for_each_entry(fbl, &file_priv->fbs, filp_head)
3583                 if (fb == fbl)
3584                         found = 1;
3585         if (!found) {
3586                 mutex_unlock(&file_priv->fbs_lock);
3587                 goto fail_unref;
3588         }
3589
3590         list_del_init(&fb->filp_head);
3591         mutex_unlock(&file_priv->fbs_lock);
3592
3593         /* drop the reference we picked up in framebuffer lookup */
3594         drm_framebuffer_unreference(fb);
3595
3596         /*
3597          * we now own the reference that was stored in the fbs list
3598          *
3599          * drm_framebuffer_remove may fail with -EINTR on pending signals,
3600          * so run this in a separate stack as there's no way to correctly
3601          * handle this after the fb is already removed from the lookup table.
3602          */
3603         if (drm_framebuffer_read_refcount(fb) > 1) {
3604                 struct drm_mode_rmfb_work arg;
3605
3606                 INIT_WORK_ONSTACK(&arg.work, drm_mode_rmfb_work_fn);
3607                 INIT_LIST_HEAD(&arg.fbs);
3608                 list_add_tail(&fb->filp_head, &arg.fbs);
3609
3610                 schedule_work(&arg.work);
3611                 flush_work(&arg.work);
3612                 destroy_work_on_stack(&arg.work);
3613         } else
3614                 drm_framebuffer_unreference(fb);
3615
3616         return 0;
3617
3618 fail_unref:
3619         drm_framebuffer_unreference(fb);
3620         return -ENOENT;
3621 }
3622
3623 /**
3624  * drm_mode_getfb - get FB info
3625  * @dev: drm device for the ioctl
3626  * @data: data pointer for the ioctl
3627  * @file_priv: drm file for the ioctl call
3628  *
3629  * Lookup the FB given its ID and return info about it.
3630  *
3631  * Called by the user via ioctl.
3632  *
3633  * Returns:
3634  * Zero on success, negative errno on failure.
3635  */
3636 int drm_mode_getfb(struct drm_device *dev,
3637                    void *data, struct drm_file *file_priv)
3638 {
3639         struct drm_mode_fb_cmd *r = data;
3640         struct drm_framebuffer *fb;
3641         int ret;
3642
3643         if (!drm_core_check_feature(dev, DRIVER_MODESET))
3644                 return -EINVAL;
3645
3646         fb = drm_framebuffer_lookup(dev, r->fb_id);
3647         if (!fb)
3648                 return -ENOENT;
3649
3650         r->height = fb->height;
3651         r->width = fb->width;
3652         r->depth = fb->depth;
3653         r->bpp = fb->bits_per_pixel;
3654         r->pitch = fb->pitches[0];
3655         if (fb->funcs->create_handle) {
3656                 if (drm_is_current_master(file_priv) || capable(CAP_SYS_ADMIN) ||
3657                     drm_is_control_client(file_priv)) {
3658                         ret = fb->funcs->create_handle(fb, file_priv,
3659                                                        &r->handle);
3660                 } else {
3661                         /* GET_FB() is an unprivileged ioctl so we must not
3662                          * return a buffer-handle to non-master processes! For
3663                          * backwards-compatibility reasons, we cannot make
3664                          * GET_FB() privileged, so just return an invalid handle
3665                          * for non-masters. */
3666                         r->handle = 0;
3667                         ret = 0;
3668                 }
3669         } else {
3670                 ret = -ENODEV;
3671         }
3672
3673         drm_framebuffer_unreference(fb);
3674
3675         return ret;
3676 }
3677
3678 /**
3679  * drm_mode_dirtyfb_ioctl - flush frontbuffer rendering on an FB
3680  * @dev: drm device for the ioctl
3681  * @data: data pointer for the ioctl
3682  * @file_priv: drm file for the ioctl call
3683  *
3684  * Lookup the FB and flush out the damaged area supplied by userspace as a clip
3685  * rectangle list. Generic userspace which does frontbuffer rendering must call
3686  * this ioctl to flush out the changes on manual-update display outputs, e.g.
3687  * usb display-link, mipi manual update panels or edp panel self refresh modes.
3688  *
3689  * Modesetting drivers which always update the frontbuffer do not need to
3690  * implement the corresponding ->dirty framebuffer callback.
3691  *
3692  * Called by the user via ioctl.
3693  *
3694  * Returns:
3695  * Zero on success, negative errno on failure.
3696  */
3697 int drm_mode_dirtyfb_ioctl(struct drm_device *dev,
3698                            void *data, struct drm_file *file_priv)
3699 {
3700         struct drm_clip_rect __user *clips_ptr;
3701         struct drm_clip_rect *clips = NULL;
3702         struct drm_mode_fb_dirty_cmd *r = data;
3703         struct drm_framebuffer *fb;
3704         unsigned flags;
3705         int num_clips;
3706         int ret;
3707
3708         if (!drm_core_check_feature(dev, DRIVER_MODESET))
3709                 return -EINVAL;
3710
3711         fb = drm_framebuffer_lookup(dev, r->fb_id);
3712         if (!fb)
3713                 return -ENOENT;
3714
3715         num_clips = r->num_clips;
3716         clips_ptr = (struct drm_clip_rect __user *)(unsigned long)r->clips_ptr;
3717
3718         if (!num_clips != !clips_ptr) {
3719                 ret = -EINVAL;
3720                 goto out_err1;
3721         }
3722
3723         flags = DRM_MODE_FB_DIRTY_FLAGS & r->flags;
3724
3725         /* If userspace annotates copy, clips must come in pairs */
3726         if (flags & DRM_MODE_FB_DIRTY_ANNOTATE_COPY && (num_clips % 2)) {
3727                 ret = -EINVAL;
3728                 goto out_err1;
3729         }
3730
3731         if (num_clips && clips_ptr) {
3732                 if (num_clips < 0 || num_clips > DRM_MODE_FB_DIRTY_MAX_CLIPS) {
3733                         ret = -EINVAL;
3734                         goto out_err1;
3735                 }
3736                 clips = kcalloc(num_clips, sizeof(*clips), GFP_KERNEL);
3737                 if (!clips) {
3738                         ret = -ENOMEM;
3739                         goto out_err1;
3740                 }
3741
3742                 ret = copy_from_user(clips, clips_ptr,
3743                                      num_clips * sizeof(*clips));
3744                 if (ret) {
3745                         ret = -EFAULT;
3746                         goto out_err2;
3747                 }
3748         }
3749
3750         if (fb->funcs->dirty) {
3751                 ret = fb->funcs->dirty(fb, file_priv, flags, r->color,
3752                                        clips, num_clips);
3753         } else {
3754                 ret = -ENOSYS;
3755         }
3756
3757 out_err2:
3758         kfree(clips);
3759 out_err1:
3760         drm_framebuffer_unreference(fb);
3761
3762         return ret;
3763 }
3764
3765 /**
3766  * drm_fb_release - remove and free the FBs on this file
3767  * @priv: drm file for the ioctl
3768  *
3769  * Destroy all the FBs associated with @filp.
3770  *
3771  * Called by the user via ioctl.
3772  *
3773  * Returns:
3774  * Zero on success, negative errno on failure.
3775  */
3776 void drm_fb_release(struct drm_file *priv)
3777 {
3778         struct drm_framebuffer *fb, *tfb;
3779         struct drm_mode_rmfb_work arg;
3780
3781         INIT_LIST_HEAD(&arg.fbs);
3782
3783         /*
3784          * When the file gets released that means no one else can access the fb
3785          * list any more, so no need to grab fpriv->fbs_lock. And we need to
3786          * avoid upsetting lockdep since the universal cursor code adds a
3787          * framebuffer while holding mutex locks.
3788          *
3789          * Note that a real deadlock between fpriv->fbs_lock and the modeset
3790          * locks is impossible here since no one else but this function can get
3791          * at it any more.
3792          */
3793         list_for_each_entry_safe(fb, tfb, &priv->fbs, filp_head) {
3794                 if (drm_framebuffer_read_refcount(fb) > 1) {
3795                         list_move_tail(&fb->filp_head, &arg.fbs);
3796                 } else {
3797                         list_del_init(&fb->filp_head);
3798
3799                         /* This drops the fpriv->fbs reference. */
3800                         drm_framebuffer_unreference(fb);
3801                 }
3802         }
3803
3804         if (!list_empty(&arg.fbs)) {
3805                 INIT_WORK_ONSTACK(&arg.work, drm_mode_rmfb_work_fn);
3806
3807                 schedule_work(&arg.work);
3808                 flush_work(&arg.work);
3809                 destroy_work_on_stack(&arg.work);
3810         }
3811 }
3812
3813 static bool drm_property_type_valid(struct drm_property *property)
3814 {
3815         if (property->flags & DRM_MODE_PROP_EXTENDED_TYPE)
3816                 return !(property->flags & DRM_MODE_PROP_LEGACY_TYPE);
3817         return !!(property->flags & DRM_MODE_PROP_LEGACY_TYPE);
3818 }
3819
3820 /**
3821  * drm_property_create - create a new property type
3822  * @dev: drm device
3823  * @flags: flags specifying the property type
3824  * @name: name of the property
3825  * @num_values: number of pre-defined values
3826  *
3827  * This creates a new generic drm property which can then be attached to a drm
3828  * object with drm_object_attach_property. The returned property object must be
3829  * freed with drm_property_destroy.
3830  *
3831  * Note that the DRM core keeps a per-device list of properties and that, if
3832  * drm_mode_config_cleanup() is called, it will destroy all properties created
3833  * by the driver.
3834  *
3835  * Returns:
3836  * A pointer to the newly created property on success, NULL on failure.
3837  */
3838 struct drm_property *drm_property_create(struct drm_device *dev, int flags,
3839                                          const char *name, int num_values)
3840 {
3841         struct drm_property *property = NULL;
3842         int ret;
3843
3844         property = kzalloc(sizeof(struct drm_property), GFP_KERNEL);
3845         if (!property)
3846                 return NULL;
3847
3848         property->dev = dev;
3849
3850         if (num_values) {
3851                 property->values = kcalloc(num_values, sizeof(uint64_t),
3852                                            GFP_KERNEL);
3853                 if (!property->values)
3854                         goto fail;
3855         }
3856
3857         ret = drm_mode_object_get(dev, &property->base, DRM_MODE_OBJECT_PROPERTY);
3858         if (ret)
3859                 goto fail;
3860
3861         property->flags = flags;
3862         property->num_values = num_values;
3863         INIT_LIST_HEAD(&property->enum_list);
3864
3865         if (name) {
3866                 strncpy(property->name, name, DRM_PROP_NAME_LEN);
3867                 property->name[DRM_PROP_NAME_LEN-1] = '\0';
3868         }
3869
3870         list_add_tail(&property->head, &dev->mode_config.property_list);
3871
3872         WARN_ON(!drm_property_type_valid(property));
3873
3874         return property;
3875 fail:
3876         kfree(property->values);
3877         kfree(property);
3878         return NULL;
3879 }
3880 EXPORT_SYMBOL(drm_property_create);
3881
3882 /**
3883  * drm_property_create_enum - create a new enumeration property type
3884  * @dev: drm device
3885  * @flags: flags specifying the property type
3886  * @name: name of the property
3887  * @props: enumeration lists with property values
3888  * @num_values: number of pre-defined values
3889  *
3890  * This creates a new generic drm property which can then be attached to a drm
3891  * object with drm_object_attach_property. The returned property object must be
3892  * freed with drm_property_destroy.
3893  *
3894  * Userspace is only allowed to set one of the predefined values for enumeration
3895  * properties.
3896  *
3897  * Returns:
3898  * A pointer to the newly created property on success, NULL on failure.
3899  */
3900 struct drm_property *drm_property_create_enum(struct drm_device *dev, int flags,
3901                                          const char *name,
3902                                          const struct drm_prop_enum_list *props,
3903                                          int num_values)
3904 {
3905         struct drm_property *property;
3906         int i, ret;
3907
3908         flags |= DRM_MODE_PROP_ENUM;
3909
3910         property = drm_property_create(dev, flags, name, num_values);
3911         if (!property)
3912                 return NULL;
3913
3914         for (i = 0; i < num_values; i++) {
3915                 ret = drm_property_add_enum(property, i,
3916                                       props[i].type,
3917                                       props[i].name);
3918                 if (ret) {
3919                         drm_property_destroy(dev, property);
3920                         return NULL;
3921                 }
3922         }
3923
3924         return property;
3925 }
3926 EXPORT_SYMBOL(drm_property_create_enum);
3927
3928 /**
3929  * drm_property_create_bitmask - create a new bitmask property type
3930  * @dev: drm device
3931  * @flags: flags specifying the property type
3932  * @name: name of the property
3933  * @props: enumeration lists with property bitflags
3934  * @num_props: size of the @props array
3935  * @supported_bits: bitmask of all supported enumeration values
3936  *
3937  * This creates a new bitmask drm property which can then be attached to a drm
3938  * object with drm_object_attach_property. The returned property object must be
3939  * freed with drm_property_destroy.
3940  *
3941  * Compared to plain enumeration properties userspace is allowed to set any
3942  * or'ed together combination of the predefined property bitflag values
3943  *
3944  * Returns:
3945  * A pointer to the newly created property on success, NULL on failure.
3946  */
3947 struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
3948                                          int flags, const char *name,
3949                                          const struct drm_prop_enum_list *props,
3950                                          int num_props,
3951                                          uint64_t supported_bits)
3952 {
3953         struct drm_property *property;
3954         int i, ret, index = 0;
3955         int num_values = hweight64(supported_bits);
3956
3957         flags |= DRM_MODE_PROP_BITMASK;
3958
3959         property = drm_property_create(dev, flags, name, num_values);
3960         if (!property)
3961                 return NULL;
3962         for (i = 0; i < num_props; i++) {
3963                 if (!(supported_bits & (1ULL << props[i].type)))
3964                         continue;
3965
3966                 if (WARN_ON(index >= num_values)) {
3967                         drm_property_destroy(dev, property);
3968                         return NULL;
3969                 }
3970
3971                 ret = drm_property_add_enum(property, index++,
3972                                       props[i].type,
3973                                       props[i].name);
3974                 if (ret) {
3975                         drm_property_destroy(dev, property);
3976                         return NULL;
3977                 }
3978         }
3979
3980         return property;
3981 }
3982 EXPORT_SYMBOL(drm_property_create_bitmask);
3983
3984 static struct drm_property *property_create_range(struct drm_device *dev,
3985                                          int flags, const char *name,
3986                                          uint64_t min, uint64_t max)
3987 {
3988         struct drm_property *property;
3989
3990         property = drm_property_create(dev, flags, name, 2);
3991         if (!property)
3992                 return NULL;
3993
3994         property->values[0] = min;
3995         property->values[1] = max;
3996
3997         return property;
3998 }
3999
4000 /**
4001  * drm_property_create_range - create a new unsigned ranged property type
4002  * @dev: drm device
4003  * @flags: flags specifying the property type
4004  * @name: name of the property
4005  * @min: minimum value of the property
4006  * @max: maximum value of the property
4007  *
4008  * This creates a new generic drm property which can then be attached to a drm
4009  * object with drm_object_attach_property. The returned property object must be
4010  * freed with drm_property_destroy.
4011  *
4012  * Userspace is allowed to set any unsigned integer value in the (min, max)
4013  * range inclusive.
4014  *
4015  * Returns:
4016  * A pointer to the newly created property on success, NULL on failure.
4017  */
4018 struct drm_property *drm_property_create_range(struct drm_device *dev, int flags,
4019                                          const char *name,
4020                                          uint64_t min, uint64_t max)
4021 {
4022         return property_create_range(dev, DRM_MODE_PROP_RANGE | flags,
4023                         name, min, max);
4024 }
4025 EXPORT_SYMBOL(drm_property_create_range);
4026
4027 /**
4028  * drm_property_create_signed_range - create a new signed ranged property type
4029  * @dev: drm device
4030  * @flags: flags specifying the property type
4031  * @name: name of the property
4032  * @min: minimum value of the property
4033  * @max: maximum value of the property
4034  *
4035  * This creates a new generic drm property which can then be attached to a drm
4036  * object with drm_object_attach_property. The returned property object must be
4037  * freed with drm_property_destroy.
4038  *
4039  * Userspace is allowed to set any signed integer value in the (min, max)
4040  * range inclusive.
4041  *
4042  * Returns:
4043  * A pointer to the newly created property on success, NULL on failure.
4044  */
4045 struct drm_property *drm_property_create_signed_range(struct drm_device *dev,
4046                                          int flags, const char *name,
4047                                          int64_t min, int64_t max)
4048 {
4049         return property_create_range(dev, DRM_MODE_PROP_SIGNED_RANGE | flags,
4050                         name, I642U64(min), I642U64(max));
4051 }
4052 EXPORT_SYMBOL(drm_property_create_signed_range);
4053
4054 /**
4055  * drm_property_create_object - create a new object property type
4056  * @dev: drm device
4057  * @flags: flags specifying the property type
4058  * @name: name of the property
4059  * @type: object type from DRM_MODE_OBJECT_* defines
4060  *
4061  * This creates a new generic drm property which can then be attached to a drm
4062  * object with drm_object_attach_property. The returned property object must be
4063  * freed with drm_property_destroy.
4064  *
4065  * Userspace is only allowed to set this to any property value of the given
4066  * @type. Only useful for atomic properties, which is enforced.
4067  *
4068  * Returns:
4069  * A pointer to the newly created property on success, NULL on failure.
4070  */
4071 struct drm_property *drm_property_create_object(struct drm_device *dev,
4072                                          int flags, const char *name, uint32_t type)
4073 {
4074         struct drm_property *property;
4075
4076         flags |= DRM_MODE_PROP_OBJECT;
4077
4078         if (WARN_ON(!(flags & DRM_MODE_PROP_ATOMIC)))
4079                 return NULL;
4080
4081         property = drm_property_create(dev, flags, name, 1);
4082         if (!property)
4083                 return NULL;
4084
4085         property->values[0] = type;
4086
4087         return property;
4088 }
4089 EXPORT_SYMBOL(drm_property_create_object);
4090
4091 /**
4092  * drm_property_create_bool - create a new boolean property type
4093  * @dev: drm device
4094  * @flags: flags specifying the property type
4095  * @name: name of the property
4096  *
4097  * This creates a new generic drm property which can then be attached to a drm
4098  * object with drm_object_attach_property. The returned property object must be
4099  * freed with drm_property_destroy.
4100  *
4101  * This is implemented as a ranged property with only {0, 1} as valid values.
4102  *
4103  * Returns:
4104  * A pointer to the newly created property on success, NULL on failure.
4105  */
4106 struct drm_property *drm_property_create_bool(struct drm_device *dev, int flags,
4107                                          const char *name)
4108 {
4109         return drm_property_create_range(dev, flags, name, 0, 1);
4110 }
4111 EXPORT_SYMBOL(drm_property_create_bool);
4112
4113 /**
4114  * drm_property_add_enum - add a possible value to an enumeration property
4115  * @property: enumeration property to change
4116  * @index: index of the new enumeration
4117  * @value: value of the new enumeration
4118  * @name: symbolic name of the new enumeration
4119  *
4120  * This functions adds enumerations to a property.
4121  *
4122  * It's use is deprecated, drivers should use one of the more specific helpers
4123  * to directly create the property with all enumerations already attached.
4124  *
4125  * Returns:
4126  * Zero on success, error code on failure.
4127  */
4128 int drm_property_add_enum(struct drm_property *property, int index,
4129                           uint64_t value, const char *name)
4130 {
4131         struct drm_property_enum *prop_enum;
4132
4133         if (!(drm_property_type_is(property, DRM_MODE_PROP_ENUM) ||
4134                         drm_property_type_is(property, DRM_MODE_PROP_BITMASK)))
4135                 return -EINVAL;
4136
4137         /*
4138          * Bitmask enum properties have the additional constraint of values
4139          * from 0 to 63
4140          */
4141         if (drm_property_type_is(property, DRM_MODE_PROP_BITMASK) &&
4142                         (value > 63))
4143                 return -EINVAL;
4144
4145         if (!list_empty(&property->enum_list)) {
4146                 list_for_each_entry(prop_enum, &property->enum_list, head) {
4147                         if (prop_enum->value == value) {
4148                                 strncpy(prop_enum->name, name, DRM_PROP_NAME_LEN);
4149                                 prop_enum->name[DRM_PROP_NAME_LEN-1] = '\0';
4150                                 return 0;
4151                         }
4152                 }
4153         }
4154
4155         prop_enum = kzalloc(sizeof(struct drm_property_enum), GFP_KERNEL);
4156         if (!prop_enum)
4157                 return -ENOMEM;
4158
4159         strncpy(prop_enum->name, name, DRM_PROP_NAME_LEN);
4160         prop_enum->name[DRM_PROP_NAME_LEN-1] = '\0';
4161         prop_enum->value = value;
4162
4163         property->values[index] = value;
4164         list_add_tail(&prop_enum->head, &property->enum_list);
4165         return 0;
4166 }
4167 EXPORT_SYMBOL(drm_property_add_enum);
4168
4169 /**
4170  * drm_property_destroy - destroy a drm property
4171  * @dev: drm device
4172  * @property: property to destry
4173  *
4174  * This function frees a property including any attached resources like
4175  * enumeration values.
4176  */
4177 void drm_property_destroy(struct drm_device *dev, struct drm_property *property)
4178 {
4179         struct drm_property_enum *prop_enum, *pt;
4180
4181         list_for_each_entry_safe(prop_enum, pt, &property->enum_list, head) {
4182                 list_del(&prop_enum->head);
4183                 kfree(prop_enum);
4184         }
4185
4186         if (property->num_values)
4187                 kfree(property->values);
4188         drm_mode_object_unregister(dev, &property->base);
4189         list_del(&property->head);
4190         kfree(property);
4191 }
4192 EXPORT_SYMBOL(drm_property_destroy);
4193
4194 /**
4195  * drm_object_attach_property - attach a property to a modeset object
4196  * @obj: drm modeset object
4197  * @property: property to attach
4198  * @init_val: initial value of the property
4199  *
4200  * This attaches the given property to the modeset object with the given initial
4201  * value. Currently this function cannot fail since the properties are stored in
4202  * a statically sized array.
4203  */
4204 void drm_object_attach_property(struct drm_mode_object *obj,
4205                                 struct drm_property *property,
4206                                 uint64_t init_val)
4207 {
4208         int count = obj->properties->count;
4209
4210         if (count == DRM_OBJECT_MAX_PROPERTY) {
4211                 WARN(1, "Failed to attach object property (type: 0x%x). Please "
4212                         "increase DRM_OBJECT_MAX_PROPERTY by 1 for each time "
4213                         "you see this message on the same object type.\n",
4214                         obj->type);
4215                 return;
4216         }
4217
4218         obj->properties->properties[count] = property;
4219         obj->properties->values[count] = init_val;
4220         obj->properties->count++;
4221         if (property->flags & DRM_MODE_PROP_ATOMIC)
4222                 obj->properties->atomic_count++;
4223 }
4224 EXPORT_SYMBOL(drm_object_attach_property);
4225
4226 /**
4227  * drm_object_property_set_value - set the value of a property
4228  * @obj: drm mode object to set property value for
4229  * @property: property to set
4230  * @val: value the property should be set to
4231  *
4232  * This functions sets a given property on a given object. This function only
4233  * changes the software state of the property, it does not call into the
4234  * driver's ->set_property callback.
4235  *
4236  * Returns:
4237  * Zero on success, error code on failure.
4238  */
4239 int drm_object_property_set_value(struct drm_mode_object *obj,
4240                                   struct drm_property *property, uint64_t val)
4241 {
4242         int i;
4243
4244         for (i = 0; i < obj->properties->count; i++) {
4245                 if (obj->properties->properties[i] == property) {
4246                         obj->properties->values[i] = val;
4247                         return 0;
4248                 }
4249         }
4250
4251         return -EINVAL;
4252 }
4253 EXPORT_SYMBOL(drm_object_property_set_value);
4254
4255 /**
4256  * drm_object_property_get_value - retrieve the value of a property
4257  * @obj: drm mode object to get property value from
4258  * @property: property to retrieve
4259  * @val: storage for the property value
4260  *
4261  * This function retrieves the softare state of the given property for the given
4262  * property. Since there is no driver callback to retrieve the current property
4263  * value this might be out of sync with the hardware, depending upon the driver
4264  * and property.
4265  *
4266  * Returns:
4267  * Zero on success, error code on failure.
4268  */
4269 int drm_object_property_get_value(struct drm_mode_object *obj,
4270                                   struct drm_property *property, uint64_t *val)
4271 {
4272         int i;
4273
4274         /* read-only properties bypass atomic mechanism and still store
4275          * their value in obj->properties->values[].. mostly to avoid
4276          * having to deal w/ EDID and similar props in atomic paths:
4277          */
4278         if (drm_core_check_feature(property->dev, DRIVER_ATOMIC) &&
4279                         !(property->flags & DRM_MODE_PROP_IMMUTABLE))
4280                 return drm_atomic_get_property(obj, property, val);
4281
4282         for (i = 0; i < obj->properties->count; i++) {
4283                 if (obj->properties->properties[i] == property) {
4284                         *val = obj->properties->values[i];
4285                         return 0;
4286                 }
4287         }
4288
4289         return -EINVAL;
4290 }
4291 EXPORT_SYMBOL(drm_object_property_get_value);
4292
4293 /**
4294  * drm_mode_getproperty_ioctl - get the property metadata
4295  * @dev: DRM device
4296  * @data: ioctl data
4297  * @file_priv: DRM file info
4298  *
4299  * This function retrieves the metadata for a given property, like the different
4300  * possible values for an enum property or the limits for a range property.
4301  *
4302  * Blob properties are special
4303  *
4304  * Called by the user via ioctl.
4305  *
4306  * Returns:
4307  * Zero on success, negative errno on failure.
4308  */
4309 int drm_mode_getproperty_ioctl(struct drm_device *dev,
4310                                void *data, struct drm_file *file_priv)
4311 {
4312         struct drm_mode_get_property *out_resp = data;
4313         struct drm_property *property;
4314         int enum_count = 0;
4315         int value_count = 0;
4316         int ret = 0, i;
4317         int copied;
4318         struct drm_property_enum *prop_enum;
4319         struct drm_mode_property_enum __user *enum_ptr;
4320         uint64_t __user *values_ptr;
4321
4322         if (!drm_core_check_feature(dev, DRIVER_MODESET))
4323                 return -EINVAL;
4324
4325         drm_modeset_lock_all(dev);
4326         property = drm_property_find(dev, out_resp->prop_id);
4327         if (!property) {
4328                 ret = -ENOENT;
4329                 goto done;
4330         }
4331
4332         if (drm_property_type_is(property, DRM_MODE_PROP_ENUM) ||
4333                         drm_property_type_is(property, DRM_MODE_PROP_BITMASK)) {
4334                 list_for_each_entry(prop_enum, &property->enum_list, head)
4335                         enum_count++;
4336         }
4337
4338         value_count = property->num_values;
4339
4340         strncpy(out_resp->name, property->name, DRM_PROP_NAME_LEN);
4341         out_resp->name[DRM_PROP_NAME_LEN-1] = 0;
4342         out_resp->flags = property->flags;
4343
4344         if ((out_resp->count_values >= value_count) && value_count) {
4345                 values_ptr = (uint64_t __user *)(unsigned long)out_resp->values_ptr;
4346                 for (i = 0; i < value_count; i++) {
4347                         if (copy_to_user(values_ptr + i, &property->values[i], sizeof(uint64_t))) {
4348                                 ret = -EFAULT;
4349                                 goto done;
4350                         }
4351                 }
4352         }
4353         out_resp->count_values = value_count;
4354
4355         if (drm_property_type_is(property, DRM_MODE_PROP_ENUM) ||
4356                         drm_property_type_is(property, DRM_MODE_PROP_BITMASK)) {
4357                 if ((out_resp->count_enum_blobs >= enum_count) && enum_count) {
4358                         copied = 0;
4359                         enum_ptr = (struct drm_mode_property_enum __user *)(unsigned long)out_resp->enum_blob_ptr;
4360                         list_for_each_entry(prop_enum, &property->enum_list, head) {
4361
4362                                 if (copy_to_user(&enum_ptr[copied].value, &prop_enum->value, sizeof(uint64_t))) {
4363                                         ret = -EFAULT;
4364                                         goto done;
4365                                 }
4366
4367                                 if (copy_to_user(&enum_ptr[copied].name,
4368                                                  &prop_enum->name, DRM_PROP_NAME_LEN)) {
4369                                         ret = -EFAULT;
4370                                         goto done;
4371                                 }
4372                                 copied++;
4373                         }
4374                 }
4375                 out_resp->count_enum_blobs = enum_count;
4376         }
4377
4378         /*
4379          * NOTE: The idea seems to have been to use this to read all the blob
4380          * property values. But nothing ever added them to the corresponding
4381          * list, userspace always used the special-purpose get_blob ioctl to
4382          * read the value for a blob property. It also doesn't make a lot of
4383          * sense to return values here when everything else is just metadata for
4384          * the property itself.
4385          */
4386         if (drm_property_type_is(property, DRM_MODE_PROP_BLOB))
4387                 out_resp->count_enum_blobs = 0;
4388 done:
4389         drm_modeset_unlock_all(dev);
4390         return ret;
4391 }
4392
4393 static void drm_property_free_blob(struct kref *kref)
4394 {
4395         struct drm_property_blob *blob =
4396                 container_of(kref, struct drm_property_blob, base.refcount);
4397
4398         mutex_lock(&blob->dev->mode_config.blob_lock);
4399         list_del(&blob->head_global);
4400         mutex_unlock(&blob->dev->mode_config.blob_lock);
4401
4402         drm_mode_object_unregister(blob->dev, &blob->base);
4403
4404         kfree(blob);
4405 }
4406
4407 /**
4408  * drm_property_create_blob - Create new blob property
4409  *
4410  * Creates a new blob property for a specified DRM device, optionally
4411  * copying data.
4412  *
4413  * @dev: DRM device to create property for
4414  * @length: Length to allocate for blob data
4415  * @data: If specified, copies data into blob
4416  *
4417  * Returns:
4418  * New blob property with a single reference on success, or an ERR_PTR
4419  * value on failure.
4420  */
4421 struct drm_property_blob *
4422 drm_property_create_blob(struct drm_device *dev, size_t length,
4423                          const void *data)
4424 {
4425         struct drm_property_blob *blob;
4426         int ret;
4427
4428         if (!length || length > ULONG_MAX - sizeof(struct drm_property_blob))
4429                 return ERR_PTR(-EINVAL);
4430
4431         blob = kzalloc(sizeof(struct drm_property_blob)+length, GFP_KERNEL);
4432         if (!blob)
4433                 return ERR_PTR(-ENOMEM);
4434
4435         /* This must be explicitly initialised, so we can safely call list_del
4436          * on it in the removal handler, even if it isn't in a file list. */
4437         INIT_LIST_HEAD(&blob->head_file);
4438         blob->length = length;
4439         blob->dev = dev;
4440
4441         if (data)
4442                 memcpy(blob->data, data, length);
4443
4444         ret = drm_mode_object_get_reg(dev, &blob->base, DRM_MODE_OBJECT_BLOB,
4445                                       true, drm_property_free_blob);
4446         if (ret) {
4447                 kfree(blob);
4448                 return ERR_PTR(-EINVAL);
4449         }
4450
4451         mutex_lock(&dev->mode_config.blob_lock);
4452         list_add_tail(&blob->head_global,
4453                       &dev->mode_config.property_blob_list);
4454         mutex_unlock(&dev->mode_config.blob_lock);
4455
4456         return blob;
4457 }
4458 EXPORT_SYMBOL(drm_property_create_blob);
4459
4460 /**
4461  * drm_property_unreference_blob - Unreference a blob property
4462  *
4463  * Drop a reference on a blob property. May free the object.
4464  *
4465  * @blob: Pointer to blob property
4466  */
4467 void drm_property_unreference_blob(struct drm_property_blob *blob)
4468 {
4469         if (!blob)
4470                 return;
4471
4472         drm_mode_object_unreference(&blob->base);
4473 }
4474 EXPORT_SYMBOL(drm_property_unreference_blob);
4475
4476 /**
4477  * drm_property_destroy_user_blobs - destroy all blobs created by this client
4478  * @dev:       DRM device
4479  * @file_priv: destroy all blobs owned by this file handle
4480  */
4481 void drm_property_destroy_user_blobs(struct drm_device *dev,
4482                                      struct drm_file *file_priv)
4483 {
4484         struct drm_property_blob *blob, *bt;
4485
4486         /*
4487          * When the file gets released that means no one else can access the
4488          * blob list any more, so no need to grab dev->blob_lock.
4489          */
4490         list_for_each_entry_safe(blob, bt, &file_priv->blobs, head_file) {
4491                 list_del_init(&blob->head_file);
4492                 drm_property_unreference_blob(blob);
4493         }
4494 }
4495
4496 /**
4497  * drm_property_reference_blob - Take a reference on an existing property
4498  *
4499  * Take a new reference on an existing blob property.
4500  *
4501  * @blob: Pointer to blob property
4502  */
4503 struct drm_property_blob *drm_property_reference_blob(struct drm_property_blob *blob)
4504 {
4505         drm_mode_object_reference(&blob->base);
4506         return blob;
4507 }
4508 EXPORT_SYMBOL(drm_property_reference_blob);
4509
4510 /**
4511  * drm_property_lookup_blob - look up a blob property and take a reference
4512  * @dev: drm device
4513  * @id: id of the blob property
4514  *
4515  * If successful, this takes an additional reference to the blob property.
4516  * callers need to make sure to eventually unreference the returned property
4517  * again, using @drm_property_unreference_blob.
4518  */
4519 struct drm_property_blob *drm_property_lookup_blob(struct drm_device *dev,
4520                                                    uint32_t id)
4521 {
4522         struct drm_mode_object *obj;
4523         struct drm_property_blob *blob = NULL;
4524
4525         obj = _object_find(dev, id, DRM_MODE_OBJECT_BLOB);
4526         if (obj)
4527                 blob = obj_to_blob(obj);
4528         return blob;
4529 }
4530 EXPORT_SYMBOL(drm_property_lookup_blob);
4531
4532 /**
4533  * drm_property_replace_global_blob - atomically replace existing blob property
4534  * @dev: drm device
4535  * @replace: location of blob property pointer to be replaced
4536  * @length: length of data for new blob, or 0 for no data
4537  * @data: content for new blob, or NULL for no data
4538  * @obj_holds_id: optional object for property holding blob ID
4539  * @prop_holds_id: optional property holding blob ID
4540  * @return 0 on success or error on failure
4541  *
4542  * This function will atomically replace a global property in the blob list,
4543  * optionally updating a property which holds the ID of that property. It is
4544  * guaranteed to be atomic: no caller will be allowed to see intermediate
4545  * results, and either the entire operation will succeed and clean up the
4546  * previous property, or it will fail and the state will be unchanged.
4547  *
4548  * If length is 0 or data is NULL, no new blob will be created, and the holding
4549  * property, if specified, will be set to 0.
4550  *
4551  * Access to the replace pointer is assumed to be protected by the caller, e.g.
4552  * by holding the relevant modesetting object lock for its parent.
4553  *
4554  * For example, a drm_connector has a 'PATH' property, which contains the ID
4555  * of a blob property with the value of the MST path information. Calling this
4556  * function with replace pointing to the connector's path_blob_ptr, length and
4557  * data set for the new path information, obj_holds_id set to the connector's
4558  * base object, and prop_holds_id set to the path property name, will perform
4559  * a completely atomic update. The access to path_blob_ptr is protected by the
4560  * caller holding a lock on the connector.
4561  */
4562 static int drm_property_replace_global_blob(struct drm_device *dev,
4563                                             struct drm_property_blob **replace,
4564                                             size_t length,
4565                                             const void *data,
4566                                             struct drm_mode_object *obj_holds_id,
4567                                             struct drm_property *prop_holds_id)
4568 {
4569         struct drm_property_blob *new_blob = NULL;
4570         struct drm_property_blob *old_blob = NULL;
4571         int ret;
4572
4573         WARN_ON(replace == NULL);
4574
4575         old_blob = *replace;
4576
4577         if (length && data) {
4578                 new_blob = drm_property_create_blob(dev, length, data);
4579                 if (IS_ERR(new_blob))
4580                         return PTR_ERR(new_blob);
4581         }
4582
4583         /* This does not need to be synchronised with blob_lock, as the
4584          * get_properties ioctl locks all modesetting objects, and
4585          * obj_holds_id must be locked before calling here, so we cannot
4586          * have its value out of sync with the list membership modified
4587          * below under blob_lock. */
4588         if (obj_holds_id) {
4589                 ret = drm_object_property_set_value(obj_holds_id,
4590                                                     prop_holds_id,
4591                                                     new_blob ?
4592                                                         new_blob->base.id : 0);
4593                 if (ret != 0)
4594                         goto err_created;
4595         }
4596
4597         drm_property_unreference_blob(old_blob);
4598         *replace = new_blob;
4599
4600         return 0;
4601
4602 err_created:
4603         drm_property_unreference_blob(new_blob);
4604         return ret;
4605 }
4606
4607 /**
4608  * drm_mode_getblob_ioctl - get the contents of a blob property value
4609  * @dev: DRM device
4610  * @data: ioctl data
4611  * @file_priv: DRM file info
4612  *
4613  * This function retrieves the contents of a blob property. The value stored in
4614  * an object's blob property is just a normal modeset object id.
4615  *
4616  * Called by the user via ioctl.
4617  *
4618  * Returns:
4619  * Zero on success, negative errno on failure.
4620  */
4621 int drm_mode_getblob_ioctl(struct drm_device *dev,
4622                            void *data, struct drm_file *file_priv)
4623 {
4624         struct drm_mode_get_blob *out_resp = data;
4625         struct drm_property_blob *blob;
4626         int ret = 0;
4627         void __user *blob_ptr;
4628
4629         if (!drm_core_check_feature(dev, DRIVER_MODESET))
4630                 return -EINVAL;
4631
4632         blob = drm_property_lookup_blob(dev, out_resp->blob_id);
4633         if (!blob)
4634                 return -ENOENT;
4635
4636         if (out_resp->length == blob->length) {
4637                 blob_ptr = (void __user *)(unsigned long)out_resp->data;
4638                 if (copy_to_user(blob_ptr, blob->data, blob->length)) {
4639                         ret = -EFAULT;
4640                         goto unref;
4641                 }
4642         }
4643         out_resp->length = blob->length;
4644 unref:
4645         drm_property_unreference_blob(blob);
4646
4647         return ret;
4648 }
4649
4650 /**
4651  * drm_mode_createblob_ioctl - create a new blob property
4652  * @dev: DRM device
4653  * @data: ioctl data
4654  * @file_priv: DRM file info
4655  *
4656  * This function creates a new blob property with user-defined values. In order
4657  * to give us sensible validation and checking when creating, rather than at
4658  * every potential use, we also require a type to be provided upfront.
4659  *
4660  * Called by the user via ioctl.
4661  *
4662  * Returns:
4663  * Zero on success, negative errno on failure.
4664  */
4665 int drm_mode_createblob_ioctl(struct drm_device *dev,
4666                               void *data, struct drm_file *file_priv)
4667 {
4668         struct drm_mode_create_blob *out_resp = data;
4669         struct drm_property_blob *blob;
4670         void __user *blob_ptr;
4671         int ret = 0;
4672
4673         if (!drm_core_check_feature(dev, DRIVER_MODESET))
4674                 return -EINVAL;
4675
4676         blob = drm_property_create_blob(dev, out_resp->length, NULL);
4677         if (IS_ERR(blob))
4678                 return PTR_ERR(blob);
4679
4680         blob_ptr = (void __user *)(unsigned long)out_resp->data;
4681         if (copy_from_user(blob->data, blob_ptr, out_resp->length)) {
4682                 ret = -EFAULT;
4683                 goto out_blob;
4684         }
4685
4686         /* Dropping the lock between create_blob and our access here is safe
4687          * as only the same file_priv can remove the blob; at this point, it is
4688          * not associated with any file_priv. */
4689         mutex_lock(&dev->mode_config.blob_lock);
4690         out_resp->blob_id = blob->base.id;
4691         list_add_tail(&blob->head_file, &file_priv->blobs);
4692         mutex_unlock(&dev->mode_config.blob_lock);
4693
4694         return 0;
4695
4696 out_blob:
4697         drm_property_unreference_blob(blob);
4698         return ret;
4699 }
4700
4701 /**
4702  * drm_mode_destroyblob_ioctl - destroy a user blob property
4703  * @dev: DRM device
4704  * @data: ioctl data
4705  * @file_priv: DRM file info
4706  *
4707  * Destroy an existing user-defined blob property.
4708  *
4709  * Called by the user via ioctl.
4710  *
4711  * Returns:
4712  * Zero on success, negative errno on failure.
4713  */
4714 int drm_mode_destroyblob_ioctl(struct drm_device *dev,
4715                                void *data, struct drm_file *file_priv)
4716 {
4717         struct drm_mode_destroy_blob *out_resp = data;
4718         struct drm_property_blob *blob = NULL, *bt;
4719         bool found = false;
4720         int ret = 0;
4721
4722         if (!drm_core_check_feature(dev, DRIVER_MODESET))
4723                 return -EINVAL;
4724
4725         blob = drm_property_lookup_blob(dev, out_resp->blob_id);
4726         if (!blob)
4727                 return -ENOENT;
4728
4729         mutex_lock(&dev->mode_config.blob_lock);
4730         /* Ensure the property was actually created by this user. */
4731         list_for_each_entry(bt, &file_priv->blobs, head_file) {
4732                 if (bt == blob) {
4733                         found = true;
4734                         break;
4735                 }
4736         }
4737
4738         if (!found) {
4739                 ret = -EPERM;
4740                 goto err;
4741         }
4742
4743         /* We must drop head_file here, because we may not be the last
4744          * reference on the blob. */
4745         list_del_init(&blob->head_file);
4746         mutex_unlock(&dev->mode_config.blob_lock);
4747
4748         /* One reference from lookup, and one from the filp. */
4749         drm_property_unreference_blob(blob);
4750         drm_property_unreference_blob(blob);
4751
4752         return 0;
4753
4754 err:
4755         mutex_unlock(&dev->mode_config.blob_lock);
4756         drm_property_unreference_blob(blob);
4757
4758         return ret;
4759 }
4760
4761 /**
4762  * drm_mode_connector_set_path_property - set tile property on connector
4763  * @connector: connector to set property on.
4764  * @path: path to use for property; must not be NULL.
4765  *
4766  * This creates a property to expose to userspace to specify a
4767  * connector path. This is mainly used for DisplayPort MST where
4768  * connectors have a topology and we want to allow userspace to give
4769  * them more meaningful names.
4770  *
4771  * Returns:
4772  * Zero on success, negative errno on failure.
4773  */
4774 int drm_mode_connector_set_path_property(struct drm_connector *connector,
4775                                          const char *path)
4776 {
4777         struct drm_device *dev = connector->dev;
4778         int ret;
4779
4780         ret = drm_property_replace_global_blob(dev,
4781                                                &connector->path_blob_ptr,
4782                                                strlen(path) + 1,
4783                                                path,
4784                                                &connector->base,
4785                                                dev->mode_config.path_property);
4786         return ret;
4787 }
4788 EXPORT_SYMBOL(drm_mode_connector_set_path_property);
4789
4790 /**
4791  * drm_mode_connector_set_tile_property - set tile property on connector
4792  * @connector: connector to set property on.
4793  *
4794  * This looks up the tile information for a connector, and creates a
4795  * property for userspace to parse if it exists. The property is of
4796  * the form of 8 integers using ':' as a separator.
4797  *
4798  * Returns:
4799  * Zero on success, errno on failure.
4800  */
4801 int drm_mode_connector_set_tile_property(struct drm_connector *connector)
4802 {
4803         struct drm_device *dev = connector->dev;
4804         char tile[256];
4805         int ret;
4806
4807         if (!connector->has_tile) {
4808                 ret  = drm_property_replace_global_blob(dev,
4809                                                         &connector->tile_blob_ptr,
4810                                                         0,
4811                                                         NULL,
4812                                                         &connector->base,
4813                                                         dev->mode_config.tile_property);
4814                 return ret;
4815         }
4816
4817         snprintf(tile, 256, "%d:%d:%d:%d:%d:%d:%d:%d",
4818                  connector->tile_group->id, connector->tile_is_single_monitor,
4819                  connector->num_h_tile, connector->num_v_tile,
4820                  connector->tile_h_loc, connector->tile_v_loc,
4821                  connector->tile_h_size, connector->tile_v_size);
4822
4823         ret = drm_property_replace_global_blob(dev,
4824                                                &connector->tile_blob_ptr,
4825                                                strlen(tile) + 1,
4826                                                tile,
4827                                                &connector->base,
4828                                                dev->mode_config.tile_property);
4829         return ret;
4830 }
4831 EXPORT_SYMBOL(drm_mode_connector_set_tile_property);
4832
4833 /**
4834  * drm_mode_connector_update_edid_property - update the edid property of a connector
4835  * @connector: drm connector
4836  * @edid: new value of the edid property
4837  *
4838  * This function creates a new blob modeset object and assigns its id to the
4839  * connector's edid property.
4840  *
4841  * Returns:
4842  * Zero on success, negative errno on failure.
4843  */
4844 int drm_mode_connector_update_edid_property(struct drm_connector *connector,
4845                                             const struct edid *edid)
4846 {
4847         struct drm_device *dev = connector->dev;
4848         size_t size = 0;
4849         int ret;
4850
4851         /* ignore requests to set edid when overridden */
4852         if (connector->override_edid)
4853                 return 0;
4854
4855         if (edid)
4856                 size = EDID_LENGTH * (1 + edid->extensions);
4857
4858         ret = drm_property_replace_global_blob(dev,
4859                                                &connector->edid_blob_ptr,
4860                                                size,
4861                                                edid,
4862                                                &connector->base,
4863                                                dev->mode_config.edid_property);
4864         return ret;
4865 }
4866 EXPORT_SYMBOL(drm_mode_connector_update_edid_property);
4867
4868 /* Some properties could refer to dynamic refcnt'd objects, or things that
4869  * need special locking to handle lifetime issues (ie. to ensure the prop
4870  * value doesn't become invalid part way through the property update due to
4871  * race).  The value returned by reference via 'obj' should be passed back
4872  * to drm_property_change_valid_put() after the property is set (and the
4873  * object to which the property is attached has a chance to take it's own
4874  * reference).
4875  */
4876 bool drm_property_change_valid_get(struct drm_property *property,
4877                                          uint64_t value, struct drm_mode_object **ref)
4878 {
4879         int i;
4880
4881         if (property->flags & DRM_MODE_PROP_IMMUTABLE)
4882                 return false;
4883
4884         *ref = NULL;
4885
4886         if (drm_property_type_is(property, DRM_MODE_PROP_RANGE)) {
4887                 if (value < property->values[0] || value > property->values[1])
4888                         return false;
4889                 return true;
4890         } else if (drm_property_type_is(property, DRM_MODE_PROP_SIGNED_RANGE)) {
4891                 int64_t svalue = U642I64(value);
4892
4893                 if (svalue < U642I64(property->values[0]) ||
4894                                 svalue > U642I64(property->values[1]))
4895                         return false;
4896                 return true;
4897         } else if (drm_property_type_is(property, DRM_MODE_PROP_BITMASK)) {
4898                 uint64_t valid_mask = 0;
4899
4900                 for (i = 0; i < property->num_values; i++)
4901                         valid_mask |= (1ULL << property->values[i]);
4902                 return !(value & ~valid_mask);
4903         } else if (drm_property_type_is(property, DRM_MODE_PROP_BLOB)) {
4904                 struct drm_property_blob *blob;
4905
4906                 if (value == 0)
4907                         return true;
4908
4909                 blob = drm_property_lookup_blob(property->dev, value);
4910                 if (blob) {
4911                         *ref = &blob->base;
4912                         return true;
4913                 } else {
4914                         return false;
4915                 }
4916         } else if (drm_property_type_is(property, DRM_MODE_PROP_OBJECT)) {
4917                 /* a zero value for an object property translates to null: */
4918                 if (value == 0)
4919                         return true;
4920
4921                 *ref = _object_find(property->dev, value, property->values[0]);
4922                 return *ref != NULL;
4923         }
4924
4925         for (i = 0; i < property->num_values; i++)
4926                 if (property->values[i] == value)
4927                         return true;
4928         return false;
4929 }
4930
4931 void drm_property_change_valid_put(struct drm_property *property,
4932                 struct drm_mode_object *ref)
4933 {
4934         if (!ref)
4935                 return;
4936
4937         if (drm_property_type_is(property, DRM_MODE_PROP_OBJECT)) {
4938                 drm_mode_object_unreference(ref);
4939         } else if (drm_property_type_is(property, DRM_MODE_PROP_BLOB))
4940                 drm_property_unreference_blob(obj_to_blob(ref));
4941 }
4942
4943 /**
4944  * drm_mode_connector_property_set_ioctl - set the current value of a connector property
4945  * @dev: DRM device
4946  * @data: ioctl data
4947  * @file_priv: DRM file info
4948  *
4949  * This function sets the current value for a connectors's property. It also
4950  * calls into a driver's ->set_property callback to update the hardware state
4951  *
4952  * Called by the user via ioctl.
4953  *
4954  * Returns:
4955  * Zero on success, negative errno on failure.
4956  */
4957 int drm_mode_connector_property_set_ioctl(struct drm_device *dev,
4958                                        void *data, struct drm_file *file_priv)
4959 {
4960         struct drm_mode_connector_set_property *conn_set_prop = data;
4961         struct drm_mode_obj_set_property obj_set_prop = {
4962                 .value = conn_set_prop->value,
4963                 .prop_id = conn_set_prop->prop_id,
4964                 .obj_id = conn_set_prop->connector_id,
4965                 .obj_type = DRM_MODE_OBJECT_CONNECTOR
4966         };
4967
4968         /* It does all the locking and checking we need */
4969         return drm_mode_obj_set_property_ioctl(dev, &obj_set_prop, file_priv);
4970 }
4971
4972 static int drm_mode_connector_set_obj_prop(struct drm_mode_object *obj,
4973                                            struct drm_property *property,
4974                                            uint64_t value)
4975 {
4976         int ret = -EINVAL;
4977         struct drm_connector *connector = obj_to_connector(obj);
4978
4979         /* Do DPMS ourselves */
4980         if (property == connector->dev->mode_config.dpms_property) {
4981                 ret = (*connector->funcs->dpms)(connector, (int)value);
4982         } else if (connector->funcs->set_property)
4983                 ret = connector->funcs->set_property(connector, property, value);
4984
4985         /* store the property value if successful */
4986         if (!ret)
4987                 drm_object_property_set_value(&connector->base, property, value);
4988         return ret;
4989 }
4990
4991 static int drm_mode_crtc_set_obj_prop(struct drm_mode_object *obj,
4992                                       struct drm_property *property,
4993                                       uint64_t value)
4994 {
4995         int ret = -EINVAL;
4996         struct drm_crtc *crtc = obj_to_crtc(obj);
4997
4998         if (crtc->funcs->set_property)
4999                 ret = crtc->funcs->set_property(crtc, property, value);
5000         if (!ret)
5001                 drm_object_property_set_value(obj, property, value);
5002
5003         return ret;
5004 }
5005
5006 /**
5007  * drm_mode_plane_set_obj_prop - set the value of a property
5008  * @plane: drm plane object to set property value for
5009  * @property: property to set
5010  * @value: value the property should be set to
5011  *
5012  * This functions sets a given property on a given plane object. This function
5013  * calls the driver's ->set_property callback and changes the software state of
5014  * the property if the callback succeeds.
5015  *
5016  * Returns:
5017  * Zero on success, error code on failure.
5018  */
5019 int drm_mode_plane_set_obj_prop(struct drm_plane *plane,
5020                                 struct drm_property *property,
5021                                 uint64_t value)
5022 {
5023         int ret = -EINVAL;
5024         struct drm_mode_object *obj = &plane->base;
5025
5026         if (plane->funcs->set_property)
5027                 ret = plane->funcs->set_property(plane, property, value);
5028         if (!ret)
5029                 drm_object_property_set_value(obj, property, value);
5030
5031         return ret;
5032 }
5033 EXPORT_SYMBOL(drm_mode_plane_set_obj_prop);
5034
5035 /**
5036  * drm_mode_obj_get_properties_ioctl - get the current value of a object's property
5037  * @dev: DRM device
5038  * @data: ioctl data
5039  * @file_priv: DRM file info
5040  *
5041  * This function retrieves the current value for an object's property. Compared
5042  * to the connector specific ioctl this one is extended to also work on crtc and
5043  * plane objects.
5044  *
5045  * Called by the user via ioctl.
5046  *
5047  * Returns:
5048  * Zero on success, negative errno on failure.
5049  */
5050 int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,
5051                                       struct drm_file *file_priv)
5052 {
5053         struct drm_mode_obj_get_properties *arg = data;
5054         struct drm_mode_object *obj;
5055         int ret = 0;
5056
5057         if (!drm_core_check_feature(dev, DRIVER_MODESET))
5058                 return -EINVAL;
5059
5060         drm_modeset_lock_all(dev);
5061
5062         obj = drm_mode_object_find(dev, arg->obj_id, arg->obj_type);
5063         if (!obj) {
5064                 ret = -ENOENT;
5065                 goto out;
5066         }
5067         if (!obj->properties) {
5068                 ret = -EINVAL;
5069                 goto out_unref;
5070         }
5071
5072         ret = get_properties(obj, file_priv->atomic,
5073                         (uint32_t __user *)(unsigned long)(arg->props_ptr),
5074                         (uint64_t __user *)(unsigned long)(arg->prop_values_ptr),
5075                         &arg->count_props);
5076
5077 out_unref:
5078         drm_mode_object_unreference(obj);
5079 out:
5080         drm_modeset_unlock_all(dev);
5081         return ret;
5082 }
5083
5084 /**
5085  * drm_mode_obj_set_property_ioctl - set the current value of an object's property
5086  * @dev: DRM device
5087  * @data: ioctl data
5088  * @file_priv: DRM file info
5089  *
5090  * This function sets the current value for an object's property. It also calls
5091  * into a driver's ->set_property callback to update the hardware state.
5092  * Compared to the connector specific ioctl this one is extended to also work on
5093  * crtc and plane objects.
5094  *
5095  * Called by the user via ioctl.
5096  *
5097  * Returns:
5098  * Zero on success, negative errno on failure.
5099  */
5100 int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data,
5101                                     struct drm_file *file_priv)
5102 {
5103         struct drm_mode_obj_set_property *arg = data;
5104         struct drm_mode_object *arg_obj;
5105         struct drm_mode_object *prop_obj;
5106         struct drm_property *property;
5107         int i, ret = -EINVAL;
5108         struct drm_mode_object *ref;
5109
5110         if (!drm_core_check_feature(dev, DRIVER_MODESET))
5111                 return -EINVAL;
5112
5113         drm_modeset_lock_all(dev);
5114
5115         arg_obj = drm_mode_object_find(dev, arg->obj_id, arg->obj_type);
5116         if (!arg_obj) {
5117                 ret = -ENOENT;
5118                 goto out;
5119         }
5120         if (!arg_obj->properties)
5121                 goto out_unref;
5122
5123         for (i = 0; i < arg_obj->properties->count; i++)
5124                 if (arg_obj->properties->properties[i]->base.id == arg->prop_id)
5125                         break;
5126
5127         if (i == arg_obj->properties->count)
5128                 goto out_unref;
5129
5130         prop_obj = drm_mode_object_find(dev, arg->prop_id,
5131                                         DRM_MODE_OBJECT_PROPERTY);
5132         if (!prop_obj) {
5133                 ret = -ENOENT;
5134                 goto out_unref;
5135         }
5136         property = obj_to_property(prop_obj);
5137
5138         if (!drm_property_change_valid_get(property, arg->value, &ref))
5139                 goto out_unref;
5140
5141         switch (arg_obj->type) {
5142         case DRM_MODE_OBJECT_CONNECTOR:
5143                 ret = drm_mode_connector_set_obj_prop(arg_obj, property,
5144                                                       arg->value);
5145                 break;
5146         case DRM_MODE_OBJECT_CRTC:
5147                 ret = drm_mode_crtc_set_obj_prop(arg_obj, property, arg->value);
5148                 break;
5149         case DRM_MODE_OBJECT_PLANE:
5150                 ret = drm_mode_plane_set_obj_prop(obj_to_plane(arg_obj),
5151                                                   property, arg->value);
5152                 break;
5153         }
5154
5155         drm_property_change_valid_put(property, ref);
5156
5157 out_unref:
5158         drm_mode_object_unreference(arg_obj);
5159 out:
5160         drm_modeset_unlock_all(dev);
5161         return ret;
5162 }
5163
5164 /**
5165  * drm_mode_connector_attach_encoder - attach a connector to an encoder
5166  * @connector: connector to attach
5167  * @encoder: encoder to attach @connector to
5168  *
5169  * This function links up a connector to an encoder. Note that the routing
5170  * restrictions between encoders and crtcs are exposed to userspace through the
5171  * possible_clones and possible_crtcs bitmasks.
5172  *
5173  * Returns:
5174  * Zero on success, negative errno on failure.
5175  */
5176 int drm_mode_connector_attach_encoder(struct drm_connector *connector,
5177                                       struct drm_encoder *encoder)
5178 {
5179         int i;
5180
5181         /*
5182          * In the past, drivers have attempted to model the static association
5183          * of connector to encoder in simple connector/encoder devices using a
5184          * direct assignment of connector->encoder = encoder. This connection
5185          * is a logical one and the responsibility of the core, so drivers are
5186          * expected not to mess with this.
5187          *
5188          * Note that the error return should've been enough here, but a large
5189          * majority of drivers ignores the return value, so add in a big WARN
5190          * to get people's attention.
5191          */
5192         if (WARN_ON(connector->encoder))
5193                 return -EINVAL;
5194
5195         for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
5196                 if (connector->encoder_ids[i] == 0) {
5197                         connector->encoder_ids[i] = encoder->base.id;
5198                         return 0;
5199                 }
5200         }
5201         return -ENOMEM;
5202 }
5203 EXPORT_SYMBOL(drm_mode_connector_attach_encoder);
5204
5205 /**
5206  * drm_mode_crtc_set_gamma_size - set the gamma table size
5207  * @crtc: CRTC to set the gamma table size for
5208  * @gamma_size: size of the gamma table
5209  *
5210  * Drivers which support gamma tables should set this to the supported gamma
5211  * table size when initializing the CRTC. Currently the drm core only supports a
5212  * fixed gamma table size.
5213  *
5214  * Returns:
5215  * Zero on success, negative errno on failure.
5216  */
5217 int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc,
5218                                  int gamma_size)
5219 {
5220         uint16_t *r_base, *g_base, *b_base;
5221         int i;
5222
5223         crtc->gamma_size = gamma_size;
5224
5225         crtc->gamma_store = kcalloc(gamma_size, sizeof(uint16_t) * 3,
5226                                     GFP_KERNEL);
5227         if (!crtc->gamma_store) {
5228                 crtc->gamma_size = 0;
5229                 return -ENOMEM;
5230         }
5231
5232         r_base = crtc->gamma_store;
5233         g_base = r_base + gamma_size;
5234         b_base = g_base + gamma_size;
5235         for (i = 0; i < gamma_size; i++) {
5236                 r_base[i] = i << 8;
5237                 g_base[i] = i << 8;
5238                 b_base[i] = i << 8;
5239         }
5240
5241
5242         return 0;
5243 }
5244 EXPORT_SYMBOL(drm_mode_crtc_set_gamma_size);
5245
5246 /**
5247  * drm_mode_gamma_set_ioctl - set the gamma table
5248  * @dev: DRM device
5249  * @data: ioctl data
5250  * @file_priv: DRM file info
5251  *
5252  * Set the gamma table of a CRTC to the one passed in by the user. Userspace can
5253  * inquire the required gamma table size through drm_mode_gamma_get_ioctl.
5254  *
5255  * Called by the user via ioctl.
5256  *
5257  * Returns:
5258  * Zero on success, negative errno on failure.
5259  */
5260 int drm_mode_gamma_set_ioctl(struct drm_device *dev,
5261                              void *data, struct drm_file *file_priv)
5262 {
5263         struct drm_mode_crtc_lut *crtc_lut = data;
5264         struct drm_crtc *crtc;
5265         void *r_base, *g_base, *b_base;
5266         int size;
5267         int ret = 0;
5268
5269         if (!drm_core_check_feature(dev, DRIVER_MODESET))
5270                 return -EINVAL;
5271
5272         drm_modeset_lock_all(dev);
5273         crtc = drm_crtc_find(dev, crtc_lut->crtc_id);
5274         if (!crtc) {
5275                 ret = -ENOENT;
5276                 goto out;
5277         }
5278
5279         if (crtc->funcs->gamma_set == NULL) {
5280                 ret = -ENOSYS;
5281                 goto out;
5282         }
5283
5284         /* memcpy into gamma store */
5285         if (crtc_lut->gamma_size != crtc->gamma_size) {
5286                 ret = -EINVAL;
5287                 goto out;
5288         }
5289
5290         size = crtc_lut->gamma_size * (sizeof(uint16_t));
5291         r_base = crtc->gamma_store;
5292         if (copy_from_user(r_base, (void __user *)(unsigned long)crtc_lut->red, size)) {
5293                 ret = -EFAULT;
5294                 goto out;
5295         }
5296
5297         g_base = r_base + size;
5298         if (copy_from_user(g_base, (void __user *)(unsigned long)crtc_lut->green, size)) {
5299                 ret = -EFAULT;
5300                 goto out;
5301         }
5302
5303         b_base = g_base + size;
5304         if (copy_from_user(b_base, (void __user *)(unsigned long)crtc_lut->blue, size)) {
5305                 ret = -EFAULT;
5306                 goto out;
5307         }
5308
5309         ret = crtc->funcs->gamma_set(crtc, r_base, g_base, b_base, crtc->gamma_size);
5310
5311 out:
5312         drm_modeset_unlock_all(dev);
5313         return ret;
5314
5315 }
5316
5317 /**
5318  * drm_mode_gamma_get_ioctl - get the gamma table
5319  * @dev: DRM device
5320  * @data: ioctl data
5321  * @file_priv: DRM file info
5322  *
5323  * Copy the current gamma table into the storage provided. This also provides
5324  * the gamma table size the driver expects, which can be used to size the
5325  * allocated storage.
5326  *
5327  * Called by the user via ioctl.
5328  *
5329  * Returns:
5330  * Zero on success, negative errno on failure.
5331  */
5332 int drm_mode_gamma_get_ioctl(struct drm_device *dev,
5333                              void *data, struct drm_file *file_priv)
5334 {
5335         struct drm_mode_crtc_lut *crtc_lut = data;
5336         struct drm_crtc *crtc;
5337         void *r_base, *g_base, *b_base;
5338         int size;
5339         int ret = 0;
5340
5341         if (!drm_core_check_feature(dev, DRIVER_MODESET))
5342                 return -EINVAL;
5343
5344         drm_modeset_lock_all(dev);
5345         crtc = drm_crtc_find(dev, crtc_lut->crtc_id);
5346         if (!crtc) {
5347                 ret = -ENOENT;
5348                 goto out;
5349         }
5350
5351         /* memcpy into gamma store */
5352         if (crtc_lut->gamma_size != crtc->gamma_size) {
5353                 ret = -EINVAL;
5354                 goto out;
5355         }
5356
5357         size = crtc_lut->gamma_size * (sizeof(uint16_t));
5358         r_base = crtc->gamma_store;
5359         if (copy_to_user((void __user *)(unsigned long)crtc_lut->red, r_base, size)) {
5360                 ret = -EFAULT;
5361                 goto out;
5362         }
5363
5364         g_base = r_base + size;
5365         if (copy_to_user((void __user *)(unsigned long)crtc_lut->green, g_base, size)) {
5366                 ret = -EFAULT;
5367                 goto out;
5368         }
5369
5370         b_base = g_base + size;
5371         if (copy_to_user((void __user *)(unsigned long)crtc_lut->blue, b_base, size)) {
5372                 ret = -EFAULT;
5373                 goto out;
5374         }
5375 out:
5376         drm_modeset_unlock_all(dev);
5377         return ret;
5378 }
5379
5380 /**
5381  * drm_mode_page_flip_ioctl - schedule an asynchronous fb update
5382  * @dev: DRM device
5383  * @data: ioctl data
5384  * @file_priv: DRM file info
5385  *
5386  * This schedules an asynchronous update on a given CRTC, called page flip.
5387  * Optionally a drm event is generated to signal the completion of the event.
5388  * Generic drivers cannot assume that a pageflip with changed framebuffer
5389  * properties (including driver specific metadata like tiling layout) will work,
5390  * but some drivers support e.g. pixel format changes through the pageflip
5391  * ioctl.
5392  *
5393  * Called by the user via ioctl.
5394  *
5395  * Returns:
5396  * Zero on success, negative errno on failure.
5397  */
5398 int drm_mode_page_flip_ioctl(struct drm_device *dev,
5399                              void *data, struct drm_file *file_priv)
5400 {
5401         struct drm_mode_crtc_page_flip *page_flip = data;
5402         struct drm_crtc *crtc;
5403         struct drm_framebuffer *fb = NULL;
5404         struct drm_pending_vblank_event *e = NULL;
5405         int ret = -EINVAL;
5406
5407         if (!drm_core_check_feature(dev, DRIVER_MODESET))
5408                 return -EINVAL;
5409
5410         if (page_flip->flags & ~DRM_MODE_PAGE_FLIP_FLAGS ||
5411             page_flip->reserved != 0)
5412                 return -EINVAL;
5413
5414         if ((page_flip->flags & DRM_MODE_PAGE_FLIP_ASYNC) && !dev->mode_config.async_page_flip)
5415                 return -EINVAL;
5416
5417         crtc = drm_crtc_find(dev, page_flip->crtc_id);
5418         if (!crtc)
5419                 return -ENOENT;
5420
5421         drm_modeset_lock_crtc(crtc, crtc->primary);
5422         if (crtc->primary->fb == NULL) {
5423                 /* The framebuffer is currently unbound, presumably
5424                  * due to a hotplug event, that userspace has not
5425                  * yet discovered.
5426                  */
5427                 ret = -EBUSY;
5428                 goto out;
5429         }
5430
5431         if (crtc->funcs->page_flip == NULL)
5432                 goto out;
5433
5434         fb = drm_framebuffer_lookup(dev, page_flip->fb_id);
5435         if (!fb) {
5436                 ret = -ENOENT;
5437                 goto out;
5438         }
5439
5440         if (crtc->state) {
5441                 const struct drm_plane_state *state = crtc->primary->state;
5442
5443                 ret = check_src_coords(state->src_x, state->src_y,
5444                                        state->src_w, state->src_h, fb);
5445         } else {
5446                 ret = drm_crtc_check_viewport(crtc, crtc->x, crtc->y, &crtc->mode, fb);
5447         }
5448         if (ret)
5449                 goto out;
5450
5451         if (crtc->primary->fb->pixel_format != fb->pixel_format) {
5452                 DRM_DEBUG_KMS("Page flip is not allowed to change frame buffer format.\n");
5453                 ret = -EINVAL;
5454                 goto out;
5455         }
5456
5457         if (page_flip->flags & DRM_MODE_PAGE_FLIP_EVENT) {
5458                 e = kzalloc(sizeof *e, GFP_KERNEL);
5459                 if (!e) {
5460                         ret = -ENOMEM;
5461                         goto out;
5462                 }
5463                 e->event.base.type = DRM_EVENT_FLIP_COMPLETE;
5464                 e->event.base.length = sizeof(e->event);
5465                 e->event.user_data = page_flip->user_data;
5466                 ret = drm_event_reserve_init(dev, file_priv, &e->base, &e->event.base);
5467                 if (ret) {
5468                         kfree(e);
5469                         goto out;
5470                 }
5471         }
5472
5473         crtc->primary->old_fb = crtc->primary->fb;
5474         ret = crtc->funcs->page_flip(crtc, fb, e, page_flip->flags);
5475         if (ret) {
5476                 if (page_flip->flags & DRM_MODE_PAGE_FLIP_EVENT)
5477                         drm_event_cancel_free(dev, &e->base);
5478                 /* Keep the old fb, don't unref it. */
5479                 crtc->primary->old_fb = NULL;
5480         } else {
5481                 crtc->primary->fb = fb;
5482                 /* Unref only the old framebuffer. */
5483                 fb = NULL;
5484         }
5485
5486 out:
5487         if (fb)
5488                 drm_framebuffer_unreference(fb);
5489         if (crtc->primary->old_fb)
5490                 drm_framebuffer_unreference(crtc->primary->old_fb);
5491         crtc->primary->old_fb = NULL;
5492         drm_modeset_unlock_crtc(crtc);
5493
5494         return ret;
5495 }
5496
5497 /**
5498  * drm_mode_config_reset - call ->reset callbacks
5499  * @dev: drm device
5500  *
5501  * This functions calls all the crtc's, encoder's and connector's ->reset
5502  * callback. Drivers can use this in e.g. their driver load or resume code to
5503  * reset hardware and software state.
5504  */
5505 void drm_mode_config_reset(struct drm_device *dev)
5506 {
5507         struct drm_crtc *crtc;
5508         struct drm_plane *plane;
5509         struct drm_encoder *encoder;
5510         struct drm_connector *connector;
5511
5512         drm_for_each_plane(plane, dev)
5513                 if (plane->funcs->reset)
5514                         plane->funcs->reset(plane);
5515
5516         drm_for_each_crtc(crtc, dev)
5517                 if (crtc->funcs->reset)
5518                         crtc->funcs->reset(crtc);
5519
5520         drm_for_each_encoder(encoder, dev)
5521                 if (encoder->funcs->reset)
5522                         encoder->funcs->reset(encoder);
5523
5524         mutex_lock(&dev->mode_config.mutex);
5525         drm_for_each_connector(connector, dev)
5526                 if (connector->funcs->reset)
5527                         connector->funcs->reset(connector);
5528         mutex_unlock(&dev->mode_config.mutex);
5529 }
5530 EXPORT_SYMBOL(drm_mode_config_reset);
5531
5532 /**
5533  * drm_mode_create_dumb_ioctl - create a dumb backing storage buffer
5534  * @dev: DRM device
5535  * @data: ioctl data
5536  * @file_priv: DRM file info
5537  *
5538  * This creates a new dumb buffer in the driver's backing storage manager (GEM,
5539  * TTM or something else entirely) and returns the resulting buffer handle. This
5540  * handle can then be wrapped up into a framebuffer modeset object.
5541  *
5542  * Note that userspace is not allowed to use such objects for render
5543  * acceleration - drivers must create their own private ioctls for such a use
5544  * case.
5545  *
5546  * Called by the user via ioctl.
5547  *
5548  * Returns:
5549  * Zero on success, negative errno on failure.
5550  */
5551 int drm_mode_create_dumb_ioctl(struct drm_device *dev,
5552                                void *data, struct drm_file *file_priv)
5553 {
5554         struct drm_mode_create_dumb *args = data;
5555         u32 cpp, stride, size;
5556
5557         if (!dev->driver->dumb_create)
5558                 return -ENOSYS;
5559         if (!args->width || !args->height || !args->bpp)
5560                 return -EINVAL;
5561
5562         /* overflow checks for 32bit size calculations */
5563         /* NOTE: DIV_ROUND_UP() can overflow */
5564         cpp = DIV_ROUND_UP(args->bpp, 8);
5565         if (!cpp || cpp > 0xffffffffU / args->width)
5566                 return -EINVAL;
5567         stride = cpp * args->width;
5568         if (args->height > 0xffffffffU / stride)
5569                 return -EINVAL;
5570
5571         /* test for wrap-around */
5572         size = args->height * stride;
5573         if (PAGE_ALIGN(size) == 0)
5574                 return -EINVAL;
5575
5576         /*
5577          * handle, pitch and size are output parameters. Zero them out to
5578          * prevent drivers from accidentally using uninitialized data. Since
5579          * not all existing userspace is clearing these fields properly we
5580          * cannot reject IOCTL with garbage in them.
5581          */
5582         args->handle = 0;
5583         args->pitch = 0;
5584         args->size = 0;
5585
5586         return dev->driver->dumb_create(file_priv, dev, args);
5587 }
5588
5589 /**
5590  * drm_mode_mmap_dumb_ioctl - create an mmap offset for a dumb backing storage buffer
5591  * @dev: DRM device
5592  * @data: ioctl data
5593  * @file_priv: DRM file info
5594  *
5595  * Allocate an offset in the drm device node's address space to be able to
5596  * memory map a dumb buffer.
5597  *
5598  * Called by the user via ioctl.
5599  *
5600  * Returns:
5601  * Zero on success, negative errno on failure.
5602  */
5603 int drm_mode_mmap_dumb_ioctl(struct drm_device *dev,
5604                              void *data, struct drm_file *file_priv)
5605 {
5606         struct drm_mode_map_dumb *args = data;
5607
5608         /* call driver ioctl to get mmap offset */
5609         if (!dev->driver->dumb_map_offset)
5610                 return -ENOSYS;
5611
5612         return dev->driver->dumb_map_offset(file_priv, dev, args->handle, &args->offset);
5613 }
5614
5615 /**
5616  * drm_mode_destroy_dumb_ioctl - destroy a dumb backing strage buffer
5617  * @dev: DRM device
5618  * @data: ioctl data
5619  * @file_priv: DRM file info
5620  *
5621  * This destroys the userspace handle for the given dumb backing storage buffer.
5622  * Since buffer objects must be reference counted in the kernel a buffer object
5623  * won't be immediately freed if a framebuffer modeset object still uses it.
5624  *
5625  * Called by the user via ioctl.
5626  *
5627  * Returns:
5628  * Zero on success, negative errno on failure.
5629  */
5630 int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
5631                                 void *data, struct drm_file *file_priv)
5632 {
5633         struct drm_mode_destroy_dumb *args = data;
5634
5635         if (!dev->driver->dumb_destroy)
5636                 return -ENOSYS;
5637
5638         return dev->driver->dumb_destroy(file_priv, dev, args->handle);
5639 }
5640
5641 /**
5642  * drm_rotation_simplify() - Try to simplify the rotation
5643  * @rotation: Rotation to be simplified
5644  * @supported_rotations: Supported rotations
5645  *
5646  * Attempt to simplify the rotation to a form that is supported.
5647  * Eg. if the hardware supports everything except DRM_REFLECT_X
5648  * one could call this function like this:
5649  *
5650  * drm_rotation_simplify(rotation, BIT(DRM_ROTATE_0) |
5651  *                       BIT(DRM_ROTATE_90) | BIT(DRM_ROTATE_180) |
5652  *                       BIT(DRM_ROTATE_270) | BIT(DRM_REFLECT_Y));
5653  *
5654  * to eliminate the DRM_ROTATE_X flag. Depending on what kind of
5655  * transforms the hardware supports, this function may not
5656  * be able to produce a supported transform, so the caller should
5657  * check the result afterwards.
5658  */
5659 unsigned int drm_rotation_simplify(unsigned int rotation,
5660                                    unsigned int supported_rotations)
5661 {
5662         if (rotation & ~supported_rotations) {
5663                 rotation ^= BIT(DRM_REFLECT_X) | BIT(DRM_REFLECT_Y);
5664                 rotation = (rotation & DRM_REFLECT_MASK) |
5665                            BIT((ffs(rotation & DRM_ROTATE_MASK) + 1) % 4);
5666         }
5667
5668         return rotation;
5669 }
5670 EXPORT_SYMBOL(drm_rotation_simplify);
5671
5672 /**
5673  * drm_mode_config_init - initialize DRM mode_configuration structure
5674  * @dev: DRM device
5675  *
5676  * Initialize @dev's mode_config structure, used for tracking the graphics
5677  * configuration of @dev.
5678  *
5679  * Since this initializes the modeset locks, no locking is possible. Which is no
5680  * problem, since this should happen single threaded at init time. It is the
5681  * driver's problem to ensure this guarantee.
5682  *
5683  */
5684 void drm_mode_config_init(struct drm_device *dev)
5685 {
5686         mutex_init(&dev->mode_config.mutex);
5687         drm_modeset_lock_init(&dev->mode_config.connection_mutex);
5688         mutex_init(&dev->mode_config.idr_mutex);
5689         mutex_init(&dev->mode_config.fb_lock);
5690         mutex_init(&dev->mode_config.blob_lock);
5691         INIT_LIST_HEAD(&dev->mode_config.fb_list);
5692         INIT_LIST_HEAD(&dev->mode_config.crtc_list);
5693         INIT_LIST_HEAD(&dev->mode_config.connector_list);
5694         INIT_LIST_HEAD(&dev->mode_config.encoder_list);
5695         INIT_LIST_HEAD(&dev->mode_config.property_list);
5696         INIT_LIST_HEAD(&dev->mode_config.property_blob_list);
5697         INIT_LIST_HEAD(&dev->mode_config.plane_list);
5698         idr_init(&dev->mode_config.crtc_idr);
5699         idr_init(&dev->mode_config.tile_idr);
5700         ida_init(&dev->mode_config.connector_ida);
5701
5702         drm_modeset_lock_all(dev);
5703         drm_mode_create_standard_properties(dev);
5704         drm_modeset_unlock_all(dev);
5705
5706         /* Just to be sure */
5707         dev->mode_config.num_fb = 0;
5708         dev->mode_config.num_connector = 0;
5709         dev->mode_config.num_crtc = 0;
5710         dev->mode_config.num_encoder = 0;
5711         dev->mode_config.num_overlay_plane = 0;
5712         dev->mode_config.num_total_plane = 0;
5713 }
5714 EXPORT_SYMBOL(drm_mode_config_init);
5715
5716 /**
5717  * drm_mode_config_cleanup - free up DRM mode_config info
5718  * @dev: DRM device
5719  *
5720  * Free up all the connectors and CRTCs associated with this DRM device, then
5721  * free up the framebuffers and associated buffer objects.
5722  *
5723  * Note that since this /should/ happen single-threaded at driver/device
5724  * teardown time, no locking is required. It's the driver's job to ensure that
5725  * this guarantee actually holds true.
5726  *
5727  * FIXME: cleanup any dangling user buffer objects too
5728  */
5729 void drm_mode_config_cleanup(struct drm_device *dev)
5730 {
5731         struct drm_connector *connector, *ot;
5732         struct drm_crtc *crtc, *ct;
5733         struct drm_encoder *encoder, *enct;
5734         struct drm_framebuffer *fb, *fbt;
5735         struct drm_property *property, *pt;
5736         struct drm_property_blob *blob, *bt;
5737         struct drm_plane *plane, *plt;
5738
5739         list_for_each_entry_safe(encoder, enct, &dev->mode_config.encoder_list,
5740                                  head) {
5741                 encoder->funcs->destroy(encoder);
5742         }
5743
5744         list_for_each_entry_safe(connector, ot,
5745                                  &dev->mode_config.connector_list, head) {
5746                 connector->funcs->destroy(connector);
5747         }
5748
5749         list_for_each_entry_safe(property, pt, &dev->mode_config.property_list,
5750                                  head) {
5751                 drm_property_destroy(dev, property);
5752         }
5753
5754         list_for_each_entry_safe(plane, plt, &dev->mode_config.plane_list,
5755                                  head) {
5756                 plane->funcs->destroy(plane);
5757         }
5758
5759         list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) {
5760                 crtc->funcs->destroy(crtc);
5761         }
5762
5763         list_for_each_entry_safe(blob, bt, &dev->mode_config.property_blob_list,
5764                                  head_global) {
5765                 drm_property_unreference_blob(blob);
5766         }
5767
5768         /*
5769          * Single-threaded teardown context, so it's not required to grab the
5770          * fb_lock to protect against concurrent fb_list access. Contrary, it
5771          * would actually deadlock with the drm_framebuffer_cleanup function.
5772          *
5773          * Also, if there are any framebuffers left, that's a driver leak now,
5774          * so politely WARN about this.
5775          */
5776         WARN_ON(!list_empty(&dev->mode_config.fb_list));
5777         list_for_each_entry_safe(fb, fbt, &dev->mode_config.fb_list, head) {
5778                 drm_framebuffer_free(&fb->base.refcount);
5779         }
5780
5781         ida_destroy(&dev->mode_config.connector_ida);
5782         idr_destroy(&dev->mode_config.tile_idr);
5783         idr_destroy(&dev->mode_config.crtc_idr);
5784         drm_modeset_lock_fini(&dev->mode_config.connection_mutex);
5785 }
5786 EXPORT_SYMBOL(drm_mode_config_cleanup);
5787
5788 struct drm_property *drm_mode_create_rotation_property(struct drm_device *dev,
5789                                                        unsigned int supported_rotations)
5790 {
5791         static const struct drm_prop_enum_list props[] = {
5792                 { DRM_ROTATE_0,   "rotate-0" },
5793                 { DRM_ROTATE_90,  "rotate-90" },
5794                 { DRM_ROTATE_180, "rotate-180" },
5795                 { DRM_ROTATE_270, "rotate-270" },
5796                 { DRM_REFLECT_X,  "reflect-x" },
5797                 { DRM_REFLECT_Y,  "reflect-y" },
5798         };
5799
5800         return drm_property_create_bitmask(dev, 0, "rotation",
5801                                            props, ARRAY_SIZE(props),
5802                                            supported_rotations);
5803 }
5804 EXPORT_SYMBOL(drm_mode_create_rotation_property);
5805
5806 /**
5807  * DOC: Tile group
5808  *
5809  * Tile groups are used to represent tiled monitors with a unique
5810  * integer identifier. Tiled monitors using DisplayID v1.3 have
5811  * a unique 8-byte handle, we store this in a tile group, so we
5812  * have a common identifier for all tiles in a monitor group.
5813  */
5814 static void drm_tile_group_free(struct kref *kref)
5815 {
5816         struct drm_tile_group *tg = container_of(kref, struct drm_tile_group, refcount);
5817         struct drm_device *dev = tg->dev;
5818         mutex_lock(&dev->mode_config.idr_mutex);
5819         idr_remove(&dev->mode_config.tile_idr, tg->id);
5820         mutex_unlock(&dev->mode_config.idr_mutex);
5821         kfree(tg);
5822 }
5823
5824 /**
5825  * drm_mode_put_tile_group - drop a reference to a tile group.
5826  * @dev: DRM device
5827  * @tg: tile group to drop reference to.
5828  *
5829  * drop reference to tile group and free if 0.
5830  */
5831 void drm_mode_put_tile_group(struct drm_device *dev,
5832                              struct drm_tile_group *tg)
5833 {
5834         kref_put(&tg->refcount, drm_tile_group_free);
5835 }
5836
5837 /**
5838  * drm_mode_get_tile_group - get a reference to an existing tile group
5839  * @dev: DRM device
5840  * @topology: 8-bytes unique per monitor.
5841  *
5842  * Use the unique bytes to get a reference to an existing tile group.
5843  *
5844  * RETURNS:
5845  * tile group or NULL if not found.
5846  */
5847 struct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev,
5848                                                char topology[8])
5849 {
5850         struct drm_tile_group *tg;
5851         int id;
5852         mutex_lock(&dev->mode_config.idr_mutex);
5853         idr_for_each_entry(&dev->mode_config.tile_idr, tg, id) {
5854                 if (!memcmp(tg->group_data, topology, 8)) {
5855                         if (!kref_get_unless_zero(&tg->refcount))
5856                                 tg = NULL;
5857                         mutex_unlock(&dev->mode_config.idr_mutex);
5858                         return tg;
5859                 }
5860         }
5861         mutex_unlock(&dev->mode_config.idr_mutex);
5862         return NULL;
5863 }
5864 EXPORT_SYMBOL(drm_mode_get_tile_group);
5865
5866 /**
5867  * drm_mode_create_tile_group - create a tile group from a displayid description
5868  * @dev: DRM device
5869  * @topology: 8-bytes unique per monitor.
5870  *
5871  * Create a tile group for the unique monitor, and get a unique
5872  * identifier for the tile group.
5873  *
5874  * RETURNS:
5875  * new tile group or error.
5876  */
5877 struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
5878                                                   char topology[8])
5879 {
5880         struct drm_tile_group *tg;
5881         int ret;
5882
5883         tg = kzalloc(sizeof(*tg), GFP_KERNEL);
5884         if (!tg)
5885                 return ERR_PTR(-ENOMEM);
5886
5887         kref_init(&tg->refcount);
5888         memcpy(tg->group_data, topology, 8);
5889         tg->dev = dev;
5890
5891         mutex_lock(&dev->mode_config.idr_mutex);
5892         ret = idr_alloc(&dev->mode_config.tile_idr, tg, 1, 0, GFP_KERNEL);
5893         if (ret >= 0) {
5894                 tg->id = ret;
5895         } else {
5896                 kfree(tg);
5897                 tg = ERR_PTR(ret);
5898         }
5899
5900         mutex_unlock(&dev->mode_config.idr_mutex);
5901         return tg;
5902 }
5903 EXPORT_SYMBOL(drm_mode_create_tile_group);
5904
5905 /**
5906  * drm_crtc_enable_color_mgmt - enable color management properties
5907  * @crtc: DRM CRTC
5908  * @degamma_lut_size: the size of the degamma lut (before CSC)
5909  * @has_ctm: whether to attach ctm_property for CSC matrix
5910  * @gamma_lut_size: the size of the gamma lut (after CSC)
5911  *
5912  * This function lets the driver enable the color correction
5913  * properties on a CRTC. This includes 3 degamma, csc and gamma
5914  * properties that userspace can set and 2 size properties to inform
5915  * the userspace of the lut sizes. Each of the properties are
5916  * optional. The gamma and degamma properties are only attached if
5917  * their size is not 0 and ctm_property is only attached if has_ctm is
5918  * true.
5919  */
5920 void drm_crtc_enable_color_mgmt(struct drm_crtc *crtc,
5921                                 uint degamma_lut_size,
5922                                 bool has_ctm,
5923                                 uint gamma_lut_size)
5924 {
5925         struct drm_device *dev = crtc->dev;
5926         struct drm_mode_config *config = &dev->mode_config;
5927
5928         if (degamma_lut_size) {
5929                 drm_object_attach_property(&crtc->base,
5930                                            config->degamma_lut_property, 0);
5931                 drm_object_attach_property(&crtc->base,
5932                                            config->degamma_lut_size_property,
5933                                            degamma_lut_size);
5934         }
5935
5936         if (has_ctm)
5937                 drm_object_attach_property(&crtc->base,
5938                                            config->ctm_property, 0);
5939
5940         if (gamma_lut_size) {
5941                 drm_object_attach_property(&crtc->base,
5942                                            config->gamma_lut_property, 0);
5943                 drm_object_attach_property(&crtc->base,
5944                                            config->gamma_lut_size_property,
5945                                            gamma_lut_size);
5946         }
5947 }
5948 EXPORT_SYMBOL(drm_crtc_enable_color_mgmt);