* [PATCH RFC] drm/atomic: Disable planes on blanked CRTC and enable on unblank
@ 2015-11-05 15:03 Jyri Sarha
2015-11-16 16:06 ` Daniel Vetter
0 siblings, 1 reply; 4+ messages in thread
From: Jyri Sarha @ 2015-11-05 15:03 UTC (permalink / raw)
To: dri-devel; +Cc: tomi.valkeinen, laurent.pinchart, Jyri Sarha
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@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.
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@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH RFC] drm/atomic: Disable planes on blanked CRTC and enable on unblank
2015-11-05 15:03 [PATCH RFC] drm/atomic: Disable planes on blanked CRTC and enable on unblank Jyri Sarha
@ 2015-11-16 16:06 ` Daniel Vetter
2015-11-18 15:52 ` Jyri Sarha
0 siblings, 1 reply; 4+ messages in thread
From: Daniel Vetter @ 2015-11-16 16:06 UTC (permalink / raw)
To: Jyri Sarha; +Cc: tomi.valkeinen, laurent.pinchart, dri-devel
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@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@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH RFC] drm/atomic: Disable planes on blanked CRTC and enable on unblank
2015-11-16 16:06 ` Daniel Vetter
@ 2015-11-18 15:52 ` Jyri Sarha
2015-11-18 16:04 ` Daniel Vetter
0 siblings, 1 reply; 4+ messages in thread
From: Jyri Sarha @ 2015-11-18 15:52 UTC (permalink / raw)
To: Daniel Vetter; +Cc: tomi.valkeinen, laurent.pinchart, dri-devel
On 11/16/15 18:06, Daniel Vetter wrote:
> 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@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.
It appears that in the end these instructions were really all I needed.
There is only one thing that still bothers me. When implementing the
feature you described above, I had a print in the code to see if it
actually did anything. At first - because of my mistake - it did not,
but the plane context was still restored just fine on drm_next and
mainline linux. However the same omapdrm code did not restore the plane
context on our 4.1 based Linux branch.
So something similar to what I tried to accomplish has been implemented
some where between Linux 4.1 and 4.3?
Anyway, after back-porting the above fix works perfectly on our 4.1
based branch.
Thanks,
Jyri
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH RFC] drm/atomic: Disable planes on blanked CRTC and enable on unblank
2015-11-18 15:52 ` Jyri Sarha
@ 2015-11-18 16:04 ` Daniel Vetter
0 siblings, 0 replies; 4+ messages in thread
From: Daniel Vetter @ 2015-11-18 16:04 UTC (permalink / raw)
To: Jyri Sarha; +Cc: tomi.valkeinen, dri-devel, laurent.pinchart
On Wed, Nov 18, 2015 at 05:52:45PM +0200, Jyri Sarha wrote:
> On 11/16/15 18:06, Daniel Vetter wrote:
> >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@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.
>
> It appears that in the end these instructions were really all I needed.
>
> There is only one thing that still bothers me. When implementing the feature
> you described above, I had a print in the code to see if it actually did
> anything. At first - because of my mistake - it did not, but the plane
> context was still restored just fine on drm_next and mainline linux. However
> the same omapdrm code did not restore the plane context on our 4.1 based
> Linux branch.
>
> So something similar to what I tried to accomplish has been implemented some
> where between Linux 4.1 and 4.3?
>
> Anyway, after back-porting the above fix works perfectly on our 4.1 based
> branch.
commit 57744aa7cfb5969c5a0621f4cfa45bb83d391064
Author: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Date: Tue May 19 16:41:03 2015 +0200
drm/atomic: add all affected planes in drm_atomic_helper_check_modeset>
is the commit I've forgotten about too ;-)
So the only thing left (I think) is some helper to disable all the planes
currently on the crtc, which drivers can use in their crtc->disable hook.
The enabling side is indeed already taken care of.
Cheers, Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2015-11-18 16:05 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-11-05 15:03 [PATCH RFC] drm/atomic: Disable planes on blanked CRTC and enable on unblank Jyri Sarha
2015-11-16 16:06 ` Daniel Vetter
2015-11-18 15:52 ` Jyri Sarha
2015-11-18 16:04 ` Daniel Vetter
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.