linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] media: atomisp: Selection API support bugfixes
@ 2023-06-01 14:58 Hans de Goede
  2023-06-01 14:58 ` [PATCH 1/3] media: atomisp: Take minimum padding requirement on BYT/ISP2400 into account Hans de Goede
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Hans de Goede @ 2023-06-01 14:58 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Sakari Ailus, Andy Shevchenko
  Cc: Hans de Goede, Kate Hsuan, Tsuchiya Yuto, Yury Luneff, Nable,
	andrey.i.trufanov, Fabio Aiuto, linux-media, linux-staging

Hi All,

Here is a set of bugfixes for the recently added Selection API support.

Regards,

Hans


Hans de Goede (3):
  media: atomisp: Take minimum padding requirement on BYT/ISP2400 into
    account
  media: atomisp: Make atomisp_enum_framesizes_crop() check resolution
    fits with padding
  media: atomisp: Fix binning check in atomisp_set_crop()

 .../staging/media/atomisp/pci/atomisp_cmd.c   | 42 ++++++++++++++++---
 .../staging/media/atomisp/pci/atomisp_cmd.h   |  4 ++
 .../media/atomisp/pci/atomisp_common.h        |  4 ++
 .../staging/media/atomisp/pci/atomisp_ioctl.c | 18 +++++---
 4 files changed, 58 insertions(+), 10 deletions(-)

-- 
2.40.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/3] media: atomisp: Take minimum padding requirement on BYT/ISP2400 into account
  2023-06-01 14:58 [PATCH 0/3] media: atomisp: Selection API support bugfixes Hans de Goede
@ 2023-06-01 14:58 ` Hans de Goede
  2023-06-01 14:58 ` [PATCH 2/3] media: atomisp: Make atomisp_enum_framesizes_crop() check resolution fits with padding Hans de Goede
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Hans de Goede @ 2023-06-01 14:58 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Sakari Ailus, Andy Shevchenko
  Cc: Hans de Goede, Kate Hsuan, Tsuchiya Yuto, Yury Luneff, Nable,
	andrey.i.trufanov, Fabio Aiuto, linux-media, linux-staging

The main binary for the pipeline on BYT/ISP2400 has its
ia_css_binary_info.pipeline.left_cropping and .top_cropping fields
set to 12. So a minimum padding of 12 is required.

And for certain bayer-orders additional width / height padding is
necessary so that the ISP crop rectangle for the raw sensor data
can be used to change the bayer-order to the fixed bayer-order
supported by the debayer block.

Without the minmum required padding ia_css_ifmtr_configure() will fail
inside ifmtr_input_start_line() and/or ifmtr_start_column() because
it cannot set the ISP crop rectangle for the raw sensor data.

Fix this by making atomisp_get_padding() take the minimum padding
requirements into account on BYT/ISP2400 (CHT/ISP2401 does not seem to
need this).

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 .../staging/media/atomisp/pci/atomisp_cmd.c   | 33 +++++++++++++++++++
 .../media/atomisp/pci/atomisp_common.h        |  4 +++
 2 files changed, 37 insertions(+)

diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.c b/drivers/staging/media/atomisp/pci/atomisp_cmd.c
index 76307f793dc8..5c984edfb3fc 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_cmd.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.c
@@ -3697,6 +3697,10 @@ static void atomisp_get_padding(struct atomisp_device *isp,
 {
 	struct atomisp_input_subdev *input = &isp->inputs[isp->asd.input_curr];
 	struct v4l2_rect native_rect = input->native_rect;
+	const struct atomisp_in_fmt_conv *fc = NULL;
+	u32 min_pad_w = ISP2400_MIN_PAD_W;
+	u32 min_pad_h = ISP2400_MIN_PAD_H;
+	struct v4l2_mbus_framefmt *sink;
 
 	if (!input->crop_support) {
 		*padding_w = pad_w;
@@ -3715,6 +3719,35 @@ static void atomisp_get_padding(struct atomisp_device *isp,
 
 	*padding_w = min_t(u32, (native_rect.width - width) & ~1, pad_w);
 	*padding_h = min_t(u32, (native_rect.height - height) & ~1, pad_h);
+
+	/* The below minimum padding requirements are for BYT / ISP2400 only */
+	if (IS_ISP2401)
+		return;
+
+	sink = atomisp_subdev_get_ffmt(&isp->asd.subdev, NULL, V4L2_SUBDEV_FORMAT_ACTIVE,
+				       ATOMISP_SUBDEV_PAD_SINK);
+	if (sink)
+		fc = atomisp_find_in_fmt_conv(sink->code);
+	if (!fc) {
+		dev_warn(isp->dev, "%s: Could not get sensor format\n", __func__);
+		goto apply_min_padding;
+	}
+
+	/*
+	 * The ISP only supports GRBG for other bayer-orders additional padding
+	 * is used so that the raw sensor data can be cropped to fix the order.
+	 */
+	if (fc->bayer_order == IA_CSS_BAYER_ORDER_RGGB ||
+	    fc->bayer_order == IA_CSS_BAYER_ORDER_GBRG)
+		min_pad_w += 2;
+
+	if (fc->bayer_order == IA_CSS_BAYER_ORDER_BGGR ||
+	    fc->bayer_order == IA_CSS_BAYER_ORDER_GBRG)
+		min_pad_h += 2;
+
+apply_min_padding:
+	*padding_w = max_t(u32, *padding_w, min_pad_w);
+	*padding_h = max_t(u32, *padding_h, min_pad_h);
 }
 
 static int atomisp_set_crop(struct atomisp_device *isp,
diff --git a/drivers/staging/media/atomisp/pci/atomisp_common.h b/drivers/staging/media/atomisp/pci/atomisp_common.h
index 07c38e487a66..9d23a6ccfc33 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_common.h
+++ b/drivers/staging/media/atomisp/pci/atomisp_common.h
@@ -37,6 +37,10 @@ extern int mipicsi_flag;
 extern int pad_w;
 extern int pad_h;
 
+/* Minimum padding requirements for ISP2400 (BYT) */
+#define ISP2400_MIN_PAD_W		12
+#define ISP2400_MIN_PAD_H		12
+
 #define CSS_DTRACE_VERBOSITY_LEVEL	5	/* Controls trace verbosity */
 #define CSS_DTRACE_VERBOSITY_TIMEOUT	9	/* Verbosity on ISP timeout */
 #define MRFLD_MAX_ZOOM_FACTOR	1024
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/3] media: atomisp: Make atomisp_enum_framesizes_crop() check resolution fits with padding
  2023-06-01 14:58 [PATCH 0/3] media: atomisp: Selection API support bugfixes Hans de Goede
  2023-06-01 14:58 ` [PATCH 1/3] media: atomisp: Take minimum padding requirement on BYT/ISP2400 into account Hans de Goede
@ 2023-06-01 14:58 ` Hans de Goede
  2023-06-01 14:58 ` [PATCH 3/3] media: atomisp: Fix binning check in atomisp_set_crop() Hans de Goede
  2023-06-01 16:04 ` [PATCH 0/3] media: atomisp: Selection API support bugfixes Andy Shevchenko
  3 siblings, 0 replies; 5+ messages in thread
From: Hans de Goede @ 2023-06-01 14:58 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Sakari Ailus, Andy Shevchenko
  Cc: Hans de Goede, Kate Hsuan, Tsuchiya Yuto, Yury Luneff, Nable,
	andrey.i.trufanov, Fabio Aiuto, linux-media, linux-staging

Now that atomisp_get_padding() takes minimum padding requirements
on BYT/ISP2400 into account, it is possible for a resolution which
fits in the active area of the sensor to not fit in the native area
once padding is added.

For example on the ov2680 which has a native resolution of 1616x1216
the max active resolution of 1600x1200 leaves 16x16 for padding which
meets the worst-case minimum padding requirement of 14x14 on BYT.

But after binning we are left with an native area of 808x608 and
an active area of 800x600. This leaves 8x8 for padding which is not
enough. So on BYT 800x600 is not a valid resolution (it could be
made by lots of cropping without binning but then the remaining
field of view is no good).

Modify atomisp_enum_framesizes_crop() to check the resolution +
padding fits in the native rectangle, removing 800x600 from
the list of valid modes on BYT.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 .../staging/media/atomisp/pci/atomisp_cmd.c    |  5 ++---
 .../staging/media/atomisp/pci/atomisp_cmd.h    |  4 ++++
 .../staging/media/atomisp/pci/atomisp_ioctl.c  | 18 +++++++++++++-----
 3 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.c b/drivers/staging/media/atomisp/pci/atomisp_cmd.c
index 5c984edfb3fc..68550cd49a83 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_cmd.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.c
@@ -3691,9 +3691,8 @@ static void atomisp_fill_pix_format(struct v4l2_pix_format *f,
 }
 
 /* Get sensor padding values for the non padded width x height resolution */
-static void atomisp_get_padding(struct atomisp_device *isp,
-				u32 width, u32 height,
-				u32 *padding_w, u32 *padding_h)
+void atomisp_get_padding(struct atomisp_device *isp, u32 width, u32 height,
+			 u32 *padding_w, u32 *padding_h)
 {
 	struct atomisp_input_subdev *input = &isp->inputs[isp->asd.input_curr];
 	struct v4l2_rect native_rect = input->native_rect;
diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.h b/drivers/staging/media/atomisp/pci/atomisp_cmd.h
index c9a587b34e70..8305161d2062 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_cmd.h
+++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.h
@@ -250,6 +250,10 @@ int atomisp_makeup_css_parameters(struct atomisp_sub_device *asd,
 int atomisp_compare_grid(struct atomisp_sub_device *asd,
 			 struct atomisp_grid_info *atomgrid);
 
+/* Get sensor padding values for the non padded width x height resolution */
+void atomisp_get_padding(struct atomisp_device *isp, u32 width, u32 height,
+			 u32 *padding_w, u32 *padding_h);
+
 /* This function looks up the closest available resolution. */
 int atomisp_try_fmt(struct atomisp_device *isp, struct v4l2_pix_format *f,
 		    const struct atomisp_format_bridge **fmt_ret,
diff --git a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c
index 279493af6e0d..d2174156573a 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c
@@ -703,7 +703,8 @@ static int atomisp_s_input(struct file *file, void *fh, unsigned int input)
  */
 static int atomisp_enum_framesizes_crop_inner(struct atomisp_device *isp,
 					      struct v4l2_frmsizeenum *fsize,
-					      struct v4l2_rect *active,
+					      const struct v4l2_rect *active,
+					      const struct v4l2_rect *native,
 					      int *valid_sizes)
 {
 	static const struct v4l2_frmsize_discrete frame_sizes[] = {
@@ -716,11 +717,15 @@ static int atomisp_enum_framesizes_crop_inner(struct atomisp_device *isp,
 		{  800,  600 },
 		{  640,  480 },
 	};
+	u32 padding_w, padding_h;
 	int i;
 
 	for (i = 0; i < ARRAY_SIZE(frame_sizes); i++) {
-		if (frame_sizes[i].width > active->width ||
-		    frame_sizes[i].height > active->height)
+		atomisp_get_padding(isp, frame_sizes[i].width, frame_sizes[i].height,
+				    &padding_w, &padding_h);
+
+		if ((frame_sizes[i].width + padding_w) > native->width ||
+		    (frame_sizes[i].height + padding_h) > native->height)
 			continue;
 
 		/*
@@ -748,9 +753,10 @@ static int atomisp_enum_framesizes_crop(struct atomisp_device *isp,
 {
 	struct atomisp_input_subdev *input = &isp->inputs[isp->asd.input_curr];
 	struct v4l2_rect active = input->active_rect;
+	struct v4l2_rect native = input->native_rect;
 	int ret, valid_sizes = 0;
 
-	ret = atomisp_enum_framesizes_crop_inner(isp, fsize, &active, &valid_sizes);
+	ret = atomisp_enum_framesizes_crop_inner(isp, fsize, &active, &native, &valid_sizes);
 	if (ret == 0)
 		return 0;
 
@@ -759,8 +765,10 @@ static int atomisp_enum_framesizes_crop(struct atomisp_device *isp,
 
 	active.width /= 2;
 	active.height /= 2;
+	native.width /= 2;
+	native.height /= 2;
 
-	return atomisp_enum_framesizes_crop_inner(isp, fsize, &active, &valid_sizes);
+	return atomisp_enum_framesizes_crop_inner(isp, fsize, &active, &native, &valid_sizes);
 }
 
 static int atomisp_enum_framesizes(struct file *file, void *priv,
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 3/3] media: atomisp: Fix binning check in atomisp_set_crop()
  2023-06-01 14:58 [PATCH 0/3] media: atomisp: Selection API support bugfixes Hans de Goede
  2023-06-01 14:58 ` [PATCH 1/3] media: atomisp: Take minimum padding requirement on BYT/ISP2400 into account Hans de Goede
  2023-06-01 14:58 ` [PATCH 2/3] media: atomisp: Make atomisp_enum_framesizes_crop() check resolution fits with padding Hans de Goede
@ 2023-06-01 14:58 ` Hans de Goede
  2023-06-01 16:04 ` [PATCH 0/3] media: atomisp: Selection API support bugfixes Andy Shevchenko
  3 siblings, 0 replies; 5+ messages in thread
From: Hans de Goede @ 2023-06-01 14:58 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, Sakari Ailus, Andy Shevchenko
  Cc: Hans de Goede, Kate Hsuan, Tsuchiya Yuto, Yury Luneff, Nable,
	andrey.i.trufanov, Fabio Aiuto, linux-media, linux-staging

The fmt / size passed to atomisp_set_crop() includes padding,
so the binning check should be against 1/2 of the native rect.
of the sensor, rather then 1/2 of the active rect.

This fixes binning not being used when using e.g. 800x600 on
a 1600x1200 sensor leading to a very small field of view.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/staging/media/atomisp/pci/atomisp_cmd.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.c b/drivers/staging/media/atomisp/pci/atomisp_cmd.c
index 68550cd49a83..e27f9dc8e7aa 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_cmd.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.c
@@ -3769,8 +3769,8 @@ static int atomisp_set_crop(struct atomisp_device *isp,
 		return 0;
 
 	/* Cropping is done before binning, when binning double the crop rect */
-	if (input->binning_support && sel.r.width <= (input->active_rect.width / 2) &&
-				      sel.r.height <= (input->active_rect.height / 2)) {
+	if (input->binning_support && sel.r.width <= (input->native_rect.width / 2) &&
+				      sel.r.height <= (input->native_rect.height / 2)) {
 		sel.r.width *= 2;
 		sel.r.height *= 2;
 	}
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 0/3] media: atomisp: Selection API support bugfixes
  2023-06-01 14:58 [PATCH 0/3] media: atomisp: Selection API support bugfixes Hans de Goede
                   ` (2 preceding siblings ...)
  2023-06-01 14:58 ` [PATCH 3/3] media: atomisp: Fix binning check in atomisp_set_crop() Hans de Goede
@ 2023-06-01 16:04 ` Andy Shevchenko
  3 siblings, 0 replies; 5+ messages in thread
