Refactor the logic to get the number of joined pipes. Start with a single
pipe and incrementally try additional pipes only if needed. While DSC
overhead is not yet computed here, this restructuring prepares the code to
support that in follow-up changes.

Signed-off-by: Ankit Nautiyal <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_dp.c     |  2 -
 drivers/gpu/drm/i915/display/intel_dp.h     |  3 +
 drivers/gpu/drm/i915/display/intel_dp_mst.c | 86 ++++++++++++---------
 3 files changed, 52 insertions(+), 39 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index f8986f0acc79..9bbd37ebd2ea 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1371,7 +1371,6 @@ intel_dp_mode_valid_downstream(struct intel_connector 
*connector,
        return MODE_OK;
 }
 
-static
 int intel_dp_max_hdisplay_per_pipe(struct intel_display *display)
 {
        return DISPLAY_VER(display) >= 30 ? 6144 : 5120;
@@ -1434,7 +1433,6 @@ bool intel_dp_has_dsc(const struct intel_connector 
*connector)
        return true;
 }
 
-static
 bool intel_dp_can_join(struct intel_display *display,
                       int num_joined_pipes)
 {
diff --git a/drivers/gpu/drm/i915/display/intel_dp.h 
b/drivers/gpu/drm/i915/display/intel_dp.h
index 25bfbfd291b0..6d409c1998c9 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.h
+++ b/drivers/gpu/drm/i915/display/intel_dp.h
@@ -225,5 +225,8 @@ int intel_dp_compute_config_late(struct intel_encoder 
*encoder,
                                 struct drm_connector_state *conn_state);
 int intel_dp_sdp_min_guardband(const struct intel_crtc_state *crtc_state,
                               bool assume_all_enabled);
+int intel_dp_max_hdisplay_per_pipe(struct intel_display *display);
+bool intel_dp_can_join(struct intel_display *display,
+                      int num_joined_pipes);
 
 #endif /* __INTEL_DP_H__ */
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c 
b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index f47bf45d0bce..664004600564 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -1420,7 +1420,6 @@ mst_connector_mode_valid_ctx(struct drm_connector 
*_connector,
        struct drm_dp_mst_topology_mgr *mgr = &intel_dp->mst.mgr;
        struct drm_dp_mst_port *port = connector->mst.port;
        const int min_bpp = 18;
-       int max_dotclk = display->cdclk.max_dotclk_freq;
        int max_rate, mode_rate, max_lanes, max_link_clock;
        unsigned long bw_overhead_flags =
                DRM_DP_BW_OVERHEAD_MST | DRM_DP_BW_OVERHEAD_SSC_REF_CLK;
@@ -1428,6 +1427,7 @@ mst_connector_mode_valid_ctx(struct drm_connector 
*_connector,
        bool dsc = false;
        int target_clock = mode->clock;
        int num_joined_pipes;
+       int num_pipes;
 
        if (drm_connector_is_unregistered(&connector->base)) {
                *status = MODE_ERROR;
@@ -1480,50 +1480,62 @@ mst_connector_mode_valid_ctx(struct drm_connector 
*_connector,
                return 0;
        }
 
-       num_joined_pipes = intel_dp_num_joined_pipes(intel_dp, connector,
-                                                    mode->hdisplay, 
target_clock);
-
-       if (intel_dp_has_dsc(connector) && 
drm_dp_sink_supports_fec(connector->dp.fec_capability)) {
-               /*
-                * TBD pass the connector BPC,
-                * for now U8_MAX so that max BPC on that platform would be 
picked
-                */
-               int pipe_bpp = intel_dp_dsc_compute_max_bpp(connector, U8_MAX);
-
-               if (!drm_dp_is_uhbr_rate(max_link_clock))
-                       bw_overhead_flags |= DRM_DP_BW_OVERHEAD_FEC;
-
-               dsc = intel_dp_mode_valid_with_dsc(connector,
-                                                  max_link_clock, max_lanes,
-                                                  target_clock, mode->hdisplay,
-                                                  num_joined_pipes,
-                                                  INTEL_OUTPUT_FORMAT_RGB, 
pipe_bpp,
-                                                  bw_overhead_flags);
-       }
+       for (num_pipes = 0; num_pipes < I915_MAX_PIPES; num_pipes++) {
+               int max_dotclk = display->cdclk.max_dotclk_freq;
 
-       if (intel_dp_joiner_needs_dsc(display, num_joined_pipes) && !dsc) {
                *status = MODE_CLOCK_HIGH;
-               return 0;
-       }
 
-       if (mode_rate > max_rate && !dsc) {
-               *status = MODE_CLOCK_HIGH;
-               return 0;
-       }
+               if (num_pipes == 0) {
+                       if (!connector->force_joined_pipes)
+                               continue;
+                       num_joined_pipes = connector->force_joined_pipes;
+               } else {
+                       num_joined_pipes = num_pipes;
+               }
 
-       *status = intel_mode_valid_max_plane_size(display, mode, 
num_joined_pipes);
+               if (!intel_dp_can_join(display, num_joined_pipes))
+                       continue;
 
-       if (*status != MODE_OK)
-               return 0;
+               if (mode->hdisplay > num_joined_pipes * 
intel_dp_max_hdisplay_per_pipe(display))
+                       continue;
 
-       max_dotclk *= num_joined_pipes;
+               if (intel_dp_has_dsc(connector) &&
+                   drm_dp_sink_supports_fec(connector->dp.fec_capability)) {
+                       /*
+                        * TBD pass the connector BPC,
+                        * for now U8_MAX so that max BPC on that platform 
would be picked
+                        */
+                       int pipe_bpp = intel_dp_dsc_compute_max_bpp(connector, 
U8_MAX);
 
-       if (mode->clock > max_dotclk) {
-               *status = MODE_CLOCK_HIGH;
-               return 0;
-       }
+                       if (!drm_dp_is_uhbr_rate(max_link_clock))
+                               bw_overhead_flags |= DRM_DP_BW_OVERHEAD_FEC;
+
+                       dsc = intel_dp_mode_valid_with_dsc(connector,
+                                                          max_link_clock, 
max_lanes,
+                                                          target_clock, 
mode->hdisplay,
+                                                          num_joined_pipes,
+                                                          
INTEL_OUTPUT_FORMAT_RGB, pipe_bpp,
+                                                          bw_overhead_flags);
+               }
 
-       *status = MODE_OK;
+               if (intel_dp_joiner_needs_dsc(display, num_joined_pipes) && 
!dsc)
+                       continue;
+
+               if (mode_rate > max_rate && !dsc)
+                       continue;
+
+               *status = intel_mode_valid_max_plane_size(display, mode, 
num_joined_pipes);
+
+               if (*status != MODE_OK)
+                       continue;
+
+               max_dotclk *= num_joined_pipes;
+
+               if (mode->clock <= max_dotclk) {
+                       *status = MODE_OK;
+                       break;
+               }
+       }
 
        return 0;
 }
-- 
2.45.2

Reply via email to