xref: /linux/drivers/media/v4l2-core/v4l2-ctrls-core.c (revision 546b928da0427b0d6c663cbb992bd7bfa9ac7971)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * V4L2 controls framework core implementation.
4  *
5  * Copyright (C) 2010-2021  Hans Verkuil <hverkuil@kernel.org>
6  */
7 
8 #include <linux/export.h>
9 #include <linux/mm.h>
10 #include <linux/slab.h>
11 #include <media/v4l2-ctrls.h>
12 #include <media/v4l2-event.h>
13 #include <media/v4l2-fwnode.h>
14 
15 #include "v4l2-ctrls-priv.h"
16 
17 static const union v4l2_ctrl_ptr ptr_null;
18 
19 #define V4L2_HEVC_MAX_SHORT_TERM_REF_PIC_SETS	64
20 #define V4L2_HEVC_MAX_LONG_TERM_REF_PICS_SPS	32
21 
fill_event(struct v4l2_event * ev,struct v4l2_ctrl * ctrl,u32 changes)22 static void fill_event(struct v4l2_event *ev, struct v4l2_ctrl *ctrl,
23 		       u32 changes)
24 {
25 	memset(ev, 0, sizeof(*ev));
26 	ev->type = V4L2_EVENT_CTRL;
27 	ev->id = ctrl->id;
28 	ev->u.ctrl.changes = changes;
29 	ev->u.ctrl.type = ctrl->type;
30 	ev->u.ctrl.flags = user_flags(ctrl);
31 	if (ctrl->is_ptr)
32 		ev->u.ctrl.value64 = 0;
33 	else
34 		ev->u.ctrl.value64 = *ctrl->p_cur.p_s64;
35 	ev->u.ctrl.minimum = ctrl->minimum;
36 	ev->u.ctrl.maximum = ctrl->maximum;
37 	if (ctrl->type == V4L2_CTRL_TYPE_MENU
38 	    || ctrl->type == V4L2_CTRL_TYPE_INTEGER_MENU)
39 		ev->u.ctrl.step = 1;
40 	else
41 		ev->u.ctrl.step = ctrl->step;
42 	ev->u.ctrl.default_value = ctrl->default_value;
43 }
44 
send_initial_event(struct v4l2_fh * fh,struct v4l2_ctrl * ctrl)45 void send_initial_event(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl)
46 {
47 	struct v4l2_event ev;
48 	u32 changes = V4L2_EVENT_CTRL_CH_FLAGS;
49 
50 	if (!(ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY))
51 		changes |= V4L2_EVENT_CTRL_CH_VALUE;
52 	fill_event(&ev, ctrl, changes);
53 	v4l2_event_queue_fh(fh, &ev);
54 }
55 
send_event(struct v4l2_fh * fh,struct v4l2_ctrl * ctrl,u32 changes)56 void send_event(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 changes)
57 {
58 	struct v4l2_event ev;
59 	struct v4l2_subscribed_event *sev;
60 
61 	if (list_empty(&ctrl->ev_subs))
62 		return;
63 	fill_event(&ev, ctrl, changes);
64 
65 	list_for_each_entry(sev, &ctrl->ev_subs, node)
66 		if (sev->fh != fh ||
67 		    (sev->flags & V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK))
68 			v4l2_event_queue_fh(sev->fh, &ev);
69 }
70 
v4l2_ctrl_type_op_equal(const struct v4l2_ctrl * ctrl,union v4l2_ctrl_ptr ptr1,union v4l2_ctrl_ptr ptr2)71 bool v4l2_ctrl_type_op_equal(const struct v4l2_ctrl *ctrl,
72 			     union v4l2_ctrl_ptr ptr1, union v4l2_ctrl_ptr ptr2)
73 {
74 	unsigned int i;
75 
76 	switch (ctrl->type) {
77 	case V4L2_CTRL_TYPE_BUTTON:
78 		return false;
79 	case V4L2_CTRL_TYPE_STRING:
80 		for (i = 0; i < ctrl->elems; i++) {
81 			unsigned int idx = i * ctrl->elem_size;
82 
83 			/* strings are always 0-terminated */
84 			if (strcmp(ptr1.p_char + idx, ptr2.p_char + idx))
85 				return false;
86 		}
87 		return true;
88 	default:
89 		return !memcmp(ptr1.p_const, ptr2.p_const,
90 			       ctrl->elems * ctrl->elem_size);
91 	}
92 }
93 EXPORT_SYMBOL(v4l2_ctrl_type_op_equal);
94 
95 /* Default intra MPEG-2 quantisation coefficients, from the specification. */
96 static const u8 mpeg2_intra_quant_matrix[64] = {
97 	8,  16, 16, 19, 16, 19, 22, 22,
98 	22, 22, 22, 22, 26, 24, 26, 27,
99 	27, 27, 26, 26, 26, 26, 27, 27,
100 	27, 29, 29, 29, 34, 34, 34, 29,
101 	29, 29, 27, 27, 29, 29, 32, 32,
102 	34, 34, 37, 38, 37, 35, 35, 34,
103 	35, 38, 38, 40, 40, 40, 48, 48,
104 	46, 46, 56, 56, 58, 69, 69, 83
105 };
106 
std_init_compound(const struct v4l2_ctrl * ctrl,u32 idx,union v4l2_ctrl_ptr ptr)107 static void std_init_compound(const struct v4l2_ctrl *ctrl, u32 idx,
108 			      union v4l2_ctrl_ptr ptr)
109 {
110 	struct v4l2_ctrl_mpeg2_sequence *p_mpeg2_sequence;
111 	struct v4l2_ctrl_mpeg2_picture *p_mpeg2_picture;
112 	struct v4l2_ctrl_mpeg2_quantisation *p_mpeg2_quant;
113 	struct v4l2_ctrl_vp8_frame *p_vp8_frame;
114 	struct v4l2_ctrl_vp9_frame *p_vp9_frame;
115 	struct v4l2_ctrl_fwht_params *p_fwht_params;
116 	struct v4l2_ctrl_h264_scaling_matrix *p_h264_scaling_matrix;
117 	struct v4l2_ctrl_av1_sequence *p_av1_sequence;
118 	void *p = ptr.p + idx * ctrl->elem_size;
119 
120 	if (ctrl->p_def.p_const)
121 		memcpy(p, ctrl->p_def.p_const, ctrl->elem_size);
122 	else
123 		memset(p, 0, ctrl->elem_size);
124 
125 	switch ((u32)ctrl->type) {
126 	case V4L2_CTRL_TYPE_MPEG2_SEQUENCE:
127 		p_mpeg2_sequence = p;
128 
129 		/* 4:2:0 */
130 		p_mpeg2_sequence->chroma_format = 1;
131 		break;
132 	case V4L2_CTRL_TYPE_MPEG2_PICTURE:
133 		p_mpeg2_picture = p;
134 
135 		/* interlaced top field */
136 		p_mpeg2_picture->picture_structure = V4L2_MPEG2_PIC_TOP_FIELD;
137 		p_mpeg2_picture->picture_coding_type =
138 					V4L2_MPEG2_PIC_CODING_TYPE_I;
139 		break;
140 	case V4L2_CTRL_TYPE_MPEG2_QUANTISATION:
141 		p_mpeg2_quant = p;
142 
143 		memcpy(p_mpeg2_quant->intra_quantiser_matrix,
144 		       mpeg2_intra_quant_matrix,
145 		       ARRAY_SIZE(mpeg2_intra_quant_matrix));
146 		/*
147 		 * The default non-intra MPEG-2 quantisation
148 		 * coefficients are all 16, as per the specification.
149 		 */
150 		memset(p_mpeg2_quant->non_intra_quantiser_matrix, 16,
151 		       sizeof(p_mpeg2_quant->non_intra_quantiser_matrix));
152 		break;
153 	case V4L2_CTRL_TYPE_VP8_FRAME:
154 		p_vp8_frame = p;
155 		p_vp8_frame->num_dct_parts = 1;
156 		break;
157 	case V4L2_CTRL_TYPE_VP9_FRAME:
158 		p_vp9_frame = p;
159 		p_vp9_frame->profile = 0;
160 		p_vp9_frame->bit_depth = 8;
161 		p_vp9_frame->flags |= V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING |
162 			V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING;
163 		break;
164 	case V4L2_CTRL_TYPE_AV1_SEQUENCE:
165 		p_av1_sequence = p;
166 		/*
167 		 * The initial profile is 0 which only allows YUV 420 subsampled
168 		 * data. Set the subsampling flags accordingly.
169 		 */
170 		p_av1_sequence->bit_depth = 8;
171 		p_av1_sequence->flags |= V4L2_AV1_SEQUENCE_FLAG_SUBSAMPLING_X |
172 					 V4L2_AV1_SEQUENCE_FLAG_SUBSAMPLING_Y;
173 		break;
174 	case V4L2_CTRL_TYPE_FWHT_PARAMS:
175 		p_fwht_params = p;
176 		p_fwht_params->version = V4L2_FWHT_VERSION;
177 		p_fwht_params->width = 1280;
178 		p_fwht_params->height = 720;
179 		p_fwht_params->flags = V4L2_FWHT_FL_PIXENC_YUV |
180 			(2 << V4L2_FWHT_FL_COMPONENTS_NUM_OFFSET);
181 		break;
182 	case V4L2_CTRL_TYPE_H264_SCALING_MATRIX:
183 		p_h264_scaling_matrix = p;
184 		/*
185 		 * The default (flat) H.264 scaling matrix when none are
186 		 * specified in the bitstream, this is according to formulas
187 		 *  (7-8) and (7-9) of the specification.
188 		 */
189 		memset(p_h264_scaling_matrix, 16, sizeof(*p_h264_scaling_matrix));
190 		break;
191 	}
192 }
193 
std_min_compound(const struct v4l2_ctrl * ctrl,u32 idx,union v4l2_ctrl_ptr ptr)194 static void std_min_compound(const struct v4l2_ctrl *ctrl, u32 idx,
195 			     union v4l2_ctrl_ptr ptr)
196 {
197 	void *p = ptr.p + idx * ctrl->elem_size;
198 
199 	if (ctrl->p_min.p_const)
200 		memcpy(p, ctrl->p_min.p_const, ctrl->elem_size);
201 	else
202 		memset(p, 0, ctrl->elem_size);
203 }
204 
std_max_compound(const struct v4l2_ctrl * ctrl,u32 idx,union v4l2_ctrl_ptr ptr)205 static void std_max_compound(const struct v4l2_ctrl *ctrl, u32 idx,
206 			     union v4l2_ctrl_ptr ptr)
207 {
208 	void *p = ptr.p + idx * ctrl->elem_size;
209 
210 	if (ctrl->p_max.p_const)
211 		memcpy(p, ctrl->p_max.p_const, ctrl->elem_size);
212 	else
213 		memset(p, 0, ctrl->elem_size);
214 }
215 
__v4l2_ctrl_type_op_init(const struct v4l2_ctrl * ctrl,u32 from_idx,u32 which,union v4l2_ctrl_ptr ptr)216 static void __v4l2_ctrl_type_op_init(const struct v4l2_ctrl *ctrl, u32 from_idx,
217 				     u32 which, union v4l2_ctrl_ptr ptr)
218 {
219 	unsigned int i;
220 	u32 tot_elems = ctrl->elems;
221 	u32 elems = tot_elems - from_idx;
222 	s64 value;
223 
224 	switch (which) {
225 	case V4L2_CTRL_WHICH_DEF_VAL:
226 		value = ctrl->default_value;
227 		break;
228 	case V4L2_CTRL_WHICH_MAX_VAL:
229 		value = ctrl->maximum;
230 		break;
231 	case V4L2_CTRL_WHICH_MIN_VAL:
232 		value = ctrl->minimum;
233 		break;
234 	default:
235 		return;
236 	}
237 
238 	switch (ctrl->type) {
239 	case V4L2_CTRL_TYPE_STRING:
240 		if (which == V4L2_CTRL_WHICH_DEF_VAL)
241 			value = ctrl->minimum;
242 
243 		for (i = from_idx; i < tot_elems; i++) {
244 			unsigned int offset = i * ctrl->elem_size;
245 
246 			memset(ptr.p_char + offset, ' ', value);
247 			ptr.p_char[offset + value] = '\0';
248 		}
249 		break;
250 	case V4L2_CTRL_TYPE_INTEGER64:
251 		if (value) {
252 			for (i = from_idx; i < tot_elems; i++)
253 				ptr.p_s64[i] = value;
254 		} else {
255 			memset(ptr.p_s64 + from_idx, 0, elems * sizeof(s64));
256 		}
257 		break;
258 	case V4L2_CTRL_TYPE_INTEGER:
259 	case V4L2_CTRL_TYPE_INTEGER_MENU:
260 	case V4L2_CTRL_TYPE_MENU:
261 	case V4L2_CTRL_TYPE_BITMASK:
262 	case V4L2_CTRL_TYPE_BOOLEAN:
263 		if (value) {
264 			for (i = from_idx; i < tot_elems; i++)
265 				ptr.p_s32[i] = value;
266 		} else {
267 			memset(ptr.p_s32 + from_idx, 0, elems * sizeof(s32));
268 		}
269 		break;
270 	case V4L2_CTRL_TYPE_BUTTON:
271 	case V4L2_CTRL_TYPE_CTRL_CLASS:
272 		memset(ptr.p_s32 + from_idx, 0, elems * sizeof(s32));
273 		break;
274 	case V4L2_CTRL_TYPE_U8:
275 		memset(ptr.p_u8 + from_idx, value, elems);
276 		break;
277 	case V4L2_CTRL_TYPE_U16:
278 		if (value) {
279 			for (i = from_idx; i < tot_elems; i++)
280 				ptr.p_u16[i] = value;
281 		} else {
282 			memset(ptr.p_u16 + from_idx, 0, elems * sizeof(u16));
283 		}
284 		break;
285 	case V4L2_CTRL_TYPE_U32:
286 		if (value) {
287 			for (i = from_idx; i < tot_elems; i++)
288 				ptr.p_u32[i] = value;
289 		} else {
290 			memset(ptr.p_u32 + from_idx, 0, elems * sizeof(u32));
291 		}
292 		break;
293 	default:
294 		for (i = from_idx; i < tot_elems; i++) {
295 			switch (which) {
296 			case V4L2_CTRL_WHICH_DEF_VAL:
297 				std_init_compound(ctrl, i, ptr);
298 				break;
299 			case V4L2_CTRL_WHICH_MAX_VAL:
300 				std_max_compound(ctrl, i, ptr);
301 				break;
302 			case V4L2_CTRL_WHICH_MIN_VAL:
303 				std_min_compound(ctrl, i, ptr);
304 				break;
305 			}
306 		}
307 		break;
308 	}
309 }
310 
v4l2_ctrl_type_op_init(const struct v4l2_ctrl * ctrl,u32 from_idx,union v4l2_ctrl_ptr ptr)311 void v4l2_ctrl_type_op_init(const struct v4l2_ctrl *ctrl, u32 from_idx,
312 			    union v4l2_ctrl_ptr ptr)
313 {
314 	__v4l2_ctrl_type_op_init(ctrl, from_idx, V4L2_CTRL_WHICH_DEF_VAL, ptr);
315 }
316 EXPORT_SYMBOL(v4l2_ctrl_type_op_init);
317 
v4l2_ctrl_type_op_minimum(const struct v4l2_ctrl * ctrl,u32 from_idx,union v4l2_ctrl_ptr ptr)318 static void v4l2_ctrl_type_op_minimum(const struct v4l2_ctrl *ctrl,
319 				      u32 from_idx, union v4l2_ctrl_ptr ptr)
320 {
321 	__v4l2_ctrl_type_op_init(ctrl, from_idx, V4L2_CTRL_WHICH_MIN_VAL, ptr);
322 }
323 
v4l2_ctrl_type_op_maximum(const struct v4l2_ctrl * ctrl,u32 from_idx,union v4l2_ctrl_ptr ptr)324 static void v4l2_ctrl_type_op_maximum(const struct v4l2_ctrl *ctrl,
325 				      u32 from_idx, union v4l2_ctrl_ptr ptr)
326 {
327 	__v4l2_ctrl_type_op_init(ctrl, from_idx, V4L2_CTRL_WHICH_MAX_VAL, ptr);
328 }
329 
v4l2_ctrl_type_op_log(const struct v4l2_ctrl * ctrl)330 void v4l2_ctrl_type_op_log(const struct v4l2_ctrl *ctrl)
331 {
332 	union v4l2_ctrl_ptr ptr = ctrl->p_cur;
333 
334 	if (ctrl->is_array) {
335 		unsigned i;
336 
337 		for (i = 0; i < ctrl->nr_of_dims; i++)
338 			pr_cont("[%u]", ctrl->dims[i]);
339 		pr_cont(" ");
340 	}
341 
342 	switch (ctrl->type) {
343 	case V4L2_CTRL_TYPE_INTEGER:
344 		pr_cont("%d", *ptr.p_s32);
345 		break;
346 	case V4L2_CTRL_TYPE_BOOLEAN:
347 		pr_cont("%s", *ptr.p_s32 ? "true" : "false");
348 		break;
349 	case V4L2_CTRL_TYPE_MENU:
350 		pr_cont("%s", ctrl->qmenu[*ptr.p_s32]);
351 		break;
352 	case V4L2_CTRL_TYPE_INTEGER_MENU:
353 		pr_cont("%lld", ctrl->qmenu_int[*ptr.p_s32]);
354 		break;
355 	case V4L2_CTRL_TYPE_BITMASK:
356 		pr_cont("0x%08x", *ptr.p_s32);
357 		break;
358 	case V4L2_CTRL_TYPE_INTEGER64:
359 		pr_cont("%lld", *ptr.p_s64);
360 		break;
361 	case V4L2_CTRL_TYPE_STRING:
362 		pr_cont("%s", ptr.p_char);
363 		break;
364 	case V4L2_CTRL_TYPE_U8:
365 		pr_cont("%u", (unsigned)*ptr.p_u8);
366 		break;
367 	case V4L2_CTRL_TYPE_U16:
368 		pr_cont("%u", (unsigned)*ptr.p_u16);
369 		break;
370 	case V4L2_CTRL_TYPE_U32:
371 		pr_cont("%u", (unsigned)*ptr.p_u32);
372 		break;
373 	case V4L2_CTRL_TYPE_AREA:
374 		pr_cont("%ux%u", ptr.p_area->width, ptr.p_area->height);
375 		break;
376 	case V4L2_CTRL_TYPE_H264_SPS:
377 		pr_cont("H264_SPS");
378 		break;
379 	case V4L2_CTRL_TYPE_H264_PPS:
380 		pr_cont("H264_PPS");
381 		break;
382 	case V4L2_CTRL_TYPE_H264_SCALING_MATRIX:
383 		pr_cont("H264_SCALING_MATRIX");
384 		break;
385 	case V4L2_CTRL_TYPE_H264_SLICE_PARAMS:
386 		pr_cont("H264_SLICE_PARAMS");
387 		break;
388 	case V4L2_CTRL_TYPE_H264_DECODE_PARAMS:
389 		pr_cont("H264_DECODE_PARAMS");
390 		break;
391 	case V4L2_CTRL_TYPE_H264_PRED_WEIGHTS:
392 		pr_cont("H264_PRED_WEIGHTS");
393 		break;
394 	case V4L2_CTRL_TYPE_FWHT_PARAMS:
395 		pr_cont("FWHT_PARAMS");
396 		break;
397 	case V4L2_CTRL_TYPE_VP8_FRAME:
398 		pr_cont("VP8_FRAME");
399 		break;
400 	case V4L2_CTRL_TYPE_HDR10_CLL_INFO:
401 		pr_cont("HDR10_CLL_INFO");
402 		break;
403 	case V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY:
404 		pr_cont("HDR10_MASTERING_DISPLAY");
405 		break;
406 	case V4L2_CTRL_TYPE_MPEG2_QUANTISATION:
407 		pr_cont("MPEG2_QUANTISATION");
408 		break;
409 	case V4L2_CTRL_TYPE_MPEG2_SEQUENCE:
410 		pr_cont("MPEG2_SEQUENCE");
411 		break;
412 	case V4L2_CTRL_TYPE_MPEG2_PICTURE:
413 		pr_cont("MPEG2_PICTURE");
414 		break;
415 	case V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR:
416 		pr_cont("VP9_COMPRESSED_HDR");
417 		break;
418 	case V4L2_CTRL_TYPE_VP9_FRAME:
419 		pr_cont("VP9_FRAME");
420 		break;
421 	case V4L2_CTRL_TYPE_HEVC_SPS:
422 		pr_cont("HEVC_SPS");
423 		break;
424 	case V4L2_CTRL_TYPE_HEVC_PPS:
425 		pr_cont("HEVC_PPS");
426 		break;
427 	case V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS:
428 		pr_cont("HEVC_SLICE_PARAMS");
429 		break;
430 	case V4L2_CTRL_TYPE_HEVC_EXT_SPS_ST_RPS:
431 		pr_cont("HEVC_EXT_SPS_ST_RPS");
432 		break;
433 	case V4L2_CTRL_TYPE_HEVC_EXT_SPS_LT_RPS:
434 		pr_cont("HEVC_EXT_SPS_LT_RPS");
435 		break;
436 	case V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX:
437 		pr_cont("HEVC_SCALING_MATRIX");
438 		break;
439 	case V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS:
440 		pr_cont("HEVC_DECODE_PARAMS");
441 		break;
442 	case V4L2_CTRL_TYPE_AV1_SEQUENCE:
443 		pr_cont("AV1_SEQUENCE");
444 		break;
445 	case V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY:
446 		pr_cont("AV1_TILE_GROUP_ENTRY");
447 		break;
448 	case V4L2_CTRL_TYPE_AV1_FRAME:
449 		pr_cont("AV1_FRAME");
450 		break;
451 	case V4L2_CTRL_TYPE_AV1_FILM_GRAIN:
452 		pr_cont("AV1_FILM_GRAIN");
453 		break;
454 	case V4L2_CTRL_TYPE_RECT:
455 		pr_cont("(%d,%d)/%ux%u",
456 			ptr.p_rect->left, ptr.p_rect->top,
457 			ptr.p_rect->width, ptr.p_rect->height);
458 		break;
459 	default:
460 		pr_cont("unknown type %d", ctrl->type);
461 		break;
462 	}
463 }
464 EXPORT_SYMBOL(v4l2_ctrl_type_op_log);
465 
466 /*
467  * Round towards the closest legal value. Be careful when we are
468  * close to the maximum range of the control type to prevent
469  * wrap-arounds.
470  */
471 #define ROUND_TO_RANGE(val, offset_type, ctrl)			\
472 ({								\
473 	offset_type offset;					\
474 	if ((ctrl)->maximum >= 0 &&				\
475 	    val >= (ctrl)->maximum - (s32)((ctrl)->step / 2))	\
476 		val = (ctrl)->maximum;				\
477 	else							\
478 		val += (s32)((ctrl)->step / 2);			\
479 	val = clamp_t(typeof(val), val,				\
480 		      (ctrl)->minimum, (ctrl)->maximum);	\
481 	offset = (val) - (ctrl)->minimum;			\
482 	offset = (ctrl)->step * (offset / (u32)(ctrl)->step);	\
483 	val = (ctrl)->minimum + offset;				\
484 	0;							\
485 })
486 
487 /* Validate a new control */
488 
489 #define zero_padding(s) \
490 	memset(&(s).padding, 0, sizeof((s).padding))
491 #define zero_reserved(s) \
492 	memset(&(s).reserved, 0, sizeof((s).reserved))
493 
494 static int
validate_vp9_lf_params(struct v4l2_vp9_loop_filter * lf)495 validate_vp9_lf_params(struct v4l2_vp9_loop_filter *lf)
496 {
497 	unsigned int i;
498 
499 	if (lf->flags & ~(V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED |
500 			  V4L2_VP9_LOOP_FILTER_FLAG_DELTA_UPDATE))
501 		return -EINVAL;
502 
503 	/* That all values are in the accepted range. */
504 	if (lf->level > GENMASK(5, 0))
505 		return -EINVAL;
506 
507 	if (lf->sharpness > GENMASK(2, 0))
508 		return -EINVAL;
509 
510 	for (i = 0; i < ARRAY_SIZE(lf->ref_deltas); i++)
511 		if (lf->ref_deltas[i] < -63 || lf->ref_deltas[i] > 63)
512 			return -EINVAL;
513 
514 	for (i = 0; i < ARRAY_SIZE(lf->mode_deltas); i++)
515 		if (lf->mode_deltas[i] < -63 || lf->mode_deltas[i] > 63)
516 			return -EINVAL;
517 
518 	zero_reserved(*lf);
519 	return 0;
520 }
521 
522 static int
validate_vp9_quant_params(struct v4l2_vp9_quantization * quant)523 validate_vp9_quant_params(struct v4l2_vp9_quantization *quant)
524 {
525 	if (quant->delta_q_y_dc < -15 || quant->delta_q_y_dc > 15 ||
526 	    quant->delta_q_uv_dc < -15 || quant->delta_q_uv_dc > 15 ||
527 	    quant->delta_q_uv_ac < -15 || quant->delta_q_uv_ac > 15)
528 		return -EINVAL;
529 
530 	zero_reserved(*quant);
531 	return 0;
532 }
533 
534 static int
validate_vp9_seg_params(struct v4l2_vp9_segmentation * seg)535 validate_vp9_seg_params(struct v4l2_vp9_segmentation *seg)
536 {
537 	unsigned int i, j;
538 
539 	if (seg->flags & ~(V4L2_VP9_SEGMENTATION_FLAG_ENABLED |
540 			   V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP |
541 			   V4L2_VP9_SEGMENTATION_FLAG_TEMPORAL_UPDATE |
542 			   V4L2_VP9_SEGMENTATION_FLAG_UPDATE_DATA |
543 			   V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE))
544 		return -EINVAL;
545 
546 	for (i = 0; i < ARRAY_SIZE(seg->feature_enabled); i++) {
547 		if (seg->feature_enabled[i] &
548 		    ~V4L2_VP9_SEGMENT_FEATURE_ENABLED_MASK)
549 			return -EINVAL;
550 	}
551 
552 	for (i = 0; i < ARRAY_SIZE(seg->feature_data); i++) {
553 		static const int range[] = { 255, 63, 3, 0 };
554 
555 		for (j = 0; j < ARRAY_SIZE(seg->feature_data[j]); j++) {
556 			if (seg->feature_data[i][j] < -range[j] ||
557 			    seg->feature_data[i][j] > range[j])
558 				return -EINVAL;
559 		}
560 	}
561 
562 	zero_reserved(*seg);
563 	return 0;
564 }
565 
566 static int
validate_vp9_compressed_hdr(struct v4l2_ctrl_vp9_compressed_hdr * hdr)567 validate_vp9_compressed_hdr(struct v4l2_ctrl_vp9_compressed_hdr *hdr)
568 {
569 	if (hdr->tx_mode > V4L2_VP9_TX_MODE_SELECT)
570 		return -EINVAL;
571 
572 	return 0;
573 }
574 
575 static int
validate_vp9_frame(struct v4l2_ctrl_vp9_frame * frame)576 validate_vp9_frame(struct v4l2_ctrl_vp9_frame *frame)
577 {
578 	int ret;
579 
580 	/* Make sure we're not passed invalid flags. */
581 	if (frame->flags & ~(V4L2_VP9_FRAME_FLAG_KEY_FRAME |
582 		  V4L2_VP9_FRAME_FLAG_SHOW_FRAME |
583 		  V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT |
584 		  V4L2_VP9_FRAME_FLAG_INTRA_ONLY |
585 		  V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV |
586 		  V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX |
587 		  V4L2_VP9_FRAME_FLAG_PARALLEL_DEC_MODE |
588 		  V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING |
589 		  V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING |
590 		  V4L2_VP9_FRAME_FLAG_COLOR_RANGE_FULL_SWING))
591 		return -EINVAL;
592 
593 	if (frame->flags & V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT &&
594 	    frame->flags & V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX)
595 		return -EINVAL;
596 
597 	if (frame->profile > V4L2_VP9_PROFILE_MAX)
598 		return -EINVAL;
599 
600 	if (frame->reset_frame_context > V4L2_VP9_RESET_FRAME_CTX_ALL)
601 		return -EINVAL;
602 
603 	if (frame->frame_context_idx >= V4L2_VP9_NUM_FRAME_CTX)
604 		return -EINVAL;
605 
606 	/*
607 	 * Profiles 0 and 1 only support 8-bit depth, profiles 2 and 3 only 10
608 	 * and 12 bit depths.
609 	 */
610 	if ((frame->profile < 2 && frame->bit_depth != 8) ||
611 	    (frame->profile >= 2 &&
612 	     (frame->bit_depth != 10 && frame->bit_depth != 12)))
613 		return -EINVAL;
614 
615 	/* Profile 0 and 2 only accept YUV 4:2:0. */
616 	if ((frame->profile == 0 || frame->profile == 2) &&
617 	    (!(frame->flags & V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING) ||
618 	     !(frame->flags & V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING)))
619 		return -EINVAL;
620 
621 	/* Profile 1 and 3 only accept YUV 4:2:2, 4:4:0 and 4:4:4. */
622 	if ((frame->profile == 1 || frame->profile == 3) &&
623 	    ((frame->flags & V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING) &&
624 	     (frame->flags & V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING)))
625 		return -EINVAL;
626 
627 	if (frame->interpolation_filter > V4L2_VP9_INTERP_FILTER_SWITCHABLE)
628 		return -EINVAL;
629 
630 	/*
631 	 * According to the spec, tile_cols_log2 shall be less than or equal
632 	 * to 6.
633 	 */
634 	if (frame->tile_cols_log2 > 6)
635 		return -EINVAL;
636 
637 	if (frame->reference_mode > V4L2_VP9_REFERENCE_MODE_SELECT)
638 		return -EINVAL;
639 
640 	ret = validate_vp9_lf_params(&frame->lf);
641 	if (ret)
642 		return ret;
643 
644 	ret = validate_vp9_quant_params(&frame->quant);
645 	if (ret)
646 		return ret;
647 
648 	ret = validate_vp9_seg_params(&frame->seg);
649 	if (ret)
650 		return ret;
651 
652 	zero_reserved(*frame);
653 	return 0;
654 }
655 
validate_av1_quantization(struct v4l2_av1_quantization * q)656 static int validate_av1_quantization(struct v4l2_av1_quantization *q)
657 {
658 	if (q->flags > GENMASK(2, 0))
659 		return -EINVAL;
660 
661 	if (q->delta_q_y_dc < -64 || q->delta_q_y_dc > 63 ||
662 	    q->delta_q_u_dc < -64 || q->delta_q_u_dc > 63 ||
663 	    q->delta_q_v_dc < -64 || q->delta_q_v_dc > 63 ||
664 	    q->delta_q_u_ac < -64 || q->delta_q_u_ac > 63 ||
665 	    q->delta_q_v_ac < -64 || q->delta_q_v_ac > 63 ||
666 	    q->delta_q_res > GENMASK(1, 0))
667 		return -EINVAL;
668 
669 	if (q->qm_y > GENMASK(3, 0) ||
670 	    q->qm_u > GENMASK(3, 0) ||
671 	    q->qm_v > GENMASK(3, 0))
672 		return -EINVAL;
673 
674 	return 0;
675 }
676 
validate_av1_segmentation(struct v4l2_av1_segmentation * s)677 static int validate_av1_segmentation(struct v4l2_av1_segmentation *s)
678 {
679 	u32 i;
680 	u32 j;
681 
682 	if (s->flags > GENMASK(4, 0))
683 		return -EINVAL;
684 
685 	for (i = 0; i < ARRAY_SIZE(s->feature_data); i++) {
686 		static const int segmentation_feature_signed[] = { 1, 1, 1, 1, 1, 0, 0, 0 };
687 		static const int segmentation_feature_max[] = { 255, 63, 63, 63, 63, 7, 0, 0};
688 
689 		for (j = 0; j < ARRAY_SIZE(s->feature_data[j]); j++) {
690 			s32 limit = segmentation_feature_max[j];
691 
692 			if (segmentation_feature_signed[j]) {
693 				if (s->feature_data[i][j] < -limit ||
694 				    s->feature_data[i][j] > limit)
695 					return -EINVAL;
696 			} else {
697 				if (s->feature_data[i][j] < 0 || s->feature_data[i][j] > limit)
698 					return -EINVAL;
699 			}
700 		}
701 	}
702 
703 	return 0;
704 }
705 
validate_av1_loop_filter(struct v4l2_av1_loop_filter * lf)706 static int validate_av1_loop_filter(struct v4l2_av1_loop_filter *lf)
707 {
708 	u32 i;
709 
710 	if (lf->flags > GENMASK(3, 0))
711 		return -EINVAL;
712 
713 	for (i = 0; i < ARRAY_SIZE(lf->level); i++) {
714 		if (lf->level[i] > GENMASK(5, 0))
715 			return -EINVAL;
716 	}
717 
718 	if (lf->sharpness > GENMASK(2, 0))
719 		return -EINVAL;
720 
721 	for (i = 0; i < ARRAY_SIZE(lf->ref_deltas); i++) {
722 		if (lf->ref_deltas[i] < -64 || lf->ref_deltas[i] > 63)
723 			return -EINVAL;
724 	}
725 
726 	for (i = 0; i < ARRAY_SIZE(lf->mode_deltas); i++) {
727 		if (lf->mode_deltas[i] < -64 || lf->mode_deltas[i] > 63)
728 			return -EINVAL;
729 	}
730 
731 	return 0;
732 }
733 
validate_av1_cdef(struct v4l2_av1_cdef * cdef)734 static int validate_av1_cdef(struct v4l2_av1_cdef *cdef)
735 {
736 	u32 i;
737 
738 	if (cdef->damping_minus_3 > GENMASK(1, 0) ||
739 	    cdef->bits > GENMASK(1, 0))
740 		return -EINVAL;
741 
742 	for (i = 0; i < 1 << cdef->bits; i++) {
743 		if (cdef->y_pri_strength[i] > GENMASK(3, 0) ||
744 		    cdef->y_sec_strength[i] > 4 ||
745 		    cdef->uv_pri_strength[i] > GENMASK(3, 0) ||
746 		    cdef->uv_sec_strength[i] > 4)
747 			return -EINVAL;
748 	}
749 
750 	return 0;
751 }
752 
validate_av1_loop_restauration(struct v4l2_av1_loop_restoration * lr)753 static int validate_av1_loop_restauration(struct v4l2_av1_loop_restoration *lr)
754 {
755 	if (lr->lr_unit_shift > 3 || lr->lr_uv_shift > 1)
756 		return -EINVAL;
757 
758 	return 0;
759 }
760 
validate_av1_film_grain(struct v4l2_ctrl_av1_film_grain * fg)761 static int validate_av1_film_grain(struct v4l2_ctrl_av1_film_grain *fg)
762 {
763 	u32 i;
764 
765 	if (fg->flags > GENMASK(4, 0))
766 		return -EINVAL;
767 
768 	if (fg->film_grain_params_ref_idx > GENMASK(2, 0) ||
769 	    fg->num_y_points > 14 ||
770 	    fg->num_cb_points > 10 ||
771 	    fg->num_cr_points > GENMASK(3, 0) ||
772 	    fg->grain_scaling_minus_8 > GENMASK(1, 0) ||
773 	    fg->ar_coeff_lag > GENMASK(1, 0) ||
774 	    fg->ar_coeff_shift_minus_6 > GENMASK(1, 0) ||
775 	    fg->grain_scale_shift > GENMASK(1, 0))
776 		return -EINVAL;
777 
778 	if (!(fg->flags & V4L2_AV1_FILM_GRAIN_FLAG_APPLY_GRAIN))
779 		return 0;
780 
781 	for (i = 1; i < fg->num_y_points; i++)
782 		if (fg->point_y_value[i] <= fg->point_y_value[i - 1])
783 			return -EINVAL;
784 
785 	for (i = 1; i < fg->num_cb_points; i++)
786 		if (fg->point_cb_value[i] <= fg->point_cb_value[i - 1])
787 			return -EINVAL;
788 
789 	for (i = 1; i < fg->num_cr_points; i++)
790 		if (fg->point_cr_value[i] <= fg->point_cr_value[i - 1])
791 			return -EINVAL;
792 
793 	return 0;
794 }
795 
validate_av1_tile_info(struct v4l2_av1_tile_info * t)796 static int validate_av1_tile_info(struct v4l2_av1_tile_info *t)
797 {
798 	/*
799 	 * tile_cols and tile_rows index the per-tile descriptor arrays and
800 	 * bound the tile loops in the stateless AV1 drivers; the product
801 	 * bounds the total tile descriptor count.
802 	 */
803 	if (t->tile_cols > V4L2_AV1_MAX_TILE_COLS ||
804 	    t->tile_rows > V4L2_AV1_MAX_TILE_ROWS)
805 		return -EINVAL;
806 
807 	if ((u32)t->tile_cols * t->tile_rows > V4L2_AV1_MAX_TILE_COUNT)
808 		return -EINVAL;
809 
810 	return 0;
811 }
812 
validate_av1_frame(struct v4l2_ctrl_av1_frame * f)813 static int validate_av1_frame(struct v4l2_ctrl_av1_frame *f)
814 {
815 	int ret = 0;
816 
817 	ret = validate_av1_tile_info(&f->tile_info);
818 	if (ret)
819 		return ret;
820 	ret = validate_av1_quantization(&f->quantization);
821 	if (ret)
822 		return ret;
823 	ret = validate_av1_segmentation(&f->segmentation);
824 	if (ret)
825 		return ret;
826 	ret = validate_av1_loop_filter(&f->loop_filter);
827 	if (ret)
828 		return ret;
829 	ret = validate_av1_cdef(&f->cdef);
830 	if (ret)
831 		return ret;
832 	ret = validate_av1_loop_restauration(&f->loop_restoration);
833 	if (ret)
834 		return ret;
835 
836 	if (f->flags &
837 	~(V4L2_AV1_FRAME_FLAG_SHOW_FRAME |
838 	  V4L2_AV1_FRAME_FLAG_SHOWABLE_FRAME |
839 	  V4L2_AV1_FRAME_FLAG_ERROR_RESILIENT_MODE |
840 	  V4L2_AV1_FRAME_FLAG_DISABLE_CDF_UPDATE |
841 	  V4L2_AV1_FRAME_FLAG_ALLOW_SCREEN_CONTENT_TOOLS |
842 	  V4L2_AV1_FRAME_FLAG_FORCE_INTEGER_MV |
843 	  V4L2_AV1_FRAME_FLAG_ALLOW_INTRABC |
844 	  V4L2_AV1_FRAME_FLAG_USE_SUPERRES |
845 	  V4L2_AV1_FRAME_FLAG_ALLOW_HIGH_PRECISION_MV |
846 	  V4L2_AV1_FRAME_FLAG_IS_MOTION_MODE_SWITCHABLE |
847 	  V4L2_AV1_FRAME_FLAG_USE_REF_FRAME_MVS |
848 	  V4L2_AV1_FRAME_FLAG_DISABLE_FRAME_END_UPDATE_CDF |
849 	  V4L2_AV1_FRAME_FLAG_ALLOW_WARPED_MOTION |
850 	  V4L2_AV1_FRAME_FLAG_REFERENCE_SELECT |
851 	  V4L2_AV1_FRAME_FLAG_REDUCED_TX_SET |
852 	  V4L2_AV1_FRAME_FLAG_SKIP_MODE_ALLOWED |
853 	  V4L2_AV1_FRAME_FLAG_SKIP_MODE_PRESENT |
854 	  V4L2_AV1_FRAME_FLAG_FRAME_SIZE_OVERRIDE |
855 	  V4L2_AV1_FRAME_FLAG_BUFFER_REMOVAL_TIME_PRESENT |
856 	  V4L2_AV1_FRAME_FLAG_FRAME_REFS_SHORT_SIGNALING))
857 		return -EINVAL;
858 
859 	if (f->superres_denom > GENMASK(2, 0) + 9)
860 		return -EINVAL;
861 
862 	return 0;
863 }
864 
865 /**
866  * validate_av1_sequence - validate AV1 sequence header fields
867  * @s: control struct from userspace
868  *
869  * Implements AV1 spec §5.5.2 color_config() checks that are
870  * possible with the current v4l2_ctrl_av1_sequence definition.
871  *
872  * TODO: extend validation once additional fields such as
873  *       color_primaries, transfer_characteristics,
874  *       matrix_coefficients, and chroma_sample_position
875  *       are added to the uAPI.
876  *
877  * Returns 0 if valid, -EINVAL otherwise.
878  */
validate_av1_sequence(struct v4l2_ctrl_av1_sequence * s)879 static int validate_av1_sequence(struct v4l2_ctrl_av1_sequence *s)
880 {
881 	const bool mono  = s->flags & V4L2_AV1_SEQUENCE_FLAG_MONO_CHROME;
882 	const bool sx    = s->flags & V4L2_AV1_SEQUENCE_FLAG_SUBSAMPLING_X;
883 	const bool sy    = s->flags & V4L2_AV1_SEQUENCE_FLAG_SUBSAMPLING_Y;
884 	const bool uv_dq = s->flags & V4L2_AV1_SEQUENCE_FLAG_SEPARATE_UV_DELTA_Q;
885 
886 	/* 1. Reject unknown flags */
887 	if (s->flags &
888 	    ~(V4L2_AV1_SEQUENCE_FLAG_STILL_PICTURE |
889 	      V4L2_AV1_SEQUENCE_FLAG_USE_128X128_SUPERBLOCK |
890 	      V4L2_AV1_SEQUENCE_FLAG_ENABLE_FILTER_INTRA |
891 	      V4L2_AV1_SEQUENCE_FLAG_ENABLE_INTRA_EDGE_FILTER |
892 	      V4L2_AV1_SEQUENCE_FLAG_ENABLE_INTERINTRA_COMPOUND |
893 	      V4L2_AV1_SEQUENCE_FLAG_ENABLE_MASKED_COMPOUND |
894 	      V4L2_AV1_SEQUENCE_FLAG_ENABLE_WARPED_MOTION |
895 	      V4L2_AV1_SEQUENCE_FLAG_ENABLE_DUAL_FILTER |
896 	      V4L2_AV1_SEQUENCE_FLAG_ENABLE_ORDER_HINT |
897 	      V4L2_AV1_SEQUENCE_FLAG_ENABLE_JNT_COMP |
898 	      V4L2_AV1_SEQUENCE_FLAG_ENABLE_REF_FRAME_MVS |
899 	      V4L2_AV1_SEQUENCE_FLAG_ENABLE_SUPERRES |
900 	      V4L2_AV1_SEQUENCE_FLAG_ENABLE_CDEF |
901 	      V4L2_AV1_SEQUENCE_FLAG_ENABLE_RESTORATION |
902 	      V4L2_AV1_SEQUENCE_FLAG_MONO_CHROME |
903 	      V4L2_AV1_SEQUENCE_FLAG_COLOR_RANGE |
904 	      V4L2_AV1_SEQUENCE_FLAG_SUBSAMPLING_X |
905 	      V4L2_AV1_SEQUENCE_FLAG_SUBSAMPLING_Y |
906 	      V4L2_AV1_SEQUENCE_FLAG_FILM_GRAIN_PARAMS_PRESENT |
907 	      V4L2_AV1_SEQUENCE_FLAG_SEPARATE_UV_DELTA_Q))
908 		return -EINVAL;
909 
910 	/* 2. Profile range */
911 	if (s->seq_profile > 2)
912 		return -EINVAL;
913 
914 	/* 3. Monochrome shortcut */
915 	if (mono) {
916 		/* Profile 1 forbids monochrome */
917 		if (s->seq_profile == 1)
918 			return -EINVAL;
919 
920 		/* Mono → subsampling must look like 4:0:0: sx=1, sy=1 */
921 		if (!sx || !sy)
922 			return -EINVAL;
923 
924 		/* separate_uv_delta_q must be 0 */
925 		if (uv_dq)
926 			return -EINVAL;
927 
928 		return 0;
929 	}
930 
931 	/* 4. Profile-specific rules */
932 	switch (s->seq_profile) {
933 	case 0:
934 		/* Profile 0: only 8/10-bit, subsampling=4:2:0 (sx=1, sy=1) */
935 		if (s->bit_depth != 8 && s->bit_depth != 10)
936 			return -EINVAL;
937 		if (!(sx && sy))
938 			return -EINVAL;
939 		break;
940 
941 	case 1:
942 		/* Profile 1: only 8/10-bit, subsampling=4:4:4 (sx=0, sy=0) */
943 		if (s->bit_depth != 8 && s->bit_depth != 10)
944 			return -EINVAL;
945 		if (sx || sy)
946 			return -EINVAL;
947 		break;
948 
949 	case 2:
950 		/* Profile 2: 8/10/12-bit allowed */
951 		if (s->bit_depth != 8 && s->bit_depth != 10 &&
952 		    s->bit_depth != 12)
953 			return -EINVAL;
954 
955 		if (s->bit_depth == 12) {
956 			if (!sx) {
957 				/* 4:4:4 → sy must be 0 */
958 				if (sy)
959 					return -EINVAL;
960 			} else {
961 				/* sx=1 → sy=0 (4:2:2) or sy=1 (4:2:0) */
962 				if (sy != 0 && sy != 1)
963 					return -EINVAL;
964 			}
965 		} else {
966 			/* 8/10-bit → only 4:2:2 allowed (sx=1, sy=0) */
967 			if (!(sx && !sy))
968 				return -EINVAL;
969 		}
970 		break;
971 	}
972 
973 	return 0;
974 }
975 
976 /*
977  * Compound controls validation requires setting unused fields/flags to zero
978  * in order to properly detect unchanged controls with v4l2_ctrl_type_op_equal's
979  * memcmp.
980  */
std_validate_compound(const struct v4l2_ctrl * ctrl,u32 idx,union v4l2_ctrl_ptr ptr)981 static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
982 				 union v4l2_ctrl_ptr ptr)
983 {
984 	struct v4l2_ctrl_mpeg2_sequence *p_mpeg2_sequence;
985 	struct v4l2_ctrl_mpeg2_picture *p_mpeg2_picture;
986 	struct v4l2_ctrl_vp8_frame *p_vp8_frame;
987 	struct v4l2_ctrl_fwht_params *p_fwht_params;
988 	struct v4l2_ctrl_h264_sps *p_h264_sps;
989 	struct v4l2_ctrl_h264_pps *p_h264_pps;
990 	struct v4l2_ctrl_h264_pred_weights *p_h264_pred_weights;
991 	struct v4l2_ctrl_h264_slice_params *p_h264_slice_params;
992 	struct v4l2_ctrl_h264_decode_params *p_h264_dec_params;
993 	struct v4l2_ctrl_hevc_ext_sps_lt_rps *p_hevc_lt_rps;
994 	struct v4l2_ctrl_hevc_ext_sps_st_rps *p_hevc_st_rps;
995 	struct v4l2_ctrl_hevc_sps *p_hevc_sps;
996 	struct v4l2_ctrl_hevc_pps *p_hevc_pps;
997 	struct v4l2_ctrl_hevc_slice_params *p_hevc_slice_params;
998 	struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering;
999 	struct v4l2_ctrl_hevc_decode_params *p_hevc_decode_params;
1000 	struct v4l2_area *area;
1001 	struct v4l2_rect *rect;
1002 	void *p = ptr.p + idx * ctrl->elem_size;
1003 	unsigned int i;
1004 
1005 	switch ((u32)ctrl->type) {
1006 	case V4L2_CTRL_TYPE_MPEG2_SEQUENCE:
1007 		p_mpeg2_sequence = p;
1008 
1009 		switch (p_mpeg2_sequence->chroma_format) {
1010 		case 1: /* 4:2:0 */
1011 		case 2: /* 4:2:2 */
1012 		case 3: /* 4:4:4 */
1013 			break;
1014 		default:
1015 			return -EINVAL;
1016 		}
1017 		break;
1018 
1019 	case V4L2_CTRL_TYPE_MPEG2_PICTURE:
1020 		p_mpeg2_picture = p;
1021 
1022 		switch (p_mpeg2_picture->intra_dc_precision) {
1023 		case 0: /* 8 bits */
1024 		case 1: /* 9 bits */
1025 		case 2: /* 10 bits */
1026 		case 3: /* 11 bits */
1027 			break;
1028 		default:
1029 			return -EINVAL;
1030 		}
1031 
1032 		switch (p_mpeg2_picture->picture_structure) {
1033 		case V4L2_MPEG2_PIC_TOP_FIELD:
1034 		case V4L2_MPEG2_PIC_BOTTOM_FIELD:
1035 		case V4L2_MPEG2_PIC_FRAME:
1036 			break;
1037 		default:
1038 			return -EINVAL;
1039 		}
1040 
1041 		switch (p_mpeg2_picture->picture_coding_type) {
1042 		case V4L2_MPEG2_PIC_CODING_TYPE_I:
1043 		case V4L2_MPEG2_PIC_CODING_TYPE_P:
1044 		case V4L2_MPEG2_PIC_CODING_TYPE_B:
1045 			break;
1046 		default:
1047 			return -EINVAL;
1048 		}
1049 		zero_reserved(*p_mpeg2_picture);
1050 		break;
1051 
1052 	case V4L2_CTRL_TYPE_MPEG2_QUANTISATION:
1053 		break;
1054 
1055 	case V4L2_CTRL_TYPE_FWHT_PARAMS:
1056 		p_fwht_params = p;
1057 		if (p_fwht_params->version < V4L2_FWHT_VERSION)
1058 			return -EINVAL;
1059 		if (!p_fwht_params->width || !p_fwht_params->height)
1060 			return -EINVAL;
1061 		break;
1062 
1063 	case V4L2_CTRL_TYPE_H264_SPS:
1064 		p_h264_sps = p;
1065 
1066 		/* Some syntax elements are only conditionally valid */
1067 		if (p_h264_sps->pic_order_cnt_type != 0) {
1068 			p_h264_sps->log2_max_pic_order_cnt_lsb_minus4 = 0;
1069 		} else if (p_h264_sps->pic_order_cnt_type != 1) {
1070 			p_h264_sps->num_ref_frames_in_pic_order_cnt_cycle = 0;
1071 			p_h264_sps->offset_for_non_ref_pic = 0;
1072 			p_h264_sps->offset_for_top_to_bottom_field = 0;
1073 			memset(&p_h264_sps->offset_for_ref_frame, 0,
1074 			       sizeof(p_h264_sps->offset_for_ref_frame));
1075 		}
1076 
1077 		if (!V4L2_H264_SPS_HAS_CHROMA_FORMAT(p_h264_sps)) {
1078 			p_h264_sps->chroma_format_idc = 1;
1079 			p_h264_sps->bit_depth_luma_minus8 = 0;
1080 			p_h264_sps->bit_depth_chroma_minus8 = 0;
1081 
1082 			p_h264_sps->flags &=
1083 				~V4L2_H264_SPS_FLAG_QPPRIME_Y_ZERO_TRANSFORM_BYPASS;
1084 		}
1085 
1086 		if (p_h264_sps->chroma_format_idc < 3)
1087 			p_h264_sps->flags &=
1088 				~V4L2_H264_SPS_FLAG_SEPARATE_COLOUR_PLANE;
1089 
1090 		if (p_h264_sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY)
1091 			p_h264_sps->flags &=
1092 				~V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD;
1093 
1094 		/*
1095 		 * Chroma 4:2:2 format require at least High 4:2:2 profile.
1096 		 *
1097 		 * The H264 specification and well-known parser implementations
1098 		 * use profile-idc values directly, as that is clearer and
1099 		 * less ambiguous. We do the same here.
1100 		 */
1101 		if (p_h264_sps->profile_idc < 122 &&
1102 		    p_h264_sps->chroma_format_idc > 1)
1103 			return -EINVAL;
1104 		/* Chroma 4:4:4 format require at least High 4:2:2 profile */
1105 		if (p_h264_sps->profile_idc < 244 &&
1106 		    p_h264_sps->chroma_format_idc > 2)
1107 			return -EINVAL;
1108 		if (p_h264_sps->chroma_format_idc > 3)
1109 			return -EINVAL;
1110 
1111 		if (p_h264_sps->bit_depth_luma_minus8 > 6)
1112 			return -EINVAL;
1113 		if (p_h264_sps->bit_depth_chroma_minus8 > 6)
1114 			return -EINVAL;
1115 		if (p_h264_sps->log2_max_frame_num_minus4 > 12)
1116 			return -EINVAL;
1117 		if (p_h264_sps->pic_order_cnt_type > 2)
1118 			return -EINVAL;
1119 		if (p_h264_sps->log2_max_pic_order_cnt_lsb_minus4 > 12)
1120 			return -EINVAL;
1121 		if (p_h264_sps->max_num_ref_frames > V4L2_H264_REF_LIST_LEN)
1122 			return -EINVAL;
1123 		break;
1124 
1125 	case V4L2_CTRL_TYPE_H264_PPS:
1126 		p_h264_pps = p;
1127 
1128 		if (p_h264_pps->num_slice_groups_minus1 > 7)
1129 			return -EINVAL;
1130 		if (p_h264_pps->num_ref_idx_l0_default_active_minus1 >
1131 		    (V4L2_H264_REF_LIST_LEN - 1))
1132 			return -EINVAL;
1133 		if (p_h264_pps->num_ref_idx_l1_default_active_minus1 >
1134 		    (V4L2_H264_REF_LIST_LEN - 1))
1135 			return -EINVAL;
1136 		if (p_h264_pps->weighted_bipred_idc > 2)
1137 			return -EINVAL;
1138 		/*
1139 		 * pic_init_qp_minus26 shall be in the range of
1140 		 * -(26 + QpBdOffset_y) to +25, inclusive,
1141 		 *  where QpBdOffset_y is 6 * bit_depth_luma_minus8
1142 		 */
1143 		if (p_h264_pps->pic_init_qp_minus26 < -62 ||
1144 		    p_h264_pps->pic_init_qp_minus26 > 25)
1145 			return -EINVAL;
1146 		if (p_h264_pps->pic_init_qs_minus26 < -26 ||
1147 		    p_h264_pps->pic_init_qs_minus26 > 25)
1148 			return -EINVAL;
1149 		if (p_h264_pps->chroma_qp_index_offset < -12 ||
1150 		    p_h264_pps->chroma_qp_index_offset > 12)
1151 			return -EINVAL;
1152 		if (p_h264_pps->second_chroma_qp_index_offset < -12 ||
1153 		    p_h264_pps->second_chroma_qp_index_offset > 12)
1154 			return -EINVAL;
1155 		break;
1156 
1157 	case V4L2_CTRL_TYPE_H264_SCALING_MATRIX:
1158 		break;
1159 
1160 	case V4L2_CTRL_TYPE_H264_PRED_WEIGHTS:
1161 		p_h264_pred_weights = p;
1162 
1163 		if (p_h264_pred_weights->luma_log2_weight_denom > 7)
1164 			return -EINVAL;
1165 		if (p_h264_pred_weights->chroma_log2_weight_denom > 7)
1166 			return -EINVAL;
1167 		break;
1168 
1169 	case V4L2_CTRL_TYPE_H264_SLICE_PARAMS:
1170 		p_h264_slice_params = p;
1171 
1172 		if (p_h264_slice_params->slice_type != V4L2_H264_SLICE_TYPE_B)
1173 			p_h264_slice_params->flags &=
1174 				~V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED;
1175 
1176 		if (p_h264_slice_params->colour_plane_id > 2)
1177 			return -EINVAL;
1178 		if (p_h264_slice_params->cabac_init_idc > 2)
1179 			return -EINVAL;
1180 		if (p_h264_slice_params->disable_deblocking_filter_idc > 2)
1181 			return -EINVAL;
1182 		if (p_h264_slice_params->slice_alpha_c0_offset_div2 < -6 ||
1183 		    p_h264_slice_params->slice_alpha_c0_offset_div2 > 6)
1184 			return -EINVAL;
1185 		if (p_h264_slice_params->slice_beta_offset_div2 < -6 ||
1186 		    p_h264_slice_params->slice_beta_offset_div2 > 6)
1187 			return -EINVAL;
1188 
1189 		if (p_h264_slice_params->slice_type == V4L2_H264_SLICE_TYPE_I ||
1190 		    p_h264_slice_params->slice_type == V4L2_H264_SLICE_TYPE_SI)
1191 			p_h264_slice_params->num_ref_idx_l0_active_minus1 = 0;
1192 		if (p_h264_slice_params->slice_type != V4L2_H264_SLICE_TYPE_B)
1193 			p_h264_slice_params->num_ref_idx_l1_active_minus1 = 0;
1194 
1195 		if (p_h264_slice_params->num_ref_idx_l0_active_minus1 >
1196 		    (V4L2_H264_REF_LIST_LEN - 1))
1197 			return -EINVAL;
1198 		if (p_h264_slice_params->num_ref_idx_l1_active_minus1 >
1199 		    (V4L2_H264_REF_LIST_LEN - 1))
1200 			return -EINVAL;
1201 		zero_reserved(*p_h264_slice_params);
1202 		break;
1203 
1204 	case V4L2_CTRL_TYPE_H264_DECODE_PARAMS:
1205 		p_h264_dec_params = p;
1206 
1207 		if (p_h264_dec_params->nal_ref_idc > 3)
1208 			return -EINVAL;
1209 		for (i = 0; i < V4L2_H264_NUM_DPB_ENTRIES; i++) {
1210 			struct v4l2_h264_dpb_entry *dpb_entry =
1211 				&p_h264_dec_params->dpb[i];
1212 
1213 			zero_reserved(*dpb_entry);
1214 		}
1215 		zero_reserved(*p_h264_dec_params);
1216 		break;
1217 
1218 	case V4L2_CTRL_TYPE_VP8_FRAME:
1219 		p_vp8_frame = p;
1220 
1221 		switch (p_vp8_frame->num_dct_parts) {
1222 		case 1:
1223 		case 2:
1224 		case 4:
1225 		case 8:
1226 			break;
1227 		default:
1228 			return -EINVAL;
1229 		}
1230 		zero_padding(p_vp8_frame->segment);
1231 		zero_padding(p_vp8_frame->lf);
1232 		zero_padding(p_vp8_frame->quant);
1233 		zero_padding(p_vp8_frame->entropy);
1234 		zero_padding(p_vp8_frame->coder_state);
1235 		break;
1236 
1237 	case V4L2_CTRL_TYPE_HEVC_SPS:
1238 		p_hevc_sps = p;
1239 
1240 		if (p_hevc_sps->num_short_term_ref_pic_sets >
1241 		    V4L2_HEVC_MAX_SHORT_TERM_REF_PIC_SETS)
1242 			return -EINVAL;
1243 
1244 		if (!(p_hevc_sps->flags & V4L2_HEVC_SPS_FLAG_PCM_ENABLED)) {
1245 			p_hevc_sps->pcm_sample_bit_depth_luma_minus1 = 0;
1246 			p_hevc_sps->pcm_sample_bit_depth_chroma_minus1 = 0;
1247 			p_hevc_sps->log2_min_pcm_luma_coding_block_size_minus3 = 0;
1248 			p_hevc_sps->log2_diff_max_min_pcm_luma_coding_block_size = 0;
1249 		}
1250 
1251 		if (!(p_hevc_sps->flags &
1252 		      V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT))
1253 			p_hevc_sps->num_long_term_ref_pics_sps = 0;
1254 		else if (p_hevc_sps->num_long_term_ref_pics_sps >
1255 			 V4L2_HEVC_MAX_LONG_TERM_REF_PICS_SPS)
1256 			return -EINVAL;
1257 		break;
1258 
1259 	case V4L2_CTRL_TYPE_HEVC_PPS:
1260 		p_hevc_pps = p;
1261 
1262 		if (!(p_hevc_pps->flags &
1263 		      V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED))
1264 			p_hevc_pps->diff_cu_qp_delta_depth = 0;
1265 
1266 		if (!(p_hevc_pps->flags & V4L2_HEVC_PPS_FLAG_TILES_ENABLED)) {
1267 			p_hevc_pps->num_tile_columns_minus1 = 0;
1268 			p_hevc_pps->num_tile_rows_minus1 = 0;
1269 			memset(&p_hevc_pps->column_width_minus1, 0,
1270 			       sizeof(p_hevc_pps->column_width_minus1));
1271 			memset(&p_hevc_pps->row_height_minus1, 0,
1272 			       sizeof(p_hevc_pps->row_height_minus1));
1273 
1274 			p_hevc_pps->flags &=
1275 				~V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED;
1276 		} else {
1277 			/*
1278 			 * These count the entries the stateless HEVC drivers
1279 			 * read from column_width_minus1[] / row_height_minus1[]
1280 			 * and use as tile-loop bounds.
1281 			 */
1282 			if (p_hevc_pps->num_tile_columns_minus1 >=
1283 			    ARRAY_SIZE(p_hevc_pps->column_width_minus1))
1284 				return -EINVAL;
1285 			if (p_hevc_pps->num_tile_rows_minus1 >=
1286 			    ARRAY_SIZE(p_hevc_pps->row_height_minus1))
1287 				return -EINVAL;
1288 		}
1289 
1290 		if (p_hevc_pps->flags &
1291 		    V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER) {
1292 			p_hevc_pps->pps_beta_offset_div2 = 0;
1293 			p_hevc_pps->pps_tc_offset_div2 = 0;
1294 		}
1295 		break;
1296 
1297 	case V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS:
1298 		p_hevc_decode_params = p;
1299 
1300 		if (p_hevc_decode_params->num_active_dpb_entries >
1301 		    V4L2_HEVC_DPB_ENTRIES_NUM_MAX)
1302 			return -EINVAL;
1303 		break;
1304 
1305 	case V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS:
1306 		p_hevc_slice_params = p;
1307 
1308 		if (p_hevc_slice_params->num_ref_idx_l0_active_minus1 >=
1309 		    V4L2_HEVC_DPB_ENTRIES_NUM_MAX)
1310 			return -EINVAL;
1311 
1312 		if (p_hevc_slice_params->slice_type != V4L2_HEVC_SLICE_TYPE_B)
1313 			break;
1314 
1315 		if (p_hevc_slice_params->num_ref_idx_l1_active_minus1 >=
1316 		    V4L2_HEVC_DPB_ENTRIES_NUM_MAX)
1317 			return -EINVAL;
1318 		break;
1319 
1320 	case V4L2_CTRL_TYPE_HEVC_EXT_SPS_ST_RPS:
1321 		p_hevc_st_rps = p;
1322 
1323 		if (p_hevc_st_rps->flags & ~V4L2_HEVC_EXT_SPS_ST_RPS_FLAG_INTER_REF_PIC_SET_PRED)
1324 			return -EINVAL;
1325 		if (p_hevc_st_rps->num_negative_pics > 16 ||
1326 		    p_hevc_st_rps->num_positive_pics > 16 ||
1327 		    p_hevc_st_rps->num_negative_pics +
1328 		    p_hevc_st_rps->num_positive_pics > 16)
1329 			return -EINVAL;
1330 		break;
1331 
1332 	case V4L2_CTRL_TYPE_HEVC_EXT_SPS_LT_RPS:
1333 		p_hevc_lt_rps = p;
1334 
1335 		if (p_hevc_lt_rps->flags & ~V4L2_HEVC_EXT_SPS_LT_RPS_FLAG_USED_LT)
1336 			return -EINVAL;
1337 		break;
1338 
1339 	case V4L2_CTRL_TYPE_HDR10_CLL_INFO:
1340 		break;
1341 
1342 	case V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY:
1343 		p_hdr10_mastering = p;
1344 
1345 		for (i = 0; i < 3; ++i) {
1346 			if (p_hdr10_mastering->display_primaries_x[i] <
1347 				V4L2_HDR10_MASTERING_PRIMARIES_X_LOW ||
1348 			    p_hdr10_mastering->display_primaries_x[i] >
1349 				V4L2_HDR10_MASTERING_PRIMARIES_X_HIGH ||
1350 			    p_hdr10_mastering->display_primaries_y[i] <
1351 				V4L2_HDR10_MASTERING_PRIMARIES_Y_LOW ||
1352 			    p_hdr10_mastering->display_primaries_y[i] >
1353 				V4L2_HDR10_MASTERING_PRIMARIES_Y_HIGH)
1354 				return -EINVAL;
1355 		}
1356 
1357 		/*
1358 		 * SMPTE ST 2086 Annex A documents that CTA 861-G uses
1359 		 * (0, 0) to indicate that the white point chromaticity
1360 		 * is unknown.
1361 		 */
1362 		if (p_hdr10_mastering->white_point_x ||
1363 		    p_hdr10_mastering->white_point_y) {
1364 			if (p_hdr10_mastering->white_point_x <
1365 				V4L2_HDR10_MASTERING_WHITE_POINT_X_LOW ||
1366 			    p_hdr10_mastering->white_point_x >
1367 				V4L2_HDR10_MASTERING_WHITE_POINT_X_HIGH ||
1368 			    p_hdr10_mastering->white_point_y <
1369 				V4L2_HDR10_MASTERING_WHITE_POINT_Y_LOW ||
1370 			    p_hdr10_mastering->white_point_y >
1371 				V4L2_HDR10_MASTERING_WHITE_POINT_Y_HIGH)
1372 				return -EINVAL;
1373 		}
1374 
1375 		/*
1376 		 * SMPTE ST 2086 Annex A documents that CTA 861-G uses zero
1377 		 * maximum and minimum luminance values to indicate that
1378 		 * the corresponding values are unknown.
1379 		 */
1380 		if (p_hdr10_mastering->max_display_mastering_luminance &&
1381 		    (p_hdr10_mastering->max_display_mastering_luminance <
1382 				V4L2_HDR10_MASTERING_MAX_LUMA_LOW ||
1383 		     p_hdr10_mastering->max_display_mastering_luminance >
1384 				V4L2_HDR10_MASTERING_MAX_LUMA_HIGH))
1385 			return -EINVAL;
1386 
1387 		if (p_hdr10_mastering->min_display_mastering_luminance &&
1388 		    (p_hdr10_mastering->min_display_mastering_luminance <
1389 				V4L2_HDR10_MASTERING_MIN_LUMA_LOW ||
1390 		     p_hdr10_mastering->min_display_mastering_luminance >
1391 				V4L2_HDR10_MASTERING_MIN_LUMA_HIGH))
1392 			return -EINVAL;
1393 
1394 		/* The following restriction comes from ITU-T Rec. H.265 spec */
1395 		if (p_hdr10_mastering->max_display_mastering_luminance ==
1396 			V4L2_HDR10_MASTERING_MAX_LUMA_LOW &&
1397 		    p_hdr10_mastering->min_display_mastering_luminance ==
1398 			V4L2_HDR10_MASTERING_MIN_LUMA_HIGH)
1399 			return -EINVAL;
1400 
1401 		break;
1402 
1403 	case V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX:
1404 		break;
1405 
1406 	case V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR:
1407 		return validate_vp9_compressed_hdr(p);
1408 
1409 	case V4L2_CTRL_TYPE_VP9_FRAME:
1410 		return validate_vp9_frame(p);
1411 	case V4L2_CTRL_TYPE_AV1_FRAME:
1412 		return validate_av1_frame(p);
1413 	case V4L2_CTRL_TYPE_AV1_SEQUENCE:
1414 		return validate_av1_sequence(p);
1415 	case V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY:
1416 		break;
1417 	case V4L2_CTRL_TYPE_AV1_FILM_GRAIN:
1418 		return validate_av1_film_grain(p);
1419 
1420 	case V4L2_CTRL_TYPE_AREA:
1421 		area = p;
1422 		if (!area->width || !area->height)
1423 			return -EINVAL;
1424 		break;
1425 
1426 	case V4L2_CTRL_TYPE_RECT:
1427 		rect = p;
1428 		if (!rect->width || !rect->height)
1429 			return -EINVAL;
1430 		break;
1431 
1432 	default:
1433 		return -EINVAL;
1434 	}
1435 
1436 	return 0;
1437 }
1438 
std_validate_elem(const struct v4l2_ctrl * ctrl,u32 idx,union v4l2_ctrl_ptr ptr)1439 static int std_validate_elem(const struct v4l2_ctrl *ctrl, u32 idx,
1440 			     union v4l2_ctrl_ptr ptr)
1441 {
1442 	size_t len;
1443 	u64 offset;
1444 	s64 val;
1445 
1446 	switch ((u32)ctrl->type) {
1447 	case V4L2_CTRL_TYPE_INTEGER:
1448 		return ROUND_TO_RANGE(ptr.p_s32[idx], u32, ctrl);
1449 	case V4L2_CTRL_TYPE_INTEGER64:
1450 		/*
1451 		 * We can't use the ROUND_TO_RANGE define here due to
1452 		 * the u64 divide that needs special care.
1453 		 */
1454 		val = ptr.p_s64[idx];
1455 		if (ctrl->maximum >= 0 && val >= ctrl->maximum - (s64)(ctrl->step / 2))
1456 			val = ctrl->maximum;
1457 		else
1458 			val += (s64)(ctrl->step / 2);
1459 		val = clamp_t(s64, val, ctrl->minimum, ctrl->maximum);
1460 		offset = val - ctrl->minimum;
1461 		do_div(offset, ctrl->step);
1462 		ptr.p_s64[idx] = ctrl->minimum + offset * ctrl->step;
1463 		return 0;
1464 	case V4L2_CTRL_TYPE_U8:
1465 		return ROUND_TO_RANGE(ptr.p_u8[idx], u8, ctrl);
1466 	case V4L2_CTRL_TYPE_U16:
1467 		return ROUND_TO_RANGE(ptr.p_u16[idx], u16, ctrl);
1468 	case V4L2_CTRL_TYPE_U32:
1469 		return ROUND_TO_RANGE(ptr.p_u32[idx], u32, ctrl);
1470 
1471 	case V4L2_CTRL_TYPE_BOOLEAN:
1472 		ptr.p_s32[idx] = !!ptr.p_s32[idx];
1473 		return 0;
1474 
1475 	case V4L2_CTRL_TYPE_MENU:
1476 	case V4L2_CTRL_TYPE_INTEGER_MENU:
1477 		if (ptr.p_s32[idx] < ctrl->minimum || ptr.p_s32[idx] > ctrl->maximum)
1478 			return -ERANGE;
1479 		if (ptr.p_s32[idx] < BITS_PER_LONG_LONG &&
1480 		    (ctrl->menu_skip_mask & BIT_ULL(ptr.p_s32[idx])))
1481 			return -EINVAL;
1482 		if (ctrl->type == V4L2_CTRL_TYPE_MENU &&
1483 		    ctrl->qmenu[ptr.p_s32[idx]][0] == '\0')
1484 			return -EINVAL;
1485 		return 0;
1486 
1487 	case V4L2_CTRL_TYPE_BITMASK:
1488 		ptr.p_s32[idx] &= ctrl->maximum;
1489 		return 0;
1490 
1491 	case V4L2_CTRL_TYPE_BUTTON:
1492 	case V4L2_CTRL_TYPE_CTRL_CLASS:
1493 		ptr.p_s32[idx] = 0;
1494 		return 0;
1495 
1496 	case V4L2_CTRL_TYPE_STRING:
1497 		idx *= ctrl->elem_size;
1498 		len = strlen(ptr.p_char + idx);
1499 		if (len < ctrl->minimum)
1500 			return -ERANGE;
1501 		if ((len - (u32)ctrl->minimum) % (u32)ctrl->step)
1502 			return -ERANGE;
1503 		return 0;
1504 
1505 	default:
1506 		return std_validate_compound(ctrl, idx, ptr);
1507 	}
1508 }
1509 
v4l2_ctrl_type_op_validate(const struct v4l2_ctrl * ctrl,union v4l2_ctrl_ptr ptr)1510 int v4l2_ctrl_type_op_validate(const struct v4l2_ctrl *ctrl,
1511 			       union v4l2_ctrl_ptr ptr)
1512 {
1513 	unsigned int i;
1514 	int ret = 0;
1515 
1516 	switch ((u32)ctrl->type) {
1517 	case V4L2_CTRL_TYPE_U8:
1518 		if (ctrl->maximum == 0xff && ctrl->minimum == 0 && ctrl->step == 1)
1519 			return 0;
1520 		break;
1521 	case V4L2_CTRL_TYPE_U16:
1522 		if (ctrl->maximum == 0xffff && ctrl->minimum == 0 && ctrl->step == 1)
1523 			return 0;
1524 		break;
1525 	case V4L2_CTRL_TYPE_U32:
1526 		if (ctrl->maximum == 0xffffffff && ctrl->minimum == 0 && ctrl->step == 1)
1527 			return 0;
1528 		break;
1529 
1530 	case V4L2_CTRL_TYPE_BUTTON:
1531 	case V4L2_CTRL_TYPE_CTRL_CLASS:
1532 		memset(ptr.p_s32, 0, ctrl->new_elems * sizeof(s32));
1533 		return 0;
1534 	}
1535 
1536 	for (i = 0; !ret && i < ctrl->new_elems; i++)
1537 		ret = std_validate_elem(ctrl, i, ptr);
1538 	return ret;
1539 }
1540 EXPORT_SYMBOL(v4l2_ctrl_type_op_validate);
1541 
1542 static const struct v4l2_ctrl_type_ops std_type_ops = {
1543 	.equal = v4l2_ctrl_type_op_equal,
1544 	.init = v4l2_ctrl_type_op_init,
1545 	.minimum = v4l2_ctrl_type_op_minimum,
1546 	.maximum = v4l2_ctrl_type_op_maximum,
1547 	.log = v4l2_ctrl_type_op_log,
1548 	.validate = v4l2_ctrl_type_op_validate,
1549 };
1550 
v4l2_ctrl_notify(struct v4l2_ctrl * ctrl,v4l2_ctrl_notify_fnc notify,void * priv)1551 void v4l2_ctrl_notify(struct v4l2_ctrl *ctrl, v4l2_ctrl_notify_fnc notify, void *priv)
1552 {
1553 	if (!ctrl)
1554 		return;
1555 	if (!notify) {
1556 		ctrl->call_notify = 0;
1557 		return;
1558 	}
1559 	if (WARN_ON(ctrl->handler->notify && ctrl->handler->notify != notify))
1560 		return;
1561 	ctrl->handler->notify = notify;
1562 	ctrl->handler->notify_priv = priv;
1563 	ctrl->call_notify = 1;
1564 }
1565 EXPORT_SYMBOL(v4l2_ctrl_notify);
1566 
1567 /* Copy the one value to another. */
ptr_to_ptr(struct v4l2_ctrl * ctrl,union v4l2_ctrl_ptr from,union v4l2_ctrl_ptr to,unsigned int elems)1568 static void ptr_to_ptr(struct v4l2_ctrl *ctrl,
1569 		       union v4l2_ctrl_ptr from, union v4l2_ctrl_ptr to,
1570 		       unsigned int elems)
1571 {
1572 	if (ctrl == NULL)
1573 		return;
1574 	memcpy(to.p, from.p_const, elems * ctrl->elem_size);
1575 }
1576 
1577 /* Copy the new value to the current value. */
new_to_cur(struct v4l2_fh * fh,struct v4l2_ctrl * ctrl,u32 ch_flags)1578 void new_to_cur(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 ch_flags)
1579 {
1580 	bool changed;
1581 
1582 	if (ctrl == NULL)
1583 		return;
1584 
1585 	/* has_changed is set by cluster_changed */
1586 	changed = ctrl->has_changed;
1587 	if (changed) {
1588 		if (ctrl->is_dyn_array)
1589 			ctrl->elems = ctrl->new_elems;
1590 		ptr_to_ptr(ctrl, ctrl->p_new, ctrl->p_cur, ctrl->elems);
1591 	}
1592 
1593 	if (ch_flags & V4L2_EVENT_CTRL_CH_FLAGS) {
1594 		/* Note: CH_FLAGS is only set for auto clusters. */
1595 		ctrl->flags &=
1596 			~(V4L2_CTRL_FLAG_INACTIVE | V4L2_CTRL_FLAG_VOLATILE);
1597 		if (!is_cur_manual(ctrl->cluster[0])) {
1598 			ctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
1599 			if (ctrl->cluster[0]->has_volatiles)
1600 				ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
1601 		}
1602 		fh = NULL;
1603 	}
1604 	if (changed || ch_flags) {
1605 		/* If a control was changed that was not one of the controls
1606 		   modified by the application, then send the event to all. */
1607 		if (!ctrl->is_new)
1608 			fh = NULL;
1609 		send_event(fh, ctrl,
1610 			(changed ? V4L2_EVENT_CTRL_CH_VALUE : 0) | ch_flags);
1611 		if (ctrl->call_notify && changed && ctrl->handler->notify)
1612 			ctrl->handler->notify(ctrl, ctrl->handler->notify_priv);
1613 	}
1614 }
1615 
1616 /* Copy the current value to the new value */
cur_to_new(struct v4l2_ctrl * ctrl)1617 void cur_to_new(struct v4l2_ctrl *ctrl)
1618 {
1619 	if (ctrl == NULL)
1620 		return;
1621 	if (ctrl->is_dyn_array)
1622 		ctrl->new_elems = ctrl->elems;
1623 	ptr_to_ptr(ctrl, ctrl->p_cur, ctrl->p_new, ctrl->new_elems);
1624 }
1625 
req_alloc_array(struct v4l2_ctrl_ref * ref,u32 elems)1626 static bool req_alloc_array(struct v4l2_ctrl_ref *ref, u32 elems)
1627 {
1628 	void *tmp;
1629 
1630 	if (elems == ref->p_req_array_alloc_elems)
1631 		return true;
1632 	if (ref->ctrl->is_dyn_array &&
1633 	    elems < ref->p_req_array_alloc_elems)
1634 		return true;
1635 
1636 	tmp = kvmalloc(elems * ref->ctrl->elem_size, GFP_KERNEL);
1637 
1638 	if (!tmp) {
1639 		ref->p_req_array_enomem = true;
1640 		return false;
1641 	}
1642 	ref->p_req_array_enomem = false;
1643 	kvfree(ref->p_req.p);
1644 	ref->p_req.p = tmp;
1645 	ref->p_req_array_alloc_elems = elems;
1646 	return true;
1647 }
1648 
1649 /* Copy the new value to the request value */
new_to_req(struct v4l2_ctrl_ref * ref)1650 void new_to_req(struct v4l2_ctrl_ref *ref)
1651 {
1652 	struct v4l2_ctrl *ctrl;
1653 
1654 	if (!ref)
1655 		return;
1656 
1657 	ctrl = ref->ctrl;
1658 	if (ctrl->is_array && !req_alloc_array(ref, ctrl->new_elems))
1659 		return;
1660 
1661 	ref->p_req_elems = ctrl->new_elems;
1662 	ptr_to_ptr(ctrl, ctrl->p_new, ref->p_req, ref->p_req_elems);
1663 	ref->p_req_valid = true;
1664 }
1665 
1666 /* Copy the current value to the request value */
cur_to_req(struct v4l2_ctrl_ref * ref)1667 void cur_to_req(struct v4l2_ctrl_ref *ref)
1668 {
1669 	struct v4l2_ctrl *ctrl;
1670 
1671 	if (!ref)
1672 		return;
1673 
1674 	ctrl = ref->ctrl;
1675 	if (ctrl->is_array && !req_alloc_array(ref, ctrl->elems))
1676 		return;
1677 
1678 	ref->p_req_elems = ctrl->elems;
1679 	ptr_to_ptr(ctrl, ctrl->p_cur, ref->p_req, ctrl->elems);
1680 	ref->p_req_valid = true;
1681 }
1682 
1683 /* Copy the request value to the new value */
req_to_new(struct v4l2_ctrl_ref * ref)1684 int req_to_new(struct v4l2_ctrl_ref *ref)
1685 {
1686 	struct v4l2_ctrl *ctrl;
1687 
1688 	if (!ref)
1689 		return 0;
1690 
1691 	ctrl = ref->ctrl;
1692 
1693 	/*
1694 	 * This control was never set in the request, so just use the current
1695 	 * value.
1696 	 */
1697 	if (!ref->p_req_valid) {
1698 		if (ctrl->is_dyn_array)
1699 			ctrl->new_elems = ctrl->elems;
1700 		ptr_to_ptr(ctrl, ctrl->p_cur, ctrl->p_new, ctrl->new_elems);
1701 		return 0;
1702 	}
1703 
1704 	/* Not an array, so just copy the request value */
1705 	if (!ctrl->is_array) {
1706 		ptr_to_ptr(ctrl, ref->p_req, ctrl->p_new, ctrl->new_elems);
1707 		return 0;
1708 	}
1709 
1710 	/* Sanity check, should never happen */
1711 	if (WARN_ON(!ref->p_req_array_alloc_elems))
1712 		return -ENOMEM;
1713 
1714 	if (!ctrl->is_dyn_array &&
1715 	    ref->p_req_elems != ctrl->p_array_alloc_elems)
1716 		return -ENOMEM;
1717 
1718 	/*
1719 	 * Check if the number of elements in the request is more than the
1720 	 * elements in ctrl->p_array. If so, attempt to realloc ctrl->p_array.
1721 	 * Note that p_array is allocated with twice the number of elements
1722 	 * in the dynamic array since it has to store both the current and
1723 	 * new value of such a control.
1724 	 */
1725 	if (ref->p_req_elems > ctrl->p_array_alloc_elems) {
1726 		unsigned int sz = ref->p_req_elems * ctrl->elem_size;
1727 		void *old = ctrl->p_array;
1728 		void *tmp = kvzalloc(2 * sz, GFP_KERNEL);
1729 
1730 		if (!tmp)
1731 			return -ENOMEM;
1732 		memcpy(tmp, ctrl->p_new.p, ctrl->elems * ctrl->elem_size);
1733 		memcpy(tmp + sz, ctrl->p_cur.p, ctrl->elems * ctrl->elem_size);
1734 		ctrl->p_new.p = tmp;
1735 		ctrl->p_cur.p = tmp + sz;
1736 		ctrl->p_array = tmp;
1737 		ctrl->p_array_alloc_elems = ref->p_req_elems;
1738 		kvfree(old);
1739 	}
1740 
1741 	ctrl->new_elems = ref->p_req_elems;
1742 	ptr_to_ptr(ctrl, ref->p_req, ctrl->p_new, ctrl->new_elems);
1743 	return 0;
1744 }
1745 
1746 /* Control range checking */
check_range(enum v4l2_ctrl_type type,s64 min,s64 max,u64 step,s64 def)1747 int check_range(enum v4l2_ctrl_type type,
1748 		s64 min, s64 max, u64 step, s64 def)
1749 {
1750 	switch (type) {
1751 	case V4L2_CTRL_TYPE_BOOLEAN:
1752 		if (step != 1 || max > 1 || min < 0)
1753 			return -ERANGE;
1754 		fallthrough;
1755 	case V4L2_CTRL_TYPE_U8:
1756 	case V4L2_CTRL_TYPE_U16:
1757 	case V4L2_CTRL_TYPE_U32:
1758 	case V4L2_CTRL_TYPE_INTEGER:
1759 	case V4L2_CTRL_TYPE_INTEGER64:
1760 		if (step == 0 || min > max || def < min || def > max)
1761 			return -ERANGE;
1762 		return 0;
1763 	case V4L2_CTRL_TYPE_BITMASK:
1764 		if (step || min || !max || (def & ~max))
1765 			return -ERANGE;
1766 		return 0;
1767 	case V4L2_CTRL_TYPE_MENU:
1768 	case V4L2_CTRL_TYPE_INTEGER_MENU:
1769 		if (min > max || def < min || def > max ||
1770 		    min < 0 || (step && max >= BITS_PER_LONG_LONG))
1771 			return -ERANGE;
1772 		/* Note: step == menu_skip_mask for menu controls.
1773 		   So here we check if the default value is masked out. */
1774 		if (def < BITS_PER_LONG_LONG && (step & BIT_ULL(def)))
1775 			return -EINVAL;
1776 		return 0;
1777 	case V4L2_CTRL_TYPE_STRING:
1778 		if (min > max || min < 0 || step < 1 || def)
1779 			return -ERANGE;
1780 		return 0;
1781 	default:
1782 		return 0;
1783 	}
1784 }
1785 
1786 /* Set the handler's error code if it wasn't set earlier already */
handler_set_err(struct v4l2_ctrl_handler * hdl,int err)1787 static inline int handler_set_err(struct v4l2_ctrl_handler *hdl, int err)
1788 {
1789 	if (hdl->error == 0)
1790 		hdl->error = err;
1791 	return err;
1792 }
1793 
1794 /* Initialize the handler */
v4l2_ctrl_handler_init_class(struct v4l2_ctrl_handler * hdl,unsigned nr_of_controls_hint,struct lock_class_key * key,const char * name)1795 int v4l2_ctrl_handler_init_class(struct v4l2_ctrl_handler *hdl,
1796 				 unsigned nr_of_controls_hint,
1797 				 struct lock_class_key *key, const char *name)
1798 {
1799 	mutex_init(&hdl->_lock);
1800 	hdl->lock = &hdl->_lock;
1801 	lockdep_set_class_and_name(hdl->lock, key, name);
1802 	INIT_LIST_HEAD(&hdl->ctrls);
1803 	INIT_LIST_HEAD(&hdl->ctrl_refs);
1804 	hdl->nr_of_buckets = 1 + nr_of_controls_hint / 8;
1805 	hdl->buckets = kvzalloc_objs(hdl->buckets[0], hdl->nr_of_buckets);
1806 	hdl->error = hdl->buckets ? 0 : -ENOMEM;
1807 	v4l2_ctrl_handler_init_request(hdl);
1808 	return hdl->error;
1809 }
1810 EXPORT_SYMBOL(v4l2_ctrl_handler_init_class);
1811 
1812 /* Free all controls and control refs */
v4l2_ctrl_handler_free(struct v4l2_ctrl_handler * hdl)1813 int v4l2_ctrl_handler_free(struct v4l2_ctrl_handler *hdl)
1814 {
1815 	struct v4l2_ctrl_ref *ref, *next_ref;
1816 	struct v4l2_ctrl *ctrl, *next_ctrl;
1817 	struct v4l2_subscribed_event *sev, *next_sev;
1818 
1819 	if (!hdl)
1820 		return 0;
1821 
1822 	if (!hdl->buckets)
1823 		return hdl->error;
1824 
1825 	v4l2_ctrl_handler_free_request(hdl);
1826 
1827 	mutex_lock(hdl->lock);
1828 	/* Free all nodes */
1829 	list_for_each_entry_safe(ref, next_ref, &hdl->ctrl_refs, node) {
1830 		list_del(&ref->node);
1831 		if (ref->p_req_array_alloc_elems)
1832 			kvfree(ref->p_req.p);
1833 		kfree(ref);
1834 	}
1835 	/* Free all controls owned by the handler */
1836 	list_for_each_entry_safe(ctrl, next_ctrl, &hdl->ctrls, node) {
1837 		list_del(&ctrl->node);
1838 		list_for_each_entry_safe(sev, next_sev, &ctrl->ev_subs, node)
1839 			list_del(&sev->node);
1840 		kvfree(ctrl->p_array);
1841 		kvfree(ctrl);
1842 	}
1843 	kvfree(hdl->buckets);
1844 	hdl->buckets = NULL;
1845 	hdl->cached = NULL;
1846 	mutex_unlock(hdl->lock);
1847 	mutex_destroy(&hdl->_lock);
1848 
1849 	return hdl->error;
1850 }
1851 EXPORT_SYMBOL(v4l2_ctrl_handler_free);
1852 
1853 /* For backwards compatibility: V4L2_CID_PRIVATE_BASE should no longer
1854    be used except in G_CTRL, S_CTRL, QUERYCTRL and QUERYMENU when dealing
1855    with applications that do not use the NEXT_CTRL flag.
1856 
1857    We just find the n-th private user control. It's O(N), but that should not
1858    be an issue in this particular case. */
find_private_ref(struct v4l2_ctrl_handler * hdl,u32 id)1859 static struct v4l2_ctrl_ref *find_private_ref(
1860 		struct v4l2_ctrl_handler *hdl, u32 id)
1861 {
1862 	struct v4l2_ctrl_ref *ref;
1863 
1864 	id -= V4L2_CID_PRIVATE_BASE;
1865 	list_for_each_entry(ref, &hdl->ctrl_refs, node) {
1866 		/* Search for private user controls that are compatible with
1867 		   VIDIOC_G/S_CTRL. */
1868 		if (V4L2_CTRL_ID2WHICH(ref->ctrl->id) == V4L2_CTRL_CLASS_USER &&
1869 		    V4L2_CTRL_DRIVER_PRIV(ref->ctrl->id)) {
1870 			if (!ref->ctrl->is_int)
1871 				continue;
1872 			if (id == 0)
1873 				return ref;
1874 			id--;
1875 		}
1876 	}
1877 	return NULL;
1878 }
1879 
1880 /* Find a control with the given ID. */
find_ref(struct v4l2_ctrl_handler * hdl,u32 id)1881 struct v4l2_ctrl_ref *find_ref(struct v4l2_ctrl_handler *hdl, u32 id)
1882 {
1883 	struct v4l2_ctrl_ref *ref;
1884 	int bucket;
1885 
1886 	id &= V4L2_CTRL_ID_MASK;
1887 
1888 	/* Old-style private controls need special handling */
1889 	if (id >= V4L2_CID_PRIVATE_BASE)
1890 		return find_private_ref(hdl, id);
1891 	bucket = id % hdl->nr_of_buckets;
1892 
1893 	/* Simple optimization: cache the last control found */
1894 	if (hdl->cached && hdl->cached->ctrl->id == id)
1895 		return hdl->cached;
1896 
1897 	/* Not in cache, search the hash */
1898 	ref = hdl->buckets ? hdl->buckets[bucket] : NULL;
1899 	while (ref && ref->ctrl->id != id)
1900 		ref = ref->next;
1901 
1902 	if (ref)
1903 		hdl->cached = ref; /* cache it! */
1904 	return ref;
1905 }
1906 
1907 /* Find a control with the given ID. Take the handler's lock first. */
find_ref_lock(struct v4l2_ctrl_handler * hdl,u32 id)1908 struct v4l2_ctrl_ref *find_ref_lock(struct v4l2_ctrl_handler *hdl, u32 id)
1909 {
1910 	struct v4l2_ctrl_ref *ref = NULL;
1911 
1912 	if (hdl) {
1913 		mutex_lock(hdl->lock);
1914 		ref = find_ref(hdl, id);
1915 		mutex_unlock(hdl->lock);
1916 	}
1917 	return ref;
1918 }
1919 
1920 /* Find a control with the given ID. */
v4l2_ctrl_find(struct v4l2_ctrl_handler * hdl,u32 id)1921 struct v4l2_ctrl *v4l2_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id)
1922 {
1923 	struct v4l2_ctrl_ref *ref = find_ref_lock(hdl, id);
1924 
1925 	return ref ? ref->ctrl : NULL;
1926 }
1927 EXPORT_SYMBOL(v4l2_ctrl_find);
1928 
1929 /* Allocate a new v4l2_ctrl_ref and hook it into the handler. */
handler_new_ref(struct v4l2_ctrl_handler * hdl,struct v4l2_ctrl * ctrl,struct v4l2_ctrl_ref ** ctrl_ref,bool from_other_dev,bool allocate_req)1930 int handler_new_ref(struct v4l2_ctrl_handler *hdl,
1931 		    struct v4l2_ctrl *ctrl,
1932 		    struct v4l2_ctrl_ref **ctrl_ref,
1933 		    bool from_other_dev, bool allocate_req)
1934 {
1935 	struct v4l2_ctrl_ref *ref;
1936 	struct v4l2_ctrl_ref *new_ref;
1937 	u32 id = ctrl->id;
1938 	u32 class_ctrl = V4L2_CTRL_ID2WHICH(id) | 1;
1939 	int bucket = id % hdl->nr_of_buckets;	/* which bucket to use */
1940 	unsigned int size_extra_req = 0;
1941 
1942 	if (ctrl_ref)
1943 		*ctrl_ref = NULL;
1944 
1945 	/*
1946 	 * Automatically add the control class if it is not yet present and
1947 	 * the new control is not a compound control.
1948 	 */
1949 	if (ctrl->type < V4L2_CTRL_COMPOUND_TYPES &&
1950 	    id != class_ctrl && find_ref_lock(hdl, class_ctrl) == NULL)
1951 		if (!v4l2_ctrl_new_std(hdl, NULL, class_ctrl, 0, 0, 0, 0))
1952 			return hdl->error;
1953 
1954 	if (hdl->error)
1955 		return hdl->error;
1956 
1957 	if (allocate_req && !ctrl->is_array)
1958 		size_extra_req = ctrl->elems * ctrl->elem_size;
1959 	new_ref = kzalloc(sizeof(*new_ref) + size_extra_req, GFP_KERNEL);
1960 	if (!new_ref)
1961 		return handler_set_err(hdl, -ENOMEM);
1962 	new_ref->ctrl = ctrl;
1963 	new_ref->from_other_dev = from_other_dev;
1964 	if (size_extra_req)
1965 		new_ref->p_req.p = &new_ref[1];
1966 
1967 	INIT_LIST_HEAD(&new_ref->node);
1968 
1969 	mutex_lock(hdl->lock);
1970 
1971 	/* Add immediately at the end of the list if the list is empty, or if
1972 	   the last element in the list has a lower ID.
1973 	   This ensures that when elements are added in ascending order the
1974 	   insertion is an O(1) operation. */
1975 	if (list_empty(&hdl->ctrl_refs) || id > node2id(hdl->ctrl_refs.prev)) {
1976 		list_add_tail(&new_ref->node, &hdl->ctrl_refs);
1977 		goto insert_in_hash;
1978 	}
1979 
1980 	/* Find insert position in sorted list */
1981 	list_for_each_entry(ref, &hdl->ctrl_refs, node) {
1982 		if (ref->ctrl->id < id)
1983 			continue;
1984 		/* Don't add duplicates */
1985 		if (ref->ctrl->id == id) {
1986 			kfree(new_ref);
1987 			goto unlock;
1988 		}
1989 		list_add(&new_ref->node, ref->node.prev);
1990 		break;
1991 	}
1992 
1993 insert_in_hash:
1994 	/* Insert the control node in the hash */
1995 	new_ref->next = hdl->buckets[bucket];
1996 	hdl->buckets[bucket] = new_ref;
1997 	if (ctrl_ref)
1998 		*ctrl_ref = new_ref;
1999 	if (ctrl->handler == hdl) {
2000 		/* By default each control starts in a cluster of its own.
2001 		 * new_ref->ctrl is basically a cluster array with one
2002 		 * element, so that's perfect to use as the cluster pointer.
2003 		 * But only do this for the handler that owns the control.
2004 		 */
2005 		ctrl->cluster = &new_ref->ctrl;
2006 		ctrl->ncontrols = 1;
2007 	}
2008 
2009 unlock:
2010 	mutex_unlock(hdl->lock);
2011 	return 0;
2012 }
2013 
2014 /* Add a new control */
v4l2_ctrl_new(struct v4l2_ctrl_handler * hdl,const struct v4l2_ctrl_ops * ops,const struct v4l2_ctrl_type_ops * type_ops,u32 id,const char * name,enum v4l2_ctrl_type type,s64 min,s64 max,u64 step,s64 def,const u32 dims[V4L2_CTRL_MAX_DIMS],u32 elem_size,u32 flags,const char * const * qmenu,const s64 * qmenu_int,const union v4l2_ctrl_ptr p_def,const union v4l2_ctrl_ptr p_min,const union v4l2_ctrl_ptr p_max,void * priv)2015 static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
2016 			const struct v4l2_ctrl_ops *ops,
2017 			const struct v4l2_ctrl_type_ops *type_ops,
2018 			u32 id, const char *name, enum v4l2_ctrl_type type,
2019 			s64 min, s64 max, u64 step, s64 def,
2020 			const u32 dims[V4L2_CTRL_MAX_DIMS], u32 elem_size,
2021 			u32 flags, const char * const *qmenu,
2022 			const s64 *qmenu_int,
2023 			const union v4l2_ctrl_ptr p_def,
2024 			const union v4l2_ctrl_ptr p_min,
2025 			const union v4l2_ctrl_ptr p_max,
2026 			void *priv)
2027 {
2028 	struct v4l2_ctrl *ctrl;
2029 	unsigned sz_extra;
2030 	unsigned nr_of_dims = 0;
2031 	unsigned elems = 1;
2032 	bool is_array;
2033 	unsigned tot_ctrl_size;
2034 	void *data;
2035 	int err;
2036 
2037 	if (hdl->error)
2038 		return NULL;
2039 
2040 	while (dims && dims[nr_of_dims]) {
2041 		elems *= dims[nr_of_dims];
2042 		nr_of_dims++;
2043 		if (nr_of_dims == V4L2_CTRL_MAX_DIMS)
2044 			break;
2045 	}
2046 	is_array = nr_of_dims > 0;
2047 
2048 	/* Prefill elem_size for all types handled by std_type_ops */
2049 	switch ((u32)type) {
2050 	case V4L2_CTRL_TYPE_INTEGER64:
2051 		elem_size = sizeof(s64);
2052 		break;
2053 	case V4L2_CTRL_TYPE_STRING:
2054 		elem_size = max + 1;
2055 		break;
2056 	case V4L2_CTRL_TYPE_U8:
2057 		elem_size = sizeof(u8);
2058 		break;
2059 	case V4L2_CTRL_TYPE_U16:
2060 		elem_size = sizeof(u16);
2061 		break;
2062 	case V4L2_CTRL_TYPE_U32:
2063 		elem_size = sizeof(u32);
2064 		break;
2065 	case V4L2_CTRL_TYPE_MPEG2_SEQUENCE:
2066 		elem_size = sizeof(struct v4l2_ctrl_mpeg2_sequence);
2067 		break;
2068 	case V4L2_CTRL_TYPE_MPEG2_PICTURE:
2069 		elem_size = sizeof(struct v4l2_ctrl_mpeg2_picture);
2070 		break;
2071 	case V4L2_CTRL_TYPE_MPEG2_QUANTISATION:
2072 		elem_size = sizeof(struct v4l2_ctrl_mpeg2_quantisation);
2073 		break;
2074 	case V4L2_CTRL_TYPE_FWHT_PARAMS:
2075 		elem_size = sizeof(struct v4l2_ctrl_fwht_params);
2076 		break;
2077 	case V4L2_CTRL_TYPE_H264_SPS:
2078 		elem_size = sizeof(struct v4l2_ctrl_h264_sps);
2079 		break;
2080 	case V4L2_CTRL_TYPE_H264_PPS:
2081 		elem_size = sizeof(struct v4l2_ctrl_h264_pps);
2082 		break;
2083 	case V4L2_CTRL_TYPE_H264_SCALING_MATRIX:
2084 		elem_size = sizeof(struct v4l2_ctrl_h264_scaling_matrix);
2085 		break;
2086 	case V4L2_CTRL_TYPE_H264_SLICE_PARAMS:
2087 		elem_size = sizeof(struct v4l2_ctrl_h264_slice_params);
2088 		break;
2089 	case V4L2_CTRL_TYPE_H264_DECODE_PARAMS:
2090 		elem_size = sizeof(struct v4l2_ctrl_h264_decode_params);
2091 		break;
2092 	case V4L2_CTRL_TYPE_H264_PRED_WEIGHTS:
2093 		elem_size = sizeof(struct v4l2_ctrl_h264_pred_weights);
2094 		break;
2095 	case V4L2_CTRL_TYPE_VP8_FRAME:
2096 		elem_size = sizeof(struct v4l2_ctrl_vp8_frame);
2097 		break;
2098 	case V4L2_CTRL_TYPE_HEVC_SPS:
2099 		elem_size = sizeof(struct v4l2_ctrl_hevc_sps);
2100 		break;
2101 	case V4L2_CTRL_TYPE_HEVC_PPS:
2102 		elem_size = sizeof(struct v4l2_ctrl_hevc_pps);
2103 		break;
2104 	case V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS:
2105 		elem_size = sizeof(struct v4l2_ctrl_hevc_slice_params);
2106 		break;
2107 	case V4L2_CTRL_TYPE_HEVC_EXT_SPS_ST_RPS:
2108 		elem_size = sizeof(struct v4l2_ctrl_hevc_ext_sps_st_rps);
2109 		break;
2110 	case V4L2_CTRL_TYPE_HEVC_EXT_SPS_LT_RPS:
2111 		elem_size = sizeof(struct v4l2_ctrl_hevc_ext_sps_lt_rps);
2112 		break;
2113 	case V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX:
2114 		elem_size = sizeof(struct v4l2_ctrl_hevc_scaling_matrix);
2115 		break;
2116 	case V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS:
2117 		elem_size = sizeof(struct v4l2_ctrl_hevc_decode_params);
2118 		break;
2119 	case V4L2_CTRL_TYPE_HDR10_CLL_INFO:
2120 		elem_size = sizeof(struct v4l2_ctrl_hdr10_cll_info);
2121 		break;
2122 	case V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY:
2123 		elem_size = sizeof(struct v4l2_ctrl_hdr10_mastering_display);
2124 		break;
2125 	case V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR:
2126 		elem_size = sizeof(struct v4l2_ctrl_vp9_compressed_hdr);
2127 		break;
2128 	case V4L2_CTRL_TYPE_VP9_FRAME:
2129 		elem_size = sizeof(struct v4l2_ctrl_vp9_frame);
2130 		break;
2131 	case V4L2_CTRL_TYPE_AV1_SEQUENCE:
2132 		elem_size = sizeof(struct v4l2_ctrl_av1_sequence);
2133 		break;
2134 	case V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY:
2135 		elem_size = sizeof(struct v4l2_ctrl_av1_tile_group_entry);
2136 		break;
2137 	case V4L2_CTRL_TYPE_AV1_FRAME:
2138 		elem_size = sizeof(struct v4l2_ctrl_av1_frame);
2139 		break;
2140 	case V4L2_CTRL_TYPE_AV1_FILM_GRAIN:
2141 		elem_size = sizeof(struct v4l2_ctrl_av1_film_grain);
2142 		break;
2143 	case V4L2_CTRL_TYPE_AREA:
2144 		elem_size = sizeof(struct v4l2_area);
2145 		break;
2146 	case V4L2_CTRL_TYPE_RECT:
2147 		elem_size = sizeof(struct v4l2_rect);
2148 		break;
2149 	default:
2150 		if (type < V4L2_CTRL_COMPOUND_TYPES)
2151 			elem_size = sizeof(s32);
2152 		break;
2153 	}
2154 
2155 	if (type < V4L2_CTRL_COMPOUND_TYPES &&
2156 	    type != V4L2_CTRL_TYPE_BUTTON &&
2157 	    type != V4L2_CTRL_TYPE_CTRL_CLASS &&
2158 	    type != V4L2_CTRL_TYPE_STRING)
2159 		flags |= V4L2_CTRL_FLAG_HAS_WHICH_MIN_MAX;
2160 
2161 	/* Sanity checks */
2162 	if (id == 0 || name == NULL || !elem_size ||
2163 	    id >= V4L2_CID_PRIVATE_BASE ||
2164 	    (type == V4L2_CTRL_TYPE_MENU && qmenu == NULL) ||
2165 	    (type == V4L2_CTRL_TYPE_INTEGER_MENU && qmenu_int == NULL)) {
2166 		handler_set_err(hdl, -ERANGE);
2167 		return NULL;
2168 	}
2169 
2170 	err = check_range(type, min, max, step, def);
2171 	if (err) {
2172 		handler_set_err(hdl, err);
2173 		return NULL;
2174 	}
2175 	if (is_array &&
2176 	    (type == V4L2_CTRL_TYPE_BUTTON ||
2177 	     type == V4L2_CTRL_TYPE_CTRL_CLASS)) {
2178 		handler_set_err(hdl, -EINVAL);
2179 		return NULL;
2180 	}
2181 	if (flags & V4L2_CTRL_FLAG_DYNAMIC_ARRAY) {
2182 		/*
2183 		 * For now only support this for one-dimensional arrays only.
2184 		 *
2185 		 * This can be relaxed in the future, but this will
2186 		 * require more effort.
2187 		 */
2188 		if (nr_of_dims != 1) {
2189 			handler_set_err(hdl, -EINVAL);
2190 			return NULL;
2191 		}
2192 		/* Start with just 1 element */
2193 		elems = 1;
2194 	}
2195 
2196 	tot_ctrl_size = elem_size * elems;
2197 	sz_extra = 0;
2198 	if (type == V4L2_CTRL_TYPE_BUTTON)
2199 		flags |= V4L2_CTRL_FLAG_WRITE_ONLY |
2200 			V4L2_CTRL_FLAG_EXECUTE_ON_WRITE;
2201 	else if (type == V4L2_CTRL_TYPE_CTRL_CLASS)
2202 		flags |= V4L2_CTRL_FLAG_READ_ONLY;
2203 	else if (!is_array &&
2204 		 (type == V4L2_CTRL_TYPE_INTEGER64 ||
2205 		  type == V4L2_CTRL_TYPE_STRING ||
2206 		  type >= V4L2_CTRL_COMPOUND_TYPES))
2207 		sz_extra += 2 * tot_ctrl_size;
2208 
2209 	if (type >= V4L2_CTRL_COMPOUND_TYPES && p_def.p_const)
2210 		sz_extra += elem_size;
2211 	if (type >= V4L2_CTRL_COMPOUND_TYPES && p_min.p_const)
2212 		sz_extra += elem_size;
2213 	if (type >= V4L2_CTRL_COMPOUND_TYPES && p_max.p_const)
2214 		sz_extra += elem_size;
2215 
2216 	ctrl = kvzalloc(sizeof(*ctrl) + sz_extra, GFP_KERNEL);
2217 	if (ctrl == NULL) {
2218 		handler_set_err(hdl, -ENOMEM);
2219 		return NULL;
2220 	}
2221 
2222 	INIT_LIST_HEAD(&ctrl->node);
2223 	INIT_LIST_HEAD(&ctrl->ev_subs);
2224 	ctrl->handler = hdl;
2225 	ctrl->ops = ops;
2226 	ctrl->type_ops = type_ops ? type_ops : &std_type_ops;
2227 	ctrl->id = id;
2228 	ctrl->name = name;
2229 	ctrl->type = type;
2230 	ctrl->flags = flags;
2231 	ctrl->minimum = min;
2232 	ctrl->maximum = max;
2233 	ctrl->step = step;
2234 	ctrl->default_value = def;
2235 	ctrl->is_string = !is_array && type == V4L2_CTRL_TYPE_STRING;
2236 	ctrl->is_ptr = is_array || type >= V4L2_CTRL_COMPOUND_TYPES || ctrl->is_string;
2237 	ctrl->is_int = !ctrl->is_ptr && type != V4L2_CTRL_TYPE_INTEGER64;
2238 	ctrl->is_array = is_array;
2239 	ctrl->is_dyn_array = !!(flags & V4L2_CTRL_FLAG_DYNAMIC_ARRAY);
2240 	ctrl->elems = elems;
2241 	ctrl->new_elems = elems;
2242 	ctrl->nr_of_dims = nr_of_dims;
2243 	if (nr_of_dims)
2244 		memcpy(ctrl->dims, dims, nr_of_dims * sizeof(dims[0]));
2245 	ctrl->elem_size = elem_size;
2246 	if (type == V4L2_CTRL_TYPE_MENU)
2247 		ctrl->qmenu = qmenu;
2248 	else if (type == V4L2_CTRL_TYPE_INTEGER_MENU)
2249 		ctrl->qmenu_int = qmenu_int;
2250 	ctrl->priv = priv;
2251 	ctrl->cur.val = ctrl->val = def;
2252 	data = &ctrl[1];
2253 
2254 	if (ctrl->is_array) {
2255 		ctrl->p_array_alloc_elems = elems;
2256 		ctrl->p_array = kvzalloc(2 * elems * elem_size, GFP_KERNEL);
2257 		if (!ctrl->p_array) {
2258 			kvfree(ctrl);
2259 			return NULL;
2260 		}
2261 		data = ctrl->p_array;
2262 	}
2263 
2264 	if (!ctrl->is_int) {
2265 		ctrl->p_new.p = data;
2266 		ctrl->p_cur.p = data + tot_ctrl_size;
2267 	} else {
2268 		ctrl->p_new.p = &ctrl->val;
2269 		ctrl->p_cur.p = &ctrl->cur.val;
2270 	}
2271 
2272 	if (type >= V4L2_CTRL_COMPOUND_TYPES && p_def.p_const) {
2273 		if (ctrl->is_array)
2274 			ctrl->p_def.p = &ctrl[1];
2275 		else
2276 			ctrl->p_def.p = ctrl->p_cur.p + tot_ctrl_size;
2277 		memcpy(ctrl->p_def.p, p_def.p_const, elem_size);
2278 	}
2279 
2280 	if (flags & V4L2_CTRL_FLAG_HAS_WHICH_MIN_MAX) {
2281 		void *ptr = ctrl->p_def.p;
2282 
2283 		if (p_min.p_const) {
2284 			ptr += elem_size;
2285 			ctrl->p_min.p = ptr;
2286 			memcpy(ctrl->p_min.p, p_min.p_const, elem_size);
2287 		}
2288 
2289 		if (p_max.p_const) {
2290 			ptr += elem_size;
2291 			ctrl->p_max.p = ptr;
2292 			memcpy(ctrl->p_max.p, p_max.p_const, elem_size);
2293 		}
2294 	}
2295 
2296 	ctrl->type_ops->init(ctrl, 0, ctrl->p_cur);
2297 	cur_to_new(ctrl);
2298 
2299 	if (handler_new_ref(hdl, ctrl, NULL, false, false)) {
2300 		kvfree(ctrl->p_array);
2301 		kvfree(ctrl);
2302 		return NULL;
2303 	}
2304 	mutex_lock(hdl->lock);
2305 	list_add_tail(&ctrl->node, &hdl->ctrls);
2306 	mutex_unlock(hdl->lock);
2307 	return ctrl;
2308 }
2309 
v4l2_ctrl_new_custom(struct v4l2_ctrl_handler * hdl,const struct v4l2_ctrl_config * cfg,void * priv)2310 struct v4l2_ctrl *v4l2_ctrl_new_custom(struct v4l2_ctrl_handler *hdl,
2311 			const struct v4l2_ctrl_config *cfg, void *priv)
2312 {
2313 	bool is_menu;
2314 	struct v4l2_ctrl *ctrl;
2315 	const char *name = cfg->name;
2316 	const char * const *qmenu = cfg->qmenu;
2317 	const s64 *qmenu_int = cfg->qmenu_int;
2318 	enum v4l2_ctrl_type type = cfg->type;
2319 	u32 flags = cfg->flags;
2320 	s64 min = cfg->min;
2321 	s64 max = cfg->max;
2322 	u64 step = cfg->step;
2323 	s64 def = cfg->def;
2324 
2325 	if (name == NULL)
2326 		v4l2_ctrl_fill(cfg->id, &name, &type, &min, &max, &step,
2327 								&def, &flags);
2328 
2329 	is_menu = (type == V4L2_CTRL_TYPE_MENU ||
2330 		   type == V4L2_CTRL_TYPE_INTEGER_MENU);
2331 	if (is_menu)
2332 		WARN_ON(step);
2333 	else
2334 		WARN_ON(cfg->menu_skip_mask);
2335 	if (type == V4L2_CTRL_TYPE_MENU && !qmenu) {
2336 		qmenu = v4l2_ctrl_get_menu(cfg->id);
2337 	} else if (type == V4L2_CTRL_TYPE_INTEGER_MENU && !qmenu_int) {
2338 		handler_set_err(hdl, -EINVAL);
2339 		return NULL;
2340 	}
2341 
2342 	ctrl = v4l2_ctrl_new(hdl, cfg->ops, cfg->type_ops, cfg->id, name,
2343 			type, min, max,
2344 			is_menu ? cfg->menu_skip_mask : step, def,
2345 			cfg->dims, cfg->elem_size,
2346 			flags, qmenu, qmenu_int, cfg->p_def, cfg->p_min,
2347 			cfg->p_max, priv);
2348 	if (ctrl)
2349 		ctrl->is_private = cfg->is_private;
2350 	return ctrl;
2351 }
2352 EXPORT_SYMBOL(v4l2_ctrl_new_custom);
2353 
2354 /* Helper function for standard non-menu controls */
v4l2_ctrl_new_std(struct v4l2_ctrl_handler * hdl,const struct v4l2_ctrl_ops * ops,u32 id,s64 min,s64 max,u64 step,s64 def)2355 struct v4l2_ctrl *v4l2_ctrl_new_std(struct v4l2_ctrl_handler *hdl,
2356 			const struct v4l2_ctrl_ops *ops,
2357 			u32 id, s64 min, s64 max, u64 step, s64 def)
2358 {
2359 	const char *name;
2360 	enum v4l2_ctrl_type type;
2361 	u32 flags;
2362 
2363 	v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2364 	if (type == V4L2_CTRL_TYPE_MENU ||
2365 	    type == V4L2_CTRL_TYPE_INTEGER_MENU ||
2366 	    type >= V4L2_CTRL_COMPOUND_TYPES) {
2367 		handler_set_err(hdl, -EINVAL);
2368 		return NULL;
2369 	}
2370 	return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2371 			     min, max, step, def, NULL, 0,
2372 			     flags, NULL, NULL, ptr_null, ptr_null,
2373 			     ptr_null, NULL);
2374 }
2375 EXPORT_SYMBOL(v4l2_ctrl_new_std);
2376 
2377 /* Helper function for standard menu controls */
v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler * hdl,const struct v4l2_ctrl_ops * ops,u32 id,u8 _max,u64 mask,u8 _def)2378 struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
2379 			const struct v4l2_ctrl_ops *ops,
2380 			u32 id, u8 _max, u64 mask, u8 _def)
2381 {
2382 	const char * const *qmenu = NULL;
2383 	const s64 *qmenu_int = NULL;
2384 	unsigned int qmenu_int_len = 0;
2385 	const char *name;
2386 	enum v4l2_ctrl_type type;
2387 	s64 min;
2388 	s64 max = _max;
2389 	s64 def = _def;
2390 	u64 step;
2391 	u32 flags;
2392 
2393 	v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2394 
2395 	if (type == V4L2_CTRL_TYPE_MENU)
2396 		qmenu = v4l2_ctrl_get_menu(id);
2397 	else if (type == V4L2_CTRL_TYPE_INTEGER_MENU)
2398 		qmenu_int = v4l2_ctrl_get_int_menu(id, &qmenu_int_len);
2399 
2400 	if ((!qmenu && !qmenu_int) || (qmenu_int && max >= qmenu_int_len)) {
2401 		handler_set_err(hdl, -EINVAL);
2402 		return NULL;
2403 	}
2404 	return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2405 			     0, max, mask, def, NULL, 0,
2406 			     flags, qmenu, qmenu_int, ptr_null, ptr_null,
2407 			     ptr_null, NULL);
2408 }
2409 EXPORT_SYMBOL(v4l2_ctrl_new_std_menu);
2410 
2411 /* Helper function for standard menu controls with driver defined menu */
v4l2_ctrl_new_std_menu_items(struct v4l2_ctrl_handler * hdl,const struct v4l2_ctrl_ops * ops,u32 id,u8 _max,u64 mask,u8 _def,const char * const * qmenu)2412 struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(struct v4l2_ctrl_handler *hdl,
2413 			const struct v4l2_ctrl_ops *ops, u32 id, u8 _max,
2414 			u64 mask, u8 _def, const char * const *qmenu)
2415 {
2416 	enum v4l2_ctrl_type type;
2417 	const char *name;
2418 	u32 flags;
2419 	u64 step;
2420 	s64 min;
2421 	s64 max = _max;
2422 	s64 def = _def;
2423 
2424 	/* v4l2_ctrl_new_std_menu_items() should only be called for
2425 	 * standard controls without a standard menu.
2426 	 */
2427 	if (v4l2_ctrl_get_menu(id)) {
2428 		handler_set_err(hdl, -EINVAL);
2429 		return NULL;
2430 	}
2431 
2432 	v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2433 	if (type != V4L2_CTRL_TYPE_MENU || qmenu == NULL) {
2434 		handler_set_err(hdl, -EINVAL);
2435 		return NULL;
2436 	}
2437 	return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2438 			     0, max, mask, def, NULL, 0,
2439 			     flags, qmenu, NULL, ptr_null, ptr_null,
2440 			     ptr_null, NULL);
2441 
2442 }
2443 EXPORT_SYMBOL(v4l2_ctrl_new_std_menu_items);
2444 
2445 /* Helper function for standard compound controls */
v4l2_ctrl_new_std_compound(struct v4l2_ctrl_handler * hdl,const struct v4l2_ctrl_ops * ops,u32 id,const union v4l2_ctrl_ptr p_def,const union v4l2_ctrl_ptr p_min,const union v4l2_ctrl_ptr p_max)2446 struct v4l2_ctrl *v4l2_ctrl_new_std_compound(struct v4l2_ctrl_handler *hdl,
2447 				const struct v4l2_ctrl_ops *ops, u32 id,
2448 				const union v4l2_ctrl_ptr p_def,
2449 				const union v4l2_ctrl_ptr p_min,
2450 				const union v4l2_ctrl_ptr p_max)
2451 {
2452 	const char *name;
2453 	enum v4l2_ctrl_type type;
2454 	u32 flags;
2455 	s64 min, max, step, def;
2456 
2457 	v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2458 	if (type < V4L2_CTRL_COMPOUND_TYPES) {
2459 		handler_set_err(hdl, -EINVAL);
2460 		return NULL;
2461 	}
2462 	return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2463 			     min, max, step, def, NULL, 0,
2464 			     flags, NULL, NULL, p_def, p_min, p_max, NULL);
2465 }
2466 EXPORT_SYMBOL(v4l2_ctrl_new_std_compound);
2467 
2468 /* Helper function for standard integer menu controls */
v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler * hdl,const struct v4l2_ctrl_ops * ops,u32 id,u8 _max,u8 _def,const s64 * qmenu_int)2469 struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl,
2470 			const struct v4l2_ctrl_ops *ops,
2471 			u32 id, u8 _max, u8 _def, const s64 *qmenu_int)
2472 {
2473 	const char *name;
2474 	enum v4l2_ctrl_type type;
2475 	s64 min;
2476 	u64 step;
2477 	s64 max = _max;
2478 	s64 def = _def;
2479 	u32 flags;
2480 
2481 	v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2482 	if (type != V4L2_CTRL_TYPE_INTEGER_MENU) {
2483 		handler_set_err(hdl, -EINVAL);
2484 		return NULL;
2485 	}
2486 	return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2487 			     0, max, 0, def, NULL, 0,
2488 			     flags, NULL, qmenu_int, ptr_null, ptr_null,
2489 			     ptr_null, NULL);
2490 }
2491 EXPORT_SYMBOL(v4l2_ctrl_new_int_menu);
2492 
2493 /* Add the controls from another handler to our own. */
v4l2_ctrl_add_handler(struct v4l2_ctrl_handler * hdl,struct v4l2_ctrl_handler * add,bool (* filter)(const struct v4l2_ctrl * ctrl),bool from_other_dev)2494 int v4l2_ctrl_add_handler(struct v4l2_ctrl_handler *hdl,
2495 			  struct v4l2_ctrl_handler *add,
2496 			  bool (*filter)(const struct v4l2_ctrl *ctrl),
2497 			  bool from_other_dev)
2498 {
2499 	struct v4l2_ctrl_ref *ref;
2500 	int ret = 0;
2501 
2502 	/* Do nothing if either handler is NULL or if they are the same */
2503 	if (!hdl || !add || hdl == add)
2504 		return 0;
2505 	if (hdl->error)
2506 		return hdl->error;
2507 	mutex_lock(add->lock);
2508 	list_for_each_entry(ref, &add->ctrl_refs, node) {
2509 		struct v4l2_ctrl *ctrl = ref->ctrl;
2510 
2511 		/* Skip handler-private controls. */
2512 		if (ctrl->is_private)
2513 			continue;
2514 		/* And control classes */
2515 		if (ctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
2516 			continue;
2517 		/* Filter any unwanted controls */
2518 		if (filter && !filter(ctrl))
2519 			continue;
2520 		ret = handler_new_ref(hdl, ctrl, NULL, from_other_dev, false);
2521 		if (ret)
2522 			break;
2523 	}
2524 	mutex_unlock(add->lock);
2525 	return ret;
2526 }
2527 EXPORT_SYMBOL(v4l2_ctrl_add_handler);
2528 
v4l2_ctrl_radio_filter(const struct v4l2_ctrl * ctrl)2529 bool v4l2_ctrl_radio_filter(const struct v4l2_ctrl *ctrl)
2530 {
2531 	if (V4L2_CTRL_ID2WHICH(ctrl->id) == V4L2_CTRL_CLASS_FM_TX)
2532 		return true;
2533 	if (V4L2_CTRL_ID2WHICH(ctrl->id) == V4L2_CTRL_CLASS_FM_RX)
2534 		return true;
2535 	switch (ctrl->id) {
2536 	case V4L2_CID_AUDIO_MUTE:
2537 	case V4L2_CID_AUDIO_VOLUME:
2538 	case V4L2_CID_AUDIO_BALANCE:
2539 	case V4L2_CID_AUDIO_BASS:
2540 	case V4L2_CID_AUDIO_TREBLE:
2541 	case V4L2_CID_AUDIO_LOUDNESS:
2542 		return true;
2543 	default:
2544 		break;
2545 	}
2546 	return false;
2547 }
2548 EXPORT_SYMBOL(v4l2_ctrl_radio_filter);
2549 
2550 /* Cluster controls */
v4l2_ctrl_cluster(unsigned ncontrols,struct v4l2_ctrl ** controls)2551 void v4l2_ctrl_cluster(unsigned ncontrols, struct v4l2_ctrl **controls)
2552 {
2553 	bool has_volatiles = false;
2554 	int i;
2555 
2556 	/* The first control is the master control and it must not be NULL */
2557 	if (WARN_ON(ncontrols == 0 || controls[0] == NULL))
2558 		return;
2559 
2560 	for (i = 0; i < ncontrols; i++) {
2561 		if (controls[i]) {
2562 			controls[i]->cluster = controls;
2563 			controls[i]->ncontrols = ncontrols;
2564 			if (controls[i]->flags & V4L2_CTRL_FLAG_VOLATILE)
2565 				has_volatiles = true;
2566 		}
2567 	}
2568 	controls[0]->has_volatiles = has_volatiles;
2569 }
2570 EXPORT_SYMBOL(v4l2_ctrl_cluster);
2571 
v4l2_ctrl_auto_cluster(unsigned ncontrols,struct v4l2_ctrl ** controls,u8 manual_val,bool set_volatile)2572 void v4l2_ctrl_auto_cluster(unsigned ncontrols, struct v4l2_ctrl **controls,
2573 			    u8 manual_val, bool set_volatile)
2574 {
2575 	struct v4l2_ctrl *master = controls[0];
2576 	u32 flag = 0;
2577 	int i;
2578 
2579 	v4l2_ctrl_cluster(ncontrols, controls);
2580 	WARN_ON(ncontrols <= 1);
2581 	WARN_ON(manual_val < master->minimum || manual_val > master->maximum);
2582 	WARN_ON(set_volatile && !has_op(master, g_volatile_ctrl));
2583 	master->is_auto = true;
2584 	master->has_volatiles = set_volatile;
2585 	master->manual_mode_value = manual_val;
2586 	master->flags |= V4L2_CTRL_FLAG_UPDATE;
2587 
2588 	if (!is_cur_manual(master))
2589 		flag = V4L2_CTRL_FLAG_INACTIVE |
2590 			(set_volatile ? V4L2_CTRL_FLAG_VOLATILE : 0);
2591 
2592 	for (i = 1; i < ncontrols; i++)
2593 		if (controls[i])
2594 			controls[i]->flags |= flag;
2595 }
2596 EXPORT_SYMBOL(v4l2_ctrl_auto_cluster);
2597 
2598 /*
2599  * Obtain the current volatile values of an autocluster and mark them
2600  * as new.
2601  */
update_from_auto_cluster(struct v4l2_ctrl * master)2602 void update_from_auto_cluster(struct v4l2_ctrl *master)
2603 {
2604 	int i;
2605 
2606 	for (i = 1; i < master->ncontrols; i++)
2607 		cur_to_new(master->cluster[i]);
2608 	if (!call_op(master, g_volatile_ctrl))
2609 		for (i = 1; i < master->ncontrols; i++)
2610 			if (master->cluster[i])
2611 				master->cluster[i]->is_new = 1;
2612 }
2613 
2614 /*
2615  * Return non-zero if one or more of the controls in the cluster has a new
2616  * value that differs from the current value.
2617  */
cluster_changed(struct v4l2_ctrl * master)2618 static int cluster_changed(struct v4l2_ctrl *master)
2619 {
2620 	bool changed = false;
2621 	int i;
2622 
2623 	for (i = 0; i < master->ncontrols; i++) {
2624 		struct v4l2_ctrl *ctrl = master->cluster[i];
2625 		bool ctrl_changed = false;
2626 
2627 		if (!ctrl)
2628 			continue;
2629 
2630 		if (ctrl->flags & V4L2_CTRL_FLAG_EXECUTE_ON_WRITE) {
2631 			changed = true;
2632 			ctrl_changed = true;
2633 		}
2634 
2635 		/*
2636 		 * Set has_changed to false to avoid generating
2637 		 * the event V4L2_EVENT_CTRL_CH_VALUE
2638 		 */
2639 		if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE) {
2640 			ctrl->has_changed = false;
2641 			continue;
2642 		}
2643 
2644 		if (ctrl->elems != ctrl->new_elems)
2645 			ctrl_changed = true;
2646 		if (!ctrl_changed)
2647 			ctrl_changed = !ctrl->type_ops->equal(ctrl,
2648 				ctrl->p_cur, ctrl->p_new);
2649 		ctrl->has_changed = ctrl_changed;
2650 		changed |= ctrl->has_changed;
2651 	}
2652 	return changed;
2653 }
2654 
2655 /*
2656  * Core function that calls try/s_ctrl and ensures that the new value is
2657  * copied to the current value on a set.
2658  * Must be called with ctrl->handler->lock held.
2659  */
try_or_set_cluster(struct v4l2_fh * fh,struct v4l2_ctrl * master,bool set,u32 ch_flags)2660 int try_or_set_cluster(struct v4l2_fh *fh, struct v4l2_ctrl *master,
2661 		       bool set, u32 ch_flags)
2662 {
2663 	bool update_flag;
2664 	int ret;
2665 	int i;
2666 
2667 	/*
2668 	 * Go through the cluster and either validate the new value or
2669 	 * (if no new value was set), copy the current value to the new
2670 	 * value, ensuring a consistent view for the control ops when
2671 	 * called.
2672 	 */
2673 	for (i = 0; i < master->ncontrols; i++) {
2674 		struct v4l2_ctrl *ctrl = master->cluster[i];
2675 
2676 		if (!ctrl)
2677 			continue;
2678 
2679 		if (!ctrl->is_new) {
2680 			cur_to_new(ctrl);
2681 			continue;
2682 		}
2683 		/*
2684 		 * Check again: it may have changed since the
2685 		 * previous check in try_or_set_ext_ctrls().
2686 		 */
2687 		if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED))
2688 			return -EBUSY;
2689 	}
2690 
2691 	ret = call_op(master, try_ctrl);
2692 
2693 	/* Don't set if there is no change */
2694 	if (ret || !set || !cluster_changed(master))
2695 		return ret;
2696 	ret = call_op(master, s_ctrl);
2697 	if (ret)
2698 		return ret;
2699 
2700 	/* If OK, then make the new values permanent. */
2701 	update_flag = is_cur_manual(master) != is_new_manual(master);
2702 
2703 	for (i = 0; i < master->ncontrols; i++) {
2704 		/*
2705 		 * If we switch from auto to manual mode, and this cluster
2706 		 * contains volatile controls, then all non-master controls
2707 		 * have to be marked as changed. The 'new' value contains
2708 		 * the volatile value (obtained by update_from_auto_cluster),
2709 		 * which now has to become the current value.
2710 		 */
2711 		if (i && update_flag && is_new_manual(master) &&
2712 		    master->has_volatiles && master->cluster[i])
2713 			master->cluster[i]->has_changed = true;
2714 
2715 		new_to_cur(fh, master->cluster[i], ch_flags |
2716 			((update_flag && i > 0) ? V4L2_EVENT_CTRL_CH_FLAGS : 0));
2717 	}
2718 	return 0;
2719 }
2720 
2721 /* Activate/deactivate a control. */
v4l2_ctrl_activate(struct v4l2_ctrl * ctrl,bool active)2722 void v4l2_ctrl_activate(struct v4l2_ctrl *ctrl, bool active)
2723 {
2724 	/* invert since the actual flag is called 'inactive' */
2725 	bool inactive = !active;
2726 	bool old;
2727 
2728 	if (ctrl == NULL)
2729 		return;
2730 
2731 	if (inactive)
2732 		/* set V4L2_CTRL_FLAG_INACTIVE */
2733 		old = test_and_set_bit(4, &ctrl->flags);
2734 	else
2735 		/* clear V4L2_CTRL_FLAG_INACTIVE */
2736 		old = test_and_clear_bit(4, &ctrl->flags);
2737 	if (old != inactive)
2738 		send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_FLAGS);
2739 }
2740 EXPORT_SYMBOL(v4l2_ctrl_activate);
2741 
__v4l2_ctrl_grab(struct v4l2_ctrl * ctrl,bool grabbed)2742 void __v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed)
2743 {
2744 	bool old;
2745 
2746 	if (ctrl == NULL)
2747 		return;
2748 
2749 	lockdep_assert_held(ctrl->handler->lock);
2750 
2751 	if (grabbed)
2752 		/* set V4L2_CTRL_FLAG_GRABBED */
2753 		old = test_and_set_bit(1, &ctrl->flags);
2754 	else
2755 		/* clear V4L2_CTRL_FLAG_GRABBED */
2756 		old = test_and_clear_bit(1, &ctrl->flags);
2757 	if (old != grabbed)
2758 		send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_FLAGS);
2759 }
2760 EXPORT_SYMBOL(__v4l2_ctrl_grab);
2761 
2762 /* Call s_ctrl for all controls owned by the handler */
__v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler * hdl)2763 int __v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
2764 {
2765 	struct v4l2_ctrl *ctrl;
2766 	int ret = 0;
2767 
2768 	if (hdl == NULL)
2769 		return 0;
2770 
2771 	lockdep_assert_held(hdl->lock);
2772 
2773 	list_for_each_entry(ctrl, &hdl->ctrls, node)
2774 		ctrl->done = false;
2775 
2776 	list_for_each_entry(ctrl, &hdl->ctrls, node) {
2777 		struct v4l2_ctrl *master = ctrl->cluster[0];
2778 		int i;
2779 
2780 		/* Skip if this control was already handled by a cluster. */
2781 		/* Skip button controls and read-only controls. */
2782 		if (ctrl->done || ctrl->type == V4L2_CTRL_TYPE_BUTTON ||
2783 		    (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY))
2784 			continue;
2785 
2786 		for (i = 0; i < master->ncontrols; i++) {
2787 			if (master->cluster[i]) {
2788 				cur_to_new(master->cluster[i]);
2789 				master->cluster[i]->is_new = 1;
2790 				master->cluster[i]->done = true;
2791 			}
2792 		}
2793 		ret = call_op(master, s_ctrl);
2794 		if (ret)
2795 			break;
2796 	}
2797 
2798 	return ret;
2799 }
2800 EXPORT_SYMBOL_GPL(__v4l2_ctrl_handler_setup);
2801 
v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler * hdl)2802 int v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
2803 {
2804 	int ret;
2805 
2806 	if (hdl == NULL)
2807 		return 0;
2808 
2809 	mutex_lock(hdl->lock);
2810 	ret = __v4l2_ctrl_handler_setup(hdl);
2811 	mutex_unlock(hdl->lock);
2812 
2813 	return ret;
2814 }
2815 EXPORT_SYMBOL(v4l2_ctrl_handler_setup);
2816 
2817 /* Log the control name and value */
log_ctrl(const struct v4l2_ctrl * ctrl,const char * prefix,const char * colon)2818 static void log_ctrl(const struct v4l2_ctrl *ctrl,
2819 		     const char *prefix, const char *colon)
2820 {
2821 	if (ctrl->flags & (V4L2_CTRL_FLAG_DISABLED | V4L2_CTRL_FLAG_WRITE_ONLY))
2822 		return;
2823 	if (ctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
2824 		return;
2825 
2826 	pr_info("%s%s%s: ", prefix, colon, ctrl->name);
2827 
2828 	ctrl->type_ops->log(ctrl);
2829 
2830 	if (ctrl->flags & (V4L2_CTRL_FLAG_INACTIVE |
2831 			   V4L2_CTRL_FLAG_GRABBED |
2832 			   V4L2_CTRL_FLAG_VOLATILE)) {
2833 		if (ctrl->flags & V4L2_CTRL_FLAG_INACTIVE)
2834 			pr_cont(" inactive");
2835 		if (ctrl->flags & V4L2_CTRL_FLAG_GRABBED)
2836 			pr_cont(" grabbed");
2837 		if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE)
2838 			pr_cont(" volatile");
2839 	}
2840 	pr_cont("\n");
2841 }
2842 
2843 /* Log all controls owned by the handler */
v4l2_ctrl_handler_log_status(struct v4l2_ctrl_handler * hdl,const char * prefix)2844 void v4l2_ctrl_handler_log_status(struct v4l2_ctrl_handler *hdl,
2845 				  const char *prefix)
2846 {
2847 	struct v4l2_ctrl *ctrl;
2848 	const char *colon = "";
2849 	int len;
2850 
2851 	if (!hdl)
2852 		return;
2853 	if (!prefix)
2854 		prefix = "";
2855 	len = strlen(prefix);
2856 	if (len && prefix[len - 1] != ' ')
2857 		colon = ": ";
2858 	mutex_lock(hdl->lock);
2859 	list_for_each_entry(ctrl, &hdl->ctrls, node)
2860 		if (!(ctrl->flags & V4L2_CTRL_FLAG_DISABLED))
2861 			log_ctrl(ctrl, prefix, colon);
2862 	mutex_unlock(hdl->lock);
2863 }
2864 EXPORT_SYMBOL(v4l2_ctrl_handler_log_status);
2865 
v4l2_ctrl_new_fwnode_properties(struct v4l2_ctrl_handler * hdl,const struct v4l2_ctrl_ops * ctrl_ops,const struct v4l2_fwnode_device_properties * p)2866 int v4l2_ctrl_new_fwnode_properties(struct v4l2_ctrl_handler *hdl,
2867 				    const struct v4l2_ctrl_ops *ctrl_ops,
2868 				    const struct v4l2_fwnode_device_properties *p)
2869 {
2870 	if (hdl->error)
2871 		return hdl->error;
2872 
2873 	if (p->orientation != V4L2_FWNODE_PROPERTY_UNSET) {
2874 		u32 orientation_ctrl;
2875 
2876 		switch (p->orientation) {
2877 		case V4L2_FWNODE_ORIENTATION_FRONT:
2878 			orientation_ctrl = V4L2_CAMERA_ORIENTATION_FRONT;
2879 			break;
2880 		case V4L2_FWNODE_ORIENTATION_BACK:
2881 			orientation_ctrl = V4L2_CAMERA_ORIENTATION_BACK;
2882 			break;
2883 		case V4L2_FWNODE_ORIENTATION_EXTERNAL:
2884 			orientation_ctrl = V4L2_CAMERA_ORIENTATION_EXTERNAL;
2885 			break;
2886 		default:
2887 			hdl->error = -EINVAL;
2888 			return hdl->error;
2889 		}
2890 		if (!v4l2_ctrl_new_std_menu(hdl, ctrl_ops,
2891 					    V4L2_CID_CAMERA_ORIENTATION,
2892 					    V4L2_CAMERA_ORIENTATION_EXTERNAL, 0,
2893 					    orientation_ctrl))
2894 			return hdl->error;
2895 	}
2896 
2897 	if (p->rotation != V4L2_FWNODE_PROPERTY_UNSET) {
2898 		if (!v4l2_ctrl_new_std(hdl, ctrl_ops,
2899 				       V4L2_CID_CAMERA_SENSOR_ROTATION,
2900 				       p->rotation, p->rotation, 1,
2901 				       p->rotation))
2902 			return hdl->error;
2903 	}
2904 
2905 	return hdl->error;
2906 }
2907 EXPORT_SYMBOL(v4l2_ctrl_new_fwnode_properties);
2908