On Fri, Nov 06, 2026 at 09:41:13AM +0000, Mika Kahola wrote: > eDP only works joined as the pipe A and B pair, other consecutive pairs > fail to come up.
There is no such restriction. Just tried it on a PTL here and it works just fine. > Keep the eDP joiner primary on pipe A. DP and unjoined > eDP are unaffected. > > Signed-off-by: Mika Kahola <[email protected]> > --- > drivers/gpu/drm/i915/display/intel_dp.c | 21 ++++++++++++++++----- > 1 file changed, 16 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c > b/drivers/gpu/drm/i915/display/intel_dp.c > index ef164a797618..b359a66a018f 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp.c > +++ b/drivers/gpu/drm/i915/display/intel_dp.c > @@ -1362,16 +1362,27 @@ static int intel_dp_mso_pixel_clock(struct intel_dp > *intel_dp, int pixel_clock) > return pixel_clock / intel_dp->mso_link_count; > } > > +/* eDP can only be joined as the pipe A and B pair. */ > +static u8 intel_dp_joiner_valid_primary_pipe_mask(struct intel_dp *intel_dp, > + int num_joined_pipes) > +{ > + struct intel_display *display = to_intel_display(intel_dp); > + u8 pipe_mask = intel_joiner_valid_primary_pipe_mask(display, > num_joined_pipes); > + > + if (num_joined_pipes > 1 && intel_dp_is_edp(intel_dp)) > + pipe_mask &= BIT(PIPE_A); > + > + return pipe_mask; > +} > + > static > bool intel_dp_can_join(struct intel_dp *intel_dp, > int num_joined_pipes) > { > - struct intel_display *display = to_intel_display(intel_dp); > - > if (num_joined_pipes > 1 && !intel_dp_has_joiner(intel_dp)) > return false; > > - return intel_joiner_valid_primary_pipe_mask(display, num_joined_pipes); > + return intel_dp_joiner_valid_primary_pipe_mask(intel_dp, > num_joined_pipes); > } > > bool intel_dp_dotclk_valid(struct intel_display *display, > @@ -3083,7 +3094,6 @@ intel_dp_compute_link_config(struct intel_encoder > *encoder, > struct drm_connector_state *conn_state, > bool respect_downstream_limits) > { > - struct intel_display *display = to_intel_display(encoder); > struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); > struct intel_connector *connector = > to_intel_connector(conn_state->connector); > @@ -3099,7 +3109,8 @@ intel_dp_compute_link_config(struct intel_encoder > *encoder, > > for_each_joiner_candidate(connector, adjusted_mode, num_joined_pipes) { > /* If the pipe can't be a joiner primary, skip early. */ > - if (!(intel_joiner_valid_primary_pipe_mask(display, > num_joined_pipes) & BIT(crtc->pipe))) > + if (!(intel_dp_joiner_valid_primary_pipe_mask(intel_dp, > num_joined_pipes) & > + BIT(crtc->pipe))) > continue; > > /* > -- > 2.43.0 -- Ville Syrjälä Intel
