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
> > 

Reply via email to