Linux Media Controller development
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Cc: Sakari Ailus <sakari.ailus@iki.fi>,
	Hans Verkuil <hverkuil-cisco@xs4all.nl>,
	Linux Media Mailing List <linux-media@vger.kernel.org>,
	Stefan Klug <stefan.klug@ideasonboard.com>,
	Paul Elder <paul.elder@ideasonboard.com>,
	Daniel Scally <dan.scally@ideasonboard.com>,
	Kieran Bingham <kieran.bingham@ideasonboard.com>,
	Umang Jain <umang.jain@ideasonboard.com>,
	Dafna Hirschfeld <dafna@fastmail.com>,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	Heiko Stuebner <heiko@sntech.de>
Subject: Re: [PATCH v7 01/12] media: uapi: rkisp1-config: Add extensible params format
Date: Tue, 6 Aug 2024 11:52:04 +0300	[thread overview]
Message-ID: <20240806085204.GA21319@pendragon.ideasonboard.com> (raw)
In-Reply-To: <oxmlxkhyapax3rzzuouy3gyrr5bysjlhit6hnouzakxrdf7sog@dv3a5to7lvuc>

On Tue, Aug 06, 2024 at 09:30:16AM +0200, Jacopo Mondi wrote:
> On Mon, Aug 05, 2024 at 11:52:29AM GMT, Sakari Ailus wrote:
> > On Tue, Jul 30, 2024 at 02:37:04PM +0200, Hans Verkuil wrote:
> > > On 30/07/2024 14:18, Laurent Pinchart wrote:
> > > > On Tue, Jul 30, 2024 at 02:11:12PM +0200, Hans Verkuil wrote:
> > > >> On 24/07/2024 10:49, Jacopo Mondi wrote:
> > > >>> Add to the rkisp1-config.h header data types and documentation of
> > > >>> the extensible parameters format.
> > > >>>
> > > >>> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
> > > >>> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > > >>> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
> > > >>> ---
> > > >>>  include/uapi/linux/rkisp1-config.h | 489 +++++++++++++++++++++++++++++
> > > >>>  1 file changed, 489 insertions(+)
> > > >>>
> > > >>> diff --git a/include/uapi/linux/rkisp1-config.h b/include/uapi/linux/rkisp1-config.h
> > > >>> index 6eeaf8bf2362..00b09c92cca7 100644
> > > >>> --- a/include/uapi/linux/rkisp1-config.h
> > > >>> +++ b/include/uapi/linux/rkisp1-config.h
> > > >>> @@ -996,4 +996,493 @@ struct rkisp1_stat_buffer {
> > > >>>  	struct rkisp1_cif_isp_stat params;
> > > >>>  };
> > > >>>
> > > >>> +/*---------- PART3: Extensible Configuration Parameters  ------------*/
> > > >>> +
> > > >>> +/**
> > > >>> + * enum rkisp1_ext_params_block_type - RkISP1 extensible params block type
> > > >>> + *
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_BLS: Black level subtraction
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_DPCC: Defect pixel cluster correction
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_SDG: Sensor de-gamma
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_AWB_GAIN: Auto white balance gains
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_FLT: ISP filtering
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_BDM: Bayer de-mosaic
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_CTK: Cross-talk correction
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_GOC: Gamma out correction
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_DPF: De-noise pre-filter
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_DPF_STRENGTH: De-noise pre-filter strength
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_CPROC: Color processing
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_IE: Image effects
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_LSC: Lens shading correction
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_AWB_MEAS: Auto white balance statistics
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_HST_MEAS: Histogram statistics
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_AEC_MEAS: Auto exposure statistics
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_TYPE_AFC_MEAS: Auto-focus statistics
> > > >>> + */
> > > >>> +enum rkisp1_ext_params_block_type {
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_BLS,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_DPCC,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_SDG,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_AWB_GAIN,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_FLT,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_BDM,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_CTK,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_GOC,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_DPF,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_DPF_STRENGTH,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_CPROC,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_IE,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_LSC,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_AWB_MEAS,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_HST_MEAS,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_AEC_MEAS,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_TYPE_AFC_MEAS,
> > > >>> +};
> > > >>> +
> > > >>> +/**
> > > >>> + * enum rkisp1_ext_params_block_enable - RkISP1 extensible parameter block
> > > >>> + *					 enable flags
> > > >>> + *
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_DISABLE: Disable the HW block
> > > >>> + * @RKISP1_EXT_PARAMS_BLOCK_ENABLE: Enable the HW block
> > > >>> + */
> > > >>> +enum rkisp1_ext_params_block_enable {
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_DISABLE,
> > > >>> +	RKISP1_EXT_PARAMS_BLOCK_ENABLE,
> > > >>> +};
> > > >>> +
> > > >>> +/**
> > > >>> + * struct rkisp1_ext_params_block_header - RkISP1 extensible parameter block
> > > >>> + *					   header
> > > >>> + *
> > > >>> + * This structure represents the common part of all the ISP configuration
> > > >>> + * blocks. Each parameters block shall embed an instance of this structure type
> > > >>> + * as its first member, followed by the block-specific configuration data. The
> > > >>> + * driver inspects this common header to discern the block type and its size and
> > > >>> + * properly handle the block content by casting it to the correct block-specific
> > > >>> + * type.
> > > >>> + *
> > > >>> + * The @type field is one of the values enumerated by
> > > >>> + * :c:type:`rkisp1_ext_params_block_type` and specifies how the data should be
> > > >>> + * interpreted by the driver. The @size field specifies the size of the
> > > >>> + * parameters block and is used by the driver for validation purposes.
> > > >>> + *
> > > >>> + * The @enable field specifies the ISP block enablement state. The possible
> > > >>> + * enablement states are enumerated by :c:type:`rkisp1_ext_params_block_enable`.
> > > >>> + * When userspace needs to configure and enable an ISP block it shall fully
> > > >>> + * populate the block configuration and the @enable flag shall be set to
> > > >>> + * RKISP1_EXT_PARAMS_BLOCK_ENABLE. When userspace simply wants to disable the
> > > >>> + * ISP block the @enable flag shall be set to RKISP1_EXT_PARAMS_BLOCK_DISABLE.
> > > >>> + * The driver ignores the rest of the block configuration structure in this
> > > >>> + * case.
> > > >>> + *
> > > >>> + * If a new configuration of an ISP block has to be applied userspace shall
> > > >>> + * fully populate the ISP block configuration and set the @enable flag to
> > > >>> + * RKISP1_EXT_PARAMS_BLOCK_ENABLE.
> > > >>> + *
> > > >>> + * Userspace is responsible for correctly populating the parameters block header
> > > >>> + * fields (@type, @enable and @size) and the block-specific parameters.
> > > >>> + *
> > > >>> + * For example:
> > > >>> + *
> > > >>> + * .. code-block:: c
> > > >>> + *
> > > >>> + *	void populate_bls(struct rkisp1_ext_params_block_header *block) {
> > > >>> + *		struct rkisp1_ext_params_bls_config *bls =
> > > >>> + *			(struct rkisp1_ext_params_bls_config *)block;
> > > >>> + *
> > > >>> + *		bls->header.type = RKISP1_EXT_PARAMS_BLOCK_ID_BLS;
> > > >>> + *		bls->header.enable = RKISP1_EXT_PARAMS_BLOCK_ENABLE;
> > > >>> + *		bls->header.size = sizeof(*bls);
> > > >>> + *
> > > >>> + *		bls->config.enable_auto = 0;
> > > >>> + *		bls->config.fixed_val.r = blackLevelRed_;
> > > >>> + *		bls->config.fixed_val.gr = blackLevelGreenR_;
> > > >>> + *		bls->config.fixed_val.gb = blackLevelGreenB_;
> > > >>> + *		bls->config.fixed_val.b = blackLevelBlue_;
> > > >>> + *	}
> > > >>> + *
> > > >>> + * @type: The parameters block type, see
> > > >>> + *	  :c:type:`rkisp1_ext_params_block_type`
> > > >>> + * @enable: The block enable flag, see
> > > >>> + *	   :c:type:`rkisp1_ext_params_block_enable`
> > > >>> + * @size: Size (in bytes) of the parameters block, including this header
> > > >>> + */
> > > >>> +struct rkisp1_ext_params_block_header {
> > > >>> +	__u16 type;
> > > >>> +	__u16 enable;
> > > >>> +	__u16 size;
> > > >>
> > > >> I would suggest changing this to '__u32 size;'. It ensures the header is8 bytes
> > > >> long (much nicer than 6), and if there is ever a block > 65535, then it is supported.
> > > >
> > > > I'm pretty confident we will never need a block size larger than 64kB.
> > >
> > > Hmm, famous last words :-)
> > >
> > > > That would mean more than 64kB of data written to hardware
> > > > registers/SRAM for a single processing block, and it would be incredibly
> > > > expensive in terms of hardware. Keeping size a __u16 means we have two
> > > > bytes of reserved space we could possibly use later, which may come
> > > > handy.
> > >
> > > i would prefer to change the size to a u32, but rename the 'enable' field
> > > to 'flags', and assign bit 0 to the enable/disable bit. This is a bit
> > > more flexible IMHO and allows for 15 bits to encode additional data.
> > >
> > >  Blocks > 64kB could still be supported in the future by defining
> > > > a new version of the parameters format (RKISP1_EXT_PARAM_BUFFER_V2)
> > > > without needing a different 4CC.
> >
> > ...or making of use the existing padding. Shouldn't that be a reserved
> > field btw.?
> 
> I might have missed what padding to be made a reserved field you are
> referring to :)

