Intel-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset
  2024-02-20 22:09 [PATCH 0/3] Bigjoiner refactoring Stanislav Lisovskiy
@ 2024-02-20 22:09 ` Stanislav Lisovskiy
  0 siblings, 0 replies; 33+ messages in thread
From: Stanislav Lisovskiy @ 2024-02-20 22:09 UTC (permalink / raw)
  To: intel-gfx
  Cc: jani.saarinen, Stanislav.Lisovskiy, ville.syrjala, vidya.srinivas

Handle only bigjoiner masters in skl_commit_modeset_enables/disables,
slave crtcs should be handled by master hooks. Same for encoders.
That way we can also remove a bunch of checks like intel_crtc_is_bigjoiner_slave.

v2: Get rid of master vs slave checks and separation in crtc enable/disable hooks.
    Use unified iteration cycle for all of those, while enabling/disabling
    transcoder only for those pipes where its needed(Ville Syrjälä)

v3: Move all the intel_encoder_* calls under transcoder code path(Ville Syrjälä)

Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
---
 drivers/gpu/drm/i915/display/intel_ddi.c     |   3 +-
 drivers/gpu/drm/i915/display/intel_display.c | 183 ++++++++++++-------
 drivers/gpu/drm/i915/display/intel_display.h |   6 +
 3 files changed, 121 insertions(+), 71 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
index bea4415902044..9b459d3228b8b 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -3363,8 +3363,7 @@ static void intel_enable_ddi(struct intel_atomic_state *state,
 {
 	drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
 
-	if (!intel_crtc_is_bigjoiner_slave(crtc_state))
-		intel_ddi_enable_transcoder_func(encoder, crtc_state);
+	intel_ddi_enable_transcoder_func(encoder, crtc_state);
 
 	/* Enable/Disable DP2.0 SDP split config before transcoder */
 	intel_audio_sdp_split_update(crtc_state);
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 916c13a149fd5..522362aff7d95 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -1631,31 +1631,12 @@ static void hsw_configure_cpu_transcoder(const struct intel_crtc_state *crtc_sta
 	hsw_set_transconf(crtc_state);
 }
 
-static void hsw_crtc_enable(struct intel_atomic_state *state,
-			    struct intel_crtc *crtc)
+static void hsw_crtc_enable_pre_transcoder(struct intel_atomic_state *state,
+					   struct intel_crtc *crtc)
 {
 	const struct intel_crtc_state *new_crtc_state =
 		intel_atomic_get_new_crtc_state(state, crtc);
 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
-	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
-	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
-	bool psl_clkgate_wa;
-
-	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
-		return;
-
-	intel_dmc_enable_pipe(dev_priv, crtc->pipe);
-
-	if (!new_crtc_state->bigjoiner_pipes) {
-		intel_encoders_pre_pll_enable(state, crtc);
-
-		if (new_crtc_state->shared_dpll)
-			intel_enable_shared_dpll(new_crtc_state);
-
-		intel_encoders_pre_enable(state, crtc);
-	} else {
-		icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
-	}
 
 	intel_dsc_enable(new_crtc_state);
 
@@ -1665,19 +1646,17 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
 	intel_set_pipe_src_size(new_crtc_state);
 	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
 		bdw_set_pipe_misc(new_crtc_state);
+}
 
-	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&
-	    !transcoder_is_dsi(cpu_transcoder))
-		hsw_configure_cpu_transcoder(new_crtc_state);
+static void hsw_crtc_enable_post_transcoder(struct intel_atomic_state *state,
+					    struct intel_crtc *crtc)
+{
+	const struct intel_crtc_state *new_crtc_state =
+		intel_atomic_get_new_crtc_state(state, crtc);
+	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 
 	crtc->active = true;
 
-	/* Display WA #1180: WaDisableScalarClockGating: glk */
-	psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
-		new_crtc_state->pch_pfit.enabled;
-	if (psl_clkgate_wa)
-		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
-
 	if (DISPLAY_VER(dev_priv) >= 9)
 		skl_pfit_enable(new_crtc_state);
 	else
@@ -1701,26 +1680,83 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
 
 	intel_initial_watermarks(state, crtc);
 
-	if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
-		intel_crtc_vblank_on(new_crtc_state);
+	intel_crtc_vblank_on(new_crtc_state);
+}
 
-	intel_encoders_enable(state, crtc);
+static void hsw_crtc_enable(struct intel_atomic_state *state,
+			    struct intel_crtc *crtc)
+{
+	const struct intel_crtc_state *new_crtc_state =
+		intel_atomic_get_new_crtc_state(state, crtc);
+	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
+	struct intel_crtc *_crtc;
+	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(new_crtc_state);
+	int pipe_mask = slave_pipe_mask | crtc->pipe;
+	bool psl_clkgate_wa;
+	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
 
-	if (psl_clkgate_wa) {
-		intel_crtc_wait_for_next_vblank(crtc);
-		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
-	}
+	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
+		return;
+
+	/*
+	 * Use reverse iterator to go through slave pipes first.
+	 * TODO: We might need smarter iterator here
+	 */
+	for_each_intel_crtc_in_pipe_mask_reverse(&dev_priv->drm, _crtc,
+						 pipe_mask) {
+		const struct intel_crtc_state *_new_crtc_state =
+			intel_atomic_get_new_crtc_state(state, _crtc);
+		bool needs_transcoder = ((slave_pipe_mask & _crtc->pipe) == 0) &&
+					!transcoder_is_dsi(cpu_transcoder);
+
+		intel_dmc_enable_pipe(dev_priv, crtc->pipe);
+
+		if (!new_crtc_state->bigjoiner_pipes) {
+			if (needs_transcoder)
+				intel_encoders_pre_pll_enable(state, crtc);
+
+			if (new_crtc_state->shared_dpll)
+				intel_enable_shared_dpll(new_crtc_state);
+
+			if (needs_transcoder)
+				intel_encoders_pre_enable(state, crtc);
+		} else {
+			icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
+		}
+
+		hsw_crtc_enable_pre_transcoder(state, _crtc);
+
+		if (needs_transcoder)
+			hsw_configure_cpu_transcoder(_new_crtc_state);
+
+		/* Display WA #1180: WaDisableScalarClockGating: glk */
+		psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
+			new_crtc_state->pch_pfit.enabled;
+		if (psl_clkgate_wa)
+			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
+
+		hsw_crtc_enable_post_transcoder(state, _crtc);
+
+		if (needs_transcoder)
+			intel_encoders_enable(state, crtc);
+
+		if (psl_clkgate_wa) {
+			intel_crtc_wait_for_next_vblank(crtc);
+			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
+		}
 
-	/* If we change the relative order between pipe/planes enabling, we need
-	 * to change the workaround. */
-	hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
-	if (IS_HASWELL(dev_priv) && hsw_workaround_pipe != INVALID_PIPE) {
-		struct intel_crtc *wa_crtc;
+		/* If we change the relative order between pipe/planes enabling, we need
+		 * to change the workaround. */
+		hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
+		if (IS_HASWELL(dev_priv) && hsw_workaround_pipe != INVALID_PIPE) {
+			struct intel_crtc *wa_crtc;
 
-		wa_crtc = intel_crtc_for_pipe(dev_priv, hsw_workaround_pipe);
+			wa_crtc = intel_crtc_for_pipe(dev_priv, hsw_workaround_pipe);
 
-		intel_crtc_wait_for_next_vblank(wa_crtc);
-		intel_crtc_wait_for_next_vblank(wa_crtc);
+			intel_crtc_wait_for_next_vblank(wa_crtc);
+			intel_crtc_wait_for_next_vblank(wa_crtc);
+		}
 	}
 }
 
@@ -1784,28 +1820,27 @@ static void hsw_crtc_disable(struct intel_atomic_state *state,
 	const struct intel_crtc_state *old_crtc_state =
 		intel_atomic_get_old_crtc_state(state, crtc);
 	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
+	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(old_crtc_state);
+	int pipe_mask = slave_pipe_mask | crtc->pipe;
+	struct intel_crtc *_crtc;
+
+	for_each_intel_crtc_in_pipe_mask(&i915->drm, _crtc,
+					 pipe_mask) {
+		const struct intel_crtc_state *_old_crtc_state =
+			intel_atomic_get_old_crtc_state(state, _crtc);
+		bool needs_encoder_disable = (_crtc->pipe & slave_pipe_mask) == 0;
+
+		if (needs_encoder_disable) {
+			intel_encoders_disable(state, _crtc);
+			intel_encoders_post_disable(state, _crtc);
+		}
 
-	/*
-	 * FIXME collapse everything to one hook.
-	 * Need care with mst->ddi interactions.
-	 */
-	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
-		intel_encoders_disable(state, crtc);
-		intel_encoders_post_disable(state, crtc);
-	}
-
-	intel_disable_shared_dpll(old_crtc_state);
-
-	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
-		struct intel_crtc *slave_crtc;
-
-		intel_encoders_post_pll_disable(state, crtc);
+		intel_disable_shared_dpll(_old_crtc_state);
 
-		intel_dmc_disable_pipe(i915, crtc->pipe);
+		if (needs_encoder_disable)
+			intel_encoders_post_pll_disable(state, _crtc);
 
-		for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
-						 intel_crtc_bigjoiner_slave_pipes(old_crtc_state))
-			intel_dmc_disable_pipe(i915, slave_crtc->pipe);
+		intel_dmc_disable_pipe(i915, _crtc->pipe);
 	}
 }
 
@@ -6788,8 +6823,10 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
 		 * Slave vblanks are masked till Master Vblanks.
 		 */
 		if (!is_trans_port_sync_slave(old_crtc_state) &&
-		    !intel_dp_mst_is_slave_trans(old_crtc_state) &&
-		    !intel_crtc_is_bigjoiner_slave(old_crtc_state))
+		    !intel_dp_mst_is_slave_trans(old_crtc_state))
+			continue;
+
+		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
 			continue;
 
 		intel_old_crtc_state_disables(state, old_crtc_state,
@@ -6807,6 +6844,9 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
 		if (!old_crtc_state->hw.active)
 			continue;
 
+		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
+			continue;
+
 		intel_old_crtc_state_disables(state, old_crtc_state,
 					      new_crtc_state, crtc);
 	}
@@ -6919,8 +6959,10 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
 			continue;
 
 		if (intel_dp_mst_is_slave_trans(new_crtc_state) ||
-		    is_trans_port_sync_master(new_crtc_state) ||
-		    intel_crtc_is_bigjoiner_master(new_crtc_state))
+		    is_trans_port_sync_master(new_crtc_state))
+			continue;
+
+		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
 			continue;
 
 		modeset_pipes &= ~BIT(pipe);
@@ -6930,7 +6972,7 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
 
 	/*
 	 * Then we enable all remaining pipes that depend on other
-	 * pipes: MST slaves and port sync masters, big joiner master
+	 * pipes: MST slaves and port sync masters
 	 */
 	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
 		enum pipe pipe = crtc->pipe;
@@ -6938,6 +6980,9 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
 		if ((modeset_pipes & BIT(pipe)) == 0)
 			continue;
 
+		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
+			continue;
+
 		modeset_pipes &= ~BIT(pipe);
 
 		intel_enable_crtc(state, crtc);
diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
index f4a0773f0fca8..e1e8d956c305e 100644
--- a/drivers/gpu/drm/i915/display/intel_display.h
+++ b/drivers/gpu/drm/i915/display/intel_display.h
@@ -280,6 +280,12 @@ enum phy_fia {
 			    base.head)					\
 		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
 
+#define for_each_intel_crtc_in_pipe_mask_reverse(dev, intel_crtc, pipe_mask)	\
+	list_for_each_entry_reverse(intel_crtc,					\
+				    &(dev)->mode_config.crtc_list,		\
+				    base.head)					\
+		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
+
 #define for_each_intel_encoder(dev, intel_encoder)		\
 	list_for_each_entry(intel_encoder,			\
 			    &(dev)->mode_config.encoder_list,	\
-- 
2.37.3


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 0/3] Bigjoiner refactoring
@ 2024-02-21 19:20 Stanislav Lisovskiy
  2024-02-21 19:20 ` [PATCH 1/3] drm/i915/bigjoiner: Refactor bigjoiner state readout Stanislav Lisovskiy
                   ` (6 more replies)
  0 siblings, 7 replies; 33+ messages in thread
From: Stanislav Lisovskiy @ 2024-02-21 19:20 UTC (permalink / raw)
  To: intel-gfx
  Cc: Stanislav.Lisovskiy, jani.saarinen, ville.syrjala, vidya.srinivas

There are few things we need to do for bigjoiner, in order
to improve code maintenance and also make testing for Bigjoiner
easier.
Those series contain addition of bigjoiner force debugfs option,
in order to be able to force bigjoiner even if there is no display
support, also we refactor pipe vs transcoder logic, as currently
it is a bit scattered between *_commit_modeset_enables/disables
and *_crtc_enable/disable functions. Same applies to encoders.
We made a decision to handle all the slaves in correspondent master
hook, so slaves and slave checks no longer would be in modesetting
level logic.

Stanislav Lisovskiy (3):
  drm/i915/bigjoiner: Refactor bigjoiner state readout
  Start separating pipe vs transcoder set logic for bigjoiner during
    modeset
  drm/i915: Fix bigjoiner case for DP2.0

 drivers/gpu/drm/i915/display/intel_ddi.c     |  21 +-
 drivers/gpu/drm/i915/display/intel_display.c | 205 +++++++++++--------
 drivers/gpu/drm/i915/display/intel_display.h |   6 +
 drivers/gpu/drm/i915/display/intel_dp_mst.c  |  19 +-
 4 files changed, 144 insertions(+), 107 deletions(-)

-- 
2.37.3


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH 1/3] drm/i915/bigjoiner: Refactor bigjoiner state readout
  2024-02-21 19:20 [PATCH 0/3] Bigjoiner refactoring Stanislav Lisovskiy
@ 2024-02-21 19:20 ` Stanislav Lisovskiy
  2024-03-01 10:10   ` Ville Syrjälä
  2024-02-21 19:20 ` [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset Stanislav Lisovskiy
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 33+ messages in thread
From: Stanislav Lisovskiy @ 2024-02-21 19:20 UTC (permalink / raw)
  To: intel-gfx
  Cc: Stanislav.Lisovskiy, jani.saarinen, ville.syrjala, vidya.srinivas

Don't call enabled_bigjoiner_pipes twice, lets just move
intel_get_bigjoiner_config earlier, because it is anyway
calling same function.
Also cleanup hsw_enabled_transcoders from irrelevant bigjoiner code.

Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display.c | 22 ++++++++++----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 00ac65a140298..916c13a149fd5 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -3535,7 +3535,6 @@ static u8 hsw_enabled_transcoders(struct intel_crtc *crtc)
 	struct drm_i915_private *dev_priv = to_i915(dev);
 	u8 panel_transcoder_mask = hsw_panel_transcoders(dev_priv);
 	enum transcoder cpu_transcoder;
-	u8 master_pipes, slave_pipes;
 	u8 enabled_transcoders = 0;
 
 	/*
@@ -3586,15 +3585,6 @@ static u8 hsw_enabled_transcoders(struct intel_crtc *crtc)
 	if (transcoder_ddi_func_is_enabled(dev_priv, cpu_transcoder))
 		enabled_transcoders |= BIT(cpu_transcoder);
 
-	/* bigjoiner slave -> consider the master pipe's transcoder as well */
-	enabled_bigjoiner_pipes(dev_priv, &master_pipes, &slave_pipes);
-	if (slave_pipes & BIT(crtc->pipe)) {
-		cpu_transcoder = (enum transcoder)
-			get_bigjoiner_master_pipe(crtc->pipe, master_pipes, slave_pipes);
-		if (transcoder_ddi_func_is_enabled(dev_priv, cpu_transcoder))
-			enabled_transcoders |= BIT(cpu_transcoder);
-	}
-
 	return enabled_transcoders;
 }
 
@@ -3641,6 +3631,15 @@ static bool hsw_get_transcoder_state(struct intel_crtc *crtc,
 	u32 tmp;
 
 	enabled_transcoders = hsw_enabled_transcoders(crtc);
+
+	/* bigjoiner slave -> consider the master pipe's transcoder as well */
+	if (intel_crtc_is_bigjoiner_slave(pipe_config)) {
+		unsigned long cpu_transcoder = (enum transcoder)
+			bigjoiner_master_pipe(pipe_config);
+		if (transcoder_ddi_func_is_enabled(dev_priv, cpu_transcoder))
+			enabled_transcoders |= BIT(cpu_transcoder);
+	}
+
 	if (!enabled_transcoders)
 		return false;
 
@@ -3745,6 +3744,8 @@ static bool hsw_get_pipe_config(struct intel_crtc *crtc,
 
 	pipe_config->shared_dpll = NULL;
 
+	intel_bigjoiner_get_config(pipe_config);
+
 	active = hsw_get_transcoder_state(crtc, pipe_config, &crtc->hw_readout_power_domains);
 
 	if ((IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) &&
@@ -3756,7 +3757,6 @@ static bool hsw_get_pipe_config(struct intel_crtc *crtc,
 	if (!active)
 		goto out;
 
-	intel_bigjoiner_get_config(pipe_config);
 	intel_dsc_get_config(pipe_config);
 
 	if (!transcoder_is_dsi(pipe_config->cpu_transcoder) ||
-- 
2.37.3


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset
  2024-02-21 19:20 [PATCH 0/3] Bigjoiner refactoring Stanislav Lisovskiy
  2024-02-21 19:20 ` [PATCH 1/3] drm/i915/bigjoiner: Refactor bigjoiner state readout Stanislav Lisovskiy
@ 2024-02-21 19:20 ` Stanislav Lisovskiy
  2024-02-27  4:40   ` Srinivas, Vidya
  2024-03-01 10:10   ` Ville Syrjälä
  2024-02-21 19:20 ` [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0 Stanislav Lisovskiy
                   ` (4 subsequent siblings)
  6 siblings, 2 replies; 33+ messages in thread
From: Stanislav Lisovskiy @ 2024-02-21 19:20 UTC (permalink / raw)
  To: intel-gfx
  Cc: Stanislav.Lisovskiy, jani.saarinen, ville.syrjala, vidya.srinivas

Handle only bigjoiner masters in skl_commit_modeset_enables/disables,
slave crtcs should be handled by master hooks. Same for encoders.
That way we can also remove a bunch of checks like intel_crtc_is_bigjoiner_slave.

v2: Get rid of master vs slave checks and separation in crtc enable/disable hooks.
    Use unified iteration cycle for all of those, while enabling/disabling
    transcoder only for those pipes where its needed(Ville Syrjälä)

v3: Move all the intel_encoder_* calls under transcoder code path(Ville Syrjälä)

v4:  - Call intel_crtc_vblank_on from hsw_crtc_enable only for non-transcoder path
       (for master pipe that will be called from intel_encoders_enable/intel_enable_ddi)
     - Fix stupid mistake with using crtc->pipe for the mask, instead of BIT(crtc->pipe)

Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
---
 drivers/gpu/drm/i915/display/intel_ddi.c     |  21 +--
 drivers/gpu/drm/i915/display/intel_display.c | 183 ++++++++++++-------
 drivers/gpu/drm/i915/display/intel_display.h |   6 +
 3 files changed, 121 insertions(+), 89 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
index bea4415902044..6071e9f500871 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -3100,7 +3100,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
 				   const struct drm_connector_state *old_conn_state)
 {
 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
-	struct intel_crtc *slave_crtc;
 
 	if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST)) {
 		intel_crtc_vblank_off(old_crtc_state);
@@ -3117,17 +3116,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
 			ilk_pfit_disable(old_crtc_state);
 	}
 
-	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, slave_crtc,
-					 intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) {
-		const struct intel_crtc_state *old_slave_crtc_state =
-			intel_atomic_get_old_crtc_state(state, slave_crtc);
-
-		intel_crtc_vblank_off(old_slave_crtc_state);
-
-		intel_dsc_disable(old_slave_crtc_state);
-		skl_scaler_disable(old_slave_crtc_state);
-	}
-
 	/*
 	 * When called from DP MST code:
 	 * - old_conn_state will be NULL
@@ -3363,8 +3351,7 @@ static void intel_enable_ddi(struct intel_atomic_state *state,
 {
 	drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
 
-	if (!intel_crtc_is_bigjoiner_slave(crtc_state))
-		intel_ddi_enable_transcoder_func(encoder, crtc_state);
+	intel_ddi_enable_transcoder_func(encoder, crtc_state);
 
 	/* Enable/Disable DP2.0 SDP split config before transcoder */
 	intel_audio_sdp_split_update(crtc_state);
@@ -3469,9 +3456,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
 				  struct intel_crtc *crtc)
 {
 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
-	struct intel_crtc_state *crtc_state =
-		intel_atomic_get_new_crtc_state(state, crtc);
-	struct intel_crtc *slave_crtc;
 	enum phy phy = intel_port_to_phy(i915, encoder->port);
 
 	/* FIXME: Add MTL pll_mgr */
@@ -3479,9 +3463,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
 		return;
 
 	intel_update_active_dpll(state, crtc, encoder);
-	for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
-					 intel_crtc_bigjoiner_slave_pipes(crtc_state))
-		intel_update_active_dpll(state, slave_crtc, encoder);
 }
 
 static void
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 916c13a149fd5..e1ea53fd6a288 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -1631,31 +1631,12 @@ static void hsw_configure_cpu_transcoder(const struct intel_crtc_state *crtc_sta
 	hsw_set_transconf(crtc_state);
 }
 
-static void hsw_crtc_enable(struct intel_atomic_state *state,
-			    struct intel_crtc *crtc)
+static void hsw_crtc_enable_pre_transcoder(struct intel_atomic_state *state,
+					   struct intel_crtc *crtc)
 {
 	const struct intel_crtc_state *new_crtc_state =
 		intel_atomic_get_new_crtc_state(state, crtc);
 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
-	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
-	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
-	bool psl_clkgate_wa;
-
-	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
-		return;
-
-	intel_dmc_enable_pipe(dev_priv, crtc->pipe);
-
-	if (!new_crtc_state->bigjoiner_pipes) {
-		intel_encoders_pre_pll_enable(state, crtc);
-
-		if (new_crtc_state->shared_dpll)
-			intel_enable_shared_dpll(new_crtc_state);
-
-		intel_encoders_pre_enable(state, crtc);
-	} else {
-		icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
-	}
 
 	intel_dsc_enable(new_crtc_state);
 
@@ -1665,19 +1646,17 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
 	intel_set_pipe_src_size(new_crtc_state);
 	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
 		bdw_set_pipe_misc(new_crtc_state);
+}
 
-	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&
-	    !transcoder_is_dsi(cpu_transcoder))
-		hsw_configure_cpu_transcoder(new_crtc_state);
+static void hsw_crtc_enable_post_transcoder(struct intel_atomic_state *state,
+					    struct intel_crtc *crtc)
+{
+	const struct intel_crtc_state *new_crtc_state =
+		intel_atomic_get_new_crtc_state(state, crtc);
+	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 
 	crtc->active = true;
 
-	/* Display WA #1180: WaDisableScalarClockGating: glk */
-	psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
-		new_crtc_state->pch_pfit.enabled;
-	if (psl_clkgate_wa)
-		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
-
 	if (DISPLAY_VER(dev_priv) >= 9)
 		skl_pfit_enable(new_crtc_state);
 	else
@@ -1700,27 +1679,84 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
 		icl_set_pipe_chicken(new_crtc_state);
 
 	intel_initial_watermarks(state, crtc);
+}
 
-	if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
-		intel_crtc_vblank_on(new_crtc_state);
+static void hsw_crtc_enable(struct intel_atomic_state *state,
+			    struct intel_crtc *crtc)
+{
+	const struct intel_crtc_state *new_crtc_state =
+		intel_atomic_get_new_crtc_state(state, crtc);
+	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
+	struct intel_crtc *_crtc;
+	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(new_crtc_state);
+	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
+	bool psl_clkgate_wa;
+	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
 
-	intel_encoders_enable(state, crtc);
+	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
+		return;
 
-	if (psl_clkgate_wa) {
-		intel_crtc_wait_for_next_vblank(crtc);
-		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
-	}
+	/*
+	 * Use reverse iterator to go through slave pipes first.
+	 * TODO: We might need smarter iterator here
+	 */
+	for_each_intel_crtc_in_pipe_mask_reverse(&dev_priv->drm, _crtc,
+						 pipe_mask) {
+		const struct intel_crtc_state *_new_crtc_state =
+			intel_atomic_get_new_crtc_state(state, _crtc);
+		bool needs_transcoder = ((slave_pipe_mask & BIT(_crtc->pipe)) == 0) &&
+					!transcoder_is_dsi(cpu_transcoder);
+
+		intel_dmc_enable_pipe(dev_priv, crtc->pipe);
+
+		if (!new_crtc_state->bigjoiner_pipes) {
+			if (needs_transcoder)
+				intel_encoders_pre_pll_enable(state, crtc);
+
+			if (new_crtc_state->shared_dpll)
+				intel_enable_shared_dpll(new_crtc_state);
+
+			if (needs_transcoder)
+				intel_encoders_pre_enable(state, crtc);
+		} else {
+			icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
+		}
+
+		hsw_crtc_enable_pre_transcoder(state, _crtc);
+
+		if (needs_transcoder)
+			hsw_configure_cpu_transcoder(_new_crtc_state);
+
+		/* Display WA #1180: WaDisableScalarClockGating: glk */
+		psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
+			new_crtc_state->pch_pfit.enabled;
+		if (psl_clkgate_wa)
+			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
+
+		hsw_crtc_enable_post_transcoder(state, _crtc);
+
+		if (needs_transcoder)
+			intel_encoders_enable(state, crtc);
+		else
+			intel_crtc_vblank_on(_new_crtc_state);
+
+		if (psl_clkgate_wa) {
+			intel_crtc_wait_for_next_vblank(crtc);
+			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
+		}
 
-	/* If we change the relative order between pipe/planes enabling, we need
-	 * to change the workaround. */
-	hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
-	if (IS_HASWELL(dev_priv) && hsw_workaround_pipe != INVALID_PIPE) {
-		struct intel_crtc *wa_crtc;
+		/* If we change the relative order between pipe/planes enabling, we need
+		 * to change the workaround. */
+		hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
+		if (IS_HASWELL(dev_priv) && hsw_workaround_pipe != INVALID_PIPE) {
+			struct intel_crtc *wa_crtc;
 
-		wa_crtc = intel_crtc_for_pipe(dev_priv, hsw_workaround_pipe);
+			wa_crtc = intel_crtc_for_pipe(dev_priv, hsw_workaround_pipe);
 
-		intel_crtc_wait_for_next_vblank(wa_crtc);
-		intel_crtc_wait_for_next_vblank(wa_crtc);
+			intel_crtc_wait_for_next_vblank(wa_crtc);
+			intel_crtc_wait_for_next_vblank(wa_crtc);
+		}
 	}
 }
 
@@ -1784,28 +1820,27 @@ static void hsw_crtc_disable(struct intel_atomic_state *state,
 	const struct intel_crtc_state *old_crtc_state =
 		intel_atomic_get_old_crtc_state(state, crtc);
 	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
+	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(old_crtc_state);
+	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
+	struct intel_crtc *_crtc;
+
+	for_each_intel_crtc_in_pipe_mask(&i915->drm, _crtc,
+					 pipe_mask) {
+		const struct intel_crtc_state *_old_crtc_state =
+			intel_atomic_get_old_crtc_state(state, _crtc);
+		bool needs_encoder_disable = (slave_pipe_mask & BIT(_crtc->pipe)) == 0;
+
+		if (needs_encoder_disable) {
+			intel_encoders_disable(state, _crtc);
+			intel_encoders_post_disable(state, _crtc);
+		}
 
-	/*
-	 * FIXME collapse everything to one hook.
-	 * Need care with mst->ddi interactions.
-	 */
-	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
-		intel_encoders_disable(state, crtc);
-		intel_encoders_post_disable(state, crtc);
-	}
-
-	intel_disable_shared_dpll(old_crtc_state);
-
-	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
-		struct intel_crtc *slave_crtc;
-
-		intel_encoders_post_pll_disable(state, crtc);
+		intel_disable_shared_dpll(_old_crtc_state);
 
-		intel_dmc_disable_pipe(i915, crtc->pipe);
+		if (needs_encoder_disable)
+			intel_encoders_post_pll_disable(state, _crtc);
 
-		for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
-						 intel_crtc_bigjoiner_slave_pipes(old_crtc_state))
-			intel_dmc_disable_pipe(i915, slave_crtc->pipe);
+		intel_dmc_disable_pipe(i915, _crtc->pipe);
 	}
 }
 
@@ -6788,8 +6823,10 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
 		 * Slave vblanks are masked till Master Vblanks.
 		 */
 		if (!is_trans_port_sync_slave(old_crtc_state) &&
-		    !intel_dp_mst_is_slave_trans(old_crtc_state) &&
-		    !intel_crtc_is_bigjoiner_slave(old_crtc_state))
+		    !intel_dp_mst_is_slave_trans(old_crtc_state))
+			continue;
+
+		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
 			continue;
 
 		intel_old_crtc_state_disables(state, old_crtc_state,
@@ -6807,6 +6844,9 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
 		if (!old_crtc_state->hw.active)
 			continue;
 
+		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
+			continue;
+
 		intel_old_crtc_state_disables(state, old_crtc_state,
 					      new_crtc_state, crtc);
 	}
@@ -6919,8 +6959,10 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
 			continue;
 
 		if (intel_dp_mst_is_slave_trans(new_crtc_state) ||
-		    is_trans_port_sync_master(new_crtc_state) ||
-		    intel_crtc_is_bigjoiner_master(new_crtc_state))
+		    is_trans_port_sync_master(new_crtc_state))
+			continue;
+
+		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
 			continue;
 
 		modeset_pipes &= ~BIT(pipe);
@@ -6930,7 +6972,7 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
 
 	/*
 	 * Then we enable all remaining pipes that depend on other
-	 * pipes: MST slaves and port sync masters, big joiner master
+	 * pipes: MST slaves and port sync masters
 	 */
 	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
 		enum pipe pipe = crtc->pipe;
@@ -6938,6 +6980,9 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
 		if ((modeset_pipes & BIT(pipe)) == 0)
 			continue;
 
+		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
+			continue;
+
 		modeset_pipes &= ~BIT(pipe);
 
 		intel_enable_crtc(state, crtc);
diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
index f4a0773f0fca8..e1e8d956c305e 100644
--- a/drivers/gpu/drm/i915/display/intel_display.h
+++ b/drivers/gpu/drm/i915/display/intel_display.h
@@ -280,6 +280,12 @@ enum phy_fia {
 			    base.head)					\
 		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
 
+#define for_each_intel_crtc_in_pipe_mask_reverse(dev, intel_crtc, pipe_mask)	\
+	list_for_each_entry_reverse(intel_crtc,					\
+				    &(dev)->mode_config.crtc_list,		\
+				    base.head)					\
+		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
+
 #define for_each_intel_encoder(dev, intel_encoder)		\
 	list_for_each_entry(intel_encoder,			\
 			    &(dev)->mode_config.encoder_list,	\
-- 
2.37.3


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0
  2024-02-21 19:20 [PATCH 0/3] Bigjoiner refactoring Stanislav Lisovskiy
  2024-02-21 19:20 ` [PATCH 1/3] drm/i915/bigjoiner: Refactor bigjoiner state readout Stanislav Lisovskiy
  2024-02-21 19:20 ` [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset Stanislav Lisovskiy
@ 2024-02-21 19:20 ` Stanislav Lisovskiy
  2024-02-21 22:35   ` Manasi Navare
  2024-02-26 19:56   ` Jani Nikula
  2024-02-21 23:18 ` ✗ Fi.CI.CHECKPATCH: warning for Bigjoiner refactoring (rev8) Patchwork
                   ` (3 subsequent siblings)
  6 siblings, 2 replies; 33+ messages in thread
From: Stanislav Lisovskiy @ 2024-02-21 19:20 UTC (permalink / raw)
  To: intel-gfx
  Cc: Stanislav.Lisovskiy, jani.saarinen, ville.syrjala, vidya.srinivas

Patch calculates bigjoiner pipes in mst compute.
Patch also passes bigjoiner bool to validate plane
max size.

Signed-off-by: vsrini4 <vidya.srinivas@intel.com>
Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp_mst.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 5307ddd4edcf5..fd27d9976c050 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -523,6 +523,7 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
 				       struct drm_connector_state *conn_state)
 {
 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
 	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
 	struct intel_dp *intel_dp = &intel_mst->primary->dp;
 	const struct intel_connector *connector =
@@ -540,6 +541,10 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
 	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
 		return -EINVAL;
 
+	if (intel_dp_need_bigjoiner(intel_dp, adjusted_mode->crtc_hdisplay,
+				    adjusted_mode->crtc_clock))
+		pipe_config->bigjoiner_pipes = GENMASK(crtc->pipe + 1, crtc->pipe);
+
 	pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB;
 	pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
 	pipe_config->has_pch_encoder = false;
@@ -1318,12 +1323,6 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
 	 *   corresponding link capabilities of the sink) in case the
 	 *   stream is uncompressed for it by the last branch device.
 	 */
-	if (mode_rate > max_rate || mode->clock > max_dotclk ||
-	    drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port->full_pbn) {
-		*status = MODE_CLOCK_HIGH;
-		return 0;
-	}
-
 	if (mode->clock < 10000) {
 		*status = MODE_CLOCK_LOW;
 		return 0;
@@ -1343,6 +1342,12 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
 		return 0;
 	}
 
+	if (mode_rate > max_rate || mode->clock > max_dotclk ||
+	    drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port->full_pbn) {
+		*status = MODE_CLOCK_HIGH;
+		return 0;
+	}
+
 	if (DISPLAY_VER(dev_priv) >= 10 &&
 	    drm_dp_sink_supports_dsc(intel_connector->dp.dsc_dpcd)) {
 		/*
@@ -1385,7 +1390,7 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
 		return 0;
 	}
 
-	*status = intel_mode_valid_max_plane_size(dev_priv, mode, false);
+	*status = intel_mode_valid_max_plane_size(dev_priv, mode, bigjoiner);
 	return 0;
 }
 
-- 
2.37.3


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0
  2024-02-21 19:20 ` [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0 Stanislav Lisovskiy
@ 2024-02-21 22:35   ` Manasi Navare
  2024-02-26 19:56   ` Jani Nikula
  1 sibling, 0 replies; 33+ messages in thread
From: Manasi Navare @ 2024-02-21 22:35 UTC (permalink / raw)
  To: Stanislav Lisovskiy
  Cc: intel-gfx, jani.saarinen, ville.syrjala, vidya.srinivas

Thanks Stan and Vidya for this patch.
ACK for the bigjoiner pipes calc and plane max size validation changes.

@Ville Syrjälä : Do you see any gaps now with MST bigjoiner enabling
in crtc_enable hooks () ? Or just these changes would suffice?

Regards
Manasi

On Wed, Feb 21, 2024 at 11:20 AM Stanislav Lisovskiy
<stanislav.lisovskiy@intel.com> wrote:
>
> Patch calculates bigjoiner pipes in mst compute.
> Patch also passes bigjoiner bool to validate plane
> max size.
>
> Signed-off-by: vsrini4 <vidya.srinivas@intel.com>
> Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp_mst.c | 19 ++++++++++++-------
>  1 file changed, 12 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> index 5307ddd4edcf5..fd27d9976c050 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> @@ -523,6 +523,7 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
>                                        struct drm_connector_state *conn_state)
>  {
>         struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> +       struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
>         struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
>         struct intel_dp *intel_dp = &intel_mst->primary->dp;
>         const struct intel_connector *connector =
> @@ -540,6 +541,10 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
>         if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
>                 return -EINVAL;
>
> +       if (intel_dp_need_bigjoiner(intel_dp, adjusted_mode->crtc_hdisplay,
> +                                   adjusted_mode->crtc_clock))
> +               pipe_config->bigjoiner_pipes = GENMASK(crtc->pipe + 1, crtc->pipe);
> +
>         pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB;
>         pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
>         pipe_config->has_pch_encoder = false;
> @@ -1318,12 +1323,6 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
>          *   corresponding link capabilities of the sink) in case the
>          *   stream is uncompressed for it by the last branch device.
>          */
> -       if (mode_rate > max_rate || mode->clock > max_dotclk ||
> -           drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port->full_pbn) {
> -               *status = MODE_CLOCK_HIGH;
> -               return 0;
> -       }
> -
>         if (mode->clock < 10000) {
>                 *status = MODE_CLOCK_LOW;
>                 return 0;
> @@ -1343,6 +1342,12 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
>                 return 0;
>         }
>
> +       if (mode_rate > max_rate || mode->clock > max_dotclk ||
> +           drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port->full_pbn) {
> +               *status = MODE_CLOCK_HIGH;
> +               return 0;
> +       }
> +
>         if (DISPLAY_VER(dev_priv) >= 10 &&
>             drm_dp_sink_supports_dsc(intel_connector->dp.dsc_dpcd)) {
>                 /*
> @@ -1385,7 +1390,7 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
>                 return 0;
>         }
>
> -       *status = intel_mode_valid_max_plane_size(dev_priv, mode, false);
> +       *status = intel_mode_valid_max_plane_size(dev_priv, mode, bigjoiner);
>         return 0;
>  }
>
> --
> 2.37.3
>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* ✗ Fi.CI.CHECKPATCH: warning for Bigjoiner refactoring (rev8)
  2024-02-21 19:20 [PATCH 0/3] Bigjoiner refactoring Stanislav Lisovskiy
                   ` (2 preceding siblings ...)
  2024-02-21 19:20 ` [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0 Stanislav Lisovskiy
@ 2024-02-21 23:18 ` Patchwork
  2024-02-21 23:18 ` ✗ Fi.CI.SPARSE: " Patchwork
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 33+ messages in thread
From: Patchwork @ 2024-02-21 23:18 UTC (permalink / raw)
  To: Stanislav Lisovskiy; +Cc: intel-gfx

== Series Details ==

Series: Bigjoiner refactoring (rev8)
URL   : https://patchwork.freedesktop.org/series/128311/
State : warning

== Summary ==

Error: dim checkpatch failed
99388805e7fa drm/i915/bigjoiner: Refactor bigjoiner state readout
1b4a23d5e363 Start separating pipe vs transcoder set logic for bigjoiner during modeset
-:12: WARNING:COMMIT_LOG_LONG_LINE: Prefer a maximum 75 chars per line (possible unwrapped commit description?)
#12: 
That way we can also remove a bunch of checks like intel_crtc_is_bigjoiner_slave.

-:235: WARNING:BLOCK_COMMENT_STYLE: Block comments use a trailing */ on a separate line
#235: FILE: drivers/gpu/drm/i915/display/intel_display.c:1750:
+		 * to change the workaround. */

-:361: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#361: FILE: drivers/gpu/drm/i915/display/intel_display.h:283:
+#define for_each_intel_crtc_in_pipe_mask_reverse(dev, intel_crtc, pipe_mask)	\
+	list_for_each_entry_reverse(intel_crtc,					\
+				    &(dev)->mode_config.crtc_list,		\
+				    base.head)					\
+		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))

-:361: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'intel_crtc' - possible side-effects?
#361: FILE: drivers/gpu/drm/i915/display/intel_display.h:283:
+#define for_each_intel_crtc_in_pipe_mask_reverse(dev, intel_crtc, pipe_mask)	\
+	list_for_each_entry_reverse(intel_crtc,					\
+				    &(dev)->mode_config.crtc_list,		\
+				    base.head)					\
+		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))

total: 1 errors, 2 warnings, 1 checks, 317 lines checked
0ad1c861ceb6 drm/i915: Fix bigjoiner case for DP2.0



^ permalink raw reply	[flat|nested] 33+ messages in thread

* ✗ Fi.CI.SPARSE: warning for Bigjoiner refactoring (rev8)
  2024-02-21 19:20 [PATCH 0/3] Bigjoiner refactoring Stanislav Lisovskiy
                   ` (3 preceding siblings ...)
  2024-02-21 23:18 ` ✗ Fi.CI.CHECKPATCH: warning for Bigjoiner refactoring (rev8) Patchwork
@ 2024-02-21 23:18 ` Patchwork
  2024-02-21 23:32 ` ✓ Fi.CI.BAT: success " Patchwork
  2024-02-22  6:32 ` ✗ Fi.CI.IGT: failure " Patchwork
  6 siblings, 0 replies; 33+ messages in thread
From: Patchwork @ 2024-02-21 23:18 UTC (permalink / raw)
  To: Stanislav Lisovskiy; +Cc: intel-gfx

== Series Details ==

Series: Bigjoiner refactoring (rev8)
URL   : https://patchwork.freedesktop.org/series/128311/
State : warning

== Summary ==

Error: dim sparse failed
Sparse version: v0.6.2
Fast mode used, each commit won't be checked separately.
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:116:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:147:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:149:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:153:26: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:155:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:173:1: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:175:9: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:179:35: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:16: warning: unreplaced symbol 'oldbit'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'
+./arch/x86/include/asm/bitops.h:181:9: warning: unreplaced symbol 'return'



^ permalink raw reply	[flat|nested] 33+ messages in thread

* ✓ Fi.CI.BAT: success for Bigjoiner refactoring (rev8)
  2024-02-21 19:20 [PATCH 0/3] Bigjoiner refactoring Stanislav Lisovskiy
                   ` (4 preceding siblings ...)
  2024-02-21 23:18 ` ✗ Fi.CI.SPARSE: " Patchwork
@ 2024-02-21 23:32 ` Patchwork
  2024-02-22  6:32 ` ✗ Fi.CI.IGT: failure " Patchwork
  6 siblings, 0 replies; 33+ messages in thread
From: Patchwork @ 2024-02-21 23:32 UTC (permalink / raw)
  To: Stanislav Lisovskiy; +Cc: intel-gfx

[-- Attachment #1: Type: text/plain, Size: 2500 bytes --]

== Series Details ==

Series: Bigjoiner refactoring (rev8)
URL   : https://patchwork.freedesktop.org/series/128311/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_14311 -> Patchwork_128311v8
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/index.html

Participating hosts (38 -> 36)
------------------------------

  Missing    (2): bat-arls-2 fi-snb-2520m 

Known issues
------------

  Here are the changes found in Patchwork_128311v8 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence:
    - bat-dg2-11:         NOTRUN -> [SKIP][1] ([i915#9197]) +1 other test skip
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/bat-dg2-11/igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence.html

  
#### Possible fixes ####

  * igt@i915_pm_rpm@module-reload:
    - fi-kbl-7567u:       [CRASH][2] ([i915#9947]) -> [PASS][3]
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/fi-kbl-7567u/igt@i915_pm_rpm@module-reload.html
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/fi-kbl-7567u/igt@i915_pm_rpm@module-reload.html

  * igt@i915_selftest@live@execlists:
    - fi-bsw-nick:        [ABORT][4] ([i915#7911]) -> [PASS][5]
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/fi-bsw-nick/igt@i915_selftest@live@execlists.html
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/fi-bsw-nick/igt@i915_selftest@live@execlists.html

  
  [i915#7911]: https://gitlab.freedesktop.org/drm/intel/issues/7911
  [i915#9197]: https://gitlab.freedesktop.org/drm/intel/issues/9197
  [i915#9947]: https://gitlab.freedesktop.org/drm/intel/issues/9947


Build changes
-------------

  * Linux: CI_DRM_14311 -> Patchwork_128311v8

  CI-20190529: 20190529
  CI_DRM_14311: 06b279b4fb58a00667e47fafed72bba923d032ae @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_7720: 7720
  Patchwork_128311v8: 06b279b4fb58a00667e47fafed72bba923d032ae @ git://anongit.freedesktop.org/gfx-ci/linux


### Linux commits

00885cd760b3 drm/i915: Fix bigjoiner case for DP2.0
6701c68c1867 Start separating pipe vs transcoder set logic for bigjoiner during modeset
dd42b05e3bca drm/i915/bigjoiner: Refactor bigjoiner state readout

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/index.html

[-- Attachment #2: Type: text/html, Size: 3170 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* ✗ Fi.CI.IGT: failure for Bigjoiner refactoring (rev8)
  2024-02-21 19:20 [PATCH 0/3] Bigjoiner refactoring Stanislav Lisovskiy
                   ` (5 preceding siblings ...)
  2024-02-21 23:32 ` ✓ Fi.CI.BAT: success " Patchwork
@ 2024-02-22  6:32 ` Patchwork
  6 siblings, 0 replies; 33+ messages in thread
From: Patchwork @ 2024-02-22  6:32 UTC (permalink / raw)
  To: Stanislav Lisovskiy; +Cc: intel-gfx

[-- Attachment #1: Type: text/plain, Size: 81900 bytes --]

== Series Details ==

Series: Bigjoiner refactoring (rev8)
URL   : https://patchwork.freedesktop.org/series/128311/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_14311_full -> Patchwork_128311v8_full
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with Patchwork_128311v8_full absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in Patchwork_128311v8_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 (8 -> 8)
------------------------------

  No changes in participating hosts

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in Patchwork_128311v8_full:

### IGT changes ###

#### Possible regressions ####

  * igt@kms_color@ctm-signed@pipe-b:
    - shard-mtlp:         [PASS][1] -> [FAIL][2]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-mtlp-3/igt@kms_color@ctm-signed@pipe-b.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-5/igt@kms_color@ctm-signed@pipe-b.html

  
Known issues
------------

  Here are the changes found in Patchwork_128311v8_full that come from known issues:

### CI changes ###

#### Issues hit ####

  * boot:
    - shard-glk:          ([PASS][3], [PASS][4], [PASS][5], [PASS][6], [PASS][7], [PASS][8], [PASS][9], [PASS][10], [PASS][11], [PASS][12], [PASS][13], [PASS][14], [PASS][15], [PASS][16], [PASS][17], [PASS][18], [PASS][19], [PASS][20], [PASS][21], [PASS][22], [PASS][23], [PASS][24], [PASS][25]) -> ([PASS][26], [PASS][27], [PASS][28], [PASS][29], [PASS][30], [PASS][31], [PASS][32], [PASS][33], [PASS][34], [PASS][35], [FAIL][36], [PASS][37], [PASS][38], [PASS][39], [PASS][40], [PASS][41], [PASS][42], [PASS][43], [PASS][44], [PASS][45], [PASS][46], [PASS][47], [PASS][48]) ([i915#8293])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk7/boot.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk7/boot.html
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk5/boot.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk5/boot.html
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk5/boot.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk4/boot.html
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk4/boot.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk4/boot.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk3/boot.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk3/boot.html
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk3/boot.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk2/boot.html
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk2/boot.html
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk2/boot.html
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk1/boot.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk1/boot.html
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk1/boot.html
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk9/boot.html
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk9/boot.html
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk8/boot.html
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk8/boot.html
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk8/boot.html
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk7/boot.html
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk9/boot.html
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk9/boot.html
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk9/boot.html
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk8/boot.html
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk8/boot.html
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk8/boot.html
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk7/boot.html
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk7/boot.html
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk7/boot.html
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk5/boot.html
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk5/boot.html
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk5/boot.html
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk4/boot.html
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk4/boot.html
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk4/boot.html
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk3/boot.html
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk3/boot.html
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk2/boot.html
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk2/boot.html
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk2/boot.html
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk1/boot.html
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk1/boot.html
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk1/boot.html

  

### IGT changes ###

#### Issues hit ####

  * igt@api_intel_bb@blit-reloc-keep-cache:
    - shard-mtlp:         NOTRUN -> [SKIP][49] ([i915#8411])
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-2/igt@api_intel_bb@blit-reloc-keep-cache.html

  * igt@api_intel_bb@object-reloc-keep-cache:
    - shard-dg2:          NOTRUN -> [SKIP][50] ([i915#8411])
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@api_intel_bb@object-reloc-keep-cache.html

  * igt@device_reset@unbind-cold-reset-rebind:
    - shard-dg2:          NOTRUN -> [SKIP][51] ([i915#7701])
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-3/igt@device_reset@unbind-cold-reset-rebind.html

  * igt@drm_fdinfo@busy@bcs0:
    - shard-mtlp:         NOTRUN -> [SKIP][52] ([i915#8414]) +13 other tests skip
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-2/igt@drm_fdinfo@busy@bcs0.html

  * igt@drm_fdinfo@idle@rcs0:
    - shard-rkl:          [PASS][53] -> [FAIL][54] ([i915#7742]) +1 other test fail
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-rkl-5/igt@drm_fdinfo@idle@rcs0.html
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-1/igt@drm_fdinfo@idle@rcs0.html

  * igt@gem_bad_reloc@negative-reloc-bltcopy:
    - shard-mtlp:         NOTRUN -> [SKIP][55] ([i915#3281]) +7 other tests skip
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_bad_reloc@negative-reloc-bltcopy.html

  * igt@gem_busy@semaphore:
    - shard-dg2:          NOTRUN -> [SKIP][56] ([i915#3936])
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-3/igt@gem_busy@semaphore.html

  * igt@gem_caching@reads:
    - shard-mtlp:         NOTRUN -> [SKIP][57] ([i915#4873])
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-2/igt@gem_caching@reads.html

  * igt@gem_ccs@block-multicopy-inplace:
    - shard-mtlp:         NOTRUN -> [SKIP][58] ([i915#3555] / [i915#9323])
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_ccs@block-multicopy-inplace.html

  * igt@gem_ccs@ctrl-surf-copy-new-ctx:
    - shard-tglu:         NOTRUN -> [SKIP][59] ([i915#9323])
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@gem_ccs@ctrl-surf-copy-new-ctx.html

  * igt@gem_ccs@suspend-resume:
    - shard-rkl:          NOTRUN -> [SKIP][60] ([i915#9323])
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@gem_ccs@suspend-resume.html
    - shard-mtlp:         NOTRUN -> [SKIP][61] ([i915#9323])
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_ccs@suspend-resume.html

  * igt@gem_ccs@suspend-resume@xmajor-compressed-compfmt0-lmem0-lmem0:
    - shard-dg2:          NOTRUN -> [INCOMPLETE][62] ([i915#10137] / [i915#7297])
   [62]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-2/igt@gem_ccs@suspend-resume@xmajor-compressed-compfmt0-lmem0-lmem0.html

  * igt@gem_close_race@multigpu-basic-threads:
    - shard-mtlp:         NOTRUN -> [SKIP][63] ([i915#7697])
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-2/igt@gem_close_race@multigpu-basic-threads.html

  * igt@gem_ctx_exec@basic-nohangcheck:
    - shard-tglu:         [PASS][64] -> [FAIL][65] ([i915#6268])
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-tglu-5/igt@gem_ctx_exec@basic-nohangcheck.html
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-2/igt@gem_ctx_exec@basic-nohangcheck.html

  * igt@gem_ctx_param@set-priority-not-supported:
    - shard-mtlp:         NOTRUN -> [SKIP][66] ([fdo#109314])
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_ctx_param@set-priority-not-supported.html

  * igt@gem_ctx_persistence@heartbeat-stop:
    - shard-mtlp:         NOTRUN -> [SKIP][67] ([i915#8555])
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_ctx_persistence@heartbeat-stop.html

  * igt@gem_ctx_sseu@engines:
    - shard-mtlp:         NOTRUN -> [SKIP][68] ([i915#280])
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@gem_ctx_sseu@engines.html

  * igt@gem_eio@reset-stress:
    - shard-dg1:          [PASS][69] -> [FAIL][70] ([i915#5784])
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-dg1-12/igt@gem_eio@reset-stress.html
   [70]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg1-19/igt@gem_eio@reset-stress.html

  * igt@gem_exec_balancer@bonded-false-hang:
    - shard-dg2:          NOTRUN -> [SKIP][71] ([i915#4812]) +1 other test skip
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@gem_exec_balancer@bonded-false-hang.html

  * igt@gem_exec_balancer@bonded-semaphore:
    - shard-mtlp:         NOTRUN -> [SKIP][72] ([i915#4812])
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-2/igt@gem_exec_balancer@bonded-semaphore.html

  * igt@gem_exec_balancer@bonded-sync:
    - shard-dg2:          NOTRUN -> [SKIP][73] ([i915#4771])
   [73]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-2/igt@gem_exec_balancer@bonded-sync.html
    - shard-mtlp:         NOTRUN -> [SKIP][74] ([i915#4771])
   [74]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_exec_balancer@bonded-sync.html

  * igt@gem_exec_balancer@invalid-bonds:
    - shard-dg2:          NOTRUN -> [SKIP][75] ([i915#4036])
   [75]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-3/igt@gem_exec_balancer@invalid-bonds.html

  * igt@gem_exec_balancer@parallel-contexts:
    - shard-rkl:          NOTRUN -> [SKIP][76] ([i915#4525])
   [76]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@gem_exec_balancer@parallel-contexts.html

  * igt@gem_exec_capture@capture-invisible@smem0:
    - shard-tglu:         NOTRUN -> [SKIP][77] ([i915#6334])
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@gem_exec_capture@capture-invisible@smem0.html

  * igt@gem_exec_capture@many-4k-incremental:
    - shard-mtlp:         NOTRUN -> [FAIL][78] ([i915#9606]) +1 other test fail
   [78]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@gem_exec_capture@many-4k-incremental.html

  * igt@gem_exec_fair@basic-none-vip:
    - shard-mtlp:         NOTRUN -> [SKIP][79] ([i915#4473] / [i915#4771])
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_exec_fair@basic-none-vip.html
    - shard-dg2:          NOTRUN -> [SKIP][80] ([i915#3539] / [i915#4852]) +2 other tests skip
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-2/igt@gem_exec_fair@basic-none-vip.html

  * igt@gem_exec_fair@basic-none-vip@rcs0:
    - shard-rkl:          NOTRUN -> [FAIL][81] ([i915#2842])
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@gem_exec_fair@basic-none-vip@rcs0.html

  * igt@gem_exec_fair@basic-pace:
    - shard-dg2:          NOTRUN -> [SKIP][82] ([i915#3539])
   [82]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-3/igt@gem_exec_fair@basic-pace.html

  * igt@gem_exec_fair@basic-pace-solo@rcs0:
    - shard-tglu:         [PASS][83] -> [FAIL][84] ([i915#2842])
   [83]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-tglu-9/igt@gem_exec_fair@basic-pace-solo@rcs0.html
   [84]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-3/igt@gem_exec_fair@basic-pace-solo@rcs0.html

  * igt@gem_exec_params@rsvd2-dirt:
    - shard-mtlp:         NOTRUN -> [SKIP][85] ([i915#5107])
   [85]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-2/igt@gem_exec_params@rsvd2-dirt.html

  * igt@gem_exec_params@secure-non-root:
    - shard-tglu:         NOTRUN -> [SKIP][86] ([fdo#112283])
   [86]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@gem_exec_params@secure-non-root.html

  * igt@gem_exec_reloc@basic-gtt-read:
    - shard-dg2:          NOTRUN -> [SKIP][87] ([i915#3281]) +7 other tests skip
   [87]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-3/igt@gem_exec_reloc@basic-gtt-read.html

  * igt@gem_exec_reloc@basic-write-read-noreloc:
    - shard-rkl:          NOTRUN -> [SKIP][88] ([i915#3281])
   [88]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@gem_exec_reloc@basic-write-read-noreloc.html

  * igt@gem_exec_schedule@preempt-queue-contexts-chain:
    - shard-mtlp:         NOTRUN -> [SKIP][89] ([i915#4537] / [i915#4812])
   [89]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_exec_schedule@preempt-queue-contexts-chain.html
    - shard-dg2:          NOTRUN -> [SKIP][90] ([i915#4537] / [i915#4812]) +1 other test skip
   [90]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-2/igt@gem_exec_schedule@preempt-queue-contexts-chain.html

  * igt@gem_fence_thrash@bo-write-verify-y:
    - shard-dg2:          NOTRUN -> [SKIP][91] ([i915#4860])
   [91]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-2/igt@gem_fence_thrash@bo-write-verify-y.html

  * igt@gem_fenced_exec_thrash@no-spare-fences-interruptible:
    - shard-mtlp:         NOTRUN -> [SKIP][92] ([i915#4860]) +3 other tests skip
   [92]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_fenced_exec_thrash@no-spare-fences-interruptible.html

  * igt@gem_lmem_swapping@heavy-verify-multi:
    - shard-mtlp:         NOTRUN -> [SKIP][93] ([i915#4613]) +2 other tests skip
   [93]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@gem_lmem_swapping@heavy-verify-multi.html

  * igt@gem_lmem_swapping@heavy-verify-random-ccs:
    - shard-glk:          NOTRUN -> [SKIP][94] ([fdo#109271] / [i915#4613]) +1 other test skip
   [94]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk2/igt@gem_lmem_swapping@heavy-verify-random-ccs.html

  * igt@gem_lmem_swapping@parallel-random-engines:
    - shard-rkl:          NOTRUN -> [SKIP][95] ([i915#4613])
   [95]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@gem_lmem_swapping@parallel-random-engines.html

  * igt@gem_lmem_swapping@smem-oom@lmem0:
    - shard-dg2:          [PASS][96] -> [TIMEOUT][97] ([i915#5493])
   [96]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-dg2-5/igt@gem_lmem_swapping@smem-oom@lmem0.html
   [97]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-1/igt@gem_lmem_swapping@smem-oom@lmem0.html
    - shard-dg1:          [PASS][98] -> [TIMEOUT][99] ([i915#5493])
   [98]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-dg1-15/igt@gem_lmem_swapping@smem-oom@lmem0.html
   [99]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg1-18/igt@gem_lmem_swapping@smem-oom@lmem0.html

  * igt@gem_lmem_swapping@verify-ccs:
    - shard-tglu:         NOTRUN -> [SKIP][100] ([i915#4613]) +1 other test skip
   [100]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@gem_lmem_swapping@verify-ccs.html

  * igt@gem_media_fill@media-fill:
    - shard-mtlp:         NOTRUN -> [SKIP][101] ([i915#8289])
   [101]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_media_fill@media-fill.html

  * igt@gem_mmap@bad-size:
    - shard-dg2:          NOTRUN -> [SKIP][102] ([i915#4083]) +3 other tests skip
   [102]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@gem_mmap@bad-size.html

  * igt@gem_mmap_gtt@coherency:
    - shard-tglu:         NOTRUN -> [SKIP][103] ([fdo#111656])
   [103]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@gem_mmap_gtt@coherency.html

  * igt@gem_mmap_wc@coherency:
    - shard-mtlp:         NOTRUN -> [SKIP][104] ([i915#4083]) +7 other tests skip
   [104]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@gem_mmap_wc@coherency.html

  * igt@gem_partial_pwrite_pread@reads:
    - shard-dg2:          NOTRUN -> [SKIP][105] ([i915#3282]) +3 other tests skip
   [105]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@gem_partial_pwrite_pread@reads.html

  * igt@gem_pwrite@basic-exhaustion:
    - shard-rkl:          NOTRUN -> [SKIP][106] ([i915#3282]) +3 other tests skip
   [106]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@gem_pwrite@basic-exhaustion.html

  * igt@gem_pxp@display-protected-crc:
    - shard-tglu:         NOTRUN -> [SKIP][107] ([i915#4270])
   [107]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@gem_pxp@display-protected-crc.html

  * igt@gem_pxp@protected-raw-src-copy-not-readible:
    - shard-rkl:          NOTRUN -> [SKIP][108] ([i915#4270])
   [108]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@gem_pxp@protected-raw-src-copy-not-readible.html

  * igt@gem_pxp@reject-modify-context-protection-off-3:
    - shard-dg2:          NOTRUN -> [SKIP][109] ([i915#4270])
   [109]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@gem_pxp@reject-modify-context-protection-off-3.html

  * igt@gem_pxp@verify-pxp-stale-buf-execution:
    - shard-mtlp:         NOTRUN -> [SKIP][110] ([i915#4270]) +3 other tests skip
   [110]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_pxp@verify-pxp-stale-buf-execution.html

  * igt@gem_readwrite@new-obj:
    - shard-mtlp:         NOTRUN -> [SKIP][111] ([i915#3282]) +6 other tests skip
   [111]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_readwrite@new-obj.html

  * igt@gem_render_copy@y-tiled-to-vebox-y-tiled:
    - shard-mtlp:         NOTRUN -> [SKIP][112] ([i915#8428]) +5 other tests skip
   [112]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_render_copy@y-tiled-to-vebox-y-tiled.html

  * igt@gem_render_tiled_blits@basic:
    - shard-dg2:          NOTRUN -> [SKIP][113] ([i915#4079])
   [113]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-2/igt@gem_render_tiled_blits@basic.html

  * igt@gem_softpin@evict-snoop-interruptible:
    - shard-dg2:          NOTRUN -> [SKIP][114] ([i915#4885]) +1 other test skip
   [114]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@gem_softpin@evict-snoop-interruptible.html

  * igt@gem_tiled_partial_pwrite_pread@writes:
    - shard-dg2:          NOTRUN -> [SKIP][115] ([i915#4077]) +12 other tests skip
   [115]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@gem_tiled_partial_pwrite_pread@writes.html

  * igt@gem_tiled_pread_basic:
    - shard-mtlp:         NOTRUN -> [SKIP][116] ([i915#4079]) +2 other tests skip
   [116]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_tiled_pread_basic.html

  * igt@gem_tiling_max_stride:
    - shard-mtlp:         NOTRUN -> [SKIP][117] ([i915#4077]) +10 other tests skip
   [117]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_tiling_max_stride.html

  * igt@gem_userptr_blits@access-control:
    - shard-mtlp:         NOTRUN -> [SKIP][118] ([i915#3297]) +5 other tests skip
   [118]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gem_userptr_blits@access-control.html
    - shard-dg2:          NOTRUN -> [SKIP][119] ([i915#3297])
   [119]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-2/igt@gem_userptr_blits@access-control.html
    - shard-rkl:          NOTRUN -> [SKIP][120] ([i915#3297])
   [120]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@gem_userptr_blits@access-control.html

  * igt@gen7_exec_parse@chained-batch:
    - shard-mtlp:         NOTRUN -> [SKIP][121] ([fdo#109289]) +2 other tests skip
   [121]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@gen7_exec_parse@chained-batch.html

  * igt@gen9_exec_parse@allowed-all:
    - shard-mtlp:         NOTRUN -> [SKIP][122] ([i915#2856]) +2 other tests skip
   [122]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@gen9_exec_parse@allowed-all.html

  * igt@gen9_exec_parse@allowed-single:
    - shard-dg2:          NOTRUN -> [SKIP][123] ([i915#2856]) +1 other test skip
   [123]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-2/igt@gen9_exec_parse@allowed-single.html
    - shard-rkl:          NOTRUN -> [SKIP][124] ([i915#2527])
   [124]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@gen9_exec_parse@allowed-single.html

  * igt@gen9_exec_parse@bb-chained:
    - shard-tglu:         NOTRUN -> [SKIP][125] ([i915#2527] / [i915#2856]) +1 other test skip
   [125]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@gen9_exec_parse@bb-chained.html

  * igt@i915_module_load@load:
    - shard-mtlp:         NOTRUN -> [SKIP][126] ([i915#6227])
   [126]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@i915_module_load@load.html

  * igt@i915_module_load@reload-with-fault-injection:
    - shard-rkl:          [PASS][127] -> [INCOMPLETE][128] ([i915#10137] / [i915#9849])
   [127]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-rkl-7/igt@i915_module_load@reload-with-fault-injection.html
   [128]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@i915_module_load@reload-with-fault-injection.html
    - shard-tglu:         [PASS][129] -> [INCOMPLETE][130] ([i915#10137] / [i915#9200])
   [129]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-tglu-4/igt@i915_module_load@reload-with-fault-injection.html
   [130]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-3/igt@i915_module_load@reload-with-fault-injection.html
    - shard-dg2:          [PASS][131] -> [INCOMPLETE][132] ([i915#10137] / [i915#9820] / [i915#9849])
   [131]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-dg2-10/igt@i915_module_load@reload-with-fault-injection.html
   [132]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-6/igt@i915_module_load@reload-with-fault-injection.html

  * igt@i915_pm_freq_mult@media-freq@gt0:
    - shard-rkl:          NOTRUN -> [SKIP][133] ([i915#6590])
   [133]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@i915_pm_freq_mult@media-freq@gt0.html

  * igt@i915_pm_freq_mult@media-freq@gt1:
    - shard-mtlp:         NOTRUN -> [SKIP][134] ([i915#6590]) +1 other test skip
   [134]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@i915_pm_freq_mult@media-freq@gt1.html

  * igt@i915_pm_rps@min-max-config-loaded:
    - shard-mtlp:         NOTRUN -> [SKIP][135] ([i915#6621])
   [135]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-2/igt@i915_pm_rps@min-max-config-loaded.html

  * igt@i915_pm_rps@reset:
    - shard-snb:          [PASS][136] -> [INCOMPLETE][137] ([i915#10137] / [i915#7790])
   [136]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-snb5/igt@i915_pm_rps@reset.html
   [137]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-snb6/igt@i915_pm_rps@reset.html

  * igt@i915_query@query-topology-known-pci-ids:
    - shard-mtlp:         NOTRUN -> [SKIP][138] ([fdo#109303])
   [138]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@i915_query@query-topology-known-pci-ids.html

  * igt@i915_suspend@basic-s3-without-i915:
    - shard-mtlp:         NOTRUN -> [SKIP][139] ([i915#6645])
   [139]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@i915_suspend@basic-s3-without-i915.html

  * igt@intel_hwmon@hwmon-read:
    - shard-tglu:         NOTRUN -> [SKIP][140] ([i915#7707])
   [140]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@intel_hwmon@hwmon-read.html

  * igt@kms_addfb_basic@addfb25-x-tiled-mismatch-legacy:
    - shard-mtlp:         NOTRUN -> [SKIP][141] ([i915#4212]) +1 other test skip
   [141]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_addfb_basic@addfb25-x-tiled-mismatch-legacy.html

  * igt@kms_addfb_basic@basic-x-tiled-legacy:
    - shard-dg2:          NOTRUN -> [SKIP][142] ([i915#4212]) +2 other tests skip
   [142]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-3/igt@kms_addfb_basic@basic-x-tiled-legacy.html

  * igt@kms_async_flips@invalid-async-flip:
    - shard-mtlp:         NOTRUN -> [SKIP][143] ([i915#6228])
   [143]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-2/igt@kms_async_flips@invalid-async-flip.html

  * igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels:
    - shard-glk:          NOTRUN -> [SKIP][144] ([fdo#109271] / [i915#1769])
   [144]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk2/igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels.html

  * igt@kms_big_fb@4-tiled-8bpp-rotate-0:
    - shard-rkl:          NOTRUN -> [SKIP][145] ([i915#5286]) +1 other test skip
   [145]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@kms_big_fb@4-tiled-8bpp-rotate-0.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0:
    - shard-tglu:         NOTRUN -> [SKIP][146] ([fdo#111615] / [i915#5286])
   [146]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip:
    - shard-mtlp:         [PASS][147] -> [FAIL][148] ([i915#5138])
   [147]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-mtlp-5/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip.html
   [148]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-6/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip.html

  * igt@kms_big_fb@linear-32bpp-rotate-270:
    - shard-tglu:         NOTRUN -> [SKIP][149] ([fdo#111614]) +1 other test skip
   [149]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@kms_big_fb@linear-32bpp-rotate-270.html

  * igt@kms_big_fb@x-tiled-16bpp-rotate-270:
    - shard-dg2:          NOTRUN -> [SKIP][150] ([fdo#111614])
   [150]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_big_fb@x-tiled-16bpp-rotate-270.html

  * igt@kms_big_fb@x-tiled-64bpp-rotate-90:
    - shard-mtlp:         NOTRUN -> [SKIP][151] ([fdo#111614]) +2 other tests skip
   [151]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@kms_big_fb@x-tiled-64bpp-rotate-90.html

  * igt@kms_big_fb@y-tiled-32bpp-rotate-180:
    - shard-mtlp:         NOTRUN -> [SKIP][152] ([fdo#111615]) +9 other tests skip
   [152]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_big_fb@y-tiled-32bpp-rotate-180.html

  * igt@kms_big_fb@y-tiled-8bpp-rotate-180:
    - shard-dg2:          NOTRUN -> [SKIP][153] ([i915#4538] / [i915#5190]) +5 other tests skip
   [153]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-2/igt@kms_big_fb@y-tiled-8bpp-rotate-180.html

  * igt@kms_big_fb@y-tiled-addfb-size-offset-overflow:
    - shard-dg2:          NOTRUN -> [SKIP][154] ([i915#5190]) +4 other tests skip
   [154]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_big_fb@y-tiled-addfb-size-offset-overflow.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip:
    - shard-tglu:         [PASS][155] -> [FAIL][156] ([i915#3743]) +1 other test fail
   [155]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-tglu-5/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html
   [156]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-6/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html

  * igt@kms_big_fb@yf-tiled-64bpp-rotate-0:
    - shard-tglu:         NOTRUN -> [SKIP][157] ([fdo#111615]) +2 other tests skip
   [157]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@kms_big_fb@yf-tiled-64bpp-rotate-0.html

  * igt@kms_big_fb@yf-tiled-8bpp-rotate-90:
    - shard-rkl:          NOTRUN -> [SKIP][158] ([fdo#110723]) +1 other test skip
   [158]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@kms_big_fb@yf-tiled-8bpp-rotate-90.html

  * igt@kms_big_fb@yf-tiled-addfb:
    - shard-mtlp:         NOTRUN -> [SKIP][159] ([i915#6187]) +1 other test skip
   [159]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-2/igt@kms_big_fb@yf-tiled-addfb.html

  * igt@kms_ccs@pipe-b-crc-primary-rotation-180-4-tiled-dg2-mc-ccs:
    - shard-rkl:          NOTRUN -> [SKIP][160] ([i915#5354] / [i915#6095]) +5 other tests skip
   [160]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@kms_ccs@pipe-b-crc-primary-rotation-180-4-tiled-dg2-mc-ccs.html

  * igt@kms_ccs@pipe-b-random-ccs-data-y-tiled-gen12-rc-ccs-cc:
    - shard-mtlp:         NOTRUN -> [SKIP][161] ([i915#5354] / [i915#6095]) +41 other tests skip
   [161]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-2/igt@kms_ccs@pipe-b-random-ccs-data-y-tiled-gen12-rc-ccs-cc.html

  * igt@kms_ccs@pipe-c-crc-primary-rotation-180-4-tiled-mtl-mc-ccs:
    - shard-glk:          NOTRUN -> [SKIP][162] ([fdo#109271]) +123 other tests skip
   [162]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk1/igt@kms_ccs@pipe-c-crc-primary-rotation-180-4-tiled-mtl-mc-ccs.html

  * igt@kms_ccs@pipe-d-bad-rotation-90-y-tiled-ccs:
    - shard-tglu:         NOTRUN -> [SKIP][163] ([i915#5354] / [i915#6095]) +24 other tests skip
   [163]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@kms_ccs@pipe-d-bad-rotation-90-y-tiled-ccs.html

  * igt@kms_ccs@pipe-d-random-ccs-data-y-tiled-gen12-rc-ccs-cc:
    - shard-rkl:          NOTRUN -> [SKIP][164] ([i915#5354]) +6 other tests skip
   [164]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@kms_ccs@pipe-d-random-ccs-data-y-tiled-gen12-rc-ccs-cc.html

  * igt@kms_cdclk@mode-transition-all-outputs:
    - shard-tglu:         NOTRUN -> [SKIP][165] ([i915#3742])
   [165]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@kms_cdclk@mode-transition-all-outputs.html

  * igt@kms_cdclk@mode-transition@pipe-d-hdmi-a-1:
    - shard-dg2:          NOTRUN -> [SKIP][166] ([i915#7213]) +3 other tests skip
   [166]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_cdclk@mode-transition@pipe-d-hdmi-a-1.html

  * igt@kms_chamelium_color@ctm-0-25:
    - shard-tglu:         NOTRUN -> [SKIP][167] ([fdo#111827]) +1 other test skip
   [167]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@kms_chamelium_color@ctm-0-25.html

  * igt@kms_chamelium_color@gamma:
    - shard-mtlp:         NOTRUN -> [SKIP][168] ([fdo#111827]) +2 other tests skip
   [168]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_chamelium_color@gamma.html

  * igt@kms_chamelium_edid@dp-edid-stress-resolution-non-4k:
    - shard-dg2:          NOTRUN -> [SKIP][169] ([i915#7828]) +5 other tests skip
   [169]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-2/igt@kms_chamelium_edid@dp-edid-stress-resolution-non-4k.html
    - shard-rkl:          NOTRUN -> [SKIP][170] ([i915#7828]) +1 other test skip
   [170]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@kms_chamelium_edid@dp-edid-stress-resolution-non-4k.html

  * igt@kms_chamelium_hpd@dp-hpd-for-each-pipe:
    - shard-mtlp:         NOTRUN -> [SKIP][171] ([i915#7828]) +5 other tests skip
   [171]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_chamelium_hpd@dp-hpd-for-each-pipe.html

  * igt@kms_chamelium_hpd@vga-hpd-with-enabled-mode:
    - shard-tglu:         NOTRUN -> [SKIP][172] ([i915#7828]) +3 other tests skip
   [172]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@kms_chamelium_hpd@vga-hpd-with-enabled-mode.html

  * igt@kms_content_protection@atomic:
    - shard-mtlp:         NOTRUN -> [SKIP][173] ([i915#6944] / [i915#9424])
   [173]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-2/igt@kms_content_protection@atomic.html

  * igt@kms_content_protection@content-type-change:
    - shard-tglu:         NOTRUN -> [SKIP][174] ([i915#6944] / [i915#9424])
   [174]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@kms_content_protection@content-type-change.html

  * igt@kms_cursor_crc@cursor-offscreen-128x42:
    - shard-mtlp:         NOTRUN -> [SKIP][175] ([i915#8814]) +2 other tests skip
   [175]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@kms_cursor_crc@cursor-offscreen-128x42.html

  * igt@kms_cursor_crc@cursor-offscreen-512x170:
    - shard-mtlp:         NOTRUN -> [SKIP][176] ([i915#3359]) +1 other test skip
   [176]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_cursor_crc@cursor-offscreen-512x170.html
    - shard-rkl:          NOTRUN -> [SKIP][177] ([fdo#109279] / [i915#3359])
   [177]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@kms_cursor_crc@cursor-offscreen-512x170.html

  * igt@kms_cursor_crc@cursor-random-32x10:
    - shard-mtlp:         NOTRUN -> [SKIP][178] ([i915#3555] / [i915#8814]) +1 other test skip
   [178]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_cursor_crc@cursor-random-32x10.html

  * igt@kms_cursor_crc@cursor-random-512x512:
    - shard-tglu:         NOTRUN -> [SKIP][179] ([i915#3359])
   [179]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@kms_cursor_crc@cursor-random-512x512.html

  * igt@kms_cursor_crc@cursor-rapid-movement-32x32:
    - shard-rkl:          NOTRUN -> [SKIP][180] ([i915#3555]) +4 other tests skip
   [180]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@kms_cursor_crc@cursor-rapid-movement-32x32.html

  * igt@kms_cursor_crc@cursor-sliding-32x32:
    - shard-tglu:         NOTRUN -> [SKIP][181] ([i915#3555]) +3 other tests skip
   [181]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@kms_cursor_crc@cursor-sliding-32x32.html

  * igt@kms_cursor_crc@cursor-sliding-512x512:
    - shard-dg2:          NOTRUN -> [SKIP][182] ([i915#3359])
   [182]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-3/igt@kms_cursor_crc@cursor-sliding-512x512.html

  * igt@kms_cursor_legacy@2x-long-cursor-vs-flip-atomic:
    - shard-mtlp:         NOTRUN -> [SKIP][183] ([i915#9809]) +3 other tests skip
   [183]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@kms_cursor_legacy@2x-long-cursor-vs-flip-atomic.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic:
    - shard-mtlp:         NOTRUN -> [SKIP][184] ([i915#4213])
   [184]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-2/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-legacy:
    - shard-rkl:          NOTRUN -> [SKIP][185] ([fdo#111825]) +2 other tests skip
   [185]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@kms_cursor_legacy@cursorb-vs-flipa-legacy.html

  * igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size:
    - shard-dg2:          NOTRUN -> [SKIP][186] ([fdo#109274] / [i915#5354]) +2 other tests skip
   [186]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@cursorb-vs-flipb-legacy:
    - shard-tglu:         NOTRUN -> [SKIP][187] ([fdo#109274])
   [187]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@kms_cursor_legacy@cursorb-vs-flipb-legacy.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size:
    - shard-glk:          NOTRUN -> [FAIL][188] ([i915#2346])
   [188]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk2/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle:
    - shard-dg2:          NOTRUN -> [SKIP][189] ([i915#4103] / [i915#4213])
   [189]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle.html

  * igt@kms_dirtyfb@drrs-dirtyfb-ioctl:
    - shard-tglu:         NOTRUN -> [SKIP][190] ([i915#9723])
   [190]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@kms_dirtyfb@drrs-dirtyfb-ioctl.html

  * igt@kms_dirtyfb@fbc-dirtyfb-ioctl@a-hdmi-a-2:
    - shard-rkl:          NOTRUN -> [SKIP][191] ([fdo#110189] / [i915#9723])
   [191]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-1/igt@kms_dirtyfb@fbc-dirtyfb-ioctl@a-hdmi-a-2.html

  * igt@kms_dither@fb-8bpc-vs-panel-8bpc:
    - shard-dg2:          NOTRUN -> [SKIP][192] ([i915#3555]) +7 other tests skip
   [192]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_dither@fb-8bpc-vs-panel-8bpc.html

  * igt@kms_dsc@dsc-with-output-formats:
    - shard-mtlp:         NOTRUN -> [SKIP][193] ([i915#3555] / [i915#3840])
   [193]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_dsc@dsc-with-output-formats.html

  * igt@kms_fbcon_fbt@psr-suspend:
    - shard-rkl:          NOTRUN -> [SKIP][194] ([i915#3955])
   [194]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@kms_fbcon_fbt@psr-suspend.html
    - shard-dg2:          NOTRUN -> [SKIP][195] ([i915#3469])
   [195]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-2/igt@kms_fbcon_fbt@psr-suspend.html

  * igt@kms_feature_discovery@chamelium:
    - shard-tglu:         NOTRUN -> [SKIP][196] ([i915#2065] / [i915#4854])
   [196]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@kms_feature_discovery@chamelium.html

  * igt@kms_feature_discovery@display-2x:
    - shard-mtlp:         NOTRUN -> [SKIP][197] ([i915#1839]) +1 other test skip
   [197]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@kms_feature_discovery@display-2x.html

  * igt@kms_fence_pin_leak:
    - shard-dg2:          NOTRUN -> [SKIP][198] ([i915#4881])
   [198]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-3/igt@kms_fence_pin_leak.html

  * igt@kms_flip@2x-flip-vs-blocking-wf-vblank:
    - shard-tglu:         NOTRUN -> [SKIP][199] ([fdo#109274] / [fdo#111767] / [i915#3637])
   [199]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@kms_flip@2x-flip-vs-blocking-wf-vblank.html

  * igt@kms_flip@2x-flip-vs-modeset-vs-hang:
    - shard-dg2:          NOTRUN -> [SKIP][200] ([fdo#109274]) +3 other tests skip
   [200]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-3/igt@kms_flip@2x-flip-vs-modeset-vs-hang.html

  * igt@kms_flip@2x-flip-vs-suspend:
    - shard-mtlp:         NOTRUN -> [SKIP][201] ([i915#3637]) +7 other tests skip
   [201]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_flip@2x-flip-vs-suspend.html

  * igt@kms_flip@2x-plain-flip:
    - shard-tglu:         NOTRUN -> [SKIP][202] ([fdo#109274] / [i915#3637]) +3 other tests skip
   [202]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@kms_flip@2x-plain-flip.html

  * igt@kms_flip@flip-vs-fences:
    - shard-dg2:          NOTRUN -> [SKIP][203] ([i915#8381]) +1 other test skip
   [203]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-3/igt@kms_flip@flip-vs-fences.html

  * igt@kms_flip@flip-vs-suspend@a-hdmi-a3:
    - shard-dg2:          NOTRUN -> [INCOMPLETE][204] ([i915#4839])
   [204]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-5/igt@kms_flip@flip-vs-suspend@a-hdmi-a3.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-valid-mode:
    - shard-dg2:          NOTRUN -> [SKIP][205] ([i915#2672]) +3 other tests skip
   [205]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-3/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-upscaling@pipe-a-valid-mode:
    - shard-tglu:         NOTRUN -> [SKIP][206] ([i915#2587] / [i915#2672]) +1 other test skip
   [206]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-default-mode:
    - shard-mtlp:         NOTRUN -> [SKIP][207] ([i915#2672]) +3 other tests skip
   [207]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode:
    - shard-rkl:          NOTRUN -> [SKIP][208] ([i915#2672]) +1 other test skip
   [208]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-valid-mode:
    - shard-dg2:          NOTRUN -> [SKIP][209] ([i915#2672] / [i915#3555])
   [209]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling@pipe-a-default-mode:
    - shard-mtlp:         NOTRUN -> [SKIP][210] ([i915#2672] / [i915#3555]) +1 other test skip
   [210]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling@pipe-a-default-mode.html

  * igt@kms_force_connector_basic@force-load-detect:
    - shard-mtlp:         NOTRUN -> [SKIP][211] ([fdo#109285])
   [211]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@kms_force_connector_basic@force-load-detect.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-plflip-blt:
    - shard-dg2:          [PASS][212] -> [FAIL][213] ([i915#6880])
   [212]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-dg2-5/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-plflip-blt.html
   [213]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-move:
    - shard-mtlp:         NOTRUN -> [SKIP][214] ([i915#1825]) +31 other tests skip
   [214]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-move.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-cpu:
    - shard-snb:          [PASS][215] -> [SKIP][216] ([fdo#109271]) +7 other tests skip
   [215]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-snb7/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-cpu.html
   [216]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-snb5/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-cpu.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-gtt:
    - shard-mtlp:         NOTRUN -> [SKIP][217] ([i915#8708]) +12 other tests skip
   [217]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-pwrite:
    - shard-dg2:          NOTRUN -> [SKIP][218] ([i915#5354]) +41 other tests skip
   [218]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-render:
    - shard-tglu:         NOTRUN -> [SKIP][219] ([fdo#109280]) +16 other tests skip
   [219]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-render:
    - shard-dg2:          NOTRUN -> [SKIP][220] ([i915#3458]) +10 other tests skip
   [220]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-shrfb-draw-mmap-gtt:
    - shard-dg2:          NOTRUN -> [SKIP][221] ([i915#8708]) +8 other tests skip
   [221]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-shrfb-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-shrfb-draw-mmap-wc:
    - shard-mtlp:         NOTRUN -> [SKIP][222] ([fdo#111767] / [i915#1825]) +1 other test skip
   [222]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-pwrite:
    - shard-rkl:          NOTRUN -> [SKIP][223] ([i915#3023]) +5 other tests skip
   [223]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-pwrite:
    - shard-tglu:         NOTRUN -> [SKIP][224] ([fdo#110189]) +6 other tests skip
   [224]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-draw-blt:
    - shard-rkl:          NOTRUN -> [SKIP][225] ([fdo#111825] / [i915#1825]) +6 other tests skip
   [225]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-onoff:
    - shard-dg2:          NOTRUN -> [SKIP][226] ([fdo#111767] / [i915#5354]) +3 other tests skip
   [226]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-2/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-onoff.html
    - shard-rkl:          NOTRUN -> [SKIP][227] ([fdo#111767] / [fdo#111825] / [i915#1825]) +1 other test skip
   [227]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-onoff.html

  * igt@kms_hdr@bpc-switch:
    - shard-rkl:          NOTRUN -> [SKIP][228] ([i915#3555] / [i915#8228])
   [228]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@kms_hdr@bpc-switch.html

  * igt@kms_hdr@invalid-metadata-sizes:
    - shard-dg2:          NOTRUN -> [SKIP][229] ([i915#3555] / [i915#8228]) +2 other tests skip
   [229]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_hdr@invalid-metadata-sizes.html

  * igt@kms_hdr@static-toggle-dpms:
    - shard-tglu:         NOTRUN -> [SKIP][230] ([i915#3555] / [i915#8228])
   [230]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@kms_hdr@static-toggle-dpms.html

  * igt@kms_multipipe_modeset@basic-max-pipe-crc-check:
    - shard-tglu:         NOTRUN -> [SKIP][231] ([i915#1839])
   [231]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html

  * igt@kms_pipe_b_c_ivb@from-pipe-c-to-b-with-3-lanes:
    - shard-tglu:         NOTRUN -> [SKIP][232] ([fdo#109289]) +1 other test skip
   [232]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@kms_pipe_b_c_ivb@from-pipe-c-to-b-with-3-lanes.html

  * igt@kms_plane_lowres@tiling-x@pipe-a-edp-1:
    - shard-mtlp:         NOTRUN -> [SKIP][233] ([i915#3582]) +7 other tests skip
   [233]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-2/igt@kms_plane_lowres@tiling-x@pipe-a-edp-1.html

  * igt@kms_plane_multiple@tiling-y:
    - shard-mtlp:         NOTRUN -> [SKIP][234] ([i915#3555] / [i915#8806])
   [234]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@kms_plane_multiple@tiling-y.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-25-with-modifiers@pipe-a-hdmi-a-2:
    - shard-dg2:          NOTRUN -> [SKIP][235] ([i915#9423]) +3 other tests skip
   [235]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-3/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-modifiers@pipe-a-hdmi-a-2.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-75-with-rotation@pipe-c-hdmi-a-4:
    - shard-dg1:          NOTRUN -> [SKIP][236] ([i915#9423]) +19 other tests skip
   [236]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg1-19/igt@kms_plane_scaling@plane-downscale-factor-0-75-with-rotation@pipe-c-hdmi-a-4.html

  * igt@kms_plane_scaling@plane-scaler-unity-scaling-with-rotation@pipe-b-hdmi-a-1:
    - shard-rkl:          NOTRUN -> [SKIP][237] ([i915#9423]) +9 other tests skip
   [237]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-5/igt@kms_plane_scaling@plane-scaler-unity-scaling-with-rotation@pipe-b-hdmi-a-1.html

  * igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation@pipe-a-hdmi-a-3:
    - shard-dg1:          NOTRUN -> [SKIP][238] ([i915#5176] / [i915#9423]) +3 other tests skip
   [238]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg1-13/igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation@pipe-a-hdmi-a-3.html

  * igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation@pipe-b-hdmi-a-2:
    - shard-rkl:          NOTRUN -> [SKIP][239] ([i915#5176] / [i915#9423]) +1 other test skip
   [239]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-1/igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation@pipe-b-hdmi-a-2.html

  * igt@kms_plane_scaling@plane-upscale-20x20-with-rotation@pipe-d-hdmi-a-1:
    - shard-tglu:         NOTRUN -> [SKIP][240] ([i915#9423]) +3 other tests skip
   [240]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@kms_plane_scaling@plane-upscale-20x20-with-rotation@pipe-d-hdmi-a-1.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling@pipe-b-hdmi-a-3:
    - shard-dg2:          NOTRUN -> [SKIP][241] ([i915#5235] / [i915#9423]) +7 other tests skip
   [241]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-5/igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling@pipe-b-hdmi-a-3.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-b-hdmi-a-2:
    - shard-rkl:          NOTRUN -> [SKIP][242] ([i915#5235]) +5 other tests skip
   [242]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-1/igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-b-hdmi-a-2.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25@pipe-c-hdmi-a-1:
    - shard-tglu:         NOTRUN -> [SKIP][243] ([i915#5235]) +3 other tests skip
   [243]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@kms_plane_scaling@planes-downscale-factor-0-25@pipe-c-hdmi-a-1.html

  * igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-5@pipe-d-edp-1:
    - shard-mtlp:         NOTRUN -> [SKIP][244] ([i915#5235]) +13 other tests skip
   [244]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-5@pipe-d-edp-1.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25@pipe-a-hdmi-a-2:
    - shard-dg2:          NOTRUN -> [SKIP][245] ([i915#5235] / [i915#9423] / [i915#9728]) +3 other tests skip
   [245]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-3/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25@pipe-a-hdmi-a-2.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25@pipe-c-hdmi-a-3:
    - shard-dg1:          NOTRUN -> [SKIP][246] ([i915#5235]) +11 other tests skip
   [246]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg1-12/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25@pipe-c-hdmi-a-3.html

  * igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-75@pipe-d-edp-1:
    - shard-mtlp:         NOTRUN -> [SKIP][247] ([i915#3555] / [i915#5235]) +1 other test skip
   [247]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-75@pipe-d-edp-1.html

  * igt@kms_pm_dc@dc3co-vpb-simulation:
    - shard-tglu:         NOTRUN -> [SKIP][248] ([i915#9685])
   [248]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@kms_pm_dc@dc3co-vpb-simulation.html

  * igt@kms_pm_rpm@modeset-lpsp-stress-no-wait:
    - shard-rkl:          [PASS][249] -> [SKIP][250] ([i915#9519]) +1 other test skip
   [249]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-rkl-4/igt@kms_pm_rpm@modeset-lpsp-stress-no-wait.html
   [250]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-1/igt@kms_pm_rpm@modeset-lpsp-stress-no-wait.html

  * igt@kms_pm_rpm@modeset-pc8-residency-stress:
    - shard-dg2:          NOTRUN -> [SKIP][251] ([fdo#109293] / [fdo#109506])
   [251]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_pm_rpm@modeset-pc8-residency-stress.html

  * igt@kms_prime@d3hot:
    - shard-tglu:         NOTRUN -> [SKIP][252] ([i915#6524])
   [252]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@kms_prime@d3hot.html

  * igt@kms_psr2_sf@cursor-plane-update-sf:
    - shard-tglu:         NOTRUN -> [SKIP][253] ([fdo#111068] / [i915#9683])
   [253]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@kms_psr2_sf@cursor-plane-update-sf.html

  * igt@kms_psr2_sf@overlay-plane-update-sf-dmg-area:
    - shard-dg2:          NOTRUN -> [SKIP][254] ([i915#9683]) +1 other test skip
   [254]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_psr2_sf@overlay-plane-update-sf-dmg-area.html

  * igt@kms_psr2_su@frontbuffer-xrgb8888:
    - shard-mtlp:         NOTRUN -> [SKIP][255] ([i915#4348])
   [255]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-2/igt@kms_psr2_su@frontbuffer-xrgb8888.html

  * igt@kms_rotation_crc@bad-tiling:
    - shard-mtlp:         NOTRUN -> [SKIP][256] ([i915#4235]) +2 other tests skip
   [256]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_rotation_crc@bad-tiling.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180:
    - shard-mtlp:         NOTRUN -> [SKIP][257] ([i915#5289])
   [257]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180.html

  * igt@kms_setmode@invalid-clone-single-crtc:
    - shard-mtlp:         NOTRUN -> [SKIP][258] ([i915#3555] / [i915#8809]) +1 other test skip
   [258]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_setmode@invalid-clone-single-crtc.html

  * igt@kms_tv_load_detect@load-detect:
    - shard-dg2:          NOTRUN -> [SKIP][259] ([fdo#109309])
   [259]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_tv_load_detect@load-detect.html

  * igt@kms_vrr@flip-suspend:
    - shard-mtlp:         NOTRUN -> [SKIP][260] ([i915#3555] / [i915#8808])
   [260]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@kms_vrr@flip-suspend.html

  * igt@kms_writeback@writeback-check-output-xrgb2101010:
    - shard-dg2:          NOTRUN -> [SKIP][261] ([i915#2437] / [i915#9412])
   [261]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_writeback@writeback-check-output-xrgb2101010.html

  * igt@kms_writeback@writeback-fb-id:
    - shard-tglu:         NOTRUN -> [SKIP][262] ([i915#2437])
   [262]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@kms_writeback@writeback-fb-id.html

  * igt@perf@global-sseu-config:
    - shard-mtlp:         NOTRUN -> [SKIP][263] ([i915#7387])
   [263]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@perf@global-sseu-config.html

  * igt@perf@per-context-mode-unprivileged:
    - shard-dg2:          NOTRUN -> [SKIP][264] ([fdo#109289]) +1 other test skip
   [264]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-3/igt@perf@per-context-mode-unprivileged.html

  * igt@perf_pmu@cpu-hotplug:
    - shard-mtlp:         NOTRUN -> [SKIP][265] ([i915#8850])
   [265]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@perf_pmu@cpu-hotplug.html
    - shard-rkl:          NOTRUN -> [SKIP][266] ([i915#8850])
   [266]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@perf_pmu@cpu-hotplug.html

  * igt@perf_pmu@event-wait@rcs0:
    - shard-dg2:          NOTRUN -> [SKIP][267] ([fdo#112283])
   [267]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@perf_pmu@event-wait@rcs0.html

  * igt@prime_vgem@basic-gtt:
    - shard-mtlp:         NOTRUN -> [SKIP][268] ([i915#3708] / [i915#4077])
   [268]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@prime_vgem@basic-gtt.html

  * igt@prime_vgem@coherency-gtt:
    - shard-tglu:         NOTRUN -> [SKIP][269] ([fdo#109295] / [fdo#111656])
   [269]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@prime_vgem@coherency-gtt.html

  * igt@syncobj_timeline@invalid-wait-zero-handles:
    - shard-mtlp:         NOTRUN -> [FAIL][270] ([i915#9781])
   [270]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@syncobj_timeline@invalid-wait-zero-handles.html

  * igt@syncobj_wait@invalid-wait-zero-handles:
    - shard-tglu:         NOTRUN -> [FAIL][271] ([i915#9779])
   [271]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@syncobj_wait@invalid-wait-zero-handles.html

  * igt@v3d/v3d_get_param@base-params:
    - shard-mtlp:         NOTRUN -> [SKIP][272] ([i915#2575]) +10 other tests skip
   [272]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-1/igt@v3d/v3d_get_param@base-params.html

  * igt@v3d/v3d_submit_cl@bad-flag:
    - shard-tglu:         NOTRUN -> [SKIP][273] ([fdo#109315] / [i915#2575]) +5 other tests skip
   [273]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-5/igt@v3d/v3d_submit_cl@bad-flag.html

  * igt@v3d/v3d_submit_cl@bad-multisync-out-sync:
    - shard-dg2:          NOTRUN -> [SKIP][274] ([i915#2575]) +5 other tests skip
   [274]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@v3d/v3d_submit_cl@bad-multisync-out-sync.html

  * igt@v3d/v3d_wait_bo@unused-bo-0ns:
    - shard-rkl:          NOTRUN -> [SKIP][275] ([fdo#109315]) +2 other tests skip
   [275]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@v3d/v3d_wait_bo@unused-bo-0ns.html

  * igt@vc4/vc4_label_bo@set-label:
    - shard-rkl:          NOTRUN -> [SKIP][276] ([i915#7711]) +1 other test skip
   [276]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-7/igt@vc4/vc4_label_bo@set-label.html

  * igt@vc4/vc4_purgeable_bo@access-purgeable-bo-mem:
    - shard-tglu:         NOTRUN -> [SKIP][277] ([i915#2575]) +3 other tests skip
   [277]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@vc4/vc4_purgeable_bo@access-purgeable-bo-mem.html

  * igt@vc4/vc4_purgeable_bo@mark-unpurgeable-check-retained:
    - shard-dg2:          NOTRUN -> [SKIP][278] ([i915#7711]) +5 other tests skip
   [278]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-2/igt@vc4/vc4_purgeable_bo@mark-unpurgeable-check-retained.html

  * igt@vc4/vc4_wait_bo@used-bo-0ns:
    - shard-mtlp:         NOTRUN -> [SKIP][279] ([i915#7711]) +5 other tests skip
   [279]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-8/igt@vc4/vc4_wait_bo@used-bo-0ns.html

  
#### Possible fixes ####

  * igt@drm_fdinfo@virtual-idle:
    - shard-rkl:          [FAIL][280] ([i915#7742]) -> [PASS][281]
   [280]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-rkl-1/igt@drm_fdinfo@virtual-idle.html
   [281]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-5/igt@drm_fdinfo@virtual-idle.html

  * igt@gem_eio@hibernate:
    - shard-tglu:         [ABORT][282] ([i915#10030] / [i915#7975] / [i915#8213]) -> [PASS][283]
   [282]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-tglu-10/igt@gem_eio@hibernate.html
   [283]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@gem_eio@hibernate.html

  * igt@gem_exec_suspend@basic-s0@smem:
    - shard-dg2:          [INCOMPLETE][284] ([i915#9275]) -> [PASS][285]
   [284]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-dg2-6/igt@gem_exec_suspend@basic-s0@smem.html
   [285]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-3/igt@gem_exec_suspend@basic-s0@smem.html

  * igt@gen9_exec_parse@allowed-single:
    - shard-glk:          [ABORT][286] ([i915#5566]) -> [PASS][287]
   [286]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-glk1/igt@gen9_exec_parse@allowed-single.html
   [287]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-glk3/igt@gen9_exec_parse@allowed-single.html

  * igt@i915_module_load@reload-with-fault-injection:
    - shard-mtlp:         [ABORT][288] ([i915#10131] / [i915#9820]) -> [PASS][289]
   [288]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-mtlp-8/igt@i915_module_load@reload-with-fault-injection.html
   [289]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-2/igt@i915_module_load@reload-with-fault-injection.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180-async-flip:
    - shard-tglu:         [FAIL][290] ([i915#3743]) -> [PASS][291]
   [290]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-tglu-9/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180-async-flip.html
   [291]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-4/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180-async-flip.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-blt:
    - shard-snb:          [SKIP][292] ([fdo#109271] / [fdo#111767]) -> [PASS][293]
   [292]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-snb2/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-blt.html
   [293]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-snb7/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-onoff:
    - shard-snb:          [SKIP][294] ([fdo#109271]) -> [PASS][295] +7 other tests pass
   [294]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-snb2/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-onoff.html
   [295]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-snb7/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-onoff.html

  * igt@kms_pm_dc@dc6-dpms:
    - shard-tglu:         [FAIL][296] ([i915#9295]) -> [PASS][297]
   [296]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-tglu-7/igt@kms_pm_dc@dc6-dpms.html
   [297]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-6/igt@kms_pm_dc@dc6-dpms.html

  * igt@kms_pm_rpm@modeset-lpsp:
    - shard-dg2:          [SKIP][298] ([i915#9519]) -> [PASS][299] +1 other test pass
   [298]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-dg2-1/igt@kms_pm_rpm@modeset-lpsp.html
   [299]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg2-10/igt@kms_pm_rpm@modeset-lpsp.html
    - shard-rkl:          [SKIP][300] ([i915#9519]) -> [PASS][301]
   [300]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-rkl-1/igt@kms_pm_rpm@modeset-lpsp.html
   [301]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-2/igt@kms_pm_rpm@modeset-lpsp.html

  * igt@kms_universal_plane@cursor-fb-leak@pipe-b-edp-1:
    - shard-mtlp:         [FAIL][302] ([i915#9196]) -> [PASS][303]
   [302]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-mtlp-5/igt@kms_universal_plane@cursor-fb-leak@pipe-b-edp-1.html
   [303]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-mtlp-6/igt@kms_universal_plane@cursor-fb-leak@pipe-b-edp-1.html

  * igt@kms_universal_plane@cursor-fb-leak@pipe-b-hdmi-a-1:
    - shard-tglu:         [FAIL][304] ([i915#9196]) -> [PASS][305]
   [304]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-tglu-2/igt@kms_universal_plane@cursor-fb-leak@pipe-b-hdmi-a-1.html
   [305]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-tglu-10/igt@kms_universal_plane@cursor-fb-leak@pipe-b-hdmi-a-1.html

  
#### Warnings ####

  * igt@device_reset@unbind-reset-rebind:
    - shard-dg1:          [INCOMPLETE][306] ([i915#10137] / [i915#9408] / [i915#9618]) -> [ABORT][307] ([i915#9618])
   [306]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-dg1-18/igt@device_reset@unbind-reset-rebind.html
   [307]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg1-13/igt@device_reset@unbind-reset-rebind.html

  * igt@i915_module_load@reload-with-fault-injection:
    - shard-dg1:          [ABORT][308] ([i915#9820]) -> [INCOMPLETE][309] ([i915#10137] / [i915#9849])
   [308]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-dg1-13/igt@i915_module_load@reload-with-fault-injection.html
   [309]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg1-19/igt@i915_module_load@reload-with-fault-injection.html

  * igt@kms_content_protection@mei-interface:
    - shard-dg1:          [SKIP][310] ([i915#9433]) -> [SKIP][311] ([i915#9424])
   [310]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-dg1-13/igt@kms_content_protection@mei-interface.html
   [311]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-dg1-17/igt@kms_content_protection@mei-interface.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-render:
    - shard-snb:          [SKIP][312] ([fdo#109271] / [fdo#111767]) -> [SKIP][313] ([fdo#109271])
   [312]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-snb2/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-render.html
   [313]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-snb7/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-render.html

  * igt@kms_pm_dc@dc9-dpms:
    - shard-rkl:          [SKIP][314] ([i915#3361]) -> [SKIP][315] ([i915#4281])
   [314]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14311/shard-rkl-1/igt@kms_pm_dc@dc9-dpms.html
   [315]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_128311v8/shard-rkl-5/igt@kms_pm_dc@dc9-dpms.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109274]: https://bugs.freedesktop.org/show_bug.cgi?id=109274
  [fdo#109279]: https://bugs.freedesktop.org/show_bug.cgi?id=109279
  [fdo#109280]: https://bugs.freedesktop.org/show_bug.cgi?id=109280
  [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285
  [fdo#109289]: https://bugs.freedesktop.org/show_bug.cgi?id=109289
  [fdo#109293]: https://bugs.freedesktop.org/show_bug.cgi?id=109293
  [fdo#109295]: https://bugs.freedesktop.org/show_bug.cgi?id=109295
  [fdo#109303]: https://bugs.freedesktop.org/show_bug.cgi?id=109303
  [fdo#109309]: https://bugs.freedesktop.org/show_bug.cgi?id=109309
  [fdo#109314]: https://bugs.freedesktop.org/show_bug.cgi?id=109314
  [fdo#109315]: https://bugs.freedesktop.org/show_bug.cgi?id=109315
  [fdo#109506]: https://bugs.freedesktop.org/show_bug.cgi?id=109506
  [fdo#110189]: https://bugs.freedesktop.org/show_bug.cgi?id=110189
  [fdo#110723]: https://bugs.freedesktop.org/show_bug.cgi?id=110723
  [fdo#111068]: https://bugs.freedesktop.org/show_bug.cgi?id=111068
  [fdo#111614]: https://bugs.freedesktop.org/show_bug.cgi?id=111614
  [fdo#111615]: https://bugs.freedesktop.org/show_bug.cgi?id=111615
  [fdo#111656]: https://bugs.freedesktop.org/show_bug.cgi?id=111656
  [fdo#111767]: https://bugs.freedesktop.org/show_bug.cgi?id=111767
  [fdo#111825]: https://bugs.freedesktop.org/show_bug.cgi?id=111825
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [fdo#112283]: https://bugs.freedesktop.org/show_bug.cgi?id=112283
  [i915#10030]: https://gitlab.freedesktop.org/drm/intel/issues/10030
  [i915#10131]: https://gitlab.freedesktop.org/drm/intel/issues/10131
  [i915#10137]: https://gitlab.freedesktop.org/drm/intel/issues/10137
  [i915#10278]: https://gitlab.freedesktop.org/drm/intel/issues/10278
  [i915#10282]: https://gitlab.freedesktop.org/drm/intel/issues/10282
  [i915#1769]: https://gitlab.freedesktop.org/drm/intel/issues/1769
  [i915#1825]: https://gitlab.freedesktop.org/drm/intel/issues/1825
  [i915#1839]: https://gitlab.freedesktop.org/drm/intel/issues/1839
  [i915#2065]: https://gitlab.freedesktop.org/drm/intel/issues/2065
  [i915#2346]: https://gitlab.freedesktop.org/drm/intel/issues/2346
  [i915#2437]: https://gitlab.freedesktop.org/drm/intel/issues/2437
  [i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527
  [i915#2575]: https://gitlab.freedesktop.org/drm/intel/issues/2575
  [i915#2587]: https://gitlab.freedesktop.org/drm/intel/issues/2587
  [i915#2672]: https://gitlab.freedesktop.org/drm/intel/issues/2672
  [i915#280]: https://gitlab.freedesktop.org/drm/intel/issues/280
  [i915#2842]: https://gitlab.freedesktop.org/drm/intel/issues/2842
  [i915#2856]: https://gitlab.freedesktop.org/drm/intel/issues/2856
  [i915#3023]: https://gitlab.freedesktop.org/drm/intel/issues/3023
  [i915#3281]: https://gitlab.freedesktop.org/drm/intel/issues/3281
  [i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
  [i915#3297]: https://gitlab.freedesktop.org/drm/intel/issues/3297
  [i915#3359]: https://gitlab.freedesktop.org/drm/intel/issues/3359
  [i915#3361]: https://gitlab.freedesktop.org/drm/intel/issues/3361
  [i915#3458]: https://gitlab.freedesktop.org/drm/intel/issues/3458
  [i915#3469]: https://gitlab.freedesktop.org/drm/intel/issues/3469
  [i915#3539]: https://gitlab.freedesktop.org/drm/intel/issues/3539
  [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555
  [i915#3582]: https://gitlab.freedesktop.org/drm/intel/issues/3582
  [i915#3637]: https://gitlab.freedesktop.org/drm/intel/issues/3637
  [i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708
  [i915#3742]: https://gitlab.freedesktop.org/drm/intel/issues/3742
  [i915#3743]: https://gitlab.freedesktop.org/drm/intel/issues/3743
  [i915#3840]: https://gitlab.freedesktop.org/drm/intel/issues/3840
  [i915#3936]: https://gitlab.freedesktop.org/drm/intel/issues/3936
  [i915#3955]: https://gitlab.freedesktop.org/drm/intel/issues/3955
  [i915#4036]: https://gitlab.freedesktop.org/drm/intel/issues/4036
  [i915#4077]: https://gitlab.freedesktop.org/drm/intel/issues/4077
  [i915#4079]: https://gitlab.freedesktop.org/drm/intel/issues/4079
  [i915#4083]: https://gitlab.freedesktop.org/drm/intel/issues/4083
  [i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103
  [i915#4212]: https://gitlab.freedesktop.org/drm/intel/issues/4212
  [i915#4213]: https://gitlab.freedesktop.org/drm/intel/issues/4213
  [i915#4235]: https://gitlab.freedesktop.org/drm/intel/issues/4235
  [i915#4270]: https://gitlab.freedesktop.org/drm/intel/issues/4270
  [i915#4281]: https://gitlab.freedesktop.org/drm/intel/issues/4281
  [i915#4348]: https://gitlab.freedesktop.org/drm/intel/issues/4348
  [i915#4473]: https://gitlab.freedesktop.org/drm/intel/issues/4473
  [i915#4525]: https://gitlab.freedesktop.org/drm/intel/issues/4525
  [i915#4537]: https://gitlab.freedesktop.org/drm/intel/issues/4537
  [i915#4538]: https://gitlab.freedesktop.org/drm/intel/issues/4538
  [i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
  [i915#4771]: https://gitlab.freedesktop.org/drm/intel/issues/4771
  [i915#4812]: https://gitlab.freedesktop.org/drm/intel/issues/4812
  [i915#4839]: https://gitlab.freedesktop.org/drm/intel/issues/4839
  [i915#4852]: https://gitlab.freedesktop.org/drm/intel/issues/4852
  [i915#4854]: https://gitlab.freedesktop.org/drm/intel/issues/4854
  [i915#4860]: https://gitlab.freedesktop.org/drm/intel/issues/4860
  [i915#4873]: https://gitlab.freedesktop.org/drm/intel/issues/4873
  [i915#4881]: https://gitlab.freedesktop.org/drm/intel/issues/4881
  [i915#4885]: https://gitlab.freedesktop.org/drm/intel/issues/4885
  [i915#5107]: https://gitlab.freedesktop.org/drm/intel/issues/5107
  [i915#5138]: https://gitlab.freedesktop.org/drm/intel/issues/5138
  [i915#5176]: https://gitlab.freedesktop.org/drm/intel/issues/5176
  [i915#5190]: https://gitlab.freedesktop.org/drm/intel/issues/5190
  [i915#5235]: https://gitlab.freedesktop.org/drm/intel/issues/5235
  [i915#5286]: https://gitlab.freedesktop.org/drm/intel/issues/5286
  [i915#5289]: https://gitlab.freedesktop.org/drm/intel/issues/5289
  [i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354
  [i915#5493]: https://gitlab.freedesktop.org/drm/intel/issues/5493
  [i915#5566]: https://gitlab.freedesktop.org/drm/intel/issues/5566
  [i915#5784]: https://gitlab.freedesktop.org/drm/intel/issues/5784
  [i915#6095]: https://gitlab.freedesktop.org/drm/intel/issues/6095
  [i915#6187]: https://gitlab.freedesktop.org/drm/intel/issues/6187
  [i915#6227]: https://gitlab.freedesktop.org/drm/intel/issues/6227
  [i915#6228]: https://gitlab.freedesktop.org/drm/intel/issues/6228
  [i915#6268]: https://gitlab.freedesktop.org/drm/intel/issues/6268
  [i915#6334]: https://gitlab.freedesktop.org/drm/intel/issues/6334
  [i915#6524]: https://gitlab.freedesktop.org/drm/intel/issues/6524
  [i915#6590]: https://gitlab.freedesktop.org/drm/intel/issues/6590
  [i915#6621]: https://gitlab.freedesktop.org/drm/intel/issues/6621
  [i915#6645]: https://gitlab.freedesktop.org/drm/intel/issues/6645
  [i915#6880]: https://gitlab.freedesktop.org/drm/intel/issues/6880
  [i915#6944]: https://gitlab.freedesktop.org/drm/intel/issues/6944
  [i915#7213]: https://gitlab.freedesktop.org/drm/intel/issues/7213
  [i915#7297]: https://gitlab.freedesktop.org/drm/intel/issues/7297
  [i915#7387]: https://gitlab.freedesktop.org/drm/intel/issues/7387
  [i915#7697]: https://gitlab.freedesktop.org/drm/intel/issues/7697
  [i915#7701]: https://gitlab.freedesktop.org/drm/intel/issues/7701
  [i915#7707]: https://gitlab.freedesktop.org/drm/intel/issues/7707
  [i915#7711]: https://gitlab.freedesktop.org/drm/intel/issues/7711
  [i915#7742]: https://gitlab.freedesktop.org/drm/intel/issues/7742
  [i915#7790]: https://gitlab.freedesktop.org/drm/intel/issues/7790
  [i915#7828]: https://gitlab.freedesktop.org/drm/intel/issues/7828
  [i915#7975]: https://gitlab.freedesktop.org/drm/intel/issues/7975
  [i915#8213]: https://gitlab.freedesktop.org/drm/intel/issues/8213
  [i915#8228]: https://gitlab.freedesktop.org/drm/intel/issues/8228
  [i915#8289]: https://gitlab.freedesktop.org/drm/intel/issues/8289
  [i915#8293]: https://gitlab.freedesktop.org/drm/intel/issues/8293
  [i915#8381]: https://gitlab.freedesktop.org/drm/intel/issues/8381
  [i915#8411]: https://gitlab.freedesktop.org/drm/intel/issues/8411
  [i915#8414]: https://gitlab.freedesktop.org/drm/intel/issues/8414
  [i915#8428]: https://gitlab.freedesktop.org/drm/intel/issues/8428
  [i915#8555]: https://gitlab.freedesktop.org/drm/intel/issues/8555
  [i915#8708]: https://gitlab.freedesktop.org/drm/intel/issues/8708
  [i915#8806]: https://gitlab.freedesktop.org/drm/intel/issues/8806
  [i915#8808]: https://gitlab.freedesktop.org/drm/intel/issues/8808
  [i915#8809]: https://gitlab.freedesktop.org/drm/intel/issues/8809
  [i915#8814]: https://gitlab.freedesktop.org/drm/intel/issues/8814
  [i915#8850]: https://gitlab.freedesktop.org/drm/intel/issues/8850
  [i915#9196]: https://gitlab.freedesktop.org/drm/intel/issues/9196
  [i915#9200]: https://gitlab.freedesktop.org/drm/intel/issues/9200
  [i915#9275]: https://gitlab.freedesktop.org/drm/intel/issues/9275
  [i915#9295]: https://gitlab.freedesktop.org/drm/intel/issues/9295
  [i915#9323]: https://gitlab.freedesktop.org/drm/intel/issues/9323
  [i915#9408]: https://gitlab.freedesktop.org/drm/intel/issues/9408
  [i915#9412]: https://gitlab.freedesktop.org/drm/intel/issues/9412
  [i915#9423]: https://gitlab.freedesktop.org/drm/intel/issues/9423
  [i915#9424]: https://gitlab.freedesktop.org/drm/intel/issues/9424
  [i915#9433]: https://gitlab.freedesktop.org/drm/intel/issues/9433
  [i915#9519]: https://gitlab.freedesktop.org/drm/intel/issues/9519
  [i915#9606]: https://gitlab.freedesktop.org/drm/intel/issues/9606
  [i915#9618]: https://gitlab.freedesktop.org/drm/intel/issues/9618
  [i915#9683]: https://gitlab.freedesktop.org/drm/intel/issues/9683
  [i915#9685]: https://gitlab.freedesktop.org/drm/intel/issues/9685
  [i915#9688]: https://gitlab.freedesktop.org/drm/intel/issues/9688
  [i915#9723]: https://gitlab.freedesktop.org/drm/intel/issues/9723
  [i915#9728]: https://gitlab.freedesktop.org/drm/intel/issues/9728
  [i915#9732]: https://gitlab.freedesktop.org/drm/intel/issues/9732
  [i915#9779]: https://gitlab.freedesktop.org/drm/intel/issues/9779
  [i915#9781]: https://gitlab.freedesktop.org/drm/intel/issues/9781
  [i915#9808]: https://gitlab.freedesktop.org/drm/intel/issues/9808
  [i915#9809]: https://gitlab.freedesktop.org/drm/intel/issues/9809
  [i915#9820]: https://gitlab.freedesktop.org/drm/intel/issues/9820
  [i915#9849]: https://gitlab.freedesktop.org/drm/intel/issues/9849
  [i915#9906]: https://gitlab.freedesktop.org/drm/intel/issues/9906


Build changes
-------------

  * Linux: CI_DRM_14311 -> Patchwork_128311v8

  CI-20190529: 20190529
  CI_DRM_14311: 06b279b4fb58a00667e47fafed72bba923d032ae @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_7720: 7720
  Patchwork_128311v8: 06b279b4fb58a00667e47fafed72bba923d032ae @ 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_128311v8/index.html

[-- Attachment #2: Type: text/html, Size: 98821 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0
  2024-02-21 19:20 ` [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0 Stanislav Lisovskiy
  2024-02-21 22:35   ` Manasi Navare
@ 2024-02-26 19:56   ` Jani Nikula
  2024-02-27  9:04     ` Lisovskiy, Stanislav
  1 sibling, 1 reply; 33+ messages in thread
From: Jani Nikula @ 2024-02-26 19:56 UTC (permalink / raw)
  To: Stanislav Lisovskiy, intel-gfx
  Cc: Stanislav.Lisovskiy, jani.saarinen, ville.syrjala, vidya.srinivas

On Wed, 21 Feb 2024, Stanislav Lisovskiy <stanislav.lisovskiy@intel.com> wrote:
> Patch calculates bigjoiner pipes in mst compute.
> Patch also passes bigjoiner bool to validate plane
> max size.

Please use the imperative mood in commit messages, e.g. "calculate"
intead of "calculates".

Please do not refer to "patch". We know it's a patch, until it isn't,
and then it's a commit.

Please explain *why* the changes are being done, not just *what* is
being done.

In the subject, what is "bigjoiner case for DP2.0"? DP 2.0 is a spec
version, and as such irrelevant for the changes being done.

> Signed-off-by: vsrini4 <vidya.srinivas@intel.com>

?

> Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp_mst.c | 19 ++++++++++++-------
>  1 file changed, 12 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> index 5307ddd4edcf5..fd27d9976c050 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> @@ -523,6 +523,7 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
>  				       struct drm_connector_state *conn_state)
>  {
>  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> +	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
>  	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
>  	struct intel_dp *intel_dp = &intel_mst->primary->dp;
>  	const struct intel_connector *connector =
> @@ -540,6 +541,10 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
>  	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
>  		return -EINVAL;
>  
> +	if (intel_dp_need_bigjoiner(intel_dp, adjusted_mode->crtc_hdisplay,
> +				    adjusted_mode->crtc_clock))
> +		pipe_config->bigjoiner_pipes = GENMASK(crtc->pipe + 1, crtc->pipe);
> +
>  	pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB;
>  	pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
>  	pipe_config->has_pch_encoder = false;
> @@ -1318,12 +1323,6 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
>  	 *   corresponding link capabilities of the sink) in case the
>  	 *   stream is uncompressed for it by the last branch device.
>  	 */
> -	if (mode_rate > max_rate || mode->clock > max_dotclk ||
> -	    drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port->full_pbn) {
> -		*status = MODE_CLOCK_HIGH;
> -		return 0;
> -	}
> -
>  	if (mode->clock < 10000) {
>  		*status = MODE_CLOCK_LOW;
>  		return 0;
> @@ -1343,6 +1342,12 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
>  		return 0;
>  	}
>  
> +	if (mode_rate > max_rate || mode->clock > max_dotclk ||
> +	    drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port->full_pbn) {
> +		*status = MODE_CLOCK_HIGH;
> +		return 0;
> +	}
> +
>  	if (DISPLAY_VER(dev_priv) >= 10 &&
>  	    drm_dp_sink_supports_dsc(intel_connector->dp.dsc_dpcd)) {
>  		/*
> @@ -1385,7 +1390,7 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
>  		return 0;
>  	}
>  
> -	*status = intel_mode_valid_max_plane_size(dev_priv, mode, false);
> +	*status = intel_mode_valid_max_plane_size(dev_priv, mode, bigjoiner);
>  	return 0;
>  }

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* RE: [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset
  2024-02-21 19:20 ` [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset Stanislav Lisovskiy
@ 2024-02-27  4:40   ` Srinivas, Vidya
  2024-02-27  4:52     ` Srinivas, Vidya
  2024-02-27  9:11     ` Lisovskiy, Stanislav
  2024-03-01 10:10   ` Ville Syrjälä
  1 sibling, 2 replies; 33+ messages in thread
From: Srinivas, Vidya @ 2024-02-27  4:40 UTC (permalink / raw)
  To: Lisovskiy, Stanislav, intel-gfx@lists.freedesktop.org
  Cc: Saarinen, Jani, ville.syrjala@linux.intel.com



> -----Original Message-----
> From: Lisovskiy, Stanislav <stanislav.lisovskiy@intel.com>
> Sent: Thursday, February 22, 2024 12:50 AM
> To: intel-gfx@lists.freedesktop.org
> Cc: Lisovskiy, Stanislav <stanislav.lisovskiy@intel.com>; Saarinen, Jani
> <jani.saarinen@intel.com>; ville.syrjala@linux.intel.com; Srinivas, Vidya
> <vidya.srinivas@intel.com>
> Subject: [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner
> during modeset
> 
> Handle only bigjoiner masters in skl_commit_modeset_enables/disables,
> slave crtcs should be handled by master hooks. Same for encoders.
> That way we can also remove a bunch of checks like
> intel_crtc_is_bigjoiner_slave.
> 
> v2: Get rid of master vs slave checks and separation in crtc enable/disable
> hooks.
>     Use unified iteration cycle for all of those, while enabling/disabling
>     transcoder only for those pipes where its needed(Ville Syrjälä)
> 
> v3: Move all the intel_encoder_* calls under transcoder code path(Ville
> Syrjälä)
> 
> v4:  - Call intel_crtc_vblank_on from hsw_crtc_enable only for non-transcoder
> path
>        (for master pipe that will be called from
> intel_encoders_enable/intel_enable_ddi)
>      - Fix stupid mistake with using crtc->pipe for the mask, instead of BIT(crtc-
> >pipe)
> 
> Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_ddi.c     |  21 +--
>  drivers/gpu/drm/i915/display/intel_display.c | 183 ++++++++++++-------
>  drivers/gpu/drm/i915/display/intel_display.h |   6 +
>  3 files changed, 121 insertions(+), 89 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c
> b/drivers/gpu/drm/i915/display/intel_ddi.c
> index bea4415902044..6071e9f500871 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -3100,7 +3100,6 @@ static void intel_ddi_post_disable(struct
> intel_atomic_state *state,
>  				   const struct drm_connector_state
> *old_conn_state)  {
>  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> -	struct intel_crtc *slave_crtc;
> 
>  	if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST)) {
>  		intel_crtc_vblank_off(old_crtc_state);
> @@ -3117,17 +3116,6 @@ static void intel_ddi_post_disable(struct
> intel_atomic_state *state,
>  			ilk_pfit_disable(old_crtc_state);
>  	}
> 
> -	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, slave_crtc,
> -
> intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) {
> -		const struct intel_crtc_state *old_slave_crtc_state =
> -			intel_atomic_get_old_crtc_state(state, slave_crtc);
> -
> -		intel_crtc_vblank_off(old_slave_crtc_state);
> -
> -		intel_dsc_disable(old_slave_crtc_state);
> -		skl_scaler_disable(old_slave_crtc_state);
> -	}
> -
>  	/*
>  	 * When called from DP MST code:
>  	 * - old_conn_state will be NULL
> @@ -3363,8 +3351,7 @@ static void intel_enable_ddi(struct
> intel_atomic_state *state,  {
>  	drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
> 
> -	if (!intel_crtc_is_bigjoiner_slave(crtc_state))
> -		intel_ddi_enable_transcoder_func(encoder, crtc_state);
> +	intel_ddi_enable_transcoder_func(encoder, crtc_state);
> 
>  	/* Enable/Disable DP2.0 SDP split config before transcoder */
>  	intel_audio_sdp_split_update(crtc_state);
> @@ -3469,9 +3456,6 @@ void intel_ddi_update_active_dpll(struct
> intel_atomic_state *state,
>  				  struct intel_crtc *crtc)
>  {
>  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> -	struct intel_crtc_state *crtc_state =
> -		intel_atomic_get_new_crtc_state(state, crtc);
> -	struct intel_crtc *slave_crtc;
>  	enum phy phy = intel_port_to_phy(i915, encoder->port);
> 
>  	/* FIXME: Add MTL pll_mgr */
> @@ -3479,9 +3463,6 @@ void intel_ddi_update_active_dpll(struct
> intel_atomic_state *state,
>  		return;
> 
>  	intel_update_active_dpll(state, crtc, encoder);
> -	for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> -
> intel_crtc_bigjoiner_slave_pipes(crtc_state))
> -		intel_update_active_dpll(state, slave_crtc, encoder);
>  }
> 
>  static void
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> b/drivers/gpu/drm/i915/display/intel_display.c
> index 916c13a149fd5..e1ea53fd6a288 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -1631,31 +1631,12 @@ static void hsw_configure_cpu_transcoder(const
> struct intel_crtc_state *crtc_sta
>  	hsw_set_transconf(crtc_state);
>  }
> 
> -static void hsw_crtc_enable(struct intel_atomic_state *state,
> -			    struct intel_crtc *crtc)
> +static void hsw_crtc_enable_pre_transcoder(struct intel_atomic_state *state,
> +					   struct intel_crtc *crtc)
>  {
>  	const struct intel_crtc_state *new_crtc_state =
>  		intel_atomic_get_new_crtc_state(state, crtc);
>  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> -	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> -	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> -	bool psl_clkgate_wa;
> -
> -	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> -		return;
> -
> -	intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> -
> -	if (!new_crtc_state->bigjoiner_pipes) {
> -		intel_encoders_pre_pll_enable(state, crtc);
> -
> -		if (new_crtc_state->shared_dpll)
> -			intel_enable_shared_dpll(new_crtc_state);
> -
> -		intel_encoders_pre_enable(state, crtc);
> -	} else {
> -		icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> -	}
> 
>  	intel_dsc_enable(new_crtc_state);
> 
> @@ -1665,19 +1646,17 @@ static void hsw_crtc_enable(struct
> intel_atomic_state *state,
>  	intel_set_pipe_src_size(new_crtc_state);
>  	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
>  		bdw_set_pipe_misc(new_crtc_state);
> +}
> 
> -	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&
> -	    !transcoder_is_dsi(cpu_transcoder))
> -		hsw_configure_cpu_transcoder(new_crtc_state);
> +static void hsw_crtc_enable_post_transcoder(struct intel_atomic_state
> *state,
> +					    struct intel_crtc *crtc)
> +{
> +	const struct intel_crtc_state *new_crtc_state =
> +		intel_atomic_get_new_crtc_state(state, crtc);
> +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> 
>  	crtc->active = true;
> 
> -	/* Display WA #1180: WaDisableScalarClockGating: glk */
> -	psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> -		new_crtc_state->pch_pfit.enabled;
> -	if (psl_clkgate_wa)
> -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> -
>  	if (DISPLAY_VER(dev_priv) >= 9)
>  		skl_pfit_enable(new_crtc_state);
>  	else
> @@ -1700,27 +1679,84 @@ static void hsw_crtc_enable(struct
> intel_atomic_state *state,
>  		icl_set_pipe_chicken(new_crtc_state);
> 
>  	intel_initial_watermarks(state, crtc);
> +}
> 
> -	if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> -		intel_crtc_vblank_on(new_crtc_state);
> +static void hsw_crtc_enable(struct intel_atomic_state *state,
> +			    struct intel_crtc *crtc)
> +{
> +	const struct intel_crtc_state *new_crtc_state =
> +		intel_atomic_get_new_crtc_state(state, crtc);
> +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> +	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> +	struct intel_crtc *_crtc;
> +	int slave_pipe_mask =
> intel_crtc_bigjoiner_slave_pipes(new_crtc_state);


Many thanks for the patch series.
Should we calculate slave_pipe_mask only if the modeset
was received on the slave pipe. Else, we noticed that
each time its traversing through slave pipe even when
modeset was received on master (say pipe = 1)
Kindly suggest.

> +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> +	bool psl_clkgate_wa;
> +	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> 
> -	intel_encoders_enable(state, crtc);
> +	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> +		return;
> 
> -	if (psl_clkgate_wa) {
> -		intel_crtc_wait_for_next_vblank(crtc);
> -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> -	}
> +	/*
> +	 * Use reverse iterator to go through slave pipes first.
> +	 * TODO: We might need smarter iterator here
> +	 */
> +	for_each_intel_crtc_in_pipe_mask_reverse(&dev_priv->drm, _crtc,
> +						 pipe_mask) {
> +		const struct intel_crtc_state *_new_crtc_state =
> +			intel_atomic_get_new_crtc_state(state, _crtc);
> +		bool needs_transcoder = ((slave_pipe_mask & BIT(_crtc-
> >pipe)) == 0) &&
> +					!transcoder_is_dsi(cpu_transcoder);
> +
> +		intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> +
> +		if (!new_crtc_state->bigjoiner_pipes) {
> +			if (needs_transcoder)
> +				intel_encoders_pre_pll_enable(state, crtc);


Should we use _crtc here. In remaining places in this function also.
Kindly suggest.

> +
> +			if (new_crtc_state->shared_dpll)
> +				intel_enable_shared_dpll(new_crtc_state);
> +
> +			if (needs_transcoder)
> +				intel_encoders_pre_enable(state, crtc);
> +		} else {
> +			icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> +		}
> +
> +		hsw_crtc_enable_pre_transcoder(state, _crtc);
> +
> +		if (needs_transcoder)
> +			hsw_configure_cpu_transcoder(_new_crtc_state);
> +
> +		/* Display WA #1180: WaDisableScalarClockGating: glk */
> +		psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> +			new_crtc_state->pch_pfit.enabled;
> +		if (psl_clkgate_wa)
> +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe,
> true);
> +
> +		hsw_crtc_enable_post_transcoder(state, _crtc);
> +
> +		if (needs_transcoder)
> +			intel_encoders_enable(state, crtc);
> +		else
> +			intel_crtc_vblank_on(_new_crtc_state);
> +
> +		if (psl_clkgate_wa) {
> +			intel_crtc_wait_for_next_vblank(crtc);
> +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe,
> false);
> +		}
> 
> -	/* If we change the relative order between pipe/planes enabling, we
> need
> -	 * to change the workaround. */
> -	hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
> -	if (IS_HASWELL(dev_priv) && hsw_workaround_pipe !=
> INVALID_PIPE) {
> -		struct intel_crtc *wa_crtc;
> +		/* If we change the relative order between pipe/planes
> enabling, we need
> +		 * to change the workaround. */
> +		hsw_workaround_pipe = new_crtc_state-
> >hsw_workaround_pipe;
> +		if (IS_HASWELL(dev_priv) && hsw_workaround_pipe !=
> INVALID_PIPE) {
> +			struct intel_crtc *wa_crtc;
> 
> -		wa_crtc = intel_crtc_for_pipe(dev_priv,
> hsw_workaround_pipe);
> +			wa_crtc = intel_crtc_for_pipe(dev_priv,
> hsw_workaround_pipe);
> 
> -		intel_crtc_wait_for_next_vblank(wa_crtc);
> -		intel_crtc_wait_for_next_vblank(wa_crtc);
> +			intel_crtc_wait_for_next_vblank(wa_crtc);
> +			intel_crtc_wait_for_next_vblank(wa_crtc);
> +		}
>  	}
>  }
> 
> @@ -1784,28 +1820,27 @@ static void hsw_crtc_disable(struct
> intel_atomic_state *state,
>  	const struct intel_crtc_state *old_crtc_state =
>  		intel_atomic_get_old_crtc_state(state, crtc);
>  	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
> +	int slave_pipe_mask =
> intel_crtc_bigjoiner_slave_pipes(old_crtc_state);
> +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> +	struct intel_crtc *_crtc;
> +
> +	for_each_intel_crtc_in_pipe_mask(&i915->drm, _crtc,
> +					 pipe_mask) {
> +		const struct intel_crtc_state *_old_crtc_state =
> +			intel_atomic_get_old_crtc_state(state, _crtc);
> +		bool needs_encoder_disable = (slave_pipe_mask & BIT(_crtc-
> >pipe)) ==
> +0;
> +
> +		if (needs_encoder_disable) {
> +			intel_encoders_disable(state, _crtc);
> +			intel_encoders_post_disable(state, _crtc);
> +		}
> 
> -	/*
> -	 * FIXME collapse everything to one hook.
> -	 * Need care with mst->ddi interactions.
> -	 */
> -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> -		intel_encoders_disable(state, crtc);
> -		intel_encoders_post_disable(state, crtc);
> -	}
> -
> -	intel_disable_shared_dpll(old_crtc_state);
> -
> -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> -		struct intel_crtc *slave_crtc;
> -
> -		intel_encoders_post_pll_disable(state, crtc);
> +		intel_disable_shared_dpll(_old_crtc_state);
> 
> -		intel_dmc_disable_pipe(i915, crtc->pipe);
> +		if (needs_encoder_disable)
> +			intel_encoders_post_pll_disable(state, _crtc);
> 
> -		for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> -
> intel_crtc_bigjoiner_slave_pipes(old_crtc_state))
> -			intel_dmc_disable_pipe(i915, slave_crtc->pipe);
> +		intel_dmc_disable_pipe(i915, _crtc->pipe);
>  	}
>  }
> 
> @@ -6788,8 +6823,10 @@ static void intel_commit_modeset_disables(struct
> intel_atomic_state *state)
>  		 * Slave vblanks are masked till Master Vblanks.
>  		 */
>  		if (!is_trans_port_sync_slave(old_crtc_state) &&
> -		    !intel_dp_mst_is_slave_trans(old_crtc_state) &&
> -		    !intel_crtc_is_bigjoiner_slave(old_crtc_state))
> +		    !intel_dp_mst_is_slave_trans(old_crtc_state))
> +			continue;
> +
> +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
>  			continue;

Should we use !intel_crtc_is_bigjoiner_slave here?
Kindly suggest.

> 
>  		intel_old_crtc_state_disables(state, old_crtc_state, @@ -
> 6807,6 +6844,9 @@ static void intel_commit_modeset_disables(struct
> intel_atomic_state *state)
>  		if (!old_crtc_state->hw.active)
>  			continue;
> 
> +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
> +			continue;
> +
>  		intel_old_crtc_state_disables(state, old_crtc_state,
>  					      new_crtc_state, crtc);
>  	}
> @@ -6919,8 +6959,10 @@ static void skl_commit_modeset_enables(struct
> intel_atomic_state *state)
>  			continue;
> 
>  		if (intel_dp_mst_is_slave_trans(new_crtc_state) ||
> -		    is_trans_port_sync_master(new_crtc_state) ||
> -		    intel_crtc_is_bigjoiner_master(new_crtc_state))
> +		    is_trans_port_sync_master(new_crtc_state))
> +			continue;
> +
> +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
>  			continue;
> 
Should we use !intel_crtc_is_bigjoiner_master here?
Kindly suggest.

>  		modeset_pipes &= ~BIT(pipe);
> @@ -6930,7 +6972,7 @@ static void skl_commit_modeset_enables(struct
> intel_atomic_state *state)
> 
>  	/*
>  	 * Then we enable all remaining pipes that depend on other
> -	 * pipes: MST slaves and port sync masters, big joiner master
> +	 * pipes: MST slaves and port sync masters
>  	 */
>  	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
>  		enum pipe pipe = crtc->pipe;
> @@ -6938,6 +6980,9 @@ static void skl_commit_modeset_enables(struct
> intel_atomic_state *state)
>  		if ((modeset_pipes & BIT(pipe)) == 0)
>  			continue;
> 
> +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> +			continue;
> +
>  		modeset_pipes &= ~BIT(pipe);
> 
>  		intel_enable_crtc(state, crtc);
> diff --git a/drivers/gpu/drm/i915/display/intel_display.h
> b/drivers/gpu/drm/i915/display/intel_display.h
> index f4a0773f0fca8..e1e8d956c305e 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.h
> +++ b/drivers/gpu/drm/i915/display/intel_display.h
> @@ -280,6 +280,12 @@ enum phy_fia {
>  			    base.head)					\
>  		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
> 
> +#define for_each_intel_crtc_in_pipe_mask_reverse(dev, intel_crtc,
> pipe_mask)	\
> +	list_for_each_entry_reverse(intel_crtc,
> 	\
> +				    &(dev)->mode_config.crtc_list,
> 	\
> +				    base.head)
> 	\
> +		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
> +
>  #define for_each_intel_encoder(dev, intel_encoder)		\
>  	list_for_each_entry(intel_encoder,			\
>  			    &(dev)->mode_config.encoder_list,	\
> --
> 2.37.3


^ permalink raw reply	[flat|nested] 33+ messages in thread

* RE: [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset
  2024-02-27  4:40   ` Srinivas, Vidya
@ 2024-02-27  4:52     ` Srinivas, Vidya
  2024-02-27  9:11     ` Lisovskiy, Stanislav
  1 sibling, 0 replies; 33+ messages in thread
From: Srinivas, Vidya @ 2024-02-27  4:52 UTC (permalink / raw)
  To: Srinivas, Vidya, Lisovskiy, Stanislav,
	intel-gfx@lists.freedesktop.org
  Cc: Saarinen, Jani, ville.syrjala@linux.intel.com



> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of
> Srinivas, Vidya
> Sent: Tuesday, February 27, 2024 10:10 AM
> To: Lisovskiy, Stanislav <stanislav.lisovskiy@intel.com>; intel-
> gfx@lists.freedesktop.org
> Cc: Saarinen, Jani <jani.saarinen@intel.com>; ville.syrjala@linux.intel.com
> Subject: RE: [PATCH 2/3] Start separating pipe vs transcoder set logic for
> bigjoiner during modeset
> 
> 
> 
> > -----Original Message-----
> > From: Lisovskiy, Stanislav <stanislav.lisovskiy@intel.com>
> > Sent: Thursday, February 22, 2024 12:50 AM
> > To: intel-gfx@lists.freedesktop.org
> > Cc: Lisovskiy, Stanislav <stanislav.lisovskiy@intel.com>; Saarinen,
> > Jani <jani.saarinen@intel.com>; ville.syrjala@linux.intel.com;
> > Srinivas, Vidya <vidya.srinivas@intel.com>
> > Subject: [PATCH 2/3] Start separating pipe vs transcoder set logic for
> > bigjoiner during modeset
> >
> > Handle only bigjoiner masters in skl_commit_modeset_enables/disables,
> > slave crtcs should be handled by master hooks. Same for encoders.
> > That way we can also remove a bunch of checks like
> > intel_crtc_is_bigjoiner_slave.
> >
> > v2: Get rid of master vs slave checks and separation in crtc
> > enable/disable hooks.
> >     Use unified iteration cycle for all of those, while enabling/disabling
> >     transcoder only for those pipes where its needed(Ville Syrjälä)
> >
> > v3: Move all the intel_encoder_* calls under transcoder code
> > path(Ville
> > Syrjälä)
> >
> > v4:  - Call intel_crtc_vblank_on from hsw_crtc_enable only for
> > non-transcoder path
> >        (for master pipe that will be called from
> > intel_encoders_enable/intel_enable_ddi)
> >      - Fix stupid mistake with using crtc->pipe for the mask, instead
> > of BIT(crtc-
> > >pipe)
> >
> > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_ddi.c     |  21 +--
> >  drivers/gpu/drm/i915/display/intel_display.c | 183 ++++++++++++-------
> >  drivers/gpu/drm/i915/display/intel_display.h |   6 +
> >  3 files changed, 121 insertions(+), 89 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c
> > b/drivers/gpu/drm/i915/display/intel_ddi.c
> > index bea4415902044..6071e9f500871 100644
> > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > @@ -3100,7 +3100,6 @@ static void intel_ddi_post_disable(struct
> > intel_atomic_state *state,
> >  				   const struct drm_connector_state
> > *old_conn_state)  {
> >  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> > -	struct intel_crtc *slave_crtc;
> >
> >  	if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST)) {
> >  		intel_crtc_vblank_off(old_crtc_state);
> > @@ -3117,17 +3116,6 @@ static void intel_ddi_post_disable(struct
> > intel_atomic_state *state,
> >  			ilk_pfit_disable(old_crtc_state);
> >  	}
> >
> > -	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, slave_crtc,
> > -
> > intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) {
> > -		const struct intel_crtc_state *old_slave_crtc_state =
> > -			intel_atomic_get_old_crtc_state(state, slave_crtc);
> > -
> > -		intel_crtc_vblank_off(old_slave_crtc_state);
> > -
> > -		intel_dsc_disable(old_slave_crtc_state);
> > -		skl_scaler_disable(old_slave_crtc_state);
> > -	}
> > -
> >  	/*
> >  	 * When called from DP MST code:
> >  	 * - old_conn_state will be NULL
> > @@ -3363,8 +3351,7 @@ static void intel_enable_ddi(struct
> > intel_atomic_state *state,  {
> >  	drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
> >
> > -	if (!intel_crtc_is_bigjoiner_slave(crtc_state))
> > -		intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > +	intel_ddi_enable_transcoder_func(encoder, crtc_state);
> >
> >  	/* Enable/Disable DP2.0 SDP split config before transcoder */
> >  	intel_audio_sdp_split_update(crtc_state);
> > @@ -3469,9 +3456,6 @@ void intel_ddi_update_active_dpll(struct
> > intel_atomic_state *state,
> >  				  struct intel_crtc *crtc)
> >  {
> >  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> > -	struct intel_crtc_state *crtc_state =
> > -		intel_atomic_get_new_crtc_state(state, crtc);
> > -	struct intel_crtc *slave_crtc;
> >  	enum phy phy = intel_port_to_phy(i915, encoder->port);
> >
> >  	/* FIXME: Add MTL pll_mgr */
> > @@ -3479,9 +3463,6 @@ void intel_ddi_update_active_dpll(struct
> > intel_atomic_state *state,
> >  		return;
> >
> >  	intel_update_active_dpll(state, crtc, encoder);
> > -	for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > -
> > intel_crtc_bigjoiner_slave_pipes(crtc_state))
> > -		intel_update_active_dpll(state, slave_crtc, encoder);
> >  }
> >
> >  static void
> > diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> > b/drivers/gpu/drm/i915/display/intel_display.c
> > index 916c13a149fd5..e1ea53fd6a288 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > @@ -1631,31 +1631,12 @@ static void
> hsw_configure_cpu_transcoder(const
> > struct intel_crtc_state *crtc_sta
> >  	hsw_set_transconf(crtc_state);
> >  }
> >
> > -static void hsw_crtc_enable(struct intel_atomic_state *state,
> > -			    struct intel_crtc *crtc)
> > +static void hsw_crtc_enable_pre_transcoder(struct intel_atomic_state
> *state,
> > +					   struct intel_crtc *crtc)
> >  {
> >  	const struct intel_crtc_state *new_crtc_state =
> >  		intel_atomic_get_new_crtc_state(state, crtc);
> >  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > -	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > -	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > -	bool psl_clkgate_wa;
> > -
> > -	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > -		return;
> > -
> > -	intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > -
> > -	if (!new_crtc_state->bigjoiner_pipes) {
> > -		intel_encoders_pre_pll_enable(state, crtc);
> > -
> > -		if (new_crtc_state->shared_dpll)
> > -			intel_enable_shared_dpll(new_crtc_state);
> > -
> > -		intel_encoders_pre_enable(state, crtc);
> > -	} else {
> > -		icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > -	}
> >
> >  	intel_dsc_enable(new_crtc_state);
> >
> > @@ -1665,19 +1646,17 @@ static void hsw_crtc_enable(struct
> > intel_atomic_state *state,
> >  	intel_set_pipe_src_size(new_crtc_state);
> >  	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
> >  		bdw_set_pipe_misc(new_crtc_state);
> > +}
> >
> > -	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&
> > -	    !transcoder_is_dsi(cpu_transcoder))
> > -		hsw_configure_cpu_transcoder(new_crtc_state);
> > +static void hsw_crtc_enable_post_transcoder(struct intel_atomic_state
> > *state,
> > +					    struct intel_crtc *crtc)
> > +{
> > +	const struct intel_crtc_state *new_crtc_state =
> > +		intel_atomic_get_new_crtc_state(state, crtc);
> > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> >
> >  	crtc->active = true;
> >
> > -	/* Display WA #1180: WaDisableScalarClockGating: glk */
> > -	psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > -		new_crtc_state->pch_pfit.enabled;
> > -	if (psl_clkgate_wa)
> > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> > -
> >  	if (DISPLAY_VER(dev_priv) >= 9)
> >  		skl_pfit_enable(new_crtc_state);
> >  	else
> > @@ -1700,27 +1679,84 @@ static void hsw_crtc_enable(struct
> > intel_atomic_state *state,
> >  		icl_set_pipe_chicken(new_crtc_state);
> >
> >  	intel_initial_watermarks(state, crtc);
> > +}
> >
> > -	if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > -		intel_crtc_vblank_on(new_crtc_state);
> > +static void hsw_crtc_enable(struct intel_atomic_state *state,
> > +			    struct intel_crtc *crtc)
> > +{
> > +	const struct intel_crtc_state *new_crtc_state =
> > +		intel_atomic_get_new_crtc_state(state, crtc);
> > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > +	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > +	struct intel_crtc *_crtc;
> > +	int slave_pipe_mask =
> > intel_crtc_bigjoiner_slave_pipes(new_crtc_state);
> 
> 
> Many thanks for the patch series.
> Should we calculate slave_pipe_mask only if the modeset was received on the
> slave pipe. Else, we noticed that each time its traversing through slave pipe
> even when modeset was received on master (say pipe = 1) Kindly suggest.
> 
> > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > +	bool psl_clkgate_wa;
> > +	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> >
> > -	intel_encoders_enable(state, crtc);
> > +	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > +		return;
> >
> > -	if (psl_clkgate_wa) {
> > -		intel_crtc_wait_for_next_vblank(crtc);
> > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> > -	}
> > +	/*
> > +	 * Use reverse iterator to go through slave pipes first.
> > +	 * TODO: We might need smarter iterator here
> > +	 */
> > +	for_each_intel_crtc_in_pipe_mask_reverse(&dev_priv->drm, _crtc,
> > +						 pipe_mask) {
> > +		const struct intel_crtc_state *_new_crtc_state =
> > +			intel_atomic_get_new_crtc_state(state, _crtc);
> > +		bool needs_transcoder = ((slave_pipe_mask & BIT(_crtc-
> > >pipe)) == 0) &&
> > +					!transcoder_is_dsi(cpu_transcoder);
> > +
> > +		intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > +
> > +		if (!new_crtc_state->bigjoiner_pipes) {
> > +			if (needs_transcoder)
> > +				intel_encoders_pre_pll_enable(state, crtc);
> 
> 
> Should we use _crtc here. In remaining places in this function also.
> Kindly suggest.
> 
> > +
> > +			if (new_crtc_state->shared_dpll)
> > +				intel_enable_shared_dpll(new_crtc_state);
> > +
> > +			if (needs_transcoder)
> > +				intel_encoders_pre_enable(state, crtc);
> > +		} else {
> > +			icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > +		}
> > +
> > +		hsw_crtc_enable_pre_transcoder(state, _crtc);
> > +
> > +		if (needs_transcoder)
> > +			hsw_configure_cpu_transcoder(_new_crtc_state);
> > +
> > +		/* Display WA #1180: WaDisableScalarClockGating: glk */
> > +		psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > +			new_crtc_state->pch_pfit.enabled;
> > +		if (psl_clkgate_wa)
> > +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe,
> > true);
> > +
> > +		hsw_crtc_enable_post_transcoder(state, _crtc);
> > +
> > +		if (needs_transcoder)
> > +			intel_encoders_enable(state, crtc);
> > +		else
> > +			intel_crtc_vblank_on(_new_crtc_state);
> > +
> > +		if (psl_clkgate_wa) {
> > +			intel_crtc_wait_for_next_vblank(crtc);
> > +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe,
> > false);
> > +		}
> >
> > -	/* If we change the relative order between pipe/planes enabling, we
> > need
> > -	 * to change the workaround. */
> > -	hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
> > -	if (IS_HASWELL(dev_priv) && hsw_workaround_pipe !=
> > INVALID_PIPE) {
> > -		struct intel_crtc *wa_crtc;
> > +		/* If we change the relative order between pipe/planes
> > enabling, we need
> > +		 * to change the workaround. */
> > +		hsw_workaround_pipe = new_crtc_state-
> > >hsw_workaround_pipe;
> > +		if (IS_HASWELL(dev_priv) && hsw_workaround_pipe !=
> > INVALID_PIPE) {
> > +			struct intel_crtc *wa_crtc;
> >
> > -		wa_crtc = intel_crtc_for_pipe(dev_priv,
> > hsw_workaround_pipe);
> > +			wa_crtc = intel_crtc_for_pipe(dev_priv,
> > hsw_workaround_pipe);
> >
> > -		intel_crtc_wait_for_next_vblank(wa_crtc);
> > -		intel_crtc_wait_for_next_vblank(wa_crtc);
> > +			intel_crtc_wait_for_next_vblank(wa_crtc);
> > +			intel_crtc_wait_for_next_vblank(wa_crtc);
> > +		}
> >  	}
> >  }
> >
> > @@ -1784,28 +1820,27 @@ static void hsw_crtc_disable(struct
> > intel_atomic_state *state,
> >  	const struct intel_crtc_state *old_crtc_state =
> >  		intel_atomic_get_old_crtc_state(state, crtc);
> >  	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
> > +	int slave_pipe_mask =
> > intel_crtc_bigjoiner_slave_pipes(old_crtc_state);
> > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > +	struct intel_crtc *_crtc;
> > +
> > +	for_each_intel_crtc_in_pipe_mask(&i915->drm, _crtc,
> > +					 pipe_mask) {
> > +		const struct intel_crtc_state *_old_crtc_state =
> > +			intel_atomic_get_old_crtc_state(state, _crtc);
> > +		bool needs_encoder_disable = (slave_pipe_mask & BIT(_crtc-
> > >pipe)) ==
> > +0;
> > +
> > +		if (needs_encoder_disable) {
> > +			intel_encoders_disable(state, _crtc);
> > +			intel_encoders_post_disable(state, _crtc);
> > +		}
> >
> > -	/*
> > -	 * FIXME collapse everything to one hook.
> > -	 * Need care with mst->ddi interactions.
> > -	 */
> > -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> > -		intel_encoders_disable(state, crtc);
> > -		intel_encoders_post_disable(state, crtc);
> > -	}
> > -
> > -	intel_disable_shared_dpll(old_crtc_state);
> > -
> > -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> > -		struct intel_crtc *slave_crtc;
> > -
> > -		intel_encoders_post_pll_disable(state, crtc);
> > +		intel_disable_shared_dpll(_old_crtc_state);
> >
> > -		intel_dmc_disable_pipe(i915, crtc->pipe);
> > +		if (needs_encoder_disable)
> > +			intel_encoders_post_pll_disable(state, _crtc);
> >
> > -		for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > -
> > intel_crtc_bigjoiner_slave_pipes(old_crtc_state))
> > -			intel_dmc_disable_pipe(i915, slave_crtc->pipe);
> > +		intel_dmc_disable_pipe(i915, _crtc->pipe);
> >  	}
> >  }
> >
> > @@ -6788,8 +6823,10 @@ static void
> > intel_commit_modeset_disables(struct
> > intel_atomic_state *state)
> >  		 * Slave vblanks are masked till Master Vblanks.
> >  		 */
> >  		if (!is_trans_port_sync_slave(old_crtc_state) &&
> > -		    !intel_dp_mst_is_slave_trans(old_crtc_state) &&
> > -		    !intel_crtc_is_bigjoiner_slave(old_crtc_state))
> > +		    !intel_dp_mst_is_slave_trans(old_crtc_state))
> > +			continue;
> > +
> > +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
> >  			continue;
> 
> Should we use !intel_crtc_is_bigjoiner_slave here?
> Kindly suggest.
> 
> >
> >  		intel_old_crtc_state_disables(state, old_crtc_state, @@ -
> > 6807,6 +6844,9 @@ static void intel_commit_modeset_disables(struct
> > intel_atomic_state *state)
> >  		if (!old_crtc_state->hw.active)
> >  			continue;
> >
> > +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
> > +			continue;
> > +
> >  		intel_old_crtc_state_disables(state, old_crtc_state,
> >  					      new_crtc_state, crtc);
> >  	}
> > @@ -6919,8 +6959,10 @@ static void skl_commit_modeset_enables(struct
> > intel_atomic_state *state)
> >  			continue;
> >
> >  		if (intel_dp_mst_is_slave_trans(new_crtc_state) ||
> > -		    is_trans_port_sync_master(new_crtc_state) ||
> > -		    intel_crtc_is_bigjoiner_master(new_crtc_state))
> > +		    is_trans_port_sync_master(new_crtc_state))
> > +			continue;
> > +
> > +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> >  			continue;
> >
> Should we use !intel_crtc_is_bigjoiner_master here?
> Kindly suggest.

Apologies, I meant intel_crtc_is_bigjoiner_master 

> 
> >  		modeset_pipes &= ~BIT(pipe);
> > @@ -6930,7 +6972,7 @@ static void skl_commit_modeset_enables(struct
> > intel_atomic_state *state)
> >
> >  	/*
> >  	 * Then we enable all remaining pipes that depend on other
> > -	 * pipes: MST slaves and port sync masters, big joiner master
> > +	 * pipes: MST slaves and port sync masters
> >  	 */
> >  	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
> >  		enum pipe pipe = crtc->pipe;
> > @@ -6938,6 +6980,9 @@ static void skl_commit_modeset_enables(struct
> > intel_atomic_state *state)
> >  		if ((modeset_pipes & BIT(pipe)) == 0)
> >  			continue;
> >
> > +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > +			continue;
> > +
> >  		modeset_pipes &= ~BIT(pipe);
> >
> >  		intel_enable_crtc(state, crtc);
> > diff --git a/drivers/gpu/drm/i915/display/intel_display.h
> > b/drivers/gpu/drm/i915/display/intel_display.h
> > index f4a0773f0fca8..e1e8d956c305e 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display.h
> > @@ -280,6 +280,12 @@ enum phy_fia {
> >  			    base.head)					\
> >  		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
> >
> > +#define for_each_intel_crtc_in_pipe_mask_reverse(dev, intel_crtc,
> > pipe_mask)	\
> > +	list_for_each_entry_reverse(intel_crtc,
> > 	\
> > +				    &(dev)->mode_config.crtc_list,
> > 	\
> > +				    base.head)
> > 	\
> > +		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
> > +
> >  #define for_each_intel_encoder(dev, intel_encoder)		\
> >  	list_for_each_entry(intel_encoder,			\
> >  			    &(dev)->mode_config.encoder_list,	\
> > --
> > 2.37.3


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0
  2024-02-26 19:56   ` Jani Nikula
@ 2024-02-27  9:04     ` Lisovskiy, Stanislav
  2024-02-27  9:06       ` Srinivas, Vidya
  2024-02-27  9:15       ` Jani Nikula
  0 siblings, 2 replies; 33+ messages in thread
From: Lisovskiy, Stanislav @ 2024-02-27  9:04 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx, jani.saarinen, ville.syrjala, vidya.srinivas

On Mon, Feb 26, 2024 at 09:56:10PM +0200, Jani Nikula wrote:
> On Wed, 21 Feb 2024, Stanislav Lisovskiy <stanislav.lisovskiy@intel.com> wrote:
> > Patch calculates bigjoiner pipes in mst compute.
> > Patch also passes bigjoiner bool to validate plane
> > max size.
> 
> Please use the imperative mood in commit messages, e.g. "calculate"
> intead of "calculates".
> 
> Please do not refer to "patch". We know it's a patch, until it isn't,
> and then it's a commit.
> 
> Please explain *why* the changes are being done, not just *what* is
> being done.
> 
> In the subject, what is "bigjoiner case for DP2.0"? DP 2.0 is a spec
> version, and as such irrelevant for the changes being done.
> 
> > Signed-off-by: vsrini4 <vidya.srinivas@intel.com>
> 
> ?

Hi Jani, I just added that patch from Vidya to my series, to be honest,
didn't have time at all to look much into it.
Looks like its me who is going to fix that.

> 
> > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 19 ++++++++++++-------
> >  1 file changed, 12 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > index 5307ddd4edcf5..fd27d9976c050 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > @@ -523,6 +523,7 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
> >  				       struct drm_connector_state *conn_state)
> >  {
> >  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> > +	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
> >  	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> >  	struct intel_dp *intel_dp = &intel_mst->primary->dp;
> >  	const struct intel_connector *connector =
> > @@ -540,6 +541,10 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
> >  	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
> >  		return -EINVAL;
> >  
> > +	if (intel_dp_need_bigjoiner(intel_dp, adjusted_mode->crtc_hdisplay,
> > +				    adjusted_mode->crtc_clock))
> > +		pipe_config->bigjoiner_pipes = GENMASK(crtc->pipe + 1, crtc->pipe);
> > +
> >  	pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB;
> >  	pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
> >  	pipe_config->has_pch_encoder = false;
> > @@ -1318,12 +1323,6 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
> >  	 *   corresponding link capabilities of the sink) in case the
> >  	 *   stream is uncompressed for it by the last branch device.
> >  	 */
> > -	if (mode_rate > max_rate || mode->clock > max_dotclk ||
> > -	    drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port->full_pbn) {
> > -		*status = MODE_CLOCK_HIGH;
> > -		return 0;
> > -	}
> > -
> >  	if (mode->clock < 10000) {
> >  		*status = MODE_CLOCK_LOW;
> >  		return 0;
> > @@ -1343,6 +1342,12 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
> >  		return 0;
> >  	}
> >  
> > +	if (mode_rate > max_rate || mode->clock > max_dotclk ||
> > +	    drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port->full_pbn) {
> > +		*status = MODE_CLOCK_HIGH;
> > +		return 0;
> > +	}
> > +
> >  	if (DISPLAY_VER(dev_priv) >= 10 &&
> >  	    drm_dp_sink_supports_dsc(intel_connector->dp.dsc_dpcd)) {
> >  		/*
> > @@ -1385,7 +1390,7 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
> >  		return 0;
> >  	}
> >  
> > -	*status = intel_mode_valid_max_plane_size(dev_priv, mode, false);
> > +	*status = intel_mode_valid_max_plane_size(dev_priv, mode, bigjoiner);
> >  	return 0;
> >  }
> 
> -- 
> Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* RE: [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0
  2024-02-27  9:04     ` Lisovskiy, Stanislav
@ 2024-02-27  9:06       ` Srinivas, Vidya
  2024-02-27  9:14         ` Lisovskiy, Stanislav
  2024-02-27  9:15       ` Jani Nikula
  1 sibling, 1 reply; 33+ messages in thread
From: Srinivas, Vidya @ 2024-02-27  9:06 UTC (permalink / raw)
  To: Lisovskiy, Stanislav, Jani Nikula
  Cc: intel-gfx@lists.freedesktop.org, Saarinen, Jani,
	ville.syrjala@linux.intel.com



> -----Original Message-----
> From: Lisovskiy, Stanislav <stanislav.lisovskiy@intel.com>
> Sent: Tuesday, February 27, 2024 2:34 PM
> To: Jani Nikula <jani.nikula@linux.intel.com>
> Cc: intel-gfx@lists.freedesktop.org; Saarinen, Jani <jani.saarinen@intel.com>;
> ville.syrjala@linux.intel.com; Srinivas, Vidya <vidya.srinivas@intel.com>
> Subject: Re: [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0
> 
> On Mon, Feb 26, 2024 at 09:56:10PM +0200, Jani Nikula wrote:
> > On Wed, 21 Feb 2024, Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> wrote:
> > > Patch calculates bigjoiner pipes in mst compute.
> > > Patch also passes bigjoiner bool to validate plane max size.
> >
> > Please use the imperative mood in commit messages, e.g. "calculate"
> > intead of "calculates".
> >
> > Please do not refer to "patch". We know it's a patch, until it isn't,
> > and then it's a commit.
> >
> > Please explain *why* the changes are being done, not just *what* is
> > being done.
> >
> > In the subject, what is "bigjoiner case for DP2.0"? DP 2.0 is a spec
> > version, and as such irrelevant for the changes being done.
> >
> > > Signed-off-by: vsrini4 <vidya.srinivas@intel.com>
> >
> > ?
> 
> Hi Jani, I just added that patch from Vidya to my series, to be honest, didn't
> have time at all to look much into it.
> Looks like its me who is going to fix that.

Hello Stan
My sincere apologies. I dint want to disturb your series, so I did not fix it.
Please let me know if I should fix it. Sorry again.
Thank you Jani for the comments.

Regards
Vidya
> 
> >
> > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > > ---
> > >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 19
> > > ++++++++++++-------
> > >  1 file changed, 12 insertions(+), 7 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > index 5307ddd4edcf5..fd27d9976c050 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > @@ -523,6 +523,7 @@ static int intel_dp_mst_compute_config(struct
> intel_encoder *encoder,
> > >  				       struct drm_connector_state *conn_state)
> {
> > >  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> > > +	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
> > >  	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> > >  	struct intel_dp *intel_dp = &intel_mst->primary->dp;
> > >  	const struct intel_connector *connector = @@ -540,6 +541,10 @@
> > > static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
> > >  	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
> > >  		return -EINVAL;
> > >
> > > +	if (intel_dp_need_bigjoiner(intel_dp, adjusted_mode->crtc_hdisplay,
> > > +				    adjusted_mode->crtc_clock))
> > > +		pipe_config->bigjoiner_pipes = GENMASK(crtc->pipe + 1,
> > > +crtc->pipe);
> > > +
> > >  	pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB;
> > >  	pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
> > >  	pipe_config->has_pch_encoder = false; @@ -1318,12 +1323,6 @@
> > > intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
> > >  	 *   corresponding link capabilities of the sink) in case the
> > >  	 *   stream is uncompressed for it by the last branch device.
> > >  	 */
> > > -	if (mode_rate > max_rate || mode->clock > max_dotclk ||
> > > -	    drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port-
> >full_pbn) {
> > > -		*status = MODE_CLOCK_HIGH;
> > > -		return 0;
> > > -	}
> > > -
> > >  	if (mode->clock < 10000) {
> > >  		*status = MODE_CLOCK_LOW;
> > >  		return 0;
> > > @@ -1343,6 +1342,12 @@ intel_dp_mst_mode_valid_ctx(struct
> drm_connector *connector,
> > >  		return 0;
> > >  	}
> > >
> > > +	if (mode_rate > max_rate || mode->clock > max_dotclk ||
> > > +	    drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port-
> >full_pbn) {
> > > +		*status = MODE_CLOCK_HIGH;
> > > +		return 0;
> > > +	}
> > > +
> > >  	if (DISPLAY_VER(dev_priv) >= 10 &&
> > >  	    drm_dp_sink_supports_dsc(intel_connector->dp.dsc_dpcd)) {
> > >  		/*
> > > @@ -1385,7 +1390,7 @@ intel_dp_mst_mode_valid_ctx(struct
> drm_connector *connector,
> > >  		return 0;
> > >  	}
> > >
> > > -	*status = intel_mode_valid_max_plane_size(dev_priv, mode, false);
> > > +	*status = intel_mode_valid_max_plane_size(dev_priv, mode,
> > > +bigjoiner);
> > >  	return 0;
> > >  }
> >
> > --
> > Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset
  2024-02-27  4:40   ` Srinivas, Vidya
  2024-02-27  4:52     ` Srinivas, Vidya
@ 2024-02-27  9:11     ` Lisovskiy, Stanislav
  2024-02-27 16:16       ` Srinivas, Vidya
  1 sibling, 1 reply; 33+ messages in thread
From: Lisovskiy, Stanislav @ 2024-02-27  9:11 UTC (permalink / raw)
  To: Srinivas, Vidya
  Cc: intel-gfx@lists.freedesktop.org, Saarinen, Jani,
	ville.syrjala@linux.intel.com

On Tue, Feb 27, 2024 at 06:40:23AM +0200, Srinivas, Vidya wrote:
> 
> 
> > -----Original Message-----
> > From: Lisovskiy, Stanislav <stanislav.lisovskiy@intel.com>
> > Sent: Thursday, February 22, 2024 12:50 AM
> > To: intel-gfx@lists.freedesktop.org
> > Cc: Lisovskiy, Stanislav <stanislav.lisovskiy@intel.com>; Saarinen, Jani
> > <jani.saarinen@intel.com>; ville.syrjala@linux.intel.com; Srinivas, Vidya
> > <vidya.srinivas@intel.com>
> > Subject: [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner
> > during modeset
> > 
> > Handle only bigjoiner masters in skl_commit_modeset_enables/disables,
> > slave crtcs should be handled by master hooks. Same for encoders.
> > That way we can also remove a bunch of checks like
> > intel_crtc_is_bigjoiner_slave.
> > 
> > v2: Get rid of master vs slave checks and separation in crtc enable/disable
> > hooks.
> >     Use unified iteration cycle for all of those, while enabling/disabling
> >     transcoder only for those pipes where its needed(Ville Syrjälä)
> > 
> > v3: Move all the intel_encoder_* calls under transcoder code path(Ville
> > Syrjälä)
> > 
> > v4:  - Call intel_crtc_vblank_on from hsw_crtc_enable only for non-transcoder
> > path
> >        (for master pipe that will be called from
> > intel_encoders_enable/intel_enable_ddi)
> >      - Fix stupid mistake with using crtc->pipe for the mask, instead of BIT(crtc-
> > >pipe)
> > 
> > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_ddi.c     |  21 +--
> >  drivers/gpu/drm/i915/display/intel_display.c | 183 ++++++++++++-------
> >  drivers/gpu/drm/i915/display/intel_display.h |   6 +
> >  3 files changed, 121 insertions(+), 89 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c
> > b/drivers/gpu/drm/i915/display/intel_ddi.c
> > index bea4415902044..6071e9f500871 100644
> > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > @@ -3100,7 +3100,6 @@ static void intel_ddi_post_disable(struct
> > intel_atomic_state *state,
> >  				   const struct drm_connector_state
> > *old_conn_state)  {
> >  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> > -	struct intel_crtc *slave_crtc;
> > 
> >  	if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST)) {
> >  		intel_crtc_vblank_off(old_crtc_state);
> > @@ -3117,17 +3116,6 @@ static void intel_ddi_post_disable(struct
> > intel_atomic_state *state,
> >  			ilk_pfit_disable(old_crtc_state);
> >  	}
> > 
> > -	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, slave_crtc,
> > -
> > intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) {
> > -		const struct intel_crtc_state *old_slave_crtc_state =
> > -			intel_atomic_get_old_crtc_state(state, slave_crtc);
> > -
> > -		intel_crtc_vblank_off(old_slave_crtc_state);
> > -
> > -		intel_dsc_disable(old_slave_crtc_state);
> > -		skl_scaler_disable(old_slave_crtc_state);
> > -	}
> > -
> >  	/*
> >  	 * When called from DP MST code:
> >  	 * - old_conn_state will be NULL
> > @@ -3363,8 +3351,7 @@ static void intel_enable_ddi(struct
> > intel_atomic_state *state,  {
> >  	drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
> > 
> > -	if (!intel_crtc_is_bigjoiner_slave(crtc_state))
> > -		intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > +	intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > 
> >  	/* Enable/Disable DP2.0 SDP split config before transcoder */
> >  	intel_audio_sdp_split_update(crtc_state);
> > @@ -3469,9 +3456,6 @@ void intel_ddi_update_active_dpll(struct
> > intel_atomic_state *state,
> >  				  struct intel_crtc *crtc)
> >  {
> >  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> > -	struct intel_crtc_state *crtc_state =
> > -		intel_atomic_get_new_crtc_state(state, crtc);
> > -	struct intel_crtc *slave_crtc;
> >  	enum phy phy = intel_port_to_phy(i915, encoder->port);
> > 
> >  	/* FIXME: Add MTL pll_mgr */
> > @@ -3479,9 +3463,6 @@ void intel_ddi_update_active_dpll(struct
> > intel_atomic_state *state,
> >  		return;
> > 
> >  	intel_update_active_dpll(state, crtc, encoder);
> > -	for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > -
> > intel_crtc_bigjoiner_slave_pipes(crtc_state))
> > -		intel_update_active_dpll(state, slave_crtc, encoder);
> >  }
> > 
> >  static void
> > diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> > b/drivers/gpu/drm/i915/display/intel_display.c
> > index 916c13a149fd5..e1ea53fd6a288 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > @@ -1631,31 +1631,12 @@ static void hsw_configure_cpu_transcoder(const
> > struct intel_crtc_state *crtc_sta
> >  	hsw_set_transconf(crtc_state);
> >  }
> > 
> > -static void hsw_crtc_enable(struct intel_atomic_state *state,
> > -			    struct intel_crtc *crtc)
> > +static void hsw_crtc_enable_pre_transcoder(struct intel_atomic_state *state,
> > +					   struct intel_crtc *crtc)
> >  {
> >  	const struct intel_crtc_state *new_crtc_state =
> >  		intel_atomic_get_new_crtc_state(state, crtc);
> >  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > -	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > -	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > -	bool psl_clkgate_wa;
> > -
> > -	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > -		return;
> > -
> > -	intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > -
> > -	if (!new_crtc_state->bigjoiner_pipes) {
> > -		intel_encoders_pre_pll_enable(state, crtc);
> > -
> > -		if (new_crtc_state->shared_dpll)
> > -			intel_enable_shared_dpll(new_crtc_state);
> > -
> > -		intel_encoders_pre_enable(state, crtc);
> > -	} else {
> > -		icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > -	}
> > 
> >  	intel_dsc_enable(new_crtc_state);
> > 
> > @@ -1665,19 +1646,17 @@ static void hsw_crtc_enable(struct
> > intel_atomic_state *state,
> >  	intel_set_pipe_src_size(new_crtc_state);
> >  	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
> >  		bdw_set_pipe_misc(new_crtc_state);
> > +}
> > 
> > -	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&
> > -	    !transcoder_is_dsi(cpu_transcoder))
> > -		hsw_configure_cpu_transcoder(new_crtc_state);
> > +static void hsw_crtc_enable_post_transcoder(struct intel_atomic_state
> > *state,
> > +					    struct intel_crtc *crtc)
> > +{
> > +	const struct intel_crtc_state *new_crtc_state =
> > +		intel_atomic_get_new_crtc_state(state, crtc);
> > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > 
> >  	crtc->active = true;
> > 
> > -	/* Display WA #1180: WaDisableScalarClockGating: glk */
> > -	psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > -		new_crtc_state->pch_pfit.enabled;
> > -	if (psl_clkgate_wa)
> > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> > -
> >  	if (DISPLAY_VER(dev_priv) >= 9)
> >  		skl_pfit_enable(new_crtc_state);
> >  	else
> > @@ -1700,27 +1679,84 @@ static void hsw_crtc_enable(struct
> > intel_atomic_state *state,
> >  		icl_set_pipe_chicken(new_crtc_state);
> > 
> >  	intel_initial_watermarks(state, crtc);
> > +}
> > 
> > -	if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > -		intel_crtc_vblank_on(new_crtc_state);
> > +static void hsw_crtc_enable(struct intel_atomic_state *state,
> > +			    struct intel_crtc *crtc)
> > +{
> > +	const struct intel_crtc_state *new_crtc_state =
> > +		intel_atomic_get_new_crtc_state(state, crtc);
> > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > +	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > +	struct intel_crtc *_crtc;
> > +	int slave_pipe_mask =
> > intel_crtc_bigjoiner_slave_pipes(new_crtc_state);
> 
> 
> Many thanks for the patch series.
> Should we calculate slave_pipe_mask only if the modeset
> was received on the slave pipe. Else, we noticed that
> each time its traversing through slave pipe even when
> modeset was received on master (say pipe = 1)
> Kindly suggest.

That is exactly how it should happen. For bigjoiner if we get a modeset
on master pipe, we traverse both master and its slaves.
That is how bigjoiner is supposed to work.

> 
> > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > +	bool psl_clkgate_wa;
> > +	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > 
> > -	intel_encoders_enable(state, crtc);
> > +	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > +		return;
> > 
> > -	if (psl_clkgate_wa) {
> > -		intel_crtc_wait_for_next_vblank(crtc);
> > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> > -	}
> > +	/*
> > +	 * Use reverse iterator to go through slave pipes first.
> > +	 * TODO: We might need smarter iterator here
> > +	 */
> > +	for_each_intel_crtc_in_pipe_mask_reverse(&dev_priv->drm, _crtc,
> > +						 pipe_mask) {
> > +		const struct intel_crtc_state *_new_crtc_state =
> > +			intel_atomic_get_new_crtc_state(state, _crtc);
> > +		bool needs_transcoder = ((slave_pipe_mask & BIT(_crtc-
> > >pipe)) == 0) &&
> > +					!transcoder_is_dsi(cpu_transcoder);
> > +
> > +		intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > +
> > +		if (!new_crtc_state->bigjoiner_pipes) {
> > +			if (needs_transcoder)
> > +				intel_encoders_pre_pll_enable(state, crtc);
> 
> 
> Should we use _crtc here. In remaining places in this function also.
> Kindly suggest.

Yes, you are right. Even though it doesn't hurt currently, because we call
this only for master so crtc is guaranteed to be the one which needs to
follow the transcoder path.

> 
> > +
> > +			if (new_crtc_state->shared_dpll)
> > +				intel_enable_shared_dpll(new_crtc_state);
> > +
> > +			if (needs_transcoder)
> > +				intel_encoders_pre_enable(state, crtc);
> > +		} else {
> > +			icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > +		}
> > +
> > +		hsw_crtc_enable_pre_transcoder(state, _crtc);
> > +
> > +		if (needs_transcoder)
> > +			hsw_configure_cpu_transcoder(_new_crtc_state);
> > +
> > +		/* Display WA #1180: WaDisableScalarClockGating: glk */
> > +		psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > +			new_crtc_state->pch_pfit.enabled;
> > +		if (psl_clkgate_wa)
> > +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe,
> > true);
> > +
> > +		hsw_crtc_enable_post_transcoder(state, _crtc);
> > +
> > +		if (needs_transcoder)
> > +			intel_encoders_enable(state, crtc);
> > +		else
> > +			intel_crtc_vblank_on(_new_crtc_state);
> > +
> > +		if (psl_clkgate_wa) {
> > +			intel_crtc_wait_for_next_vblank(crtc);
> > +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe,
> > false);
> > +		}
> > 
> > -	/* If we change the relative order between pipe/planes enabling, we
> > need
> > -	 * to change the workaround. */
> > -	hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
> > -	if (IS_HASWELL(dev_priv) && hsw_workaround_pipe !=
> > INVALID_PIPE) {
> > -		struct intel_crtc *wa_crtc;
> > +		/* If we change the relative order between pipe/planes
> > enabling, we need
> > +		 * to change the workaround. */
> > +		hsw_workaround_pipe = new_crtc_state-
> > >hsw_workaround_pipe;
> > +		if (IS_HASWELL(dev_priv) && hsw_workaround_pipe !=
> > INVALID_PIPE) {
> > +			struct intel_crtc *wa_crtc;
> > 
> > -		wa_crtc = intel_crtc_for_pipe(dev_priv,
> > hsw_workaround_pipe);
> > +			wa_crtc = intel_crtc_for_pipe(dev_priv,
> > hsw_workaround_pipe);
> > 
> > -		intel_crtc_wait_for_next_vblank(wa_crtc);
> > -		intel_crtc_wait_for_next_vblank(wa_crtc);
> > +			intel_crtc_wait_for_next_vblank(wa_crtc);
> > +			intel_crtc_wait_for_next_vblank(wa_crtc);
> > +		}
> >  	}
> >  }
> > 
> > @@ -1784,28 +1820,27 @@ static void hsw_crtc_disable(struct
> > intel_atomic_state *state,
> >  	const struct intel_crtc_state *old_crtc_state =
> >  		intel_atomic_get_old_crtc_state(state, crtc);
> >  	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
> > +	int slave_pipe_mask =
> > intel_crtc_bigjoiner_slave_pipes(old_crtc_state);
> > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > +	struct intel_crtc *_crtc;
> > +
> > +	for_each_intel_crtc_in_pipe_mask(&i915->drm, _crtc,
> > +					 pipe_mask) {
> > +		const struct intel_crtc_state *_old_crtc_state =
> > +			intel_atomic_get_old_crtc_state(state, _crtc);
> > +		bool needs_encoder_disable = (slave_pipe_mask & BIT(_crtc-
> > >pipe)) ==
> > +0;
> > +
> > +		if (needs_encoder_disable) {
> > +			intel_encoders_disable(state, _crtc);
> > +			intel_encoders_post_disable(state, _crtc);
> > +		}
> > 
> > -	/*
> > -	 * FIXME collapse everything to one hook.
> > -	 * Need care with mst->ddi interactions.
> > -	 */
> > -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> > -		intel_encoders_disable(state, crtc);
> > -		intel_encoders_post_disable(state, crtc);
> > -	}
> > -
> > -	intel_disable_shared_dpll(old_crtc_state);
> > -
> > -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> > -		struct intel_crtc *slave_crtc;
> > -
> > -		intel_encoders_post_pll_disable(state, crtc);
> > +		intel_disable_shared_dpll(_old_crtc_state);
> > 
> > -		intel_dmc_disable_pipe(i915, crtc->pipe);
> > +		if (needs_encoder_disable)
> > +			intel_encoders_post_pll_disable(state, _crtc);
> > 
> > -		for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > -
> > intel_crtc_bigjoiner_slave_pipes(old_crtc_state))
> > -			intel_dmc_disable_pipe(i915, slave_crtc->pipe);
> > +		intel_dmc_disable_pipe(i915, _crtc->pipe);
> >  	}
> >  }
> > 
> > @@ -6788,8 +6823,10 @@ static void intel_commit_modeset_disables(struct
> > intel_atomic_state *state)
> >  		 * Slave vblanks are masked till Master Vblanks.
> >  		 */
> >  		if (!is_trans_port_sync_slave(old_crtc_state) &&
> > -		    !intel_dp_mst_is_slave_trans(old_crtc_state) &&
> > -		    !intel_crtc_is_bigjoiner_slave(old_crtc_state))
> > +		    !intel_dp_mst_is_slave_trans(old_crtc_state))
> > +			continue;
> > +
> > +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
> >  			continue;
> 
> Should we use !intel_crtc_is_bigjoiner_slave here?
> Kindly suggest.

No. The main idea of that whole refactoring is that we never do anything for
slave pipes in *commit_modeset_disables/enables. Those are intentionally skipped
and handled from master pipes. In bigjoiner slave pipes are no longer independent.
So if we detect that pipe is the slave pipe with a check above - we skip it.

> 
> > 
> >  		intel_old_crtc_state_disables(state, old_crtc_state, @@ -
> > 6807,6 +6844,9 @@ static void intel_commit_modeset_disables(struct
> > intel_atomic_state *state)
> >  		if (!old_crtc_state->hw.active)
> >  			continue;
> > 
> > +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
> > +			continue;
> > +
> >  		intel_old_crtc_state_disables(state, old_crtc_state,
> >  					      new_crtc_state, crtc);
> >  	}
> > @@ -6919,8 +6959,10 @@ static void skl_commit_modeset_enables(struct
> > intel_atomic_state *state)
> >  			continue;
> > 
> >  		if (intel_dp_mst_is_slave_trans(new_crtc_state) ||
> > -		    is_trans_port_sync_master(new_crtc_state) ||
> > -		    intel_crtc_is_bigjoiner_master(new_crtc_state))
> > +		    is_trans_port_sync_master(new_crtc_state))
> > +			continue;
> > +
> > +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> >  			continue;
> > 
> Should we use !intel_crtc_is_bigjoiner_master here?
> Kindly suggest.

See above. We handle here only master pipes and skip slave pipes here.

> 
> >  		modeset_pipes &= ~BIT(pipe);
> > @@ -6930,7 +6972,7 @@ static void skl_commit_modeset_enables(struct
> > intel_atomic_state *state)
> > 
> >  	/*
> >  	 * Then we enable all remaining pipes that depend on other
> > -	 * pipes: MST slaves and port sync masters, big joiner master
> > +	 * pipes: MST slaves and port sync masters
> >  	 */
> >  	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
> >  		enum pipe pipe = crtc->pipe;
> > @@ -6938,6 +6980,9 @@ static void skl_commit_modeset_enables(struct
> > intel_atomic_state *state)
> >  		if ((modeset_pipes & BIT(pipe)) == 0)
> >  			continue;
> > 
> > +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > +			continue;
> > +
> >  		modeset_pipes &= ~BIT(pipe);
> > 
> >  		intel_enable_crtc(state, crtc);
> > diff --git a/drivers/gpu/drm/i915/display/intel_display.h
> > b/drivers/gpu/drm/i915/display/intel_display.h
> > index f4a0773f0fca8..e1e8d956c305e 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display.h
> > @@ -280,6 +280,12 @@ enum phy_fia {
> >  			    base.head)					\
> >  		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
> > 
> > +#define for_each_intel_crtc_in_pipe_mask_reverse(dev, intel_crtc,
> > pipe_mask)	\
> > +	list_for_each_entry_reverse(intel_crtc,
> > 	\
> > +				    &(dev)->mode_config.crtc_list,
> > 	\
> > +				    base.head)
> > 	\
> > +		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
> > +
> >  #define for_each_intel_encoder(dev, intel_encoder)		\
> >  	list_for_each_entry(intel_encoder,			\
> >  			    &(dev)->mode_config.encoder_list,	\
> > --
> > 2.37.3
> 

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0
  2024-02-27  9:06       ` Srinivas, Vidya
@ 2024-02-27  9:14         ` Lisovskiy, Stanislav
  2024-02-27 18:51           ` Srinivas, Vidya
  0 siblings, 1 reply; 33+ messages in thread
From: Lisovskiy, Stanislav @ 2024-02-27  9:14 UTC (permalink / raw)
  To: Srinivas, Vidya
  Cc: Jani Nikula, intel-gfx@lists.freedesktop.org, Saarinen, Jani,
	ville.syrjala@linux.intel.com

On Tue, Feb 27, 2024 at 11:06:16AM +0200, Srinivas, Vidya wrote:
> 
> 
> > -----Original Message-----
> > From: Lisovskiy, Stanislav <stanislav.lisovskiy@intel.com>
> > Sent: Tuesday, February 27, 2024 2:34 PM
> > To: Jani Nikula <jani.nikula@linux.intel.com>
> > Cc: intel-gfx@lists.freedesktop.org; Saarinen, Jani <jani.saarinen@intel.com>;
> > ville.syrjala@linux.intel.com; Srinivas, Vidya <vidya.srinivas@intel.com>
> > Subject: Re: [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0
> > 
> > On Mon, Feb 26, 2024 at 09:56:10PM +0200, Jani Nikula wrote:
> > > On Wed, 21 Feb 2024, Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > wrote:
> > > > Patch calculates bigjoiner pipes in mst compute.
> > > > Patch also passes bigjoiner bool to validate plane max size.
> > >
> > > Please use the imperative mood in commit messages, e.g. "calculate"
> > > intead of "calculates".
> > >
> > > Please do not refer to "patch". We know it's a patch, until it isn't,
> > > and then it's a commit.
> > >
> > > Please explain *why* the changes are being done, not just *what* is
> > > being done.
> > >
> > > In the subject, what is "bigjoiner case for DP2.0"? DP 2.0 is a spec
> > > version, and as such irrelevant for the changes being done.
> > >
> > > > Signed-off-by: vsrini4 <vidya.srinivas@intel.com>
> > >
> > > ?
> > 
> > Hi Jani, I just added that patch from Vidya to my series, to be honest, didn't
> > have time at all to look much into it.
> > Looks like its me who is going to fix that.
> 
> Hello Stan
> My sincere apologies. I dint want to disturb your series, so I did not fix it.
> Please let me know if I should fix it. Sorry again.
> Thank you Jani for the comments.
> 
> Regards
> Vidya

Hi Vidya,

it is a bit unclear for me as well now, how do we proceed, since your patch is part
of my series, I was explicitly asked to add it, does it mean you are fixing it now or me?
Well if you address Jani's comments, I definitely dont mind :)

> > 
> > >
> > > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > > > ---
> > > >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 19
> > > > ++++++++++++-------
> > > >  1 file changed, 12 insertions(+), 7 deletions(-)
> > > >
> > > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > > b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > > index 5307ddd4edcf5..fd27d9976c050 100644
> > > > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > > @@ -523,6 +523,7 @@ static int intel_dp_mst_compute_config(struct
> > intel_encoder *encoder,
> > > >  				       struct drm_connector_state *conn_state)
> > {
> > > >  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> > > > +	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
> > > >  	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> > > >  	struct intel_dp *intel_dp = &intel_mst->primary->dp;
> > > >  	const struct intel_connector *connector = @@ -540,6 +541,10 @@
> > > > static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
> > > >  	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
> > > >  		return -EINVAL;
> > > >
> > > > +	if (intel_dp_need_bigjoiner(intel_dp, adjusted_mode->crtc_hdisplay,
> > > > +				    adjusted_mode->crtc_clock))
> > > > +		pipe_config->bigjoiner_pipes = GENMASK(crtc->pipe + 1,
> > > > +crtc->pipe);
> > > > +
> > > >  	pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB;
> > > >  	pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
> > > >  	pipe_config->has_pch_encoder = false; @@ -1318,12 +1323,6 @@
> > > > intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
> > > >  	 *   corresponding link capabilities of the sink) in case the
> > > >  	 *   stream is uncompressed for it by the last branch device.
> > > >  	 */
> > > > -	if (mode_rate > max_rate || mode->clock > max_dotclk ||
> > > > -	    drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port-
> > >full_pbn) {
> > > > -		*status = MODE_CLOCK_HIGH;
> > > > -		return 0;
> > > > -	}
> > > > -
> > > >  	if (mode->clock < 10000) {
> > > >  		*status = MODE_CLOCK_LOW;
> > > >  		return 0;
> > > > @@ -1343,6 +1342,12 @@ intel_dp_mst_mode_valid_ctx(struct
> > drm_connector *connector,
> > > >  		return 0;
> > > >  	}
> > > >
> > > > +	if (mode_rate > max_rate || mode->clock > max_dotclk ||
> > > > +	    drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port-
> > >full_pbn) {
> > > > +		*status = MODE_CLOCK_HIGH;
> > > > +		return 0;
> > > > +	}
> > > > +
> > > >  	if (DISPLAY_VER(dev_priv) >= 10 &&
> > > >  	    drm_dp_sink_supports_dsc(intel_connector->dp.dsc_dpcd)) {
> > > >  		/*
> > > > @@ -1385,7 +1390,7 @@ intel_dp_mst_mode_valid_ctx(struct
> > drm_connector *connector,
> > > >  		return 0;
> > > >  	}
> > > >
> > > > -	*status = intel_mode_valid_max_plane_size(dev_priv, mode, false);
> > > > +	*status = intel_mode_valid_max_plane_size(dev_priv, mode,
> > > > +bigjoiner);
> > > >  	return 0;
> > > >  }
> > >
> > > --
> > > Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0
  2024-02-27  9:04     ` Lisovskiy, Stanislav
  2024-02-27  9:06       ` Srinivas, Vidya
@ 2024-02-27  9:15       ` Jani Nikula
  2024-02-27 18:07         ` Manasi Navare
  1 sibling, 1 reply; 33+ messages in thread
From: Jani Nikula @ 2024-02-27  9:15 UTC (permalink / raw)
  To: Lisovskiy, Stanislav
  Cc: intel-gfx, jani.saarinen, ville.syrjala, vidya.srinivas

On Tue, 27 Feb 2024, "Lisovskiy, Stanislav" <stanislav.lisovskiy@intel.com> wrote:
> On Mon, Feb 26, 2024 at 09:56:10PM +0200, Jani Nikula wrote:
>> On Wed, 21 Feb 2024, Stanislav Lisovskiy <stanislav.lisovskiy@intel.com> wrote:
>> > Patch calculates bigjoiner pipes in mst compute.
>> > Patch also passes bigjoiner bool to validate plane
>> > max size.
>> 
>> Please use the imperative mood in commit messages, e.g. "calculate"
>> intead of "calculates".
>> 
>> Please do not refer to "patch". We know it's a patch, until it isn't,
>> and then it's a commit.
>> 
>> Please explain *why* the changes are being done, not just *what* is
>> being done.
>> 
>> In the subject, what is "bigjoiner case for DP2.0"? DP 2.0 is a spec
>> version, and as such irrelevant for the changes being done.
>> 
>> > Signed-off-by: vsrini4 <vidya.srinivas@intel.com>
>> 
>> ?
>
> Hi Jani, I just added that patch from Vidya to my series, to be honest,
> didn't have time at all to look much into it.
> Looks like its me who is going to fix that.

Should the original authorship be preserved? If not, please add
Co-developed-by. Just having the Signed-off-by is not enough.

BR,
Jani.


>
>> 
>> > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
>> > ---
>> >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 19 ++++++++++++-------
>> >  1 file changed, 12 insertions(+), 7 deletions(-)
>> >
>> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
>> > index 5307ddd4edcf5..fd27d9976c050 100644
>> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
>> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
>> > @@ -523,6 +523,7 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
>> >  				       struct drm_connector_state *conn_state)
>> >  {
>> >  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
>> > +	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
>> >  	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
>> >  	struct intel_dp *intel_dp = &intel_mst->primary->dp;
>> >  	const struct intel_connector *connector =
>> > @@ -540,6 +541,10 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
>> >  	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
>> >  		return -EINVAL;
>> >  
>> > +	if (intel_dp_need_bigjoiner(intel_dp, adjusted_mode->crtc_hdisplay,
>> > +				    adjusted_mode->crtc_clock))
>> > +		pipe_config->bigjoiner_pipes = GENMASK(crtc->pipe + 1, crtc->pipe);
>> > +
>> >  	pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB;
>> >  	pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
>> >  	pipe_config->has_pch_encoder = false;
>> > @@ -1318,12 +1323,6 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
>> >  	 *   corresponding link capabilities of the sink) in case the
>> >  	 *   stream is uncompressed for it by the last branch device.
>> >  	 */
>> > -	if (mode_rate > max_rate || mode->clock > max_dotclk ||
>> > -	    drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port->full_pbn) {
>> > -		*status = MODE_CLOCK_HIGH;
>> > -		return 0;
>> > -	}
>> > -
>> >  	if (mode->clock < 10000) {
>> >  		*status = MODE_CLOCK_LOW;
>> >  		return 0;
>> > @@ -1343,6 +1342,12 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
>> >  		return 0;
>> >  	}
>> >  
>> > +	if (mode_rate > max_rate || mode->clock > max_dotclk ||
>> > +	    drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port->full_pbn) {
>> > +		*status = MODE_CLOCK_HIGH;
>> > +		return 0;
>> > +	}
>> > +
>> >  	if (DISPLAY_VER(dev_priv) >= 10 &&
>> >  	    drm_dp_sink_supports_dsc(intel_connector->dp.dsc_dpcd)) {
>> >  		/*
>> > @@ -1385,7 +1390,7 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
>> >  		return 0;
>> >  	}
>> >  
>> > -	*status = intel_mode_valid_max_plane_size(dev_priv, mode, false);
>> > +	*status = intel_mode_valid_max_plane_size(dev_priv, mode, bigjoiner);
>> >  	return 0;
>> >  }
>> 
>> -- 
>> Jani Nikula, Intel

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* RE: [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset
  2024-02-27  9:11     ` Lisovskiy, Stanislav
@ 2024-02-27 16:16       ` Srinivas, Vidya
  0 siblings, 0 replies; 33+ messages in thread
From: Srinivas, Vidya @ 2024-02-27 16:16 UTC (permalink / raw)
  To: Lisovskiy, Stanislav
  Cc: intel-gfx@lists.freedesktop.org, Saarinen, Jani,
	ville.syrjala@linux.intel.com



> -----Original Message-----
> From: Lisovskiy, Stanislav <stanislav.lisovskiy@intel.com>
> Sent: Tuesday, February 27, 2024 2:41 PM
> To: Srinivas, Vidya <vidya.srinivas@intel.com>
> Cc: intel-gfx@lists.freedesktop.org; Saarinen, Jani <jani.saarinen@intel.com>;
> ville.syrjala@linux.intel.com
> Subject: Re: [PATCH 2/3] Start separating pipe vs transcoder set logic for
> bigjoiner during modeset
> 
> On Tue, Feb 27, 2024 at 06:40:23AM +0200, Srinivas, Vidya wrote:
> >
> >
> > > -----Original Message-----
> > > From: Lisovskiy, Stanislav <stanislav.lisovskiy@intel.com>
> > > Sent: Thursday, February 22, 2024 12:50 AM
> > > To: intel-gfx@lists.freedesktop.org
> > > Cc: Lisovskiy, Stanislav <stanislav.lisovskiy@intel.com>; Saarinen,
> > > Jani <jani.saarinen@intel.com>; ville.syrjala@linux.intel.com;
> > > Srinivas, Vidya <vidya.srinivas@intel.com>
> > > Subject: [PATCH 2/3] Start separating pipe vs transcoder set logic
> > > for bigjoiner during modeset
> > >
> > > Handle only bigjoiner masters in
> > > skl_commit_modeset_enables/disables,
> > > slave crtcs should be handled by master hooks. Same for encoders.
> > > That way we can also remove a bunch of checks like
> > > intel_crtc_is_bigjoiner_slave.
> > >
> > > v2: Get rid of master vs slave checks and separation in crtc
> > > enable/disable hooks.
> > >     Use unified iteration cycle for all of those, while enabling/disabling
> > >     transcoder only for those pipes where its needed(Ville Syrjälä)
> > >
> > > v3: Move all the intel_encoder_* calls under transcoder code
> > > path(Ville
> > > Syrjälä)
> > >
> > > v4:  - Call intel_crtc_vblank_on from hsw_crtc_enable only for
> > > non-transcoder path
> > >        (for master pipe that will be called from
> > > intel_encoders_enable/intel_enable_ddi)
> > >      - Fix stupid mistake with using crtc->pipe for the mask,
> > > instead of BIT(crtc-
> > > >pipe)
> > >
> > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > > ---
> > >  drivers/gpu/drm/i915/display/intel_ddi.c     |  21 +--
> > >  drivers/gpu/drm/i915/display/intel_display.c | 183 ++++++++++++-------
> > >  drivers/gpu/drm/i915/display/intel_display.h |   6 +
> > >  3 files changed, 121 insertions(+), 89 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c
> > > b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > index bea4415902044..6071e9f500871 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > @@ -3100,7 +3100,6 @@ static void intel_ddi_post_disable(struct
> > > intel_atomic_state *state,
> > >  				   const struct drm_connector_state
> > > *old_conn_state)  {
> > >  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> > > -	struct intel_crtc *slave_crtc;
> > >
> > >  	if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST)) {
> > >  		intel_crtc_vblank_off(old_crtc_state);
> > > @@ -3117,17 +3116,6 @@ static void intel_ddi_post_disable(struct
> > > intel_atomic_state *state,
> > >  			ilk_pfit_disable(old_crtc_state);
> > >  	}
> > >
> > > -	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, slave_crtc,
> > > -
> > > intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) {
> > > -		const struct intel_crtc_state *old_slave_crtc_state =
> > > -			intel_atomic_get_old_crtc_state(state, slave_crtc);
> > > -
> > > -		intel_crtc_vblank_off(old_slave_crtc_state);
> > > -
> > > -		intel_dsc_disable(old_slave_crtc_state);
> > > -		skl_scaler_disable(old_slave_crtc_state);
> > > -	}
> > > -
> > >  	/*
> > >  	 * When called from DP MST code:
> > >  	 * - old_conn_state will be NULL
> > > @@ -3363,8 +3351,7 @@ static void intel_enable_ddi(struct
> > > intel_atomic_state *state,  {
> > >  	drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
> > >
> > > -	if (!intel_crtc_is_bigjoiner_slave(crtc_state))
> > > -		intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > > +	intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > >
> > >  	/* Enable/Disable DP2.0 SDP split config before transcoder */
> > >  	intel_audio_sdp_split_update(crtc_state);
> > > @@ -3469,9 +3456,6 @@ void intel_ddi_update_active_dpll(struct
> > > intel_atomic_state *state,
> > >  				  struct intel_crtc *crtc)
> > >  {
> > >  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> > > -	struct intel_crtc_state *crtc_state =
> > > -		intel_atomic_get_new_crtc_state(state, crtc);
> > > -	struct intel_crtc *slave_crtc;
> > >  	enum phy phy = intel_port_to_phy(i915, encoder->port);
> > >
> > >  	/* FIXME: Add MTL pll_mgr */
> > > @@ -3479,9 +3463,6 @@ void intel_ddi_update_active_dpll(struct
> > > intel_atomic_state *state,
> > >  		return;
> > >
> > >  	intel_update_active_dpll(state, crtc, encoder);
> > > -	for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > > -
> > > intel_crtc_bigjoiner_slave_pipes(crtc_state))
> > > -		intel_update_active_dpll(state, slave_crtc, encoder);
> > >  }
> > >
> > >  static void
> > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> > > b/drivers/gpu/drm/i915/display/intel_display.c
> > > index 916c13a149fd5..e1ea53fd6a288 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > > @@ -1631,31 +1631,12 @@ static void
> > > hsw_configure_cpu_transcoder(const
> > > struct intel_crtc_state *crtc_sta
> > >  	hsw_set_transconf(crtc_state);
> > >  }
> > >
> > > -static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > -			    struct intel_crtc *crtc)
> > > +static void hsw_crtc_enable_pre_transcoder(struct intel_atomic_state
> *state,
> > > +					   struct intel_crtc *crtc)
> > >  {
> > >  	const struct intel_crtc_state *new_crtc_state =
> > >  		intel_atomic_get_new_crtc_state(state, crtc);
> > >  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > -	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > > -	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > -	bool psl_clkgate_wa;
> > > -
> > > -	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > -		return;
> > > -
> > > -	intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > -
> > > -	if (!new_crtc_state->bigjoiner_pipes) {
> > > -		intel_encoders_pre_pll_enable(state, crtc);
> > > -
> > > -		if (new_crtc_state->shared_dpll)
> > > -			intel_enable_shared_dpll(new_crtc_state);
> > > -
> > > -		intel_encoders_pre_enable(state, crtc);
> > > -	} else {
> > > -		icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > -	}
> > >
> > >  	intel_dsc_enable(new_crtc_state);
> > >
> > > @@ -1665,19 +1646,17 @@ static void hsw_crtc_enable(struct
> > > intel_atomic_state *state,
> > >  	intel_set_pipe_src_size(new_crtc_state);
> > >  	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
> > >  		bdw_set_pipe_misc(new_crtc_state);
> > > +}
> > >
> > > -	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&
> > > -	    !transcoder_is_dsi(cpu_transcoder))
> > > -		hsw_configure_cpu_transcoder(new_crtc_state);
> > > +static void hsw_crtc_enable_post_transcoder(struct
> > > +intel_atomic_state
> > > *state,
> > > +					    struct intel_crtc *crtc)
> > > +{
> > > +	const struct intel_crtc_state *new_crtc_state =
> > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > >
> > >  	crtc->active = true;
> > >
> > > -	/* Display WA #1180: WaDisableScalarClockGating: glk */
> > > -	psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > > -		new_crtc_state->pch_pfit.enabled;
> > > -	if (psl_clkgate_wa)
> > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> > > -
> > >  	if (DISPLAY_VER(dev_priv) >= 9)
> > >  		skl_pfit_enable(new_crtc_state);
> > >  	else
> > > @@ -1700,27 +1679,84 @@ static void hsw_crtc_enable(struct
> > > intel_atomic_state *state,
> > >  		icl_set_pipe_chicken(new_crtc_state);
> > >
> > >  	intel_initial_watermarks(state, crtc);
> > > +}
> > >
> > > -	if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > > -		intel_crtc_vblank_on(new_crtc_state);
> > > +static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > +			    struct intel_crtc *crtc)
> > > +{
> > > +	const struct intel_crtc_state *new_crtc_state =
> > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > +	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > +	struct intel_crtc *_crtc;
> > > +	int slave_pipe_mask =
> > > intel_crtc_bigjoiner_slave_pipes(new_crtc_state);
> >
> >
> > Many thanks for the patch series.
> > Should we calculate slave_pipe_mask only if the modeset was received
> > on the slave pipe. Else, we noticed that each time its traversing
> > through slave pipe even when modeset was received on master (say pipe
> > = 1) Kindly suggest.
> 
> That is exactly how it should happen. For bigjoiner if we get a modeset on
> master pipe, we traverse both master and its slaves.
> That is how bigjoiner is supposed to work.

Hello Stan
Many thanks for the inputs and info.

Apologies, actually we tried to use your series as is but we faced drm_WARN panic
and we couldn't get the 6k working. We tried to debug a bit and
based on that we added these comments here. We have added
all the details in VLK-52374. Could you kindly help check and suggest?
Thank you so much.

Regards
Vidya

> 
> >
> > > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > > +	bool psl_clkgate_wa;
> > > +	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > >
> > > -	intel_encoders_enable(state, crtc);
> > > +	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > +		return;
> > >
> > > -	if (psl_clkgate_wa) {
> > > -		intel_crtc_wait_for_next_vblank(crtc);
> > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> > > -	}
> > > +	/*
> > > +	 * Use reverse iterator to go through slave pipes first.
> > > +	 * TODO: We might need smarter iterator here
> > > +	 */
> > > +	for_each_intel_crtc_in_pipe_mask_reverse(&dev_priv->drm, _crtc,
> > > +						 pipe_mask) {
> > > +		const struct intel_crtc_state *_new_crtc_state =
> > > +			intel_atomic_get_new_crtc_state(state, _crtc);
> > > +		bool needs_transcoder = ((slave_pipe_mask & BIT(_crtc-
> > > >pipe)) == 0) &&
> > > +					!transcoder_is_dsi(cpu_transcoder);
> > > +
> > > +		intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > +
> > > +		if (!new_crtc_state->bigjoiner_pipes) {
> > > +			if (needs_transcoder)
> > > +				intel_encoders_pre_pll_enable(state, crtc);
> >
> >
> > Should we use _crtc here. In remaining places in this function also.
> > Kindly suggest.
> 
> Yes, you are right. Even though it doesn't hurt currently, because we call this
> only for master so crtc is guaranteed to be the one which needs to follow the
> transcoder path.
> 
> >
> > > +
> > > +			if (new_crtc_state->shared_dpll)
> > > +				intel_enable_shared_dpll(new_crtc_state);
> > > +
> > > +			if (needs_transcoder)
> > > +				intel_encoders_pre_enable(state, crtc);
> > > +		} else {
> > > +			icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > +		}
> > > +
> > > +		hsw_crtc_enable_pre_transcoder(state, _crtc);
> > > +
> > > +		if (needs_transcoder)
> > > +			hsw_configure_cpu_transcoder(_new_crtc_state);
> > > +
> > > +		/* Display WA #1180: WaDisableScalarClockGating: glk */
> > > +		psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > > +			new_crtc_state->pch_pfit.enabled;
> > > +		if (psl_clkgate_wa)
> > > +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe,
> > > true);
> > > +
> > > +		hsw_crtc_enable_post_transcoder(state, _crtc);
> > > +
> > > +		if (needs_transcoder)
> > > +			intel_encoders_enable(state, crtc);
> > > +		else
> > > +			intel_crtc_vblank_on(_new_crtc_state);
> > > +
> > > +		if (psl_clkgate_wa) {
> > > +			intel_crtc_wait_for_next_vblank(crtc);
> > > +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe,
> > > false);
> > > +		}
> > >
> > > -	/* If we change the relative order between pipe/planes enabling, we
> > > need
> > > -	 * to change the workaround. */
> > > -	hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
> > > -	if (IS_HASWELL(dev_priv) && hsw_workaround_pipe !=
> > > INVALID_PIPE) {
> > > -		struct intel_crtc *wa_crtc;
> > > +		/* If we change the relative order between pipe/planes
> > > enabling, we need
> > > +		 * to change the workaround. */
> > > +		hsw_workaround_pipe = new_crtc_state-
> > > >hsw_workaround_pipe;
> > > +		if (IS_HASWELL(dev_priv) && hsw_workaround_pipe !=
> > > INVALID_PIPE) {
> > > +			struct intel_crtc *wa_crtc;
> > >
> > > -		wa_crtc = intel_crtc_for_pipe(dev_priv,
> > > hsw_workaround_pipe);
> > > +			wa_crtc = intel_crtc_for_pipe(dev_priv,
> > > hsw_workaround_pipe);
> > >
> > > -		intel_crtc_wait_for_next_vblank(wa_crtc);
> > > -		intel_crtc_wait_for_next_vblank(wa_crtc);
> > > +			intel_crtc_wait_for_next_vblank(wa_crtc);
> > > +			intel_crtc_wait_for_next_vblank(wa_crtc);
> > > +		}
> > >  	}
> > >  }
> > >
> > > @@ -1784,28 +1820,27 @@ static void hsw_crtc_disable(struct
> > > intel_atomic_state *state,
> > >  	const struct intel_crtc_state *old_crtc_state =
> > >  		intel_atomic_get_old_crtc_state(state, crtc);
> > >  	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
> > > +	int slave_pipe_mask =
> > > intel_crtc_bigjoiner_slave_pipes(old_crtc_state);
> > > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > > +	struct intel_crtc *_crtc;
> > > +
> > > +	for_each_intel_crtc_in_pipe_mask(&i915->drm, _crtc,
> > > +					 pipe_mask) {
> > > +		const struct intel_crtc_state *_old_crtc_state =
> > > +			intel_atomic_get_old_crtc_state(state, _crtc);
> > > +		bool needs_encoder_disable = (slave_pipe_mask & BIT(_crtc-
> > > >pipe)) ==
> > > +0;
> > > +
> > > +		if (needs_encoder_disable) {
> > > +			intel_encoders_disable(state, _crtc);
> > > +			intel_encoders_post_disable(state, _crtc);
> > > +		}
> > >
> > > -	/*
> > > -	 * FIXME collapse everything to one hook.
> > > -	 * Need care with mst->ddi interactions.
> > > -	 */
> > > -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> > > -		intel_encoders_disable(state, crtc);
> > > -		intel_encoders_post_disable(state, crtc);
> > > -	}
> > > -
> > > -	intel_disable_shared_dpll(old_crtc_state);
> > > -
> > > -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> > > -		struct intel_crtc *slave_crtc;
> > > -
> > > -		intel_encoders_post_pll_disable(state, crtc);
> > > +		intel_disable_shared_dpll(_old_crtc_state);
> > >
> > > -		intel_dmc_disable_pipe(i915, crtc->pipe);
> > > +		if (needs_encoder_disable)
> > > +			intel_encoders_post_pll_disable(state, _crtc);
> > >
> > > -		for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > > -
> > > intel_crtc_bigjoiner_slave_pipes(old_crtc_state))
> > > -			intel_dmc_disable_pipe(i915, slave_crtc->pipe);
> > > +		intel_dmc_disable_pipe(i915, _crtc->pipe);
> > >  	}
> > >  }
> > >
> > > @@ -6788,8 +6823,10 @@ static void
> > > intel_commit_modeset_disables(struct
> > > intel_atomic_state *state)
> > >  		 * Slave vblanks are masked till Master Vblanks.
> > >  		 */
> > >  		if (!is_trans_port_sync_slave(old_crtc_state) &&
> > > -		    !intel_dp_mst_is_slave_trans(old_crtc_state) &&
> > > -		    !intel_crtc_is_bigjoiner_slave(old_crtc_state))
> > > +		    !intel_dp_mst_is_slave_trans(old_crtc_state))
> > > +			continue;
> > > +
> > > +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
> > >  			continue;
> >
> > Should we use !intel_crtc_is_bigjoiner_slave here?
> > Kindly suggest.
> 
> No. The main idea of that whole refactoring is that we never do anything for
> slave pipes in *commit_modeset_disables/enables. Those are intentionally
> skipped and handled from master pipes. In bigjoiner slave pipes are no
> longer independent.
> So if we detect that pipe is the slave pipe with a check above - we skip it.
> 
> >
> > >
> > >  		intel_old_crtc_state_disables(state, old_crtc_state, @@ -
> > > 6807,6 +6844,9 @@ static void intel_commit_modeset_disables(struct
> > > intel_atomic_state *state)
> > >  		if (!old_crtc_state->hw.active)
> > >  			continue;
> > >
> > > +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
> > > +			continue;
> > > +
> > >  		intel_old_crtc_state_disables(state, old_crtc_state,
> > >  					      new_crtc_state, crtc);
> > >  	}
> > > @@ -6919,8 +6959,10 @@ static void
> skl_commit_modeset_enables(struct
> > > intel_atomic_state *state)
> > >  			continue;
> > >
> > >  		if (intel_dp_mst_is_slave_trans(new_crtc_state) ||
> > > -		    is_trans_port_sync_master(new_crtc_state) ||
> > > -		    intel_crtc_is_bigjoiner_master(new_crtc_state))
> > > +		    is_trans_port_sync_master(new_crtc_state))
> > > +			continue;
> > > +
> > > +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > >  			continue;
> > >
> > Should we use !intel_crtc_is_bigjoiner_master here?
> > Kindly suggest.
> 
> See above. We handle here only master pipes and skip slave pipes here.
> 
> >
> > >  		modeset_pipes &= ~BIT(pipe);
> > > @@ -6930,7 +6972,7 @@ static void skl_commit_modeset_enables(struct
> > > intel_atomic_state *state)
> > >
> > >  	/*
> > >  	 * Then we enable all remaining pipes that depend on other
> > > -	 * pipes: MST slaves and port sync masters, big joiner master
> > > +	 * pipes: MST slaves and port sync masters
> > >  	 */
> > >  	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
> > >  		enum pipe pipe = crtc->pipe;
> > > @@ -6938,6 +6980,9 @@ static void skl_commit_modeset_enables(struct
> > > intel_atomic_state *state)
> > >  		if ((modeset_pipes & BIT(pipe)) == 0)
> > >  			continue;
> > >
> > > +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > > +			continue;
> > > +
> > >  		modeset_pipes &= ~BIT(pipe);
> > >
> > >  		intel_enable_crtc(state, crtc);
> > > diff --git a/drivers/gpu/drm/i915/display/intel_display.h
> > > b/drivers/gpu/drm/i915/display/intel_display.h
> > > index f4a0773f0fca8..e1e8d956c305e 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_display.h
> > > +++ b/drivers/gpu/drm/i915/display/intel_display.h
> > > @@ -280,6 +280,12 @@ enum phy_fia {
> > >  			    base.head)					\
> > >  		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
> > >
> > > +#define for_each_intel_crtc_in_pipe_mask_reverse(dev, intel_crtc,
> > > pipe_mask)	\
> > > +	list_for_each_entry_reverse(intel_crtc,
> > > 	\
> > > +				    &(dev)->mode_config.crtc_list,
> > > 	\
> > > +				    base.head)
> > > 	\
> > > +		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
> > > +
> > >  #define for_each_intel_encoder(dev, intel_encoder)		\
> > >  	list_for_each_entry(intel_encoder,			\
> > >  			    &(dev)->mode_config.encoder_list,	\
> > > --
> > > 2.37.3
> >

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0
  2024-02-27  9:15       ` Jani Nikula
@ 2024-02-27 18:07         ` Manasi Navare
  2024-02-27 18:48           ` Srinivas, Vidya
  0 siblings, 1 reply; 33+ messages in thread
From: Manasi Navare @ 2024-02-27 18:07 UTC (permalink / raw)
  To: Jani Nikula
  Cc: Lisovskiy, Stanislav, intel-gfx, jani.saarinen, ville.syrjala,
	vidya.srinivas

Thanks Jani for your review.
Thanks @Lisovskiy, Stanislav  and @vidya.srinivas@intel.com for taking
this patch forward.

@Jani Nikula , @Ville Syrjälä : MST bigjoiner as a feature needs to be
enabled upstream and this patch enables that feature.
If you agree that bigjoiner refactoring patches 1 and 2 have no impact
on enabling bigjoiner on MST, could we decouple this patch from
bigjoiner refactoring and land this separately?

We need the Bigjoiner to be enabled on MST feature landed asap and
bigjoiner refactoring can follow.

Regards
Manasi

On Tue, Feb 27, 2024 at 1:15 AM Jani Nikula <jani.nikula@linux.intel.com> wrote:
>
> On Tue, 27 Feb 2024, "Lisovskiy, Stanislav" <stanislav.lisovskiy@intel.com> wrote:
> > On Mon, Feb 26, 2024 at 09:56:10PM +0200, Jani Nikula wrote:
> >> On Wed, 21 Feb 2024, Stanislav Lisovskiy <stanislav.lisovskiy@intel.com> wrote:
> >> > Patch calculates bigjoiner pipes in mst compute.
> >> > Patch also passes bigjoiner bool to validate plane
> >> > max size.
> >>
> >> Please use the imperative mood in commit messages, e.g. "calculate"
> >> intead of "calculates".
> >>
> >> Please do not refer to "patch". We know it's a patch, until it isn't,
> >> and then it's a commit.
> >>
> >> Please explain *why* the changes are being done, not just *what* is
> >> being done.
> >>
> >> In the subject, what is "bigjoiner case for DP2.0"? DP 2.0 is a spec
> >> version, and as such irrelevant for the changes being done.
> >>
> >> > Signed-off-by: vsrini4 <vidya.srinivas@intel.com>
> >>
> >> ?
> >
> > Hi Jani, I just added that patch from Vidya to my series, to be honest,
> > didn't have time at all to look much into it.
> > Looks like its me who is going to fix that.
>
> Should the original authorship be preserved? If not, please add
> Co-developed-by. Just having the Signed-off-by is not enough.
>
> BR,
> Jani.
>
>
> >
> >>
> >> > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> >> > ---
> >> >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 19 ++++++++++++-------
> >> >  1 file changed, 12 insertions(+), 7 deletions(-)
> >> >
> >> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> >> > index 5307ddd4edcf5..fd27d9976c050 100644
> >> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> >> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> >> > @@ -523,6 +523,7 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
> >> >                                   struct drm_connector_state *conn_state)
> >> >  {
> >> >    struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> >> > +  struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
> >> >    struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> >> >    struct intel_dp *intel_dp = &intel_mst->primary->dp;
> >> >    const struct intel_connector *connector =
> >> > @@ -540,6 +541,10 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
> >> >    if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
> >> >            return -EINVAL;
> >> >
> >> > +  if (intel_dp_need_bigjoiner(intel_dp, adjusted_mode->crtc_hdisplay,
> >> > +                              adjusted_mode->crtc_clock))
> >> > +          pipe_config->bigjoiner_pipes = GENMASK(crtc->pipe + 1, crtc->pipe);
> >> > +
> >> >    pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB;
> >> >    pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
> >> >    pipe_config->has_pch_encoder = false;
> >> > @@ -1318,12 +1323,6 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
> >> >     *   corresponding link capabilities of the sink) in case the
> >> >     *   stream is uncompressed for it by the last branch device.
> >> >     */
> >> > -  if (mode_rate > max_rate || mode->clock > max_dotclk ||
> >> > -      drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port->full_pbn) {
> >> > -          *status = MODE_CLOCK_HIGH;
> >> > -          return 0;
> >> > -  }
> >> > -
> >> >    if (mode->clock < 10000) {
> >> >            *status = MODE_CLOCK_LOW;
> >> >            return 0;
> >> > @@ -1343,6 +1342,12 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
> >> >            return 0;
> >> >    }
> >> >
> >> > +  if (mode_rate > max_rate || mode->clock > max_dotclk ||
> >> > +      drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port->full_pbn) {
> >> > +          *status = MODE_CLOCK_HIGH;
> >> > +          return 0;
> >> > +  }
> >> > +
> >> >    if (DISPLAY_VER(dev_priv) >= 10 &&
> >> >        drm_dp_sink_supports_dsc(intel_connector->dp.dsc_dpcd)) {
> >> >            /*
> >> > @@ -1385,7 +1390,7 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
> >> >            return 0;
> >> >    }
> >> >
> >> > -  *status = intel_mode_valid_max_plane_size(dev_priv, mode, false);
> >> > +  *status = intel_mode_valid_max_plane_size(dev_priv, mode, bigjoiner);
> >> >    return 0;
> >> >  }
> >>
> >> --
> >> Jani Nikula, Intel
>
> --
> Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* RE: [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0
  2024-02-27 18:07         ` Manasi Navare
@ 2024-02-27 18:48           ` Srinivas, Vidya
  0 siblings, 0 replies; 33+ messages in thread
From: Srinivas, Vidya @ 2024-02-27 18:48 UTC (permalink / raw)
  To: Manasi Navare, Jani Nikula, Lisovskiy, Stanislav
  Cc: intel-gfx@lists.freedesktop.org, Saarinen, Jani,
	ville.syrjala@linux.intel.com



> -----Original Message-----
> From: Manasi Navare <navaremanasi@chromium.org>
> Sent: Tuesday, February 27, 2024 11:37 PM
> To: Jani Nikula <jani.nikula@linux.intel.com>
> Cc: Lisovskiy, Stanislav <stanislav.lisovskiy@intel.com>; intel-
> gfx@lists.freedesktop.org; Saarinen, Jani <jani.saarinen@intel.com>;
> ville.syrjala@linux.intel.com; Srinivas, Vidya <vidya.srinivas@intel.com>
> Subject: Re: [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0
> 
> Thanks Jani for your review.
> Thanks @Lisovskiy, Stanislav  and @vidya.srinivas@intel.com for taking this
> patch forward.
> 
> @Jani Nikula , @Ville Syrjälä : MST bigjoiner as a feature needs to be enabled
> upstream and this patch enables that feature.
> If you agree that bigjoiner refactoring patches 1 and 2 have no impact on
> enabling bigjoiner on MST, could we decouple this patch from bigjoiner
> refactoring and land this separately?

Hello Manasi

Thank you.
I have submitted this series as suggested after addressing comments
from Jani Nikula about the commit message errors.
https://patchwork.freedesktop.org/series/130449/

Regards
Vidya

> 
> We need the Bigjoiner to be enabled on MST feature landed asap and
> bigjoiner refactoring can follow.
> 
> Regards
> Manasi
> 
> On Tue, Feb 27, 2024 at 1:15 AM Jani Nikula <jani.nikula@linux.intel.com>
> wrote:
> >
> > On Tue, 27 Feb 2024, "Lisovskiy, Stanislav" <stanislav.lisovskiy@intel.com>
> wrote:
> > > On Mon, Feb 26, 2024 at 09:56:10PM +0200, Jani Nikula wrote:
> > >> On Wed, 21 Feb 2024, Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> wrote:
> > >> > Patch calculates bigjoiner pipes in mst compute.
> > >> > Patch also passes bigjoiner bool to validate plane max size.
> > >>
> > >> Please use the imperative mood in commit messages, e.g. "calculate"
> > >> intead of "calculates".
> > >>
> > >> Please do not refer to "patch". We know it's a patch, until it
> > >> isn't, and then it's a commit.
> > >>
> > >> Please explain *why* the changes are being done, not just *what* is
> > >> being done.
> > >>
> > >> In the subject, what is "bigjoiner case for DP2.0"? DP 2.0 is a
> > >> spec version, and as such irrelevant for the changes being done.
> > >>
> > >> > Signed-off-by: vsrini4 <vidya.srinivas@intel.com>
> > >>
> > >> ?
> > >
> > > Hi Jani, I just added that patch from Vidya to my series, to be
> > > honest, didn't have time at all to look much into it.
> > > Looks like its me who is going to fix that.
> >
> > Should the original authorship be preserved? If not, please add
> > Co-developed-by. Just having the Signed-off-by is not enough.
> >
> > BR,
> > Jani.
> >
> >
> > >
> > >>
> > >> > Signed-off-by: Stanislav Lisovskiy
> > >> > <stanislav.lisovskiy@intel.com>
> > >> > ---
> > >> >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 19
> > >> > ++++++++++++-------
> > >> >  1 file changed, 12 insertions(+), 7 deletions(-)
> > >> >
> > >> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > >> > b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > >> > index 5307ddd4edcf5..fd27d9976c050 100644
> > >> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > >> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > >> > @@ -523,6 +523,7 @@ static int intel_dp_mst_compute_config(struct
> intel_encoder *encoder,
> > >> >                                   struct drm_connector_state
> > >> > *conn_state)  {
> > >> >    struct drm_i915_private *dev_priv =
> > >> > to_i915(encoder->base.dev);
> > >> > +  struct intel_crtc *crtc =
> > >> > + to_intel_crtc(pipe_config->uapi.crtc);
> > >> >    struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> > >> >    struct intel_dp *intel_dp = &intel_mst->primary->dp;
> > >> >    const struct intel_connector *connector = @@ -540,6 +541,10 @@
> > >> > static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
> > >> >    if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
> > >> >            return -EINVAL;
> > >> >
> > >> > +  if (intel_dp_need_bigjoiner(intel_dp, adjusted_mode->crtc_hdisplay,
> > >> > +                              adjusted_mode->crtc_clock))
> > >> > +          pipe_config->bigjoiner_pipes = GENMASK(crtc->pipe + 1,
> > >> > + crtc->pipe);
> > >> > +
> > >> >    pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB;
> > >> >    pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
> > >> >    pipe_config->has_pch_encoder = false; @@ -1318,12 +1323,6 @@
> > >> > intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
> > >> >     *   corresponding link capabilities of the sink) in case the
> > >> >     *   stream is uncompressed for it by the last branch device.
> > >> >     */
> > >> > -  if (mode_rate > max_rate || mode->clock > max_dotclk ||
> > >> > -      drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port-
> >full_pbn) {
> > >> > -          *status = MODE_CLOCK_HIGH;
> > >> > -          return 0;
> > >> > -  }
> > >> > -
> > >> >    if (mode->clock < 10000) {
> > >> >            *status = MODE_CLOCK_LOW;
> > >> >            return 0;
> > >> > @@ -1343,6 +1342,12 @@ intel_dp_mst_mode_valid_ctx(struct
> drm_connector *connector,
> > >> >            return 0;
> > >> >    }
> > >> >
> > >> > +  if (mode_rate > max_rate || mode->clock > max_dotclk ||
> > >> > +      drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) > port-
> >full_pbn) {
> > >> > +          *status = MODE_CLOCK_HIGH;
> > >> > +          return 0;
> > >> > +  }
> > >> > +
> > >> >    if (DISPLAY_VER(dev_priv) >= 10 &&
> > >> >        drm_dp_sink_supports_dsc(intel_connector->dp.dsc_dpcd)) {
> > >> >            /*
> > >> > @@ -1385,7 +1390,7 @@ intel_dp_mst_mode_valid_ctx(struct
> drm_connector *connector,
> > >> >            return 0;
> > >> >    }
> > >> >
> > >> > -  *status = intel_mode_valid_max_plane_size(dev_priv, mode,
> > >> > false);
> > >> > +  *status = intel_mode_valid_max_plane_size(dev_priv, mode,
> > >> > + bigjoiner);
> > >> >    return 0;
> > >> >  }
> > >>
> > >> --
> > >> Jani Nikula, Intel
> >
> > --
> > Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* RE: [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0
  2024-02-27  9:14         ` Lisovskiy, Stanislav
@ 2024-02-27 18:51           ` Srinivas, Vidya
  0 siblings, 0 replies; 33+ messages in thread
From: Srinivas, Vidya @ 2024-02-27 18:51 UTC (permalink / raw)
  To: Lisovskiy, Stanislav
  Cc: Jani Nikula, intel-gfx@lists.freedesktop.org, Saarinen, Jani,
	ville.syrjala@linux.intel.com



> -----Original Message-----
> From: Lisovskiy, Stanislav <stanislav.lisovskiy@intel.com>
> Sent: Tuesday, February 27, 2024 2:44 PM
> To: Srinivas, Vidya <vidya.srinivas@intel.com>
> Cc: Jani Nikula <jani.nikula@linux.intel.com>; intel-gfx@lists.freedesktop.org;
> Saarinen, Jani <jani.saarinen@intel.com>; ville.syrjala@linux.intel.com
> Subject: Re: [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0
> 
> On Tue, Feb 27, 2024 at 11:06:16AM +0200, Srinivas, Vidya wrote:
> >
> >
> > > -----Original Message-----
> > > From: Lisovskiy, Stanislav <stanislav.lisovskiy@intel.com>
> > > Sent: Tuesday, February 27, 2024 2:34 PM
> > > To: Jani Nikula <jani.nikula@linux.intel.com>
> > > Cc: intel-gfx@lists.freedesktop.org; Saarinen, Jani
> > > <jani.saarinen@intel.com>; ville.syrjala@linux.intel.com; Srinivas,
> > > Vidya <vidya.srinivas@intel.com>
> > > Subject: Re: [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0
> > >
> > > On Mon, Feb 26, 2024 at 09:56:10PM +0200, Jani Nikula wrote:
> > > > On Wed, 21 Feb 2024, Stanislav Lisovskiy
> > > > <stanislav.lisovskiy@intel.com>
> > > wrote:
> > > > > Patch calculates bigjoiner pipes in mst compute.
> > > > > Patch also passes bigjoiner bool to validate plane max size.
> > > >
> > > > Please use the imperative mood in commit messages, e.g. "calculate"
> > > > intead of "calculates".
> > > >
> > > > Please do not refer to "patch". We know it's a patch, until it
> > > > isn't, and then it's a commit.
> > > >
> > > > Please explain *why* the changes are being done, not just *what*
> > > > is being done.
> > > >
> > > > In the subject, what is "bigjoiner case for DP2.0"? DP 2.0 is a
> > > > spec version, and as such irrelevant for the changes being done.
> > > >
> > > > > Signed-off-by: vsrini4 <vidya.srinivas@intel.com>
> > > >
> > > > ?
> > >
> > > Hi Jani, I just added that patch from Vidya to my series, to be
> > > honest, didn't have time at all to look much into it.
> > > Looks like its me who is going to fix that.
> >
> > Hello Stan
> > My sincere apologies. I dint want to disturb your series, so I did not fix it.
> > Please let me know if I should fix it. Sorry again.
> > Thank you Jani for the comments.
> >
> > Regards
> > Vidya
> 
> Hi Vidya,
> 
> it is a bit unclear for me as well now, how do we proceed, since your patch is
> part of my series, I was explicitly asked to add it, does it mean you are fixing it
> now or me?
> Well if you address Jani's comments, I definitely dont mind :)

Hello Stan
Thank you so much. Just so that I don't disturb your series,
I have pushed this series https://patchwork.freedesktop.org/series/130449/
After addressing comments from Jani Nikula.

Many thanks Jani for the review
and apologies for the commit message errors. Kindly help check if this series
is okay. Thank you.

Regards
Vidya
 
> 
> > >
> > > >
> > > > > Signed-off-by: Stanislav Lisovskiy
> > > > > <stanislav.lisovskiy@intel.com>
> > > > > ---
> > > > >  drivers/gpu/drm/i915/display/intel_dp_mst.c | 19
> > > > > ++++++++++++-------
> > > > >  1 file changed, 12 insertions(+), 7 deletions(-)
> > > > >
> > > > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > > > b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > > > index 5307ddd4edcf5..fd27d9976c050 100644
> > > > > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > > > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > > > > @@ -523,6 +523,7 @@ static int
> > > > > intel_dp_mst_compute_config(struct
> > > intel_encoder *encoder,
> > > > >  				       struct drm_connector_state *conn_state)
> > > {
> > > > >  	struct drm_i915_private *dev_priv =
> > > > > to_i915(encoder->base.dev);
> > > > > +	struct intel_crtc *crtc =
> > > > > +to_intel_crtc(pipe_config->uapi.crtc);
> > > > >  	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> > > > >  	struct intel_dp *intel_dp = &intel_mst->primary->dp;
> > > > >  	const struct intel_connector *connector = @@ -540,6 +541,10 @@
> > > > > static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
> > > > >  	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
> > > > >  		return -EINVAL;
> > > > >
> > > > > +	if (intel_dp_need_bigjoiner(intel_dp, adjusted_mode-
> >crtc_hdisplay,
> > > > > +				    adjusted_mode->crtc_clock))
> > > > > +		pipe_config->bigjoiner_pipes = GENMASK(crtc->pipe
> + 1,
> > > > > +crtc->pipe);
> > > > > +
> > > > >  	pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB;
> > > > >  	pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
> > > > >  	pipe_config->has_pch_encoder = false; @@ -1318,12 +1323,6 @@
> > > > > intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
> > > > >  	 *   corresponding link capabilities of the sink) in case the
> > > > >  	 *   stream is uncompressed for it by the last branch device.
> > > > >  	 */
> > > > > -	if (mode_rate > max_rate || mode->clock > max_dotclk ||
> > > > > -	    drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) >
> port-
> > > >full_pbn) {
> > > > > -		*status = MODE_CLOCK_HIGH;
> > > > > -		return 0;
> > > > > -	}
> > > > > -
> > > > >  	if (mode->clock < 10000) {
> > > > >  		*status = MODE_CLOCK_LOW;
> > > > >  		return 0;
> > > > > @@ -1343,6 +1342,12 @@ intel_dp_mst_mode_valid_ctx(struct
> > > drm_connector *connector,
> > > > >  		return 0;
> > > > >  	}
> > > > >
> > > > > +	if (mode_rate > max_rate || mode->clock > max_dotclk ||
> > > > > +	    drm_dp_calc_pbn_mode(mode->clock, min_bpp << 4) >
> port-
> > > >full_pbn) {
> > > > > +		*status = MODE_CLOCK_HIGH;
> > > > > +		return 0;
> > > > > +	}
> > > > > +
> > > > >  	if (DISPLAY_VER(dev_priv) >= 10 &&
> > > > >  	    drm_dp_sink_supports_dsc(intel_connector->dp.dsc_dpcd)) {
> > > > >  		/*
> > > > > @@ -1385,7 +1390,7 @@ intel_dp_mst_mode_valid_ctx(struct
> > > drm_connector *connector,
> > > > >  		return 0;
> > > > >  	}
> > > > >
> > > > > -	*status = intel_mode_valid_max_plane_size(dev_priv, mode,
> false);
> > > > > +	*status = intel_mode_valid_max_plane_size(dev_priv, mode,
> > > > > +bigjoiner);
> > > > >  	return 0;
> > > > >  }
> > > >
> > > > --
> > > > Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 1/3] drm/i915/bigjoiner: Refactor bigjoiner state readout
  2024-02-21 19:20 ` [PATCH 1/3] drm/i915/bigjoiner: Refactor bigjoiner state readout Stanislav Lisovskiy
@ 2024-03-01 10:10   ` Ville Syrjälä
  2024-03-01 10:22     ` Lisovskiy, Stanislav
  0 siblings, 1 reply; 33+ messages in thread
From: Ville Syrjälä @ 2024-03-01 10:10 UTC (permalink / raw)
  To: Stanislav Lisovskiy; +Cc: intel-gfx, jani.saarinen, vidya.srinivas

On Wed, Feb 21, 2024 at 09:20:08PM +0200, Stanislav Lisovskiy wrote:
> Don't call enabled_bigjoiner_pipes twice, lets just move
> intel_get_bigjoiner_config earlier, because it is anyway
> calling same function.
> Also cleanup hsw_enabled_transcoders from irrelevant bigjoiner code.

I still don't like this.

> 
> Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_display.c | 22 ++++++++++----------
>  1 file changed, 11 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index 00ac65a140298..916c13a149fd5 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -3535,7 +3535,6 @@ static u8 hsw_enabled_transcoders(struct intel_crtc *crtc)
>  	struct drm_i915_private *dev_priv = to_i915(dev);
>  	u8 panel_transcoder_mask = hsw_panel_transcoders(dev_priv);
>  	enum transcoder cpu_transcoder;
> -	u8 master_pipes, slave_pipes;
>  	u8 enabled_transcoders = 0;
>  
>  	/*
> @@ -3586,15 +3585,6 @@ static u8 hsw_enabled_transcoders(struct intel_crtc *crtc)
>  	if (transcoder_ddi_func_is_enabled(dev_priv, cpu_transcoder))
>  		enabled_transcoders |= BIT(cpu_transcoder);
>  
> -	/* bigjoiner slave -> consider the master pipe's transcoder as well */
> -	enabled_bigjoiner_pipes(dev_priv, &master_pipes, &slave_pipes);
> -	if (slave_pipes & BIT(crtc->pipe)) {
> -		cpu_transcoder = (enum transcoder)
> -			get_bigjoiner_master_pipe(crtc->pipe, master_pipes, slave_pipes);
> -		if (transcoder_ddi_func_is_enabled(dev_priv, cpu_transcoder))
> -			enabled_transcoders |= BIT(cpu_transcoder);
> -	}
> -
>  	return enabled_transcoders;
>  }
>  
> @@ -3641,6 +3631,15 @@ static bool hsw_get_transcoder_state(struct intel_crtc *crtc,
>  	u32 tmp;
>  
>  	enabled_transcoders = hsw_enabled_transcoders(crtc);
> +
> +	/* bigjoiner slave -> consider the master pipe's transcoder as well */
> +	if (intel_crtc_is_bigjoiner_slave(pipe_config)) {
> +		unsigned long cpu_transcoder = (enum transcoder)
> +			bigjoiner_master_pipe(pipe_config);
> +		if (transcoder_ddi_func_is_enabled(dev_priv, cpu_transcoder))
> +			enabled_transcoders |= BIT(cpu_transcoder);
> +	}
> +
>  	if (!enabled_transcoders)
>  		return false;
>  
> @@ -3745,6 +3744,8 @@ static bool hsw_get_pipe_config(struct intel_crtc *crtc,
>  
>  	pipe_config->shared_dpll = NULL;
>  
> +	intel_bigjoiner_get_config(pipe_config);
> +
>  	active = hsw_get_transcoder_state(crtc, pipe_config, &crtc->hw_readout_power_domains);
>  
>  	if ((IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) &&
> @@ -3756,7 +3757,6 @@ static bool hsw_get_pipe_config(struct intel_crtc *crtc,
>  	if (!active)
>  		goto out;
>  
> -	intel_bigjoiner_get_config(pipe_config);
>  	intel_dsc_get_config(pipe_config);
>  
>  	if (!transcoder_is_dsi(pipe_config->cpu_transcoder) ||
> -- 
> 2.37.3

-- 
Ville Syrjälä
Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset
  2024-02-21 19:20 ` [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset Stanislav Lisovskiy
  2024-02-27  4:40   ` Srinivas, Vidya
@ 2024-03-01 10:10   ` Ville Syrjälä
  2024-03-01 10:27     ` Lisovskiy, Stanislav
  1 sibling, 1 reply; 33+ messages in thread
From: Ville Syrjälä @ 2024-03-01 10:10 UTC (permalink / raw)
  To: Stanislav Lisovskiy; +Cc: intel-gfx, jani.saarinen, vidya.srinivas

On Wed, Feb 21, 2024 at 09:20:09PM +0200, Stanislav Lisovskiy wrote:
> Handle only bigjoiner masters in skl_commit_modeset_enables/disables,
> slave crtcs should be handled by master hooks. Same for encoders.
> That way we can also remove a bunch of checks like intel_crtc_is_bigjoiner_slave.
> 
> v2: Get rid of master vs slave checks and separation in crtc enable/disable hooks.
>     Use unified iteration cycle for all of those, while enabling/disabling
>     transcoder only for those pipes where its needed(Ville Syrjälä)
> 
> v3: Move all the intel_encoder_* calls under transcoder code path(Ville Syrjälä)
> 
> v4:  - Call intel_crtc_vblank_on from hsw_crtc_enable only for non-transcoder path
>        (for master pipe that will be called from intel_encoders_enable/intel_enable_ddi)
>      - Fix stupid mistake with using crtc->pipe for the mask, instead of BIT(crtc->pipe)
> 
> Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_ddi.c     |  21 +--
>  drivers/gpu/drm/i915/display/intel_display.c | 183 ++++++++++++-------
>  drivers/gpu/drm/i915/display/intel_display.h |   6 +
>  3 files changed, 121 insertions(+), 89 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> index bea4415902044..6071e9f500871 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -3100,7 +3100,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
>  				   const struct drm_connector_state *old_conn_state)
>  {
>  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> -	struct intel_crtc *slave_crtc;
>  
>  	if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST)) {
>  		intel_crtc_vblank_off(old_crtc_state);
> @@ -3117,17 +3116,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
>  			ilk_pfit_disable(old_crtc_state);
>  	}

The master pipe stuff is right here ^ ...

>  
> -	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, slave_crtc,
> -					 intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) {
> -		const struct intel_crtc_state *old_slave_crtc_state =
> -			intel_atomic_get_old_crtc_state(state, slave_crtc);
> -
> -		intel_crtc_vblank_off(old_slave_crtc_state);
> -
> -		intel_dsc_disable(old_slave_crtc_state);
> -		skl_scaler_disable(old_slave_crtc_state);
> -	}

.. but now you're moving the slave pipe stuff somewhere else?

We should be just iterating the pipes here (assuming this 
is the correct spot to do these steps).

> -
>  	/*
>  	 * When called from DP MST code:
>  	 * - old_conn_state will be NULL
> @@ -3363,8 +3351,7 @@ static void intel_enable_ddi(struct intel_atomic_state *state,
>  {
>  	drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
>  
> -	if (!intel_crtc_is_bigjoiner_slave(crtc_state))
> -		intel_ddi_enable_transcoder_func(encoder, crtc_state);
> +	intel_ddi_enable_transcoder_func(encoder, crtc_state);
>  
>  	/* Enable/Disable DP2.0 SDP split config before transcoder */
>  	intel_audio_sdp_split_update(crtc_state);
> @@ -3469,9 +3456,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
>  				  struct intel_crtc *crtc)
>  {
>  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> -	struct intel_crtc_state *crtc_state =
> -		intel_atomic_get_new_crtc_state(state, crtc);
> -	struct intel_crtc *slave_crtc;
>  	enum phy phy = intel_port_to_phy(i915, encoder->port);
>  
>  	/* FIXME: Add MTL pll_mgr */
> @@ -3479,9 +3463,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
>  		return;
>  
>  	intel_update_active_dpll(state, crtc, encoder);
> -	for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> -					 intel_crtc_bigjoiner_slave_pipes(crtc_state))
> -		intel_update_active_dpll(state, slave_crtc, encoder);
>  }
>  
>  static void
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index 916c13a149fd5..e1ea53fd6a288 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -1631,31 +1631,12 @@ static void hsw_configure_cpu_transcoder(const struct intel_crtc_state *crtc_sta
>  	hsw_set_transconf(crtc_state);
>  }
>  
> -static void hsw_crtc_enable(struct intel_atomic_state *state,
> -			    struct intel_crtc *crtc)
> +static void hsw_crtc_enable_pre_transcoder(struct intel_atomic_state *state,
> +					   struct intel_crtc *crtc)
>  {
>  	const struct intel_crtc_state *new_crtc_state =
>  		intel_atomic_get_new_crtc_state(state, crtc);
>  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> -	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> -	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> -	bool psl_clkgate_wa;
> -
> -	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> -		return;
> -
> -	intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> -
> -	if (!new_crtc_state->bigjoiner_pipes) {
> -		intel_encoders_pre_pll_enable(state, crtc);
> -
> -		if (new_crtc_state->shared_dpll)
> -			intel_enable_shared_dpll(new_crtc_state);
> -
> -		intel_encoders_pre_enable(state, crtc);
> -	} else {
> -		icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> -	}
>  
>  	intel_dsc_enable(new_crtc_state);
>  
> @@ -1665,19 +1646,17 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
>  	intel_set_pipe_src_size(new_crtc_state);
>  	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
>  		bdw_set_pipe_misc(new_crtc_state);
> +}
>  
> -	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&
> -	    !transcoder_is_dsi(cpu_transcoder))
> -		hsw_configure_cpu_transcoder(new_crtc_state);
> +static void hsw_crtc_enable_post_transcoder(struct intel_atomic_state *state,
> +					    struct intel_crtc *crtc)
> +{
> +	const struct intel_crtc_state *new_crtc_state =
> +		intel_atomic_get_new_crtc_state(state, crtc);
> +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
>  
>  	crtc->active = true;
>  
> -	/* Display WA #1180: WaDisableScalarClockGating: glk */
> -	psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> -		new_crtc_state->pch_pfit.enabled;
> -	if (psl_clkgate_wa)
> -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> -
>  	if (DISPLAY_VER(dev_priv) >= 9)
>  		skl_pfit_enable(new_crtc_state);
>  	else
> @@ -1700,27 +1679,84 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
>  		icl_set_pipe_chicken(new_crtc_state);
>  
>  	intel_initial_watermarks(state, crtc);
> +}
>  
> -	if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> -		intel_crtc_vblank_on(new_crtc_state);
> +static void hsw_crtc_enable(struct intel_atomic_state *state,
> +			    struct intel_crtc *crtc)
> +{
> +	const struct intel_crtc_state *new_crtc_state =
> +		intel_atomic_get_new_crtc_state(state, crtc);
> +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> +	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> +	struct intel_crtc *_crtc;
> +	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(new_crtc_state);
> +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> +	bool psl_clkgate_wa;
> +	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
>  
> -	intel_encoders_enable(state, crtc);
> +	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> +		return;
>  
> -	if (psl_clkgate_wa) {
> -		intel_crtc_wait_for_next_vblank(crtc);
> -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> -	}
> +	/*
> +	 * Use reverse iterator to go through slave pipes first.
> +	 * TODO: We might need smarter iterator here
> +	 */
> +	for_each_intel_crtc_in_pipe_mask_reverse(&dev_priv->drm, _crtc,
> +						 pipe_mask) {
> +		const struct intel_crtc_state *_new_crtc_state =
> +			intel_atomic_get_new_crtc_state(state, _crtc);
> +		bool needs_transcoder = ((slave_pipe_mask & BIT(_crtc->pipe)) == 0) &&
> +					!transcoder_is_dsi(cpu_transcoder);
> +
> +		intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> +
> +		if (!new_crtc_state->bigjoiner_pipes) {
> +			if (needs_transcoder)
> +				intel_encoders_pre_pll_enable(state, crtc);
> +
> +			if (new_crtc_state->shared_dpll)
> +				intel_enable_shared_dpll(new_crtc_state);
> +
> +			if (needs_transcoder)
> +				intel_encoders_pre_enable(state, crtc);
> +		} else {
> +			icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> +		}

That mess needs to be eliminated entirely.

> +
> +		hsw_crtc_enable_pre_transcoder(state, _crtc);
> +
> +		if (needs_transcoder)
> +			hsw_configure_cpu_transcoder(_new_crtc_state);

These transcoder things should not be within any pipe loop at all.

> +
> +		/* Display WA #1180: WaDisableScalarClockGating: glk */
> +		psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> +			new_crtc_state->pch_pfit.enabled;
> +		if (psl_clkgate_wa)
> +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> +
> +		hsw_crtc_enable_post_transcoder(state, _crtc);
> +
> +		if (needs_transcoder)
> +			intel_encoders_enable(state, crtc);
> +		else
> +			intel_crtc_vblank_on(_new_crtc_state);
> +
> +		if (psl_clkgate_wa) {
> +			intel_crtc_wait_for_next_vblank(crtc);
> +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> +		}
>  
> -	/* If we change the relative order between pipe/planes enabling, we need
> -	 * to change the workaround. */
> -	hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
> -	if (IS_HASWELL(dev_priv) && hsw_workaround_pipe != INVALID_PIPE) {
> -		struct intel_crtc *wa_crtc;
> +		/* If we change the relative order between pipe/planes enabling, we need
> +		 * to change the workaround. */
> +		hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
> +		if (IS_HASWELL(dev_priv) && hsw_workaround_pipe != INVALID_PIPE) {
> +			struct intel_crtc *wa_crtc;
>  
> -		wa_crtc = intel_crtc_for_pipe(dev_priv, hsw_workaround_pipe);
> +			wa_crtc = intel_crtc_for_pipe(dev_priv, hsw_workaround_pipe);
>  
> -		intel_crtc_wait_for_next_vblank(wa_crtc);
> -		intel_crtc_wait_for_next_vblank(wa_crtc);
> +			intel_crtc_wait_for_next_vblank(wa_crtc);
> +			intel_crtc_wait_for_next_vblank(wa_crtc);
> +		}
>  	}
>  }
>  
> @@ -1784,28 +1820,27 @@ static void hsw_crtc_disable(struct intel_atomic_state *state,
>  	const struct intel_crtc_state *old_crtc_state =
>  		intel_atomic_get_old_crtc_state(state, crtc);
>  	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
> +	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(old_crtc_state);
> +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> +	struct intel_crtc *_crtc;
> +
> +	for_each_intel_crtc_in_pipe_mask(&i915->drm, _crtc,
> +					 pipe_mask) {
> +		const struct intel_crtc_state *_old_crtc_state =
> +			intel_atomic_get_old_crtc_state(state, _crtc);
> +		bool needs_encoder_disable = (slave_pipe_mask & BIT(_crtc->pipe)) == 0;
> +
> +		if (needs_encoder_disable) {
> +			intel_encoders_disable(state, _crtc);
> +			intel_encoders_post_disable(state, _crtc);
> +		}
>  
> -	/*
> -	 * FIXME collapse everything to one hook.
> -	 * Need care with mst->ddi interactions.
> -	 */
> -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> -		intel_encoders_disable(state, crtc);
> -		intel_encoders_post_disable(state, crtc);
> -	}
> -
> -	intel_disable_shared_dpll(old_crtc_state);
> -
> -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> -		struct intel_crtc *slave_crtc;
> -
> -		intel_encoders_post_pll_disable(state, crtc);
> +		intel_disable_shared_dpll(_old_crtc_state);
>  
> -		intel_dmc_disable_pipe(i915, crtc->pipe);
> +		if (needs_encoder_disable)
> +			intel_encoders_post_pll_disable(state, _crtc);
>  
> -		for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> -						 intel_crtc_bigjoiner_slave_pipes(old_crtc_state))
> -			intel_dmc_disable_pipe(i915, slave_crtc->pipe);
> +		intel_dmc_disable_pipe(i915, _crtc->pipe);
>  	}
>  }
>  
> @@ -6788,8 +6823,10 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
>  		 * Slave vblanks are masked till Master Vblanks.
>  		 */
>  		if (!is_trans_port_sync_slave(old_crtc_state) &&
> -		    !intel_dp_mst_is_slave_trans(old_crtc_state) &&
> -		    !intel_crtc_is_bigjoiner_slave(old_crtc_state))
> +		    !intel_dp_mst_is_slave_trans(old_crtc_state))
> +			continue;
> +
> +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
>  			continue;
>  
>  		intel_old_crtc_state_disables(state, old_crtc_state,
> @@ -6807,6 +6844,9 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
>  		if (!old_crtc_state->hw.active)
>  			continue;
>  
> +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
> +			continue;
> +
>  		intel_old_crtc_state_disables(state, old_crtc_state,
>  					      new_crtc_state, crtc);
>  	}
> @@ -6919,8 +6959,10 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
>  			continue;
>  
>  		if (intel_dp_mst_is_slave_trans(new_crtc_state) ||
> -		    is_trans_port_sync_master(new_crtc_state) ||
> -		    intel_crtc_is_bigjoiner_master(new_crtc_state))
> +		    is_trans_port_sync_master(new_crtc_state))
> +			continue;
> +
> +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
>  			continue;
>  
>  		modeset_pipes &= ~BIT(pipe);
> @@ -6930,7 +6972,7 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
>  
>  	/*
>  	 * Then we enable all remaining pipes that depend on other
> -	 * pipes: MST slaves and port sync masters, big joiner master
> +	 * pipes: MST slaves and port sync masters
>  	 */
>  	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
>  		enum pipe pipe = crtc->pipe;
> @@ -6938,6 +6980,9 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
>  		if ((modeset_pipes & BIT(pipe)) == 0)
>  			continue;
>  
> +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> +			continue;
> +
>  		modeset_pipes &= ~BIT(pipe);

We are modesetting all the joined pipes here. The bitmask should reflect
that.

>  
>  		intel_enable_crtc(state, crtc);
> diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
> index f4a0773f0fca8..e1e8d956c305e 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.h
> +++ b/drivers/gpu/drm/i915/display/intel_display.h
> @@ -280,6 +280,12 @@ enum phy_fia {
>  			    base.head)					\
>  		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
>  
> +#define for_each_intel_crtc_in_pipe_mask_reverse(dev, intel_crtc, pipe_mask)	\
> +	list_for_each_entry_reverse(intel_crtc,					\
> +				    &(dev)->mode_config.crtc_list,		\
> +				    base.head)					\
> +		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
> +
>  #define for_each_intel_encoder(dev, intel_encoder)		\
>  	list_for_each_entry(intel_encoder,			\
>  			    &(dev)->mode_config.encoder_list,	\
> -- 
> 2.37.3

-- 
Ville Syrjälä
Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 1/3] drm/i915/bigjoiner: Refactor bigjoiner state readout
  2024-03-01 10:10   ` Ville Syrjälä
@ 2024-03-01 10:22     ` Lisovskiy, Stanislav
  0 siblings, 0 replies; 33+ messages in thread
From: Lisovskiy, Stanislav @ 2024-03-01 10:22 UTC (permalink / raw)
  To: Ville Syrjälä; +Cc: intel-gfx, jani.saarinen, vidya.srinivas

On Fri, Mar 01, 2024 at 12:10:19PM +0200, Ville Syrjälä wrote:
> On Wed, Feb 21, 2024 at 09:20:08PM +0200, Stanislav Lisovskiy wrote:
> > Don't call enabled_bigjoiner_pipes twice, lets just move
> > intel_get_bigjoiner_config earlier, because it is anyway
> > calling same function.
> > Also cleanup hsw_enabled_transcoders from irrelevant bigjoiner code.
> 
> I still don't like this.

As of current state of things, I didn't touch this since our last discussion.
This is not critical improvement, so lets drop this until the main issues are
solved.

> 
> > 
> > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_display.c | 22 ++++++++++----------
> >  1 file changed, 11 insertions(+), 11 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> > index 00ac65a140298..916c13a149fd5 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > @@ -3535,7 +3535,6 @@ static u8 hsw_enabled_transcoders(struct intel_crtc *crtc)
> >  	struct drm_i915_private *dev_priv = to_i915(dev);
> >  	u8 panel_transcoder_mask = hsw_panel_transcoders(dev_priv);
> >  	enum transcoder cpu_transcoder;
> > -	u8 master_pipes, slave_pipes;
> >  	u8 enabled_transcoders = 0;
> >  
> >  	/*
> > @@ -3586,15 +3585,6 @@ static u8 hsw_enabled_transcoders(struct intel_crtc *crtc)
> >  	if (transcoder_ddi_func_is_enabled(dev_priv, cpu_transcoder))
> >  		enabled_transcoders |= BIT(cpu_transcoder);
> >  
> > -	/* bigjoiner slave -> consider the master pipe's transcoder as well */
> > -	enabled_bigjoiner_pipes(dev_priv, &master_pipes, &slave_pipes);
> > -	if (slave_pipes & BIT(crtc->pipe)) {
> > -		cpu_transcoder = (enum transcoder)
> > -			get_bigjoiner_master_pipe(crtc->pipe, master_pipes, slave_pipes);
> > -		if (transcoder_ddi_func_is_enabled(dev_priv, cpu_transcoder))
> > -			enabled_transcoders |= BIT(cpu_transcoder);
> > -	}
> > -
> >  	return enabled_transcoders;
> >  }
> >  
> > @@ -3641,6 +3631,15 @@ static bool hsw_get_transcoder_state(struct intel_crtc *crtc,
> >  	u32 tmp;
> >  
> >  	enabled_transcoders = hsw_enabled_transcoders(crtc);
> > +
> > +	/* bigjoiner slave -> consider the master pipe's transcoder as well */
> > +	if (intel_crtc_is_bigjoiner_slave(pipe_config)) {
> > +		unsigned long cpu_transcoder = (enum transcoder)
> > +			bigjoiner_master_pipe(pipe_config);
> > +		if (transcoder_ddi_func_is_enabled(dev_priv, cpu_transcoder))
> > +			enabled_transcoders |= BIT(cpu_transcoder);
> > +	}
> > +
> >  	if (!enabled_transcoders)
> >  		return false;
> >  
> > @@ -3745,6 +3744,8 @@ static bool hsw_get_pipe_config(struct intel_crtc *crtc,
> >  
> >  	pipe_config->shared_dpll = NULL;
> >  
> > +	intel_bigjoiner_get_config(pipe_config);
> > +
> >  	active = hsw_get_transcoder_state(crtc, pipe_config, &crtc->hw_readout_power_domains);
> >  
> >  	if ((IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) &&
> > @@ -3756,7 +3757,6 @@ static bool hsw_get_pipe_config(struct intel_crtc *crtc,
> >  	if (!active)
> >  		goto out;
> >  
> > -	intel_bigjoiner_get_config(pipe_config);
> >  	intel_dsc_get_config(pipe_config);
> >  
> >  	if (!transcoder_is_dsi(pipe_config->cpu_transcoder) ||
> > -- 
> > 2.37.3
> 
> -- 
> Ville Syrjälä
> Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset
  2024-03-01 10:10   ` Ville Syrjälä
@ 2024-03-01 10:27     ` Lisovskiy, Stanislav
  2024-03-01 10:43       ` Ville Syrjälä
  0 siblings, 1 reply; 33+ messages in thread
From: Lisovskiy, Stanislav @ 2024-03-01 10:27 UTC (permalink / raw)
  To: Ville Syrjälä; +Cc: intel-gfx, jani.saarinen, vidya.srinivas

On Fri, Mar 01, 2024 at 12:10:52PM +0200, Ville Syrjälä wrote:
> On Wed, Feb 21, 2024 at 09:20:09PM +0200, Stanislav Lisovskiy wrote:
> > Handle only bigjoiner masters in skl_commit_modeset_enables/disables,
> > slave crtcs should be handled by master hooks. Same for encoders.
> > That way we can also remove a bunch of checks like intel_crtc_is_bigjoiner_slave.
> > 
> > v2: Get rid of master vs slave checks and separation in crtc enable/disable hooks.
> >     Use unified iteration cycle for all of those, while enabling/disabling
> >     transcoder only for those pipes where its needed(Ville Syrjälä)
> > 
> > v3: Move all the intel_encoder_* calls under transcoder code path(Ville Syrjälä)
> > 
> > v4:  - Call intel_crtc_vblank_on from hsw_crtc_enable only for non-transcoder path
> >        (for master pipe that will be called from intel_encoders_enable/intel_enable_ddi)
> >      - Fix stupid mistake with using crtc->pipe for the mask, instead of BIT(crtc->pipe)
> > 
> > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_ddi.c     |  21 +--
> >  drivers/gpu/drm/i915/display/intel_display.c | 183 ++++++++++++-------
> >  drivers/gpu/drm/i915/display/intel_display.h |   6 +
> >  3 files changed, 121 insertions(+), 89 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> > index bea4415902044..6071e9f500871 100644
> > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > @@ -3100,7 +3100,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> >  				   const struct drm_connector_state *old_conn_state)
> >  {
> >  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> > -	struct intel_crtc *slave_crtc;
> >  
> >  	if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST)) {
> >  		intel_crtc_vblank_off(old_crtc_state);
> > @@ -3117,17 +3116,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> >  			ilk_pfit_disable(old_crtc_state);
> >  	}
> 
> The master pipe stuff is right here ^ ...
> 
> >  
> > -	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, slave_crtc,
> > -					 intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) {
> > -		const struct intel_crtc_state *old_slave_crtc_state =
> > -			intel_atomic_get_old_crtc_state(state, slave_crtc);
> > -
> > -		intel_crtc_vblank_off(old_slave_crtc_state);
> > -
> > -		intel_dsc_disable(old_slave_crtc_state);
> > -		skl_scaler_disable(old_slave_crtc_state);
> > -	}
> 
> .. but now you're moving the slave pipe stuff somewhere else?
> 
> We should be just iterating the pipes here (assuming this 
> is the correct spot to do these steps).
> 
> > -
> >  	/*
> >  	 * When called from DP MST code:
> >  	 * - old_conn_state will be NULL
> > @@ -3363,8 +3351,7 @@ static void intel_enable_ddi(struct intel_atomic_state *state,
> >  {
> >  	drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
> >  
> > -	if (!intel_crtc_is_bigjoiner_slave(crtc_state))
> > -		intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > +	intel_ddi_enable_transcoder_func(encoder, crtc_state);
> >  
> >  	/* Enable/Disable DP2.0 SDP split config before transcoder */
> >  	intel_audio_sdp_split_update(crtc_state);
> > @@ -3469,9 +3456,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> >  				  struct intel_crtc *crtc)
> >  {
> >  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> > -	struct intel_crtc_state *crtc_state =
> > -		intel_atomic_get_new_crtc_state(state, crtc);
> > -	struct intel_crtc *slave_crtc;
> >  	enum phy phy = intel_port_to_phy(i915, encoder->port);
> >  
> >  	/* FIXME: Add MTL pll_mgr */
> > @@ -3479,9 +3463,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> >  		return;
> >  
> >  	intel_update_active_dpll(state, crtc, encoder);
> > -	for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > -					 intel_crtc_bigjoiner_slave_pipes(crtc_state))
> > -		intel_update_active_dpll(state, slave_crtc, encoder);
> >  }
> >  
> >  static void
> > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> > index 916c13a149fd5..e1ea53fd6a288 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > @@ -1631,31 +1631,12 @@ static void hsw_configure_cpu_transcoder(const struct intel_crtc_state *crtc_sta
> >  	hsw_set_transconf(crtc_state);
> >  }
> >  
> > -static void hsw_crtc_enable(struct intel_atomic_state *state,
> > -			    struct intel_crtc *crtc)
> > +static void hsw_crtc_enable_pre_transcoder(struct intel_atomic_state *state,
> > +					   struct intel_crtc *crtc)
> >  {
> >  	const struct intel_crtc_state *new_crtc_state =
> >  		intel_atomic_get_new_crtc_state(state, crtc);
> >  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > -	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > -	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > -	bool psl_clkgate_wa;
> > -
> > -	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > -		return;
> > -
> > -	intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > -
> > -	if (!new_crtc_state->bigjoiner_pipes) {
> > -		intel_encoders_pre_pll_enable(state, crtc);
> > -
> > -		if (new_crtc_state->shared_dpll)
> > -			intel_enable_shared_dpll(new_crtc_state);
> > -
> > -		intel_encoders_pre_enable(state, crtc);
> > -	} else {
> > -		icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > -	}
> >  
> >  	intel_dsc_enable(new_crtc_state);
> >  
> > @@ -1665,19 +1646,17 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> >  	intel_set_pipe_src_size(new_crtc_state);
> >  	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
> >  		bdw_set_pipe_misc(new_crtc_state);
> > +}
> >  
> > -	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&
> > -	    !transcoder_is_dsi(cpu_transcoder))
> > -		hsw_configure_cpu_transcoder(new_crtc_state);
> > +static void hsw_crtc_enable_post_transcoder(struct intel_atomic_state *state,
> > +					    struct intel_crtc *crtc)
> > +{
> > +	const struct intel_crtc_state *new_crtc_state =
> > +		intel_atomic_get_new_crtc_state(state, crtc);
> > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> >  
> >  	crtc->active = true;
> >  
> > -	/* Display WA #1180: WaDisableScalarClockGating: glk */
> > -	psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > -		new_crtc_state->pch_pfit.enabled;
> > -	if (psl_clkgate_wa)
> > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> > -
> >  	if (DISPLAY_VER(dev_priv) >= 9)
> >  		skl_pfit_enable(new_crtc_state);
> >  	else
> > @@ -1700,27 +1679,84 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> >  		icl_set_pipe_chicken(new_crtc_state);
> >  
> >  	intel_initial_watermarks(state, crtc);
> > +}
> >  
> > -	if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > -		intel_crtc_vblank_on(new_crtc_state);
> > +static void hsw_crtc_enable(struct intel_atomic_state *state,
> > +			    struct intel_crtc *crtc)
> > +{
> > +	const struct intel_crtc_state *new_crtc_state =
> > +		intel_atomic_get_new_crtc_state(state, crtc);
> > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > +	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > +	struct intel_crtc *_crtc;
> > +	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(new_crtc_state);
> > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > +	bool psl_clkgate_wa;
> > +	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> >  
> > -	intel_encoders_enable(state, crtc);
> > +	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > +		return;
> >  
> > -	if (psl_clkgate_wa) {
> > -		intel_crtc_wait_for_next_vblank(crtc);
> > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> > -	}
> > +	/*
> > +	 * Use reverse iterator to go through slave pipes first.
> > +	 * TODO: We might need smarter iterator here
> > +	 */
> > +	for_each_intel_crtc_in_pipe_mask_reverse(&dev_priv->drm, _crtc,
> > +						 pipe_mask) {
> > +		const struct intel_crtc_state *_new_crtc_state =
> > +			intel_atomic_get_new_crtc_state(state, _crtc);
> > +		bool needs_transcoder = ((slave_pipe_mask & BIT(_crtc->pipe)) == 0) &&
> > +					!transcoder_is_dsi(cpu_transcoder);
> > +
> > +		intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > +
> > +		if (!new_crtc_state->bigjoiner_pipes) {
> > +			if (needs_transcoder)
> > +				intel_encoders_pre_pll_enable(state, crtc);
> > +
> > +			if (new_crtc_state->shared_dpll)
> > +				intel_enable_shared_dpll(new_crtc_state);
> > +
> > +			if (needs_transcoder)
> > +				intel_encoders_pre_enable(state, crtc);
> > +		} else {
> > +			icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > +		}
> 
> That mess needs to be eliminated entirely.

Yeah, was thinking about this too, was just a bit unsure how..

> 
> > +
> > +		hsw_crtc_enable_pre_transcoder(state, _crtc);
> > +
> > +		if (needs_transcoder)
> > +			hsw_configure_cpu_transcoder(_new_crtc_state);
> 
> These transcoder things should not be within any pipe loop at all.

I didn't want to split the loop, which I would have to do otherwise,
but may be it makes sense, since transcoder path is needed only for master
pipe. However what if _hypothetically_ :) we would have more than one master
pipe?

> 
> > +
> > +		/* Display WA #1180: WaDisableScalarClockGating: glk */
> > +		psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > +			new_crtc_state->pch_pfit.enabled;
> > +		if (psl_clkgate_wa)
> > +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> > +
> > +		hsw_crtc_enable_post_transcoder(state, _crtc);
> > +
> > +		if (needs_transcoder)
> > +			intel_encoders_enable(state, crtc);
> > +		else
> > +			intel_crtc_vblank_on(_new_crtc_state);
> > +
> > +		if (psl_clkgate_wa) {
> > +			intel_crtc_wait_for_next_vblank(crtc);
> > +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> > +		}
> >  
> > -	/* If we change the relative order between pipe/planes enabling, we need
> > -	 * to change the workaround. */
> > -	hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
> > -	if (IS_HASWELL(dev_priv) && hsw_workaround_pipe != INVALID_PIPE) {
> > -		struct intel_crtc *wa_crtc;
> > +		/* If we change the relative order between pipe/planes enabling, we need
> > +		 * to change the workaround. */
> > +		hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
> > +		if (IS_HASWELL(dev_priv) && hsw_workaround_pipe != INVALID_PIPE) {
> > +			struct intel_crtc *wa_crtc;
> >  
> > -		wa_crtc = intel_crtc_for_pipe(dev_priv, hsw_workaround_pipe);
> > +			wa_crtc = intel_crtc_for_pipe(dev_priv, hsw_workaround_pipe);
> >  
> > -		intel_crtc_wait_for_next_vblank(wa_crtc);
> > -		intel_crtc_wait_for_next_vblank(wa_crtc);
> > +			intel_crtc_wait_for_next_vblank(wa_crtc);
> > +			intel_crtc_wait_for_next_vblank(wa_crtc);
> > +		}
> >  	}
> >  }
> >  
> > @@ -1784,28 +1820,27 @@ static void hsw_crtc_disable(struct intel_atomic_state *state,
> >  	const struct intel_crtc_state *old_crtc_state =
> >  		intel_atomic_get_old_crtc_state(state, crtc);
> >  	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
> > +	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(old_crtc_state);
> > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > +	struct intel_crtc *_crtc;
> > +
> > +	for_each_intel_crtc_in_pipe_mask(&i915->drm, _crtc,
> > +					 pipe_mask) {
> > +		const struct intel_crtc_state *_old_crtc_state =
> > +			intel_atomic_get_old_crtc_state(state, _crtc);
> > +		bool needs_encoder_disable = (slave_pipe_mask & BIT(_crtc->pipe)) == 0;
> > +
> > +		if (needs_encoder_disable) {
> > +			intel_encoders_disable(state, _crtc);
> > +			intel_encoders_post_disable(state, _crtc);
> > +		}
> >  
> > -	/*
> > -	 * FIXME collapse everything to one hook.
> > -	 * Need care with mst->ddi interactions.
> > -	 */
> > -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> > -		intel_encoders_disable(state, crtc);
> > -		intel_encoders_post_disable(state, crtc);
> > -	}
> > -
> > -	intel_disable_shared_dpll(old_crtc_state);
> > -
> > -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> > -		struct intel_crtc *slave_crtc;
> > -
> > -		intel_encoders_post_pll_disable(state, crtc);
> > +		intel_disable_shared_dpll(_old_crtc_state);
> >  
> > -		intel_dmc_disable_pipe(i915, crtc->pipe);
> > +		if (needs_encoder_disable)
> > +			intel_encoders_post_pll_disable(state, _crtc);
> >  
> > -		for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > -						 intel_crtc_bigjoiner_slave_pipes(old_crtc_state))
> > -			intel_dmc_disable_pipe(i915, slave_crtc->pipe);
> > +		intel_dmc_disable_pipe(i915, _crtc->pipe);
> >  	}
> >  }
> >  
> > @@ -6788,8 +6823,10 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
> >  		 * Slave vblanks are masked till Master Vblanks.
> >  		 */
> >  		if (!is_trans_port_sync_slave(old_crtc_state) &&
> > -		    !intel_dp_mst_is_slave_trans(old_crtc_state) &&
> > -		    !intel_crtc_is_bigjoiner_slave(old_crtc_state))
> > +		    !intel_dp_mst_is_slave_trans(old_crtc_state))
> > +			continue;
> > +
> > +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
> >  			continue;
> >  
> >  		intel_old_crtc_state_disables(state, old_crtc_state,
> > @@ -6807,6 +6844,9 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
> >  		if (!old_crtc_state->hw.active)
> >  			continue;
> >  
> > +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
> > +			continue;
> > +
> >  		intel_old_crtc_state_disables(state, old_crtc_state,
> >  					      new_crtc_state, crtc);
> >  	}
> > @@ -6919,8 +6959,10 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
> >  			continue;
> >  
> >  		if (intel_dp_mst_is_slave_trans(new_crtc_state) ||
> > -		    is_trans_port_sync_master(new_crtc_state) ||
> > -		    intel_crtc_is_bigjoiner_master(new_crtc_state))
> > +		    is_trans_port_sync_master(new_crtc_state))
> > +			continue;
> > +
> > +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> >  			continue;
> >  
> >  		modeset_pipes &= ~BIT(pipe);
> > @@ -6930,7 +6972,7 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
> >  
> >  	/*
> >  	 * Then we enable all remaining pipes that depend on other
> > -	 * pipes: MST slaves and port sync masters, big joiner master
> > +	 * pipes: MST slaves and port sync masters
> >  	 */
> >  	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
> >  		enum pipe pipe = crtc->pipe;
> > @@ -6938,6 +6980,9 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
> >  		if ((modeset_pipes & BIT(pipe)) == 0)
> >  			continue;
> >  
> > +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > +			continue;
> > +
> >  		modeset_pipes &= ~BIT(pipe);
> 
> We are modesetting all the joined pipes here. The bitmask should reflect
> that.

Ohhh thanks for spotting. That might explain some issues we have atm.

> 
> >  
> >  		intel_enable_crtc(state, crtc);
> > diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
> > index f4a0773f0fca8..e1e8d956c305e 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display.h
> > @@ -280,6 +280,12 @@ enum phy_fia {
> >  			    base.head)					\
> >  		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
> >  
> > +#define for_each_intel_crtc_in_pipe_mask_reverse(dev, intel_crtc, pipe_mask)	\
> > +	list_for_each_entry_reverse(intel_crtc,					\
> > +				    &(dev)->mode_config.crtc_list,		\
> > +				    base.head)					\
> > +		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
> > +
> >  #define for_each_intel_encoder(dev, intel_encoder)		\
> >  	list_for_each_entry(intel_encoder,			\
> >  			    &(dev)->mode_config.encoder_list,	\
> > -- 
> > 2.37.3
> 
> -- 
> Ville Syrjälä
> Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset
  2024-03-01 10:27     ` Lisovskiy, Stanislav
@ 2024-03-01 10:43       ` Ville Syrjälä
  2024-03-01 12:29         ` Lisovskiy, Stanislav
  0 siblings, 1 reply; 33+ messages in thread
From: Ville Syrjälä @ 2024-03-01 10:43 UTC (permalink / raw)
  To: Lisovskiy, Stanislav; +Cc: intel-gfx, jani.saarinen, vidya.srinivas

On Fri, Mar 01, 2024 at 12:27:18PM +0200, Lisovskiy, Stanislav wrote:
> On Fri, Mar 01, 2024 at 12:10:52PM +0200, Ville Syrjälä wrote:
> > On Wed, Feb 21, 2024 at 09:20:09PM +0200, Stanislav Lisovskiy wrote:
> > > Handle only bigjoiner masters in skl_commit_modeset_enables/disables,
> > > slave crtcs should be handled by master hooks. Same for encoders.
> > > That way we can also remove a bunch of checks like intel_crtc_is_bigjoiner_slave.
> > > 
> > > v2: Get rid of master vs slave checks and separation in crtc enable/disable hooks.
> > >     Use unified iteration cycle for all of those, while enabling/disabling
> > >     transcoder only for those pipes where its needed(Ville Syrjälä)
> > > 
> > > v3: Move all the intel_encoder_* calls under transcoder code path(Ville Syrjälä)
> > > 
> > > v4:  - Call intel_crtc_vblank_on from hsw_crtc_enable only for non-transcoder path
> > >        (for master pipe that will be called from intel_encoders_enable/intel_enable_ddi)
> > >      - Fix stupid mistake with using crtc->pipe for the mask, instead of BIT(crtc->pipe)
> > > 
> > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > > ---
> > >  drivers/gpu/drm/i915/display/intel_ddi.c     |  21 +--
> > >  drivers/gpu/drm/i915/display/intel_display.c | 183 ++++++++++++-------
> > >  drivers/gpu/drm/i915/display/intel_display.h |   6 +
> > >  3 files changed, 121 insertions(+), 89 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > index bea4415902044..6071e9f500871 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > @@ -3100,7 +3100,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> > >  				   const struct drm_connector_state *old_conn_state)
> > >  {
> > >  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> > > -	struct intel_crtc *slave_crtc;
> > >  
> > >  	if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST)) {
> > >  		intel_crtc_vblank_off(old_crtc_state);
> > > @@ -3117,17 +3116,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> > >  			ilk_pfit_disable(old_crtc_state);
> > >  	}
> > 
> > The master pipe stuff is right here ^ ...
> > 
> > >  
> > > -	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, slave_crtc,
> > > -					 intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) {
> > > -		const struct intel_crtc_state *old_slave_crtc_state =
> > > -			intel_atomic_get_old_crtc_state(state, slave_crtc);
> > > -
> > > -		intel_crtc_vblank_off(old_slave_crtc_state);
> > > -
> > > -		intel_dsc_disable(old_slave_crtc_state);
> > > -		skl_scaler_disable(old_slave_crtc_state);
> > > -	}
> > 
> > .. but now you're moving the slave pipe stuff somewhere else?
> > 
> > We should be just iterating the pipes here (assuming this 
> > is the correct spot to do these steps).
> > 
> > > -
> > >  	/*
> > >  	 * When called from DP MST code:
> > >  	 * - old_conn_state will be NULL
> > > @@ -3363,8 +3351,7 @@ static void intel_enable_ddi(struct intel_atomic_state *state,
> > >  {
> > >  	drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
> > >  
> > > -	if (!intel_crtc_is_bigjoiner_slave(crtc_state))
> > > -		intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > > +	intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > >  
> > >  	/* Enable/Disable DP2.0 SDP split config before transcoder */
> > >  	intel_audio_sdp_split_update(crtc_state);
> > > @@ -3469,9 +3456,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> > >  				  struct intel_crtc *crtc)
> > >  {
> > >  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> > > -	struct intel_crtc_state *crtc_state =
> > > -		intel_atomic_get_new_crtc_state(state, crtc);
> > > -	struct intel_crtc *slave_crtc;
> > >  	enum phy phy = intel_port_to_phy(i915, encoder->port);
> > >  
> > >  	/* FIXME: Add MTL pll_mgr */
> > > @@ -3479,9 +3463,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> > >  		return;
> > >  
> > >  	intel_update_active_dpll(state, crtc, encoder);
> > > -	for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > > -					 intel_crtc_bigjoiner_slave_pipes(crtc_state))
> > > -		intel_update_active_dpll(state, slave_crtc, encoder);
> > >  }
> > >  
> > >  static void
> > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> > > index 916c13a149fd5..e1ea53fd6a288 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > > @@ -1631,31 +1631,12 @@ static void hsw_configure_cpu_transcoder(const struct intel_crtc_state *crtc_sta
> > >  	hsw_set_transconf(crtc_state);
> > >  }
> > >  
> > > -static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > -			    struct intel_crtc *crtc)
> > > +static void hsw_crtc_enable_pre_transcoder(struct intel_atomic_state *state,
> > > +					   struct intel_crtc *crtc)
> > >  {
> > >  	const struct intel_crtc_state *new_crtc_state =
> > >  		intel_atomic_get_new_crtc_state(state, crtc);
> > >  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > -	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > > -	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > -	bool psl_clkgate_wa;
> > > -
> > > -	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > -		return;
> > > -
> > > -	intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > -
> > > -	if (!new_crtc_state->bigjoiner_pipes) {
> > > -		intel_encoders_pre_pll_enable(state, crtc);
> > > -
> > > -		if (new_crtc_state->shared_dpll)
> > > -			intel_enable_shared_dpll(new_crtc_state);
> > > -
> > > -		intel_encoders_pre_enable(state, crtc);
> > > -	} else {
> > > -		icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > -	}
> > >  
> > >  	intel_dsc_enable(new_crtc_state);
> > >  
> > > @@ -1665,19 +1646,17 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> > >  	intel_set_pipe_src_size(new_crtc_state);
> > >  	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
> > >  		bdw_set_pipe_misc(new_crtc_state);
> > > +}
> > >  
> > > -	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&
> > > -	    !transcoder_is_dsi(cpu_transcoder))
> > > -		hsw_configure_cpu_transcoder(new_crtc_state);
> > > +static void hsw_crtc_enable_post_transcoder(struct intel_atomic_state *state,
> > > +					    struct intel_crtc *crtc)
> > > +{
> > > +	const struct intel_crtc_state *new_crtc_state =
> > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > >  
> > >  	crtc->active = true;
> > >  
> > > -	/* Display WA #1180: WaDisableScalarClockGating: glk */
> > > -	psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > > -		new_crtc_state->pch_pfit.enabled;
> > > -	if (psl_clkgate_wa)
> > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> > > -
> > >  	if (DISPLAY_VER(dev_priv) >= 9)
> > >  		skl_pfit_enable(new_crtc_state);
> > >  	else
> > > @@ -1700,27 +1679,84 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> > >  		icl_set_pipe_chicken(new_crtc_state);
> > >  
> > >  	intel_initial_watermarks(state, crtc);
> > > +}
> > >  
> > > -	if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > > -		intel_crtc_vblank_on(new_crtc_state);
> > > +static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > +			    struct intel_crtc *crtc)
> > > +{
> > > +	const struct intel_crtc_state *new_crtc_state =
> > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > +	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > +	struct intel_crtc *_crtc;
> > > +	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(new_crtc_state);
> > > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > > +	bool psl_clkgate_wa;
> > > +	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > >  
> > > -	intel_encoders_enable(state, crtc);
> > > +	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > +		return;
> > >  
> > > -	if (psl_clkgate_wa) {
> > > -		intel_crtc_wait_for_next_vblank(crtc);
> > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> > > -	}
> > > +	/*
> > > +	 * Use reverse iterator to go through slave pipes first.
> > > +	 * TODO: We might need smarter iterator here
> > > +	 */
> > > +	for_each_intel_crtc_in_pipe_mask_reverse(&dev_priv->drm, _crtc,
> > > +						 pipe_mask) {
> > > +		const struct intel_crtc_state *_new_crtc_state =
> > > +			intel_atomic_get_new_crtc_state(state, _crtc);
> > > +		bool needs_transcoder = ((slave_pipe_mask & BIT(_crtc->pipe)) == 0) &&
> > > +					!transcoder_is_dsi(cpu_transcoder);
> > > +
> > > +		intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > +
> > > +		if (!new_crtc_state->bigjoiner_pipes) {
> > > +			if (needs_transcoder)
> > > +				intel_encoders_pre_pll_enable(state, crtc);
> > > +
> > > +			if (new_crtc_state->shared_dpll)
> > > +				intel_enable_shared_dpll(new_crtc_state);
> > > +
> > > +			if (needs_transcoder)
> > > +				intel_encoders_pre_enable(state, crtc);
> > > +		} else {
> > > +			icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > +		}
> > 
> > That mess needs to be eliminated entirely.
> 
> Yeah, was thinking about this too, was just a bit unsure how..
> 
> > 
> > > +
> > > +		hsw_crtc_enable_pre_transcoder(state, _crtc);
> > > +
> > > +		if (needs_transcoder)
> > > +			hsw_configure_cpu_transcoder(_new_crtc_state);
> > 
> > These transcoder things should not be within any pipe loop at all.
> 
> I didn't want to split the loop, which I would have to do otherwise,
> but may be it makes sense, since transcoder path is needed only for master
> pipe. However what if _hypothetically_ :) we would have more than one master
> pipe?

Doesn't matter how many pipes there are. There is always just one
transcoder.

> 
> > 
> > > +
> > > +		/* Display WA #1180: WaDisableScalarClockGating: glk */
> > > +		psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > > +			new_crtc_state->pch_pfit.enabled;
> > > +		if (psl_clkgate_wa)
> > > +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> > > +
> > > +		hsw_crtc_enable_post_transcoder(state, _crtc);
> > > +
> > > +		if (needs_transcoder)
> > > +			intel_encoders_enable(state, crtc);
> > > +		else
> > > +			intel_crtc_vblank_on(_new_crtc_state);
> > > +
> > > +		if (psl_clkgate_wa) {
> > > +			intel_crtc_wait_for_next_vblank(crtc);
> > > +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> > > +		}
> > >  
> > > -	/* If we change the relative order between pipe/planes enabling, we need
> > > -	 * to change the workaround. */
> > > -	hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
> > > -	if (IS_HASWELL(dev_priv) && hsw_workaround_pipe != INVALID_PIPE) {
> > > -		struct intel_crtc *wa_crtc;
> > > +		/* If we change the relative order between pipe/planes enabling, we need
> > > +		 * to change the workaround. */
> > > +		hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
> > > +		if (IS_HASWELL(dev_priv) && hsw_workaround_pipe != INVALID_PIPE) {
> > > +			struct intel_crtc *wa_crtc;
> > >  
> > > -		wa_crtc = intel_crtc_for_pipe(dev_priv, hsw_workaround_pipe);
> > > +			wa_crtc = intel_crtc_for_pipe(dev_priv, hsw_workaround_pipe);
> > >  
> > > -		intel_crtc_wait_for_next_vblank(wa_crtc);
> > > -		intel_crtc_wait_for_next_vblank(wa_crtc);
> > > +			intel_crtc_wait_for_next_vblank(wa_crtc);
> > > +			intel_crtc_wait_for_next_vblank(wa_crtc);
> > > +		}
> > >  	}
> > >  }
> > >  
> > > @@ -1784,28 +1820,27 @@ static void hsw_crtc_disable(struct intel_atomic_state *state,
> > >  	const struct intel_crtc_state *old_crtc_state =
> > >  		intel_atomic_get_old_crtc_state(state, crtc);
> > >  	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
> > > +	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(old_crtc_state);
> > > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > > +	struct intel_crtc *_crtc;
> > > +
> > > +	for_each_intel_crtc_in_pipe_mask(&i915->drm, _crtc,
> > > +					 pipe_mask) {
> > > +		const struct intel_crtc_state *_old_crtc_state =
> > > +			intel_atomic_get_old_crtc_state(state, _crtc);
> > > +		bool needs_encoder_disable = (slave_pipe_mask & BIT(_crtc->pipe)) == 0;
> > > +
> > > +		if (needs_encoder_disable) {
> > > +			intel_encoders_disable(state, _crtc);
> > > +			intel_encoders_post_disable(state, _crtc);
> > > +		}
> > >  
> > > -	/*
> > > -	 * FIXME collapse everything to one hook.
> > > -	 * Need care with mst->ddi interactions.
> > > -	 */
> > > -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> > > -		intel_encoders_disable(state, crtc);
> > > -		intel_encoders_post_disable(state, crtc);
> > > -	}
> > > -
> > > -	intel_disable_shared_dpll(old_crtc_state);
> > > -
> > > -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> > > -		struct intel_crtc *slave_crtc;
> > > -
> > > -		intel_encoders_post_pll_disable(state, crtc);
> > > +		intel_disable_shared_dpll(_old_crtc_state);
> > >  
> > > -		intel_dmc_disable_pipe(i915, crtc->pipe);
> > > +		if (needs_encoder_disable)
> > > +			intel_encoders_post_pll_disable(state, _crtc);
> > >  
> > > -		for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > > -						 intel_crtc_bigjoiner_slave_pipes(old_crtc_state))
> > > -			intel_dmc_disable_pipe(i915, slave_crtc->pipe);
> > > +		intel_dmc_disable_pipe(i915, _crtc->pipe);
> > >  	}
> > >  }
> > >  
> > > @@ -6788,8 +6823,10 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
> > >  		 * Slave vblanks are masked till Master Vblanks.
> > >  		 */
> > >  		if (!is_trans_port_sync_slave(old_crtc_state) &&
> > > -		    !intel_dp_mst_is_slave_trans(old_crtc_state) &&
> > > -		    !intel_crtc_is_bigjoiner_slave(old_crtc_state))
> > > +		    !intel_dp_mst_is_slave_trans(old_crtc_state))
> > > +			continue;
> > > +
> > > +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
> > >  			continue;
> > >  
> > >  		intel_old_crtc_state_disables(state, old_crtc_state,
> > > @@ -6807,6 +6844,9 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
> > >  		if (!old_crtc_state->hw.active)
> > >  			continue;
> > >  
> > > +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
> > > +			continue;
> > > +
> > >  		intel_old_crtc_state_disables(state, old_crtc_state,
> > >  					      new_crtc_state, crtc);
> > >  	}
> > > @@ -6919,8 +6959,10 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
> > >  			continue;
> > >  
> > >  		if (intel_dp_mst_is_slave_trans(new_crtc_state) ||
> > > -		    is_trans_port_sync_master(new_crtc_state) ||
> > > -		    intel_crtc_is_bigjoiner_master(new_crtc_state))
> > > +		    is_trans_port_sync_master(new_crtc_state))
> > > +			continue;
> > > +
> > > +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > >  			continue;
> > >  
> > >  		modeset_pipes &= ~BIT(pipe);
> > > @@ -6930,7 +6972,7 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
> > >  
> > >  	/*
> > >  	 * Then we enable all remaining pipes that depend on other
> > > -	 * pipes: MST slaves and port sync masters, big joiner master
> > > +	 * pipes: MST slaves and port sync masters
> > >  	 */
> > >  	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
> > >  		enum pipe pipe = crtc->pipe;
> > > @@ -6938,6 +6980,9 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
> > >  		if ((modeset_pipes & BIT(pipe)) == 0)
> > >  			continue;
> > >  
> > > +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > > +			continue;
> > > +
> > >  		modeset_pipes &= ~BIT(pipe);
> > 
> > We are modesetting all the joined pipes here. The bitmask should reflect
> > that.
> 
> Ohhh thanks for spotting. That might explain some issues we have atm.
> 
> > 
> > >  
> > >  		intel_enable_crtc(state, crtc);
> > > diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
> > > index f4a0773f0fca8..e1e8d956c305e 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_display.h
> > > +++ b/drivers/gpu/drm/i915/display/intel_display.h
> > > @@ -280,6 +280,12 @@ enum phy_fia {
> > >  			    base.head)					\
> > >  		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
> > >  
> > > +#define for_each_intel_crtc_in_pipe_mask_reverse(dev, intel_crtc, pipe_mask)	\
> > > +	list_for_each_entry_reverse(intel_crtc,					\
> > > +				    &(dev)->mode_config.crtc_list,		\
> > > +				    base.head)					\
> > > +		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
> > > +
> > >  #define for_each_intel_encoder(dev, intel_encoder)		\
> > >  	list_for_each_entry(intel_encoder,			\
> > >  			    &(dev)->mode_config.encoder_list,	\
> > > -- 
> > > 2.37.3
> > 
> > -- 
> > Ville Syrjälä
> > Intel

-- 
Ville Syrjälä
Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset
  2024-03-01 10:43       ` Ville Syrjälä
@ 2024-03-01 12:29         ` Lisovskiy, Stanislav
  2024-03-01 14:40           ` Ville Syrjälä
  0 siblings, 1 reply; 33+ messages in thread
From: Lisovskiy, Stanislav @ 2024-03-01 12:29 UTC (permalink / raw)
  To: Ville Syrjälä; +Cc: intel-gfx, jani.saarinen, vidya.srinivas

On Fri, Mar 01, 2024 at 12:43:46PM +0200, Ville Syrjälä wrote:
> On Fri, Mar 01, 2024 at 12:27:18PM +0200, Lisovskiy, Stanislav wrote:
> > On Fri, Mar 01, 2024 at 12:10:52PM +0200, Ville Syrjälä wrote:
> > > On Wed, Feb 21, 2024 at 09:20:09PM +0200, Stanislav Lisovskiy wrote:
> > > > Handle only bigjoiner masters in skl_commit_modeset_enables/disables,
> > > > slave crtcs should be handled by master hooks. Same for encoders.
> > > > That way we can also remove a bunch of checks like intel_crtc_is_bigjoiner_slave.
> > > > 
> > > > v2: Get rid of master vs slave checks and separation in crtc enable/disable hooks.
> > > >     Use unified iteration cycle for all of those, while enabling/disabling
> > > >     transcoder only for those pipes where its needed(Ville Syrjälä)
> > > > 
> > > > v3: Move all the intel_encoder_* calls under transcoder code path(Ville Syrjälä)
> > > > 
> > > > v4:  - Call intel_crtc_vblank_on from hsw_crtc_enable only for non-transcoder path
> > > >        (for master pipe that will be called from intel_encoders_enable/intel_enable_ddi)
> > > >      - Fix stupid mistake with using crtc->pipe for the mask, instead of BIT(crtc->pipe)
> > > > 
> > > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > > > ---
> > > >  drivers/gpu/drm/i915/display/intel_ddi.c     |  21 +--
> > > >  drivers/gpu/drm/i915/display/intel_display.c | 183 ++++++++++++-------
> > > >  drivers/gpu/drm/i915/display/intel_display.h |   6 +
> > > >  3 files changed, 121 insertions(+), 89 deletions(-)
> > > > 
> > > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > index bea4415902044..6071e9f500871 100644
> > > > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > @@ -3100,7 +3100,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> > > >  				   const struct drm_connector_state *old_conn_state)
> > > >  {
> > > >  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> > > > -	struct intel_crtc *slave_crtc;
> > > >  
> > > >  	if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST)) {
> > > >  		intel_crtc_vblank_off(old_crtc_state);
> > > > @@ -3117,17 +3116,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> > > >  			ilk_pfit_disable(old_crtc_state);
> > > >  	}
> > > 
> > > The master pipe stuff is right here ^ ...
> > > 
> > > >  
> > > > -	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, slave_crtc,
> > > > -					 intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) {
> > > > -		const struct intel_crtc_state *old_slave_crtc_state =
> > > > -			intel_atomic_get_old_crtc_state(state, slave_crtc);
> > > > -
> > > > -		intel_crtc_vblank_off(old_slave_crtc_state);
> > > > -
> > > > -		intel_dsc_disable(old_slave_crtc_state);
> > > > -		skl_scaler_disable(old_slave_crtc_state);
> > > > -	}
> > > 
> > > .. but now you're moving the slave pipe stuff somewhere else?
> > > 
> > > We should be just iterating the pipes here (assuming this 
> > > is the correct spot to do these steps).
> > > 
> > > > -
> > > >  	/*
> > > >  	 * When called from DP MST code:
> > > >  	 * - old_conn_state will be NULL
> > > > @@ -3363,8 +3351,7 @@ static void intel_enable_ddi(struct intel_atomic_state *state,
> > > >  {
> > > >  	drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
> > > >  
> > > > -	if (!intel_crtc_is_bigjoiner_slave(crtc_state))
> > > > -		intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > > > +	intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > > >  
> > > >  	/* Enable/Disable DP2.0 SDP split config before transcoder */
> > > >  	intel_audio_sdp_split_update(crtc_state);
> > > > @@ -3469,9 +3456,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> > > >  				  struct intel_crtc *crtc)
> > > >  {
> > > >  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> > > > -	struct intel_crtc_state *crtc_state =
> > > > -		intel_atomic_get_new_crtc_state(state, crtc);
> > > > -	struct intel_crtc *slave_crtc;
> > > >  	enum phy phy = intel_port_to_phy(i915, encoder->port);
> > > >  
> > > >  	/* FIXME: Add MTL pll_mgr */
> > > > @@ -3479,9 +3463,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> > > >  		return;
> > > >  
> > > >  	intel_update_active_dpll(state, crtc, encoder);
> > > > -	for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > > > -					 intel_crtc_bigjoiner_slave_pipes(crtc_state))
> > > > -		intel_update_active_dpll(state, slave_crtc, encoder);
> > > >  }
> > > >  
> > > >  static void
> > > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> > > > index 916c13a149fd5..e1ea53fd6a288 100644
> > > > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > > > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > > > @@ -1631,31 +1631,12 @@ static void hsw_configure_cpu_transcoder(const struct intel_crtc_state *crtc_sta
> > > >  	hsw_set_transconf(crtc_state);
> > > >  }
> > > >  
> > > > -static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > -			    struct intel_crtc *crtc)
> > > > +static void hsw_crtc_enable_pre_transcoder(struct intel_atomic_state *state,
> > > > +					   struct intel_crtc *crtc)
> > > >  {
> > > >  	const struct intel_crtc_state *new_crtc_state =
> > > >  		intel_atomic_get_new_crtc_state(state, crtc);
> > > >  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > -	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > > > -	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > > -	bool psl_clkgate_wa;
> > > > -
> > > > -	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > > -		return;
> > > > -
> > > > -	intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > > -
> > > > -	if (!new_crtc_state->bigjoiner_pipes) {
> > > > -		intel_encoders_pre_pll_enable(state, crtc);
> > > > -
> > > > -		if (new_crtc_state->shared_dpll)
> > > > -			intel_enable_shared_dpll(new_crtc_state);
> > > > -
> > > > -		intel_encoders_pre_enable(state, crtc);
> > > > -	} else {
> > > > -		icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > > -	}
> > > >  
> > > >  	intel_dsc_enable(new_crtc_state);
> > > >  
> > > > @@ -1665,19 +1646,17 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > >  	intel_set_pipe_src_size(new_crtc_state);
> > > >  	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
> > > >  		bdw_set_pipe_misc(new_crtc_state);
> > > > +}
> > > >  
> > > > -	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&
> > > > -	    !transcoder_is_dsi(cpu_transcoder))
> > > > -		hsw_configure_cpu_transcoder(new_crtc_state);
> > > > +static void hsw_crtc_enable_post_transcoder(struct intel_atomic_state *state,
> > > > +					    struct intel_crtc *crtc)
> > > > +{
> > > > +	const struct intel_crtc_state *new_crtc_state =
> > > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > >  
> > > >  	crtc->active = true;
> > > >  
> > > > -	/* Display WA #1180: WaDisableScalarClockGating: glk */
> > > > -	psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > > > -		new_crtc_state->pch_pfit.enabled;
> > > > -	if (psl_clkgate_wa)
> > > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> > > > -
> > > >  	if (DISPLAY_VER(dev_priv) >= 9)
> > > >  		skl_pfit_enable(new_crtc_state);
> > > >  	else
> > > > @@ -1700,27 +1679,84 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > >  		icl_set_pipe_chicken(new_crtc_state);
> > > >  
> > > >  	intel_initial_watermarks(state, crtc);
> > > > +}
> > > >  
> > > > -	if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > > > -		intel_crtc_vblank_on(new_crtc_state);
> > > > +static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > +			    struct intel_crtc *crtc)
> > > > +{
> > > > +	const struct intel_crtc_state *new_crtc_state =
> > > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > +	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > > +	struct intel_crtc *_crtc;
> > > > +	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(new_crtc_state);
> > > > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > > > +	bool psl_clkgate_wa;
> > > > +	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > > >  
> > > > -	intel_encoders_enable(state, crtc);
> > > > +	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > > +		return;
> > > >  
> > > > -	if (psl_clkgate_wa) {
> > > > -		intel_crtc_wait_for_next_vblank(crtc);
> > > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> > > > -	}
> > > > +	/*
> > > > +	 * Use reverse iterator to go through slave pipes first.
> > > > +	 * TODO: We might need smarter iterator here
> > > > +	 */
> > > > +	for_each_intel_crtc_in_pipe_mask_reverse(&dev_priv->drm, _crtc,
> > > > +						 pipe_mask) {
> > > > +		const struct intel_crtc_state *_new_crtc_state =
> > > > +			intel_atomic_get_new_crtc_state(state, _crtc);
> > > > +		bool needs_transcoder = ((slave_pipe_mask & BIT(_crtc->pipe)) == 0) &&
> > > > +					!transcoder_is_dsi(cpu_transcoder);
> > > > +
> > > > +		intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > > +
> > > > +		if (!new_crtc_state->bigjoiner_pipes) {
> > > > +			if (needs_transcoder)
> > > > +				intel_encoders_pre_pll_enable(state, crtc);
> > > > +
> > > > +			if (new_crtc_state->shared_dpll)
> > > > +				intel_enable_shared_dpll(new_crtc_state);
> > > > +
> > > > +			if (needs_transcoder)
> > > > +				intel_encoders_pre_enable(state, crtc);
> > > > +		} else {
> > > > +			icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > > +		}
> > > 
> > > That mess needs to be eliminated entirely.
> > 
> > Yeah, was thinking about this too, was just a bit unsure how..
> > 
> > > 
> > > > +
> > > > +		hsw_crtc_enable_pre_transcoder(state, _crtc);
> > > > +
> > > > +		if (needs_transcoder)
> > > > +			hsw_configure_cpu_transcoder(_new_crtc_state);
> > > 
> > > These transcoder things should not be within any pipe loop at all.
> > 
> > I didn't want to split the loop, which I would have to do otherwise,
> > but may be it makes sense, since transcoder path is needed only for master
> > pipe. However what if _hypothetically_ :) we would have more than one master
> > pipe?
> 
> Doesn't matter how many pipes there are. There is always just one
> transcoder.

How I see it now, the sequence for example for master hsw_crtc_enable is:

pipe1 stuff before transcoder
(transcoder programming not needed)
pipe1 stuff after transcoder

pipe0 stuff before transcoder
transcoder programmed
pipe0 stuff after transcoder

if we want to have a single unified loop for all pipes, I guess we have to
have a transcoder check inside a loop, because we cant do the 
"pipe0 stuff after transcoder" thing, before the transcoder is programmed.

I could of course split it this way:

for (...)
  pipe stuff before transcoder

transcoder programmed

for (...)
  pipe stuff after transcoder

but then the sequence still will be different from original, it will look like:
pipe1 stuff before transcoder

pipe0 stuff before transcoder

transcoder programmed

pipe1 stuff after transcoder

pipe0 stuff after transcoder

which is different from original sequence, because we in fact
want that:
program pipe1(slave)

program pipe0 stuff before transcoder(master)
program transcoder
program pipe0 stuff after transcoder(master)

So do you think that splitting won't harm or you see some other way to do that?


Stan

> 
> > 
> > > 
> > > > +
> > > > +		/* Display WA #1180: WaDisableScalarClockGating: glk */
> > > > +		psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > > > +			new_crtc_state->pch_pfit.enabled;
> > > > +		if (psl_clkgate_wa)
> > > > +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> > > > +
> > > > +		hsw_crtc_enable_post_transcoder(state, _crtc);
> > > > +
> > > > +		if (needs_transcoder)
> > > > +			intel_encoders_enable(state, crtc);
> > > > +		else
> > > > +			intel_crtc_vblank_on(_new_crtc_state);
> > > > +
> > > > +		if (psl_clkgate_wa) {
> > > > +			intel_crtc_wait_for_next_vblank(crtc);
> > > > +			glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> > > > +		}
> > > >  
> > > > -	/* If we change the relative order between pipe/planes enabling, we need
> > > > -	 * to change the workaround. */
> > > > -	hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
> > > > -	if (IS_HASWELL(dev_priv) && hsw_workaround_pipe != INVALID_PIPE) {
> > > > -		struct intel_crtc *wa_crtc;
> > > > +		/* If we change the relative order between pipe/planes enabling, we need
> > > > +		 * to change the workaround. */
> > > > +		hsw_workaround_pipe = new_crtc_state->hsw_workaround_pipe;
> > > > +		if (IS_HASWELL(dev_priv) && hsw_workaround_pipe != INVALID_PIPE) {
> > > > +			struct intel_crtc *wa_crtc;
> > > >  
> > > > -		wa_crtc = intel_crtc_for_pipe(dev_priv, hsw_workaround_pipe);
> > > > +			wa_crtc = intel_crtc_for_pipe(dev_priv, hsw_workaround_pipe);
> > > >  
> > > > -		intel_crtc_wait_for_next_vblank(wa_crtc);
> > > > -		intel_crtc_wait_for_next_vblank(wa_crtc);
> > > > +			intel_crtc_wait_for_next_vblank(wa_crtc);
> > > > +			intel_crtc_wait_for_next_vblank(wa_crtc);
> > > > +		}
> > > >  	}
> > > >  }
> > > >  
> > > > @@ -1784,28 +1820,27 @@ static void hsw_crtc_disable(struct intel_atomic_state *state,
> > > >  	const struct intel_crtc_state *old_crtc_state =
> > > >  		intel_atomic_get_old_crtc_state(state, crtc);
> > > >  	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
> > > > +	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(old_crtc_state);
> > > > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > > > +	struct intel_crtc *_crtc;
> > > > +
> > > > +	for_each_intel_crtc_in_pipe_mask(&i915->drm, _crtc,
> > > > +					 pipe_mask) {
> > > > +		const struct intel_crtc_state *_old_crtc_state =
> > > > +			intel_atomic_get_old_crtc_state(state, _crtc);
> > > > +		bool needs_encoder_disable = (slave_pipe_mask & BIT(_crtc->pipe)) == 0;
> > > > +
> > > > +		if (needs_encoder_disable) {
> > > > +			intel_encoders_disable(state, _crtc);
> > > > +			intel_encoders_post_disable(state, _crtc);
> > > > +		}
> > > >  
> > > > -	/*
> > > > -	 * FIXME collapse everything to one hook.
> > > > -	 * Need care with mst->ddi interactions.
> > > > -	 */
> > > > -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> > > > -		intel_encoders_disable(state, crtc);
> > > > -		intel_encoders_post_disable(state, crtc);
> > > > -	}
> > > > -
> > > > -	intel_disable_shared_dpll(old_crtc_state);
> > > > -
> > > > -	if (!intel_crtc_is_bigjoiner_slave(old_crtc_state)) {
> > > > -		struct intel_crtc *slave_crtc;
> > > > -
> > > > -		intel_encoders_post_pll_disable(state, crtc);
> > > > +		intel_disable_shared_dpll(_old_crtc_state);
> > > >  
> > > > -		intel_dmc_disable_pipe(i915, crtc->pipe);
> > > > +		if (needs_encoder_disable)
> > > > +			intel_encoders_post_pll_disable(state, _crtc);
> > > >  
> > > > -		for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > > > -						 intel_crtc_bigjoiner_slave_pipes(old_crtc_state))
> > > > -			intel_dmc_disable_pipe(i915, slave_crtc->pipe);
> > > > +		intel_dmc_disable_pipe(i915, _crtc->pipe);
> > > >  	}
> > > >  }
> > > >  
> > > > @@ -6788,8 +6823,10 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
> > > >  		 * Slave vblanks are masked till Master Vblanks.
> > > >  		 */
> > > >  		if (!is_trans_port_sync_slave(old_crtc_state) &&
> > > > -		    !intel_dp_mst_is_slave_trans(old_crtc_state) &&
> > > > -		    !intel_crtc_is_bigjoiner_slave(old_crtc_state))
> > > > +		    !intel_dp_mst_is_slave_trans(old_crtc_state))
> > > > +			continue;
> > > > +
> > > > +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
> > > >  			continue;
> > > >  
> > > >  		intel_old_crtc_state_disables(state, old_crtc_state,
> > > > @@ -6807,6 +6844,9 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
> > > >  		if (!old_crtc_state->hw.active)
> > > >  			continue;
> > > >  
> > > > +		if (intel_crtc_is_bigjoiner_slave(old_crtc_state))
> > > > +			continue;
> > > > +
> > > >  		intel_old_crtc_state_disables(state, old_crtc_state,
> > > >  					      new_crtc_state, crtc);
> > > >  	}
> > > > @@ -6919,8 +6959,10 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
> > > >  			continue;
> > > >  
> > > >  		if (intel_dp_mst_is_slave_trans(new_crtc_state) ||
> > > > -		    is_trans_port_sync_master(new_crtc_state) ||
> > > > -		    intel_crtc_is_bigjoiner_master(new_crtc_state))
> > > > +		    is_trans_port_sync_master(new_crtc_state))
> > > > +			continue;
> > > > +
> > > > +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > > >  			continue;
> > > >  
> > > >  		modeset_pipes &= ~BIT(pipe);
> > > > @@ -6930,7 +6972,7 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
> > > >  
> > > >  	/*
> > > >  	 * Then we enable all remaining pipes that depend on other
> > > > -	 * pipes: MST slaves and port sync masters, big joiner master
> > > > +	 * pipes: MST slaves and port sync masters
> > > >  	 */
> > > >  	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
> > > >  		enum pipe pipe = crtc->pipe;
> > > > @@ -6938,6 +6980,9 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
> > > >  		if ((modeset_pipes & BIT(pipe)) == 0)
> > > >  			continue;
> > > >  
> > > > +		if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > > > +			continue;
> > > > +
> > > >  		modeset_pipes &= ~BIT(pipe);
> > > 
> > > We are modesetting all the joined pipes here. The bitmask should reflect
> > > that.
> > 
> > Ohhh thanks for spotting. That might explain some issues we have atm.
> > 
> > > 
> > > >  
> > > >  		intel_enable_crtc(state, crtc);
> > > > diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
> > > > index f4a0773f0fca8..e1e8d956c305e 100644
> > > > --- a/drivers/gpu/drm/i915/display/intel_display.h
> > > > +++ b/drivers/gpu/drm/i915/display/intel_display.h
> > > > @@ -280,6 +280,12 @@ enum phy_fia {
> > > >  			    base.head)					\
> > > >  		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
> > > >  
> > > > +#define for_each_intel_crtc_in_pipe_mask_reverse(dev, intel_crtc, pipe_mask)	\
> > > > +	list_for_each_entry_reverse(intel_crtc,					\
> > > > +				    &(dev)->mode_config.crtc_list,		\
> > > > +				    base.head)					\
> > > > +		for_each_if((pipe_mask) & BIT(intel_crtc->pipe))
> > > > +
> > > >  #define for_each_intel_encoder(dev, intel_encoder)		\
> > > >  	list_for_each_entry(intel_encoder,			\
> > > >  			    &(dev)->mode_config.encoder_list,	\
> > > > -- 
> > > > 2.37.3
> > > 
> > > -- 
> > > Ville Syrjälä
> > > Intel
> 
> -- 
> Ville Syrjälä
> Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset
  2024-03-01 12:29         ` Lisovskiy, Stanislav
@ 2024-03-01 14:40           ` Ville Syrjälä
  2024-03-01 15:17             ` Lisovskiy, Stanislav
  0 siblings, 1 reply; 33+ messages in thread
From: Ville Syrjälä @ 2024-03-01 14:40 UTC (permalink / raw)
  To: Lisovskiy, Stanislav; +Cc: intel-gfx, jani.saarinen, vidya.srinivas

On Fri, Mar 01, 2024 at 02:29:28PM +0200, Lisovskiy, Stanislav wrote:
> On Fri, Mar 01, 2024 at 12:43:46PM +0200, Ville Syrjälä wrote:
> > On Fri, Mar 01, 2024 at 12:27:18PM +0200, Lisovskiy, Stanislav wrote:
> > > On Fri, Mar 01, 2024 at 12:10:52PM +0200, Ville Syrjälä wrote:
> > > > On Wed, Feb 21, 2024 at 09:20:09PM +0200, Stanislav Lisovskiy wrote:
> > > > > Handle only bigjoiner masters in skl_commit_modeset_enables/disables,
> > > > > slave crtcs should be handled by master hooks. Same for encoders.
> > > > > That way we can also remove a bunch of checks like intel_crtc_is_bigjoiner_slave.
> > > > > 
> > > > > v2: Get rid of master vs slave checks and separation in crtc enable/disable hooks.
> > > > >     Use unified iteration cycle for all of those, while enabling/disabling
> > > > >     transcoder only for those pipes where its needed(Ville Syrjälä)
> > > > > 
> > > > > v3: Move all the intel_encoder_* calls under transcoder code path(Ville Syrjälä)
> > > > > 
> > > > > v4:  - Call intel_crtc_vblank_on from hsw_crtc_enable only for non-transcoder path
> > > > >        (for master pipe that will be called from intel_encoders_enable/intel_enable_ddi)
> > > > >      - Fix stupid mistake with using crtc->pipe for the mask, instead of BIT(crtc->pipe)
> > > > > 
> > > > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > > > > ---
> > > > >  drivers/gpu/drm/i915/display/intel_ddi.c     |  21 +--
> > > > >  drivers/gpu/drm/i915/display/intel_display.c | 183 ++++++++++++-------
> > > > >  drivers/gpu/drm/i915/display/intel_display.h |   6 +
> > > > >  3 files changed, 121 insertions(+), 89 deletions(-)
> > > > > 
> > > > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > > index bea4415902044..6071e9f500871 100644
> > > > > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > > @@ -3100,7 +3100,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> > > > >  				   const struct drm_connector_state *old_conn_state)
> > > > >  {
> > > > >  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> > > > > -	struct intel_crtc *slave_crtc;
> > > > >  
> > > > >  	if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST)) {
> > > > >  		intel_crtc_vblank_off(old_crtc_state);
> > > > > @@ -3117,17 +3116,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> > > > >  			ilk_pfit_disable(old_crtc_state);
> > > > >  	}
> > > > 
> > > > The master pipe stuff is right here ^ ...
> > > > 
> > > > >  
> > > > > -	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, slave_crtc,
> > > > > -					 intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) {
> > > > > -		const struct intel_crtc_state *old_slave_crtc_state =
> > > > > -			intel_atomic_get_old_crtc_state(state, slave_crtc);
> > > > > -
> > > > > -		intel_crtc_vblank_off(old_slave_crtc_state);
> > > > > -
> > > > > -		intel_dsc_disable(old_slave_crtc_state);
> > > > > -		skl_scaler_disable(old_slave_crtc_state);
> > > > > -	}
> > > > 
> > > > .. but now you're moving the slave pipe stuff somewhere else?
> > > > 
> > > > We should be just iterating the pipes here (assuming this 
> > > > is the correct spot to do these steps).
> > > > 
> > > > > -
> > > > >  	/*
> > > > >  	 * When called from DP MST code:
> > > > >  	 * - old_conn_state will be NULL
> > > > > @@ -3363,8 +3351,7 @@ static void intel_enable_ddi(struct intel_atomic_state *state,
> > > > >  {
> > > > >  	drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
> > > > >  
> > > > > -	if (!intel_crtc_is_bigjoiner_slave(crtc_state))
> > > > > -		intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > > > > +	intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > > > >  
> > > > >  	/* Enable/Disable DP2.0 SDP split config before transcoder */
> > > > >  	intel_audio_sdp_split_update(crtc_state);
> > > > > @@ -3469,9 +3456,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> > > > >  				  struct intel_crtc *crtc)
> > > > >  {
> > > > >  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> > > > > -	struct intel_crtc_state *crtc_state =
> > > > > -		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > -	struct intel_crtc *slave_crtc;
> > > > >  	enum phy phy = intel_port_to_phy(i915, encoder->port);
> > > > >  
> > > > >  	/* FIXME: Add MTL pll_mgr */
> > > > > @@ -3479,9 +3463,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> > > > >  		return;
> > > > >  
> > > > >  	intel_update_active_dpll(state, crtc, encoder);
> > > > > -	for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > > > > -					 intel_crtc_bigjoiner_slave_pipes(crtc_state))
> > > > > -		intel_update_active_dpll(state, slave_crtc, encoder);
> > > > >  }
> > > > >  
> > > > >  static void
> > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> > > > > index 916c13a149fd5..e1ea53fd6a288 100644
> > > > > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > > > > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > > > > @@ -1631,31 +1631,12 @@ static void hsw_configure_cpu_transcoder(const struct intel_crtc_state *crtc_sta
> > > > >  	hsw_set_transconf(crtc_state);
> > > > >  }
> > > > >  
> > > > > -static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > -			    struct intel_crtc *crtc)
> > > > > +static void hsw_crtc_enable_pre_transcoder(struct intel_atomic_state *state,
> > > > > +					   struct intel_crtc *crtc)
> > > > >  {
> > > > >  	const struct intel_crtc_state *new_crtc_state =
> > > > >  		intel_atomic_get_new_crtc_state(state, crtc);
> > > > >  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > > -	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > > > > -	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > > > -	bool psl_clkgate_wa;
> > > > > -
> > > > > -	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > > > -		return;
> > > > > -
> > > > > -	intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > > > -
> > > > > -	if (!new_crtc_state->bigjoiner_pipes) {
> > > > > -		intel_encoders_pre_pll_enable(state, crtc);
> > > > > -
> > > > > -		if (new_crtc_state->shared_dpll)
> > > > > -			intel_enable_shared_dpll(new_crtc_state);
> > > > > -
> > > > > -		intel_encoders_pre_enable(state, crtc);
> > > > > -	} else {
> > > > > -		icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > > > -	}
> > > > >  
> > > > >  	intel_dsc_enable(new_crtc_state);
> > > > >  
> > > > > @@ -1665,19 +1646,17 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > >  	intel_set_pipe_src_size(new_crtc_state);
> > > > >  	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
> > > > >  		bdw_set_pipe_misc(new_crtc_state);
> > > > > +}
> > > > >  
> > > > > -	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&
> > > > > -	    !transcoder_is_dsi(cpu_transcoder))
> > > > > -		hsw_configure_cpu_transcoder(new_crtc_state);
> > > > > +static void hsw_crtc_enable_post_transcoder(struct intel_atomic_state *state,
> > > > > +					    struct intel_crtc *crtc)
> > > > > +{
> > > > > +	const struct intel_crtc_state *new_crtc_state =
> > > > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > >  
> > > > >  	crtc->active = true;
> > > > >  
> > > > > -	/* Display WA #1180: WaDisableScalarClockGating: glk */
> > > > > -	psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > > > > -		new_crtc_state->pch_pfit.enabled;
> > > > > -	if (psl_clkgate_wa)
> > > > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> > > > > -
> > > > >  	if (DISPLAY_VER(dev_priv) >= 9)
> > > > >  		skl_pfit_enable(new_crtc_state);
> > > > >  	else
> > > > > @@ -1700,27 +1679,84 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > >  		icl_set_pipe_chicken(new_crtc_state);
> > > > >  
> > > > >  	intel_initial_watermarks(state, crtc);
> > > > > +}
> > > > >  
> > > > > -	if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > > > > -		intel_crtc_vblank_on(new_crtc_state);
> > > > > +static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > +			    struct intel_crtc *crtc)
> > > > > +{
> > > > > +	const struct intel_crtc_state *new_crtc_state =
> > > > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > > +	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > > > +	struct intel_crtc *_crtc;
> > > > > +	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(new_crtc_state);
> > > > > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > > > > +	bool psl_clkgate_wa;
> > > > > +	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > > > >  
> > > > > -	intel_encoders_enable(state, crtc);
> > > > > +	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > > > +		return;
> > > > >  
> > > > > -	if (psl_clkgate_wa) {
> > > > > -		intel_crtc_wait_for_next_vblank(crtc);
> > > > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> > > > > -	}
> > > > > +	/*
> > > > > +	 * Use reverse iterator to go through slave pipes first.
> > > > > +	 * TODO: We might need smarter iterator here
> > > > > +	 */
> > > > > +	for_each_intel_crtc_in_pipe_mask_reverse(&dev_priv->drm, _crtc,
> > > > > +						 pipe_mask) {
> > > > > +		const struct intel_crtc_state *_new_crtc_state =
> > > > > +			intel_atomic_get_new_crtc_state(state, _crtc);
> > > > > +		bool needs_transcoder = ((slave_pipe_mask & BIT(_crtc->pipe)) == 0) &&
> > > > > +					!transcoder_is_dsi(cpu_transcoder);
> > > > > +
> > > > > +		intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > > > +
> > > > > +		if (!new_crtc_state->bigjoiner_pipes) {
> > > > > +			if (needs_transcoder)
> > > > > +				intel_encoders_pre_pll_enable(state, crtc);
> > > > > +
> > > > > +			if (new_crtc_state->shared_dpll)
> > > > > +				intel_enable_shared_dpll(new_crtc_state);
> > > > > +
> > > > > +			if (needs_transcoder)
> > > > > +				intel_encoders_pre_enable(state, crtc);
> > > > > +		} else {
> > > > > +			icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > > > +		}
> > > > 
> > > > That mess needs to be eliminated entirely.
> > > 
> > > Yeah, was thinking about this too, was just a bit unsure how..
> > > 
> > > > 
> > > > > +
> > > > > +		hsw_crtc_enable_pre_transcoder(state, _crtc);
> > > > > +
> > > > > +		if (needs_transcoder)
> > > > > +			hsw_configure_cpu_transcoder(_new_crtc_state);
> > > > 
> > > > These transcoder things should not be within any pipe loop at all.
> > > 
> > > I didn't want to split the loop, which I would have to do otherwise,
> > > but may be it makes sense, since transcoder path is needed only for master
> > > pipe. However what if _hypothetically_ :) we would have more than one master
> > > pipe?
> > 
> > Doesn't matter how many pipes there are. There is always just one
> > transcoder.
> 
> How I see it now, the sequence for example for master hsw_crtc_enable is:
> 
> pipe1 stuff before transcoder
> (transcoder programming not needed)
> pipe1 stuff after transcoder
> 
> pipe0 stuff before transcoder
> transcoder programmed
> pipe0 stuff after transcoder
> 
> if we want to have a single unified loop for all pipes, I guess we have to
> have a transcoder check inside a loop, because we cant do the 
> "pipe0 stuff after transcoder" thing, before the transcoder is programmed.
> 
> I could of course split it this way:
> 
> for (...)
>   pipe stuff before transcoder
> 
> transcoder programmed
> 
> for (...)
>   pipe stuff after transcoder
> 
> but then the sequence still will be different from original, it will look like:
> pipe1 stuff before transcoder
> 
> pipe0 stuff before transcoder
> 
> transcoder programmed
> 
> pipe1 stuff after transcoder
> 
> pipe0 stuff after transcoder
> 
> which is different from original sequence, because we in fact
> want that:
> program pipe1(slave)
> 
> program pipe0 stuff before transcoder(master)
> program transcoder
> program pipe0 stuff after transcoder(master)
> 
> So do you think that splitting won't harm or you see some other way to do that?

The current code is mostly nonsense I think. Probably only work
through the power of prayer. I think we need to be able to control
the per-pipe vs. per-transcoder steps more freely to make it actually
correct.

I fired off a quick attempt at converting the disable side,
since that is a bit more straightforwad. The end result looks
fairly reasonable to me at least.
https://patchwork.freedesktop.org/series/130619/

-- 
Ville Syrjälä
Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset
  2024-03-01 14:40           ` Ville Syrjälä
@ 2024-03-01 15:17             ` Lisovskiy, Stanislav
  2024-03-01 15:26               ` Ville Syrjälä
  0 siblings, 1 reply; 33+ messages in thread
From: Lisovskiy, Stanislav @ 2024-03-01 15:17 UTC (permalink / raw)
  To: Ville Syrjälä; +Cc: intel-gfx, jani.saarinen, vidya.srinivas

On Fri, Mar 01, 2024 at 04:40:28PM +0200, Ville Syrjälä wrote:
> On Fri, Mar 01, 2024 at 02:29:28PM +0200, Lisovskiy, Stanislav wrote:
> > On Fri, Mar 01, 2024 at 12:43:46PM +0200, Ville Syrjälä wrote:
> > > On Fri, Mar 01, 2024 at 12:27:18PM +0200, Lisovskiy, Stanislav wrote:
> > > > On Fri, Mar 01, 2024 at 12:10:52PM +0200, Ville Syrjälä wrote:
> > > > > On Wed, Feb 21, 2024 at 09:20:09PM +0200, Stanislav Lisovskiy wrote:
> > > > > > Handle only bigjoiner masters in skl_commit_modeset_enables/disables,
> > > > > > slave crtcs should be handled by master hooks. Same for encoders.
> > > > > > That way we can also remove a bunch of checks like intel_crtc_is_bigjoiner_slave.
> > > > > > 
> > > > > > v2: Get rid of master vs slave checks and separation in crtc enable/disable hooks.
> > > > > >     Use unified iteration cycle for all of those, while enabling/disabling
> > > > > >     transcoder only for those pipes where its needed(Ville Syrjälä)
> > > > > > 
> > > > > > v3: Move all the intel_encoder_* calls under transcoder code path(Ville Syrjälä)
> > > > > > 
> > > > > > v4:  - Call intel_crtc_vblank_on from hsw_crtc_enable only for non-transcoder path
> > > > > >        (for master pipe that will be called from intel_encoders_enable/intel_enable_ddi)
> > > > > >      - Fix stupid mistake with using crtc->pipe for the mask, instead of BIT(crtc->pipe)
> > > > > > 
> > > > > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > > > > > ---
> > > > > >  drivers/gpu/drm/i915/display/intel_ddi.c     |  21 +--
> > > > > >  drivers/gpu/drm/i915/display/intel_display.c | 183 ++++++++++++-------
> > > > > >  drivers/gpu/drm/i915/display/intel_display.h |   6 +
> > > > > >  3 files changed, 121 insertions(+), 89 deletions(-)
> > > > > > 
> > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > > > index bea4415902044..6071e9f500871 100644
> > > > > > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > > > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > > > @@ -3100,7 +3100,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> > > > > >  				   const struct drm_connector_state *old_conn_state)
> > > > > >  {
> > > > > >  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> > > > > > -	struct intel_crtc *slave_crtc;
> > > > > >  
> > > > > >  	if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST)) {
> > > > > >  		intel_crtc_vblank_off(old_crtc_state);
> > > > > > @@ -3117,17 +3116,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> > > > > >  			ilk_pfit_disable(old_crtc_state);
> > > > > >  	}
> > > > > 
> > > > > The master pipe stuff is right here ^ ...
> > > > > 
> > > > > >  
> > > > > > -	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, slave_crtc,
> > > > > > -					 intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) {
> > > > > > -		const struct intel_crtc_state *old_slave_crtc_state =
> > > > > > -			intel_atomic_get_old_crtc_state(state, slave_crtc);
> > > > > > -
> > > > > > -		intel_crtc_vblank_off(old_slave_crtc_state);
> > > > > > -
> > > > > > -		intel_dsc_disable(old_slave_crtc_state);
> > > > > > -		skl_scaler_disable(old_slave_crtc_state);
> > > > > > -	}
> > > > > 
> > > > > .. but now you're moving the slave pipe stuff somewhere else?
> > > > > 
> > > > > We should be just iterating the pipes here (assuming this 
> > > > > is the correct spot to do these steps).
> > > > > 
> > > > > > -
> > > > > >  	/*
> > > > > >  	 * When called from DP MST code:
> > > > > >  	 * - old_conn_state will be NULL
> > > > > > @@ -3363,8 +3351,7 @@ static void intel_enable_ddi(struct intel_atomic_state *state,
> > > > > >  {
> > > > > >  	drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
> > > > > >  
> > > > > > -	if (!intel_crtc_is_bigjoiner_slave(crtc_state))
> > > > > > -		intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > > > > > +	intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > > > > >  
> > > > > >  	/* Enable/Disable DP2.0 SDP split config before transcoder */
> > > > > >  	intel_audio_sdp_split_update(crtc_state);
> > > > > > @@ -3469,9 +3456,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> > > > > >  				  struct intel_crtc *crtc)
> > > > > >  {
> > > > > >  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> > > > > > -	struct intel_crtc_state *crtc_state =
> > > > > > -		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > > -	struct intel_crtc *slave_crtc;
> > > > > >  	enum phy phy = intel_port_to_phy(i915, encoder->port);
> > > > > >  
> > > > > >  	/* FIXME: Add MTL pll_mgr */
> > > > > > @@ -3479,9 +3463,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> > > > > >  		return;
> > > > > >  
> > > > > >  	intel_update_active_dpll(state, crtc, encoder);
> > > > > > -	for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > > > > > -					 intel_crtc_bigjoiner_slave_pipes(crtc_state))
> > > > > > -		intel_update_active_dpll(state, slave_crtc, encoder);
> > > > > >  }
> > > > > >  
> > > > > >  static void
> > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> > > > > > index 916c13a149fd5..e1ea53fd6a288 100644
> > > > > > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > > > > > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > > > > > @@ -1631,31 +1631,12 @@ static void hsw_configure_cpu_transcoder(const struct intel_crtc_state *crtc_sta
> > > > > >  	hsw_set_transconf(crtc_state);
> > > > > >  }
> > > > > >  
> > > > > > -static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > > -			    struct intel_crtc *crtc)
> > > > > > +static void hsw_crtc_enable_pre_transcoder(struct intel_atomic_state *state,
> > > > > > +					   struct intel_crtc *crtc)
> > > > > >  {
> > > > > >  	const struct intel_crtc_state *new_crtc_state =
> > > > > >  		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > >  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > > > -	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > > > > > -	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > > > > -	bool psl_clkgate_wa;
> > > > > > -
> > > > > > -	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > > > > -		return;
> > > > > > -
> > > > > > -	intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > > > > -
> > > > > > -	if (!new_crtc_state->bigjoiner_pipes) {
> > > > > > -		intel_encoders_pre_pll_enable(state, crtc);
> > > > > > -
> > > > > > -		if (new_crtc_state->shared_dpll)
> > > > > > -			intel_enable_shared_dpll(new_crtc_state);
> > > > > > -
> > > > > > -		intel_encoders_pre_enable(state, crtc);
> > > > > > -	} else {
> > > > > > -		icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > > > > -	}
> > > > > >  
> > > > > >  	intel_dsc_enable(new_crtc_state);
> > > > > >  
> > > > > > @@ -1665,19 +1646,17 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > >  	intel_set_pipe_src_size(new_crtc_state);
> > > > > >  	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
> > > > > >  		bdw_set_pipe_misc(new_crtc_state);
> > > > > > +}
> > > > > >  
> > > > > > -	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&
> > > > > > -	    !transcoder_is_dsi(cpu_transcoder))
> > > > > > -		hsw_configure_cpu_transcoder(new_crtc_state);
> > > > > > +static void hsw_crtc_enable_post_transcoder(struct intel_atomic_state *state,
> > > > > > +					    struct intel_crtc *crtc)
> > > > > > +{
> > > > > > +	const struct intel_crtc_state *new_crtc_state =
> > > > > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > > >  
> > > > > >  	crtc->active = true;
> > > > > >  
> > > > > > -	/* Display WA #1180: WaDisableScalarClockGating: glk */
> > > > > > -	psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > > > > > -		new_crtc_state->pch_pfit.enabled;
> > > > > > -	if (psl_clkgate_wa)
> > > > > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> > > > > > -
> > > > > >  	if (DISPLAY_VER(dev_priv) >= 9)
> > > > > >  		skl_pfit_enable(new_crtc_state);
> > > > > >  	else
> > > > > > @@ -1700,27 +1679,84 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > >  		icl_set_pipe_chicken(new_crtc_state);
> > > > > >  
> > > > > >  	intel_initial_watermarks(state, crtc);
> > > > > > +}
> > > > > >  
> > > > > > -	if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > > > > > -		intel_crtc_vblank_on(new_crtc_state);
> > > > > > +static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > > +			    struct intel_crtc *crtc)
> > > > > > +{
> > > > > > +	const struct intel_crtc_state *new_crtc_state =
> > > > > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > > > +	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > > > > +	struct intel_crtc *_crtc;
> > > > > > +	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(new_crtc_state);
> > > > > > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > > > > > +	bool psl_clkgate_wa;
> > > > > > +	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > > > > >  
> > > > > > -	intel_encoders_enable(state, crtc);
> > > > > > +	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > > > > +		return;
> > > > > >  
> > > > > > -	if (psl_clkgate_wa) {
> > > > > > -		intel_crtc_wait_for_next_vblank(crtc);
> > > > > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> > > > > > -	}
> > > > > > +	/*
> > > > > > +	 * Use reverse iterator to go through slave pipes first.
> > > > > > +	 * TODO: We might need smarter iterator here
> > > > > > +	 */
> > > > > > +	for_each_intel_crtc_in_pipe_mask_reverse(&dev_priv->drm, _crtc,
> > > > > > +						 pipe_mask) {
> > > > > > +		const struct intel_crtc_state *_new_crtc_state =
> > > > > > +			intel_atomic_get_new_crtc_state(state, _crtc);
> > > > > > +		bool needs_transcoder = ((slave_pipe_mask & BIT(_crtc->pipe)) == 0) &&
> > > > > > +					!transcoder_is_dsi(cpu_transcoder);
> > > > > > +
> > > > > > +		intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > > > > +
> > > > > > +		if (!new_crtc_state->bigjoiner_pipes) {
> > > > > > +			if (needs_transcoder)
> > > > > > +				intel_encoders_pre_pll_enable(state, crtc);
> > > > > > +
> > > > > > +			if (new_crtc_state->shared_dpll)
> > > > > > +				intel_enable_shared_dpll(new_crtc_state);
> > > > > > +
> > > > > > +			if (needs_transcoder)
> > > > > > +				intel_encoders_pre_enable(state, crtc);
> > > > > > +		} else {
> > > > > > +			icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > > > > +		}
> > > > > 
> > > > > That mess needs to be eliminated entirely.
> > > > 
> > > > Yeah, was thinking about this too, was just a bit unsure how..
> > > > 
> > > > > 
> > > > > > +
> > > > > > +		hsw_crtc_enable_pre_transcoder(state, _crtc);
> > > > > > +
> > > > > > +		if (needs_transcoder)
> > > > > > +			hsw_configure_cpu_transcoder(_new_crtc_state);
> > > > > 
> > > > > These transcoder things should not be within any pipe loop at all.
> > > > 
> > > > I didn't want to split the loop, which I would have to do otherwise,
> > > > but may be it makes sense, since transcoder path is needed only for master
> > > > pipe. However what if _hypothetically_ :) we would have more than one master
> > > > pipe?
> > > 
> > > Doesn't matter how many pipes there are. There is always just one
> > > transcoder.
> > 
> > How I see it now, the sequence for example for master hsw_crtc_enable is:
> > 
> > pipe1 stuff before transcoder
> > (transcoder programming not needed)
> > pipe1 stuff after transcoder
> > 
> > pipe0 stuff before transcoder
> > transcoder programmed
> > pipe0 stuff after transcoder
> > 
> > if we want to have a single unified loop for all pipes, I guess we have to
> > have a transcoder check inside a loop, because we cant do the 
> > "pipe0 stuff after transcoder" thing, before the transcoder is programmed.
> > 
> > I could of course split it this way:
> > 
> > for (...)
> >   pipe stuff before transcoder
> > 
> > transcoder programmed
> > 
> > for (...)
> >   pipe stuff after transcoder
> > 
> > but then the sequence still will be different from original, it will look like:
> > pipe1 stuff before transcoder
> > 
> > pipe0 stuff before transcoder
> > 
> > transcoder programmed
> > 
> > pipe1 stuff after transcoder
> > 
> > pipe0 stuff after transcoder
> > 
> > which is different from original sequence, because we in fact
> > want that:
> > program pipe1(slave)
> > 
> > program pipe0 stuff before transcoder(master)
> > program transcoder
> > program pipe0 stuff after transcoder(master)
> > 
> > So do you think that splitting won't harm or you see some other way to do that?
> 
> The current code is mostly nonsense I think. Probably only work
> through the power of prayer. I think we need to be able to control
> the per-pipe vs. per-transcoder steps more freely to make it actually
> correct.


Ville, could you communicate to me next time, if you decide to do everything
yourself or you see it some other way.
Basically I was trying to discuss how you see things here and then it just ends
up that way. 
If you didn't like the whole approach why I hear this only now, was following
all your comments and asking questions.
You could either communicate your ideas to me or at least communicate that you
plan to send own series..
Now we had a discussion, some particular things were discussed, then suddenly
you say that everything is crap and send own series.

Is that really professional team work?

Stan

> 
> I fired off a quick attempt at converting the disable side,
> since that is a bit more straightforwad. The end result looks
> fairly reasonable to me at least.
> https://patchwork.freedesktop.org/series/130619/

Ville, could you communicate to me next time, if you decide to do everything

> 
> -- 
> Ville Syrjälä
> Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset
  2024-03-01 15:17             ` Lisovskiy, Stanislav
@ 2024-03-01 15:26               ` Ville Syrjälä
  2024-03-01 15:42                 ` Lisovskiy, Stanislav
  0 siblings, 1 reply; 33+ messages in thread
From: Ville Syrjälä @ 2024-03-01 15:26 UTC (permalink / raw)
  To: Lisovskiy, Stanislav; +Cc: intel-gfx, jani.saarinen, vidya.srinivas

On Fri, Mar 01, 2024 at 05:17:41PM +0200, Lisovskiy, Stanislav wrote:
> On Fri, Mar 01, 2024 at 04:40:28PM +0200, Ville Syrjälä wrote:
> > On Fri, Mar 01, 2024 at 02:29:28PM +0200, Lisovskiy, Stanislav wrote:
> > > On Fri, Mar 01, 2024 at 12:43:46PM +0200, Ville Syrjälä wrote:
> > > > On Fri, Mar 01, 2024 at 12:27:18PM +0200, Lisovskiy, Stanislav wrote:
> > > > > On Fri, Mar 01, 2024 at 12:10:52PM +0200, Ville Syrjälä wrote:
> > > > > > On Wed, Feb 21, 2024 at 09:20:09PM +0200, Stanislav Lisovskiy wrote:
> > > > > > > Handle only bigjoiner masters in skl_commit_modeset_enables/disables,
> > > > > > > slave crtcs should be handled by master hooks. Same for encoders.
> > > > > > > That way we can also remove a bunch of checks like intel_crtc_is_bigjoiner_slave.
> > > > > > > 
> > > > > > > v2: Get rid of master vs slave checks and separation in crtc enable/disable hooks.
> > > > > > >     Use unified iteration cycle for all of those, while enabling/disabling
> > > > > > >     transcoder only for those pipes where its needed(Ville Syrjälä)
> > > > > > > 
> > > > > > > v3: Move all the intel_encoder_* calls under transcoder code path(Ville Syrjälä)
> > > > > > > 
> > > > > > > v4:  - Call intel_crtc_vblank_on from hsw_crtc_enable only for non-transcoder path
> > > > > > >        (for master pipe that will be called from intel_encoders_enable/intel_enable_ddi)
> > > > > > >      - Fix stupid mistake with using crtc->pipe for the mask, instead of BIT(crtc->pipe)
> > > > > > > 
> > > > > > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > > > > > > ---
> > > > > > >  drivers/gpu/drm/i915/display/intel_ddi.c     |  21 +--
> > > > > > >  drivers/gpu/drm/i915/display/intel_display.c | 183 ++++++++++++-------
> > > > > > >  drivers/gpu/drm/i915/display/intel_display.h |   6 +
> > > > > > >  3 files changed, 121 insertions(+), 89 deletions(-)
> > > > > > > 
> > > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > > > > index bea4415902044..6071e9f500871 100644
> > > > > > > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > > > > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > > > > @@ -3100,7 +3100,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> > > > > > >  				   const struct drm_connector_state *old_conn_state)
> > > > > > >  {
> > > > > > >  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> > > > > > > -	struct intel_crtc *slave_crtc;
> > > > > > >  
> > > > > > >  	if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST)) {
> > > > > > >  		intel_crtc_vblank_off(old_crtc_state);
> > > > > > > @@ -3117,17 +3116,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> > > > > > >  			ilk_pfit_disable(old_crtc_state);
> > > > > > >  	}
> > > > > > 
> > > > > > The master pipe stuff is right here ^ ...
> > > > > > 
> > > > > > >  
> > > > > > > -	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, slave_crtc,
> > > > > > > -					 intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) {
> > > > > > > -		const struct intel_crtc_state *old_slave_crtc_state =
> > > > > > > -			intel_atomic_get_old_crtc_state(state, slave_crtc);
> > > > > > > -
> > > > > > > -		intel_crtc_vblank_off(old_slave_crtc_state);
> > > > > > > -
> > > > > > > -		intel_dsc_disable(old_slave_crtc_state);
> > > > > > > -		skl_scaler_disable(old_slave_crtc_state);
> > > > > > > -	}
> > > > > > 
> > > > > > .. but now you're moving the slave pipe stuff somewhere else?
> > > > > > 
> > > > > > We should be just iterating the pipes here (assuming this 
> > > > > > is the correct spot to do these steps).
> > > > > > 
> > > > > > > -
> > > > > > >  	/*
> > > > > > >  	 * When called from DP MST code:
> > > > > > >  	 * - old_conn_state will be NULL
> > > > > > > @@ -3363,8 +3351,7 @@ static void intel_enable_ddi(struct intel_atomic_state *state,
> > > > > > >  {
> > > > > > >  	drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
> > > > > > >  
> > > > > > > -	if (!intel_crtc_is_bigjoiner_slave(crtc_state))
> > > > > > > -		intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > > > > > > +	intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > > > > > >  
> > > > > > >  	/* Enable/Disable DP2.0 SDP split config before transcoder */
> > > > > > >  	intel_audio_sdp_split_update(crtc_state);
> > > > > > > @@ -3469,9 +3456,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> > > > > > >  				  struct intel_crtc *crtc)
> > > > > > >  {
> > > > > > >  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> > > > > > > -	struct intel_crtc_state *crtc_state =
> > > > > > > -		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > > > -	struct intel_crtc *slave_crtc;
> > > > > > >  	enum phy phy = intel_port_to_phy(i915, encoder->port);
> > > > > > >  
> > > > > > >  	/* FIXME: Add MTL pll_mgr */
> > > > > > > @@ -3479,9 +3463,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> > > > > > >  		return;
> > > > > > >  
> > > > > > >  	intel_update_active_dpll(state, crtc, encoder);
> > > > > > > -	for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > > > > > > -					 intel_crtc_bigjoiner_slave_pipes(crtc_state))
> > > > > > > -		intel_update_active_dpll(state, slave_crtc, encoder);
> > > > > > >  }
> > > > > > >  
> > > > > > >  static void
> > > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> > > > > > > index 916c13a149fd5..e1ea53fd6a288 100644
> > > > > > > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > > > > > > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > > > > > > @@ -1631,31 +1631,12 @@ static void hsw_configure_cpu_transcoder(const struct intel_crtc_state *crtc_sta
> > > > > > >  	hsw_set_transconf(crtc_state);
> > > > > > >  }
> > > > > > >  
> > > > > > > -static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > > > -			    struct intel_crtc *crtc)
> > > > > > > +static void hsw_crtc_enable_pre_transcoder(struct intel_atomic_state *state,
> > > > > > > +					   struct intel_crtc *crtc)
> > > > > > >  {
> > > > > > >  	const struct intel_crtc_state *new_crtc_state =
> > > > > > >  		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > > >  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > > > > -	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > > > > > > -	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > > > > > -	bool psl_clkgate_wa;
> > > > > > > -
> > > > > > > -	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > > > > > -		return;
> > > > > > > -
> > > > > > > -	intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > > > > > -
> > > > > > > -	if (!new_crtc_state->bigjoiner_pipes) {
> > > > > > > -		intel_encoders_pre_pll_enable(state, crtc);
> > > > > > > -
> > > > > > > -		if (new_crtc_state->shared_dpll)
> > > > > > > -			intel_enable_shared_dpll(new_crtc_state);
> > > > > > > -
> > > > > > > -		intel_encoders_pre_enable(state, crtc);
> > > > > > > -	} else {
> > > > > > > -		icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > > > > > -	}
> > > > > > >  
> > > > > > >  	intel_dsc_enable(new_crtc_state);
> > > > > > >  
> > > > > > > @@ -1665,19 +1646,17 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > > >  	intel_set_pipe_src_size(new_crtc_state);
> > > > > > >  	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
> > > > > > >  		bdw_set_pipe_misc(new_crtc_state);
> > > > > > > +}
> > > > > > >  
> > > > > > > -	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&
> > > > > > > -	    !transcoder_is_dsi(cpu_transcoder))
> > > > > > > -		hsw_configure_cpu_transcoder(new_crtc_state);
> > > > > > > +static void hsw_crtc_enable_post_transcoder(struct intel_atomic_state *state,
> > > > > > > +					    struct intel_crtc *crtc)
> > > > > > > +{
> > > > > > > +	const struct intel_crtc_state *new_crtc_state =
> > > > > > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > > > >  
> > > > > > >  	crtc->active = true;
> > > > > > >  
> > > > > > > -	/* Display WA #1180: WaDisableScalarClockGating: glk */
> > > > > > > -	psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > > > > > > -		new_crtc_state->pch_pfit.enabled;
> > > > > > > -	if (psl_clkgate_wa)
> > > > > > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> > > > > > > -
> > > > > > >  	if (DISPLAY_VER(dev_priv) >= 9)
> > > > > > >  		skl_pfit_enable(new_crtc_state);
> > > > > > >  	else
> > > > > > > @@ -1700,27 +1679,84 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > > >  		icl_set_pipe_chicken(new_crtc_state);
> > > > > > >  
> > > > > > >  	intel_initial_watermarks(state, crtc);
> > > > > > > +}
> > > > > > >  
> > > > > > > -	if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > > > > > > -		intel_crtc_vblank_on(new_crtc_state);
> > > > > > > +static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > > > +			    struct intel_crtc *crtc)
> > > > > > > +{
> > > > > > > +	const struct intel_crtc_state *new_crtc_state =
> > > > > > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > > > > +	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > > > > > +	struct intel_crtc *_crtc;
> > > > > > > +	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(new_crtc_state);
> > > > > > > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > > > > > > +	bool psl_clkgate_wa;
> > > > > > > +	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > > > > > >  
> > > > > > > -	intel_encoders_enable(state, crtc);
> > > > > > > +	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > > > > > +		return;
> > > > > > >  
> > > > > > > -	if (psl_clkgate_wa) {
> > > > > > > -		intel_crtc_wait_for_next_vblank(crtc);
> > > > > > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> > > > > > > -	}
> > > > > > > +	/*
> > > > > > > +	 * Use reverse iterator to go through slave pipes first.
> > > > > > > +	 * TODO: We might need smarter iterator here
> > > > > > > +	 */
> > > > > > > +	for_each_intel_crtc_in_pipe_mask_reverse(&dev_priv->drm, _crtc,
> > > > > > > +						 pipe_mask) {
> > > > > > > +		const struct intel_crtc_state *_new_crtc_state =
> > > > > > > +			intel_atomic_get_new_crtc_state(state, _crtc);
> > > > > > > +		bool needs_transcoder = ((slave_pipe_mask & BIT(_crtc->pipe)) == 0) &&
> > > > > > > +					!transcoder_is_dsi(cpu_transcoder);
> > > > > > > +
> > > > > > > +		intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > > > > > +
> > > > > > > +		if (!new_crtc_state->bigjoiner_pipes) {
> > > > > > > +			if (needs_transcoder)
> > > > > > > +				intel_encoders_pre_pll_enable(state, crtc);
> > > > > > > +
> > > > > > > +			if (new_crtc_state->shared_dpll)
> > > > > > > +				intel_enable_shared_dpll(new_crtc_state);
> > > > > > > +
> > > > > > > +			if (needs_transcoder)
> > > > > > > +				intel_encoders_pre_enable(state, crtc);
> > > > > > > +		} else {
> > > > > > > +			icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > > > > > +		}
> > > > > > 
> > > > > > That mess needs to be eliminated entirely.
> > > > > 
> > > > > Yeah, was thinking about this too, was just a bit unsure how..
> > > > > 
> > > > > > 
> > > > > > > +
> > > > > > > +		hsw_crtc_enable_pre_transcoder(state, _crtc);
> > > > > > > +
> > > > > > > +		if (needs_transcoder)
> > > > > > > +			hsw_configure_cpu_transcoder(_new_crtc_state);
> > > > > > 
> > > > > > These transcoder things should not be within any pipe loop at all.
> > > > > 
> > > > > I didn't want to split the loop, which I would have to do otherwise,
> > > > > but may be it makes sense, since transcoder path is needed only for master
> > > > > pipe. However what if _hypothetically_ :) we would have more than one master
> > > > > pipe?
> > > > 
> > > > Doesn't matter how many pipes there are. There is always just one
> > > > transcoder.
> > > 
> > > How I see it now, the sequence for example for master hsw_crtc_enable is:
> > > 
> > > pipe1 stuff before transcoder
> > > (transcoder programming not needed)
> > > pipe1 stuff after transcoder
> > > 
> > > pipe0 stuff before transcoder
> > > transcoder programmed
> > > pipe0 stuff after transcoder
> > > 
> > > if we want to have a single unified loop for all pipes, I guess we have to
> > > have a transcoder check inside a loop, because we cant do the 
> > > "pipe0 stuff after transcoder" thing, before the transcoder is programmed.
> > > 
> > > I could of course split it this way:
> > > 
> > > for (...)
> > >   pipe stuff before transcoder
> > > 
> > > transcoder programmed
> > > 
> > > for (...)
> > >   pipe stuff after transcoder
> > > 
> > > but then the sequence still will be different from original, it will look like:
> > > pipe1 stuff before transcoder
> > > 
> > > pipe0 stuff before transcoder
> > > 
> > > transcoder programmed
> > > 
> > > pipe1 stuff after transcoder
> > > 
> > > pipe0 stuff after transcoder
> > > 
> > > which is different from original sequence, because we in fact
> > > want that:
> > > program pipe1(slave)
> > > 
> > > program pipe0 stuff before transcoder(master)
> > > program transcoder
> > > program pipe0 stuff after transcoder(master)
> > > 
> > > So do you think that splitting won't harm or you see some other way to do that?
> > 
> > The current code is mostly nonsense I think. Probably only work
> > through the power of prayer. I think we need to be able to control
> > the per-pipe vs. per-transcoder steps more freely to make it actually
> > correct.
> 
> 
> Ville, could you communicate to me next time, if you decide to do everything
> yourself or you see it some other way.
> Basically I was trying to discuss how you see things here and then it just ends
> up that way. 
> If you didn't like the whole approach why I hear this only now, was following
> all your comments and asking questions.
> You could either communicate your ideas to me or at least communicate that you
> plan to send own series..
> Now we had a discussion, some particular things were discussed, then suddenly
> you say that everything is crap and send own series.
> 
> Is that really professional team work?
> 
> Stan
> 
> > 
> > I fired off a quick attempt at converting the disable side,
> > since that is a bit more straightforwad. The end result looks
> > fairly reasonable to me at least.
> > https://patchwork.freedesktop.org/series/130619/
> 
> Ville, could you communicate to me next time, if you decide to do everything

I didn't do everything. Just enough to demonstrate the direction
where I think we should go.

-- 
Ville Syrjälä
Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset
  2024-03-01 15:26               ` Ville Syrjälä
@ 2024-03-01 15:42                 ` Lisovskiy, Stanislav
  2024-03-01 15:58                   ` Ville Syrjälä
  0 siblings, 1 reply; 33+ messages in thread
From: Lisovskiy, Stanislav @ 2024-03-01 15:42 UTC (permalink / raw)
  To: Ville Syrjälä; +Cc: intel-gfx, jani.saarinen, vidya.srinivas

On Fri, Mar 01, 2024 at 05:26:19PM +0200, Ville Syrjälä wrote:
> On Fri, Mar 01, 2024 at 05:17:41PM +0200, Lisovskiy, Stanislav wrote:
> > On Fri, Mar 01, 2024 at 04:40:28PM +0200, Ville Syrjälä wrote:
> > > On Fri, Mar 01, 2024 at 02:29:28PM +0200, Lisovskiy, Stanislav wrote:
> > > > On Fri, Mar 01, 2024 at 12:43:46PM +0200, Ville Syrjälä wrote:
> > > > > On Fri, Mar 01, 2024 at 12:27:18PM +0200, Lisovskiy, Stanislav wrote:
> > > > > > On Fri, Mar 01, 2024 at 12:10:52PM +0200, Ville Syrjälä wrote:
> > > > > > > On Wed, Feb 21, 2024 at 09:20:09PM +0200, Stanislav Lisovskiy wrote:
> > > > > > > > Handle only bigjoiner masters in skl_commit_modeset_enables/disables,
> > > > > > > > slave crtcs should be handled by master hooks. Same for encoders.
> > > > > > > > That way we can also remove a bunch of checks like intel_crtc_is_bigjoiner_slave.
> > > > > > > > 
> > > > > > > > v2: Get rid of master vs slave checks and separation in crtc enable/disable hooks.
> > > > > > > >     Use unified iteration cycle for all of those, while enabling/disabling
> > > > > > > >     transcoder only for those pipes where its needed(Ville Syrjälä)
> > > > > > > > 
> > > > > > > > v3: Move all the intel_encoder_* calls under transcoder code path(Ville Syrjälä)
> > > > > > > > 
> > > > > > > > v4:  - Call intel_crtc_vblank_on from hsw_crtc_enable only for non-transcoder path
> > > > > > > >        (for master pipe that will be called from intel_encoders_enable/intel_enable_ddi)
> > > > > > > >      - Fix stupid mistake with using crtc->pipe for the mask, instead of BIT(crtc->pipe)
> > > > > > > > 
> > > > > > > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > > > > > > > ---
> > > > > > > >  drivers/gpu/drm/i915/display/intel_ddi.c     |  21 +--
> > > > > > > >  drivers/gpu/drm/i915/display/intel_display.c | 183 ++++++++++++-------
> > > > > > > >  drivers/gpu/drm/i915/display/intel_display.h |   6 +
> > > > > > > >  3 files changed, 121 insertions(+), 89 deletions(-)
> > > > > > > > 
> > > > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > > > > > index bea4415902044..6071e9f500871 100644
> > > > > > > > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > > > > > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > > > > > @@ -3100,7 +3100,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> > > > > > > >  				   const struct drm_connector_state *old_conn_state)
> > > > > > > >  {
> > > > > > > >  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> > > > > > > > -	struct intel_crtc *slave_crtc;
> > > > > > > >  
> > > > > > > >  	if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST)) {
> > > > > > > >  		intel_crtc_vblank_off(old_crtc_state);
> > > > > > > > @@ -3117,17 +3116,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> > > > > > > >  			ilk_pfit_disable(old_crtc_state);
> > > > > > > >  	}
> > > > > > > 
> > > > > > > The master pipe stuff is right here ^ ...
> > > > > > > 
> > > > > > > >  
> > > > > > > > -	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, slave_crtc,
> > > > > > > > -					 intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) {
> > > > > > > > -		const struct intel_crtc_state *old_slave_crtc_state =
> > > > > > > > -			intel_atomic_get_old_crtc_state(state, slave_crtc);
> > > > > > > > -
> > > > > > > > -		intel_crtc_vblank_off(old_slave_crtc_state);
> > > > > > > > -
> > > > > > > > -		intel_dsc_disable(old_slave_crtc_state);
> > > > > > > > -		skl_scaler_disable(old_slave_crtc_state);
> > > > > > > > -	}
> > > > > > > 
> > > > > > > .. but now you're moving the slave pipe stuff somewhere else?
> > > > > > > 
> > > > > > > We should be just iterating the pipes here (assuming this 
> > > > > > > is the correct spot to do these steps).
> > > > > > > 
> > > > > > > > -
> > > > > > > >  	/*
> > > > > > > >  	 * When called from DP MST code:
> > > > > > > >  	 * - old_conn_state will be NULL
> > > > > > > > @@ -3363,8 +3351,7 @@ static void intel_enable_ddi(struct intel_atomic_state *state,
> > > > > > > >  {
> > > > > > > >  	drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
> > > > > > > >  
> > > > > > > > -	if (!intel_crtc_is_bigjoiner_slave(crtc_state))
> > > > > > > > -		intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > > > > > > > +	intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > > > > > > >  
> > > > > > > >  	/* Enable/Disable DP2.0 SDP split config before transcoder */
> > > > > > > >  	intel_audio_sdp_split_update(crtc_state);
> > > > > > > > @@ -3469,9 +3456,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> > > > > > > >  				  struct intel_crtc *crtc)
> > > > > > > >  {
> > > > > > > >  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> > > > > > > > -	struct intel_crtc_state *crtc_state =
> > > > > > > > -		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > > > > -	struct intel_crtc *slave_crtc;
> > > > > > > >  	enum phy phy = intel_port_to_phy(i915, encoder->port);
> > > > > > > >  
> > > > > > > >  	/* FIXME: Add MTL pll_mgr */
> > > > > > > > @@ -3479,9 +3463,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> > > > > > > >  		return;
> > > > > > > >  
> > > > > > > >  	intel_update_active_dpll(state, crtc, encoder);
> > > > > > > > -	for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > > > > > > > -					 intel_crtc_bigjoiner_slave_pipes(crtc_state))
> > > > > > > > -		intel_update_active_dpll(state, slave_crtc, encoder);
> > > > > > > >  }
> > > > > > > >  
> > > > > > > >  static void
> > > > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> > > > > > > > index 916c13a149fd5..e1ea53fd6a288 100644
> > > > > > > > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > > > > > > > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > > > > > > > @@ -1631,31 +1631,12 @@ static void hsw_configure_cpu_transcoder(const struct intel_crtc_state *crtc_sta
> > > > > > > >  	hsw_set_transconf(crtc_state);
> > > > > > > >  }
> > > > > > > >  
> > > > > > > > -static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > > > > -			    struct intel_crtc *crtc)
> > > > > > > > +static void hsw_crtc_enable_pre_transcoder(struct intel_atomic_state *state,
> > > > > > > > +					   struct intel_crtc *crtc)
> > > > > > > >  {
> > > > > > > >  	const struct intel_crtc_state *new_crtc_state =
> > > > > > > >  		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > > > >  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > > > > > -	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > > > > > > > -	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > > > > > > -	bool psl_clkgate_wa;
> > > > > > > > -
> > > > > > > > -	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > > > > > > -		return;
> > > > > > > > -
> > > > > > > > -	intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > > > > > > -
> > > > > > > > -	if (!new_crtc_state->bigjoiner_pipes) {
> > > > > > > > -		intel_encoders_pre_pll_enable(state, crtc);
> > > > > > > > -
> > > > > > > > -		if (new_crtc_state->shared_dpll)
> > > > > > > > -			intel_enable_shared_dpll(new_crtc_state);
> > > > > > > > -
> > > > > > > > -		intel_encoders_pre_enable(state, crtc);
> > > > > > > > -	} else {
> > > > > > > > -		icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > > > > > > -	}
> > > > > > > >  
> > > > > > > >  	intel_dsc_enable(new_crtc_state);
> > > > > > > >  
> > > > > > > > @@ -1665,19 +1646,17 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > > > >  	intel_set_pipe_src_size(new_crtc_state);
> > > > > > > >  	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
> > > > > > > >  		bdw_set_pipe_misc(new_crtc_state);
> > > > > > > > +}
> > > > > > > >  
> > > > > > > > -	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&
> > > > > > > > -	    !transcoder_is_dsi(cpu_transcoder))
> > > > > > > > -		hsw_configure_cpu_transcoder(new_crtc_state);
> > > > > > > > +static void hsw_crtc_enable_post_transcoder(struct intel_atomic_state *state,
> > > > > > > > +					    struct intel_crtc *crtc)
> > > > > > > > +{
> > > > > > > > +	const struct intel_crtc_state *new_crtc_state =
> > > > > > > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > > > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > > > > >  
> > > > > > > >  	crtc->active = true;
> > > > > > > >  
> > > > > > > > -	/* Display WA #1180: WaDisableScalarClockGating: glk */
> > > > > > > > -	psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > > > > > > > -		new_crtc_state->pch_pfit.enabled;
> > > > > > > > -	if (psl_clkgate_wa)
> > > > > > > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> > > > > > > > -
> > > > > > > >  	if (DISPLAY_VER(dev_priv) >= 9)
> > > > > > > >  		skl_pfit_enable(new_crtc_state);
> > > > > > > >  	else
> > > > > > > > @@ -1700,27 +1679,84 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > > > >  		icl_set_pipe_chicken(new_crtc_state);
> > > > > > > >  
> > > > > > > >  	intel_initial_watermarks(state, crtc);
> > > > > > > > +}
> > > > > > > >  
> > > > > > > > -	if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > > > > > > > -		intel_crtc_vblank_on(new_crtc_state);
> > > > > > > > +static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > > > > +			    struct intel_crtc *crtc)
> > > > > > > > +{
> > > > > > > > +	const struct intel_crtc_state *new_crtc_state =
> > > > > > > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > > > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > > > > > +	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > > > > > > +	struct intel_crtc *_crtc;
> > > > > > > > +	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(new_crtc_state);
> > > > > > > > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > > > > > > > +	bool psl_clkgate_wa;
> > > > > > > > +	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > > > > > > >  
> > > > > > > > -	intel_encoders_enable(state, crtc);
> > > > > > > > +	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > > > > > > +		return;
> > > > > > > >  
> > > > > > > > -	if (psl_clkgate_wa) {
> > > > > > > > -		intel_crtc_wait_for_next_vblank(crtc);
> > > > > > > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> > > > > > > > -	}
> > > > > > > > +	/*
> > > > > > > > +	 * Use reverse iterator to go through slave pipes first.
> > > > > > > > +	 * TODO: We might need smarter iterator here
> > > > > > > > +	 */
> > > > > > > > +	for_each_intel_crtc_in_pipe_mask_reverse(&dev_priv->drm, _crtc,
> > > > > > > > +						 pipe_mask) {
> > > > > > > > +		const struct intel_crtc_state *_new_crtc_state =
> > > > > > > > +			intel_atomic_get_new_crtc_state(state, _crtc);
> > > > > > > > +		bool needs_transcoder = ((slave_pipe_mask & BIT(_crtc->pipe)) == 0) &&
> > > > > > > > +					!transcoder_is_dsi(cpu_transcoder);
> > > > > > > > +
> > > > > > > > +		intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > > > > > > +
> > > > > > > > +		if (!new_crtc_state->bigjoiner_pipes) {
> > > > > > > > +			if (needs_transcoder)
> > > > > > > > +				intel_encoders_pre_pll_enable(state, crtc);
> > > > > > > > +
> > > > > > > > +			if (new_crtc_state->shared_dpll)
> > > > > > > > +				intel_enable_shared_dpll(new_crtc_state);
> > > > > > > > +
> > > > > > > > +			if (needs_transcoder)
> > > > > > > > +				intel_encoders_pre_enable(state, crtc);
> > > > > > > > +		} else {
> > > > > > > > +			icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > > > > > > +		}
> > > > > > > 
> > > > > > > That mess needs to be eliminated entirely.
> > > > > > 
> > > > > > Yeah, was thinking about this too, was just a bit unsure how..
> > > > > > 
> > > > > > > 
> > > > > > > > +
> > > > > > > > +		hsw_crtc_enable_pre_transcoder(state, _crtc);
> > > > > > > > +
> > > > > > > > +		if (needs_transcoder)
> > > > > > > > +			hsw_configure_cpu_transcoder(_new_crtc_state);
> > > > > > > 
> > > > > > > These transcoder things should not be within any pipe loop at all.
> > > > > > 
> > > > > > I didn't want to split the loop, which I would have to do otherwise,
> > > > > > but may be it makes sense, since transcoder path is needed only for master
> > > > > > pipe. However what if _hypothetically_ :) we would have more than one master
> > > > > > pipe?
> > > > > 
> > > > > Doesn't matter how many pipes there are. There is always just one
> > > > > transcoder.
> > > > 
> > > > How I see it now, the sequence for example for master hsw_crtc_enable is:
> > > > 
> > > > pipe1 stuff before transcoder
> > > > (transcoder programming not needed)
> > > > pipe1 stuff after transcoder
> > > > 
> > > > pipe0 stuff before transcoder
> > > > transcoder programmed
> > > > pipe0 stuff after transcoder
> > > > 
> > > > if we want to have a single unified loop for all pipes, I guess we have to
> > > > have a transcoder check inside a loop, because we cant do the 
> > > > "pipe0 stuff after transcoder" thing, before the transcoder is programmed.
> > > > 
> > > > I could of course split it this way:
> > > > 
> > > > for (...)
> > > >   pipe stuff before transcoder
> > > > 
> > > > transcoder programmed
> > > > 
> > > > for (...)
> > > >   pipe stuff after transcoder
> > > > 
> > > > but then the sequence still will be different from original, it will look like:
> > > > pipe1 stuff before transcoder
> > > > 
> > > > pipe0 stuff before transcoder
> > > > 
> > > > transcoder programmed
> > > > 
> > > > pipe1 stuff after transcoder
> > > > 
> > > > pipe0 stuff after transcoder
> > > > 
> > > > which is different from original sequence, because we in fact
> > > > want that:
> > > > program pipe1(slave)
> > > > 
> > > > program pipe0 stuff before transcoder(master)
> > > > program transcoder
> > > > program pipe0 stuff after transcoder(master)
> > > > 
> > > > So do you think that splitting won't harm or you see some other way to do that?
> > > 
> > > The current code is mostly nonsense I think. Probably only work
> > > through the power of prayer. I think we need to be able to control
> > > the per-pipe vs. per-transcoder steps more freely to make it actually
> > > correct.
> > 
> > 
> > Ville, could you communicate to me next time, if you decide to do everything
> > yourself or you see it some other way.
> > Basically I was trying to discuss how you see things here and then it just ends
> > up that way. 
> > If you didn't like the whole approach why I hear this only now, was following
> > all your comments and asking questions.
> > You could either communicate your ideas to me or at least communicate that you
> > plan to send own series..
> > Now we had a discussion, some particular things were discussed, then suddenly
> > you say that everything is crap and send own series.
> > 
> > Is that really professional team work?
> > 
> > Stan
> > 
> > > 
> > > I fired off a quick attempt at converting the disable side,
> > > since that is a bit more straightforwad. The end result looks
> > > fairly reasonable to me at least.
> > > https://patchwork.freedesktop.org/series/130619/
> > 
> > Ville, could you communicate to me next time, if you decide to do everything
> 
> I didn't do everything. Just enough to demonstrate the direction
> where I think we should go.

Okay. What I should do now? Am I supposed to to do the enable side or just review your
changes? Could you please communicate clearly, what is our plan here.

> 
> -- 
> Ville Syrjälä
> Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset
  2024-03-01 15:42                 ` Lisovskiy, Stanislav
@ 2024-03-01 15:58                   ` Ville Syrjälä
  0 siblings, 0 replies; 33+ messages in thread
From: Ville Syrjälä @ 2024-03-01 15:58 UTC (permalink / raw)
  To: Lisovskiy, Stanislav; +Cc: intel-gfx, jani.saarinen, vidya.srinivas

On Fri, Mar 01, 2024 at 05:42:59PM +0200, Lisovskiy, Stanislav wrote:
> On Fri, Mar 01, 2024 at 05:26:19PM +0200, Ville Syrjälä wrote:
> > On Fri, Mar 01, 2024 at 05:17:41PM +0200, Lisovskiy, Stanislav wrote:
> > > On Fri, Mar 01, 2024 at 04:40:28PM +0200, Ville Syrjälä wrote:
> > > > On Fri, Mar 01, 2024 at 02:29:28PM +0200, Lisovskiy, Stanislav wrote:
> > > > > On Fri, Mar 01, 2024 at 12:43:46PM +0200, Ville Syrjälä wrote:
> > > > > > On Fri, Mar 01, 2024 at 12:27:18PM +0200, Lisovskiy, Stanislav wrote:
> > > > > > > On Fri, Mar 01, 2024 at 12:10:52PM +0200, Ville Syrjälä wrote:
> > > > > > > > On Wed, Feb 21, 2024 at 09:20:09PM +0200, Stanislav Lisovskiy wrote:
> > > > > > > > > Handle only bigjoiner masters in skl_commit_modeset_enables/disables,
> > > > > > > > > slave crtcs should be handled by master hooks. Same for encoders.
> > > > > > > > > That way we can also remove a bunch of checks like intel_crtc_is_bigjoiner_slave.
> > > > > > > > > 
> > > > > > > > > v2: Get rid of master vs slave checks and separation in crtc enable/disable hooks.
> > > > > > > > >     Use unified iteration cycle for all of those, while enabling/disabling
> > > > > > > > >     transcoder only for those pipes where its needed(Ville Syrjälä)
> > > > > > > > > 
> > > > > > > > > v3: Move all the intel_encoder_* calls under transcoder code path(Ville Syrjälä)
> > > > > > > > > 
> > > > > > > > > v4:  - Call intel_crtc_vblank_on from hsw_crtc_enable only for non-transcoder path
> > > > > > > > >        (for master pipe that will be called from intel_encoders_enable/intel_enable_ddi)
> > > > > > > > >      - Fix stupid mistake with using crtc->pipe for the mask, instead of BIT(crtc->pipe)
> > > > > > > > > 
> > > > > > > > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> > > > > > > > > ---
> > > > > > > > >  drivers/gpu/drm/i915/display/intel_ddi.c     |  21 +--
> > > > > > > > >  drivers/gpu/drm/i915/display/intel_display.c | 183 ++++++++++++-------
> > > > > > > > >  drivers/gpu/drm/i915/display/intel_display.h |   6 +
> > > > > > > > >  3 files changed, 121 insertions(+), 89 deletions(-)
> > > > > > > > > 
> > > > > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > > > > > > index bea4415902044..6071e9f500871 100644
> > > > > > > > > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > > > > > > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > > > > > > > > @@ -3100,7 +3100,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> > > > > > > > >  				   const struct drm_connector_state *old_conn_state)
> > > > > > > > >  {
> > > > > > > > >  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> > > > > > > > > -	struct intel_crtc *slave_crtc;
> > > > > > > > >  
> > > > > > > > >  	if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST)) {
> > > > > > > > >  		intel_crtc_vblank_off(old_crtc_state);
> > > > > > > > > @@ -3117,17 +3116,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
> > > > > > > > >  			ilk_pfit_disable(old_crtc_state);
> > > > > > > > >  	}
> > > > > > > > 
> > > > > > > > The master pipe stuff is right here ^ ...
> > > > > > > > 
> > > > > > > > >  
> > > > > > > > > -	for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, slave_crtc,
> > > > > > > > > -					 intel_crtc_bigjoiner_slave_pipes(old_crtc_state)) {
> > > > > > > > > -		const struct intel_crtc_state *old_slave_crtc_state =
> > > > > > > > > -			intel_atomic_get_old_crtc_state(state, slave_crtc);
> > > > > > > > > -
> > > > > > > > > -		intel_crtc_vblank_off(old_slave_crtc_state);
> > > > > > > > > -
> > > > > > > > > -		intel_dsc_disable(old_slave_crtc_state);
> > > > > > > > > -		skl_scaler_disable(old_slave_crtc_state);
> > > > > > > > > -	}
> > > > > > > > 
> > > > > > > > .. but now you're moving the slave pipe stuff somewhere else?
> > > > > > > > 
> > > > > > > > We should be just iterating the pipes here (assuming this 
> > > > > > > > is the correct spot to do these steps).
> > > > > > > > 
> > > > > > > > > -
> > > > > > > > >  	/*
> > > > > > > > >  	 * When called from DP MST code:
> > > > > > > > >  	 * - old_conn_state will be NULL
> > > > > > > > > @@ -3363,8 +3351,7 @@ static void intel_enable_ddi(struct intel_atomic_state *state,
> > > > > > > > >  {
> > > > > > > > >  	drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
> > > > > > > > >  
> > > > > > > > > -	if (!intel_crtc_is_bigjoiner_slave(crtc_state))
> > > > > > > > > -		intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > > > > > > > > +	intel_ddi_enable_transcoder_func(encoder, crtc_state);
> > > > > > > > >  
> > > > > > > > >  	/* Enable/Disable DP2.0 SDP split config before transcoder */
> > > > > > > > >  	intel_audio_sdp_split_update(crtc_state);
> > > > > > > > > @@ -3469,9 +3456,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> > > > > > > > >  				  struct intel_crtc *crtc)
> > > > > > > > >  {
> > > > > > > > >  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> > > > > > > > > -	struct intel_crtc_state *crtc_state =
> > > > > > > > > -		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > > > > > -	struct intel_crtc *slave_crtc;
> > > > > > > > >  	enum phy phy = intel_port_to_phy(i915, encoder->port);
> > > > > > > > >  
> > > > > > > > >  	/* FIXME: Add MTL pll_mgr */
> > > > > > > > > @@ -3479,9 +3463,6 @@ void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> > > > > > > > >  		return;
> > > > > > > > >  
> > > > > > > > >  	intel_update_active_dpll(state, crtc, encoder);
> > > > > > > > > -	for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> > > > > > > > > -					 intel_crtc_bigjoiner_slave_pipes(crtc_state))
> > > > > > > > > -		intel_update_active_dpll(state, slave_crtc, encoder);
> > > > > > > > >  }
> > > > > > > > >  
> > > > > > > > >  static void
> > > > > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> > > > > > > > > index 916c13a149fd5..e1ea53fd6a288 100644
> > > > > > > > > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > > > > > > > > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > > > > > > > > @@ -1631,31 +1631,12 @@ static void hsw_configure_cpu_transcoder(const struct intel_crtc_state *crtc_sta
> > > > > > > > >  	hsw_set_transconf(crtc_state);
> > > > > > > > >  }
> > > > > > > > >  
> > > > > > > > > -static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > > > > > -			    struct intel_crtc *crtc)
> > > > > > > > > +static void hsw_crtc_enable_pre_transcoder(struct intel_atomic_state *state,
> > > > > > > > > +					   struct intel_crtc *crtc)
> > > > > > > > >  {
> > > > > > > > >  	const struct intel_crtc_state *new_crtc_state =
> > > > > > > > >  		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > > > > >  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > > > > > > -	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > > > > > > > > -	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > > > > > > > -	bool psl_clkgate_wa;
> > > > > > > > > -
> > > > > > > > > -	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > > > > > > > -		return;
> > > > > > > > > -
> > > > > > > > > -	intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > > > > > > > -
> > > > > > > > > -	if (!new_crtc_state->bigjoiner_pipes) {
> > > > > > > > > -		intel_encoders_pre_pll_enable(state, crtc);
> > > > > > > > > -
> > > > > > > > > -		if (new_crtc_state->shared_dpll)
> > > > > > > > > -			intel_enable_shared_dpll(new_crtc_state);
> > > > > > > > > -
> > > > > > > > > -		intel_encoders_pre_enable(state, crtc);
> > > > > > > > > -	} else {
> > > > > > > > > -		icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > > > > > > > -	}
> > > > > > > > >  
> > > > > > > > >  	intel_dsc_enable(new_crtc_state);
> > > > > > > > >  
> > > > > > > > > @@ -1665,19 +1646,17 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > > > > >  	intel_set_pipe_src_size(new_crtc_state);
> > > > > > > > >  	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
> > > > > > > > >  		bdw_set_pipe_misc(new_crtc_state);
> > > > > > > > > +}
> > > > > > > > >  
> > > > > > > > > -	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&
> > > > > > > > > -	    !transcoder_is_dsi(cpu_transcoder))
> > > > > > > > > -		hsw_configure_cpu_transcoder(new_crtc_state);
> > > > > > > > > +static void hsw_crtc_enable_post_transcoder(struct intel_atomic_state *state,
> > > > > > > > > +					    struct intel_crtc *crtc)
> > > > > > > > > +{
> > > > > > > > > +	const struct intel_crtc_state *new_crtc_state =
> > > > > > > > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > > > > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > > > > > >  
> > > > > > > > >  	crtc->active = true;
> > > > > > > > >  
> > > > > > > > > -	/* Display WA #1180: WaDisableScalarClockGating: glk */
> > > > > > > > > -	psl_clkgate_wa = DISPLAY_VER(dev_priv) == 10 &&
> > > > > > > > > -		new_crtc_state->pch_pfit.enabled;
> > > > > > > > > -	if (psl_clkgate_wa)
> > > > > > > > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
> > > > > > > > > -
> > > > > > > > >  	if (DISPLAY_VER(dev_priv) >= 9)
> > > > > > > > >  		skl_pfit_enable(new_crtc_state);
> > > > > > > > >  	else
> > > > > > > > > @@ -1700,27 +1679,84 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > > > > >  		icl_set_pipe_chicken(new_crtc_state);
> > > > > > > > >  
> > > > > > > > >  	intel_initial_watermarks(state, crtc);
> > > > > > > > > +}
> > > > > > > > >  
> > > > > > > > > -	if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
> > > > > > > > > -		intel_crtc_vblank_on(new_crtc_state);
> > > > > > > > > +static void hsw_crtc_enable(struct intel_atomic_state *state,
> > > > > > > > > +			    struct intel_crtc *crtc)
> > > > > > > > > +{
> > > > > > > > > +	const struct intel_crtc_state *new_crtc_state =
> > > > > > > > > +		intel_atomic_get_new_crtc_state(state, crtc);
> > > > > > > > > +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> > > > > > > > > +	enum transcoder cpu_transcoder = new_crtc_state->cpu_transcoder;
> > > > > > > > > +	struct intel_crtc *_crtc;
> > > > > > > > > +	int slave_pipe_mask = intel_crtc_bigjoiner_slave_pipes(new_crtc_state);
> > > > > > > > > +	int pipe_mask = slave_pipe_mask | BIT(crtc->pipe);
> > > > > > > > > +	bool psl_clkgate_wa;
> > > > > > > > > +	enum pipe pipe = crtc->pipe, hsw_workaround_pipe;
> > > > > > > > >  
> > > > > > > > > -	intel_encoders_enable(state, crtc);
> > > > > > > > > +	if (drm_WARN_ON(&dev_priv->drm, crtc->active))
> > > > > > > > > +		return;
> > > > > > > > >  
> > > > > > > > > -	if (psl_clkgate_wa) {
> > > > > > > > > -		intel_crtc_wait_for_next_vblank(crtc);
> > > > > > > > > -		glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, false);
> > > > > > > > > -	}
> > > > > > > > > +	/*
> > > > > > > > > +	 * Use reverse iterator to go through slave pipes first.
> > > > > > > > > +	 * TODO: We might need smarter iterator here
> > > > > > > > > +	 */
> > > > > > > > > +	for_each_intel_crtc_in_pipe_mask_reverse(&dev_priv->drm, _crtc,
> > > > > > > > > +						 pipe_mask) {
> > > > > > > > > +		const struct intel_crtc_state *_new_crtc_state =
> > > > > > > > > +			intel_atomic_get_new_crtc_state(state, _crtc);
> > > > > > > > > +		bool needs_transcoder = ((slave_pipe_mask & BIT(_crtc->pipe)) == 0) &&
> > > > > > > > > +					!transcoder_is_dsi(cpu_transcoder);
> > > > > > > > > +
> > > > > > > > > +		intel_dmc_enable_pipe(dev_priv, crtc->pipe);
> > > > > > > > > +
> > > > > > > > > +		if (!new_crtc_state->bigjoiner_pipes) {
> > > > > > > > > +			if (needs_transcoder)
> > > > > > > > > +				intel_encoders_pre_pll_enable(state, crtc);
> > > > > > > > > +
> > > > > > > > > +			if (new_crtc_state->shared_dpll)
> > > > > > > > > +				intel_enable_shared_dpll(new_crtc_state);
> > > > > > > > > +
> > > > > > > > > +			if (needs_transcoder)
> > > > > > > > > +				intel_encoders_pre_enable(state, crtc);
> > > > > > > > > +		} else {
> > > > > > > > > +			icl_ddi_bigjoiner_pre_enable(state, new_crtc_state);
> > > > > > > > > +		}
> > > > > > > > 
> > > > > > > > That mess needs to be eliminated entirely.
> > > > > > > 
> > > > > > > Yeah, was thinking about this too, was just a bit unsure how..
> > > > > > > 
> > > > > > > > 
> > > > > > > > > +
> > > > > > > > > +		hsw_crtc_enable_pre_transcoder(state, _crtc);
> > > > > > > > > +
> > > > > > > > > +		if (needs_transcoder)
> > > > > > > > > +			hsw_configure_cpu_transcoder(_new_crtc_state);
> > > > > > > > 
> > > > > > > > These transcoder things should not be within any pipe loop at all.
> > > > > > > 
> > > > > > > I didn't want to split the loop, which I would have to do otherwise,
> > > > > > > but may be it makes sense, since transcoder path is needed only for master
> > > > > > > pipe. However what if _hypothetically_ :) we would have more than one master
> > > > > > > pipe?
> > > > > > 
> > > > > > Doesn't matter how many pipes there are. There is always just one
> > > > > > transcoder.
> > > > > 
> > > > > How I see it now, the sequence for example for master hsw_crtc_enable is:
> > > > > 
> > > > > pipe1 stuff before transcoder
> > > > > (transcoder programming not needed)
> > > > > pipe1 stuff after transcoder
> > > > > 
> > > > > pipe0 stuff before transcoder
> > > > > transcoder programmed
> > > > > pipe0 stuff after transcoder
> > > > > 
> > > > > if we want to have a single unified loop for all pipes, I guess we have to
> > > > > have a transcoder check inside a loop, because we cant do the 
> > > > > "pipe0 stuff after transcoder" thing, before the transcoder is programmed.
> > > > > 
> > > > > I could of course split it this way:
> > > > > 
> > > > > for (...)
> > > > >   pipe stuff before transcoder
> > > > > 
> > > > > transcoder programmed
> > > > > 
> > > > > for (...)
> > > > >   pipe stuff after transcoder
> > > > > 
> > > > > but then the sequence still will be different from original, it will look like:
> > > > > pipe1 stuff before transcoder
> > > > > 
> > > > > pipe0 stuff before transcoder
> > > > > 
> > > > > transcoder programmed
> > > > > 
> > > > > pipe1 stuff after transcoder
> > > > > 
> > > > > pipe0 stuff after transcoder
> > > > > 
> > > > > which is different from original sequence, because we in fact
> > > > > want that:
> > > > > program pipe1(slave)
> > > > > 
> > > > > program pipe0 stuff before transcoder(master)
> > > > > program transcoder
> > > > > program pipe0 stuff after transcoder(master)
> > > > > 
> > > > > So do you think that splitting won't harm or you see some other way to do that?
> > > > 
> > > > The current code is mostly nonsense I think. Probably only work
> > > > through the power of prayer. I think we need to be able to control
> > > > the per-pipe vs. per-transcoder steps more freely to make it actually
> > > > correct.
> > > 
> > > 
> > > Ville, could you communicate to me next time, if you decide to do everything
> > > yourself or you see it some other way.
> > > Basically I was trying to discuss how you see things here and then it just ends
> > > up that way. 
> > > If you didn't like the whole approach why I hear this only now, was following
> > > all your comments and asking questions.
> > > You could either communicate your ideas to me or at least communicate that you
> > > plan to send own series..
> > > Now we had a discussion, some particular things were discussed, then suddenly
> > > you say that everything is crap and send own series.
> > > 
> > > Is that really professional team work?
> > > 
> > > Stan
> > > 
> > > > 
> > > > I fired off a quick attempt at converting the disable side,
> > > > since that is a bit more straightforwad. The end result looks
> > > > fairly reasonable to me at least.
> > > > https://patchwork.freedesktop.org/series/130619/
> > > 
> > > Ville, could you communicate to me next time, if you decide to do everything
> > 
> > I didn't do everything. Just enough to demonstrate the direction
> > where I think we should go.
> 
> Okay. What I should do now? Am I supposed to to do the enable side or just review your
> changes? Could you please communicate clearly, what is our plan here.

We need the enable side done, and then we need to look
at the MST support. + whatever else needs done.

As far as my series goes, I think most of it should probably
be in a state that could be reviewed. I'm definitely still not
fully sold on that first rename patch, but couldn't immediately
come up with a good alternative.

Also I have no idea my stuff even works. All I can say is
that it compiles. So we really need to get the CI side
properly sorted to have any confidence in any of this.

-- 
Ville Syrjälä
Intel

^ permalink raw reply	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2024-03-01 15:58 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-21 19:20 [PATCH 0/3] Bigjoiner refactoring Stanislav Lisovskiy
2024-02-21 19:20 ` [PATCH 1/3] drm/i915/bigjoiner: Refactor bigjoiner state readout Stanislav Lisovskiy
2024-03-01 10:10   ` Ville Syrjälä
2024-03-01 10:22     ` Lisovskiy, Stanislav
2024-02-21 19:20 ` [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset Stanislav Lisovskiy
2024-02-27  4:40   ` Srinivas, Vidya
2024-02-27  4:52     ` Srinivas, Vidya
2024-02-27  9:11     ` Lisovskiy, Stanislav
2024-02-27 16:16       ` Srinivas, Vidya
2024-03-01 10:10   ` Ville Syrjälä
2024-03-01 10:27     ` Lisovskiy, Stanislav
2024-03-01 10:43       ` Ville Syrjälä
2024-03-01 12:29         ` Lisovskiy, Stanislav
2024-03-01 14:40           ` Ville Syrjälä
2024-03-01 15:17             ` Lisovskiy, Stanislav
2024-03-01 15:26               ` Ville Syrjälä
2024-03-01 15:42                 ` Lisovskiy, Stanislav
2024-03-01 15:58                   ` Ville Syrjälä
2024-02-21 19:20 ` [PATCH 3/3] drm/i915: Fix bigjoiner case for DP2.0 Stanislav Lisovskiy
2024-02-21 22:35   ` Manasi Navare
2024-02-26 19:56   ` Jani Nikula
2024-02-27  9:04     ` Lisovskiy, Stanislav
2024-02-27  9:06       ` Srinivas, Vidya
2024-02-27  9:14         ` Lisovskiy, Stanislav
2024-02-27 18:51           ` Srinivas, Vidya
2024-02-27  9:15       ` Jani Nikula
2024-02-27 18:07         ` Manasi Navare
2024-02-27 18:48           ` Srinivas, Vidya
2024-02-21 23:18 ` ✗ Fi.CI.CHECKPATCH: warning for Bigjoiner refactoring (rev8) Patchwork
2024-02-21 23:18 ` ✗ Fi.CI.SPARSE: " Patchwork
2024-02-21 23:32 ` ✓ Fi.CI.BAT: success " Patchwork
2024-02-22  6:32 ` ✗ Fi.CI.IGT: failure " Patchwork
  -- strict thread matches above, loose matches on Subject: below --
2024-02-20 22:09 [PATCH 0/3] Bigjoiner refactoring Stanislav Lisovskiy
2024-02-20 22:09 ` [PATCH 2/3] Start separating pipe vs transcoder set logic for bigjoiner during modeset Stanislav Lisovskiy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox