From: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
To: Loic Poulain <loic.poulain@oss.qualcomm.com>
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>,
Bryan O'Donoghue <bryan.odonoghue@linaro.org>,
Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>, Kees Cook <kees@kernel.org>,
"Gustavo A. R. Silva" <gustavoars@kernel.org>,
Bjorn Andersson <andersson@kernel.org>,
Konrad Dybcio <konradybcio@kernel.org>,
Bryan O'Donoghue <bod@kernel.org>,
Abel Vesa <abelvesa@kernel.org>,
linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org,
linux-hardening@vger.kernel.org,
Hans de Goede <johannes.goede@oss.qualcomm.com>
Subject: Re: [PATCH v13 4/9] media: uapi: Add CAMSS ISP configuration definition
Date: Wed, 4 Nov 2026 18:05:00 +0100 [thread overview]
Message-ID: <autlc2AfB8AZfb2H@zed> (raw)
In-Reply-To: <20261103-camss-isp-ope-v13-4-c2cbf15a39b1@oss.qualcomm.com>
Hi Loic
On Tue, Nov 03, 2026 at 09:05:48PM +0100, Loic Poulain wrote:
> Add the uapi header qcom-camss-config.h defining the ISP parameter
> structures used by the CAMSS Offline Processing Engine (OPE) driver.
> This includes structures for white balance, chroma enhancement and
> color correction configuration.
>
> The block type enum is shared across CAMSS ISPs so that userspace only
> has to deal with a single set of block identifiers.
>
> Reviewed-by: Hans de Goede <johannes.goede@oss.qualcomm.com>
> Tested-by: Hans de Goede <johannes.goede@oss.qualcomm.com>
> Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
> ---
> include/uapi/linux/qcom-camss-config.h | 217 +++++++++++++++++++++++++++++++++
> 1 file changed, 217 insertions(+)
>
> diff --git a/include/uapi/linux/qcom-camss-config.h b/include/uapi/linux/qcom-camss-config.h
> new file mode 100644
> index 0000000000000000000000000000000000000000..543c1682f8aed3b07d7085f54a24eb632ea190a8
> --- /dev/null
> +++ b/include/uapi/linux/qcom-camss-config.h
We have (kind of) recently introduced include/uapi/linux/media
This file should probably be:
include/uapi/linux/media/qcom/camss-config.h
> @@ -0,0 +1,217 @@
> +/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
> +/*
> + * Qualcomm CAMSS ISP Driver - Userspace API
> + *
> + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
> + */
> +
> +#ifndef _UAPI_LINUX_QCOM_CAMSS_CONFIG_H
> +#define _UAPI_LINUX_QCOM_CAMSS_CONFIG_H
> +
> +#include <linux/types.h>
> +#include <linux/media/v4l2-isp.h>
> +
> +/**
> + * enum camss_params_block_type - CAMSS ISP parameter block identifiers
> + *
> + * Each value identifies one ISP processing block. The value is placed in
> + * the @type field of &struct v4l2_isp_block_header.
> + *
> + * @CAMSS_PARAMS_WB_GAIN: white balance gains and offsets (CLC_WB),
> + * &struct camss_params_wb_gain
> + * @CAMSS_PARAMS_CHROMA_ENHAN: RGB to YUV colour transfer matrix
> + * (CLC_CHROMA_ENHAN), &struct camss_params_chroma_enhan
> + * @CAMSS_PARAMS_COLOR_CORRECT: colour correction matrix (CLC_CC),
> + * &struct camss_params_color_correct
> + * @CAMSS_PARAMS_GAMMA: per-channel gamma correction curves (CLC_GLUT),
> + * &struct camss_params_gamma
> + */
> +enum camss_params_block_type {
> + CAMSS_PARAMS_WB_GAIN = 1,
> + CAMSS_PARAMS_CHROMA_ENHAN = 2,
> + CAMSS_PARAMS_COLOR_CORRECT = 3,
> + CAMSS_PARAMS_GAMMA = 4,
> +};
> +
> +/* Number of entries in each gamma channel LUT. */
> +#define CAMSS_GAMMA_LUT_SIZE 256
> +
> +/**
> + * struct camss_params_wb_gain - White Balance gains
> + *
> + * Implements the CLC_WB pipeline module. The pipeline applies three
> + * sequential operations per channel::
> + *
> + * 1. Subtract sub-offset (black-level subtraction)
> + * 2. Multiply by gain (colour balance)
> + * 3. Add add-offset (output pedestal)
> + *
> + * Gains are 15uQ10 (15-bit unsigned, 10 fractional bits). Offsets
> + * are 16-bit unsigned, normalised to full input scale (65535 = 1.0)
> + *
> + * @header: block header; @header.type = CAMSS_PARAMS_WB_GAIN
> + * @g_gain: green channel gain (15uQ10, 1024 = 1.0)
> + * @b_gain: blue channel gain (15uQ10, 1024 = 1.0)
> + * @r_gain: red channel gain (15uQ10, 1024 = 1.0)
> + * @g_sub: green sub-offset, subtracted before gain (16u)
> + * @b_sub: blue sub-offset, subtracted before gain (16u)
> + * @r_sub: red sub-offset, subtracted before gain (16u)
> + * @g_add: green add-offset, added after gain (16u)
> + * @b_add: blue add-offset, added after gain (16u)
> + * @r_add: red add-offset, added after gain (16u)
> + * @_pad: padding for 64-bit alignment, must be zero
> + */
> +struct camss_params_wb_gain {
> + struct v4l2_isp_block_header header;
> + __u16 g_gain;
> + __u16 b_gain;
> + __u16 r_gain;
> + __u16 g_sub;
> + __u16 b_sub;
> + __u16 r_sub;
> + __u16 g_add;
> + __u16 b_add;
> + __u16 r_add;
> + __u16 _pad[3];
> +} __attribute__((aligned(8)));
> +
> +/**
> + * struct camss_params_chroma_enhan - RGB to YUV colour transfer matrix
> + *
> + * Implements the CLC_CHROMA_ENHAN pipeline module. All coefficients are
> + * signed 12-bit fixed-point Q3.8 (range roughly -8.0 to +7.996).
> + *
> + * RGB2Y - Luma (Y) coefficients::
> + *
> + * Y = v0 * R + v1 * G + v2 * B
> + *
> + * RGB2Cb - Chroma (Cb) coefficients::
> + *
> + * Cb = a x ((B - G) + b(R - G)) + KCb
> + * with:
> + * a = ap, when (B-G) + b(R-G) > 0; a = am, when (B-G) + b(R-G) ≤ 0;
> + * b = bp when (R-G) > 0; b = bm when (R-G) ≤ 0
> + *
> + * RGB2Cr - Chroma (Cr) coefficients::
> + *
> + * Cr = c x ((R - G) + d(B - G)) + KCr
> + * with:
> + * c = cp, when (R-G) + d(B-G) > 0; c = cm, when (R-G) + d(B-G) ≤ 0
> + * d = dp when (B-G) > 0; d = dm when (B-G) ≤ 0
> + *
> + * @header: generic block header; @header.type = CAMSS_PARAMS_CHROMA_ENHAN
> + * @luma_v0: R-to-Y coefficient (12sQ8)
> + * @luma_v1: G-to-Y coefficient (12sQ8)
> + * @luma_v2: B-to-Y coefficient (12sQ8)
> + * @luma_k: Y output offset (9s, 0 = no offset)
> + * @coeff_ap: Cb positive coefficient (12sQ8)
> + * @coeff_am: Cb negative coefficient (12sQ8)
> + * @coeff_bp: Cb positive coefficient (12sQ8)
> + * @coeff_bm: Cb negative coefficient (12sQ8)
> + * @coeff_cp: Cr positive coefficient (12sQ8)
> + * @coeff_cm: Cr negative coefficient (12sQ8)
> + * @coeff_dp: Cr positive coefficient (12sQ8)
> + * @coeff_dm: Cr negative coefficient (12sQ8)
> + * @kcb: Cb output offset (11s)
> + * @kcr: Cr output offset (11s)
> + * @_pad: padding for 64-bit alignment, must be zero
> + */
> +struct camss_params_chroma_enhan {
> + struct v4l2_isp_block_header header;
> + __s16 luma_v0;
> + __s16 luma_v1;
> + __s16 luma_v2;
> + __s16 luma_k;
> + __s16 coeff_ap;
> + __s16 coeff_am;
> + __s16 coeff_bp;
> + __s16 coeff_bm;
> + __s16 coeff_cp;
> + __s16 coeff_cm;
> + __s16 coeff_dp;
> + __s16 coeff_dm;
> + __s16 kcb;
> + __s16 kcr;
> + __u16 _pad[2];
> +} __attribute__((aligned(8)));
> +
> +/**
> + * struct camss_params_color_correct - colour correction matrix
> + *
> + * Implements the CLC_CC pipeline module. The matrix computes::
> + *
> + * Out_ch0 (G) = a0*G + b0*B + c0*R + k0
> + * Out_ch1 (B) = a1*G + b1*B + c1*R + k1
> + * Out_ch2 (R) = a2*G + b2*B + c2*R + k2
> + *
> + * The @qfactor member selects the fixed-point format of all coefficients::
> + *
> + * 0 = 12sQ7 (range ~-16.0 .. +15.992)
> + * 1 = 12sQ8 (range ~-8.0 .. +7.996)
> + * 2 = 12sQ9 (range ~-4.0 .. +3.998)
> + * 3 = 12sQ10 (range ~-2.0 .. +1.999)
> + *
> + * @header: block header; @header.type = CAMSS_PARAMS_COLOR_CORRECT
> + * @a: G-input coefficients per output channel (12s;
> + * a[0]=Out_G, a[1]=Out_B, a[2]=Out_R)
> + * @b: B-input coefficients (12s)
> + * @c: R-input coefficients (12s)
> + * @k: per-output-channel offsets (typically 9s effective)
> + * @qfactor: Q-format selector (2u), see above
> + * @_pad: padding for 64-bit alignment, must be zero
> + */
> +struct camss_params_color_correct {
> + struct v4l2_isp_block_header header;
> + __s16 a[3];
> + __s16 b[3];
> + __s16 c[3];
> + __s16 k[3];
> + __u16 qfactor;
> + __u16 _pad[3];
> +} __attribute__((aligned(8)));
> +
> +/**
> + * struct camss_params_gamma - per-channel gamma correction curves
> + *
> + * Implements the CLC_GLUT pipeline module, applied in the RGB domain. It
> + * holds one independent lookup table per colour channel. Each table is a
> + * direct (not segmented) map of input level to output level.
> + *
> + * Each table has @CAMSS_GAMMA_LUT_SIZE (256) entries of 16-bit unsigned
> + * output. The number of significant output bits follows the width of the
> + * engine's internal bus; the upper bits are ignored by the hardware.
> + *
> + * The module maps a 12-bit input to an 8-bit output: the top 8 input bits
> + * index the table and the low 4 bits are used to linearly interpolate
> + * between adjacent entries. Entry i therefore represents the output for
> + * input level i/255 of full scale.
> + * Output range: 0x00 = black, 0xFF = white.
> + *
> + * How to fill a curve (same on all three channels for pure luminance
> + * gamma; different curves per channel additionally shift colour balance)::
> + *
> + * Identity (pass-through, gamma 1.0):
> + * lut[i] = i; // i = 0..255
> + *
> + * Encode with gamma g (e.g. sRGB-like, g = 2.2):
> + * lut[i] = round(pow(i / 255.0, 1.0 / g) * 255.0);
> + *
> + * @header: block header; @header.type = CAMSS_PARAMS_GAMMA
> + * @glut: green channel gamma curve
> + * @blut: blue channel gamma curve
> + * @rlut: red channel gamma curve
> + */
> +struct camss_params_gamma {
> + struct v4l2_isp_block_header header;
> + __u16 glut[CAMSS_GAMMA_LUT_SIZE];
> + __u16 blut[CAMSS_GAMMA_LUT_SIZE];
> + __u16 rlut[CAMSS_GAMMA_LUT_SIZE];
> +} __attribute__((aligned(8)));
> +
> +#define CAMSS_PARAMS_OPE_MAX_PAYLOAD \
> + (sizeof(struct camss_params_wb_gain) +\
> + sizeof(struct camss_params_chroma_enhan) +\
> + sizeof(struct camss_params_color_correct) +\
> + sizeof(struct camss_params_gamma))
> +
> +#endif /* _UAPI_LINUX_QCOM_CAMSS_CONFIG_H */
>
> --
> 2.34.1
>
>
next prev parent reply other threads:[~2026-11-04 17:05 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-03 20:05 [PATCH v13 0/9] media: qcom: camss: CAMSS Offline Processing Engine support Loic Poulain
2026-11-03 20:05 ` [PATCH v13 1/9] media: qcom: camss: Add V4L2 meta format for CAMSS ISP parameters Loic Poulain
2026-11-03 20:05 ` [PATCH v13 2/9] dt-bindings: media: qcom: Add CAMSS Offline Processing Engine (OPE) Loic Poulain
2026-11-03 20:05 ` [PATCH v13 3/9] dt-bindings: media: qcom,qcm2290-camss-ope: Document shikra compatible Loic Poulain
2026-11-03 20:05 ` [PATCH v13 4/9] media: uapi: Add CAMSS ISP configuration definition Loic Poulain
2026-11-04 17:05 ` Jacopo Mondi [this message]
2026-11-03 20:05 ` [PATCH v13 5/9] media: Documentation: uapi: Add qcom-camss ISP params documentation Loic Poulain
2026-11-03 20:05 ` [PATCH v13 6/9] media: qcom: camss: Add CAMSS Offline Processing Engine driver Loic Poulain
2026-11-03 20:41 ` sashiko-bot
2026-11-03 20:05 ` [PATCH v13 7/9] arm64: dts: qcom: agatti: Add OPE node Loic Poulain
2026-11-03 20:18 ` sashiko-bot
2026-11-03 20:05 ` [PATCH v13 8/9] arm64: dts: qcom: shikra: " Loic Poulain
2026-11-03 20:05 ` [PATCH v13 9/9] arm64: defconfig: Enable Qualcomm CAMSS OPE driver Loic Poulain
2026-11-03 20:51 ` sashiko-bot
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=autlc2AfB8AZfb2H@zed \
--to=jacopo.mondi@ideasonboard.com \
--cc=abelvesa@kernel.org \
--cc=andersson@kernel.org \
--cc=bod@kernel.org \
--cc=bryan.odonoghue@linaro.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=gustavoars@kernel.org \
--cc=johannes.goede@oss.qualcomm.com \
--cc=kees@kernel.org \
--cc=konradybcio@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=loic.poulain@oss.qualcomm.com \
--cc=mchehab@kernel.org \
--cc=robh@kernel.org \
--cc=vladimir.zapolskiy@linaro.org \
/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