@@ -1994,6 +1994,7 @@ static void psr_force_hw_tracking_exit(struct intel_dp *intel_dp)
19941994
19951995void intel_psr2_program_trans_man_trk_ctl (const struct intel_crtc_state * crtc_state )
19961996{
1997+ struct intel_crtc * crtc = to_intel_crtc (crtc_state -> uapi .crtc );
19971998 struct drm_i915_private * dev_priv = to_i915 (crtc_state -> uapi .crtc -> dev );
19981999 enum transcoder cpu_transcoder = crtc_state -> cpu_transcoder ;
19992000 struct intel_encoder * encoder ;
@@ -2013,6 +2014,12 @@ void intel_psr2_program_trans_man_trk_ctl(const struct intel_crtc_state *crtc_st
20132014
20142015 intel_de_write (dev_priv , PSR2_MAN_TRK_CTL (cpu_transcoder ),
20152016 crtc_state -> psr2_man_track_ctl );
2017+
2018+ if (!crtc_state -> enable_psr2_su_region_et )
2019+ return ;
2020+
2021+ intel_de_write (dev_priv , PIPE_SRCSZ_ERLY_TPT (crtc -> pipe ),
2022+ crtc_state -> pipe_srcsz_early_tpt );
20162023}
20172024
20182025static void psr2_man_trk_ctl_calc (struct intel_crtc_state * crtc_state ,
@@ -2051,6 +2058,20 @@ static void psr2_man_trk_ctl_calc(struct intel_crtc_state *crtc_state,
20512058 crtc_state -> psr2_man_track_ctl = val ;
20522059}
20532060
2061+ static u32 psr2_pipe_srcsz_early_tpt_calc (struct intel_crtc_state * crtc_state ,
2062+ bool full_update )
2063+ {
2064+ int width , height ;
2065+
2066+ if (!crtc_state -> enable_psr2_su_region_et || full_update )
2067+ return 0 ;
2068+
2069+ width = drm_rect_width (& crtc_state -> psr2_su_area );
2070+ height = drm_rect_height (& crtc_state -> psr2_su_area );
2071+
2072+ return PIPESRC_WIDTH (width - 1 ) | PIPESRC_HEIGHT (height - 1 );
2073+ }
2074+
20542075static void clip_area_update (struct drm_rect * overlap_damage_area ,
20552076 struct drm_rect * damage_area ,
20562077 struct drm_rect * pipe_src )
@@ -2095,21 +2116,36 @@ static void intel_psr2_sel_fetch_pipe_alignment(struct intel_crtc_state *crtc_st
20952116 * cursor fully when cursor is in SU area.
20962117 */
20972118static void
2098- intel_psr2_sel_fetch_et_alignment (struct intel_crtc_state * crtc_state ,
2099- struct intel_plane_state * cursor_state )
2119+ intel_psr2_sel_fetch_et_alignment (struct intel_atomic_state * state ,
2120+ struct intel_crtc * crtc )
21002121{
2101- struct drm_rect inter ;
2122+ struct intel_crtc_state * crtc_state = intel_atomic_get_new_crtc_state (state , crtc );
2123+ struct intel_plane_state * new_plane_state ;
2124+ struct intel_plane * plane ;
2125+ int i ;
21022126
2103- if (!crtc_state -> enable_psr2_su_region_et ||
2104- !cursor_state -> uapi .visible )
2127+ if (!crtc_state -> enable_psr2_su_region_et )
21052128 return ;
21062129
2107- inter = crtc_state -> psr2_su_area ;
2108- if (!drm_rect_intersect (& inter , & cursor_state -> uapi .dst ))
2109- return ;
2130+ for_each_new_intel_plane_in_state (state , plane , new_plane_state , i ) {
2131+ struct drm_rect inter ;
21102132
2111- clip_area_update (& crtc_state -> psr2_su_area , & cursor_state -> uapi .dst ,
2112- & crtc_state -> pipe_src );
2133+ if (new_plane_state -> uapi .crtc != crtc_state -> uapi .crtc )
2134+ continue ;
2135+
2136+ if (plane -> id != PLANE_CURSOR )
2137+ continue ;
2138+
2139+ if (!new_plane_state -> uapi .visible )
2140+ continue ;
2141+
2142+ inter = crtc_state -> psr2_su_area ;
2143+ if (!drm_rect_intersect (& inter , & new_plane_state -> uapi .dst ))
2144+ continue ;
2145+
2146+ clip_area_update (& crtc_state -> psr2_su_area , & new_plane_state -> uapi .dst ,
2147+ & crtc_state -> pipe_src );
2148+ }
21132149}
21142150
21152151/*
@@ -2152,8 +2188,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
21522188{
21532189 struct drm_i915_private * dev_priv = to_i915 (state -> base .dev );
21542190 struct intel_crtc_state * crtc_state = intel_atomic_get_new_crtc_state (state , crtc );
2155- struct intel_plane_state * new_plane_state , * old_plane_state ,
2156- * cursor_plane_state = NULL ;
2191+ struct intel_plane_state * new_plane_state , * old_plane_state ;
21572192 struct intel_plane * plane ;
21582193 bool full_update = false;
21592194 int i , ret ;
@@ -2238,13 +2273,6 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
22382273 damaged_area .x2 += new_plane_state -> uapi .dst .x1 - src .x1 ;
22392274
22402275 clip_area_update (& crtc_state -> psr2_su_area , & damaged_area , & crtc_state -> pipe_src );
2241-
2242- /*
2243- * Cursor plane new state is stored to adjust su area to cover
2244- * cursor are fully.
2245- */
2246- if (plane -> id == PLANE_CURSOR )
2247- cursor_plane_state = new_plane_state ;
22482276 }
22492277
22502278 /*
@@ -2273,9 +2301,13 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
22732301 if (ret )
22742302 return ret ;
22752303
2276- /* Adjust su area to cover cursor fully as necessary */
2277- if (cursor_plane_state )
2278- intel_psr2_sel_fetch_et_alignment (crtc_state , cursor_plane_state );
2304+ /*
2305+ * Adjust su area to cover cursor fully as necessary (early
2306+ * transport). This needs to be done after
2307+ * drm_atomic_add_affected_planes to ensure visible cursor is added into
2308+ * affected planes even when cursor is not updated by itself.
2309+ */
2310+ intel_psr2_sel_fetch_et_alignment (state , crtc );
22792311
22802312 intel_psr2_sel_fetch_pipe_alignment (crtc_state );
22812313
@@ -2338,6 +2370,8 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
23382370
23392371skip_sel_fetch_set_loop :
23402372 psr2_man_trk_ctl_calc (crtc_state , full_update );
2373+ crtc_state -> pipe_srcsz_early_tpt =
2374+ psr2_pipe_srcsz_early_tpt_calc (crtc_state , full_update );
23412375 return 0 ;
23422376}
23432377
0 commit comments