@@ -89,25 +89,19 @@ static int intel_dp_mst_max_dpt_bpp(const struct intel_crtc_state *crtc_state,
89
89
90
90
static int intel_dp_mst_bw_overhead (const struct intel_crtc_state * crtc_state ,
91
91
const struct intel_connector * connector ,
92
- bool ssc , bool dsc , int bpp_x16 )
92
+ bool ssc , int dsc_slice_count , int bpp_x16 )
93
93
{
94
94
const struct drm_display_mode * adjusted_mode =
95
95
& crtc_state -> hw .adjusted_mode ;
96
96
unsigned long flags = DRM_DP_BW_OVERHEAD_MST ;
97
- int dsc_slice_count = 0 ;
98
97
int overhead ;
99
98
100
99
flags |= intel_dp_is_uhbr (crtc_state ) ? DRM_DP_BW_OVERHEAD_UHBR : 0 ;
101
100
flags |= ssc ? DRM_DP_BW_OVERHEAD_SSC_REF_CLK : 0 ;
102
101
flags |= crtc_state -> fec_enable ? DRM_DP_BW_OVERHEAD_FEC : 0 ;
103
102
104
- if (dsc ) {
103
+ if (dsc_slice_count )
105
104
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
- }
111
105
112
106
overhead = drm_dp_bw_overhead (crtc_state -> lane_count ,
113
107
adjusted_mode -> hdisplay ,
@@ -153,6 +147,19 @@ static int intel_dp_mst_calc_pbn(int pixel_clock, int bpp_x16, int bw_overhead)
153
147
return DIV_ROUND_UP (effective_data_rate * 64 , 54 * 1000 );
154
148
}
155
149
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
+
156
163
static int intel_dp_mst_find_vcpi_slots_for_bpp (struct intel_encoder * encoder ,
157
164
struct intel_crtc_state * crtc_state ,
158
165
int max_bpp ,
@@ -172,6 +179,7 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
172
179
const struct drm_display_mode * adjusted_mode =
173
180
& crtc_state -> hw .adjusted_mode ;
174
181
int bpp , slots = - EINVAL ;
182
+ int dsc_slice_count = 0 ;
175
183
int max_dpt_bpp ;
176
184
int ret = 0 ;
177
185
@@ -203,6 +211,15 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
203
211
drm_dbg_kms (& i915 -> drm , "Looking for slots in range min bpp %d max bpp %d\n" ,
204
212
min_bpp , max_bpp );
205
213
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
+
206
223
for (bpp = max_bpp ; bpp >= min_bpp ; bpp -= step ) {
207
224
int local_bw_overhead ;
208
225
int remote_bw_overhead ;
@@ -216,9 +233,9 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
216
233
intel_dp_output_bpp (crtc_state -> output_format , bpp ));
217
234
218
235
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 );
220
237
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 );
222
239
223
240
intel_dp_mst_compute_m_n (crtc_state , connector ,
224
241
local_bw_overhead ,
@@ -449,6 +466,9 @@ hblank_expansion_quirk_needs_dsc(const struct intel_connector *connector,
449
466
if (mode_hblank_period_ns (adjusted_mode ) > hblank_limit )
450
467
return false;
451
468
469
+ if (!intel_dp_mst_dsc_get_slice_count (connector , crtc_state ))
470
+ return false;
471
+
452
472
return true;
453
473
}
454
474
0 commit comments