* [PATCH v2 0/2] media: mali-c55: Add support for CCM and Gamma
@ 2026-06-16 14:36 Jacopo Mondi
2026-06-16 14:36 ` [PATCH v2 1/2] media: arm: mali-c55: Add support for CCM Jacopo Mondi
` (2 more replies)
0 siblings, 3 replies; 15+ messages in thread
From: Jacopo Mondi @ 2026-06-16 14:36 UTC (permalink / raw)
To: Nayden.Kanchev, Konstantin Babin, Anthony McGivern,
vincenzo.frascino, linus.walleij, Daniel Scally,
Mauro Carvalho Chehab
Cc: linux-media, linux-kernel, Jacopo Mondi, Jacopo Mondi
Add support for Ccm and Gamma to the Mali-C55 ISP by defining the
corresponding blocks in the uAPI and implementing their handling in
the driver.
Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
---
Changes in v2:
- EDITME: describe what is new in this series revision.
- EDITME: use bulletpoints and terse descriptions.
- Link to v1: https://lore.kernel.org/r/20260616-mali-c55-ccm-gamma-v1-0-174fe4fedea3@ideasonboard.com
---
Jacopo Mondi (2):
media: arm: mali-c55: Add support for CCM
media: arm: mali-c55: Add support for RGB Gamma
.../media/platform/arm/mali-c55/mali-c55-params.c | 127 +++++++++++++++++++++
.../platform/arm/mali-c55/mali-c55-registers.h | 5 +
include/uapi/linux/media/arm/mali-c55-config.h | 84 +++++++++++++-
3 files changed, 215 insertions(+), 1 deletion(-)
---
base-commit: 06cb687a5132fcffe624c0070576ab852ac6b568
change-id: 20260616-mali-c55-ccm-gamma-c02a0df59f98
Best regards,
--
Jacopo Mondi <jacopo.mondi@ideasonboard.com>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 1/2] media: arm: mali-c55: Add support for CCM
2026-06-16 14:36 [PATCH v2 0/2] media: mali-c55: Add support for CCM and Gamma Jacopo Mondi
@ 2026-06-16 14:36 ` Jacopo Mondi
2026-06-25 22:35 ` Linus Walleij
2026-06-26 9:44 ` Vincenzo Frascino
2026-06-16 14:36 ` [PATCH v2 2/2] media: arm: mali-c55: Add support for RGB Gamma Jacopo Mondi
2026-06-18 13:28 ` [PATCH v2 0/2] media: mali-c55: Add support for CCM and Gamma Linus Walleij
2 siblings, 2 replies; 15+ messages in thread
From: Jacopo Mondi @ 2026-06-16 14:36 UTC (permalink / raw)
To: Nayden.Kanchev, Konstantin Babin, Anthony McGivern,
vincenzo.frascino, linus.walleij, Daniel Scally,
Mauro Carvalho Chehab
Cc: linux-media, linux-kernel, Jacopo Mondi, Jacopo Mondi
From: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
Add support for the CCM (Color Correction Matrix) for the Mali C55 ISP.
Define a new block in the uAPI using the extensible v4l2-isp format and
implement support for configuring the CCM parameters in the mali-c55
ISP driver.
Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
---
.../media/platform/arm/mali-c55/mali-c55-params.c | 52 ++++++++++++++++++++++
include/uapi/linux/media/arm/mali-c55-config.h | 41 ++++++++++++++++-
2 files changed, 92 insertions(+), 1 deletion(-)
diff --git a/drivers/media/platform/arm/mali-c55/mali-c55-params.c b/drivers/media/platform/arm/mali-c55/mali-c55-params.c
index de0e9d898db7..96f1b28a6d77 100644
--- a/drivers/media/platform/arm/mali-c55/mali-c55-params.c
+++ b/drivers/media/platform/arm/mali-c55/mali-c55-params.c
@@ -46,6 +46,7 @@
* @awb_config: For header->type == MALI_C55_PARAM_BLOCK_AWB_CONFIG
* @shading_config: For header->type == MALI_C55_PARAM_MESH_SHADING_CONFIG
* @shading_selection: For header->type == MALI_C55_PARAM_MESH_SHADING_SELECTION
+ * @ccm: For header->type == MALI_C55_PARAM_BLOCK_CCM
* @data: Allows easy initialisation of a union variable with a
* pointer into a __u8 array.
*/
@@ -59,6 +60,7 @@ union mali_c55_params_block {
const struct mali_c55_params_awb_config *awb_config;
const struct mali_c55_params_mesh_shading_config *shading_config;
const struct mali_c55_params_mesh_shading_selection *shading_selection;
+ const struct mali_c55_params_ccm *ccm;
const __u8 *data;
};
@@ -414,6 +416,52 @@ static void mali_c55_params_lsc_selection(struct mali_c55 *mali_c55,
params->mesh_strength);
}
+static void mali_c55_params_ccm(struct mali_c55 *mali_c55,
+ union mali_c55_params_block block)
+{
+ const struct mali_c55_params_ccm *params = block.ccm;
+
+ if (block.header->flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) {
+ mali_c55_ctx_write(mali_c55, MALI_C55_REG_CCM_ENABLE, 0);
+ return;
+ }
+
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_R_R,
+ MALI_C55_CCM_COEF_MASK, params->coeffs[0][0]);
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_R_G,
+ MALI_C55_CCM_COEF_MASK, params->coeffs[0][1]);
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_R_B,
+ MALI_C55_CCM_COEF_MASK, params->coeffs[0][2]);
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_G_R,
+ MALI_C55_CCM_COEF_MASK, params->coeffs[1][0]);
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_G_G,
+ MALI_C55_CCM_COEF_MASK, params->coeffs[1][1]);
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_G_B,
+ MALI_C55_CCM_COEF_MASK, params->coeffs[1][2]);
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_B_R,
+ MALI_C55_CCM_COEF_MASK, params->coeffs[2][0]);
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_B_G,
+ MALI_C55_CCM_COEF_MASK, params->coeffs[2][1]);
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_B_B,
+ MALI_C55_CCM_COEF_MASK, params->coeffs[2][2]);
+
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_GAIN_R,
+ MALI_C55_CCM_ANTIFOG_GAIN_MASK, params->gains[0]);
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_GAIN_G,
+ MALI_C55_CCM_ANTIFOG_GAIN_MASK, params->gains[1]);
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_GAIN_B,
+ MALI_C55_CCM_ANTIFOG_GAIN_MASK, params->gains[2]);
+
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_OFFSET_R,
+ MALI_C55_CCM_ANTIFOG_OFFSET_MASK, params->offs[0]);
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_OFFSET_G,
+ MALI_C55_CCM_ANTIFOG_OFFSET_MASK, params->offs[1]);
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_OFFSET_B,
+ MALI_C55_CCM_ANTIFOG_OFFSET_MASK, params->offs[2]);
+
+ mali_c55_ctx_write(mali_c55, MALI_C55_REG_CCM_ENABLE, 1);
+}
+
static const mali_c55_params_handler mali_c55_params_handlers[] = {
[MALI_C55_PARAM_BLOCK_SENSOR_OFFS] = &mali_c55_params_sensor_offs,
[MALI_C55_PARAM_BLOCK_AEXP_HIST] = &mali_c55_params_aexp_hist,
@@ -426,6 +474,7 @@ static const mali_c55_params_handler mali_c55_params_handlers[] = {
[MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP] = &mali_c55_params_awb_gains,
[MALI_C55_PARAM_MESH_SHADING_CONFIG] = &mali_c55_params_lsc_config,
[MALI_C55_PARAM_MESH_SHADING_SELECTION] = &mali_c55_params_lsc_selection,
+ [MALI_C55_PARAM_BLOCK_CCM] = &mali_c55_params_ccm,
};
static const struct v4l2_isp_params_block_type_info
@@ -463,6 +512,9 @@ mali_c55_params_block_types_info[] = {
[MALI_C55_PARAM_MESH_SHADING_SELECTION] = {
.size = sizeof(struct mali_c55_params_mesh_shading_selection),
},
+ [MALI_C55_PARAM_BLOCK_CCM] = {
+ .size = sizeof(struct mali_c55_params_ccm),
+ },
};
static_assert(ARRAY_SIZE(mali_c55_params_handlers) ==
diff --git a/include/uapi/linux/media/arm/mali-c55-config.h b/include/uapi/linux/media/arm/mali-c55-config.h
index 3d335f950eeb..0b2085eed81b 100644
--- a/include/uapi/linux/media/arm/mali-c55-config.h
+++ b/include/uapi/linux/media/arm/mali-c55-config.h
@@ -219,6 +219,7 @@ struct mali_c55_stats_buffer {
* @MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP: Auto-white balance gains for AEXP-0 tap
* @MALI_C55_PARAM_MESH_SHADING_CONFIG : Mesh shading tables configuration
* @MALI_C55_PARAM_MESH_SHADING_SELECTION: Mesh shading table selection
+ * @MALI_C55_PARAM_BLOCK_CCM: Colour correction matrix
*/
enum mali_c55_param_block_type {
MALI_C55_PARAM_BLOCK_SENSOR_OFFS,
@@ -232,6 +233,7 @@ enum mali_c55_param_block_type {
MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP,
MALI_C55_PARAM_MESH_SHADING_CONFIG,
MALI_C55_PARAM_MESH_SHADING_SELECTION,
+ MALI_C55_PARAM_BLOCK_CCM,
};
/**
@@ -757,6 +759,42 @@ struct mali_c55_params_mesh_shading_selection {
__u16 mesh_strength;
};
+/**
+ * struct mali_c55_params_ccm - Coefficients, offsets and gains for the colour
+ * correction matrix
+ *
+ * The colour correction module converts images data from a sensor-specific
+ * colour space to known one.
+ *
+ * Colour correction is applied after demosaicing and each pixel is represented
+ * as a column vector of the three RGB colour channels on which the following
+ * operations take place:
+ * 1) An offset is subtracted from each colour channel
+ * 2) Each colour channel is multiplied by a gain
+ * 3) The pixel column vector is multiplied by the colour correction matrix
+ *
+ * This struct allows users to configure the coefficients for CCM and the
+ * per-channel offsets and gains. The nine matrix coefficients are expressed as
+ * signed Q4.8 Sign/Magnitude fixed-point numbers, the three gain multipliers
+ * are expressed as unsigned Q4.8 fixed-point numbers and the three offsets are
+ * expressed as a 12-bit unsigned integers.
+ *
+ * header.type should be set to MALI_C55_PARAM_BLOCK_CCM from
+ * :c:type:`mali_c55_param_block_type`.
+ *
+ * @header: The Mali-C55 parameters block header
+ * @coeffs: 3x3 color conversion matrix coefficients in sign/magnitude
+ * Q4.8 format
+ * @gains: Gains for red, green and blue channels in unsigned Q4.8 format
+ * @offs: Offsets for red, green and blue channels
+ */
+struct mali_c55_params_ccm {
+ struct v4l2_isp_params_block_header header;
+ __u16 coeffs[3][3];
+ __u16 gains[3];
+ __u16 offs[3];
+};
+
/**
* define MALI_C55_PARAMS_MAX_SIZE - Maximum size of all Mali C55 Parameters
*
@@ -780,6 +818,7 @@ struct mali_c55_params_mesh_shading_selection {
sizeof(struct mali_c55_params_awb_config) + \
sizeof(struct mali_c55_params_awb_gains) + \
sizeof(struct mali_c55_params_mesh_shading_config) + \
- sizeof(struct mali_c55_params_mesh_shading_selection))
+ sizeof(struct mali_c55_params_mesh_shading_selection) + \
+ sizeof(struct mali_c55_params_ccm))
#endif /* __UAPI_MALI_C55_CONFIG_H */
--
2.54.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 2/2] media: arm: mali-c55: Add support for RGB Gamma
2026-06-16 14:36 [PATCH v2 0/2] media: mali-c55: Add support for CCM and Gamma Jacopo Mondi
2026-06-16 14:36 ` [PATCH v2 1/2] media: arm: mali-c55: Add support for CCM Jacopo Mondi
@ 2026-06-16 14:36 ` Jacopo Mondi
2026-06-25 22:53 ` Linus Walleij
2026-06-26 9:52 ` Vincenzo Frascino
2026-06-18 13:28 ` [PATCH v2 0/2] media: mali-c55: Add support for CCM and Gamma Linus Walleij
2 siblings, 2 replies; 15+ messages in thread
From: Jacopo Mondi @ 2026-06-16 14:36 UTC (permalink / raw)
To: Nayden.Kanchev, Konstantin Babin, Anthony McGivern,
vincenzo.frascino, linus.walleij, Daniel Scally,
Mauro Carvalho Chehab
Cc: linux-media, linux-kernel, Jacopo Mondi, Jacopo Mondi
From: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
Add support for Gamma curve correction for the Mali C55 ISP.
Define a new block in the uAPI using the extensible v4l2-isp format and
implement support for configuring the RGB Gamma parameters in the
mali-c55 parameters handler.
Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
---
v2:
- Remove unused 'rgb_enable' member
- Address checkpatch issues
---
.../media/platform/arm/mali-c55/mali-c55-params.c | 75 ++++++++++++++++++++++
.../platform/arm/mali-c55/mali-c55-registers.h | 5 ++
include/uapi/linux/media/arm/mali-c55-config.h | 45 ++++++++++++-
3 files changed, 124 insertions(+), 1 deletion(-)
diff --git a/drivers/media/platform/arm/mali-c55/mali-c55-params.c b/drivers/media/platform/arm/mali-c55/mali-c55-params.c
index 96f1b28a6d77..21f031aaf595 100644
--- a/drivers/media/platform/arm/mali-c55/mali-c55-params.c
+++ b/drivers/media/platform/arm/mali-c55/mali-c55-params.c
@@ -47,6 +47,8 @@
* @shading_config: For header->type == MALI_C55_PARAM_MESH_SHADING_CONFIG
* @shading_selection: For header->type == MALI_C55_PARAM_MESH_SHADING_SELECTION
* @ccm: For header->type == MALI_C55_PARAM_BLOCK_CCM
+ * @gamma: For header->type == MALI_C55_PARAM_BLOCK_GAMMA_FR and
+ * header->type = MALI_C55_PARAM_BLOCK_GAMMA_DS
* @data: Allows easy initialisation of a union variable with a
* pointer into a __u8 array.
*/
@@ -61,6 +63,7 @@ union mali_c55_params_block {
const struct mali_c55_params_mesh_shading_config *shading_config;
const struct mali_c55_params_mesh_shading_selection *shading_selection;
const struct mali_c55_params_ccm *ccm;
+ const struct mali_c55_params_gamma *gamma;
const __u8 *data;
};
@@ -462,6 +465,70 @@ static void mali_c55_params_ccm(struct mali_c55 *mali_c55,
mali_c55_ctx_write(mali_c55, MALI_C55_REG_CCM_ENABLE, 1);
}
+static void mali_c55_params_gamma(struct mali_c55 *mali_c55,
+ union mali_c55_params_block block,
+ __u32 offset, __u32 lut_base)
+{
+ const struct mali_c55_params_gamma *params = block.gamma;
+
+ if (block.header->flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) {
+ mali_c55_ctx_update_bits(mali_c55,
+ MALI_C55_REG_GAMMA_RGB_ENABLE + offset,
+ MALI_C55_GAMMA_ENABLE_MASK, 0x00);
+ return;
+ }
+
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_GAMMA_GAINS_1 + offset,
+ MALI_C55_GAMMA_GAIN_R_MASK, params->gains[0]);
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_GAMMA_GAINS_1 + offset,
+ MALI_C55_GAMMA_GAIN_G_MASK,
+ MALI_C55_GAMMA_GAIN_G(params->gains[1]));
+ mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_GAMMA_GAINS_2 + offset,
+ MALI_C55_GAMMA_GAIN_B_MASK, params->gains[2]);
+ mali_c55_ctx_update_bits(mali_c55,
+ MALI_C55_REG_GAMMA_OFFSETS_1 + offset,
+ MALI_C55_GAMMA_OFFSET_R_MASK,
+ params->offs[0]);
+ mali_c55_ctx_update_bits(mali_c55,
+ MALI_C55_REG_GAMMA_OFFSETS_1 + offset,
+ MALI_C55_GAMMA_OFFSET_G_MASK,
+ MALI_C55_GAMMA_OFFSET_G(params->offs[1]));
+ mali_c55_ctx_update_bits(mali_c55,
+ MALI_C55_REG_GAMMA_OFFSETS_2 + offset,
+ MALI_C55_GAMMA_OFFSET_B_MASK,
+ params->offs[2]);
+
+ for (unsigned int i = 0; i < MALI_C55_NUM_GAMMA_LUT_ELEMENTS; i++) {
+ __u32 addr = lut_base + (i * 4);
+
+ mali_c55_ctx_write(mali_c55, addr, params->lut[i]);
+ }
+
+ mali_c55_ctx_update_bits(mali_c55,
+ MALI_C55_REG_GAMMA_RGB_ENABLE + offset,
+ MALI_C55_GAMMA_ENABLE_MASK, 0x1);
+}
+
+static void mali_c55_params_gamma_fr(struct mali_c55 *mali_c55,
+ union mali_c55_params_block block)
+{
+ return mali_c55_params_gamma(mali_c55, block,
+ MALI_C55_CAP_DEV_FR_REG_OFFSET,
+ MALI_C55_REG_FR_GAMMA_RGB_MEM);
+}
+
+static void mali_c55_params_gamma_ds(struct mali_c55 *mali_c55,
+ union mali_c55_params_block block)
+{
+ /* We cannot apply parameters to DS if it is not fitted. */
+ if (!(mali_c55->capabilities & MALI_C55_GPS_DS_PIPE_FITTED))
+ return;
+
+ return mali_c55_params_gamma(mali_c55, block,
+ MALI_C55_CAP_DEV_DS_REG_OFFSET,
+ MALI_C55_REG_DS_GAMMA_RGB_MEM);
+}
+
static const mali_c55_params_handler mali_c55_params_handlers[] = {
[MALI_C55_PARAM_BLOCK_SENSOR_OFFS] = &mali_c55_params_sensor_offs,
[MALI_C55_PARAM_BLOCK_AEXP_HIST] = &mali_c55_params_aexp_hist,
@@ -475,6 +542,8 @@ static const mali_c55_params_handler mali_c55_params_handlers[] = {
[MALI_C55_PARAM_MESH_SHADING_CONFIG] = &mali_c55_params_lsc_config,
[MALI_C55_PARAM_MESH_SHADING_SELECTION] = &mali_c55_params_lsc_selection,
[MALI_C55_PARAM_BLOCK_CCM] = &mali_c55_params_ccm,
+ [MALI_C55_PARAM_BLOCK_GAMMA_FR] = &mali_c55_params_gamma_fr,
+ [MALI_C55_PARAM_BLOCK_GAMMA_DS] = &mali_c55_params_gamma_ds,
};
static const struct v4l2_isp_params_block_type_info
@@ -515,6 +584,12 @@ mali_c55_params_block_types_info[] = {
[MALI_C55_PARAM_BLOCK_CCM] = {
.size = sizeof(struct mali_c55_params_ccm),
},
+ [MALI_C55_PARAM_BLOCK_GAMMA_FR] = {
+ .size = sizeof(struct mali_c55_params_gamma),
+ },
+ [MALI_C55_PARAM_BLOCK_GAMMA_DS] = {
+ .size = sizeof(struct mali_c55_params_gamma),
+ },
};
static_assert(ARRAY_SIZE(mali_c55_params_handlers) ==
diff --git a/drivers/media/platform/arm/mali-c55/mali-c55-registers.h b/drivers/media/platform/arm/mali-c55/mali-c55-registers.h
index f098effde7b4..7a606bd2e843 100644
--- a/drivers/media/platform/arm/mali-c55/mali-c55-registers.h
+++ b/drivers/media/platform/arm/mali-c55/mali-c55-registers.h
@@ -425,11 +425,13 @@ enum mali_c55_interrupts {
#define MALI_C55_REG_GAMMA_GAINS_1 0x1c068
#define MALI_C55_GAMMA_GAIN_R_MASK GENMASK(11, 0)
#define MALI_C55_GAMMA_GAIN_G_MASK GENMASK(27, 16)
+#define MALI_C55_GAMMA_GAIN_G(x) ((x) << 16)
#define MALI_C55_REG_GAMMA_GAINS_2 0x1c06c
#define MALI_C55_GAMMA_GAIN_B_MASK GENMASK(11, 0)
#define MALI_C55_REG_GAMMA_OFFSETS_1 0x1c070
#define MALI_C55_GAMMA_OFFSET_R_MASK GENMASK(11, 0)
#define MALI_C55_GAMMA_OFFSET_G_MASK GENMASK(27, 16)
+#define MALI_C55_GAMMA_OFFSET_G(x) ((x) << 16)
#define MALI_C55_REG_GAMMA_OFFSETS_2 0x1c074
#define MALI_C55_GAMMA_OFFSET_B_MASK GENMASK(11, 0)
@@ -441,6 +443,9 @@ enum mali_c55_interrupts {
#define MALI_C55_REG_FR_GAMMA_RGB_ENABLE 0x1c064
#define MALI_C55_REG_DS_GAMMA_RGB_ENABLE 0x1c1d8
+#define MALI_C55_REG_FR_GAMMA_RGB_MEM 0x18280
+#define MALI_C55_REG_DS_GAMMA_RGB_MEM 0x18484
+
#define MALI_C55_REG_FR_SCALER_HFILT 0x34a8
#define MALI_C55_REG_FR_SCALER_VFILT 0x44a8
#define MALI_C55_REG_DS_SCALER_HFILT 0x14a8
diff --git a/include/uapi/linux/media/arm/mali-c55-config.h b/include/uapi/linux/media/arm/mali-c55-config.h
index 0b2085eed81b..7e96564cb89c 100644
--- a/include/uapi/linux/media/arm/mali-c55-config.h
+++ b/include/uapi/linux/media/arm/mali-c55-config.h
@@ -36,6 +36,9 @@
*/
#define MALI_C55_MAX_ZONES (15 * 15)
+/* Number of RGB gamma LUT entries. */
+#define MALI_C55_NUM_GAMMA_LUT_ELEMENTS 129
+
/**
* struct mali_c55_ae_1024bin_hist - Auto Exposure 1024-bin histogram statistics
*
@@ -220,6 +223,8 @@ struct mali_c55_stats_buffer {
* @MALI_C55_PARAM_MESH_SHADING_CONFIG : Mesh shading tables configuration
* @MALI_C55_PARAM_MESH_SHADING_SELECTION: Mesh shading table selection
* @MALI_C55_PARAM_BLOCK_CCM: Colour correction matrix
+ * @MALI_C55_PARAM_BLOCK_GAMMA_FR: Gamma gain and offset for FR pipe
+ * @MALI_C55_PARAM_BLOCK_GAMMA_DS: Gamma gain and offset for DS pipe
*/
enum mali_c55_param_block_type {
MALI_C55_PARAM_BLOCK_SENSOR_OFFS,
@@ -234,6 +239,8 @@ enum mali_c55_param_block_type {
MALI_C55_PARAM_MESH_SHADING_CONFIG,
MALI_C55_PARAM_MESH_SHADING_SELECTION,
MALI_C55_PARAM_BLOCK_CCM,
+ MALI_C55_PARAM_BLOCK_GAMMA_FR,
+ MALI_C55_PARAM_BLOCK_GAMMA_DS,
};
/**
@@ -795,6 +802,40 @@ struct mali_c55_params_ccm {
__u16 offs[3];
};
+/**
+ * struct mali_c55_params_gamma - RGB Gamma correction
+ *
+ * Gamma correction is used to program a standard gamma curve such as the sRGB
+ * one. It provides gains and offsets to implement contrast adjustments.
+ *
+ * Gamma correction is applied on both the FR and DS pipes separately in the RGB
+ * colour domain where the following operations take place:
+ * 1) An offset is subtracted from each colour channel
+ * 2) Each colour channel is multiplied by a gain
+ * 3) The Gamma LUT is applied to each colour channel
+ *
+ * The Gamma LUT has 129 entries where each node is an unsigned 12 bit number.
+ * It is expected that LUT[0]=0 and LUT[128]=0xffff, with the other 127 values
+ * defining the Gamma correction curve.
+ *
+ * As one Gamma correction block is available on both the FR and DS pipes, the
+ * header.type field should be set to one of either
+ * MALI_C55_PARAM_BLOCK_GAMMA_FR or MALI_C55_PARAM_BLOCK_GAMMA_DS from
+ * :c:type:`mali_c55_param_block_type`.
+ *
+ * @header: The Mali-C55 parameters block header
+ * @gains: Gains for the red, green and blue channel in unsigned Q4.8 format
+ * @offs: Offsets subtracted from the red, green and blue channels
+ * in unsigned 12-bit format
+ * @lut: 129-node Gamma LUT in u0.12 format
+ */
+struct mali_c55_params_gamma {
+ struct v4l2_isp_params_block_header header;
+ __u16 gains[3];
+ __u16 offs[3];
+ __u32 lut[MALI_C55_NUM_GAMMA_LUT_ELEMENTS];
+};
+
/**
* define MALI_C55_PARAMS_MAX_SIZE - Maximum size of all Mali C55 Parameters
*
@@ -819,6 +860,8 @@ struct mali_c55_params_ccm {
sizeof(struct mali_c55_params_awb_gains) + \
sizeof(struct mali_c55_params_mesh_shading_config) + \
sizeof(struct mali_c55_params_mesh_shading_selection) + \
- sizeof(struct mali_c55_params_ccm))
+ sizeof(struct mali_c55_params_ccm) + \
+ sizeof(struct mali_c55_params_gamma) + \
+ sizeof(struct mali_c55_params_gamma))
#endif /* __UAPI_MALI_C55_CONFIG_H */
--
2.54.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v2 0/2] media: mali-c55: Add support for CCM and Gamma
2026-06-16 14:36 [PATCH v2 0/2] media: mali-c55: Add support for CCM and Gamma Jacopo Mondi
2026-06-16 14:36 ` [PATCH v2 1/2] media: arm: mali-c55: Add support for CCM Jacopo Mondi
2026-06-16 14:36 ` [PATCH v2 2/2] media: arm: mali-c55: Add support for RGB Gamma Jacopo Mondi
@ 2026-06-18 13:28 ` Linus Walleij
2026-06-18 13:51 ` Jacopo Mondi
2026-06-18 14:48 ` Konstantin Ryabitsev
2 siblings, 2 replies; 15+ messages in thread
From: Linus Walleij @ 2026-06-18 13:28 UTC (permalink / raw)
To: Jacopo Mondi, Konstantin Ryabitsev
Cc: Nayden.Kanchev, Konstantin Babin, Anthony McGivern,
vincenzo.frascino, linus.walleij, Daniel Scally,
Mauro Carvalho Chehab, linux-media, linux-kernel, Jacopo Mondi
On Tue, Jun 16, 2026 at 4:36 PM Jacopo Mondi
<jacopo.mondi@ideasonboard.com> wrote:
> Changes in v2:
> - EDITME: describe what is new in this series revision.
> - EDITME: use bulletpoints and terse descriptions.
> - Link to v1: https://lore.kernel.org/r/20260616-mali-c55-ccm-gamma-v1-0-174fe4fedea3@ideasonboard.com
Odd changes :D
Honestly, I think this is not your fault, b4 should not allow this.
Konstantin (Ryabitsev): could we make b4 just refuse to send patch series if
this changelog contains EDITME entries?
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 0/2] media: mali-c55: Add support for CCM and Gamma
2026-06-18 13:28 ` [PATCH v2 0/2] media: mali-c55: Add support for CCM and Gamma Linus Walleij
@ 2026-06-18 13:51 ` Jacopo Mondi
2026-06-18 14:48 ` Konstantin Ryabitsev
1 sibling, 0 replies; 15+ messages in thread
From: Jacopo Mondi @ 2026-06-18 13:51 UTC (permalink / raw)
To: Linus Walleij
Cc: Jacopo Mondi, Konstantin Ryabitsev, Nayden.Kanchev,
Konstantin Babin, Anthony McGivern, vincenzo.frascino,
linus.walleij, Daniel Scally, Mauro Carvalho Chehab, linux-media,
linux-kernel, Jacopo Mondi
Hi Linus
On Thu, Jun 18, 2026 at 03:28:12PM +0200, Linus Walleij wrote:
> On Tue, Jun 16, 2026 at 4:36 PM Jacopo Mondi
> <jacopo.mondi@ideasonboard.com> wrote:
>
> > Changes in v2:
> > - EDITME: describe what is new in this series revision.
> > - EDITME: use bulletpoints and terse descriptions.
> > - Link to v1: https://lore.kernel.org/r/20260616-mali-c55-ccm-gamma-v1-0-174fe4fedea3@ideasonboard.com
>
> Odd changes :D
>
> Honestly, I think this is not your fault, b4 should not allow this.
Ahah, indeed it is my fault instead as I forgot to update the entries
If helpful:
- Address checkpatch warning in mali_c55_params_gamma() (I didn't run
b4 prep --check, sorry :)
- Remove unused member 'rgb_enable' from uAPI
>
> Konstantin (Ryabitsev): could we make b4 just refuse to send patch series if
> this changelog contains EDITME entries?
That would be nice!
>
> Yours,
> Linus Walleij
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 0/2] media: mali-c55: Add support for CCM and Gamma
2026-06-18 13:28 ` [PATCH v2 0/2] media: mali-c55: Add support for CCM and Gamma Linus Walleij
2026-06-18 13:51 ` Jacopo Mondi
@ 2026-06-18 14:48 ` Konstantin Ryabitsev
2026-06-18 14:57 ` Jacopo Mondi
1 sibling, 1 reply; 15+ messages in thread
From: Konstantin Ryabitsev @ 2026-06-18 14:48 UTC (permalink / raw)
To: Linus Walleij
Cc: Jacopo Mondi, Nayden.Kanchev, Konstantin Babin, Anthony McGivern,
vincenzo.frascino, linus.walleij, Daniel Scally,
Mauro Carvalho Chehab, linux-media, linux-kernel, Jacopo Mondi
On Thu, Jun 18, 2026 at 03:28:12PM +0200, Linus Walleij wrote:
> > Changes in v2:
> > - EDITME: describe what is new in this series revision.
> > - EDITME: use bulletpoints and terse descriptions.
> > - Link to v1: https://lore.kernel.org/r/20260616-mali-c55-ccm-gamma-v1-0-174fe4fedea3@ideasonboard.com
>
> Odd changes :D
>
> Honestly, I think this is not your fault, b4 should not allow this.
>
> Konstantin (Ryabitsev): could we make b4 just refuse to send patch series if
> this changelog contains EDITME entries?
We already do this in pre-flight check, we just don't stop you from actually
ignoring the warning, because there can be legitimate situations in which this
should be ignored (e.g. you're sending a 'quick feedback' email to your
co-developers instead of making an actual submission).
We should have printed this warning before send:
CRITICAL: Edit the cover: b4 prep --edit-cover
Press Enter to ignore and send anyway or Ctrl-C to abort and fix
I don't think we should do a hard refusal here. We've already identified the
problem and invited the user to fix it.
-K
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 0/2] media: mali-c55: Add support for CCM and Gamma
2026-06-18 14:48 ` Konstantin Ryabitsev
@ 2026-06-18 14:57 ` Jacopo Mondi
0 siblings, 0 replies; 15+ messages in thread
From: Jacopo Mondi @ 2026-06-18 14:57 UTC (permalink / raw)
To: Konstantin Ryabitsev
Cc: Linus Walleij, Jacopo Mondi, Nayden.Kanchev, Konstantin Babin,
Anthony McGivern, vincenzo.frascino, linus.walleij, Daniel Scally,
Mauro Carvalho Chehab, linux-media, linux-kernel, Jacopo Mondi
Hi Konstantin
On Thu, Jun 18, 2026 at 10:48:39AM -0400, Konstantin Ryabitsev wrote:
> On Thu, Jun 18, 2026 at 03:28:12PM +0200, Linus Walleij wrote:
> > > Changes in v2:
> > > - EDITME: describe what is new in this series revision.
> > > - EDITME: use bulletpoints and terse descriptions.
> > > - Link to v1: https://lore.kernel.org/r/20260616-mali-c55-ccm-gamma-v1-0-174fe4fedea3@ideasonboard.com
> >
> > Odd changes :D
> >
> > Honestly, I think this is not your fault, b4 should not allow this.
> >
> > Konstantin (Ryabitsev): could we make b4 just refuse to send patch series if
> > this changelog contains EDITME entries?
>
> We already do this in pre-flight check, we just don't stop you from actually
> ignoring the warning, because there can be legitimate situations in which this
> should be ignored (e.g. you're sending a 'quick feedback' email to your
> co-developers instead of making an actual submission).
>
> We should have printed this warning before send:
>
> CRITICAL: Edit the cover: b4 prep --edit-cover
>
> Press Enter to ignore and send anyway or Ctrl-C to abort and fix
>
> I don't think we should do a hard refusal here. We've already identified the
> problem and invited the user to fix it.
---
Some pre-flight checks are failing:
- Edit the cover : b4 prep --edit-cover
- Run auto-to-cc : b4 prep --auto-to-cc
---
Press Enter to ignore and send anyway or Ctrl-C to abort and fix
---
So my bad I ignored it. (the --auto-to-cc is however a false positive,
as I've run in on v1 and manually edited the recipients list).
>
> -K
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 1/2] media: arm: mali-c55: Add support for CCM
2026-06-16 14:36 ` [PATCH v2 1/2] media: arm: mali-c55: Add support for CCM Jacopo Mondi
@ 2026-06-25 22:35 ` Linus Walleij
2026-06-26 9:44 ` Vincenzo Frascino
1 sibling, 0 replies; 15+ messages in thread
From: Linus Walleij @ 2026-06-25 22:35 UTC (permalink / raw)
To: Jacopo Mondi
Cc: Nayden.Kanchev, Konstantin Babin, Anthony McGivern,
vincenzo.frascino, linus.walleij, Daniel Scally,
Mauro Carvalho Chehab, linux-media, linux-kernel, Jacopo Mondi
Hi Jacopo,
thanks for your patch, and sorry for taking so long to review it. I
was reading up
on data sheets.
On Tue, Jun 16, 2026 at 4:36 PM Jacopo Mondi
<jacopo.mondi@ideasonboard.com> wrote:
> From: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
>
> Add support for the CCM (Color Correction Matrix) for the Mali C55 ISP.
>
> Define a new block in the uAPI using the extensible v4l2-isp format and
> implement support for configuring the CCM parameters in the mali-c55
> ISP driver.
>
> Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
I compared the code to the C55 TRM and it checks out.
Reviewed-by: Linus Walleij <linusw@kernel.org>
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 2/2] media: arm: mali-c55: Add support for RGB Gamma
2026-06-16 14:36 ` [PATCH v2 2/2] media: arm: mali-c55: Add support for RGB Gamma Jacopo Mondi
@ 2026-06-25 22:53 ` Linus Walleij
2026-06-26 14:52 ` Jacopo Mondi
2026-06-26 9:52 ` Vincenzo Frascino
1 sibling, 1 reply; 15+ messages in thread
From: Linus Walleij @ 2026-06-25 22:53 UTC (permalink / raw)
To: Jacopo Mondi
Cc: Nayden.Kanchev, Konstantin Babin, Anthony McGivern,
vincenzo.frascino, linus.walleij, Daniel Scally,
Mauro Carvalho Chehab, linux-media, linux-kernel, Jacopo Mondi
Hi Jacopo,
thanks for your patch!
On Tue, Jun 16, 2026 at 4:36 PM Jacopo Mondi
<jacopo.mondi@ideasonboard.com> wrote:
> From: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
>
> Add support for Gamma curve correction for the Mali C55 ISP.
>
> Define a new block in the uAPI using the extensible v4l2-isp format and
> implement support for configuring the RGB Gamma parameters in the
> mali-c55 parameters handler.
>
> Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
(...)
> +static void mali_c55_params_gamma(struct mali_c55 *mali_c55,
> + union mali_c55_params_block block,
> + __u32 offset, __u32 lut_base)
> +{
> + const struct mali_c55_params_gamma *params = block.gamma;
> +
> + if (block.header->flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) {
> + mali_c55_ctx_update_bits(mali_c55,
> + MALI_C55_REG_GAMMA_RGB_ENABLE + offset,
> + MALI_C55_GAMMA_ENABLE_MASK, 0x00);
> + return;
> + }
> +
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_GAMMA_GAINS_1 + offset,
> + MALI_C55_GAMMA_GAIN_R_MASK, params->gains[0]);
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_GAMMA_GAINS_1 + offset,
> + MALI_C55_GAMMA_GAIN_G_MASK,
> + MALI_C55_GAMMA_GAIN_G(params->gains[1]));
It is a bit of confusion for the head when GAINS_1 is indexed to
gains[0] and gains[1] because the register i split.
> + /* We cannot apply parameters to DS if it is not fitted. */
> + if (!(mali_c55->capabilities & MALI_C55_GPS_DS_PIPE_FITTED))
> + return;
I suppose this is a HW synthesis thin? Whether DS is fitted or not?
(Just curious.)
> @@ -425,11 +425,13 @@ enum mali_c55_interrupts {
> #define MALI_C55_REG_GAMMA_GAINS_1 0x1c068
> #define MALI_C55_GAMMA_GAIN_R_MASK GENMASK(11, 0)
> #define MALI_C55_GAMMA_GAIN_G_MASK GENMASK(27, 16)
Because of my confusion I would rename *GAINS_1
to *GAINS_RG..
> +#define MALI_C55_GAMMA_GAIN_G(x) ((x) << 16)
> #define MALI_C55_REG_GAMMA_GAINS_2 0x1c06c
> #define MALI_C55_GAMMA_GAIN_B_MASK GENMASK(11, 0)
.. and *GAINS_2 to GAINS_B.
This would make it clear what the registers are for.
> #define MALI_C55_REG_GAMMA_OFFSETS_1 0x1c070
> #define MALI_C55_GAMMA_OFFSET_R_MASK GENMASK(11, 0)
> #define MALI_C55_GAMMA_OFFSET_G_MASK GENMASK(27, 16)
Same here *GAMMA_OFFSETS_RG
> +#define MALI_C55_GAMMA_OFFSET_G(x) ((x) << 16)
> #define MALI_C55_REG_GAMMA_OFFSETS_2 0x1c074
> #define MALI_C55_GAMMA_OFFSET_B_MASK GENMASK(11, 0)
Etc.
You might have good reasons for this naming that I don't understand
(like they are named like that in some documentation, I checked the
register map document but it doesn't seem to name the individual registers
but call them as a group "fr gamma rgb".
Maybe I'm looking in the wrong place.
so either way:
Reviewed-by: Linus Walleij <linusw@kernel.org>
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 1/2] media: arm: mali-c55: Add support for CCM
2026-06-16 14:36 ` [PATCH v2 1/2] media: arm: mali-c55: Add support for CCM Jacopo Mondi
2026-06-25 22:35 ` Linus Walleij
@ 2026-06-26 9:44 ` Vincenzo Frascino
2026-06-26 14:45 ` Jacopo Mondi
1 sibling, 1 reply; 15+ messages in thread
From: Vincenzo Frascino @ 2026-06-26 9:44 UTC (permalink / raw)
To: Jacopo Mondi, Nayden.Kanchev, Konstantin Babin, Anthony McGivern,
linus.walleij, Daniel Scally, Mauro Carvalho Chehab
Cc: linux-media, linux-kernel, Jacopo Mondi
Hi Jacopo,
thank you for your patch!
And sorry for the delay in my review.
On 16/06/2026 15:36, Jacopo Mondi wrote:
> From: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
>
> Add support for the CCM (Color Correction Matrix) for the Mali C55 ISP.
>
> Define a new block in the uAPI using the extensible v4l2-isp format and
> implement support for configuring the CCM parameters in the mali-c55
> ISP driver.
>
> Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
I have a couple of questions. With this:
Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
> ---
> .../media/platform/arm/mali-c55/mali-c55-params.c | 52 ++++++++++++++++++++++
> include/uapi/linux/media/arm/mali-c55-config.h | 41 ++++++++++++++++-
> 2 files changed, 92 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/platform/arm/mali-c55/mali-c55-params.c b/drivers/media/platform/arm/mali-c55/mali-c55-params.c
> index de0e9d898db7..96f1b28a6d77 100644
> --- a/drivers/media/platform/arm/mali-c55/mali-c55-params.c
> +++ b/drivers/media/platform/arm/mali-c55/mali-c55-params.c
> @@ -46,6 +46,7 @@
> * @awb_config: For header->type == MALI_C55_PARAM_BLOCK_AWB_CONFIG
> * @shading_config: For header->type == MALI_C55_PARAM_MESH_SHADING_CONFIG
> * @shading_selection: For header->type == MALI_C55_PARAM_MESH_SHADING_SELECTION
> + * @ccm: For header->type == MALI_C55_PARAM_BLOCK_CCM
> * @data: Allows easy initialisation of a union variable with a
> * pointer into a __u8 array.
> */
> @@ -59,6 +60,7 @@ union mali_c55_params_block {
> const struct mali_c55_params_awb_config *awb_config;
> const struct mali_c55_params_mesh_shading_config *shading_config;
> const struct mali_c55_params_mesh_shading_selection *shading_selection;
> + const struct mali_c55_params_ccm *ccm;
> const __u8 *data;
> };
>
> @@ -414,6 +416,52 @@ static void mali_c55_params_lsc_selection(struct mali_c55 *mali_c55,
> params->mesh_strength);
> }
>
> +static void mali_c55_params_ccm(struct mali_c55 *mali_c55,
> + union mali_c55_params_block block)
> +{
> + const struct mali_c55_params_ccm *params = block.ccm;
> +
> + if (block.header->flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) {
> + mali_c55_ctx_write(mali_c55, MALI_C55_REG_CCM_ENABLE, 0);
> + return;
> + }
> +
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_R_R,
> + MALI_C55_CCM_COEF_MASK, params->coeffs[0][0]);
Should values be validated or masked before programming? Since this is
uAPI-controlled input, it may be worth rejecting values with bits outside
MALI_C55_CCM_COEF_MASK rather than silently truncating them in update_bits().
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_R_G,
> + MALI_C55_CCM_COEF_MASK, params->coeffs[0][1]);
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_R_B,
> + MALI_C55_CCM_COEF_MASK, params->coeffs[0][2]);
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_G_R,
> + MALI_C55_CCM_COEF_MASK, params->coeffs[1][0]);
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_G_G,
> + MALI_C55_CCM_COEF_MASK, params->coeffs[1][1]);
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_G_B,
> + MALI_C55_CCM_COEF_MASK, params->coeffs[1][2]);
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_B_R,
> + MALI_C55_CCM_COEF_MASK, params->coeffs[2][0]);
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_B_G,
> + MALI_C55_CCM_COEF_MASK, params->coeffs[2][1]);
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_B_B,
> + MALI_C55_CCM_COEF_MASK, params->coeffs[2][2]);
> +
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_GAIN_R,
> + MALI_C55_CCM_ANTIFOG_GAIN_MASK, params->gains[0]);
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_GAIN_G,
> + MALI_C55_CCM_ANTIFOG_GAIN_MASK, params->gains[1]);
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_GAIN_B,
> + MALI_C55_CCM_ANTIFOG_GAIN_MASK, params->gains[2]);
> +
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_OFFSET_R,
> + MALI_C55_CCM_ANTIFOG_OFFSET_MASK, params->offs[0]);
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_OFFSET_G,
> + MALI_C55_CCM_ANTIFOG_OFFSET_MASK, params->offs[1]);
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_OFFSET_B,
> + MALI_C55_CCM_ANTIFOG_OFFSET_MASK, params->offs[2]);
> +
> + mali_c55_ctx_write(mali_c55, MALI_C55_REG_CCM_ENABLE, 1);
> +}
> +
> static const mali_c55_params_handler mali_c55_params_handlers[] = {
> [MALI_C55_PARAM_BLOCK_SENSOR_OFFS] = &mali_c55_params_sensor_offs,
> [MALI_C55_PARAM_BLOCK_AEXP_HIST] = &mali_c55_params_aexp_hist,
> @@ -426,6 +474,7 @@ static const mali_c55_params_handler mali_c55_params_handlers[] = {
> [MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP] = &mali_c55_params_awb_gains,
> [MALI_C55_PARAM_MESH_SHADING_CONFIG] = &mali_c55_params_lsc_config,
> [MALI_C55_PARAM_MESH_SHADING_SELECTION] = &mali_c55_params_lsc_selection,
> + [MALI_C55_PARAM_BLOCK_CCM] = &mali_c55_params_ccm,
> };
>
> static const struct v4l2_isp_params_block_type_info
> @@ -463,6 +512,9 @@ mali_c55_params_block_types_info[] = {
> [MALI_C55_PARAM_MESH_SHADING_SELECTION] = {
> .size = sizeof(struct mali_c55_params_mesh_shading_selection),
> },
> + [MALI_C55_PARAM_BLOCK_CCM] = {
> + .size = sizeof(struct mali_c55_params_ccm),
> + },
> };
>
> static_assert(ARRAY_SIZE(mali_c55_params_handlers) ==
> diff --git a/include/uapi/linux/media/arm/mali-c55-config.h b/include/uapi/linux/media/arm/mali-c55-config.h
> index 3d335f950eeb..0b2085eed81b 100644
> --- a/include/uapi/linux/media/arm/mali-c55-config.h
> +++ b/include/uapi/linux/media/arm/mali-c55-config.h
> @@ -219,6 +219,7 @@ struct mali_c55_stats_buffer {
> * @MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP: Auto-white balance gains for AEXP-0 tap
> * @MALI_C55_PARAM_MESH_SHADING_CONFIG : Mesh shading tables configuration
> * @MALI_C55_PARAM_MESH_SHADING_SELECTION: Mesh shading table selection
> + * @MALI_C55_PARAM_BLOCK_CCM: Colour correction matrix
> */
> enum mali_c55_param_block_type {
> MALI_C55_PARAM_BLOCK_SENSOR_OFFS,
> @@ -232,6 +233,7 @@ enum mali_c55_param_block_type {
> MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP,
> MALI_C55_PARAM_MESH_SHADING_CONFIG,
> MALI_C55_PARAM_MESH_SHADING_SELECTION,
> + MALI_C55_PARAM_BLOCK_CCM,
> };
>
> /**
> @@ -757,6 +759,42 @@ struct mali_c55_params_mesh_shading_selection {
> __u16 mesh_strength;
> };
>
> +/**
> + * struct mali_c55_params_ccm - Coefficients, offsets and gains for the colour
> + * correction matrix
> + *
> + * The colour correction module converts images data from a sensor-specific
> + * colour space to known one.
> + *
> + * Colour correction is applied after demosaicing and each pixel is represented
> + * as a column vector of the three RGB colour channels on which the following
> + * operations take place:
> + * 1) An offset is subtracted from each colour channel
> + * 2) Each colour channel is multiplied by a gain
> + * 3) The pixel column vector is multiplied by the colour correction matrix
> + *
> + * This struct allows users to configure the coefficients for CCM and the
> + * per-channel offsets and gains. The nine matrix coefficients are expressed as
> + * signed Q4.8 Sign/Magnitude fixed-point numbers, the three gain multipliers
> + * are expressed as unsigned Q4.8 fixed-point numbers and the three offsets are
> + * expressed as a 12-bit unsigned integers.
> + *
> + * header.type should be set to MALI_C55_PARAM_BLOCK_CCM from
> + * :c:type:`mali_c55_param_block_type`.
> + *
> + * @header: The Mali-C55 parameters block header
> + * @coeffs: 3x3 color conversion matrix coefficients in sign/magnitude
> + * Q4.8 format
> + * @gains: Gains for red, green and blue channels in unsigned Q4.8 format
> + * @offs: Offsets for red, green and blue channels
> + */
> +struct mali_c55_params_ccm {
> + struct v4l2_isp_params_block_header header;
> + __u16 coeffs[3][3];
> + __u16 gains[3];
> + __u16 offs[3];
The comment says offsets are 12-bit unsigned integers. Is there a reason why
instead of validation in the params parser so userspace gets an error for values
above 4095, we rely on register masking?
> +};
> +
> /**
> * define MALI_C55_PARAMS_MAX_SIZE - Maximum size of all Mali C55 Parameters
> *
> @@ -780,6 +818,7 @@ struct mali_c55_params_mesh_shading_selection {
> sizeof(struct mali_c55_params_awb_config) + \
> sizeof(struct mali_c55_params_awb_gains) + \
> sizeof(struct mali_c55_params_mesh_shading_config) + \
> - sizeof(struct mali_c55_params_mesh_shading_selection))
> + sizeof(struct mali_c55_params_mesh_shading_selection) + \
> + sizeof(struct mali_c55_params_ccm))
>
> #endif /* __UAPI_MALI_C55_CONFIG_H */
>
--
Regards,
Vincenzo
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 2/2] media: arm: mali-c55: Add support for RGB Gamma
2026-06-16 14:36 ` [PATCH v2 2/2] media: arm: mali-c55: Add support for RGB Gamma Jacopo Mondi
2026-06-25 22:53 ` Linus Walleij
@ 2026-06-26 9:52 ` Vincenzo Frascino
2026-06-26 14:55 ` Jacopo Mondi
1 sibling, 1 reply; 15+ messages in thread
From: Vincenzo Frascino @ 2026-06-26 9:52 UTC (permalink / raw)
To: Jacopo Mondi, Nayden.Kanchev, Konstantin Babin, Anthony McGivern,
linus.walleij, Daniel Scally, Mauro Carvalho Chehab
Cc: linux-media, linux-kernel, Jacopo Mondi
Hi Jacopo,
thank you for your patch!
On 16/06/2026 15:36, Jacopo Mondi wrote:
> From: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
>
> Add support for Gamma curve correction for the Mali C55 ISP.
>
> Define a new block in the uAPI using the extensible v4l2-isp format and
> implement support for configuring the RGB Gamma parameters in the
> mali-c55 parameters handler.
>
> Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
I have a couple of comments in addition to what Linus mentioned in his review.
With this:
Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
>
> ---
> v2:
> - Remove unused 'rgb_enable' member
> - Address checkpatch issues
> ---
> .../media/platform/arm/mali-c55/mali-c55-params.c | 75 ++++++++++++++++++++++
> .../platform/arm/mali-c55/mali-c55-registers.h | 5 ++
> include/uapi/linux/media/arm/mali-c55-config.h | 45 ++++++++++++-
> 3 files changed, 124 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/platform/arm/mali-c55/mali-c55-params.c b/drivers/media/platform/arm/mali-c55/mali-c55-params.c
> index 96f1b28a6d77..21f031aaf595 100644
> --- a/drivers/media/platform/arm/mali-c55/mali-c55-params.c
> +++ b/drivers/media/platform/arm/mali-c55/mali-c55-params.c
> @@ -47,6 +47,8 @@
> * @shading_config: For header->type == MALI_C55_PARAM_MESH_SHADING_CONFIG
> * @shading_selection: For header->type == MALI_C55_PARAM_MESH_SHADING_SELECTION
> * @ccm: For header->type == MALI_C55_PARAM_BLOCK_CCM
> + * @gamma: For header->type == MALI_C55_PARAM_BLOCK_GAMMA_FR and
> + * header->type = MALI_C55_PARAM_BLOCK_GAMMA_DS
> * @data: Allows easy initialisation of a union variable with a
> * pointer into a __u8 array.
> */
> @@ -61,6 +63,7 @@ union mali_c55_params_block {
> const struct mali_c55_params_mesh_shading_config *shading_config;
> const struct mali_c55_params_mesh_shading_selection *shading_selection;
> const struct mali_c55_params_ccm *ccm;
> + const struct mali_c55_params_gamma *gamma;
> const __u8 *data;
> };
>
> @@ -462,6 +465,70 @@ static void mali_c55_params_ccm(struct mali_c55 *mali_c55,
> mali_c55_ctx_write(mali_c55, MALI_C55_REG_CCM_ENABLE, 1);
> }
>
> +static void mali_c55_params_gamma(struct mali_c55 *mali_c55,
> + union mali_c55_params_block block,
> + __u32 offset, __u32 lut_base)
> +{
> + const struct mali_c55_params_gamma *params = block.gamma;
> +
> + if (block.header->flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) {
> + mali_c55_ctx_update_bits(mali_c55,
> + MALI_C55_REG_GAMMA_RGB_ENABLE + offset,
> + MALI_C55_GAMMA_ENABLE_MASK, 0x00);
> + return;
> + }
> +
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_GAMMA_GAINS_1 + offset,
> + MALI_C55_GAMMA_GAIN_R_MASK, params->gains[0]);
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_GAMMA_GAINS_1 + offset,
> + MALI_C55_GAMMA_GAIN_G_MASK,
> + MALI_C55_GAMMA_GAIN_G(params->gains[1]));
> + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_GAMMA_GAINS_2 + offset,
> + MALI_C55_GAMMA_GAIN_B_MASK, params->gains[2]);
> + mali_c55_ctx_update_bits(mali_c55,
> + MALI_C55_REG_GAMMA_OFFSETS_1 + offset,
> + MALI_C55_GAMMA_OFFSET_R_MASK,
> + params->offs[0]);
> + mali_c55_ctx_update_bits(mali_c55,
> + MALI_C55_REG_GAMMA_OFFSETS_1 + offset,
> + MALI_C55_GAMMA_OFFSET_G_MASK,
> + MALI_C55_GAMMA_OFFSET_G(params->offs[1]));
> + mali_c55_ctx_update_bits(mali_c55,
> + MALI_C55_REG_GAMMA_OFFSETS_2 + offset,
> + MALI_C55_GAMMA_OFFSET_B_MASK,
> + params->offs[2]);
> +
> + for (unsigned int i = 0; i < MALI_C55_NUM_GAMMA_LUT_ELEMENTS; i++) {
> + __u32 addr = lut_base + (i * 4);
> +
> + mali_c55_ctx_write(mali_c55, addr, params->lut[i]);
> + }
> +
> + mali_c55_ctx_update_bits(mali_c55,
> + MALI_C55_REG_GAMMA_RGB_ENABLE + offset,
> + MALI_C55_GAMMA_ENABLE_MASK, 0x1);
> +}
> +
> +static void mali_c55_params_gamma_fr(struct mali_c55 *mali_c55,
> + union mali_c55_params_block block)
> +{
> + return mali_c55_params_gamma(mali_c55, block,
> + MALI_C55_CAP_DEV_FR_REG_OFFSET,
> + MALI_C55_REG_FR_GAMMA_RGB_MEM);
> +}
> +
> +static void mali_c55_params_gamma_ds(struct mali_c55 *mali_c55,
> + union mali_c55_params_block block)
> +{
> + /* We cannot apply parameters to DS if it is not fitted. */
> + if (!(mali_c55->capabilities & MALI_C55_GPS_DS_PIPE_FITTED))
> + return;
> +
> + return mali_c55_params_gamma(mali_c55, block,
> + MALI_C55_CAP_DEV_DS_REG_OFFSET,
> + MALI_C55_REG_DS_GAMMA_RGB_MEM);
> +}
> +
> static const mali_c55_params_handler mali_c55_params_handlers[] = {
> [MALI_C55_PARAM_BLOCK_SENSOR_OFFS] = &mali_c55_params_sensor_offs,
> [MALI_C55_PARAM_BLOCK_AEXP_HIST] = &mali_c55_params_aexp_hist,
> @@ -475,6 +542,8 @@ static const mali_c55_params_handler mali_c55_params_handlers[] = {
> [MALI_C55_PARAM_MESH_SHADING_CONFIG] = &mali_c55_params_lsc_config,
> [MALI_C55_PARAM_MESH_SHADING_SELECTION] = &mali_c55_params_lsc_selection,
> [MALI_C55_PARAM_BLOCK_CCM] = &mali_c55_params_ccm,
> + [MALI_C55_PARAM_BLOCK_GAMMA_FR] = &mali_c55_params_gamma_fr,
> + [MALI_C55_PARAM_BLOCK_GAMMA_DS] = &mali_c55_params_gamma_ds,
> };
>
> static const struct v4l2_isp_params_block_type_info
> @@ -515,6 +584,12 @@ mali_c55_params_block_types_info[] = {
> [MALI_C55_PARAM_BLOCK_CCM] = {
> .size = sizeof(struct mali_c55_params_ccm),
> },
> + [MALI_C55_PARAM_BLOCK_GAMMA_FR] = {
> + .size = sizeof(struct mali_c55_params_gamma),
> + },
> + [MALI_C55_PARAM_BLOCK_GAMMA_DS] = {
> + .size = sizeof(struct mali_c55_params_gamma),
> + },
> };
>
> static_assert(ARRAY_SIZE(mali_c55_params_handlers) ==
> diff --git a/drivers/media/platform/arm/mali-c55/mali-c55-registers.h b/drivers/media/platform/arm/mali-c55/mali-c55-registers.h
> index f098effde7b4..7a606bd2e843 100644
> --- a/drivers/media/platform/arm/mali-c55/mali-c55-registers.h
> +++ b/drivers/media/platform/arm/mali-c55/mali-c55-registers.h
> @@ -425,11 +425,13 @@ enum mali_c55_interrupts {
> #define MALI_C55_REG_GAMMA_GAINS_1 0x1c068
> #define MALI_C55_GAMMA_GAIN_R_MASK GENMASK(11, 0)
> #define MALI_C55_GAMMA_GAIN_G_MASK GENMASK(27, 16)
> +#define MALI_C55_GAMMA_GAIN_G(x) ((x) << 16)
> #define MALI_C55_REG_GAMMA_GAINS_2 0x1c06c
> #define MALI_C55_GAMMA_GAIN_B_MASK GENMASK(11, 0)
> #define MALI_C55_REG_GAMMA_OFFSETS_1 0x1c070
> #define MALI_C55_GAMMA_OFFSET_R_MASK GENMASK(11, 0)
> #define MALI_C55_GAMMA_OFFSET_G_MASK GENMASK(27, 16)
> +#define MALI_C55_GAMMA_OFFSET_G(x) ((x) << 16)
Nit: there is an extra tab before ((x) << 16) compared to the surrounding
defines. Please align this with the style of the nearby MALI_C55_GAMMA_GAIN_G()
macro.
> #define MALI_C55_REG_GAMMA_OFFSETS_2 0x1c074
> #define MALI_C55_GAMMA_OFFSET_B_MASK GENMASK(11, 0)
>
> @@ -441,6 +443,9 @@ enum mali_c55_interrupts {
> #define MALI_C55_REG_FR_GAMMA_RGB_ENABLE 0x1c064
> #define MALI_C55_REG_DS_GAMMA_RGB_ENABLE 0x1c1d8
>
> +#define MALI_C55_REG_FR_GAMMA_RGB_MEM 0x18280
> +#define MALI_C55_REG_DS_GAMMA_RGB_MEM 0x18484
> +
> #define MALI_C55_REG_FR_SCALER_HFILT 0x34a8
> #define MALI_C55_REG_FR_SCALER_VFILT 0x44a8
> #define MALI_C55_REG_DS_SCALER_HFILT 0x14a8
> diff --git a/include/uapi/linux/media/arm/mali-c55-config.h b/include/uapi/linux/media/arm/mali-c55-config.h
> index 0b2085eed81b..7e96564cb89c 100644
> --- a/include/uapi/linux/media/arm/mali-c55-config.h
> +++ b/include/uapi/linux/media/arm/mali-c55-config.h
> @@ -36,6 +36,9 @@
> */
> #define MALI_C55_MAX_ZONES (15 * 15)
>
> +/* Number of RGB gamma LUT entries. */
> +#define MALI_C55_NUM_GAMMA_LUT_ELEMENTS 129
> +
> /**
> * struct mali_c55_ae_1024bin_hist - Auto Exposure 1024-bin histogram statistics
> *
> @@ -220,6 +223,8 @@ struct mali_c55_stats_buffer {
> * @MALI_C55_PARAM_MESH_SHADING_CONFIG : Mesh shading tables configuration
> * @MALI_C55_PARAM_MESH_SHADING_SELECTION: Mesh shading table selection
> * @MALI_C55_PARAM_BLOCK_CCM: Colour correction matrix
> + * @MALI_C55_PARAM_BLOCK_GAMMA_FR: Gamma gain and offset for FR pipe
> + * @MALI_C55_PARAM_BLOCK_GAMMA_DS: Gamma gain and offset for DS pipe
> */
> enum mali_c55_param_block_type {
> MALI_C55_PARAM_BLOCK_SENSOR_OFFS,
> @@ -234,6 +239,8 @@ enum mali_c55_param_block_type {
> MALI_C55_PARAM_MESH_SHADING_CONFIG,
> MALI_C55_PARAM_MESH_SHADING_SELECTION,
> MALI_C55_PARAM_BLOCK_CCM,
> + MALI_C55_PARAM_BLOCK_GAMMA_FR,
> + MALI_C55_PARAM_BLOCK_GAMMA_DS,
> };
>
> /**
> @@ -795,6 +802,40 @@ struct mali_c55_params_ccm {
> __u16 offs[3];
> };
>
> +/**
> + * struct mali_c55_params_gamma - RGB Gamma correction
> + *
> + * Gamma correction is used to program a standard gamma curve such as the sRGB
> + * one. It provides gains and offsets to implement contrast adjustments.
> + *
> + * Gamma correction is applied on both the FR and DS pipes separately in the RGB
> + * colour domain where the following operations take place:
> + * 1) An offset is subtracted from each colour channel
> + * 2) Each colour channel is multiplied by a gain
> + * 3) The Gamma LUT is applied to each colour channel
> + *
> + * The Gamma LUT has 129 entries where each node is an unsigned 12 bit number.
> + * It is expected that LUT[0]=0 and LUT[128]=0xffff, with the other 127 values
lut entries are documented as unsigned 12-bit values, so 0xffff looks
inconsistent. Should this be 0xfff instead?
> + * defining the Gamma correction curve.
> + *
> + * As one Gamma correction block is available on both the FR and DS pipes, the
> + * header.type field should be set to one of either
> + * MALI_C55_PARAM_BLOCK_GAMMA_FR or MALI_C55_PARAM_BLOCK_GAMMA_DS from
> + * :c:type:`mali_c55_param_block_type`.
> + *
> + * @header: The Mali-C55 parameters block header
> + * @gains: Gains for the red, green and blue channel in unsigned Q4.8 format
> + * @offs: Offsets subtracted from the red, green and blue channels
> + * in unsigned 12-bit format
> + * @lut: 129-node Gamma LUT in u0.12 format
> + */
> +struct mali_c55_params_gamma {
> + struct v4l2_isp_params_block_header header;
> + __u16 gains[3];
> + __u16 offs[3];
> + __u32 lut[MALI_C55_NUM_GAMMA_LUT_ELEMENTS];
> +};
> +
> /**
> * define MALI_C55_PARAMS_MAX_SIZE - Maximum size of all Mali C55 Parameters
> *
> @@ -819,6 +860,8 @@ struct mali_c55_params_ccm {
> sizeof(struct mali_c55_params_awb_gains) + \
> sizeof(struct mali_c55_params_mesh_shading_config) + \
> sizeof(struct mali_c55_params_mesh_shading_selection) + \
> - sizeof(struct mali_c55_params_ccm))
> + sizeof(struct mali_c55_params_ccm) + \
> + sizeof(struct mali_c55_params_gamma) + \
> + sizeof(struct mali_c55_params_gamma))
>
> #endif /* __UAPI_MALI_C55_CONFIG_H */
>
--
Regards,
Vincenzo
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 1/2] media: arm: mali-c55: Add support for CCM
2026-06-26 9:44 ` Vincenzo Frascino
@ 2026-06-26 14:45 ` Jacopo Mondi
0 siblings, 0 replies; 15+ messages in thread
From: Jacopo Mondi @ 2026-06-26 14:45 UTC (permalink / raw)
To: Vincenzo Frascino
Cc: Jacopo Mondi, Nayden.Kanchev, Konstantin Babin, Anthony McGivern,
linus.walleij, Daniel Scally, Mauro Carvalho Chehab, linux-media,
linux-kernel, Jacopo Mondi
Hi Vincenzo
thanks for the review
On Fri, Jun 26, 2026 at 10:44:49AM +0100, Vincenzo Frascino wrote:
> Hi Jacopo,
>
> thank you for your patch!
>
> And sorry for the delay in my review.
>
> On 16/06/2026 15:36, Jacopo Mondi wrote:
> > From: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> >
> > Add support for the CCM (Color Correction Matrix) for the Mali C55 ISP.
> >
> > Define a new block in the uAPI using the extensible v4l2-isp format and
> > implement support for configuring the CCM parameters in the mali-c55
> > ISP driver.
> >
> > Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
>
> I have a couple of questions. With this:
>
> Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
>
> > ---
> > .../media/platform/arm/mali-c55/mali-c55-params.c | 52 ++++++++++++++++++++++
> > include/uapi/linux/media/arm/mali-c55-config.h | 41 ++++++++++++++++-
> > 2 files changed, 92 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/media/platform/arm/mali-c55/mali-c55-params.c b/drivers/media/platform/arm/mali-c55/mali-c55-params.c
> > index de0e9d898db7..96f1b28a6d77 100644
> > --- a/drivers/media/platform/arm/mali-c55/mali-c55-params.c
> > +++ b/drivers/media/platform/arm/mali-c55/mali-c55-params.c
> > @@ -46,6 +46,7 @@
> > * @awb_config: For header->type == MALI_C55_PARAM_BLOCK_AWB_CONFIG
> > * @shading_config: For header->type == MALI_C55_PARAM_MESH_SHADING_CONFIG
> > * @shading_selection: For header->type == MALI_C55_PARAM_MESH_SHADING_SELECTION
> > + * @ccm: For header->type == MALI_C55_PARAM_BLOCK_CCM
> > * @data: Allows easy initialisation of a union variable with a
> > * pointer into a __u8 array.
> > */
> > @@ -59,6 +60,7 @@ union mali_c55_params_block {
> > const struct mali_c55_params_awb_config *awb_config;
> > const struct mali_c55_params_mesh_shading_config *shading_config;
> > const struct mali_c55_params_mesh_shading_selection *shading_selection;
> > + const struct mali_c55_params_ccm *ccm;
> > const __u8 *data;
> > };
> >
> > @@ -414,6 +416,52 @@ static void mali_c55_params_lsc_selection(struct mali_c55 *mali_c55,
> > params->mesh_strength);
> > }
> >
> > +static void mali_c55_params_ccm(struct mali_c55 *mali_c55,
> > + union mali_c55_params_block block)
> > +{
> > + const struct mali_c55_params_ccm *params = block.ccm;
> > +
> > + if (block.header->flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) {
> > + mali_c55_ctx_write(mali_c55, MALI_C55_REG_CCM_ENABLE, 0);
> > + return;
> > + }
> > +
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_R_R,
> > + MALI_C55_CCM_COEF_MASK, params->coeffs[0][0]);
>
> Should values be validated or masked before programming? Since this is
Don't mali_c55_ctx_update_bits() does making already ?
> uAPI-controlled input, it may be worth rejecting values with bits outside
> MALI_C55_CCM_COEF_MASK rather than silently truncating them in update_bits().
>
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_R_G,
> > + MALI_C55_CCM_COEF_MASK, params->coeffs[0][1]);
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_R_B,
> > + MALI_C55_CCM_COEF_MASK, params->coeffs[0][2]);
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_G_R,
> > + MALI_C55_CCM_COEF_MASK, params->coeffs[1][0]);
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_G_G,
> > + MALI_C55_CCM_COEF_MASK, params->coeffs[1][1]);
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_G_B,
> > + MALI_C55_CCM_COEF_MASK, params->coeffs[1][2]);
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_B_R,
> > + MALI_C55_CCM_COEF_MASK, params->coeffs[2][0]);
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_B_G,
> > + MALI_C55_CCM_COEF_MASK, params->coeffs[2][1]);
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_COEF_B_B,
> > + MALI_C55_CCM_COEF_MASK, params->coeffs[2][2]);
> > +
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_GAIN_R,
> > + MALI_C55_CCM_ANTIFOG_GAIN_MASK, params->gains[0]);
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_GAIN_G,
> > + MALI_C55_CCM_ANTIFOG_GAIN_MASK, params->gains[1]);
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_GAIN_B,
> > + MALI_C55_CCM_ANTIFOG_GAIN_MASK, params->gains[2]);
> > +
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_OFFSET_R,
> > + MALI_C55_CCM_ANTIFOG_OFFSET_MASK, params->offs[0]);
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_OFFSET_G,
> > + MALI_C55_CCM_ANTIFOG_OFFSET_MASK, params->offs[1]);
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_CCM_ANTIFOG_OFFSET_B,
> > + MALI_C55_CCM_ANTIFOG_OFFSET_MASK, params->offs[2]);
> > +
> > + mali_c55_ctx_write(mali_c55, MALI_C55_REG_CCM_ENABLE, 1);
> > +}
> > +
> > static const mali_c55_params_handler mali_c55_params_handlers[] = {
> > [MALI_C55_PARAM_BLOCK_SENSOR_OFFS] = &mali_c55_params_sensor_offs,
> > [MALI_C55_PARAM_BLOCK_AEXP_HIST] = &mali_c55_params_aexp_hist,
> > @@ -426,6 +474,7 @@ static const mali_c55_params_handler mali_c55_params_handlers[] = {
> > [MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP] = &mali_c55_params_awb_gains,
> > [MALI_C55_PARAM_MESH_SHADING_CONFIG] = &mali_c55_params_lsc_config,
> > [MALI_C55_PARAM_MESH_SHADING_SELECTION] = &mali_c55_params_lsc_selection,
> > + [MALI_C55_PARAM_BLOCK_CCM] = &mali_c55_params_ccm,
> > };
> >
> > static const struct v4l2_isp_params_block_type_info
> > @@ -463,6 +512,9 @@ mali_c55_params_block_types_info[] = {
> > [MALI_C55_PARAM_MESH_SHADING_SELECTION] = {
> > .size = sizeof(struct mali_c55_params_mesh_shading_selection),
> > },
> > + [MALI_C55_PARAM_BLOCK_CCM] = {
> > + .size = sizeof(struct mali_c55_params_ccm),
> > + },
> > };
> >
> > static_assert(ARRAY_SIZE(mali_c55_params_handlers) ==
> > diff --git a/include/uapi/linux/media/arm/mali-c55-config.h b/include/uapi/linux/media/arm/mali-c55-config.h
> > index 3d335f950eeb..0b2085eed81b 100644
> > --- a/include/uapi/linux/media/arm/mali-c55-config.h
> > +++ b/include/uapi/linux/media/arm/mali-c55-config.h
> > @@ -219,6 +219,7 @@ struct mali_c55_stats_buffer {
> > * @MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP: Auto-white balance gains for AEXP-0 tap
> > * @MALI_C55_PARAM_MESH_SHADING_CONFIG : Mesh shading tables configuration
> > * @MALI_C55_PARAM_MESH_SHADING_SELECTION: Mesh shading table selection
> > + * @MALI_C55_PARAM_BLOCK_CCM: Colour correction matrix
> > */
> > enum mali_c55_param_block_type {
> > MALI_C55_PARAM_BLOCK_SENSOR_OFFS,
> > @@ -232,6 +233,7 @@ enum mali_c55_param_block_type {
> > MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP,
> > MALI_C55_PARAM_MESH_SHADING_CONFIG,
> > MALI_C55_PARAM_MESH_SHADING_SELECTION,
> > + MALI_C55_PARAM_BLOCK_CCM,
> > };
> >
> > /**
> > @@ -757,6 +759,42 @@ struct mali_c55_params_mesh_shading_selection {
> > __u16 mesh_strength;
> > };
> >
> > +/**
> > + * struct mali_c55_params_ccm - Coefficients, offsets and gains for the colour
> > + * correction matrix
> > + *
> > + * The colour correction module converts images data from a sensor-specific
> > + * colour space to known one.
> > + *
> > + * Colour correction is applied after demosaicing and each pixel is represented
> > + * as a column vector of the three RGB colour channels on which the following
> > + * operations take place:
> > + * 1) An offset is subtracted from each colour channel
> > + * 2) Each colour channel is multiplied by a gain
> > + * 3) The pixel column vector is multiplied by the colour correction matrix
> > + *
> > + * This struct allows users to configure the coefficients for CCM and the
> > + * per-channel offsets and gains. The nine matrix coefficients are expressed as
> > + * signed Q4.8 Sign/Magnitude fixed-point numbers, the three gain multipliers
> > + * are expressed as unsigned Q4.8 fixed-point numbers and the three offsets are
> > + * expressed as a 12-bit unsigned integers.
> > + *
> > + * header.type should be set to MALI_C55_PARAM_BLOCK_CCM from
> > + * :c:type:`mali_c55_param_block_type`.
> > + *
> > + * @header: The Mali-C55 parameters block header
> > + * @coeffs: 3x3 color conversion matrix coefficients in sign/magnitude
> > + * Q4.8 format
> > + * @gains: Gains for red, green and blue channels in unsigned Q4.8 format
> > + * @offs: Offsets for red, green and blue channels
> > + */
> > +struct mali_c55_params_ccm {
> > + struct v4l2_isp_params_block_header header;
> > + __u16 coeffs[3][3];
> > + __u16 gains[3];
> > + __u16 offs[3];
>
> The comment says offsets are 12-bit unsigned integers. Is there a reason why
> instead of validation in the params parser so userspace gets an error for values
> above 4095, we rely on register masking?
>
If we want per-block validation of values they should be implemented
on top of https://patchwork.linuxtv.org/project/linux-media/patch/20260505-extensible-stats-v1-4-e16f326b8dad@ideasonboard.com/
using the new block_validate() callback.
I can do so by listing
https://patchwork.linuxtv.org/project/linux-media/list/?series=24772
as a pre-requisite of this patch
> > +};
> > +
> > /**
> > * define MALI_C55_PARAMS_MAX_SIZE - Maximum size of all Mali C55 Parameters
> > *
> > @@ -780,6 +818,7 @@ struct mali_c55_params_mesh_shading_selection {
> > sizeof(struct mali_c55_params_awb_config) + \
> > sizeof(struct mali_c55_params_awb_gains) + \
> > sizeof(struct mali_c55_params_mesh_shading_config) + \
> > - sizeof(struct mali_c55_params_mesh_shading_selection))
> > + sizeof(struct mali_c55_params_mesh_shading_selection) + \
> > + sizeof(struct mali_c55_params_ccm))
> >
> > #endif /* __UAPI_MALI_C55_CONFIG_H */
> >
>
> --
> Regards,
> Vincenzo
>
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 2/2] media: arm: mali-c55: Add support for RGB Gamma
2026-06-25 22:53 ` Linus Walleij
@ 2026-06-26 14:52 ` Jacopo Mondi
2026-06-26 17:30 ` Linus Walleij
0 siblings, 1 reply; 15+ messages in thread
From: Jacopo Mondi @ 2026-06-26 14:52 UTC (permalink / raw)
To: Linus Walleij
Cc: Jacopo Mondi, Nayden.Kanchev, Konstantin Babin, Anthony McGivern,
vincenzo.frascino, linus.walleij, Daniel Scally,
Mauro Carvalho Chehab, linux-media, linux-kernel, Jacopo Mondi
Hi Linus,
thanks for the review
On Fri, Jun 26, 2026 at 12:53:45AM +0200, Linus Walleij wrote:
> Hi Jacopo,
>
> thanks for your patch!
>
> On Tue, Jun 16, 2026 at 4:36 PM Jacopo Mondi
> <jacopo.mondi@ideasonboard.com> wrote:
>
> > From: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> >
> > Add support for Gamma curve correction for the Mali C55 ISP.
> >
> > Define a new block in the uAPI using the extensible v4l2-isp format and
> > implement support for configuring the RGB Gamma parameters in the
> > mali-c55 parameters handler.
> >
> > Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> (...)
>
> > +static void mali_c55_params_gamma(struct mali_c55 *mali_c55,
> > + union mali_c55_params_block block,
> > + __u32 offset, __u32 lut_base)
> > +{
> > + const struct mali_c55_params_gamma *params = block.gamma;
> > +
> > + if (block.header->flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) {
> > + mali_c55_ctx_update_bits(mali_c55,
> > + MALI_C55_REG_GAMMA_RGB_ENABLE + offset,
> > + MALI_C55_GAMMA_ENABLE_MASK, 0x00);
> > + return;
> > + }
> > +
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_GAMMA_GAINS_1 + offset,
> > + MALI_C55_GAMMA_GAIN_R_MASK, params->gains[0]);
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_GAMMA_GAINS_1 + offset,
> > + MALI_C55_GAMMA_GAIN_G_MASK,
> > + MALI_C55_GAMMA_GAIN_G(params->gains[1]));
>
> It is a bit of confusion for the head when GAINS_1 is indexed to
> gains[0] and gains[1] because the register i split.
>
See below
> > + /* We cannot apply parameters to DS if it is not fitted. */
> > + if (!(mali_c55->capabilities & MALI_C55_GPS_DS_PIPE_FITTED))
> > + return;
>
> I suppose this is a HW synthesis thin? Whether DS is fitted or not?
> (Just curious.)
I presume so ?
>
> > @@ -425,11 +425,13 @@ enum mali_c55_interrupts {
> > #define MALI_C55_REG_GAMMA_GAINS_1 0x1c068
> > #define MALI_C55_GAMMA_GAIN_R_MASK GENMASK(11, 0)
> > #define MALI_C55_GAMMA_GAIN_G_MASK GENMASK(27, 16)
>
> Because of my confusion I would rename *GAINS_1
> to *GAINS_RG..
>
> > +#define MALI_C55_GAMMA_GAIN_G(x) ((x) << 16)
> > #define MALI_C55_REG_GAMMA_GAINS_2 0x1c06c
> > #define MALI_C55_GAMMA_GAIN_B_MASK GENMASK(11, 0)
>
> .. and *GAINS_2 to GAINS_B.
>
> This would make it clear what the registers are for.
>
I can certainly do so
> > #define MALI_C55_REG_GAMMA_OFFSETS_1 0x1c070
> > #define MALI_C55_GAMMA_OFFSET_R_MASK GENMASK(11, 0)
> > #define MALI_C55_GAMMA_OFFSET_G_MASK GENMASK(27, 16)
>
> Same here *GAMMA_OFFSETS_RG
Aren't the R and G masks different ?
Or are you suggesting
#define MALI_C55_REG_GAMMA_OFFSETS_RG 0x1c070
>
> > +#define MALI_C55_GAMMA_OFFSET_G(x) ((x) << 16)
> > #define MALI_C55_REG_GAMMA_OFFSETS_2 0x1c074
> > #define MALI_C55_GAMMA_OFFSET_B_MASK GENMASK(11, 0)
>
> Etc.
>
> You might have good reasons for this naming that I don't understand
I think there register names were already there before this patch
didn't they ?
> (like they are named like that in some documentation, I checked the
> register map document but it doesn't seem to name the individual registers
> but call them as a group "fr gamma rgb".
> Maybe I'm looking in the wrong place.
> so either way:
>
> Reviewed-by: Linus Walleij <linusw@kernel.org>
Thanks!
>
> Yours,
> Linus Walleij
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 2/2] media: arm: mali-c55: Add support for RGB Gamma
2026-06-26 9:52 ` Vincenzo Frascino
@ 2026-06-26 14:55 ` Jacopo Mondi
0 siblings, 0 replies; 15+ messages in thread
From: Jacopo Mondi @ 2026-06-26 14:55 UTC (permalink / raw)
To: Vincenzo Frascino
Cc: Jacopo Mondi, Nayden.Kanchev, Konstantin Babin, Anthony McGivern,
linus.walleij, Daniel Scally, Mauro Carvalho Chehab, linux-media,
linux-kernel, Jacopo Mondi
Hi Vincenzo
On Fri, Jun 26, 2026 at 10:52:38AM +0100, Vincenzo Frascino wrote:
> Hi Jacopo,
>
> thank you for your patch!
>
> On 16/06/2026 15:36, Jacopo Mondi wrote:
> > From: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
> >
> > Add support for Gamma curve correction for the Mali C55 ISP.
> >
> > Define a new block in the uAPI using the extensible v4l2-isp format and
> > implement support for configuring the RGB Gamma parameters in the
> > mali-c55 parameters handler.
> >
> > Signed-off-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
>
> I have a couple of comments in addition to what Linus mentioned in his review.
> With this:
>
> Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
>
> >
> > ---
> > v2:
> > - Remove unused 'rgb_enable' member
> > - Address checkpatch issues
> > ---
> > .../media/platform/arm/mali-c55/mali-c55-params.c | 75 ++++++++++++++++++++++
> > .../platform/arm/mali-c55/mali-c55-registers.h | 5 ++
> > include/uapi/linux/media/arm/mali-c55-config.h | 45 ++++++++++++-
> > 3 files changed, 124 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/media/platform/arm/mali-c55/mali-c55-params.c b/drivers/media/platform/arm/mali-c55/mali-c55-params.c
> > index 96f1b28a6d77..21f031aaf595 100644
> > --- a/drivers/media/platform/arm/mali-c55/mali-c55-params.c
> > +++ b/drivers/media/platform/arm/mali-c55/mali-c55-params.c
> > @@ -47,6 +47,8 @@
> > * @shading_config: For header->type == MALI_C55_PARAM_MESH_SHADING_CONFIG
> > * @shading_selection: For header->type == MALI_C55_PARAM_MESH_SHADING_SELECTION
> > * @ccm: For header->type == MALI_C55_PARAM_BLOCK_CCM
> > + * @gamma: For header->type == MALI_C55_PARAM_BLOCK_GAMMA_FR and
> > + * header->type = MALI_C55_PARAM_BLOCK_GAMMA_DS
> > * @data: Allows easy initialisation of a union variable with a
> > * pointer into a __u8 array.
> > */
> > @@ -61,6 +63,7 @@ union mali_c55_params_block {
> > const struct mali_c55_params_mesh_shading_config *shading_config;
> > const struct mali_c55_params_mesh_shading_selection *shading_selection;
> > const struct mali_c55_params_ccm *ccm;
> > + const struct mali_c55_params_gamma *gamma;
> > const __u8 *data;
> > };
> >
> > @@ -462,6 +465,70 @@ static void mali_c55_params_ccm(struct mali_c55 *mali_c55,
> > mali_c55_ctx_write(mali_c55, MALI_C55_REG_CCM_ENABLE, 1);
> > }
> >
> > +static void mali_c55_params_gamma(struct mali_c55 *mali_c55,
> > + union mali_c55_params_block block,
> > + __u32 offset, __u32 lut_base)
> > +{
> > + const struct mali_c55_params_gamma *params = block.gamma;
> > +
> > + if (block.header->flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) {
> > + mali_c55_ctx_update_bits(mali_c55,
> > + MALI_C55_REG_GAMMA_RGB_ENABLE + offset,
> > + MALI_C55_GAMMA_ENABLE_MASK, 0x00);
> > + return;
> > + }
> > +
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_GAMMA_GAINS_1 + offset,
> > + MALI_C55_GAMMA_GAIN_R_MASK, params->gains[0]);
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_GAMMA_GAINS_1 + offset,
> > + MALI_C55_GAMMA_GAIN_G_MASK,
> > + MALI_C55_GAMMA_GAIN_G(params->gains[1]));
> > + mali_c55_ctx_update_bits(mali_c55, MALI_C55_REG_GAMMA_GAINS_2 + offset,
> > + MALI_C55_GAMMA_GAIN_B_MASK, params->gains[2]);
> > + mali_c55_ctx_update_bits(mali_c55,
> > + MALI_C55_REG_GAMMA_OFFSETS_1 + offset,
> > + MALI_C55_GAMMA_OFFSET_R_MASK,
> > + params->offs[0]);
> > + mali_c55_ctx_update_bits(mali_c55,
> > + MALI_C55_REG_GAMMA_OFFSETS_1 + offset,
> > + MALI_C55_GAMMA_OFFSET_G_MASK,
> > + MALI_C55_GAMMA_OFFSET_G(params->offs[1]));
> > + mali_c55_ctx_update_bits(mali_c55,
> > + MALI_C55_REG_GAMMA_OFFSETS_2 + offset,
> > + MALI_C55_GAMMA_OFFSET_B_MASK,
> > + params->offs[2]);
> > +
> > + for (unsigned int i = 0; i < MALI_C55_NUM_GAMMA_LUT_ELEMENTS; i++) {
> > + __u32 addr = lut_base + (i * 4);
> > +
> > + mali_c55_ctx_write(mali_c55, addr, params->lut[i]);
> > + }
> > +
> > + mali_c55_ctx_update_bits(mali_c55,
> > + MALI_C55_REG_GAMMA_RGB_ENABLE + offset,
> > + MALI_C55_GAMMA_ENABLE_MASK, 0x1);
> > +}
> > +
> > +static void mali_c55_params_gamma_fr(struct mali_c55 *mali_c55,
> > + union mali_c55_params_block block)
> > +{
> > + return mali_c55_params_gamma(mali_c55, block,
> > + MALI_C55_CAP_DEV_FR_REG_OFFSET,
> > + MALI_C55_REG_FR_GAMMA_RGB_MEM);
> > +}
> > +
> > +static void mali_c55_params_gamma_ds(struct mali_c55 *mali_c55,
> > + union mali_c55_params_block block)
> > +{
> > + /* We cannot apply parameters to DS if it is not fitted. */
> > + if (!(mali_c55->capabilities & MALI_C55_GPS_DS_PIPE_FITTED))
> > + return;
> > +
> > + return mali_c55_params_gamma(mali_c55, block,
> > + MALI_C55_CAP_DEV_DS_REG_OFFSET,
> > + MALI_C55_REG_DS_GAMMA_RGB_MEM);
> > +}
> > +
> > static const mali_c55_params_handler mali_c55_params_handlers[] = {
> > [MALI_C55_PARAM_BLOCK_SENSOR_OFFS] = &mali_c55_params_sensor_offs,
> > [MALI_C55_PARAM_BLOCK_AEXP_HIST] = &mali_c55_params_aexp_hist,
> > @@ -475,6 +542,8 @@ static const mali_c55_params_handler mali_c55_params_handlers[] = {
> > [MALI_C55_PARAM_MESH_SHADING_CONFIG] = &mali_c55_params_lsc_config,
> > [MALI_C55_PARAM_MESH_SHADING_SELECTION] = &mali_c55_params_lsc_selection,
> > [MALI_C55_PARAM_BLOCK_CCM] = &mali_c55_params_ccm,
> > + [MALI_C55_PARAM_BLOCK_GAMMA_FR] = &mali_c55_params_gamma_fr,
> > + [MALI_C55_PARAM_BLOCK_GAMMA_DS] = &mali_c55_params_gamma_ds,
> > };
> >
> > static const struct v4l2_isp_params_block_type_info
> > @@ -515,6 +584,12 @@ mali_c55_params_block_types_info[] = {
> > [MALI_C55_PARAM_BLOCK_CCM] = {
> > .size = sizeof(struct mali_c55_params_ccm),
> > },
> > + [MALI_C55_PARAM_BLOCK_GAMMA_FR] = {
> > + .size = sizeof(struct mali_c55_params_gamma),
> > + },
> > + [MALI_C55_PARAM_BLOCK_GAMMA_DS] = {
> > + .size = sizeof(struct mali_c55_params_gamma),
> > + },
> > };
> >
> > static_assert(ARRAY_SIZE(mali_c55_params_handlers) ==
> > diff --git a/drivers/media/platform/arm/mali-c55/mali-c55-registers.h b/drivers/media/platform/arm/mali-c55/mali-c55-registers.h
> > index f098effde7b4..7a606bd2e843 100644
> > --- a/drivers/media/platform/arm/mali-c55/mali-c55-registers.h
> > +++ b/drivers/media/platform/arm/mali-c55/mali-c55-registers.h
> > @@ -425,11 +425,13 @@ enum mali_c55_interrupts {
> > #define MALI_C55_REG_GAMMA_GAINS_1 0x1c068
> > #define MALI_C55_GAMMA_GAIN_R_MASK GENMASK(11, 0)
> > #define MALI_C55_GAMMA_GAIN_G_MASK GENMASK(27, 16)
> > +#define MALI_C55_GAMMA_GAIN_G(x) ((x) << 16)
> > #define MALI_C55_REG_GAMMA_GAINS_2 0x1c06c
> > #define MALI_C55_GAMMA_GAIN_B_MASK GENMASK(11, 0)
> > #define MALI_C55_REG_GAMMA_OFFSETS_1 0x1c070
> > #define MALI_C55_GAMMA_OFFSET_R_MASK GENMASK(11, 0)
> > #define MALI_C55_GAMMA_OFFSET_G_MASK GENMASK(27, 16)
> > +#define MALI_C55_GAMMA_OFFSET_G(x) ((x) << 16)
>
> Nit: there is an extra tab before ((x) << 16) compared to the surrounding
> defines. Please align this with the style of the nearby MALI_C55_GAMMA_GAIN_G()
> macro.
>
Good catch, thanks
> > #define MALI_C55_REG_GAMMA_OFFSETS_2 0x1c074
> > #define MALI_C55_GAMMA_OFFSET_B_MASK GENMASK(11, 0)
> >
> > @@ -441,6 +443,9 @@ enum mali_c55_interrupts {
> > #define MALI_C55_REG_FR_GAMMA_RGB_ENABLE 0x1c064
> > #define MALI_C55_REG_DS_GAMMA_RGB_ENABLE 0x1c1d8
> >
> > +#define MALI_C55_REG_FR_GAMMA_RGB_MEM 0x18280
> > +#define MALI_C55_REG_DS_GAMMA_RGB_MEM 0x18484
> > +
> > #define MALI_C55_REG_FR_SCALER_HFILT 0x34a8
> > #define MALI_C55_REG_FR_SCALER_VFILT 0x44a8
> > #define MALI_C55_REG_DS_SCALER_HFILT 0x14a8
> > diff --git a/include/uapi/linux/media/arm/mali-c55-config.h b/include/uapi/linux/media/arm/mali-c55-config.h
> > index 0b2085eed81b..7e96564cb89c 100644
> > --- a/include/uapi/linux/media/arm/mali-c55-config.h
> > +++ b/include/uapi/linux/media/arm/mali-c55-config.h
> > @@ -36,6 +36,9 @@
> > */
> > #define MALI_C55_MAX_ZONES (15 * 15)
> >
> > +/* Number of RGB gamma LUT entries. */
> > +#define MALI_C55_NUM_GAMMA_LUT_ELEMENTS 129
> > +
> > /**
> > * struct mali_c55_ae_1024bin_hist - Auto Exposure 1024-bin histogram statistics
> > *
> > @@ -220,6 +223,8 @@ struct mali_c55_stats_buffer {
> > * @MALI_C55_PARAM_MESH_SHADING_CONFIG : Mesh shading tables configuration
> > * @MALI_C55_PARAM_MESH_SHADING_SELECTION: Mesh shading table selection
> > * @MALI_C55_PARAM_BLOCK_CCM: Colour correction matrix
> > + * @MALI_C55_PARAM_BLOCK_GAMMA_FR: Gamma gain and offset for FR pipe
> > + * @MALI_C55_PARAM_BLOCK_GAMMA_DS: Gamma gain and offset for DS pipe
> > */
> > enum mali_c55_param_block_type {
> > MALI_C55_PARAM_BLOCK_SENSOR_OFFS,
> > @@ -234,6 +239,8 @@ enum mali_c55_param_block_type {
> > MALI_C55_PARAM_MESH_SHADING_CONFIG,
> > MALI_C55_PARAM_MESH_SHADING_SELECTION,
> > MALI_C55_PARAM_BLOCK_CCM,
> > + MALI_C55_PARAM_BLOCK_GAMMA_FR,
> > + MALI_C55_PARAM_BLOCK_GAMMA_DS,
> > };
> >
> > /**
> > @@ -795,6 +802,40 @@ struct mali_c55_params_ccm {
> > __u16 offs[3];
> > };
> >
> > +/**
> > + * struct mali_c55_params_gamma - RGB Gamma correction
> > + *
> > + * Gamma correction is used to program a standard gamma curve such as the sRGB
> > + * one. It provides gains and offsets to implement contrast adjustments.
> > + *
> > + * Gamma correction is applied on both the FR and DS pipes separately in the RGB
> > + * colour domain where the following operations take place:
> > + * 1) An offset is subtracted from each colour channel
> > + * 2) Each colour channel is multiplied by a gain
> > + * 3) The Gamma LUT is applied to each colour channel
> > + *
> > + * The Gamma LUT has 129 entries where each node is an unsigned 12 bit number.
> > + * It is expected that LUT[0]=0 and LUT[128]=0xffff, with the other 127 values
>
> lut entries are documented as unsigned 12-bit values, so 0xffff looks
> inconsistent. Should this be 0xfff instead?
Oh yes!
Thanks
j
>
> > + * defining the Gamma correction curve.
> > + *
> > + * As one Gamma correction block is available on both the FR and DS pipes, the
> > + * header.type field should be set to one of either
> > + * MALI_C55_PARAM_BLOCK_GAMMA_FR or MALI_C55_PARAM_BLOCK_GAMMA_DS from
> > + * :c:type:`mali_c55_param_block_type`.
> > + *
> > + * @header: The Mali-C55 parameters block header
> > + * @gains: Gains for the red, green and blue channel in unsigned Q4.8 format
> > + * @offs: Offsets subtracted from the red, green and blue channels
> > + * in unsigned 12-bit format
> > + * @lut: 129-node Gamma LUT in u0.12 format
> > + */
> > +struct mali_c55_params_gamma {
> > + struct v4l2_isp_params_block_header header;
> > + __u16 gains[3];
> > + __u16 offs[3];
> > + __u32 lut[MALI_C55_NUM_GAMMA_LUT_ELEMENTS];
> > +};
> > +
> > /**
> > * define MALI_C55_PARAMS_MAX_SIZE - Maximum size of all Mali C55 Parameters
> > *
> > @@ -819,6 +860,8 @@ struct mali_c55_params_ccm {
> > sizeof(struct mali_c55_params_awb_gains) + \
> > sizeof(struct mali_c55_params_mesh_shading_config) + \
> > sizeof(struct mali_c55_params_mesh_shading_selection) + \
> > - sizeof(struct mali_c55_params_ccm))
> > + sizeof(struct mali_c55_params_ccm) + \
> > + sizeof(struct mali_c55_params_gamma) + \
> > + sizeof(struct mali_c55_params_gamma))
> >
> > #endif /* __UAPI_MALI_C55_CONFIG_H */
> >
>
> --
> Regards,
> Vincenzo
>
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 2/2] media: arm: mali-c55: Add support for RGB Gamma
2026-06-26 14:52 ` Jacopo Mondi
@ 2026-06-26 17:30 ` Linus Walleij
0 siblings, 0 replies; 15+ messages in thread
From: Linus Walleij @ 2026-06-26 17:30 UTC (permalink / raw)
To: Jacopo Mondi
Cc: Nayden.Kanchev, Konstantin Babin, Anthony McGivern,
vincenzo.frascino, linus.walleij, Daniel Scally,
Mauro Carvalho Chehab, linux-media, linux-kernel, Jacopo Mondi
Hi Jacopo,
On Fri, Jun 26, 2026 at 4:52 PM Jacopo Mondi
<jacopo.mondi@ideasonboard.com> wrote:
> > > #define MALI_C55_REG_GAMMA_OFFSETS_1 0x1c070
> > > #define MALI_C55_GAMMA_OFFSET_R_MASK GENMASK(11, 0)
> > > #define MALI_C55_GAMMA_OFFSET_G_MASK GENMASK(27, 16)
> >
> > Same here *GAMMA_OFFSETS_RG
>
> Aren't the R and G masks different ?
>
> Or are you suggesting
> #define MALI_C55_REG_GAMMA_OFFSETS_RG 0x1c070
Yes, exactly, then when reading I know "aha that register contains
R and G gamma".
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2026-06-26 17:30 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-16 14:36 [PATCH v2 0/2] media: mali-c55: Add support for CCM and Gamma Jacopo Mondi
2026-06-16 14:36 ` [PATCH v2 1/2] media: arm: mali-c55: Add support for CCM Jacopo Mondi
2026-06-25 22:35 ` Linus Walleij
2026-06-26 9:44 ` Vincenzo Frascino
2026-06-26 14:45 ` Jacopo Mondi
2026-06-16 14:36 ` [PATCH v2 2/2] media: arm: mali-c55: Add support for RGB Gamma Jacopo Mondi
2026-06-25 22:53 ` Linus Walleij
2026-06-26 14:52 ` Jacopo Mondi
2026-06-26 17:30 ` Linus Walleij
2026-06-26 9:52 ` Vincenzo Frascino
2026-06-26 14:55 ` Jacopo Mondi
2026-06-18 13:28 ` [PATCH v2 0/2] media: mali-c55: Add support for CCM and Gamma Linus Walleij
2026-06-18 13:51 ` Jacopo Mondi
2026-06-18 14:48 ` Konstantin Ryabitsev
2026-06-18 14:57 ` Jacopo Mondi
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.