]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/i915/display: Handle lane polarity for DDI port
authorUma Shankar <uma.shankar@intel.com>
Thu, 11 Feb 2021 11:42:09 +0000 (17:12 +0530)
committerUma Shankar <uma.shankar@intel.com>
Thu, 11 Feb 2021 16:59:43 +0000 (22:29 +0530)
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
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 7118530a1c38e128b54f827f9415b65d29c7954d..dd51413e7f459427c347022ac975c47222a83787 100644 (file)
@@ -2674,6 +2674,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 3c4003605f93c92b62d96c1937a3ec70b068b7e8..2d6906f6995f98b6ba23c5b8060e3f6add6469d9 100644 (file)
@@ -4082,6 +4082,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);