aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>2015-06-16 04:49:45 -0400
committerJani Nikula <jani.nikula@intel.com>2015-06-17 07:21:01 -0400
commit4ed9fb371ccdfe465bd3bbb69e4cad5243e6c4e2 (patch)
tree03d2605887cad927ed14d70868cd9114dfadcc61
parent0d26fb891a119d78d8e4b345cfd0be0f2112cb7a (diff)
drm/i915: Don't set enabled value of all CRTCs when restoring the mode
The code in intel_crtc_restore_mode() sets the enabled value of all the CRTCs when restoring the mode after a suspend/resume cycle. When more than one CRTC is enabled, that causes drm_atomic_helper_check_modeset() to fail if there is more than one pipe enabled, since all but one CRTC has valid connector data. Instead, set only the enabled value for the CRTC passed as an argument. v2: Don't leak atomic state. (Matt) Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90468 References: https://bugs.freedesktop.org/show_bug.cgi?id=90396 Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com> Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
-rw-r--r--drivers/gpu/drm/i915/intel_display.c27
1 files changed, 10 insertions, 17 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index ff7175b6a013..e047105837c9 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12683,7 +12683,6 @@ void intel_crtc_restore_mode(struct drm_crtc *crtc)
12683{ 12683{
12684 struct drm_device *dev = crtc->dev; 12684 struct drm_device *dev = crtc->dev;
12685 struct drm_atomic_state *state; 12685 struct drm_atomic_state *state;
12686 struct intel_crtc *intel_crtc;
12687 struct intel_encoder *encoder; 12686 struct intel_encoder *encoder;
12688 struct intel_connector *connector; 12687 struct intel_connector *connector;
12689 struct drm_connector_state *connector_state; 12688 struct drm_connector_state *connector_state;
@@ -12726,24 +12725,18 @@ void intel_crtc_restore_mode(struct drm_crtc *crtc)
12726 } 12725 }
12727 } 12726 }
12728 12727
12729 for_each_intel_crtc(dev, intel_crtc) { 12728 crtc_state = intel_atomic_get_crtc_state(state, to_intel_crtc(crtc));
12730 if (intel_crtc->new_enabled == intel_crtc->base.enabled) 12729 if (IS_ERR(crtc_state)) {
12731 continue; 12730 DRM_DEBUG_KMS("Failed to add [CRTC:%d] to state: %ld\n",
12732 12731 crtc->base.id, PTR_ERR(crtc_state));
12733 crtc_state = intel_atomic_get_crtc_state(state, intel_crtc); 12732 drm_atomic_state_free(state);
12734 if (IS_ERR(crtc_state)) { 12733 return;
12735 DRM_DEBUG_KMS("Failed to add [CRTC:%d] to state: %ld\n", 12734 }
12736 intel_crtc->base.base.id,
12737 PTR_ERR(crtc_state));
12738 continue;
12739 }
12740 12735
12741 crtc_state->base.active = crtc_state->base.enable = 12736 crtc_state->base.active = crtc_state->base.enable =
12742 intel_crtc->new_enabled; 12737 to_intel_crtc(crtc)->new_enabled;
12743 12738
12744 if (&intel_crtc->base == crtc) 12739 drm_mode_copy(&crtc_state->base.mode, &crtc->mode);
12745 drm_mode_copy(&crtc_state->base.mode, &crtc->mode);
12746 }
12747 12740
12748 intel_modeset_setup_plane_state(state, crtc, &crtc->mode, 12741 intel_modeset_setup_plane_state(state, crtc, &crtc->mode,
12749 crtc->primary->fb, crtc->x, crtc->y); 12742 crtc->primary->fb, crtc->x, crtc->y);