From nobody Sat Oct 4 03:15:51 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1F18831A05E; Wed, 20 Aug 2025 12:58:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694708; cv=none; b=SfMczAKtVurKirlKa5zR8Bw9teNR4yD62Kar/NERxcPC7IF5YjX+K7biuPHWhQX5HF5y6fmmBdfSkmyDfyxWkFeAKkYoUPz6u4+Z41aNtIeVQr6O+hxhwI89NQni6zNzvL8kd0LDW032AJH61R+6ifP8W4bmrXF7vUJpCnaSsEM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694708; c=relaxed/simple; bh=ZWkXltt1L+/SAEorakbT4Etb8UoMMCyxdSrJDjkotCU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CzzQ3hqvLBM4IVPRGJyQhfNKPDteB81SZDjTdlTC1RIb3JBRiW8/E/b/dyeWNpIutAg3tL1v1+jtTDL56Y0/UNgRFZF2vSUOADlWUS0z33qrV1jXYnTI9e2bhtCIZHZvS3DmankmN9OFkybZrOKwwKYX2AXizki+xUBQk3arFQU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=rKhOYCOl; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="rKhOYCOl" Received: from [192.168.1.106] (mob-5-90-62-213.net.vodafone.it [5.90.62.213]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D2C05710; Wed, 20 Aug 2025 14:57:22 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1755694643; bh=ZWkXltt1L+/SAEorakbT4Etb8UoMMCyxdSrJDjkotCU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=rKhOYCOlYMtQS/KEJLoVP4RvymF25LPHnFNOpZ+S09fF9gNCHXdKgxHrqNUHUnxmJ fuC2/0v7C3ZcwY+kEtQQRoW8WlKlOieVdzwS6zpz4CUW8M0PkxQUz9PFZgAZaOYBZO svL7ChSJV83mWzfXGXeDPLEQJhSoCDIZ53Z3yQ0g= From: Jacopo Mondi Date: Wed, 20 Aug 2025 14:58:09 +0200 Subject: [PATCH v4 1/8] media: uapi: Introduce V4L2 extensible params Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250820-extensible-parameters-validation-v4-1-30fe5a99cb1f@ideasonboard.com> References: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> In-Reply-To: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> To: Dafna Hirschfeld , Laurent Pinchart , Keke Li , Mauro Carvalho Chehab , Heiko Stuebner , Dan Scally , Sakari Ailus Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Jacopo Mondi X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=8630; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=ZWkXltt1L+/SAEorakbT4Etb8UoMMCyxdSrJDjkotCU=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBopcZqlxAVF9PpVw8EjHQ1UWZ5uTtM4usnFhrju /8KUDMXtfiJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaKXGagAKCRByNAaPFqFW PEGLD/9U+G2aN7uUhQea8OM3EBe2KvvBYGLmISIpMFg8i2jwo+8WBzz0NUb/w7TLsNMdpB9+EAB JLLmCGvqssWAN95ECiUJ2UiF6lDotXD3RAQ8dtEJpKeYsatL1VQAMN4tUAYKEK3xM/6gO/n0F7k WAG3+aUQdKJQyiWHZV0cEhd884pNU0AtFPBbDNcx4H1N5GhFSMYngWCtuzVDjUGEI7yzQcsCc36 4roP0ReE1qywq2AGu2I3WpzBnQuZurcibaAR8tjqd2Z7VW3pqAhvFJpzx9p2KqmKPdqSLcrikyR pfKg4iah47sZQH49zDQjnDalHzsugwmFwe7y9qA06x+R2euPtudAt4Zp+Kv1atshH0eSk3phSG9 NQs0OSR1uFxoaV2LZwZ8tJvQfFMGVU2pnSTgrkB90uUNwTHfsWAvgyZx9VRx7kCK7JWwkRq7Bp1 dCvn2wxga124J3FaAJNEUjFycDOsGXagHUpJmp0huwWiO9j6bC4LHvzpY6UMoKbH4UDapSbYzii yM38FAiFPPAlPsHefNUfigIkf4I3UNaxsmqhodlzKFjBTbwu8u7E2NWvQWvQ8F8u5Nz6tIxGuH7 Mdi74UuCfjpg0h6/dVYf5Eqjyloj9PaR1207DwpfrOA+PHJp6VZph3HJtp7I+hHchlF7xRZsusF n8Ap3v5yP8Kb+vg== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B Introduce v4l2-extensible-params.h in the Linux kernel uAPI. The header defines two types that all drivers that use the extensible parameters format for ISP configuration shall use to build their own format versions. The newly introduce type v4l2_params_block represent the header to be prepend to each ISP configuration block and the v4l2_params_buffer type represent the base type for the configuration parameters buffer. The v4l2_params_buffer represents the container for the ISP configuration data block. The generic type is defined with a 0-sized data block that specific ISP implementation shall properly size according to their capabilities. [Add v4l2_params_buffer_size()] Signed-off-by: Daniel Scally Reviewed-by: Daniel Scally Signed-off-by: Jacopo Mondi --- MAINTAINERS | 6 + include/uapi/linux/media/v4l2-extensible-params.h | 146 ++++++++++++++++++= ++++ 2 files changed, 152 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index fe168477caa45799dfe07de2f54de6d6a1ce0615..67216d1e92d7ac81617bb3c4329= e4096aa205706 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -26380,6 +26380,12 @@ F: drivers/media/i2c/vd55g1.c F: drivers/media/i2c/vd56g3.c F: drivers/media/i2c/vgxy61.c =20 +V4L2 EXTENSIBLE PARAMETERS FORMAT +M: Jacopo Mondi +L: linux-media@vger.kernel.org +S: Maintained +F: include/uapi/linux/media/v4l2-extensible-params.h + VF610 NAND DRIVER M: Stefan Agner L: linux-mtd@lists.infradead.org diff --git a/include/uapi/linux/media/v4l2-extensible-params.h b/include/ua= pi/linux/media/v4l2-extensible-params.h new file mode 100644 index 0000000000000000000000000000000000000000..aca643f505f2705eeca7337f0dd= 182bcfd1ea60d --- /dev/null +++ b/include/uapi/linux/media/v4l2-extensible-params.h @@ -0,0 +1,146 @@ +/* SPDX-License-Identifier: ((GPL-2.0+ WITH Linux-syscall-note) OR MIT) */ +/* + * Video4Linux2 extensible configuration parameters base types + * + * Copyright (C) 2025 Ideas On Board Oy + * Author: Jacopo Mondi + */ + +#ifndef _UAPI_V4L2_PARAMS_H_ +#define _UAPI_V4L2_PARAMS_H_ + +#include +#include + +#define V4L2_PARAMS_FL_BLOCK_DISABLE (1U << 0) +#define V4L2_PARAMS_FL_BLOCK_ENABLE (1U << 1) + +/* + * Reserve the first 8 bits for V4L2_PARAMS_FL_* flag. + * + * Platform-specific flags should be defined as: + * #define PLATFORM_SPECIFIC_FLAG0 ((1U << V4L2_PARAMS_FL_PLATFORM_FLA= GS(0)) + * #define PLATFORM_SPECIFIC_FLAG1 ((1U << V4L2_PARAMS_FL_PLATFORM_FLA= GS(1)) + */ +#define V4L2_PARAMS_FL_PLATFORM_FLAGS(n) ((n) + 8) + +/** + * struct v4l2_params_block_header - V4L2 extensible parameters block head= er + * + * This structure represents the common part of all the ISP configuration + * blocks. Each parameters block shall embed an instance of this structure= type + * as its first member, followed by the block-specific configuration data.= The + * driver inspects this common header to discern the block type and its si= ze and + * properly handle the block content by casting it to the correct block-sp= ecific + * type. + * + * The @type field is one of the values enumerated by each platform-specif= ic ISP + * block types which specifies how the data should be interpreted by the d= river. + * The @size field specifies the size of the parameters block and is used = by the + * driver for validation purposes. + * + * The @flags field is a bitmask of per-block flags V4L2_PARAMS_FL_* and + * platform-specific flags specified by the platform-specific header. + * + * Documentation of the platform-specific flags handling is specified by t= he + * platform-specific block header type: + * + * - Rockchip RkISP1: :c:type:`rkisp1_ext_params_block_type` + * - Amlogic C3: :c:type:`c3_isp_params_block_type` + * + * Userspace is responsible for correctly populating the parameters block = header + * fields (@type, @flags and @size) and the block-specific parameters. + * + * @type: The parameters block type (platform-specific) + * @flags: A bitmask of block flags (platform-specific) + * @size: Size (in bytes) of the parameters block, including this header + */ +struct v4l2_params_block_header { + __u16 type; + __u16 flags; + __u32 size; +} __attribute__((aligned(8))); + +/** + * v4l2_params_buffer_size - Calculate size of v4l2_params_buffer for a pl= atform + * + * Users of the v4l2 extensible parameters will have differing sized data = arrays + * depending on their specific parameter buffers. Drivers and userspace wi= ll + * need to be able to calculate the appropriate size of the struct to + * accommodate all ISP configuration blocks provided by the platform. + * This macro provides a convenient tool for the calculation. + * + * Each driver shall provide a definition of their extensible parameters + * implementation data buffer size. As an example: + * + * #define PLATFORM_BLOCKS_MAX_SIZE \ + * sizeof(platform_block_0) + \ + * sizeof(platform_block_1) + * + * #define PLATFORM_BUFFER_SIZE \ + * v4l2_params_buffer_size(PLATFORM_BLOCKS_MAX_SIZE) + * + * Drivers are then responsible for allocating buffers of the proper size + * by assigning PLATFORM_BUFFER_SIZE to the per-plane size of the videobuf2 + * .queue_setup() operation and userspace shall use PLATFORM_BUFFER_SIZE + * when populating the ISP configuration data buffer. + * + * @max_params_size: The total size of the ISP configuration blocks + */ +#define v4l2_params_buffer_size(max_params_size) \ + (offsetof(struct v4l2_params_buffer, data) + (max_params_size)) + +/** + * struct v4l2_params_buffer - V4L2 extensible parameters configuration + * + * This struct contains the configuration parameters of the ISP algorithms, + * serialized by userspace into a data buffer. Each configuration parameter + * block is represented by a block-specific structure which contains a + * :c:type:`v4l2_params_block_header` entry as first member. Userspace pop= ulates + * the @data buffer with configuration parameters for the blocks that it i= ntends + * to configure. As a consequence, the data buffer effective size changes + * according to the number of ISP blocks that userspace intends to configu= re and + * is set by userspace in the @data_size field. + * + * The parameters buffer is versioned by the @version field to allow modif= ying + * and extending its definition. Userspace shall populate the @version fie= ld to + * inform the driver about the version it intends to use. The driver will = parse + * and handle the @data buffer according to the data layout specific to the + * indicated version and return an error if the desired version is not + * supported. + * + * For each ISP block that userspace wants to configure, a block-specific + * structure is appended to the @data buffer, one after the other without = gaps + * in between nor overlaps. Userspace shall populate the @data_size field = with + * the effective size, in bytes, of the @data buffer. + * + * Drivers shall take care of properly sizing of the extensible parameters + * buffer @data array. The v4l2_params_buffer type is defined with a + * flexible-array-member at the end, which resolves to a size of 0 bytes w= hen + * inspected with sizeof(struct v4l2_params_buffer). This of course is not + * suitable for neither buffer allocation in the kernel driver nor for pro= per + * handling in userspace of the @data buffer it has to populate. + * + * Drivers using this type in their userspace API definition are responsib= le + * for providing the exact definition of the @data buffer size using the + * v4l2_params_buffer_size() macro. The size shall be used + * by the driver for buffers allocation and by userspace for populating the + * @data buffer before queueing it to the driver + * + * Drivers that were already using extensible-parameters before the introd= uction + * of this file define their own type-convertible implementation of this + * type, see: + * - Rockchip RkISP1: :c:type:`rkisp1_ext_params_cfg` + * - Amlogic C3: :c:type:`c3_isp_params_cfg` + * + * @version: The parameters buffer version (platform-specific) + * @data_size: The configuration data effective size, excluding this header + * @data: The configuration data + */ +struct v4l2_params_buffer { + __u32 version; + __u32 data_size; + __u8 data[] __counted_by(data_size); +}; + +#endif /* _UAPI_V4L2_PARAMS_H_ */ --=20 2.50.1 From nobody Sat Oct 4 03:15:51 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6F097311C1E; Wed, 20 Aug 2025 12:58:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694709; cv=none; b=rRIZxCSKtgEXHdHtAM79dR8qy8fkOJ2OzXGvixjhM9r+H3y9WarBRCFjbCz+gsZRKdNEpVgC4bSE/nWqZolhQ9xm9ZhPMXCPPbRXHwPNzAXJ5lgVbMSwSG0r/sjnh376RSvSVBoxn2LF4g3/HMomcIhJcjX81B6sAePk4OpdJaA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694709; c=relaxed/simple; bh=J5eSElXXeku9ICNAMtSj+V7RX5KH1v+WgaLna1Zype4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Cc77R5Ms+6qW0eDPjMg3Z00H18ZoErjqB4pen+CZt0SCu6Ht5kD5+7FcbRF3Op85rq7wydgU8n5HVoWzMwpZs0IOw5NObuDkSW7RQFIVFZubr2gsrB5AD01Eu0o8q0vO2BEIrjZg+PzAWdEhcVDvmwciFakT46/D8JYGLO4OkoE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=s2Ht81zs; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="s2Ht81zs" Received: from [192.168.1.106] (mob-5-90-62-213.net.vodafone.it [5.90.62.213]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D04291737; Wed, 20 Aug 2025 14:57:23 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1755694644; bh=J5eSElXXeku9ICNAMtSj+V7RX5KH1v+WgaLna1Zype4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=s2Ht81zs48xK5rqPmziq99mEEAWrBBPZajsyfV8dZWRj+zUR1CGJW2RBRKoKZPXP0 zxmJP/mar4xEToQ372byYyEwWyBc6fR9aF6PeSPsMbwLanRFCYZgwVtEX7vEmC6CFl rS9/oHPS15+hMNOGh1w6R00AsczuHibQX9r+it/U= From: Jacopo Mondi Date: Wed, 20 Aug 2025 14:58:10 +0200 Subject: [PATCH v4 2/8] media: uapi: Convert RkISP1 to V4L2 extensible params Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250820-extensible-parameters-validation-v4-2-30fe5a99cb1f@ideasonboard.com> References: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> In-Reply-To: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> To: Dafna Hirschfeld , Laurent Pinchart , Keke Li , Mauro Carvalho Chehab , Heiko Stuebner , Dan Scally , Sakari Ailus Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Jacopo Mondi X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6996; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=J5eSElXXeku9ICNAMtSj+V7RX5KH1v+WgaLna1Zype4=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBopcZrAkHw36Qwnu3AhoruBk8I/XV9hFK6r/XBi wC516mk4AeJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaKXGawAKCRByNAaPFqFW PH8oD/9KtEHCGxoRtL7h5LNZOsvU94ZqlPJ9JoOq9MMht02OkX8meXbckLVwc6aDLJJBokKx5MZ tKz2+isFcnIkRtebwZ5U60M6tZ+b8cpoaQnYvbuzuhMqwDNf8PuKSpJiSz31ZSyeET5jT0qRUce Q9+zk0udYd/sVyh2moUrIIyzqarfinU7/3u6yTNQX35QFFmxdIw0AxZqpZa4pTmTVbY9c7KSKgb Z01DyHMKTDEjsr9R7x00nctwi6/ugWyIgfTAJ8F/EmIiVuLBxrzibVDZ5lJYnQkFvbH/ntmLEfu T0XwnbkcYDo6AwCHkXalEm8nigzUkyxV2peUk82UUvg5hpqOh9q6ftPUN46pqa/9fjaJZZHjtzH /SIXlxxaDUPHGtjSaj7WJ9+C/huu09OlaqEtylJ9gTy/URx+YsUlOTKYBEoGXV/S7UxCJgHTKsR AW1vp9vlECav9uRk53A7TL3NGpoIoKlv5oFIytAKYqTfBDpy6dMlHJn0Mq3+jVGxNwMbtwkx0k8 yf+ewcuciZzp7cIp74HNOe6QYuhvniwN6a/NEUO9OPx4gqb7Iad4mfUyQFhrCwbKiN+jukO9ae9 5bieBL3tCVQuwn4+0/4HYnjLOBxQrhzG+L3alRk4MD+gttxrrf0pfGNvslx/YvxCMiQj4WOVMUw ieS3lp+QJT2eEWg== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B With the introduction of common types for extensible parameters format, convert the rkisp1-config.h header to use the new types. Factor-out the documentation that is now part of the common header and only keep the driver-specific on in place. The conversion to use common types doesn't impact userspace as the new types are either identical to the ones already existing in the RkISP1 uAPI or are 1-to-1 type convertible. Reviewed-by: Daniel Scally Signed-off-by: Jacopo Mondi --- include/uapi/linux/rkisp1-config.h | 67 +++++++++++++---------------------= ---- 1 file changed, 23 insertions(+), 44 deletions(-) diff --git a/include/uapi/linux/rkisp1-config.h b/include/uapi/linux/rkisp1= -config.h index 3b060ea6eed71b87d79abc8401eae4e9c9f5323a..fc040c7fb13cf18eaf8d9067e7b= e38bff120e6f6 100644 --- a/include/uapi/linux/rkisp1-config.h +++ b/include/uapi/linux/rkisp1-config.h @@ -7,8 +7,13 @@ #ifndef _UAPI_RKISP1_CONFIG_H #define _UAPI_RKISP1_CONFIG_H =20 +#ifdef __KERNEL__ +#include +#endif /* __KERNEL__ */ #include =20 +#include + /* Defect Pixel Cluster Detection */ #define RKISP1_CIF_ISP_MODULE_DPCC (1U << 0) /* Black Level Subtraction */ @@ -1158,26 +1163,21 @@ enum rkisp1_ext_params_block_type { RKISP1_EXT_PARAMS_BLOCK_TYPE_WDR, }; =20 -#define RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE (1U << 0) -#define RKISP1_EXT_PARAMS_FL_BLOCK_ENABLE (1U << 1) +#define RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE V4L2_PARAMS_FL_BLOCK_DISABLE +#define RKISP1_EXT_PARAMS_FL_BLOCK_ENABLE V4L2_PARAMS_FL_BLOCK_ENABLE =20 /* A bitmask of parameters blocks supported on the current hardware. */ #define RKISP1_CID_SUPPORTED_PARAMS_BLOCKS (V4L2_CID_USER_RKISP1_BASE + 0x= 01) =20 /** - * struct rkisp1_ext_params_block_header - RkISP1 extensible parameters bl= ock - * header + * rkisp1_ext_params_block_header - RkISP1 extensible parameters block hea= der * * This structure represents the common part of all the ISP configuration - * blocks. Each parameters block shall embed an instance of this structure= type - * as its first member, followed by the block-specific configuration data.= The - * driver inspects this common header to discern the block type and its si= ze and - * properly handle the block content by casting it to the correct block-sp= ecific - * type. + * blocks and is identical to :c:type:`v4l2_params_block_header`. * - * The @type field is one of the values enumerated by + * The type field is one of the values enumerated by * :c:type:`rkisp1_ext_params_block_type` and specifies how the data shoul= d be - * interpreted by the driver. The @size field specifies the size of the + * interpreted by the driver. The size field specifies the size of the * parameters block and is used by the driver for validation purposes. * * The @flags field is a bitmask of per-block flags RKISP1_EXT_PARAMS_FL_*. @@ -1193,14 +1193,14 @@ enum rkisp1_ext_params_block_type { * If a new configuration of an ISP block has to be applied userspace shall * fully populate the ISP block configuration and omit setting the * RKISP1_EXT_PARAMS_FL_BLOCK_ENABLE and RKISP1_EXT_PARAMS_FL_BLOCK_DISABL= E bits - * in the @flags field. + * in the flags field. * * Setting both the RKISP1_EXT_PARAMS_FL_BLOCK_ENABLE and - * RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE bits in the @flags field is not allo= wed + * RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE bits in the flags field is not allow= ed * and not accepted by the driver. * * Userspace is responsible for correctly populating the parameters block = header - * fields (@type, @flags and @size) and the block-specific parameters. + * fields (type, flags and size) and the block-specific parameters. * * For example: * @@ -1220,17 +1220,8 @@ enum rkisp1_ext_params_block_type { * bls->config.fixed_val.gb =3D blackLevelGreenB_; * bls->config.fixed_val.b =3D blackLevelBlue_; * } - * - * @type: The parameters block type, see - * :c:type:`rkisp1_ext_params_block_type` - * @flags: A bitmask of block flags - * @size: Size (in bytes) of the parameters block, including this header */ -struct rkisp1_ext_params_block_header { - __u16 type; - __u16 flags; - __u32 size; -}; +#define rkisp1_ext_params_block_header v4l2_params_block_header =20 /** * struct rkisp1_ext_params_bls_config - RkISP1 extensible params BLS conf= ig @@ -1594,21 +1585,7 @@ enum rksip1_ext_param_buffer_version { /** * struct rkisp1_ext_params_cfg - RkISP1 extensible parameters configurati= on * - * This struct contains the configuration parameters of the RkISP1 ISP - * algorithms, serialized by userspace into a data buffer. Each configurat= ion - * parameter block is represented by a block-specific structure which cont= ains a - * :c:type:`rkisp1_ext_params_block_header` entry as first member. Userspa= ce - * populates the @data buffer with configuration parameters for the blocks= that - * it intends to configure. As a consequence, the data buffer effective si= ze - * changes according to the number of ISP blocks that userspace intends to - * configure and is set by userspace in the @data_size field. - * - * The parameters buffer is versioned by the @version field to allow modif= ying - * and extending its definition. Userspace shall populate the @version fie= ld to - * inform the driver about the version it intends to use. The driver will = parse - * and handle the @data buffer according to the data layout specific to the - * indicated version and return an error if the desired version is not - * supported. + * This is the driver-specific implementation of :c:type:`v4l2_params_buff= er`. * * Currently the single RKISP1_EXT_PARAM_BUFFER_V1 version is supported. * When a new format version will be added, a mechanism for userspace to q= uery @@ -1624,11 +1601,6 @@ enum rksip1_ext_param_buffer_version { * the maximum value represents the blocks supported by the kernel driver, * independently of the device instance. * - * For each ISP block that userspace wants to configure, a block-specific - * structure is appended to the @data buffer, one after the other without = gaps - * in between nor overlaps. Userspace shall populate the @data_size field = with - * the effective size, in bytes, of the @data buffer. - * * The expected memory layout of the parameters buffer is:: * * +-------------------- struct rkisp1_ext_params_cfg -------------------+ @@ -1678,4 +1650,11 @@ struct rkisp1_ext_params_cfg { __u8 data[RKISP1_EXT_PARAMS_MAX_SIZE]; }; =20 +#ifdef __KERNEL__ +/* Make sure the header is type-convertible to the generic v4l2 params one= */ +static_assert((sizeof(struct rkisp1_ext_params_cfg) - + RKISP1_EXT_PARAMS_MAX_SIZE) =3D=3D + sizeof(struct v4l2_params_buffer)); +#endif /* __KERNEL__ */ + #endif /* _UAPI_RKISP1_CONFIG_H */ --=20 2.50.1 From nobody Sat Oct 4 03:15:51 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 96F7921ABB0; Wed, 20 Aug 2025 12:58:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694711; cv=none; b=TU2f+3AltXBqX/EPJJimbIOfxnMvsuhBjXOXfvscY3KzhE0oSc4gx8L6smVI1a0NmQUtzJFggkke1yV2OX6PUzwyvmvfZO25c+K9zb/ccQawZbPrflR9GmmnQmgQg64lYzDKhQ8FuTcU77huIOqEW94omJ6Cg2d4ispirD+nqeo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694711; c=relaxed/simple; bh=U7TtISZ9KEkfggbxSuQktBM+tgxpd90TPfrry/poVGI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=h6lkcRwGTrldK+6JkzrU0VPmbQ/J/61A1TeuY9U1vBzbNY3StuVhzVNtKDy8p2uJ5C8VHlSrKnwDUR3IFQgSSUmabfq1MYsrm6CMg65Om9btNxtHNUpVPcbLZxJ3nmS9yo/b5IESaUjZ+Nt708doFyvVWlrWQ/bxOuiao6GDuXw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=MzWUL1zC; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="MzWUL1zC" Received: from [192.168.1.106] (mob-5-90-62-213.net.vodafone.it [5.90.62.213]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id DC7F31AE2; Wed, 20 Aug 2025 14:57:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1755694645; bh=U7TtISZ9KEkfggbxSuQktBM+tgxpd90TPfrry/poVGI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=MzWUL1zCNFZkJeyJkIQEQ/9nVcp/6wU+oTMIZU640mvx7s/QnYbPIwsEc/utX+PXs C1JEA5/g67VFdgAE+Qpm8iNChdpIkPyVlnDHxvuf7pA5CMkOlyBs3mSx6j7NGdnf8Q 5bzp3hz+N4V4xa+jHCh4zZbPq9QOgJ7j8dkNhSFQ= From: Jacopo Mondi Date: Wed, 20 Aug 2025 14:58:11 +0200 Subject: [PATCH v4 3/8] media: uapi: Convert Amlogic C3 to V4L2 extensible params Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250820-extensible-parameters-validation-v4-3-30fe5a99cb1f@ideasonboard.com> References: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> In-Reply-To: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> To: Dafna Hirschfeld , Laurent Pinchart , Keke Li , Mauro Carvalho Chehab , Heiko Stuebner , Dan Scally , Sakari Ailus Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Jacopo Mondi X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4678; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=U7TtISZ9KEkfggbxSuQktBM+tgxpd90TPfrry/poVGI=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBopcZrl3yLv/+1pdzMFnDC4qgvuGnFTE/G6ymzA 1VBEo8BbwiJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaKXGawAKCRByNAaPFqFW PCB2D/9uGiVH+feZ2RddhmXr/mLjqHqSkz84I4hf49PA2Iq/qieBsQRs9/8FnDpuBXetoY1ZWgR MX+pvfHKjPiXt0h5YXwqJUFBFXkalWPKe5zkA/aTJrikbzmncPzbfvgrkkdYg0BCW4Q+XruCGQR Yctc/jo9ILBeVIG21rq5ypH2/5NjROP9rS+5/VWriAgtjMUZJIxJ6mfNCYjKuOxkvhesfA8GFX4 ic0LZuAAcBe36a6i0eM3abbRoA3PNNT1aycfcyDWKH6n5LFfOia+WD3j8C2RwDUq9PCjLVz7k07 Q/QtgSY8SgUNtbZDyfl3WF2C04XaMxo5IZ9dnXDSa7OGFNWH8Cj6QbX+k1L/Zoip+tqJu2tLlK6 K1lfYbPp5pMKEW2A3eMuCEkL4aiUQgnOD5VawRQUkcD4fa0UyJ5fVbrnpTwsXStfbywyd5BPee3 kxaGB49YOhwuQlu0jNY22NwY5NF6cjB/qnB5SIEoSCPhtD0ybl9j5IJR0Fa3Nv1i0L9159w+K+U APRaIKk4k+TcwHS9n9mCzP0jTXh5Bysml4o186EPxMF4bwBHjmM5BwaOWs+aOkx2gr2EIS7lGVQ 7XhFmtiW2G2ncY3lHJelDyeChupUhHbnbAvloO5KLNsqILTeR41lVDZErmZhb1oBDNvQSKkhsXd wxPmiexq3R9jQ6w== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B With the introduction of common types for extensible parameters format, convert the c3-isp-config.h header to use the new types. Factor-out the documentation that is now part of the common header and only keep the driver-specific on in place. The conversion to use common types doesn't impact userspace as the new types are either identical to the ones already existing in the C3 ISP uAPI or are 1-to-1 type convertible. Reviewed-by: Daniel Scally Reviewed-by: Keke Li Signed-off-by: Jacopo Mondi --- include/uapi/linux/media/amlogic/c3-isp-config.h | 48 ++++++++------------= ---- 1 file changed, 15 insertions(+), 33 deletions(-) diff --git a/include/uapi/linux/media/amlogic/c3-isp-config.h b/include/uap= i/linux/media/amlogic/c3-isp-config.h index ed085ea62a574932c7ad8d59d34b2c5c74a597d8..15d3ac289ece610132e1d4b43ec= d56b7ef527ef6 100644 --- a/include/uapi/linux/media/amlogic/c3-isp-config.h +++ b/include/uapi/linux/media/amlogic/c3-isp-config.h @@ -6,8 +6,13 @@ #ifndef _UAPI_C3_ISP_CONFIG_H_ #define _UAPI_C3_ISP_CONFIG_H_ =20 +#ifdef __KERNEL__ +#include +#endif /* __KERNEL__ */ #include =20 +#include + /* * Frames are split into zones of almost equal width and height - a zone i= s a * rectangular tile of a frame. The metering blocks within the ISP collect @@ -183,11 +188,6 @@ enum c3_isp_params_block_type { * struct c3_isp_params_block_header - C3 ISP parameter block header * * This structure represents the common part of all the ISP configuration - * blocks. Each parameters block shall embed an instance of this structure= type - * as its first member, followed by the block-specific configuration data.= The - * driver inspects this common header to discern the block type and its si= ze and - * properly handle the block content by casting it to the correct block-sp= ecific - * type. * * The @type field is one of the values enumerated by * :c:type:`c3_isp_params_block_type` and specifies how the data should be @@ -223,15 +223,8 @@ enum c3_isp_params_block_type { * gamma->pst_gamma_lut[i] =3D i; * } * - * @type: The parameters block type from :c:type:`c3_isp_params_block_type` - * @flags: A bitmask of block flags - * @size: Size (in bytes) of the parameters block, including this header */ -struct c3_isp_params_block_header { - __u16 type; - __u16 flags; - __u32 size; -}; +#define c3_isp_params_block_header v4l2_params_block_header =20 /** * struct c3_isp_params_awb_gains - Gains for auto-white balance @@ -498,26 +491,9 @@ struct c3_isp_params_blc { /** * struct c3_isp_params_cfg - C3 ISP configuration parameters * - * This struct contains the configuration parameters of the C3 ISP - * algorithms, serialized by userspace into an opaque data buffer. Each - * configuration parameter block is represented by a block-specific struct= ure - * which contains a :c:type:`c3_isp_param_block_header` entry as first - * member. Userspace populates the @data buffer with configuration paramet= ers - * for the blocks that it intends to configure. As a consequence, the data - * buffer effective size changes according to the number of ISP blocks that - * userspace intends to configure. - * - * The parameters buffer is versioned by the @version field to allow modif= ying - * and extending its definition. Userspace should populate the @version fi= eld to - * inform the driver about the version it intends to use. The driver will = parse - * and handle the @data buffer according to the data layout specific to the - * indicated revision and return an error if the desired revision is not - * supported. - * - * For each ISP block that userspace wants to configure, a block-specific - * structure is appended to the @data buffer, one after the other without = gaps - * in between nor overlaps. Userspace shall populate the @total_size field= with - * the effective size, in bytes, of the @data buffer. + * This is the driver-specific implementation of :c:type:`v4l2_params_buff= er`. + * + * Currently only C3_ISP_PARAM_BUFFER_V0 is supported. * * The expected memory layout of the parameters buffer is:: * @@ -561,4 +537,10 @@ struct c3_isp_params_cfg { __u8 data[C3_ISP_PARAMS_MAX_SIZE]; }; =20 +#ifdef __KERNEL__ +/* Make sure the header is type-convertible to the generic v4l2 params one= */ +static_assert((sizeof(struct c3_isp_params_cfg) - C3_ISP_PARAMS_MAX_SIZE) = =3D=3D + sizeof(struct v4l2_params_buffer)); +#endif /* __KERNEL__ */ + #endif --=20 2.50.1 From nobody Sat Oct 4 03:15:51 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CC13231A042; Wed, 20 Aug 2025 12:58:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694712; cv=none; b=u9bClRCWC7B/qBk/SdZqdshLR5Win7dRX8JrOkC6RZhEYSfNAp2AQIgJVPOhmvmqUKTQEPD6F38sqauXmVaP5L1ry6GUUPZoSySbkbJp8DLZCkHP8hs2zyGHkFoyMIrIe4pBb8VashSmDCVFKhrmA429xS7PDGNH8suJHnlWxyo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694712; c=relaxed/simple; bh=aym/MtJwNFxDBbjW3PypqoxF19bnG7z0x64ukaMHAqo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cYmdVCjneQMouRCsW8S6JFfTGyJ//jikX5saa2D7RkEzaE31qvbIsESHTONPcJ12vIh4YVpi86jdT5y5osKmWLpFj+n0/Cdsf13RxntdCrI1J8eS5yp1izzV8V6881L54/NJVyOkZEL42Kj/YqVWFPTie4fix5XHc9kUrz2KDlI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=HsmftGNU; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="HsmftGNU" Received: from [192.168.1.106] (mob-5-90-62-213.net.vodafone.it [5.90.62.213]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D81B724AB; Wed, 20 Aug 2025 14:57:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1755694646; bh=aym/MtJwNFxDBbjW3PypqoxF19bnG7z0x64ukaMHAqo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=HsmftGNUv4rI3Ll25x320FLIvuTOSFIb6xFHHB3dkrfhNPos3MoCN+0sbgTitoabX dnB6dG+fGExoQsxQ3ZzXjunejiwgbJEjeBvBytbhkZ0cw+awFfwju0XeH6y/bJONq4 MzPxk476Rv1aB6MYF7eXKC0jYBQEaZKKchWipgTc= From: Jacopo Mondi Date: Wed, 20 Aug 2025 14:58:12 +0200 Subject: [PATCH v4 4/8] media: Documentation: uapi: Add V4L2 extensible parameters Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250820-extensible-parameters-validation-v4-4-30fe5a99cb1f@ideasonboard.com> References: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> In-Reply-To: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> To: Dafna Hirschfeld , Laurent Pinchart , Keke Li , Mauro Carvalho Chehab , Heiko Stuebner , Dan Scally , Sakari Ailus Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Jacopo Mondi X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5954; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=aym/MtJwNFxDBbjW3PypqoxF19bnG7z0x64ukaMHAqo=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBopcZr00CBBoPvvMYWXAcuS20poE1WEiYLGLMOK jqcS/zVL/GJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaKXGawAKCRByNAaPFqFW PAbUD/4qgdueMwc7drjs/oEP+6sZ+ao/9WqcKlhGpBkiWYjbB36+crfW6s5sw4CB1v6t0yXQ/Kj +wZglyH00WhtzgYQo399DpVuAg4IsdgjaU140HfLLtmzZTg0BMZP9CXSalF4lS/YwcvysmcuDRF /Jfwkn78LHHPKY06/UZgB42FTvTtMWC9dYdHEzyrB5hwvWH5tIY+BJdoJFXoOHmPe+0/ZgEisC/ O6HWIvk47T9Pc3ZQuFOXzniLjCcJUmaxoh1Lis5msoM+Vc/VbOfsAnGzHjtnByqF/NJO48y05ui hi0ORbLmSxz4bPX0Yejay+veb3MqUPeiNz2GsdEzG4j/FMz2E1bu5fdKrQHU5Alzx9oblXwT22O ZK4grzruD6cK9D+Eo5TxYBGwFbJRhqFs8ZYB9c8zS9KpEbA3dB6yRr9WuKMZhAhG/gxprT7ZRLY DPr8rvTax/xDvZn82K9ZKBqiwqKrpLZ2h5LOA2vpd+DhsMPkQF+Ff21CwBJmOKleaLLDhhX21fZ 42aksR22pUQkza1gPePX+R2FCU6tAFu4+LRcU9UOAtGUGso3SOv4x5nxq00wHcvyAsqxVX8F1z/ xdG4+r8zGQjHFcGeVzvSlLbsut7mjN+YQpUQKg2tkcUjO8QXN5bkXXsYfgjxWBQ3psWiBitEAYP 21Ylmv1dq57Gg5w== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B Add documentation for extensible parameters format to the V4L2 userspace API documentation. Reviewed-by: Daniel Scally Signed-off-by: Jacopo Mondi --- .../media/v4l/extensible-parameters.rst | 89 ++++++++++++++++++= ++++ .../userspace-api/media/v4l/meta-formats.rst | 1 + MAINTAINERS | 1 + 3 files changed, 91 insertions(+) diff --git a/Documentation/userspace-api/media/v4l/extensible-parameters.rs= t b/Documentation/userspace-api/media/v4l/extensible-parameters.rst new file mode 100644 index 0000000000000000000000000000000000000000..c4caa5c1df991d4dd91f986571d= b55135d15204a --- /dev/null +++ b/Documentation/userspace-api/media/v4l/extensible-parameters.rst @@ -0,0 +1,89 @@ +.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later + +.. _extensible-parameters: + +********************************** + V4L2 extensible parameters format +********************************** + +ISP configuration +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +ISP configuration parameters are computed by userspace and programmed into= a +*parameters buffer* which is queued to the ISP driver on a per-frame basis= . The +layout of the *parameters buffer* generally reflects the ISP peripheral +registers layout and is, for this reason, platform specific. + +The ISP configuration parameters are passed to the ISP driver through a me= tadata +output video node, using the :c:type:`v4l2_meta_format` interface. Each ISP +driver defines a metadata format that implements the configuration paramet= ers +layout. + +Metadata output formats that describe ISP configuration parameters are mos= t of +the time realized by implementing C structures that reflect the registers = layout +and gets populated by userspace before queueing the buffer to the ISP. Each +C structure usually corresponds to one ISP *processing block*, with each b= lock +implementing one of the ISP supported features. + +The uAPI/ABI problem +-------------------- + +By upstreaming data types that describe the configuration parameters layou= t, +driver developers make them part of the Linux kernel ABI. As it sometimes +happens for most peripherals in Linux, ISP drivers development is often an +iterative process, where sometimes not all the hardware features are suppo= rted +in the first version that lands in the kernel, and some parts of the inter= face +have to later be modified for bug-fixes or improvements. + +If any later bug-fix/improvement requires changes to the metadata output f= ormat, +this is considered an ABI-breakage that is strictly forbidden by the Linux +kernel policies. For this reason, each new iteration of an ISP driver supp= ort +would require defining a new metadata output format, implying that drivers= have +to be made ready to handle several different configuration formats. + +A new set of metadata output formats has then to be defined, with the desi= gn +goals of being: + +- Extensible: new features can be added later on without breaking the exis= ting + interface +- Versioned: different versions of the format can be defined without + breaking the existing interface + +The extensible parameters format +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D + +Extensible configuration formats are realized by a defining a single C str= ucture +that contains a few control parameters and a binary buffer where userspace +programs a variable number of *ISP configuration blocks* data. + +The generic :c:type:`v4l2_params_buffer` defines a base type that each dri= ver +can use by properly sizing the data buffer array. + +Each *ISP configuration block* is identified by an header and contains the +parameters for that specific block. + +The generic :c:type:`v4l2_params_block_header` defines a base type that ea= ch +driver can re-use as it is or extend appropriately. + +Userspace applications program in the control buffer only the parameters o= f the +ISP whose configuration has changed for the next frame. The ISP driver par= ses +the configuration parameters and apply them to the hardware register. + +Any further development that happens after the ISP driver has been merged = in +Linux and which requires supporting new ISP features can be implemented by +adding new blocks definition without invalidating the existing ones. Simil= arly, +any change to the existing ISP configuration blocks can be handled by vers= ioning +them, again without invalidating the existing ones. + +Implementations +--------------- + +ISP drivers that define an extensible parameters metadata output format: + +- :ref:`RkISP1 ` +- :ref:`Amlogic C3 ISP ` + +V4L2 extensible parameters uAPI data types +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +.. kernel-doc:: include/uapi/linux/media/v4l2-extensible-params.h diff --git a/Documentation/userspace-api/media/v4l/meta-formats.rst b/Docum= entation/userspace-api/media/v4l/meta-formats.rst index 0de80328c36bf148051a19abe9e5241234ddfe5c..b900ed6af7bd9ad49baf7b5a9ee= f9423f8abfbcb 100644 --- a/Documentation/userspace-api/media/v4l/meta-formats.rst +++ b/Documentation/userspace-api/media/v4l/meta-formats.rst @@ -12,6 +12,7 @@ These formats are used for the :ref:`metadata` interface = only. .. toctree:: :maxdepth: 1 =20 + extensible-parameters metafmt-c3-isp metafmt-d4xx metafmt-generic diff --git a/MAINTAINERS b/MAINTAINERS index 67216d1e92d7ac81617bb3c4329e4096aa205706..91df04e5d9022ccf2aea4445247= 369a8b86a4264 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -26384,6 +26384,7 @@ V4L2 EXTENSIBLE PARAMETERS FORMAT M: Jacopo Mondi L: linux-media@vger.kernel.org S: Maintained +F: Documentation/userspace-api/media/v4l/extensible-parameters.rst F: include/uapi/linux/media/v4l2-extensible-params.h =20 VF610 NAND DRIVER --=20 2.50.1 From nobody Sat Oct 4 03:15:51 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1C74331E112; Wed, 20 Aug 2025 12:58:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694715; cv=none; b=NX8A8msM7Rn1oQZHAOBiyZl16eqZmxDI7pftcnpS5vr78sfKFEabsRZP5Vgo+/GUKhSETYRzC78o067o/v2G//MWKOVrwgq6I3TbyqqLD9D0mgFnSrimFveZXyCXjLtk+HskVDhvXARRfLuAQHQSMxOyac9bBZN8IGYMHiRiV+s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694715; c=relaxed/simple; bh=bhU+IESnlJlZeQk1sh9hNYoa//cjA9Ji1bE2DlJ45Mg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ik5+16QUqVUu4FFpEwN1TCmFVCRgaYDMB+VSF72YqJQj9oFJMSeImAc8WPl6erx8k6kociA333gpBsjNbnIlPNplXIDbu7V6XWqfPzWemnQOsPDzXyaU4h01w7Km0prLE3LQw6e+uoPjFVGgCz2jsdIbSeIUsboEO4m058QVyj4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=cHZAuu8Q; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="cHZAuu8Q" Received: from [192.168.1.106] (mob-5-90-62-213.net.vodafone.it [5.90.62.213]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D529D287A; Wed, 20 Aug 2025 14:57:26 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1755694647; bh=bhU+IESnlJlZeQk1sh9hNYoa//cjA9Ji1bE2DlJ45Mg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=cHZAuu8Qw1zIe2JHtDU7/1io21e8jrHhjOeF2rwUTijymdxuD8w/dkZ4uZMa2XgD2 /oegxCqdqXuzQ/LwCCUqyCYn9sTwFv7UZhbm9ShB4eMnX9dDgkP6yCKe0ZCtO4DXGp u5jHMAXo5TTNnoKL68bTfzUCLFSE1h8p6zqjG4kA= From: Jacopo Mondi Date: Wed, 20 Aug 2025 14:58:13 +0200 Subject: [PATCH v4 5/8] media: v4l2-core: Introduce v4l2-params.c Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250820-extensible-parameters-validation-v4-5-30fe5a99cb1f@ideasonboard.com> References: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> In-Reply-To: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> To: Dafna Hirschfeld , Laurent Pinchart , Keke Li , Mauro Carvalho Chehab , Heiko Stuebner , Dan Scally , Sakari Ailus Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Jacopo Mondi X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=13585; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=bhU+IESnlJlZeQk1sh9hNYoa//cjA9Ji1bE2DlJ45Mg=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBopcZr8ZlzsuxlThQkWyLTYv8BMJTZWFvFN3iyy mPsFe2ZgO+JAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaKXGawAKCRByNAaPFqFW PG7sD/9NvXgtK8xo+FYur6R1NJc94XM4xDFZyJ+Ca9Qc7B1czXHaZPosT6X1PbvM/i4EuVNS7gr Uu5l8KwtAdd8bfHcZhhD1YzIKVVhVU8liHGJHs+mEOY+XjETeJ1ehvzgRS/f+tJ3/PYfhf3dJkl XziAR+QbocVVWC8bW2JqBja907VYlbQ2XUD6435XJdC4hC1T4iFDXpb/6NbtzHj49Yt+3Y1e2Xj K51EjjAJPWXP44+gNAYZQAVACss6BLRmqlStxeUp+f2j4gwhpNC2Q7OL2nO45h4huEKfN3Esvcd hV4q8KwPpqqOmh2XbT/4pZgTpnjFbD7A6d80L/9+QaouUfkCYnoLqJCOUbptRLlvwe4qsvOZdxO Dp/bcpr2i5sGFd6q/Jnk6O2t47TCeM/355gfm6APrqAG0saB6ibd0IUgBGug3Zu8D/QUcdYQUmY mwzBtTjpGC1s+lPyieIo+3xIVDtor2VXaFOjHNDO1p6uoUFM0jjTiIRw28Yx26+dm6poOO/8U/S C6zVvKv3rMhlMMIWR+siJJYuMd2vF61pHQ39GRWGdWIV3ti5Okf0AKB/Gy2DWImFyWiqF2px5H3 1vCHPCAcwtN6kixsB4s45CaU5o6cHG26TF8RZMwrXCB34T3cFWTIBeOTtIBL0zmk4QSlUg987VJ JFNoDeYaSmMMDog== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B Add to the v4l2 framework an helper function to support drivers when validating a buffer of extensible parameters. Introduce new types in include/media/v4l2-params.h that drivers shall use in order to comply with the v4l2-params validation procedure, and add a helper functions to v4l2-params.c to perform block and buffer validation. Reviewed-by: Daniel Scally Signed-off-by: Jacopo Mondi --- MAINTAINERS | 2 + drivers/media/v4l2-core/Makefile | 3 +- drivers/media/v4l2-core/v4l2-params.c | 126 ++++++++++++++++++++++++++ include/media/v4l2-params.h | 164 ++++++++++++++++++++++++++++++= ++++ 4 files changed, 294 insertions(+), 1 deletion(-) diff --git a/MAINTAINERS b/MAINTAINERS index 91df04e5d9022ccf2aea4445247369a8b86a4264..008f984c0769691f6ddec8d8f0f= 461fde056ddb3 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -26385,6 +26385,8 @@ M: Jacopo Mondi L: linux-media@vger.kernel.org S: Maintained F: Documentation/userspace-api/media/v4l/extensible-parameters.rst +F: drivers/media/v4l2-core/v4l2-params.c +F: include/media/v4l2-params.h F: include/uapi/linux/media/v4l2-extensible-params.h =20 VF610 NAND DRIVER diff --git a/drivers/media/v4l2-core/Makefile b/drivers/media/v4l2-core/Mak= efile index 2177b9d63a8ffc1127c5a70118249a2ff63cd759..323330dd359f95c1ae3d0c35bd6= fcb8291a33a07 100644 --- a/drivers/media/v4l2-core/Makefile +++ b/drivers/media/v4l2-core/Makefile @@ -11,7 +11,8 @@ tuner-objs :=3D tuner-core.o videodev-objs :=3D v4l2-dev.o v4l2-ioctl.o v4l2-device.o v4l2-fh.o \ v4l2-event.o v4l2-subdev.o v4l2-common.o \ v4l2-ctrls-core.o v4l2-ctrls-api.o \ - v4l2-ctrls-request.o v4l2-ctrls-defs.o + v4l2-ctrls-request.o v4l2-ctrls-defs.o \ + v4l2-params.o =20 # Please keep it alphabetically sorted by Kconfig name # (e. g. LC_ALL=3DC sort Makefile) diff --git a/drivers/media/v4l2-core/v4l2-params.c b/drivers/media/v4l2-cor= e/v4l2-params.c new file mode 100644 index 0000000000000000000000000000000000000000..69fc7fabce9dac3fca5a6b783b8= 6a3b0dfc1d803 --- /dev/null +++ b/drivers/media/v4l2-core/v4l2-params.c @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Video4Linux2 extensible parameters helpers + * + * Copyright (C) 2025 Ideas On Board Oy + * Author: Jacopo Mondi + */ + +#include +#include +#include + +#include + +int v4l2_params_buffer_validate(struct device *dev, struct vb2_buffer *vb, + size_t max_size, + v4l2_params_validate_buffer buffer_validate) +{ + size_t header_size =3D offsetof(struct v4l2_params_buffer, data); + struct v4l2_params_buffer *buffer =3D vb2_plane_vaddr(vb, 0); + size_t payload_size =3D vb2_get_plane_payload(vb, 0); + size_t buffer_size; + int ret; + + /* Payload size can't be greater than the destination buffer size */ + if (payload_size > max_size) { + dev_dbg(dev, "Payload size is too large: %zu\n", payload_size); + return -EINVAL; + } + + /* Payload size can't be smaller than the header size */ + if (payload_size < header_size) { + dev_dbg(dev, "Payload size is too small: %zu\n", payload_size); + return -EINVAL; + } + + /* Validate the size reported in the parameter buffer header */ + buffer_size =3D header_size + buffer->data_size; + if (buffer_size !=3D payload_size) { + dev_dbg(dev, "Data size %zu and payload size %zu are different\n", + buffer_size, payload_size); + return -EINVAL; + } + + /* Driver-specific buffer validation. */ + if (buffer_validate) { + ret =3D buffer_validate(dev, buffer); + if (ret) + return ret; + } + + return 0; +} +EXPORT_SYMBOL_GPL(v4l2_params_buffer_validate); + +int v4l2_params_blocks_validate(struct device *dev, + const struct v4l2_params_buffer *buffer, + const struct v4l2_params_handler *handlers, + size_t num_handlers, + v4l2_params_validate_block block_validate) +{ + size_t block_offset =3D 0; + size_t buffer_size; + int ret; + + /* Walk the list of parameter blocks and validate them. */ + buffer_size =3D buffer->data_size; + while (buffer_size >=3D sizeof(struct v4l2_params_block_header)) { + const struct v4l2_params_handler *handler; + const struct v4l2_params_block_header *block; + + /* Validate block sizes and types against the handlers. */ + block =3D (const struct v4l2_params_block_header *) + (buffer->data + block_offset); + + if (block->type >=3D num_handlers) { + dev_dbg(dev, "Invalid parameters block type\n"); + return -EINVAL; + } + + if (block->size > buffer_size) { + dev_dbg(dev, "Premature end of parameters data\n"); + return -EINVAL; + } + + /* It's invalid to specify both ENABLE and DISABLE. */ + if ((block->flags & (V4L2_PARAMS_FL_BLOCK_ENABLE | + V4L2_PARAMS_FL_BLOCK_DISABLE)) =3D=3D + (V4L2_PARAMS_FL_BLOCK_ENABLE | + V4L2_PARAMS_FL_BLOCK_DISABLE)) { + dev_dbg(dev, "Invalid parameters block flags\n"); + return -EINVAL; + } + + /* + * Match the block reported size against the handler's expected + * one, but allow the block to only contain the header in + * case it is going to be disabled. + */ + handler =3D &handlers[block->type]; + if (block->size !=3D handler->size && + (!(block->flags & V4L2_PARAMS_FL_BLOCK_DISABLE) || + block->size !=3D sizeof(*block))) { + dev_dbg(dev, "Invalid parameters block size\n"); + return -EINVAL; + } + + /* Driver-specific per-block validation. */ + if (block_validate) { + ret =3D block_validate(dev, block); + if (ret) + return ret; + } + + block_offset +=3D block->size; + buffer_size -=3D block->size; + } + + if (buffer_size) { + dev_dbg(dev, "Unexpected data after the parameters buffer end\n"); + return -EINVAL; + } + + return 0; +} +EXPORT_SYMBOL_GPL(v4l2_params_blocks_validate); diff --git a/include/media/v4l2-params.h b/include/media/v4l2-params.h new file mode 100644 index 0000000000000000000000000000000000000000..f42d56a6d6a0383571116345d76= ba02fc9ae039d --- /dev/null +++ b/include/media/v4l2-params.h @@ -0,0 +1,164 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Video4Linux2 extensible parameters helpers + * + * Copyright (C) 2025 Ideas On Board Oy + * Author: Jacopo Mondi + */ + +#ifndef V4L2_PARAMS_H_ +#define V4L2_PARAMS_H_ + +#include + +struct device; +struct vb2_buffer; + +/** + * typedef v4l2_params_block_handler - V4L2 extensible format block handler + * @arg: pointer the driver-specific argument + * @block: the ISP configuration block to handle + * + * Defines the function signature of the functions that handle an ISP block + * configuration. + */ +typedef void (*v4l2_params_block_handler)(void *arg, + const struct v4l2_params_block_header *block); + +/** + * struct v4l2_params_handler - V4L2 extensible format handler + * @size: the block expected size + * @handler: the block handler function + * @group: the device-specific group id the block belongs to (optional) + * @features: the device-specific features flags (optional) + * + * The v4l2_params_handler defines the type that driver making use of the + * V4L2 extensible parameters shall use to define their own ISP block + * handlers. + * + * Drivers shall prepare a list of handlers, one for each supported ISP bl= ock + * and correctly populate the structure's field with the expected block @s= ize + * (used for validation), a pointer to each block @handler function and an + * optional @group and @feature flags, the driver can use to differentiate= which + * ISP blocks are present on the ISP implementation. + * + * The @group field is intended to be used as a bitmask of driver-specific + * flags to allow the driver to setup certain blocks at different times. A= s an + * example an ISP driver can divide its block handlers in "pre-configure" = blocks + * and "run-time" blocks and use the @group bitmask to identify the ISP bl= ocks + * that have to be pre-configured from the ones that only have to be handl= ed at + * run-time. The usage and definition of the @group field is totally + * driver-specific. + * + * The @features flag can instead be used to differentiate between blocks + * implemented in different revisions of the ISP design. In example some I= SP + * blocks might be present on more recent revision than others. Populating= the + * @features bitmask with the ISP/SoC machine identifier allows the driver= to + * correctly ignore the blocks not supported on the ISP revision it is run= ning + * on. As per the @group bitmask, the usage and definition of the @features + * field is totally driver-specific. + */ +struct v4l2_params_handler { + size_t size; + v4l2_params_block_handler handler; + unsigned int group; + unsigned int features; +}; + +/** + * typedef v4l2_params_validate_buffer - V4L2 extensible parameters buffer + * validation callback + * @dev: the driver's device pointer (as passed by the driver to + * v4l2_params_buffer_validate()) + * @buffer: the extensible parameters buffer + * + * Defines the function prototype for the driver's callback to perform + * driver-specific validation on the extensible parameters buffer + */ +typedef int (*v4l2_params_validate_buffer)(struct device *dev, + const struct v4l2_params_buffer *buffer); + +/** + * v4l2_params_buffer_validate - Validate a V4L2 extensible parameters buf= fer + * @dev: the driver's device pointer + * @vb: the videobuf2 buffer + * @max_size: the maximum allowed buffer size + * @buffer_validate: callback to the driver-specific buffer validation + * + * Helper function that performs validation of an extensible parameters bu= ffer. + * + * The helper is meant to be used by drivers to perform validation of the + * extensible parameters buffer size correctness. + * + * The @vb buffer as received from the vb2 .buf_prepare() operation is che= cked + * against @max_size and its validated to be large enough to accommodate at + * least one ISP configuration block. The effective buffer size is compared + * with the reported data size to make sure they match. + * + * If provided, the @buffer_validate callback function is invoked to allow + * drivers to perform driver-specific validation (such as checking that the + * buffer version is supported). + * + * Drivers should use this function to validate the buffer size correctness + * before performing a copy of the user-provided videobuf2 buffer content = into a + * kernel-only memory buffer to prevent userspace from modifying the buffer + * content after it has been submitted to the driver. + *. + * Examples of users of this function can be found in + * rkisp1_params_prepare_ext_params() and in c3_isp_params_vb2_buf_prepare= (). + */ +int v4l2_params_buffer_validate(struct device *dev, struct vb2_buffer *vb, + size_t max_size, + v4l2_params_validate_buffer buffer_validate); + +/** + * typedef v4l2_params_validate_block - V4L2 extensible parameters block + * validation callback + * @dev: the driver's device pointer (as passed by the driver to + * v4l2_params_validate()) + * @block: the ISP configuration block to validate + * + * Defines the function prototype for the driver's callback to perform + * driver-specific validation on each ISP block. + */ +typedef int (*v4l2_params_validate_block)(struct device *dev, + const struct v4l2_params_block_header *block); + +/** + * v4l2_params_blocks_validate - Validate V4L2 extensible parameters ISP + * configuration blocks + * @dev: the driver's device pointer + * @buffer: the extensible parameters configuration buffer + * @handlers: the list of block handlers + * @num_handlers: the number of block handlers + * @block_validate: callback to the driver-specific per-block validation + * function + * + * Helper function that performs validation of the ISP configuration block= s in + * an extensible parameters buffer. + * + * The helper is meant to be used by drivers to perform validation of the + * ISP configuration data blocks. For each block in the extensible paramet= ers + * buffer, its size and correctness are validated against its associated h= andler + * in the @handlers list. Additionally, if provided, the @block_validate + * callback is invoked on each block to allow drivers to perform driver-sp= ecific + * validation. + * + * Drivers should use this function to validate the ISP configuration bloc= ks + * after having validated the correctness of the vb2 buffer sizes by using= the + * v4l2_params_buffer_validate() helper first. Once the buffer size has be= en + * validated, drivers should perform a copy of the user-provided buffer in= to a + * kernel-only memory buffer to prevent userspace from modifying the buffer + * content after it has been submitted to the driver, and then call this + * function to perform per-block validation. + * + * Examples of users of this function can be found in + * rkisp1_params_prepare_ext_params() and in c3_isp_params_vb2_buf_prepare= (). + */ +int v4l2_params_blocks_validate(struct device *dev, + const struct v4l2_params_buffer *buffer, + const struct v4l2_params_handler *handlers, + size_t num_handlers, + v4l2_params_validate_block block_validate); + +#endif /* V4L2_PARAMS_H_ */ --=20 2.50.1 From nobody Sat Oct 4 03:15:51 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 07A1A31A067; Wed, 20 Aug 2025 12:58:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694716; cv=none; b=PEGbCwiTmWlprys3PdO+axRZQ4wJ/aApLP/YgWkWn+/ycXus0Kullv9bTNIVuG4uv2XqtB6i9o7zB1+GG5EX4Vx3rqBWj4RRqKoLQEUqpFQqoghcWX1X7hbAZy2SopwADy8TSkl+hpQp6lnq8S7oRP/OBXUVsmvTMSZP9dUce3s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694716; c=relaxed/simple; bh=Anp8AH008k3Ru3O0cw5dfpohDbBBsf0tf1G/dXUsgqY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=J76Uhqqm3cTbu2wPe1BIQTrjXk4CvnOQcH83VmKQTu2enjKYKqdofO/4XYv302F0/LX9kwYScOoIVvtUn4xc9g2By6sooTHL9bPlWWb7df4IjSgZvFmcO/WHwv+11qefux/7eCewJtIkHeu6xT+EZqk2HjBVEQS3ntg7bwZRtBE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=JlYrIoJK; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="JlYrIoJK" Received: from [192.168.1.106] (mob-5-90-62-213.net.vodafone.it [5.90.62.213]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D0385606; Wed, 20 Aug 2025 14:57:27 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1755694648; bh=Anp8AH008k3Ru3O0cw5dfpohDbBBsf0tf1G/dXUsgqY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=JlYrIoJK2mPxj5PBME6QBguNMGCDDjpQIy0CFGZrIyuL+rHuqsJWSeczpG51lpbZV iI1WwSrh/2p52EK+NnjulktMghnPenqxPqJ1W3kVcA+UVmUf+2Kx0Rp3czBPxqFP3K uxE9SOFE2UjsV5f1wRthOFLIWCNUvC80aABpE4R0= From: Jacopo Mondi Date: Wed, 20 Aug 2025 14:58:14 +0200 Subject: [PATCH v4 6/8] media: rkisp1: Use v4l2-params for validation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250820-extensible-parameters-validation-v4-6-30fe5a99cb1f@ideasonboard.com> References: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> In-Reply-To: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> To: Dafna Hirschfeld , Laurent Pinchart , Keke Li , Mauro Carvalho Chehab , Heiko Stuebner , Dan Scally , Sakari Ailus Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Jacopo Mondi X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=23802; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=Anp8AH008k3Ru3O0cw5dfpohDbBBsf0tf1G/dXUsgqY=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBopcZrO2npa+AW7ahDU6roqOwtBTek1gUZgh/vH Y0TX6JVMPuJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaKXGawAKCRByNAaPFqFW PMwTEACPobnPLFh/25mEP050CfJLwI7WXKnZYag2DM3pcPKs7C52jHttHLsnxzxU0etdbvoIeg/ Yq2ZhymLKdjFYsxmJl/eu4WdR2Eh8Gc9rgP70D80wRG3zGQYCkkowftr0hX+SQxE83nHtT6n1ES uAD0815Pxxq756n/CFcjnua9pyOSnefKVGuXSB91wbXGc9WcqvmrgUeURDRZeOrs+mqnNhzdmAP c6dfr+090rcpd2wV0ZVj6f/2wjJ2X44saykh42ZMOMVLmQW60Wtb+w3xsY3Js5O9RiS5E6/afcl p3tv4HUSaeG2HWxgUNu9CyMGkSa7glt/yPjGXdFwDttuMuv3vrHeOGeV2LbwImAgaLtxRbGdAx6 3N7EGrARIXobomNJ8SJbd1T2Nk82XBrxY5el0ulX2DMqnLutHJ4k0AhgsAegInQTFWpDfZgt+6t FVL6m1xftH5zzqkKnuaqTuCNekEPLl/wG41bP/ahj8RudsuhH+ZvyidSoMHi3HVtU3LcsJrddm3 cK5f9DggKycyK8piAbSKmo8j9G6jXq4tRsr8jqCWh1WXubiGUHuDrtVR6SLV0fNOsHFJgQPZTxY GgSU1+sOoGUhJqQ2u02SkyagwfKZFCu/gXD91ixV/xS2+IutoCZArSOpXFr/Zvtd4ZgFGzbxXan mHopB2cjS42Zm6Q== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B Convert rkisp1-params.c to use the new types for block handlers defined in v4l2-params.h and use the new helpers from v4l2-params.c to remove bolierplate code from the driver. Reviewed-by: Daniel Scally Signed-off-by: Jacopo Mondi --- .../media/platform/rockchip/rkisp1/rkisp1-params.c | 349 +++++++++--------= ---- 1 file changed, 141 insertions(+), 208 deletions(-) diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c b/drive= rs/media/platform/rockchip/rkisp1/rkisp1-params.c index f1585f8fa0f478304f74317fd9dd09199c94ec82..d7bfb1b50ed7e8dec5a20aec6cd= 775b721091abf 100644 --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include /* for ISP params */ =20 @@ -40,30 +41,6 @@ #define RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS BIT(0) #define RKISP1_EXT_PARAMS_BLOCK_GROUP_LSC BIT(1) =20 -union rkisp1_ext_params_config { - struct rkisp1_ext_params_block_header header; - struct rkisp1_ext_params_bls_config bls; - struct rkisp1_ext_params_dpcc_config dpcc; - struct rkisp1_ext_params_sdg_config sdg; - struct rkisp1_ext_params_lsc_config lsc; - struct rkisp1_ext_params_awb_gain_config awbg; - struct rkisp1_ext_params_flt_config flt; - struct rkisp1_ext_params_bdm_config bdm; - struct rkisp1_ext_params_ctk_config ctk; - struct rkisp1_ext_params_goc_config goc; - struct rkisp1_ext_params_dpf_config dpf; - struct rkisp1_ext_params_dpf_strength_config dpfs; - struct rkisp1_ext_params_cproc_config cproc; - struct rkisp1_ext_params_ie_config ie; - struct rkisp1_ext_params_awb_meas_config awbm; - struct rkisp1_ext_params_hst_config hst; - struct rkisp1_ext_params_aec_config aec; - struct rkisp1_ext_params_afc_config afc; - struct rkisp1_ext_params_compand_bls_config compand_bls; - struct rkisp1_ext_params_compand_curve_config compand_curve; - struct rkisp1_ext_params_wdr_config wdr; -}; - enum rkisp1_params_formats { RKISP1_PARAMS_FIXED, RKISP1_PARAMS_EXTENSIBLE, @@ -1689,11 +1666,12 @@ static void rkisp1_isp_isr_meas_config(struct rkisp= 1_params *params, * Extensible parameters format handling */ =20 -static void -rkisp1_ext_params_bls(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_bls(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_bls_config *bls =3D &block->bls; + const struct rkisp1_ext_params_bls_config *bls =3D + (const struct rkisp1_ext_params_bls_config *)block; + struct rkisp1_params *params =3D dev; =20 if (bls->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_BLS_CTRL, @@ -1709,11 +1687,12 @@ rkisp1_ext_params_bls(struct rkisp1_params *params, RKISP1_CIF_ISP_BLS_ENA); } =20 -static void -rkisp1_ext_params_dpcc(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_dpcc(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_dpcc_config *dpcc =3D &block->dpcc; + const struct rkisp1_ext_params_dpcc_config *dpcc =3D + (const struct rkisp1_ext_params_dpcc_config *)block; + struct rkisp1_params *params =3D dev; =20 if (dpcc->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_DPCC_MODE, @@ -1729,11 +1708,12 @@ rkisp1_ext_params_dpcc(struct rkisp1_params *params, RKISP1_CIF_ISP_DPCC_MODE_DPCC_ENABLE); } =20 -static void -rkisp1_ext_params_sdg(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_sdg(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_sdg_config *sdg =3D &block->sdg; + const struct rkisp1_ext_params_sdg_config *sdg =3D + (const struct rkisp1_ext_params_sdg_config *)block; + struct rkisp1_params *params =3D dev; =20 if (sdg->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL, @@ -1749,11 +1729,12 @@ rkisp1_ext_params_sdg(struct rkisp1_params *params, RKISP1_CIF_ISP_CTRL_ISP_GAMMA_IN_ENA); } =20 -static void -rkisp1_ext_params_lsc(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_lsc(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_lsc_config *lsc =3D &block->lsc; + const struct rkisp1_ext_params_lsc_config *lsc =3D + (const struct rkisp1_ext_params_lsc_config *)block; + struct rkisp1_params *params =3D dev; =20 if (lsc->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_LSC_CTRL, @@ -1769,11 +1750,12 @@ rkisp1_ext_params_lsc(struct rkisp1_params *params, RKISP1_CIF_ISP_LSC_CTRL_ENA); } =20 -static void -rkisp1_ext_params_awbg(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_awbg(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_awb_gain_config *awbg =3D &block->awbg; + const struct rkisp1_ext_params_awb_gain_config *awbg =3D + (const struct rkisp1_ext_params_awb_gain_config *)block; + struct rkisp1_params *params =3D dev; =20 if (awbg->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL, @@ -1789,11 +1771,12 @@ rkisp1_ext_params_awbg(struct rkisp1_params *params, RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA); } =20 -static void -rkisp1_ext_params_flt(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_flt(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_flt_config *flt =3D &block->flt; + const struct rkisp1_ext_params_flt_config *flt =3D + (const struct rkisp1_ext_params_flt_config *)block; + struct rkisp1_params *params =3D dev; =20 if (flt->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_FILT_MODE, @@ -1809,11 +1792,12 @@ rkisp1_ext_params_flt(struct rkisp1_params *params, RKISP1_CIF_ISP_FLT_ENA); } =20 -static void -rkisp1_ext_params_bdm(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_bdm(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_bdm_config *bdm =3D &block->bdm; + const struct rkisp1_ext_params_bdm_config *bdm =3D + (const struct rkisp1_ext_params_bdm_config *)block; + struct rkisp1_params *params =3D dev; =20 if (bdm->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_DEMOSAIC, @@ -1829,11 +1813,12 @@ rkisp1_ext_params_bdm(struct rkisp1_params *params, RKISP1_CIF_ISP_DEMOSAIC_BYPASS); } =20 -static void -rkisp1_ext_params_ctk(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_ctk(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_ctk_config *ctk =3D &block->ctk; + const struct rkisp1_ext_params_ctk_config *ctk =3D + (const struct rkisp1_ext_params_ctk_config *)block; + struct rkisp1_params *params =3D dev; =20 if (ctk->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_ctk_enable(params, false); @@ -1847,11 +1832,12 @@ rkisp1_ext_params_ctk(struct rkisp1_params *params, rkisp1_ctk_enable(params, true); } =20 -static void -rkisp1_ext_params_goc(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_goc(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_goc_config *goc =3D &block->goc; + const struct rkisp1_ext_params_goc_config *goc =3D + (const struct rkisp1_ext_params_goc_config *)block; + struct rkisp1_params *params =3D dev; =20 if (goc->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL, @@ -1869,11 +1855,12 @@ rkisp1_ext_params_goc(struct rkisp1_params *params, RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA); } =20 -static void -rkisp1_ext_params_dpf(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_dpf(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_dpf_config *dpf =3D &block->dpf; + const struct rkisp1_ext_params_dpf_config *dpf =3D + (const struct rkisp1_ext_params_dpf_config *)block; + struct rkisp1_params *params =3D dev; =20 if (dpf->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_DPF_MODE, @@ -1889,20 +1876,22 @@ rkisp1_ext_params_dpf(struct rkisp1_params *params, RKISP1_CIF_ISP_DPF_MODE_EN); } =20 -static void -rkisp1_ext_params_dpfs(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_dpfs(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_dpf_strength_config *dpfs =3D &block->dpfs; + const struct rkisp1_ext_params_dpf_strength_config *dpfs =3D + (const struct rkisp1_ext_params_dpf_strength_config *)block; + struct rkisp1_params *params =3D dev; =20 rkisp1_dpf_strength_config(params, &dpfs->config); } =20 -static void -rkisp1_ext_params_cproc(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_cproc(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_cproc_config *cproc =3D &block->cproc; + const struct rkisp1_ext_params_cproc_config *cproc =3D + (const struct rkisp1_ext_params_cproc_config *)block; + struct rkisp1_params *params =3D dev; =20 if (cproc->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_C_PROC_CTRL, @@ -1918,11 +1907,12 @@ rkisp1_ext_params_cproc(struct rkisp1_params *param= s, RKISP1_CIF_C_PROC_CTR_ENABLE); } =20 -static void -rkisp1_ext_params_ie(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_ie(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_ie_config *ie =3D &block->ie; + const struct rkisp1_ext_params_ie_config *ie =3D + (const struct rkisp1_ext_params_ie_config *)block; + struct rkisp1_params *params =3D dev; =20 if (ie->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_ie_enable(params, false); @@ -1936,11 +1926,12 @@ rkisp1_ext_params_ie(struct rkisp1_params *params, rkisp1_ie_enable(params, true); } =20 -static void -rkisp1_ext_params_awbm(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_awbm(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_awb_meas_config *awbm =3D &block->awbm; + const struct rkisp1_ext_params_awb_meas_config *awbm =3D + (const struct rkisp1_ext_params_awb_meas_config *)block; + struct rkisp1_params *params =3D dev; =20 if (awbm->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { params->ops->awb_meas_enable(params, &awbm->config, @@ -1956,11 +1947,12 @@ rkisp1_ext_params_awbm(struct rkisp1_params *params, true); } =20 -static void -rkisp1_ext_params_hstm(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_hstm(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_hst_config *hst =3D &block->hst; + const struct rkisp1_ext_params_hst_config *hst =3D + (const struct rkisp1_ext_params_hst_config *)block; + struct rkisp1_params *params =3D dev; =20 if (hst->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { params->ops->hst_enable(params, &hst->config, false); @@ -1974,11 +1966,12 @@ rkisp1_ext_params_hstm(struct rkisp1_params *params, params->ops->hst_enable(params, &hst->config, true); } =20 -static void -rkisp1_ext_params_aecm(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_aecm(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_aec_config *aec =3D &block->aec; + const struct rkisp1_ext_params_aec_config *aec =3D + (const struct rkisp1_ext_params_aec_config *)block; + struct rkisp1_params *params =3D dev; =20 if (aec->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_EXP_CTRL, @@ -1994,11 +1987,12 @@ rkisp1_ext_params_aecm(struct rkisp1_params *params, RKISP1_CIF_ISP_EXP_ENA); } =20 -static void -rkisp1_ext_params_afcm(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_afcm(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_afc_config *afc =3D &block->afc; + const struct rkisp1_ext_params_afc_config *afc =3D + (const struct rkisp1_ext_params_afc_config *)block; + struct rkisp1_params *params =3D dev; =20 if (afc->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_AFM_CTRL, @@ -2014,11 +2008,12 @@ rkisp1_ext_params_afcm(struct rkisp1_params *params, RKISP1_CIF_ISP_AFM_ENA); } =20 -static void rkisp1_ext_params_compand_bls(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_compand_bls(void *dev, + const struct v4l2_params_block_header *block) { const struct rkisp1_ext_params_compand_bls_config *bls =3D - &block->compand_bls; + (const struct rkisp1_ext_params_compand_bls_config *)block; + struct rkisp1_params *params =3D dev; =20 if (bls->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_COMPAND_CTRL, @@ -2034,11 +2029,13 @@ static void rkisp1_ext_params_compand_bls(struct rk= isp1_params *params, RKISP1_CIF_ISP_COMPAND_CTRL_BLS_ENABLE); } =20 -static void rkisp1_ext_params_compand_expand(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void +rkisp1_ext_params_compand_expand(void *dev, + const struct v4l2_params_block_header *block) { const struct rkisp1_ext_params_compand_curve_config *curve =3D - &block->compand_curve; + (const struct rkisp1_ext_params_compand_curve_config *)block; + struct rkisp1_params *params =3D dev; =20 if (curve->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_COMPAND_CTRL, @@ -2054,11 +2051,13 @@ static void rkisp1_ext_params_compand_expand(struct= rkisp1_params *params, RKISP1_CIF_ISP_COMPAND_CTRL_EXPAND_ENABLE); } =20 -static void rkisp1_ext_params_compand_compress(struct rkisp1_params *param= s, - const union rkisp1_ext_params_config *block) +static void +rkisp1_ext_params_compand_compress(void *dev, + const struct v4l2_params_block_header *block) { const struct rkisp1_ext_params_compand_curve_config *curve =3D - &block->compand_curve; + (const struct rkisp1_ext_params_compand_curve_config *)block; + struct rkisp1_params *params =3D dev; =20 if (curve->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_COMPAND_CTRL, @@ -2074,10 +2073,12 @@ static void rkisp1_ext_params_compand_compress(stru= ct rkisp1_params *params, RKISP1_CIF_ISP_COMPAND_CTRL_COMPRESS_ENABLE); } =20 -static void rkisp1_ext_params_wdr(struct rkisp1_params *params, - const union rkisp1_ext_params_config *block) +static void rkisp1_ext_params_wdr(void *dev, + const struct v4l2_params_block_header *block) { - const struct rkisp1_ext_params_wdr_config *wdr =3D &block->wdr; + const struct rkisp1_ext_params_wdr_config *wdr =3D + (const struct rkisp1_ext_params_wdr_config *)block; + struct rkisp1_params *params =3D dev; =20 if (wdr->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_WDR_CTRL, @@ -2093,15 +2094,7 @@ static void rkisp1_ext_params_wdr(struct rkisp1_para= ms *params, RKISP1_CIF_ISP_WDR_CTRL_ENABLE); } =20 -typedef void (*rkisp1_block_handler)(struct rkisp1_params *params, - const union rkisp1_ext_params_config *config); - -static const struct rkisp1_ext_params_handler { - size_t size; - rkisp1_block_handler handler; - unsigned int group; - unsigned int features; -} rkisp1_ext_params_handlers[] =3D { +static const struct v4l2_params_handler rkisp1_ext_params_handlers[] =3D { [RKISP1_EXT_PARAMS_BLOCK_TYPE_BLS] =3D { .size =3D sizeof(struct rkisp1_ext_params_bls_config), .handler =3D rkisp1_ext_params_bls, @@ -2224,18 +2217,18 @@ static void rkisp1_ext_params_config(struct rkisp1_= params *params, =20 /* Walk the list of parameter blocks and process them. */ while (block_offset < cfg->data_size) { - const struct rkisp1_ext_params_handler *block_handler; - const union rkisp1_ext_params_config *block; + const struct v4l2_params_handler *block_handler; + const struct v4l2_params_block_header *block; =20 - block =3D (const union rkisp1_ext_params_config *) + block =3D (const struct v4l2_params_block_header *) &cfg->data[block_offset]; - block_offset +=3D block->header.size; + block_offset +=3D block->size; =20 /* * Make sure the block is supported by the platform and in the * list of groups to configure. */ - block_handler =3D &rkisp1_ext_params_handlers[block->header.type]; + block_handler =3D &rkisp1_ext_params_handlers[block->type]; if (!(block_handler->group & block_group_mask)) continue; =20 @@ -2245,10 +2238,10 @@ static void rkisp1_ext_params_config(struct rkisp1_= params *params, =20 block_handler->handler(params, block); =20 - if (block->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) - params->enabled_blocks &=3D ~BIT(block->header.type); - else if (block->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_ENABLE) - params->enabled_blocks |=3D BIT(block->header.type); + if (block->flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) + params->enabled_blocks &=3D ~BIT(block->type); + else if (block->flags & RKISP1_EXT_PARAMS_FL_BLOCK_ENABLE) + params->enabled_blocks |=3D BIT(block->type); } } =20 @@ -2641,36 +2634,36 @@ static void rkisp1_params_vb2_buf_queue(struct vb2_= buffer *vb) spin_unlock_irq(¶ms->config_lock); } =20 +static int +rkisp1_ext_params_validate_buffer(struct device *dev, + const struct v4l2_params_buffer *buffer) +{ + /* Only v1 is supported at the moment. */ + if (buffer->version !=3D RKISP1_EXT_PARAM_BUFFER_V1) { + dev_dbg(dev, "Unsupported extensible format version: %u\n", + buffer->version); + return -EINVAL; + } + + return 0; +} + static int rkisp1_params_prepare_ext_params(struct rkisp1_params *params, struct vb2_buffer *vb) { struct vb2_v4l2_buffer *vbuf =3D to_vb2_v4l2_buffer(vb); struct rkisp1_params_buffer *params_buf =3D to_rkisp1_params_buffer(vbuf); - size_t header_size =3D offsetof(struct rkisp1_ext_params_cfg, data); struct rkisp1_ext_params_cfg *cfg =3D params_buf->cfg; size_t payload_size =3D vb2_get_plane_payload(vb, 0); struct rkisp1_ext_params_cfg *usr_cfg =3D vb2_plane_vaddr(&vbuf->vb2_buf, 0); - size_t block_offset =3D 0; - size_t cfg_size; - - /* - * Validate the buffer payload size before copying the parameters. The - * payload has to be smaller than the destination buffer size and larger - * than the header size. - */ - if (payload_size > params->metafmt->buffersize) { - dev_dbg(params->rkisp1->dev, - "Too large buffer payload size %zu\n", payload_size); - return -EINVAL; - } + int ret; =20 - if (payload_size < header_size) { - dev_dbg(params->rkisp1->dev, - "Buffer payload %zu smaller than header size %zu\n", - payload_size, header_size); - return -EINVAL; - } + ret =3D v4l2_params_buffer_validate(params->rkisp1->dev, vb, + params->metafmt->buffersize, + rkisp1_ext_params_validate_buffer); + if (ret) + return ret; =20 /* * Copy the parameters buffer to the internal scratch buffer to avoid @@ -2678,71 +2671,11 @@ static int rkisp1_params_prepare_ext_params(struct = rkisp1_params *params, */ memcpy(cfg, usr_cfg, payload_size); =20 - /* Only v1 is supported at the moment. */ - if (cfg->version !=3D RKISP1_EXT_PARAM_BUFFER_V1) { - dev_dbg(params->rkisp1->dev, - "Unsupported extensible format version: %u\n", - cfg->version); - return -EINVAL; - } - - /* Validate the size reported in the parameters buffer header. */ - cfg_size =3D header_size + cfg->data_size; - if (cfg_size !=3D payload_size) { - dev_dbg(params->rkisp1->dev, - "Data size %zu different than buffer payload size %zu\n", - cfg_size, payload_size); - return -EINVAL; - } - - /* Walk the list of parameter blocks and validate them. */ - cfg_size =3D cfg->data_size; - while (cfg_size >=3D sizeof(struct rkisp1_ext_params_block_header)) { - const struct rkisp1_ext_params_block_header *block; - const struct rkisp1_ext_params_handler *handler; - - block =3D (const struct rkisp1_ext_params_block_header *) - &cfg->data[block_offset]; - - if (block->type >=3D ARRAY_SIZE(rkisp1_ext_params_handlers)) { - dev_dbg(params->rkisp1->dev, - "Invalid parameters block type\n"); - return -EINVAL; - } - - if (block->size > cfg_size) { - dev_dbg(params->rkisp1->dev, - "Premature end of parameters data\n"); - return -EINVAL; - } - - if ((block->flags & (RKISP1_EXT_PARAMS_FL_BLOCK_ENABLE | - RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE)) =3D=3D - (RKISP1_EXT_PARAMS_FL_BLOCK_ENABLE | - RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE)) { - dev_dbg(params->rkisp1->dev, - "Invalid parameters block flags\n"); - return -EINVAL; - } - - handler =3D &rkisp1_ext_params_handlers[block->type]; - if (block->size !=3D handler->size) { - dev_dbg(params->rkisp1->dev, - "Invalid parameters block size\n"); - return -EINVAL; - } - - block_offset +=3D block->size; - cfg_size -=3D block->size; - } - - if (cfg_size) { - dev_dbg(params->rkisp1->dev, - "Unexpected data after the parameters buffer end\n"); - return -EINVAL; - } - - return 0; + return v4l2_params_blocks_validate(params->rkisp1->dev, + (struct v4l2_params_buffer *)cfg, + rkisp1_ext_params_handlers, + ARRAY_SIZE(rkisp1_ext_params_handlers), + NULL); } =20 static int rkisp1_params_vb2_buf_prepare(struct vb2_buffer *vb) @@ -2842,7 +2775,7 @@ static int rkisp1_params_ctrl_init(struct rkisp1_para= ms *params) v4l2_ctrl_handler_init(¶ms->ctrls, 1); =20 for (unsigned int i =3D 0; i < ARRAY_SIZE(rkisp1_ext_params_handlers); i+= +) { - const struct rkisp1_ext_params_handler *block_handler; + const struct v4l2_params_handler *block_handler; =20 block_handler =3D &rkisp1_ext_params_handlers[i]; ctrl_config.max |=3D BIT(i); --=20 2.50.1 From nobody Sat Oct 4 03:15:51 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9CDA8320CB3; Wed, 20 Aug 2025 12:58:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694718; cv=none; b=phne29HH62kvpeOCuk1CKjFLDhssN9kxTIvbhTsxwjx8CBEwtj9DX5hlMpVr3o5Jsc/CdLlJ4bP9we/K4/uYGpvtkNi0AtkDsVlnVRkgXhwVcVTbg/mJSCoEaP6N1eXyDsxABWjoRDICC/mpsOMCpUFw/g7qowBMxibU//bi6F8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694718; c=relaxed/simple; bh=60RNjZpwSNZ6wBilj4su/4Aeh008/tMwIResm6EJvmA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=R4XMOenCFEJ94oFFZzLHFMC4HwhGXimEL8gInU0VnVHU7y3Ek/vs7Z5GfeeGEGAQd0KCaSQt9m3dDDU3Nscur6X6KPpCTEaNOJlvp/sR5EZnJ4PCpXoCL2nDCGUkUDGxyIWaMw1ZRC05x4+hNPAGAZJZU3hXUOxvl0PycJyTnCI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=BdimJlES; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="BdimJlES" Received: from [192.168.1.106] (mob-5-90-62-213.net.vodafone.it [5.90.62.213]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id CDE2D2F0D; Wed, 20 Aug 2025 14:57:28 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1755694649; bh=60RNjZpwSNZ6wBilj4su/4Aeh008/tMwIResm6EJvmA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=BdimJlESJvXOqNFAC73aoODI0hwIJSIRiZ0KLhZhEmBpFFTN2uFnxQPsHBuzBRZ67 7XQZFAMhCkKe6fMpSXysqOdZltIl8KU48HiEJLVetypgXWpfPkdt53svVLKpFJV5Hh GhtQWjdWjYudUJHO6Si2QmZpOTkIVJ8MAmVxuI+w= From: Jacopo Mondi Date: Wed, 20 Aug 2025 14:58:15 +0200 Subject: [PATCH v4 7/8] media: amlogic-c3: Use v4l2-params for validation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250820-extensible-parameters-validation-v4-7-30fe5a99cb1f@ideasonboard.com> References: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> In-Reply-To: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> To: Dafna Hirschfeld , Laurent Pinchart , Keke Li , Mauro Carvalho Chehab , Heiko Stuebner , Dan Scally , Sakari Ailus Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Jacopo Mondi X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=17404; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=60RNjZpwSNZ6wBilj4su/4Aeh008/tMwIResm6EJvmA=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBopcZrntxB/p4OdPOTLYRHgVgjvAybu9eSaxqNK cxghk9yJBSJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaKXGawAKCRByNAaPFqFW PDWqD/921OXH72ertvmpZHmsiwHK0I7UNgZlFoPln+f78U1kNG18f226vP2F1Sx/zIDJCxVT+M3 XKiP1d7qPjbGhKpr3Fu6REf0po2vCykOHQaQHQaz+Nvx+Mco4Q1vrlwJ6mMFhpgR0utdL/1e16C OLlJmj1V2LK6xGVAfQd5Co6sm73vjXaGmSE3XFwXC66TQeCef2RAtVX9esZcC/G/kvTG6RraLGt nKviStQBaztMs7DW2i5upRQsegkAzZ1MSpJmZW7u3ArUNEGZ+zlHwNn2/RVwnakJD0uul41EfIh /6ULfLCbCBuADMk7TfaEDR7moJzsKg+PZd2ZgxuMdCZ6Q1ktmeqGEQRVVm1FGxYi/hGqeYMdGDf zL5jNR+rdnLvU8vyqTtFqSvDDZSly95Q8H7BY35HrYT6Nu+qiCU/v/uDyGiy8xzy3vhDSzAmuGD drnVs+ar35QMHN9d22moCb6Z+DyzFSSOe3j19ZLqrSYjQY/mIQEQ0SBFnWoTiUhsG++/+EQFiJ7 Fqr9bres1XYdSvoaLLvkVq8NdXC7W8fmCe1xJtIaipnrGBqNThnq/kGRxwxjDOzAJQo8tS9SMln 1r2HYvqX9dFwGM5u/BhmtNyMsFajLoMxIKMk71Aox7zYxFE2PGnuJkXv/JIfACHWFhsT6ZJgOXr ffEZH/Iym2XN2Yw== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B Convert c3-ispa-params.c to use the new types fro block handlers defined in v4l2-params.h and use the new helpers from v4l2-params.c to remove boilerplate code from the driver. Reviewed-by: Keke Li Reviewed-by: Daniel Scally Signed-off-by: Jacopo Mondi --- .../media/platform/amlogic/c3/isp/c3-isp-params.c | 263 ++++++++---------= ---- 1 file changed, 94 insertions(+), 169 deletions(-) diff --git a/drivers/media/platform/amlogic/c3/isp/c3-isp-params.c b/driver= s/media/platform/amlogic/c3/isp/c3-isp-params.c index c80667dd766210d2b2e1ee60c8254a5814b9d81b..259cb354ffddf4a1195422dfd9b= 3ba24c79607fc 100644 --- a/drivers/media/platform/amlogic/c3/isp/c3-isp-params.c +++ b/drivers/media/platform/amlogic/c3/isp/c3-isp-params.c @@ -9,64 +9,26 @@ =20 #include #include +#include #include =20 #include "c3-isp-common.h" #include "c3-isp-regs.h" =20 -/* - * union c3_isp_params_block - Generalisation of a parameter block - * - * This union allows the driver to treat a block as a generic struct to th= is - * union and safely access the header and block-specific struct without ha= ving - * to resort to casting. The header member is accessed first, and the type= field - * checked which allows the driver to determine which of the other members - * should be used. - * - * @header: The shared header struct embedded as the first member - * of all the possible other members. This member would be - * accessed first and the type field checked to determine - * which of the other members should be accessed. - * @awb_gains: For header.type =3D=3D C3_ISP_PARAMS_BLOCK_AWB_GAINS - * @awb_cfg: For header.type =3D=3D C3_ISP_PARAMS_BLOCK_AWB_CONFIG - * @ae_cfg: For header.type =3D=3D C3_ISP_PARAMS_BLOCK_AE_CONFIG - * @af_cfg: For header.type =3D=3D C3_ISP_PARAMS_BLOCK_AF_CONFIG - * @pst_gamma: For header.type =3D=3D C3_ISP_PARAMS_BLOCK_PST_GAMMA - * @ccm: For header.type =3D=3D C3_ISP_PARAMS_BLOCK_CCM - * @csc: For header.type =3D=3D C3_ISP_PARAMS_BLOCK_CSC - * @blc: For header.type =3D=3D C3_ISP_PARAMS_BLOCK_BLC - */ -union c3_isp_params_block { - struct c3_isp_params_block_header header; - struct c3_isp_params_awb_gains awb_gains; - struct c3_isp_params_awb_config awb_cfg; - struct c3_isp_params_ae_config ae_cfg; - struct c3_isp_params_af_config af_cfg; - struct c3_isp_params_pst_gamma pst_gamma; - struct c3_isp_params_ccm ccm; - struct c3_isp_params_csc csc; - struct c3_isp_params_blc blc; -}; - -typedef void (*c3_isp_block_handler)(struct c3_isp_device *isp, - const union c3_isp_params_block *block); - -struct c3_isp_params_handler { - size_t size; - c3_isp_block_handler handler; -}; - #define to_c3_isp_params_buffer(vbuf) \ container_of(vbuf, struct c3_isp_params_buffer, vb) =20 /* Hardware configuration */ =20 -static void c3_isp_params_cfg_awb_gains(struct c3_isp_device *isp, - const union c3_isp_params_block *block) +static void +c3_isp_params_cfg_awb_gains(void *dev, + const struct v4l2_params_block_header *block) { - const struct c3_isp_params_awb_gains *awb_gains =3D &block->awb_gains; + const struct c3_isp_params_awb_gains *awb_gains =3D + (const struct c3_isp_params_awb_gains *)block; + struct c3_isp_device *isp =3D dev; =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { c3_isp_update_bits(isp, ISP_TOP_BEO_CTRL, ISP_TOP_BEO_CTRL_WB_EN_MASK, ISP_TOP_BEO_CTRL_WB_DIS); @@ -89,7 +51,7 @@ static void c3_isp_params_cfg_awb_gains(struct c3_isp_dev= ice *isp, ISP_LSWB_WB_GAIN2_IR_GAIN_MASK, ISP_LSWB_WB_GAIN2_IR_GAIN(awb_gains->gb_gain)); =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) c3_isp_update_bits(isp, ISP_TOP_BEO_CTRL, ISP_TOP_BEO_CTRL_WB_EN_MASK, ISP_TOP_BEO_CTRL_WB_EN); @@ -151,12 +113,15 @@ static void c3_isp_params_awb_cood(struct c3_isp_devi= ce *isp, ISP_AWB_IDX_DATA_VIDX_DATA(cfg->vert_coord[i])); } =20 -static void c3_isp_params_cfg_awb_config(struct c3_isp_device *isp, - const union c3_isp_params_block *block) +static void +c3_isp_params_cfg_awb_config(void *dev, + const struct v4l2_params_block_header *block) { - const struct c3_isp_params_awb_config *awb_cfg =3D &block->awb_cfg; + const struct c3_isp_params_awb_config *awb_cfg =3D + (const struct c3_isp_params_awb_config *)block; + struct c3_isp_device *isp =3D dev; =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { c3_isp_update_bits(isp, ISP_TOP_3A_STAT_CRTL, ISP_TOP_3A_STAT_CRTL_AWB_STAT_EN_MASK, ISP_TOP_3A_STAT_CRTL_AWB_STAT_DIS); @@ -205,7 +170,7 @@ static void c3_isp_params_cfg_awb_config(struct c3_isp_= device *isp, c3_isp_params_awb_wt(isp, awb_cfg); c3_isp_params_awb_cood(isp, awb_cfg); =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) c3_isp_update_bits(isp, ISP_TOP_3A_STAT_CRTL, ISP_TOP_3A_STAT_CRTL_AWB_STAT_EN_MASK, ISP_TOP_3A_STAT_CRTL_AWB_STAT_EN); @@ -268,12 +233,15 @@ static void c3_isp_params_ae_cood(struct c3_isp_devic= e *isp, ISP_AE_IDX_DATA_VIDX_DATA(cfg->vert_coord[i])); } =20 -static void c3_isp_params_cfg_ae_config(struct c3_isp_device *isp, - const union c3_isp_params_block *block) +static void +c3_isp_params_cfg_ae_config(void *dev, + const struct v4l2_params_block_header *block) { - const struct c3_isp_params_ae_config *ae_cfg =3D &block->ae_cfg; + const struct c3_isp_params_ae_config *ae_cfg =3D + (const struct c3_isp_params_ae_config *)block; + struct c3_isp_device *isp =3D dev; =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { c3_isp_update_bits(isp, ISP_TOP_3A_STAT_CRTL, ISP_TOP_3A_STAT_CRTL_AE_STAT_EN_MASK, ISP_TOP_3A_STAT_CRTL_AE_STAT_DIS); @@ -303,7 +271,7 @@ static void c3_isp_params_cfg_ae_config(struct c3_isp_d= evice *isp, c3_isp_params_ae_wt(isp, ae_cfg); c3_isp_params_ae_cood(isp, ae_cfg); =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) c3_isp_update_bits(isp, ISP_TOP_3A_STAT_CRTL, ISP_TOP_3A_STAT_CRTL_AE_STAT_EN_MASK, ISP_TOP_3A_STAT_CRTL_AE_STAT_EN); @@ -326,12 +294,15 @@ static void c3_isp_params_af_cood(struct c3_isp_devic= e *isp, ISP_AF_IDX_DATA_VIDX_DATA(cfg->vert_coord[i])); } =20 -static void c3_isp_params_cfg_af_config(struct c3_isp_device *isp, - const union c3_isp_params_block *block) +static void +c3_isp_params_cfg_af_config(void *dev, + const struct v4l2_params_block_header *block) { - const struct c3_isp_params_af_config *af_cfg =3D &block->af_cfg; + const struct c3_isp_params_af_config *af_cfg =3D + (const struct c3_isp_params_af_config *)block; + struct c3_isp_device *isp =3D dev; =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { c3_isp_update_bits(isp, ISP_TOP_3A_STAT_CRTL, ISP_TOP_3A_STAT_CRTL_AF_STAT_EN_MASK, ISP_TOP_3A_STAT_CRTL_AF_STAT_DIS); @@ -351,20 +322,23 @@ static void c3_isp_params_cfg_af_config(struct c3_isp= _device *isp, =20 c3_isp_params_af_cood(isp, af_cfg); =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) c3_isp_update_bits(isp, ISP_TOP_3A_STAT_CRTL, ISP_TOP_3A_STAT_CRTL_AF_STAT_EN_MASK, ISP_TOP_3A_STAT_CRTL_AF_STAT_EN); } =20 -static void c3_isp_params_cfg_pst_gamma(struct c3_isp_device *isp, - const union c3_isp_params_block *block) +static void +c3_isp_params_cfg_pst_gamma(void *dev, + const struct v4l2_params_block_header *block) { - const struct c3_isp_params_pst_gamma *gm =3D &block->pst_gamma; + const struct c3_isp_params_pst_gamma *gm =3D + (const struct c3_isp_params_pst_gamma *)block; + struct c3_isp_device *isp =3D dev; unsigned int base; unsigned int i; =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { c3_isp_update_bits(isp, ISP_TOP_BED_CTRL, ISP_TOP_BED_CTRL_PST_GAMMA_EN_MASK, ISP_TOP_BED_CTRL_PST_GAMMA_DIS); @@ -393,19 +367,21 @@ static void c3_isp_params_cfg_pst_gamma(struct c3_isp= _device *isp, } } =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) c3_isp_update_bits(isp, ISP_TOP_BED_CTRL, ISP_TOP_BED_CTRL_PST_GAMMA_EN_MASK, ISP_TOP_BED_CTRL_PST_GAMMA_EN); } =20 /* Configure 3 x 3 ccm matrix */ -static void c3_isp_params_cfg_ccm(struct c3_isp_device *isp, - const union c3_isp_params_block *block) +static void c3_isp_params_cfg_ccm(void *dev, + const struct v4l2_params_block_header *block) { - const struct c3_isp_params_ccm *ccm =3D &block->ccm; + const struct c3_isp_params_ccm *ccm =3D + (const struct c3_isp_params_ccm *)block; + struct c3_isp_device *isp =3D dev; =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { c3_isp_update_bits(isp, ISP_TOP_BED_CTRL, ISP_TOP_BED_CTRL_CCM_EN_MASK, ISP_TOP_BED_CTRL_CCM_DIS); @@ -442,19 +418,21 @@ static void c3_isp_params_cfg_ccm(struct c3_isp_devic= e *isp, ISP_CCM_MTX_22_23_RS_MTX_22_MASK, ISP_CCM_MTX_22_23_RS_MTX_22(ccm->matrix[2][2])); =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) c3_isp_update_bits(isp, ISP_TOP_BED_CTRL, ISP_TOP_BED_CTRL_CCM_EN_MASK, ISP_TOP_BED_CTRL_CCM_EN); } =20 /* Configure color space conversion matrix parameters */ -static void c3_isp_params_cfg_csc(struct c3_isp_device *isp, - const union c3_isp_params_block *block) +static void c3_isp_params_cfg_csc(void *dev, + const struct v4l2_params_block_header *block) { - const struct c3_isp_params_csc *csc =3D &block->csc; + const struct c3_isp_params_csc *csc =3D + (const struct c3_isp_params_csc *)block; + struct c3_isp_device *isp =3D dev; =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { c3_isp_update_bits(isp, ISP_TOP_BED_CTRL, ISP_TOP_BED_CTRL_CM0_EN_MASK, ISP_TOP_BED_CTRL_CM0_DIS); @@ -491,19 +469,21 @@ static void c3_isp_params_cfg_csc(struct c3_isp_devic= e *isp, ISP_CM0_COEF22_OUP_OFST0_MTX_22_MASK, ISP_CM0_COEF22_OUP_OFST0_MTX_22(csc->matrix[2][2])); =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) c3_isp_update_bits(isp, ISP_TOP_BED_CTRL, ISP_TOP_BED_CTRL_CM0_EN_MASK, ISP_TOP_BED_CTRL_CM0_EN); } =20 /* Set blc offset of each color channel */ -static void c3_isp_params_cfg_blc(struct c3_isp_device *isp, - const union c3_isp_params_block *block) +static void c3_isp_params_cfg_blc(void *dev, + const struct v4l2_params_block_header *block) { - const struct c3_isp_params_blc *blc =3D &block->blc; + const struct c3_isp_params_blc *blc =3D + (const struct c3_isp_params_blc *)block; + struct c3_isp_device *isp =3D dev; =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_DISABLE) { c3_isp_update_bits(isp, ISP_TOP_BEO_CTRL, ISP_TOP_BEO_CTRL_BLC_EN_MASK, ISP_TOP_BEO_CTRL_BLC_DIS); @@ -517,13 +497,13 @@ static void c3_isp_params_cfg_blc(struct c3_isp_devic= e *isp, ISP_LSWB_BLC_OFST1_GB_OFST(blc->gb_ofst) | ISP_LSWB_BLC_OFST1_B_OFST(blc->b_ofst)); =20 - if (block->header.flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) + if (block->flags & C3_ISP_PARAMS_BLOCK_FL_ENABLE) c3_isp_update_bits(isp, ISP_TOP_BEO_CTRL, ISP_TOP_BEO_CTRL_BLC_EN_MASK, ISP_TOP_BEO_CTRL_BLC_EN); } =20 -static const struct c3_isp_params_handler c3_isp_params_handlers[] =3D { +static const struct v4l2_params_handler c3_isp_params_handlers[] =3D { [C3_ISP_PARAMS_BLOCK_AWB_GAINS] =3D { .size =3D sizeof(struct c3_isp_params_awb_gains), .handler =3D c3_isp_params_cfg_awb_gains, @@ -568,16 +548,16 @@ static void c3_isp_params_cfg_blocks(struct c3_isp_pa= rams *params) =20 /* Walk the list of parameter blocks and process them */ while (block_offset < config->data_size) { - const struct c3_isp_params_handler *block_handler; - const union c3_isp_params_block *block; + const struct v4l2_params_handler *block_handler; + const struct v4l2_params_block_header *block; =20 - block =3D (const union c3_isp_params_block *) + block =3D (const struct v4l2_params_block_header *) &config->data[block_offset]; =20 - block_handler =3D &c3_isp_params_handlers[block->header.type]; + block_handler =3D &c3_isp_params_handlers[block->type]; block_handler->handler(params->isp, block); =20 - block_offset +=3D block->header.size; + block_offset +=3D block->size; } } =20 @@ -766,31 +746,35 @@ static void c3_isp_params_vb2_buf_queue(struct vb2_bu= ffer *vb) list_add_tail(&buf->list, ¶ms->pending); } =20 +static int +c3_isp_params_validate_buffer(struct device *dev, + const struct v4l2_params_buffer *buffer) +{ + /* Only v0 is supported at the moment */ + if (buffer->version !=3D C3_ISP_PARAMS_BUFFER_V0) { + dev_dbg(dev, "Invalid params buffer version: %u\n", + buffer->version); + return -EINVAL; + } + + return 0; +} + static int c3_isp_params_vb2_buf_prepare(struct vb2_buffer *vb) { struct vb2_v4l2_buffer *vbuf =3D to_vb2_v4l2_buffer(vb); struct c3_isp_params_buffer *buf =3D to_c3_isp_params_buffer(vbuf); struct c3_isp_params *params =3D vb2_get_drv_priv(vb->vb2_queue); - struct c3_isp_params_cfg *cfg =3D buf->cfg; struct c3_isp_params_cfg *usr_cfg =3D vb2_plane_vaddr(vb, 0); size_t payload_size =3D vb2_get_plane_payload(vb, 0); - size_t header_size =3D offsetof(struct c3_isp_params_cfg, data); - size_t block_offset =3D 0; - size_t cfg_size; - - /* Payload size can't be greater than the destination buffer size */ - if (payload_size > params->vfmt.fmt.meta.buffersize) { - dev_dbg(params->isp->dev, - "Payload size is too large: %zu\n", payload_size); - return -EINVAL; - } + struct c3_isp_params_cfg *cfg =3D buf->cfg; + int ret; =20 - /* Payload size can't be smaller than the header size */ - if (payload_size < header_size) { - dev_dbg(params->isp->dev, - "Payload size is too small: %zu\n", payload_size); - return -EINVAL; - } + ret =3D v4l2_params_buffer_validate(params->isp->dev, vb, + params->vfmt.fmt.meta.buffersize, + c3_isp_params_validate_buffer); + if (ret) + return ret; =20 /* * Use the internal scratch buffer to avoid userspace modifying @@ -798,70 +782,11 @@ static int c3_isp_params_vb2_buf_prepare(struct vb2_b= uffer *vb) */ memcpy(cfg, usr_cfg, payload_size); =20 - /* Only v0 is supported at the moment */ - if (cfg->version !=3D C3_ISP_PARAMS_BUFFER_V0) { - dev_dbg(params->isp->dev, - "Invalid params buffer version: %u\n", cfg->version); - return -EINVAL; - } - - /* Validate the size reported in the parameter buffer header */ - cfg_size =3D header_size + cfg->data_size; - if (cfg_size !=3D payload_size) { - dev_dbg(params->isp->dev, - "Data size %zu and payload size %zu are different\n", - cfg_size, payload_size); - return -EINVAL; - } - - /* Walk the list of parameter blocks and validate them */ - cfg_size =3D cfg->data_size; - while (cfg_size >=3D sizeof(struct c3_isp_params_block_header)) { - const struct c3_isp_params_block_header *block; - const struct c3_isp_params_handler *handler; - - block =3D (struct c3_isp_params_block_header *) - &cfg->data[block_offset]; - - if (block->type >=3D ARRAY_SIZE(c3_isp_params_handlers)) { - dev_dbg(params->isp->dev, - "Invalid params block type\n"); - return -EINVAL; - } - - if (block->size > cfg_size) { - dev_dbg(params->isp->dev, - "Block size is greater than cfg size\n"); - return -EINVAL; - } - - if ((block->flags & (C3_ISP_PARAMS_BLOCK_FL_ENABLE | - C3_ISP_PARAMS_BLOCK_FL_DISABLE)) =3D=3D - (C3_ISP_PARAMS_BLOCK_FL_ENABLE | - C3_ISP_PARAMS_BLOCK_FL_DISABLE)) { - dev_dbg(params->isp->dev, - "Invalid parameters block flags\n"); - return -EINVAL; - } - - handler =3D &c3_isp_params_handlers[block->type]; - if (block->size !=3D handler->size) { - dev_dbg(params->isp->dev, - "Invalid params block size\n"); - return -EINVAL; - } - - block_offset +=3D block->size; - cfg_size -=3D block->size; - } - - if (cfg_size) { - dev_dbg(params->isp->dev, - "Unexpected data after the params buffer end\n"); - return -EINVAL; - } - - return 0; + return v4l2_params_blocks_validate(params->isp->dev, + (struct v4l2_params_buffer *)cfg, + c3_isp_params_handlers, + ARRAY_SIZE(c3_isp_params_handlers), + NULL); } =20 static int c3_isp_params_vb2_buf_init(struct vb2_buffer *vb) --=20 2.50.1 From nobody Sat Oct 4 03:15:51 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EFF27320CCB; Wed, 20 Aug 2025 12:58:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694720; cv=none; b=WfrPWlrHdebyQbWzuQBgbFyoqUlxoRriUFsDxzunr+QOYL6P5lA0zDdGVN4uz5alyPC0FlZOgVcJSNSJsP0O13weGB7IHw2h3KZxSlqZD2uZiQPOmKdvLORZySuQSr7I4nkck7Df2G8dY8FCXpuJKqlrhllcmZ6Mdiv1kiaA2c4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755694720; c=relaxed/simple; bh=iH2fNzQ3ZFHpzPlJuJdqflptF90hlToFOvzIGy7xjpo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZWkCVWbscugjln6pPOR09PaJSe6vMISA3lSwQ7eOGARC6bhmqrYjwsISqfzWMqaZaxwF7zCR5OY4hCJVcrl6+V9tKeHBOdooyO+4A5OrwLkfdUY29ELh8GR13J3h32jTff13mRZSi33vG0zWkXeRdet3SpaAGVNaLsyOETiSMRw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=e1BukG0t; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="e1BukG0t" Received: from [192.168.1.106] (mob-5-90-62-213.net.vodafone.it [5.90.62.213]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C8F373026; Wed, 20 Aug 2025 14:57:29 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1755694650; bh=iH2fNzQ3ZFHpzPlJuJdqflptF90hlToFOvzIGy7xjpo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=e1BukG0tYfkM3lRLUHrDsbCTSahvEvBtyBbU7mckS7GIkXfx3ZQlcFBLUD3J+A6PC jkJDVCsU/k0Dd7F89H7jS0AJXFgyBGEIgOZ146LQEsiLvmLKui0pgVWhlyVcF9yYX0 n4pcBUeGp4KgeYSX3geAX/0+WXOy9y2ENE8+1MQU= From: Jacopo Mondi Date: Wed, 20 Aug 2025 14:58:16 +0200 Subject: [PATCH v4 8/8] media: Documentation: kapi: Add v4l2 extensible parameters Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250820-extensible-parameters-validation-v4-8-30fe5a99cb1f@ideasonboard.com> References: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> In-Reply-To: <20250820-extensible-parameters-validation-v4-0-30fe5a99cb1f@ideasonboard.com> To: Dafna Hirschfeld , Laurent Pinchart , Keke Li , Mauro Carvalho Chehab , Heiko Stuebner , Dan Scally , Sakari Ailus Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Jacopo Mondi X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1847; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=iH2fNzQ3ZFHpzPlJuJdqflptF90hlToFOvzIGy7xjpo=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBopcZskzivZR+rstQ6ZEBhq5EPSPtUaFVxobfis 8Qf+PkD/oWJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaKXGbAAKCRByNAaPFqFW PAZ9D/4kVXCo8Hv5ncIvy3/X087jo4tqzDhadOx79YQEIaCoVBJ2iJxdtBTlAAIPNozNZX/pu7f eIHC7bg31mHF5a5fuS0TW1j3ErTIbBi0Q3nqe262wheNOyl/ddTF0s5iO5t23lx/m4kYRMrQ9AZ eaxy7Xcqy72cFd2G4SC/CRO7bQise+UDRzZLeaK7phcd6gSHxymgaDz2etI5v6HGXmr2ajuQxOf 7x1NAMI/0zakOccNSO2NBIFw1kOoyAdYha/SU6NK8zEiiT2XCfIxN0s4UZiDiMgkHck70JmCO8z aa5qzzPL6lNidsrxa1w+Mzv6EeU5o1HlgjWSh29eXLBo0nyxheBNK6pw6fNKWowtZFbVqff/PYN uCLBYYgFmIjWkNwjB6FnsnIl9HAVQI9JpzzJjky+h30TVUtgf0rPaC6Ont3zn+/dURZ3JH4AaU8 P2eX1M4icOReKSSj6k0OkVa7eZ3gme9nfAUPegKQwf5FBUbT4Sz2OBDSsMtUpw5fktVBU9Ueest o+uV6rvaJp2JAuQ51Cs2PtlMV9gUuS5XnxFpbShxmys9ExYDC5Uu42VJg2ese6xqwNrgQ9yyTcX dhbfPphYVCM8IWaMvPGN11jWrkFSIYfJBnUizezc7zKuSPBJYqruS12JLl86pO0KYAhcc9QBqJ1 T/j1r5lA0PoI7RA== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B Add to the driver-api documentation the v4l2-params.h types and helpers documentation. Reviewed-by: Daniel Scally Signed-off-by: Jacopo Mondi --- Documentation/driver-api/media/v4l2-core.rst | 1 + Documentation/driver-api/media/v4l2-params.rst | 5 +++++ MAINTAINERS | 1 + 3 files changed, 7 insertions(+) diff --git a/Documentation/driver-api/media/v4l2-core.rst b/Documentation/d= river-api/media/v4l2-core.rst index ad987c34ad2a8460bb95e97adc4d850d624e0b81..2d7793298c6a2046bdd59b185a4= 11e092b659d52 100644 --- a/Documentation/driver-api/media/v4l2-core.rst +++ b/Documentation/driver-api/media/v4l2-core.rst @@ -27,3 +27,4 @@ Video4Linux devices v4l2-common v4l2-tveeprom v4l2-jpeg + v4l2-params diff --git a/Documentation/driver-api/media/v4l2-params.rst b/Documentation= /driver-api/media/v4l2-params.rst new file mode 100644 index 0000000000000000000000000000000000000000..8d2a5f004d21dfc3a81255cabbc= 6b7cce588db71 --- /dev/null +++ b/Documentation/driver-api/media/v4l2-params.rst @@ -0,0 +1,5 @@ +.. SPDX-License-Identifier: GPL-2.0 + +V4L2 extensible parameters kAPI +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. kernel-doc:: include/media/v4l2-params.h diff --git a/MAINTAINERS b/MAINTAINERS index 008f984c0769691f6ddec8d8f0f461fde056ddb3..44598a823f084e98a9b2d2e2188= 1665d1ab64908 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -26384,6 +26384,7 @@ V4L2 EXTENSIBLE PARAMETERS FORMAT M: Jacopo Mondi L: linux-media@vger.kernel.org S: Maintained +F: Documentation/driver-api/media/v4l2-params.rst F: Documentation/userspace-api/media/v4l/extensible-parameters.rst F: drivers/media/v4l2-core/v4l2-params.c F: include/media/v4l2-params.h --=20 2.50.1