[PATCH 08/15] v4l: vsp1: Setup BRU at atomic commit time

Kieran Bingham kieran.bingham at ideasonboard.com
Wed Mar 28 19:01:30 UTC 2018


Hi Laurent,

On 26/02/18 21:45, Laurent Pinchart wrote:
> To implement fully dynamic plane assignment to pipelines, we need to
> reassign the BRU and BRS to the DRM pipelines in the atomic commit
> handler. In preparation for this setup factor out the BRU source pad
> code and call it both at LIF setup and atomic commit time.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas at ideasonboard.com>

Oops .. skipped one.

But this looks ok to me.

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

> ---
>  drivers/media/platform/vsp1/vsp1_drm.c | 56 +++++++++++++++++++++++++++++++++-
>  drivers/media/platform/vsp1/vsp1_drm.h |  5 +++
>  2 files changed, 60 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/media/platform/vsp1/vsp1_drm.c b/drivers/media/platform/vsp1/vsp1_drm.c
> index 7bf697ba7969..6ad8aa6c8138 100644
> --- a/drivers/media/platform/vsp1/vsp1_drm.c
> +++ b/drivers/media/platform/vsp1/vsp1_drm.c
> @@ -148,12 +148,51 @@ static int vsp1_du_pipeline_setup_rpf(struct vsp1_device *vsp1,
>  	return 0;
>  }
>  
> +/* Setup the BRU source pad. */
> +static int vsp1_du_pipeline_setup_bru(struct vsp1_device *vsp1,
> +				      struct vsp1_pipeline *pipe)
> +{
> +	struct vsp1_drm_pipeline *drm_pipe = to_vsp1_drm_pipeline(pipe);
> +	struct v4l2_subdev_format format = {
> +		.which = V4L2_SUBDEV_FORMAT_ACTIVE,
> +	};
> +	int ret;
> +
> +	/*
> +	 * Configure the format on the BRU source and verify that it matches the
> +	 * requested format. We don't set the media bus code as it is configured
> +	 * on the BRU sink pad 0 and propagated inside the entity, not on the
> +	 * source pad.
> +	 */
> +	format.pad = pipe->bru->source_pad;
> +	format.format.width = drm_pipe->width;
> +	format.format.height = drm_pipe->height;
> +	format.format.field = V4L2_FIELD_NONE;
> +
> +	ret = v4l2_subdev_call(&pipe->bru->subdev, pad, set_fmt, NULL,
> +			       &format);
> +	if (ret < 0)
> +		return ret;
> +
> +	dev_dbg(vsp1->dev, "%s: set format %ux%u (%x) on %s pad %u\n",
> +		__func__, format.format.width, format.format.height,
> +		format.format.code, BRU_NAME(pipe->bru), pipe->bru->source_pad);
> +
> +	if (format.format.width != drm_pipe->width ||
> +	    format.format.height != drm_pipe->height) {
> +		dev_dbg(vsp1->dev, "%s: format mismatch\n", __func__);
> +		return -EPIPE;
> +	}
> +
> +	return 0;
> +}
> +
>  static unsigned int rpf_zpos(struct vsp1_device *vsp1, struct vsp1_rwpf *rpf)
>  {
>  	return vsp1->drm->inputs[rpf->entity.index].zpos;
>  }
>  
> -/* Setup the input side of the pipeline (RPFs and BRU sink pads). */
> +/* Setup the input side of the pipeline (RPFs and BRU). */
>  static int vsp1_du_pipeline_setup_input(struct vsp1_device *vsp1,
>  					struct vsp1_pipeline *pipe)
>  {
> @@ -191,6 +230,18 @@ static int vsp1_du_pipeline_setup_input(struct vsp1_device *vsp1,
>  		inputs[j] = rpf;
>  	}
>  
> +	/*
> +	 * Setup the BRU. This must be done before setting up the RPF input
> +	 * pipelines as the BRU sink compose rectangles depend on the BRU source
> +	 * format.
> +	 */
> +	ret = vsp1_du_pipeline_setup_bru(vsp1, pipe);
> +	if (ret < 0) {
> +		dev_err(vsp1->dev, "%s: failed to setup %s source\n", __func__,
> +			BRU_NAME(pipe->bru));
> +		return ret;
> +	}
> +
>  	/* Setup the RPF input pipeline for every enabled input. */
>  	for (i = 0; i < pipe->bru->source_pad; ++i) {
>  		struct vsp1_rwpf *rpf = inputs[i];
> @@ -355,6 +406,9 @@ int vsp1_du_setup_lif(struct device *dev, unsigned int pipe_index,
>  		return 0;
>  	}
>  
> +	drm_pipe->width = cfg->width;
> +	drm_pipe->height = cfg->height;
> +
>  	dev_dbg(vsp1->dev, "%s: configuring LIF%u with format %ux%u\n",
>  		__func__, pipe_index, cfg->width, cfg->height);
>  
> diff --git a/drivers/media/platform/vsp1/vsp1_drm.h b/drivers/media/platform/vsp1/vsp1_drm.h
> index 9aa19325cbe9..c8dd75ba01f6 100644
> --- a/drivers/media/platform/vsp1/vsp1_drm.h
> +++ b/drivers/media/platform/vsp1/vsp1_drm.h
> @@ -20,12 +20,17 @@
>  /**
>   * vsp1_drm_pipeline - State for the API exposed to the DRM driver
>   * @pipe: the VSP1 pipeline used for display
> + * @width: output display width
> + * @height: output display height
>   * @du_complete: frame completion callback for the DU driver (optional)
>   * @du_private: data to be passed to the du_complete callback
>   */
>  struct vsp1_drm_pipeline {
>  	struct vsp1_pipeline pipe;
>  
> +	unsigned int width;
> +	unsigned int height;
> +
>  	/* Frame synchronisation */
>  	void (*du_complete)(void *, bool);
>  	void *du_private;
> 


More information about the dri-devel mailing list