[PATCH RFC] drm/atomic: Disable planes on blanked CRTC and enable on unblank
Daniel Vetter
daniel at ffwll.ch
Mon Nov 16 08:06:04 PST 2015
On Thu, Nov 05, 2015 at 05:03:09PM +0200, Jyri Sarha wrote:
> Disable planes if they are on to be blanked CRTC and enable them when
> the CRTC is turned back on by DMPS.
>
> This is desirable on HW that loses its context on blanking. When
> planes are enabled and disabled with the associated CRTCs, there is no
> need to restore the plane context in runtime_resume callback.
>
> Signed-off-by: Jyri Sarha <jsarha at ti.com>
> ---
> We would need something like this to get rid off OMAPDSS somewhat
> messy runtime_resume code. How does this look, could this generic
> solution be refined to be acceptable to mainline, or should we start
> looking a local solution to omapdrm?
>
> BTW, with this patch the planes are sometimes disabled multiple
> times. So probably a boolean (or maybe two like on crtc) should be
> added to drm_plane_state to track and avoid multiple shutdowns.
The recommended way to do this is to call drm_atomic_add_affected_planes
from your crtc's atomic_check callback when active_changed is set. This
will also take care of enabling all planes again. For disabling we don't
yet have a helper yet, but it would be easy to create a
drm_atomic_helper_disable_planes(crtc) which just walks over all planes in
an atomic update that are currently using the given crtc and disables it
using plane_helper_funcs->atomic_disable. That would again require
drm_atomic_add_affected_planes to be called first.
This way current helper behaviour is unchanged, but it'd be easy to
construct the behaviour you want using helpers with
drm_atomic_add_affected_planes called from the crtc->disable hook.
I thought there was an rfc patch somewhere for this, but I can't find it
any more.
Cheers, Daniel
>
> drivers/gpu/drm/drm_atomic_helper.c | 19 +++++++++++++++++--
> include/drm/drm_atomic_helper.h | 7 +++++++
> 2 files changed, 24 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
> index aecb5d6..92fcaef 100644
> --- a/drivers/gpu/drm/drm_atomic_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_helper.c
> @@ -1994,8 +1994,8 @@ EXPORT_SYMBOL(drm_atomic_helper_page_flip);
> *
> * This is the main helper function provided by the atomic helper framework for
> * implementing the legacy DPMS connector interface. It computes the new desired
> - * ->active state for the corresponding CRTC (if the connector is enabled) and
> - * updates it.
> + * ->active state for the corresponding CRTC and planes on it (if the connector
> + * is enabled) and updates it.
> *
> * Returns:
> * Returns 0 on success, negative errno numbers on failure.
> @@ -2008,6 +2008,7 @@ int drm_atomic_helper_connector_dpms(struct drm_connector *connector,
> struct drm_crtc_state *crtc_state;
> struct drm_crtc *crtc;
> struct drm_connector *tmp_connector;
> + struct drm_plane *tmp_plane;
> int ret;
> bool active = false;
> int old_mode = connector->dpms;
> @@ -2046,6 +2047,20 @@ retry:
> }
> crtc_state->active = active;
>
> + /* Collect associated plane states to global state object. */
> + list_for_each_entry(tmp_plane, &config->plane_list, head) {
> + struct drm_plane_state *plane_state;
> +
> + if (tmp_plane->state->crtc != crtc)
> + continue;
> +
> + plane_state = drm_atomic_get_plane_state(state, tmp_plane);
> + if (IS_ERR(plane_state)) {
> + ret = PTR_ERR(plane_state);
> + goto fail;
> + }
> + }
> +
> ret = drm_atomic_commit(state);
> if (ret != 0)
> goto fail;
> diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
> index 11266d14..89c327f 100644
> --- a/include/drm/drm_atomic_helper.h
> +++ b/include/drm/drm_atomic_helper.h
> @@ -173,6 +173,13 @@ drm_atomic_plane_disabling(struct drm_plane *plane,
> (plane->state->crtc != NULL && plane->state->fb == NULL));
>
> /*
> + * If the plane is on a crtc that is not going to be active the plane
> + * it self can be disabled too.
> + */
> + if (plane->state->crtc && !plane->state->crtc->state->active)
> + return true;
> +
> + /*
> * When using the transitional helpers, old_state may be NULL. If so,
> * we know nothing about the current state and have to assume that it
> * might be enabled.
> --
> 1.9.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
More information about the dri-devel
mailing list