All of lore.kernel.org
 help / color / mirror / Atom feed
* [Intel-gfx] [PATCH v2 1/3] drm/i915/display: Allow DRRS to be enabled during driver load
@ 2022-05-02 20:41 José Roberto de Souza
  2022-05-02 20:41 ` [Intel-gfx] [PATCH v2 2/3] drm/i915/display/dp: Try to fallback to previous link config if modeset is not allowed José Roberto de Souza
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: José Roberto de Souza @ 2022-05-02 20:41 UTC (permalink / raw)
  To: intel-gfx

When driver takes over display from firmware it does some checks and
if possible it tries to avoid a modeset to improve user boot
experience.

But even if DRRS is supported it was being left disabled as
intel_crtc_copy_fastset() was overwritten new state with the old one
(hardware readout).

So here checking if platform has only one set of m_n registers that
can change on the fly between high and low clock, if yes we can keep
DRRS enabled.

Cc: Vidya Srinivas <vidya.srinivas@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display.c |  7 ++++--
 drivers/gpu/drm/i915/display/intel_drrs.c    | 24 ++++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_drrs.h    |  2 ++
 3 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 0decf3d242372..17d0cad9e1686 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -7086,8 +7086,11 @@ static void intel_crtc_copy_fastset(const struct intel_crtc_state *old_crtc_stat
 	 */
 	new_crtc_state->fdi_m_n = old_crtc_state->fdi_m_n;
 	new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
-	new_crtc_state->dp_m2_n2 = old_crtc_state->dp_m2_n2;
-	new_crtc_state->has_drrs = old_crtc_state->has_drrs;
+
+	if (!intel_drrs_crtc_copy_fastset(old_crtc_state, new_crtc_state)) {
+		new_crtc_state->dp_m2_n2 = old_crtc_state->dp_m2_n2;
+		new_crtc_state->has_drrs = old_crtc_state->has_drrs;
+	}
 }
 
 static int intel_crtc_add_planes_to_state(struct intel_atomic_state *state,
diff --git a/drivers/gpu/drm/i915/display/intel_drrs.c b/drivers/gpu/drm/i915/display/intel_drrs.c
index 166caf293f7bc..d266fad83a086 100644
--- a/drivers/gpu/drm/i915/display/intel_drrs.c
+++ b/drivers/gpu/drm/i915/display/intel_drrs.c
@@ -300,3 +300,27 @@ void intel_crtc_drrs_init(struct intel_crtc *crtc)
 	mutex_init(&crtc->drrs.mutex);
 	crtc->drrs.cpu_transcoder = INVALID_TRANSCODER;
 }
+
+/**
+ * intel_drrs_crtc_copy_fastset - Handles crtc state copy during fastsets when
+ * new state has DRRS.
+ * @old_crtc_state: old crtc state
+ * @new_crtc_state: new crtc state
+ *
+ * Handle crtc state copy during fastsets trying to keep DRRS enabled.
+ * That can be done in platforms that supports change the dp_m_n register on
+ * the fly between high and low clocks.
+ *
+ * Returns true if crtc copy was already handled otherwise returns false.
+ */
+bool intel_drrs_crtc_copy_fastset(const struct intel_crtc_state *old_crtc_state,
+				  struct intel_crtc_state *new_crtc_state)
+{
+	struct drm_i915_private *i915 = to_i915(old_crtc_state->uapi.crtc->dev);
+
+	/* m2_n2 register needs to already be set */
+	if (intel_cpu_transcoder_has_m2_n2(i915, new_crtc_state->cpu_transcoder))
+		return false;
+
+	return true;
+}
diff --git a/drivers/gpu/drm/i915/display/intel_drrs.h b/drivers/gpu/drm/i915/display/intel_drrs.h
index 3ad1be1ad9c13..749ac717db063 100644
--- a/drivers/gpu/drm/i915/display/intel_drrs.h
+++ b/drivers/gpu/drm/i915/display/intel_drrs.h
@@ -24,5 +24,7 @@ void intel_drrs_invalidate(struct drm_i915_private *dev_priv,
 void intel_drrs_flush(struct drm_i915_private *dev_priv,
 		      unsigned int frontbuffer_bits);
 void intel_crtc_drrs_init(struct intel_crtc *crtc);
+bool intel_drrs_crtc_copy_fastset(const struct intel_crtc_state *old_crtc_state,
+				  struct intel_crtc_state *new_crtc_state);
 
 #endif /* __INTEL_DRRS_H__ */
-- 
2.36.0


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

* [Intel-gfx] [PATCH v2 2/3] drm/i915/display/dp: Try to fallback to previous link config if modeset is not allowed
  2022-05-02 20:41 [Intel-gfx] [PATCH v2 1/3] drm/i915/display: Allow DRRS to be enabled during driver load José Roberto de Souza
@ 2022-05-02 20:41 ` José Roberto de Souza
  2022-05-02 20:41 ` [Intel-gfx] [PATCH v2 3/3] drm/i915/display: Implement seamless mode switch José Roberto de Souza
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 10+ messages in thread
From: José Roberto de Souza @ 2022-05-02 20:41 UTC (permalink / raw)
  To: intel-gfx

When an atomic commit has changes that allows it to go to a lower DP
link configuration it will require a modeset but userspace might not
want it, so it would not set the modeset allowed flag causing
commit to fail.

Here in such case it tries to keep previous and trained link
configuration for the new state.

Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c | 86 ++++++++++++++++++++++++-
 1 file changed, 85 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index e4a79c11fd255..cc9be82e128f4 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1596,6 +1596,16 @@ intel_dp_compute_link_config(struct intel_encoder *encoder,
 			return ret;
 	}
 
+	return 0;
+}
+
+static void
+intel_dp_print_link_config(struct intel_crtc_state *pipe_config)
+{
+	struct drm_i915_private *i915 = to_i915(pipe_config->uapi.crtc->dev);
+	const struct drm_display_mode *adjusted_mode =
+			&pipe_config->hw.adjusted_mode;
+
 	if (pipe_config->dsc.compression_enable) {
 		drm_dbg_kms(&i915->drm,
 			    "DP lane count %d clock %d Input bpp %d Compressed bpp %d\n",
@@ -1621,7 +1631,6 @@ intel_dp_compute_link_config(struct intel_encoder *encoder,
 			    intel_dp_max_data_rate(pipe_config->port_clock,
 						   pipe_config->lane_count));
 	}
-	return 0;
 }
 
 bool intel_dp_limited_color_range(const struct intel_crtc_state *crtc_state,
@@ -1915,6 +1924,72 @@ static bool intel_dp_has_audio(struct intel_encoder *encoder,
 		return intel_conn_state->force_audio == HDMI_AUDIO_ON;
 }
 
+/*
+ * If modeset is not allowed it checks for link computed state and if different
+ * it checks if is possible to fallback to previous configuration.
+ *
+ * Returns 0 if modeset is allowed, link computed states matches or fallback is
+ * possible otherwise returns a errno.
+ */
+static int
+intel_dp_compute_link_config_no_modeset_fallback(struct intel_crtc_state *crtc_state)
+{
+	struct intel_atomic_state *state = to_intel_atomic_state(crtc_state->uapi.state);
+	struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
+	const struct intel_crtc_state *old_crtc_state;
+	int output_bpp, mode_rate, old_link_avail;
+	struct intel_crtc *crtc;
+
+	if (state->base.allow_modeset)
+		return 0;
+
+	crtc = to_intel_crtc(crtc_state->uapi.crtc);
+	old_crtc_state = intel_atomic_get_old_crtc_state(state, crtc);
+
+	/* Check if both states matches */
+	if (crtc_state->output_format == old_crtc_state->output_format &&
+	    crtc_state->port_clock == old_crtc_state->port_clock &&
+	    crtc_state->lane_count == old_crtc_state->lane_count &&
+	    crtc_state->pipe_bpp == old_crtc_state->pipe_bpp &&
+	    crtc_state->dsc.compression_enable == old_crtc_state->dsc.compression_enable &&
+	    crtc_state->dsc.compressed_bpp == old_crtc_state->dsc.compressed_bpp &&
+	    crtc_state->dsc.slice_count == old_crtc_state->dsc.slice_count &&
+	    crtc_state->bigjoiner_pipes == old_crtc_state->bigjoiner_pipes)
+		return 0;
+
+	/*
+	 * Modeset will be required if any of this changed, there is no way
+	 * around it
+	 */
+	if (crtc_state->output_format != old_crtc_state->output_format ||
+	    crtc_state->bigjoiner_pipes != old_crtc_state->bigjoiner_pipes ||
+	    crtc_state->dsc.compression_enable != old_crtc_state->dsc.compression_enable)
+		return -EINVAL;
+
+	/* TODO: Not supporting DSC fallback but it might be possible */
+	if (crtc_state->dsc.compression_enable)
+		return -EINVAL;
+
+	output_bpp = intel_dp_output_bpp(crtc_state->output_format,
+					 old_crtc_state->pipe_bpp);
+	mode_rate = intel_dp_link_required(adjusted_mode->crtc_clock,
+					   output_bpp);
+
+	old_link_avail = intel_dp_max_data_rate(old_crtc_state->port_clock,
+						old_crtc_state->lane_count);
+
+	/* Check if old link configuration has enough bandwidth for new mode */
+	if (mode_rate > old_link_avail)
+		return -EINVAL;
+
+	/* Fallback is possible */
+	crtc_state->lane_count = old_crtc_state->lane_count;
+	crtc_state->pipe_bpp = old_crtc_state->pipe_bpp;
+	crtc_state->port_clock = old_crtc_state->port_clock;
+
+	return 0;
+}
+
 static int
 intel_dp_compute_output_format(struct intel_encoder *encoder,
 			       struct intel_crtc_state *crtc_state,
@@ -1950,8 +2025,17 @@ intel_dp_compute_output_format(struct intel_encoder *encoder,
 		crtc_state->output_format = intel_dp_output_format(connector, true);
 		ret = intel_dp_compute_link_config(encoder, crtc_state, conn_state,
 						   respect_downstream_limits);
+		if (ret)
+			return ret;
 	}
 
+	ret = intel_dp_compute_link_config_no_modeset_fallback(crtc_state);
+	if (ret)
+		drm_dbg_kms(&i915->drm, "DP link configuration requires "
+			    "changes but modeset is not allowed\n");
+
+	intel_dp_print_link_config(crtc_state);
+
 	return ret;
 }
 
-- 
2.36.0


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

* [Intel-gfx] [PATCH v2 3/3] drm/i915/display: Implement seamless mode switch
  2022-05-02 20:41 [Intel-gfx] [PATCH v2 1/3] drm/i915/display: Allow DRRS to be enabled during driver load José Roberto de Souza
  2022-05-02 20:41 ` [Intel-gfx] [PATCH v2 2/3] drm/i915/display/dp: Try to fallback to previous link config if modeset is not allowed José Roberto de Souza
@ 2022-05-02 20:41 ` José Roberto de Souza
  2022-05-09 15:13   ` Srinivas, Vidya
  2022-05-02 21:26 ` [Intel-gfx] ✓ Fi.CI.BAT: success for series starting with [v2,1/3] drm/i915/display: Allow DRRS to be enabled during driver load Patchwork
  2022-05-03  2:41 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
  3 siblings, 1 reply; 10+ messages in thread
From: José Roberto de Souza @ 2022-05-02 20:41 UTC (permalink / raw)
  To: intel-gfx; +Cc: Sean Paul

So far the i915's DRRS feature was automatically changing between
preferred panel mode and downclock mode based on idleness but ChromeOS
compositor team is asking to be in control of the mode switch.
So for certain types of content it can switch to a mode with a lower
refresh rate without the user noticing a thing and saving more power.

This seamless mode switch will be triggered when user-space dispatches
an atomic commit with the new mode and clears the
DRM_MODE_ATOMIC_ALLOW_MODESET flag.

The main steps to acomplish that are:

- as mode changed in atomic state drm_atomic_helper_check_modeset()
will set mode_changed and it will trigger the crtc state computation
so intel_dp_compute_config() will be called and dp_m_n will be
computed for the new mode

- then intel_dp_drrs_compute_config() will check for the necessary
conditions to do a seamless mode switch, if possible
crtc_state->seamless_mode_switch will be set and has_drrs will not
be set, so i915 will not automatically switch between modes

- then intel_crtc_compute_config() will call
intel_crtc_compute_pixel_rate() that will take the hint that it is
trying to do a seamless mode switch and set pixel_rate to the
pixel_rate of the old state

- then if nothing else changed in the state intel_crtc_check_fastset()
will be able to set mode_changed to false and i915 can do fastset
otherwise the commit will fail during the check phase

- now on the atomic commit phase, intel_ddi_update_pipe_dp()
will be called and will program the new dp_m_n

- nothing else is different in the commit phase until the step to
verify programmed state, the most important change here is that need
to save the pixel_rate in DRRS global state as there is no other
way to get that from hardware or atomic state

v2:
- not overwritten dp_m_n values in intel_crtc_copy_fastset() when
doing a seamless_mode_switch

Cc: Vidya Srinivas <vidya.srinivas@intel.com>
Cc: Sean Paul <seanpaul@chromium.org>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
---
 drivers/gpu/drm/i915/display/intel_ddi.c      | 10 +++
 drivers/gpu/drm/i915/display/intel_display.c  | 61 ++++++++++++++++---
 .../drm/i915/display/intel_display_debugfs.c  |  3 +
 .../drm/i915/display/intel_display_types.h    |  3 +
 drivers/gpu/drm/i915/display/intel_dp.c       | 56 ++++++++++++++---
 drivers/gpu/drm/i915/display/intel_drrs.c     | 38 +++++++++---
 drivers/gpu/drm/i915/display/intel_drrs.h     |  3 +
 7 files changed, 151 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
index 9e6fa59eabba7..732e5d425412e 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -46,6 +46,7 @@
 #include "intel_dp_link_training.h"
 #include "intel_dp_mst.h"
 #include "intel_dpio_phy.h"
+#include "intel_drrs.h"
 #include "intel_dsi.h"
 #include "intel_fdi.h"
 #include "intel_fifo_underrun.h"
@@ -3010,6 +3011,14 @@ static void intel_ddi_update_pipe_dp(struct intel_atomic_state *state,
 
 	intel_backlight_update(state, encoder, crtc_state, conn_state);
 	drm_connector_update_privacy_screen(conn_state);
+
+	if (crtc_state->seamless_mode_switch) {
+		struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc);
+
+		intel_cpu_transcoder_set_m1_n1(intel_crtc,
+					       crtc_state->cpu_transcoder,
+					       &crtc_state->dp_m_n);
+	}
 }
 
 void intel_ddi_update_pipe(struct intel_atomic_state *state,
@@ -3484,6 +3493,7 @@ static void intel_ddi_get_config(struct intel_encoder *encoder,
 	intel_read_dp_sdp(encoder, pipe_config, DP_SDP_VSC);
 
 	intel_psr_get_config(encoder, pipe_config);
+	intel_drrs_get_config(encoder, pipe_config);
 }
 
 void intel_ddi_get_clock(struct intel_encoder *encoder,
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 17d0cad9e1686..e54fbe3b1d394 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -2629,6 +2629,44 @@ static void intel_crtc_compute_pixel_rate(struct intel_crtc_state *crtc_state)
 	else
 		crtc_state->pixel_rate =
 			ilk_pipe_pixel_rate(crtc_state);
+
+	/*
+	 * Do not change pixel_rate when doing seamless mode switch, otherwise
+	 * it will change port_clock and other stuff that will need a modeset
+	 * to be programmed
+	 */
+	if (crtc_state->seamless_mode_switch) {
+		struct intel_atomic_state *state = to_intel_atomic_state(crtc_state->uapi.state);
+		struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+		const struct intel_crtc_state *old_crtc_state;
+
+		old_crtc_state = intel_atomic_get_old_crtc_state(state, crtc);
+
+		/*
+		 * It can only seamless switch if pixel rate of the new mode is
+		 * <= than old one, if not commit will fail with pixel_rate
+		 * mismatch.
+		 */
+		if (crtc_state->pixel_rate < old_crtc_state->pixel_rate ||
+		    intel_fuzzy_clock_check(crtc_state->pixel_rate,
+					    old_crtc_state->pixel_rate))
+			crtc_state->pixel_rate = old_crtc_state->pixel_rate;
+	}
+}
+
+static void intel_crtc_get_pixel_rate(struct intel_crtc_state *crtc_state)
+{
+	if (crtc_state->seamless_mode_switch) {
+		struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+
+		mutex_lock(&crtc->drrs.mutex);
+		crtc_state->pixel_rate = crtc->drrs.seamless_mode_switch_pixel_rate;
+		mutex_unlock(&crtc->drrs.mutex);
+
+		return;
+	}
+
+	intel_crtc_compute_pixel_rate(crtc_state);
 }
 
 static void intel_bigjoiner_adjust_timings(const struct intel_crtc_state *crtc_state,
@@ -2705,7 +2743,7 @@ static void intel_crtc_readout_derived_state(struct intel_crtc_state *crtc_state
 	intel_bigjoiner_adjust_timings(crtc_state, pipe_mode);
 	intel_mode_from_crtc_timings(pipe_mode, pipe_mode);
 
-	intel_crtc_compute_pixel_rate(crtc_state);
+	intel_crtc_get_pixel_rate(crtc_state);
 }
 
 static void intel_encoder_get_config(struct intel_encoder *encoder,
@@ -6182,11 +6220,13 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
 	PIPE_CONF_CHECK_I(lane_count);
 	PIPE_CONF_CHECK_X(lane_lat_optim_mask);
 
-	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv)) {
-		PIPE_CONF_CHECK_M_N_ALT(dp_m_n, dp_m2_n2);
-	} else {
-		PIPE_CONF_CHECK_M_N(dp_m_n);
-		PIPE_CONF_CHECK_M_N(dp_m2_n2);
+	if (!pipe_config->seamless_mode_switch) {
+		if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv)) {
+			PIPE_CONF_CHECK_M_N_ALT(dp_m_n, dp_m2_n2);
+		} else {
+			PIPE_CONF_CHECK_M_N(dp_m_n);
+			PIPE_CONF_CHECK_M_N(dp_m2_n2);
+		}
 	}
 
 	PIPE_CONF_CHECK_X(output_types);
@@ -6348,8 +6388,10 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
 	if (IS_G4X(dev_priv) || DISPLAY_VER(dev_priv) >= 5)
 		PIPE_CONF_CHECK_I(pipe_bpp);
 
-	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.pipe_mode.crtc_clock);
-	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.adjusted_mode.crtc_clock);
+	if (!pipe_config->seamless_mode_switch) {
+		PIPE_CONF_CHECK_CLOCK_FUZZY(hw.pipe_mode.crtc_clock);
+		PIPE_CONF_CHECK_CLOCK_FUZZY(hw.adjusted_mode.crtc_clock);
+	}
 	PIPE_CONF_CHECK_CLOCK_FUZZY(port_clock);
 
 	PIPE_CONF_CHECK_I(min_voltage_level);
@@ -7085,11 +7127,12 @@ static void intel_crtc_copy_fastset(const struct intel_crtc_state *old_crtc_stat
 	 * FIXME: should really copy more fuzzy state here
 	 */
 	new_crtc_state->fdi_m_n = old_crtc_state->fdi_m_n;
-	new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
 
 	if (!intel_drrs_crtc_copy_fastset(old_crtc_state, new_crtc_state)) {
+		new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
 		new_crtc_state->dp_m2_n2 = old_crtc_state->dp_m2_n2;
 		new_crtc_state->has_drrs = old_crtc_state->has_drrs;
+		new_crtc_state->seamless_mode_switch = old_crtc_state->seamless_mode_switch;
 	}
 }
 
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 452d773fd4e34..92099e1f0b23e 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -1108,6 +1108,9 @@ static int i915_drrs_status(struct seq_file *m, void *unused)
 			   crtc->drrs.refresh_rate == DRRS_REFRESH_RATE_LOW ?
 			   "low" : "high");
 
+		seq_printf(m, "Seamless mode switch enabled: %s\n",
+			   str_yes_no(crtc->drrs.seamless_mode_switch_pixel_rate));
+
 		mutex_unlock(&crtc->drrs.mutex);
 	}
 
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 408152f9f46a4..e290366adfc27 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1057,6 +1057,7 @@ struct intel_crtc_state {
 	/* m2_n2 for eDP downclock */
 	struct intel_link_m_n dp_m2_n2;
 	bool has_drrs;
+	bool seamless_mode_switch;
 
 	/* PSR is supported but might not be enabled due the lack of enabled planes */
 	bool has_psr;
@@ -1314,6 +1315,8 @@ struct intel_crtc {
 		unsigned int busy_frontbuffer_bits;
 		enum transcoder cpu_transcoder;
 		struct intel_link_m_n m_n, m2_n2;
+		/* Only used to verify if programmed state matches */
+		unsigned int seamless_mode_switch_pixel_rate;
 	} drrs;
 
 	int scanline_offset;
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index cc9be82e128f4..691d362dde95e 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1844,8 +1844,7 @@ static bool cpu_transcoder_has_drrs(struct drm_i915_private *i915,
 }
 
 static bool can_enable_drrs(struct intel_connector *connector,
-			    const struct intel_crtc_state *pipe_config,
-			    const struct drm_display_mode *downclock_mode)
+			    const struct intel_crtc_state *pipe_config)
 {
 	struct drm_i915_private *i915 = to_i915(connector->base.dev);
 
@@ -1868,8 +1867,40 @@ static bool can_enable_drrs(struct intel_connector *connector,
 	if (!cpu_transcoder_has_drrs(i915, pipe_config->cpu_transcoder))
 		return false;
 
-	return downclock_mode &&
-		intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS;
+	return intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS;
+}
+
+static bool can_seamless_switch_mode(struct intel_crtc_state *pipe_config)
+{
+	struct drm_i915_private *i915 = to_i915(pipe_config->uapi.crtc->dev);
+	const struct intel_crtc_state *old_pipe_config;
+	struct intel_atomic_state *state;
+	struct intel_crtc *intel_crtc;
+
+	/* Only supported in platforms that can switch m_n on the fly */
+	if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config->cpu_transcoder))
+		return false;
+
+	state = to_intel_atomic_state(pipe_config->uapi.state);
+	if (state->base.allow_modeset)
+		return false;
+
+	intel_crtc = to_intel_crtc(pipe_config->uapi.crtc);
+	old_pipe_config = intel_atomic_get_old_crtc_state(state, intel_crtc);
+	if (drm_mode_equal(&old_pipe_config->hw.adjusted_mode,
+			   &pipe_config->hw.adjusted_mode))
+		return false;
+
+	/* Only clock can change */
+	if (!drm_mode_match(&old_pipe_config->hw.adjusted_mode,
+			    &pipe_config->hw.adjusted_mode,
+			    DRM_MODE_MATCH_TIMINGS |
+			    DRM_MODE_MATCH_FLAGS |
+			    DRM_MODE_MATCH_3D_FLAGS |
+			    DRM_MODE_MATCH_ASPECT_RATIO))
+		return false;
+
+	return true;
 }
 
 static void
@@ -1882,12 +1913,17 @@ intel_dp_drrs_compute_config(struct intel_connector *connector,
 		intel_panel_downclock_mode(connector, &pipe_config->hw.adjusted_mode);
 	int pixel_clock;
 
-	if (!can_enable_drrs(connector, pipe_config, downclock_mode)) {
-		if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config->cpu_transcoder))
-			intel_zero_m_n(&pipe_config->dp_m2_n2);
+	if (!can_enable_drrs(connector, pipe_config))
+		goto not_supported;
+
+	if (can_seamless_switch_mode(pipe_config)) {
+		pipe_config->seamless_mode_switch = true;
 		return;
 	}
 
+	if (!downclock_mode)
+		goto not_supported;
+
 	if (IS_IRONLAKE(i915) || IS_SANDYBRIDGE(i915) || IS_IVYBRIDGE(i915))
 		pipe_config->msa_timing_delay = i915->vbt.edp.drrs_msa_timing_delay;
 
@@ -1904,6 +1940,12 @@ intel_dp_drrs_compute_config(struct intel_connector *connector,
 	/* FIXME: abstract this better */
 	if (pipe_config->splitter.enable)
 		pipe_config->dp_m2_n2.data_m *= pipe_config->splitter.link_count;
+
+	return;
+
+not_supported:
+	if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config->cpu_transcoder))
+		intel_zero_m_n(&pipe_config->dp_m2_n2);
 }
 
 static bool intel_dp_has_audio(struct intel_encoder *encoder,
diff --git a/drivers/gpu/drm/i915/display/intel_drrs.c b/drivers/gpu/drm/i915/display/intel_drrs.c
index d266fad83a086..ffd51d2f5998d 100644
--- a/drivers/gpu/drm/i915/display/intel_drrs.c
+++ b/drivers/gpu/drm/i915/display/intel_drrs.c
@@ -144,16 +144,19 @@ void intel_drrs_activate(const struct intel_crtc_state *crtc_state)
 {
 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
 
+	mutex_lock(&crtc->drrs.mutex);
+
+	crtc->drrs.seamless_mode_switch_pixel_rate = crtc_state->seamless_mode_switch ?
+						     crtc_state->pixel_rate : 0;
+
 	if (!crtc_state->has_drrs)
-		return;
+		goto unlock;
 
 	if (!crtc_state->hw.active)
-		return;
+		goto unlock;
 
 	if (intel_crtc_is_bigjoiner_slave(crtc_state))
-		return;
-
-	mutex_lock(&crtc->drrs.mutex);
+		goto unlock;
 
 	crtc->drrs.cpu_transcoder = crtc_state->cpu_transcoder;
 	crtc->drrs.m_n = crtc_state->dp_m_n;
@@ -163,6 +166,7 @@ void intel_drrs_activate(const struct intel_crtc_state *crtc_state)
 
 	intel_drrs_schedule_work(crtc);
 
+unlock:
 	mutex_unlock(&crtc->drrs.mutex);
 }
 
@@ -176,7 +180,7 @@ void intel_drrs_deactivate(const struct intel_crtc_state *old_crtc_state)
 {
 	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
 
-	if (!old_crtc_state->has_drrs)
+	if (!old_crtc_state->has_drrs && !old_crtc_state->seamless_mode_switch)
 		return;
 
 	if (!old_crtc_state->hw.active)
@@ -187,12 +191,14 @@ void intel_drrs_deactivate(const struct intel_crtc_state *old_crtc_state)
 
 	mutex_lock(&crtc->drrs.mutex);
 
-	if (intel_drrs_is_active(crtc))
+	if (intel_drrs_is_active(crtc) &&
+	    old_crtc_state->seamless_mode_switch == 0)
 		intel_drrs_set_state(crtc, DRRS_REFRESH_RATE_HIGH);
 
 	crtc->drrs.cpu_transcoder = INVALID_TRANSCODER;
 	crtc->drrs.frontbuffer_bits = 0;
 	crtc->drrs.busy_frontbuffer_bits = 0;
+	crtc->drrs.seamless_mode_switch_pixel_rate = 0;
 
 	mutex_unlock(&crtc->drrs.mutex);
 
@@ -322,5 +328,23 @@ bool intel_drrs_crtc_copy_fastset(const struct intel_crtc_state *old_crtc_state,
 	if (intel_cpu_transcoder_has_m2_n2(i915, new_crtc_state->cpu_transcoder))
 		return false;
 
+	if (!new_crtc_state->seamless_mode_switch)
+		new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
+
 	return true;
 }
+
+void intel_drrs_get_config(struct intel_encoder *encoder,
+			   struct intel_crtc_state *pipe_config)
+{
+	struct intel_crtc *crtc;
+
+	crtc = to_intel_crtc(pipe_config->uapi.crtc);
+
+	mutex_lock(&crtc->drrs.mutex);
+
+	pipe_config->seamless_mode_switch = crtc->drrs.seamless_mode_switch_pixel_rate;
+	pipe_config->has_drrs = intel_drrs_is_active(crtc);
+
+	mutex_unlock(&crtc->drrs.mutex);
+}
diff --git a/drivers/gpu/drm/i915/display/intel_drrs.h b/drivers/gpu/drm/i915/display/intel_drrs.h
index 749ac717db063..a100023658a5a 100644
--- a/drivers/gpu/drm/i915/display/intel_drrs.h
+++ b/drivers/gpu/drm/i915/display/intel_drrs.h
@@ -14,6 +14,7 @@ struct intel_atomic_state;
 struct intel_crtc;
 struct intel_crtc_state;
 struct intel_connector;
+struct intel_encoder;
 
 const char *intel_drrs_type_str(enum drrs_type drrs_type);
 bool intel_drrs_is_active(struct intel_crtc *crtc);
@@ -26,5 +27,7 @@ void intel_drrs_flush(struct drm_i915_private *dev_priv,
 void intel_crtc_drrs_init(struct intel_crtc *crtc);
 bool intel_drrs_crtc_copy_fastset(const struct intel_crtc_state *old_crtc_state,
 				  struct intel_crtc_state *new_crtc_state);
+void intel_drrs_get_config(struct intel_encoder *encoder,
+			   struct intel_crtc_state *pipe_config);
 
 #endif /* __INTEL_DRRS_H__ */
-- 
2.36.0


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

* [Intel-gfx] ✓ Fi.CI.BAT: success for series starting with [v2,1/3] drm/i915/display: Allow DRRS to be enabled during driver load
  2022-05-02 20:41 [Intel-gfx] [PATCH v2 1/3] drm/i915/display: Allow DRRS to be enabled during driver load José Roberto de Souza
  2022-05-02 20:41 ` [Intel-gfx] [PATCH v2 2/3] drm/i915/display/dp: Try to fallback to previous link config if modeset is not allowed José Roberto de Souza
  2022-05-02 20:41 ` [Intel-gfx] [PATCH v2 3/3] drm/i915/display: Implement seamless mode switch José Roberto de Souza
@ 2022-05-02 21:26 ` Patchwork
  2022-05-03  2:41 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
  3 siblings, 0 replies; 10+ messages in thread
