@@ -388,21 +388,47 @@ static int dg2_max_source_rate(struct intel_dp *intel_dp)
388
388
return intel_dp_is_edp (intel_dp ) ? 810000 : 1350000 ;
389
389
}
390
390
391
+ static bool is_low_voltage_sku (struct drm_i915_private * i915 , enum phy phy )
392
+ {
393
+ u32 voltage ;
394
+
395
+ voltage = intel_de_read (i915 , ICL_PORT_COMP_DW3 (phy )) & VOLTAGE_INFO_MASK ;
396
+
397
+ return voltage == VOLTAGE_INFO_0_85V ;
398
+ }
399
+
391
400
static int icl_max_source_rate (struct intel_dp * intel_dp )
392
401
{
393
402
struct intel_digital_port * dig_port = dp_to_dig_port (intel_dp );
394
403
struct drm_i915_private * dev_priv = to_i915 (dig_port -> base .base .dev );
395
404
enum phy phy = intel_port_to_phy (dev_priv , dig_port -> base .port );
396
405
397
- if (intel_phy_is_combo (dev_priv , phy ) && !intel_dp_is_edp (intel_dp ))
406
+ if (intel_phy_is_combo (dev_priv , phy ) &&
407
+ (is_low_voltage_sku (dev_priv , phy ) || !intel_dp_is_edp (intel_dp )))
398
408
return 540000 ;
399
409
400
410
return 810000 ;
401
411
}
402
412
403
413
static int ehl_max_source_rate (struct intel_dp * intel_dp )
404
414
{
405
- if (intel_dp_is_edp (intel_dp ))
415
+ struct intel_digital_port * dig_port = dp_to_dig_port (intel_dp );
416
+ struct drm_i915_private * dev_priv = to_i915 (dig_port -> base .base .dev );
417
+ enum phy phy = intel_port_to_phy (dev_priv , dig_port -> base .port );
418
+
419
+ if (intel_dp_is_edp (intel_dp ) || is_low_voltage_sku (dev_priv , phy ))
420
+ return 540000 ;
421
+
422
+ return 810000 ;
423
+ }
424
+
425
+ static int dg1_max_source_rate (struct intel_dp * intel_dp )
426
+ {
427
+ struct intel_digital_port * dig_port = dp_to_dig_port (intel_dp );
428
+ struct drm_i915_private * i915 = to_i915 (dig_port -> base .base .dev );
429
+ enum phy phy = intel_port_to_phy (i915 , dig_port -> base .port );
430
+
431
+ if (intel_phy_is_combo (i915 , phy ) && is_low_voltage_sku (i915 , phy ))
406
432
return 540000 ;
407
433
408
434
return 810000 ;
@@ -445,7 +471,7 @@ intel_dp_set_source_rates(struct intel_dp *intel_dp)
445
471
max_rate = dg2_max_source_rate (intel_dp );
446
472
else if (IS_ALDERLAKE_P (dev_priv ) || IS_ALDERLAKE_S (dev_priv ) ||
447
473
IS_DG1 (dev_priv ) || IS_ROCKETLAKE (dev_priv ))
448
- max_rate = 810000 ;
474
+ max_rate = dg1_max_source_rate ( intel_dp ) ;
449
475
else if (IS_JSL_EHL (dev_priv ))
450
476
max_rate = ehl_max_source_rate (intel_dp );
451
477
else
0 commit comments