[PATCH] drm/atomic-helper: Don't skip plane disabling on active CRTC

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Sep 13 13:33:26 PDT 2015


Hi Daniel,

I've successfully tested the following patch with the rcar-du-drm driver. I'm 
not sure who else passes a true active_only argument to 
drm_atomic_helper_commit_planes() out-of-tree so I don't know who you would 
like to received a Tested-by tag from, but I'll need both your base patch and 
this fix for my next rcar-du-drm pull request.

On Friday 11 September 2015 00:07:19 Laurent Pinchart wrote:
> Since commit "drm/atomic-helper: Add option to update planes only on
> active crtc" the drm_atomic_helper_commit_planes() function accepts an
> active_only argument to skip updating planes when the associated CRTC is
> inactive. Planes being disabled on an active CRTC are incorrectly
> considered as associated with an inactive CRTC and are thus skipped,
> preventing any plane disabling update from reaching drivers.
> 
> Fix it by checking the state of the CRTC stored in the old plane state
> for planes being disabled.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas at ideasonboard.com>
> ---
>  drivers/gpu/drm/drm_atomic_helper.c | 24 ++++++++++++++++++------
>  1 file changed, 18 insertions(+), 6 deletions(-)
> 
> Hi Daniel,
> 
> This fixes the patch mentioned in the commit message. Please feel free to
> squash the fix into the original patch if it's not too late, or take it in
> your branch otherwise (in which case a Fixes: line might be appropriate).
> 
> diff --git a/drivers/gpu/drm/drm_atomic_helper.c
> b/drivers/gpu/drm/drm_atomic_helper.c index a067ddb1b443..0aa19fa0a5d5
> 100644
> --- a/drivers/gpu/drm/drm_atomic_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_helper.c
> @@ -1201,23 +1201,35 @@ void drm_atomic_helper_commit_planes(struct
> drm_device *dev,
> 
>  	for_each_plane_in_state(old_state, plane, old_plane_state, i) {
>  		const struct drm_plane_helper_funcs *funcs;
> +		bool disabling;
> 
>  		funcs = plane->helper_private;
> 
>  		if (!funcs)
>  			continue;
> 
> -		if (active_only && !plane_crtc_active(plane->state))
> -			continue;
> +		disabling = drm_atomic_plane_disabling(plane, old_plane_state);
> +
> +		if (active_only) {
> +			/*
> +			 * Skip planes related to inactive CRTCs. If the plane
> +			 * is enabled use the state of the current CRTC. If the
> +			 * plane is being disabled use the state of the old
> +			 * CRTC to avoid skipping planes being disabled on an
> +			 * active CRTC.
> +			 */
> +			if (!disabling && !plane_crtc_active(plane->state))
> +				continue;
> +			if (disabling && !plane_crtc_active(old_plane_state))
> +				continue;
> +		}
> 
>  		/*
>  		 * Special-case disabling the plane if drivers support it.
>  		 */
> -		if (drm_atomic_plane_disabling(plane, old_plane_state) &&
> -		    funcs->atomic_disable)
> +		if (disabling && funcs->atomic_disable)
>  			funcs->atomic_disable(plane, old_plane_state);
> -		else if (plane->state->crtc ||
> -			 drm_atomic_plane_disabling(plane, old_plane_state))
> +		else if (plane->state->crtc || disabling)
>  			funcs->atomic_update(plane, old_plane_state);
>  	}

-- 
Regards,

Laurent Pinchart



More information about the dri-devel mailing list