drm/i915: Set mode_changed for audio in intel_modeset_pipe_config()
authorAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Mon, 1 Jun 2015 10:49:51 +0000 (12:49 +0200)
committerJani Nikula <jani.nikula@intel.com>
Fri, 12 Jun 2015 10:19:32 +0000 (13:19 +0300)
A follow up patch will make intel_modeset_compute_config() deal with
multiple crtcs, so move crtc specific stuff into the lower level crtc
specific function.

Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/intel_display.c

index 7116217ca25ba3074d161a9458827de34772826e..eb40f9fc9b4469959a3b9d7fcbce5ecd7bb22700 100644 (file)
@@ -431,6 +431,12 @@ static void vlv_clock(int refclk, intel_clock_t *clock)
        clock->dot = DIV_ROUND_CLOSEST(clock->vco, clock->p);
 }
 
+static bool
+needs_modeset(struct drm_crtc_state *state)
+{
+       return state->mode_changed || state->active_changed;
+}
+
 /**
  * Returns whether any output on the specified pipe is of the specified type
  */
@@ -12085,6 +12091,15 @@ intel_modeset_pipe_config(struct drm_crtc *crtc,
                return -EINVAL;
        }
 
+       /*
+        * XXX: Add all connectors to make the crtc state match the encoders.
+        */
+       if (!needs_modeset(&pipe_config->base)) {
+               ret = drm_atomic_add_affected_connectors(state, crtc);
+               if (ret)
+                       return ret;
+       }
+
        clear_intel_crtc_state(pipe_config);
 
        pipe_config->cpu_transcoder =
@@ -12176,6 +12191,18 @@ encoder_retry:
        DRM_DEBUG_KMS("plane bpp: %i, pipe bpp: %i, dithering: %i\n",
                      base_bpp, pipe_config->pipe_bpp, pipe_config->dither);
 
+       /* Check if we need to force a modeset */
+       if (pipe_config->has_audio !=
+           to_intel_crtc_state(crtc->state)->has_audio)
+               pipe_config->base.mode_changed = true;
+
+       /*
+        * Note we have an issue here with infoframes: current code
+        * only updates them on the full mode set path per hw
+        * requirements.  So here we should be checking for any
+        * required changes and forcing a mode set.
+        */
+
        return 0;
 fail:
        return ret;
@@ -12193,12 +12220,6 @@ static bool intel_crtc_in_use(struct drm_crtc *crtc)
        return false;
 }
 
-static bool
-needs_modeset(struct drm_crtc_state *state)
-{
-       return state->mode_changed || state->active_changed;
-}
-
 static void
 intel_modeset_update_state(struct drm_atomic_state *state)
 {
@@ -12785,10 +12806,6 @@ intel_modeset_compute_config(struct drm_crtc *crtc,
        struct intel_crtc_state *pipe_config;
        int ret = 0;
 
-       ret = drm_atomic_add_affected_connectors(state, crtc);
-       if (ret)
-               return ERR_PTR(ret);
-
        ret = drm_atomic_helper_check_modeset(state->dev, state);
        if (ret)
                return ERR_PTR(ret);
@@ -12810,19 +12827,7 @@ intel_modeset_compute_config(struct drm_crtc *crtc,
        if (ret)
                return ERR_PTR(ret);
 
-       /* Check things that can only be changed through modeset */
-       if (pipe_config->has_audio !=
-           to_intel_crtc(crtc)->config->has_audio)
-               pipe_config->base.mode_changed = true;
-
-       /*
-        * Note we have an issue here with infoframes: current code
-        * only updates them on the full mode set path per hw
-        * requirements.  So here we should be checking for any
-        * required changes and forcing a mode set.
-        */
-
-       intel_dump_pipe_config(to_intel_crtc(crtc), pipe_config,"[modeset]");
+       intel_dump_pipe_config(to_intel_crtc(crtc), pipe_config, "[modeset]");
 
        ret = drm_atomic_helper_check_planes(state->dev, state);
        if (ret)