[Intel-gfx] [PATCH v2 2/2] drm/i915/psr: Add proper handling for disabling sel fetch for planes
Hogander, Jouni
jouni.hogander at intel.com
Fri Nov 17 11:23:17 UTC 2023
On Fri, 2023-11-17 at 13:09 +0200, Ville Syrjälä wrote:
> On Fri, Nov 17, 2023 at 12:02:27PM +0200, Jouni Högander wrote:
> > Currently we are enabling selective fetch for all planes that are
> > visible.
> > This is suboptimal as we might be fetching for memory for planes
> > that are
> > not part of selective update.
> >
> > Fix this by adding proper handling for disabling plane selective
> > fetch:
> > If plane previously part of selective update is now not part of
> > update:
> > Add it into updated planes and let the plane configuration to
> > disable
> > selective fetch for it.
> >
> > v2:
> > - Add setting sel_fetch_area->y1/y2 to -1
> > - Remove setting again local sel_fetch_area variable
> >
> > Signed-off-by: Jouni Högander <jouni.hogander at intel.com>
> > ---
> > drivers/gpu/drm/i915/display/intel_cursor.c | 22 +++++++++++----
> > ----
> > drivers/gpu/drm/i915/display/intel_psr.c | 13 ++++++++++-
> > .../drm/i915/display/skl_universal_plane.c | 8 +++++--
> > 3 files changed, 31 insertions(+), 12 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_cursor.c
> > b/drivers/gpu/drm/i915/display/intel_cursor.c
> > index c089dd6f9781..299d22708fa4 100644
> > --- a/drivers/gpu/drm/i915/display/intel_cursor.c
> > +++ b/drivers/gpu/drm/i915/display/intel_cursor.c
> > @@ -485,22 +485,22 @@ static int i9xx_check_cursor(struct
> > intel_crtc_state *crtc_state,
> > return 0;
> > }
> >
> > -static void i9xx_cursor_update_sel_fetch_arm(struct intel_plane
> > *plane,
> > - const struct
> > intel_crtc_state *crtc_state,
> > - const struct
> > intel_plane_state *plane_state)
> > +static void i9xx_cursor_disable_sel_fetch_arm(struct intel_plane
> > *plane,
> > + const struct
> > intel_crtc_state *crtc_state)
> > {
> > - struct drm_i915_private *i915 = to_i915(plane->base.dev);
> > + struct drm_i915_private *dev_priv = to_i915(plane-
> > >base.dev);
> > enum pipe pipe = plane->pipe;
> >
> > if (!crtc_state->enable_psr2_sel_fetch)
> > return;
> >
> > - intel_de_write_fw(i915, PLANE_SEL_FETCH_CTL(pipe, plane-
> > >id),
> > - plane_state->ctl);
> > +
> > + intel_de_write_fw(dev_priv, PLANE_SEL_FETCH_CTL(pipe,
> > plane->id), 0);
> > }
> >
> > -static void i9xx_cursor_disable_sel_fetch_arm(struct intel_plane
> > *plane,
> > - const struct
> > intel_crtc_state *crtc_state)
> > +static void i9xx_cursor_update_sel_fetch_arm(struct intel_plane
> > *plane,
> > + const struct
> > intel_crtc_state *crtc_state,
> > + const struct
> > intel_plane_state *plane_state)
> > {
> > struct drm_i915_private *i915 = to_i915(plane->base.dev);
> > enum pipe pipe = plane->pipe;
> > @@ -508,7 +508,11 @@ static void
> > i9xx_cursor_disable_sel_fetch_arm(struct intel_plane *plane,
> > if (!crtc_state->enable_psr2_sel_fetch)
> > return;
> >
> > - intel_de_write_fw(i915, PLANE_SEL_FETCH_CTL(pipe, plane-
> > >id), 0);
> > + if (drm_rect_height(&plane_state->psr2_sel_fetch_area) > 0)
>
> drm_rect_visible() is less magic.
Our hw the area is always just full lines -> choose to use
drm_recth_height. Drm_rect_visible should work as well. We just need to
ensure x1 and x2 are set accordingly if we do the change.
>
> > + intel_de_write_fw(i915, PLANE_SEL_FETCH_CTL(pipe,
> > plane->id),
> > + plane_state->ctl);
>
> Does this even have anything besides the enable bit?
Bspec says:
"If the update region (translated to pipe source coordinates) overlaps
this cursor, then the selective fetch cursor mode select should be the
same as the cursor control mode select (SEL_FETCH_CUR_CTL[ Cursor Mode
Select ] = CUR_CTL[ Cursor Mode Select ]. Otherwise, disable
(SEL_FETCH_CUR_CTL[ Cursor Mode Select ] = 0)."
and
"Program the other fields in SEL_FETCH_CUR_CTL to match CUR_CTL."
>
> > + else
> > + i9xx_cursor_disable_sel_fetch_arm(plane,
> > crtc_state);
> > }
> >
> > /* TODO: split into noarm+arm pair */
> > diff --git a/drivers/gpu/drm/i915/display/intel_psr.c
> > b/drivers/gpu/drm/i915/display/intel_psr.c
> > index 87eb1535ba98..239365c666e2 100644
> > --- a/drivers/gpu/drm/i915/display/intel_psr.c
> > +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> > @@ -2173,8 +2173,19 @@ int intel_psr2_sel_fetch_update(struct
> > intel_atomic_state *state,
> > continue;
> >
> > inter = pipe_clip;
> > - if (!drm_rect_intersect(&inter, &new_plane_state-
> > >uapi.dst))
> > + 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;
> > + sel_fetch_area->y2 = -1;
> > + /*
> > + * if plane sel fetch was previously
> > enabled ->
> > + * disable it
> > + */
> > + if (drm_rect_height(&old_plane_state-
> > >psr2_sel_fetch_area) > 0)
> > + crtc_state->update_planes |=
> > BIT(plane->id);
> > +
> > continue;
> > + }
>
> I tried to look at this code, but it just looks entirely confused
> about things.
>
> I had a quick stab at rewriting it all:
> https://github.com/vsyrjala/linux.git sel_fetch_redo_2
> but I don't have a machine to test it, so can't guarantee that it's
> 100%
> correct.
I will take a look and give a try...
BR,
Jouni Högander
>
> >
> > if
> > (!psr2_sel_fetch_plane_state_supported(new_plane_state)) {
> > full_update = true;
> > diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c
> > b/drivers/gpu/drm/i915/display/skl_universal_plane.c
> > index 99d33ac5ceee..a969bb835baf 100644
> > --- a/drivers/gpu/drm/i915/display/skl_universal_plane.c
> > +++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c
> > @@ -1336,8 +1336,12 @@ static void
> > icl_plane_update_sel_fetch_arm(struct intel_plane *plane,
> > if (!crtc_state->enable_psr2_sel_fetch)
> > return;
> >
> > - intel_de_write_fw(i915, PLANE_SEL_FETCH_CTL(pipe, plane-
> > >id),
> > - PLANE_SEL_FETCH_CTL_ENABLE);
> > +
> > + if (drm_rect_height(&plane_state->psr2_sel_fetch_area) > 0)
> > + intel_de_write_fw(i915, PLANE_SEL_FETCH_CTL(pipe,
> > plane->id),
> > + PLANE_SEL_FETCH_CTL_ENABLE);
> > + else
> > + icl_plane_disable_sel_fetch_arm(plane, crtc_state);
> > }
> >
> > static void
> > --
> > 2.34.1
>
More information about the Intel-gfx
mailing list