]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/i915/dp: Factor out compute_max_compressed_bpp_x16()
authorImre Deak <imre.deak@intel.com>
Mon, 22 Dec 2025 15:35:38 +0000 (17:35 +0200)
committerImre Deak <imre.deak@intel.com>
Tue, 13 Jan 2026 16:42:16 +0000 (18:42 +0200)
Factor out compute_max_compressed_bpp_x16() also used during mode
validation in a follow-up change.

Reviewed-by: Vinod Govindapillai <vinod.govindapillai@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Link: https://patch.msgid.link/20251222153547.713360-12-imre.deak@intel.com
drivers/gpu/drm/i915/display/intel_dp.c

index 8aeb61441322d1cb6aee031c0562371079c85a31..d1139d6582e10a850a737a0250afa9803ec16227 100644 (file)
@@ -2663,6 +2663,48 @@ static int compute_min_compressed_bpp_x16(struct intel_connector *connector,
        return min_bpp_x16;
 }
 
+static int compute_max_compressed_bpp_x16(struct intel_connector *connector,
+                                         int mode_clock, int mode_hdisplay,
+                                         int num_joined_pipes,
+                                         enum intel_output_format output_format,
+                                         int pipe_max_bpp, int max_link_bpp_x16)
+{
+       struct intel_display *display = to_intel_display(connector);
+       struct intel_dp *intel_dp = intel_attached_dp(connector);
+       int dsc_src_max_bpp, dsc_sink_max_bpp, dsc_max_bpp;
+       int throughput_max_bpp_x16;
+       int joiner_max_bpp;
+
+       dsc_src_max_bpp = dsc_src_max_compressed_bpp(intel_dp);
+       joiner_max_bpp = get_max_compressed_bpp_with_joiner(display,
+                                                           mode_clock,
+                                                           mode_hdisplay,
+                                                           num_joined_pipes);
+       dsc_sink_max_bpp = intel_dp_dsc_sink_max_compressed_bpp(connector,
+                                                               output_format,
+                                                               pipe_max_bpp / 3);
+       dsc_max_bpp = min(dsc_sink_max_bpp, dsc_src_max_bpp);
+       dsc_max_bpp = min(dsc_max_bpp, joiner_max_bpp);
+
+       max_link_bpp_x16 = min(max_link_bpp_x16, fxp_q4_from_int(dsc_max_bpp));
+
+       throughput_max_bpp_x16 = dsc_throughput_quirk_max_bpp_x16(connector,
+                                                                 mode_clock);
+       if (throughput_max_bpp_x16 < max_link_bpp_x16) {
+               max_link_bpp_x16 = throughput_max_bpp_x16;
+
+               drm_dbg_kms(display->drm,
+                           "[CONNECTOR:%d:%s] Decreasing link max bpp to " FXP_Q4_FMT " due to DSC throughput quirk\n",
+                           connector->base.base.id, connector->base.name,
+                           FXP_Q4_ARGS(max_link_bpp_x16));
+       }
+
+       max_link_bpp_x16 = align_max_compressed_bpp_x16(connector, output_format,
+                                                       pipe_max_bpp, max_link_bpp_x16);
+
+       return max_link_bpp_x16;
+}
+
 /*
  * Calculate the output link min, max bpp values in limits based on the pipe bpp
  * range, crtc_state and dsc mode. Return true on success.
@@ -2692,43 +2734,17 @@ intel_dp_compute_config_link_bpp_limits(struct intel_connector *connector,
 
                limits->link.min_bpp_x16 = fxp_q4_from_int(limits->pipe.min_bpp);
        } else {
-               int dsc_src_max_bpp, dsc_sink_max_bpp, dsc_max_bpp;
-               int throughput_max_bpp_x16;
-               int joiner_max_bpp;
                limits->link.min_bpp_x16 =
                        compute_min_compressed_bpp_x16(connector, crtc_state->output_format);
 
-               dsc_src_max_bpp = dsc_src_max_compressed_bpp(intel_dp);
-               joiner_max_bpp =
-                       get_max_compressed_bpp_with_joiner(display,
-                                                          adjusted_mode->crtc_clock,
-                                                          adjusted_mode->hdisplay,
-                                                          intel_crtc_num_joined_pipes(crtc_state));
-               dsc_sink_max_bpp = intel_dp_dsc_sink_max_compressed_bpp(connector,
-                                                                       crtc_state->output_format,
-                                                                       limits->pipe.max_bpp / 3);
-               dsc_max_bpp = min(dsc_sink_max_bpp, dsc_src_max_bpp);
-               dsc_max_bpp = min(dsc_max_bpp, joiner_max_bpp);
-
-               max_link_bpp_x16 = min(max_link_bpp_x16, fxp_q4_from_int(dsc_max_bpp));
-
-               throughput_max_bpp_x16 =
-                       dsc_throughput_quirk_max_bpp_x16(connector, adjusted_mode->crtc_clock);
-               if (throughput_max_bpp_x16 < max_link_bpp_x16) {
-                       max_link_bpp_x16 = throughput_max_bpp_x16;
-
-                       drm_dbg_kms(display->drm,
-                                   "[CRTC:%d:%s][CONNECTOR:%d:%s] Decreasing link max bpp to " FXP_Q4_FMT " due to DSC throughput quirk\n",
-                                   crtc->base.base.id, crtc->base.name,
-                                   connector->base.base.id, connector->base.name,
-                                   FXP_Q4_ARGS(max_link_bpp_x16));
-               }
-
                max_link_bpp_x16 =
-                       align_max_compressed_bpp_x16(connector,
-                                                    crtc_state->output_format,
-                                                    limits->pipe.max_bpp,
-                                                    max_link_bpp_x16);
+                       compute_max_compressed_bpp_x16(connector,
+                                                      adjusted_mode->crtc_clock,
+                                                      adjusted_mode->hdisplay,
+                                                      intel_crtc_num_joined_pipes(crtc_state),
+                                                      crtc_state->output_format,
+                                                      limits->pipe.max_bpp,
+                                                      max_link_bpp_x16);
        }
 
        limits->link.max_bpp_x16 = max_link_bpp_x16;