[v8 11/14] media: rppx1: ga: Add support for gamma out correction

Niklas Söderlund
2026-05-04T01:09:19Z

Extend the RPPX1 driver to allow setting the gamma out correction
configuration parameters. It uses the RPPX1 framework for parameters and
its writer abstraction to allow the user to control how, and when,
configuration is applied to the RPPX1.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Co-developed-by: Jai Luthra <jai.luthra+renesas@ideasonboard.com>
Signed-off-by: Jai Luthra <jai.luthra+renesas@ideasonboard.com>
---
.../platform/dreamchip/rppx1/rpp_module.h | 1 +
.../platform/dreamchip/rppx1/rpp_params.c | 5 ++
.../media/platform/dreamchip/rppx1/rppx1_ga.c | 43 ++++++++++++++-
.../uapi/linux/media/dreamchip/rppx1-config.h | 53 ++++++++++++++++++-
4 files changed, 100 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/dreamchip/rppx1/rpp_module.h b/drivers/media/platform/dreamchip/rppx1/rpp_module.h
index 11c38ea843f4..830ef0df7228 100644
--- a/drivers/media/platform/dreamchip/rppx1/rpp_module.h
+++ b/drivers/media/platform/dreamchip/rppx1/rpp_module.h
@@ -92,6 +92,7 @@ union rppx1_params_block {
struct rppx1_hist_params hist;
struct rppx1_exm_params exm;
struct rppx1_wbmeas_params wbmeas;
+ struct rppx1_ga_params ga;
};

union rppx1_stats_block {
diff --git a/drivers/media/platform/dreamchip/rppx1/rpp_params.c b/drivers/media/platform/dreamchip/rppx1/rpp_params.c
index f66640aff5b7..317ed715f1de 100644
--- a/drivers/media/platform/dreamchip/rppx1/rpp_params.c
+++ b/drivers/media/platform/dreamchip/rppx1/rpp_params.c
@@ -29,6 +29,8 @@ rppx1_ext_params_blocks_info[] = {
RPPX1_PARAMS_BLOCK_INFO(EXM_PRE1, exm),
RPPX1_PARAMS_BLOCK_INFO(EXM_PRE2, exm),
RPPX1_PARAMS_BLOCK_INFO(WBMEAS_POST, wbmeas),
+ RPPX1_PARAMS_BLOCK_INFO(GA_HV, ga),
+ RPPX1_PARAMS_BLOCK_INFO(GA_MV, ga),
};

int rppx1_params(struct rppx1 *rpp, struct vb2_buffer *vb, size_t max_size,
@@ -84,6 +86,9 @@ int rppx1_params(struct rppx1 *rpp, struct vb2_buffer *vb, size_t max_size,
case RPPX1_PARAMS_BLOCK_TYPE_WBMEAS_POST:
module = &rpp->post.wbmeas;
break;
+ case RPPX1_PARAMS_BLOCK_TYPE_GA_HV:
+ module = &rpp->hv.ga;
+ break;
default:
module = NULL;
break;
diff --git a/drivers/media/platform/dreamchip/rppx1/rppx1_ga.c b/drivers/media/platform/dreamchip/rppx1/rppx1_ga.c
index d6c7f951cf29..5dec868c1ed7 100644
--- a/drivers/media/platform/dreamchip/rppx1/rppx1_ga.c
+++ b/drivers/media/platform/dreamchip/rppx1/rppx1_ga.c
@@ -14,9 +14,11 @@
#define GAMMA_OUT_MODE_REG 0x0008
#define GAMMA_OUT_MODE_GAMMA_OUT_EQU_SEGM BIT(0)

-#define GAMMA_OUT_Y_REG_NUM 17
#define GAMMA_OUT_Y_REG(n) (0x000c + (4 * (n)))

+#define GAMMA_OUT_HV_GAMMA_CURVE_MASK GENMASK(11, 0)
+#define GAMMA_OUT_MV_GAMMA_CURVE_MASK GENMASK(23, 0)
+
static int rppx1_ga_probe(struct rpp_module *mod)
{
/* Version check. */
@@ -43,7 +45,46 @@ static int rppx1_ga_start(struct rpp_module *mod,
return 0;
}

+static int
+rppx1_ga_fill_params(struct rpp_module *mod,
+ const union rppx1_params_block *block,
+ rppx1_reg_write write, void *priv)
+{
+ const struct rppx1_ga_params *cfg = &block->ga;
+ u32 mask;
+
+ /* If the modules is disabled, simply bypass it. */
+ if (cfg->header.flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) {
+ write(priv, mod->base + GAMMA_OUT_ENABLE_REG, 0);
+ return 0;
+ }
+
+ switch (cfg->header.type) {
+ case RPPX1_PARAMS_BLOCK_TYPE_GA_HV:
+ mask = GAMMA_OUT_HV_GAMMA_CURVE_MASK;
+ break;
+ case RPPX1_PARAMS_BLOCK_TYPE_GA_MV:
+ mask = GAMMA_OUT_MV_GAMMA_CURVE_MASK;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ write(priv, mod->base + GAMMA_OUT_MODE_REG, cfg->mode);
+
+ for (unsigned int i = 0; i < RPPX1_GA_MAX_SAMPLES; i++)
+ write(priv, mod->base + GAMMA_OUT_Y_REG(i),
+ cfg->gamma_y[i] & mask);
+
+ /* Enable module. */
+ write(priv, mod->base + GAMMA_OUT_ENABLE_REG,
+ GAMMA_OUT_ENABLE_GAMMA_OUT_EN);
+
+ return 0;
+}
+
const struct rpp_module_ops rppx1_ga_ops = {
.probe = rppx1_ga_probe,
.start = rppx1_ga_start,
+ .fill_params = rppx1_ga_fill_params,
};
diff --git a/include/uapi/linux/media/dreamchip/rppx1-config.h b/include/uapi/linux/media/dreamchip/rppx1-config.h
index e9d8c379bd50..d173c0c1bfc0 100644
--- a/include/uapi/linux/media/dreamchip/rppx1-config.h
+++ b/include/uapi/linux/media/dreamchip/rppx1-config.h
@@ -89,6 +89,8 @@ enum rppx1_meas_chan {
* @RPPX1_PARAMS_BLOCK_TYPE_CCOR_POST: POST pipe Color Correction
* @RPPX1_PARAMS_BLOCK_TYPE_LSC_PRE1: PRE1 pipe Lens Shading Correction
* @RPPX1_PARAMS_BLOCK_TYPE_LSC_PRE2: PRE2 Lens Shading Correction
+ * @RPPX1_PARAMS_BLOCK_TYPE_GA_HV: Human Vision Pipe Gamma Out Correction
+ * @RPPX1_PARAMS_BLOCK_TYPE_GA_MV: Machine Vision Gamma Out Correction
*/
enum rppx1_params_block_type {
RPPX1_PARAMS_BLOCK_TYPE_WBMEAS_POST,
@@ -105,6 +107,8 @@ enum rppx1_params_block_type {
RPPX1_PARAMS_BLOCK_TYPE_CCOR_POST,
RPPX1_PARAMS_BLOCK_TYPE_LSC_PRE1,
RPPX1_PARAMS_BLOCK_TYPE_LSC_PRE2,
+ RPPX1_PARAMS_BLOCK_TYPE_GA_HV,
+ RPPX1_PARAMS_BLOCK_TYPE_GA_MV,
};

/**
@@ -495,6 +499,51 @@ struct rppx1_lsc_params {
__u16 y_sect_size[RPPX1_LSC_NUM_SECTORS];
};

+/* Gamma Out */
+#define RPPX1_GA_MAX_SAMPLES 17
+
+/**
+ * enum rppx1_ga_seg_mode - Gamma out curve segmentation mode
+ *
+ * Segmentation mode of the 16 input sampling points for the Gamma Out
+ * Correction module.
+ *
+ * @RPPX1_GA_SEG_MODE_LOGARITHMIC: logarithmic-like segmentation mode
+ * @RPPX1_GA_SEG_MODE_EQUIDISTANT: equidistant segmentation mode
+ */
+enum rppx1_ga_seg_mode {
+ RPPX1_GA_SEG_MODE_LOGARITHMIC,
+ RPPX1_GA_SEG_MODE_EQUIDISTANT
+};
+
+/**
+ * struct rppx1_ga_params - Gamma Out Correction configuration
+ *
+ * The Gamma Out Correction module is available on the Human Vision Output
+ * Pipe (HV) and the Machine Vision Output Pipe (MV). Userspace selects
+ * which pipe to operate by setting the @header.type field to
+ * RPPX1_PARAMS_BLOCK_TYPE_GA_HV or RPPX1_PARAMS_BLOCK_TYPE_GA_MV.
+ *
+ * The module allows to apply a @gamma_y gamma correction curve to RGB data
+ * represented as a table of 16 entries. The 16 input sampling points can be
+ * equidistant or segmented using a logarithmic scale according to the value of
+ * @mode.
+ *
+ * The gamma curve values are 12 bits on the HV output pipe and 24 bits on the
+ * MV output pipe. Userspace is expected to provide the curve values with a
+ * bit-depth matching the one of pipe in use.
+ *
+ * @header: block header (type = RPPX1_PARAMS_BLOCK_TYPE_GA_HV or
+ * type = RPPX1_PARAMS_BLOCK_TYPE_GA_MV)
+ * @mode: gamma curve input segmentation mode (see rppx1_ga_seg_mode)
+ * @gamma_y: gamma out curve y-axis values
+ */
+struct rppx1_ga_params {
+ struct v4l2_isp_params_block_header header;
+ __u8 mode;
+ __u32 gamma_y[RPPX1_GA_MAX_SAMPLES];
+};
+
/**
* RPPX1_PARAMS_MAX_SIZE - Maximum size of all RPP-X1 parameter blocks
*
@@ -515,7 +564,9 @@ struct rppx1_lsc_params {
sizeof(struct rppx1_bls_params) + \
sizeof(struct rppx1_ccor_params) + \
sizeof(struct rppx1_lsc_params) + \
- sizeof(struct rppx1_lsc_params))
+ sizeof(struct rppx1_lsc_params) + \
+ sizeof(struct rppx1_ga_params) + \
+ sizeof(struct rppx1_ga_params))

/* ---------------------------------------------------------------------------
* Statistics Structures
--
2.54.0