@@ -88,11 +88,10 @@ static int intel_dp_mst_bw_overhead(const struct intel_crtc_state *crtc_state,
88
88
89
89
if (dsc ) {
90
90
flags |= DRM_DP_BW_OVERHEAD_DSC ;
91
- /* TODO: add support for bigjoiner */
92
91
dsc_slice_count = intel_dp_dsc_get_slice_count (connector ,
93
92
adjusted_mode -> clock ,
94
93
adjusted_mode -> hdisplay ,
95
- false );
94
+ crtc_state -> bigjoiner_pipes );
96
95
}
97
96
98
97
overhead = drm_dp_bw_overhead (crtc_state -> lane_count ,
@@ -525,6 +524,7 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
525
524
{
526
525
struct drm_i915_private * dev_priv = to_i915 (encoder -> base .dev );
527
526
struct intel_atomic_state * state = to_intel_atomic_state (conn_state -> state );
527
+ struct intel_crtc * crtc = to_intel_crtc (pipe_config -> uapi .crtc );
528
528
struct intel_dp_mst_encoder * intel_mst = enc_to_mst (encoder );
529
529
struct intel_dp * intel_dp = & intel_mst -> primary -> dp ;
530
530
struct intel_connector * connector =
@@ -542,6 +542,11 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
542
542
if (adjusted_mode -> flags & DRM_MODE_FLAG_DBLSCAN )
543
543
return - EINVAL ;
544
544
545
+ if (intel_dp_need_bigjoiner (intel_dp , connector ,
546
+ adjusted_mode -> crtc_hdisplay ,
547
+ adjusted_mode -> crtc_clock ))
548
+ pipe_config -> bigjoiner_pipes = GENMASK (crtc -> pipe + 1 , crtc -> pipe );
549
+
545
550
pipe_config -> sink_format = INTEL_OUTPUT_FORMAT_RGB ;
546
551
pipe_config -> output_format = INTEL_OUTPUT_FORMAT_RGB ;
547
552
pipe_config -> has_pch_encoder = false;
@@ -1376,10 +1381,6 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
1376
1381
max_link_clock , max_lanes );
1377
1382
mode_rate = intel_dp_link_required (mode -> clock , min_bpp );
1378
1383
1379
- ret = drm_modeset_lock (& mgr -> base .lock , ctx );
1380
- if (ret )
1381
- return ret ;
1382
-
1383
1384
/*
1384
1385
* TODO:
1385
1386
* - Also check if compression would allow for the mode
@@ -1392,17 +1393,18 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
1392
1393
* corresponding link capabilities of the sink) in case the
1393
1394
* stream is uncompressed for it by the last branch device.
1394
1395
*/
1395
- if (mode_rate > max_rate || mode -> clock > max_dotclk ||
1396
- drm_dp_calc_pbn_mode (mode -> clock , min_bpp << 4 ) > port -> full_pbn ) {
1397
- * status = MODE_CLOCK_HIGH ;
1398
- return 0 ;
1399
- }
1400
1396
if (intel_dp_need_bigjoiner (intel_dp , intel_connector ,
1401
1397
mode -> hdisplay , target_clock )) {
1402
1398
bigjoiner = true;
1403
1399
max_dotclk *= 2 ;
1400
+ }
1401
+
1402
+ ret = drm_modeset_lock (& mgr -> base .lock , ctx );
1403
+ if (ret )
1404
+ return ret ;
1404
1405
1405
- /* TODO: add support for bigjoiner */
1406
+ if (mode_rate > max_rate || mode -> clock > max_dotclk ||
1407
+ drm_dp_calc_pbn_mode (mode -> clock , min_bpp << 4 ) > port -> full_pbn ) {
1406
1408
* status = MODE_CLOCK_HIGH ;
1407
1409
return 0 ;
1408
1410
}
@@ -1445,7 +1447,7 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
1445
1447
return 0 ;
1446
1448
}
1447
1449
1448
- * status = intel_mode_valid_max_plane_size (dev_priv , mode , false );
1450
+ * status = intel_mode_valid_max_plane_size (dev_priv , mode , bigjoiner );
1449
1451
return 0 ;
1450
1452
}
1451
1453
0 commit comments