1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
4  * Copyright (C) 2017 Linaro Ltd.
5  */
6 #include <linux/overflow.h>
7 #include <linux/errno.h>
8 #include <linux/hash.h>
9 
10 #include "hfi_cmds.h"
11 
12 static enum hfi_version hfi_ver;
13 
14 void pkt_sys_init(struct hfi_sys_init_pkt *pkt, u32 arch_type)
15 {
16 	pkt->hdr.size = sizeof(*pkt);
17 	pkt->hdr.pkt_type = HFI_CMD_SYS_INIT;
18 	pkt->arch_type = arch_type;
19 }
20 
21 void pkt_sys_pc_prep(struct hfi_sys_pc_prep_pkt *pkt)
22 {
23 	pkt->hdr.size = sizeof(*pkt);
24 	pkt->hdr.pkt_type = HFI_CMD_SYS_PC_PREP;
25 }
26 
27 void pkt_sys_idle_indicator(struct hfi_sys_set_property_pkt *pkt, u32 enable)
28 {
29 	struct hfi_enable *hfi = (struct hfi_enable *)&pkt->data[1];
30 
31 	pkt->hdr.size = struct_size(pkt, data, 1) + sizeof(*hfi);
32 	pkt->hdr.pkt_type = HFI_CMD_SYS_SET_PROPERTY;
33 	pkt->num_properties = 1;
34 	pkt->data[0] = HFI_PROPERTY_SYS_IDLE_INDICATOR;
35 	hfi->enable = enable;
36 }
37 
38 void pkt_sys_debug_config(struct hfi_sys_set_property_pkt *pkt, u32 mode,
39 			  u32 config)
40 {
41 	struct hfi_debug_config *hfi;
42 
43 	pkt->hdr.size = struct_size(pkt, data, 1) + sizeof(*hfi);
44 	pkt->hdr.pkt_type = HFI_CMD_SYS_SET_PROPERTY;
45 	pkt->num_properties = 1;
46 	pkt->data[0] = HFI_PROPERTY_SYS_DEBUG_CONFIG;
47 	hfi = (struct hfi_debug_config *)&pkt->data[1];
48 	hfi->config = config;
49 	hfi->mode = mode;
50 }
51 
52 void pkt_sys_coverage_config(struct hfi_sys_set_property_pkt *pkt, u32 mode)
53 {
54 	pkt->hdr.size = struct_size(pkt, data, 2);
55 	pkt->hdr.pkt_type = HFI_CMD_SYS_SET_PROPERTY;
56 	pkt->num_properties = 1;
57 	pkt->data[0] = HFI_PROPERTY_SYS_CONFIG_COVERAGE;
58 	pkt->data[1] = mode;
59 }
60 
61 void pkt_sys_ubwc_config(struct hfi_sys_set_property_pkt *pkt, const struct hfi_ubwc_config *hfi)
62 {
63 	pkt->hdr.size = struct_size(pkt, data, 1) + sizeof(*hfi);
64 	pkt->hdr.pkt_type = HFI_CMD_SYS_SET_PROPERTY;
65 	pkt->num_properties = 1;
66 	pkt->data[0] = HFI_PROPERTY_SYS_UBWC_CONFIG;
67 	memcpy(&pkt->data[1], hfi, sizeof(*hfi));
68 }
69 
70 int pkt_sys_set_resource(struct hfi_sys_set_resource_pkt *pkt, u32 id, u32 size,
71 			 u32 addr, void *cookie)
72 {
73 	pkt->hdr.size = sizeof(*pkt);
74 	pkt->hdr.pkt_type = HFI_CMD_SYS_SET_RESOURCE;
75 	pkt->resource_handle = hash32_ptr(cookie);
76 
77 	switch (id) {
78 	case VIDC_RESOURCE_OCMEM:
79 	case VIDC_RESOURCE_VMEM: {
80 		struct hfi_resource_ocmem *res =
81 			(struct hfi_resource_ocmem *)&pkt->resource_data[0];
82 
83 		res->size = size;
84 		res->mem = addr;
85 		pkt->resource_type = HFI_RESOURCE_OCMEM;
86 		pkt->hdr.size += sizeof(*res);
87 		break;
88 	}
89 	case VIDC_RESOURCE_NONE:
90 	default:
91 		return -ENOTSUPP;
92 	}
93 
94 	return 0;
95 }
96 
97 int pkt_sys_unset_resource(struct hfi_sys_release_resource_pkt *pkt, u32 id,
98 			   u32 size, void *cookie)
99 {
100 	pkt->hdr.size = sizeof(*pkt);
101 	pkt->hdr.pkt_type = HFI_CMD_SYS_RELEASE_RESOURCE;
102 	pkt->resource_handle = hash32_ptr(cookie);
103 
104 	switch (id) {
105 	case VIDC_RESOURCE_OCMEM:
106 	case VIDC_RESOURCE_VMEM:
107 		pkt->resource_type = HFI_RESOURCE_OCMEM;
108 		break;
109 	case VIDC_RESOURCE_NONE:
110 		break;
111 	default:
112 		return -ENOTSUPP;
113 	}
114 
115 	return 0;
116 }
117 
118 void pkt_sys_ping(struct hfi_sys_ping_pkt *pkt, u32 cookie)
119 {
120 	pkt->hdr.size = sizeof(*pkt);
121 	pkt->hdr.pkt_type = HFI_CMD_SYS_PING;
122 	pkt->client_data = cookie;
123 }
124 
125 void pkt_sys_power_control(struct hfi_sys_set_property_pkt *pkt, u32 enable)
126 {
127 	struct hfi_enable *hfi = (struct hfi_enable *)&pkt->data[1];
128 
129 	pkt->hdr.size = struct_size(pkt, data, 1) + sizeof(*hfi);
130 	pkt->hdr.pkt_type = HFI_CMD_SYS_SET_PROPERTY;
131 	pkt->num_properties = 1;
132 	pkt->data[0] = HFI_PROPERTY_SYS_CODEC_POWER_PLANE_CTRL;
133 	hfi->enable = enable;
134 }
135 
136 int pkt_sys_ssr_cmd(struct hfi_sys_test_ssr_pkt *pkt, u32 trigger_type)
137 {
138 	switch (trigger_type) {
139 	case HFI_TEST_SSR_SW_ERR_FATAL:
140 	case HFI_TEST_SSR_SW_DIV_BY_ZERO:
141 	case HFI_TEST_SSR_HW_WDOG_IRQ:
142 		break;
143 	default:
144 		return -EINVAL;
145 	}
146 
147 	pkt->hdr.size = sizeof(*pkt);
148 	pkt->hdr.pkt_type = HFI_CMD_SYS_TEST_SSR;
149 	pkt->trigger_type = trigger_type;
150 
151 	return 0;
152 }
153 
154 void pkt_sys_image_version(struct hfi_sys_get_property_pkt *pkt)
155 {
156 	pkt->hdr.size = sizeof(*pkt);
157 	pkt->hdr.pkt_type = HFI_CMD_SYS_GET_PROPERTY;
158 	pkt->num_properties = 1;
159 	pkt->data[0] = HFI_PROPERTY_SYS_IMAGE_VERSION;
160 }
161 
162 int pkt_session_init(struct hfi_session_init_pkt *pkt, void *cookie,
163 		     u32 session_type, u32 codec)
164 {
165 	if (!pkt || !cookie || !codec)
166 		return -EINVAL;
167 
168 	pkt->shdr.hdr.size = sizeof(*pkt);
169 	pkt->shdr.hdr.pkt_type = HFI_CMD_SYS_SESSION_INIT;
170 	pkt->shdr.session_id = hash32_ptr(cookie);
171 	pkt->session_domain = session_type;
172 	pkt->session_codec = codec;
173 
174 	return 0;
175 }
176 
177 void pkt_session_cmd(struct hfi_session_pkt *pkt, u32 pkt_type, void *cookie)
178 {
179 	pkt->shdr.hdr.size = sizeof(*pkt);
180 	pkt->shdr.hdr.pkt_type = pkt_type;
181 	pkt->shdr.session_id = hash32_ptr(cookie);
182 }
183 
184 int pkt_session_set_buffers(struct hfi_session_set_buffers_pkt *pkt,
185 			    void *cookie, struct hfi_buffer_desc *bd)
186 {
187 	unsigned int i;
188 
189 	if (!cookie || !pkt || !bd)
190 		return -EINVAL;
191 
192 	pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_BUFFERS;
193 	pkt->shdr.session_id = hash32_ptr(cookie);
194 	pkt->buffer_size = bd->buffer_size;
195 	pkt->min_buffer_size = bd->buffer_size;
196 	pkt->num_buffers = bd->num_buffers;
197 
198 	if (bd->buffer_type == HFI_BUFFER_OUTPUT ||
199 	    bd->buffer_type == HFI_BUFFER_OUTPUT2) {
200 		struct hfi_buffer_info *bi;
201 
202 		pkt->extradata_size = bd->extradata_size;
203 		pkt->shdr.hdr.size = sizeof(*pkt) +
204 			bd->num_buffers * sizeof(*bi);
205 		bi = (struct hfi_buffer_info *)pkt->buffer_info;
206 		for (i = 0; i < pkt->num_buffers; i++) {
207 			bi->buffer_addr = bd->device_addr;
208 			bi->extradata_addr = bd->extradata_addr;
209 		}
210 	} else {
211 		pkt->extradata_size = 0;
212 		pkt->shdr.hdr.size = struct_size(pkt, buffer_info,
213 						 bd->num_buffers);
214 		for (i = 0; i < pkt->num_buffers; i++)
215 			pkt->buffer_info[i] = bd->device_addr;
216 	}
217 
218 	pkt->buffer_type = bd->buffer_type;
219 
220 	return 0;
221 }
222 
223 int pkt_session_unset_buffers(struct hfi_session_release_buffer_pkt *pkt,
224 			      void *cookie, struct hfi_buffer_desc *bd)
225 {
226 	unsigned int i;
227 
228 	if (!cookie || !pkt || !bd)
229 		return -EINVAL;
230 
231 	pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_RELEASE_BUFFERS;
232 	pkt->shdr.session_id = hash32_ptr(cookie);
233 	pkt->buffer_size = bd->buffer_size;
234 	pkt->num_buffers = bd->num_buffers;
235 
236 	if (bd->buffer_type == HFI_BUFFER_OUTPUT ||
237 	    bd->buffer_type == HFI_BUFFER_OUTPUT2) {
238 		struct hfi_buffer_info *bi;
239 
240 		bi = (struct hfi_buffer_info *)pkt->buffer_info;
241 		for (i = 0; i < pkt->num_buffers; i++) {
242 			bi->buffer_addr = bd->device_addr;
243 			bi->extradata_addr = bd->extradata_addr;
244 		}
245 		pkt->shdr.hdr.size =
246 				sizeof(struct hfi_session_set_buffers_pkt) +
247 				bd->num_buffers * sizeof(*bi);
248 	} else {
249 		for (i = 0; i < pkt->num_buffers; i++)
250 			pkt->buffer_info[i] = bd->device_addr;
251 
252 		pkt->extradata_size = 0;
253 		pkt->shdr.hdr.size =
254 			struct_size((struct hfi_session_set_buffers_pkt *)0,
255 				    buffer_info, bd->num_buffers);
256 	}
257 
258 	pkt->response_req = bd->response_required;
259 	pkt->buffer_type = bd->buffer_type;
260 
261 	return 0;
262 }
263 
264 int pkt_session_etb_decoder(struct hfi_session_empty_buffer_compressed_pkt *pkt,
265 			    void *cookie, struct hfi_frame_data *in_frame)
266 {
267 	if (!cookie)
268 		return -EINVAL;
269 
270 	pkt->shdr.hdr.size = sizeof(*pkt);
271 	pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_EMPTY_BUFFER;
272 	pkt->shdr.session_id = hash32_ptr(cookie);
273 	pkt->time_stamp_hi = upper_32_bits(in_frame->timestamp);
274 	pkt->time_stamp_lo = lower_32_bits(in_frame->timestamp);
275 	pkt->flags = in_frame->flags;
276 	pkt->mark_target = in_frame->mark_target;
277 	pkt->mark_data = in_frame->mark_data;
278 	pkt->offset = in_frame->offset;
279 	pkt->alloc_len = in_frame->alloc_len;
280 	pkt->filled_len = in_frame->filled_len;
281 	pkt->input_tag = in_frame->clnt_data;
282 	pkt->packet_buffer = in_frame->device_addr;
283 
284 	return 0;
285 }
286 
287 int pkt_session_etb_encoder(
288 		struct hfi_session_empty_buffer_uncompressed_plane0_pkt *pkt,
289 		void *cookie, struct hfi_frame_data *in_frame)
290 {
291 	if (!cookie || !in_frame->device_addr)
292 		return -EINVAL;
293 
294 	pkt->shdr.hdr.size = sizeof(*pkt);
295 	pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_EMPTY_BUFFER;
296 	pkt->shdr.session_id = hash32_ptr(cookie);
297 	pkt->view_id = 0;
298 	pkt->time_stamp_hi = upper_32_bits(in_frame->timestamp);
299 	pkt->time_stamp_lo = lower_32_bits(in_frame->timestamp);
300 	pkt->flags = in_frame->flags;
301 	pkt->mark_target = in_frame->mark_target;
302 	pkt->mark_data = in_frame->mark_data;
303 	pkt->offset = in_frame->offset;
304 	pkt->alloc_len = in_frame->alloc_len;
305 	pkt->filled_len = in_frame->filled_len;
306 	pkt->input_tag = in_frame->clnt_data;
307 	pkt->packet_buffer = in_frame->device_addr;
308 	pkt->extradata_buffer = in_frame->extradata_addr;
309 
310 	return 0;
311 }
312 
313 int pkt_session_ftb(struct hfi_session_fill_buffer_pkt *pkt, void *cookie,
314 		    struct hfi_frame_data *out_frame)
315 {
316 	if (!cookie || !out_frame || !out_frame->device_addr)
317 		return -EINVAL;
318 
319 	pkt->shdr.hdr.size = sizeof(*pkt);
320 	pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_FILL_BUFFER;
321 	pkt->shdr.session_id = hash32_ptr(cookie);
322 
323 	if (out_frame->buffer_type == HFI_BUFFER_OUTPUT)
324 		pkt->stream_id = 0;
325 	else if (out_frame->buffer_type == HFI_BUFFER_OUTPUT2)
326 		pkt->stream_id = 1;
327 
328 	pkt->output_tag = out_frame->clnt_data;
329 	pkt->packet_buffer = out_frame->device_addr;
330 	pkt->extradata_buffer = out_frame->extradata_addr;
331 	pkt->alloc_len = out_frame->alloc_len;
332 	pkt->filled_len = out_frame->filled_len;
333 	pkt->offset = out_frame->offset;
334 	pkt->data[0] = out_frame->extradata_size;
335 
336 	return 0;
337 }
338 
339 int pkt_session_parse_seq_header(
340 		struct hfi_session_parse_sequence_header_pkt *pkt,
341 		void *cookie, u32 seq_hdr, u32 seq_hdr_len)
342 {
343 	if (!cookie || !seq_hdr || !seq_hdr_len)
344 		return -EINVAL;
345 
346 	pkt->shdr.hdr.size = sizeof(*pkt);
347 	pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_PARSE_SEQUENCE_HEADER;
348 	pkt->shdr.session_id = hash32_ptr(cookie);
349 	pkt->header_len = seq_hdr_len;
350 	pkt->packet_buffer = seq_hdr;
351 
352 	return 0;
353 }
354 
355 int pkt_session_get_seq_hdr(struct hfi_session_get_sequence_header_pkt *pkt,
356 			    void *cookie, u32 seq_hdr, u32 seq_hdr_len)
357 {
358 	if (!cookie || !seq_hdr || !seq_hdr_len)
359 		return -EINVAL;
360 
361 	pkt->shdr.hdr.size = sizeof(*pkt);
362 	pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_GET_SEQUENCE_HEADER;
363 	pkt->shdr.session_id = hash32_ptr(cookie);
364 	pkt->buffer_len = seq_hdr_len;
365 	pkt->packet_buffer = seq_hdr;
366 
367 	return 0;
368 }
369 
370 int pkt_session_flush(struct hfi_session_flush_pkt *pkt, void *cookie, u32 type)
371 {
372 	switch (type) {
373 	case HFI_FLUSH_INPUT:
374 	case HFI_FLUSH_OUTPUT:
375 	case HFI_FLUSH_OUTPUT2:
376 	case HFI_FLUSH_ALL:
377 		break;
378 	default:
379 		return -EINVAL;
380 	}
381 
382 	pkt->shdr.hdr.size = sizeof(*pkt);
383 	pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_FLUSH;
384 	pkt->shdr.session_id = hash32_ptr(cookie);
385 	pkt->flush_type = type;
386 
387 	return 0;
388 }
389 
390 static int pkt_session_get_property_1x(struct hfi_session_get_property_pkt *pkt,
391 				       void *cookie, u32 ptype)
392 {
393 	switch (ptype) {
394 	case HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT:
395 	case HFI_PROPERTY_CONFIG_BUFFER_REQUIREMENTS:
396 		break;
397 	default:
398 		return -EINVAL;
399 	}
400 
401 	pkt->shdr.hdr.size = sizeof(*pkt);
402 	pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_GET_PROPERTY;
403 	pkt->shdr.session_id = hash32_ptr(cookie);
404 	pkt->num_properties = 1;
405 	pkt->data[0] = ptype;
406 
407 	return 0;
408 }
409 
410 static int pkt_session_set_property_1x(struct hfi_session_set_property_pkt *pkt,
411 				       void *cookie, u32 ptype, void *pdata)
412 {
413 	void *prop_data;
414 	int ret = 0;
415 
416 	if (!pkt || !cookie || !pdata)
417 		return -EINVAL;
418 
419 	prop_data = &pkt->data[1];
420 
421 	pkt->shdr.hdr.size = sizeof(*pkt);
422 	pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_PROPERTY;
423 	pkt->shdr.session_id = hash32_ptr(cookie);
424 	pkt->num_properties = 1;
425 	pkt->data[0] = ptype;
426 
427 	switch (ptype) {
428 	case HFI_PROPERTY_CONFIG_FRAME_RATE: {
429 		struct hfi_framerate *in = pdata, *frate = prop_data;
430 
431 		frate->buffer_type = in->buffer_type;
432 		frate->framerate = in->framerate;
433 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*frate);
434 		break;
435 	}
436 	case HFI_PROPERTY_PARAM_UNCOMPRESSED_FORMAT_SELECT: {
437 		struct hfi_uncompressed_format_select *in = pdata;
438 		struct hfi_uncompressed_format_select *hfi = prop_data;
439 
440 		hfi->buffer_type = in->buffer_type;
441 		hfi->format = in->format;
442 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*hfi);
443 		break;
444 	}
445 	case HFI_PROPERTY_PARAM_FRAME_SIZE: {
446 		struct hfi_framesize *in = pdata, *fsize = prop_data;
447 
448 		fsize->buffer_type = in->buffer_type;
449 		fsize->height = in->height;
450 		fsize->width = in->width;
451 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*fsize);
452 		break;
453 	}
454 	case HFI_PROPERTY_CONFIG_REALTIME: {
455 		struct hfi_enable *in = pdata, *en = prop_data;
456 
457 		en->enable = in->enable;
458 		pkt->shdr.hdr.size += sizeof(u32) * 2;
459 		break;
460 	}
461 	case HFI_PROPERTY_PARAM_BUFFER_COUNT_ACTUAL: {
462 		struct hfi_buffer_count_actual *in = pdata, *count = prop_data;
463 
464 		count->count_actual = in->count_actual;
465 		count->type = in->type;
466 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*count);
467 		break;
468 	}
469 	case HFI_PROPERTY_PARAM_BUFFER_SIZE_ACTUAL: {
470 		struct hfi_buffer_size_actual *in = pdata, *sz = prop_data;
471 
472 		sz->size = in->size;
473 		sz->type = in->type;
474 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*sz);
475 		break;
476 	}
477 	case HFI_PROPERTY_PARAM_BUFFER_DISPLAY_HOLD_COUNT_ACTUAL: {
478 		struct hfi_buffer_display_hold_count_actual *in = pdata;
479 		struct hfi_buffer_display_hold_count_actual *count = prop_data;
480 
481 		count->hold_count = in->hold_count;
482 		count->type = in->type;
483 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*count);
484 		break;
485 	}
486 	case HFI_PROPERTY_PARAM_NAL_STREAM_FORMAT_SELECT: {
487 		struct hfi_nal_stream_format_select *in = pdata;
488 		struct hfi_nal_stream_format_select *fmt = prop_data;
489 
490 		fmt->format = in->format;
491 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*fmt);
492 		break;
493 	}
494 	case HFI_PROPERTY_PARAM_VDEC_OUTPUT_ORDER: {
495 		u32 *in = pdata;
496 
497 		switch (*in) {
498 		case HFI_OUTPUT_ORDER_DECODE:
499 		case HFI_OUTPUT_ORDER_DISPLAY:
500 			break;
501 		default:
502 			ret = -EINVAL;
503 			break;
504 		}
505 
506 		pkt->data[1] = *in;
507 		pkt->shdr.hdr.size += sizeof(u32) * 2;
508 		break;
509 	}
510 	case HFI_PROPERTY_PARAM_VDEC_PICTURE_TYPE_DECODE: {
511 		struct hfi_enable_picture *in = pdata, *en = prop_data;
512 
513 		en->picture_type = in->picture_type;
514 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
515 		break;
516 	}
517 	case HFI_PROPERTY_PARAM_VDEC_OUTPUT2_KEEP_ASPECT_RATIO: {
518 		struct hfi_enable *in = pdata, *en = prop_data;
519 
520 		en->enable = in->enable;
521 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
522 		break;
523 	}
524 	case HFI_PROPERTY_PARAM_VDEC_ENABLE_SUFFICIENT_SEQCHANGE_EVENT:
525 	case HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER: {
526 		struct hfi_enable *in = pdata;
527 		struct hfi_enable *en = prop_data;
528 
529 		en->enable = in->enable;
530 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
531 		break;
532 	}
533 	case HFI_PROPERTY_PARAM_VDEC_MULTI_STREAM: {
534 		struct hfi_multi_stream *in = pdata, *multi = prop_data;
535 
536 		multi->buffer_type = in->buffer_type;
537 		multi->enable = in->enable;
538 		multi->width = in->width;
539 		multi->height = in->height;
540 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*multi);
541 		break;
542 	}
543 	case HFI_PROPERTY_PARAM_VDEC_DISPLAY_PICTURE_BUFFER_COUNT: {
544 		struct hfi_display_picture_buffer_count *in = pdata;
545 		struct hfi_display_picture_buffer_count *count = prop_data;
546 
547 		count->count = in->count;
548 		count->enable = in->enable;
549 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*count);
550 		break;
551 	}
552 	case HFI_PROPERTY_PARAM_DIVX_FORMAT: {
553 		u32 *in = pdata;
554 
555 		switch (*in) {
556 		case HFI_DIVX_FORMAT_4:
557 		case HFI_DIVX_FORMAT_5:
558 		case HFI_DIVX_FORMAT_6:
559 			break;
560 		default:
561 			ret = -EINVAL;
562 			break;
563 		}
564 
565 		pkt->data[1] = *in;
566 		pkt->shdr.hdr.size += sizeof(u32) * 2;
567 		break;
568 	}
569 	case HFI_PROPERTY_CONFIG_VDEC_MB_ERROR_MAP_REPORTING: {
570 		struct hfi_enable *in = pdata, *en = prop_data;
571 
572 		en->enable = in->enable;
573 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
574 		break;
575 	}
576 	case HFI_PROPERTY_PARAM_VDEC_CONTINUE_DATA_TRANSFER: {
577 		struct hfi_enable *in = pdata, *en = prop_data;
578 
579 		en->enable = in->enable;
580 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
581 		break;
582 	}
583 	case HFI_PROPERTY_PARAM_VDEC_THUMBNAIL_MODE: {
584 		struct hfi_enable *in = pdata, *en = prop_data;
585 
586 		en->enable = in->enable;
587 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
588 		break;
589 	}
590 	case HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER: {
591 		struct hfi_enable *in = pdata, *en = prop_data;
592 
593 		en->enable = in->enable;
594 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
595 		break;
596 	}
597 	case HFI_PROPERTY_CONFIG_VENC_REQUEST_SYNC_FRAME:
598 		pkt->shdr.hdr.size += sizeof(u32);
599 		break;
600 	case HFI_PROPERTY_PARAM_VENC_MPEG4_SHORT_HEADER:
601 		break;
602 	case HFI_PROPERTY_PARAM_VENC_MPEG4_AC_PREDICTION:
603 		break;
604 	case HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE: {
605 		struct hfi_bitrate *in = pdata, *brate = prop_data;
606 
607 		brate->bitrate = in->bitrate;
608 		brate->layer_id = in->layer_id;
609 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*brate);
610 		break;
611 	}
612 	case HFI_PROPERTY_CONFIG_VENC_MAX_BITRATE: {
613 		struct hfi_bitrate *in = pdata, *hfi = prop_data;
614 
615 		hfi->bitrate = in->bitrate;
616 		hfi->layer_id = in->layer_id;
617 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*hfi);
618 		break;
619 	}
620 	case HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT: {
621 		struct hfi_profile_level *in = pdata, *pl = prop_data;
622 
623 		pl->level = in->level;
624 		pl->profile = in->profile;
625 		if (pl->profile <= 0)
626 			/* Profile not supported, falling back to high */
627 			pl->profile = HFI_H264_PROFILE_HIGH;
628 
629 		if (!pl->level)
630 			/* Level not supported, falling back to 1 */
631 			pl->level = 1;
632 
633 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*pl);
634 		break;
635 	}
636 	case HFI_PROPERTY_PARAM_VENC_H264_ENTROPY_CONTROL: {
637 		struct hfi_h264_entropy_control *in = pdata, *hfi = prop_data;
638 
639 		hfi->entropy_mode = in->entropy_mode;
640 		if (hfi->entropy_mode == HFI_H264_ENTROPY_CABAC)
641 			hfi->cabac_model = in->cabac_model;
642 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*hfi);
643 		break;
644 	}
645 	case HFI_PROPERTY_PARAM_VENC_RATE_CONTROL: {
646 		u32 *in = pdata;
647 
648 		switch (*in) {
649 		case HFI_RATE_CONTROL_OFF:
650 		case HFI_RATE_CONTROL_CBR_CFR:
651 		case HFI_RATE_CONTROL_CBR_VFR:
652 		case HFI_RATE_CONTROL_VBR_CFR:
653 		case HFI_RATE_CONTROL_VBR_VFR:
654 		case HFI_RATE_CONTROL_CQ:
655 			break;
656 		default:
657 			ret = -EINVAL;
658 			break;
659 		}
660 
661 		pkt->data[1] = *in;
662 		pkt->shdr.hdr.size += sizeof(u32) * 2;
663 		break;
664 	}
665 	case HFI_PROPERTY_PARAM_VENC_MPEG4_TIME_RESOLUTION: {
666 		struct hfi_mpeg4_time_resolution *in = pdata, *res = prop_data;
667 
668 		res->time_increment_resolution = in->time_increment_resolution;
669 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*res);
670 		break;
671 	}
672 	case HFI_PROPERTY_PARAM_VENC_MPEG4_HEADER_EXTENSION: {
673 		struct hfi_mpeg4_header_extension *in = pdata, *ext = prop_data;
674 
675 		ext->header_extension = in->header_extension;
676 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ext);
677 		break;
678 	}
679 	case HFI_PROPERTY_PARAM_VENC_H264_DEBLOCK_CONTROL: {
680 		struct hfi_h264_db_control *in = pdata, *db = prop_data;
681 
682 		switch (in->mode) {
683 		case HFI_H264_DB_MODE_DISABLE:
684 		case HFI_H264_DB_MODE_SKIP_SLICE_BOUNDARY:
685 		case HFI_H264_DB_MODE_ALL_BOUNDARY:
686 			break;
687 		default:
688 			ret = -EINVAL;
689 			break;
690 		}
691 
692 		db->mode = in->mode;
693 		db->slice_alpha_offset = in->slice_alpha_offset;
694 		db->slice_beta_offset = in->slice_beta_offset;
695 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*db);
696 		break;
697 	}
698 	case HFI_PROPERTY_PARAM_VENC_SESSION_QP: {
699 		struct hfi_quantization *in = pdata, *quant = prop_data;
700 
701 		quant->qp_i = in->qp_i;
702 		quant->qp_p = in->qp_p;
703 		quant->qp_b = in->qp_b;
704 		quant->layer_id = in->layer_id;
705 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*quant);
706 		break;
707 	}
708 	case HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE: {
709 		struct hfi_quantization_range *in = pdata, *range = prop_data;
710 		u32 min_qp, max_qp;
711 
712 		min_qp = in->min_qp;
713 		max_qp = in->max_qp;
714 
715 		/* We'll be packing in the qp, so make sure we
716 		 * won't be losing data when masking
717 		 */
718 		if (min_qp > 0xff || max_qp > 0xff) {
719 			ret = -ERANGE;
720 			break;
721 		}
722 
723 		/* When creating the packet, pack the qp value as
724 		 * 0xiippbb, where ii = qp range for I-frames,
725 		 * pp = qp range for P-frames, etc.
726 		 */
727 		range->min_qp = min_qp | min_qp << 8 | min_qp << 16;
728 		range->max_qp = max_qp | max_qp << 8 | max_qp << 16;
729 		range->layer_id = in->layer_id;
730 
731 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*range);
732 		break;
733 	}
734 	case HFI_PROPERTY_PARAM_VENC_VC1_PERF_CFG: {
735 		struct hfi_vc1e_perf_cfg_type *in = pdata, *perf = prop_data;
736 
737 		memcpy(perf->search_range_x_subsampled,
738 		       in->search_range_x_subsampled,
739 		       sizeof(perf->search_range_x_subsampled));
740 		memcpy(perf->search_range_y_subsampled,
741 		       in->search_range_y_subsampled,
742 		       sizeof(perf->search_range_y_subsampled));
743 
744 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*perf);
745 		break;
746 	}
747 	case HFI_PROPERTY_PARAM_VENC_MAX_NUM_B_FRAMES: {
748 		struct hfi_max_num_b_frames *bframes = prop_data;
749 		u32 *in = pdata;
750 
751 		bframes->max_num_b_frames = *in;
752 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*bframes);
753 		break;
754 	}
755 	case HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD: {
756 		struct hfi_intra_period *in = pdata, *intra = prop_data;
757 
758 		intra->pframes = in->pframes;
759 		intra->bframes = in->bframes;
760 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*intra);
761 		break;
762 	}
763 	case HFI_PROPERTY_CONFIG_VENC_IDR_PERIOD: {
764 		struct hfi_idr_period *in = pdata, *idr = prop_data;
765 
766 		idr->idr_period = in->idr_period;
767 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*idr);
768 		break;
769 	}
770 	case HFI_PROPERTY_PARAM_VDEC_CONCEAL_COLOR: {
771 		struct hfi_conceal_color *color = prop_data;
772 		u32 *in = pdata;
773 
774 		color->conceal_color = *in & 0xff;
775 		color->conceal_color |= ((*in >> 10) & 0xff) << 8;
776 		color->conceal_color |= ((*in >> 20) & 0xff) << 16;
777 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*color);
778 		break;
779 	}
780 	case HFI_PROPERTY_CONFIG_VPE_OPERATIONS: {
781 		struct hfi_operations_type *in = pdata, *ops = prop_data;
782 
783 		switch (in->rotation) {
784 		case HFI_ROTATE_NONE:
785 		case HFI_ROTATE_90:
786 		case HFI_ROTATE_180:
787 		case HFI_ROTATE_270:
788 			break;
789 		default:
790 			ret = -EINVAL;
791 			break;
792 		}
793 
794 		switch (in->flip) {
795 		case HFI_FLIP_NONE:
796 		case HFI_FLIP_HORIZONTAL:
797 		case HFI_FLIP_VERTICAL:
798 			break;
799 		default:
800 			ret = -EINVAL;
801 			break;
802 		}
803 
804 		ops->rotation = in->rotation;
805 		ops->flip = in->flip;
806 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ops);
807 		break;
808 	}
809 	case HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH: {
810 		struct hfi_intra_refresh *in = pdata, *intra = prop_data;
811 
812 		switch (in->mode) {
813 		case HFI_INTRA_REFRESH_NONE:
814 		case HFI_INTRA_REFRESH_ADAPTIVE:
815 		case HFI_INTRA_REFRESH_CYCLIC:
816 		case HFI_INTRA_REFRESH_CYCLIC_ADAPTIVE:
817 		case HFI_INTRA_REFRESH_RANDOM:
818 			break;
819 		default:
820 			ret = -EINVAL;
821 			break;
822 		}
823 
824 		intra->mode = in->mode;
825 		intra->air_mbs = in->air_mbs;
826 		intra->air_ref = in->air_ref;
827 		intra->cir_mbs = in->cir_mbs;
828 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*intra);
829 		break;
830 	}
831 	case HFI_PROPERTY_PARAM_VENC_MULTI_SLICE_CONTROL: {
832 		struct hfi_multi_slice_control *in = pdata, *multi = prop_data;
833 
834 		switch (in->multi_slice) {
835 		case HFI_MULTI_SLICE_OFF:
836 		case HFI_MULTI_SLICE_GOB:
837 		case HFI_MULTI_SLICE_BY_MB_COUNT:
838 		case HFI_MULTI_SLICE_BY_BYTE_COUNT:
839 			break;
840 		default:
841 			ret = -EINVAL;
842 			break;
843 		}
844 
845 		multi->multi_slice = in->multi_slice;
846 		multi->slice_size = in->slice_size;
847 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*multi);
848 		break;
849 	}
850 	case HFI_PROPERTY_PARAM_VENC_SLICE_DELIVERY_MODE: {
851 		struct hfi_enable *in = pdata, *en = prop_data;
852 
853 		en->enable = in->enable;
854 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
855 		break;
856 	}
857 	case HFI_PROPERTY_PARAM_VENC_H264_VUI_TIMING_INFO: {
858 		struct hfi_h264_vui_timing_info *in = pdata, *vui = prop_data;
859 
860 		vui->enable = in->enable;
861 		vui->fixed_framerate = in->fixed_framerate;
862 		vui->time_scale = in->time_scale;
863 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*vui);
864 		break;
865 	}
866 	case HFI_PROPERTY_CONFIG_VPE_DEINTERLACE: {
867 		struct hfi_enable *in = pdata, *en = prop_data;
868 
869 		en->enable = in->enable;
870 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
871 		break;
872 	}
873 	case HFI_PROPERTY_PARAM_VENC_H264_GENERATE_AUDNAL: {
874 		struct hfi_enable *in = pdata, *en = prop_data;
875 
876 		en->enable = in->enable;
877 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
878 		break;
879 	}
880 	case HFI_PROPERTY_PARAM_BUFFER_ALLOC_MODE: {
881 		struct hfi_buffer_alloc_mode *in = pdata, *mode = prop_data;
882 
883 		mode->type = in->type;
884 		mode->mode = in->mode;
885 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*mode);
886 		break;
887 	}
888 	case HFI_PROPERTY_PARAM_VDEC_FRAME_ASSEMBLY: {
889 		struct hfi_enable *in = pdata, *en = prop_data;
890 
891 		en->enable = in->enable;
892 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
893 		break;
894 	}
895 	case HFI_PROPERTY_PARAM_VENC_H264_VUI_BITSTREAM_RESTRC: {
896 		struct hfi_enable *in = pdata, *en = prop_data;
897 
898 		en->enable = in->enable;
899 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
900 		break;
901 	}
902 	case HFI_PROPERTY_PARAM_VENC_PRESERVE_TEXT_QUALITY: {
903 		struct hfi_enable *in = pdata, *en = prop_data;
904 
905 		en->enable = in->enable;
906 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
907 		break;
908 	}
909 	case HFI_PROPERTY_PARAM_VDEC_SCS_THRESHOLD: {
910 		struct hfi_scs_threshold *thres = prop_data;
911 		u32 *in = pdata;
912 
913 		thres->threshold_value = *in;
914 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*thres);
915 		break;
916 	}
917 	case HFI_PROPERTY_PARAM_MVC_BUFFER_LAYOUT: {
918 		struct hfi_mvc_buffer_layout_descp_type *in = pdata;
919 		struct hfi_mvc_buffer_layout_descp_type *mvc = prop_data;
920 
921 		switch (in->layout_type) {
922 		case HFI_MVC_BUFFER_LAYOUT_TOP_BOTTOM:
923 		case HFI_MVC_BUFFER_LAYOUT_SEQ:
924 			break;
925 		default:
926 			ret = -EINVAL;
927 			break;
928 		}
929 
930 		mvc->layout_type = in->layout_type;
931 		mvc->bright_view_first = in->bright_view_first;
932 		mvc->ngap = in->ngap;
933 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*mvc);
934 		break;
935 	}
936 	case HFI_PROPERTY_PARAM_VENC_LTRMODE: {
937 		struct hfi_ltr_mode *in = pdata, *ltr = prop_data;
938 
939 		switch (in->ltr_mode) {
940 		case HFI_LTR_MODE_DISABLE:
941 		case HFI_LTR_MODE_MANUAL:
942 		case HFI_LTR_MODE_PERIODIC:
943 			break;
944 		default:
945 			ret = -EINVAL;
946 			break;
947 		}
948 
949 		ltr->ltr_mode = in->ltr_mode;
950 		ltr->ltr_count = in->ltr_count;
951 		ltr->trust_mode = in->trust_mode;
952 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ltr);
953 		break;
954 	}
955 	case HFI_PROPERTY_CONFIG_VENC_USELTRFRAME: {
956 		struct hfi_ltr_use *in = pdata, *ltr_use = prop_data;
957 
958 		ltr_use->frames = in->frames;
959 		ltr_use->ref_ltr = in->ref_ltr;
960 		ltr_use->use_constrnt = in->use_constrnt;
961 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ltr_use);
962 		break;
963 	}
964 	case HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME: {
965 		struct hfi_ltr_mark *in = pdata, *ltr_mark = prop_data;
966 
967 		ltr_mark->mark_frame = in->mark_frame;
968 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ltr_mark);
969 		break;
970 	}
971 	case HFI_PROPERTY_PARAM_VENC_HIER_P_MAX_NUM_ENH_LAYER: {
972 		u32 *in = pdata;
973 
974 		pkt->data[1] = *in;
975 		pkt->shdr.hdr.size += sizeof(u32) * 2;
976 		break;
977 	}
978 	case HFI_PROPERTY_CONFIG_VENC_HIER_P_ENH_LAYER: {
979 		u32 *in = pdata;
980 
981 		pkt->data[1] = *in;
982 		pkt->shdr.hdr.size += sizeof(u32) * 2;
983 		break;
984 	}
985 	case HFI_PROPERTY_PARAM_VENC_DISABLE_RC_TIMESTAMP: {
986 		struct hfi_enable *in = pdata, *en = prop_data;
987 
988 		en->enable = in->enable;
989 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
990 		break;
991 	}
992 	case HFI_PROPERTY_PARAM_VENC_INITIAL_QP: {
993 		struct hfi_initial_quantization *in = pdata, *quant = prop_data;
994 
995 		quant->init_qp_enable = in->init_qp_enable;
996 		quant->qp_i = in->qp_i;
997 		quant->qp_p = in->qp_p;
998 		quant->qp_b = in->qp_b;
999 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*quant);
1000 		break;
1001 	}
1002 	case HFI_PROPERTY_PARAM_VPE_COLOR_SPACE_CONVERSION: {
1003 		struct hfi_vpe_color_space_conversion *in = pdata;
1004 		struct hfi_vpe_color_space_conversion *csc = prop_data;
1005 
1006 		memcpy(csc->csc_matrix, in->csc_matrix,
1007 		       sizeof(csc->csc_matrix));
1008 		memcpy(csc->csc_bias, in->csc_bias, sizeof(csc->csc_bias));
1009 		memcpy(csc->csc_limit, in->csc_limit, sizeof(csc->csc_limit));
1010 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*csc);
1011 		break;
1012 	}
1013 	case HFI_PROPERTY_PARAM_VENC_VPX_ERROR_RESILIENCE_MODE: {
1014 		struct hfi_enable *in = pdata, *en = prop_data;
1015 
1016 		en->enable = in->enable;
1017 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
1018 		break;
1019 	}
1020 	case HFI_PROPERTY_PARAM_VENC_H264_NAL_SVC_EXT: {
1021 		struct hfi_enable *in = pdata, *en = prop_data;
1022 
1023 		en->enable = in->enable;
1024 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
1025 		break;
1026 	}
1027 	case HFI_PROPERTY_CONFIG_VENC_PERF_MODE: {
1028 		u32 *in = pdata;
1029 
1030 		pkt->data[1] = *in;
1031 		pkt->shdr.hdr.size += sizeof(u32) * 2;
1032 		break;
1033 	}
1034 	case HFI_PROPERTY_PARAM_VENC_HIER_B_MAX_NUM_ENH_LAYER: {
1035 		u32 *in = pdata;
1036 
1037 		pkt->data[1] = *in;
1038 		pkt->shdr.hdr.size += sizeof(u32) * 2;
1039 		break;
1040 	}
1041 	case HFI_PROPERTY_PARAM_VDEC_NONCP_OUTPUT2: {
1042 		struct hfi_enable *in = pdata, *en = prop_data;
1043 
1044 		en->enable = in->enable;
1045 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
1046 		break;
1047 	}
1048 	case HFI_PROPERTY_PARAM_VENC_HIER_P_HYBRID_MODE: {
1049 		struct hfi_hybrid_hierp *in = pdata, *hierp = prop_data;
1050 
1051 		hierp->layers = in->layers;
1052 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*hierp);
1053 		break;
1054 	}
1055 	case HFI_PROPERTY_PARAM_UNCOMPRESSED_PLANE_ACTUAL_INFO: {
1056 		struct hfi_uncompressed_plane_actual_info *in = pdata;
1057 		struct hfi_uncompressed_plane_actual_info *info = prop_data;
1058 
1059 		info->buffer_type = in->buffer_type;
1060 		info->num_planes = in->num_planes;
1061 		info->plane_format[0] = in->plane_format[0];
1062 		if (in->num_planes > 1)
1063 			info->plane_format[1] = in->plane_format[1];
1064 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*info);
1065 		break;
1066 	}
1067 	case HFI_PROPERTY_PARAM_VENC_HDR10_PQ_SEI:
1068 		return -ENOTSUPP;
1069 
1070 	/* FOLLOWING PROPERTIES ARE NOT IMPLEMENTED IN CORE YET */
1071 	case HFI_PROPERTY_CONFIG_BUFFER_REQUIREMENTS:
1072 	case HFI_PROPERTY_CONFIG_PRIORITY:
1073 	case HFI_PROPERTY_CONFIG_BATCH_INFO:
1074 	case HFI_PROPERTY_SYS_IDLE_INDICATOR:
1075 	case HFI_PROPERTY_PARAM_UNCOMPRESSED_FORMAT_SUPPORTED:
1076 	case HFI_PROPERTY_PARAM_INTERLACE_FORMAT_SUPPORTED:
1077 	case HFI_PROPERTY_PARAM_CHROMA_SITE:
1078 	case HFI_PROPERTY_PARAM_PROPERTIES_SUPPORTED:
1079 	case HFI_PROPERTY_PARAM_PROFILE_LEVEL_SUPPORTED:
1080 	case HFI_PROPERTY_PARAM_CAPABILITY_SUPPORTED:
1081 	case HFI_PROPERTY_PARAM_NAL_STREAM_FORMAT_SUPPORTED:
1082 	case HFI_PROPERTY_PARAM_MULTI_VIEW_FORMAT:
1083 	case HFI_PROPERTY_PARAM_MAX_SEQUENCE_HEADER_SIZE:
1084 	case HFI_PROPERTY_PARAM_CODEC_SUPPORTED:
1085 	case HFI_PROPERTY_PARAM_VDEC_MULTI_VIEW_SELECT:
1086 	case HFI_PROPERTY_PARAM_VDEC_MB_QUANTIZATION:
1087 	case HFI_PROPERTY_PARAM_VDEC_NUM_CONCEALED_MB:
1088 	case HFI_PROPERTY_PARAM_VDEC_H264_ENTROPY_SWITCHING:
1089 	case HFI_PROPERTY_PARAM_VENC_MULTI_SLICE_INFO:
1090 	default:
1091 		return -EINVAL;
1092 	}
1093 
1094 	return ret;
1095 }
1096 
1097 static int
1098 pkt_session_get_property_3xx(struct hfi_session_get_property_pkt *pkt,
1099 			     void *cookie, u32 ptype)
1100 {
1101 	int ret = 0;
1102 
1103 	if (!pkt || !cookie)
1104 		return -EINVAL;
1105 
1106 	pkt->shdr.hdr.size = sizeof(struct hfi_session_get_property_pkt);
1107 	pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_GET_PROPERTY;
1108 	pkt->shdr.session_id = hash32_ptr(cookie);
1109 	pkt->num_properties = 1;
1110 
1111 	switch (ptype) {
1112 	case HFI_PROPERTY_CONFIG_VDEC_ENTROPY:
1113 		pkt->data[0] = HFI_PROPERTY_CONFIG_VDEC_ENTROPY;
1114 		break;
1115 	default:
1116 		ret = pkt_session_get_property_1x(pkt, cookie, ptype);
1117 		break;
1118 	}
1119 
1120 	return ret;
1121 }
1122 
1123 static int
1124 pkt_session_set_property_3xx(struct hfi_session_set_property_pkt *pkt,
1125 			     void *cookie, u32 ptype, void *pdata)
1126 {
1127 	void *prop_data;
1128 	int ret = 0;
1129 
1130 	if (!pkt || !cookie || !pdata)
1131 		return -EINVAL;
1132 
1133 	prop_data = &pkt->data[1];
1134 
1135 	pkt->shdr.hdr.size = sizeof(*pkt);
1136 	pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_PROPERTY;
1137 	pkt->shdr.session_id = hash32_ptr(cookie);
1138 	pkt->num_properties = 1;
1139 	pkt->data[0] = ptype;
1140 
1141 	/*
1142 	 * Any session set property which is different in 3XX packetization
1143 	 * should be added as a new case below. All unchanged session set
1144 	 * properties will be handled in the default case.
1145 	 */
1146 	switch (ptype) {
1147 	case HFI_PROPERTY_PARAM_VDEC_MULTI_STREAM: {
1148 		struct hfi_multi_stream *in = pdata;
1149 		struct hfi_multi_stream_3x *multi = prop_data;
1150 
1151 		multi->buffer_type = in->buffer_type;
1152 		multi->enable = in->enable;
1153 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*multi);
1154 		break;
1155 	}
1156 	case HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH: {
1157 		struct hfi_intra_refresh *in = pdata;
1158 		struct hfi_intra_refresh_3x *intra = prop_data;
1159 
1160 		switch (in->mode) {
1161 		case HFI_INTRA_REFRESH_NONE:
1162 		case HFI_INTRA_REFRESH_ADAPTIVE:
1163 		case HFI_INTRA_REFRESH_CYCLIC:
1164 		case HFI_INTRA_REFRESH_CYCLIC_ADAPTIVE:
1165 		case HFI_INTRA_REFRESH_RANDOM:
1166 			break;
1167 		default:
1168 			ret = -EINVAL;
1169 			break;
1170 		}
1171 
1172 		intra->mode = in->mode;
1173 		intra->mbs = in->cir_mbs;
1174 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*intra);
1175 		break;
1176 	}
1177 	case HFI_PROPERTY_PARAM_VDEC_CONTINUE_DATA_TRANSFER:
1178 		/* for 3xx fw version session_continue is used */
1179 		break;
1180 	default:
1181 		ret = pkt_session_set_property_1x(pkt, cookie, ptype, pdata);
1182 		break;
1183 	}
1184 
1185 	return ret;
1186 }
1187 
1188 static int
1189 pkt_session_set_property_4xx(struct hfi_session_set_property_pkt *pkt,
1190 			     void *cookie, u32 ptype, void *pdata)
1191 {
1192 	void *prop_data;
1193 
1194 	if (!pkt || !cookie || !pdata)
1195 		return -EINVAL;
1196 
1197 	prop_data = &pkt->data[1];
1198 
1199 	pkt->shdr.hdr.size = sizeof(*pkt);
1200 	pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_PROPERTY;
1201 	pkt->shdr.session_id = hash32_ptr(cookie);
1202 	pkt->num_properties = 1;
1203 	pkt->data[0] = ptype;
1204 
1205 	/*
1206 	 * Any session set property which is different in 3XX packetization
1207 	 * should be added as a new case below. All unchanged session set
1208 	 * properties will be handled in the default case.
1209 	 */
1210 	switch (ptype) {
1211 	case HFI_PROPERTY_PARAM_BUFFER_COUNT_ACTUAL: {
1212 		struct hfi_buffer_count_actual *in = pdata;
1213 		struct hfi_buffer_count_actual_4xx *count = prop_data;
1214 
1215 		count->count_actual = in->count_actual;
1216 		count->type = in->type;
1217 		count->count_min_host = in->count_actual;
1218 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*count);
1219 		break;
1220 	}
1221 	case HFI_PROPERTY_PARAM_WORK_MODE: {
1222 		struct hfi_video_work_mode *in = pdata, *wm = prop_data;
1223 
1224 		wm->video_work_mode = in->video_work_mode;
1225 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*wm);
1226 		break;
1227 	}
1228 	case HFI_PROPERTY_CONFIG_VIDEOCORES_USAGE: {
1229 		struct hfi_videocores_usage_type *in = pdata, *cu = prop_data;
1230 
1231 		cu->video_core_enable_mask = in->video_core_enable_mask;
1232 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*cu);
1233 		break;
1234 	}
1235 	case HFI_PROPERTY_PARAM_VENC_HDR10_PQ_SEI: {
1236 		struct hfi_hdr10_pq_sei *in = pdata, *hdr10 = prop_data;
1237 
1238 		memcpy(hdr10, in, sizeof(*hdr10));
1239 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*hdr10);
1240 		break;
1241 	}
1242 	case HFI_PROPERTY_PARAM_VDEC_CONCEAL_COLOR: {
1243 		struct hfi_conceal_color_v4 *color = prop_data;
1244 		u32 *in = pdata;
1245 
1246 		color->conceal_color_8bit = *in & 0xff;
1247 		color->conceal_color_8bit |= ((*in >> 10) & 0xff) << 8;
1248 		color->conceal_color_8bit |= ((*in >> 20) & 0xff) << 16;
1249 		color->conceal_color_10bit = *in;
1250 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*color);
1251 		break;
1252 	}
1253 
1254 	case HFI_PROPERTY_PARAM_VENC_H264_TRANSFORM_8X8: {
1255 		struct hfi_h264_8x8_transform *in = pdata, *tm = prop_data;
1256 
1257 		tm->enable_type = in->enable_type;
1258 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*tm);
1259 		break;
1260 	}
1261 	case HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2: {
1262 		struct hfi_quantization_range_v2 *in = pdata, *range = prop_data;
1263 		u32 min_qp, max_qp;
1264 
1265 		min_qp = in->min_qp.qp_packed;
1266 		max_qp = in->max_qp.qp_packed;
1267 
1268 		/* We'll be packing in the qp, so make sure we
1269 		 * won't be losing data when masking
1270 		 */
1271 		if (min_qp > 0xff || max_qp > 0xff)
1272 			return -ERANGE;
1273 
1274 		range->min_qp.layer_id = 0xFF;
1275 		range->max_qp.layer_id = 0xFF;
1276 		range->min_qp.qp_packed = (min_qp & 0xFF) | ((min_qp & 0xFF) << 8) |
1277 			((min_qp & 0xFF) << 16);
1278 		range->max_qp.qp_packed = (max_qp & 0xFF) | ((max_qp & 0xFF) << 8) |
1279 			((max_qp & 0xFF) << 16);
1280 		range->min_qp.enable = 7;
1281 		range->max_qp.enable = 7;
1282 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*range);
1283 		break;
1284 	}
1285 	case HFI_PROPERTY_CONFIG_VENC_MAX_BITRATE:
1286 	case HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER:
1287 	case HFI_PROPERTY_PARAM_BUFFER_ALLOC_MODE:
1288 	case HFI_PROPERTY_PARAM_VENC_SESSION_QP:
1289 	case HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE:
1290 		/* not implemented on Venus 4xx */
1291 		return -ENOTSUPP;
1292 	default:
1293 		return pkt_session_set_property_3xx(pkt, cookie, ptype, pdata);
1294 	}
1295 
1296 	return 0;
1297 }
1298 
1299 static int
1300 pkt_session_set_property_6xx(struct hfi_session_set_property_pkt *pkt,
1301 			     void *cookie, u32 ptype, void *pdata)
1302 {
1303 	void *prop_data;
1304 
1305 	if (!pkt || !cookie || !pdata)
1306 		return -EINVAL;
1307 
1308 	prop_data = &pkt->data[1];
1309 
1310 	pkt->shdr.hdr.size = sizeof(*pkt);
1311 	pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_PROPERTY;
1312 	pkt->shdr.session_id = hash32_ptr(cookie);
1313 	pkt->num_properties = 1;
1314 	pkt->data[0] = ptype;
1315 
1316 	switch (ptype) {
1317 	case HFI_PROPERTY_PARAM_UNCOMPRESSED_PLANE_ACTUAL_CONSTRAINTS_INFO: {
1318 		struct hfi_uncompressed_plane_actual_constraints_info *in = pdata;
1319 		struct hfi_uncompressed_plane_actual_constraints_info *info = prop_data;
1320 
1321 		info->buffer_type = in->buffer_type;
1322 		info->num_planes = in->num_planes;
1323 		info->plane_format[0] = in->plane_format[0];
1324 		if (in->num_planes > 1)
1325 			info->plane_format[1] = in->plane_format[1];
1326 
1327 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*info);
1328 		break;
1329 	}
1330 	case HFI_PROPERTY_CONFIG_HEIC_FRAME_QUALITY: {
1331 		struct hfi_heic_frame_quality *in = pdata, *cq = prop_data;
1332 
1333 		cq->frame_quality = in->frame_quality;
1334 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*cq);
1335 		break;
1336 	}
1337 	case HFI_PROPERTY_PARAM_WORK_ROUTE: {
1338 		struct hfi_video_work_route *in = pdata, *wr = prop_data;
1339 
1340 		wr->video_work_route = in->video_work_route;
1341 		pkt->shdr.hdr.size += sizeof(u32) + sizeof(*wr);
1342 		break;
1343 	}
1344 	default:
1345 		return pkt_session_set_property_4xx(pkt, cookie, ptype, pdata);
1346 	}
1347 
1348 	return 0;
1349 }
1350 
1351 int pkt_session_get_property(struct hfi_session_get_property_pkt *pkt,
1352 			     void *cookie, u32 ptype)
1353 {
1354 	if (hfi_ver == HFI_VERSION_1XX)
1355 		return pkt_session_get_property_1x(pkt, cookie, ptype);
1356 
1357 	return pkt_session_get_property_3xx(pkt, cookie, ptype);
1358 }
1359 
1360 int pkt_session_set_property(struct hfi_session_set_property_pkt *pkt,
1361 			     void *cookie, u32 ptype, void *pdata)
1362 {
1363 	if (hfi_ver == HFI_VERSION_1XX)
1364 		return pkt_session_set_property_1x(pkt, cookie, ptype, pdata);
1365 
1366 	if (hfi_ver == HFI_VERSION_3XX)
1367 		return pkt_session_set_property_3xx(pkt, cookie, ptype, pdata);
1368 
1369 	if (hfi_ver == HFI_VERSION_4XX)
1370 		return pkt_session_set_property_4xx(pkt, cookie, ptype, pdata);
1371 
1372 	return pkt_session_set_property_6xx(pkt, cookie, ptype, pdata);
1373 }
1374 
1375 void pkt_set_version(enum hfi_version version)
1376 {
1377 	hfi_ver = version;
1378 }
1379