drm/i915: Don't clobber crtc->new_config when nothing changes
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 21 Nov 2014 19:00:36 +0000 (21:00 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 3 Dec 2014 08:29:34 +0000 (09:29 +0100)
When doing a nop modeset we currently leave crtc->new_config point at
the already freed temporary pipe_config. That will anger the sanity
checks in intel_modeset_update_state() when the nop modeset gets
followed by a GPU reset on gen3/4 where the display block gets fully
reinitialized during the reset.

So leave crtc->new_config alone until we know a modeset is actually
required.

Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_display.c

index 853697fc4d4b7f96d474e30da9594d53f49a4e8e..3218455a7ade03d893e66bba9228e8ca42f56b02 100644 (file)
@@ -10907,7 +10907,6 @@ intel_modeset_compute_config(struct drm_crtc *crtc,
        }
        intel_dump_pipe_config(to_intel_crtc(crtc), pipe_config,
                               "[modeset]");
-       to_intel_crtc(crtc)->new_config = pipe_config;
 
 out:
        return pipe_config;
@@ -10933,6 +10932,9 @@ static int __intel_set_mode(struct drm_crtc *crtc,
 
        *saved_mode = crtc->mode;
 
+       if (modeset_pipes)
+               to_intel_crtc(crtc)->new_config = pipe_config;
+
        /*
         * See if the config requires any additional preparation, e.g.
         * to adjust global state with pipes off.  We need to do this
@@ -11466,12 +11468,12 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
                ret = PTR_ERR(pipe_config);
                goto fail;
        } else if (pipe_config) {
-               if (to_intel_crtc(set->crtc)->new_config->has_audio !=
+               if (pipe_config->has_audio !=
                    to_intel_crtc(set->crtc)->config.has_audio)
                        config->mode_changed = true;
 
                /* Force mode sets for any infoframe stuff */
-               if (to_intel_crtc(set->crtc)->new_config->has_infoframe ||
+               if (pipe_config->has_infoframe ||
                    to_intel_crtc(set->crtc)->config.has_infoframe)
                        config->mode_changed = true;
        }