@@ -257,10 +257,7 @@ int intel_dp_mtp_tu_compute_config(struct intel_dp *intel_dp,
257
257
258
258
for (bpp = max_bpp ; bpp >= min_bpp ; bpp -= step ) {
259
259
int local_bw_overhead ;
260
- int remote_bw_overhead ;
261
260
int link_bpp_x16 ;
262
- int remote_tu ;
263
- fixed20_12 pbn ;
264
261
265
262
drm_dbg_kms (display -> drm , "Trying bpp %d\n" , bpp );
266
263
@@ -269,57 +266,73 @@ int intel_dp_mtp_tu_compute_config(struct intel_dp *intel_dp,
269
266
270
267
local_bw_overhead = intel_dp_mst_bw_overhead (crtc_state ,
271
268
false, dsc_slice_count , link_bpp_x16 );
272
- remote_bw_overhead = intel_dp_mst_bw_overhead (crtc_state ,
273
- true, dsc_slice_count , link_bpp_x16 );
274
-
275
269
intel_dp_mst_compute_m_n (crtc_state ,
276
270
local_bw_overhead ,
277
271
link_bpp_x16 ,
278
272
& crtc_state -> dp_m_n );
279
273
280
- /*
281
- * The TU size programmed to the HW determines which slots in
282
- * an MTP frame are used for this stream, which needs to match
283
- * the payload size programmed to the first downstream branch
284
- * device's payload table.
285
- *
286
- * Note that atm the payload's PBN value DRM core sends via
287
- * the ALLOCATE_PAYLOAD side-band message matches the payload
288
- * size (which it calculates from the PBN value) it programs
289
- * to the first branch device's payload table. The allocation
290
- * in the payload table could be reduced though (to
291
- * crtc_state->dp_m_n.tu), provided that the driver doesn't
292
- * enable SSC on the corresponding link.
293
- */
294
- pbn .full = dfixed_const (intel_dp_mst_calc_pbn (adjusted_mode -> crtc_clock ,
295
- link_bpp_x16 ,
296
- remote_bw_overhead ));
297
- remote_tu = DIV_ROUND_UP (pbn .full , pbn_div .full );
298
-
299
- /*
300
- * Aligning the TUs ensures that symbols consisting of multiple
301
- * (4) symbol cycles don't get split between two consecutive
302
- * MTPs, as required by Bspec.
303
- * TODO: remove the alignment restriction for 128b/132b links
304
- * on some platforms, where Bspec allows this.
305
- */
306
- remote_tu = ALIGN (remote_tu , 4 / crtc_state -> lane_count );
307
-
308
- /*
309
- * Also align PBNs accordingly, since MST core will derive its
310
- * own copy of TU from the PBN in drm_dp_atomic_find_time_slots().
311
- * The above comment about the difference between the PBN
312
- * allocated for the whole path and the TUs allocated for the
313
- * first branch device's link also applies here.
314
- */
315
- pbn .full = remote_tu * pbn_div .full ;
316
-
317
- drm_WARN_ON (display -> drm , remote_tu < crtc_state -> dp_m_n .tu );
318
- crtc_state -> dp_m_n .tu = remote_tu ;
274
+ if (intel_dp -> is_mst ) {
275
+ int remote_bw_overhead ;
276
+ int remote_tu ;
277
+ fixed20_12 pbn ;
278
+
279
+ remote_bw_overhead = intel_dp_mst_bw_overhead (crtc_state ,
280
+ true, dsc_slice_count , link_bpp_x16 );
281
+
282
+ /*
283
+ * The TU size programmed to the HW determines which slots in
284
+ * an MTP frame are used for this stream, which needs to match
285
+ * the payload size programmed to the first downstream branch
286
+ * device's payload table.
287
+ *
288
+ * Note that atm the payload's PBN value DRM core sends via
289
+ * the ALLOCATE_PAYLOAD side-band message matches the payload
290
+ * size (which it calculates from the PBN value) it programs
291
+ * to the first branch device's payload table. The allocation
292
+ * in the payload table could be reduced though (to
293
+ * crtc_state->dp_m_n.tu), provided that the driver doesn't
294
+ * enable SSC on the corresponding link.
295
+ */
296
+ pbn .full = dfixed_const (intel_dp_mst_calc_pbn (adjusted_mode -> crtc_clock ,
297
+ link_bpp_x16 ,
298
+ remote_bw_overhead ));
299
+ remote_tu = DIV_ROUND_UP (pbn .full , pbn_div .full );
300
+
301
+ /*
302
+ * Aligning the TUs ensures that symbols consisting of multiple
303
+ * (4) symbol cycles don't get split between two consecutive
304
+ * MTPs, as required by Bspec.
305
+ * TODO: remove the alignment restriction for 128b/132b links
306
+ * on some platforms, where Bspec allows this.
307
+ */
308
+ remote_tu = ALIGN (remote_tu , 4 / crtc_state -> lane_count );
309
+
310
+ /*
311
+ * Also align PBNs accordingly, since MST core will derive its
312
+ * own copy of TU from the PBN in drm_dp_atomic_find_time_slots().
313
+ * The above comment about the difference between the PBN
314
+ * allocated for the whole path and the TUs allocated for the
315
+ * first branch device's link also applies here.
316
+ */
317
+ pbn .full = remote_tu * pbn_div .full ;
318
+
319
+ drm_WARN_ON (display -> drm , remote_tu < crtc_state -> dp_m_n .tu );
320
+ crtc_state -> dp_m_n .tu = remote_tu ;
321
+
322
+ slots = drm_dp_atomic_find_time_slots (state , & intel_dp -> mst_mgr ,
323
+ connector -> port ,
324
+ dfixed_trunc (pbn ));
325
+ } else {
326
+ /* Same as above for remote_tu */
327
+ crtc_state -> dp_m_n .tu = ALIGN (crtc_state -> dp_m_n .tu ,
328
+ 4 / crtc_state -> lane_count );
329
+
330
+ if (crtc_state -> dp_m_n .tu <= 64 )
331
+ slots = crtc_state -> dp_m_n .tu ;
332
+ else
333
+ slots = - EINVAL ;
334
+ }
319
335
320
- slots = drm_dp_atomic_find_time_slots (state , & intel_dp -> mst_mgr ,
321
- connector -> port ,
322
- dfixed_trunc (pbn ));
323
336
if (slots == - EDEADLK )
324
337
return slots ;
325
338
0 commit comments