]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/i915: Introduce intel_panel_compute_config()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Mon, 27 Sep 2021 18:52:07 +0000 (21:52 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 30 Sep 2021 08:20:13 +0000 (11:20 +0300)
Let's introduce a compute_config() helper for fixed mode panels.
For now all it does is the fixed_mode->adjusted_mode copy.

Note that with sDVO we have to ask the external encoder chip
to spit out our actual display timings for us, so the fixed_mode
to adjusted_mode copy done by intel_panel_compute_config() is
redundant, but we still want to use it to do other checks for us
later. We'll be fine so long as we only call it before
intel_sdvo_get_preferred_input_mode() overwrites adjusted_mode
with the timings from the encoder.

v2: Use intel_panel_compute_config() with sDVO

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210927185207.13620-1-ville.syrjala@linux.intel.com
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/display/icl_dsi.c
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_dvo.c
drivers/gpu/drm/i915/display/intel_lvds.c
drivers/gpu/drm/i915/display/intel_panel.c
drivers/gpu/drm/i915/display/intel_panel.h
drivers/gpu/drm/i915/display/intel_sdvo.c
drivers/gpu/drm/i915/display/vlv_dsi.c

index bd210166b0793fcb970795daa1d98f1d40ddf118..c196993f0d68e04af23c9ba59393b8b97a59932d 100644 (file)
@@ -1672,14 +1672,15 @@ static int gen11_dsi_compute_config(struct intel_encoder *encoder,
        struct intel_dsi *intel_dsi = container_of(encoder, struct intel_dsi,
                                                   base);
        struct intel_connector *intel_connector = intel_dsi->attached_connector;
-       const struct drm_display_mode *fixed_mode =
-               intel_connector->panel.fixed_mode;
        struct drm_display_mode *adjusted_mode =
                &pipe_config->hw.adjusted_mode;
        int ret;
 
        pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
-       intel_panel_fixed_mode(fixed_mode, adjusted_mode);
+
+       ret = intel_panel_compute_config(intel_connector, adjusted_mode);
+       if (ret)
+               return ret;
 
        ret = intel_panel_fitting(pipe_config, conn_state);
        if (ret)
index 2b8b495fc2a9a56a7bc88c1c53c489004b164749..b5cd188ca52083f8cf90c72e390f5a5b1a9f7409 100644 (file)
@@ -1757,8 +1757,9 @@ intel_dp_compute_config(struct intel_encoder *encoder,
                pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON;
 
        if (intel_dp_is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
-               intel_panel_fixed_mode(intel_connector->panel.fixed_mode,
-                                      adjusted_mode);
+               ret = intel_panel_compute_config(intel_connector, adjusted_mode);
+               if (ret)
+                       return ret;
 
                ret = intel_panel_fitting(pipe_config, conn_state);
                if (ret)
index f8fdc0386fd40d4fb19bd8c3b365092fdb8e41b2..2eeb209afc643d27184e3840977029dd2d233416 100644 (file)
@@ -256,6 +256,7 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder,
                                    struct drm_connector_state *conn_state)
 {
        struct intel_dvo *intel_dvo = enc_to_dvo(encoder);
+       struct intel_connector *connector = to_intel_connector(conn_state->connector);
        const struct drm_display_mode *fixed_mode =
                intel_dvo->attached_connector->panel.fixed_mode;
        struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
@@ -266,8 +267,13 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder,
         * with the panel scaling set up to source from the H/VDisplay
         * of the original mode.
         */
-       if (fixed_mode)
-               intel_panel_fixed_mode(fixed_mode, adjusted_mode);
+       if (fixed_mode) {
+               int ret;
+
+               ret = intel_panel_compute_config(connector, adjusted_mode);
+               if (ret)
+                       return ret;
+       }
 
        if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
                return -EINVAL;
index 37e81bc71f7c1d3a80ec04b0112c987ee86547db..130e6ea61e1146819cc415287cc8d6fe6b48db98 100644 (file)
@@ -444,8 +444,9 @@ static int intel_lvds_compute_config(struct intel_encoder *intel_encoder,
         * with the panel scaling set up to source from the H/VDisplay
         * of the original mode.
         */
-       intel_panel_fixed_mode(intel_connector->panel.fixed_mode,
-                              adjusted_mode);
+       ret = intel_panel_compute_config(intel_connector, adjusted_mode);
+       if (ret)
+               return ret;
 
        if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
                return -EINVAL;
index b2ad0f065218bc2c80dca905b94fe2d370ea6b62..77c1ca387de009de89fa39bbfb373232e5e7dee3 100644 (file)
@@ -45,12 +45,19 @@ bool intel_panel_use_ssc(struct drm_i915_private *i915)
                && !(i915->quirks & QUIRK_LVDS_SSC_DISABLE);
 }
 
-void intel_panel_fixed_mode(const struct drm_display_mode *fixed_mode,
-                           struct drm_display_mode *adjusted_mode)
+int intel_panel_compute_config(struct intel_connector *connector,
+                              struct drm_display_mode *adjusted_mode)
 {
+       const struct drm_display_mode *fixed_mode = connector->panel.fixed_mode;
+
+       if (!fixed_mode)
+               return 0;
+
        drm_mode_copy(adjusted_mode, fixed_mode);
 
        drm_mode_set_crtcinfo(adjusted_mode, 0);
+
+       return 0;
 }
 
 static bool is_downclock_mode(const struct drm_display_mode *downclock_mode,
index 71bad6d546fa65c8a7ab571c7ab5cd2379238c10..d50b3f7e9e58e3c1acb87e76e78419873754e2ca 100644 (file)
@@ -31,6 +31,8 @@ intel_panel_mode_valid(struct intel_connector *connector,
                       const struct drm_display_mode *mode);
 int intel_panel_fitting(struct intel_crtc_state *crtc_state,
                        const struct drm_connector_state *conn_state);
+int intel_panel_compute_config(struct intel_connector *connector,
+                              struct drm_display_mode *adjusted_mode);
 struct drm_display_mode *
 intel_panel_edid_downclock_mode(struct intel_connector *connector,
                                const struct drm_display_mode *fixed_mode);
index fe0ea1db4cf11e6fe4ec0c3e4571506af6c3837b..2dc6c3742ba2c71daf5ac16901f5bfe09cb11aaf 100644 (file)
@@ -1335,6 +1335,13 @@ static int intel_sdvo_compute_config(struct intel_encoder *encoder,
                                                           adjusted_mode);
                pipe_config->sdvo_tv_clock = true;
        } else if (IS_LVDS(intel_sdvo_connector)) {
+               int ret;
+
+               ret = intel_panel_compute_config(&intel_sdvo_connector->base,
+                                                adjusted_mode);
+               if (ret)
+                       return ret;
+
                if (!intel_sdvo_set_output_timings_from_mode(intel_sdvo,
                                                             intel_sdvo_connector->base.panel.fixed_mode))
                        return -EINVAL;
index b0a2b6b96799122419fe791091eb19b31796627a..260e852245e9ac807f95022402eb4cea78d3022d 100644 (file)
@@ -279,7 +279,9 @@ static int intel_dsi_compute_config(struct intel_encoder *encoder,
        pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
 
        if (fixed_mode) {
-               intel_panel_fixed_mode(fixed_mode, adjusted_mode);
+               ret = intel_panel_compute_config(intel_connector, adjusted_mode);
+               if (ret)
+                       return ret;
 
                ret = intel_panel_fitting(pipe_config, conn_state);
                if (ret)