Su_area is needed when configuring CUR_POS_ERLY_TPT and
PIPE_SRC_SZ_ERLY_TPT. Store it into intel_crtc_state->psr2_su_area.

Signed-off-by: Jouni Högander <jouni.hogan...@intel.com>
---
 .../drm/i915/display/intel_display_types.h    |  2 +
 drivers/gpu/drm/i915/display/intel_psr.c      | 62 ++++++++++---------
 2 files changed, 36 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index 341d80c2b9de..05dd8decd610 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1404,6 +1404,8 @@ struct intel_crtc_state {
 
        u32 psr2_man_track_ctl;
 
+       struct drm_rect psr2_su_area;
+
        /* Variable Refresh Rate state */
        struct {
                bool enable, in_range;
diff --git a/drivers/gpu/drm/i915/display/intel_psr.c 
b/drivers/gpu/drm/i915/display/intel_psr.c
index 8a350b9e33cd..67f68c26a312 100644
--- a/drivers/gpu/drm/i915/display/intel_psr.c
+++ b/drivers/gpu/drm/i915/display/intel_psr.c
@@ -1941,7 +1941,7 @@ void intel_psr2_program_trans_man_trk_ctl(const struct 
intel_crtc_state *crtc_st
 }
 
 static void psr2_man_trk_ctl_calc(struct intel_crtc_state *crtc_state,
-                                 struct drm_rect *clip, bool full_update)
+                                 bool full_update)
 {
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
@@ -1956,17 +1956,21 @@ static void psr2_man_trk_ctl_calc(struct 
intel_crtc_state *crtc_state,
                goto exit;
        }
 
-       if (clip->y1 == -1)
+       if (crtc_state->psr2_su_area.y1 == -1)
                goto exit;
 
        if (IS_ALDERLAKE_P(dev_priv) || DISPLAY_VER(dev_priv) >= 14) {
-               val |= ADLP_PSR2_MAN_TRK_CTL_SU_REGION_START_ADDR(clip->y1);
-               val |= ADLP_PSR2_MAN_TRK_CTL_SU_REGION_END_ADDR(clip->y2 - 1);
+               val |= 
ADLP_PSR2_MAN_TRK_CTL_SU_REGION_START_ADDR(crtc_state->psr2_su_area.y1);
+               val |= 
ADLP_PSR2_MAN_TRK_CTL_SU_REGION_END_ADDR(crtc_state->psr2_su_area.y2 - 1);
        } else {
-               drm_WARN_ON(crtc_state->uapi.crtc->dev, clip->y1 % 4 || 
clip->y2 % 4);
+               drm_WARN_ON(crtc_state->uapi.crtc->dev,
+                           crtc_state->psr2_su_area.y1 % 4 ||
+                           crtc_state->psr2_su_area.y2 % 4);
 
-               val |= PSR2_MAN_TRK_CTL_SU_REGION_START_ADDR(clip->y1 / 4 + 1);
-               val |= PSR2_MAN_TRK_CTL_SU_REGION_END_ADDR(clip->y2 / 4 + 1);
+               val |= PSR2_MAN_TRK_CTL_SU_REGION_START_ADDR(
+                       crtc_state->psr2_su_area.y1 / 4 + 1);
+               val |= PSR2_MAN_TRK_CTL_SU_REGION_END_ADDR(
+                       crtc_state->psr2_su_area.y2 / 4 + 1);
        }
 exit:
        crtc_state->psr2_man_track_ctl = val;
@@ -1992,8 +1996,7 @@ static void clip_area_update(struct drm_rect 
*overlap_damage_area,
                overlap_damage_area->y2 = damage_area->y2;
 }
 
-static void intel_psr2_sel_fetch_pipe_alignment(const struct intel_crtc_state 
*crtc_state,
-                                               struct drm_rect *pipe_clip)
+static void intel_psr2_sel_fetch_pipe_alignment(struct intel_crtc_state 
*crtc_state)
 {
        struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
        const struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;
@@ -2006,9 +2009,10 @@ static void intel_psr2_sel_fetch_pipe_alignment(const 
struct intel_crtc_state *c
        else
                y_alignment = crtc_state->su_y_granularity;
 
-       pipe_clip->y1 -= pipe_clip->y1 % y_alignment;
-       if (pipe_clip->y2 % y_alignment)
-               pipe_clip->y2 = ((pipe_clip->y2 / y_alignment) + 1) * 
y_alignment;
+       crtc_state->psr2_su_area.y1 -= crtc_state->psr2_su_area.y1 % 
y_alignment;
+       if (crtc_state->psr2_su_area.y2 % y_alignment)
+               crtc_state->psr2_su_area.y2 = ((crtc_state->psr2_su_area.y2 /
+                                               y_alignment) + 1) * y_alignment;
 }
 
 /*
@@ -2017,8 +2021,7 @@ static void intel_psr2_sel_fetch_pipe_alignment(const 
struct intel_crtc_state *c
  */
 static void
 intel_psr2_sel_fetch_et_alignment(struct intel_crtc_state *crtc_state,
-                                 struct intel_plane_state *cursor_state,
-                                 struct drm_rect *pipe_clip)
+                                 struct intel_plane_state *cursor_state)
 {
        struct drm_rect inter;
 
@@ -2026,11 +2029,11 @@ intel_psr2_sel_fetch_et_alignment(struct 
intel_crtc_state *crtc_state,
            !cursor_state->uapi.visible)
                return;
 
-       inter = *pipe_clip;
+       inter = crtc_state->psr2_su_area;
        if (!drm_rect_intersect(&inter, &cursor_state->uapi.dst))
                return;
 
-       clip_area_update(pipe_clip, &cursor_state->uapi.dst,
+       clip_area_update(&crtc_state->psr2_su_area, &cursor_state->uapi.dst,
                         &crtc_state->pipe_src);
 }
 
@@ -2074,7 +2077,6 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state 
*state,
 {
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
        struct intel_crtc_state *crtc_state = 
intel_atomic_get_new_crtc_state(state, crtc);
-       struct drm_rect pipe_clip = { .x1 = 0, .y1 = -1, .x2 = INT_MAX, .y2 = 
-1 };
        struct intel_plane_state *new_plane_state, *old_plane_state,
                *cursor_plane_state = NULL;
        struct intel_plane *plane;
@@ -2089,6 +2091,11 @@ int intel_psr2_sel_fetch_update(struct 
intel_atomic_state *state,
                goto skip_sel_fetch_set_loop;
        }
 
+       crtc_state->psr2_su_area.x1 = 0;
+       crtc_state->psr2_su_area.y1 = -1;
+       crtc_state->psr2_su_area.x2 = INT_MAX;
+       crtc_state->psr2_su_area.y2 = -1;
+
        /*
         * Calculate minimal selective fetch area of each plane and calculate
         * the pipe damaged area.
@@ -2123,14 +2130,14 @@ int intel_psr2_sel_fetch_update(struct 
intel_atomic_state *state,
                        if (old_plane_state->uapi.visible) {
                                damaged_area.y1 = old_plane_state->uapi.dst.y1;
                                damaged_area.y2 = old_plane_state->uapi.dst.y2;
-                               clip_area_update(&pipe_clip, &damaged_area,
+                               clip_area_update(&crtc_state->psr2_su_area, 
&damaged_area,
                                                 &crtc_state->pipe_src);
                        }
 
                        if (new_plane_state->uapi.visible) {
                                damaged_area.y1 = new_plane_state->uapi.dst.y1;
                                damaged_area.y2 = new_plane_state->uapi.dst.y2;
-                               clip_area_update(&pipe_clip, &damaged_area,
+                               clip_area_update(&crtc_state->psr2_su_area, 
&damaged_area,
                                                 &crtc_state->pipe_src);
                        }
                        continue;
@@ -2138,7 +2145,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state 
*state,
                        /* If alpha changed mark the whole plane area as 
damaged */
                        damaged_area.y1 = new_plane_state->uapi.dst.y1;
                        damaged_area.y2 = new_plane_state->uapi.dst.y2;
-                       clip_area_update(&pipe_clip, &damaged_area,
+                       clip_area_update(&crtc_state->psr2_su_area, 
&damaged_area,
                                         &crtc_state->pipe_src);
                        continue;
                }
@@ -2155,7 +2162,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state 
*state,
                damaged_area.x1 += new_plane_state->uapi.dst.x1 - src.x1;
                damaged_area.x2 += new_plane_state->uapi.dst.x1 - src.x1;
 
-               clip_area_update(&pipe_clip, &damaged_area, 
&crtc_state->pipe_src);
+               clip_area_update(&crtc_state->psr2_su_area, &damaged_area, 
&crtc_state->pipe_src);
 
                /*
                 * Cursor plane new state is stored to adjust su area to cover
@@ -2171,7 +2178,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state 
*state,
         * should identify cases where this happens and fix the area
         * calculation for those.
         */
-       if (pipe_clip.y1 == -1) {
+       if (crtc_state->psr2_su_area.y1 == -1) {
                drm_info_once(&dev_priv->drm,
                              "Selective fetch area calculation failed in pipe 
%c\n",
                              pipe_name(crtc->pipe));
@@ -2185,7 +2192,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state 
*state,
        if ((IS_DISPLAY_IP_STEP(dev_priv, IP_VER(14, 0), STEP_A0, STEP_B0) ||
             IS_ALDERLAKE_P(dev_priv) || IS_TIGERLAKE(dev_priv)) &&
            crtc_state->splitter.enable)
-               pipe_clip.y1 = 0;
+               crtc_state->psr2_su_area.y1 = 0;
 
        ret = drm_atomic_add_affected_planes(&state->base, &crtc->base);
        if (ret)
@@ -2193,10 +2200,9 @@ int intel_psr2_sel_fetch_update(struct 
intel_atomic_state *state,
 
        /* Adjust su area to cover cursor fully as necessary */
        if (cursor_plane_state)
-               intel_psr2_sel_fetch_et_alignment(crtc_state, 
cursor_plane_state,
-                                                 &pipe_clip);
+               intel_psr2_sel_fetch_et_alignment(crtc_state, 
cursor_plane_state);
 
-       intel_psr2_sel_fetch_pipe_alignment(crtc_state, &pipe_clip);
+       intel_psr2_sel_fetch_pipe_alignment(crtc_state);
 
        /*
         * Now that we have the pipe damaged area check if it intersect with
@@ -2211,7 +2217,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state 
*state,
                    !new_plane_state->uapi.visible)
                        continue;
 
-               inter = pipe_clip;
+               inter = crtc_state->psr2_su_area;
                sel_fetch_area = &new_plane_state->psr2_sel_fetch_area;
                if (!drm_rect_intersect(&inter, &new_plane_state->uapi.dst)) {
                        sel_fetch_area->y1 = -1;
@@ -2256,7 +2262,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state 
*state,
        }
 
 skip_sel_fetch_set_loop:
-       psr2_man_trk_ctl_calc(crtc_state, &pipe_clip, full_update);
+       psr2_man_trk_ctl_calc(crtc_state, full_update);
        return 0;
 }
 
-- 
2.34.1

Reply via email to