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

Laurent Pinchart
2016-05-30T09:18:02Z

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@ideasonboard.com>
> Signed-off-by: Daniel Vetter <daniel.vetter@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

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org