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