[PATCH 04/26] drm/rcar-du: Use for_each_*_in_state

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon May 30 09:18:02 UTC 2016


Hi Daniel,

Thank you for the patch.

This looks good to me as the resulting code is mostly similar. However, the 
for_each_*_in_state macros end with an for_each_if() that tests if the 
object's state is NULL, which isn't present in this code. I'm wondering 
whether that was an oversight on my side possibly leading to a crash when 
dereferencing a NULL state, or an unneeded check in the macros. Can 
atomic_state->*_states[i] be NULL if atomic_state->*[i] is not NULL ?

On Sunday 29 May 2016 20:35:01 Daniel Vetter wrote:
> We want to hide drm_atomic_state internals better.
> 
> Cc: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
> ---
>  drivers/gpu/drm/rcar-du/rcar_du_kms.c   |  8 ++++----
>  drivers/gpu/drm/rcar-du/rcar_du_plane.c | 20 ++++++++------------
>  2 files changed, 12 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> b/drivers/gpu/drm/rcar-du/rcar_du_kms.c index e70a4f33d970..f315c55c1f65
> 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> @@ -288,6 +288,8 @@ static int rcar_du_atomic_commit(struct drm_device *dev,
> {
>  	struct rcar_du_device *rcdu = dev->dev_private;
>  	struct rcar_du_commit *commit;
> +	struct drm_crtc *crtc;
> +	struct drm_crtc_state *crtc_state;
>  	unsigned int i;
>  	int ret;
> 
> @@ -309,10 +311,8 @@ static int rcar_du_atomic_commit(struct drm_device
> *dev, /* Wait until all affected CRTCs have completed previous commits and
> * mark them as pending.
>  	 */
> -	for (i = 0; i < dev->mode_config.num_crtc; ++i) {
> -		if (state->crtcs[i])
> -			commit->crtcs |= 1 << drm_crtc_index(state->crtcs[i]);
> -	}
> +	for_each_crtc_in_state(state, crtc, crtc_state, i)
> +		commit->crtcs |= 1 << drm_crtc_index(crtc);
> 
>  	spin_lock(&rcdu->commit.wait.lock);
>  	ret = wait_event_interruptible_locked(rcdu->commit.wait,
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> b/drivers/gpu/drm/rcar-du/rcar_du_plane.c index d445e67f78e1..bfe31ca870cc
> 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> @@ -140,18 +140,17 @@ int rcar_du_atomic_check_planes(struct drm_device
> *dev, bool needs_realloc = false;
>  	unsigned int groups = 0;
>  	unsigned int i;
> +	struct drm_plane *drm_plane;
> +	struct drm_plane_state *drm_plane_state;
> 
>  	/* Check if hardware planes need to be reallocated. */
> -	for (i = 0; i < dev->mode_config.num_total_plane; ++i) {
> +	for_each_plane_in_state(state, drm_plane, drm_plane_state, i) {
>  		struct rcar_du_plane_state *plane_state;
>  		struct rcar_du_plane *plane;
>  		unsigned int index;
> 
> -		if (!state->planes[i])
> -			continue;
> -
> -		plane = to_rcar_plane(state->planes[i]);
> -		plane_state = to_rcar_plane_state(state->plane_states[i]);
> +		plane = to_rcar_plane(drm_plane);
> +		plane_state = to_rcar_plane_state(drm_plane_state);
> 
>  		dev_dbg(rcdu->dev, "%s: checking plane (%u,%tu)\n", __func__,
>  			plane->group->index, plane - plane->group->planes);
> @@ -247,18 +246,15 @@ int rcar_du_atomic_check_planes(struct drm_device
> *dev, }
> 
>  	/* Reallocate hardware planes for each plane that needs it. */
> -	for (i = 0; i < dev->mode_config.num_total_plane; ++i) {
> +	for_each_plane_in_state(state, drm_plane, drm_plane_state, i) {
>  		struct rcar_du_plane_state *plane_state;
>  		struct rcar_du_plane *plane;
>  		unsigned int crtc_planes;
>  		unsigned int free;
>  		int idx;
> 
> -		if (!state->planes[i])
> -			continue;
> -
> -		plane = to_rcar_plane(state->planes[i]);
> -		plane_state = to_rcar_plane_state(state->plane_states[i]);
> +		plane = to_rcar_plane(drm_plane);
> +		plane_state = to_rcar_plane_state(drm_plane_state);
> 
>  		dev_dbg(rcdu->dev, "%s: allocating plane (%u,%tu)\n", __func__,
>  			plane->group->index, plane - plane->group->planes);

-- 
Regards,

Laurent Pinchart



More information about the dri-devel mailing list