From patchwork Tue Jun 23 13:55:02 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 27018 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 059E6C3306 for ; Tue, 23 Jun 2026 13:55:25 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id F16E26579F; Tue, 23 Jun 2026 15:55:20 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="facpojy6"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 11AD8657A1 for ; Tue, 23 Jun 2026 15:55:11 +0200 (CEST) Received: from [192.168.1.7] (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 3F7272273; Tue, 23 Jun 2026 15:54:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1782222873; bh=qBmjObkPWkG4+MI0nc+b7AQKq0A66qP27yBdaPl29Hg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=facpojy6SlN5VqwL8h5WVmEttww/vWBtIeDlr7Q8b267FbcLcC1y9gL70K3mmtK5X TIinYLe+1JdaXfE0QypH1j9zpU1Q5OCZrqCedeZbyChfiOEy8DNzkKHehuln185Y7f 4+1SRBGMy/V/Hs2JlnnzLuOiwDnTar1WFcLkOBcI= From: Jacopo Mondi Date: Tue, 23 Jun 2026 15:55:02 +0200 Subject: [PATCH v2 07/11] include: linux: mali-c55: Update to support CCM and Gamma MIME-Version: 1.0 Message-Id: <20260623-libipa-algorithms-v2-7-f97433f12e4e@ideasonboard.com> References: <20260623-libipa-algorithms-v2-0-f97433f12e4e@ideasonboard.com> In-Reply-To: <20260623-libipa-algorithms-v2-0-f97433f12e4e@ideasonboard.com> To: libcamera-devel@lists.libcamera.org Cc: Jacopo Mondi X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5472; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=qBmjObkPWkG4+MI0nc+b7AQKq0A66qP27yBdaPl29Hg=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBqOpA7VlYpEX56/s4oQPIzNcL1M1y0lxQeLVkG4 Z6mN51O/oKJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCajqQOwAKCRByNAaPFqFW PBgeEAC6k/GhV9w4XzSBFdH3NkjWvp+R1nemxZyzKdyEk2fu5GgrxFA1U1kLBsg521Ma+eq9BMQ evdc+rp/rlZDe754Yuf4Pd60wEwKx+z00q8F8kUzLhYKcocyUCjSQqCWIgzq2rIK/2u7fMKPNfi +co0Bi63MMsyAEH8Li560Lyq/pHJ16xZ1RjksDRHIxN/Kcac6wluN3RMKQihRsntYuyB+vwuqEQ o0l9OIbc1LD+uhHdbiwUCcQAdwmdoFbgM8/zHOTSL3LHiOTet/U0R3SzPCEWXgwa9JEypNOTQoe 1QL4pcxjXM3gdjYvkMIWcFKwX9UzUBgEuRor8ey2bl/GBRHGWnA7IBQMS0Y8jFWqxToWFVf5QLp oF/lDQmnA+gfIclCBw/sN27xMrfE1I1lMl1qgDuf7VZ8uNPkT0Prt17JEvIGbpox3L7Sr4UpvUl NXfaJWtOGmrPAIwRB5FZ6UXLYxjRHCqHME+Fi0bJEedPWGSRmgmIx3Rt3PBD2jUb4JumgZjU1Vp pW2FBxMNzWP31cW44wtOpSxgtFNRTr8YWmpHHKDMCuRiNJ7EM66/2fXLBaGbyPb61S1UTHLeXsv bwKkvhgfy5DK+znfpje74jfzXITjbzfgSXZIuGy2CBR8z+LyWQeXnLWvJgGxOwX+qxkKfdCglJG wNqw7LnKZ4mWe5g== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" 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 --- 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 */