From: Greg Kroah-Hartman Date: Tue, 3 Jun 2014 20:57:28 +0000 (-0700) Subject: 3.10-stable patches X-Git-Tag: v3.14.6~75 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e2084007edce032b17045e58110d762d32c438d8;p=thirdparty%2Fkernel%2Fstable-queue.git 3.10-stable patches added patches: drm-i915-break-encoder-crtc-link-separately-in-intel_sanitize_crtc.patch --- diff --git a/queue-3.10/drm-i915-break-encoder-crtc-link-separately-in-intel_sanitize_crtc.patch b/queue-3.10/drm-i915-break-encoder-crtc-link-separately-in-intel_sanitize_crtc.patch new file mode 100644 index 00000000000..9d5fea14d2d --- /dev/null +++ b/queue-3.10/drm-i915-break-encoder-crtc-link-separately-in-intel_sanitize_crtc.patch @@ -0,0 +1,116 @@ +From 7f1950fbb989e8fc5463b307e062b4529d51c862 Mon Sep 17 00:00:00 2001 +From: Egbert Eich +Date: Fri, 25 Apr 2014 10:56:22 +0200 +Subject: drm/i915: Break encoder->crtc link separately in intel_sanitize_crtc() + +From: Egbert Eich + +commit 7f1950fbb989e8fc5463b307e062b4529d51c862 upstream. + +Depending on the SDVO output_flags SDVO may have multiple connectors +linking to the same encoder (in intel_connector->encoder->base). +Only one of those connectors should be active (ie link to the encoder +thru drm_connector->encoder). +If intel_connector_break_all_links() is called from intel_sanitize_crtc() +we may break the crtc connection of an encoder thru an inactive connector +in which case intel_connector_break_all_links() will not be called again +for the active connector if this happens to come later in the list due to: + if (connector->encoder->base.crtc != &crtc->base) + continue; +in intel_sanitize_crtc(). +This will however leave the drm_connector->encoder linkage for this +active connector in place. Subsequently this will cause multiple +warnings in intel_connector_check_state() to trigger and the driver +will eventually die in drm_encoder_crtc_ok() (because of crtc == NULL). + +To avoid this remove intel_connector_break_all_links() and move its +code to its two calling functions: intel_sanitize_crtc() and +intel_sanitize_encoder(). +This allows to implement the link breaking more flexibly matching +the surrounding code: ie. in intel_sanitize_crtc() we can break the +crtc link separatly after the links to the encoders have been +broken which avoids above problem. + +This regression has been introduced in: + +commit 24929352481f085c5f85d4d4cbc919ddf106d381 +Author: Daniel Vetter +Date: Mon Jul 2 20:28:59 2012 +0200 + + drm/i915: read out the modeset hw state at load and resume time + +so goes back to the very beginning of the modeset rework. + +v2: This patch takes care of the concernes voiced by Chris Wilson +and Daniel Vetter that only breaking links if the drm_connector +is linked to an encoder may miss some links. +v3: move all encoder handling to encoder loop as suggested by +Daniel Vetter. + +Signed-off-by: Egbert Eich +Reviewed-by: Daniel Vetter +Cc: Jani Nikula +Signed-off-by: Jani Nikula +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_display.c | 26 ++++++++++++++------------ + 1 file changed, 14 insertions(+), 12 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_display.c ++++ b/drivers/gpu/drm/i915/intel_display.c +@@ -9123,15 +9123,6 @@ void intel_modeset_init(struct drm_devic + intel_disable_fbc(dev); + } + +-static void +-intel_connector_break_all_links(struct intel_connector *connector) +-{ +- connector->base.dpms = DRM_MODE_DPMS_OFF; +- connector->base.encoder = NULL; +- connector->encoder->connectors_active = false; +- connector->encoder->base.crtc = NULL; +-} +- + static void intel_enable_pipe_a(struct drm_device *dev) + { + struct intel_connector *connector; +@@ -9213,8 +9204,17 @@ static void intel_sanitize_crtc(struct i + if (connector->encoder->base.crtc != &crtc->base) + continue; + +- intel_connector_break_all_links(connector); ++ connector->base.dpms = DRM_MODE_DPMS_OFF; ++ connector->base.encoder = NULL; + } ++ /* multiple connectors may have the same encoder: ++ * handle them and break crtc link separately */ ++ list_for_each_entry(connector, &dev->mode_config.connector_list, ++ base.head) ++ if (connector->encoder->base.crtc == &crtc->base) { ++ connector->encoder->base.crtc = NULL; ++ connector->encoder->connectors_active = false; ++ } + + WARN_ON(crtc->active); + crtc->base.enabled = false; +@@ -9285,6 +9285,8 @@ static void intel_sanitize_encoder(struc + drm_get_encoder_name(&encoder->base)); + encoder->disable(encoder); + } ++ encoder->base.crtc = NULL; ++ encoder->connectors_active = false; + + /* Inconsistent output/port/pipe state happens presumably due to + * a bug in one of the get_hw_state functions. Or someplace else +@@ -9295,8 +9297,8 @@ static void intel_sanitize_encoder(struc + base.head) { + if (connector->encoder != encoder) + continue; +- +- intel_connector_break_all_links(connector); ++ connector->base.dpms = DRM_MODE_DPMS_OFF; ++ connector->base.encoder = NULL; + } + } + /* Enabled encoders without active connectors will be fixed in diff --git a/queue-3.10/series b/queue-3.10/series index 7a4e77a4e64..e2e26c8bd19 100644 --- a/queue-3.10/series +++ b/queue-3.10/series @@ -27,3 +27,4 @@ hrtimer-prevent-all-reprogramming-if-hang-detected.patch hrtimer-prevent-remote-enqueue-of-leftmost-timers.patch hrtimer-set-expiry-time-before-switch_hrtimer_base.patch md-avoid-possible-spinning-md-thread-at-shutdown.patch +drm-i915-break-encoder-crtc-link-separately-in-intel_sanitize_crtc.patch