@@ -2519,6 +2519,38 @@ static bool psr2_sel_fetch_pipe_state_supported(const struct intel_crtc_state *c
2519
2519
return true;
2520
2520
}
2521
2521
2522
+ /* Wa 14019834836 */
2523
+ static void intel_psr_apply_pr_link_on_su_wa (struct intel_crtc_state * crtc_state )
2524
+ {
2525
+ struct intel_display * display = to_intel_display (crtc_state );
2526
+ struct intel_encoder * encoder ;
2527
+ int hactive_limit ;
2528
+
2529
+ if (crtc_state -> psr2_su_area .y1 != 0 ||
2530
+ crtc_state -> psr2_su_area .y2 != 0 )
2531
+ return ;
2532
+
2533
+ if (crtc_state -> output_format == INTEL_OUTPUT_FORMAT_YCBCR420 )
2534
+ hactive_limit = intel_dp_is_uhbr (crtc_state ) ? 1230 : 546 ;
2535
+ else
2536
+ hactive_limit = intel_dp_is_uhbr (crtc_state ) ? 615 : 273 ;
2537
+
2538
+ if (crtc_state -> hw .adjusted_mode .hdisplay < hactive_limit )
2539
+ return ;
2540
+
2541
+ for_each_intel_encoder_mask_with_psr (display -> drm , encoder ,
2542
+ crtc_state -> uapi .encoder_mask ) {
2543
+ struct intel_dp * intel_dp = enc_to_intel_dp (encoder );
2544
+
2545
+ if (!intel_dp_is_edp (intel_dp ) &&
2546
+ intel_dp -> psr .panel_replay_enabled &&
2547
+ intel_dp -> psr .sel_update_enabled ) {
2548
+ crtc_state -> psr2_su_area .y2 ++ ;
2549
+ return ;
2550
+ }
2551
+ }
2552
+ }
2553
+
2522
2554
static void
2523
2555
intel_psr_apply_su_area_workarounds (struct intel_crtc_state * crtc_state )
2524
2556
{
@@ -2531,6 +2563,10 @@ intel_psr_apply_su_area_workarounds(struct intel_crtc_state *crtc_state)
2531
2563
IS_ALDERLAKE_P (i915 ) || IS_TIGERLAKE (i915 ))) &&
2532
2564
crtc_state -> splitter .enable )
2533
2565
crtc_state -> psr2_su_area .y1 = 0 ;
2566
+
2567
+ /* Wa 14019834836 */
2568
+ if (DISPLAY_VER (display ) == 30 )
2569
+ intel_psr_apply_pr_link_on_su_wa (crtc_state );
2534
2570
}
2535
2571
2536
2572
int intel_psr2_sel_fetch_update (struct intel_atomic_state * state ,
0 commit comments