Re: [PATCH v11 15/32] rcar-vin: break out format alignment and checking

2018-03-03 Thread Niklas Söderlund
Hi Laurent,

Thanks for your feedback.

On 2018-03-02 11:53:54 +0200, Laurent Pinchart wrote:
> Hi Niklas,
> 
> Thank you for the patch.
> 
> On Friday, 2 March 2018 03:57:34 EET Niklas Söderlund wrote:
> > Part of the format alignment and checking can be shared with the Gen3
> > format handling. Break that part out to a separate function.
> > 
> > Signed-off-by: Niklas Söderlund 
> > ---
> >  drivers/media/platform/rcar-vin/rcar-v4l2.c | 96 +++---
> >  1 file changed, 54 insertions(+), 42 deletions(-)
> > 
> > diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c
> > b/drivers/media/platform/rcar-vin/rcar-v4l2.c index
> > b94ca9ffb1d3b323..3290e603b44cdf3a 100644
> > --- a/drivers/media/platform/rcar-vin/rcar-v4l2.c
> > +++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c
> > @@ -87,6 +87,59 @@ static u32 rvin_format_sizeimage(struct v4l2_pix_format
> > *pix) return pix->bytesperline * pix->height;
> >  }
> > 
> > +static int rvin_format_align(struct rvin_dev *vin, struct v4l2_pix_format
> > *pix)
> > +{
> > +   u32 walign;
> > +
> > +   if (!rvin_format_from_pixel(pix->pixelformat) ||
> > +   (vin->info->model == RCAR_M1 &&
> > +pix->pixelformat == V4L2_PIX_FMT_XBGR32))
> > +   pix->pixelformat = RVIN_DEFAULT_FORMAT;
> > +
> > +   switch (pix->field) {
> > +   case V4L2_FIELD_TOP:
> > +   case V4L2_FIELD_BOTTOM:
> > +   case V4L2_FIELD_NONE:
> > +   case V4L2_FIELD_INTERLACED_TB:
> > +   case V4L2_FIELD_INTERLACED_BT:
> > +   case V4L2_FIELD_INTERLACED:
> > +   break;
> > +   case V4L2_FIELD_ALTERNATE:
> > +   /*
> > +* Driver do not (yet) support outputting ALTERNATE to a
> > +* userspace. It does support outputting INTERLACED so use
> > +* the VIN hardware to combine the two fields.
> > +*/
> > +   pix->field = V4L2_FIELD_INTERLACED;
> > +   pix->height *= 2;
> > +   break;
> > +   default:
> > +   pix->field = RVIN_DEFAULT_FIELD;
> > +   break;
> > +   }
> > +
> > +   /* HW limit width to a multiple of 32 (2^5) for NV16 else 2 (2^1) */
> > +   walign = vin->format.pixelformat == V4L2_PIX_FMT_NV16 ? 5 : 1;
> > +
> > +   /* Limit to VIN capabilities */
> > +   v4l_bound_align_image(>width, 2, vin->info->max_width, walign,
> > + >height, 4, vin->info->max_height, 2, 0);
> > +
> > +   pix->bytesperline = rvin_format_bytesperline(pix);
> > +   pix->sizeimage = rvin_format_sizeimage(pix);
> > +
> > +   if (vin->info->model == RCAR_M1 &&
> > +   pix->pixelformat == V4L2_PIX_FMT_XBGR32) {
> > +   vin_err(vin, "pixel format XBGR32 not supported on M1\n");
> > +   return -EINVAL;
> > +   }
> 
> This can't happen as you set the pixel format to the default earlier in the 
> same case.

This is the result of a bad re-ordering of the patches for v11 and 
should be removed. Thanks for spotting this! Sometime I get blind to my 
own code.

> 
> > +   vin_dbg(vin, "Format %ux%u bpl: %d size: %d\n",
> > +   pix->width, pix->height, pix->bytesperline, pix->sizeimage);
> 
> While at it you could use %u for bpl and size.

Thanks.

> 
> > +
> > +   return 0;
> > +}
> > +
> >  /* 
> >   * V4L2
> >   */
> > @@ -184,55 +237,14 @@ static int __rvin_try_format(struct rvin_dev *vin,
> >  struct v4l2_pix_format *pix,
> >  struct rvin_source_fmt *source)
> >  {
> > -   u32 walign;
> > int ret;
> > 
> > -   if (!rvin_format_from_pixel(pix->pixelformat) ||
> > -   (vin->info->model == RCAR_M1 &&
> > -pix->pixelformat == V4L2_PIX_FMT_XBGR32))
> > -   pix->pixelformat = RVIN_DEFAULT_FORMAT;
> > -
> > /* Limit to source capabilities */
> > ret = __rvin_try_format_source(vin, which, pix, source);
> 
> This functions uses the pixel format. Isn't it a problem that you don't first 
> set it to the default if the requested pixel format isn't supported ?

Hum, yes it might be! I never thought about it but yes it's probably 
best to keep this check here. Thanks!

> 
> > if (ret)
> > return ret;
> > 
> > -   switch (pix->field) {
> > -   case V4L2_FIELD_TOP:
> > -   case V4L2_FIELD_BOTTOM:
> > -   case V4L2_FIELD_NONE:
> > -   case V4L2_FIELD_INTERLACED_TB:
> > -   case V4L2_FIELD_INTERLACED_BT:
> > -   case V4L2_FIELD_INTERLACED:
> > -   break;
> > -   case V4L2_FIELD_ALTERNATE:
> > -   /*
> > -* Driver do not (yet) support outputting ALTERNATE to a
> > -* userspace. It does support outputting INTERLACED so use
> > -* the VIN hardware to combine the two fields.
> > -*/
> > -   pix->field = V4L2_FIELD_INTERLACED;
> > -   pix->height *= 2;
> > -   break;
> > -   default:
> > -   pix->field = RVIN_DEFAULT_FIELD;
> > -   break;
> > -   }
> > -
> > - 

Re: [PATCH v11 15/32] rcar-vin: break out format alignment and checking

2018-03-02 Thread Laurent Pinchart
Hi Niklas,

Thank you for the patch.

On Friday, 2 March 2018 03:57:34 EET Niklas Söderlund wrote:
> Part of the format alignment and checking can be shared with the Gen3
> format handling. Break that part out to a separate function.
> 
> Signed-off-by: Niklas Söderlund 
> ---
>  drivers/media/platform/rcar-vin/rcar-v4l2.c | 96 +++---
>  1 file changed, 54 insertions(+), 42 deletions(-)
> 
> diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c
> b/drivers/media/platform/rcar-vin/rcar-v4l2.c index
> b94ca9ffb1d3b323..3290e603b44cdf3a 100644
> --- a/drivers/media/platform/rcar-vin/rcar-v4l2.c
> +++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c
> @@ -87,6 +87,59 @@ static u32 rvin_format_sizeimage(struct v4l2_pix_format
> *pix) return pix->bytesperline * pix->height;
>  }
> 
> +static int rvin_format_align(struct rvin_dev *vin, struct v4l2_pix_format
> *pix)
> +{
> + u32 walign;
> +
> + if (!rvin_format_from_pixel(pix->pixelformat) ||
> + (vin->info->model == RCAR_M1 &&
> +  pix->pixelformat == V4L2_PIX_FMT_XBGR32))
> + pix->pixelformat = RVIN_DEFAULT_FORMAT;
> +
> + switch (pix->field) {
> + case V4L2_FIELD_TOP:
> + case V4L2_FIELD_BOTTOM:
> + case V4L2_FIELD_NONE:
> + case V4L2_FIELD_INTERLACED_TB:
> + case V4L2_FIELD_INTERLACED_BT:
> + case V4L2_FIELD_INTERLACED:
> + break;
> + case V4L2_FIELD_ALTERNATE:
> + /*
> +  * Driver do not (yet) support outputting ALTERNATE to a
> +  * userspace. It does support outputting INTERLACED so use
> +  * the VIN hardware to combine the two fields.
> +  */
> + pix->field = V4L2_FIELD_INTERLACED;
> + pix->height *= 2;
> + break;
> + default:
> + pix->field = RVIN_DEFAULT_FIELD;
> + break;
> + }
> +
> + /* HW limit width to a multiple of 32 (2^5) for NV16 else 2 (2^1) */
> + walign = vin->format.pixelformat == V4L2_PIX_FMT_NV16 ? 5 : 1;
> +
> + /* Limit to VIN capabilities */
> + v4l_bound_align_image(>width, 2, vin->info->max_width, walign,
> +   >height, 4, vin->info->max_height, 2, 0);
> +
> + pix->bytesperline = rvin_format_bytesperline(pix);
> + pix->sizeimage = rvin_format_sizeimage(pix);
> +
> + if (vin->info->model == RCAR_M1 &&
> + pix->pixelformat == V4L2_PIX_FMT_XBGR32) {
> + vin_err(vin, "pixel format XBGR32 not supported on M1\n");
> + return -EINVAL;
> + }

This can't happen as you set the pixel format to the default earlier in the 
same case.

> + vin_dbg(vin, "Format %ux%u bpl: %d size: %d\n",
> + pix->width, pix->height, pix->bytesperline, pix->sizeimage);

While at it you could use %u for bpl and size.

> +
> + return 0;
> +}
> +
>  /* 
>   * V4L2
>   */
> @@ -184,55 +237,14 @@ static int __rvin_try_format(struct rvin_dev *vin,
>struct v4l2_pix_format *pix,
>struct rvin_source_fmt *source)
>  {
> - u32 walign;
>   int ret;
> 
> - if (!rvin_format_from_pixel(pix->pixelformat) ||
> - (vin->info->model == RCAR_M1 &&
> -  pix->pixelformat == V4L2_PIX_FMT_XBGR32))
> - pix->pixelformat = RVIN_DEFAULT_FORMAT;
> -
>   /* Limit to source capabilities */
>   ret = __rvin_try_format_source(vin, which, pix, source);

This functions uses the pixel format. Isn't it a problem that you don't first 
set it to the default if the requested pixel format isn't supported ?

>   if (ret)
>   return ret;
> 
> - switch (pix->field) {
> - case V4L2_FIELD_TOP:
> - case V4L2_FIELD_BOTTOM:
> - case V4L2_FIELD_NONE:
> - case V4L2_FIELD_INTERLACED_TB:
> - case V4L2_FIELD_INTERLACED_BT:
> - case V4L2_FIELD_INTERLACED:
> - break;
> - case V4L2_FIELD_ALTERNATE:
> - /*
> -  * Driver do not (yet) support outputting ALTERNATE to a
> -  * userspace. It does support outputting INTERLACED so use
> -  * the VIN hardware to combine the two fields.
> -  */
> - pix->field = V4L2_FIELD_INTERLACED;
> - pix->height *= 2;
> - break;
> - default:
> - pix->field = RVIN_DEFAULT_FIELD;
> - break;
> - }
> -
> - /* HW limit width to a multiple of 32 (2^5) for NV16 else 2 (2^1) */
> - walign = vin->format.pixelformat == V4L2_PIX_FMT_NV16 ? 5 : 1;
> -
> - /* Limit to VIN capabilities */
> - v4l_bound_align_image(>width, 2, vin->info->max_width, walign,
> -   >height, 4, vin->info->max_height, 2, 0);
> -
> - pix->bytesperline = rvin_format_bytesperline(pix);
> - pix->sizeimage = rvin_format_sizeimage(pix);
> -
> - vin_dbg(vin, 

[PATCH v11 15/32] rcar-vin: break out format alignment and checking

2018-03-01 Thread Niklas Söderlund
Part of the format alignment and checking can be shared with the Gen3
format handling. Break that part out to a separate function.

Signed-off-by: Niklas Söderlund 
---
 drivers/media/platform/rcar-vin/rcar-v4l2.c | 96 -
 1 file changed, 54 insertions(+), 42 deletions(-)

diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c 
b/drivers/media/platform/rcar-vin/rcar-v4l2.c
index b94ca9ffb1d3b323..3290e603b44cdf3a 100644
--- a/drivers/media/platform/rcar-vin/rcar-v4l2.c
+++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c
@@ -87,6 +87,59 @@ static u32 rvin_format_sizeimage(struct v4l2_pix_format *pix)
return pix->bytesperline * pix->height;
 }
 
+static int rvin_format_align(struct rvin_dev *vin, struct v4l2_pix_format *pix)
+{
+   u32 walign;
+
+   if (!rvin_format_from_pixel(pix->pixelformat) ||
+   (vin->info->model == RCAR_M1 &&
+pix->pixelformat == V4L2_PIX_FMT_XBGR32))
+   pix->pixelformat = RVIN_DEFAULT_FORMAT;
+
+   switch (pix->field) {
+   case V4L2_FIELD_TOP:
+   case V4L2_FIELD_BOTTOM:
+   case V4L2_FIELD_NONE:
+   case V4L2_FIELD_INTERLACED_TB:
+   case V4L2_FIELD_INTERLACED_BT:
+   case V4L2_FIELD_INTERLACED:
+   break;
+   case V4L2_FIELD_ALTERNATE:
+   /*
+* Driver do not (yet) support outputting ALTERNATE to a
+* userspace. It does support outputting INTERLACED so use
+* the VIN hardware to combine the two fields.
+*/
+   pix->field = V4L2_FIELD_INTERLACED;
+   pix->height *= 2;
+   break;
+   default:
+   pix->field = RVIN_DEFAULT_FIELD;
+   break;
+   }
+
+   /* HW limit width to a multiple of 32 (2^5) for NV16 else 2 (2^1) */
+   walign = vin->format.pixelformat == V4L2_PIX_FMT_NV16 ? 5 : 1;
+
+   /* Limit to VIN capabilities */
+   v4l_bound_align_image(>width, 2, vin->info->max_width, walign,
+ >height, 4, vin->info->max_height, 2, 0);
+
+   pix->bytesperline = rvin_format_bytesperline(pix);
+   pix->sizeimage = rvin_format_sizeimage(pix);
+
+   if (vin->info->model == RCAR_M1 &&
+   pix->pixelformat == V4L2_PIX_FMT_XBGR32) {
+   vin_err(vin, "pixel format XBGR32 not supported on M1\n");
+   return -EINVAL;
+   }
+
+   vin_dbg(vin, "Format %ux%u bpl: %d size: %d\n",
+   pix->width, pix->height, pix->bytesperline, pix->sizeimage);
+
+   return 0;
+}
+
 /* 
-
  * V4L2
  */
@@ -184,55 +237,14 @@ static int __rvin_try_format(struct rvin_dev *vin,
 struct v4l2_pix_format *pix,
 struct rvin_source_fmt *source)
 {
-   u32 walign;
int ret;
 
-   if (!rvin_format_from_pixel(pix->pixelformat) ||
-   (vin->info->model == RCAR_M1 &&
-pix->pixelformat == V4L2_PIX_FMT_XBGR32))
-   pix->pixelformat = RVIN_DEFAULT_FORMAT;
-
/* Limit to source capabilities */
ret = __rvin_try_format_source(vin, which, pix, source);
if (ret)
return ret;
 
-   switch (pix->field) {
-   case V4L2_FIELD_TOP:
-   case V4L2_FIELD_BOTTOM:
-   case V4L2_FIELD_NONE:
-   case V4L2_FIELD_INTERLACED_TB:
-   case V4L2_FIELD_INTERLACED_BT:
-   case V4L2_FIELD_INTERLACED:
-   break;
-   case V4L2_FIELD_ALTERNATE:
-   /*
-* Driver do not (yet) support outputting ALTERNATE to a
-* userspace. It does support outputting INTERLACED so use
-* the VIN hardware to combine the two fields.
-*/
-   pix->field = V4L2_FIELD_INTERLACED;
-   pix->height *= 2;
-   break;
-   default:
-   pix->field = RVIN_DEFAULT_FIELD;
-   break;
-   }
-
-   /* HW limit width to a multiple of 32 (2^5) for NV16 else 2 (2^1) */
-   walign = vin->format.pixelformat == V4L2_PIX_FMT_NV16 ? 5 : 1;
-
-   /* Limit to VIN capabilities */
-   v4l_bound_align_image(>width, 2, vin->info->max_width, walign,
- >height, 4, vin->info->max_height, 2, 0);
-
-   pix->bytesperline = rvin_format_bytesperline(pix);
-   pix->sizeimage = rvin_format_sizeimage(pix);
-
-   vin_dbg(vin, "Format %ux%u bpl: %d size: %d\n",
-   pix->width, pix->height, pix->bytesperline, pix->sizeimage);
-
-   return 0;
+   return rvin_format_align(vin, pix);
 }
 
 static int rvin_querycap(struct file *file, void *priv,
-- 
2.16.2