Re: [PATCH] drm/i915/display: PCH display HPD IRQ is not detected with default filter value

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx>
> Sent: Friday, April 14, 2023 1:36 PM
> To: Kandpal, Suraj <suraj.kandpal@xxxxxxxxx>
> Cc: intel-gfx@xxxxxxxxxxxxxxxxxxxxx
> Subject: Re:  [PATCH] drm/i915/display: PCH display HPD IRQ is not
> detected with default filter value
> 
> On Fri, Apr 14, 2023 at 12:53:45PM +0530, Suraj Kandpal wrote:
> > On TGP, the RTC (always running) was reduced from 3MHz to 32KHz.
> > As a result of this change, when HPD active going low pulse or HPD IRQ
> > is presented and the refclk (19.2MHz) is not toggling already
> > toggling, there is a 60 to 90us synchronization delay which
> > effectively reduces the duration of the IRQ pulse to less than the
> > programmed 500us filter value and the hot plug interrupt is NOT
> registered.
> > Program 0xC7204 (PP_CONTROL) bit #0 to '1' to enable workaround and
> > clear to disable it.
> > Driver shall enable this WA when external display is connected and
> > remove WA when display is unplugged or before going into sleep to
> > allow CS entry.
> > Driver shall not enable WA when eDP is connected.
> > Wa_1508796671:adls
> >
> > Cc: Arun Murthy <arun.r.murthy@xxxxxxxxx>
> > Cc: Uma Shankar <uma.shankar@xxxxxxxxx>
> > Signed-off-by: Suraj Kandpal <suraj.kandpal@xxxxxxxxx>
> > ---
> >  drivers/gpu/drm/i915/display/intel_dp.c  | 19 +++++++++++++++++++
> > drivers/gpu/drm/i915/display/intel_pps.c |  1 +
> >  drivers/gpu/drm/i915/i915_drv.h          |  2 ++
> >  3 files changed, 22 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> > b/drivers/gpu/drm/i915/display/intel_dp.c
> > index 8e16745275f6..f93895d99fd1 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > @@ -4689,6 +4689,7 @@ intel_dp_detect(struct drm_connector
> *connector,
> >  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
> >  	struct intel_encoder *encoder = &dig_port->base;
> >  	enum drm_connector_status status;
> > +	int32_t pp;
> >
> >  	drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s]\n",
> >  		    connector->base.id, connector->name); @@ -4792,6
> +4793,22 @@
> > intel_dp_detect(struct drm_connector *connector,
> >  						 status,
> >  						 intel_dp->dpcd,
> >  						 intel_dp-
> >downstream_ports);
> > +
> > +	/*
> > +	 * WA_150879661:adls
> > +	 * Driver shall enable this WA when external display is connected
> > +	 * and remove WA when display is unplugged
> > +	 */
> > +	if (IS_ALDERLAKE_S(dev_priv)) {
> > +		if (status == connector_status_connected &&
> > +		    !dev_priv->edp_present)
> > +			pp = PANEL_POWER_ON;
> > +		else if (status == connector_status_disconnected)
> > +			pp = 0;
> > +
> > +		intel_de_rmw(dev_priv, _MMIO(PCH_PPS_BASE + 4), 1, pp);
> > +	}
> 
> This whole w/a is just utter nonsense. The better fix would be to adjust the
> SHPD_FILTER length. There was some internal discussion around this the last
> time it was raised, but the only clear conclusion was to reduce the default
> SHPD_FILTER from 500 to 250 usec (which is what the DP spec actually cals
> for) on future hw.
> 
> We already adjust that SHPD_FILTER down a little bit on some PCHs (due to
> some other w/a presumably), but I think just dropping it further to ~400 usec
> (if we don't want to go all the way down to
> 250 on old hw as well) should cover this issue.
> 

Thanks for pointing that out let me check and float a fix for this Wa

Regards,
Suraj Kandpal
> > +
> >  	return status;
> >  }
> >
> > @@ -5489,6 +5506,8 @@ intel_dp_init_connector(struct intel_digital_port
> *dig_port,
> >  	if (!intel_edp_init_connector(intel_dp, intel_connector)) {
> >  		intel_dp_aux_fini(intel_dp);
> >  		goto fail;
> > +	} else {
> > +		dev_priv->edp_present = true;
> >  	}
> >
> >  	intel_dp_set_source_rates(intel_dp);
> > diff --git a/drivers/gpu/drm/i915/display/intel_pps.c
> > b/drivers/gpu/drm/i915/display/intel_pps.c
> > index 24b5b12f7732..21538338af3d 100644
> > --- a/drivers/gpu/drm/i915/display/intel_pps.c
> > +++ b/drivers/gpu/drm/i915/display/intel_pps.c
> > @@ -1726,4 +1726,5 @@ void assert_pps_unlocked(struct
> drm_i915_private *dev_priv, enum pipe pipe)
> >  	I915_STATE_WARN(panel_pipe == pipe && locked,
> >  			"panel assertion failure, pipe %c regs locked\n",
> >  			pipe_name(pipe));
> > +
> >  }
> > diff --git a/drivers/gpu/drm/i915/i915_drv.h
> > b/drivers/gpu/drm/i915/i915_drv.h index 6254aa977398..ebe16aee0ca8
> > 100644
> > --- a/drivers/gpu/drm/i915/i915_drv.h
> > +++ b/drivers/gpu/drm/i915/i915_drv.h
> > @@ -352,6 +352,8 @@ struct drm_i915_private {
> >  	/* The TTM device structure. */
> >  	struct ttm_device bdev;
> >
> > +	bool edp_present;
> > +
> >  	I915_SELFTEST_DECLARE(struct i915_selftest_stash selftest;)
> >
> >  	/*
> > --
> > 2.25.1
> 
> --
> Ville Syrjälä
> Intel




[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux