Align the minimum/maximum DSC input BPPs to the corresponding sink DSC
input BPP capability limits already when computing the BPP limits. This
alignment is also performed later during state computation, however
there is no reason to initialize the limits to an unaligned/incorrect
value.

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

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 9d7a1df179a4e..4807a98d396a2 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1905,6 +1905,23 @@ int intel_dp_dsc_max_src_input_bpc(struct intel_display 
*display)
        return intel_dp_dsc_min_src_input_bpc();
 }
 
+static int align_min_sink_dsc_input_bpp(const struct intel_connector 
*connector,
+                                       int min_pipe_bpp)
+{
+       u8 dsc_bpc[3];
+       int num_bpc;
+       int i;
+
+       num_bpc = drm_dp_dsc_sink_supported_input_bpcs(connector->dp.dsc_dpcd,
+                                                      dsc_bpc);
+       for (i = num_bpc - 1; i >= 0; i--) {
+               if (dsc_bpc[i] * 3 >= min_pipe_bpp)
+                       return dsc_bpc[i] * 3;
+       }
+
+       return 0;
+}
+
 static int align_max_sink_dsc_input_bpp(const struct intel_connector 
*connector,
                                        int max_pipe_bpp)
 {
@@ -2680,15 +2697,19 @@ intel_dp_dsc_compute_pipe_bpp_limits(struct 
intel_connector *connector,
        int dsc_max_bpc = intel_dp_dsc_max_src_input_bpc(display);
 
        limits->pipe.min_bpp = max(limits->pipe.min_bpp, dsc_min_bpc * 3);
+       limits->pipe.min_bpp = align_min_sink_dsc_input_bpp(connector, 
limits->pipe.min_bpp);
+
        limits->pipe.max_bpp = min(limits->pipe.max_bpp, dsc_max_bpc * 3);
+       limits->pipe.max_bpp = align_max_sink_dsc_input_bpp(connector, 
limits->pipe.max_bpp);
 
        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:%d:%s] Invalid DSC src/sink input BPP 
(src:%d-%d pipe:%d-%d sink-align:%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);
+                           orig_limits.pipe.min_bpp, orig_limits.pipe.max_bpp,
+                           limits->pipe.min_bpp, limits->pipe.max_bpp);
 
                return false;
        }
-- 
2.49.1

Reply via email to