]> Pileus Git - ~andy/linux/blob - drivers/gpu/drm/drm_crtc_helper.c
drm/i915: move is_dual_link_lvds to intel_lvds.c
[~andy/linux] / drivers / gpu / drm / drm_crtc_helper.c
1 /*
2  * Copyright (c) 2006-2008 Intel Corporation
3  * Copyright (c) 2007 Dave Airlie <airlied@linux.ie>
4  *
5  * DRM core CRTC related functions
6  *
7  * Permission to use, copy, modify, distribute, and sell this software and its
8  * documentation for any purpose is hereby granted without fee, provided that
9  * the above copyright notice appear in all copies and that both that copyright
10  * notice and this permission notice appear in supporting documentation, and
11  * that the name of the copyright holders not be used in advertising or
12  * publicity pertaining to distribution of the software without specific,
13  * written prior permission.  The copyright holders make no representations
14  * about the suitability of this software for any purpose.  It is provided "as
15  * is" without express or implied warranty.
16  *
17  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
18  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
19  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
20  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
22  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
23  * OF THIS SOFTWARE.
24  *
25  * Authors:
26  *      Keith Packard
27  *      Eric Anholt <eric@anholt.net>
28  *      Dave Airlie <airlied@linux.ie>
29  *      Jesse Barnes <jesse.barnes@intel.com>
30  */
31
32 #include <linux/export.h>
33 #include <linux/moduleparam.h>
34
35 #include <drm/drmP.h>
36 #include <drm/drm_crtc.h>
37 #include <drm/drm_fourcc.h>
38 #include <drm/drm_crtc_helper.h>
39 #include <drm/drm_fb_helper.h>
40 #include <drm/drm_edid.h>
41
42 void drm_helper_move_panel_connectors_to_head(struct drm_device *dev)
43 {
44         struct drm_connector *connector, *tmp;
45         struct list_head panel_list;
46
47         INIT_LIST_HEAD(&panel_list);
48
49         list_for_each_entry_safe(connector, tmp,
50                                  &dev->mode_config.connector_list, head) {
51                 if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS ||
52                     connector->connector_type == DRM_MODE_CONNECTOR_eDP)
53                         list_move_tail(&connector->head, &panel_list);
54         }
55
56         list_splice(&panel_list, &dev->mode_config.connector_list);
57 }
58 EXPORT_SYMBOL(drm_helper_move_panel_connectors_to_head);
59
60 static bool drm_kms_helper_poll = true;
61 module_param_named(poll, drm_kms_helper_poll, bool, 0600);
62
63 static void drm_mode_validate_flag(struct drm_connector *connector,
64                                    int flags)
65 {
66         struct drm_display_mode *mode;
67
68         if (flags == (DRM_MODE_FLAG_DBLSCAN | DRM_MODE_FLAG_INTERLACE))
69                 return;
70
71         list_for_each_entry(mode, &connector->modes, head) {
72                 if ((mode->flags & DRM_MODE_FLAG_INTERLACE) &&
73                                 !(flags & DRM_MODE_FLAG_INTERLACE))
74                         mode->status = MODE_NO_INTERLACE;
75                 if ((mode->flags & DRM_MODE_FLAG_DBLSCAN) &&
76                                 !(flags & DRM_MODE_FLAG_DBLSCAN))
77                         mode->status = MODE_NO_DBLESCAN;
78         }
79
80         return;
81 }
82
83 /**
84  * drm_helper_probe_single_connector_modes - get complete set of display modes
85  * @dev: DRM device
86  * @maxX: max width for modes
87  * @maxY: max height for modes
88  *
89  * LOCKING:
90  * Caller must hold mode config lock.
91  *
92  * Based on @dev's mode_config layout, scan all the connectors and try to detect
93  * modes on them.  Modes will first be added to the connector's probed_modes
94  * list, then culled (based on validity and the @maxX, @maxY parameters) and
95  * put into the normal modes list.
96  *
97  * Intended to be used either at bootup time or when major configuration
98  * changes have occurred.
99  *
100  * FIXME: take into account monitor limits
101  *
102  * RETURNS:
103  * Number of modes found on @connector.
104  */
105 int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
106                                             uint32_t maxX, uint32_t maxY)
107 {
108         struct drm_device *dev = connector->dev;
109         struct drm_display_mode *mode;
110         struct drm_connector_helper_funcs *connector_funcs =
111                 connector->helper_private;
112         int count = 0;
113         int mode_flags = 0;
114
115         DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", connector->base.id,
116                         drm_get_connector_name(connector));
117         /* set all modes to the unverified state */
118         list_for_each_entry(mode, &connector->modes, head)
119                 mode->status = MODE_UNVERIFIED;
120
121         if (connector->force) {
122                 if (connector->force == DRM_FORCE_ON)
123                         connector->status = connector_status_connected;
124                 else
125                         connector->status = connector_status_disconnected;
126                 if (connector->funcs->force)
127                         connector->funcs->force(connector);
128         } else {
129                 connector->status = connector->funcs->detect(connector, true);
130         }
131
132         /* Re-enable polling in case the global poll config changed. */
133         if (drm_kms_helper_poll != dev->mode_config.poll_running)
134                 drm_kms_helper_poll_enable(dev);
135
136         dev->mode_config.poll_running = drm_kms_helper_poll;
137
138         if (connector->status == connector_status_disconnected) {
139                 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] disconnected\n",
140                         connector->base.id, drm_get_connector_name(connector));
141                 drm_mode_connector_update_edid_property(connector, NULL);
142                 goto prune;
143         }
144
145 #ifdef CONFIG_DRM_LOAD_EDID_FIRMWARE
146         count = drm_load_edid_firmware(connector);
147         if (count == 0)
148 #endif
149                 count = (*connector_funcs->get_modes)(connector);
150
151         if (count == 0 && connector->status == connector_status_connected)
152                 count = drm_add_modes_noedid(connector, 1024, 768);
153         if (count == 0)
154                 goto prune;
155
156         drm_mode_connector_list_update(connector);
157
158         if (maxX && maxY)
159                 drm_mode_validate_size(dev, &connector->modes, maxX,
160                                        maxY, 0);
161
162         if (connector->interlace_allowed)
163                 mode_flags |= DRM_MODE_FLAG_INTERLACE;
164         if (connector->doublescan_allowed)
165                 mode_flags |= DRM_MODE_FLAG_DBLSCAN;
166         drm_mode_validate_flag(connector, mode_flags);
167
168         list_for_each_entry(mode, &connector->modes, head) {
169                 if (mode->status == MODE_OK)
170                         mode->status = connector_funcs->mode_valid(connector,
171                                                                    mode);
172         }
173
174 prune:
175         drm_mode_prune_invalid(dev, &connector->modes, true);
176
177         if (list_empty(&connector->modes))
178                 return 0;
179
180         drm_mode_sort(&connector->modes);
181
182         DRM_DEBUG_KMS("[CONNECTOR:%d:%s] probed modes :\n", connector->base.id,
183                         drm_get_connector_name(connector));
184         list_for_each_entry(mode, &connector->modes, head) {
185                 mode->vrefresh = drm_mode_vrefresh(mode);
186
187                 drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
188                 drm_mode_debug_printmodeline(mode);
189         }
190
191         return count;
192 }
193 EXPORT_SYMBOL(drm_helper_probe_single_connector_modes);
194
195 /**
196  * drm_helper_encoder_in_use - check if a given encoder is in use
197  * @encoder: encoder to check
198  *
199  * LOCKING:
200  * Caller must hold mode config lock.
201  *
202  * Walk @encoders's DRM device's mode_config and see if it's in use.
203  *
204  * RETURNS:
205  * True if @encoder is part of the mode_config, false otherwise.
206  */
207 bool drm_helper_encoder_in_use(struct drm_encoder *encoder)
208 {
209         struct drm_connector *connector;
210         struct drm_device *dev = encoder->dev;
211         list_for_each_entry(connector, &dev->mode_config.connector_list, head)
212                 if (connector->encoder == encoder)
213                         return true;
214         return false;
215 }
216 EXPORT_SYMBOL(drm_helper_encoder_in_use);
217
218 /**
219  * drm_helper_crtc_in_use - check if a given CRTC is in a mode_config
220  * @crtc: CRTC to check
221  *
222  * LOCKING:
223  * Caller must hold mode config lock.
224  *
225  * Walk @crtc's DRM device's mode_config and see if it's in use.
226  *
227  * RETURNS:
228  * True if @crtc is part of the mode_config, false otherwise.
229  */
230 bool drm_helper_crtc_in_use(struct drm_crtc *crtc)
231 {
232         struct drm_encoder *encoder;
233         struct drm_device *dev = crtc->dev;
234         /* FIXME: Locking around list access? */
235         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head)
236                 if (encoder->crtc == crtc && drm_helper_encoder_in_use(encoder))
237                         return true;
238         return false;
239 }
240 EXPORT_SYMBOL(drm_helper_crtc_in_use);
241
242 static void
243 drm_encoder_disable(struct drm_encoder *encoder)
244 {
245         struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
246
247         if (encoder_funcs->disable)
248                 (*encoder_funcs->disable)(encoder);
249         else
250                 (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
251 }
252
253 /**
254  * drm_helper_disable_unused_functions - disable unused objects
255  * @dev: DRM device
256  *
257  * LOCKING:
258  * Caller must hold mode config lock.
259  *
260  * If an connector or CRTC isn't part of @dev's mode_config, it can be disabled
261  * by calling its dpms function, which should power it off.
262  */
263 void drm_helper_disable_unused_functions(struct drm_device *dev)
264 {
265         struct drm_encoder *encoder;
266         struct drm_connector *connector;
267         struct drm_crtc *crtc;
268
269         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
270                 if (!connector->encoder)
271                         continue;
272                 if (connector->status == connector_status_disconnected)
273                         connector->encoder = NULL;
274         }
275
276         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
277                 if (!drm_helper_encoder_in_use(encoder)) {
278                         drm_encoder_disable(encoder);
279                         /* disconnector encoder from any connector */
280                         encoder->crtc = NULL;
281                 }
282         }
283
284         list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
285                 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
286                 crtc->enabled = drm_helper_crtc_in_use(crtc);
287                 if (!crtc->enabled) {
288                         if (crtc_funcs->disable)
289                                 (*crtc_funcs->disable)(crtc);
290                         else
291                                 (*crtc_funcs->dpms)(crtc, DRM_MODE_DPMS_OFF);
292                         crtc->fb = NULL;
293                 }
294         }
295 }
296 EXPORT_SYMBOL(drm_helper_disable_unused_functions);
297
298 /**
299  * drm_encoder_crtc_ok - can a given crtc drive a given encoder?
300  * @encoder: encoder to test
301  * @crtc: crtc to test
302  *
303  * Return false if @encoder can't be driven by @crtc, true otherwise.
304  */
305 static bool drm_encoder_crtc_ok(struct drm_encoder *encoder,
306                                 struct drm_crtc *crtc)
307 {
308         struct drm_device *dev;
309         struct drm_crtc *tmp;
310         int crtc_mask = 1;
311
312         WARN(!crtc, "checking null crtc?\n");
313
314         dev = crtc->dev;
315
316         list_for_each_entry(tmp, &dev->mode_config.crtc_list, head) {
317                 if (tmp == crtc)
318                         break;
319                 crtc_mask <<= 1;
320         }
321
322         if (encoder->possible_crtcs & crtc_mask)
323                 return true;
324         return false;
325 }
326
327 /*
328  * Check the CRTC we're going to map each output to vs. its current
329  * CRTC.  If they don't match, we have to disable the output and the CRTC
330  * since the driver will have to re-route things.
331  */
332 static void
333 drm_crtc_prepare_encoders(struct drm_device *dev)
334 {
335         struct drm_encoder_helper_funcs *encoder_funcs;
336         struct drm_encoder *encoder;
337
338         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
339                 encoder_funcs = encoder->helper_private;
340                 /* Disable unused encoders */
341                 if (encoder->crtc == NULL)
342                         drm_encoder_disable(encoder);
343                 /* Disable encoders whose CRTC is about to change */
344                 if (encoder_funcs->get_crtc &&
345                     encoder->crtc != (*encoder_funcs->get_crtc)(encoder))
346                         drm_encoder_disable(encoder);
347         }
348 }
349
350 /**
351  * drm_crtc_set_mode - set a mode
352  * @crtc: CRTC to program
353  * @mode: mode to use
354  * @x: horizontal offset into the surface
355  * @y: vertical offset into the surface
356  *
357  * LOCKING:
358  * Caller must hold mode config lock.
359  *
360  * Try to set @mode on @crtc.  Give @crtc and its associated connectors a chance
361  * to fixup or reject the mode prior to trying to set it.
362  *
363  * RETURNS:
364  * True if the mode was set successfully, or false otherwise.
365  */
366 bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
367                               struct drm_display_mode *mode,
368                               int x, int y,
369                               struct drm_framebuffer *old_fb)
370 {
371         struct drm_device *dev = crtc->dev;
372         struct drm_display_mode *adjusted_mode, saved_mode, saved_hwmode;
373         struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
374         struct drm_encoder_helper_funcs *encoder_funcs;
375         int saved_x, saved_y;
376         struct drm_encoder *encoder;
377         bool ret = true;
378
379         crtc->enabled = drm_helper_crtc_in_use(crtc);
380         if (!crtc->enabled)
381                 return true;
382
383         adjusted_mode = drm_mode_duplicate(dev, mode);
384         if (!adjusted_mode)
385                 return false;
386
387         saved_hwmode = crtc->hwmode;
388         saved_mode = crtc->mode;
389         saved_x = crtc->x;
390         saved_y = crtc->y;
391
392         /* Update crtc values up front so the driver can rely on them for mode
393          * setting.
394          */
395         crtc->mode = *mode;
396         crtc->x = x;
397         crtc->y = y;
398
399         /* Pass our mode to the connectors and the CRTC to give them a chance to
400          * adjust it according to limitations or connector properties, and also
401          * a chance to reject the mode entirely.
402          */
403         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
404
405                 if (encoder->crtc != crtc)
406                         continue;
407                 encoder_funcs = encoder->helper_private;
408                 if (!(ret = encoder_funcs->mode_fixup(encoder, mode,
409                                                       adjusted_mode))) {
410                         DRM_DEBUG_KMS("Encoder fixup failed\n");
411                         goto done;
412                 }
413         }
414
415         if (!(ret = crtc_funcs->mode_fixup(crtc, mode, adjusted_mode))) {
416                 DRM_DEBUG_KMS("CRTC fixup failed\n");
417                 goto done;
418         }
419         DRM_DEBUG_KMS("[CRTC:%d]\n", crtc->base.id);
420
421         /* Prepare the encoders and CRTCs before setting the mode. */
422         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
423
424                 if (encoder->crtc != crtc)
425                         continue;
426                 encoder_funcs = encoder->helper_private;
427                 /* Disable the encoders as the first thing we do. */
428                 encoder_funcs->prepare(encoder);
429         }
430
431         drm_crtc_prepare_encoders(dev);
432
433         crtc_funcs->prepare(crtc);
434
435         /* Set up the DPLL and any encoders state that needs to adjust or depend
436          * on the DPLL.
437          */
438         ret = !crtc_funcs->mode_set(crtc, mode, adjusted_mode, x, y, old_fb);
439         if (!ret)
440             goto done;
441
442         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
443
444                 if (encoder->crtc != crtc)
445                         continue;
446
447                 DRM_DEBUG_KMS("[ENCODER:%d:%s] set [MODE:%d:%s]\n",
448                         encoder->base.id, drm_get_encoder_name(encoder),
449                         mode->base.id, mode->name);
450                 encoder_funcs = encoder->helper_private;
451                 encoder_funcs->mode_set(encoder, mode, adjusted_mode);
452         }
453
454         /* Now enable the clocks, plane, pipe, and connectors that we set up. */
455         crtc_funcs->commit(crtc);
456
457         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
458
459                 if (encoder->crtc != crtc)
460                         continue;
461
462                 encoder_funcs = encoder->helper_private;
463                 encoder_funcs->commit(encoder);
464
465         }
466
467         /* Store real post-adjustment hardware mode. */
468         crtc->hwmode = *adjusted_mode;
469
470         /* Calculate and store various constants which
471          * are later needed by vblank and swap-completion
472          * timestamping. They are derived from true hwmode.
473          */
474         drm_calc_timestamping_constants(crtc);
475
476         /* FIXME: add subpixel order */
477 done:
478         drm_mode_destroy(dev, adjusted_mode);
479         if (!ret) {
480                 crtc->hwmode = saved_hwmode;
481                 crtc->mode = saved_mode;
482                 crtc->x = saved_x;
483                 crtc->y = saved_y;
484         }
485
486         return ret;
487 }
488 EXPORT_SYMBOL(drm_crtc_helper_set_mode);
489
490
491 static int
492 drm_crtc_helper_disable(struct drm_crtc *crtc)
493 {
494         struct drm_device *dev = crtc->dev;
495         struct drm_connector *connector;
496         struct drm_encoder *encoder;
497
498         /* Decouple all encoders and their attached connectors from this crtc */
499         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
500                 if (encoder->crtc != crtc)
501                         continue;
502
503                 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
504                         if (connector->encoder != encoder)
505                                 continue;
506
507                         connector->encoder = NULL;
508                 }
509         }
510
511         drm_helper_disable_unused_functions(dev);
512         return 0;
513 }
514
515 /**
516  * drm_crtc_helper_set_config - set a new config from userspace
517  * @crtc: CRTC to setup
518  * @crtc_info: user provided configuration
519  * @new_mode: new mode to set
520  * @connector_set: set of connectors for the new config
521  * @fb: new framebuffer
522  *
523  * LOCKING:
524  * Caller must hold mode config lock.
525  *
526  * Setup a new configuration, provided by the user in @crtc_info, and enable
527  * it.
528  *
529  * RETURNS:
530  * Zero. (FIXME)
531  */
532 int drm_crtc_helper_set_config(struct drm_mode_set *set)
533 {
534         struct drm_device *dev;
535         struct drm_crtc *save_crtcs, *new_crtc, *crtc;
536         struct drm_encoder *save_encoders, *new_encoder, *encoder;
537         struct drm_framebuffer *old_fb = NULL;
538         bool mode_changed = false; /* if true do a full mode set */
539         bool fb_changed = false; /* if true and !mode_changed just do a flip */
540         struct drm_connector *save_connectors, *connector;
541         int count = 0, ro, fail = 0;
542         struct drm_crtc_helper_funcs *crtc_funcs;
543         struct drm_mode_set save_set;
544         int ret;
545         int i;
546
547         DRM_DEBUG_KMS("\n");
548
549         if (!set)
550                 return -EINVAL;
551
552         if (!set->crtc)
553                 return -EINVAL;
554
555         if (!set->crtc->helper_private)
556                 return -EINVAL;
557
558         crtc_funcs = set->crtc->helper_private;
559
560         if (!set->mode)
561                 set->fb = NULL;
562
563         if (set->fb) {
564                 DRM_DEBUG_KMS("[CRTC:%d] [FB:%d] #connectors=%d (x y) (%i %i)\n",
565                                 set->crtc->base.id, set->fb->base.id,
566                                 (int)set->num_connectors, set->x, set->y);
567         } else {
568                 DRM_DEBUG_KMS("[CRTC:%d] [NOFB]\n", set->crtc->base.id);
569                 return drm_crtc_helper_disable(set->crtc);
570         }
571
572         dev = set->crtc->dev;
573
574         /* Allocate space for the backup of all (non-pointer) crtc, encoder and
575          * connector data. */
576         save_crtcs = kzalloc(dev->mode_config.num_crtc *
577                              sizeof(struct drm_crtc), GFP_KERNEL);
578         if (!save_crtcs)
579                 return -ENOMEM;
580
581         save_encoders = kzalloc(dev->mode_config.num_encoder *
582                                 sizeof(struct drm_encoder), GFP_KERNEL);
583         if (!save_encoders) {
584                 kfree(save_crtcs);
585                 return -ENOMEM;
586         }
587
588         save_connectors = kzalloc(dev->mode_config.num_connector *
589                                 sizeof(struct drm_connector), GFP_KERNEL);
590         if (!save_connectors) {
591                 kfree(save_crtcs);
592                 kfree(save_encoders);
593                 return -ENOMEM;
594         }
595
596         /* Copy data. Note that driver private data is not affected.
597          * Should anything bad happen only the expected state is
598          * restored, not the drivers personal bookkeeping.
599          */
600         count = 0;
601         list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
602                 save_crtcs[count++] = *crtc;
603         }
604
605         count = 0;
606         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
607                 save_encoders[count++] = *encoder;
608         }
609
610         count = 0;
611         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
612                 save_connectors[count++] = *connector;
613         }
614
615         save_set.crtc = set->crtc;
616         save_set.mode = &set->crtc->mode;
617         save_set.x = set->crtc->x;
618         save_set.y = set->crtc->y;
619         save_set.fb = set->crtc->fb;
620
621         /* We should be able to check here if the fb has the same properties
622          * and then just flip_or_move it */
623         if (set->crtc->fb != set->fb) {
624                 /* If we have no fb then treat it as a full mode set */
625                 if (set->crtc->fb == NULL) {
626                         DRM_DEBUG_KMS("crtc has no fb, full mode set\n");
627                         mode_changed = true;
628                 } else if (set->fb == NULL) {
629                         mode_changed = true;
630                 } else if (set->fb->depth != set->crtc->fb->depth) {
631                         mode_changed = true;
632                 } else if (set->fb->bits_per_pixel !=
633                            set->crtc->fb->bits_per_pixel) {
634                         mode_changed = true;
635                 } else
636                         fb_changed = true;
637         }
638
639         if (set->x != set->crtc->x || set->y != set->crtc->y)
640                 fb_changed = true;
641
642         if (set->mode && !drm_mode_equal(set->mode, &set->crtc->mode)) {
643                 DRM_DEBUG_KMS("modes are different, full mode set\n");
644                 drm_mode_debug_printmodeline(&set->crtc->mode);
645                 drm_mode_debug_printmodeline(set->mode);
646                 mode_changed = true;
647         }
648
649         /* a) traverse passed in connector list and get encoders for them */
650         count = 0;
651         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
652                 struct drm_connector_helper_funcs *connector_funcs =
653                         connector->helper_private;
654                 new_encoder = connector->encoder;
655                 for (ro = 0; ro < set->num_connectors; ro++) {
656                         if (set->connectors[ro] == connector) {
657                                 new_encoder = connector_funcs->best_encoder(connector);
658                                 /* if we can't get an encoder for a connector
659                                    we are setting now - then fail */
660                                 if (new_encoder == NULL)
661                                         /* don't break so fail path works correct */
662                                         fail = 1;
663                                 break;
664                         }
665                 }
666
667                 if (new_encoder != connector->encoder) {
668                         DRM_DEBUG_KMS("encoder changed, full mode switch\n");
669                         mode_changed = true;
670                         /* If the encoder is reused for another connector, then
671                          * the appropriate crtc will be set later.
672                          */
673                         if (connector->encoder)
674                                 connector->encoder->crtc = NULL;
675                         connector->encoder = new_encoder;
676                 }
677         }
678
679         if (fail) {
680                 ret = -EINVAL;
681                 goto fail;
682         }
683
684         count = 0;
685         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
686                 if (!connector->encoder)
687                         continue;
688
689                 if (connector->encoder->crtc == set->crtc)
690                         new_crtc = NULL;
691                 else
692                         new_crtc = connector->encoder->crtc;
693
694                 for (ro = 0; ro < set->num_connectors; ro++) {
695                         if (set->connectors[ro] == connector)
696                                 new_crtc = set->crtc;
697                 }
698
699                 /* Make sure the new CRTC will work with the encoder */
700                 if (new_crtc &&
701                     !drm_encoder_crtc_ok(connector->encoder, new_crtc)) {
702                         ret = -EINVAL;
703                         goto fail;
704                 }
705                 if (new_crtc != connector->encoder->crtc) {
706                         DRM_DEBUG_KMS("crtc changed, full mode switch\n");
707                         mode_changed = true;
708                         connector->encoder->crtc = new_crtc;
709                 }
710                 if (new_crtc) {
711                         DRM_DEBUG_KMS("[CONNECTOR:%d:%s] to [CRTC:%d]\n",
712                                 connector->base.id, drm_get_connector_name(connector),
713                                 new_crtc->base.id);
714                 } else {
715                         DRM_DEBUG_KMS("[CONNECTOR:%d:%s] to [NOCRTC]\n",
716                                 connector->base.id, drm_get_connector_name(connector));
717                 }
718         }
719
720         /* mode_set_base is not a required function */
721         if (fb_changed && !crtc_funcs->mode_set_base)
722                 mode_changed = true;
723
724         if (mode_changed) {
725                 set->crtc->enabled = drm_helper_crtc_in_use(set->crtc);
726                 if (set->crtc->enabled) {
727                         DRM_DEBUG_KMS("attempting to set mode from"
728                                         " userspace\n");
729                         drm_mode_debug_printmodeline(set->mode);
730                         old_fb = set->crtc->fb;
731                         set->crtc->fb = set->fb;
732                         if (!drm_crtc_helper_set_mode(set->crtc, set->mode,
733                                                       set->x, set->y,
734                                                       old_fb)) {
735                                 DRM_ERROR("failed to set mode on [CRTC:%d]\n",
736                                           set->crtc->base.id);
737                                 set->crtc->fb = old_fb;
738                                 ret = -EINVAL;
739                                 goto fail;
740                         }
741                         DRM_DEBUG_KMS("Setting connector DPMS state to on\n");
742                         for (i = 0; i < set->num_connectors; i++) {
743                                 DRM_DEBUG_KMS("\t[CONNECTOR:%d:%s] set DPMS on\n", set->connectors[i]->base.id,
744                                               drm_get_connector_name(set->connectors[i]));
745                                 set->connectors[i]->funcs->dpms(set->connectors[i], DRM_MODE_DPMS_ON);
746                         }
747                 }
748                 drm_helper_disable_unused_functions(dev);
749         } else if (fb_changed) {
750                 set->crtc->x = set->x;
751                 set->crtc->y = set->y;
752
753                 old_fb = set->crtc->fb;
754                 if (set->crtc->fb != set->fb)
755                         set->crtc->fb = set->fb;
756                 ret = crtc_funcs->mode_set_base(set->crtc,
757                                                 set->x, set->y, old_fb);
758                 if (ret != 0) {
759                         set->crtc->fb = old_fb;
760                         goto fail;
761                 }
762         }
763
764         kfree(save_connectors);
765         kfree(save_encoders);
766         kfree(save_crtcs);
767         return 0;
768
769 fail:
770         /* Restore all previous data. */
771         count = 0;
772         list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
773                 *crtc = save_crtcs[count++];
774         }
775
776         count = 0;
777         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
778                 *encoder = save_encoders[count++];
779         }
780
781         count = 0;
782         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
783                 *connector = save_connectors[count++];
784         }
785
786         /* Try to restore the config */
787         if (mode_changed &&
788             !drm_crtc_helper_set_mode(save_set.crtc, save_set.mode, save_set.x,
789                                       save_set.y, save_set.fb))
790                 DRM_ERROR("failed to restore config after modeset failure\n");
791
792         kfree(save_connectors);
793         kfree(save_encoders);
794         kfree(save_crtcs);
795         return ret;
796 }
797 EXPORT_SYMBOL(drm_crtc_helper_set_config);
798
799 static int drm_helper_choose_encoder_dpms(struct drm_encoder *encoder)
800 {
801         int dpms = DRM_MODE_DPMS_OFF;
802         struct drm_connector *connector;
803         struct drm_device *dev = encoder->dev;
804
805         list_for_each_entry(connector, &dev->mode_config.connector_list, head)
806                 if (connector->encoder == encoder)
807                         if (connector->dpms < dpms)
808                                 dpms = connector->dpms;
809         return dpms;
810 }
811
812 static int drm_helper_choose_crtc_dpms(struct drm_crtc *crtc)
813 {
814         int dpms = DRM_MODE_DPMS_OFF;
815         struct drm_connector *connector;
816         struct drm_device *dev = crtc->dev;
817
818         list_for_each_entry(connector, &dev->mode_config.connector_list, head)
819                 if (connector->encoder && connector->encoder->crtc == crtc)
820                         if (connector->dpms < dpms)
821                                 dpms = connector->dpms;
822         return dpms;
823 }
824
825 /**
826  * drm_helper_connector_dpms
827  * @connector affected connector
828  * @mode DPMS mode
829  *
830  * Calls the low-level connector DPMS function, then
831  * calls appropriate encoder and crtc DPMS functions as well
832  */
833 void drm_helper_connector_dpms(struct drm_connector *connector, int mode)
834 {
835         struct drm_encoder *encoder = connector->encoder;
836         struct drm_crtc *crtc = encoder ? encoder->crtc : NULL;
837         int old_dpms;
838
839         if (mode == connector->dpms)
840                 return;
841
842         old_dpms = connector->dpms;
843         connector->dpms = mode;
844
845         /* from off to on, do crtc then encoder */
846         if (mode < old_dpms) {
847                 if (crtc) {
848                         struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
849                         if (crtc_funcs->dpms)
850                                 (*crtc_funcs->dpms) (crtc,
851                                                      drm_helper_choose_crtc_dpms(crtc));
852                 }
853                 if (encoder) {
854                         struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
855                         if (encoder_funcs->dpms)
856                                 (*encoder_funcs->dpms) (encoder,
857                                                         drm_helper_choose_encoder_dpms(encoder));
858                 }
859         }
860
861         /* from on to off, do encoder then crtc */
862         if (mode > old_dpms) {
863                 if (encoder) {
864                         struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
865                         if (encoder_funcs->dpms)
866                                 (*encoder_funcs->dpms) (encoder,
867                                                         drm_helper_choose_encoder_dpms(encoder));
868                 }
869                 if (crtc) {
870                         struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
871                         if (crtc_funcs->dpms)
872                                 (*crtc_funcs->dpms) (crtc,
873                                                      drm_helper_choose_crtc_dpms(crtc));
874                 }
875         }
876
877         return;
878 }
879 EXPORT_SYMBOL(drm_helper_connector_dpms);
880
881 int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
882                                    struct drm_mode_fb_cmd2 *mode_cmd)
883 {
884         int i;
885
886         fb->width = mode_cmd->width;
887         fb->height = mode_cmd->height;
888         for (i = 0; i < 4; i++) {
889                 fb->pitches[i] = mode_cmd->pitches[i];
890                 fb->offsets[i] = mode_cmd->offsets[i];
891         }
892         drm_fb_get_bpp_depth(mode_cmd->pixel_format, &fb->depth,
893                                     &fb->bits_per_pixel);
894         fb->pixel_format = mode_cmd->pixel_format;
895
896         return 0;
897 }
898 EXPORT_SYMBOL(drm_helper_mode_fill_fb_struct);
899
900 int drm_helper_resume_force_mode(struct drm_device *dev)
901 {
902         struct drm_crtc *crtc;
903         struct drm_encoder *encoder;
904         struct drm_encoder_helper_funcs *encoder_funcs;
905         struct drm_crtc_helper_funcs *crtc_funcs;
906         int ret;
907
908         list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
909
910                 if (!crtc->enabled)
911                         continue;
912
913                 ret = drm_crtc_helper_set_mode(crtc, &crtc->mode,
914                                                crtc->x, crtc->y, crtc->fb);
915
916                 if (ret == false)
917                         DRM_ERROR("failed to set mode on crtc %p\n", crtc);
918
919                 /* Turn off outputs that were already powered off */
920                 if (drm_helper_choose_crtc_dpms(crtc)) {
921                         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
922
923                                 if(encoder->crtc != crtc)
924                                         continue;
925
926                                 encoder_funcs = encoder->helper_private;
927                                 if (encoder_funcs->dpms)
928                                         (*encoder_funcs->dpms) (encoder,
929                                                                 drm_helper_choose_encoder_dpms(encoder));
930                         }
931
932                         crtc_funcs = crtc->helper_private;
933                         if (crtc_funcs->dpms)
934                                 (*crtc_funcs->dpms) (crtc,
935                                                      drm_helper_choose_crtc_dpms(crtc));
936                 }
937         }
938         /* disable the unused connectors while restoring the modesetting */
939         drm_helper_disable_unused_functions(dev);
940         return 0;
941 }
942 EXPORT_SYMBOL(drm_helper_resume_force_mode);
943
944 void drm_kms_helper_hotplug_event(struct drm_device *dev)
945 {
946         /* send a uevent + call fbdev */
947         drm_sysfs_hotplug_event(dev);
948         if (dev->mode_config.funcs->output_poll_changed)
949                 dev->mode_config.funcs->output_poll_changed(dev);
950 }
951 EXPORT_SYMBOL(drm_kms_helper_hotplug_event);
952
953 #define DRM_OUTPUT_POLL_PERIOD (10*HZ)
954 static void output_poll_execute(struct work_struct *work)
955 {
956         struct delayed_work *delayed_work = to_delayed_work(work);
957         struct drm_device *dev = container_of(delayed_work, struct drm_device, mode_config.output_poll_work);
958         struct drm_connector *connector;
959         enum drm_connector_status old_status;
960         bool repoll = false, changed = false;
961
962         if (!drm_kms_helper_poll)
963                 return;
964
965         mutex_lock(&dev->mode_config.mutex);
966         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
967
968                 /* Ignore forced connectors. */
969                 if (connector->force)
970                         continue;
971
972                 /* Ignore HPD capable connectors and connectors where we don't
973                  * want any hotplug detection at all for polling. */
974                 if (!connector->polled || connector->polled == DRM_CONNECTOR_POLL_HPD)
975                         continue;
976
977                 repoll = true;
978
979                 old_status = connector->status;
980                 /* if we are connected and don't want to poll for disconnect
981                    skip it */
982                 if (old_status == connector_status_connected &&
983                     !(connector->polled & DRM_CONNECTOR_POLL_DISCONNECT))
984                         continue;
985
986                 connector->status = connector->funcs->detect(connector, false);
987                 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %d to %d\n",
988                               connector->base.id,
989                               drm_get_connector_name(connector),
990                               old_status, connector->status);
991                 if (old_status != connector->status)
992                         changed = true;
993         }
994
995         mutex_unlock(&dev->mode_config.mutex);
996
997         if (changed)
998                 drm_kms_helper_hotplug_event(dev);
999
1000         if (repoll)
1001                 schedule_delayed_work(delayed_work, DRM_OUTPUT_POLL_PERIOD);
1002 }
1003
1004 void drm_kms_helper_poll_disable(struct drm_device *dev)
1005 {
1006         if (!dev->mode_config.poll_enabled)
1007                 return;
1008         cancel_delayed_work_sync(&dev->mode_config.output_poll_work);
1009 }
1010 EXPORT_SYMBOL(drm_kms_helper_poll_disable);
1011
1012 void drm_kms_helper_poll_enable(struct drm_device *dev)
1013 {
1014         bool poll = false;
1015         struct drm_connector *connector;
1016
1017         if (!dev->mode_config.poll_enabled || !drm_kms_helper_poll)
1018                 return;
1019
1020         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1021                 if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT |
1022                                          DRM_CONNECTOR_POLL_DISCONNECT))
1023                         poll = true;
1024         }
1025
1026         if (poll)
1027                 schedule_delayed_work(&dev->mode_config.output_poll_work, DRM_OUTPUT_POLL_PERIOD);
1028 }
1029 EXPORT_SYMBOL(drm_kms_helper_poll_enable);
1030
1031 void drm_kms_helper_poll_init(struct drm_device *dev)
1032 {
1033         INIT_DELAYED_WORK(&dev->mode_config.output_poll_work, output_poll_execute);
1034         dev->mode_config.poll_enabled = true;
1035
1036         drm_kms_helper_poll_enable(dev);
1037 }
1038 EXPORT_SYMBOL(drm_kms_helper_poll_init);
1039
1040 void drm_kms_helper_poll_fini(struct drm_device *dev)
1041 {
1042         drm_kms_helper_poll_disable(dev);
1043 }
1044 EXPORT_SYMBOL(drm_kms_helper_poll_fini);
1045
1046 void drm_helper_hpd_irq_event(struct drm_device *dev)
1047 {
1048         struct drm_connector *connector;
1049         enum drm_connector_status old_status;
1050         bool changed = false;
1051
1052         if (!dev->mode_config.poll_enabled)
1053                 return;
1054
1055         mutex_lock(&dev->mode_config.mutex);
1056         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1057
1058                 /* Only handle HPD capable connectors. */
1059                 if (!(connector->polled & DRM_CONNECTOR_POLL_HPD))
1060                         continue;
1061
1062                 old_status = connector->status;
1063
1064                 connector->status = connector->funcs->detect(connector, false);
1065                 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %d to %d\n",
1066                               connector->base.id,
1067                               drm_get_connector_name(connector),
1068                               old_status, connector->status);
1069                 if (old_status != connector->status)
1070                         changed = true;
1071         }
1072
1073         mutex_unlock(&dev->mode_config.mutex);
1074
1075         if (changed)
1076                 drm_kms_helper_hotplug_event(dev);
1077 }
1078 EXPORT_SYMBOL(drm_helper_hpd_irq_event);