Hi Archit, 2017-10-27 Archit Taneja <architt@xxxxxxxxxxxxxx>: > When a plane moves out of bounds (i.e, outside the crtc clip region), the > plane state's "visible" parameter changes to false. When this happens, we > (a) release the hwpipe resources away from it, and > (b) unstage the corresponding hwpipe(s) from the Layer Mixers in the CRTC. > > (a) requires use to acquire the global atomic state and assign a new > hwpipe. (b) requires us to re-configure the Layer Mixer, which is done in > the CRTC. We don't want to do these things in the async plane update path, > so return an error if the new state's "visible" isn't the same as the > current state's "visible". > > Cc: Gustavo Padovan <gustavo.padovan@xxxxxxxxxxxxx> > Signed-off-by: Archit Taneja <architt@xxxxxxxxxxxxxx> > --- > drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c | 25 +++++++++++++++++++++++++ > 1 file changed, 25 insertions(+) > > diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c > index f1cf367e853d..be50445f9901 100644 > --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c > +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c > @@ -470,6 +470,9 @@ static int mdp5_plane_atomic_async_check(struct drm_plane *plane, > { > struct mdp5_plane_state *mdp5_state = to_mdp5_plane_state(state); > struct drm_crtc_state *crtc_state; > + struct drm_rect clip; > + int min_scale, max_scale; > + int ret; > > crtc_state = drm_atomic_get_existing_crtc_state(state->state, > state->crtc); > @@ -495,6 +498,28 @@ static int mdp5_plane_atomic_async_check(struct drm_plane *plane, > plane->state->fb != state->fb) > return -EINVAL; > > + clip.x1 = 0; > + clip.y1 = 0; > + clip.x2 = crtc_state->adjusted_mode.hdisplay; > + clip.y2 = crtc_state->adjusted_mode.vdisplay; > + min_scale = FRAC_16_16(1, 8); > + max_scale = FRAC_16_16(8, 1); > + > + ret = drm_plane_helper_check_state(state, &clip, min_scale, > + max_scale, true, true); > + if (ret) > + return ret; > + > + /* > + * if the visibility of the plane changes (i.e, if the cursor is > + * clipped out completely, we can't take the async path because > + * we need to stage/unstage the plane from the Layer Mixer(s). We > + * also assign/unassign the hwpipe(s) tied to the plane. We avoid > + * taking the fast path for both these reasons. > + */ > + if (state->visible != plane->state->visible) > + return -EINVAL; > + > return 0; > } Reviewed-by: Gustavo Padovan <gustavo.padovan@xxxxxxxxxxxxx> Gustavo _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel