@@ -1683,16 +1683,21 @@ static void intel_edp_psr_setup(struct intel_dp *intel_dp)
1683
1683
1684
1684
static void intel_edp_psr_enable_sink (struct intel_dp * intel_dp )
1685
1685
{
1686
- struct drm_device * dev = intel_dp_to_dev (intel_dp );
1686
+ struct intel_digital_port * dig_port = dp_to_dig_port (intel_dp );
1687
+ struct drm_device * dev = dig_port -> base .base .dev ;
1687
1688
struct drm_i915_private * dev_priv = dev -> dev_private ;
1688
1689
uint32_t aux_clock_divider ;
1689
1690
int precharge = 0x3 ;
1690
1691
int msg_size = 5 ; /* Header(4) + Message(1) */
1692
+ bool only_standby = false;
1691
1693
1692
1694
aux_clock_divider = intel_dp -> get_aux_clock_divider (intel_dp , 0 );
1693
1695
1696
+ if (IS_BROADWELL (dev ) && dig_port -> port != PORT_A )
1697
+ only_standby = true;
1698
+
1694
1699
/* Enable PSR in sink */
1695
- if (intel_dp -> psr_dpcd [1 ] & DP_PSR_NO_TRAIN_ON_EXIT )
1700
+ if (intel_dp -> psr_dpcd [1 ] & DP_PSR_NO_TRAIN_ON_EXIT || only_standby )
1696
1701
drm_dp_dpcd_writeb (& intel_dp -> aux , DP_PSR_EN_CFG ,
1697
1702
DP_PSR_ENABLE & ~DP_PSR_MAIN_LINK_ACTIVE );
1698
1703
else
@@ -1711,14 +1716,19 @@ static void intel_edp_psr_enable_sink(struct intel_dp *intel_dp)
1711
1716
1712
1717
static void intel_edp_psr_enable_source (struct intel_dp * intel_dp )
1713
1718
{
1714
- struct drm_device * dev = intel_dp_to_dev (intel_dp );
1719
+ struct intel_digital_port * dig_port = dp_to_dig_port (intel_dp );
1720
+ struct drm_device * dev = dig_port -> base .base .dev ;
1715
1721
struct drm_i915_private * dev_priv = dev -> dev_private ;
1716
1722
uint32_t max_sleep_time = 0x1f ;
1717
1723
uint32_t idle_frames = 1 ;
1718
1724
uint32_t val = 0x0 ;
1719
1725
const uint32_t link_entry_time = EDP_PSR_MIN_LINK_ENTRY_TIME_8_LINES ;
1726
+ bool only_standby = false;
1720
1727
1721
- if (intel_dp -> psr_dpcd [1 ] & DP_PSR_NO_TRAIN_ON_EXIT ) {
1728
+ if (IS_BROADWELL (dev ) && dig_port -> port != PORT_A )
1729
+ only_standby = true;
1730
+
1731
+ if (intel_dp -> psr_dpcd [1 ] & DP_PSR_NO_TRAIN_ON_EXIT || only_standby ) {
1722
1732
val |= EDP_PSR_LINK_STANDBY ;
1723
1733
val |= EDP_PSR_TP2_TP3_TIME_0us ;
1724
1734
val |= EDP_PSR_TP1_TIME_0us ;
@@ -1746,8 +1756,13 @@ static bool intel_edp_psr_match_conditions(struct intel_dp *intel_dp)
1746
1756
1747
1757
dev_priv -> psr .source_ok = false;
1748
1758
1749
- if ((intel_encoder -> type != INTEL_OUTPUT_EDP ) ||
1750
- (dig_port -> port != PORT_A )) {
1759
+ if (!HAS_PSR (dev )) {
1760
+ DRM_DEBUG_KMS ("PSR not supported on this platform\n" );
1761
+ return false;
1762
+ }
1763
+
1764
+ if (IS_HASWELL (dev ) && (intel_encoder -> type != INTEL_OUTPUT_EDP ||
1765
+ dig_port -> port != PORT_A )) {
1751
1766
DRM_DEBUG_KMS ("HSW ties PSR to DDI A (eDP)\n" );
1752
1767
return false;
1753
1768
}
0 commit comments