diff mbox series

drm/i915/dp_mst: Fix MST state after a sink reset

Message ID 20240724161223.2291853-1-imre.deak@intel.com (mailing list archive)
State New, archived
Headers show
Series drm/i915/dp_mst: Fix MST state after a sink reset | expand

Commit Message

Imre Deak July 24, 2024, 4:12 p.m. UTC
In some cases the sink can reset itself after it was configured into MST
mode, without the driver noticing the disconnected state. For instance
the reset may happen in the middle of a modeset, or the (long) HPD pulse
generated may be not long enough for the encoder detect handler to
observe the HPD's deasserted state. In this case the sink's DPCD
register programmed to enable MST will be reset, while the driver still
assumes MST is still enabled. Detect this condition, which will tear
down and recreate/re-enable the MST topology.

Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11195
Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c     |  3 +++
 drivers/gpu/drm/i915/display/intel_dp_mst.c | 30 +++++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_dp_mst.h |  1 +
 3 files changed, 34 insertions(+)

Comments

Jani Nikula July 24, 2024, 4:21 p.m. UTC | #1
On Wed, 24 Jul 2024, Imre Deak <imre.deak@intel.com> wrote:
> In some cases the sink can reset itself after it was configured into MST
> mode, without the driver noticing the disconnected state. For instance
> the reset may happen in the middle of a modeset, or the (long) HPD pulse
> generated may be not long enough for the encoder detect handler to
> observe the HPD's deasserted state. In this case the sink's DPCD
> register programmed to enable MST will be reset, while the driver still
> assumes MST is still enabled. Detect this condition, which will tear
> down and recreate/re-enable the MST topology.
>
> Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11195
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c     |  3 +++
>  drivers/gpu/drm/i915/display/intel_dp_mst.c | 30 +++++++++++++++++++++
>  drivers/gpu/drm/i915/display/intel_dp_mst.h |  1 +
>  3 files changed, 34 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 1e43e32e05199..c621f6daf8235 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -5878,6 +5878,9 @@ intel_dp_detect(struct drm_connector *connector,
>  	else
>  		status = connector_status_disconnected;
>  
> +	if (!intel_dp_mst_verify_dpcd_state(intel_dp))
> +		status = connector_status_disconnected;
> +
>  	if (status == connector_status_disconnected) {
>  		memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
>  		memset(intel_connector->dp.dsc_dpcd, 0, sizeof(intel_connector->dp.dsc_dpcd));
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> index 27ce5c3f5951e..89b147e37b400 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> @@ -1998,3 +1998,33 @@ bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
>  
>  	return false;
>  }
> +
> +/**
> + * intel_dp_mst_verify_dpcd_state - verify the MST SW enabled state wrt. the DPCD
> + * @intel_dp: DP port object
> + *
> + * Verify if @intel_dp's MST enabled SW state matches the corresponding DPCD
> + * state. A long HPD pulse -not long enough to be detected as a disconnected
> + * state - could've reset the DPCD state, which requires tearing
> + * down/recreating the MST topology.
> + *
> + * Returns %true if the SW MST enabled and DPCD states match, %false
> + * otherwise.
> + */
> +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp)
> +{
> +	int ret;
> +	u8 val;
> +
> +	if (!intel_dp->is_mst)
> +		return true;
> +
> +	ret = drm_dp_dpcd_readb(intel_dp->mst_mgr.aux, DP_MSTM_CTRL, &val);
> +	if (ret < 0)
> +		return false;
> +
> +	if (val != (DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC))

Hmm. This is not comparing the value to any software state, but some
hardcoded combo of values which may or may not match. In particular,
this makes it harder to untangle MST from SST-with-sideband, I think.

BR,
Jani.

> +		return false;
> +
> +	return true;
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.h b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> index 8ca1d599091c6..9e4c7679f1c3a 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> @@ -27,5 +27,6 @@ int intel_dp_mst_atomic_check_link(struct intel_atomic_state *state,
>  				   struct intel_link_bw_limits *limits);
>  bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
>  				     struct intel_crtc *crtc);
> +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp);
>  
>  #endif /* __INTEL_DP_MST_H__ */
Imre Deak July 24, 2024, 4:40 p.m. UTC | #2
On Wed, Jul 24, 2024 at 07:21:53PM +0300, Jani Nikula wrote:
> On Wed, 24 Jul 2024, Imre Deak <imre.deak@intel.com> wrote:
> > In some cases the sink can reset itself after it was configured into MST
> > mode, without the driver noticing the disconnected state. For instance
> > the reset may happen in the middle of a modeset, or the (long) HPD pulse
> > generated may be not long enough for the encoder detect handler to
> > observe the HPD's deasserted state. In this case the sink's DPCD
> > register programmed to enable MST will be reset, while the driver still
> > assumes MST is still enabled. Detect this condition, which will tear
> > down and recreate/re-enable the MST topology.
> >
> > Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11195
> > Signed-off-by: Imre Deak <imre.deak@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_dp.c     |  3 +++
> >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 30 +++++++++++++++++++++
> >  drivers/gpu/drm/i915/display/intel_dp_mst.h |  1 +
> >  3 files changed, 34 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> > index 1e43e32e05199..c621f6daf8235 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > @@ -5878,6 +5878,9 @@ intel_dp_detect(struct drm_connector *connector,
> >  	else
> >  		status = connector_status_disconnected;
> >  
> > +	if (!intel_dp_mst_verify_dpcd_state(intel_dp))
> > +		status = connector_status_disconnected;
> > +
> >  	if (status == connector_status_disconnected) {
> >  		memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
> >  		memset(intel_connector->dp.dsc_dpcd, 0, sizeof(intel_connector->dp.dsc_dpcd));
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > index 27ce5c3f5951e..89b147e37b400 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > @@ -1998,3 +1998,33 @@ bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
> >  
> >  	return false;
> >  }
> > +
> > +/**
> > + * intel_dp_mst_verify_dpcd_state - verify the MST SW enabled state wrt. the DPCD
> > + * @intel_dp: DP port object
> > + *
> > + * Verify if @intel_dp's MST enabled SW state matches the corresponding DPCD
> > + * state. A long HPD pulse -not long enough to be detected as a disconnected
> > + * state - could've reset the DPCD state, which requires tearing
> > + * down/recreating the MST topology.
> > + *
> > + * Returns %true if the SW MST enabled and DPCD states match, %false
> > + * otherwise.
> > + */
> > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp)
> > +{
> > +	int ret;
> > +	u8 val;
> > +
> > +	if (!intel_dp->is_mst)
> > +		return true;
> > +
> > +	ret = drm_dp_dpcd_readb(intel_dp->mst_mgr.aux, DP_MSTM_CTRL, &val);
> > +	if (ret < 0)
> > +		return false;
> > +
> > +	if (val != (DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC))
> 
> Hmm. This is not comparing the value to any software state, but some
> hardcoded combo of values which may or may not match.

The software state is intel_dp->is_mst. That's atm the way to check if
MST was enabled previously and correspondingly DP_MSTM_CTRL programmed
to the above value. There is also intel_dp->mst_detect, but that can't
be used here, since that's reset after MST gets enabled.

> In particular, this makes it harder to untangle MST from SST-with-sideband,
> I think.

After that's enabled this should be changed; there isn't a good way atm
to tell full MST and SST-with-sideband apart. I don't see that as a
problem as only full MST will be enabled.

> 
> BR,
> Jani.
> 
> > +		return false;
> > +
> > +	return true;
> > +}
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.h b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> > index 8ca1d599091c6..9e4c7679f1c3a 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.h
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> > @@ -27,5 +27,6 @@ int intel_dp_mst_atomic_check_link(struct intel_atomic_state *state,
> >  				   struct intel_link_bw_limits *limits);
> >  bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
> >  				     struct intel_crtc *crtc);
> > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp);
> >  
> >  #endif /* __INTEL_DP_MST_H__ */
> 
> -- 
> Jani Nikula, Intel
Jani Nikula Aug. 21, 2024, 2:19 p.m. UTC | #3
On Wed, 24 Jul 2024, Imre Deak <imre.deak@intel.com> wrote:
> In some cases the sink can reset itself after it was configured into MST
> mode, without the driver noticing the disconnected state. For instance
> the reset may happen in the middle of a modeset, or the (long) HPD pulse
> generated may be not long enough for the encoder detect handler to
> observe the HPD's deasserted state. In this case the sink's DPCD
> register programmed to enable MST will be reset, while the driver still
> assumes MST is still enabled. Detect this condition, which will tear
> down and recreate/re-enable the MST topology.
>
> Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11195
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c     |  3 +++
>  drivers/gpu/drm/i915/display/intel_dp_mst.c | 30 +++++++++++++++++++++
>  drivers/gpu/drm/i915/display/intel_dp_mst.h |  1 +
>  3 files changed, 34 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 1e43e32e05199..c621f6daf8235 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -5878,6 +5878,9 @@ intel_dp_detect(struct drm_connector *connector,
>  	else
>  		status = connector_status_disconnected;
>  
> +	if (!intel_dp_mst_verify_dpcd_state(intel_dp))
> +		status = connector_status_disconnected;
> +

So I still don't understand. We've got a detect which we've determined
is connected. But then we disconnect because the sink state has changed.

How do we get another connect?

BR,
Jani.


>  	if (status == connector_status_disconnected) {
>  		memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
>  		memset(intel_connector->dp.dsc_dpcd, 0, sizeof(intel_connector->dp.dsc_dpcd));
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> index 27ce5c3f5951e..89b147e37b400 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> @@ -1998,3 +1998,33 @@ bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
>  
>  	return false;
>  }
> +
> +/**
> + * intel_dp_mst_verify_dpcd_state - verify the MST SW enabled state wrt. the DPCD
> + * @intel_dp: DP port object
> + *
> + * Verify if @intel_dp's MST enabled SW state matches the corresponding DPCD
> + * state. A long HPD pulse -not long enough to be detected as a disconnected
> + * state - could've reset the DPCD state, which requires tearing
> + * down/recreating the MST topology.
> + *
> + * Returns %true if the SW MST enabled and DPCD states match, %false
> + * otherwise.
> + */
> +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp)
> +{
> +	int ret;
> +	u8 val;
> +
> +	if (!intel_dp->is_mst)
> +		return true;
> +
> +	ret = drm_dp_dpcd_readb(intel_dp->mst_mgr.aux, DP_MSTM_CTRL, &val);
> +	if (ret < 0)
> +		return false;
> +
> +	if (val != (DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC))
> +		return false;
> +
> +	return true;
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.h b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> index 8ca1d599091c6..9e4c7679f1c3a 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> @@ -27,5 +27,6 @@ int intel_dp_mst_atomic_check_link(struct intel_atomic_state *state,
>  				   struct intel_link_bw_limits *limits);
>  bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
>  				     struct intel_crtc *crtc);
> +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp);
>  
>  #endif /* __INTEL_DP_MST_H__ */
Imre Deak Aug. 21, 2024, 2:25 p.m. UTC | #4
On Wed, Aug 21, 2024 at 05:19:11PM +0300, Jani Nikula wrote:
> On Wed, 24 Jul 2024, Imre Deak <imre.deak@intel.com> wrote:
> > In some cases the sink can reset itself after it was configured into MST
> > mode, without the driver noticing the disconnected state. For instance
> > the reset may happen in the middle of a modeset, or the (long) HPD pulse
> > generated may be not long enough for the encoder detect handler to
> > observe the HPD's deasserted state. In this case the sink's DPCD
> > register programmed to enable MST will be reset, while the driver still
> > assumes MST is still enabled. Detect this condition, which will tear
> > down and recreate/re-enable the MST topology.
> >
> > Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11195
> > Signed-off-by: Imre Deak <imre.deak@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_dp.c     |  3 +++
> >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 30 +++++++++++++++++++++
> >  drivers/gpu/drm/i915/display/intel_dp_mst.h |  1 +
> >  3 files changed, 34 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> > index 1e43e32e05199..c621f6daf8235 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > @@ -5878,6 +5878,9 @@ intel_dp_detect(struct drm_connector *connector,
> >  	else
> >  		status = connector_status_disconnected;
> >  
> > +	if (!intel_dp_mst_verify_dpcd_state(intel_dp))
> > +		status = connector_status_disconnected;
> > +
> 
> So I still don't understand. We've got a detect which we've determined
> is connected. But then we disconnect because the sink state has changed.
> 
> How do we get another connect?

The detect in this case will be retried with a 1 sec delay, since the
mode changes back to SST and the connector state stays disconnected.

> BR,
> Jani.
> 
> 
> >  	if (status == connector_status_disconnected) {
> >  		memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
> >  		memset(intel_connector->dp.dsc_dpcd, 0, sizeof(intel_connector->dp.dsc_dpcd));
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > index 27ce5c3f5951e..89b147e37b400 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > @@ -1998,3 +1998,33 @@ bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
> >  
> >  	return false;
> >  }
> > +
> > +/**
> > + * intel_dp_mst_verify_dpcd_state - verify the MST SW enabled state wrt. the DPCD
> > + * @intel_dp: DP port object
> > + *
> > + * Verify if @intel_dp's MST enabled SW state matches the corresponding DPCD
> > + * state. A long HPD pulse -not long enough to be detected as a disconnected
> > + * state - could've reset the DPCD state, which requires tearing
> > + * down/recreating the MST topology.
> > + *
> > + * Returns %true if the SW MST enabled and DPCD states match, %false
> > + * otherwise.
> > + */
> > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp)
> > +{
> > +	int ret;
> > +	u8 val;
> > +
> > +	if (!intel_dp->is_mst)
> > +		return true;
> > +
> > +	ret = drm_dp_dpcd_readb(intel_dp->mst_mgr.aux, DP_MSTM_CTRL, &val);
> > +	if (ret < 0)
> > +		return false;
> > +
> > +	if (val != (DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC))
> > +		return false;
> > +
> > +	return true;
> > +}
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.h b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> > index 8ca1d599091c6..9e4c7679f1c3a 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.h
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> > @@ -27,5 +27,6 @@ int intel_dp_mst_atomic_check_link(struct intel_atomic_state *state,
> >  				   struct intel_link_bw_limits *limits);
> >  bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
> >  				     struct intel_crtc *crtc);
> > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp);
> >  
> >  #endif /* __INTEL_DP_MST_H__ */
> 
> -- 
> Jani Nikula, Intel
Suraj Kandpal Aug. 22, 2024, 9:38 a.m. UTC | #5
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre
> Deak
> Sent: Wednesday, July 24, 2024 10:10 PM
> To: Jani Nikula <jani.nikula@linux.intel.com>
> Cc: intel-gfx@lists.freedesktop.org
> Subject: Re: [PATCH] drm/i915/dp_mst: Fix MST state after a sink reset
> 
> On Wed, Jul 24, 2024 at 07:21:53PM +0300, Jani Nikula wrote:
> > On Wed, 24 Jul 2024, Imre Deak <imre.deak@intel.com> wrote:
> > > In some cases the sink can reset itself after it was configured into
> > > MST mode, without the driver noticing the disconnected state. For
> > > instance the reset may happen in the middle of a modeset, or the
> > > (long) HPD pulse generated may be not long enough for the encoder
> > > detect handler to observe the HPD's deasserted state. In this case
> > > the sink's DPCD register programmed to enable MST will be reset,
> > > while the driver still assumes MST is still enabled. Detect this
> > > condition, which will tear down and recreate/re-enable the MST
> topology.
> > >
> > > Closes:
> > > https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11195
> > > Signed-off-by: Imre Deak <imre.deak@intel.com>

