Skip to content

Commit

Permalink
drm/i915: Don't set enabled value of all CRTCs when restoring the mode
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ander Conselvan de Oliveira authored and Jani Nikula committed Jun 17, 2015
1 parent 0d26fb8 commit 4ed9fb3
Showing 1 changed file with 10 additions and 17 deletions.
27 changes: 10 additions & 17 deletions drivers/gpu/drm/i915/intel_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -12683,7 +12683,6 @@ void intel_crtc_restore_mode(struct drm_crtc *crtc)
{
struct drm_device *dev = crtc->dev;
struct drm_atomic_state *state;
struct intel_crtc *intel_crtc;
struct intel_encoder *encoder;
struct intel_connector *connector;
struct drm_connector_state *connector_state;
Expand Down Expand Up @@ -12726,24 +12725,18 @@ void intel_crtc_restore_mode(struct drm_crtc *crtc)
}
}

for_each_intel_crtc(dev, intel_crtc) {
if (intel_crtc->new_enabled == intel_crtc->base.enabled)
continue;

crtc_state = intel_atomic_get_crtc_state(state, intel_crtc);
if (IS_ERR(crtc_state)) {
DRM_DEBUG_KMS("Failed to add [CRTC:%d] to state: %ld\n",
intel_crtc->base.base.id,
PTR_ERR(crtc_state));
continue;
}
crtc_state = intel_atomic_get_crtc_state(state, to_intel_crtc(crtc));
if (IS_ERR(crtc_state)) {
DRM_DEBUG_KMS("Failed to add [CRTC:%d] to state: %ld\n",
crtc->base.id, PTR_ERR(crtc_state));
drm_atomic_state_free(state);
return;
}

crtc_state->base.active = crtc_state->base.enable =
intel_crtc->new_enabled;
crtc_state->base.active = crtc_state->base.enable =
to_intel_crtc(crtc)->new_enabled;

if (&intel_crtc->base == crtc)
drm_mode_copy(&crtc_state->base.mode, &crtc->mode);
}
drm_mode_copy(&crtc_state->base.mode, &crtc->mode);

intel_modeset_setup_plane_state(state, crtc, &crtc->mode,
crtc->primary->fb, crtc->x, crtc->y);
Expand Down

0 comments on commit 4ed9fb3

Please sign in to comment.