drm/i915: Introduce encoder->get_buf_trans()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 8 Jun 2021 07:35:55 +0000 (10:35 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 23 Jun 2021 12:30:45 +0000 (15:30 +0300)
Convert the get_buf_trans() functions into an encoder vfunc.
Allows us to get rid of bunch of platform if-ladders.

v2: Handle adl-p

Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210608073603.2408-10-ville.syrjala@linux.intel.com
drivers/gpu/drm/i915/display/intel_crt.c
drivers/gpu/drm/i915/display/intel_ddi.c
drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c
drivers/gpu/drm/i915/display/intel_ddi_buf_trans.h
drivers/gpu/drm/i915/display/intel_display_types.h
drivers/gpu/drm/i915/display/intel_fdi.c

index 648f1c0d3d39f760e214ccf616a301ea3624a45e..408f82b0dc7db9c26a8c1df9193d40dc048ec524 100644 (file)
@@ -38,6 +38,7 @@
 #include "intel_crt.h"
 #include "intel_crtc.h"
 #include "intel_ddi.h"
+#include "intel_ddi_buf_trans.h"
 #include "intel_de.h"
 #include "intel_display_types.h"
 #include "intel_fdi.h"
@@ -1081,6 +1082,8 @@ void intel_crt_init(struct drm_i915_private *dev_priv)
                crt->base.enable_clock = hsw_ddi_enable_clock;
                crt->base.disable_clock = hsw_ddi_disable_clock;
                crt->base.is_clock_enabled = hsw_ddi_is_clock_enabled;
+
+               intel_ddi_buf_trans_init(&crt->base);
        } else {
                if (HAS_PCH_SPLIT(dev_priv)) {
                        crt->base.compute_config = pch_crt_compute_config;
index ef2723ae36332bd6a9b2e52272f4bd72bc5eb904..59acfc20a42c711d9ca90c16917a246242a49abb 100644 (file)
@@ -104,8 +104,7 @@ void hsw_prepare_dp_ddi_buffers(struct intel_encoder *encoder,
        enum port port = encoder->port;
        const struct intel_ddi_buf_trans *ddi_translations;
 
-       ddi_translations = hsw_get_buf_trans(encoder, crtc_state, &n_entries);
-
+       ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries);
        if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations))
                return;
 
@@ -137,8 +136,7 @@ static void hsw_prepare_hdmi_ddi_buffers(struct intel_encoder *encoder,
        enum port port = encoder->port;
        const struct intel_ddi_buf_trans *ddi_translations;
 
-       ddi_translations = hsw_get_buf_trans(encoder, crtc_state,  &n_entries);
-
+       ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries);
        if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations))
                return;
        if (drm_WARN_ON_ONCE(&dev_priv->drm, level >= n_entries))
@@ -947,8 +945,7 @@ static void skl_ddi_set_iboost(struct intel_encoder *encoder,
                const struct intel_ddi_buf_trans *ddi_translations;
                int n_entries;
 
-               ddi_translations = hsw_get_buf_trans(encoder, crtc_state, &n_entries);
-
+               ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries);
                if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations))
                        return;
                if (drm_WARN_ON_ONCE(&dev_priv->drm, level >= n_entries))
@@ -978,7 +975,7 @@ static void bxt_ddi_vswing_sequence(struct intel_encoder *encoder,
        enum port port = encoder->port;
        int n_entries;
 
-       ddi_translations = bxt_get_buf_trans(encoder, crtc_state, &n_entries);
+       ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries);
        if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations))
                return;
        if (drm_WARN_ON_ONCE(&dev_priv->drm, level >= n_entries))
