@@ -89,25 +89,19 @@ static int intel_dp_mst_max_dpt_bpp(const struct intel_crtc_state *crtc_state,
8989
9090static int intel_dp_mst_bw_overhead (const struct intel_crtc_state * crtc_state ,
9191 const struct intel_connector * connector ,
92- bool ssc , bool dsc , int bpp_x16 )
92+ bool ssc , int dsc_slice_count , int bpp_x16 )
9393{
9494 const struct drm_display_mode * adjusted_mode =
9595 & crtc_state -> hw .adjusted_mode ;
9696 unsigned long flags = DRM_DP_BW_OVERHEAD_MST ;
97- int dsc_slice_count = 0 ;
9897 int overhead ;
9998
10099 flags |= intel_dp_is_uhbr (crtc_state ) ? DRM_DP_BW_OVERHEAD_UHBR : 0 ;
101100 flags |= ssc ? DRM_DP_BW_OVERHEAD_SSC_REF_CLK : 0 ;
102101 flags |= crtc_state -> fec_enable ? DRM_DP_BW_OVERHEAD_FEC : 0 ;
103102
104- if (dsc ) {
103+ if (dsc_slice_count )
105104 flags |= DRM_DP_BW_OVERHEAD_DSC ;
106- dsc_slice_count = intel_dp_dsc_get_slice_count (connector ,
107- adjusted_mode -> clock ,
108- adjusted_mode -> hdisplay ,
109- crtc_state -> joiner_pipes );
110- }
111105
112106 overhead = drm_dp_bw_overhead (crtc_state -> lane_count ,
113107 adjusted_mode -> hdisplay ,
@@ -153,6 +147,19 @@ static int intel_dp_mst_calc_pbn(int pixel_clock, int bpp_x16, int bw_overhead)
153147 return DIV_ROUND_UP (effective_data_rate * 64 , 54 * 1000 );
154148}
155149
150+ static int intel_dp_mst_dsc_get_slice_count (const struct intel_connector * connector ,
151+ const struct intel_crtc_state * crtc_state )
152+ {
153+ const struct drm_display_mode * adjusted_mode =
154+ & crtc_state -> hw .adjusted_mode ;
155+ int num_joined_pipes = crtc_state -> joiner_pipes ;
156+
157+ return intel_dp_dsc_get_slice_count (connector ,
158+ adjusted_mode -> clock ,
159+ adjusted_mode -> hdisplay ,
160+ num_joined_pipes );
161+ }
162+
156163static int intel_dp_mst_find_vcpi_slots_for_bpp (struct intel_encoder * encoder ,
157164 struct intel_crtc_state * crtc_state ,
158165 int max_bpp ,
@@ -172,6 +179,7 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
172179 const struct drm_display_mode * adjusted_mode =
173180 & crtc_state -> hw .adjusted_mode ;
174181 int bpp , slots = - EINVAL ;
182+ int dsc_slice_count = 0 ;
175183 int max_dpt_bpp ;
176184 int ret = 0 ;
177185
@@ -203,6 +211,15 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
203211 drm_dbg_kms (& i915 -> drm , "Looking for slots in range min bpp %d max bpp %d\n" ,
204212 min_bpp , max_bpp );
205213
214+ if (dsc ) {
215+ dsc_slice_count = intel_dp_mst_dsc_get_slice_count (connector , crtc_state );
216+ if (!dsc_slice_count ) {
217+ drm_dbg_kms (& i915 -> drm , "Can't get valid DSC slice count\n" );
218+
219+ return - ENOSPC ;
220+ }
221+ }
222+
206223 for (bpp = max_bpp ; bpp >= min_bpp ; bpp -= step ) {
207224 int local_bw_overhead ;
208225 int remote_bw_overhead ;
@@ -216,9 +233,9 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
216233 intel_dp_output_bpp (crtc_state -> output_format , bpp ));
217234
218235 local_bw_overhead = intel_dp_mst_bw_overhead (crtc_state , connector ,
219- false, dsc , link_bpp_x16 );
236+ false, dsc_slice_count , link_bpp_x16 );
220237 remote_bw_overhead = intel_dp_mst_bw_overhead (crtc_state , connector ,
221- true, dsc , link_bpp_x16 );
238+ true, dsc_slice_count , link_bpp_x16 );
222239
223240 intel_dp_mst_compute_m_n (crtc_state , connector ,
224241 local_bw_overhead ,
@@ -449,6 +466,9 @@ hblank_expansion_quirk_needs_dsc(const struct intel_connector *connector,
449466 if (mode_hblank_period_ns (adjusted_mode ) > hblank_limit )
450467 return false;
451468
469+ if (!intel_dp_mst_dsc_get_slice_count (connector , crtc_state ))
470+ return false;
471+
452472 return true;
453473}
454474
0 commit comments