]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
drm/i915/display: Handle lane polarity for DDI port
authorUma Shankar <uma.shankar@intel.com>
Thu, 15 Apr 2021 08:48:00 +0000 (10:48 +0200)
committerStefan Bader <stefan.bader@canonical.com>
Fri, 7 May 2021 07:54:08 +0000 (09:54 +0200)
BugLink: https://bugs.launchpad.net/bugs/1924238
Lane Reversal is required for some of the DDI ports. This information
is populated in VBT and driver should read the same and set the
polarity while enabling the port. This patch handles the same.

It helps fix a display blankout issue on DP ports on certain
platforms.

Signed-off-by: Uma Shankar <uma.shankar@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210211114209.23866-1-uma.shankar@intel.com
(cherry picked from commit aaab24bb25e9fc4c8f3a1d9a593d3ace2c4af243)
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Acked-by: Tim Gardner <tim.gardner@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
drivers/gpu/drm/i915/display/intel_bios.c
drivers/gpu/drm/i915/display/intel_bios.h
drivers/gpu/drm/i915/display/intel_ddi.c

index 6b2d1215bf7f998395f7f38ba19b9664311b8e84..acffa050102c4424394eab06d11027dca1dc916a 100644 (file)
@@ -2706,6 +2706,23 @@ intel_bios_is_lspcon_present(const struct drm_i915_private *i915,
        return HAS_LSPCON(i915) && child && child->lspcon;
 }
 
+/**
+ * intel_bios_is_lane_reversal_needed - if lane reversal needed on port
+ * @i915:       i915 device instance
+ * @port:       port to check
+ *
+ * Return true if port requires lane reversal
+ */
+bool
+intel_bios_is_lane_reversal_needed(const struct drm_i915_private *i915,
+                                  enum port port)
+{
+       const struct child_device_config *child =
+               i915->vbt.ddi_port_info[port].child;
+
+       return child && child->lane_reversal;
+}
+
 enum aux_ch intel_bios_port_aux_ch(struct drm_i915_private *dev_priv,
                                   enum port port)
 {
index e29e79faa01b9d3e97627cfeb74cba7ab0b226f6..f25190ecfe97d25e6256ff63259f8b66573ea981 100644 (file)
@@ -241,6 +241,8 @@ bool intel_bios_is_port_hpd_inverted(const struct drm_i915_private *i915,
                                     enum port port);
 bool intel_bios_is_lspcon_present(const struct drm_i915_private *i915,
                                  enum port port);
+bool intel_bios_is_lane_reversal_needed(const struct drm_i915_private *i915,
+                                       enum port port);
 enum aux_ch intel_bios_port_aux_ch(struct drm_i915_private *dev_priv, enum port port);
 bool intel_bios_get_dsc_params(struct intel_encoder *encoder,
                               struct intel_crtc_state *crtc_state,
index 5adfd43f80c5cd10b41194ab79d3db23d57f1963..cf665636408b1b6358f960812257bb053bc09625 100644 (file)
@@ -5467,6 +5467,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
                        intel_de_read(dev_priv, DDI_BUF_CTL(port))
                        & (DDI_BUF_PORT_REVERSAL | DDI_A_4_LANES);
 
+       if (intel_bios_is_lane_reversal_needed(dev_priv, port))
+               dig_port->saved_port_bits |= DDI_BUF_PORT_REVERSAL;
+
        dig_port->dp.output_reg = INVALID_MMIO_REG;
        dig_port->max_lanes = intel_ddi_max_lanes(dig_port);
        dig_port->aux_ch = intel_bios_port_aux_ch(dev_priv, port);