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