@@ -996,33 +993,9 @@ static u8 intel_ddi_dp_voltage_max(struct intel_dp *intel_dp,
 {
        struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
-       enum port port = encoder->port;
-       enum phy phy = intel_port_to_phy(dev_priv, port);
        int n_entries;
 
-       if (DISPLAY_VER(dev_priv) >= 12) {
-               if (intel_phy_is_combo(dev_priv, phy))
-                       tgl_get_combo_buf_trans(encoder, crtc_state, &n_entries);
-               else if (IS_ALDERLAKE_P(dev_priv))
-                       adlp_get_dkl_buf_trans(encoder, crtc_state, &n_entries);
-               else
-                       tgl_get_dkl_buf_trans(encoder, crtc_state, &n_entries);
-       } else if (DISPLAY_VER(dev_priv) == 11) {
-               if (IS_PLATFORM(dev_priv, INTEL_JASPERLAKE))
-                       jsl_get_combo_buf_trans(encoder, crtc_state, &n_entries);
-               else if (IS_PLATFORM(dev_priv, INTEL_ELKHARTLAKE))
-                       ehl_get_combo_buf_trans(encoder, crtc_state, &n_entries);
-               else if (intel_phy_is_combo(dev_priv, phy))
-                       icl_get_combo_buf_trans(encoder, crtc_state, &n_entries);
-               else
-                       icl_get_mg_buf_trans(encoder, crtc_state, &n_entries);
-       } else if (IS_CANNONLAKE(dev_priv)) {
-               cnl_get_buf_trans(encoder, crtc_state, &n_entries);
-       } else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) {
-               bxt_get_buf_trans(encoder, crtc_state, &n_entries);
-       } else {
-               hsw_get_buf_trans(encoder, crtc_state, &n_entries);
-       }
+       encoder->get_buf_trans(encoder, crtc_state, &n_entries);
 
        if (drm_WARN_ON(&dev_priv->drm, n_entries < 1))
                n_entries = 1;
@@ -1054,8 +1027,7 @@ static void cnl_ddi_vswing_program(struct intel_encoder *encoder,
        int n_entries, ln;
        u32 val;
 
-       ddi_translations = cnl_get_buf_trans(encoder, crtc_state, &n_entries);
-
+       ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries);
        if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations))
                return;
        if (drm_WARN_ON_ONCE(&dev_priv->drm, level >= n_entries))
@@ -1175,15 +1147,7 @@ static void icl_ddi_combo_vswing_program(struct intel_encoder *encoder,
        int n_entries, ln;
        u32 val;
 
-       if (DISPLAY_VER(dev_priv) >= 12)
-               ddi_translations = tgl_get_combo_buf_trans(encoder, crtc_state, &n_entries);
-       else if (IS_PLATFORM(dev_priv, INTEL_JASPERLAKE))
-               ddi_translations = jsl_get_combo_buf_trans(encoder, crtc_state, &n_entries);
-       else if (IS_PLATFORM(dev_priv, INTEL_ELKHARTLAKE))
-               ddi_translations = ehl_get_combo_buf_trans(encoder, crtc_state, &n_entries);
-       else
-               ddi_translations = icl_get_combo_buf_trans(encoder, crtc_state, &n_entries);
-
+       ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries);
        if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations))
                return;
        if (drm_WARN_ON_ONCE(&dev_priv->drm, level >= n_entries))
@@ -1310,8 +1274,7 @@ static void icl_mg_phy_ddi_vswing_sequence(struct intel_encoder *encoder,
        if (enc_to_dig_port(encoder)->tc_mode == TC_PORT_TBT_ALT)
                return;
 
-       ddi_translations = icl_get_mg_buf_trans(encoder, crtc_state, &n_entries);
-
+       ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries);
        if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations))
                return;
        if (drm_WARN_ON_ONCE(&dev_priv->drm, level >= n_entries))
@@ -1448,11 +1411,7 @@ tgl_dkl_phy_ddi_vswing_sequence(struct intel_encoder *encoder,
        if (enc_to_dig_port(encoder)->tc_mode == TC_PORT_TBT_ALT)
                return;
 
-       if (IS_ALDERLAKE_P(dev_priv))
-               ddi_translations = adlp_get_dkl_buf_trans(encoder, crtc_state, &n_entries);
-       else
-               ddi_translations = tgl_get_dkl_buf_trans(encoder, crtc_state, &n_entries);
-
+       ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries);
        if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations))
                return;
        if (drm_WARN_ON_ONCE(&dev_priv->drm, level >= n_entries))
@@ -4693,6 +4652,8 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
                encoder->get_config = hsw_ddi_get_config;
        }
 
+       intel_ddi_buf_trans_init(encoder);
+
        if (DISPLAY_VER(dev_priv) >= 13)
                encoder->hpd_pin = xelpd_hpd_pin(dev_priv, port);
        else if (IS_DG1(dev_priv))
index fd2216dc8c333c0dfa3847d84f2bd7f92f48760a..f8915a8c78d818d45b8fb545fca493df01142219 100644 (file)
@@ -1246,7 +1246,7 @@ hsw_get_buf_trans_hdmi(struct intel_encoder *encoder,
        return NULL;
 }
 
-const struct intel_ddi_buf_trans *
+static const struct intel_ddi_buf_trans *
 hsw_get_buf_trans(struct intel_encoder *encoder,
                  const struct intel_crtc_state *crtc_state,
                  int *n_entries)
@@ -1286,7 +1286,7 @@ bxt_get_buf_trans_hdmi(struct intel_encoder *encoder, int *n_entries)
        return intel_get_buf_trans(&bxt_ddi_translations_hdmi, n_entries);
 }
 
-const struct intel_ddi_buf_trans *
+static const struct intel_ddi_buf_trans *
 bxt_get_buf_trans(struct intel_encoder *encoder,
                  const struct intel_crtc_state *crtc_state,
                  int *n_entries)
@@ -1368,7 +1368,7 @@ cnl_get_buf_trans_edp(struct intel_encoder *encoder, int *n_entries)
        }
 }
 
-const struct intel_ddi_buf_trans *
+static const struct intel_ddi_buf_trans *
 cnl_get_buf_trans(struct intel_encoder *encoder,
                  const struct intel_crtc_state *crtc_state,
                  int *n_entries)
@@ -1422,7 +1422,7 @@ icl_get_combo_buf_trans_edp(struct intel_encoder *encoder,
        return icl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries);
 }
 
-const struct intel_ddi_buf_trans *
+static const struct intel_ddi_buf_trans *
 icl_get_combo_buf_trans(struct intel_encoder *encoder,
                        const struct intel_crtc_state *crtc_state,
                        int *n_entries)
@@ -1458,7 +1458,7 @@ icl_get_mg_buf_trans_dp(struct intel_encoder *encoder,
        }
 }
 
-const struct intel_ddi_buf_trans *
+static const struct intel_ddi_buf_trans *
 icl_get_mg_buf_trans(struct intel_encoder *encoder,
                     const struct intel_crtc_state *crtc_state,
                     int *n_entries)
@@ -1502,7 +1502,7 @@ ehl_get_combo_buf_trans_edp(struct intel_encoder *encoder,
        return ehl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries);
 }
 
-const struct intel_ddi_buf_trans *
+static const struct intel_ddi_buf_trans *
 ehl_get_combo_buf_trans(struct intel_encoder *encoder,
                        const struct intel_crtc_state *crtc_state,
                        int *n_entries)
@@ -1553,7 +1553,7 @@ jsl_get_combo_buf_trans_edp(struct intel_encoder *encoder,
        return jsl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries);
 }
 
-const struct intel_ddi_buf_trans *
+static const struct intel_ddi_buf_trans *
 jsl_get_combo_buf_trans(struct intel_encoder *encoder,
                        const struct intel_crtc_state *crtc_state,
                        int *n_entries)
@@ -1626,7 +1626,7 @@ tgl_get_combo_buf_trans_edp(struct intel_encoder *encoder,
        return tgl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries);
 }
 
-const struct intel_ddi_buf_trans *
+static const struct intel_ddi_buf_trans *
 tgl_get_combo_buf_trans(struct intel_encoder *encoder,
                        const struct intel_crtc_state *crtc_state,
                        int *n_entries)
@@ -1662,7 +1662,7 @@ tgl_get_dkl_buf_trans_dp(struct intel_encoder *encoder,
        }
 }
 
-const struct intel_ddi_buf_trans *
+static const struct intel_ddi_buf_trans *
 tgl_get_dkl_buf_trans(struct intel_encoder *encoder,
                      const struct intel_crtc_state *crtc_state,
                      int *n_entries)
