[PATCH v2 2/3] drm: rcar-du: Fix planes to CRTC assignment when using the VSP

Kieran Bingham kieran.bingham+renesas at ideasonboard.com
Wed Jul 12 10:30:19 UTC 2017


Hi Laurent,

Thanks for the patch

Only a minor nit on one comment, but aside from that,

On 11/07/17 23:29, Laurent Pinchart wrote:
> The DU can compose the output of a VSP with other planes on Gen2
> hardware, and of two VSPs on Gen3 hardware. Neither of these features
> are supported by the driver, and the current implementation always
> assigns planes to CRTCs the same way.
> 
> Simplify the implementation by configuring plane assignment when setting
> up DU groups, instead of recomputing it for every atomic plane update.
> This allows skipping the wait for vertical blanking when stopping a
> CRTC, as there's no need to reconfigure plane assignment at that point.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas at ideasonboard.com>

Reviewed-by: Kieran Bingham <kieran.bingham+renesas at ideasonboard.com>

> ---
>  drivers/gpu/drm/rcar-du/rcar_du_crtc.c  | 31 ++++++++++++++++---------------
>  drivers/gpu/drm/rcar-du/rcar_du_group.c | 12 ++++++++++++
>  drivers/gpu/drm/rcar-du/rcar_du_kms.c   | 28 +++++++++++++++++-----------
>  drivers/gpu/drm/rcar-du/rcar_du_plane.c | 10 +---------
>  drivers/gpu/drm/rcar-du/rcar_du_vsp.c   |  9 ---------
>  5 files changed, 46 insertions(+), 44 deletions(-)
> 
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> index 17fd1cd5212c..413ab032afed 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> @@ -315,6 +315,10 @@ static void rcar_du_crtc_update_planes(struct rcar_du_crtc *rcrtc)
>  	unsigned int i;
>  	u32 dspr = 0;
>  
> +	/* Plane assignment is fixed when using the VSP. */
> +	if (rcar_du_has(rcdu, RCAR_DU_FEATURE_VSP1_SOURCE))
> +		return;
> +
>  	for (i = 0; i < rcrtc->group->num_planes; ++i) {
>  		struct rcar_du_plane *plane = &rcrtc->group->planes[i];
>  		unsigned int j;
> @@ -351,17 +355,6 @@ static void rcar_du_crtc_update_planes(struct rcar_du_crtc *rcrtc)
>  		}
>  	}
>  
> -	/* If VSP+DU integration is enabled the plane assignment is fixed. */
> -	if (rcar_du_has(rcdu, RCAR_DU_FEATURE_VSP1_SOURCE)) {
> -		if (rcdu->info->gen < 3) {
> -			dspr = (rcrtc->index % 2) + 1;
> -			hwplanes = 1 << (rcrtc->index % 2);
> -		} else {
> -			dspr = (rcrtc->index % 2) ? 3 : 1;
> -			hwplanes = 1 << ((rcrtc->index % 2) ? 2 : 0);
> -		}
> -	}
> -
>  	/*
>  	 * Update the planes to display timing and dot clock generator
>  	 * associations.
> @@ -462,8 +455,13 @@ static void rcar_du_crtc_setup(struct rcar_du_crtc *rcrtc)
>  	rcar_du_crtc_set_display_timing(rcrtc);
>  	rcar_du_group_set_routing(rcrtc->group);
>  
> -	/* Start with all planes disabled. */
> -	rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? DS2PR : DS1PR, 0);
> +	/*
> +	 * Start with all planes disabled, except when using the VSP in which
> +	 * case the fixed plane assignment must not be modified.
> +	 */
> +	if (!rcar_du_has(rcrtc->group->dev, RCAR_DU_FEATURE_VSP1_SOURCE))
> +		rcar_du_group_write(rcrtc->group,
> +				    rcrtc->index % 2 ? DS2PR : DS1PR, 0);
>  
>  	/* Enable the VSP compositor. */
>  	if (rcar_du_has(rcrtc->group->dev, RCAR_DU_FEATURE_VSP1_SOURCE))
> @@ -505,8 +503,11 @@ static void rcar_du_crtc_stop(struct rcar_du_crtc *rcrtc)
>  	 * are stopped in one operation as we now wait for one vblank per CRTC.
>  	 * Whether this can be improved needs to be researched.
>  	 */
> -	rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? DS2PR : DS1PR, 0);
> -	drm_crtc_wait_one_vblank(crtc);
> +	if (!rcar_du_has(rcrtc->group->dev, RCAR_DU_FEATURE_VSP1_SOURCE)) {
> +		rcar_du_group_write(rcrtc->group,
> +				    rcrtc->index % 2 ? DS2PR : DS1PR, 0);
> +		drm_crtc_wait_one_vblank(crtc);
> +	}
>  
>  	/*
>  	 * Disable vertical blanking interrupt reporting. We first need to wait
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_group.c b/drivers/gpu/drm/rcar-du/rcar_du_group.c
> index 00d5f470d377..d26b647207b8 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_group.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_group.c
> @@ -126,6 +126,18 @@ static void rcar_du_group_setup(struct rcar_du_group *rgrp)
>  	if (rcdu->info->gen >= 3)
>  		rcar_du_group_write(rgrp, DEFR10, DEFR10_CODE | DEFR10_DEFE10);
>  
> +	if (rcar_du_has(rcdu, RCAR_DU_FEATURE_VSP1_SOURCE)) {
> +		/*
> +		 * The CRTCs can compose the output of a VSP with other planes
> +		 * on Gen2 hardware, and of two VSPs on Gen3 hardware. Neither
> +		 * of these features are supported by the driver, so we hardcode
> +		 * plane assignment to CRTCs when setting the group up to avoid
> +		 * the need to restart then group when setting planes up.

Minor nits in comment:

  /restart then group/restart the group/

I would also possibly swap the final 'planes up' as 'up planes' if you update
here anyway:

* so we hardcode plane assignment to CRTCs when setting the group up to avoid
* the need to restart the group when setting up planes.

Up to you of course :)


> +		 */
> +		rcar_du_group_write(rgrp, DS1PR, 1);
> +		rcar_du_group_write(rgrp, DS2PR, rcdu->info->gen >= 3 ? 3 : 2);