Does this require a TODO to remind us to remove this when we decouple MST SST
Sideband messaging?
Otherwise
LGTM,
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>

> > > ---
> > >  drivers/gpu/drm/i915/display/intel_dp.c     |  3 +++
> > >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 30
> > > +++++++++++++++++++++  drivers/gpu/drm/i915/display/intel_dp_mst.h
> |
> > > 1 +
> > >  3 files changed, 34 insertions(+)
> > >
> > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> > > b/drivers/gpu/drm/i915/display/intel_dp.c
> > > index 1e43e32e05199..c621f6daf8235 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > > @@ -5878,6 +5878,9 @@ intel_dp_detect(struct drm_connector
> *connector,
> > >  	else
> > >  		status = connector_status_disconnected;
> > >
> > > +	if (!intel_dp_mst_verify_dpcd_state(intel_dp))
> > > +		status = connector_status_disconnected;
> > > +
> > >  	if (status == connector_status_disconnected) {
> > >  		memset(&intel_dp->compliance, 0, sizeof(intel_dp-
> >compliance));
> > >  		memset(intel_connector->dp.dsc_dpcd, 0,
> > > sizeof(intel_connector->dp.dsc_dpcd));
> > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > index 27ce5c3f5951e..89b147e37b400 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > @@ -1998,3 +1998,33 @@ bool
> intel_dp_mst_crtc_needs_modeset(struct
> > > intel_atomic_state *state,
> > >
> > >  	return false;
> > >  }
> > > +
> > > +/**
> > > + * intel_dp_mst_verify_dpcd_state - verify the MST SW enabled state
> > > +wrt. the DPCD
> > > + * @intel_dp: DP port object
> > > + *
> > > + * Verify if @intel_dp's MST enabled SW state matches the
> > > +corresponding DPCD
> > > + * state. A long HPD pulse -not long enough to be detected as a
> > > +disconnected
> > > + * state - could've reset the DPCD state, which requires tearing
> > > + * down/recreating the MST topology.
> > > + *
> > > + * Returns %true if the SW MST enabled and DPCD states match,
> > > +%false
> > > + * otherwise.
> > > + */
> > > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp) {
> > > +	int ret;
> > > +	u8 val;
> > > +
> > > +	if (!intel_dp->is_mst)
> > > +		return true;
> > > +
> > > +	ret = drm_dp_dpcd_readb(intel_dp->mst_mgr.aux, DP_MSTM_CTRL,
> &val);
> > > +	if (ret < 0)
> > > +		return false;
> > > +
> > > +	if (val != (DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC))
> >
> > Hmm. This is not comparing the value to any software state, but some
> > hardcoded combo of values which may or may not match.
> 
> The software state is intel_dp->is_mst. That's atm the way to check if MST
> was enabled previously and correspondingly DP_MSTM_CTRL programmed
> to the above value. There is also intel_dp->mst_detect, but that can't be
> used here, since that's reset after MST gets enabled.
> 
> > In particular, this makes it harder to untangle MST from
> > SST-with-sideband, I think.
> 
> After that's enabled this should be changed; there isn't a good way atm to
> tell full MST and SST-with-sideband apart. I don't see that as a problem as
> only full MST will be enabled.
> 
> >
> > BR,
> > Jani.
> >
> > > +		return false;
> > > +
> > > +	return true;
> > > +}
> > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.h
> > > b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> > > index 8ca1d599091c6..9e4c7679f1c3a 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.h
> > > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> > > @@ -27,5 +27,6 @@ int intel_dp_mst_atomic_check_link(struct
> intel_atomic_state *state,
> > >  				   struct intel_link_bw_limits *limits);  bool
> > > intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
> > >  				     struct intel_crtc *crtc);
> > > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp);
> > >
> > >  #endif /* __INTEL_DP_MST_H__ */
> >
> > --
> > Jani Nikula, Intel
Jani Nikula Aug. 22, 2024, 10 a.m. UTC | #6
On Wed, 21 Aug 2024, Imre Deak <imre.deak@intel.com> wrote:
> On Wed, Aug 21, 2024 at 05:19:11PM +0300, Jani Nikula wrote:
>> On Wed, 24 Jul 2024, Imre Deak <imre.deak@intel.com> wrote:
>> > In some cases the sink can reset itself after it was configured into MST
>> > mode, without the driver noticing the disconnected state. For instance
>> > the reset may happen in the middle of a modeset, or the (long) HPD pulse
>> > generated may be not long enough for the encoder detect handler to
>> > observe the HPD's deasserted state. In this case the sink's DPCD
>> > register programmed to enable MST will be reset, while the driver still
>> > assumes MST is still enabled. Detect this condition, which will tear
>> > down and recreate/re-enable the MST topology.
>> >
>> > Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11195
>> > Signed-off-by: Imre Deak <imre.deak@intel.com>
>> > ---
>> >  drivers/gpu/drm/i915/display/intel_dp.c     |  3 +++
>> >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 30 +++++++++++++++++++++
>> >  drivers/gpu/drm/i915/display/intel_dp_mst.h |  1 +
>> >  3 files changed, 34 insertions(+)
>> >
>> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
>> > index 1e43e32e05199..c621f6daf8235 100644
>> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
>> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
>> > @@ -5878,6 +5878,9 @@ intel_dp_detect(struct drm_connector *connector,
>> >  	else
>> >  		status = connector_status_disconnected;
>> >  
>> > +	if (!intel_dp_mst_verify_dpcd_state(intel_dp))
>> > +		status = connector_status_disconnected;
>> > +
>> 
>> So I still don't understand. We've got a detect which we've determined
>> is connected. But then we disconnect because the sink state has changed.
>> 
>> How do we get another connect?
>
> The detect in this case will be retried with a 1 sec delay, since the
> mode changes back to SST and the connector state stays disconnected.

What exactly triggers the retry? I don't see this triggering the
INTEL_HOTPLUG_RETRY case.

I'm just trying to understand, please bear with me.

BR,
Jani.


>
>> BR,
>> Jani.
>> 
>> 
>> >  	if (status == connector_status_disconnected) {
>> >  		memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
>> >  		memset(intel_connector->dp.dsc_dpcd, 0, sizeof(intel_connector->dp.dsc_dpcd));
>> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
>> > index 27ce5c3f5951e..89b147e37b400 100644
>> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
>> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
>> > @@ -1998,3 +1998,33 @@ bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
>> >  
>> >  	return false;
>> >  }
>> > +
>> > +/**
>> > + * intel_dp_mst_verify_dpcd_state - verify the MST SW enabled state wrt. the DPCD
>> > + * @intel_dp: DP port object
>> > + *
>> > + * Verify if @intel_dp's MST enabled SW state matches the corresponding DPCD
>> > + * state. A long HPD pulse -not long enough to be detected as a disconnected
>> > + * state - could've reset the DPCD state, which requires tearing
>> > + * down/recreating the MST topology.
>> > + *
>> > + * Returns %true if the SW MST enabled and DPCD states match, %false
>> > + * otherwise.
>> > + */
>> > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp)
>> > +{
>> > +	int ret;
>> > +	u8 val;
>> > +
>> > +	if (!intel_dp->is_mst)
>> > +		return true;
>> > +
>> > +	ret = drm_dp_dpcd_readb(intel_dp->mst_mgr.aux, DP_MSTM_CTRL, &val);
>> > +	if (ret < 0)
>> > +		return false;
>> > +
>> > +	if (val != (DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC))
>> > +		return false;
>> > +
>> > +	return true;
>> > +}
>> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.h b/drivers/gpu/drm/i915/display/intel_dp_mst.h
>> > index 8ca1d599091c6..9e4c7679f1c3a 100644
>> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.h
>> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.h
>> > @@ -27,5 +27,6 @@ int intel_dp_mst_atomic_check_link(struct intel_atomic_state *state,
>> >  				   struct intel_link_bw_limits *limits);
>> >  bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
>> >  				     struct intel_crtc *crtc);
>> > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp);
>> >  
>> >  #endif /* __INTEL_DP_MST_H__ */
>> 
>> -- 
>> Jani Nikula, Intel
Imre Deak Aug. 22, 2024, 10:07 a.m. UTC | #7
On Thu, Aug 22, 2024 at 01:00:03PM +0300, Jani Nikula wrote:
> On Wed, 21 Aug 2024, Imre Deak <imre.deak@intel.com> wrote:
> > On Wed, Aug 21, 2024 at 05:19:11PM +0300, Jani Nikula wrote:
> >> On Wed, 24 Jul 2024, Imre Deak <imre.deak@intel.com> wrote:
> >> > In some cases the sink can reset itself after it was configured into MST
> >> > mode, without the driver noticing the disconnected state. For instance
> >> > the reset may happen in the middle of a modeset, or the (long) HPD pulse
> >> > generated may be not long enough for the encoder detect handler to
> >> > observe the HPD's deasserted state. In this case the sink's DPCD
> >> > register programmed to enable MST will be reset, while the driver still
> >> > assumes MST is still enabled. Detect this condition, which will tear
> >> > down and recreate/re-enable the MST topology.
> >> >
> >> > Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11195
> >> > Signed-off-by: Imre Deak <imre.deak@intel.com>
> >> > ---
> >> >  drivers/gpu/drm/i915/display/intel_dp.c     |  3 +++
> >> >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 30 +++++++++++++++++++++
> >> >  drivers/gpu/drm/i915/display/intel_dp_mst.h |  1 +
> >> >  3 files changed, 34 insertions(+)
> >> >
> >> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> >> > index 1e43e32e05199..c621f6daf8235 100644
> >> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> >> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> >> > @@ -5878,6 +5878,9 @@ intel_dp_detect(struct drm_connector *connector,
> >> >  	else
> >> >  		status = connector_status_disconnected;
> >> >  
> >> > +	if (!intel_dp_mst_verify_dpcd_state(intel_dp))
> >> > +		status = connector_status_disconnected;
> >> > +
> >> 
> >> So I still don't understand. We've got a detect which we've determined
> >> is connected. But then we disconnect because the sink state has changed.
> >> 
> >> How do we get another connect?
> >
> > The detect in this case will be retried with a 1 sec delay, since the
> > mode changes back to SST and the connector state stays disconnected.
> 
> What exactly triggers the retry? I don't see this triggering the
> INTEL_HOTPLUG_RETRY case.

drm_connector::status is connector_status_disconnected before the detect
(as always for an MST root connector) and it stays
connector_status_disconnected. The connector's mode will also change to
SST (intel_dp::is_mst from true to false). This condition will lead to
the detect getting retried.

A detect will actually happen in any case, since removing the MST
connectors results in a (global) hotplug uevent being sent, to which
userspace should respond with re-probing all connectors.

> I'm just trying to understand, please bear with me.
> 
> BR,
> Jani.
> 
> 
> >
> >> BR,
> >> Jani.
> >> 
> >> 
> >> >  	if (status == connector_status_disconnected) {
> >> >  		memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
> >> >  		memset(intel_connector->dp.dsc_dpcd, 0, sizeof(intel_connector->dp.dsc_dpcd));
> >> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> >> > index 27ce5c3f5951e..89b147e37b400 100644
> >> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> >> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> >> > @@ -1998,3 +1998,33 @@ bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
> >> >  
> >> >  	return false;
> >> >  }
> >> > +
> >> > +/**
> >> > + * intel_dp_mst_verify_dpcd_state - verify the MST SW enabled state wrt. the DPCD
> >> > + * @intel_dp: DP port object
> >> > + *
> >> > + * Verify if @intel_dp's MST enabled SW state matches the corresponding DPCD
> >> > + * state. A long HPD pulse -not long enough to be detected as a disconnected
> >> > + * state - could've reset the DPCD state, which requires tearing
> >> > + * down/recreating the MST topology.
> >> > + *
> >> > + * Returns %true if the SW MST enabled and DPCD states match, %false
> >> > + * otherwise.
> >> > + */
> >> > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp)
> >> > +{
> >> > +	int ret;
> >> > +	u8 val;
> >> > +
> >> > +	if (!intel_dp->is_mst)
> >> > +		return true;
> >> > +
> >> > +	ret = drm_dp_dpcd_readb(intel_dp->mst_mgr.aux, DP_MSTM_CTRL, &val);
> >> > +	if (ret < 0)
> >> > +		return false;
> >> > +
> >> > +	if (val != (DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC))
> >> > +		return false;
> >> > +
> >> > +	return true;
> >> > +}
> >> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.h b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> >> > index 8ca1d599091c6..9e4c7679f1c3a 100644
> >> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.h
> >> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> >> > @@ -27,5 +27,6 @@ int intel_dp_mst_atomic_check_link(struct intel_atomic_state *state,
> >> >  				   struct intel_link_bw_limits *limits);
> >> >  bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
> >> >  				     struct intel_crtc *crtc);
> >> > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp);
> >> >  
> >> >  #endif /* __INTEL_DP_MST_H__ */
> >> 
> >> -- 
> >> Jani Nikula, Intel
> 
> -- 
> Jani Nikula, Intel
Jani Nikula Aug. 22, 2024, 2:53 p.m. UTC | #8
On Thu, 22 Aug 2024, Imre Deak <imre.deak@intel.com> wrote:
> On Thu, Aug 22, 2024 at 01:00:03PM +0300, Jani Nikula wrote:
>> On Wed, 21 Aug 2024, Imre Deak <imre.deak@intel.com> wrote:
>> > On Wed, Aug 21, 2024 at 05:19:11PM +0300, Jani Nikula wrote:
>> >> On Wed, 24 Jul 2024, Imre Deak <imre.deak@intel.com> wrote:
>> >> > In some cases the sink can reset itself after it was configured into MST
>> >> > mode, without the driver noticing the disconnected state. For instance
>> >> > the reset may happen in the middle of a modeset, or the (long) HPD pulse
>> >> > generated may be not long enough for the encoder detect handler to
>> >> > observe the HPD's deasserted state. In this case the sink's DPCD
>> >> > register programmed to enable MST will be reset, while the driver still
>> >> > assumes MST is still enabled. Detect this condition, which will tear
>> >> > down and recreate/re-enable the MST topology.
>> >> >
>> >> > Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11195
>> >> > Signed-off-by: Imre Deak <imre.deak@intel.com>
>> >> > ---
>> >> >  drivers/gpu/drm/i915/display/intel_dp.c     |  3 +++
>> >> >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 30 +++++++++++++++++++++
>> >> >  drivers/gpu/drm/i915/display/intel_dp_mst.h |  1 +
>> >> >  3 files changed, 34 insertions(+)
>> >> >
>> >> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
>> >> > index 1e43e32e05199..c621f6daf8235 100644
>> >> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
>> >> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
>> >> > @@ -5878,6 +5878,9 @@ intel_dp_detect(struct drm_connector *connector,
>> >> >  	else
>> >> >  		status = connector_status_disconnected;
>> >> >  
>> >> > +	if (!intel_dp_mst_verify_dpcd_state(intel_dp))
>> >> > +		status = connector_status_disconnected;
>> >> > +
>> >> 
>> >> So I still don't understand. We've got a detect which we've determined
>> >> is connected. But then we disconnect because the sink state has changed.
>> >> 
>> >> How do we get another connect?
>> >
>> > The detect in this case will be retried with a 1 sec delay, since the
>> > mode changes back to SST and the connector state stays disconnected.
>> 
>> What exactly triggers the retry? I don't see this triggering the
>> INTEL_HOTPLUG_RETRY case.
>
> drm_connector::status is connector_status_disconnected before the detect
> (as always for an MST root connector)

This was one of the missing pieces for me. I just thought we'd get here
with connector_status_connected && is_mst == true, which would lead to a
change.

Very well then. One final nitpick below.

> and it stays
> connector_status_disconnected. The connector's mode will also change to
> SST (intel_dp::is_mst from true to false). This condition will lead to
> the detect getting retried.
>
> A detect will actually happen in any case, since removing the MST
> connectors results in a (global) hotplug uevent being sent, to which
> userspace should respond with re-probing all connectors.
>
>> I'm just trying to understand, please bear with me.
>> 
>> BR,
>> Jani.
>> 
>> 
>> >
>> >> BR,
>> >> Jani.
>> >> 
>> >> 
>> >> >  	if (status == connector_status_disconnected) {
>> >> >  		memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
>> >> >  		memset(intel_connector->dp.dsc_dpcd, 0, sizeof(intel_connector->dp.dsc_dpcd));
>> >> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
>> >> > index 27ce5c3f5951e..89b147e37b400 100644
>> >> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
>> >> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
>> >> > @@ -1998,3 +1998,33 @@ bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
>> >> >  
>> >> >  	return false;
>> >> >  }
>> >> > +
>> >> > +/**
>> >> > + * intel_dp_mst_verify_dpcd_state - verify the MST SW enabled state wrt. the DPCD
>> >> > + * @intel_dp: DP port object
>> >> > + *
>> >> > + * Verify if @intel_dp's MST enabled SW state matches the corresponding DPCD
>> >> > + * state. A long HPD pulse -not long enough to be detected as a disconnected
>> >> > + * state - could've reset the DPCD state, which requires tearing
>> >> > + * down/recreating the MST topology.
>> >> > + *
>> >> > + * Returns %true if the SW MST enabled and DPCD states match, %false
>> >> > + * otherwise.
>> >> > + */
>> >> > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp)
>> >> > +{
>> >> > +	int ret;
>> >> > +	u8 val;
>> >> > +
>> >> > +	if (!intel_dp->is_mst)
>> >> > +		return true;
>> >> > +
>> >> > +	ret = drm_dp_dpcd_readb(intel_dp->mst_mgr.aux, DP_MSTM_CTRL, &val);
>> >> > +	if (ret < 0)
>> >> > +		return false;
>> >> > +
>> >> > +	if (val != (DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC))

Maybe let's add drm_dbg_kms() here so we know what's going on?

BR,
Jani.


>> >> > +		return false;
>> >> > +
>> >> > +	return true;
>> >> > +}
>> >> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.h b/drivers/gpu/drm/i915/display/intel_dp_mst.h
>> >> > index 8ca1d599091c6..9e4c7679f1c3a 100644
>> >> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.h
>> >> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.h
>> >> > @@ -27,5 +27,6 @@ int intel_dp_mst_atomic_check_link(struct intel_atomic_state *state,
>> >> >  				   struct intel_link_bw_limits *limits);
>> >> >  bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
>> >> >  				     struct intel_crtc *crtc);
>> >> > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp);
>> >> >  
>> >> >  #endif /* __INTEL_DP_MST_H__ */
>> >> 
>> >> -- 
>> >> Jani Nikula, Intel
>> 
>> -- 
>> Jani Nikula, Intel
Imre Deak Aug. 23, 2024, 1:03 p.m. UTC | #9
On Thu, Aug 22, 2024 at 12:38:28PM +0300, Kandpal, Suraj wrote:
> 
> 
> > -----Original Message-----
> > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre
> > Deak
> > Sent: Wednesday, July 24, 2024 10:10 PM
> > To: Jani Nikula <jani.nikula@linux.intel.com>
> > Cc: intel-gfx@lists.freedesktop.org
> > Subject: Re: [PATCH] drm/i915/dp_mst: Fix MST state after a sink reset
> >
> > On Wed, Jul 24, 2024 at 07:21:53PM +0300, Jani Nikula wrote:
> > > On Wed, 24 Jul 2024, Imre Deak <imre.deak@intel.com> wrote:
> > > > In some cases the sink can reset itself after it was configured into
> > > > MST mode, without the driver noticing the disconnected state. For
> > > > instance the reset may happen in the middle of a modeset, or the
> > > > (long) HPD pulse generated may be not long enough for the encoder
> > > > detect handler to observe the HPD's deasserted state. In this case
> > > > the sink's DPCD register programmed to enable MST will be reset,
> > > > while the driver still assumes MST is still enabled. Detect this
> > > > condition, which will tear down and recreate/re-enable the MST
> > > > topology.
> > > >
> > > > Closes:
> > > > https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11195
> > > > Signed-off-by: Imre Deak <imre.deak@intel.com>
> 
> Does this require a TODO to remind us to remove this when we decouple MST SST
> Sideband messaging?

