On Thu, Jan 29, 2026 at 12:06:16AM +0200, Imre Deak wrote:
> On Wed, Jan 28, 2026 at 07:36:30PM +0530, Ankit Nautiyal wrote:
> > Similar to the DP SST, refactor `mst_stream_compute_config()` to iterate
> > over joiner candidates and select the minimal joiner configuration that
> > satisfies the mode requirements. This prepares the logic for future changes
> > that will consider DSC slice overhead.
> >
> > Signed-off-by: Ankit Nautiyal <[email protected]>
> > ---
> > drivers/gpu/drm/i915/display/intel_dp_mst.c | 47 +++++++++++++++++----
> > 1 file changed, 38 insertions(+), 9 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > index 29ac7b2e1e9c..7a83af89ef03 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > @@ -687,6 +687,7 @@ static int mst_stream_compute_config(struct
> > intel_encoder *encoder,
> > const struct drm_display_mode *adjusted_mode =
> > &pipe_config->hw.adjusted_mode;
> > int num_joined_pipes;
> > + int num_pipes;
> > int ret = 0;
> >
> > if (pipe_config->fec_enable &&
> > @@ -700,17 +701,45 @@ static int mst_stream_compute_config(struct
> > intel_encoder *encoder,
> > pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
> > pipe_config->has_pch_encoder = false;
> >
> > - num_joined_pipes = intel_dp_num_joined_pipes(intel_dp, connector,
intel_dp_num_joined_pipes() is unused after this, so it can be removed.
> > -
> > adjusted_mode->crtc_hdisplay,
> > - adjusted_mode->crtc_clock);
> > + for (num_pipes = 0; num_pipes < I915_MAX_PIPES; num_pipes++) {
> > + int max_dotclk = display->cdclk.max_dotclk_freq;
> >
> > - if (num_joined_pipes > 1)
> > - pipe_config->joiner_pipes = GENMASK(crtc->pipe +
> > num_joined_pipes - 1, crtc->pipe);
> > + ret = -EINVAL;
>
> I suppose in case no valid configuration is found the error code
> propagated from this function should be either the error code returned
> by the last mst_stream_compute_link_for_joined_pipes() call (which
> should also handle the adjusted_mode->clock <= max_dotclk check
> internally) for the last valid joined-pipe it was called, or -EINVAL if
> there wasn't any valid joined-pipe candidate (and so
> mst_stream_compute_link_for_joined_pipes() was never called). The above
> ret = -EINVAL could overwrite ret which was set by the last call of
> mst_stream_compute_link_for_joined_pipes(). To avoid that I'd init ret =
> -EINVAL before the loop.
>
> > +
> > + if (num_pipes == 0) {
> > + if (!connector->force_joined_pipes)
> > + continue;
> > + num_joined_pipes = connector->force_joined_pipes;
> > + } else {
> > + num_joined_pipes = num_pipes;
> > + }
>
> I'd simplify the above as mentioned in earlier patches.
>
> > +
> > + if (!intel_dp_can_join(display, num_joined_pipes))
> > + continue;
> > +
> > + if (adjusted_mode->hdisplay >
> > + num_joined_pipes * intel_dp_max_hdisplay_per_pipe(display))
> > + continue;
> > +
> > + if (num_joined_pipes > 1)
> > + pipe_config->joiner_pipes = GENMASK(crtc->pipe +
> > num_joined_pipes - 1,
> > + crtc->pipe);
> > +
> > + ret = mst_stream_compute_link_for_joined_pipes(encoder,
> > + pipe_config,
> > + conn_state,
> > +
> > num_joined_pipes);
> > + if (ret)
> > + continue;
> > +
> > + max_dotclk *= num_joined_pipes;
> > +
> > + if (adjusted_mode->clock <= max_dotclk) {
> > + ret = 0;
>
> ret stays 0 if adjusted_mode->clock > max_dotclk (and num_pipes ==
> I915_MAX_PIPES - 1). Also, this max_dotclk check should be moved to
> mst_stream_compute_link_for_joined_pipes() and checked for both non-dsc
> and dsc (falling back to dsc if needed), similarly to the SST case.
>
> > + break;
> > + }
> > + }
> >
> > - ret = mst_stream_compute_link_for_joined_pipes(encoder,
> > - pipe_config,
> > - conn_state,
> > - num_joined_pipes);
> > if (ret)
> > return ret;
> >
> > --
> > 2.45.2
> >