@@ -542,6 +542,14 @@ static void hsw_activate_psr2(struct intel_dp *intel_dp)
542
542
val |= EDP_PSR2_FRAME_BEFORE_SU (max_t (u8 , intel_dp -> psr .sink_sync_latency + 1 , 2 ));
543
543
val |= intel_psr2_get_tp_time (intel_dp );
544
544
545
+ if (DISPLAY_VER (dev_priv ) >= 12 ) {
546
+ if (intel_dp -> psr .io_wake_lines < 9 &&
547
+ intel_dp -> psr .fast_wake_lines < 9 )
548
+ val |= TGL_EDP_PSR2_BLOCK_COUNT_NUM_2 ;
549
+ else
550
+ val |= TGL_EDP_PSR2_BLOCK_COUNT_NUM_3 ;
551
+ }
552
+
545
553
/* Wa_22012278275:adl-p */
546
554
if (IS_ADLP_DISPLAY_STEP (dev_priv , STEP_A0 , STEP_E0 )) {
547
555
static const u8 map [] = {
@@ -558,31 +566,21 @@ static void hsw_activate_psr2(struct intel_dp *intel_dp)
558
566
* Still using the default IO_BUFFER_WAKE and FAST_WAKE, see
559
567
* comments bellow for more information
560
568
*/
561
- u32 tmp , lines = 7 ;
562
-
563
- val |= TGL_EDP_PSR2_BLOCK_COUNT_NUM_2 ;
569
+ u32 tmp ;
564
570
565
- tmp = map [lines - TGL_EDP_PSR2_IO_BUFFER_WAKE_MIN_LINES ];
571
+ tmp = map [intel_dp -> psr . io_wake_lines - TGL_EDP_PSR2_IO_BUFFER_WAKE_MIN_LINES ];
566
572
tmp = tmp << TGL_EDP_PSR2_IO_BUFFER_WAKE_SHIFT ;
567
573
val |= tmp ;
568
574
569
- tmp = map [lines - TGL_EDP_PSR2_FAST_WAKE_MIN_LINES ];
575
+ tmp = map [intel_dp -> psr . fast_wake_lines - TGL_EDP_PSR2_FAST_WAKE_MIN_LINES ];
570
576
tmp = tmp << TGL_EDP_PSR2_FAST_WAKE_MIN_SHIFT ;
571
577
val |= tmp ;
572
578
} else if (DISPLAY_VER (dev_priv ) >= 12 ) {
573
- /*
574
- * TODO: 7 lines of IO_BUFFER_WAKE and FAST_WAKE are default
575
- * values from BSpec. In order to setting an optimal power
576
- * consumption, lower than 4k resolution mode needs to decrease
577
- * IO_BUFFER_WAKE and FAST_WAKE. And higher than 4K resolution
578
- * mode needs to increase IO_BUFFER_WAKE and FAST_WAKE.
579
- */
580
- val |= TGL_EDP_PSR2_BLOCK_COUNT_NUM_2 ;
581
- val |= TGL_EDP_PSR2_IO_BUFFER_WAKE (7 );
582
- val |= TGL_EDP_PSR2_FAST_WAKE (7 );
579
+ val |= TGL_EDP_PSR2_IO_BUFFER_WAKE (intel_dp -> psr .io_wake_lines );
580
+ val |= TGL_EDP_PSR2_FAST_WAKE (intel_dp -> psr .fast_wake_lines );
583
581
} else if (DISPLAY_VER (dev_priv ) >= 9 ) {
584
- val |= EDP_PSR2_IO_BUFFER_WAKE (7 );
585
- val |= EDP_PSR2_FAST_WAKE (7 );
582
+ val |= EDP_PSR2_IO_BUFFER_WAKE (intel_dp -> psr . io_wake_lines );
583
+ val |= EDP_PSR2_FAST_WAKE (intel_dp -> psr . fast_wake_lines );
586
584
}
587
585
588
586
if (intel_dp -> psr .req_psr2_sdp_prior_scanline )
@@ -842,6 +840,46 @@ static bool _compute_psr2_sdp_prior_scanline_indication(struct intel_dp *intel_d
842
840
return true;
843
841
}
844
842
843
+ static bool _compute_psr2_wake_times (struct intel_dp * intel_dp ,
844
+ struct intel_crtc_state * crtc_state )
845
+ {
846
+ struct drm_i915_private * i915 = dp_to_i915 (intel_dp );
847
+ int io_wake_lines , io_wake_time , fast_wake_lines , fast_wake_time ;
848
+ u8 max_wake_lines ;
849
+
850
+ if (DISPLAY_VER (i915 ) >= 12 ) {
851
+ io_wake_time = 42 ;
852
+ /*
853
+ * According to Bspec it's 42us, but based on testing
854
+ * it is not enough -> use 45 us.
855
+ */
856
+ fast_wake_time = 45 ;
857
+ max_wake_lines = 12 ;
858
+ } else {
859
+ io_wake_time = 50 ;
860
+ fast_wake_time = 32 ;
861
+ max_wake_lines = 8 ;
862
+ }
863
+
864
+ io_wake_lines = intel_usecs_to_scanlines (
865
+ & crtc_state -> uapi .adjusted_mode , io_wake_time );
866
+ fast_wake_lines = intel_usecs_to_scanlines (
867
+ & crtc_state -> uapi .adjusted_mode , fast_wake_time );
868
+
869
+ if (io_wake_lines > max_wake_lines ||
870
+ fast_wake_lines > max_wake_lines )
871
+ return false;
872
+
873
+ if (i915 -> params .psr_safest_params )
874
+ io_wake_lines = fast_wake_lines = max_wake_lines ;
875
+
876
+ /* According to Bspec lower limit should be set as 7 lines. */
877
+ intel_dp -> psr .io_wake_lines = max (io_wake_lines , 7 );
878
+ intel_dp -> psr .fast_wake_lines = max (fast_wake_lines , 7 );
879
+
880
+ return true;
881
+ }
882
+
845
883
static bool intel_psr2_config_valid (struct intel_dp * intel_dp ,
846
884
struct intel_crtc_state * crtc_state )
847
885
{
@@ -936,6 +974,12 @@ static bool intel_psr2_config_valid(struct intel_dp *intel_dp,
936
974
return false;
937
975
}
938
976
977
+ if (!_compute_psr2_wake_times (intel_dp , crtc_state )) {
978
+ drm_dbg_kms (& dev_priv -> drm ,
979
+ "PSR2 not enabled, Unable to use long enough wake times\n" );
980
+ return false;
981
+ }
982
+
939
983
if (HAS_PSR2_SEL_FETCH (dev_priv )) {
940
984
if (!intel_psr2_sel_fetch_config_valid (intel_dp , crtc_state ) &&
941
985
!HAS_PSR_HW_TRACKING (dev_priv )) {
0 commit comments