diff mbox series

drm/i915/display: Handle lane polarity for DDI port

Message ID 20210211114209.23866-1-uma.shankar@intel.com (mailing list archive)
State New, archived
Headers show
Series drm/i915/display: Handle lane polarity for DDI port | expand

Commit Message

Shankar, Uma Feb. 11, 2021, 11:42 a.m. UTC
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>
---
 drivers/gpu/drm/i915/display/intel_bios.c | 17 +++++++++++++++++
 drivers/gpu/drm/i915/display/intel_bios.h |  2 ++
 drivers/gpu/drm/i915/display/intel_ddi.c  |  3 +++
 3 files changed, 22 insertions(+)

Comments

Ville Syrjala Feb. 11, 2021, 1:03 p.m. UTC | #1
On Thu, Feb 11, 2021 at 05:12:09PM +0530, Uma Shankar wrote:
> 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>
> ---
>  drivers/gpu/drm/i915/display/intel_bios.c | 17 +++++++++++++++++
>  drivers/gpu/drm/i915/display/intel_bios.h |  2 ++
>  drivers/gpu/drm/i915/display/intel_ddi.c  |  3 +++
>  3 files changed, 22 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
> index 7118530a1c38..dd51413e7f45 100644
> --- a/drivers/gpu/drm/i915/display/intel_bios.c
> +++ b/drivers/gpu/drm/i915/display/intel_bios.c
> @@ -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)
>  {
> diff --git a/drivers/gpu/drm/i915/display/intel_bios.h b/drivers/gpu/drm/i915/display/intel_bios.h
> index e29e79faa01b..f25190ecfe97 100644
> --- a/drivers/gpu/drm/i915/display/intel_bios.h
> +++ b/drivers/gpu/drm/i915/display/intel_bios.h
> @@ -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,
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> index 3c4003605f93..2d6906f6995f 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -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;
> +

Not a huge fan of saved_port_bits in general but as long as we have it
stuffing this in there seems like the best option.

Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

>  	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);
> -- 
> 2.26.2
Shankar, Uma Feb. 11, 2021, 5:34 p.m. UTC | #2
> -----Original Message-----
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Sent: Thursday, February 11, 2021 6:33 PM
> To: Shankar, Uma <uma.shankar@intel.com>
> Cc: intel-gfx@lists.freedesktop.org; Souza, Jose <jose.souza@intel.com>; Roper,
> Matthew D <matthew.d.roper@intel.com>
> Subject: Re: [PATCH] drm/i915/display: Handle lane polarity for DDI port
> 
> On Thu, Feb 11, 2021 at 05:12:09PM +0530, Uma Shankar wrote:
> > 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>
> > ---
> >  drivers/gpu/drm/i915/display/intel_bios.c | 17 +++++++++++++++++
> > drivers/gpu/drm/i915/display/intel_bios.h |  2 ++
> > drivers/gpu/drm/i915/display/intel_ddi.c  |  3 +++
> >  3 files changed, 22 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_bios.c
> > b/drivers/gpu/drm/i915/display/intel_bios.c
> > index 7118530a1c38..dd51413e7f45 100644
> > --- a/drivers/gpu/drm/i915/display/intel_bios.c
> > +++ b/drivers/gpu/drm/i915/display/intel_bios.c
> > @@ -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)
> >  {
> > diff --git a/drivers/gpu/drm/i915/display/intel_bios.h
> > b/drivers/gpu/drm/i915/display/intel_bios.h
> > index e29e79faa01b..f25190ecfe97 100644
> > --- a/drivers/gpu/drm/i915/display/intel_bios.h
> > +++ b/drivers/gpu/drm/i915/display/intel_bios.h
> > @@ -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, diff --git
> > a/drivers/gpu/drm/i915/display/intel_ddi.c
> > b/drivers/gpu/drm/i915/display/intel_ddi.c
> > index 3c4003605f93..2d6906f6995f 100644
> > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > @@ -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;
> > +
> 
> Not a huge fan of saved_port_bits in general but as long as we have it stuffing this in
> there seems like the best option.
> 
> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Pushed the change to drm-intel-next. Thanks Ville for the review.

Regards,
Uma Shankar
> >  	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);
> > --
> > 2.26.2
> 
> --
> Ville Syrjälä
> Intel
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
index 7118530a1c38..dd51413e7f45 100644
--- a/drivers/gpu/drm/i915/display/intel_bios.c
+++ b/drivers/gpu/drm/i915/display/intel_bios.c
@@ -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)
 {
diff --git a/drivers/gpu/drm/i915/display/intel_bios.h b/drivers/gpu/drm/i915/display/intel_bios.h
index e29e79faa01b..f25190ecfe97 100644
--- a/drivers/gpu/drm/i915/display/intel_bios.h
+++ b/drivers/gpu/drm/i915/display/intel_bios.h
@@ -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,
diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
index 3c4003605f93..2d6906f6995f 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -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);