Re: [RFC PATCH v1 10/19] media: renesas: vsp1: Replace vsp1_partition_window with v4l2_rect

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jun 18, 2024 at 07:24:12PM GMT, Laurent Pinchart wrote:
> Hi Jacopo,
>
> On Tue, Jun 18, 2024 at 01:07:40PM +0200, Jacopo Mondi wrote:
> > On Wed, Nov 22, 2023 at 06:30:00AM GMT, Laurent Pinchart wrote:
> > > The vsp1_partition_window structure is used to store the horizontal size
> > > of a partition window. This is all that is currently needed, as all
> > > partitions span the whole image vertically. The horizontal window size
> > > is retrieved in the .configure_partition() handler from the
> > > vsp1_partition_window structure, and the vertical window size from the
> > > subdev state.
> > >
> > > Accessing the subdev state in the .configure_partition() handler is
> > > problematic in the context of moving to the V4L2 subdev active state
> > > API, as .configure_partition() is called in non-interruptable context,
> > > and the state lock can't be taken. To avoid this, start by storing the
> > > vertical size in the window, replacing the custom vsp1_partition_window
> > > structure with a v4l2_rect. Retrieving the vertical size from the window
> > > in .configure_partition() will be done in a subsequent change.
> > >
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@xxxxxxxxxxxxxxxx>
> > > ---
> > >  .../media/platform/renesas/vsp1/vsp1_entity.h |  3 +--
> > >  .../media/platform/renesas/vsp1/vsp1_pipe.c   |  6 ++++--
> > >  .../media/platform/renesas/vsp1/vsp1_pipe.h   | 21 +++++--------------
> > >  .../media/platform/renesas/vsp1/vsp1_rpf.c    |  2 +-
> > >  .../media/platform/renesas/vsp1/vsp1_sru.c    |  4 +++-
> > >  .../media/platform/renesas/vsp1/vsp1_uds.c    | 10 ++++-----
> > >  .../media/platform/renesas/vsp1/vsp1_wpf.c    |  2 +-
> > >  7 files changed, 20 insertions(+), 28 deletions(-)
> > >
> > > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.h b/drivers/media/platform/renesas/vsp1/vsp1_entity.h
> > > index 7b86b2fef3e5..f67f60677644 100644
> > > --- a/drivers/media/platform/renesas/vsp1/vsp1_entity.h
> > > +++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.h
> > > @@ -19,7 +19,6 @@ struct vsp1_dl_body;
> > >  struct vsp1_dl_list;
> > >  struct vsp1_pipeline;
> > >  struct vsp1_partition;
> > > -struct vsp1_partition_window;
> > >
> > >  enum vsp1_entity_type {
> > >  	VSP1_ENTITY_BRS,
> > > @@ -91,7 +90,7 @@ struct vsp1_entity_operations {
> > >  	unsigned int (*max_width)(struct vsp1_entity *, struct vsp1_pipeline *);
> > >  	void (*partition)(struct vsp1_entity *, struct vsp1_pipeline *,
> > >  			  struct vsp1_partition *, unsigned int,
> > > -			  struct vsp1_partition_window *);
> > > +			  struct v4l2_rect *);
> > >  };
> > >
> > >  struct vsp1_entity {
> > > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> > > index ca6817f45dd2..8eba3cda1e3d 100644
> > > --- a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> > > +++ b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
> > > @@ -459,7 +459,7 @@ void vsp1_pipeline_propagate_alpha(struct vsp1_pipeline *pipe,
> > >  static void vsp1_pipeline_propagate_partition(struct vsp1_pipeline *pipe,
> > >  					      struct vsp1_partition *partition,
> > >  					      unsigned int index,
> > > -					      struct vsp1_partition_window *window)
> > > +					      struct v4l2_rect *window)
> > >  {
> > >  	struct vsp1_entity *entity;
> > >
> > > @@ -485,7 +485,7 @@ void vsp1_pipeline_calculate_partition(struct vsp1_pipeline *pipe,
> > >  				       unsigned int index)
> > >  {
> > >  	const struct v4l2_mbus_framefmt *format;
> > > -	struct vsp1_partition_window window;
> > > +	struct v4l2_rect window;
> > >  	unsigned int modulus;
> > >
> > >  	/*
> > > @@ -498,6 +498,8 @@ void vsp1_pipeline_calculate_partition(struct vsp1_pipeline *pipe,
> > >  	/* Initialise the partition with sane starting conditions. */
> > >  	window.left = index * div_size;
> > >  	window.width = div_size;
> > > +	window.top = 0;
> > > +	window.height = format->height;
> > >
> > >  	modulus = format->width % div_size;
> > >
> > > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_pipe.h b/drivers/media/platform/renesas/vsp1/vsp1_pipe.h
> > > index 3d2e35ac8fa0..c1f411227de7 100644
> > > --- a/drivers/media/platform/renesas/vsp1/vsp1_pipe.h
> > > +++ b/drivers/media/platform/renesas/vsp1/vsp1_pipe.h
> > > @@ -53,17 +53,6 @@ enum vsp1_pipeline_state {
> > >  	VSP1_PIPELINE_STOPPING,
> > >  };
> > >
> > > -/*
> > > - * struct vsp1_partition_window - Partition window coordinates
> > > - * @left: horizontal coordinate of the partition start in pixels relative to the
> > > - *	  left edge of the image
> > > - * @width: partition width in pixels
> > > - */
> > > -struct vsp1_partition_window {
> > > -	unsigned int left;
> > > -	unsigned int width;
> > > -};
> > > -
> > >  /*
> > >   * struct vsp1_partition - A description of a slice for the partition algorithm
> > >   * @rpf: The RPF partition window configuration
> > > @@ -73,11 +62,11 @@ struct vsp1_partition_window {
> > >   * @wpf: The WPF partition window configuration
> > >   */
> > >  struct vsp1_partition {
> > > -	struct vsp1_partition_window rpf[VSP1_MAX_RPF];
> > > -	struct vsp1_partition_window uds_sink;
> > > -	struct vsp1_partition_window uds_source;
> > > -	struct vsp1_partition_window sru;
> > > -	struct vsp1_partition_window wpf;
> > > +	struct v4l2_rect rpf[VSP1_MAX_RPF];
> > > +	struct v4l2_rect uds_sink;
> > > +	struct v4l2_rect uds_source;
> > > +	struct v4l2_rect sru;
> > > +	struct v4l2_rect wpf;
> > >  };
> > >
> > >  /*
> > > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
> > > index 3b8a62299226..862751616646 100644
> > > --- a/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
> > > +++ b/drivers/media/platform/renesas/vsp1/vsp1_rpf.c
> > > @@ -366,7 +366,7 @@ static void rpf_partition(struct vsp1_entity *entity,
> > >  			  struct vsp1_pipeline *pipe,
> > >  			  struct vsp1_partition *partition,
> > >  			  unsigned int partition_idx,
> > > -			  struct vsp1_partition_window *window)
> > > +			  struct v4l2_rect *window)
> > >  {
> > >  	struct vsp1_rwpf *rpf = to_rwpf(&entity->subdev);
> > >
> > > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_sru.c b/drivers/media/platform/renesas/vsp1/vsp1_sru.c
> > > index 2c67aae0d5fd..f35187daa643 100644
> > > --- a/drivers/media/platform/renesas/vsp1/vsp1_sru.c
> > > +++ b/drivers/media/platform/renesas/vsp1/vsp1_sru.c
> > > @@ -324,7 +324,7 @@ static void sru_partition(struct vsp1_entity *entity,
> > >  			  struct vsp1_pipeline *pipe,
> > >  			  struct vsp1_partition *partition,
> > >  			  unsigned int partition_idx,
> > > -			  struct vsp1_partition_window *window)
> > > +			  struct v4l2_rect *window)
> > >  {
> > >  	struct vsp1_sru *sru = to_sru(&entity->subdev);
> > >  	struct v4l2_mbus_framefmt *input;
> > > @@ -339,6 +339,8 @@ static void sru_partition(struct vsp1_entity *entity,
> > >  	if (input->width != output->width) {
> > >  		window->width /= 2;
> > >  		window->left /= 2;
> > > +		window->height /= 2;
> > > +		window->top /= 2;
> >
> > If partitions vertically span the whole image, is this required ?
>
> I believe so. The .partition() operation is called iteratively on all
> entities in the pipeline, and each entity is expected to update the
> window. When the SRU upscales by two, the input size is half of the
> output size. At the moment the entities upstream of the SRU don't use
> the window's vertical size, but that will change (if I recall correctly)
> in further patches. In any case it's best to keep the information
> correct even when it's not used (except if we decide the information
> will never be used, in which case we should drop it, but that's not the
> case here).
>

makes sense!

Reviewed-by: Jacopo Mondi <jacopo.mondi@xxxxxxxxxxxxxxxx>

> > >  	}
> > >
> > >  	partition->sru = *window;
> > > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_uds.c b/drivers/media/platform/renesas/vsp1/vsp1_uds.c
> > > index 737362ca2315..4a14fd3baac1 100644
> > > --- a/drivers/media/platform/renesas/vsp1/vsp1_uds.c
> > > +++ b/drivers/media/platform/renesas/vsp1/vsp1_uds.c
> > > @@ -363,16 +363,12 @@ static void uds_partition(struct vsp1_entity *entity,
> > >  			  struct vsp1_pipeline *pipe,
> > >  			  struct vsp1_partition *partition,
> > >  			  unsigned int partition_idx,
> > > -			  struct vsp1_partition_window *window)
> > > +			  struct v4l2_rect *window)
> > >  {
> > >  	struct vsp1_uds *uds = to_uds(&entity->subdev);
> > >  	const struct v4l2_mbus_framefmt *output;
> > >  	const struct v4l2_mbus_framefmt *input;
> > >
> > > -	/* Initialise the partition state. */
> > > -	partition->uds_sink = *window;
> > > -	partition->uds_source = *window;
> > > -
> > >  	input = v4l2_subdev_state_get_format(uds->entity.state, UDS_PAD_SINK);
> > >  	output = v4l2_subdev_state_get_format(uds->entity.state,
> > >  					      UDS_PAD_SOURCE);
> > > @@ -381,6 +377,10 @@ static void uds_partition(struct vsp1_entity *entity,
> > >  				  / output->width;
> > >  	partition->uds_sink.left = window->left * input->width
> > >  				 / output->width;
> > > +	partition->uds_sink.height = input->height;
> > > +	partition->uds_sink.top = 0;
> > > +
> > > +	partition->uds_source = *window;
> > >
> > >  	*window = partition->uds_sink;
> > >  }
> > > diff --git a/drivers/media/platform/renesas/vsp1/vsp1_wpf.c b/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
> > > index 80fe7571f4ff..f8d1e2f47691 100644
> > > --- a/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
> > > +++ b/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
> > > @@ -515,7 +515,7 @@ static void wpf_partition(struct vsp1_entity *entity,
> > >  			  struct vsp1_pipeline *pipe,
> > >  			  struct vsp1_partition *partition,
> > >  			  unsigned int partition_idx,
> > > -			  struct vsp1_partition_window *window)
> > > +			  struct v4l2_rect *window)
> > >  {
> > >  	partition->wpf = *window;
> > >  }
>
> --
> Regards,
>
> Laurent Pinchart
>




[Index of Archives]     [Linux Samsung SOC]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux