All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ville Syrjala <ville.syrjala@linux.intel.com>
To: intel-gfx@lists.freedesktop.org
Cc: Vidya Srinivas <vidya.srinivas@intel.com>,
	Vandita Kulkarni <vandita.kulkarni@intel.com>
Subject: [PATCH v2 06/17] drm/i915: Fix intel_modeset_pipe_config_late() for bigjoiner
Date: Fri,  5 Apr 2024 00:34:30 +0300	[thread overview]
Message-ID: <20240404213441.17637-7-ville.syrjala@linux.intel.com> (raw)
In-Reply-To: <20240404213441.17637-1-ville.syrjala@linux.intel.com>

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Currently intel_modeset_pipe_config_late() is called after the
bigjoiner state copy, and it will actually not do anything for
bigjoiner slaves. This can lead to a mismatched state between
the master and slave.

The two things that we do in the encoder .compute_config_late()
hook are mst master transcoder and port sync master transcoder
elections. So if either of either MST or port sync is combined
with bigjoiner then we can see the mismatch.

Currently this problem is more or less theoretical; MST+bigjoiner
has not been implemented yet, and port sync+bigjoiner would
require a tiled display with >5k tiles (or a very high
dotclock per tile). Although we do have kms_tiled_display in
igt which can fake a tiled display, and we can now force bigjoiner
via debugfs, so it is possible to trigger this if you try hard
enough.

Reorder the code such that intel_modeset_pipe_config_late()
will be called before the bigjoiner state copy happens so
that both pipes will end up with the same state.

Tested-by: Vidya Srinivas <vidya.srinivas@intel.com>
Reviewed-by: Vandita Kulkarni <vandita.kulkarni@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_display.c | 46 ++++++++++++++------
 1 file changed, 32 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 0086a7422e86..449dd8667685 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -4752,8 +4752,6 @@ intel_modeset_pipe_config_late(struct intel_atomic_state *state,
 	struct drm_connector *connector;
 	int i;
 
-	intel_bigjoiner_adjust_pipe_src(crtc_state);
-
 	for_each_new_connector_in_state(&state->base, connector,
 					conn_state, i) {
 		struct intel_encoder *encoder =
@@ -6295,27 +6293,37 @@ static int intel_atomic_check_config(struct intel_atomic_state *state,
 			continue;
 		}
 
-		if (intel_crtc_is_bigjoiner_slave(new_crtc_state)) {
-			drm_WARN_ON(&i915->drm, new_crtc_state->uapi.enable);
+		if (drm_WARN_ON(&i915->drm, intel_crtc_is_bigjoiner_slave(new_crtc_state)))
 			continue;
-		}
 
 		ret = intel_crtc_prepare_cleared_state(state, crtc);
 		if (ret)
-			break;
+			goto fail;
 
 		if (!new_crtc_state->hw.enable)
 			continue;
 
 		ret = intel_modeset_pipe_config(state, crtc, limits);
 		if (ret)
-			break;
+			goto fail;
+	}
 
-		ret = intel_atomic_check_bigjoiner(state, crtc);
+	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
+		if (!intel_crtc_needs_modeset(new_crtc_state))
+			continue;
+
+		if (drm_WARN_ON(&i915->drm, intel_crtc_is_bigjoiner_slave(new_crtc_state)))
+			continue;
+
+		if (!new_crtc_state->hw.enable)
+			continue;
+
+		ret = intel_modeset_pipe_config_late(state, crtc);
 		if (ret)
-			break;
+			goto fail;
 	}
 
+fail:
 	if (ret)
 		*failed_pipe = crtc->pipe;
 
@@ -6411,16 +6419,26 @@ int intel_atomic_check(struct drm_device *dev,
 	if (ret)
 		goto fail;
 
+	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
+		if (!intel_crtc_needs_modeset(new_crtc_state))
+			continue;
+
+		if (intel_crtc_is_bigjoiner_slave(new_crtc_state)) {
+			drm_WARN_ON(&dev_priv->drm, new_crtc_state->uapi.enable);
+			continue;
+		}
+
+		ret = intel_atomic_check_bigjoiner(state, crtc);
+		if (ret)
+			goto fail;
+	}
+
 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
 					    new_crtc_state, i) {
 		if (!intel_crtc_needs_modeset(new_crtc_state))
 			continue;
 
-		if (new_crtc_state->hw.enable) {
-			ret = intel_modeset_pipe_config_late(state, crtc);
-			if (ret)
-				goto fail;
-		}
+		intel_bigjoiner_adjust_pipe_src(new_crtc_state);
 
 		intel_crtc_check_fastset(old_crtc_state, new_crtc_state);
 	}
-- 
2.43.2


  parent reply	other threads:[~2024-04-04 21:35 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-04 21:34 [PATCH v2 00/17] drm/i915: Bigjoiner modeset sequence redesign and MST support Ville Syrjala
2024-04-04 21:34 ` [PATCH v2 01/17] drm/i915: Update pipes in reverse order for bigjoiner Ville Syrjala
2024-04-05 12:56   ` Murthy, Arun R
2024-04-08 12:46     ` Ville Syrjälä
2024-04-05 13:42   ` Kulkarni, Vandita
2024-04-05 19:45     ` Ville Syrjälä
2024-04-04 21:34 ` [PATCH v2 02/17] drm/i915/psr: Disable PSR when bigjoiner is used Ville Syrjala
2024-04-05  6:58   ` Hogander, Jouni
2024-04-05 12:58     ` Murthy, Arun R
2024-04-05 13:00     ` Murthy, Arun R
2024-04-05 15:45       ` Murthy, Arun R
2024-04-05 19:34     ` Ville Syrjälä
2024-04-08  5:09       ` Hogander, Jouni
2024-04-04 21:34 ` [PATCH v2 03/17] drm/i915: Disable port sync " Ville Syrjala
2024-04-04 21:34 ` [PATCH v2 04/17] drm/i915: Disable live M/N updates when using bigjoiner Ville Syrjala
2024-04-04 21:34 ` [PATCH v2 05/17] drm/i915/vrr: Disable VRR " Ville Syrjala
2024-04-04 21:34 ` Ville Syrjala [this message]
2024-04-04 21:34 ` [PATCH v2 07/17] drm/i915: s/intel_dp_can_bigjoiner()/intel_dp_has_bigjoiner()/ Ville Syrjala
2024-04-04 21:34 ` [PATCH v2 08/17] drm/i915: Extract intel_dp_joiner_needs_dsc() Ville Syrjala
2024-04-04 21:34 ` [PATCH v2 09/17] drm/i915/mst: Check intel_dp_joiner_needs_dsc() Ville Syrjala
2024-04-04 21:34 ` [PATCH v2 10/17] drm/i915: Pass connector to intel_dp_need_bigjoiner() Ville Syrjala
2024-04-04 21:34 ` [PATCH v2 11/17] drm/i915: Introduce intel_crtc_joined_pipe_mask() Ville Syrjala
2024-04-04 21:34 ` [PATCH v2 12/17] drm/i915: Extract intel_ddi_post_disable_hdmi_or_sst() Ville Syrjala
2024-04-04 21:34 ` [PATCH v2 13/17] drm/i915: Utilize intel_crtc_joined_pipe_mask() more Ville Syrjala
2024-04-04 21:34 ` [PATCH v2 14/17] drm/i915: Handle joined pipes inside hsw_crtc_disable() Ville Syrjala
2024-04-04 21:34 ` [PATCH v2 15/17] drm/i915: Handle joined pipes inside hsw_crtc_enable() Ville Syrjala
2024-04-04 21:34 ` [PATCH v2 16/17] drm/i915/mst: Add bigjoiner handling to MST modeset sequence Ville Syrjala
2024-04-04 21:34 ` [PATCH v2 17/17] drm/i915: Allow bigjoiner for MST Ville Syrjala
2024-04-04 22:16 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Bigjoiner modeset sequence redesign and MST support (rev2) Patchwork
2024-04-04 22:16 ` ✗ Fi.CI.SPARSE: " Patchwork
2024-04-04 22:25 ` ✗ Fi.CI.BAT: failure " Patchwork
2024-04-05  1:46 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Bigjoiner modeset sequence redesign and MST support (rev3) Patchwork
2024-04-05  1:46 ` ✗ Fi.CI.SPARSE: " Patchwork
2024-04-05  1:51 ` ✓ Fi.CI.BAT: success " Patchwork
2024-04-05 14:25 ` ✗ Fi.CI.IGT: failure " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240404213441.17637-7-ville.syrjala@linux.intel.com \
    --to=ville.syrjala@linux.intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=vandita.kulkarni@intel.com \
    --cc=vidya.srinivas@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.