[v2,07/11] include: linux: mali-c55: Update to support CCM and Gamma
diff mbox series

Message ID 20260623-libipa-algorithms-v2-7-f97433f12e4e@ideasonboard.com
State Superseded
Headers show
Series
  • ipa: libipa: Introduce libipa algorithms
Related show

Commit Message

Jacopo Mondi June 23, 2026, 1:55 p.m. UTC
Update the Mali-C55 uAPI header to add support for CCM and the
RGB Gamma.

Patches have been posted upstream but not yet merged
https://patchwork.linuxtv.org/project/linux-media/list/?series=26497

Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
---
 include/linux/media/arm/mali-c55-config.h | 85 ++++++++++++++++++++++++++++++-
 1 file changed, 84 insertions(+), 1 deletion(-)

Comments

Dan Scally June 23, 2026, 5:30 p.m. UTC | #1
Hi Jacopo

On 23/06/2026 14:55, Jacopo Mondi wrote:
> Update the Mali-C55 uAPI header to add support for CCM and the
> RGB Gamma.
> 
> Patches have been posted upstream but not yet merged
> https://patchwork.linuxtv.org/project/linux-media/list/?series=26497
> 
> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
> ---

Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>

>   include/linux/media/arm/mali-c55-config.h | 85 ++++++++++++++++++++++++++++++-
>   1 file changed, 84 insertions(+), 1 deletion(-)
> 
> diff --git a/include/linux/media/arm/mali-c55-config.h b/include/linux/media/arm/mali-c55-config.h
> index 3d335f950eeb..06eb85a6d66a 100644
> --- a/include/linux/media/arm/mali-c55-config.h
> +++ b/include/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
>    *
> @@ -219,6 +222,9 @@ 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
> + * @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,
> @@ -232,6 +238,9 @@ 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,
> +	MALI_C55_PARAM_BLOCK_GAMMA_FR,
> +	MALI_C55_PARAM_BLOCK_GAMMA_DS,
>   };
>   
>   /**
> @@ -757,6 +766,77 @@ 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];
> +};
> +
> +/**
> + * 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;
> +	__u8 rgb_enable;
> +	__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
>    *
> @@ -780,6 +860,9 @@ 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) +			\
> +	sizeof(struct mali_c55_params_gamma) +			\
> +	sizeof(struct mali_c55_params_gamma))
>   
>   #endif /* __UAPI_MALI_C55_CONFIG_H */
>
Kieran Bingham June 24, 2026, 2:55 p.m. UTC | #2
Quoting Jacopo Mondi (2026-06-23 14:55:02)
> Update the Mali-C55 uAPI header to add support for CCM and the
> RGB Gamma.
> 
> Patches have been posted upstream but not yet merged
> https://patchwork.linuxtv.org/project/linux-media/list/?series=26497
> 
> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>

Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

> ---
>  include/linux/media/arm/mali-c55-config.h | 85 ++++++++++++++++++++++++++++++-
>  1 file changed, 84 insertions(+), 1 deletion(-)
> 
> diff --git a/include/linux/media/arm/mali-c55-config.h b/include/linux/media/arm/mali-c55-config.h
> index 3d335f950eeb..06eb85a6d66a 100644
> --- a/include/linux/media/arm/mali-c55-config.h
> +++ b/include/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
>   *
> @@ -219,6 +222,9 @@ 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
> + * @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,
> @@ -232,6 +238,9 @@ 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,
> +       MALI_C55_PARAM_BLOCK_GAMMA_FR,
> +       MALI_C55_PARAM_BLOCK_GAMMA_DS,
>  };
>  
>  /**
> @@ -757,6 +766,77 @@ 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];
> +};
> +
> +/**
> + * 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;
> +       __u8 rgb_enable;
> +       __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
>   *
> @@ -780,6 +860,9 @@ 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) +                    \
> +       sizeof(struct mali_c55_params_gamma) +                  \
> +       sizeof(struct mali_c55_params_gamma))
>  
>  #endif /* __UAPI_MALI_C55_CONFIG_H */
> 
> -- 
> 2.54.0
>

Patch
diff mbox series

diff --git a/include/linux/media/arm/mali-c55-config.h b/include/linux/media/arm/mali-c55-config.h
index 3d335f950eeb..06eb85a6d66a 100644
--- a/include/linux/media/arm/mali-c55-config.h
+++ b/include/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
  *
@@ -219,6 +222,9 @@  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
+ * @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,
@@ -232,6 +238,9 @@  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,
+	MALI_C55_PARAM_BLOCK_GAMMA_FR,
+	MALI_C55_PARAM_BLOCK_GAMMA_DS,
 };
 
 /**
@@ -757,6 +766,77 @@  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];
+};
+
+/**
+ * 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;
+	__u8 rgb_enable;
+	__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
  *
@@ -780,6 +860,9 @@  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) +			\
+	sizeof(struct mali_c55_params_gamma) +			\
+	sizeof(struct mali_c55_params_gamma))
 
 #endif /* __UAPI_MALI_C55_CONFIG_H */