From: Andy Shevchenko @ 2023-06-01 16:04 UTC (permalink / raw)
  To: Hans de Goede
  Cc: Mauro Carvalho Chehab, Sakari Ailus, Andy Shevchenko, Kate Hsuan,
	Tsuchiya Yuto, Yury Luneff, Nable, andrey.i.trufanov,
	Fabio Aiuto, linux-media, linux-staging

On Thu, Jun 1, 2023 at 5:59 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> Hi All,
>
> Here is a set of bugfixes for the recently added Selection API support.

All three LGTM
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>

> Regards,
>
> Hans
>
>
> Hans de Goede (3):
>   media: atomisp: Take minimum padding requirement on BYT/ISP2400 into
>     account
>   media: atomisp: Make atomisp_enum_framesizes_crop() check resolution
>     fits with padding
>   media: atomisp: Fix binning check in atomisp_set_crop()
>
>  .../staging/media/atomisp/pci/atomisp_cmd.c   | 42 ++++++++++++++++---
>  .../staging/media/atomisp/pci/atomisp_cmd.h   |  4 ++
>  .../media/atomisp/pci/atomisp_common.h        |  4 ++
>  .../staging/media/atomisp/pci/atomisp_ioctl.c | 18 +++++---
>  4 files changed, 58 insertions(+), 10 deletions(-)
>
> --
> 2.40.1
>


-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-06-01 16:05 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-01 14:58 [PATCH 0/3] media: atomisp: Selection API support bugfixes Hans de Goede
2023-06-01 14:58 ` [PATCH 1/3] media: atomisp: Take minimum padding requirement on BYT/ISP2400 into account Hans de Goede
2023-06-01 14:58 ` [PATCH 2/3] media: atomisp: Make atomisp_enum_framesizes_crop() check resolution fits with padding Hans de Goede
2023-06-01 14:58 ` [PATCH 3/3] media: atomisp: Fix binning check in atomisp_set_crop() Hans de Goede
2023-06-01 16:04 ` [PATCH 0/3] media: atomisp: Selection API support bugfixes Andy Shevchenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).