From: Greg Kroah-Hartman Date: Thu, 9 May 2013 18:46:43 +0000 (-0700) Subject: 3.9-stable patches X-Git-Tag: v3.9.2~42 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0cb3ac37bf7f2edc7500e67142165162ac8f4dc5;p=thirdparty%2Fkernel%2Fstable-queue.git 3.9-stable patches added patches: drm-i915-don-t-check-inconsistent-modeset-state-when-force-restoring.patch drm-i915-ensure-single-initialization-and-cleanup-of-backlight-device.patch --- diff --git a/queue-3.9/drm-i915-don-t-check-inconsistent-modeset-state-when-force-restoring.patch b/queue-3.9/drm-i915-don-t-check-inconsistent-modeset-state-when-force-restoring.patch new file mode 100644 index 00000000000..cb4fefdd286 --- /dev/null +++ b/queue-3.9/drm-i915-don-t-check-inconsistent-modeset-state-when-force-restoring.patch @@ -0,0 +1,98 @@ +From f30da187cdcd0939288038e11fb3bfbd1b655564 Mon Sep 17 00:00:00 2001 +From: Daniel Vetter +Date: Thu, 11 Apr 2013 20:22:50 +0200 +Subject: drm/i915: don't check inconsistent modeset state when force-restoring + +From: Daniel Vetter + +commit f30da187cdcd0939288038e11fb3bfbd1b655564 upstream. + +It will be only consistent once we've restored all the crtcs. Since a +bunch of other callers also want to just restore a single crtc, add a +boolean to disable checking only where it doesn't make sense. + +Note that intel_modeset_setup_hw_state already has a call to +intel_modeset_check_state at the end, so we don't reduce the amount of +checking. + +v2: Try harder not to create a big patch (Chris). + +v3: Even smaller (still Chris). Also fix a trailing space. + +References: https://lkml.org/lkml/2013/3/16/60 +Cc: Tomas Melin +Cc: Richard Cochran +Cc: Chris Wilson +Reviewed-by: Chris Wilson +Tested-by: Tomas Melin +Tested-by: Richard Cochran +Signed-off-by: Daniel Vetter +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_display.c | 32 ++++++++++++++++++++++++++------ + 1 file changed, 26 insertions(+), 6 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_display.c ++++ b/drivers/gpu/drm/i915/intel_display.c +@@ -7771,9 +7771,9 @@ intel_modeset_check_state(struct drm_dev + } + } + +-int intel_set_mode(struct drm_crtc *crtc, +- struct drm_display_mode *mode, +- int x, int y, struct drm_framebuffer *fb) ++static int __intel_set_mode(struct drm_crtc *crtc, ++ struct drm_display_mode *mode, ++ int x, int y, struct drm_framebuffer *fb) + { + struct drm_device *dev = crtc->dev; + drm_i915_private_t *dev_priv = dev->dev_private; +@@ -7863,8 +7863,6 @@ done: + if (ret && crtc->enabled) { + crtc->hwmode = *saved_hwmode; + crtc->mode = *saved_mode; +- } else { +- intel_modeset_check_state(dev); + } + + out: +@@ -7872,6 +7870,20 @@ out: + return ret; + } + ++int intel_set_mode(struct drm_crtc *crtc, ++ struct drm_display_mode *mode, ++ int x, int y, struct drm_framebuffer *fb) ++{ ++ int ret; ++ ++ ret = __intel_set_mode(crtc, mode, x, y, fb); ++ ++ if (ret == 0) ++ intel_modeset_check_state(crtc->dev); ++ ++ return ret; ++} ++ + void intel_crtc_restore_mode(struct drm_crtc *crtc) + { + intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y, crtc->fb); +@@ -9172,8 +9184,16 @@ void intel_modeset_setup_hw_state(struct + } + + if (force_restore) { ++ /* ++ * We need to use raw interfaces for restoring state to avoid ++ * checking (bogus) intermediate states. ++ */ + for_each_pipe(pipe) { +- intel_crtc_restore_mode(dev_priv->pipe_to_crtc_mapping[pipe]); ++ struct drm_crtc *crtc = ++ dev_priv->pipe_to_crtc_mapping[pipe]; ++ ++ __intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y, ++ crtc->fb); + } + + i915_redisable_vga(dev); diff --git a/queue-3.9/drm-i915-ensure-single-initialization-and-cleanup-of-backlight-device.patch b/queue-3.9/drm-i915-ensure-single-initialization-and-cleanup-of-backlight-device.patch new file mode 100644 index 00000000000..96969a2c6b0 --- /dev/null +++ b/queue-3.9/drm-i915-ensure-single-initialization-and-cleanup-of-backlight-device.patch @@ -0,0 +1,99 @@ +From dc652f90e088798bfa31f496ba994ddadd5d5680 Mon Sep 17 00:00:00 2001 +From: Jani Nikula +Date: Fri, 12 Apr 2013 15:18:38 +0300 +Subject: drm/i915: ensure single initialization and cleanup of backlight device + +From: Jani Nikula + +commit dc652f90e088798bfa31f496ba994ddadd5d5680 upstream. + +Backlight cleanup in the eDP connector destroy callback caused the +backlight device to be removed on some systems that first initialized LVDS +and then attempted to initialize eDP. Prevent multiple backlight +initializations, and ensure backlight cleanup is only done once by moving +it to modeset cleanup. + +A small wrinkle is the introduced asymmetry in backlight +setup/cleanup. This could be solved by adding refcounting, but it seems +overkill considering that there should only ever be one backlight device. + +Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=55701 +Signed-off-by: Jani Nikula +Tested-by: Peter Verthez +Signed-off-by: Daniel Vetter +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_display.c | 3 +++ + drivers/gpu/drm/i915/intel_dp.c | 5 +---- + drivers/gpu/drm/i915/intel_lvds.c | 1 - + drivers/gpu/drm/i915/intel_panel.c | 7 ++++++- + 4 files changed, 10 insertions(+), 6 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_display.c ++++ b/drivers/gpu/drm/i915/intel_display.c +@@ -9256,6 +9256,9 @@ void intel_modeset_cleanup(struct drm_de + /* flush any delayed tasks or pending work */ + flush_scheduled_work(); + ++ /* destroy backlight, if any, before the connectors */ ++ intel_panel_destroy_backlight(dev); ++ + drm_mode_config_cleanup(dev); + + intel_cleanup_overlay(dev); +--- a/drivers/gpu/drm/i915/intel_dp.c ++++ b/drivers/gpu/drm/i915/intel_dp.c +@@ -2538,17 +2538,14 @@ done: + static void + intel_dp_destroy(struct drm_connector *connector) + { +- struct drm_device *dev = connector->dev; + struct intel_dp *intel_dp = intel_attached_dp(connector); + struct intel_connector *intel_connector = to_intel_connector(connector); + + if (!IS_ERR_OR_NULL(intel_connector->edid)) + kfree(intel_connector->edid); + +- if (is_edp(intel_dp)) { +- intel_panel_destroy_backlight(dev); ++ if (is_edp(intel_dp)) + intel_panel_fini(&intel_connector->panel); +- } + + drm_sysfs_connector_remove(connector); + drm_connector_cleanup(connector); +--- a/drivers/gpu/drm/i915/intel_lvds.c ++++ b/drivers/gpu/drm/i915/intel_lvds.c +@@ -618,7 +618,6 @@ static void intel_lvds_destroy(struct dr + if (!IS_ERR_OR_NULL(lvds_connector->base.edid)) + kfree(lvds_connector->base.edid); + +- intel_panel_destroy_backlight(connector->dev); + intel_panel_fini(&lvds_connector->base.panel); + + drm_sysfs_connector_remove(connector); +--- a/drivers/gpu/drm/i915/intel_panel.c ++++ b/drivers/gpu/drm/i915/intel_panel.c +@@ -422,6 +422,9 @@ int intel_panel_setup_backlight(struct d + + intel_panel_init_backlight(dev); + ++ if (WARN_ON(dev_priv->backlight)) ++ return -ENODEV; ++ + memset(&props, 0, sizeof(props)); + props.type = BACKLIGHT_RAW; + props.max_brightness = _intel_panel_get_max_backlight(dev); +@@ -447,8 +450,10 @@ int intel_panel_setup_backlight(struct d + void intel_panel_destroy_backlight(struct drm_device *dev) + { + struct drm_i915_private *dev_priv = dev->dev_private; +- if (dev_priv->backlight) ++ if (dev_priv->backlight) { + backlight_device_unregister(dev_priv->backlight); ++ dev_priv->backlight = NULL; ++ } + } + #else + int intel_panel_setup_backlight(struct drm_connector *connector) diff --git a/queue-3.9/series b/queue-3.9/series index 148f8339a1f..f42addf8b40 100644 --- a/queue-3.9/series +++ b/queue-3.9/series @@ -35,3 +35,5 @@ drm-i915-fix-sdvo-connector-and-encoder-get_hw_state-functions.patch drm-i915-workaround-incoherence-between-fences-and-llc-across-multiple-cpus.patch drm-i915-use-mlc-l3-for-context-objects.patch drm-i915-set-cpt-fdi-rx-polarity-bits-based-on-vbt.patch +drm-i915-don-t-check-inconsistent-modeset-state-when-force-restoring.patch +drm-i915-ensure-single-initialization-and-cleanup-of-backlight-device.patch