Separating/adding the SST + SB messaging functionality still requires
detecting the same link reset event. The detection will need to be
updated for that, can add a comment about it there.

> Otherwise
> LGTM,
> Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
> 
> > > > ---
> > > >  drivers/gpu/drm/i915/display/intel_dp.c     |  3 +++
> > > >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 30
> > > > +++++++++++++++++++++  drivers/gpu/drm/i915/display/intel_dp_mst.h
> > |
> > > > 1 +
> > > >  3 files changed, 34 insertions(+)
> > > >
> > > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> > > > b/drivers/gpu/drm/i915/display/intel_dp.c
> > > > index 1e43e32e05199..c621f6daf8235 100644
> > > > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > > > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > > > @@ -5878,6 +5878,9 @@ intel_dp_detect(struct drm_connector
> > *connector,
> > > >   else
> > > >           status = connector_status_disconnected;
> > > >
> > > > + if (!intel_dp_mst_verify_dpcd_state(intel_dp))
> > > > +         status = connector_status_disconnected;
> > > > +
> > > >   if (status == connector_status_disconnected) {
> > > >           memset(&intel_dp->compliance, 0, sizeof(intel_dp-
> > >compliance));
> > > >           memset(intel_connector->dp.dsc_dpcd, 0,
> > > > sizeof(intel_connector->dp.dsc_dpcd));
> > > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > > b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > > index 27ce5c3f5951e..89b147e37b400 100644
> > > > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > > @@ -1998,3 +1998,33 @@ bool
> > intel_dp_mst_crtc_needs_modeset(struct
> > > > intel_atomic_state *state,
> > > >
> > > >   return false;
> > > >  }
> > > > +
> > > > +/**
> > > > + * intel_dp_mst_verify_dpcd_state - verify the MST SW enabled state
> > > > +wrt. the DPCD
> > > > + * @intel_dp: DP port object
> > > > + *
> > > > + * Verify if @intel_dp's MST enabled SW state matches the
> > > > +corresponding DPCD
> > > > + * state. A long HPD pulse -not long enough to be detected as a
> > > > +disconnected
> > > > + * state - could've reset the DPCD state, which requires tearing
> > > > + * down/recreating the MST topology.
> > > > + *
> > > > + * Returns %true if the SW MST enabled and DPCD states match,
> > > > +%false
> > > > + * otherwise.
> > > > + */
> > > > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp) {
> > > > + int ret;
> > > > + u8 val;
> > > > +
> > > > + if (!intel_dp->is_mst)
> > > > +         return true;
> > > > +
> > > > + ret = drm_dp_dpcd_readb(intel_dp->mst_mgr.aux, DP_MSTM_CTRL,
> > &val);
> > > > + if (ret < 0)
> > > > +         return false;
> > > > +
> > > > + if (val != (DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC))
> > >
> > > Hmm. This is not comparing the value to any software state, but some
> > > hardcoded combo of values which may or may not match.
> >
> > The software state is intel_dp->is_mst. That's atm the way to check if MST
> > was enabled previously and correspondingly DP_MSTM_CTRL programmed
> > to the above value. There is also intel_dp->mst_detect, but that can't be
> > used here, since that's reset after MST gets enabled.
> >
> > > In particular, this makes it harder to untangle MST from
> > > SST-with-sideband, I think.
> >
> > After that's enabled this should be changed; there isn't a good way atm to
> > tell full MST and SST-with-sideband apart. I don't see that as a problem as
> > only full MST will be enabled.
> >
> > >
> > > BR,
> > > Jani.
> > >
> > > > +         return false;
> > > > +
> > > > + return true;
> > > > +}
> > > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.h
> > > > b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> > > > index 8ca1d599091c6..9e4c7679f1c3a 100644
> > > > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.h
> > > > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> > > > @@ -27,5 +27,6 @@ int intel_dp_mst_atomic_check_link(struct
> > intel_atomic_state *state,
> > > >                              struct intel_link_bw_limits *limits);  bool
> > > > intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
> > > >                                struct intel_crtc *crtc);
> > > > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp);
> > > >
> > > >  #endif /* __INTEL_DP_MST_H__ */
> > >
> > > --
> > > Jani Nikula, Intel
Imre Deak Aug. 23, 2024, 1:09 p.m. UTC | #10
On Thu, Aug 22, 2024 at 05:53:19PM +0300, Jani Nikula wrote:
> On Thu, 22 Aug 2024, Imre Deak <imre.deak@intel.com> wrote:
> > On Thu, Aug 22, 2024 at 01:00:03PM +0300, Jani Nikula wrote:
> >> On Wed, 21 Aug 2024, Imre Deak <imre.deak@intel.com> wrote:
> >> > On Wed, Aug 21, 2024 at 05:19:11PM +0300, Jani Nikula wrote:
> >> >> On Wed, 24 Jul 2024, Imre Deak <imre.deak@intel.com> wrote:
> >> >> > In some cases the sink can reset itself after it was configured into MST
> >> >> > mode, without the driver noticing the disconnected state. For instance
> >> >> > the reset may happen in the middle of a modeset, or the (long) HPD pulse
> >> >> > generated may be not long enough for the encoder detect handler to
> >> >> > observe the HPD's deasserted state. In this case the sink's DPCD
> >> >> > register programmed to enable MST will be reset, while the driver still
> >> >> > assumes MST is still enabled. Detect this condition, which will tear
> >> >> > down and recreate/re-enable the MST topology.
> >> >> >
> >> >> > Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11195
> >> >> > Signed-off-by: Imre Deak <imre.deak@intel.com>
> >> >> > ---
> >> >> >  drivers/gpu/drm/i915/display/intel_dp.c     |  3 +++
> >> >> >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 30 +++++++++++++++++++++
> >> >> >  drivers/gpu/drm/i915/display/intel_dp_mst.h |  1 +
> >> >> >  3 files changed, 34 insertions(+)
> >> >> >
> >> >> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> >> >> > index 1e43e32e05199..c621f6daf8235 100644
> >> >> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> >> >> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> >> >> > @@ -5878,6 +5878,9 @@ intel_dp_detect(struct drm_connector *connector,
> >> >> >  	else
> >> >> >  		status = connector_status_disconnected;
> >> >> >  
> >> >> > +	if (!intel_dp_mst_verify_dpcd_state(intel_dp))
> >> >> > +		status = connector_status_disconnected;
> >> >> > +
> >> >> 
> >> >> So I still don't understand. We've got a detect which we've determined
> >> >> is connected. But then we disconnect because the sink state has changed.
> >> >> 
> >> >> How do we get another connect?
> >> >
> >> > The detect in this case will be retried with a 1 sec delay, since the
> >> > mode changes back to SST and the connector state stays disconnected.
> >> 
> >> What exactly triggers the retry? I don't see this triggering the
> >> INTEL_HOTPLUG_RETRY case.
> >
> > drm_connector::status is connector_status_disconnected before the detect
> > (as always for an MST root connector)
> 
> This was one of the missing pieces for me. I just thought we'd get here
> with connector_status_connected && is_mst == true, which would lead to a
> change.

Yes, what the connector status means for an MST root connector is not
very clear. How the detect will get retried also needs a comment here I
think, I'll add that.

> Very well then. One final nitpick below.
> 
> > and it stays
> > connector_status_disconnected. The connector's mode will also change to
> > SST (intel_dp::is_mst from true to false). This condition will lead to
> > the detect getting retried.
> >
> > A detect will actually happen in any case, since removing the MST
> > connectors results in a (global) hotplug uevent being sent, to which
> > userspace should respond with re-probing all connectors.
> >
> >> I'm just trying to understand, please bear with me.
> >> [...]
> >> >> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> >> >> > index 27ce5c3f5951e..89b147e37b400 100644
> >> >> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> >> >> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> >> >> > @@ -1998,3 +1998,33 @@ bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
> >> >> >  
> >> >> >  	return false;
> >> >> >  }
> >> >> > +
> >> >> > +/**
> >> >> > + * intel_dp_mst_verify_dpcd_state - verify the MST SW enabled state wrt. the DPCD
> >> >> > + * @intel_dp: DP port object
> >> >> > + *
> >> >> > + * Verify if @intel_dp's MST enabled SW state matches the corresponding DPCD
> >> >> > + * state. A long HPD pulse -not long enough to be detected as a disconnected
> >> >> > + * state - could've reset the DPCD state, which requires tearing
> >> >> > + * down/recreating the MST topology.
> >> >> > + *
> >> >> > + * Returns %true if the SW MST enabled and DPCD states match, %false
> >> >> > + * otherwise.
> >> >> > + */
> >> >> > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp)
> >> >> > +{
> >> >> > +	int ret;
> >> >> > +	u8 val;
> >> >> > +
> >> >> > +	if (!intel_dp->is_mst)
> >> >> > +		return true;
> >> >> > +
> >> >> > +	ret = drm_dp_dpcd_readb(intel_dp->mst_mgr.aux, DP_MSTM_CTRL, &val);
> >> >> > +	if (ret < 0)
> >> >> > +		return false;
> >> >> > +
> >> >> > +	if (val != (DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC))
> 
> Maybe let's add drm_dbg_kms() here so we know what's going on?

Ok, can add it.

> 
> BR,
> Jani.
> 
> 
> >> >> > +		return false;
> >> >> > +
> >> >> > +	return true;
> >> >> > +}
> >> >> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.h b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> >> >> > index 8ca1d599091c6..9e4c7679f1c3a 100644
> >> >> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.h
> >> >> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.h
> >> >> > @@ -27,5 +27,6 @@ int intel_dp_mst_atomic_check_link(struct intel_atomic_state *state,
> >> >> >  				   struct intel_link_bw_limits *limits);
> >> >> >  bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
> >> >> >  				     struct intel_crtc *crtc);
> >> >> > +bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp);
> >> >> >  
> >> >> >  #endif /* __INTEL_DP_MST_H__ */
> >> >> 
> >> >> -- 
> >> >> Jani Nikula, Intel
> >> 
> >> -- 
> >> Jani Nikula, Intel
> 
> -- 
> Jani Nikula, Intel
Imre Deak Aug. 26, 2024, 1:34 p.m. UTC | #11
On Sat, Aug 24, 2024 at 05:23:39PM +0000, Patchwork wrote:
> == Series Details ==
> 
> Series: drm/i915/dp_mst: Fix MST state after a sink reset (rev3)
> URL   : https://patchwork.freedesktop.org/series/136443/
> State : failure

