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