aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_crtc_helper.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/gpu/drm/drm_crtc_helper.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'drivers/gpu/drm/drm_crtc_helper.c')
-rw-r--r--drivers/gpu/drm/drm_crtc_helper.c58
1 files changed, 42 insertions, 16 deletions
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
index dcbeb98f195a..92369655dca3 100644
--- a/drivers/gpu/drm/drm_crtc_helper.c
+++ b/drivers/gpu/drm/drm_crtc_helper.c
@@ -276,7 +276,7 @@ static bool drm_encoder_crtc_ok(struct drm_encoder *encoder,
276 struct drm_crtc *tmp; 276 struct drm_crtc *tmp;
277 int crtc_mask = 1; 277 int crtc_mask = 1;
278 278
279 WARN(!crtc, "checking null crtc?"); 279 WARN(!crtc, "checking null crtc?\n");
280 280
281 dev = crtc->dev; 281 dev = crtc->dev;
282 282
@@ -336,20 +336,20 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
336 struct drm_framebuffer *old_fb) 336 struct drm_framebuffer *old_fb)
337{ 337{
338 struct drm_device *dev = crtc->dev; 338 struct drm_device *dev = crtc->dev;
339 struct drm_display_mode *adjusted_mode, saved_mode; 339 struct drm_display_mode *adjusted_mode, saved_mode, saved_hwmode;
340 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 340 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
341 struct drm_encoder_helper_funcs *encoder_funcs; 341 struct drm_encoder_helper_funcs *encoder_funcs;
342 int saved_x, saved_y; 342 int saved_x, saved_y;
343 struct drm_encoder *encoder; 343 struct drm_encoder *encoder;
344 bool ret = true; 344 bool ret = true;
345 345
346 adjusted_mode = drm_mode_duplicate(dev, mode);
347
348 crtc->enabled = drm_helper_crtc_in_use(crtc); 346 crtc->enabled = drm_helper_crtc_in_use(crtc);
349
350 if (!crtc->enabled) 347 if (!crtc->enabled)
351 return true; 348 return true;
352 349
350 adjusted_mode = drm_mode_duplicate(dev, mode);
351
352 saved_hwmode = crtc->hwmode;
353 saved_mode = crtc->mode; 353 saved_mode = crtc->mode;
354 saved_x = crtc->x; 354 saved_x = crtc->x;
355 saved_y = crtc->y; 355 saved_y = crtc->y;
@@ -427,11 +427,20 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
427 427
428 } 428 }
429 429
430 /* XXX free adjustedmode */ 430 /* Store real post-adjustment hardware mode. */
431 drm_mode_destroy(dev, adjusted_mode); 431 crtc->hwmode = *adjusted_mode;
432
433 /* Calculate and store various constants which
434 * are later needed by vblank and swap-completion
435 * timestamping. They are derived from true hwmode.
436 */
437 drm_calc_timestamping_constants(crtc);
438
432 /* FIXME: add subpixel order */ 439 /* FIXME: add subpixel order */
433done: 440done:
441 drm_mode_destroy(dev, adjusted_mode);
434 if (!ret) { 442 if (!ret) {
443 crtc->hwmode = saved_hwmode;
435 crtc->mode = saved_mode; 444 crtc->mode = saved_mode;
436 crtc->x = saved_x; 445 crtc->x = saved_x;
437 crtc->y = saved_y; 446 crtc->y = saved_y;
@@ -471,6 +480,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
471 int count = 0, ro, fail = 0; 480 int count = 0, ro, fail = 0;
472 struct drm_crtc_helper_funcs *crtc_funcs; 481 struct drm_crtc_helper_funcs *crtc_funcs;
473 int ret = 0; 482 int ret = 0;
483 int i;
474 484
475 DRM_DEBUG_KMS("\n"); 485 DRM_DEBUG_KMS("\n");
476 486
@@ -485,14 +495,17 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
485 495
486 crtc_funcs = set->crtc->helper_private; 496 crtc_funcs = set->crtc->helper_private;
487 497
498 if (!set->mode)
499 set->fb = NULL;
500
488 if (set->fb) { 501 if (set->fb) {
489 DRM_DEBUG_KMS("[CRTC:%d] [FB:%d] #connectors=%d (x y) (%i %i)\n", 502 DRM_DEBUG_KMS("[CRTC:%d] [FB:%d] #connectors=%d (x y) (%i %i)\n",
490 set->crtc->base.id, set->fb->base.id, 503 set->crtc->base.id, set->fb->base.id,
491 (int)set->num_connectors, set->x, set->y); 504 (int)set->num_connectors, set->x, set->y);
492 } else { 505 } else {
493 DRM_DEBUG_KMS("[CRTC:%d] [NOFB] #connectors=%d (x y) (%i %i)\n", 506 DRM_DEBUG_KMS("[CRTC:%d] [NOFB]\n", set->crtc->base.id);
494 set->crtc->base.id, (int)set->num_connectors, 507 set->mode = NULL;
495 set->x, set->y); 508 set->num_connectors = 0;
496 } 509 }
497 510
498 dev = set->crtc->dev; 511 dev = set->crtc->dev;
@@ -637,8 +650,8 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
637 mode_changed = true; 650 mode_changed = true;
638 651
639 if (mode_changed) { 652 if (mode_changed) {
640 set->crtc->enabled = (set->mode != NULL); 653 set->crtc->enabled = drm_helper_crtc_in_use(set->crtc);
641 if (set->mode != NULL) { 654 if (set->crtc->enabled) {
642 DRM_DEBUG_KMS("attempting to set mode from" 655 DRM_DEBUG_KMS("attempting to set mode from"
643 " userspace\n"); 656 " userspace\n");
644 drm_mode_debug_printmodeline(set->mode); 657 drm_mode_debug_printmodeline(set->mode);
@@ -649,9 +662,16 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
649 old_fb)) { 662 old_fb)) {
650 DRM_ERROR("failed to set mode on [CRTC:%d]\n", 663 DRM_ERROR("failed to set mode on [CRTC:%d]\n",
651 set->crtc->base.id); 664 set->crtc->base.id);
665 set->crtc->fb = old_fb;
652 ret = -EINVAL; 666 ret = -EINVAL;
653 goto fail; 667 goto fail;
654 } 668 }
669 DRM_DEBUG_KMS("Setting connector DPMS state to on\n");
670 for (i = 0; i < set->num_connectors; i++) {
671 DRM_DEBUG_KMS("\t[CONNECTOR:%d:%s] set DPMS on\n", set->connectors[i]->base.id,
672 drm_get_connector_name(set->connectors[i]));
673 set->connectors[i]->dpms = DRM_MODE_DPMS_ON;
674 }
655 } 675 }
656 drm_helper_disable_unused_functions(dev); 676 drm_helper_disable_unused_functions(dev);
657 } else if (fb_changed) { 677 } else if (fb_changed) {
@@ -663,8 +683,10 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
663 set->crtc->fb = set->fb; 683 set->crtc->fb = set->fb;
664 ret = crtc_funcs->mode_set_base(set->crtc, 684 ret = crtc_funcs->mode_set_base(set->crtc,
665 set->x, set->y, old_fb); 685 set->x, set->y, old_fb);
666 if (ret != 0) 686 if (ret != 0) {
687 set->crtc->fb = old_fb;
667 goto fail; 688 goto fail;
689 }
668 } 690 }
669 691
670 kfree(save_connectors); 692 kfree(save_connectors);
@@ -841,7 +863,7 @@ static void output_poll_execute(struct work_struct *work)
841 struct delayed_work *delayed_work = to_delayed_work(work); 863 struct delayed_work *delayed_work = to_delayed_work(work);
842 struct drm_device *dev = container_of(delayed_work, struct drm_device, mode_config.output_poll_work); 864 struct drm_device *dev = container_of(delayed_work, struct drm_device, mode_config.output_poll_work);
843 struct drm_connector *connector; 865 struct drm_connector *connector;
844 enum drm_connector_status old_status, status; 866 enum drm_connector_status old_status;
845 bool repoll = false, changed = false; 867 bool repoll = false, changed = false;
846 868
847 if (!drm_kms_helper_poll) 869 if (!drm_kms_helper_poll)
@@ -866,8 +888,12 @@ static void output_poll_execute(struct work_struct *work)
866 !(connector->polled & DRM_CONNECTOR_POLL_HPD)) 888 !(connector->polled & DRM_CONNECTOR_POLL_HPD))
867 continue; 889 continue;
868 890
869 status = connector->funcs->detect(connector, false); 891 connector->status = connector->funcs->detect(connector, false);
870 if (old_status != status) 892 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %d to %d\n",
893 connector->base.id,
894 drm_get_connector_name(connector),
895 old_status, connector->status);
896 if (old_status != connector->status)
871 changed = true; 897 changed = true;
872 } 898 }
873 899