OSDN Git Service

drm/i915: Add an update_pipe callback to intel_encoder and call this on fastsets...
authorHans de Goede <hdegoede@redhat.com>
Thu, 20 Dec 2018 13:21:18 +0000 (14:21 +0100)
committerHans de Goede <hdegoede@redhat.com>
Tue, 25 Dec 2018 08:10:00 +0000 (09:10 +0100)
When we are doing a fastset (needs_modeset=false, update_pipe=true) we
may need to update some encoder-level things such as checking that PSR
is enabled.

This commit adds an update_pipe callback to intel_encoder and a new
intel_encoders_update_pipe helper which calls this for all encoders
connected to a crtc. The new intel_encoders_update_pipe helper is called
from intel_update_crtc when doing a fastset.

Changes in v2:
-Name the new encoder callback update_pipe instead of just update

Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181220132120.15318-1-hdegoede@redhat.com
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_drv.h

index a0ec74e..f0b480f 100644 (file)
@@ -5578,6 +5578,26 @@ static void intel_encoders_post_pll_disable(struct drm_crtc *crtc,
        }
 }
 
+static void intel_encoders_update_pipe(struct drm_crtc *crtc,
+                                      struct intel_crtc_state *crtc_state,
+                                      struct drm_atomic_state *old_state)
+{
+       struct drm_connector_state *conn_state;
+       struct drm_connector *conn;
+       int i;
+
+       for_each_new_connector_in_state(old_state, conn, conn_state, i) {
+               struct intel_encoder *encoder =
+                       to_intel_encoder(conn_state->best_encoder);
+
+               if (conn_state->crtc != crtc)
+                       continue;
+
+               if (encoder->update_pipe)
+                       encoder->update_pipe(encoder, crtc_state, conn_state);
+       }
+}
+
 static void ironlake_crtc_enable(struct intel_crtc_state *pipe_config,
                                 struct drm_atomic_state *old_state)
 {
@@ -12750,6 +12770,9 @@ static void intel_update_crtc(struct drm_crtc *crtc,
        } else {
                intel_pre_plane_update(to_intel_crtc_state(old_crtc_state),
                                       pipe_config);
+
+               if (pipe_config->update_pipe)
+                       intel_encoders_update_pipe(crtc, pipe_config, state);
        }
 
        if (pipe_config->update_pipe && !pipe_config->enable_fbc)
index 1028af8..1a11c2b 100644 (file)
@@ -243,6 +243,9 @@ struct intel_encoder {
        void (*post_pll_disable)(struct intel_encoder *,
                                 const struct intel_crtc_state *,
                                 const struct drm_connector_state *);
+       void (*update_pipe)(struct intel_encoder *,
+                           const struct intel_crtc_state *,
+                           const struct drm_connector_state *);
        /* Read out the current hw state of this connector, returning true if
         * the encoder is active. If the encoder is enabled it also set the pipe
         * it is connected to in the pipe parameter. */