Message ID | 20171027105732.19235-7-architt@codeaurora.org (mailing list archive) |
---|---|
State | Not Applicable, archived |
Delegated to: | Andy Gross |
Headers | show |
Hi Archit, 2017-10-27 Archit Taneja <architt@codeaurora.org>: > 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@collabora.com> > Signed-off-by: Archit Taneja <architt@codeaurora.org> > --- > 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@collabora.com> Gustavo -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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; }
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@collabora.com> Signed-off-by: Archit Taneja <architt@codeaurora.org> --- drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)