On 8/6/2026 8:07 PM, Jani Nikula wrote:
Multiplying the max dotclock based on joiner availability on the
platform alone does not take into account the actual number of pipes
(possibly with some fused) available.
Limit the max joined dotclock based on the actual number of pipes
available.
This is still too optimistic due to other constraints on actual pipes,
but it reduces some of the false hopes at mode enumeration.
Fixes: f4f8f0eaaafc ("drm/i915/display: Consider ultrajoiner for computing
maxdotclock")
Cc: Ankit Nautiyal <[email protected]>
Cc: <[email protected]> # v6.13+
Signed-off-by: Jani Nikula <[email protected]>
---
drivers/gpu/drm/i915/display/intel_display.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c
b/drivers/gpu/drm/i915/display/intel_display.c
index 829d7a411dcc..44c5d1dde255 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -8113,9 +8113,10 @@ static int max_dotclock(struct intel_display *display)
{
int max_dotclock = display->cdclk.max_dotclk_freq;
- if (HAS_ULTRAJOINER(display))
+ if (HAS_ULTRAJOINER(display) && INTEL_NUM_PIPES(display) >= 4)
max_dotclock *= 4;
- else if (HAS_UNCOMPRESSED_JOINER(display) || HAS_BIGJOINER(display))
+ else if ((HAS_UNCOMPRESSED_JOINER(display) || HAS_BIGJOINER(display)) &&
+ INTEL_NUM_PIPES(display) >= 2)
If fused pipes are AC or BD this will still give us 2. Perhaps should
have a check for atleast 2 consecutive pipes from
DISPLAY_RUNTIME_INFO(display)->pipe_mask
On the other hand we can have the consecutive pipe check in mode_valid()
path after for_each_joiner_candidate() is called, which will check
whether there exists any consecutive pair that can support joiner.
As discussed offline, in any case, we need to fix the compute_config()
path for SST and MST where we are using the for_each_joiner_candidate()
to check for a given primary, there exist sufficient consecutive pipes
to support the joiner candidate.
Regards,
Ankit
Regards,
Ankit
max_dotclock *= 2;
return max_dotclock;