| 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 | |