From: Patchwork @ 2022-05-02 21:26 UTC (permalink / raw)
  To: José Roberto de Souza; +Cc: intel-gfx

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

== Series Details ==

Series: series starting with [v2,1/3] drm/i915/display: Allow DRRS to be enabled during driver load
URL   : https://patchwork.freedesktop.org/series/103458/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_11588 -> Patchwork_103458v1
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

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

Participating hosts (44 -> 42)
------------------------------

  Additional (1): bat-dg2-8 
  Missing    (3): bat-rpls-1 bat-adlm-1 fi-bsw-cyan 

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

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

### IGT changes ###

#### Suppressed ####

  The following results come from untrusted machines, tests, or statuses.
  They do not affect the overall result.

  * igt@i915_selftest@live@gem_contexts:
    - {bat-dg2-8}:        NOTRUN -> [DMESG-FAIL][1]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/bat-dg2-8/igt@i915_selftest@live@gem_contexts.html

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

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

### IGT changes ###

#### Issues hit ####

  * igt@kms_chamelium@common-hpd-after-suspend:
    - fi-hsw-4770:        NOTRUN -> [SKIP][2] ([fdo#109271] / [fdo#111827])
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/fi-hsw-4770/igt@kms_chamelium@common-hpd-after-suspend.html
    - fi-snb-2600:        NOTRUN -> [SKIP][3] ([fdo#109271] / [fdo#111827])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/fi-snb-2600/igt@kms_chamelium@common-hpd-after-suspend.html

  
#### Possible fixes ####

  * igt@gem_exec_suspend@basic-s0@smem:
    - {fi-ehl-2}:         [DMESG-WARN][4] ([i915#5122]) -> [PASS][5]
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/fi-ehl-2/igt@gem_exec_suspend@basic-s0@smem.html
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/fi-ehl-2/igt@gem_exec_suspend@basic-s0@smem.html

  * igt@i915_selftest@live@gt_heartbeat:
    - {fi-tgl-dsi}:       [DMESG-FAIL][6] -> [PASS][7]
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/fi-tgl-dsi/igt@i915_selftest@live@gt_heartbeat.html
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/fi-tgl-dsi/igt@i915_selftest@live@gt_heartbeat.html

  * igt@i915_selftest@live@hangcheck:
    - fi-hsw-4770:        [INCOMPLETE][8] ([i915#4785]) -> [PASS][9]
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/fi-hsw-4770/igt@i915_selftest@live@hangcheck.html
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/fi-hsw-4770/igt@i915_selftest@live@hangcheck.html
    - fi-snb-2600:        [INCOMPLETE][10] ([i915#3921]) -> [PASS][11]
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/fi-snb-2600/igt@i915_selftest@live@hangcheck.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/fi-snb-2600/igt@i915_selftest@live@hangcheck.html

  * igt@i915_selftest@live@migrate:
    - {fi-tgl-dsi}:       [INCOMPLETE][12] -> [PASS][13]
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/fi-tgl-dsi/igt@i915_selftest@live@migrate.html
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/fi-tgl-dsi/igt@i915_selftest@live@migrate.html

  * igt@kms_busy@basic@modeset:
    - {bat-adlp-6}:       [DMESG-WARN][14] ([i915#3576]) -> [PASS][15]
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/bat-adlp-6/igt@kms_busy@basic@modeset.html
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/bat-adlp-6/igt@kms_busy@basic@modeset.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#109284]: https://bugs.freedesktop.org/show_bug.cgi?id=109284
  [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
  [i915#1155]: https://gitlab.freedesktop.org/drm/intel/issues/1155
  [i915#2582]: https://gitlab.freedesktop.org/drm/intel/issues/2582
  [i915#3291]: https://gitlab.freedesktop.org/drm/intel/issues/3291
  [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555
  [i915#3576]: https://gitlab.freedesktop.org/drm/intel/issues/3576
  [i915#3595]: https://gitlab.freedesktop.org/drm/intel/issues/3595
  [i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708
  [i915#3921]: https://gitlab.freedesktop.org/drm/intel/issues/3921
  [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#4215]: https://gitlab.freedesktop.org/drm/intel/issues/4215
  [i915#4785]: https://gitlab.freedesktop.org/drm/intel/issues/4785
  [i915#4873]: https://gitlab.freedesktop.org/drm/intel/issues/4873
  [i915#5122]: https://gitlab.freedesktop.org/drm/intel/issues/5122
  [i915#5190]: https://gitlab.freedesktop.org/drm/intel/issues/5190
  [i915#5274]: https://gitlab.freedesktop.org/drm/intel/issues/5274
  [i915#5275]: https://gitlab.freedesktop.org/drm/intel/issues/5275
  [i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354
  [i915#5763]: https://gitlab.freedesktop.org/drm/intel/issues/5763


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

  * Linux: CI_DRM_11588 -> Patchwork_103458v1

  CI-20190529: 20190529
  CI_DRM_11588: 68f638d8e33ee3d6110a6798b823f88e07eaef1f @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_6464: eddc67c5c85b8ee6eb4d13752ca43da5073dc985 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  Patchwork_103458v1: 68f638d8e33ee3d6110a6798b823f88e07eaef1f @ git://anongit.freedesktop.org/gfx-ci/linux


### Linux commits

ff5ffe46c349 drm/i915/display: Implement seamless mode switch
9dbbb201c98e drm/i915/display/dp: Try to fallback to previous link config if modeset is not allowed
f5adbbd8795b drm/i915/display: Allow DRRS to be enabled during driver load

== Logs ==

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

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

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

* [Intel-gfx] ✗ Fi.CI.IGT: failure for series starting with [v2,1/3] drm/i915/display: Allow DRRS to be enabled during driver load
  2022-05-02 20:41 [Intel-gfx] [PATCH v2 1/3] drm/i915/display: Allow DRRS to be enabled during driver load José Roberto de Souza
                   ` (2 preceding siblings ...)
  2022-05-02 21:26 ` [Intel-gfx] ✓ Fi.CI.BAT: success for series starting with [v2,1/3] drm/i915/display: Allow DRRS to be enabled during driver load Patchwork
@ 2022-05-03  2:41 ` Patchwork
  3 siblings, 0 replies; 10+ messages in thread
From: Patchwork @ 2022-05-03  2:41 UTC (permalink / raw)
  To: José Roberto de Souza; +Cc: intel-gfx

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

== Series Details ==

Series: series starting with [v2,1/3] drm/i915/display: Allow DRRS to be enabled during driver load
URL   : https://patchwork.freedesktop.org/series/103458/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_11588_full -> Patchwork_103458v1_full
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with Patchwork_103458v1_full absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in Patchwork_103458v1_full, please notify your bug team to allow them
  to document this new failure mode, which will reduce false positives in CI.

  

Participating hosts (13 -> 13)
------------------------------

  No changes in participating hosts

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

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

### IGT changes ###

#### Possible regressions ####

  * igt@i915_suspend@forcewake:
    - shard-skl:          [PASS][1] -> [INCOMPLETE][2]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-skl4/igt@i915_suspend@forcewake.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl10/igt@i915_suspend@forcewake.html

  
#### Suppressed ####

  The following results come from untrusted machines, tests, or statuses.
  They do not affect the overall result.

  * igt@gem_eio@reset-stress:
    - {shard-rkl}:        NOTRUN -> [INCOMPLETE][3]
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-5/igt@gem_eio@reset-stress.html

  * igt@gem_exec_fair@basic-pace-solo@rcs0:
    - {shard-rkl}:        [FAIL][4] ([i915#2842]) -> [FAIL][5]
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-5/igt@gem_exec_fair@basic-pace-solo@rcs0.html
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-2/igt@gem_exec_fair@basic-pace-solo@rcs0.html

  * igt@gem_exec_suspend@basic-s0@smem:
    - {shard-dg1}:        NOTRUN -> [INCOMPLETE][6] +3 similar issues
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-dg1-12/igt@gem_exec_suspend@basic-s0@smem.html

  * igt@kms_vblank@pipe-c-ts-continuation-dpms-suspend:
    - {shard-tglu}:       NOTRUN -> [DMESG-WARN][7]
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-tglu-1/igt@kms_vblank@pipe-c-ts-continuation-dpms-suspend.html

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

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

### CI changes ###

#### Issues hit ####

  * boot:
    - shard-glk:          ([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], [PASS][49], [PASS][50], [PASS][51], [PASS][52], [PASS][53], [PASS][54], [PASS][55], [PASS][56], [PASS][57]) ([i915#4392])
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk9/boot.html
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk9/boot.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk9/boot.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk8/boot.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk8/boot.html
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk7/boot.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk7/boot.html
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk7/boot.html
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk7/boot.html
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk7/boot.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk6/boot.html
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk6/boot.html
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk6/boot.html
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk5/boot.html
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk5/boot.html
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk5/boot.html
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk4/boot.html
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk4/boot.html
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk4/boot.html
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk3/boot.html
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk3/boot.html
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk2/boot.html
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk2/boot.html
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk1/boot.html
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk1/boot.html
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk1/boot.html
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk1/boot.html
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk2/boot.html
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk2/boot.html
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk2/boot.html
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk2/boot.html
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk2/boot.html
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk3/boot.html
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk3/boot.html
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk4/boot.html
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk4/boot.html
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk5/boot.html
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk5/boot.html
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk6/boot.html
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk6/boot.html
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk6/boot.html
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk7/boot.html
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk7/boot.html
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk7/boot.html
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk8/boot.html
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk8/boot.html
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk8/boot.html
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk9/boot.html
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk9/boot.html
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk9/boot.html

  

### IGT changes ###

#### Issues hit ####

  * igt@feature_discovery@display-4x:
    - shard-tglb:         NOTRUN -> [SKIP][58] ([i915#1839])
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-tglb1/igt@feature_discovery@display-4x.html

  * igt@gem_exec_balancer@parallel-keep-in-fence:
    - shard-kbl:          NOTRUN -> [DMESG-WARN][59] ([i915#5076] / [i915#5614])
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl4/igt@gem_exec_balancer@parallel-keep-in-fence.html

  * igt@gem_exec_fair@basic-pace@vcs0:
    - shard-iclb:         [PASS][60] -> [FAIL][61] ([i915#2842])
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-iclb7/igt@gem_exec_fair@basic-pace@vcs0.html
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb2/igt@gem_exec_fair@basic-pace@vcs0.html

  * igt@gem_exec_fair@basic-pace@vcs1:
    - shard-iclb:         NOTRUN -> [FAIL][62] ([i915#2842])
   [62]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb2/igt@gem_exec_fair@basic-pace@vcs1.html

  * igt@gem_exec_fair@basic-pace@vecs0:
    - shard-kbl:          [PASS][63] -> [FAIL][64] ([i915#2842]) +2 similar issues
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl1/igt@gem_exec_fair@basic-pace@vecs0.html
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl7/igt@gem_exec_fair@basic-pace@vecs0.html

  * igt@gem_exec_flush@basic-uc-pro-default:
    - shard-snb:          [PASS][65] -> [SKIP][66] ([fdo#109271]) +2 similar issues
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-snb7/igt@gem_exec_flush@basic-uc-pro-default.html
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-snb6/igt@gem_exec_flush@basic-uc-pro-default.html

  * igt@gem_flink_race@flink_close:
    - shard-iclb:         [PASS][67] -> [FAIL][68] ([i915#5687])
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-iclb6/igt@gem_flink_race@flink_close.html
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb6/igt@gem_flink_race@flink_close.html

  * igt@gem_lmem_swapping@parallel-random-engines:
    - shard-apl:          NOTRUN -> [SKIP][69] ([fdo#109271] / [i915#4613]) +1 similar issue
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl1/igt@gem_lmem_swapping@parallel-random-engines.html

  * igt@gem_lmem_swapping@verify-ccs:
    - shard-skl:          NOTRUN -> [SKIP][70] ([fdo#109271] / [i915#4613])
   [70]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl7/igt@gem_lmem_swapping@verify-ccs.html

  * igt@gem_userptr_blits@coherency-unsync:
    - shard-tglb:         NOTRUN -> [SKIP][71] ([i915#3297])
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-tglb1/igt@gem_userptr_blits@coherency-unsync.html

  * igt@gem_userptr_blits@input-checking:
    - shard-skl:          NOTRUN -> [DMESG-WARN][72] ([i915#4991])
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl7/igt@gem_userptr_blits@input-checking.html

  * igt@gen7_exec_parse@basic-rejected:
    - shard-tglb:         NOTRUN -> [SKIP][73] ([fdo#109289])
   [73]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-tglb1/igt@gen7_exec_parse@basic-rejected.html

  * igt@i915_pm_rc6_residency@rc6-idle:
    - shard-iclb:         NOTRUN -> [WARN][74] ([i915#2684])
   [74]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb3/igt@i915_pm_rc6_residency@rc6-idle.html

  * igt@i915_pm_rpm@modeset-lpsp-stress:
    - shard-apl:          NOTRUN -> [SKIP][75] ([fdo#109271]) +83 similar issues
   [75]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl7/igt@i915_pm_rpm@modeset-lpsp-stress.html

  * igt@i915_suspend@sysfs-reader:
    - shard-kbl:          [PASS][76] -> [DMESG-WARN][77] ([i915#180]) +3 similar issues
   [76]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl4/igt@i915_suspend@sysfs-reader.html
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl6/igt@i915_suspend@sysfs-reader.html

  * igt@kms_async_flips@alternate-sync-async-flip:
    - shard-skl:          [PASS][78] -> [FAIL][79] ([i915#2521])
   [78]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-skl6/igt@kms_async_flips@alternate-sync-async-flip.html
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl10/igt@kms_async_flips@alternate-sync-async-flip.html

  * igt@kms_big_fb@4-tiled-16bpp-rotate-0:
    - shard-tglb:         NOTRUN -> [SKIP][80] ([i915#5286])
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-tglb1/igt@kms_big_fb@4-tiled-16bpp-rotate-0.html

  * igt@kms_big_fb@x-tiled-16bpp-rotate-90:
    - shard-iclb:         NOTRUN -> [SKIP][81] ([fdo#110725] / [fdo#111614])
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb3/igt@kms_big_fb@x-tiled-16bpp-rotate-90.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-0-hflip:
    - shard-iclb:         NOTRUN -> [SKIP][82] ([fdo#110723])
   [82]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb3/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-0-hflip.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-hflip:
    - shard-tglb:         NOTRUN -> [SKIP][83] ([fdo#111615]) +1 similar issue
   [83]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-tglb1/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-hflip.html

  * igt@kms_ccs@pipe-a-ccs-on-another-bo-y_tiled_gen12_mc_ccs:
    - shard-apl:          NOTRUN -> [SKIP][84] ([fdo#109271] / [i915#3886]) +2 similar issues
   [84]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl1/igt@kms_ccs@pipe-a-ccs-on-another-bo-y_tiled_gen12_mc_ccs.html

  * igt@kms_ccs@pipe-a-crc-primary-rotation-180-y_tiled_gen12_rc_ccs_cc:
    - shard-skl:          NOTRUN -> [SKIP][85] ([fdo#109271] / [i915#3886]) +2 similar issues
   [85]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl7/igt@kms_ccs@pipe-a-crc-primary-rotation-180-y_tiled_gen12_rc_ccs_cc.html

  * igt@kms_ccs@pipe-a-crc-sprite-planes-basic-y_tiled_gen12_rc_ccs_cc:
    - shard-kbl:          NOTRUN -> [SKIP][86] ([fdo#109271] / [i915#3886]) +2 similar issues
   [86]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl1/igt@kms_ccs@pipe-a-crc-sprite-planes-basic-y_tiled_gen12_rc_ccs_cc.html

  * igt@kms_chamelium@hdmi-hpd:
    - shard-skl:          NOTRUN -> [SKIP][87] ([fdo#109271] / [fdo#111827]) +4 similar issues
   [87]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl7/igt@kms_chamelium@hdmi-hpd.html

  * igt@kms_color@pipe-d-gamma:
    - shard-iclb:         NOTRUN -> [SKIP][88] ([fdo#109278] / [i915#1149])
   [88]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb3/igt@kms_color@pipe-d-gamma.html

  * igt@kms_color_chamelium@pipe-b-ctm-0-25:
    - shard-kbl:          NOTRUN -> [SKIP][89] ([fdo#109271] / [fdo#111827]) +6 similar issues
   [89]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl1/igt@kms_color_chamelium@pipe-b-ctm-0-25.html

  * igt@kms_color_chamelium@pipe-d-ctm-0-75:
    - shard-apl:          NOTRUN -> [SKIP][90] ([fdo#109271] / [fdo#111827]) +3 similar issues
   [90]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl7/igt@kms_color_chamelium@pipe-d-ctm-0-75.html

  * igt@kms_cursor_crc@pipe-a-cursor-512x170-random:
    - shard-kbl:          NOTRUN -> [SKIP][91] ([fdo#109271]) +58 similar issues
   [91]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl4/igt@kms_cursor_crc@pipe-a-cursor-512x170-random.html

  * igt@kms_cursor_crc@pipe-b-cursor-32x32-offscreen:
    - shard-tglb:         NOTRUN -> [SKIP][92] ([i915#3319])
   [92]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-tglb1/igt@kms_cursor_crc@pipe-b-cursor-32x32-offscreen.html

  * igt@kms_cursor_crc@pipe-b-cursor-32x32-sliding:
    - shard-iclb:         NOTRUN -> [SKIP][93] ([fdo#109278]) +1 similar issue
   [93]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb3/igt@kms_cursor_crc@pipe-b-cursor-32x32-sliding.html

  * igt@kms_cursor_legacy@pipe-d-single-bo:
    - shard-kbl:          NOTRUN -> [SKIP][94] ([fdo#109271] / [i915#533])
   [94]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl1/igt@kms_cursor_legacy@pipe-d-single-bo.html

  * igt@kms_fbcon_fbt@fbc-suspend:
    - shard-apl:          [PASS][95] -> [FAIL][96] ([i915#4767])
   [95]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-apl6/igt@kms_fbcon_fbt@fbc-suspend.html
   [96]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl4/igt@kms_fbcon_fbt@fbc-suspend.html

  * igt@kms_flip@2x-flip-vs-absolute-wf_vblank-interruptible:
    - shard-iclb:         NOTRUN -> [SKIP][97] ([fdo#109274])
   [97]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb3/igt@kms_flip@2x-flip-vs-absolute-wf_vblank-interruptible.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@c-edp1:
    - shard-skl:          [PASS][98] -> [FAIL][99] ([i915#79])
   [98]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-skl9/igt@kms_flip@flip-vs-expired-vblank-interruptible@c-edp1.html
   [99]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl1/igt@kms_flip@flip-vs-expired-vblank-interruptible@c-edp1.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling:
    - shard-iclb:         [PASS][100] -> [SKIP][101] ([i915#3701])
   [100]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-iclb7/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling.html
   [101]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb2/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling.html

  * igt@kms_frontbuffer_tracking@fbc-1p-shrfb-fliptrack-mmap-gtt:
    - shard-skl:          NOTRUN -> [SKIP][102] ([fdo#109271]) +51 similar issues
   [102]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl7/igt@kms_frontbuffer_tracking@fbc-1p-shrfb-fliptrack-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-blt:
    - shard-iclb:         NOTRUN -> [SKIP][103] ([fdo#109280]) +2 similar issues
   [103]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb3/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-pwrite:
    - shard-tglb:         NOTRUN -> [SKIP][104] ([fdo#109280] / [fdo#111825]) +2 similar issues
   [104]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-tglb1/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-pwrite.html

  * igt@kms_plane@plane-panning-bottom-right-suspend@pipe-b-planes:
    - shard-apl:          [PASS][105] -> [DMESG-WARN][106] ([i915#180]) +1 similar issue
   [105]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-apl6/igt@kms_plane@plane-panning-bottom-right-suspend@pipe-b-planes.html
   [106]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl3/igt@kms_plane@plane-panning-bottom-right-suspend@pipe-b-planes.html

  * igt@kms_plane_alpha_blend@pipe-a-alpha-7efc:
    - shard-glk:          [PASS][107] -> [DMESG-WARN][108] ([i915#118])
   [107]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk1/igt@kms_plane_alpha_blend@pipe-a-alpha-7efc.html
   [108]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk2/igt@kms_plane_alpha_blend@pipe-a-alpha-7efc.html

  * igt@kms_plane_alpha_blend@pipe-b-alpha-opaque-fb:
    - shard-skl:          NOTRUN -> [FAIL][109] ([fdo#108145] / [i915#265])
   [109]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl7/igt@kms_plane_alpha_blend@pipe-b-alpha-opaque-fb.html

  * igt@kms_plane_alpha_blend@pipe-c-alpha-basic:
    - shard-kbl:          NOTRUN -> [FAIL][110] ([fdo#108145] / [i915#265]) +1 similar issue
   [110]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl7/igt@kms_plane_alpha_blend@pipe-c-alpha-basic.html

  * igt@kms_psr2_sf@overlay-plane-update-continuous-sf:
    - shard-apl:          NOTRUN -> [SKIP][111] ([fdo#109271] / [i915#658])
   [111]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl1/igt@kms_psr2_sf@overlay-plane-update-continuous-sf.html

  * igt@kms_psr2_sf@overlay-plane-update-sf-dmg-area:
    - shard-skl:          NOTRUN -> [SKIP][112] ([fdo#109271] / [i915#658])
   [112]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl7/igt@kms_psr2_sf@overlay-plane-update-sf-dmg-area.html

  * igt@kms_psr2_su@frontbuffer-xrgb8888:
    - shard-iclb:         [PASS][113] -> [SKIP][114] ([fdo#109642] / [fdo#111068] / [i915#658])
   [113]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-iclb2/igt@kms_psr2_su@frontbuffer-xrgb8888.html
   [114]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb5/igt@kms_psr2_su@frontbuffer-xrgb8888.html

  * igt@kms_psr@psr2_cursor_mmap_gtt:
    - shard-tglb:         NOTRUN -> [FAIL][115] ([i915#132] / [i915#3467])
   [115]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-tglb1/igt@kms_psr@psr2_cursor_mmap_gtt.html

  * igt@kms_psr_stress_test@flip-primary-invalidate-overlay:
    - shard-tglb:         [PASS][116] -> [SKIP][117] ([i915#5519])
   [116]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-tglb7/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
   [117]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-tglb1/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html

  * igt@kms_writeback@writeback-check-output:
    - shard-skl:          NOTRUN -> [SKIP][118] ([fdo#109271] / [i915#2437])
   [118]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl7/igt@kms_writeback@writeback-check-output.html

  * igt@prime_nv_api@i915_nv_import_twice:
    - shard-tglb:         NOTRUN -> [SKIP][119] ([fdo#109291])
   [119]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-tglb1/igt@prime_nv_api@i915_nv_import_twice.html

  * igt@sysfs_clients@fair-7:
    - shard-apl:          NOTRUN -> [SKIP][120] ([fdo#109271] / [i915#2994]) +1 similar issue
   [120]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl1/igt@sysfs_clients@fair-7.html

  
#### Possible fixes ####

  * igt@fbdev@info:
    - {shard-rkl}:        [SKIP][121] ([i915#2582]) -> [PASS][122]
   [121]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-4/igt@fbdev@info.html
   [122]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@fbdev@info.html

  * igt@gem_eio@unwedge-stress:
    - shard-tglb:         [FAIL][123] ([i915#5784]) -> [PASS][124]
   [123]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-tglb3/igt@gem_eio@unwedge-stress.html
   [124]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-tglb7/igt@gem_eio@unwedge-stress.html
    - shard-iclb:         [TIMEOUT][125] ([i915#3070]) -> [PASS][126]
   [125]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-iclb4/igt@gem_eio@unwedge-stress.html
   [126]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb4/igt@gem_eio@unwedge-stress.html
    - {shard-rkl}:        [TIMEOUT][127] ([i915#3063]) -> [PASS][128]
   [127]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-6/igt@gem_eio@unwedge-stress.html
   [128]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-1/igt@gem_eio@unwedge-stress.html

  * igt@gem_exec_fair@basic-none@vcs0:
    - shard-apl:          [FAIL][129] ([i915#2842]) -> [PASS][130]
   [129]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-apl1/igt@gem_exec_fair@basic-none@vcs0.html
   [130]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl2/igt@gem_exec_fair@basic-none@vcs0.html
    - shard-glk:          [FAIL][131] ([i915#2842]) -> [PASS][132] +1 similar issue
   [131]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk1/igt@gem_exec_fair@basic-none@vcs0.html
   [132]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk5/igt@gem_exec_fair@basic-none@vcs0.html

  * igt@gem_exec_fair@basic-pace-share@rcs0:
    - {shard-rkl}:        [FAIL][133] ([i915#2842]) -> [PASS][134]
   [133]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-1/igt@gem_exec_fair@basic-pace-share@rcs0.html
   [134]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-4/igt@gem_exec_fair@basic-pace-share@rcs0.html

  * igt@gem_exec_suspend@basic-s0@smem:
    - {shard-rkl}:        [FAIL][135] ([fdo#103375]) -> [PASS][136]
   [135]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-4/igt@gem_exec_suspend@basic-s0@smem.html
   [136]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-5/igt@gem_exec_suspend@basic-s0@smem.html

  * igt@gem_exec_whisper@basic-queues-forked:
    - {shard-rkl}:        [INCOMPLETE][137] ([i915#5080]) -> [PASS][138] +1 similar issue
   [137]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-5/igt@gem_exec_whisper@basic-queues-forked.html
   [138]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-2/igt@gem_exec_whisper@basic-queues-forked.html

  * igt@gen9_exec_parse@allowed-single:
    - shard-kbl:          [DMESG-WARN][139] ([i915#5566] / [i915#716]) -> [PASS][140]
   [139]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl3/igt@gen9_exec_parse@allowed-single.html
   [140]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl7/igt@gen9_exec_parse@allowed-single.html

  * igt@i915_pm_dc@dc6-psr:
    - shard-iclb:         [FAIL][141] ([i915#454]) -> [PASS][142]
   [141]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-iclb3/igt@i915_pm_dc@dc6-psr.html
   [142]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb7/igt@i915_pm_dc@dc6-psr.html

  * igt@i915_pm_rpm@fences-dpms:
    - {shard-rkl}:        [SKIP][143] ([i915#1849]) -> [PASS][144] +1 similar issue
   [143]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-1/igt@i915_pm_rpm@fences-dpms.html
   [144]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@i915_pm_rpm@fences-dpms.html

  * igt@i915_pm_rpm@gem-mmap-type@uc:
    - {shard-rkl}:        [SKIP][145] ([fdo#109308]) -> [PASS][146] +3 similar issues
   [145]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-2/igt@i915_pm_rpm@gem-mmap-type@uc.html
   [146]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@i915_pm_rpm@gem-mmap-type@uc.html

  * igt@i915_pm_rps@min-max-config-idle:
    - {shard-rkl}:        [FAIL][147] ([i915#4016]) -> [PASS][148]
   [147]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-1/igt@i915_pm_rps@min-max-config-idle.html
   [148]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-2/igt@i915_pm_rps@min-max-config-idle.html

  * igt@i915_selftest@live@execlists:
    - shard-kbl:          [INCOMPLETE][149] ([i915#794]) -> [PASS][150]
   [149]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl6/igt@i915_selftest@live@execlists.html
   [150]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl6/igt@i915_selftest@live@execlists.html

  * igt@i915_selftest@live@hangcheck:
    - shard-tglb:         [DMESG-WARN][151] ([i915#5591]) -> [PASS][152]
   [151]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-tglb8/igt@i915_selftest@live@hangcheck.html
   [152]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-tglb3/igt@i915_selftest@live@hangcheck.html

  * igt@i915_selftest@perf@request:
    - shard-kbl:          [INCOMPLETE][153] -> [PASS][154]
   [153]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl6/igt@i915_selftest@perf@request.html
   [154]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl1/igt@i915_selftest@perf@request.html

  * igt@kms_atomic@plane-invalid-params:
    - {shard-dg1}:        [SKIP][155] ([i915#2575]) -> [PASS][156] +5 similar issues
   [155]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-dg1-16/igt@kms_atomic@plane-invalid-params.html
   [156]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-dg1-12/igt@kms_atomic@plane-invalid-params.html

  * igt@kms_ccs@pipe-a-crc-sprite-planes-basic-y_tiled_gen12_rc_ccs:
    - {shard-rkl}:        [SKIP][157] ([i915#1845] / [i915#4098]) -> [PASS][158] +8 similar issues
   [157]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-1/igt@kms_ccs@pipe-a-crc-sprite-planes-basic-y_tiled_gen12_rc_ccs.html
   [158]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@kms_ccs@pipe-a-crc-sprite-planes-basic-y_tiled_gen12_rc_ccs.html

  * igt@kms_color@pipe-a-legacy-gamma:
    - {shard-rkl}:        [SKIP][159] ([i915#1849] / [i915#4070] / [i915#4098]) -> [PASS][160] +3 similar issues
   [159]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-1/igt@kms_color@pipe-a-legacy-gamma.html
   [160]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@kms_color@pipe-a-legacy-gamma.html

  * igt@kms_color@pipe-b-legacy-gamma:
    - {shard-rkl}:        [SKIP][161] ([i915#4070] / [i915#4098]) -> [PASS][162]
   [161]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-4/igt@kms_color@pipe-b-legacy-gamma.html
   [162]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@kms_color@pipe-b-legacy-gamma.html

  * igt@kms_cursor_crc@pipe-a-cursor-128x42-sliding:
    - {shard-rkl}:        [SKIP][163] ([fdo#112022] / [i915#4070]) -> [PASS][164] +6 similar issues
   [163]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-5/igt@kms_cursor_crc@pipe-a-cursor-128x42-sliding.html
   [164]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@kms_cursor_crc@pipe-a-cursor-128x42-sliding.html

  * igt@kms_cursor_legacy@flip-vs-cursor-busy-crc-atomic:
    - {shard-rkl}:        [SKIP][165] ([fdo#111825] / [i915#4070]) -> [PASS][166] +4 similar issues
   [165]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-4/igt@kms_cursor_legacy@flip-vs-cursor-busy-crc-atomic.html
   [166]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@kms_cursor_legacy@flip-vs-cursor-busy-crc-atomic.html

  * igt@kms_cursor_legacy@pipe-c-forked-bo:
    - {shard-rkl}:        [SKIP][167] ([i915#4070]) -> [PASS][168] +1 similar issue
   [167]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-2/igt@kms_cursor_legacy@pipe-c-forked-bo.html
   [168]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-5/igt@kms_cursor_legacy@pipe-c-forked-bo.html

  * igt@kms_draw_crc@draw-method-xrgb8888-blt-xtiled:
    - {shard-rkl}:        [SKIP][169] ([fdo#111314] / [i915#4098] / [i915#4369]) -> [PASS][170] +5 similar issues
   [169]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-2/igt@kms_draw_crc@draw-method-xrgb8888-blt-xtiled.html
   [170]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@kms_draw_crc@draw-method-xrgb8888-blt-xtiled.html

  * igt@kms_draw_crc@draw-method-xrgb8888-mmap-gtt-untiled:
    - {shard-rkl}:        [SKIP][171] ([i915#4098] / [i915#4369]) -> [PASS][172]
   [171]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-4/igt@kms_draw_crc@draw-method-xrgb8888-mmap-gtt-untiled.html
   [172]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@kms_draw_crc@draw-method-xrgb8888-mmap-gtt-untiled.html

  * igt@kms_fbcon_fbt@psr:
    - {shard-rkl}:        [SKIP][173] ([fdo#110189] / [i915#3955]) -> [PASS][174]
   [173]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-1/igt@kms_fbcon_fbt@psr.html
   [174]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@kms_fbcon_fbt@psr.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a1-hdmi-a2:
    - shard-glk:          [FAIL][175] ([i915#79]) -> [PASS][176]
   [175]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk4/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a1-hdmi-a2.html
   [176]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk7/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a1-hdmi-a2.html

  * igt@kms_flip@flip-vs-expired-vblank@c-edp1:
    - shard-skl:          [FAIL][177] ([i915#79]) -> [PASS][178]
   [177]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-skl7/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html
   [178]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl6/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html

  * igt@kms_flip@flip-vs-suspend@c-dp1:
    - shard-kbl:          [DMESG-WARN][179] ([i915#180]) -> [PASS][180] +2 similar issues
   [179]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl4/igt@kms_flip@flip-vs-suspend@c-dp1.html
   [180]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl7/igt@kms_flip@flip-vs-suspend@c-dp1.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-upscaling:
    - shard-glk:          [FAIL][181] ([i915#4911]) -> [PASS][182]
   [181]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-glk8/igt@kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-upscaling.html
   [182]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-glk7/igt@kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling:
    - shard-iclb:         [SKIP][183] ([i915#3701]) -> [PASS][184] +1 similar issue
   [183]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-iclb2/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling.html
   [184]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb5/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-pgflip-blt:
    - {shard-rkl}:        [SKIP][185] ([i915#1849] / [i915#4098]) -> [PASS][186] +19 similar issues
   [185]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-1/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-pgflip-blt.html
   [186]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-pgflip-blt.html

  * igt@kms_invalid_mode@zero-clock:
    - {shard-rkl}:        [SKIP][187] ([i915#4278]) -> [PASS][188]
   [187]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-5/igt@kms_invalid_mode@zero-clock.html
   [188]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@kms_invalid_mode@zero-clock.html

  * igt@kms_plane@pixel-format@pipe-a-planes:
    - {shard-rkl}:        [SKIP][189] ([i915#1849] / [i915#3558]) -> [PASS][190] +1 similar issue
   [189]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-5/igt@kms_plane@pixel-format@pipe-a-planes.html
   [190]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@kms_plane@pixel-format@pipe-a-planes.html

  * igt@kms_plane_alpha_blend@pipe-c-coverage-7efc:
    - shard-skl:          [FAIL][191] ([fdo#108145] / [i915#265]) -> [PASS][192] +1 similar issue
   [191]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-skl6/igt@kms_plane_alpha_blend@pipe-c-coverage-7efc.html
   [192]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl10/igt@kms_plane_alpha_blend@pipe-c-coverage-7efc.html

  * igt@kms_psr@psr2_cursor_plane_onoff:
    - shard-iclb:         [SKIP][193] ([fdo#109441]) -> [PASS][194] +1 similar issue
   [193]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-iclb7/igt@kms_psr@psr2_cursor_plane_onoff.html
   [194]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb2/igt@kms_psr@psr2_cursor_plane_onoff.html

  * igt@kms_psr@sprite_render:
    - {shard-rkl}:        [SKIP][195] ([i915#1072]) -> [PASS][196] +1 similar issue
   [195]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-2/igt@kms_psr@sprite_render.html
   [196]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@kms_psr@sprite_render.html

  * igt@kms_psr_stress_test@invalidate-primary-flip-overlay:
    - shard-tglb:         [SKIP][197] ([i915#5519]) -> [PASS][198]
   [197]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-tglb6/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html
   [198]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-tglb1/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html

  * igt@kms_universal_plane@universal-plane-pipe-a-sanity:
    - {shard-rkl}:        [SKIP][199] ([i915#1845] / [i915#4070] / [i915#4098]) -> [PASS][200] +1 similar issue
   [199]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-rkl-1/igt@kms_universal_plane@universal-plane-pipe-a-sanity.html
   [200]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-rkl-6/igt@kms_universal_plane@universal-plane-pipe-a-sanity.html

  * igt@kms_vblank@pipe-a-ts-continuation-suspend:
    - shard-apl:          [DMESG-WARN][201] ([i915#180]) -> [PASS][202] +2 similar issues
   [201]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-apl3/igt@kms_vblank@pipe-a-ts-continuation-suspend.html
   [202]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl7/igt@kms_vblank@pipe-a-ts-continuation-suspend.html
    - shard-skl:          [INCOMPLETE][203] ([i915#4939]) -> [PASS][204] +1 similar issue
   [203]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-skl7/igt@kms_vblank@pipe-a-ts-continuation-suspend.html
   [204]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl7/igt@kms_vblank@pipe-a-ts-continuation-suspend.html

  * igt@perf@polling-parameterized:
    - shard-skl:          [FAIL][205] ([i915#5639]) -> [PASS][206]
   [205]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-skl10/igt@perf@polling-parameterized.html
   [206]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl9/igt@perf@polling-parameterized.html

  * igt@perf_pmu@module-unload:
    - shard-skl:          [DMESG-WARN][207] ([i915#1982]) -> [PASS][208]
   [207]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-skl9/igt@perf_pmu@module-unload.html
   [208]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl1/igt@perf_pmu@module-unload.html

  * igt@sysfs_heartbeat_interval@mixed@bcs0:
    - shard-skl:          [FAIL][209] ([i915#1731]) -> [PASS][210]
   [209]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-skl4/igt@sysfs_heartbeat_interval@mixed@bcs0.html
   [210]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl6/igt@sysfs_heartbeat_interval@mixed@bcs0.html

  * igt@sysfs_heartbeat_interval@mixed@rcs0:
    - shard-skl:          [WARN][211] ([i915#4055]) -> [PASS][212]
   [211]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-skl4/igt@sysfs_heartbeat_interval@mixed@rcs0.html
   [212]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-skl6/igt@sysfs_heartbeat_interval@mixed@rcs0.html

  
#### Warnings ####

  * igt@gem_exec_balancer@parallel-keep-submit-fence:
    - shard-iclb:         [DMESG-WARN][213] ([i915#5614]) -> [SKIP][214] ([i915#4525])
   [213]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-iclb2/igt@gem_exec_balancer@parallel-keep-submit-fence.html
   [214]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb3/igt@gem_exec_balancer@parallel-keep-submit-fence.html

  * igt@gem_exec_balancer@parallel-out-fence:
    - shard-iclb:         [SKIP][215] ([i915#4525]) -> [DMESG-WARN][216] ([i915#5614]) +3 similar issues
   [215]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-iclb8/igt@gem_exec_balancer@parallel-out-fence.html
   [216]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb2/igt@gem_exec_balancer@parallel-out-fence.html

  * igt@kms_psr2_sf@overlay-plane-update-continuous-sf:
    - shard-iclb:         [SKIP][217] ([i915#2920]) -> [SKIP][218] ([fdo#111068] / [i915#658])
   [217]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-iclb2/igt@kms_psr2_sf@overlay-plane-update-continuous-sf.html
   [218]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-iclb3/igt@kms_psr2_sf@overlay-plane-update-continuous-sf.html

  * igt@runner@aborted:
    - shard-kbl:          ([FAIL][219], [FAIL][220], [FAIL][221], [FAIL][222], [FAIL][223], [FAIL][224], [FAIL][225], [FAIL][226], [FAIL][227], [FAIL][228], [FAIL][229], [FAIL][230], [FAIL][231], [FAIL][232]) ([fdo#109271] / [i915#180] / [i915#3002] / [i915#4312] / [i915#5257] / [i915#716] / [i915#92]) -> ([FAIL][233], [FAIL][234], [FAIL][235], [FAIL][236], [FAIL][237], [FAIL][238], [FAIL][239], [FAIL][240], [FAIL][241], [FAIL][242], [FAIL][243], [FAIL][244], [FAIL][245], [FAIL][246], [FAIL][247]) ([i915#180] / [i915#3002] / [i915#4312] / [i915#5257])
   [219]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl7/igt@runner@aborted.html
   [220]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl7/igt@runner@aborted.html
   [221]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl7/igt@runner@aborted.html
   [222]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl1/igt@runner@aborted.html
   [223]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl3/igt@runner@aborted.html
   [224]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl4/igt@runner@aborted.html
   [225]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl7/igt@runner@aborted.html
   [226]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl7/igt@runner@aborted.html
   [227]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl7/igt@runner@aborted.html
   [228]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl3/igt@runner@aborted.html
   [229]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl6/igt@runner@aborted.html
   [230]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl6/igt@runner@aborted.html
   [231]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl6/igt@runner@aborted.html
   [232]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-kbl1/igt@runner@aborted.html
   [233]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl1/igt@runner@aborted.html
   [234]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl7/igt@runner@aborted.html
   [235]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl7/igt@runner@aborted.html
   [236]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl3/igt@runner@aborted.html
   [237]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl4/igt@runner@aborted.html
   [238]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl6/igt@runner@aborted.html
   [239]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl3/igt@runner@aborted.html
   [240]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl4/igt@runner@aborted.html
   [241]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl6/igt@runner@aborted.html
   [242]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl3/igt@runner@aborted.html
   [243]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl4/igt@runner@aborted.html
   [244]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl4/igt@runner@aborted.html
   [245]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl6/igt@runner@aborted.html
   [246]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl4/igt@runner@aborted.html
   [247]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-kbl6/igt@runner@aborted.html
    - shard-apl:          ([FAIL][248], [FAIL][249], [FAIL][250], [FAIL][251], [FAIL][252], [FAIL][253], [FAIL][254]) ([fdo#109271] / [i915#180] / [i915#3002] / [i915#4312] / [i915#5257]) -> ([FAIL][255], [FAIL][256], [FAIL][257], [FAIL][258], [FAIL][259], [FAIL][260]) ([i915#180] / [i915#3002] / [i915#4312] / [i915#5257])
   [248]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-apl6/igt@runner@aborted.html
   [249]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-apl2/igt@runner@aborted.html
   [250]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-apl3/igt@runner@aborted.html
   [251]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-apl2/igt@runner@aborted.html
   [252]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-apl4/igt@runner@aborted.html
   [253]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-apl2/igt@runner@aborted.html
   [254]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11588/shard-apl7/igt@runner@aborted.html
   [255]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl4/igt@runner@aborted.html
   [256]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl4/igt@runner@aborted.html
   [257]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl8/igt@runner@aborted.html
   [258]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl4/igt@runner@aborted.html
   [259]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl1/igt@runner@aborted.html
   [260]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_103458v1/shard-apl3/igt@runner@aborted.html

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

  [fdo#103375]: https://bugs.freedesktop.org/show_bug.cgi?id=103375
  [fdo#108145]: https://bugs.freedesktop.org/show_bug.cgi?id=108145
  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109274]: https://bugs.freedesktop.org/show_bug.cgi?id=109274
  [fdo#109278]: https://bugs.freedesktop.org/show_bug.cgi?id=109278
  [fdo#109279]: https://bugs.freedesktop.org/show_bug.cgi?id=109279
  [fdo#109280]: https://bugs.freedesktop.org/show_bug.cgi?id=109280
  [fdo#109283]: https://bugs.freedesktop.org/show_bug.cgi?id=109283
  [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285
  [fdo#109289]: https://bugs.freedesktop.org/show_bug.cgi?id=109289
  [fdo#109291]: https://bugs.freedesktop.org/show_bug.cgi?id=109291
  [fdo#109295]: https://bugs.freedesktop.org/show_bug.cgi?id=109295
  [fdo#109303]: https://bugs.freedesktop.org/show_bug.cgi?id=109303
  [fdo#109307]: https://bugs.freedesktop.org/show_bug.cgi?id=109307
  [fdo#109308]: https://bugs.freedesktop.org/show_bug.cgi?id=109308
  [fdo#109309]: https://bugs.freedesktop.org/show_bug.cgi?id=109309
  [fdo#109312]: https://bugs.freedesktop.org/show_bug.cgi?id=109312
  [fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
  [fdo#109642]: https://bugs.freedesktop.org/show_bug.cgi?id=109642
  [fdo#110189]: https://bugs.freedesktop.org/show_bug.cgi?id=110189
  [fdo#110723]: https://bugs.freedesktop.org/show_bug.cgi?id=110723
  [fdo#110725]: https://bugs.freedesktop.org/show_bug.cgi?id=110725
  [fdo#111068]: https://bugs.freedesktop.org/show_bug.cgi?id=111068
  [fdo#111314]: https://bugs.freedesktop.org/show_bug.cgi?id=111314
  [fdo#111614]: https://bugs.freedesktop.org/show_bug.cgi?id=111614
  [fdo#111615]: https://bugs.freedesktop.org/show_bug.cgi?id=111615
  [fdo#111644]: https://bugs.freedesktop.org/show_bug.cgi?id=111644
  [fdo#111656]: https://bugs.freedesktop.org/show_bug.cgi?id=111656
  [fdo#111825]: https://bugs.freedesktop.org/show_bug.cgi?id=111825
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [fdo#112022]: https://bugs.freedesktop.org/show_bug.cgi?id=112022
  [fdo#112054]: https://bugs.freedesktop.org/show_bug.cgi?id=112054
  [fdo#112283]: https://bugs.freedesktop.org/show_bug.cgi?id=112283
  [i915#1063]: https://gitlab.freedesktop.org/drm/intel/issues/1063
  [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
  [i915#1149]: https://gitlab.freedesktop.org/drm/intel/issues/1149
  [i915#1155]: https://gitlab.freedesktop.org/drm/intel/issues/1155
  [i915#118]: https://gitlab.freedesktop.org/drm/intel/issues/118
  [i915#132]: https://gitlab.freedesktop.org/drm/intel/issues/132
  [i915#1397]: https://gitlab.freedesktop.org/drm/intel/issues/1397
  [i915#1722]: https://gitlab.freedesktop.org/drm/intel/issues/1722
  [i915#1731]: https://gitlab.freedesktop.org/drm/intel/issues/1731
  [i915#180]: https://gitlab.freedesktop.org/drm/intel/issues/180
  [i915#1825]: https://gitlab.freedesktop.org/drm/intel/issues/1825
  [i915#1839]: https://gitlab.freedesktop.org/drm/intel/issues/1839
  [i915#1845]: https://gitlab.freedesktop.org/drm/intel/issues/1845
  [i915#1849]: https://gitlab.freedesktop.org/drm/intel/issues/1849
  [i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
  [i915#2410]: https://gitlab.freedesktop.org/drm/intel/issues/2410
  [i915#2433]: https://gitlab.freedesktop.org/drm/intel/issues/2433
  [i915#2435]: https://gitlab.freedesktop.org/drm/intel/issues/2435
  [i915#2437]: https://gitlab.freedesktop.org/drm/intel/issues/2437
  [i915#2521]: https://gitlab.freedesktop.org/drm/intel/issues/2521
  [i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527
  [i915#2530]: https://gitlab.freedesktop.org/drm/intel/issues/2530
  [i915#2575]: https://gitlab.freedesktop.org/drm/intel/issues/2575
  [i915#2582]: https://gitlab.freedesktop.org/drm/intel/issues/2582
  [i915#2587]: https://gitlab.freedesktop.org/drm/intel/issues/2587
  [i915#265]: https://gitlab.freedesktop.org/drm/intel/issues/265
  [i915#2684]: https://gitlab.freedesktop.org/drm/intel/issues/2684
  [i915#2705]: https://gitlab.freedesktop.org/drm/intel/issues/2705
  [i915#280]: https://gitlab.freedesktop.org/drm/intel/issues/280
  [i915#284]: https://gitlab.freedesktop.org/drm/intel/issues/284
  [i915#2842]: https://gitlab.freedesktop.org/drm/intel/issues/2842
  [i915#2856]: https://gitlab.freedesktop.org/drm/intel/issues/2856
  [i915#2920]: https://gitlab.freedesktop.org/drm/intel/issues/2920
  [i915#2994]: https://gitlab.freedesktop.org/drm/intel/issues/2994
  [i915#3002]: https://gitlab.freedesktop.org/drm/intel/issues/3002
  [i915#3012]: https://gitlab.freedesktop.org/drm/intel/issues/3012
  [i915#3063]: https://gitlab.freedesktop.org/drm/intel/issues/3063
  [i915#3070]: https://gitlab.freedesktop.org/drm/intel/issues/3070
  [i915#3116]: https://gitlab.freedesktop.org/drm/intel/issues/3116
  [i915#3281]: https://gitlab.freedesktop.org/drm/intel/issues/3281
  [i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
  [i915#3291]: https://gitlab.freedesktop.org/drm/intel/issues/3291
  [i915#3297]: https://gitlab.freedesktop.org/drm/intel/issues/3297
  [i915#3299]: https://gitlab.freedesktop.org/drm/intel/issues/3299
  [i915#3319]: https://gitlab.freedesktop.org/drm/intel/issues/3319
  [i915#3323]: https://gitlab.freedesktop.org/drm/intel/issues/3323
  [i915#3359]: https://gitlab.freedesktop.org/drm/intel/issues/3359
  [i915#3376]: https://gitlab.freedesktop.org/drm/intel/issues/3376
  [i915#3458]: https://gitlab.freedesktop.org/drm/intel/issues/3458
  [i915#3464]: https://gitlab.freedesktop.org/drm/intel/issues/3464
  [i915#3467]: https://gitlab.freedesktop.org/drm/intel/issues/3467
  [i915#3469]: https://gitlab.freedesktop.org/drm/intel/issues/3469
  [i915#3536]: https://gitlab.freedesktop.org/drm/intel/issues/3536
  [i915#3539]: https://gitlab.freedesktop.org/drm/intel/issues/3539
  [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555
  [i915#3558]: https://gitlab.freedesktop.org/drm/intel/issues/3558
  [i915#3637]: https://gitlab.freedesktop.org/drm/intel/issues/3637
  [i915#3638]: https://gitlab.freedesktop.org/drm/intel/issues/3638
  [i915#3689]: https://gitlab.freedesktop.org/drm/intel/issues/3689
  [i915#3701]: https://gitlab.freedesktop.org/drm/intel/issues/3701
  [i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708
  [i915#3734]: https://gitlab.freedesktop.org/drm/intel/issues/3734
  [i915#3828]: https://gitlab.freedesktop.org/drm/intel/issues/3828
  [i915#3840]: https://gitlab.freedesktop.org/drm/intel/issues/3840
  [i915#3886]: https://gitlab.freedesktop.org/drm/intel/issues/3886
  [i915#3952]: https://gitlab.freedesktop.org/drm/intel/issues/3952
  [i915#3955]: https://gitlab.freedesktop.org/drm/intel/issues/3955
  [i915#3987]: https://gitlab.freedesktop.org/drm/intel/issues/3987
  [i915#4016]: https://gitlab.freedesktop.org/drm/intel/issues/4016
  [i915#4055]: https://gitlab.freedesktop.org/drm/intel/issues/4055
  [i915#4070]: https://gitlab.freedesktop.org/drm/intel/issues/4070
  [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#4098]: https://gitlab.freedesktop.org/drm/intel/issues/4098
  [i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103
  [i915#4212]: https://gitlab.freedesktop.org/drm/intel/issues/4212
  [i915#4270]: https://gitlab.freedesktop.org/drm/intel/issues/4270
  [i915#4278]: https://gitlab.freedesktop.org/drm/intel/issues/4278
  [i915#4312]: https://gitlab.freedesktop.org/drm/intel/issues/4312
  [i915#4369]: https://gitlab.freedesktop.org/drm/intel/issues/4369
  [i915#4392]: https://gitlab.freedesktop.org/drm/intel/issues/4392
  [i915#4525]: https://gitlab.freedesktop.org/drm/intel/issues/4525
  [i915#4538]: https://gitlab.freedesktop.org/drm/intel/issues/4538
  [i915#454]: https://gitlab.freedesktop.org/drm/intel/issues/454
  [i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
  [i915#4767]: https://gitlab.freedesktop.org/drm/intel/issues/4767
  [i915#4812]: https://gitlab.freedesktop.org/drm/intel/issues/4812
  [i915#4833]: https://gitlab.freedesktop.org/drm/intel/issues/4833
  [i915#4842]: https://gitlab.freedesktop.org/drm/intel/issues/4842
  [i915#4852]: https://gitlab.freedesktop.org/drm/intel/issues/4852
  [i915#4853]: https://gitlab.freedesktop.org/drm/intel/issues/4853
  [i915#4859]: https://gitlab.freedesktop.org/drm/intel/issues/4859
  [i915#4860]: https://gitlab.freedesktop.org/drm/intel/issues/4860
  [i915#4873]: https://gitlab.freedesktop.org/drm/intel/issues/4873
  [i915#4877]: https://gitlab.freedesktop.org/drm/intel/issues/4877
  [i915#4886]: https://gitlab.freedesktop.org/drm/intel/issues/4886
  [i915#4893]: https://gitlab.freedesktop.org/drm/intel/issues/4893
  [i915#4911]: https://gitlab.freedesktop.org/drm/intel/issues/4911
  [i915#4939]: https://gitlab.freedesktop.org/drm/intel/issues/4939
  [i915#4991]: https://gitlab.freedesktop.org/drm/intel/issues/4991
  [i915#5030]: https://gitlab.freedesktop.org/drm/intel/issues/5030
  [i915#5076]: https://gitlab.freedesktop.org/drm/intel/issues/5076
  [i915#5080]: https://gitlab.freedesktop.org/drm/intel/issues/5080
  [i915#5098]: https://gitlab.freedesktop.org/drm/intel/issues/5098
  [i915#5176]: https://gitlab.freedesktop.org/drm/intel/issues/5176
  [i915#5182]: https://gitlab.freedesktop.org/drm/intel/issues/5182
  [i915#5235]: https://gitlab.freedesktop.org/drm/intel/issues/5235
  [i915#5257]: https://gitlab.freedesktop.org/drm/intel/issues/5257
  [i915#5286]: https://gitlab.freedesktop.org/drm/intel/issues/5286
  [i915#5287]: https://gitlab.freedesktop.org/drm/intel/issues/5287
  [i915#5288]: https://gitlab.freedesktop.org/drm/intel/issues/5288
  [i915#5325]: https://gitlab.freedesktop.org/drm/intel/issues/5325
  [i915#533]: https://gitlab.freedesktop.org/drm/intel/issues/533
  [i915#5439]: https://gitlab.freedesktop.org/drm/intel/issues/5439
  [i915#5519]: https://gitlab.freedesktop.org/drm/intel/issues/5519
  [i915#5563]: https://gitlab.freedesktop.org/drm/intel/issues/5563
  [i915#5566]: https://gitlab.freedesktop.org/drm/intel/issues/5566
  [i915#5591]: https://gitlab.freedesktop.org/drm/intel/issues/5591
  [i915#5614]: https://gitlab.freedesktop.org/drm/intel/issues/5614
  [i915#5639]: https://gitlab.freedesktop.org/drm/intel/issues/5639
  [i915#5687]: https://gitlab.freedesktop.org/drm/intel/issues/5687
  [i915#5784]: https://gitlab.freedesktop.org/drm/intel/issues/5784
  [i915#5849]: https://gitlab.freedesktop.org/drm/intel/issues/5849
  [i915#658]: https://gitlab.freedesktop.org/drm/intel/issues/658
  [i915#716]: https://gitlab.freedesktop.org/drm/intel/issues/716
  [i915#79]: https://gitlab.freedesktop.org/drm/intel/issues/79
  [i915#794]: https://gitlab.freedesktop.org/drm/intel/issues/794
  [i915#92]: https://gitlab.freedesktop.org/drm/intel/issues/92


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

  * Linux: CI_DRM_11588 -> Patchwork_103458v1

  CI-20190529: 20190529
  CI_DRM_11588: 68f638d8e33ee3d6110a6798b823f88e07eaef1f @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_6464: eddc67c5c85b8ee6eb4d13752ca43da5073dc985 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  Patchwork_103458v1: 68f638d8e33ee3d6110a6798b823f88e07eaef1f @ 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_103458v1/index.html

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

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

* Re: [Intel-gfx] [PATCH v2 3/3] drm/i915/display: Implement seamless mode switch
  2022-05-02 20:41 ` [Intel-gfx] [PATCH v2 3/3] drm/i915/display: Implement seamless mode switch José Roberto de Souza
@ 2022-05-09 15:13   ` Srinivas, Vidya
  2022-05-25  4:18     ` Srinivas, Vidya
  0 siblings, 1 reply; 10+ messages in thread
From: Srinivas, Vidya @ 2022-05-09 15:13 UTC (permalink / raw)
  To: Souza, Jose, intel-gfx; +Cc: Sean Paul

Hello Jose,

Thanks much for the patch. I tested it on chrome system and the patch works.
Adding my Tested-by.
Tested-by: Vidya Srinivas <vidya.srinivas@intel.com>

Regards
Vidya

> -----Original Message-----
> From: Souza, Jose <jose.souza@intel.com>
> Sent: Tuesday, May 3, 2022 2:11 AM
> To: intel-gfx@lists.freedesktop.org
> Cc: Srinivas, Vidya <vidya.srinivas@intel.com>; Sean Paul
> <seanpaul@chromium.org>; Ville Syrjälä <ville.syrjala@linux.intel.com>;
> Souza, Jose <jose.souza@intel.com>
> Subject: [PATCH v2 3/3] drm/i915/display: Implement seamless mode switch
> 
> So far the i915's DRRS feature was automatically changing between preferred
> panel mode and downclock mode based on idleness but ChromeOS
> compositor team is asking to be in control of the mode switch.
> So for certain types of content it can switch to a mode with a lower refresh
> rate without the user noticing a thing and saving more power.
> 
> This seamless mode switch will be triggered when user-space dispatches an
> atomic commit with the new mode and clears the
> DRM_MODE_ATOMIC_ALLOW_MODESET flag.
> 
> The main steps to acomplish that are:
> 
> - as mode changed in atomic state drm_atomic_helper_check_modeset() will
> set mode_changed and it will trigger the crtc state computation so
> intel_dp_compute_config() will be called and dp_m_n will be computed for
> the new mode
> 
> - then intel_dp_drrs_compute_config() will check for the necessary
> conditions to do a seamless mode switch, if possible crtc_state-
> >seamless_mode_switch will be set and has_drrs will not be set, so i915 will
> not automatically switch between modes
> 
> - then intel_crtc_compute_config() will call
> intel_crtc_compute_pixel_rate() that will take the hint that it is trying to do a
> seamless mode switch and set pixel_rate to the pixel_rate of the old state
> 
> - then if nothing else changed in the state intel_crtc_check_fastset() will be
> able to set mode_changed to false and i915 can do fastset otherwise the
> commit will fail during the check phase
> 
> - now on the atomic commit phase, intel_ddi_update_pipe_dp() will be
> called and will program the new dp_m_n
> 
> - nothing else is different in the commit phase until the step to verify
> programmed state, the most important change here is that need to save the
> pixel_rate in DRRS global state as there is no other way to get that from
> hardware or atomic state
> 
> v2:
> - not overwritten dp_m_n values in intel_crtc_copy_fastset() when doing a
> seamless_mode_switch
> 
> Cc: Vidya Srinivas <vidya.srinivas@intel.com>
> Cc: Sean Paul <seanpaul@chromium.org>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_ddi.c      | 10 +++
>  drivers/gpu/drm/i915/display/intel_display.c  | 61 ++++++++++++++++---
> .../drm/i915/display/intel_display_debugfs.c  |  3 +
>  .../drm/i915/display/intel_display_types.h    |  3 +
>  drivers/gpu/drm/i915/display/intel_dp.c       | 56 ++++++++++++++---
>  drivers/gpu/drm/i915/display/intel_drrs.c     | 38 +++++++++---
>  drivers/gpu/drm/i915/display/intel_drrs.h     |  3 +
>  7 files changed, 151 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c
> b/drivers/gpu/drm/i915/display/intel_ddi.c
> index 9e6fa59eabba7..732e5d425412e 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -46,6 +46,7 @@
>  #include "intel_dp_link_training.h"
>  #include "intel_dp_mst.h"
>  #include "intel_dpio_phy.h"
> +#include "intel_drrs.h"
>  #include "intel_dsi.h"
>  #include "intel_fdi.h"
>  #include "intel_fifo_underrun.h"
> @@ -3010,6 +3011,14 @@ static void intel_ddi_update_pipe_dp(struct
> intel_atomic_state *state,
> 
>  	intel_backlight_update(state, encoder, crtc_state, conn_state);
>  	drm_connector_update_privacy_screen(conn_state);
> +
> +	if (crtc_state->seamless_mode_switch) {
> +		struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state-
> >uapi.crtc);
> +
> +		intel_cpu_transcoder_set_m1_n1(intel_crtc,
> +					       crtc_state->cpu_transcoder,
> +					       &crtc_state->dp_m_n);
> +	}
>  }
> 
>  void intel_ddi_update_pipe(struct intel_atomic_state *state, @@ -3484,6
> +3493,7 @@ static void intel_ddi_get_config(struct intel_encoder *encoder,
>  	intel_read_dp_sdp(encoder, pipe_config, DP_SDP_VSC);
> 
>  	intel_psr_get_config(encoder, pipe_config);
> +	intel_drrs_get_config(encoder, pipe_config);
>  }
> 
>  void intel_ddi_get_clock(struct intel_encoder *encoder, diff --git
> a/drivers/gpu/drm/i915/display/intel_display.c
> b/drivers/gpu/drm/i915/display/intel_display.c
> index 17d0cad9e1686..e54fbe3b1d394 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -2629,6 +2629,44 @@ static void intel_crtc_compute_pixel_rate(struct
> intel_crtc_state *crtc_state)
>  	else
>  		crtc_state->pixel_rate =
>  			ilk_pipe_pixel_rate(crtc_state);
> +
> +	/*
> +	 * Do not change pixel_rate when doing seamless mode switch,
> otherwise
> +	 * it will change port_clock and other stuff that will need a modeset
> +	 * to be programmed
> +	 */
> +	if (crtc_state->seamless_mode_switch) {
> +		struct intel_atomic_state *state =
> to_intel_atomic_state(crtc_state->uapi.state);
> +		struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> +		const struct intel_crtc_state *old_crtc_state;
> +
> +		old_crtc_state = intel_atomic_get_old_crtc_state(state, crtc);
> +
> +		/*
> +		 * It can only seamless switch if pixel rate of the new mode is
> +		 * <= than old one, if not commit will fail with pixel_rate
> +		 * mismatch.
> +		 */
> +		if (crtc_state->pixel_rate < old_crtc_state->pixel_rate ||
> +		    intel_fuzzy_clock_check(crtc_state->pixel_rate,
> +					    old_crtc_state->pixel_rate))
> +			crtc_state->pixel_rate = old_crtc_state->pixel_rate;
> +	}
> +}
> +
> +static void intel_crtc_get_pixel_rate(struct intel_crtc_state
> +*crtc_state) {
> +	if (crtc_state->seamless_mode_switch) {
> +		struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> +
> +		mutex_lock(&crtc->drrs.mutex);
> +		crtc_state->pixel_rate = crtc-
> >drrs.seamless_mode_switch_pixel_rate;
> +		mutex_unlock(&crtc->drrs.mutex);
> +
> +		return;
> +	}
> +
> +	intel_crtc_compute_pixel_rate(crtc_state);
>  }
> 
>  static void intel_bigjoiner_adjust_timings(const struct intel_crtc_state
> *crtc_state, @@ -2705,7 +2743,7 @@ static void
> intel_crtc_readout_derived_state(struct intel_crtc_state *crtc_state
>  	intel_bigjoiner_adjust_timings(crtc_state, pipe_mode);
>  	intel_mode_from_crtc_timings(pipe_mode, pipe_mode);
> 
> -	intel_crtc_compute_pixel_rate(crtc_state);
> +	intel_crtc_get_pixel_rate(crtc_state);
>  }
> 
>  static void intel_encoder_get_config(struct intel_encoder *encoder, @@ -
> 6182,11 +6220,13 @@ intel_pipe_config_compare(const struct
> intel_crtc_state *current_config,
>  	PIPE_CONF_CHECK_I(lane_count);
>  	PIPE_CONF_CHECK_X(lane_lat_optim_mask);
> 
> -	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv)) {
> -		PIPE_CONF_CHECK_M_N_ALT(dp_m_n, dp_m2_n2);
> -	} else {
> -		PIPE_CONF_CHECK_M_N(dp_m_n);
> -		PIPE_CONF_CHECK_M_N(dp_m2_n2);
> +	if (!pipe_config->seamless_mode_switch) {
> +		if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
> {
> +			PIPE_CONF_CHECK_M_N_ALT(dp_m_n, dp_m2_n2);
> +		} else {
> +			PIPE_CONF_CHECK_M_N(dp_m_n);
> +			PIPE_CONF_CHECK_M_N(dp_m2_n2);
> +		}
>  	}
> 
>  	PIPE_CONF_CHECK_X(output_types);
> @@ -6348,8 +6388,10 @@ intel_pipe_config_compare(const struct
> intel_crtc_state *current_config,
>  	if (IS_G4X(dev_priv) || DISPLAY_VER(dev_priv) >= 5)
>  		PIPE_CONF_CHECK_I(pipe_bpp);
> 
> -	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.pipe_mode.crtc_clock);
> -	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.adjusted_mode.crtc_clock);
> +	if (!pipe_config->seamless_mode_switch) {
> +		PIPE_CONF_CHECK_CLOCK_FUZZY(hw.pipe_mode.crtc_clock);
> +
> 	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.adjusted_mode.crtc_clock);
> +	}
>  	PIPE_CONF_CHECK_CLOCK_FUZZY(port_clock);
> 
>  	PIPE_CONF_CHECK_I(min_voltage_level);
> @@ -7085,11 +7127,12 @@ static void intel_crtc_copy_fastset(const struct
> intel_crtc_state *old_crtc_stat
>  	 * FIXME: should really copy more fuzzy state here
>  	 */
>  	new_crtc_state->fdi_m_n = old_crtc_state->fdi_m_n;
> -	new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
> 
>  	if (!intel_drrs_crtc_copy_fastset(old_crtc_state, new_crtc_state)) {
> +		new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
>  		new_crtc_state->dp_m2_n2 = old_crtc_state->dp_m2_n2;
>  		new_crtc_state->has_drrs = old_crtc_state->has_drrs;
> +		new_crtc_state->seamless_mode_switch =
> +old_crtc_state->seamless_mode_switch;
>  	}
>  }
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> index 452d773fd4e34..92099e1f0b23e 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> @@ -1108,6 +1108,9 @@ static int i915_drrs_status(struct seq_file *m, void
> *unused)
>  			   crtc->drrs.refresh_rate ==
> DRRS_REFRESH_RATE_LOW ?
>  			   "low" : "high");
> 
> +		seq_printf(m, "Seamless mode switch enabled: %s\n",
> +			   str_yes_no(crtc-
> >drrs.seamless_mode_switch_pixel_rate));
> +
>  		mutex_unlock(&crtc->drrs.mutex);
>  	}
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 408152f9f46a4..e290366adfc27 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1057,6 +1057,7 @@ struct intel_crtc_state {
>  	/* m2_n2 for eDP downclock */
>  	struct intel_link_m_n dp_m2_n2;
>  	bool has_drrs;
> +	bool seamless_mode_switch;
> 
>  	/* PSR is supported but might not be enabled due the lack of enabled
> planes */
>  	bool has_psr;
> @@ -1314,6 +1315,8 @@ struct intel_crtc {
>  		unsigned int busy_frontbuffer_bits;
>  		enum transcoder cpu_transcoder;
>  		struct intel_link_m_n m_n, m2_n2;
> +		/* Only used to verify if programmed state matches */
> +		unsigned int seamless_mode_switch_pixel_rate;
>  	} drrs;
> 
>  	int scanline_offset;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> b/drivers/gpu/drm/i915/display/intel_dp.c
> index cc9be82e128f4..691d362dde95e 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -1844,8 +1844,7 @@ static bool cpu_transcoder_has_drrs(struct
> drm_i915_private *i915,  }
> 
>  static bool can_enable_drrs(struct intel_connector *connector,
> -			    const struct intel_crtc_state *pipe_config,
> -			    const struct drm_display_mode
> *downclock_mode)
> +			    const struct intel_crtc_state *pipe_config)
>  {
>  	struct drm_i915_private *i915 = to_i915(connector->base.dev);
> 
> @@ -1868,8 +1867,40 @@ static bool can_enable_drrs(struct
> intel_connector *connector,
>  	if (!cpu_transcoder_has_drrs(i915, pipe_config->cpu_transcoder))
>  		return false;
> 
> -	return downclock_mode &&
> -		intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS;
> +	return intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS; }
> +
> +static bool can_seamless_switch_mode(struct intel_crtc_state
> +*pipe_config) {
> +	struct drm_i915_private *i915 = to_i915(pipe_config->uapi.crtc-
> >dev);
> +	const struct intel_crtc_state *old_pipe_config;
> +	struct intel_atomic_state *state;
> +	struct intel_crtc *intel_crtc;
> +
> +	/* Only supported in platforms that can switch m_n on the fly */
> +	if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config-
> >cpu_transcoder))
> +		return false;
> +
> +	state = to_intel_atomic_state(pipe_config->uapi.state);
> +	if (state->base.allow_modeset)
> +		return false;
> +
> +	intel_crtc = to_intel_crtc(pipe_config->uapi.crtc);
> +	old_pipe_config = intel_atomic_get_old_crtc_state(state, intel_crtc);
> +	if (drm_mode_equal(&old_pipe_config->hw.adjusted_mode,
> +			   &pipe_config->hw.adjusted_mode))
> +		return false;
> +
> +	/* Only clock can change */
> +	if (!drm_mode_match(&old_pipe_config->hw.adjusted_mode,
> +			    &pipe_config->hw.adjusted_mode,
> +			    DRM_MODE_MATCH_TIMINGS |
> +			    DRM_MODE_MATCH_FLAGS |
> +			    DRM_MODE_MATCH_3D_FLAGS |
> +			    DRM_MODE_MATCH_ASPECT_RATIO))
> +		return false;
> +
> +	return true;
>  }
> 
>  static void
> @@ -1882,12 +1913,17 @@ intel_dp_drrs_compute_config(struct
> intel_connector *connector,
>  		intel_panel_downclock_mode(connector, &pipe_config-
> >hw.adjusted_mode);
>  	int pixel_clock;
> 
> -	if (!can_enable_drrs(connector, pipe_config, downclock_mode)) {
> -		if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config-
> >cpu_transcoder))
> -			intel_zero_m_n(&pipe_config->dp_m2_n2);
> +	if (!can_enable_drrs(connector, pipe_config))
> +		goto not_supported;
> +
> +	if (can_seamless_switch_mode(pipe_config)) {
> +		pipe_config->seamless_mode_switch = true;
>  		return;
>  	}
> 
> +	if (!downclock_mode)
> +		goto not_supported;
> +
>  	if (IS_IRONLAKE(i915) || IS_SANDYBRIDGE(i915) ||
> IS_IVYBRIDGE(i915))
>  		pipe_config->msa_timing_delay = i915-
> >vbt.edp.drrs_msa_timing_delay;
> 
> @@ -1904,6 +1940,12 @@ intel_dp_drrs_compute_config(struct
> intel_connector *connector,
>  	/* FIXME: abstract this better */
>  	if (pipe_config->splitter.enable)
>  		pipe_config->dp_m2_n2.data_m *= pipe_config-
> >splitter.link_count;
> +
> +	return;
> +
> +not_supported:
> +	if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config-
> >cpu_transcoder))
> +		intel_zero_m_n(&pipe_config->dp_m2_n2);
>  }
> 
>  static bool intel_dp_has_audio(struct intel_encoder *encoder, diff --git
> a/drivers/gpu/drm/i915/display/intel_drrs.c
> b/drivers/gpu/drm/i915/display/intel_drrs.c
> index d266fad83a086..ffd51d2f5998d 100644
> --- a/drivers/gpu/drm/i915/display/intel_drrs.c
> +++ b/drivers/gpu/drm/i915/display/intel_drrs.c
> @@ -144,16 +144,19 @@ void intel_drrs_activate(const struct
> intel_crtc_state *crtc_state)  {
>  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> 
> +	mutex_lock(&crtc->drrs.mutex);
> +
> +	crtc->drrs.seamless_mode_switch_pixel_rate = crtc_state-
> >seamless_mode_switch ?
> +						     crtc_state->pixel_rate : 0;
> +
>  	if (!crtc_state->has_drrs)
> -		return;
> +		goto unlock;
> 
>  	if (!crtc_state->hw.active)
> -		return;
> +		goto unlock;
> 
>  	if (intel_crtc_is_bigjoiner_slave(crtc_state))
> -		return;
> -
> -	mutex_lock(&crtc->drrs.mutex);
> +		goto unlock;
> 
>  	crtc->drrs.cpu_transcoder = crtc_state->cpu_transcoder;
>  	crtc->drrs.m_n = crtc_state->dp_m_n;
> @@ -163,6 +166,7 @@ void intel_drrs_activate(const struct intel_crtc_state
> *crtc_state)
> 
>  	intel_drrs_schedule_work(crtc);
> 
> +unlock:
>  	mutex_unlock(&crtc->drrs.mutex);
>  }
> 
> @@ -176,7 +180,7 @@ void intel_drrs_deactivate(const struct
> intel_crtc_state *old_crtc_state)  {
>  	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
> 
> -	if (!old_crtc_state->has_drrs)
> +	if (!old_crtc_state->has_drrs &&
> +!old_crtc_state->seamless_mode_switch)
>  		return;
> 
>  	if (!old_crtc_state->hw.active)
> @@ -187,12 +191,14 @@ void intel_drrs_deactivate(const struct
> intel_crtc_state *old_crtc_state)
> 
>  	mutex_lock(&crtc->drrs.mutex);
> 
> -	if (intel_drrs_is_active(crtc))
> +	if (intel_drrs_is_active(crtc) &&
> +	    old_crtc_state->seamless_mode_switch == 0)
>  		intel_drrs_set_state(crtc, DRRS_REFRESH_RATE_HIGH);
> 
>  	crtc->drrs.cpu_transcoder = INVALID_TRANSCODER;
>  	crtc->drrs.frontbuffer_bits = 0;
>  	crtc->drrs.busy_frontbuffer_bits = 0;
> +	crtc->drrs.seamless_mode_switch_pixel_rate = 0;
> 
>  	mutex_unlock(&crtc->drrs.mutex);
> 
> @@ -322,5 +328,23 @@ bool intel_drrs_crtc_copy_fastset(const struct
> intel_crtc_state *old_crtc_state,
>  	if (intel_cpu_transcoder_has_m2_n2(i915, new_crtc_state-
> >cpu_transcoder))
>  		return false;
> 
> +	if (!new_crtc_state->seamless_mode_switch)
> +		new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
> +
>  	return true;
>  }
> +
> +void intel_drrs_get_config(struct intel_encoder *encoder,
> +			   struct intel_crtc_state *pipe_config) {
> +	struct intel_crtc *crtc;
> +
> +	crtc = to_intel_crtc(pipe_config->uapi.crtc);
> +
> +	mutex_lock(&crtc->drrs.mutex);
> +
> +	pipe_config->seamless_mode_switch = crtc-
> >drrs.seamless_mode_switch_pixel_rate;
> +	pipe_config->has_drrs = intel_drrs_is_active(crtc);
> +
> +	mutex_unlock(&crtc->drrs.mutex);
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_drrs.h
> b/drivers/gpu/drm/i915/display/intel_drrs.h
> index 749ac717db063..a100023658a5a 100644
> --- a/drivers/gpu/drm/i915/display/intel_drrs.h
> +++ b/drivers/gpu/drm/i915/display/intel_drrs.h
> @@ -14,6 +14,7 @@ struct intel_atomic_state;  struct intel_crtc;  struct
> intel_crtc_state;  struct intel_connector;
> +struct intel_encoder;
> 
>  const char *intel_drrs_type_str(enum drrs_type drrs_type);  bool
> intel_drrs_is_active(struct intel_crtc *crtc); @@ -26,5 +27,7 @@ void
> intel_drrs_flush(struct drm_i915_private *dev_priv,  void
> intel_crtc_drrs_init(struct intel_crtc *crtc);  bool
> intel_drrs_crtc_copy_fastset(const struct intel_crtc_state *old_crtc_state,
>  				  struct intel_crtc_state *new_crtc_state);
> +void intel_drrs_get_config(struct intel_encoder *encoder,
> +			   struct intel_crtc_state *pipe_config);
> 
>  #endif /* __INTEL_DRRS_H__ */
> --
> 2.36.0


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

* Re: [Intel-gfx] [PATCH v2 3/3] drm/i915/display: Implement seamless mode switch
  2022-05-09 15:13   ` Srinivas, Vidya
@ 2022-05-25  4:18     ` Srinivas, Vidya
  2022-05-25  8:55       ` Jani Nikula
  0 siblings, 1 reply; 10+ messages in thread
From: Srinivas, Vidya @ 2022-05-25  4:18 UTC (permalink / raw)
  To: Souza, Jose, intel-gfx; +Cc: Sean Paul

Hello,

Apologies for bothering. May we kindly know if this solution is approved?
I have provided the Tested-by. Thanks much.

Regards
Vidya

> -----Original Message-----
> From: Srinivas, Vidya
> Sent: Monday, May 9, 2022 8:44 PM
> To: Souza, Jose <jose.souza@intel.com>; intel-gfx@lists.freedesktop.org
> Cc: Sean Paul <seanpaul@chromium.org>; Ville Syrjälä
> <ville.syrjala@linux.intel.com>
> Subject: RE: [PATCH v2 3/3] drm/i915/display: Implement seamless mode
> switch
> 
> Hello Jose,
> 
> Thanks much for the patch. I tested it on chrome system and the patch
> works.
> Adding my Tested-by.
> Tested-by: Vidya Srinivas <vidya.srinivas@intel.com>
> 
> Regards
> Vidya
> 
> > -----Original Message-----
> > From: Souza, Jose <jose.souza@intel.com>
> > Sent: Tuesday, May 3, 2022 2:11 AM
> > To: intel-gfx@lists.freedesktop.org
> > Cc: Srinivas, Vidya <vidya.srinivas@intel.com>; Sean Paul
> > <seanpaul@chromium.org>; Ville Syrjälä
> > <ville.syrjala@linux.intel.com>; Souza, Jose <jose.souza@intel.com>
> > Subject: [PATCH v2 3/3] drm/i915/display: Implement seamless mode
> > switch
> >
> > So far the i915's DRRS feature was automatically changing between
> > preferred panel mode and downclock mode based on idleness but
> ChromeOS
> > compositor team is asking to be in control of the mode switch.
> > So for certain types of content it can switch to a mode with a lower
> > refresh rate without the user noticing a thing and saving more power.
> >
> > This seamless mode switch will be triggered when user-space dispatches
> > an atomic commit with the new mode and clears the
> > DRM_MODE_ATOMIC_ALLOW_MODESET flag.
> >
> > The main steps to acomplish that are:
> >
> > - as mode changed in atomic state drm_atomic_helper_check_modeset()
> > will set mode_changed and it will trigger the crtc state computation
> > so
> > intel_dp_compute_config() will be called and dp_m_n will be computed
> > for the new mode
> >
> > - then intel_dp_drrs_compute_config() will check for the necessary
> > conditions to do a seamless mode switch, if possible crtc_state-
> > >seamless_mode_switch will be set and has_drrs will not be set, so
> > >i915 will
> > not automatically switch between modes
> >
> > - then intel_crtc_compute_config() will call
> > intel_crtc_compute_pixel_rate() that will take the hint that it is
> > trying to do a seamless mode switch and set pixel_rate to the
> > pixel_rate of the old state
> >
> > - then if nothing else changed in the state intel_crtc_check_fastset()
> > will be able to set mode_changed to false and i915 can do fastset
> > otherwise the commit will fail during the check phase
> >
> > - now on the atomic commit phase, intel_ddi_update_pipe_dp() will be
> > called and will program the new dp_m_n
> >
> > - nothing else is different in the commit phase until the step to
> > verify programmed state, the most important change here is that need
> > to save the pixel_rate in DRRS global state as there is no other way
> > to get that from hardware or atomic state
> >
> > v2:
> > - not overwritten dp_m_n values in intel_crtc_copy_fastset() when
> > doing a seamless_mode_switch
> >
> > Cc: Vidya Srinivas <vidya.srinivas@intel.com>
> > Cc: Sean Paul <seanpaul@chromium.org>
> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_ddi.c      | 10 +++
> >  drivers/gpu/drm/i915/display/intel_display.c  | 61
> > ++++++++++++++++--- .../drm/i915/display/intel_display_debugfs.c  |  3 +
> >  .../drm/i915/display/intel_display_types.h    |  3 +
> >  drivers/gpu/drm/i915/display/intel_dp.c       | 56 ++++++++++++++---
> >  drivers/gpu/drm/i915/display/intel_drrs.c     | 38 +++++++++---
> >  drivers/gpu/drm/i915/display/intel_drrs.h     |  3 +
> >  7 files changed, 151 insertions(+), 23 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c
> > b/drivers/gpu/drm/i915/display/intel_ddi.c
> > index 9e6fa59eabba7..732e5d425412e 100644
> > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > @@ -46,6 +46,7 @@
> >  #include "intel_dp_link_training.h"
> >  #include "intel_dp_mst.h"
> >  #include "intel_dpio_phy.h"
> > +#include "intel_drrs.h"
> >  #include "intel_dsi.h"
> >  #include "intel_fdi.h"
> >  #include "intel_fifo_underrun.h"
> > @@ -3010,6 +3011,14 @@ static void intel_ddi_update_pipe_dp(struct
> > intel_atomic_state *state,
> >
> >  	intel_backlight_update(state, encoder, crtc_state, conn_state);
> >  	drm_connector_update_privacy_screen(conn_state);
> > +
> > +	if (crtc_state->seamless_mode_switch) {
> > +		struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state-
> > >uapi.crtc);
> > +
> > +		intel_cpu_transcoder_set_m1_n1(intel_crtc,
> > +					       crtc_state->cpu_transcoder,
> > +					       &crtc_state->dp_m_n);
> > +	}
> >  }
> >
> >  void intel_ddi_update_pipe(struct intel_atomic_state *state, @@
> > -3484,6
> > +3493,7 @@ static void intel_ddi_get_config(struct intel_encoder
> > +*encoder,
> >  	intel_read_dp_sdp(encoder, pipe_config, DP_SDP_VSC);
> >
> >  	intel_psr_get_config(encoder, pipe_config);
> > +	intel_drrs_get_config(encoder, pipe_config);
> >  }
> >
> >  void intel_ddi_get_clock(struct intel_encoder *encoder, diff --git
> > a/drivers/gpu/drm/i915/display/intel_display.c
> > b/drivers/gpu/drm/i915/display/intel_display.c
> > index 17d0cad9e1686..e54fbe3b1d394 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > @@ -2629,6 +2629,44 @@ static void
> > intel_crtc_compute_pixel_rate(struct
> > intel_crtc_state *crtc_state)
> >  	else
> >  		crtc_state->pixel_rate =
> >  			ilk_pipe_pixel_rate(crtc_state);
> > +
> > +	/*
> > +	 * Do not change pixel_rate when doing seamless mode switch,
> > otherwise
> > +	 * it will change port_clock and other stuff that will need a modeset
> > +	 * to be programmed
> > +	 */
> > +	if (crtc_state->seamless_mode_switch) {
> > +		struct intel_atomic_state *state =
> > to_intel_atomic_state(crtc_state->uapi.state);
> > +		struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> > +		const struct intel_crtc_state *old_crtc_state;
> > +
> > +		old_crtc_state = intel_atomic_get_old_crtc_state(state, crtc);
> > +
> > +		/*
> > +		 * It can only seamless switch if pixel rate of the new mode is
> > +		 * <= than old one, if not commit will fail with pixel_rate
> > +		 * mismatch.
> > +		 */
> > +		if (crtc_state->pixel_rate < old_crtc_state->pixel_rate ||
> > +		    intel_fuzzy_clock_check(crtc_state->pixel_rate,
> > +					    old_crtc_state->pixel_rate))
> > +			crtc_state->pixel_rate = old_crtc_state->pixel_rate;
> > +	}
> > +}
> > +
> > +static void intel_crtc_get_pixel_rate(struct intel_crtc_state
> > +*crtc_state) {
> > +	if (crtc_state->seamless_mode_switch) {
> > +		struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> > +
> > +		mutex_lock(&crtc->drrs.mutex);
> > +		crtc_state->pixel_rate = crtc-
> > >drrs.seamless_mode_switch_pixel_rate;
> > +		mutex_unlock(&crtc->drrs.mutex);
> > +
> > +		return;
> > +	}
> > +
> > +	intel_crtc_compute_pixel_rate(crtc_state);
> >  }
> >
> >  static void intel_bigjoiner_adjust_timings(const struct
> > intel_crtc_state *crtc_state, @@ -2705,7 +2743,7 @@ static void
> > intel_crtc_readout_derived_state(struct intel_crtc_state *crtc_state
> >  	intel_bigjoiner_adjust_timings(crtc_state, pipe_mode);
> >  	intel_mode_from_crtc_timings(pipe_mode, pipe_mode);
> >
> > -	intel_crtc_compute_pixel_rate(crtc_state);
> > +	intel_crtc_get_pixel_rate(crtc_state);
> >  }
> >
> >  static void intel_encoder_get_config(struct intel_encoder *encoder,
> > @@ -
> > 6182,11 +6220,13 @@ intel_pipe_config_compare(const struct
> > intel_crtc_state *current_config,
> >  	PIPE_CONF_CHECK_I(lane_count);
> >  	PIPE_CONF_CHECK_X(lane_lat_optim_mask);
> >
> > -	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv)) {
> > -		PIPE_CONF_CHECK_M_N_ALT(dp_m_n, dp_m2_n2);
> > -	} else {
> > -		PIPE_CONF_CHECK_M_N(dp_m_n);
> > -		PIPE_CONF_CHECK_M_N(dp_m2_n2);
> > +	if (!pipe_config->seamless_mode_switch) {
> > +		if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
> > {
> > +			PIPE_CONF_CHECK_M_N_ALT(dp_m_n, dp_m2_n2);
> > +		} else {
> > +			PIPE_CONF_CHECK_M_N(dp_m_n);
> > +			PIPE_CONF_CHECK_M_N(dp_m2_n2);
> > +		}
> >  	}
> >
> >  	PIPE_CONF_CHECK_X(output_types);
> > @@ -6348,8 +6388,10 @@ intel_pipe_config_compare(const struct
> > intel_crtc_state *current_config,
> >  	if (IS_G4X(dev_priv) || DISPLAY_VER(dev_priv) >= 5)
> >  		PIPE_CONF_CHECK_I(pipe_bpp);
> >
> > -	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.pipe_mode.crtc_clock);
> > -	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.adjusted_mode.crtc_clock);
> > +	if (!pipe_config->seamless_mode_switch) {
> > +		PIPE_CONF_CHECK_CLOCK_FUZZY(hw.pipe_mode.crtc_clock);
> > +
> > 	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.adjusted_mode.crtc_clock);
> > +	}
> >  	PIPE_CONF_CHECK_CLOCK_FUZZY(port_clock);
> >
> >  	PIPE_CONF_CHECK_I(min_voltage_level);
> > @@ -7085,11 +7127,12 @@ static void intel_crtc_copy_fastset(const
> > struct intel_crtc_state *old_crtc_stat
> >  	 * FIXME: should really copy more fuzzy state here
> >  	 */
> >  	new_crtc_state->fdi_m_n = old_crtc_state->fdi_m_n;
> > -	new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
> >
> >  	if (!intel_drrs_crtc_copy_fastset(old_crtc_state, new_crtc_state)) {
> > +		new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
> >  		new_crtc_state->dp_m2_n2 = old_crtc_state->dp_m2_n2;
> >  		new_crtc_state->has_drrs = old_crtc_state->has_drrs;
> > +		new_crtc_state->seamless_mode_switch =
> > +old_crtc_state->seamless_mode_switch;
> >  	}
> >  }
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> > b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> > index 452d773fd4e34..92099e1f0b23e 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> > @@ -1108,6 +1108,9 @@ static int i915_drrs_status(struct seq_file *m,
> > void
> > *unused)
> >  			   crtc->drrs.refresh_rate ==
> > DRRS_REFRESH_RATE_LOW ?
> >  			   "low" : "high");
> >
> > +		seq_printf(m, "Seamless mode switch enabled: %s\n",
> > +			   str_yes_no(crtc-
> > >drrs.seamless_mode_switch_pixel_rate));
> > +
> >  		mutex_unlock(&crtc->drrs.mutex);
> >  	}
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> > b/drivers/gpu/drm/i915/display/intel_display_types.h
> > index 408152f9f46a4..e290366adfc27 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> > @@ -1057,6 +1057,7 @@ struct intel_crtc_state {
> >  	/* m2_n2 for eDP downclock */
> >  	struct intel_link_m_n dp_m2_n2;
> >  	bool has_drrs;
> > +	bool seamless_mode_switch;
> >
> >  	/* PSR is supported but might not be enabled due the lack of enabled
> > planes */
> >  	bool has_psr;
> > @@ -1314,6 +1315,8 @@ struct intel_crtc {
> >  		unsigned int busy_frontbuffer_bits;
> >  		enum transcoder cpu_transcoder;
> >  		struct intel_link_m_n m_n, m2_n2;
> > +		/* Only used to verify if programmed state matches */
> > +		unsigned int seamless_mode_switch_pixel_rate;
> >  	} drrs;
> >
> >  	int scanline_offset;
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> > b/drivers/gpu/drm/i915/display/intel_dp.c
> > index cc9be82e128f4..691d362dde95e 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > @@ -1844,8 +1844,7 @@ static bool cpu_transcoder_has_drrs(struct
> > drm_i915_private *i915,  }
> >
> >  static bool can_enable_drrs(struct intel_connector *connector,
> > -			    const struct intel_crtc_state *pipe_config,
> > -			    const struct drm_display_mode
> > *downclock_mode)
> > +			    const struct intel_crtc_state *pipe_config)
> >  {
> >  	struct drm_i915_private *i915 = to_i915(connector->base.dev);
> >
> > @@ -1868,8 +1867,40 @@ static bool can_enable_drrs(struct
> > intel_connector *connector,
> >  	if (!cpu_transcoder_has_drrs(i915, pipe_config->cpu_transcoder))
> >  		return false;
> >
> > -	return downclock_mode &&
> > -		intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS;
> > +	return intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS; }
> > +
> > +static bool can_seamless_switch_mode(struct intel_crtc_state
> > +*pipe_config) {
> > +	struct drm_i915_private *i915 = to_i915(pipe_config->uapi.crtc-
> > >dev);
> > +	const struct intel_crtc_state *old_pipe_config;
> > +	struct intel_atomic_state *state;
> > +	struct intel_crtc *intel_crtc;
> > +
> > +	/* Only supported in platforms that can switch m_n on the fly */
> > +	if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config-
> > >cpu_transcoder))
> > +		return false;
> > +
> > +	state = to_intel_atomic_state(pipe_config->uapi.state);
> > +	if (state->base.allow_modeset)
> > +		return false;
> > +
> > +	intel_crtc = to_intel_crtc(pipe_config->uapi.crtc);
> > +	old_pipe_config = intel_atomic_get_old_crtc_state(state, intel_crtc);
> > +	if (drm_mode_equal(&old_pipe_config->hw.adjusted_mode,
> > +			   &pipe_config->hw.adjusted_mode))
> > +		return false;
> > +
> > +	/* Only clock can change */
> > +	if (!drm_mode_match(&old_pipe_config->hw.adjusted_mode,
> > +			    &pipe_config->hw.adjusted_mode,
> > +			    DRM_MODE_MATCH_TIMINGS |
> > +			    DRM_MODE_MATCH_FLAGS |
> > +			    DRM_MODE_MATCH_3D_FLAGS |
> > +			    DRM_MODE_MATCH_ASPECT_RATIO))
> > +		return false;
> > +
> > +	return true;
> >  }
> >
> >  static void
> > @@ -1882,12 +1913,17 @@ intel_dp_drrs_compute_config(struct
> > intel_connector *connector,
> >  		intel_panel_downclock_mode(connector, &pipe_config-
> > >hw.adjusted_mode);
> >  	int pixel_clock;
> >
> > -	if (!can_enable_drrs(connector, pipe_config, downclock_mode)) {
> > -		if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config-
> > >cpu_transcoder))
> > -			intel_zero_m_n(&pipe_config->dp_m2_n2);
> > +	if (!can_enable_drrs(connector, pipe_config))
> > +		goto not_supported;
> > +
> > +	if (can_seamless_switch_mode(pipe_config)) {
> > +		pipe_config->seamless_mode_switch = true;
> >  		return;
> >  	}
> >
> > +	if (!downclock_mode)
> > +		goto not_supported;
> > +
> >  	if (IS_IRONLAKE(i915) || IS_SANDYBRIDGE(i915) ||
> > IS_IVYBRIDGE(i915))
> >  		pipe_config->msa_timing_delay = i915-
> > >vbt.edp.drrs_msa_timing_delay;
> >
> > @@ -1904,6 +1940,12 @@ intel_dp_drrs_compute_config(struct
> > intel_connector *connector,
> >  	/* FIXME: abstract this better */
> >  	if (pipe_config->splitter.enable)
> >  		pipe_config->dp_m2_n2.data_m *= pipe_config-
> > >splitter.link_count;
> > +
> > +	return;
> > +
> > +not_supported:
> > +	if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config-
> > >cpu_transcoder))
> > +		intel_zero_m_n(&pipe_config->dp_m2_n2);
> >  }
> >
> >  static bool intel_dp_has_audio(struct intel_encoder *encoder, diff
> > --git a/drivers/gpu/drm/i915/display/intel_drrs.c
> > b/drivers/gpu/drm/i915/display/intel_drrs.c
> > index d266fad83a086..ffd51d2f5998d 100644
> > --- a/drivers/gpu/drm/i915/display/intel_drrs.c
> > +++ b/drivers/gpu/drm/i915/display/intel_drrs.c
> > @@ -144,16 +144,19 @@ void intel_drrs_activate(const struct
> > intel_crtc_state *crtc_state)  {
> >  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> >
> > +	mutex_lock(&crtc->drrs.mutex);
> > +
> > +	crtc->drrs.seamless_mode_switch_pixel_rate = crtc_state-
> > >seamless_mode_switch ?
> > +						     crtc_state->pixel_rate : 0;
> > +
> >  	if (!crtc_state->has_drrs)
> > -		return;
> > +		goto unlock;
> >
> >  	if (!crtc_state->hw.active)
> > -		return;
> > +		goto unlock;
> >
> >  	if (intel_crtc_is_bigjoiner_slave(crtc_state))
> > -		return;
> > -
> > -	mutex_lock(&crtc->drrs.mutex);
> > +		goto unlock;
> >
> >  	crtc->drrs.cpu_transcoder = crtc_state->cpu_transcoder;
> >  	crtc->drrs.m_n = crtc_state->dp_m_n; @@ -163,6 +166,7 @@ void
> > intel_drrs_activate(const struct intel_crtc_state
> > *crtc_state)
> >
> >  	intel_drrs_schedule_work(crtc);
> >
> > +unlock:
> >  	mutex_unlock(&crtc->drrs.mutex);
> >  }
> >
> > @@ -176,7 +180,7 @@ void intel_drrs_deactivate(const struct
> > intel_crtc_state *old_crtc_state)  {
> >  	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
> >
> > -	if (!old_crtc_state->has_drrs)
> > +	if (!old_crtc_state->has_drrs &&
> > +!old_crtc_state->seamless_mode_switch)
> >  		return;
> >
> >  	if (!old_crtc_state->hw.active)
> > @@ -187,12 +191,14 @@ void intel_drrs_deactivate(const struct
> > intel_crtc_state *old_crtc_state)
> >
> >  	mutex_lock(&crtc->drrs.mutex);
> >
> > -	if (intel_drrs_is_active(crtc))
> > +	if (intel_drrs_is_active(crtc) &&
> > +	    old_crtc_state->seamless_mode_switch == 0)
> >  		intel_drrs_set_state(crtc, DRRS_REFRESH_RATE_HIGH);
> >
> >  	crtc->drrs.cpu_transcoder = INVALID_TRANSCODER;
> >  	crtc->drrs.frontbuffer_bits = 0;
> >  	crtc->drrs.busy_frontbuffer_bits = 0;
> > +	crtc->drrs.seamless_mode_switch_pixel_rate = 0;
> >
> >  	mutex_unlock(&crtc->drrs.mutex);
> >
> > @@ -322,5 +328,23 @@ bool intel_drrs_crtc_copy_fastset(const struct
> > intel_crtc_state *old_crtc_state,
> >  	if (intel_cpu_transcoder_has_m2_n2(i915, new_crtc_state-
> > >cpu_transcoder))
> >  		return false;
> >
> > +	if (!new_crtc_state->seamless_mode_switch)
> > +		new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
> > +
> >  	return true;
> >  }
> > +
> > +void intel_drrs_get_config(struct intel_encoder *encoder,
> > +			   struct intel_crtc_state *pipe_config) {
> > +	struct intel_crtc *crtc;
> > +
> > +	crtc = to_intel_crtc(pipe_config->uapi.crtc);
> > +
> > +	mutex_lock(&crtc->drrs.mutex);
> > +
> > +	pipe_config->seamless_mode_switch = crtc-
> > >drrs.seamless_mode_switch_pixel_rate;
> > +	pipe_config->has_drrs = intel_drrs_is_active(crtc);
> > +
> > +	mutex_unlock(&crtc->drrs.mutex);
> > +}
> > diff --git a/drivers/gpu/drm/i915/display/intel_drrs.h
> > b/drivers/gpu/drm/i915/display/intel_drrs.h
> > index 749ac717db063..a100023658a5a 100644
> > --- a/drivers/gpu/drm/i915/display/intel_drrs.h
> > +++ b/drivers/gpu/drm/i915/display/intel_drrs.h
> > @@ -14,6 +14,7 @@ struct intel_atomic_state;  struct intel_crtc;
> > struct intel_crtc_state;  struct intel_connector;
> > +struct intel_encoder;
> >
> >  const char *intel_drrs_type_str(enum drrs_type drrs_type);  bool
> > intel_drrs_is_active(struct intel_crtc *crtc); @@ -26,5 +27,7 @@ void
> > intel_drrs_flush(struct drm_i915_private *dev_priv,  void
> > intel_crtc_drrs_init(struct intel_crtc *crtc);  bool
> > intel_drrs_crtc_copy_fastset(const struct intel_crtc_state *old_crtc_state,
> >  				  struct intel_crtc_state *new_crtc_state);
> > +void intel_drrs_get_config(struct intel_encoder *encoder,
> > +			   struct intel_crtc_state *pipe_config);
> >
> >  #endif /* __INTEL_DRRS_H__ */
> > --
> > 2.36.0


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

* Re: [Intel-gfx] [PATCH v2 3/3] drm/i915/display: Implement seamless mode switch
  2022-05-25  4:18     ` Srinivas, Vidya
@ 2022-05-25  8:55       ` Jani Nikula
  2022-05-25  9:19         ` Srinivas, Vidya
  0 siblings, 1 reply; 10+ messages in thread
From: Jani Nikula @ 2022-05-25  8:55 UTC (permalink / raw)
  To: Srinivas, Vidya, Souza, Jose, intel-gfx; +Cc: Syrjala, Ville, Sean Paul

On Wed, 25 May 2022, "Srinivas, Vidya" <vidya.srinivas@intel.com> wrote:
> Hello,
>
> Apologies for bothering. May we kindly know if this solution is approved?
> I have provided the Tested-by. Thanks much.

IIUC the more complete solution is [1].

BR,
Jani.


[1] https://patchwork.freedesktop.org/series/103491/



>
> Regards
> Vidya
>
>> -----Original Message-----
>> From: Srinivas, Vidya
>> Sent: Monday, May 9, 2022 8:44 PM
>> To: Souza, Jose <jose.souza@intel.com>; intel-gfx@lists.freedesktop.org
>> Cc: Sean Paul <seanpaul@chromium.org>; Ville Syrjälä
>> <ville.syrjala@linux.intel.com>
>> Subject: RE: [PATCH v2 3/3] drm/i915/display: Implement seamless mode
>> switch
>> 
>> Hello Jose,
>> 
>> Thanks much for the patch. I tested it on chrome system and the patch
>> works.
>> Adding my Tested-by.
>> Tested-by: Vidya Srinivas <vidya.srinivas@intel.com>
>> 
>> Regards
>> Vidya
>> 
>> > -----Original Message-----
>> > From: Souza, Jose <jose.souza@intel.com>
>> > Sent: Tuesday, May 3, 2022 2:11 AM
>> > To: intel-gfx@lists.freedesktop.org
>> > Cc: Srinivas, Vidya <vidya.srinivas@intel.com>; Sean Paul
>> > <seanpaul@chromium.org>; Ville Syrjälä
>> > <ville.syrjala@linux.intel.com>; Souza, Jose <jose.souza@intel.com>
>> > Subject: [PATCH v2 3/3] drm/i915/display: Implement seamless mode
>> > switch
>> >
>> > So far the i915's DRRS feature was automatically changing between
>> > preferred panel mode and downclock mode based on idleness but
>> ChromeOS
>> > compositor team is asking to be in control of the mode switch.
>> > So for certain types of content it can switch to a mode with a lower
>> > refresh rate without the user noticing a thing and saving more power.
>> >
>> > This seamless mode switch will be triggered when user-space dispatches
>> > an atomic commit with the new mode and clears the
>> > DRM_MODE_ATOMIC_ALLOW_MODESET flag.
>> >
>> > The main steps to acomplish that are:
>> >
>> > - as mode changed in atomic state drm_atomic_helper_check_modeset()
>> > will set mode_changed and it will trigger the crtc state computation
>> > so
>> > intel_dp_compute_config() will be called and dp_m_n will be computed
>> > for the new mode
>> >
>> > - then intel_dp_drrs_compute_config() will check for the necessary
>> > conditions to do a seamless mode switch, if possible crtc_state-
>> > >seamless_mode_switch will be set and has_drrs will not be set, so
>> > >i915 will
>> > not automatically switch between modes
>> >
>> > - then intel_crtc_compute_config() will call
>> > intel_crtc_compute_pixel_rate() that will take the hint that it is
>> > trying to do a seamless mode switch and set pixel_rate to the
>> > pixel_rate of the old state
>> >
>> > - then if nothing else changed in the state intel_crtc_check_fastset()
>> > will be able to set mode_changed to false and i915 can do fastset
>> > otherwise the commit will fail during the check phase
>> >
>> > - now on the atomic commit phase, intel_ddi_update_pipe_dp() will be
>> > called and will program the new dp_m_n
>> >
>> > - nothing else is different in the commit phase until the step to
>> > verify programmed state, the most important change here is that need
>> > to save the pixel_rate in DRRS global state as there is no other way
>> > to get that from hardware or atomic state
>> >
>> > v2:
>> > - not overwritten dp_m_n values in intel_crtc_copy_fastset() when
>> > doing a seamless_mode_switch
>> >
>> > Cc: Vidya Srinivas <vidya.srinivas@intel.com>
>> > Cc: Sean Paul <seanpaul@chromium.org>
>> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
>> > Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
>> > ---
>> >  drivers/gpu/drm/i915/display/intel_ddi.c      | 10 +++
>> >  drivers/gpu/drm/i915/display/intel_display.c  | 61
>> > ++++++++++++++++--- .../drm/i915/display/intel_display_debugfs.c  |  3 +
>> >  .../drm/i915/display/intel_display_types.h    |  3 +
>> >  drivers/gpu/drm/i915/display/intel_dp.c       | 56 ++++++++++++++---
>> >  drivers/gpu/drm/i915/display/intel_drrs.c     | 38 +++++++++---
>> >  drivers/gpu/drm/i915/display/intel_drrs.h     |  3 +
>> >  7 files changed, 151 insertions(+), 23 deletions(-)
>> >
>> > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c
>> > b/drivers/gpu/drm/i915/display/intel_ddi.c
>> > index 9e6fa59eabba7..732e5d425412e 100644
>> > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
>> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
>> > @@ -46,6 +46,7 @@
>> >  #include "intel_dp_link_training.h"
>> >  #include "intel_dp_mst.h"
>> >  #include "intel_dpio_phy.h"
>> > +#include "intel_drrs.h"
>> >  #include "intel_dsi.h"
>> >  #include "intel_fdi.h"
>> >  #include "intel_fifo_underrun.h"
>> > @@ -3010,6 +3011,14 @@ static void intel_ddi_update_pipe_dp(struct
>> > intel_atomic_state *state,
>> >
>> >  	intel_backlight_update(state, encoder, crtc_state, conn_state);
>> >  	drm_connector_update_privacy_screen(conn_state);
>> > +
>> > +	if (crtc_state->seamless_mode_switch) {
>> > +		struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state-
>> > >uapi.crtc);
>> > +
>> > +		intel_cpu_transcoder_set_m1_n1(intel_crtc,
>> > +					       crtc_state->cpu_transcoder,
>> > +					       &crtc_state->dp_m_n);
>> > +	}
>> >  }
>> >
>> >  void intel_ddi_update_pipe(struct intel_atomic_state *state, @@
>> > -3484,6
>> > +3493,7 @@ static void intel_ddi_get_config(struct intel_encoder
>> > +*encoder,
>> >  	intel_read_dp_sdp(encoder, pipe_config, DP_SDP_VSC);
>> >
>> >  	intel_psr_get_config(encoder, pipe_config);
>> > +	intel_drrs_get_config(encoder, pipe_config);
>> >  }
>> >
>> >  void intel_ddi_get_clock(struct intel_encoder *encoder, diff --git
>> > a/drivers/gpu/drm/i915/display/intel_display.c
>> > b/drivers/gpu/drm/i915/display/intel_display.c
>> > index 17d0cad9e1686..e54fbe3b1d394 100644
>> > --- a/drivers/gpu/drm/i915/display/intel_display.c
>> > +++ b/drivers/gpu/drm/i915/display/intel_display.c
>> > @@ -2629,6 +2629,44 @@ static void
>> > intel_crtc_compute_pixel_rate(struct
>> > intel_crtc_state *crtc_state)
>> >  	else
>> >  		crtc_state->pixel_rate =
>> >  			ilk_pipe_pixel_rate(crtc_state);
>> > +
>> > +	/*
>> > +	 * Do not change pixel_rate when doing seamless mode switch,
>> > otherwise
>> > +	 * it will change port_clock and other stuff that will need a modeset
>> > +	 * to be programmed
>> > +	 */
>> > +	if (crtc_state->seamless_mode_switch) {
>> > +		struct intel_atomic_state *state =
>> > to_intel_atomic_state(crtc_state->uapi.state);
>> > +		struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
>> > +		const struct intel_crtc_state *old_crtc_state;
>> > +
>> > +		old_crtc_state = intel_atomic_get_old_crtc_state(state, crtc);
>> > +
>> > +		/*
>> > +		 * It can only seamless switch if pixel rate of the new mode is
>> > +		 * <= than old one, if not commit will fail with pixel_rate
>> > +		 * mismatch.
>> > +		 */
>> > +		if (crtc_state->pixel_rate < old_crtc_state->pixel_rate ||
>> > +		    intel_fuzzy_clock_check(crtc_state->pixel_rate,
>> > +					    old_crtc_state->pixel_rate))
>> > +			crtc_state->pixel_rate = old_crtc_state->pixel_rate;
>> > +	}
>> > +}
>> > +
>> > +static void intel_crtc_get_pixel_rate(struct intel_crtc_state
>> > +*crtc_state) {
>> > +	if (crtc_state->seamless_mode_switch) {
>> > +		struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
>> > +
>> > +		mutex_lock(&crtc->drrs.mutex);
>> > +		crtc_state->pixel_rate = crtc-
>> > >drrs.seamless_mode_switch_pixel_rate;
>> > +		mutex_unlock(&crtc->drrs.mutex);
>> > +
>> > +		return;
>> > +	}
>> > +
>> > +	intel_crtc_compute_pixel_rate(crtc_state);
>> >  }
>> >
>> >  static void intel_bigjoiner_adjust_timings(const struct
>> > intel_crtc_state *crtc_state, @@ -2705,7 +2743,7 @@ static void
>> > intel_crtc_readout_derived_state(struct intel_crtc_state *crtc_state
>> >  	intel_bigjoiner_adjust_timings(crtc_state, pipe_mode);
>> >  	intel_mode_from_crtc_timings(pipe_mode, pipe_mode);
>> >
>> > -	intel_crtc_compute_pixel_rate(crtc_state);
>> > +	intel_crtc_get_pixel_rate(crtc_state);
>> >  }
>> >
>> >  static void intel_encoder_get_config(struct intel_encoder *encoder,
>> > @@ -
>> > 6182,11 +6220,13 @@ intel_pipe_config_compare(const struct
>> > intel_crtc_state *current_config,
>> >  	PIPE_CONF_CHECK_I(lane_count);
>> >  	PIPE_CONF_CHECK_X(lane_lat_optim_mask);
>> >
>> > -	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv)) {
>> > -		PIPE_CONF_CHECK_M_N_ALT(dp_m_n, dp_m2_n2);
>> > -	} else {
>> > -		PIPE_CONF_CHECK_M_N(dp_m_n);
>> > -		PIPE_CONF_CHECK_M_N(dp_m2_n2);
>> > +	if (!pipe_config->seamless_mode_switch) {
>> > +		if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
>> > {
>> > +			PIPE_CONF_CHECK_M_N_ALT(dp_m_n, dp_m2_n2);
>> > +		} else {
>> > +			PIPE_CONF_CHECK_M_N(dp_m_n);
>> > +			PIPE_CONF_CHECK_M_N(dp_m2_n2);
>> > +		}
>> >  	}
>> >
>> >  	PIPE_CONF_CHECK_X(output_types);
>> > @@ -6348,8 +6388,10 @@ intel_pipe_config_compare(const struct
>> > intel_crtc_state *current_config,
>> >  	if (IS_G4X(dev_priv) || DISPLAY_VER(dev_priv) >= 5)
>> >  		PIPE_CONF_CHECK_I(pipe_bpp);
>> >
>> > -	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.pipe_mode.crtc_clock);
>> > -	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.adjusted_mode.crtc_clock);
>> > +	if (!pipe_config->seamless_mode_switch) {
>> > +		PIPE_CONF_CHECK_CLOCK_FUZZY(hw.pipe_mode.crtc_clock);
>> > +
>> > 	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.adjusted_mode.crtc_clock);
>> > +	}
>> >  	PIPE_CONF_CHECK_CLOCK_FUZZY(port_clock);
>> >
>> >  	PIPE_CONF_CHECK_I(min_voltage_level);
>> > @@ -7085,11 +7127,12 @@ static void intel_crtc_copy_fastset(const
>> > struct intel_crtc_state *old_crtc_stat
>> >  	 * FIXME: should really copy more fuzzy state here
>> >  	 */
>> >  	new_crtc_state->fdi_m_n = old_crtc_state->fdi_m_n;
>> > -	new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
>> >
>> >  	if (!intel_drrs_crtc_copy_fastset(old_crtc_state, new_crtc_state)) {
>> > +		new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
>> >  		new_crtc_state->dp_m2_n2 = old_crtc_state->dp_m2_n2;
>> >  		new_crtc_state->has_drrs = old_crtc_state->has_drrs;
>> > +		new_crtc_state->seamless_mode_switch =
>> > +old_crtc_state->seamless_mode_switch;
>> >  	}
>> >  }
>> >
>> > diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
>> > b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
>> > index 452d773fd4e34..92099e1f0b23e 100644
>> > --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
>> > +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
>> > @@ -1108,6 +1108,9 @@ static int i915_drrs_status(struct seq_file *m,
>> > void
>> > *unused)
>> >  			   crtc->drrs.refresh_rate ==
>> > DRRS_REFRESH_RATE_LOW ?
>> >  			   "low" : "high");
>> >
>> > +		seq_printf(m, "Seamless mode switch enabled: %s\n",
>> > +			   str_yes_no(crtc-
>> > >drrs.seamless_mode_switch_pixel_rate));
>> > +
>> >  		mutex_unlock(&crtc->drrs.mutex);
>> >  	}
>> >
>> > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
>> > b/drivers/gpu/drm/i915/display/intel_display_types.h
>> > index 408152f9f46a4..e290366adfc27 100644
>> > --- a/drivers/gpu/drm/i915/display/intel_display_types.h
>> > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
>> > @@ -1057,6 +1057,7 @@ struct intel_crtc_state {
>> >  	/* m2_n2 for eDP downclock */
>> >  	struct intel_link_m_n dp_m2_n2;
>> >  	bool has_drrs;
>> > +	bool seamless_mode_switch;
>> >
>> >  	/* PSR is supported but might not be enabled due the lack of enabled
>> > planes */
>> >  	bool has_psr;
>> > @@ -1314,6 +1315,8 @@ struct intel_crtc {
>> >  		unsigned int busy_frontbuffer_bits;
>> >  		enum transcoder cpu_transcoder;
>> >  		struct intel_link_m_n m_n, m2_n2;
>> > +		/* Only used to verify if programmed state matches */
>> > +		unsigned int seamless_mode_switch_pixel_rate;
>> >  	} drrs;
>> >
>> >  	int scanline_offset;
>> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
>> > b/drivers/gpu/drm/i915/display/intel_dp.c
>> > index cc9be82e128f4..691d362dde95e 100644
>> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
>> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
>> > @@ -1844,8 +1844,7 @@ static bool cpu_transcoder_has_drrs(struct
>> > drm_i915_private *i915,  }
>> >
>> >  static bool can_enable_drrs(struct intel_connector *connector,
>> > -			    const struct intel_crtc_state *pipe_config,
>> > -			    const struct drm_display_mode
>> > *downclock_mode)
>> > +			    const struct intel_crtc_state *pipe_config)
>> >  {
>> >  	struct drm_i915_private *i915 = to_i915(connector->base.dev);
>> >
>> > @@ -1868,8 +1867,40 @@ static bool can_enable_drrs(struct
>> > intel_connector *connector,
>> >  	if (!cpu_transcoder_has_drrs(i915, pipe_config->cpu_transcoder))
>> >  		return false;
>> >
>> > -	return downclock_mode &&
>> > -		intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS;
>> > +	return intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS; }
>> > +
>> > +static bool can_seamless_switch_mode(struct intel_crtc_state
>> > +*pipe_config) {
>> > +	struct drm_i915_private *i915 = to_i915(pipe_config->uapi.crtc-
>> > >dev);
>> > +	const struct intel_crtc_state *old_pipe_config;
>> > +	struct intel_atomic_state *state;
>> > +	struct intel_crtc *intel_crtc;
>> > +
>> > +	/* Only supported in platforms that can switch m_n on the fly */
>> > +	if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config-
>> > >cpu_transcoder))
>> > +		return false;
>> > +
>> > +	state = to_intel_atomic_state(pipe_config->uapi.state);
>> > +	if (state->base.allow_modeset)
>> > +		return false;
>> > +
>> > +	intel_crtc = to_intel_crtc(pipe_config->uapi.crtc);
>> > +	old_pipe_config = intel_atomic_get_old_crtc_state(state, intel_crtc);
>> > +	if (drm_mode_equal(&old_pipe_config->hw.adjusted_mode,
>> > +			   &pipe_config->hw.adjusted_mode))
>> > +		return false;
>> > +
>> > +	/* Only clock can change */
>> > +	if (!drm_mode_match(&old_pipe_config->hw.adjusted_mode,
>> > +			    &pipe_config->hw.adjusted_mode,
>> > +			    DRM_MODE_MATCH_TIMINGS |
>> > +			    DRM_MODE_MATCH_FLAGS |
>> > +			    DRM_MODE_MATCH_3D_FLAGS |
>> > +			    DRM_MODE_MATCH_ASPECT_RATIO))
>> > +		return false;
>> > +
>> > +	return true;
>> >  }
>> >
>> >  static void
>> > @@ -1882,12 +1913,17 @@ intel_dp_drrs_compute_config(struct
>> > intel_connector *connector,
>> >  		intel_panel_downclock_mode(connector, &pipe_config-
>> > >hw.adjusted_mode);
>> >  	int pixel_clock;
>> >
>> > -	if (!can_enable_drrs(connector, pipe_config, downclock_mode)) {
>> > -		if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config-
>> > >cpu_transcoder))
>> > -			intel_zero_m_n(&pipe_config->dp_m2_n2);
>> > +	if (!can_enable_drrs(connector, pipe_config))
>> > +		goto not_supported;
>> > +
>> > +	if (can_seamless_switch_mode(pipe_config)) {
>> > +		pipe_config->seamless_mode_switch = true;
>> >  		return;
>> >  	}
>> >
>> > +	if (!downclock_mode)
>> > +		goto not_supported;
>> > +
>> >  	if (IS_IRONLAKE(i915) || IS_SANDYBRIDGE(i915) ||
>> > IS_IVYBRIDGE(i915))
>> >  		pipe_config->msa_timing_delay = i915-
>> > >vbt.edp.drrs_msa_timing_delay;
>> >
>> > @@ -1904,6 +1940,12 @@ intel_dp_drrs_compute_config(struct
>> > intel_connector *connector,
>> >  	/* FIXME: abstract this better */
>> >  	if (pipe_config->splitter.enable)
>> >  		pipe_config->dp_m2_n2.data_m *= pipe_config-
>> > >splitter.link_count;
>> > +
>> > +	return;
>> > +
>> > +not_supported:
>> > +	if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config-
>> > >cpu_transcoder))
>> > +		intel_zero_m_n(&pipe_config->dp_m2_n2);
>> >  }
>> >
>> >  static bool intel_dp_has_audio(struct intel_encoder *encoder, diff
>> > --git a/drivers/gpu/drm/i915/display/intel_drrs.c
>> > b/drivers/gpu/drm/i915/display/intel_drrs.c
>> > index d266fad83a086..ffd51d2f5998d 100644
>> > --- a/drivers/gpu/drm/i915/display/intel_drrs.c
>> > +++ b/drivers/gpu/drm/i915/display/intel_drrs.c
>> > @@ -144,16 +144,19 @@ void intel_drrs_activate(const struct
>> > intel_crtc_state *crtc_state)  {
>> >  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
>> >
>> > +	mutex_lock(&crtc->drrs.mutex);
>> > +
>> > +	crtc->drrs.seamless_mode_switch_pixel_rate = crtc_state-
>> > >seamless_mode_switch ?
>> > +						     crtc_state->pixel_rate : 0;
>> > +
>> >  	if (!crtc_state->has_drrs)
>> > -		return;
>> > +		goto unlock;
>> >
>> >  	if (!crtc_state->hw.active)
>> > -		return;
>> > +		goto unlock;
>> >
>> >  	if (intel_crtc_is_bigjoiner_slave(crtc_state))
>> > -		return;
>> > -
>> > -	mutex_lock(&crtc->drrs.mutex);
>> > +		goto unlock;
>> >
>> >  	crtc->drrs.cpu_transcoder = crtc_state->cpu_transcoder;
>> >  	crtc->drrs.m_n = crtc_state->dp_m_n; @@ -163,6 +166,7 @@ void
>> > intel_drrs_activate(const struct intel_crtc_state
>> > *crtc_state)
>> >
>> >  	intel_drrs_schedule_work(crtc);
>> >
>> > +unlock:
>> >  	mutex_unlock(&crtc->drrs.mutex);
>> >  }
>> >
>> > @@ -176,7 +180,7 @@ void intel_drrs_deactivate(const struct
>> > intel_crtc_state *old_crtc_state)  {
>> >  	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
>> >
>> > -	if (!old_crtc_state->has_drrs)
>> > +	if (!old_crtc_state->has_drrs &&
>> > +!old_crtc_state->seamless_mode_switch)
>> >  		return;
>> >
>> >  	if (!old_crtc_state->hw.active)
>> > @@ -187,12 +191,14 @@ void intel_drrs_deactivate(const struct
>> > intel_crtc_state *old_crtc_state)
>> >
>> >  	mutex_lock(&crtc->drrs.mutex);
>> >
>> > -	if (intel_drrs_is_active(crtc))
>> > +	if (intel_drrs_is_active(crtc) &&
>> > +	    old_crtc_state->seamless_mode_switch == 0)
>> >  		intel_drrs_set_state(crtc, DRRS_REFRESH_RATE_HIGH);
>> >
>> >  	crtc->drrs.cpu_transcoder = INVALID_TRANSCODER;
>> >  	crtc->drrs.frontbuffer_bits = 0;
>> >  	crtc->drrs.busy_frontbuffer_bits = 0;
>> > +	crtc->drrs.seamless_mode_switch_pixel_rate = 0;
>> >
>> >  	mutex_unlock(&crtc->drrs.mutex);
>> >
>> > @@ -322,5 +328,23 @@ bool intel_drrs_crtc_copy_fastset(const struct
>> > intel_crtc_state *old_crtc_state,
>> >  	if (intel_cpu_transcoder_has_m2_n2(i915, new_crtc_state-
>> > >cpu_transcoder))
>> >  		return false;
>> >
>> > +	if (!new_crtc_state->seamless_mode_switch)
>> > +		new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
>> > +
>> >  	return true;
>> >  }
>> > +
>> > +void intel_drrs_get_config(struct intel_encoder *encoder,
>> > +			   struct intel_crtc_state *pipe_config) {
>> > +	struct intel_crtc *crtc;
>> > +
>> > +	crtc = to_intel_crtc(pipe_config->uapi.crtc);
>> > +
>> > +	mutex_lock(&crtc->drrs.mutex);
>> > +
>> > +	pipe_config->seamless_mode_switch = crtc-
>> > >drrs.seamless_mode_switch_pixel_rate;
>> > +	pipe_config->has_drrs = intel_drrs_is_active(crtc);
>> > +
>> > +	mutex_unlock(&crtc->drrs.mutex);
>> > +}
>> > diff --git a/drivers/gpu/drm/i915/display/intel_drrs.h
>> > b/drivers/gpu/drm/i915/display/intel_drrs.h
>> > index 749ac717db063..a100023658a5a 100644
>> > --- a/drivers/gpu/drm/i915/display/intel_drrs.h
>> > +++ b/drivers/gpu/drm/i915/display/intel_drrs.h
>> > @@ -14,6 +14,7 @@ struct intel_atomic_state;  struct intel_crtc;
>> > struct intel_crtc_state;  struct intel_connector;
>> > +struct intel_encoder;
>> >
>> >  const char *intel_drrs_type_str(enum drrs_type drrs_type);  bool
>> > intel_drrs_is_active(struct intel_crtc *crtc); @@ -26,5 +27,7 @@ void
>> > intel_drrs_flush(struct drm_i915_private *dev_priv,  void
>> > intel_crtc_drrs_init(struct intel_crtc *crtc);  bool
>> > intel_drrs_crtc_copy_fastset(const struct intel_crtc_state *old_crtc_state,
>> >  				  struct intel_crtc_state *new_crtc_state);
>> > +void intel_drrs_get_config(struct intel_encoder *encoder,
>> > +			   struct intel_crtc_state *pipe_config);
>> >
>> >  #endif /* __INTEL_DRRS_H__ */
>> > --
>> > 2.36.0
>

-- 
Jani Nikula, Intel Open Source Graphics Center

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

* Re: [Intel-gfx] [PATCH v2 3/3] drm/i915/display: Implement seamless mode switch
  2022-05-25  8:55       ` Jani Nikula
@ 2022-05-25  9:19         ` Srinivas, Vidya
  2022-05-26  4:58           ` Srinivas, Vidya
  0 siblings, 1 reply; 10+ messages in thread
From: Srinivas, Vidya @ 2022-05-25  9:19 UTC (permalink / raw)
  To: Jani Nikula, Souza, Jose, intel-gfx; +Cc: Syrjala, Ville, Sean Paul



> -----Original Message-----
> From: Jani Nikula <jani.nikula@linux.intel.com>
> Sent: Wednesday, May 25, 2022 2:26 PM
> To: Srinivas, Vidya <vidya.srinivas@intel.com>; Souza, Jose
> <jose.souza@intel.com>; intel-gfx@lists.freedesktop.org
> Cc: Sean Paul <seanpaul@chromium.org>; Syrjala, Ville
> <ville.syrjala@intel.com>
> Subject: Re: [Intel-gfx] [PATCH v2 3/3] drm/i915/display: Implement seamless
> mode switch
> 
> On Wed, 25 May 2022, "Srinivas, Vidya" <vidya.srinivas@intel.com> wrote:
> > Hello,
> >
> > Apologies for bothering. May we kindly know if this solution is approved?
> > I have provided the Tested-by. Thanks much.
> 
> IIUC the more complete solution is [1].
> 
> BR,
> Jani.
> 
> 
> [1] https://patchwork.freedesktop.org/series/103491/
> 
Hello Jani,

Thank you very much. I will have a check of this.
For user space triggered seamless modeset WITHOUT setting "DRM_MODE_ATOMIC_ALLOW_MODESET", for switch between 2 refresh rates, Jose patches is working.
Jose please correct me if I am wrong. Thank you.

Regards
Vidya
> 
> 
> >
> > Regards
> > Vidya
> >
> >> -----Original Message-----
> >> From: Srinivas, Vidya
> >> Sent: Monday, May 9, 2022 8:44 PM
> >> To: Souza, Jose <jose.souza@intel.com>;
> >> intel-gfx@lists.freedesktop.org
> >> Cc: Sean Paul <seanpaul@chromium.org>; Ville Syrjälä
> >> <ville.syrjala@linux.intel.com>
> >> Subject: RE: [PATCH v2 3/3] drm/i915/display: Implement seamless mode
> >> switch
> >>
> >> Hello Jose,
> >>
> >> Thanks much for the patch. I tested it on chrome system and the patch
> >> works.
> >> Adding my Tested-by.
> >> Tested-by: Vidya Srinivas <vidya.srinivas@intel.com>
> >>
> >> Regards
> >> Vidya
> >>
> >> > -----Original Message-----
> >> > From: Souza, Jose <jose.souza@intel.com>
> >> > Sent: Tuesday, May 3, 2022 2:11 AM
> >> > To: intel-gfx@lists.freedesktop.org
> >> > Cc: Srinivas, Vidya <vidya.srinivas@intel.com>; Sean Paul
> >> > <seanpaul@chromium.org>; Ville Syrjälä
> >> > <ville.syrjala@linux.intel.com>; Souza, Jose <jose.souza@intel.com>
> >> > Subject: [PATCH v2 3/3] drm/i915/display: Implement seamless mode
> >> > switch
> >> >
> >> > So far the i915's DRRS feature was automatically changing between
> >> > preferred panel mode and downclock mode based on idleness but
> >> ChromeOS
> >> > compositor team is asking to be in control of the mode switch.
> >> > So for certain types of content it can switch to a mode with a
> >> > lower refresh rate without the user noticing a thing and saving more
> power.
> >> >
> >> > This seamless mode switch will be triggered when user-space
> >> > dispatches an atomic commit with the new mode and clears the
> >> > DRM_MODE_ATOMIC_ALLOW_MODESET flag.
> >> >
> >> > The main steps to acomplish that are:
> >> >
> >> > - as mode changed in atomic state
> drm_atomic_helper_check_modeset()
> >> > will set mode_changed and it will trigger the crtc state
> >> > computation so
> >> > intel_dp_compute_config() will be called and dp_m_n will be
> >> > computed for the new mode
> >> >
> >> > - then intel_dp_drrs_compute_config() will check for the necessary
> >> > conditions to do a seamless mode switch, if possible crtc_state-
> >> > >seamless_mode_switch will be set and has_drrs will not be set, so
> >> > >i915 will
> >> > not automatically switch between modes
> >> >
> >> > - then intel_crtc_compute_config() will call
> >> > intel_crtc_compute_pixel_rate() that will take the hint that it is
> >> > trying to do a seamless mode switch and set pixel_rate to the
> >> > pixel_rate of the old state
> >> >
> >> > - then if nothing else changed in the state
> >> > intel_crtc_check_fastset() will be able to set mode_changed to
> >> > false and i915 can do fastset otherwise the commit will fail during
> >> > the check phase
> >> >
> >> > - now on the atomic commit phase, intel_ddi_update_pipe_dp() will
> >> > be called and will program the new dp_m_n
> >> >
> >> > - nothing else is different in the commit phase until the step to
> >> > verify programmed state, the most important change here is that
> >> > need to save the pixel_rate in DRRS global state as there is no
> >> > other way to get that from hardware or atomic state
> >> >
> >> > v2:
> >> > - not overwritten dp_m_n values in intel_crtc_copy_fastset() when
> >> > doing a seamless_mode_switch
> >> >
> >> > Cc: Vidya Srinivas <vidya.srinivas@intel.com>
> >> > Cc: Sean Paul <seanpaul@chromium.org>
> >> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >> > Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> >> > ---
> >> >  drivers/gpu/drm/i915/display/intel_ddi.c      | 10 +++
> >> >  drivers/gpu/drm/i915/display/intel_display.c  | 61
> >> > ++++++++++++++++--- .../drm/i915/display/intel_display_debugfs.c  |
> >> > ++++++++++++++++3 +
> >> >  .../drm/i915/display/intel_display_types.h    |  3 +
> >> >  drivers/gpu/drm/i915/display/intel_dp.c       | 56 ++++++++++++++---
> >> >  drivers/gpu/drm/i915/display/intel_drrs.c     | 38 +++++++++---
> >> >  drivers/gpu/drm/i915/display/intel_drrs.h     |  3 +
> >> >  7 files changed, 151 insertions(+), 23 deletions(-)
> >> >
> >> > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c
> >> > b/drivers/gpu/drm/i915/display/intel_ddi.c
> >> > index 9e6fa59eabba7..732e5d425412e 100644
> >> > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> >> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> >> > @@ -46,6 +46,7 @@
> >> >  #include "intel_dp_link_training.h"
> >> >  #include "intel_dp_mst.h"
> >> >  #include "intel_dpio_phy.h"
> >> > +#include "intel_drrs.h"
> >> >  #include "intel_dsi.h"
> >> >  #include "intel_fdi.h"
> >> >  #include "intel_fifo_underrun.h"
> >> > @@ -3010,6 +3011,14 @@ static void intel_ddi_update_pipe_dp(struct
> >> > intel_atomic_state *state,
> >> >
> >> >  	intel_backlight_update(state, encoder, crtc_state, conn_state);
> >> >  	drm_connector_update_privacy_screen(conn_state);
> >> > +
> >> > +	if (crtc_state->seamless_mode_switch) {
> >> > +		struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state-
> >> > >uapi.crtc);
> >> > +
> >> > +		intel_cpu_transcoder_set_m1_n1(intel_crtc,
> >> > +					       crtc_state->cpu_transcoder,
> >> > +					       &crtc_state->dp_m_n);
> >> > +	}
> >> >  }
> >> >
> >> >  void intel_ddi_update_pipe(struct intel_atomic_state *state, @@
> >> > -3484,6
> >> > +3493,7 @@ static void intel_ddi_get_config(struct intel_encoder
> >> > +*encoder,
> >> >  	intel_read_dp_sdp(encoder, pipe_config, DP_SDP_VSC);
> >> >
> >> >  	intel_psr_get_config(encoder, pipe_config);
> >> > +	intel_drrs_get_config(encoder, pipe_config);
> >> >  }
> >> >
> >> >  void intel_ddi_get_clock(struct intel_encoder *encoder, diff --git
> >> > a/drivers/gpu/drm/i915/display/intel_display.c
> >> > b/drivers/gpu/drm/i915/display/intel_display.c
> >> > index 17d0cad9e1686..e54fbe3b1d394 100644
> >> > --- a/drivers/gpu/drm/i915/display/intel_display.c
> >> > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> >> > @@ -2629,6 +2629,44 @@ static void
> >> > intel_crtc_compute_pixel_rate(struct
> >> > intel_crtc_state *crtc_state)
> >> >  	else
> >> >  		crtc_state->pixel_rate =
> >> >  			ilk_pipe_pixel_rate(crtc_state);
> >> > +
> >> > +	/*
> >> > +	 * Do not change pixel_rate when doing seamless mode switch,
> >> > otherwise
> >> > +	 * it will change port_clock and other stuff that will need a modeset
> >> > +	 * to be programmed
> >> > +	 */
> >> > +	if (crtc_state->seamless_mode_switch) {
> >> > +		struct intel_atomic_state *state =
> >> > to_intel_atomic_state(crtc_state->uapi.state);
> >> > +		struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> >> > +		const struct intel_crtc_state *old_crtc_state;
> >> > +
> >> > +		old_crtc_state = intel_atomic_get_old_crtc_state(state, crtc);
> >> > +
> >> > +		/*
> >> > +		 * It can only seamless switch if pixel rate of the new mode is
> >> > +		 * <= than old one, if not commit will fail with pixel_rate
> >> > +		 * mismatch.
> >> > +		 */
> >> > +		if (crtc_state->pixel_rate < old_crtc_state->pixel_rate ||
> >> > +		    intel_fuzzy_clock_check(crtc_state->pixel_rate,
> >> > +					    old_crtc_state->pixel_rate))
> >> > +			crtc_state->pixel_rate = old_crtc_state->pixel_rate;
> >> > +	}
> >> > +}
> >> > +
> >> > +static void intel_crtc_get_pixel_rate(struct intel_crtc_state
> >> > +*crtc_state) {
> >> > +	if (crtc_state->seamless_mode_switch) {
> >> > +		struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> >> > +
> >> > +		mutex_lock(&crtc->drrs.mutex);
> >> > +		crtc_state->pixel_rate = crtc-
> >> > >drrs.seamless_mode_switch_pixel_rate;
> >> > +		mutex_unlock(&crtc->drrs.mutex);
> >> > +
> >> > +		return;
> >> > +	}
> >> > +
> >> > +	intel_crtc_compute_pixel_rate(crtc_state);
> >> >  }
> >> >
> >> >  static void intel_bigjoiner_adjust_timings(const struct
> >> > intel_crtc_state *crtc_state, @@ -2705,7 +2743,7 @@ static void
> >> > intel_crtc_readout_derived_state(struct intel_crtc_state *crtc_state
> >> >  	intel_bigjoiner_adjust_timings(crtc_state, pipe_mode);
> >> >  	intel_mode_from_crtc_timings(pipe_mode, pipe_mode);
> >> >
> >> > -	intel_crtc_compute_pixel_rate(crtc_state);
> >> > +	intel_crtc_get_pixel_rate(crtc_state);
> >> >  }
> >> >
> >> >  static void intel_encoder_get_config(struct intel_encoder
> >> > *encoder, @@ -
> >> > 6182,11 +6220,13 @@ intel_pipe_config_compare(const struct
> >> > intel_crtc_state *current_config,
> >> >  	PIPE_CONF_CHECK_I(lane_count);
> >> >  	PIPE_CONF_CHECK_X(lane_lat_optim_mask);
> >> >
> >> > -	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv)) {
> >> > -		PIPE_CONF_CHECK_M_N_ALT(dp_m_n, dp_m2_n2);
> >> > -	} else {
> >> > -		PIPE_CONF_CHECK_M_N(dp_m_n);
> >> > -		PIPE_CONF_CHECK_M_N(dp_m2_n2);
> >> > +	if (!pipe_config->seamless_mode_switch) {
> >> > +		if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
> >> > {
> >> > +			PIPE_CONF_CHECK_M_N_ALT(dp_m_n, dp_m2_n2);
> >> > +		} else {
> >> > +			PIPE_CONF_CHECK_M_N(dp_m_n);
> >> > +			PIPE_CONF_CHECK_M_N(dp_m2_n2);
> >> > +		}
> >> >  	}
> >> >
> >> >  	PIPE_CONF_CHECK_X(output_types);
> >> > @@ -6348,8 +6388,10 @@ intel_pipe_config_compare(const struct
> >> > intel_crtc_state *current_config,
> >> >  	if (IS_G4X(dev_priv) || DISPLAY_VER(dev_priv) >= 5)
> >> >  		PIPE_CONF_CHECK_I(pipe_bpp);
> >> >
> >> > -	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.pipe_mode.crtc_clock);
> >> > -	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.adjusted_mode.crtc_clock);
> >> > +	if (!pipe_config->seamless_mode_switch) {
> >> > +		PIPE_CONF_CHECK_CLOCK_FUZZY(hw.pipe_mode.crtc_clock);
> >> > +
> >> > 	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.adjusted_mode.crtc_clock);
> >> > +	}
> >> >  	PIPE_CONF_CHECK_CLOCK_FUZZY(port_clock);
> >> >
> >> >  	PIPE_CONF_CHECK_I(min_voltage_level);
> >> > @@ -7085,11 +7127,12 @@ static void intel_crtc_copy_fastset(const
> >> > struct intel_crtc_state *old_crtc_stat
> >> >  	 * FIXME: should really copy more fuzzy state here
> >> >  	 */
> >> >  	new_crtc_state->fdi_m_n = old_crtc_state->fdi_m_n;
> >> > -	new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
> >> >
> >> >  	if (!intel_drrs_crtc_copy_fastset(old_crtc_state,
> >> > new_crtc_state)) {
> >> > +		new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
> >> >  		new_crtc_state->dp_m2_n2 = old_crtc_state->dp_m2_n2;
> >> >  		new_crtc_state->has_drrs = old_crtc_state->has_drrs;
> >> > +		new_crtc_state->seamless_mode_switch =
> >> > +old_crtc_state->seamless_mode_switch;
> >> >  	}
> >> >  }
> >> >
> >> > diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> >> > b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> >> > index 452d773fd4e34..92099e1f0b23e 100644
> >> > --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> >> > +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> >> > @@ -1108,6 +1108,9 @@ static int i915_drrs_status(struct seq_file
> >> > *m, void
> >> > *unused)
> >> >  			   crtc->drrs.refresh_rate ==
> >> > DRRS_REFRESH_RATE_LOW ?
> >> >  			   "low" : "high");
> >> >
> >> > +		seq_printf(m, "Seamless mode switch enabled: %s\n",
> >> > +			   str_yes_no(crtc-
> >> > >drrs.seamless_mode_switch_pixel_rate));
> >> > +
> >> >  		mutex_unlock(&crtc->drrs.mutex);
> >> >  	}
> >> >
> >> > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> >> > b/drivers/gpu/drm/i915/display/intel_display_types.h
> >> > index 408152f9f46a4..e290366adfc27 100644
> >> > --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> >> > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> >> > @@ -1057,6 +1057,7 @@ struct intel_crtc_state {
> >> >  	/* m2_n2 for eDP downclock */
> >> >  	struct intel_link_m_n dp_m2_n2;
> >> >  	bool has_drrs;
> >> > +	bool seamless_mode_switch;
> >> >
> >> >  	/* PSR is supported but might not be enabled due the lack of
> >> > enabled planes */
> >> >  	bool has_psr;
> >> > @@ -1314,6 +1315,8 @@ struct intel_crtc {
> >> >  		unsigned int busy_frontbuffer_bits;
> >> >  		enum transcoder cpu_transcoder;
> >> >  		struct intel_link_m_n m_n, m2_n2;
> >> > +		/* Only used to verify if programmed state matches */
> >> > +		unsigned int seamless_mode_switch_pixel_rate;
> >> >  	} drrs;
> >> >
> >> >  	int scanline_offset;
> >> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> >> > b/drivers/gpu/drm/i915/display/intel_dp.c
> >> > index cc9be82e128f4..691d362dde95e 100644
> >> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> >> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> >> > @@ -1844,8 +1844,7 @@ static bool cpu_transcoder_has_drrs(struct
> >> > drm_i915_private *i915,  }
> >> >
> >> >  static bool can_enable_drrs(struct intel_connector *connector,
> >> > -			    const struct intel_crtc_state *pipe_config,
> >> > -			    const struct drm_display_mode
> >> > *downclock_mode)
> >> > +			    const struct intel_crtc_state *pipe_config)
> >> >  {
> >> >  	struct drm_i915_private *i915 = to_i915(connector->base.dev);
> >> >
> >> > @@ -1868,8 +1867,40 @@ static bool can_enable_drrs(struct
> >> > intel_connector *connector,
> >> >  	if (!cpu_transcoder_has_drrs(i915, pipe_config->cpu_transcoder))
> >> >  		return false;
> >> >
> >> > -	return downclock_mode &&
> >> > -		intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS;
> >> > +	return intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS; }
> >> > +
> >> > +static bool can_seamless_switch_mode(struct intel_crtc_state
> >> > +*pipe_config) {
> >> > +	struct drm_i915_private *i915 = to_i915(pipe_config->uapi.crtc-
> >> > >dev);
> >> > +	const struct intel_crtc_state *old_pipe_config;
> >> > +	struct intel_atomic_state *state;
> >> > +	struct intel_crtc *intel_crtc;
> >> > +
> >> > +	/* Only supported in platforms that can switch m_n on the fly */
> >> > +	if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config-
> >> > >cpu_transcoder))
> >> > +		return false;
> >> > +
> >> > +	state = to_intel_atomic_state(pipe_config->uapi.state);
> >> > +	if (state->base.allow_modeset)
> >> > +		return false;
> >> > +
> >> > +	intel_crtc = to_intel_crtc(pipe_config->uapi.crtc);
> >> > +	old_pipe_config = intel_atomic_get_old_crtc_state(state, intel_crtc);
> >> > +	if (drm_mode_equal(&old_pipe_config->hw.adjusted_mode,
> >> > +			   &pipe_config->hw.adjusted_mode))
> >> > +		return false;
> >> > +
> >> > +	/* Only clock can change */
> >> > +	if (!drm_mode_match(&old_pipe_config->hw.adjusted_mode,
> >> > +			    &pipe_config->hw.adjusted_mode,
> >> > +			    DRM_MODE_MATCH_TIMINGS |
> >> > +			    DRM_MODE_MATCH_FLAGS |
> >> > +			    DRM_MODE_MATCH_3D_FLAGS |
> >> > +			    DRM_MODE_MATCH_ASPECT_RATIO))
> >> > +		return false;
> >> > +
> >> > +	return true;
> >> >  }
> >> >
> >> >  static void
> >> > @@ -1882,12 +1913,17 @@ intel_dp_drrs_compute_config(struct
> >> > intel_connector *connector,
> >> >  		intel_panel_downclock_mode(connector, &pipe_config-
> >> > >hw.adjusted_mode);
> >> >  	int pixel_clock;
> >> >
> >> > -	if (!can_enable_drrs(connector, pipe_config, downclock_mode)) {
> >> > -		if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config-
> >> > >cpu_transcoder))
> >> > -			intel_zero_m_n(&pipe_config->dp_m2_n2);
> >> > +	if (!can_enable_drrs(connector, pipe_config))
> >> > +		goto not_supported;
> >> > +
> >> > +	if (can_seamless_switch_mode(pipe_config)) {
> >> > +		pipe_config->seamless_mode_switch = true;
> >> >  		return;
> >> >  	}
> >> >
> >> > +	if (!downclock_mode)
> >> > +		goto not_supported;
> >> > +
> >> >  	if (IS_IRONLAKE(i915) || IS_SANDYBRIDGE(i915) ||
> >> > IS_IVYBRIDGE(i915))
> >> >  		pipe_config->msa_timing_delay = i915-
> >> > >vbt.edp.drrs_msa_timing_delay;
> >> >
> >> > @@ -1904,6 +1940,12 @@ intel_dp_drrs_compute_config(struct
> >> > intel_connector *connector,
> >> >  	/* FIXME: abstract this better */
> >> >  	if (pipe_config->splitter.enable)
> >> >  		pipe_config->dp_m2_n2.data_m *= pipe_config-
> >> > >splitter.link_count;
> >> > +
> >> > +	return;
> >> > +
> >> > +not_supported:
> >> > +	if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config-
> >> > >cpu_transcoder))
> >> > +		intel_zero_m_n(&pipe_config->dp_m2_n2);
> >> >  }
> >> >
> >> >  static bool intel_dp_has_audio(struct intel_encoder *encoder, diff
> >> > --git a/drivers/gpu/drm/i915/display/intel_drrs.c
> >> > b/drivers/gpu/drm/i915/display/intel_drrs.c
> >> > index d266fad83a086..ffd51d2f5998d 100644
> >> > --- a/drivers/gpu/drm/i915/display/intel_drrs.c
> >> > +++ b/drivers/gpu/drm/i915/display/intel_drrs.c
> >> > @@ -144,16 +144,19 @@ void intel_drrs_activate(const struct
> >> > intel_crtc_state *crtc_state)  {
> >> >  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> >> >
> >> > +	mutex_lock(&crtc->drrs.mutex);
> >> > +
> >> > +	crtc->drrs.seamless_mode_switch_pixel_rate = crtc_state-
> >> > >seamless_mode_switch ?
> >> > +						     crtc_state->pixel_rate : 0;
> >> > +
> >> >  	if (!crtc_state->has_drrs)
> >> > -		return;
> >> > +		goto unlock;
> >> >
> >> >  	if (!crtc_state->hw.active)
> >> > -		return;
> >> > +		goto unlock;
> >> >
> >> >  	if (intel_crtc_is_bigjoiner_slave(crtc_state))
> >> > -		return;
> >> > -
> >> > -	mutex_lock(&crtc->drrs.mutex);
> >> > +		goto unlock;
> >> >
> >> >  	crtc->drrs.cpu_transcoder = crtc_state->cpu_transcoder;
> >> >  	crtc->drrs.m_n = crtc_state->dp_m_n; @@ -163,6 +166,7 @@ void
> >> > intel_drrs_activate(const struct intel_crtc_state
> >> > *crtc_state)
> >> >
> >> >  	intel_drrs_schedule_work(crtc);
> >> >
> >> > +unlock:
> >> >  	mutex_unlock(&crtc->drrs.mutex);
> >> >  }
> >> >
> >> > @@ -176,7 +180,7 @@ void intel_drrs_deactivate(const struct
> >> > intel_crtc_state *old_crtc_state)  {
> >> >  	struct intel_crtc *crtc =
> >> > to_intel_crtc(old_crtc_state->uapi.crtc);
> >> >
> >> > -	if (!old_crtc_state->has_drrs)
> >> > +	if (!old_crtc_state->has_drrs &&
> >> > +!old_crtc_state->seamless_mode_switch)
> >> >  		return;
> >> >
> >> >  	if (!old_crtc_state->hw.active)
> >> > @@ -187,12 +191,14 @@ void intel_drrs_deactivate(const struct
> >> > intel_crtc_state *old_crtc_state)
> >> >
> >> >  	mutex_lock(&crtc->drrs.mutex);
> >> >
> >> > -	if (intel_drrs_is_active(crtc))
> >> > +	if (intel_drrs_is_active(crtc) &&
> >> > +	    old_crtc_state->seamless_mode_switch == 0)
> >> >  		intel_drrs_set_state(crtc, DRRS_REFRESH_RATE_HIGH);
> >> >
> >> >  	crtc->drrs.cpu_transcoder = INVALID_TRANSCODER;
> >> >  	crtc->drrs.frontbuffer_bits = 0;
> >> >  	crtc->drrs.busy_frontbuffer_bits = 0;
> >> > +	crtc->drrs.seamless_mode_switch_pixel_rate = 0;
> >> >
> >> >  	mutex_unlock(&crtc->drrs.mutex);
> >> >
> >> > @@ -322,5 +328,23 @@ bool intel_drrs_crtc_copy_fastset(const struct
> >> > intel_crtc_state *old_crtc_state,
> >> >  	if (intel_cpu_transcoder_has_m2_n2(i915, new_crtc_state-
> >> > >cpu_transcoder))
> >> >  		return false;
> >> >
> >> > +	if (!new_crtc_state->seamless_mode_switch)
> >> > +		new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
> >> > +
> >> >  	return true;
> >> >  }
> >> > +
> >> > +void intel_drrs_get_config(struct intel_encoder *encoder,
> >> > +			   struct intel_crtc_state *pipe_config) {
> >> > +	struct intel_crtc *crtc;
> >> > +
> >> > +	crtc = to_intel_crtc(pipe_config->uapi.crtc);
> >> > +
> >> > +	mutex_lock(&crtc->drrs.mutex);
> >> > +
> >> > +	pipe_config->seamless_mode_switch = crtc-
> >> > >drrs.seamless_mode_switch_pixel_rate;
> >> > +	pipe_config->has_drrs = intel_drrs_is_active(crtc);
> >> > +
> >> > +	mutex_unlock(&crtc->drrs.mutex);
> >> > +}
> >> > diff --git a/drivers/gpu/drm/i915/display/intel_drrs.h
> >> > b/drivers/gpu/drm/i915/display/intel_drrs.h
> >> > index 749ac717db063..a100023658a5a 100644
> >> > --- a/drivers/gpu/drm/i915/display/intel_drrs.h
> >> > +++ b/drivers/gpu/drm/i915/display/intel_drrs.h
> >> > @@ -14,6 +14,7 @@ struct intel_atomic_state;  struct intel_crtc;
> >> > struct intel_crtc_state;  struct intel_connector;
> >> > +struct intel_encoder;
> >> >
> >> >  const char *intel_drrs_type_str(enum drrs_type drrs_type);  bool
> >> > intel_drrs_is_active(struct intel_crtc *crtc); @@ -26,5 +27,7 @@
> >> > void intel_drrs_flush(struct drm_i915_private *dev_priv,  void
> >> > intel_crtc_drrs_init(struct intel_crtc *crtc);  bool
> >> > intel_drrs_crtc_copy_fastset(const struct intel_crtc_state
> *old_crtc_state,
> >> >  				  struct intel_crtc_state *new_crtc_state);
> >> > +void intel_drrs_get_config(struct intel_encoder *encoder,
> >> > +			   struct intel_crtc_state *pipe_config);
> >> >
> >> >  #endif /* __INTEL_DRRS_H__ */
> >> > --
> >> > 2.36.0
> >
> 
> --
> Jani Nikula, Intel Open Source Graphics Center

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

* Re: [Intel-gfx] [PATCH v2 3/3] drm/i915/display: Implement seamless mode switch
  2022-05-25  9:19         ` Srinivas, Vidya
@ 2022-05-26  4:58           ` Srinivas, Vidya
  0 siblings, 0 replies; 10+ messages in thread
From: Srinivas, Vidya @ 2022-05-26  4:58 UTC (permalink / raw)
  To: Jani Nikula, Souza, Jose, intel-gfx; +Cc: Syrjala, Ville, Sean Paul



> -----Original Message-----
> From: Srinivas, Vidya
> Sent: Wednesday, May 25, 2022 2:50 PM
> To: Jani Nikula <jani.nikula@linux.intel.com>; Souza, Jose
> <jose.souza@intel.com>; intel-gfx@lists.freedesktop.org
> Cc: Sean Paul <seanpaul@chromium.org>; Syrjala, Ville
> <ville.syrjala@intel.com>
> Subject: RE: [Intel-gfx] [PATCH v2 3/3] drm/i915/display: Implement seamless
> mode switch
> 
> 
> 
> > -----Original Message-----
> > From: Jani Nikula <jani.nikula@linux.intel.com>
> > Sent: Wednesday, May 25, 2022 2:26 PM
> > To: Srinivas, Vidya <vidya.srinivas@intel.com>; Souza, Jose
> > <jose.souza@intel.com>; intel-gfx@lists.freedesktop.org
> > Cc: Sean Paul <seanpaul@chromium.org>; Syrjala, Ville
> > <ville.syrjala@intel.com>
> > Subject: Re: [Intel-gfx] [PATCH v2 3/3] drm/i915/display: Implement
> > seamless mode switch
> >
> > On Wed, 25 May 2022, "Srinivas, Vidya" <vidya.srinivas@intel.com> wrote:
> > > Hello,
> > >
> > > Apologies for bothering. May we kindly know if this solution is approved?
> > > I have provided the Tested-by. Thanks much.
> >
> > IIUC the more complete solution is [1].
> >
> > BR,
> > Jani.
> >
> >
> > [1] https://patchwork.freedesktop.org/series/103491/
> >
> Hello Jani,
> 
> Thank you very much. I will have a check of this.
> For user space triggered seamless modeset WITHOUT setting
> "DRM_MODE_ATOMIC_ALLOW_MODESET", for switch between 2 refresh
> rates, Jose patches is working.
> Jose please correct me if I am wrong. Thank you.
> 
> Regards
> Vidya

Hello Jani,

I checked the new series https://patchwork.freedesktop.org/series/103491/ and this is working as well.
I tested it on ADL-P RVP with 144/60Hz panel.
Both solutions from Jose and Ville are working. Many thanks to both.

Regards
Vidya

> >
> >
> > >
> > > Regards
> > > Vidya
> > >
> > >> -----Original Message-----
> > >> From: Srinivas, Vidya
> > >> Sent: Monday, May 9, 2022 8:44 PM
> > >> To: Souza, Jose <jose.souza@intel.com>;
> > >> intel-gfx@lists.freedesktop.org
> > >> Cc: Sean Paul <seanpaul@chromium.org>; Ville Syrjälä
> > >> <ville.syrjala@linux.intel.com>
> > >> Subject: RE: [PATCH v2 3/3] drm/i915/display: Implement seamless
> > >> mode switch
> > >>
> > >> Hello Jose,
> > >>
> > >> Thanks much for the patch. I tested it on chrome system and the
> > >> patch works.
> > >> Adding my Tested-by.
> > >> Tested-by: Vidya Srinivas <vidya.srinivas@intel.com>
> > >>
> > >> Regards
> > >> Vidya
> > >>
> > >> > -----Original Message-----
> > >> > From: Souza, Jose <jose.souza@intel.com>
> > >> > Sent: Tuesday, May 3, 2022 2:11 AM
> > >> > To: intel-gfx@lists.freedesktop.org
> > >> > Cc: Srinivas, Vidya <vidya.srinivas@intel.com>; Sean Paul
> > >> > <seanpaul@chromium.org>; Ville Syrjälä
> > >> > <ville.syrjala@linux.intel.com>; Souza, Jose
> > >> > <jose.souza@intel.com>
> > >> > Subject: [PATCH v2 3/3] drm/i915/display: Implement seamless mode
> > >> > switch
> > >> >
> > >> > So far the i915's DRRS feature was automatically changing between
> > >> > preferred panel mode and downclock mode based on idleness but
> > >> ChromeOS
> > >> > compositor team is asking to be in control of the mode switch.
> > >> > So for certain types of content it can switch to a mode with a
> > >> > lower refresh rate without the user noticing a thing and saving
> > >> > more
> > power.
> > >> >
> > >> > This seamless mode switch will be triggered when user-space
> > >> > dispatches an atomic commit with the new mode and clears the
> > >> > DRM_MODE_ATOMIC_ALLOW_MODESET flag.
> > >> >
> > >> > The main steps to acomplish that are:
> > >> >
> > >> > - as mode changed in atomic state
> > drm_atomic_helper_check_modeset()
> > >> > will set mode_changed and it will trigger the crtc state
> > >> > computation so
> > >> > intel_dp_compute_config() will be called and dp_m_n will be
> > >> > computed for the new mode
> > >> >
> > >> > - then intel_dp_drrs_compute_config() will check for the
> > >> > necessary conditions to do a seamless mode switch, if possible
> > >> > crtc_state-
> > >> > >seamless_mode_switch will be set and has_drrs will not be set,
> > >> > >so
> > >> > >i915 will
> > >> > not automatically switch between modes
> > >> >
> > >> > - then intel_crtc_compute_config() will call
> > >> > intel_crtc_compute_pixel_rate() that will take the hint that it
> > >> > is trying to do a seamless mode switch and set pixel_rate to the
> > >> > pixel_rate of the old state
> > >> >
> > >> > - then if nothing else changed in the state
> > >> > intel_crtc_check_fastset() will be able to set mode_changed to
> > >> > false and i915 can do fastset otherwise the commit will fail
> > >> > during the check phase
> > >> >
> > >> > - now on the atomic commit phase, intel_ddi_update_pipe_dp() will
> > >> > be called and will program the new dp_m_n
> > >> >
> > >> > - nothing else is different in the commit phase until the step to
> > >> > verify programmed state, the most important change here is that
> > >> > need to save the pixel_rate in DRRS global state as there is no
> > >> > other way to get that from hardware or atomic state
> > >> >
> > >> > v2:
> > >> > - not overwritten dp_m_n values in intel_crtc_copy_fastset() when
> > >> > doing a seamless_mode_switch
> > >> >
> > >> > Cc: Vidya Srinivas <vidya.srinivas@intel.com>
> > >> > Cc: Sean Paul <seanpaul@chromium.org>
> > >> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > >> > Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> > >> > ---
> > >> >  drivers/gpu/drm/i915/display/intel_ddi.c      | 10 +++
> > >> >  drivers/gpu/drm/i915/display/intel_display.c  | 61
> > >> > ++++++++++++++++--- .../drm/i915/display/intel_display_debugfs.c
> > >> > ++++++++++++++++|
> > >> > ++++++++++++++++3 +
> > >> >  .../drm/i915/display/intel_display_types.h    |  3 +
> > >> >  drivers/gpu/drm/i915/display/intel_dp.c       | 56 ++++++++++++++---
> > >> >  drivers/gpu/drm/i915/display/intel_drrs.c     | 38 +++++++++---
> > >> >  drivers/gpu/drm/i915/display/intel_drrs.h     |  3 +
> > >> >  7 files changed, 151 insertions(+), 23 deletions(-)
> > >> >
> > >> > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c
> > >> > b/drivers/gpu/drm/i915/display/intel_ddi.c
> > >> > index 9e6fa59eabba7..732e5d425412e 100644
> > >> > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > >> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > >> > @@ -46,6 +46,7 @@
> > >> >  #include "intel_dp_link_training.h"
> > >> >  #include "intel_dp_mst.h"
> > >> >  #include "intel_dpio_phy.h"
> > >> > +#include "intel_drrs.h"
> > >> >  #include "intel_dsi.h"
> > >> >  #include "intel_fdi.h"
> > >> >  #include "intel_fifo_underrun.h"
> > >> > @@ -3010,6 +3011,14 @@ static void
> > >> > intel_ddi_update_pipe_dp(struct intel_atomic_state *state,
> > >> >
> > >> >  	intel_backlight_update(state, encoder, crtc_state, conn_state);
> > >> >  	drm_connector_update_privacy_screen(conn_state);
> > >> > +
> > >> > +	if (crtc_state->seamless_mode_switch) {
> > >> > +		struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state-
> > >> > >uapi.crtc);
> > >> > +
> > >> > +		intel_cpu_transcoder_set_m1_n1(intel_crtc,
> > >> > +					       crtc_state->cpu_transcoder,
> > >> > +					       &crtc_state->dp_m_n);
> > >> > +	}
> > >> >  }
> > >> >
> > >> >  void intel_ddi_update_pipe(struct intel_atomic_state *state, @@
> > >> > -3484,6
> > >> > +3493,7 @@ static void intel_ddi_get_config(struct intel_encoder
> > >> > +*encoder,
> > >> >  	intel_read_dp_sdp(encoder, pipe_config, DP_SDP_VSC);
> > >> >
> > >> >  	intel_psr_get_config(encoder, pipe_config);
> > >> > +	intel_drrs_get_config(encoder, pipe_config);
> > >> >  }
> > >> >
> > >> >  void intel_ddi_get_clock(struct intel_encoder *encoder, diff
> > >> > --git a/drivers/gpu/drm/i915/display/intel_display.c
> > >> > b/drivers/gpu/drm/i915/display/intel_display.c
> > >> > index 17d0cad9e1686..e54fbe3b1d394 100644
> > >> > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > >> > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > >> > @@ -2629,6 +2629,44 @@ static void
> > >> > intel_crtc_compute_pixel_rate(struct
> > >> > intel_crtc_state *crtc_state)
> > >> >  	else
> > >> >  		crtc_state->pixel_rate =
> > >> >  			ilk_pipe_pixel_rate(crtc_state);
> > >> > +
> > >> > +	/*
> > >> > +	 * Do not change pixel_rate when doing seamless mode switch,
> > >> > otherwise
> > >> > +	 * it will change port_clock and other stuff that will need a modeset
> > >> > +	 * to be programmed
> > >> > +	 */
> > >> > +	if (crtc_state->seamless_mode_switch) {
> > >> > +		struct intel_atomic_state *state =
> > >> > to_intel_atomic_state(crtc_state->uapi.state);
> > >> > +		struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> > >> > +		const struct intel_crtc_state *old_crtc_state;
> > >> > +
> > >> > +		old_crtc_state = intel_atomic_get_old_crtc_state(state, crtc);
> > >> > +
> > >> > +		/*
> > >> > +		 * It can only seamless switch if pixel rate of the new mode is
> > >> > +		 * <= than old one, if not commit will fail with pixel_rate
> > >> > +		 * mismatch.
> > >> > +		 */
> > >> > +		if (crtc_state->pixel_rate < old_crtc_state->pixel_rate ||
> > >> > +		    intel_fuzzy_clock_check(crtc_state->pixel_rate,
> > >> > +					    old_crtc_state->pixel_rate))
> > >> > +			crtc_state->pixel_rate = old_crtc_state->pixel_rate;
> > >> > +	}
> > >> > +}
> > >> > +
> > >> > +static void intel_crtc_get_pixel_rate(struct intel_crtc_state
> > >> > +*crtc_state) {
> > >> > +	if (crtc_state->seamless_mode_switch) {
> > >> > +		struct intel_crtc *crtc =
> > >> > +to_intel_crtc(crtc_state->uapi.crtc);
> > >> > +
> > >> > +		mutex_lock(&crtc->drrs.mutex);
> > >> > +		crtc_state->pixel_rate = crtc-
> > >> > >drrs.seamless_mode_switch_pixel_rate;
> > >> > +		mutex_unlock(&crtc->drrs.mutex);
> > >> > +
> > >> > +		return;
> > >> > +	}
> > >> > +
> > >> > +	intel_crtc_compute_pixel_rate(crtc_state);
> > >> >  }
> > >> >
> > >> >  static void intel_bigjoiner_adjust_timings(const struct
> > >> > intel_crtc_state *crtc_state, @@ -2705,7 +2743,7 @@ static void
> > >> > intel_crtc_readout_derived_state(struct intel_crtc_state *crtc_state
> > >> >  	intel_bigjoiner_adjust_timings(crtc_state, pipe_mode);
> > >> >  	intel_mode_from_crtc_timings(pipe_mode, pipe_mode);
> > >> >
> > >> > -	intel_crtc_compute_pixel_rate(crtc_state);
> > >> > +	intel_crtc_get_pixel_rate(crtc_state);
> > >> >  }
> > >> >
> > >> >  static void intel_encoder_get_config(struct intel_encoder
> > >> > *encoder, @@ -
> > >> > 6182,11 +6220,13 @@ intel_pipe_config_compare(const struct
> > >> > intel_crtc_state *current_config,
> > >> >  	PIPE_CONF_CHECK_I(lane_count);
> > >> >  	PIPE_CONF_CHECK_X(lane_lat_optim_mask);
> > >> >
> > >> > -	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv)) {
> > >> > -		PIPE_CONF_CHECK_M_N_ALT(dp_m_n, dp_m2_n2);
> > >> > -	} else {
> > >> > -		PIPE_CONF_CHECK_M_N(dp_m_n);
> > >> > -		PIPE_CONF_CHECK_M_N(dp_m2_n2);
> > >> > +	if (!pipe_config->seamless_mode_switch) {
> > >> > +		if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
> > >> > {
> > >> > +			PIPE_CONF_CHECK_M_N_ALT(dp_m_n, dp_m2_n2);
> > >> > +		} else {
> > >> > +			PIPE_CONF_CHECK_M_N(dp_m_n);
> > >> > +			PIPE_CONF_CHECK_M_N(dp_m2_n2);
> > >> > +		}
> > >> >  	}
> > >> >
> > >> >  	PIPE_CONF_CHECK_X(output_types); @@ -6348,8 +6388,10 @@
> > >> > intel_pipe_config_compare(const struct intel_crtc_state
> > >> > *current_config,
> > >> >  	if (IS_G4X(dev_priv) || DISPLAY_VER(dev_priv) >= 5)
> > >> >  		PIPE_CONF_CHECK_I(pipe_bpp);
> > >> >
> > >> > -	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.pipe_mode.crtc_clock);
> > >> > -	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.adjusted_mode.crtc_clock);
> > >> > +	if (!pipe_config->seamless_mode_switch) {
> > >> > +		PIPE_CONF_CHECK_CLOCK_FUZZY(hw.pipe_mode.crtc_clock);
> > >> > +
> > >> > 	PIPE_CONF_CHECK_CLOCK_FUZZY(hw.adjusted_mode.crtc_clock);
> > >> > +	}
> > >> >  	PIPE_CONF_CHECK_CLOCK_FUZZY(port_clock);
> > >> >
> > >> >  	PIPE_CONF_CHECK_I(min_voltage_level);
> > >> > @@ -7085,11 +7127,12 @@ static void intel_crtc_copy_fastset(const
> > >> > struct intel_crtc_state *old_crtc_stat
> > >> >  	 * FIXME: should really copy more fuzzy state here
> > >> >  	 */
> > >> >  	new_crtc_state->fdi_m_n = old_crtc_state->fdi_m_n;
> > >> > -	new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
> > >> >
> > >> >  	if (!intel_drrs_crtc_copy_fastset(old_crtc_state,
> > >> > new_crtc_state)) {
> > >> > +		new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
> > >> >  		new_crtc_state->dp_m2_n2 = old_crtc_state->dp_m2_n2;
> > >> >  		new_crtc_state->has_drrs = old_crtc_state->has_drrs;
> > >> > +		new_crtc_state->seamless_mode_switch =
> > >> > +old_crtc_state->seamless_mode_switch;
> > >> >  	}
> > >> >  }
> > >> >
> > >> > diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> > >> > b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> > >> > index 452d773fd4e34..92099e1f0b23e 100644
> > >> > --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> > >> > +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> > >> > @@ -1108,6 +1108,9 @@ static int i915_drrs_status(struct seq_file
> > >> > *m, void
> > >> > *unused)
> > >> >  			   crtc->drrs.refresh_rate ==
> DRRS_REFRESH_RATE_LOW ?
> > >> >  			   "low" : "high");
> > >> >
> > >> > +		seq_printf(m, "Seamless mode switch enabled: %s\n",
> > >> > +			   str_yes_no(crtc-
> > >> > >drrs.seamless_mode_switch_pixel_rate));
> > >> > +
> > >> >  		mutex_unlock(&crtc->drrs.mutex);
> > >> >  	}
> > >> >
> > >> > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> > >> > b/drivers/gpu/drm/i915/display/intel_display_types.h
> > >> > index 408152f9f46a4..e290366adfc27 100644
> > >> > --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> > >> > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> > >> > @@ -1057,6 +1057,7 @@ struct intel_crtc_state {
> > >> >  	/* m2_n2 for eDP downclock */
> > >> >  	struct intel_link_m_n dp_m2_n2;
> > >> >  	bool has_drrs;
> > >> > +	bool seamless_mode_switch;
> > >> >
> > >> >  	/* PSR is supported but might not be enabled due the lack of
> > >> > enabled planes */
> > >> >  	bool has_psr;
> > >> > @@ -1314,6 +1315,8 @@ struct intel_crtc {
> > >> >  		unsigned int busy_frontbuffer_bits;
> > >> >  		enum transcoder cpu_transcoder;
> > >> >  		struct intel_link_m_n m_n, m2_n2;
> > >> > +		/* Only used to verify if programmed state matches */
> > >> > +		unsigned int seamless_mode_switch_pixel_rate;
> > >> >  	} drrs;
> > >> >
> > >> >  	int scanline_offset;
> > >> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> > >> > b/drivers/gpu/drm/i915/display/intel_dp.c
> > >> > index cc9be82e128f4..691d362dde95e 100644
> > >> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > >> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > >> > @@ -1844,8 +1844,7 @@ static bool cpu_transcoder_has_drrs(struct
> > >> > drm_i915_private *i915,  }
> > >> >
> > >> >  static bool can_enable_drrs(struct intel_connector *connector,
> > >> > -			    const struct intel_crtc_state *pipe_config,
> > >> > -			    const struct drm_display_mode
> > >> > *downclock_mode)
> > >> > +			    const struct intel_crtc_state *pipe_config)
> > >> >  {
> > >> >  	struct drm_i915_private *i915 = to_i915(connector->base.dev);
> > >> >
> > >> > @@ -1868,8 +1867,40 @@ static bool can_enable_drrs(struct
> > >> > intel_connector *connector,
> > >> >  	if (!cpu_transcoder_has_drrs(i915, pipe_config->cpu_transcoder))
> > >> >  		return false;
> > >> >
> > >> > -	return downclock_mode &&
> > >> > -		intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS;
> > >> > +	return intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS;
> > >> > +}
> > >> > +
> > >> > +static bool can_seamless_switch_mode(struct intel_crtc_state
> > >> > +*pipe_config) {
> > >> > +	struct drm_i915_private *i915 = to_i915(pipe_config->uapi.crtc-
> > >> > >dev);
> > >> > +	const struct intel_crtc_state *old_pipe_config;
> > >> > +	struct intel_atomic_state *state;
> > >> > +	struct intel_crtc *intel_crtc;
> > >> > +
> > >> > +	/* Only supported in platforms that can switch m_n on the fly */
> > >> > +	if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config-
> > >> > >cpu_transcoder))
> > >> > +		return false;
> > >> > +
> > >> > +	state = to_intel_atomic_state(pipe_config->uapi.state);
> > >> > +	if (state->base.allow_modeset)
> > >> > +		return false;
> > >> > +
> > >> > +	intel_crtc = to_intel_crtc(pipe_config->uapi.crtc);
> > >> > +	old_pipe_config = intel_atomic_get_old_crtc_state(state, intel_crtc);
> > >> > +	if (drm_mode_equal(&old_pipe_config->hw.adjusted_mode,
> > >> > +			   &pipe_config->hw.adjusted_mode))
> > >> > +		return false;
> > >> > +
> > >> > +	/* Only clock can change */
> > >> > +	if (!drm_mode_match(&old_pipe_config->hw.adjusted_mode,
> > >> > +			    &pipe_config->hw.adjusted_mode,
> > >> > +			    DRM_MODE_MATCH_TIMINGS |
> > >> > +			    DRM_MODE_MATCH_FLAGS |
> > >> > +			    DRM_MODE_MATCH_3D_FLAGS |
> > >> > +			    DRM_MODE_MATCH_ASPECT_RATIO))
> > >> > +		return false;
> > >> > +
> > >> > +	return true;
> > >> >  }
> > >> >
> > >> >  static void
> > >> > @@ -1882,12 +1913,17 @@ intel_dp_drrs_compute_config(struct
> > >> > intel_connector *connector,
> > >> >  		intel_panel_downclock_mode(connector, &pipe_config-
> > >> > >hw.adjusted_mode);
> > >> >  	int pixel_clock;
> > >> >
> > >> > -	if (!can_enable_drrs(connector, pipe_config, downclock_mode)) {
> > >> > -		if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config-
> > >> > >cpu_transcoder))
> > >> > -			intel_zero_m_n(&pipe_config->dp_m2_n2);
> > >> > +	if (!can_enable_drrs(connector, pipe_config))
> > >> > +		goto not_supported;
> > >> > +
> > >> > +	if (can_seamless_switch_mode(pipe_config)) {
> > >> > +		pipe_config->seamless_mode_switch = true;
> > >> >  		return;
> > >> >  	}
> > >> >
> > >> > +	if (!downclock_mode)
> > >> > +		goto not_supported;
> > >> > +
> > >> >  	if (IS_IRONLAKE(i915) || IS_SANDYBRIDGE(i915) ||
> > >> > IS_IVYBRIDGE(i915))
> > >> >  		pipe_config->msa_timing_delay = i915-
> > >> > >vbt.edp.drrs_msa_timing_delay;
> > >> >
> > >> > @@ -1904,6 +1940,12 @@ intel_dp_drrs_compute_config(struct
> > >> > intel_connector *connector,
> > >> >  	/* FIXME: abstract this better */
> > >> >  	if (pipe_config->splitter.enable)
> > >> >  		pipe_config->dp_m2_n2.data_m *= pipe_config-
> > >> > >splitter.link_count;
> > >> > +
> > >> > +	return;
> > >> > +
> > >> > +not_supported:
> > >> > +	if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config-
> > >> > >cpu_transcoder))
> > >> > +		intel_zero_m_n(&pipe_config->dp_m2_n2);
> > >> >  }
> > >> >
> > >> >  static bool intel_dp_has_audio(struct intel_encoder *encoder,
> > >> > diff --git a/drivers/gpu/drm/i915/display/intel_drrs.c
> > >> > b/drivers/gpu/drm/i915/display/intel_drrs.c
> > >> > index d266fad83a086..ffd51d2f5998d 100644
> > >> > --- a/drivers/gpu/drm/i915/display/intel_drrs.c
> > >> > +++ b/drivers/gpu/drm/i915/display/intel_drrs.c
> > >> > @@ -144,16 +144,19 @@ void intel_drrs_activate(const struct
> > >> > intel_crtc_state *crtc_state)  {
> > >> >  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> > >> >
> > >> > +	mutex_lock(&crtc->drrs.mutex);
> > >> > +
> > >> > +	crtc->drrs.seamless_mode_switch_pixel_rate = crtc_state-
> > >> > >seamless_mode_switch ?
> > >> > +						     crtc_state->pixel_rate : 0;
> > >> > +
> > >> >  	if (!crtc_state->has_drrs)
> > >> > -		return;
> > >> > +		goto unlock;
> > >> >
> > >> >  	if (!crtc_state->hw.active)
> > >> > -		return;
> > >> > +		goto unlock;
> > >> >
> > >> >  	if (intel_crtc_is_bigjoiner_slave(crtc_state))
> > >> > -		return;
> > >> > -
> > >> > -	mutex_lock(&crtc->drrs.mutex);
> > >> > +		goto unlock;
> > >> >
> > >> >  	crtc->drrs.cpu_transcoder = crtc_state->cpu_transcoder;
> > >> >  	crtc->drrs.m_n = crtc_state->dp_m_n; @@ -163,6 +166,7 @@ void
> > >> > intel_drrs_activate(const struct intel_crtc_state
> > >> > *crtc_state)
> > >> >
> > >> >  	intel_drrs_schedule_work(crtc);
> > >> >
> > >> > +unlock:
> > >> >  	mutex_unlock(&crtc->drrs.mutex);  }
> > >> >
> > >> > @@ -176,7 +180,7 @@ void intel_drrs_deactivate(const struct
> > >> > intel_crtc_state *old_crtc_state)  {
> > >> >  	struct intel_crtc *crtc =
> > >> > to_intel_crtc(old_crtc_state->uapi.crtc);
> > >> >
> > >> > -	if (!old_crtc_state->has_drrs)
> > >> > +	if (!old_crtc_state->has_drrs &&
> > >> > +!old_crtc_state->seamless_mode_switch)
> > >> >  		return;
> > >> >
> > >> >  	if (!old_crtc_state->hw.active) @@ -187,12 +191,14 @@ void
> > >> > intel_drrs_deactivate(const struct intel_crtc_state
> > >> > *old_crtc_state)
> > >> >
> > >> >  	mutex_lock(&crtc->drrs.mutex);
> > >> >
> > >> > -	if (intel_drrs_is_active(crtc))
> > >> > +	if (intel_drrs_is_active(crtc) &&
> > >> > +	    old_crtc_state->seamless_mode_switch == 0)
> > >> >  		intel_drrs_set_state(crtc, DRRS_REFRESH_RATE_HIGH);
> > >> >
> > >> >  	crtc->drrs.cpu_transcoder = INVALID_TRANSCODER;
> > >> >  	crtc->drrs.frontbuffer_bits = 0;
> > >> >  	crtc->drrs.busy_frontbuffer_bits = 0;
> > >> > +	crtc->drrs.seamless_mode_switch_pixel_rate = 0;
> > >> >
> > >> >  	mutex_unlock(&crtc->drrs.mutex);
> > >> >
> > >> > @@ -322,5 +328,23 @@ bool intel_drrs_crtc_copy_fastset(const
> > >> > struct intel_crtc_state *old_crtc_state,
> > >> >  	if (intel_cpu_transcoder_has_m2_n2(i915, new_crtc_state-
> > >> > >cpu_transcoder))
> > >> >  		return false;
> > >> >
> > >> > +	if (!new_crtc_state->seamless_mode_switch)
> > >> > +		new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
> > >> > +
> > >> >  	return true;
> > >> >  }
> > >> > +
> > >> > +void intel_drrs_get_config(struct intel_encoder *encoder,
> > >> > +			   struct intel_crtc_state *pipe_config) {
> > >> > +	struct intel_crtc *crtc;
> > >> > +
> > >> > +	crtc = to_intel_crtc(pipe_config->uapi.crtc);
> > >> > +
> > >> > +	mutex_lock(&crtc->drrs.mutex);
> > >> > +
> > >> > +	pipe_config->seamless_mode_switch = crtc-
> > >> > >drrs.seamless_mode_switch_pixel_rate;
> > >> > +	pipe_config->has_drrs = intel_drrs_is_active(crtc);
> > >> > +
> > >> > +	mutex_unlock(&crtc->drrs.mutex); }
> > >> > diff --git a/drivers/gpu/drm/i915/display/intel_drrs.h
> > >> > b/drivers/gpu/drm/i915/display/intel_drrs.h
> > >> > index 749ac717db063..a100023658a5a 100644
> > >> > --- a/drivers/gpu/drm/i915/display/intel_drrs.h
> > >> > +++ b/drivers/gpu/drm/i915/display/intel_drrs.h
> > >> > @@ -14,6 +14,7 @@ struct intel_atomic_state;  struct intel_crtc;
> > >> > struct intel_crtc_state;  struct intel_connector;
> > >> > +struct intel_encoder;
> > >> >
> > >> >  const char *intel_drrs_type_str(enum drrs_type drrs_type);  bool
> > >> > intel_drrs_is_active(struct intel_crtc *crtc); @@ -26,5 +27,7 @@
> > >> > void intel_drrs_flush(struct drm_i915_private *dev_priv,  void
> > >> > intel_crtc_drrs_init(struct intel_crtc *crtc);  bool
> > >> > intel_drrs_crtc_copy_fastset(const struct intel_crtc_state
> > *old_crtc_state,
> > >> >  				  struct intel_crtc_state *new_crtc_state);
> > >> > +void intel_drrs_get_config(struct intel_encoder *encoder,
> > >> > +			   struct intel_crtc_state *pipe_config);
> > >> >
> > >> >  #endif /* __INTEL_DRRS_H__ */
> > >> > --
> > >> > 2.36.0
> > >
> >
> > --
> > Jani Nikula, Intel Open Source Graphics Center

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

end of thread, other threads:[~2022-05-26  4:58 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-02 20:41 [Intel-gfx] [PATCH v2 1/3] drm/i915/display: Allow DRRS to be enabled during driver load José Roberto de Souza
2022-05-02 20:41 ` [Intel-gfx] [PATCH v2 2/3] drm/i915/display/dp: Try to fallback to previous link config if modeset is not allowed José Roberto de Souza
2022-05-02 20:41 ` [Intel-gfx] [PATCH v2 3/3] drm/i915/display: Implement seamless mode switch José Roberto de Souza
2022-05-09 15:13   ` Srinivas, Vidya
2022-05-25  4:18     ` Srinivas, Vidya
2022-05-25  8:55       ` Jani Nikula
2022-05-25  9:19         ` Srinivas, Vidya
2022-05-26  4:58           ` Srinivas, Vidya
2022-05-02 21:26 ` [Intel-gfx] ✓ Fi.CI.BAT: success for series starting with [v2,1/3] drm/i915/display: Allow DRRS to be enabled during driver load Patchwork
2022-05-03  2:41 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.