The two bytes at the end of the structure, after the size field.

> > I'm fine either approach, perhaps leaning slightly towards u32 size.
> >
> > For the series:
> >
> > Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> >
> > > > This being said, the opposite argument can be made, that a 32-bit size
> > > > could come handy if we ever have larger blocks, and a new version of the
> > > > parameters format could be used if we ever need to add more fields to
> > > > the block header. I won't insist either way.
> > > >
> > > >> i wonder if, with this change, the 'aligned(8)' attributes are even needed, but
> > > >> I didn't dig into that.
> > > >
> > > > The header would become 8-bytes long, but its larger field would still
> > > > be 4-bytes long, so the compiler would only enforce 4-bytes aligned
> > > > AFAIK.
> > >
> > > Normally the actual data blocks (in the non-extensible format) are already aligned
> > > to either 4 or 8 bytes (depending on whether u64 values are used). So an 8 byte
> > > header won't mess up the alignment.

-- 
Regards,

Laurent Pinchart

  reply	other threads:[~2024-08-06  8:52 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-24  8:49 [PATCH v7 0/12] media: rkisp1: Extensible parameters and companding Jacopo Mondi
2024-07-24  8:49 ` [PATCH v7 01/12] media: uapi: rkisp1-config: Add extensible params format Jacopo Mondi
2024-07-30 12:11   ` Hans Verkuil
2024-07-30 12:14     ` Hans Verkuil
2024-07-30 12:19       ` Laurent Pinchart
2024-07-30 12:18     ` Laurent Pinchart
2024-07-30 12:37       ` Hans Verkuil
2024-08-05 11:52         ` Sakari Ailus
2024-08-06  7:30           ` Jacopo Mondi
2024-08-06  8:52             ` Laurent Pinchart [this message]
2024-08-06  8:53             ` Sakari Ailus
2024-08-06  9:05               ` Jacopo Mondi
2024-08-06  7:27         ` Jacopo Mondi
2024-08-06  8:17           ` Hans Verkuil
2024-08-06  8:24             ` Jacopo Mondi
2024-08-06  9:06               ` Laurent Pinchart
2024-08-06  9:16                 ` Jacopo Mondi
2024-08-06  9:32                   ` Laurent Pinchart
2024-08-06 11:20                     ` Sakari Ailus
2024-07-24  8:49 ` [PATCH v7 02/12] media: uapi: videodev2: Add V4L2_META_FMT_RK_ISP1_EXT_PARAMS Jacopo Mondi
2024-07-24  8:49 ` [PATCH v7 03/12] media: rkisp1: Add struct rkisp1_params_buffer Jacopo Mondi
2024-07-24  8:49 ` [PATCH v7 04/12] media: rkisp1: Copy the parameters buffer Jacopo Mondi
2024-07-24  8:49 ` [PATCH v7 05/12] media: rkisp1: Cache the currently active format Jacopo Mondi
2024-07-24  8:49 ` [PATCH v7 06/12] media: rkisp1: Implement extensible params support Jacopo Mondi
2024-07-24  8:49 ` [PATCH v7 07/12] media: rkisp1: Implement s_fmt/try_fmt Jacopo Mondi
2024-07-24  8:49 ` [PATCH v7 08/12] media: rkisp1: Add helper function to swap colour channels Jacopo Mondi
2024-07-24  8:50 ` [PATCH v7 09/12] media: rkisp1: Add features mask to extensible block handlers Jacopo Mondi
2024-07-24  8:50 ` [PATCH v7 10/12] media: rkisp1: Add register definitions for the companding block Jacopo Mondi
2024-07-24  8:50 ` [PATCH v7 11/12] media: rkisp1: Add feature flags for BLS and compand Jacopo Mondi
2024-07-24  8:50 ` [PATCH v7 12/12] media: rkisp1: Add support for the companding block Jacopo Mondi
2024-07-24 10:44 ` [PATCH v7 0/12] media: rkisp1: Extensible parameters and companding Kieran Bingham

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=20240806085204.GA21319@pendragon.ideasonboard.com \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=dafna@fastmail.com \
    --cc=dan.scally@ideasonboard.com \
    --cc=heiko@sntech.de \
    --cc=hverkuil-cisco@xs4all.nl \
    --cc=jacopo.mondi@ideasonboard.com \
    --cc=kieran.bingham@ideasonboard.com \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@kernel.org \
    --cc=paul.elder@ideasonboard.com \
    --cc=sakari.ailus@iki.fi \
    --cc=stefan.klug@ideasonboard.com \
    --cc=umang.jain@ideasonboard.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox