Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

media: rkisp1: Use v4l2-isp for validation

Convert rkisp1-params.c to use the helpers defined in v4l2-isp.h
to perform validation of a ISP parameters buffer.

Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>

authored by

Jacopo Mondi and committed by
Hans Verkuil
3a2730a4 3cb6de6f

+44 -107
+1
drivers/media/platform/rockchip/rkisp1/Kconfig
··· 10 10 select VIDEOBUF2_VMALLOC 11 11 select V4L2_FWNODE 12 12 select GENERIC_PHY_MIPI_DPHY 13 + select V4L2_ISP 13 14 default n 14 15 help 15 16 Enable this to support the Image Signal Processing (ISP) module
+43 -107
drivers/media/platform/rockchip/rkisp1/rkisp1-params.c
··· 6 6 */ 7 7 8 8 #include <linux/bitfield.h> 9 + #include <linux/build_bug.h> 9 10 #include <linux/math.h> 10 11 #include <linux/string.h> 11 12 12 13 #include <media/v4l2-common.h> 13 14 #include <media/v4l2-event.h> 14 15 #include <media/v4l2-ioctl.h> 16 + #include <media/v4l2-isp.h> 15 17 #include <media/videobuf2-core.h> 16 18 #include <media/videobuf2-vmalloc.h> /* for ISP params */ 17 19 ··· 2099 2097 const union rkisp1_ext_params_config *config); 2100 2098 2101 2099 static const struct rkisp1_ext_params_handler { 2102 - size_t size; 2103 2100 rkisp1_block_handler handler; 2104 2101 unsigned int group; 2105 2102 unsigned int features; 2106 2103 } rkisp1_ext_params_handlers[] = { 2107 2104 [RKISP1_EXT_PARAMS_BLOCK_TYPE_BLS] = { 2108 - .size = sizeof(struct rkisp1_ext_params_bls_config), 2109 2105 .handler = rkisp1_ext_params_bls, 2110 2106 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2111 2107 .features = RKISP1_FEATURE_BLS, 2112 2108 }, 2113 2109 [RKISP1_EXT_PARAMS_BLOCK_TYPE_DPCC] = { 2114 - .size = sizeof(struct rkisp1_ext_params_dpcc_config), 2115 2110 .handler = rkisp1_ext_params_dpcc, 2116 2111 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2117 2112 }, 2118 2113 [RKISP1_EXT_PARAMS_BLOCK_TYPE_SDG] = { 2119 - .size = sizeof(struct rkisp1_ext_params_sdg_config), 2120 2114 .handler = rkisp1_ext_params_sdg, 2121 2115 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2122 2116 }, 2123 2117 [RKISP1_EXT_PARAMS_BLOCK_TYPE_AWB_GAIN] = { 2124 - .size = sizeof(struct rkisp1_ext_params_awb_gain_config), 2125 2118 .handler = rkisp1_ext_params_awbg, 2126 2119 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2127 2120 }, 2128 2121 [RKISP1_EXT_PARAMS_BLOCK_TYPE_FLT] = { 2129 - .size = sizeof(struct rkisp1_ext_params_flt_config), 2130 2122 .handler = rkisp1_ext_params_flt, 2131 2123 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2132 2124 }, 2133 2125 [RKISP1_EXT_PARAMS_BLOCK_TYPE_BDM] = { 2134 - .size = sizeof(struct rkisp1_ext_params_bdm_config), 2135 2126 .handler = rkisp1_ext_params_bdm, 2136 2127 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2137 2128 }, 2138 2129 [RKISP1_EXT_PARAMS_BLOCK_TYPE_CTK] = { 2139 - .size = sizeof(struct rkisp1_ext_params_ctk_config), 2140 2130 .handler = rkisp1_ext_params_ctk, 2141 2131 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2142 2132 }, 2143 2133 [RKISP1_EXT_PARAMS_BLOCK_TYPE_GOC] = { 2144 - .size = sizeof(struct rkisp1_ext_params_goc_config), 2145 2134 .handler = rkisp1_ext_params_goc, 2146 2135 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2147 2136 }, 2148 2137 [RKISP1_EXT_PARAMS_BLOCK_TYPE_DPF] = { 2149 - .size = sizeof(struct rkisp1_ext_params_dpf_config), 2150 2138 .handler = rkisp1_ext_params_dpf, 2151 2139 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2152 2140 }, 2153 2141 [RKISP1_EXT_PARAMS_BLOCK_TYPE_DPF_STRENGTH] = { 2154 - .size = sizeof(struct rkisp1_ext_params_dpf_strength_config), 2155 2142 .handler = rkisp1_ext_params_dpfs, 2156 2143 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2157 2144 }, 2158 2145 [RKISP1_EXT_PARAMS_BLOCK_TYPE_CPROC] = { 2159 - .size = sizeof(struct rkisp1_ext_params_cproc_config), 2160 2146 .handler = rkisp1_ext_params_cproc, 2161 2147 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2162 2148 }, 2163 2149 [RKISP1_EXT_PARAMS_BLOCK_TYPE_IE] = { 2164 - .size = sizeof(struct rkisp1_ext_params_ie_config), 2165 2150 .handler = rkisp1_ext_params_ie, 2166 2151 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2167 2152 }, 2168 2153 [RKISP1_EXT_PARAMS_BLOCK_TYPE_LSC] = { 2169 - .size = sizeof(struct rkisp1_ext_params_lsc_config), 2170 2154 .handler = rkisp1_ext_params_lsc, 2171 2155 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_LSC, 2172 2156 }, 2173 2157 [RKISP1_EXT_PARAMS_BLOCK_TYPE_AWB_MEAS] = { 2174 - .size = sizeof(struct rkisp1_ext_params_awb_meas_config), 2175 2158 .handler = rkisp1_ext_params_awbm, 2176 2159 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2177 2160 }, 2178 2161 [RKISP1_EXT_PARAMS_BLOCK_TYPE_HST_MEAS] = { 2179 - .size = sizeof(struct rkisp1_ext_params_hst_config), 2180 2162 .handler = rkisp1_ext_params_hstm, 2181 2163 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2182 2164 }, 2183 2165 [RKISP1_EXT_PARAMS_BLOCK_TYPE_AEC_MEAS] = { 2184 - .size = sizeof(struct rkisp1_ext_params_aec_config), 2185 2166 .handler = rkisp1_ext_params_aecm, 2186 2167 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2187 2168 }, 2188 2169 [RKISP1_EXT_PARAMS_BLOCK_TYPE_AFC_MEAS] = { 2189 - .size = sizeof(struct rkisp1_ext_params_afc_config), 2190 2170 .handler = rkisp1_ext_params_afcm, 2191 2171 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2192 2172 }, 2193 2173 [RKISP1_EXT_PARAMS_BLOCK_TYPE_COMPAND_BLS] = { 2194 - .size = sizeof(struct rkisp1_ext_params_compand_bls_config), 2195 2174 .handler = rkisp1_ext_params_compand_bls, 2196 2175 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2197 2176 .features = RKISP1_FEATURE_COMPAND, 2198 2177 }, 2199 2178 [RKISP1_EXT_PARAMS_BLOCK_TYPE_COMPAND_EXPAND] = { 2200 - .size = sizeof(struct rkisp1_ext_params_compand_curve_config), 2201 2179 .handler = rkisp1_ext_params_compand_expand, 2202 2180 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2203 2181 .features = RKISP1_FEATURE_COMPAND, 2204 2182 }, 2205 2183 [RKISP1_EXT_PARAMS_BLOCK_TYPE_COMPAND_COMPRESS] = { 2206 - .size = sizeof(struct rkisp1_ext_params_compand_curve_config), 2207 2184 .handler = rkisp1_ext_params_compand_compress, 2208 2185 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2209 2186 .features = RKISP1_FEATURE_COMPAND, 2210 2187 }, 2211 2188 [RKISP1_EXT_PARAMS_BLOCK_TYPE_WDR] = { 2212 - .size = sizeof(struct rkisp1_ext_params_wdr_config), 2213 2189 .handler = rkisp1_ext_params_wdr, 2214 2190 .group = RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS, 2215 2191 }, 2216 2192 }; 2193 + 2194 + #define RKISP1_PARAMS_BLOCK_INFO(block, data) \ 2195 + [RKISP1_EXT_PARAMS_BLOCK_TYPE_ ## block] = { \ 2196 + .size = sizeof(struct rkisp1_ext_params_ ## data ## _config), \ 2197 + } 2198 + 2199 + static const struct v4l2_isp_params_block_info rkisp1_ext_params_blocks_info[] = { 2200 + RKISP1_PARAMS_BLOCK_INFO(BLS, bls), 2201 + RKISP1_PARAMS_BLOCK_INFO(DPCC, dpcc), 2202 + RKISP1_PARAMS_BLOCK_INFO(SDG, sdg), 2203 + RKISP1_PARAMS_BLOCK_INFO(AWB_GAIN, awb_gain), 2204 + RKISP1_PARAMS_BLOCK_INFO(FLT, flt), 2205 + RKISP1_PARAMS_BLOCK_INFO(BDM, bdm), 2206 + RKISP1_PARAMS_BLOCK_INFO(CTK, ctk), 2207 + RKISP1_PARAMS_BLOCK_INFO(GOC, goc), 2208 + RKISP1_PARAMS_BLOCK_INFO(DPF, dpf), 2209 + RKISP1_PARAMS_BLOCK_INFO(DPF_STRENGTH, dpf_strength), 2210 + RKISP1_PARAMS_BLOCK_INFO(CPROC, cproc), 2211 + RKISP1_PARAMS_BLOCK_INFO(IE, ie), 2212 + RKISP1_PARAMS_BLOCK_INFO(LSC, lsc), 2213 + RKISP1_PARAMS_BLOCK_INFO(AWB_MEAS, awb_meas), 2214 + RKISP1_PARAMS_BLOCK_INFO(HST_MEAS, hst), 2215 + RKISP1_PARAMS_BLOCK_INFO(AEC_MEAS, aec), 2216 + RKISP1_PARAMS_BLOCK_INFO(AFC_MEAS, afc), 2217 + RKISP1_PARAMS_BLOCK_INFO(COMPAND_BLS, compand_bls), 2218 + RKISP1_PARAMS_BLOCK_INFO(COMPAND_EXPAND, compand_curve), 2219 + RKISP1_PARAMS_BLOCK_INFO(COMPAND_COMPRESS, compand_curve), 2220 + RKISP1_PARAMS_BLOCK_INFO(WDR, wdr), 2221 + }; 2222 + 2223 + static_assert(ARRAY_SIZE(rkisp1_ext_params_handlers) == 2224 + ARRAY_SIZE(rkisp1_ext_params_blocks_info)); 2217 2225 2218 2226 static void rkisp1_ext_params_config(struct rkisp1_params *params, 2219 2227 struct rkisp1_ext_params_cfg *cfg, ··· 2658 2646 { 2659 2647 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); 2660 2648 struct rkisp1_params_buffer *params_buf = to_rkisp1_params_buffer(vbuf); 2661 - size_t header_size = offsetof(struct rkisp1_ext_params_cfg, data); 2662 2649 struct rkisp1_ext_params_cfg *cfg = params_buf->cfg; 2663 2650 size_t payload_size = vb2_get_plane_payload(vb, 0); 2664 2651 struct rkisp1_ext_params_cfg *usr_cfg = 2665 2652 vb2_plane_vaddr(&vbuf->vb2_buf, 0); 2666 - size_t block_offset = 0; 2667 - size_t cfg_size; 2653 + int ret; 2668 2654 2669 - /* 2670 - * Validate the buffer payload size before copying the parameters. The 2671 - * payload has to be smaller than the destination buffer size and larger 2672 - * than the header size. 2673 - */ 2674 - if (payload_size > params->metafmt->buffersize) { 2675 - dev_dbg(params->rkisp1->dev, 2676 - "Too large buffer payload size %zu\n", payload_size); 2677 - return -EINVAL; 2678 - } 2679 - 2680 - if (payload_size < header_size) { 2681 - dev_dbg(params->rkisp1->dev, 2682 - "Buffer payload %zu smaller than header size %zu\n", 2683 - payload_size, header_size); 2684 - return -EINVAL; 2685 - } 2655 + ret = v4l2_isp_params_validate_buffer_size(params->rkisp1->dev, vb, 2656 + params->metafmt->buffersize); 2657 + if (ret) 2658 + return ret; 2686 2659 2687 2660 /* 2688 2661 * Copy the parameters buffer to the internal scratch buffer to avoid ··· 2675 2678 */ 2676 2679 memcpy(cfg, usr_cfg, payload_size); 2677 2680 2678 - /* Only v1 is supported at the moment. */ 2679 - if (cfg->version != RKISP1_EXT_PARAM_BUFFER_V1) { 2680 - dev_dbg(params->rkisp1->dev, 2681 - "Unsupported extensible format version: %u\n", 2682 - cfg->version); 2683 - return -EINVAL; 2684 - } 2685 - 2686 - /* Validate the size reported in the parameters buffer header. */ 2687 - cfg_size = header_size + cfg->data_size; 2688 - if (cfg_size != payload_size) { 2689 - dev_dbg(params->rkisp1->dev, 2690 - "Data size %zu different than buffer payload size %zu\n", 2691 - cfg_size, payload_size); 2692 - return -EINVAL; 2693 - } 2694 - 2695 - /* Walk the list of parameter blocks and validate them. */ 2696 - cfg_size = cfg->data_size; 2697 - while (cfg_size >= sizeof(struct rkisp1_ext_params_block_header)) { 2698 - const struct rkisp1_ext_params_block_header *block; 2699 - const struct rkisp1_ext_params_handler *handler; 2700 - 2701 - block = (const struct rkisp1_ext_params_block_header *) 2702 - &cfg->data[block_offset]; 2703 - 2704 - if (block->type >= ARRAY_SIZE(rkisp1_ext_params_handlers)) { 2705 - dev_dbg(params->rkisp1->dev, 2706 - "Invalid parameters block type\n"); 2707 - return -EINVAL; 2708 - } 2709 - 2710 - if (block->size > cfg_size) { 2711 - dev_dbg(params->rkisp1->dev, 2712 - "Premature end of parameters data\n"); 2713 - return -EINVAL; 2714 - } 2715 - 2716 - if ((block->flags & (RKISP1_EXT_PARAMS_FL_BLOCK_ENABLE | 2717 - RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE)) == 2718 - (RKISP1_EXT_PARAMS_FL_BLOCK_ENABLE | 2719 - RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE)) { 2720 - dev_dbg(params->rkisp1->dev, 2721 - "Invalid parameters block flags\n"); 2722 - return -EINVAL; 2723 - } 2724 - 2725 - handler = &rkisp1_ext_params_handlers[block->type]; 2726 - if (block->size != handler->size) { 2727 - dev_dbg(params->rkisp1->dev, 2728 - "Invalid parameters block size\n"); 2729 - return -EINVAL; 2730 - } 2731 - 2732 - block_offset += block->size; 2733 - cfg_size -= block->size; 2734 - } 2735 - 2736 - if (cfg_size) { 2737 - dev_dbg(params->rkisp1->dev, 2738 - "Unexpected data after the parameters buffer end\n"); 2739 - return -EINVAL; 2740 - } 2741 - 2742 - return 0; 2681 + return v4l2_isp_params_validate_buffer(params->rkisp1->dev, vb, 2682 + (struct v4l2_isp_params_buffer *)cfg, 2683 + rkisp1_ext_params_blocks_info, 2684 + ARRAY_SIZE(rkisp1_ext_params_blocks_info)); 2743 2685 } 2744 2686 2745 2687 static int rkisp1_params_vb2_buf_prepare(struct vb2_buffer *vb)