diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/gpu/drm/drm_crtc_helper.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (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.c | 58 |
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 */ |
433 | done: | 440 | done: |
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 | ||