There is no reason to accept an invalid minimum/maximum DSC source input
BPP value (i.e a minimum DSC input BPP value above the maximum pipe BPP
or a maximum DSC input BPP value below the minimum pipe BPP value), fail
the state computation in these cases.

Reviewed-by: Vinod Govindapillai <[email protected]>
Signed-off-by: Imre Deak <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_dp.c | 28 ++++++++++++++++++-------
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 074aa472d33c8..dd2c774bb9202 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -2660,16 +2660,30 @@ intel_dp_compute_config_link_bpp_limits(struct intel_dp 
*intel_dp,
        return true;
 }
 
-static void
-intel_dp_dsc_compute_pipe_bpp_limits(struct intel_dp *intel_dp,
+static bool
+intel_dp_dsc_compute_pipe_bpp_limits(struct intel_connector *connector,
                                     struct link_config_limits *limits)
 {
-       struct intel_display *display = to_intel_display(intel_dp);
+       struct intel_display *display = to_intel_display(connector);
+       const struct link_config_limits orig_limits = *limits;
        int dsc_min_bpc = intel_dp_dsc_min_src_input_bpc();
        int dsc_max_bpc = intel_dp_dsc_max_src_input_bpc(display);
 
-       limits->pipe.max_bpp = clamp(limits->pipe.max_bpp, dsc_min_bpc * 3, 
dsc_max_bpc * 3);
-       limits->pipe.min_bpp = clamp(limits->pipe.min_bpp, dsc_min_bpc * 3, 
dsc_max_bpc * 3);
+       limits->pipe.min_bpp = max(limits->pipe.min_bpp, dsc_min_bpc * 3);
+       limits->pipe.max_bpp = min(limits->pipe.max_bpp, dsc_max_bpc * 3);
+
+       if (limits->pipe.min_bpp <= 0 ||
+           limits->pipe.min_bpp > limits->pipe.max_bpp) {
+               drm_dbg_kms(display->drm,
+                           "[CONNECTOR:%d:%s] Invalid DSC src/sink input BPP 
(src:%d-%d pipe:%d-%d)\n",
+                           connector->base.base.id, connector->base.name,
+                           dsc_min_bpc * 3, dsc_max_bpc * 3,
+                           orig_limits.pipe.min_bpp, orig_limits.pipe.max_bpp);
+
+               return false;
+       }
+
+       return true;
 }
 
 bool
@@ -2709,8 +2723,8 @@ intel_dp_compute_config_limits(struct intel_dp *intel_dp,
                                                        
respect_downstream_limits);
        }
 
-       if (dsc)
-               intel_dp_dsc_compute_pipe_bpp_limits(intel_dp, limits);
+       if (dsc && !intel_dp_dsc_compute_pipe_bpp_limits(connector, limits))
+               return false;
 
        if (is_mst || intel_dp->use_max_params) {
                /*
-- 
2.49.1

Reply via email to