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