@@ -1687,7 +1687,7 @@ adlp_get_dkl_buf_trans_dp(struct intel_encoder *encoder,
        }
 }
 
-const struct intel_ddi_buf_trans *
+static const struct intel_ddi_buf_trans *
 adlp_get_dkl_buf_trans(struct intel_encoder *encoder,
                       const struct intel_crtc_state *crtc_state,
                       int *n_entries)
@@ -1703,28 +1703,10 @@ int intel_ddi_hdmi_num_entries(struct intel_encoder *encoder,
                               int *default_entry)
 {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
-       enum phy phy = intel_port_to_phy(dev_priv, encoder->port);
-       const struct intel_ddi_buf_trans *ddi_translations = NULL;
+       const struct intel_ddi_buf_trans *ddi_translations;
        int n_entries;
 
-       if (DISPLAY_VER(dev_priv) >= 12) {
-               if (intel_phy_is_combo(dev_priv, phy))
-                       ddi_translations = tgl_get_combo_buf_trans_hdmi(encoder, crtc_state, &n_entries);
-               else
-                       ddi_translations = tgl_get_dkl_buf_trans_hdmi(encoder, crtc_state, &n_entries);
-       } else if (DISPLAY_VER(dev_priv) == 11) {
-               if (intel_phy_is_combo(dev_priv, phy))
-                       ddi_translations = icl_get_combo_buf_trans_hdmi(encoder, crtc_state, &n_entries);
-               else
-                       ddi_translations = icl_get_mg_buf_trans_hdmi(encoder, crtc_state, &n_entries);
-       } else if (IS_CANNONLAKE(dev_priv)) {
-               ddi_translations = cnl_get_buf_trans_hdmi(encoder, &n_entries);
-       } else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) {
-               ddi_translations = bxt_get_buf_trans_hdmi(encoder, &n_entries);
-       } else if (DISPLAY_VER(dev_priv) == 9 ||
-                  IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) {
-               ddi_translations = hsw_get_buf_trans_hdmi(encoder, &n_entries);
-       }
+       ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries);
 
        if (drm_WARN_ON(&dev_priv->drm, !ddi_translations)) {
                *default_entry = 0;
@@ -1735,3 +1717,36 @@ int intel_ddi_hdmi_num_entries(struct intel_encoder *encoder,
 
        return n_entries;
 }
+
+void intel_ddi_buf_trans_init(struct intel_encoder *encoder)
+{
+       struct drm_i915_private *i915 = to_i915(encoder->base.dev);
+       enum phy phy = intel_port_to_phy(i915, encoder->port);
+
+       if (IS_ALDERLAKE_P(i915)) {
+               if (intel_phy_is_combo(i915, phy))
+                       encoder->get_buf_trans = tgl_get_combo_buf_trans;
+               else
+                       encoder->get_buf_trans = adlp_get_dkl_buf_trans;
+       } else if (DISPLAY_VER(i915) >= 12) {
+               if (intel_phy_is_combo(i915, phy))
+                       encoder->get_buf_trans = tgl_get_combo_buf_trans;
+               else
+                       encoder->get_buf_trans = tgl_get_dkl_buf_trans;
+       } else if (DISPLAY_VER(i915) == 11) {
+               if (IS_PLATFORM(i915, INTEL_JASPERLAKE))
+                       encoder->get_buf_trans = jsl_get_combo_buf_trans;
+               else if (IS_PLATFORM(i915, INTEL_ELKHARTLAKE))
+                       encoder->get_buf_trans = ehl_get_combo_buf_trans;
+               else if (intel_phy_is_combo(i915, phy))
+                       encoder->get_buf_trans = icl_get_combo_buf_trans;
+               else
+                       encoder->get_buf_trans = icl_get_mg_buf_trans;
+       } else if (IS_CANNONLAKE(i915)) {
+               encoder->get_buf_trans = cnl_get_buf_trans;
+       } else if (IS_GEMINILAKE(i915) || IS_BROXTON(i915)) {
+               encoder->get_buf_trans = bxt_get_buf_trans;
+       } else {
+               encoder->get_buf_trans = hsw_get_buf_trans;
+       }
+}
index 879f1deec3c8815e451121a849f6855b51f4074e..05226eb46cd6e629bd63d829dcda88c3b1c57e19 100644 (file)
@@ -65,48 +65,6 @@ int intel_ddi_hdmi_num_entries(struct intel_encoder *encoder,
                               const struct intel_crtc_state *crtc_state,
                               int *default_entry);
 
-const struct intel_ddi_buf_trans *
-hsw_get_buf_trans(struct intel_encoder *encoder,
-                 const struct intel_crtc_state *crtc_state,
-                 int *n_entries);
-
-const struct intel_ddi_buf_trans *
-bxt_get_buf_trans(struct intel_encoder *encoder,
-                 const struct intel_crtc_state *crtc_state,
-                 int *n_entries);
-
-const struct intel_ddi_buf_trans *
-adlp_get_dkl_buf_trans(struct intel_encoder *encoder,
-                      const struct intel_crtc_state *crtc_state,
-                      int *n_entries);
-const struct intel_ddi_buf_trans *
-tgl_get_combo_buf_trans(struct intel_encoder *encoder,
-                       const struct intel_crtc_state *crtc_state,
-                       int *n_entries);
-const struct intel_ddi_buf_trans *
-tgl_get_dkl_buf_trans(struct intel_encoder *encoder,
-                     const struct intel_crtc_state *crtc_state,
-                     int *n_entries);
-const struct intel_ddi_buf_trans *
-jsl_get_combo_buf_trans(struct intel_encoder *encoder,
-                       const struct intel_crtc_state *crtc_state,
-                       int *n_entries);
-const struct intel_ddi_buf_trans *
-ehl_get_combo_buf_trans(struct intel_encoder *encoder,
-                       const struct intel_crtc_state *crtc_state,
-                       int *n_entries);
-const struct intel_ddi_buf_trans *
-icl_get_combo_buf_trans(struct intel_encoder *encoder,
-                       const struct intel_crtc_state *crtc_state,
-                       int *n_entries);
-const struct intel_ddi_buf_trans *
-icl_get_mg_buf_trans(struct intel_encoder *encoder,
-                    const struct intel_crtc_state *crtc_state,
-                    int *n_entries);
-
-const struct intel_ddi_buf_trans *
-cnl_get_buf_trans(struct intel_encoder *encoder,
-                 const struct intel_crtc_state *crtc_state,
-                 int *n_entries);
+void intel_ddi_buf_trans_init(struct intel_encoder *encoder);
 
 #endif
index 04613864cbe88480341e5e9fdeb58c93c3eb32de..1185834cade3e0b5c456a1b8e256d6025fb4bdac 100644 (file)
@@ -48,6 +48,7 @@
 
 struct drm_printer;
 struct __intel_global_objs_state;
+struct intel_ddi_buf_trans;
 
 /*
  * Display related stuff
@@ -263,6 +264,9 @@ struct intel_encoder {
         * Returns whether the port clock is enabled or not.
         */
        bool (*is_clock_enabled)(struct intel_encoder *encoder);
+       const struct intel_ddi_buf_trans *(*get_buf_trans)(struct intel_encoder *encoder,
+                                                          const struct intel_crtc_state *crtc_state,
+                                                          int *n_entries);
        enum hpd_pin hpd_pin;
        enum intel_display_power_domain power_domain;
        /* for communication with audio component; protected by av_mutex */
index c602ed17c4fbb92e29139b924fe5c707f06cffb9..15ea28726e7a3d24634af19375a2f3934c2a9084 100644 (file)
@@ -4,7 +4,6 @@
  */
 #include "intel_atomic.h"
 #include "intel_ddi.h"
-#include "intel_ddi_buf_trans.h"
 #include "intel_de.h"
 #include "intel_display_types.h"
 #include "intel_fdi.h"
@@ -569,7 +568,7 @@ void hsw_fdi_link_train(struct intel_encoder *encoder,
        u32 temp, i, rx_ctl_val;
        int n_entries;
 
-       hsw_get_buf_trans(encoder, crtc_state, &n_entries);
+       encoder->get_buf_trans(encoder, crtc_state, &n_entries);
 
        hsw_prepare_dp_ddi_buffers(encoder, crtc_state);