Thanks for the reviews, patch is pushed to drm-intel-next. The failure
is unrelated, see below.

> 
> == Summary ==
> 
> CI Bug Log - changes from CI_DRM_15285_full -> Patchwork_136443v3_full
> ====================================================
> 
> Summary
> -------
> 
>   **FAILURE**
> 
>   Serious unknown changes coming with Patchwork_136443v3_full absolutely need to be
>   verified manually.
>   
>   If you think the reported changes have nothing to do with the changes
>   introduced in Patchwork_136443v3_full, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
>   to document this new failure mode, which will reduce false positives in CI.
> 
>   
> 
> Participating hosts (9 -> 10)
> ------------------------------
> 
>   Additional (1): shard-snb-0 
> 
> Possible new issues
> -------------------
> 
>   Here are the unknown changes that may have been introduced in Patchwork_136443v3_full:
> 
> ### IGT changes ###
> 
> #### Possible regressions ####
> 
>   * igt@i915_selftest@live@hangcheck:
>     - shard-dg1:          NOTRUN -> [INCOMPLETE][1]
>    [1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@i915_selftest@live@hangcheck.html

There is no DP sink connected, so unrelated.

> 
>   * igt@kms_ccs@crc-sprite-planes-basic-4-tiled-lnl-ccs:
>     - shard-dg1:          NOTRUN -> [SKIP][2] +1 other test skip
>    [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-lnl-ccs.html
>     - shard-tglu:         NOTRUN -> [SKIP][3]
>    [3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-lnl-ccs.html
> 
>   * igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs:
>     - shard-dg2:          NOTRUN -> [SKIP][4]
>    [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs.html

Both of the above skips are due to
Test requirement: AT_LEAST_GEN(dev_id, 20)

which seems to make sense and so the skip is expected.

> 
>   * igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-mmap-cpu:
>     - shard-dg2:          NOTRUN -> [INCOMPLETE][5]
>    [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-mmap-cpu.html

No DP sink connected here either.

> Known issues
> ------------
> 
>   Here are the changes found in Patchwork_136443v3_full that come from known issues:
> 
> ### IGT changes ###
> 
> #### Issues hit ####
> 
>   * igt@device_reset@cold-reset-bound:
>     - shard-dg2:          NOTRUN -> [SKIP][6] ([i915#11078])
>    [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@device_reset@cold-reset-bound.html
> 
>   * igt@drm_fdinfo@virtual-busy-all:
>     - shard-dg1:          NOTRUN -> [SKIP][7] ([i915#8414]) +1 other test skip
>    [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@drm_fdinfo@virtual-busy-all.html
> 
>   * igt@drm_fdinfo@virtual-idle:
>     - shard-rkl:          NOTRUN -> [FAIL][8] ([i915#11900] / [i915#7742])
>    [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@drm_fdinfo@virtual-idle.html
> 
>   * igt@gem_busy@semaphore:
>     - shard-dg1:          NOTRUN -> [SKIP][9] ([i915#3936])
>    [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-18/igt@gem_busy@semaphore.html
> 
>   * igt@gem_ccs@suspend-resume:
>     - shard-rkl:          NOTRUN -> [SKIP][10] ([i915#9323])
>    [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@gem_ccs@suspend-resume.html
> 
>   * igt@gem_close_race@multigpu-basic-process:
>     - shard-rkl:          NOTRUN -> [SKIP][11] ([i915#7697])
>    [11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@gem_close_race@multigpu-basic-process.html
> 
>   * igt@gem_create@create-ext-set-pat:
>     - shard-dg2:          NOTRUN -> [SKIP][12] ([i915#8562])
>    [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@gem_create@create-ext-set-pat.html
> 
>   * igt@gem_ctx_persistence@heartbeat-hostile:
>     - shard-dg2:          NOTRUN -> [SKIP][13] ([i915#8555]) +1 other test skip
>    [13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@gem_ctx_persistence@heartbeat-hostile.html
> 
>   * igt@gem_ctx_sseu@invalid-sseu:
>     - shard-dg2:          NOTRUN -> [SKIP][14] ([i915#280]) +1 other test skip
>    [14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@gem_ctx_sseu@invalid-sseu.html
> 
>   * igt@gem_eio@reset-stress:
>     - shard-dg1:          [PASS][15] -> [FAIL][16] ([i915#5784])
>    [15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-dg1-16/igt@gem_eio@reset-stress.html
>    [16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-17/igt@gem_eio@reset-stress.html
> 
>   * igt@gem_exec_balancer@parallel-bb-first:
>     - shard-rkl:          NOTRUN -> [SKIP][17] ([i915#4525])
>    [17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@gem_exec_balancer@parallel-bb-first.html
> 
>   * igt@gem_exec_capture@capture-invisible@lmem0:
>     - shard-dg1:          NOTRUN -> [SKIP][18] ([i915#6334]) +1 other test skip
>    [18]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-18/igt@gem_exec_capture@capture-invisible@lmem0.html
> 
>   * igt@gem_exec_capture@capture-invisible@smem0:
>     - shard-rkl:          NOTRUN -> [SKIP][19] ([i915#6334])
>    [19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@gem_exec_capture@capture-invisible@smem0.html
> 
>   * igt@gem_exec_fair@basic-none-share:
>     - shard-dg2:          NOTRUN -> [SKIP][20] ([i915#3539] / [i915#4852]) +2 other tests skip
>    [20]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@gem_exec_fair@basic-none-share.html
> 
>   * igt@gem_exec_fair@basic-none-share@rcs0:
>     - shard-glk:          NOTRUN -> [FAIL][21] ([i915#2842]) +1 other test fail
>    [21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-glk8/igt@gem_exec_fair@basic-none-share@rcs0.html
> 
>   * igt@gem_exec_fair@basic-pace-solo:
>     - shard-dg1:          NOTRUN -> [SKIP][22] ([i915#3539])
>    [22]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@gem_exec_fair@basic-pace-solo.html
> 
>   * igt@gem_exec_fair@basic-pace@vecs0:
>     - shard-rkl:          NOTRUN -> [FAIL][23] ([i915#2842]) +2 other tests fail
>    [23]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@gem_exec_fair@basic-pace@vecs0.html
> 
>   * igt@gem_exec_flush@basic-uc-ro-default:
>     - shard-dg1:          NOTRUN -> [SKIP][24] ([i915#3539] / [i915#4852]) +2 other tests skip
>    [24]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@gem_exec_flush@basic-uc-ro-default.html
> 
>   * igt@gem_exec_reloc@basic-concurrent0:
>     - shard-dg1:          NOTRUN -> [SKIP][25] ([i915#3281]) +6 other tests skip
>    [25]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@gem_exec_reloc@basic-concurrent0.html
> 
>   * igt@gem_exec_reloc@basic-gtt:
>     - shard-dg2:          NOTRUN -> [SKIP][26] ([i915#3281]) +4 other tests skip
>    [26]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@gem_exec_reloc@basic-gtt.html
> 
>   * igt@gem_exec_reloc@basic-scanout:
>     - shard-rkl:          NOTRUN -> [SKIP][27] ([i915#3281]) +4 other tests skip
>    [27]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@gem_exec_reloc@basic-scanout.html
> 
>   * igt@gem_exec_schedule@semaphore-power:
>     - shard-dg1:          NOTRUN -> [SKIP][28] ([i915#4812]) +2 other tests skip
>    [28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@gem_exec_schedule@semaphore-power.html
> 
>   * igt@gem_exec_suspend@basic-s4-devices@smem:
>     - shard-tglu:         [PASS][29] -> [ABORT][30] ([i915#7975] / [i915#8213])
>    [29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-tglu-7/igt@gem_exec_suspend@basic-s4-devices@smem.html
>    [30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@gem_exec_suspend@basic-s4-devices@smem.html
> 
>   * igt@gem_lmem_evict@dontneed-evict-race:
>     - shard-rkl:          NOTRUN -> [SKIP][31] ([i915#4613] / [i915#7582])
>    [31]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@gem_lmem_evict@dontneed-evict-race.html
> 
>   * igt@gem_lmem_swapping@basic:
>     - shard-rkl:          NOTRUN -> [SKIP][32] ([i915#4613]) +1 other test skip
>    [32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@gem_lmem_swapping@basic.html
> 
>   * igt@gem_lmem_swapping@parallel-multi:
>     - shard-glk:          NOTRUN -> [SKIP][33] ([i915#4613]) +2 other tests skip
>    [33]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-glk5/igt@gem_lmem_swapping@parallel-multi.html
> 
>   * igt@gem_lmem_swapping@parallel-random-verify:
>     - shard-tglu:         NOTRUN -> [SKIP][34] ([i915#4613])
>    [34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@gem_lmem_swapping@parallel-random-verify.html
> 
>   * igt@gem_mmap_gtt@basic-small-bo:
>     - shard-dg2:          NOTRUN -> [SKIP][35] ([i915#4077]) +10 other tests skip
>    [35]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@gem_mmap_gtt@basic-small-bo.html
> 
>   * igt@gem_mmap_gtt@fault-concurrent:
>     - shard-dg1:          NOTRUN -> [SKIP][36] ([i915#4077]) +6 other tests skip
>    [36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@gem_mmap_gtt@fault-concurrent.html
> 
>   * igt@gem_mmap_wc@close:
>     - shard-dg2:          NOTRUN -> [SKIP][37] ([i915#4083]) +2 other tests skip
>    [37]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@gem_mmap_wc@close.html
> 
>   * igt@gem_mmap_wc@read:
>     - shard-dg1:          NOTRUN -> [SKIP][38] ([i915#4083]) +9 other tests skip
>    [38]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-18/igt@gem_mmap_wc@read.html
> 
>   * igt@gem_partial_pwrite_pread@reads-snoop:
>     - shard-dg1:          NOTRUN -> [SKIP][39] ([i915#3282]) +3 other tests skip
>    [39]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@gem_partial_pwrite_pread@reads-snoop.html
> 
>   * igt@gem_partial_pwrite_pread@reads-uncached:
>     - shard-dg2:          NOTRUN -> [SKIP][40] ([i915#3282]) +4 other tests skip
>    [40]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@gem_partial_pwrite_pread@reads-uncached.html
> 
>   * igt@gem_pread@exhaustion:
>     - shard-glk:          NOTRUN -> [WARN][41] ([i915#2658])
>    [41]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-glk8/igt@gem_pread@exhaustion.html
> 
>   * igt@gem_pxp@create-regular-context-1:
>     - shard-dg2:          NOTRUN -> [SKIP][42] ([i915#4270]) +1 other test skip
>    [42]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-3/igt@gem_pxp@create-regular-context-1.html
> 
>   * igt@gem_pxp@dmabuf-shared-protected-dst-is-context-refcounted:
>     - shard-rkl:          NOTRUN -> [SKIP][43] ([i915#4270]) +1 other test skip
>    [43]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@gem_pxp@dmabuf-shared-protected-dst-is-context-refcounted.html
> 
>   * igt@gem_pxp@reject-modify-context-protection-off-3:
>     - shard-dg1:          NOTRUN -> [SKIP][44] ([i915#4270])
>    [44]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@gem_pxp@reject-modify-context-protection-off-3.html
> 
>   * igt@gem_render_copy@mixed-tiled-to-y-tiled-ccs:
>     - shard-dg2:          NOTRUN -> [SKIP][45] ([i915#5190] / [i915#8428]) +2 other tests skip
>    [45]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@gem_render_copy@mixed-tiled-to-y-tiled-ccs.html
> 
>   * igt@gem_render_copy@y-tiled-ccs-to-y-tiled-mc-ccs:
>     - shard-glk:          NOTRUN -> [SKIP][46] +219 other tests skip
>    [46]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-glk5/igt@gem_render_copy@y-tiled-ccs-to-y-tiled-mc-ccs.html
> 
>   * igt@gem_set_tiling_vs_blt@untiled-to-tiled:
>     - shard-rkl:          NOTRUN -> [SKIP][47] ([i915#8411])
>    [47]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@gem_set_tiling_vs_blt@untiled-to-tiled.html
> 
>   * igt@gem_set_tiling_vs_gtt:
>     - shard-dg1:          NOTRUN -> [SKIP][48] ([i915#4079])
>    [48]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@gem_set_tiling_vs_gtt.html
> 
>   * igt@gem_set_tiling_vs_pwrite:
>     - shard-rkl:          NOTRUN -> [SKIP][49] ([i915#3282]) +6 other tests skip
>    [49]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@gem_set_tiling_vs_pwrite.html
> 
>   * igt@gem_userptr_blits@dmabuf-sync:
>     - shard-rkl:          NOTRUN -> [SKIP][50] ([i915#3297] / [i915#3323])
>    [50]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@gem_userptr_blits@dmabuf-sync.html
> 
>   * igt@gem_userptr_blits@map-fixed-invalidate:
>     - shard-dg1:          NOTRUN -> [SKIP][51] ([i915#3297] / [i915#4880])
>    [51]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@gem_userptr_blits@map-fixed-invalidate.html
> 
>   * igt@gem_userptr_blits@relocations:
>     - shard-rkl:          NOTRUN -> [SKIP][52] ([i915#3281] / [i915#3297])
>    [52]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@gem_userptr_blits@relocations.html
> 
>   * igt@gem_userptr_blits@unsync-unmap-cycles:
>     - shard-rkl:          NOTRUN -> [SKIP][53] ([i915#3297]) +1 other test skip
>    [53]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@gem_userptr_blits@unsync-unmap-cycles.html
>     - shard-dg1:          NOTRUN -> [SKIP][54] ([i915#3297]) +2 other tests skip
>    [54]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-18/igt@gem_userptr_blits@unsync-unmap-cycles.html
> 
>   * igt@gen9_exec_parse@basic-rejected-ctx-param:
>     - shard-tglu:         NOTRUN -> [SKIP][55] ([i915#2527] / [i915#2856])
>    [55]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@gen9_exec_parse@basic-rejected-ctx-param.html
> 
>   * igt@gen9_exec_parse@bb-oversize:
>     - shard-dg2:          NOTRUN -> [SKIP][56] ([i915#2856]) +1 other test skip
>    [56]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@gen9_exec_parse@bb-oversize.html
> 
>   * igt@gen9_exec_parse@bb-start-out:
>     - shard-rkl:          NOTRUN -> [SKIP][57] ([i915#2527]) +1 other test skip
>    [57]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@gen9_exec_parse@bb-start-out.html
>     - shard-dg1:          NOTRUN -> [SKIP][58] ([i915#2527]) +3 other tests skip
>    [58]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-18/igt@gen9_exec_parse@bb-start-out.html
> 
>   * igt@i915_module_load@load:
>     - shard-dg2:          NOTRUN -> [SKIP][59] ([i915#6227])
>    [59]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@i915_module_load@load.html
> 
>   * igt@i915_module_load@reload-with-fault-injection:
>     - shard-tglu:         [PASS][60] -> [ABORT][61] ([i915#9820])
>    [60]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-tglu-3/igt@i915_module_load@reload-with-fault-injection.html
>    [61]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-8/igt@i915_module_load@reload-with-fault-injection.html
> 
>   * igt@i915_pm_freq_api@freq-reset:
>     - shard-rkl:          NOTRUN -> [SKIP][62] ([i915#8399])
>    [62]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@i915_pm_freq_api@freq-reset.html
> 
>   * igt@i915_pm_rps@thresholds-idle-park:
>     - shard-dg2:          NOTRUN -> [SKIP][63] ([i915#11681])
>    [63]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@i915_pm_rps@thresholds-idle-park.html
> 
>   * igt@intel_hwmon@hwmon-read:
>     - shard-rkl:          NOTRUN -> [SKIP][64] ([i915#7707])
>    [64]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@intel_hwmon@hwmon-read.html
> 
>   * igt@kms_addfb_basic@addfb25-x-tiled-legacy:
>     - shard-dg1:          NOTRUN -> [SKIP][65] ([i915#4212])
>    [65]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_addfb_basic@addfb25-x-tiled-legacy.html
> 
>   * igt@kms_addfb_basic@basic-y-tiled-legacy:
>     - shard-dg1:          NOTRUN -> [SKIP][66] ([i915#4215])
>    [66]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_addfb_basic@basic-y-tiled-legacy.html
> 
>   * igt@kms_addfb_basic@framebuffer-vs-set-tiling:
>     - shard-dg2:          NOTRUN -> [SKIP][67] ([i915#4212]) +1 other test skip
>    [67]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_addfb_basic@framebuffer-vs-set-tiling.html
> 
>   * igt@kms_async_flips@async-flip-with-page-flip-events@pipe-a-hdmi-a-3-y-rc-ccs:
>     - shard-dg1:          NOTRUN -> [SKIP][68] ([i915#8709]) +7 other tests skip
>    [68]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-13/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-a-hdmi-a-3-y-rc-ccs.html
> 
>   * igt@kms_async_flips@async-flip-with-page-flip-events@pipe-d-hdmi-a-3-4-mc-ccs:
>     - shard-dg2:          NOTRUN -> [SKIP][69] ([i915#8709]) +11 other tests skip
>    [69]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-7/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-d-hdmi-a-3-4-mc-ccs.html
> 
>   * igt@kms_atomic@plane-primary-overlay-mutable-zpos:
>     - shard-dg1:          NOTRUN -> [SKIP][70] ([i915#9531])
>    [70]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_atomic@plane-primary-overlay-mutable-zpos.html
>     - shard-tglu:         NOTRUN -> [SKIP][71] ([i915#9531])
>    [71]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_atomic@plane-primary-overlay-mutable-zpos.html
> 
>   * igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels:
>     - shard-rkl:          NOTRUN -> [SKIP][72] ([i915#1769] / [i915#3555])
>    [72]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels.html
> 
>   * igt@kms_atomic_transition@plane-toggle-modeset-transition@pipe-a-hdmi-a-1:
>     - shard-snb:          [PASS][73] -> [FAIL][74] ([i915#5956])
>    [73]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-snb7/igt@kms_atomic_transition@plane-toggle-modeset-transition@pipe-a-hdmi-a-1.html
>    [74]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-snb5/igt@kms_atomic_transition@plane-toggle-modeset-transition@pipe-a-hdmi-a-1.html
> 
>   * igt@kms_atomic_transition@plane-toggle-modeset-transition@pipe-a-hdmi-a-4:
>     - shard-dg1:          NOTRUN -> [FAIL][75] ([i915#5956])
>    [75]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-18/igt@kms_atomic_transition@plane-toggle-modeset-transition@pipe-a-hdmi-a-4.html
> 
>   * igt@kms_big_fb@4-tiled-8bpp-rotate-90:
>     - shard-tglu:         NOTRUN -> [SKIP][76] ([i915#5286])
>    [76]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_big_fb@4-tiled-8bpp-rotate-90.html
> 
>   * igt@kms_big_fb@4-tiled-addfb:
>     - shard-rkl:          NOTRUN -> [SKIP][77] ([i915#5286]) +3 other tests skip
>    [77]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_big_fb@4-tiled-addfb.html
> 
>   * igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-hflip:
>     - shard-dg1:          NOTRUN -> [SKIP][78] ([i915#4538] / [i915#5286]) +2 other tests skip
>    [78]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-hflip.html
> 
>   * igt@kms_big_fb@linear-8bpp-rotate-270:
>     - shard-rkl:          NOTRUN -> [SKIP][79] ([i915#3638]) +1 other test skip
>    [79]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@kms_big_fb@linear-8bpp-rotate-270.html
>     - shard-dg1:          NOTRUN -> [SKIP][80] ([i915#3638]) +4 other tests skip
>    [80]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-18/igt@kms_big_fb@linear-8bpp-rotate-270.html
> 
>   * igt@kms_big_fb@y-tiled-32bpp-rotate-90:
>     - shard-dg2:          NOTRUN -> [SKIP][81] ([i915#4538] / [i915#5190]) +7 other tests skip
>    [81]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@kms_big_fb@y-tiled-32bpp-rotate-90.html
> 
>   * igt@kms_big_fb@yf-tiled-32bpp-rotate-270:
>     - shard-rkl:          NOTRUN -> [SKIP][82] +14 other tests skip
>    [82]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@kms_big_fb@yf-tiled-32bpp-rotate-270.html
> 
>   * igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-async-flip:
>     - shard-dg1:          NOTRUN -> [SKIP][83] ([i915#4538]) +4 other tests skip
>    [83]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-async-flip.html
> 
>   * igt@kms_ccs@bad-aux-stride-4-tiled-mtl-mc-ccs@pipe-a-hdmi-a-4:
>     - shard-dg1:          NOTRUN -> [SKIP][84] ([i915#6095]) +107 other tests skip
>    [84]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-18/igt@kms_ccs@bad-aux-stride-4-tiled-mtl-mc-ccs@pipe-a-hdmi-a-4.html
> 
>   * igt@kms_ccs@bad-aux-stride-y-tiled-gen12-rc-ccs@pipe-d-hdmi-a-1:
>     - shard-dg2:          NOTRUN -> [SKIP][85] ([i915#10307] / [i915#10434] / [i915#6095]) +2 other tests skip
>    [85]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_ccs@bad-aux-stride-y-tiled-gen12-rc-ccs@pipe-d-hdmi-a-1.html
> 
>   * igt@kms_ccs@bad-pixel-format-y-tiled-gen12-mc-ccs@pipe-a-hdmi-a-2:
>     - shard-rkl:          NOTRUN -> [SKIP][86] ([i915#6095]) +73 other tests skip
>    [86]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-5/igt@kms_ccs@bad-pixel-format-y-tiled-gen12-mc-ccs@pipe-a-hdmi-a-2.html
> 
>   * igt@kms_ccs@bad-rotation-90-y-tiled-gen12-rc-ccs-cc@pipe-a-dp-4:
>     - shard-dg2:          NOTRUN -> [SKIP][87] ([i915#10307] / [i915#6095]) +144 other tests skip
>    [87]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@kms_ccs@bad-rotation-90-y-tiled-gen12-rc-ccs-cc@pipe-a-dp-4.html
> 
>   * igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-mc-ccs@pipe-b-hdmi-a-1:
>     - shard-tglu:         NOTRUN -> [SKIP][88] ([i915#6095]) +15 other tests skip
>    [88]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-mc-ccs@pipe-b-hdmi-a-1.html
> 
>   * igt@kms_cdclk@mode-transition-all-outputs:
>     - shard-dg2:          NOTRUN -> [SKIP][89] ([i915#11616] / [i915#7213])
>    [89]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@kms_cdclk@mode-transition-all-outputs.html
> 
>   * igt@kms_cdclk@mode-transition@pipe-b-hdmi-a-2:
>     - shard-dg2:          NOTRUN -> [SKIP][90] ([i915#7213]) +3 other tests skip
>    [90]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-3/igt@kms_cdclk@mode-transition@pipe-b-hdmi-a-2.html
> 
>   * igt@kms_cdclk@plane-scaling@pipe-d-hdmi-a-1:
>     - shard-dg2:          NOTRUN -> [SKIP][91] ([i915#4087]) +3 other tests skip
>    [91]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_cdclk@plane-scaling@pipe-d-hdmi-a-1.html
> 
>   * igt@kms_chamelium_edid@hdmi-edid-stress-resolution-non-4k:
>     - shard-rkl:          NOTRUN -> [SKIP][92] ([i915#7828]) +5 other tests skip
>    [92]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@kms_chamelium_edid@hdmi-edid-stress-resolution-non-4k.html
> 
>   * igt@kms_chamelium_frames@dp-crc-single:
>     - shard-dg1:          NOTRUN -> [SKIP][93] ([i915#7828]) +8 other tests skip
>    [93]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@kms_chamelium_frames@dp-crc-single.html
> 
>   * igt@kms_chamelium_hpd@hdmi-hpd-enable-disable-mode:
>     - shard-dg2:          NOTRUN -> [SKIP][94] ([i915#7828]) +3 other tests skip
>    [94]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_chamelium_hpd@hdmi-hpd-enable-disable-mode.html
> 
>   * igt@kms_chamelium_hpd@vga-hpd-fast:
>     - shard-tglu:         NOTRUN -> [SKIP][95] ([i915#7828]) +1 other test skip
>    [95]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_chamelium_hpd@vga-hpd-fast.html
> 
>   * igt@kms_content_protection@content-type-change:
>     - shard-dg1:          NOTRUN -> [SKIP][96] ([i915#9424])
>    [96]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@kms_content_protection@content-type-change.html
> 
>   * igt@kms_content_protection@dp-mst-type-0:
>     - shard-rkl:          NOTRUN -> [SKIP][97] ([i915#3116])
>    [97]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_content_protection@dp-mst-type-0.html
> 
>   * igt@kms_content_protection@lic-type-1:
>     - shard-dg2:          NOTRUN -> [SKIP][98] ([i915#9424])
>    [98]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-3/igt@kms_content_protection@lic-type-1.html
> 
>   * igt@kms_content_protection@type1:
>     - shard-rkl:          NOTRUN -> [SKIP][99] ([i915#7118] / [i915#9424])
>    [99]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_content_protection@type1.html
> 
>   * igt@kms_cursor_crc@cursor-offscreen-512x170:
>     - shard-rkl:          NOTRUN -> [SKIP][100] ([i915#11453]) +1 other test skip
>    [100]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_cursor_crc@cursor-offscreen-512x170.html
> 
>   * igt@kms_cursor_crc@cursor-rapid-movement-512x170:
>     - shard-dg1:          NOTRUN -> [SKIP][101] ([i915#11453])
>    [101]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-18/igt@kms_cursor_crc@cursor-rapid-movement-512x170.html
> 
>   * igt@kms_cursor_crc@cursor-sliding-512x512:
>     - shard-dg2:          NOTRUN -> [SKIP][102] ([i915#11453])
>    [102]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_cursor_crc@cursor-sliding-512x512.html
> 
>   * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic:
>     - shard-dg1:          NOTRUN -> [SKIP][103] ([i915#4103] / [i915#4213])
>    [103]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic.html
>     - shard-tglu:         NOTRUN -> [SKIP][104] ([i915#4103])
>    [104]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic.html
> 
>   * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size:
>     - shard-glk:          NOTRUN -> [FAIL][105] ([i915#2346])
>    [105]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-glk5/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size.html
> 
>   * igt@kms_cursor_legacy@forked-move@pipe-a:
>     - shard-glk:          NOTRUN -> [DMESG-WARN][106] ([i915#10166])
>    [106]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-glk8/igt@kms_cursor_legacy@forked-move@pipe-a.html
> 
>   * igt@kms_cursor_legacy@modeset-atomic-cursor-hotspot:
>     - shard-rkl:          NOTRUN -> [SKIP][107] ([i915#9067])
>    [107]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_cursor_legacy@modeset-atomic-cursor-hotspot.html
> 
>   * igt@kms_draw_crc@draw-method-mmap-gtt:
>     - shard-dg1:          NOTRUN -> [SKIP][108] ([i915#8812])
>    [108]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@kms_draw_crc@draw-method-mmap-gtt.html
> 
>   * igt@kms_dsc@dsc-with-bpc:
>     - shard-dg1:          NOTRUN -> [SKIP][109] ([i915#3555] / [i915#3840])
>    [109]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_dsc@dsc-with-bpc.html
> 
>   * igt@kms_dsc@dsc-with-formats:
>     - shard-dg2:          NOTRUN -> [SKIP][110] ([i915#3555] / [i915#3840])
>    [110]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@kms_dsc@dsc-with-formats.html
> 
>   * igt@kms_fbcon_fbt@psr-suspend:
>     - shard-dg1:          NOTRUN -> [SKIP][111] ([i915#3469])
>    [111]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@kms_fbcon_fbt@psr-suspend.html
> 
>   * igt@kms_feature_discovery@display-3x:
>     - shard-dg1:          NOTRUN -> [SKIP][112] ([i915#1839])
>    [112]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_feature_discovery@display-3x.html
>     - shard-tglu:         NOTRUN -> [SKIP][113] ([i915#1839])
>    [113]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_feature_discovery@display-3x.html
> 
>   * igt@kms_feature_discovery@display-4x:
>     - shard-rkl:          NOTRUN -> [SKIP][114] ([i915#1839])
>    [114]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_feature_discovery@display-4x.html
> 
>   * igt@kms_feature_discovery@psr2:
>     - shard-rkl:          NOTRUN -> [SKIP][115] ([i915#658])
>    [115]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_feature_discovery@psr2.html
> 
>   * igt@kms_flip@2x-flip-vs-absolute-wf_vblank-interruptible:
>     - shard-dg2:          NOTRUN -> [SKIP][116] +9 other tests skip
>    [116]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_flip@2x-flip-vs-absolute-wf_vblank-interruptible.html
> 
>   * igt@kms_flip@2x-flip-vs-fences-interruptible:
>     - shard-dg1:          NOTRUN -> [SKIP][117] ([i915#8381])
>    [117]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@kms_flip@2x-flip-vs-fences-interruptible.html
> 
>   * igt@kms_flip@2x-flip-vs-suspend-interruptible:
>     - shard-dg1:          NOTRUN -> [SKIP][118] ([i915#9934]) +2 other tests skip
>    [118]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-18/igt@kms_flip@2x-flip-vs-suspend-interruptible.html
> 
>   * igt@kms_flip@2x-plain-flip-fb-recreate-interruptible@ab-vga1-hdmi-a1:
>     - shard-snb:          [PASS][119] -> [FAIL][120] ([i915#2122]) +1 other test fail
>    [119]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-snb4/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible@ab-vga1-hdmi-a1.html
>    [120]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-snb7/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible@ab-vga1-hdmi-a1.html
> 
>   * igt@kms_flip@flip-vs-fences:
>     - shard-dg2:          NOTRUN -> [SKIP][121] ([i915#8381]) +1 other test skip
>    [121]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@kms_flip@flip-vs-fences.html
> 
>   * igt@kms_flip@plain-flip-fb-recreate-interruptible@a-hdmi-a4:
>     - shard-dg1:          [PASS][122] -> [FAIL][123] ([i915#2122]) +1 other test fail
>    [122]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-dg1-16/igt@kms_flip@plain-flip-fb-recreate-interruptible@a-hdmi-a4.html
>    [123]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@kms_flip@plain-flip-fb-recreate-interruptible@a-hdmi-a4.html
> 
>   * igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode:
>     - shard-tglu:         NOTRUN -> [SKIP][124] ([i915#2587] / [i915#2672])
>    [124]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode.html
> 
>   * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-valid-mode:
>     - shard-dg2:          NOTRUN -> [SKIP][125] ([i915#2672]) +1 other test skip
>    [125]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-valid-mode.html
> 
>   * igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-upscaling@pipe-a-valid-mode:
>     - shard-dg1:          NOTRUN -> [SKIP][126] ([i915#2587] / [i915#2672]) +3 other tests skip
>    [126]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-upscaling@pipe-a-valid-mode.html
> 
>   * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-plflip-blt:
>     - shard-dg2:          [PASS][127] -> [FAIL][128] ([i915#6880])
>    [127]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-dg2-2/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-plflip-blt.html
>    [128]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-10/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-plflip-blt.html
> 
>   * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-wc:
>     - shard-dg2:          NOTRUN -> [SKIP][129] ([i915#8708]) +8 other tests skip
>    [129]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-wc.html
> 
>   * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-mmap-wc:
>     - shard-snb:          [PASS][130] -> [SKIP][131] +1 other test skip
>    [130]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-snb7/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-mmap-wc.html
>    [131]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-snb5/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-mmap-wc.html
> 
>   * igt@kms_frontbuffer_tracking@fbcpsr-1p-pri-indfb-multidraw:
>     - shard-rkl:          NOTRUN -> [SKIP][132] ([i915#3023]) +17 other tests skip
>    [132]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_frontbuffer_tracking@fbcpsr-1p-pri-indfb-multidraw.html
> 
>   * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render:
>     - shard-dg1:          NOTRUN -> [SKIP][133] +38 other tests skip
>    [133]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render.html
> 
>   * igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-render:
>     - shard-dg1:          NOTRUN -> [SKIP][134] ([i915#3458]) +18 other tests skip
>    [134]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-render.html
> 
>   * igt@kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-onoff:
>     - shard-dg2:          NOTRUN -> [SKIP][135] ([i915#3458]) +10 other tests skip
>    [135]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-onoff.html
> 
>   * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-blt:
>     - shard-dg2:          NOTRUN -> [SKIP][136] ([i915#5354]) +25 other tests skip
>    [136]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-blt.html
> 
>   * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-pwrite:
>     - shard-tglu:         NOTRUN -> [SKIP][137] +23 other tests skip
>    [137]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-pwrite.html
> 
>   * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt:
>     - shard-rkl:          NOTRUN -> [SKIP][138] ([i915#1825]) +23 other tests skip
>    [138]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt.html
> 
>   * igt@kms_frontbuffer_tracking@psr-rgb565-draw-mmap-wc:
>     - shard-dg1:          NOTRUN -> [SKIP][139] ([i915#8708]) +16 other tests skip
>    [139]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@kms_frontbuffer_tracking@psr-rgb565-draw-mmap-wc.html
> 
>   * igt@kms_hdr@bpc-switch-suspend:
>     - shard-dg2:          NOTRUN -> [SKIP][140] ([i915#3555] / [i915#8228])
>    [140]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_hdr@bpc-switch-suspend.html
> 
>   * igt@kms_hdr@invalid-hdr:
>     - shard-rkl:          NOTRUN -> [SKIP][141] ([i915#3555] / [i915#8228])
>    [141]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@kms_hdr@invalid-hdr.html
> 
>   * igt@kms_hdr@static-swap:
>     - shard-dg1:          NOTRUN -> [SKIP][142] ([i915#3555] / [i915#8228]) +1 other test skip
>    [142]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_hdr@static-swap.html
>     - shard-tglu:         NOTRUN -> [SKIP][143] ([i915#3555] / [i915#8228])
>    [143]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_hdr@static-swap.html
> 
>   * igt@kms_panel_fitting@atomic-fastset:
>     - shard-rkl:          NOTRUN -> [SKIP][144] ([i915#6301])
>    [144]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@kms_panel_fitting@atomic-fastset.html
>     - shard-dg1:          NOTRUN -> [SKIP][145] ([i915#6301])
>    [145]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-18/igt@kms_panel_fitting@atomic-fastset.html
> 
>   * igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format@pipe-a-hdmi-a-1:
>     - shard-rkl:          NOTRUN -> [SKIP][146] ([i915#9423]) +11 other tests skip
>    [146]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format@pipe-a-hdmi-a-1.html
> 
>   * igt@kms_plane_scaling@plane-downscale-factor-0-25-with-rotation@pipe-a-hdmi-a-4:
>     - shard-dg1:          NOTRUN -> [SKIP][147] ([i915#9423]) +15 other tests skip
>    [147]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-18/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-rotation@pipe-a-hdmi-a-4.html
> 
>   * igt@kms_plane_scaling@plane-upscale-20x20-with-rotation@pipe-d-hdmi-a-1:
>     - shard-tglu:         NOTRUN -> [SKIP][148] ([i915#9423]) +3 other tests skip
>    [148]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_plane_scaling@plane-upscale-20x20-with-rotation@pipe-d-hdmi-a-1.html
> 
>   * igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-factor-0-25@pipe-c-hdmi-a-2:
>     - shard-dg2:          NOTRUN -> [SKIP][149] ([i915#5235] / [i915#9423]) +2 other tests skip
>    [149]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-3/igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-factor-0-25@pipe-c-hdmi-a-2.html
> 
>   * igt@kms_plane_scaling@planes-downscale-factor-0-25@pipe-b-dp-4:
>     - shard-dg2:          NOTRUN -> [SKIP][150] ([i915#9423]) +24 other tests skip
>    [150]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@kms_plane_scaling@planes-downscale-factor-0-25@pipe-b-dp-4.html
> 
>   * igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-25@pipe-a-hdmi-a-1:
>     - shard-rkl:          NOTRUN -> [SKIP][151] ([i915#9728]) +5 other tests skip
>    [151]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-25@pipe-a-hdmi-a-1.html
> 
>   * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25@pipe-d-hdmi-a-4:
>     - shard-dg1:          NOTRUN -> [SKIP][152] ([i915#9728]) +3 other tests skip
>    [152]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-18/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25@pipe-d-hdmi-a-4.html
> 
>   * igt@kms_pm_backlight@fade-with-dpms:
>     - shard-dg1:          NOTRUN -> [SKIP][153] ([i915#5354])
>    [153]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_pm_backlight@fade-with-dpms.html
> 
>   * igt@kms_pm_dc@dc3co-vpb-simulation:
>     - shard-dg1:          NOTRUN -> [SKIP][154] ([i915#9685]) +1 other test skip
>    [154]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-18/igt@kms_pm_dc@dc3co-vpb-simulation.html
> 
>   * igt@kms_pm_dc@dc5-psr:
>     - shard-rkl:          NOTRUN -> [SKIP][155] ([i915#9685]) +1 other test skip
>    [155]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_pm_dc@dc5-psr.html
> 
>   * igt@kms_pm_rpm@dpms-mode-unset-non-lpsp:
>     - shard-dg2:          [PASS][156] -> [SKIP][157] ([i915#9519]) +1 other test skip
>    [156]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-dg2-11/igt@kms_pm_rpm@dpms-mode-unset-non-lpsp.html
>    [157]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_pm_rpm@dpms-mode-unset-non-lpsp.html
> 
>   * igt@kms_pm_rpm@dpms-non-lpsp:
>     - shard-tglu:         NOTRUN -> [SKIP][158] ([i915#9519])
>    [158]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_pm_rpm@dpms-non-lpsp.html
> 
>   * igt@kms_pm_rpm@modeset-lpsp-stress:
>     - shard-rkl:          [PASS][159] -> [SKIP][160] ([i915#9519])
>    [159]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-rkl-4/igt@kms_pm_rpm@modeset-lpsp-stress.html
>    [160]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-5/igt@kms_pm_rpm@modeset-lpsp-stress.html
> 
>   * igt@kms_pm_rpm@modeset-lpsp-stress-no-wait:
>     - shard-dg1:          NOTRUN -> [SKIP][161] ([i915#9519])
>    [161]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_pm_rpm@modeset-lpsp-stress-no-wait.html
> 
>   * igt@kms_pm_rpm@modeset-non-lpsp-stress:
>     - shard-rkl:          NOTRUN -> [SKIP][162] ([i915#9519]) +1 other test skip
>    [162]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@kms_pm_rpm@modeset-non-lpsp-stress.html
> 
>   * igt@kms_prime@basic-modeset-hybrid:
>     - shard-rkl:          NOTRUN -> [SKIP][163] ([i915#6524])
>    [163]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_prime@basic-modeset-hybrid.html
> 
>   * igt@kms_psr2_sf@cursor-plane-move-continuous-sf:
>     - shard-dg1:          NOTRUN -> [SKIP][164] ([i915#11520]) +3 other tests skip
>    [164]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@kms_psr2_sf@cursor-plane-move-continuous-sf.html
> 
>   * igt@kms_psr2_sf@cursor-plane-update-sf:
>     - shard-dg2:          NOTRUN -> [SKIP][165] ([i915#11520]) +4 other tests skip
>    [165]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@kms_psr2_sf@cursor-plane-update-sf.html
> 
>   * igt@kms_psr2_sf@fbc-overlay-plane-move-continuous-exceed-fully-sf:
>     - shard-rkl:          NOTRUN -> [SKIP][166] ([i915#11520]) +3 other tests skip
>    [166]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_psr2_sf@fbc-overlay-plane-move-continuous-exceed-fully-sf.html
> 
>   * igt@kms_psr2_su@page_flip-p010:
>     - shard-dg1:          NOTRUN -> [SKIP][167] ([i915#9683]) +1 other test skip
>    [167]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_psr2_su@page_flip-p010.html
>     - shard-tglu:         NOTRUN -> [SKIP][168] ([i915#9683])
>    [168]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_psr2_su@page_flip-p010.html
> 
>   * igt@kms_psr2_su@page_flip-xrgb8888:
>     - shard-rkl:          NOTRUN -> [SKIP][169] ([i915#9683])
>    [169]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_psr2_su@page_flip-xrgb8888.html
> 
>   * igt@kms_psr@fbc-pr-primary-mmap-gtt:
>     - shard-dg2:          NOTRUN -> [SKIP][170] ([i915#1072] / [i915#9732]) +7 other tests skip
>    [170]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_psr@fbc-pr-primary-mmap-gtt.html
> 
>   * igt@kms_psr@fbc-psr-primary-page-flip:
>     - shard-dg2:          NOTRUN -> [SKIP][171] ([i915#1072] / [i915#9673] / [i915#9732]) +6 other tests skip
>    [171]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@kms_psr@fbc-psr-primary-page-flip.html
> 
>   * igt@kms_psr@fbc-psr-sprite-mmap-gtt:
>     - shard-snb:          NOTRUN -> [SKIP][172]
>    [172]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-snb2/igt@kms_psr@fbc-psr-sprite-mmap-gtt.html
> 
>   * igt@kms_psr@psr-cursor-plane-onoff:
>     - shard-dg1:          NOTRUN -> [SKIP][173] ([i915#1072] / [i915#9732]) +16 other tests skip
>    [173]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_psr@psr-cursor-plane-onoff.html
> 
>   * igt@kms_psr@psr-sprite-plane-move:
>     - shard-rkl:          NOTRUN -> [SKIP][174] ([i915#1072] / [i915#9732]) +12 other tests skip
>    [174]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_psr@psr-sprite-plane-move.html
> 
>   * igt@kms_psr@psr2-primary-render:
>     - shard-tglu:         NOTRUN -> [SKIP][175] ([i915#9732]) +4 other tests skip
>    [175]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_psr@psr2-primary-render.html
> 
>   * igt@kms_rotation_crc@exhaust-fences:
>     - shard-dg2:          NOTRUN -> [SKIP][176] ([i915#4235])
>    [176]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_rotation_crc@exhaust-fences.html
> 
>   * igt@kms_rotation_crc@primary-4-tiled-reflect-x-0:
>     - shard-rkl:          NOTRUN -> [SKIP][177] ([i915#5289])
>    [177]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_rotation_crc@primary-4-tiled-reflect-x-0.html
> 
>   * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270:
>     - shard-dg1:          NOTRUN -> [SKIP][178] ([i915#5289]) +1 other test skip
>    [178]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html
> 
>   * igt@kms_scaling_modes@scaling-mode-center:
>     - shard-dg1:          NOTRUN -> [SKIP][179] ([i915#3555]) +8 other tests skip
>    [179]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_scaling_modes@scaling-mode-center.html
> 
>   * igt@kms_scaling_modes@scaling-mode-full:
>     - shard-tglu:         NOTRUN -> [SKIP][180] ([i915#3555]) +3 other tests skip
>    [180]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_scaling_modes@scaling-mode-full.html
> 
>   * igt@kms_scaling_modes@scaling-mode-full-aspect:
>     - shard-dg2:          NOTRUN -> [SKIP][181] ([i915#3555]) +1 other test skip
>    [181]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_scaling_modes@scaling-mode-full-aspect.html
> 
>   * igt@kms_setmode@invalid-clone-single-crtc-stealing:
>     - shard-rkl:          NOTRUN -> [SKIP][182] ([i915#3555]) +4 other tests skip
>    [182]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_setmode@invalid-clone-single-crtc-stealing.html
> 
>   * igt@kms_sysfs_edid_timing:
>     - shard-dg2:          NOTRUN -> [FAIL][183] ([IGT#2])
>    [183]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_sysfs_edid_timing.html
> 
>   * igt@kms_tiled_display@basic-test-pattern-with-chamelium:
>     - shard-dg2:          NOTRUN -> [SKIP][184] ([i915#8623])
>    [184]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
> 
>   * igt@kms_universal_plane@cursor-fb-leak@pipe-b-hdmi-a-1:
>     - shard-tglu:         [PASS][185] -> [FAIL][186] ([i915#9196])
>    [185]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-tglu-6/igt@kms_universal_plane@cursor-fb-leak@pipe-b-hdmi-a-1.html
>    [186]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-6/igt@kms_universal_plane@cursor-fb-leak@pipe-b-hdmi-a-1.html
> 
>   * igt@kms_vrr@max-min:
>     - shard-dg1:          NOTRUN -> [SKIP][187] ([i915#9906])
>    [187]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@kms_vrr@max-min.html
> 
>   * igt@kms_writeback@writeback-check-output:
>     - shard-rkl:          NOTRUN -> [SKIP][188] ([i915#2437])
>    [188]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@kms_writeback@writeback-check-output.html
> 
>   * igt@kms_writeback@writeback-fb-id:
>     - shard-glk:          NOTRUN -> [SKIP][189] ([i915#2437])
>    [189]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-glk8/igt@kms_writeback@writeback-fb-id.html
>     - shard-dg2:          NOTRUN -> [SKIP][190] ([i915#2437])
>    [190]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@kms_writeback@writeback-fb-id.html
> 
>   * igt@kms_writeback@writeback-fb-id-xrgb2101010:
>     - shard-dg1:          NOTRUN -> [SKIP][191] ([i915#2437] / [i915#9412]) +1 other test skip
>    [191]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@kms_writeback@writeback-fb-id-xrgb2101010.html
> 
>   * igt@kms_writeback@writeback-pixel-formats:
>     - shard-tglu:         NOTRUN -> [SKIP][192] ([i915#2437] / [i915#9412])
>    [192]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-10/igt@kms_writeback@writeback-pixel-formats.html
> 
>   * igt@perf@gen8-unprivileged-single-ctx-counters:
>     - shard-rkl:          NOTRUN -> [SKIP][193] ([i915#2436])
>    [193]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@perf@gen8-unprivileged-single-ctx-counters.html
> 
>   * igt@perf@global-sseu-config:
>     - shard-dg2:          NOTRUN -> [SKIP][194] ([i915#7387])
>    [194]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@perf@global-sseu-config.html
> 
>   * igt@perf_pmu@frequency@gt0:
>     - shard-dg1:          NOTRUN -> [FAIL][195] ([i915#6806])
>    [195]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@perf_pmu@frequency@gt0.html
> 
>   * igt@prime_vgem@basic-fence-flip:
>     - shard-dg1:          NOTRUN -> [SKIP][196] ([i915#3708])
>    [196]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@prime_vgem@basic-fence-flip.html
> 
>   * igt@prime_vgem@basic-read:
>     - shard-rkl:          NOTRUN -> [SKIP][197] ([i915#3291] / [i915#3708])
>    [197]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-4/igt@prime_vgem@basic-read.html
> 
>   * igt@prime_vgem@basic-write:
>     - shard-dg2:          NOTRUN -> [SKIP][198] ([i915#3291] / [i915#3708])
>    [198]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@prime_vgem@basic-write.html
> 
>   * igt@prime_vgem@coherency-gtt:
>     - shard-dg2:          NOTRUN -> [SKIP][199] ([i915#3708] / [i915#4077]) +1 other test skip
>    [199]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@prime_vgem@coherency-gtt.html
> 
>   * igt@prime_vgem@fence-read-hang:
>     - shard-dg2:          NOTRUN -> [SKIP][200] ([i915#3708]) +1 other test skip
>    [200]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@prime_vgem@fence-read-hang.html
> 
>   * igt@sriov_basic@enable-vfs-autoprobe-off:
>     - shard-rkl:          NOTRUN -> [SKIP][201] ([i915#9917])
>    [201]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@sriov_basic@enable-vfs-autoprobe-off.html
> 
>   * igt@sriov_basic@enable-vfs-bind-unbind-each:
>     - shard-dg1:          NOTRUN -> [SKIP][202] ([i915#9917]) +1 other test skip
>    [202]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-15/igt@sriov_basic@enable-vfs-bind-unbind-each.html
> 
>   * igt@tools_test@sysfs_l3_parity:
>     - shard-dg1:          NOTRUN -> [SKIP][203] ([i915#4818])
>    [203]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-16/igt@tools_test@sysfs_l3_parity.html
> 
>   
> #### Possible fixes ####
> 
>   * igt@drm_fdinfo@most-busy-idle-check-all@rcs0:
>     - shard-rkl:          [FAIL][204] ([i915#7742]) -> [PASS][205] +1 other test pass
>    [204]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-rkl-5/igt@drm_fdinfo@most-busy-idle-check-all@rcs0.html
>    [205]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-5/igt@drm_fdinfo@most-busy-idle-check-all@rcs0.html
> 
>   * igt@gem_ctx_engines@invalid-engines:
>     - shard-glk:          [FAIL][206] ([i915#12027]) -> [PASS][207]
>    [206]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-glk6/igt@gem_ctx_engines@invalid-engines.html
>    [207]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-glk5/igt@gem_ctx_engines@invalid-engines.html
> 
>   * igt@gem_exec_fair@basic-none@vecs0:
>     - shard-rkl:          [FAIL][208] ([i915#2842]) -> [PASS][209]
>    [208]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-rkl-4/igt@gem_exec_fair@basic-none@vecs0.html
>    [209]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@gem_exec_fair@basic-none@vecs0.html
> 
>   * igt@gem_exec_suspend@basic-s0@lmem0:
>     - shard-dg2:          [INCOMPLETE][210] ([i915#11441]) -> [PASS][211]
>    [210]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-dg2-2/igt@gem_exec_suspend@basic-s0@lmem0.html
>    [211]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@gem_exec_suspend@basic-s0@lmem0.html
> 
>   * igt@i915_pm_rc6_residency@rc6-idle@gt0-vecs0:
>     - shard-dg1:          [FAIL][212] ([i915#3591]) -> [PASS][213]
>    [212]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-dg1-17/igt@i915_pm_rc6_residency@rc6-idle@gt0-vecs0.html
>    [213]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg1-18/igt@i915_pm_rc6_residency@rc6-idle@gt0-vecs0.html
> 
>   * igt@i915_pm_rps@reset:
>     - shard-snb:          [INCOMPLETE][214] ([i915#7790]) -> [PASS][215]
>    [214]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-snb6/igt@i915_pm_rps@reset.html
>    [215]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-snb2/igt@i915_pm_rps@reset.html
> 
>   * igt@i915_selftest@live@hangcheck:
>     - shard-dg2:          [INCOMPLETE][216] -> [PASS][217]
>    [216]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-dg2-3/igt@i915_selftest@live@hangcheck.html
>    [217]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@i915_selftest@live@hangcheck.html
> 
>   * igt@kms_atomic_transition@plane-all-modeset-transition-fencing@pipe-a-hdmi-a-1:
>     - shard-tglu:         [FAIL][218] ([i915#11808]) -> [PASS][219]
>    [218]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-tglu-7/igt@kms_atomic_transition@plane-all-modeset-transition-fencing@pipe-a-hdmi-a-1.html
>    [219]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-tglu-7/igt@kms_atomic_transition@plane-all-modeset-transition-fencing@pipe-a-hdmi-a-1.html
> 
>   * igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-hdmi-a-1:
>     - shard-snb:          [FAIL][220] ([i915#5956]) -> [PASS][221]
>    [220]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-snb4/igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-hdmi-a-1.html
>    [221]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-snb7/igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-hdmi-a-1.html
> 
>   * igt@kms_cursor_legacy@torture-bo@pipe-a:
>     - shard-snb:          [DMESG-WARN][222] ([i915#10166]) -> [PASS][223]
>    [222]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-snb2/igt@kms_cursor_legacy@torture-bo@pipe-a.html
>    [223]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-snb7/igt@kms_cursor_legacy@torture-bo@pipe-a.html
> 
>   * igt@kms_flip@2x-blocking-wf_vblank@ab-vga1-hdmi-a1:
>     - shard-snb:          [FAIL][224] ([i915#2122]) -> [PASS][225]
>    [224]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-snb7/igt@kms_flip@2x-blocking-wf_vblank@ab-vga1-hdmi-a1.html
>    [225]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-snb5/igt@kms_flip@2x-blocking-wf_vblank@ab-vga1-hdmi-a1.html
> 
>   * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-pwrite:
>     - shard-snb:          [SKIP][226] -> [PASS][227] +3 other tests pass
>    [226]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-snb4/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-pwrite.html
>    [227]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-snb7/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-pwrite.html
> 
>   * igt@kms_pm_rpm@dpms-non-lpsp:
>     - shard-dg2:          [SKIP][228] ([i915#9519]) -> [PASS][229]
>    [228]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-dg2-8/igt@kms_pm_rpm@dpms-non-lpsp.html
>    [229]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-6/igt@kms_pm_rpm@dpms-non-lpsp.html
> 
>   * igt@kms_pm_rpm@modeset-lpsp:
>     - shard-rkl:          [SKIP][230] ([i915#9519]) -> [PASS][231] +3 other tests pass
>    [230]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-rkl-5/igt@kms_pm_rpm@modeset-lpsp.html
>    [231]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-2/igt@kms_pm_rpm@modeset-lpsp.html
> 
>   
> #### Warnings ####
> 
>   * igt@i915_module_load@reload-with-fault-injection:
>     - shard-mtlp:         [ABORT][232] ([i915#10131] / [i915#9820]) -> [ABORT][233] ([i915#10131] / [i915#10887] / [i915#9697])
>    [232]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-mtlp-6/igt@i915_module_load@reload-with-fault-injection.html
>    [233]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-mtlp-6/igt@i915_module_load@reload-with-fault-injection.html
> 
>   * igt@kms_pm_dc@dc6-dpms:
>     - shard-rkl:          [FAIL][234] ([i915#9295]) -> [SKIP][235] ([i915#3361])
>    [234]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-rkl-5/igt@kms_pm_dc@dc6-dpms.html
>    [235]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-rkl-1/igt@kms_pm_dc@dc6-dpms.html
> 
>   * igt@kms_psr@fbc-pr-primary-render:
>     - shard-dg2:          [SKIP][236] ([i915#1072] / [i915#9673] / [i915#9732]) -> [SKIP][237] ([i915#1072] / [i915#9732]) +5 other tests skip
>    [236]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-dg2-11/igt@kms_psr@fbc-pr-primary-render.html
>    [237]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_psr@fbc-pr-primary-render.html
> 
>   * igt@kms_psr@psr2-no-drrs:
>     - shard-dg2:          [SKIP][238] ([i915#1072] / [i915#9732]) -> [SKIP][239] ([i915#1072] / [i915#9673] / [i915#9732]) +6 other tests skip
>    [238]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-dg2-2/igt@kms_psr@psr2-no-drrs.html
>    [239]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@kms_psr@psr2-no-drrs.html
> 
>   * igt@kms_rotation_crc@primary-rotation-270:
>     - shard-dg2:          [SKIP][240] ([i915#11131] / [i915#4235]) -> [SKIP][241] ([i915#11131])
>    [240]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-dg2-11/igt@kms_rotation_crc@primary-rotation-270.html
>    [241]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-2/igt@kms_rotation_crc@primary-rotation-270.html
> 
>   * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-90:
>     - shard-dg2:          [SKIP][242] ([i915#11131] / [i915#5190]) -> [SKIP][243] ([i915#11131] / [i915#4235] / [i915#5190])
>    [242]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_15285/shard-dg2-6/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-90.html
>    [243]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/shard-dg2-11/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-90.html
> 
>   
>   [IGT#2]: https://gitlab.freedesktop.org/drm/igt-gpu-tools/issues/2
>   [i915#10131]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10131
>   [i915#10166]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10166
>   [i915#10307]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10307
>   [i915#10434]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10434
>   [i915#1072]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1072
>   [i915#10887]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10887
>   [i915#11078]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11078
>   [i915#11131]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11131
>   [i915#11441]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11441
>   [i915#11453]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11453
>   [i915#11520]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11520
>   [i915#11616]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11616
>   [i915#11681]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11681
>   [i915#11808]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11808
>   [i915#11900]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11900
>   [i915#12027]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12027
>   [i915#1769]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1769
>   [i915#1825]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1825
>   [i915#1839]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1839
>   [i915#2122]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2122
>   [i915#2346]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2346
>   [i915#2436]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2436
>   [i915#2437]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2437
>   [i915#2527]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2527
>   [i915#2587]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2587
>   [i915#2658]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2658
>   [i915#2672]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2672
>   [i915#280]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/280
>   [i915#2842]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2842
>   [i915#2856]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2856
>   [i915#3023]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3023
>   [i915#3116]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3116
>   [i915#3281]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3281
>   [i915#3282]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3282
>   [i915#3291]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3291
>   [i915#3297]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3297
>   [i915#3323]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3323
>   [i915#3361]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3361
>   [i915#3458]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3458
>   [i915#3469]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3469
>   [i915#3539]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3539
>   [i915#3555]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3555
>   [i915#3591]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3591
>   [i915#3638]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3638
>   [i915#3708]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3708
>   [i915#3840]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3840
>   [i915#3936]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3936
>   [i915#4077]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4077
>   [i915#4079]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4079
>   [i915#4083]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4083
>   [i915#4087]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4087
>   [i915#4103]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4103
>   [i915#4212]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4212
>   [i915#4213]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4213
>   [i915#4215]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4215
>   [i915#4235]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4235
>   [i915#4270]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4270
>   [i915#4525]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4525
>   [i915#4538]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4538
>   [i915#4613]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4613
>   [i915#4812]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4812
>   [i915#4818]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4818
>   [i915#4852]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4852
>   [i915#4880]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4880
>   [i915#5190]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5190
>   [i915#5235]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5235
>   [i915#5286]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5286
>   [i915#5289]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5289
>   [i915#5354]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5354
>   [i915#5784]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5784
>   [i915#5956]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5956
>   [i915#6095]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6095
>   [i915#6227]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6227
>   [i915#6301]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6301
>   [i915#6334]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6334
>   [i915#6524]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6524
>   [i915#658]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/658
>   [i915#6806]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6806
>   [i915#6880]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6880
>   [i915#7118]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7118
>   [i915#7213]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7213
>   [i915#7387]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7387
>   [i915#7582]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7582
>   [i915#7697]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7697
>   [i915#7707]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7707
>   [i915#7742]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7742
>   [i915#7790]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7790
>   [i915#7828]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7828
>   [i915#7975]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7975
>   [i915#8213]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8213
>   [i915#8228]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8228
>   [i915#8381]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8381
>   [i915#8399]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8399
>   [i915#8411]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8411
>   [i915#8414]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8414
>   [i915#8428]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8428
>   [i915#8555]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8555
>   [i915#8562]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8562
>   [i915#8623]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8623
>   [i915#8708]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8708
>   [i915#8709]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8709
>   [i915#8812]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8812
>   [i915#9067]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9067
>   [i915#9196]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9196
>   [i915#9295]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9295
>   [i915#9323]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9323
>   [i915#9412]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9412
>   [i915#9423]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9423
>   [i915#9424]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9424
>   [i915#9519]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9519
>   [i915#9531]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9531
>   [i915#9673]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9673
>   [i915#9683]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9683
>   [i915#9685]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9685
>   [i915#9697]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9697
>   [i915#9728]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9728
>   [i915#9732]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9732
>   [i915#9820]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9820
>   [i915#9906]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9906
>   [i915#9917]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9917
>   [i915#9934]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9934
> 
> 
> Build changes
> -------------
> 
>   * Linux: CI_DRM_15285 -> Patchwork_136443v3
> 
>   CI-20190529: 20190529
>   CI_DRM_15285: a5ff876a886312067d4afa5d8bfa97fd8e8d6260 @ git://anongit.freedesktop.org/gfx-ci/linux
>   IGT_7988: 436018b50dfd35d75618a690f0dba6143d911aed @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
>   Patchwork_136443v3: a5ff876a886312067d4afa5d8bfa97fd8e8d6260 @ git://anongit.freedesktop.org/gfx-ci/linux
>   piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit
> 
> == Logs ==
> 
> For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_136443v3/index.html
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 1e43e32e05199..c621f6daf8235 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -5878,6 +5878,9 @@  intel_dp_detect(struct drm_connector *connector,
 	else
 		status = connector_status_disconnected;
 
+	if (!intel_dp_mst_verify_dpcd_state(intel_dp))
+		status = connector_status_disconnected;
+
 	if (status == connector_status_disconnected) {
 		memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
 		memset(intel_connector->dp.dsc_dpcd, 0, sizeof(intel_connector->dp.dsc_dpcd));
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 27ce5c3f5951e..89b147e37b400 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -1998,3 +1998,33 @@  bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
 
 	return false;
 }
+
+/**
+ * intel_dp_mst_verify_dpcd_state - verify the MST SW enabled state wrt. the DPCD
+ * @intel_dp: DP port object
+ *
+ * Verify if @intel_dp's MST enabled SW state matches the corresponding DPCD
+ * state. A long HPD pulse -not long enough to be detected as a disconnected
+ * state - could've reset the DPCD state, which requires tearing
+ * down/recreating the MST topology.
+ *
+ * Returns %true if the SW MST enabled and DPCD states match, %false
+ * otherwise.
+ */
+bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp)
+{
+	int ret;
+	u8 val;
+
+	if (!intel_dp->is_mst)
+		return true;
+
+	ret = drm_dp_dpcd_readb(intel_dp->mst_mgr.aux, DP_MSTM_CTRL, &val);
+	if (ret < 0)
+		return false;
+
+	if (val != (DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC))
+		return false;
+
+	return true;
+}
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.h b/drivers/gpu/drm/i915/display/intel_dp_mst.h
index 8ca1d599091c6..9e4c7679f1c3a 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.h
@@ -27,5 +27,6 @@  int intel_dp_mst_atomic_check_link(struct intel_atomic_state *state,
 				   struct intel_link_bw_limits *limits);
 bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
 				     struct intel_crtc *crtc);
+bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp);
 
 #endif /* __INTEL_DP_MST_H__ */