1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Video4Linux2 generic ISP parameters and statistics support 4 * 5 * Copyright (C) 2025 Ideas On Board Oy 6 * Author: Jacopo Mondi <jacopo.mondi@ideasonboard.com> 7 */ 8 9 #ifndef _V4L2_ISP_H_ 10 #define _V4L2_ISP_H_ 11 12 #include <linux/media/v4l2-isp.h> 13 14 struct device; 15 struct vb2_buffer; 16 17 /** 18 * v4l2_isp_params_buffer_size - Calculate size of v4l2_isp_params_buffer 19 * @max_params_size: The total size of the ISP configuration blocks 20 * 21 * Users of the v4l2 extensible parameters will have differing sized data arrays 22 * depending on their specific parameter buffers. Drivers and userspace will 23 * need to be able to calculate the appropriate size of the struct to 24 * accommodate all ISP configuration blocks provided by the platform. 25 * This macro provides a convenient tool for the calculation. 26 */ 27 #define v4l2_isp_params_buffer_size(max_params_size) \ 28 (offsetof(struct v4l2_isp_params_buffer, data) + (max_params_size)) 29 30 /** 31 * v4l2_isp_params_validate_buffer_size - Validate a V4L2 ISP buffer sizes 32 * @dev: the driver's device pointer 33 * @vb: the videobuf2 buffer 34 * @max_size: the maximum allowed buffer size 35 * 36 * This function performs validation of the size of a V4L2 ISP parameters buffer 37 * before the driver can access the actual data buffer content. 38 * 39 * After the sizes validation, drivers should copy the buffer content to a 40 * kernel-only memory area to prevent userspace from modifying it, 41 * before completing validation using v4l2_isp_params_validate_buffer(). 42 * 43 * The @vb buffer as received from the vb2 .buf_prepare() operation is checked 44 * against @max_size and it's validated to be large enough to accommodate at 45 * least one ISP configuration block. 46 */ 47 int v4l2_isp_params_validate_buffer_size(struct device *dev, 48 struct vb2_buffer *vb, 49 size_t max_size); 50 51 /** 52 * struct v4l2_isp_params_block_type_info - V4L2 ISP per-block-type info 53 * @size: the block type expected size 54 * 55 * The v4l2_isp_params_block_type_info collects information of the ISP 56 * configuration block types for validation purposes. It currently only contains 57 * the expected block type size. 58 * 59 * Drivers shall prepare a list of block type info, indexed by block type, one 60 * for each supported ISP block type and correctly populate them with the 61 * expected block type size. 62 */ 63 struct v4l2_isp_params_block_type_info { 64 size_t size; 65 }; 66 67 /** 68 * v4l2_isp_params_validate_buffer - Validate a V4L2 ISP parameters buffer 69 * @dev: the driver's device pointer 70 * @vb: the videobuf2 buffer 71 * @buffer: the V4L2 ISP parameters buffer 72 * @type_info: the array of per-block-type validation info 73 * @num_block_types: the number of block types in the type_info array 74 * 75 * This function completes the validation of a V4L2 ISP parameters buffer, 76 * verifying each configuration block correctness before the driver can use 77 * them to program the hardware. 78 * 79 * Drivers should use this function after having validated the correctness of 80 * the vb2 buffer sizes by using the v4l2_isp_params_validate_buffer_size() 81 * helper first. Once the buffer size has been validated, drivers should 82 * perform a copy of the user provided buffer into a kernel-only memory buffer 83 * to prevent userspace from modifying its content after it has been submitted 84 * to the driver, and then call this function to complete validation. 85 */ 86 int v4l2_isp_params_validate_buffer(struct device *dev, struct vb2_buffer *vb, 87 const struct v4l2_isp_params_buffer *buffer, 88 const struct v4l2_isp_params_block_type_info *type_info, 89 size_t num_block_types); 90 91 #endif /* _V4L2_ISP_H_ */ 92