4343#include "intel_display_wa.h"
4444#include "intel_dmc.h"
4545#include "intel_dp.h"
46+ #include "intel_dpcd.h"
4647#include "intel_dp_aux.h"
4748#include "intel_dsb.h"
4849#include "intel_frontbuffer.h"
@@ -716,8 +717,14 @@ static void _psr_init_dpcd(struct intel_dp *intel_dp, struct intel_connector *co
716717 connector -> dp .psr_caps .su_support ? "" : "not " );
717718 }
718719
719- if (connector -> dp .psr_caps .su_support )
720+ if (connector -> dp .psr_caps .su_support ) {
721+ ret = drm_dp_dpcd_read_byte (& intel_dp -> aux ,
722+ INTEL_DPCD_INTEL_WA_REGISTER_CAPS ,
723+ & connector -> dp .psr_caps .intel_wa_dpcd );
724+ if (ret < 0 )
725+ return ;
720726 _psr_compute_su_granularity (intel_dp , connector );
727+ }
721728}
722729
723730void intel_psr_init_dpcd (struct intel_dp * intel_dp , struct intel_connector * connector )
@@ -1358,9 +1365,35 @@ static bool psr2_granularity_check(struct intel_crtc_state *crtc_state,
13581365 return true;
13591366}
13601367
1361- static bool _compute_psr2_sdp_prior_scanline_indication (struct intel_dp * intel_dp ,
1362- struct intel_crtc_state * crtc_state )
1368+ static bool apply_scanline_indication_wa (struct intel_crtc_state * crtc_state ,
1369+ struct intel_connector * connector )
1370+ {
1371+ struct intel_dp * intel_dp = intel_attached_dp (connector );
1372+ u8 early_scanline_support = connector -> dp .psr_caps .intel_wa_dpcd &
1373+ INTEL_DPCD_INTEL_WA_REGISTER_CAPS_PSR2_EARLYSCANLINE_SDP_SUPPORT_MASK ;
1374+
1375+ if (intel_dp -> edp_dpcd [0 ] >= DP_EDP_15 )
1376+ return true;
1377+
1378+ switch (early_scanline_support ) {
1379+ case INTEL_DPCD_INTEL_WA_REGISTER_CAPS_FALL_BACK_TO_PSR1 :
1380+ crtc_state -> req_psr2_sdp_prior_scanline = false;
1381+ return false;
1382+ case INTEL_DPCD_INTEL_WA_REGISTER_CAPS_PSR2_WITH_EARLY_SCANLINE :
1383+ return true;
1384+ case INTEL_DPCD_INTEL_WA_REGISTER_CAPS_PSR2_WITHOUT_EARLY_SCANLINE :
1385+ crtc_state -> req_psr2_sdp_prior_scanline = false;
1386+ return true;
1387+ default :
1388+ MISSING_CASE (early_scanline_support );
1389+ return false;
1390+ }
1391+ }
1392+
1393+ static bool _compute_psr2_sdp_prior_scanline_indication (struct intel_crtc_state * crtc_state ,
1394+ struct intel_connector * connector )
13631395{
1396+ struct intel_dp * intel_dp = intel_attached_dp (connector );
13641397 struct intel_display * display = to_intel_display (intel_dp );
13651398 const struct drm_display_mode * adjusted_mode = & crtc_state -> uapi .adjusted_mode ;
13661399 u32 hblank_total , hblank_ns , req_ns ;
@@ -1379,7 +1412,8 @@ static bool _compute_psr2_sdp_prior_scanline_indication(struct intel_dp *intel_d
13791412 return false;
13801413
13811414 crtc_state -> req_psr2_sdp_prior_scanline = true;
1382- return true;
1415+
1416+ return apply_scanline_indication_wa (crtc_state , connector );
13831417}
13841418
13851419static int intel_psr_entry_setup_frames (struct intel_dp * intel_dp ,
@@ -1660,7 +1694,7 @@ static bool intel_sel_update_config_valid(struct intel_crtc_state *crtc_state,
16601694 conn_state ))
16611695 goto unsupported ;
16621696
1663- if (!_compute_psr2_sdp_prior_scanline_indication (intel_dp , crtc_state )) {
1697+ if (!_compute_psr2_sdp_prior_scanline_indication (crtc_state , connector )) {
16641698 drm_dbg_kms (display -> drm ,
16651699 "Selective update not enabled, SDP indication do not fit in hblank\n" );
16661700 goto unsupported ;
0 commit comments