whew ... that DS2PR indexing change from g2 to g3 looks annoying ... I had to
write out the logic tables on paper to verify the change here from the previous
code.

> +	}
> +
>  	/*
>  	 * Use DS1PR and DS2PR to configure planes priorities and connects the
>  	 * superposition 0 to DU0 pins. DU1 pins will be configured dynamically.
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> index 0e4e839afc97..13186a5684f1 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> @@ -562,17 +562,23 @@ int rcar_du_modeset_init(struct rcar_du_device *rcdu)
>  		rgrp->index = i;
>  		rgrp->num_crtcs = min(rcdu->num_crtcs - 2 * i, 2U);
>  
> -		/*
> -		 * If we have more than one CRTCs in this group pre-associate
> -		 * the low-order planes with CRTC 0 and the high-order planes
> -		 * with CRTC 1 to minimize flicker occurring when the
> -		 * association is changed.
> -		 */
> -		rgrp->dptsr_planes = rgrp->num_crtcs > 1
> -				   ? (rcdu->info->gen >= 3 ? 0x04 : 0xf0)
> -				   : 0;
> -
> -		if (!rcar_du_has(rcdu, RCAR_DU_FEATURE_VSP1_SOURCE)) {
> +		if (rcar_du_has(rcdu, RCAR_DU_FEATURE_VSP1_SOURCE)) {
> +			/*
> +			 * When using the VSP plane assignment to CRTCs is
> +			 * fixed. The first VSP is connected to plane 1, and the
> +			 * second VSP to plane 2 on Gen2 hardware and to plane 3
> +			 * on Gen3 hardware.
> +			 */
> +			rgrp->dptsr_planes = rgrp->num_crtcs > 1
> +					   ? (rcdu->info->gen >= 3 ? 4 : 2)
> +					   : 0;
> +		} else {
> +			/*
> +			 * Pre-associate the planes with the CRTCs if we have
> +			 * more than one CRTC in this group to minimize flicker
> +			 * when plane association is changed.
> +			 */
> +			rgrp->dptsr_planes = rgrp->num_crtcs > 1 ? 0xf0 : 0x00;
>  			ret = rcar_du_planes_init(rgrp);
>  			if (ret < 0)
>  				return ret;
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> index b0040478a3db..787f036b18fb 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> @@ -548,17 +548,9 @@ void __rcar_du_plane_setup(struct rcar_du_group *rgrp,
>  		rcar_du_plane_setup_format(rgrp, (state->hwindex + 1) % 8,
>  					   state);
>  
> +	/* On Gen3 planes have no scanout data. */
>  	if (rcdu->info->gen < 3)
>  		rcar_du_plane_setup_scanout(rgrp, state);
> -
> -	if (state->source == RCAR_DU_PLANE_VSPD1) {
> -		unsigned int vspd1_sink = rgrp->index ? 2 : 0;
> -
> -		if (rcdu->vspd1_sink != vspd1_sink) {
> -			rcdu->vspd1_sink = vspd1_sink;
> -			rcar_du_set_dpad0_vsp1_routing(rcdu);
> -		}
> -	}
>  }
>  
>  static int rcar_du_plane_atomic_check(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
> index e43b065e141a..dba150a20f3d 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
> @@ -74,15 +74,6 @@ void rcar_du_vsp_enable(struct rcar_du_crtc *crtc)
>  
>  	__rcar_du_plane_setup(crtc->group, &state);
>  
> -	/*
> -	 * Ensure that the plane source configuration takes effect by requesting
> -	 * a restart of the group. See rcar_du_plane_atomic_update() for a more
> -	 * detailed explanation.
> -	 *
> -	 * TODO: Check whether this is still needed on Gen3.
> -	 */
> -	crtc->group->need_restart = true;
> -
>  	vsp1_du_setup_lif(crtc->vsp->vsp, crtc->vsp_pipe, &cfg);
>  }
>  
> 


More information about the dri-devel mailing list