From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Jai Luthra <jai.luthra@ideasonboard.com>
Cc: "Dave Stevenson" <dave.stevenson@raspberrypi.com>,
"Sakari Ailus" <sakari.ailus@linux.intel.com>,
linux-media@vger.kernel.org, hans@jjverkuil.nl,
Prabhakar <prabhakar.csengg@gmail.com>,
"Kate Hsuan" <hpa@redhat.com>,
"Tommaso Merciai" <tomm.merciai@gmail.com>,
"Benjamin Mugnier" <benjamin.mugnier@foss.st.com>,
"Sylvain Petinot" <sylvain.petinot@foss.st.com>,
"Christophe JAILLET" <christophe.jaillet@wanadoo.fr>,
"Julien Massot" <julien.massot@collabora.com>,
"Naushir Patuck" <naush@raspberrypi.com>,
"Yan, Dongcheng" <dongcheng.yan@intel.com>,
"Stefan Klug" <stefan.klug@ideasonboard.com>,
"Mirela Rabulea" <mirela.rabulea@nxp.com>,
"André Apitzsch" <git@apitzsch.eu>,
"Heimir Thor Sverrisson" <heimir.sverrisson@gmail.com>,
"Kieran Bingham" <kieran.bingham@ideasonboard.com>,
"Mehdi Djait" <mehdi.djait@linux.intel.com>,
"Ricardo Ribalda Delgado" <ribalda@kernel.org>,
"Hans de Goede" <hansg@kernel.org>,
"Jacopo Mondi" <jacopo.mondi@ideasonboard.com>,
"Tomi Valkeinen" <tomi.valkeinen@ideasonboard.com>,
"David Plowman" <david.plowman@raspberrypi.com>,
"Yu, On g Hock" <ong.hock.yu@intel.com>,
"Ng, Khai Wen" <khai.wen.ng@intel.com>,
"Rishikesh Donadkar" <r-donadkar@ti.com>
Subject: Re: [PATCH v5 02/10] media: imx219: Scale the vblank limits according to rate_factor
Date: Wed, 10 Jun 2026 14:48:46 +0300 [thread overview]
Message-ID: <20260610114846.GC1209951@killaraus.ideasonboard.com> (raw)
In-Reply-To: <178098491481.19620.16486648231434103823@freya>
On Tue, Jun 09, 2026 at 11:31:54AM +0530, Jai Luthra wrote:
> Quoting Jai Luthra (2026-06-09 11:28:42)
> > Quoting Laurent Pinchart (2026-06-09 02:58:56)
> > > Hi Dave,
> > >
> > > Thanks a lot for taking the time to investigate and provide very
> > > valuable insight. I really appreciate that.
> > >
> > > On Mon, Jun 08, 2026 at 04:29:46PM +0100, Dave Stevenson wrote:
> > > > On Sun, 7 Jun 2026 at 22:54, Sakari Ailus wrote:
> > > > >
> > > > > The limits for vertical blanking (and frame length in pixels) is related
> > > > > to the properties of the hardware, it's not in half-line units the driver
> > > > > uses. Multiply the vertical blanking limits by the rate_factor to satisty
> > > > > hardware requirements.
> > > >
> > > > Whilst that would be a logical interpretation, it doesn't match with
> > > > how the hardware performs, nor the docs.
> > > >
> > > > The datasheet for register FRM_LENGTH_A 0x160 says
> > > > frame_length_lines
> > > > BINNING_MODE = 0,1,2
> > > > Unit: 1Lines
> > > > BINNING_MODE = 3
> > > > Units: 2Lines
> > > >
> > > > That's not units of 2 lines for active lines only, that is units of 2
> > > > lines for ALL lines.
> > > >
> > > > I have tested it, and the sensor works fine with FRM_LENGTH_A being
> > > > 0x278 in the 1640x1232 mode, and 0x100 in 640x480 modes with all the
> > > > tests I've thrown at it. Drop them any lower and it does stall or give
> > > > corrupt horizontal lines.
> > >
> > > If I understand this correctly, it indicates that
> > >
> > > - The frame length is expressed as a number of lines at the output of
> > > the sensor (after binning).
> > >
> > > - The minimum margin between the output height (after binning) and the
> > > frame length is 32 lines.
> > >
> > > - In special binning mode, the FRM_LENGTH_A register needs to be
> > > programmed with frame_length_lines / 2.
> > >
> > > The last constraint is device-specific, and as far as I understand it
> > > can be handled directly in the driver without affecting the userspace
> > > API by simply dividing the frame length value by 2 before writing it to
> > > the register.
> > >
> > > It's getting a bit late, I'll test the "regular" binning mode
> > > (BINNING_MODE = 1) tomorrow to see how it compares (unless someone beats
> > > me to it). Unless I get very unexpected results, it seems that the
> > > existing implementation is correct and the patch should be dropped.
> > >
> > > One thing that may not be implemented correctly is different binning
> > > modes horizontally and vertically. imx219_get_rate_factor() will return
> > > 2 only when both the horizontal and vertical binning modes are "special
> > > analog binning". When used to scale the frame length and exposure time,
> > > I wonder if only vertical binning should be taken into account.
> > >
> >
> > That does make sense.
> >
> > When I was working on the binning and related issues in this driver, I had
> > decided to always keep `bin_h == bin_v` everywhere after some brief tests
> > with different values for them:
> >
> > 1. Setting bin_h = 0x1 (normal x2 binning) and bin_v = 0x0 (or vice versa)
> > results in the output image being stretched/squeezed, which is expected
> > but not a typical usecase
> >
> > 2. Setting bin_h = 0x3 (special x2 binning) and bin_v = 0x0 (or vice versa)
> > results in both dimensions getting binned as opposed to only one, which
>
> Ah sorry it was: "none of the dimensions getting binned" but the output was
> cropped. So in the above case (bin_h = 0x3), it would just drop the right
> half of the image as opposed to squeezing it when bin_h = 0x1.
If the sensor ignores horizontal special binning when vertical binning
is disabled, then cropping is expected, as the driver sets the output
size to the binned size.
> > is unexpected, and it might be breaking other things with the sensor
> > timing too
> >
> > My analysis on the other sub-thread also suggests special x2 binning means
> > analogue-domain averaging in both horzizontal and vertical dimensions..
> > which matches up with this behaviour, so maybe we can't really separate
> > vertical and horizontal out for the "special" case even if the registers
> > allow us to.
Binning independently in the horizontal and vertical direction is a
niche use case, so I'm fine not supporting it in the imx219 driver.
> > > > (Please note that the sensor extends the frame length automatically to
> > > > accommodate the exposure time requested, so do ensure the exposure
> > > > time doesn't interact with the frame length if you're testing).
> > > >
> > > > This patch drops the maximum frame rate from 81.07 to 79.07fps in
> > > > 1640x1232 (2.5%), and 200.1 to 188.39fps in 640x480 (6%) for no good
> > > > reason that I can see.
> > > > Unless anyone can produce a genuine situation where they see the
> > > > sensor behave incorrectly with the old setup, I'll be very sad to see
> > > > this merged.
> > > >
> > > > > Fixes: f513997119f4 ("media: i2c: imx219: Scale the pixel rate for analog binning")
> > > > > Cc: stable@vger.kernel.org
> > > > > Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> > > > > ---
> > > > > drivers/media/i2c/imx219.c | 10 ++++++----
> > > > > 1 file changed, 6 insertions(+), 4 deletions(-)
> > > > >
> > > > > diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c
> > > > > index 223d3753cc93..d8fe7db18b6c 100644
> > > > > --- a/drivers/media/i2c/imx219.c
> > > > > +++ b/drivers/media/i2c/imx219.c
> > > > > @@ -878,14 +878,17 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd,
> > > > > crop->top = (IMX219_NATIVE_HEIGHT - crop->height) / 2;
> > > > >
> > > > > if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
> > > > > + unsigned int rate_factor = imx219_get_rate_factor(state);
> > > > > int exposure_max;
> > > > > int exposure_def;
> > > > > int llp_min;
> > > > > int pixel_rate;
> > > > >
> > > > > /* Update limits and set FPS to default */
> > > > > - ret = __v4l2_ctrl_modify_range(imx219->vblank, IMX219_VBLANK_MIN,
> > > > > - IMX219_FLL_MAX - mode->height, 1,
> > > > > + ret = __v4l2_ctrl_modify_range(imx219->vblank,
> > > > > + IMX219_VBLANK_MIN * rate_factor,
> > > > > + (IMX219_FLL_MAX - mode->height) *
> > > > > + rate_factor, rate_factor,
> > > > > mode->fll_def - mode->height);
> > > > > if (ret)
> > > > > return ret;
> > > > > @@ -928,8 +931,7 @@ static int imx219_set_pad_format(struct v4l2_subdev *sd,
> > > > > return ret;
> > > > >
> > > > > /* Scale the pixel rate based on the mode specific factor */
> > > > > - pixel_rate = imx219_get_pixel_rate(imx219) *
> > > > > - imx219_get_rate_factor(state);
> > > > > + pixel_rate = imx219_get_pixel_rate(imx219) * rate_factor;
> > > > > ret = __v4l2_ctrl_modify_range(imx219->pixel_rate, pixel_rate,
> > > > > pixel_rate, 1, pixel_rate);
> > > > > if (ret)
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2026-06-10 11:48 UTC|newest]
Thread overview: 99+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-07 21:53 [PATCH v5 00/10] Metadata series preparation Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 00/16] " Sakari Ailus
2026-06-07 21:53 ` [PATCH v5 01/10] media: Documentation: Improve pixel rate calculation documentation Sakari Ailus
2026-06-07 21:53 ` [PATCH v5 02/10] media: imx219: Scale the vblank limits according to rate_factor Sakari Ailus
2026-06-08 7:26 ` Laurent Pinchart
2026-06-08 15:29 ` Dave Stevenson
2026-06-08 21:28 ` Laurent Pinchart
2026-06-09 5:58 ` Jai Luthra
2026-06-09 6:01 ` Jai Luthra
2026-06-10 11:48 ` Laurent Pinchart [this message]
2026-06-07 21:53 ` [PATCH v5 03/10] media: imx219: Account rate_factor in setting upper exposure limit Sakari Ailus
2026-06-07 22:05 ` sashiko-bot
2026-06-08 9:06 ` Laurent Pinchart
2026-06-08 13:44 ` Sakari Ailus
2026-06-08 15:42 ` Dave Stevenson
2026-06-08 21:38 ` Laurent Pinchart
2026-06-18 10:40 ` Sakari Ailus
2026-07-02 17:04 ` Dave Stevenson
2026-07-03 21:36 ` Sakari Ailus
2026-06-07 21:53 ` [PATCH v5 04/10] media: imx219: Make control handler ops for PIXEL_RATE NULL Sakari Ailus
2026-06-08 7:36 ` Laurent Pinchart
2026-06-08 7:53 ` Jacopo Mondi
2026-06-08 8:03 ` Laurent Pinchart
2026-06-08 8:14 ` Sakari Ailus
2026-06-08 8:24 ` Laurent Pinchart
2026-06-08 10:21 ` Sakari Ailus
2026-06-08 10:27 ` Laurent Pinchart
2026-06-08 13:47 ` Sakari Ailus
2026-06-08 14:42 ` Laurent Pinchart
2026-06-09 6:29 ` Jacopo Mondi
2026-06-09 14:55 ` Hans Verkuil
2026-06-09 15:15 ` Laurent Pinchart
2026-06-09 15:56 ` Dave Stevenson
2026-06-09 16:07 ` Laurent Pinchart
2026-06-09 16:44 ` Dave Stevenson
2026-06-07 21:53 ` [PATCH v5 05/10] media: imx219: Rename "binning" as "bin_hv" in imx219_set_pad_format Sakari Ailus
2026-06-08 15:45 ` Dave Stevenson
2026-06-07 21:53 ` [PATCH v5 06/10] media: imx219: Fix vertical blanking and exposure for analogue binning Sakari Ailus
2026-06-07 22:07 ` sashiko-bot
2026-06-08 6:58 ` Jacopo Mondi
2026-06-08 9:10 ` Laurent Pinchart
2026-06-08 14:07 ` Sakari Ailus
2026-06-08 16:23 ` Jai Luthra
2026-06-08 21:52 ` Laurent Pinchart
2026-06-10 8:27 ` Sakari Ailus
2026-06-10 8:45 ` Jai Luthra
2026-06-08 10:31 ` Jai Luthra
2026-06-08 11:19 ` Jai Luthra
2026-06-10 9:47 ` Sakari Ailus
2026-06-10 10:29 ` Jai Luthra
2026-06-10 10:57 ` Jai Luthra
2026-06-11 8:58 ` Sakari Ailus
2026-06-08 18:06 ` Dave Stevenson
2026-06-09 16:48 ` Jai Luthra
2026-06-10 10:30 ` Sakari Ailus
2026-06-10 11:59 ` Jai Luthra
2026-06-10 10:13 ` Sakari Ailus
2026-06-10 16:00 ` Jai Luthra
2026-06-08 21:01 ` Laurent Pinchart
2026-06-07 21:53 ` [PATCH v5 07/10] media: Improve enable_streams and disable_streams documentation Sakari Ailus
2026-06-08 9:29 ` Laurent Pinchart
2026-06-08 14:28 ` Sakari Ailus
2026-06-07 21:53 ` [PATCH v5 08/10] media: v4l2-subdev: Move subdev client capabilities into a new struct Sakari Ailus
2026-06-08 9:34 ` Laurent Pinchart
2026-06-08 14:35 ` Sakari Ailus
2026-06-07 21:53 ` [PATCH v5 09/10] media: v4l2-subdev: Add v4l2_subdev_get_fmt_ci() Sakari Ailus
2026-06-08 7:48 ` Laurent Pinchart
2026-06-07 21:53 ` [PATCH v5 10/10] media: v4l2-subdev: Add struct v4l2_subdev_client_info pointer to pad ops Sakari Ailus
2026-06-08 10:16 ` Laurent Pinchart
2026-06-28 14:20 ` Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 01/16] media: Documentation: Improve pixel rate calculation documentation Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 02/16] media: imx219: Account rate_factor in setting upper exposure limit Sakari Ailus
2026-07-02 17:10 ` Dave Stevenson
2026-07-01 12:26 ` [PATCH v6 03/16] media: imx219: Account for rate_factor in control steps Sakari Ailus
2026-07-02 17:09 ` Dave Stevenson
2026-07-01 12:26 ` [PATCH v6 04/16] media: imx219: The horizontal blanking step is 8 Sakari Ailus
2026-07-02 13:57 ` Dave Stevenson
2026-07-01 12:26 ` [PATCH v6 05/16] media: imx219: Rename "binning" as "bin_hv" in imx219_set_pad_format Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 06/16] media: Improve enable_streams and disable_streams documentation Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 07/16] media: v4l2-subdev: Move subdev client capabilities into a new struct Sakari Ailus
2026-07-01 16:17 ` Frank Li
2026-07-01 12:26 ` [PATCH v6 08/16] media: v4l2-subdev: Move op check to sub-device op wrappers Sakari Ailus
2026-07-01 16:37 ` Frank Li
2026-07-04 12:11 ` Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 09/16] media: v4l2-subdev: Always call get_fmt() if set_fmt() is unavailable Sakari Ailus
2026-07-01 16:42 ` Frank Li
2026-07-04 12:15 ` Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 10/16] media: rdacm20: Don't assign set_fmt() Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 11/16] " Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 12/16] media: gc0310: " Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 13/16] media: v4l2-subdev: Add v4l2_subdev_call_ci_state_{active,try} Sakari Ailus
2026-07-01 16:57 ` Frank Li
2026-07-04 12:16 ` Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 14/16] media: mt9m001: Pass sub-device state to set_selection() callback Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 15/16] media: cvs: Drop comments on sub-device operations Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 15/15] media: v4l2-subdev: Add struct v4l2_subdev_client_info pointer to pad ops Sakari Ailus
2026-07-01 17:00 ` Frank Li
2026-07-01 12:26 ` [PATCH v6 16/16] " Sakari Ailus
2026-07-01 17:01 ` Frank Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260610114846.GC1209951@killaraus.ideasonboard.com \
--to=laurent.pinchart@ideasonboard.com \
--cc=benjamin.mugnier@foss.st.com \
--cc=christophe.jaillet@wanadoo.fr \
--cc=dave.stevenson@raspberrypi.com \
--cc=david.plowman@raspberrypi.com \
--cc=dongcheng.yan@intel.com \
--cc=git@apitzsch.eu \
--cc=hans@jjverkuil.nl \
--cc=hansg@kernel.org \
--cc=heimir.sverrisson@gmail.com \
--cc=hpa@redhat.com \
--cc=jacopo.mondi@ideasonboard.com \
--cc=jai.luthra@ideasonboard.com \
--cc=julien.massot@collabora.com \
--cc=khai.wen.ng@intel.com \
--cc=kieran.bingham@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=mehdi.djait@linux.intel.com \
--cc=mirela.rabulea@nxp.com \
--cc=naush@raspberrypi.com \
--cc=ong.hock.yu@intel.com \
--cc=prabhakar.csengg@gmail.com \
--cc=r-donadkar@ti.com \
--cc=ribalda@kernel.org \
--cc=sakari.ailus@linux.intel.com \
--cc=stefan.klug@ideasonboard.com \
--cc=sylvain.petinot@foss.st.com \
--cc=tomi.valkeinen@ideasonboard.com \
--cc=tomm.merciai@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.