blob: b15baaa5d2985554eee13d7b36ff30748c1cc278 [file] [log] [blame]
Srinu Gorlecf8c6752018-01-19 18:36:13 +05301/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13#include <linux/errno.h>
14#include <linux/log2.h>
15#include <linux/hash.h>
16#include "hfi_packetization.h"
17#include "msm_vidc_debug.h"
18
19/* Set up look-up tables to convert HAL_* to HFI_*.
20 *
21 * The tables below mostly take advantage of the fact that most
22 * HAL_* types are defined bitwise. So if we index them normally
23 * when declaring the tables, we end up with huge arrays with wasted
24 * space. So before indexing them, we apply log2 to use a more
25 * sensible index.
26 */
27static int profile_table[] = {
28 [ilog2(HAL_H264_PROFILE_BASELINE)] = HFI_H264_PROFILE_BASELINE,
29 [ilog2(HAL_H264_PROFILE_MAIN)] = HFI_H264_PROFILE_MAIN,
30 [ilog2(HAL_H264_PROFILE_HIGH)] = HFI_H264_PROFILE_HIGH,
31 [ilog2(HAL_H264_PROFILE_CONSTRAINED_BASE)] =
32 HFI_H264_PROFILE_CONSTRAINED_BASE,
33 [ilog2(HAL_H264_PROFILE_CONSTRAINED_HIGH)] =
34 HFI_H264_PROFILE_CONSTRAINED_HIGH,
35 [ilog2(HAL_VPX_PROFILE_VERSION_1)] = HFI_VPX_PROFILE_VERSION_1,
36 [ilog2(HAL_MVC_PROFILE_STEREO_HIGH)] = HFI_H264_PROFILE_STEREO_HIGH,
37};
38
39static int entropy_mode[] = {
40 [ilog2(HAL_H264_ENTROPY_CAVLC)] = HFI_H264_ENTROPY_CAVLC,
41 [ilog2(HAL_H264_ENTROPY_CABAC)] = HFI_H264_ENTROPY_CABAC,
42};
43
44static int cabac_model[] = {
45 [ilog2(HAL_H264_CABAC_MODEL_0)] = HFI_H264_CABAC_MODEL_0,
46 [ilog2(HAL_H264_CABAC_MODEL_1)] = HFI_H264_CABAC_MODEL_1,
47 [ilog2(HAL_H264_CABAC_MODEL_2)] = HFI_H264_CABAC_MODEL_2,
48};
49
50static int statistics_mode[] = {
51 [ilog2(HAL_STATISTICS_MODE_DEFAULT)] = HFI_STATISTICS_MODE_DEFAULT,
52 [ilog2(HAL_STATISTICS_MODE_1)] = HFI_STATISTICS_MODE_1,
53 [ilog2(HAL_STATISTICS_MODE_2)] = HFI_STATISTICS_MODE_2,
54 [ilog2(HAL_STATISTICS_MODE_3)] = HFI_STATISTICS_MODE_3,
55};
56
57static int color_format[] = {
58 [ilog2(HAL_COLOR_FORMAT_MONOCHROME)] = HFI_COLOR_FORMAT_MONOCHROME,
59 [ilog2(HAL_COLOR_FORMAT_NV12)] = HFI_COLOR_FORMAT_NV12,
60 [ilog2(HAL_COLOR_FORMAT_NV21)] = HFI_COLOR_FORMAT_NV21,
61 [ilog2(HAL_COLOR_FORMAT_NV12_4x4TILE)] = HFI_COLOR_FORMAT_NV12_4x4TILE,
62 [ilog2(HAL_COLOR_FORMAT_NV21_4x4TILE)] = HFI_COLOR_FORMAT_NV21_4x4TILE,
63 [ilog2(HAL_COLOR_FORMAT_YUYV)] = HFI_COLOR_FORMAT_YUYV,
64 [ilog2(HAL_COLOR_FORMAT_YVYU)] = HFI_COLOR_FORMAT_YVYU,
65 [ilog2(HAL_COLOR_FORMAT_UYVY)] = HFI_COLOR_FORMAT_UYVY,
66 [ilog2(HAL_COLOR_FORMAT_VYUY)] = HFI_COLOR_FORMAT_VYUY,
67 [ilog2(HAL_COLOR_FORMAT_RGB565)] = HFI_COLOR_FORMAT_RGB565,
68 [ilog2(HAL_COLOR_FORMAT_BGR565)] = HFI_COLOR_FORMAT_BGR565,
69 [ilog2(HAL_COLOR_FORMAT_RGB888)] = HFI_COLOR_FORMAT_RGB888,
70 [ilog2(HAL_COLOR_FORMAT_BGR888)] = HFI_COLOR_FORMAT_BGR888,
71 [ilog2(HAL_COLOR_FORMAT_RGBA8888)] = HFI_COLOR_FORMAT_RGBA8888,
72 /* UBWC Color formats*/
73 [ilog2(HAL_COLOR_FORMAT_NV12_UBWC)] = HFI_COLOR_FORMAT_NV12_UBWC,
74 [ilog2(HAL_COLOR_FORMAT_NV12_TP10_UBWC)] =
75 HFI_COLOR_FORMAT_YUV420_TP10_UBWC,
76 [ilog2(HAL_COLOR_FORMAT_RGBA8888_UBWC)] =
77 HFI_COLOR_FORMAT_RGBA8888_UBWC,
78};
79
80static int nal_type[] = {
81 [ilog2(HAL_NAL_FORMAT_STARTCODES)] = HFI_NAL_FORMAT_STARTCODES,
82 [ilog2(HAL_NAL_FORMAT_ONE_NAL_PER_BUFFER)] =
83 HFI_NAL_FORMAT_ONE_NAL_PER_BUFFER,
84 [ilog2(HAL_NAL_FORMAT_ONE_BYTE_LENGTH)] =
85 HFI_NAL_FORMAT_ONE_BYTE_LENGTH,
86 [ilog2(HAL_NAL_FORMAT_TWO_BYTE_LENGTH)] =
87 HFI_NAL_FORMAT_TWO_BYTE_LENGTH,
88 [ilog2(HAL_NAL_FORMAT_FOUR_BYTE_LENGTH)] =
89 HFI_NAL_FORMAT_FOUR_BYTE_LENGTH,
90};
91
92static inline int hal_to_hfi_type(int property, int hal_type)
93{
94 if (hal_type <= 0 || roundup_pow_of_two(hal_type) != hal_type) {
95 /* Not a power of 2, it's not going
96 * to be in any of the tables anyway
97 */
98 return -EINVAL;
99 }
100
101 if (hal_type)
102 hal_type = ilog2(hal_type);
103
104 switch (property) {
105 case HAL_PARAM_PROFILE_LEVEL_CURRENT:
106 return (hal_type >= ARRAY_SIZE(profile_table)) ?
107 -ENOTSUPP : profile_table[hal_type];
108 case HAL_PARAM_VENC_H264_ENTROPY_CONTROL:
109 return (hal_type >= ARRAY_SIZE(entropy_mode)) ?
110 -ENOTSUPP : entropy_mode[hal_type];
111 case HAL_PARAM_VENC_H264_ENTROPY_CABAC_MODEL:
112 return (hal_type >= ARRAY_SIZE(cabac_model)) ?
113 -ENOTSUPP : cabac_model[hal_type];
114 case HAL_PARAM_UNCOMPRESSED_FORMAT_SELECT:
115 return (hal_type >= ARRAY_SIZE(color_format)) ?
116 -ENOTSUPP : color_format[hal_type];
117 case HAL_PARAM_NAL_STREAM_FORMAT_SELECT:
118 return (hal_type >= ARRAY_SIZE(nal_type)) ?
119 -ENOTSUPP : nal_type[hal_type];
120 case HAL_PARAM_VENC_MBI_STATISTICS_MODE:
121 return (hal_type >= ARRAY_SIZE(statistics_mode)) ?
122 -ENOTSUPP : statistics_mode[hal_type];
123 default:
124 return -ENOTSUPP;
125 }
126}
127
128u32 get_hfi_layout(enum hal_buffer_layout_type hal_buf_layout)
129{
130 u32 hfi_layout;
131
132 switch (hal_buf_layout) {
133 case HAL_BUFFER_LAYOUT_TOP_BOTTOM:
134 hfi_layout = HFI_MVC_BUFFER_LAYOUT_TOP_BOTTOM;
135 break;
136 case HAL_BUFFER_LAYOUT_SEQ:
137 hfi_layout = HFI_MVC_BUFFER_LAYOUT_SEQ;
138 break;
139 default:
140 dprintk(VIDC_ERR, "Invalid buffer layout: %#x\n",
141 hal_buf_layout);
142 hfi_layout = HFI_MVC_BUFFER_LAYOUT_SEQ;
143 break;
144 }
145 return hfi_layout;
146}
147
148enum hal_domain vidc_get_hal_domain(u32 hfi_domain)
149{
150 enum hal_domain hal_domain = 0;
151
152 switch (hfi_domain) {
153 case HFI_VIDEO_DOMAIN_VPE:
154 hal_domain = HAL_VIDEO_DOMAIN_VPE;
155 break;
156 case HFI_VIDEO_DOMAIN_ENCODER:
157 hal_domain = HAL_VIDEO_DOMAIN_ENCODER;
158 break;
159 case HFI_VIDEO_DOMAIN_DECODER:
160 hal_domain = HAL_VIDEO_DOMAIN_DECODER;
161 break;
162 default:
163 dprintk(VIDC_ERR, "%s: invalid domain %x\n",
164 __func__, hfi_domain);
165 hal_domain = 0;
166 break;
167 }
168 return hal_domain;
169}
170
171enum hal_video_codec vidc_get_hal_codec(u32 hfi_codec)
172{
173 enum hal_video_codec hal_codec = 0;
174
175 switch (hfi_codec) {
176 case HFI_VIDEO_CODEC_H264:
177 hal_codec = HAL_VIDEO_CODEC_H264;
178 break;
179 case HFI_VIDEO_CODEC_H263:
180 hal_codec = HAL_VIDEO_CODEC_H263;
181 break;
182 case HFI_VIDEO_CODEC_MPEG1:
183 hal_codec = HAL_VIDEO_CODEC_MPEG1;
184 break;
185 case HFI_VIDEO_CODEC_MPEG2:
186 hal_codec = HAL_VIDEO_CODEC_MPEG2;
187 break;
188 case HFI_VIDEO_CODEC_MPEG4:
189 hal_codec = HAL_VIDEO_CODEC_MPEG4;
190 break;
191 case HFI_VIDEO_CODEC_DIVX_311:
192 hal_codec = HAL_VIDEO_CODEC_DIVX_311;
193 break;
194 case HFI_VIDEO_CODEC_DIVX:
195 hal_codec = HAL_VIDEO_CODEC_DIVX;
196 break;
197 case HFI_VIDEO_CODEC_VC1:
198 hal_codec = HAL_VIDEO_CODEC_VC1;
199 break;
200 case HFI_VIDEO_CODEC_SPARK:
201 hal_codec = HAL_VIDEO_CODEC_SPARK;
202 break;
203 case HFI_VIDEO_CODEC_VP8:
204 hal_codec = HAL_VIDEO_CODEC_VP8;
205 break;
206 case HFI_VIDEO_CODEC_HEVC:
207 hal_codec = HAL_VIDEO_CODEC_HEVC;
208 break;
209 case HFI_VIDEO_CODEC_VP9:
210 hal_codec = HAL_VIDEO_CODEC_VP9;
211 break;
212 case HFI_VIDEO_CODEC_HEVC_HYBRID:
213 hal_codec = HAL_VIDEO_CODEC_HEVC_HYBRID;
214 break;
215 default:
216 dprintk(VIDC_INFO, "%s: invalid codec 0x%x\n",
217 __func__, hfi_codec);
218 hal_codec = 0;
219 break;
220 }
221 return hal_codec;
222}
223
224
225u32 vidc_get_hfi_domain(enum hal_domain hal_domain)
226{
227 u32 hfi_domain;
228
229 switch (hal_domain) {
230 case HAL_VIDEO_DOMAIN_VPE:
231 hfi_domain = HFI_VIDEO_DOMAIN_VPE;
232 break;
233 case HAL_VIDEO_DOMAIN_ENCODER:
234 hfi_domain = HFI_VIDEO_DOMAIN_ENCODER;
235 break;
236 case HAL_VIDEO_DOMAIN_DECODER:
237 hfi_domain = HFI_VIDEO_DOMAIN_DECODER;
238 break;
239 default:
240 dprintk(VIDC_ERR, "%s: invalid domain 0x%x\n",
241 __func__, hal_domain);
242 hfi_domain = 0;
243 break;
244 }
245 return hfi_domain;
246}
247
248u32 vidc_get_hfi_codec(enum hal_video_codec hal_codec)
249{
250 u32 hfi_codec = 0;
251
252 switch (hal_codec) {
253 case HAL_VIDEO_CODEC_MVC:
254 case HAL_VIDEO_CODEC_H264:
255 hfi_codec = HFI_VIDEO_CODEC_H264;
256 break;
257 case HAL_VIDEO_CODEC_H263:
258 hfi_codec = HFI_VIDEO_CODEC_H263;
259 break;
260 case HAL_VIDEO_CODEC_MPEG1:
261 hfi_codec = HFI_VIDEO_CODEC_MPEG1;
262 break;
263 case HAL_VIDEO_CODEC_MPEG2:
264 hfi_codec = HFI_VIDEO_CODEC_MPEG2;
265 break;
266 case HAL_VIDEO_CODEC_MPEG4:
267 hfi_codec = HFI_VIDEO_CODEC_MPEG4;
268 break;
269 case HAL_VIDEO_CODEC_DIVX_311:
270 hfi_codec = HFI_VIDEO_CODEC_DIVX_311;
271 break;
272 case HAL_VIDEO_CODEC_DIVX:
273 hfi_codec = HFI_VIDEO_CODEC_DIVX;
274 break;
275 case HAL_VIDEO_CODEC_VC1:
276 hfi_codec = HFI_VIDEO_CODEC_VC1;
277 break;
278 case HAL_VIDEO_CODEC_SPARK:
279 hfi_codec = HFI_VIDEO_CODEC_SPARK;
280 break;
281 case HAL_VIDEO_CODEC_VP8:
282 hfi_codec = HFI_VIDEO_CODEC_VP8;
283 break;
284 case HAL_VIDEO_CODEC_HEVC:
285 hfi_codec = HFI_VIDEO_CODEC_HEVC;
286 break;
287 case HAL_VIDEO_CODEC_VP9:
288 hfi_codec = HFI_VIDEO_CODEC_VP9;
289 break;
290 case HAL_VIDEO_CODEC_HEVC_HYBRID:
291 hfi_codec = HFI_VIDEO_CODEC_HEVC_HYBRID;
292 break;
293 default:
294 dprintk(VIDC_INFO, "%s: invalid codec 0x%x\n",
295 __func__, hal_codec);
296 hfi_codec = 0;
297 break;
298 }
299 return hfi_codec;
300}
301
302static void create_pkt_enable(void *pkt, u32 type, bool enable)
303{
304 u32 *pkt_header = pkt;
305 u32 *pkt_type = &pkt_header[0];
306 struct hfi_enable *hfi_enable = (struct hfi_enable *)&pkt_header[1];
307
308 *pkt_type = type;
309 hfi_enable->enable = enable;
310}
311
312int create_pkt_cmd_sys_init(struct hfi_cmd_sys_init_packet *pkt,
313 u32 arch_type)
314{
315 int rc = 0;
316
317 if (!pkt)
318 return -EINVAL;
319
320 pkt->packet_type = HFI_CMD_SYS_INIT;
321 pkt->size = sizeof(struct hfi_cmd_sys_init_packet);
322 pkt->arch_type = arch_type;
323 return rc;
324}
325
326int create_pkt_cmd_sys_pc_prep(struct hfi_cmd_sys_pc_prep_packet *pkt)
327{
328 int rc = 0;
329
330 if (!pkt)
331 return -EINVAL;
332
333 pkt->packet_type = HFI_CMD_SYS_PC_PREP;
334 pkt->size = sizeof(struct hfi_cmd_sys_pc_prep_packet);
335 return rc;
336}
337
338int create_pkt_cmd_sys_idle_indicator(
339 struct hfi_cmd_sys_set_property_packet *pkt,
340 u32 enable)
341{
342 struct hfi_enable *hfi;
343
344 if (!pkt)
345 return -EINVAL;
346
347 pkt->size = sizeof(struct hfi_cmd_sys_set_property_packet) +
348 sizeof(struct hfi_enable) + sizeof(u32);
349 pkt->packet_type = HFI_CMD_SYS_SET_PROPERTY;
350 pkt->num_properties = 1;
351 pkt->rg_property_data[0] = HFI_PROPERTY_SYS_IDLE_INDICATOR;
352 hfi = (struct hfi_enable *) &pkt->rg_property_data[1];
353 hfi->enable = enable;
354 return 0;
355}
356
357int create_pkt_cmd_sys_debug_config(
358 struct hfi_cmd_sys_set_property_packet *pkt,
359 u32 mode)
360{
361 struct hfi_debug_config *hfi;
362
363 if (!pkt)
364 return -EINVAL;
365
366 pkt->size = sizeof(struct hfi_cmd_sys_set_property_packet) +
367 sizeof(struct hfi_debug_config) + sizeof(u32);
368 pkt->packet_type = HFI_CMD_SYS_SET_PROPERTY;
369 pkt->num_properties = 1;
370 pkt->rg_property_data[0] = HFI_PROPERTY_SYS_DEBUG_CONFIG;
371 hfi = (struct hfi_debug_config *) &pkt->rg_property_data[1];
372 hfi->debug_config = mode;
373 hfi->debug_mode = HFI_DEBUG_MODE_QUEUE;
374 if (msm_vidc_fw_debug_mode
375 <= (HFI_DEBUG_MODE_QUEUE | HFI_DEBUG_MODE_QDSS))
376 hfi->debug_mode = msm_vidc_fw_debug_mode;
377 return 0;
378}
379
380int create_pkt_cmd_sys_coverage_config(
381 struct hfi_cmd_sys_set_property_packet *pkt,
382 u32 mode)
383{
384 if (!pkt) {
385 dprintk(VIDC_ERR, "In %s(), No input packet\n", __func__);
386 return -EINVAL;
387 }
388
389 pkt->size = sizeof(struct hfi_cmd_sys_set_property_packet) +
390 sizeof(u32);
391 pkt->packet_type = HFI_CMD_SYS_SET_PROPERTY;
392 pkt->num_properties = 1;
393 pkt->rg_property_data[0] = HFI_PROPERTY_SYS_CONFIG_COVERAGE;
394 pkt->rg_property_data[1] = mode;
395 dprintk(VIDC_DBG, "Firmware coverage mode %d\n",
396 pkt->rg_property_data[1]);
397 return 0;
398}
399
400int create_pkt_cmd_sys_set_resource(
401 struct hfi_cmd_sys_set_resource_packet *pkt,
402 struct vidc_resource_hdr *resource_hdr,
403 void *resource_value)
404{
405 int rc = 0;
406
407 if (!pkt || !resource_hdr || !resource_value)
408 return -EINVAL;
409
410 pkt->packet_type = HFI_CMD_SYS_SET_RESOURCE;
411 pkt->size = sizeof(struct hfi_cmd_sys_set_resource_packet);
412 pkt->resource_handle = hash32_ptr(resource_hdr->resource_handle);
413
414 switch (resource_hdr->resource_id) {
415 case VIDC_RESOURCE_OCMEM:
416 case VIDC_RESOURCE_VMEM:
417 {
418 struct hfi_resource_ocmem *hfioc_mem =
419 (struct hfi_resource_ocmem *)
420 &pkt->rg_resource_data[0];
421
422 phys_addr_t imem_addr = (phys_addr_t)resource_value;
423
424 pkt->resource_type = HFI_RESOURCE_OCMEM;
425 pkt->size += sizeof(struct hfi_resource_ocmem) - sizeof(u32);
426 hfioc_mem->size = (u32)resource_hdr->size;
427 hfioc_mem->mem = imem_addr;
428 break;
429 }
430 default:
431 dprintk(VIDC_ERR, "Invalid resource_id %d\n",
432 resource_hdr->resource_id);
433 rc = -ENOTSUPP;
434 }
435
436 return rc;
437}
438
439int create_pkt_cmd_sys_release_resource(
440 struct hfi_cmd_sys_release_resource_packet *pkt,
441 struct vidc_resource_hdr *resource_hdr)
442{
443 int rc = 0;
444
445 if (!pkt)
446 return -EINVAL;
447
448 pkt->size = sizeof(struct hfi_cmd_sys_release_resource_packet);
449 pkt->packet_type = HFI_CMD_SYS_RELEASE_RESOURCE;
450 pkt->resource_handle = hash32_ptr(resource_hdr->resource_handle);
451
452 switch (resource_hdr->resource_id) {
453 case VIDC_RESOURCE_OCMEM:
454 case VIDC_RESOURCE_VMEM:
455 pkt->resource_type = HFI_RESOURCE_OCMEM;
456 break;
457 default:
458 dprintk(VIDC_ERR, "Invalid resource_id %d\n",
459 resource_hdr->resource_id);
460 rc = -ENOTSUPP;
461 }
462
463 return rc;
464}
465
466int create_pkt_cmd_sys_ping(struct hfi_cmd_sys_ping_packet *pkt)
467{
468 int rc = 0;
469
470 if (!pkt)
471 return -EINVAL;
472
473 pkt->size = sizeof(struct hfi_cmd_sys_ping_packet);
474 pkt->packet_type = HFI_CMD_SYS_PING;
475
476 return rc;
477}
478
479inline int create_pkt_cmd_sys_session_init(
480 struct hfi_cmd_sys_session_init_packet *pkt,
481 struct hal_session *session,
482 u32 session_domain, u32 session_codec)
483{
484 int rc = 0;
485
486 if (!pkt)
487 return -EINVAL;
488
489 pkt->size = sizeof(struct hfi_cmd_sys_session_init_packet);
490 pkt->packet_type = HFI_CMD_SYS_SESSION_INIT;
491 pkt->session_id = hash32_ptr(session);
492 pkt->session_domain = vidc_get_hfi_domain(session_domain);
493 pkt->session_codec = vidc_get_hfi_codec(session_codec);
494 if (!pkt->session_codec)
495 return -EINVAL;
496
497 return rc;
498}
499
500int create_pkt_cmd_session_cmd(struct vidc_hal_session_cmd_pkt *pkt,
501 int pkt_type, struct hal_session *session)
502{
503 int rc = 0;
504
505 if (!pkt)
506 return -EINVAL;
507
508 /*
509 * Legacy packetization should skip sending any 3xx specific session
510 * cmds. Add 3xx specific packetization to the switch case below.
511 */
512 switch (pkt_type) {
513 case HFI_CMD_SESSION_CONTINUE:
514 dprintk(VIDC_INFO,
515 "%s - skip sending %x for legacy hfi\n",
516 __func__, pkt_type);
517 return -EPERM;
518 default:
519 break;
520 }
521
522 pkt->size = sizeof(struct vidc_hal_session_cmd_pkt);
523 pkt->packet_type = pkt_type;
524 pkt->session_id = hash32_ptr(session);
525
526 return rc;
527}
528
529int create_3x_pkt_cmd_session_cmd(struct vidc_hal_session_cmd_pkt *pkt,
530 int pkt_type, struct hal_session *session)
531{
532 int rc = 0;
533
534 if (!pkt)
535 return -EINVAL;
536
537 pkt->size = sizeof(struct vidc_hal_session_cmd_pkt);
538 pkt->packet_type = pkt_type;
539 pkt->session_id = hash32_ptr(session);
540
541 return rc;
542}
543
544int create_pkt_cmd_sys_power_control(
545 struct hfi_cmd_sys_set_property_packet *pkt, u32 enable)
546{
547 struct hfi_enable *hfi;
548
549 if (!pkt) {
550 dprintk(VIDC_ERR, "No input packet\n");
551 return -EINVAL;
552 }
553
554 pkt->size = sizeof(struct hfi_cmd_sys_set_property_packet) +
555 sizeof(struct hfi_enable) + sizeof(u32);
556 pkt->packet_type = HFI_CMD_SYS_SET_PROPERTY;
557 pkt->num_properties = 1;
558 pkt->rg_property_data[0] = HFI_PROPERTY_SYS_CODEC_POWER_PLANE_CTRL;
559 hfi = (struct hfi_enable *) &pkt->rg_property_data[1];
560 hfi->enable = enable;
561 return 0;
562}
563
564static u32 get_hfi_buffer(int hal_buffer)
565{
566 u32 buffer;
567
568 switch (hal_buffer) {
569 case HAL_BUFFER_INPUT:
570 buffer = HFI_BUFFER_INPUT;
571 break;
572 case HAL_BUFFER_OUTPUT:
573 buffer = HFI_BUFFER_OUTPUT;
574 break;
575 case HAL_BUFFER_OUTPUT2:
576 buffer = HFI_BUFFER_OUTPUT2;
577 break;
578 case HAL_BUFFER_EXTRADATA_INPUT:
579 buffer = HFI_BUFFER_EXTRADATA_INPUT;
580 break;
581 case HAL_BUFFER_EXTRADATA_OUTPUT:
582 buffer = HFI_BUFFER_EXTRADATA_OUTPUT;
583 break;
584 case HAL_BUFFER_EXTRADATA_OUTPUT2:
585 buffer = HFI_BUFFER_EXTRADATA_OUTPUT2;
586 break;
587 case HAL_BUFFER_INTERNAL_SCRATCH:
588 buffer = HFI_BUFFER_INTERNAL_SCRATCH;
589 break;
590 case HAL_BUFFER_INTERNAL_SCRATCH_1:
591 buffer = HFI_BUFFER_INTERNAL_SCRATCH_1;
592 break;
593 case HAL_BUFFER_INTERNAL_SCRATCH_2:
594 buffer = HFI_BUFFER_INTERNAL_SCRATCH_2;
595 break;
596 case HAL_BUFFER_INTERNAL_PERSIST:
597 buffer = HFI_BUFFER_INTERNAL_PERSIST;
598 break;
599 case HAL_BUFFER_INTERNAL_PERSIST_1:
600 buffer = HFI_BUFFER_INTERNAL_PERSIST_1;
601 break;
602 default:
603 dprintk(VIDC_ERR, "Invalid buffer: %#x\n",
604 hal_buffer);
605 buffer = 0;
606 break;
607 }
608 return buffer;
609}
610
611static int get_hfi_extradata_index(enum hal_extradata_id index)
612{
613 int ret = 0;
614
615 switch (index) {
616 case HAL_EXTRADATA_MB_QUANTIZATION:
617 ret = HFI_PROPERTY_PARAM_VDEC_MB_QUANTIZATION;
618 break;
619 case HAL_EXTRADATA_INTERLACE_VIDEO:
620 ret = HFI_PROPERTY_PARAM_VDEC_INTERLACE_VIDEO_EXTRADATA;
621 break;
622 case HAL_EXTRADATA_VC1_FRAMEDISP:
623 ret = HFI_PROPERTY_PARAM_VDEC_VC1_FRAMEDISP_EXTRADATA;
624 break;
625 case HAL_EXTRADATA_VC1_SEQDISP:
626 ret = HFI_PROPERTY_PARAM_VDEC_VC1_SEQDISP_EXTRADATA;
627 break;
628 case HAL_EXTRADATA_TIMESTAMP:
629 ret = HFI_PROPERTY_PARAM_VDEC_TIMESTAMP_EXTRADATA;
630 break;
631 case HAL_EXTRADATA_S3D_FRAME_PACKING:
632 ret = HFI_PROPERTY_PARAM_S3D_FRAME_PACKING_EXTRADATA;
633 break;
634 case HAL_EXTRADATA_FRAME_RATE:
635 ret = HFI_PROPERTY_PARAM_VDEC_FRAME_RATE_EXTRADATA;
636 break;
637 case HAL_EXTRADATA_PANSCAN_WINDOW:
638 ret = HFI_PROPERTY_PARAM_VDEC_PANSCAN_WNDW_EXTRADATA;
639 break;
640 case HAL_EXTRADATA_RECOVERY_POINT_SEI:
641 ret = HFI_PROPERTY_PARAM_VDEC_RECOVERY_POINT_SEI_EXTRADATA;
642 break;
643 case HAL_EXTRADATA_MULTISLICE_INFO:
644 ret = HFI_PROPERTY_PARAM_VENC_MULTI_SLICE_INFO;
645 break;
646 case HAL_EXTRADATA_NUM_CONCEALED_MB:
647 ret = HFI_PROPERTY_PARAM_VDEC_NUM_CONCEALED_MB;
648 break;
649 case HAL_EXTRADATA_ASPECT_RATIO:
650 case HAL_EXTRADATA_INPUT_CROP:
651 case HAL_EXTRADATA_DIGITAL_ZOOM:
652 case HAL_EXTRADATA_OUTPUT_CROP:
653 ret = HFI_PROPERTY_PARAM_INDEX_EXTRADATA;
654 break;
655 case HAL_EXTRADATA_MPEG2_SEQDISP:
656 ret = HFI_PROPERTY_PARAM_VDEC_MPEG2_SEQDISP_EXTRADATA;
657 break;
658 case HAL_EXTRADATA_STREAM_USERDATA:
659 ret = HFI_PROPERTY_PARAM_VDEC_STREAM_USERDATA_EXTRADATA;
660 break;
661 case HAL_EXTRADATA_FRAME_QP:
662 ret = HFI_PROPERTY_PARAM_VDEC_FRAME_QP_EXTRADATA;
663 break;
664 case HAL_EXTRADATA_FRAME_BITS_INFO:
665 ret = HFI_PROPERTY_PARAM_VDEC_FRAME_BITS_INFO_EXTRADATA;
666 break;
667 case HAL_EXTRADATA_LTR_INFO:
668 ret = HFI_PROPERTY_PARAM_VENC_LTR_INFO;
669 break;
670 case HAL_EXTRADATA_METADATA_MBI:
671 ret = HFI_PROPERTY_PARAM_VENC_MBI_DUMPING;
672 break;
673 case HAL_EXTRADATA_VQZIP_SEI:
674 ret = HFI_PROPERTY_PARAM_VDEC_VQZIP_SEI_EXTRADATA;
675 break;
676 case HAL_EXTRADATA_YUV_STATS:
677 ret = HFI_PROPERTY_PARAM_VENC_YUVSTAT_INFO_EXTRADATA;
678 break;
679 case HAL_EXTRADATA_ROI_QP:
680 ret = HFI_PROPERTY_PARAM_VENC_ROI_QP_EXTRADATA;
681 break;
682 case HAL_EXTRADATA_MASTERING_DISPLAY_COLOUR_SEI:
683 ret =
684 HFI_PROPERTY_PARAM_VDEC_MASTERING_DISPLAY_COLOUR_SEI_EXTRADATA;
685 break;
686 case HAL_EXTRADATA_CONTENT_LIGHT_LEVEL_SEI:
687 ret = HFI_PROPERTY_PARAM_VDEC_CONTENT_LIGHT_LEVEL_SEI_EXTRADATA;
688 break;
689 case HAL_EXTRADATA_VUI_DISPLAY_INFO:
690 ret = HFI_PROPERTY_PARAM_VUI_DISPLAY_INFO_EXTRADATA;
691 break;
692 case HAL_EXTRADATA_VPX_COLORSPACE:
693 ret = HFI_PROPERTY_PARAM_VDEC_VPX_COLORSPACE_EXTRADATA;
694 break;
695 case HAL_EXTRADATA_PQ_INFO:
696 ret = HFI_PROPERTY_PARAM_VENC_OVERRIDE_QP_EXTRADATA;
697 break;
698 default:
699 dprintk(VIDC_WARN, "Extradata index not found: %d\n", index);
700 break;
701 }
702 return ret;
703}
704
705static int get_hfi_extradata_id(enum hal_extradata_id index)
706{
707 int ret = 0;
708
709 switch (index) {
710 case HAL_EXTRADATA_ASPECT_RATIO:
711 ret = MSM_VIDC_EXTRADATA_ASPECT_RATIO;
712 break;
713 case HAL_EXTRADATA_INPUT_CROP:
714 ret = MSM_VIDC_EXTRADATA_INPUT_CROP;
715 break;
716 case HAL_EXTRADATA_DIGITAL_ZOOM:
717 ret = MSM_VIDC_EXTRADATA_DIGITAL_ZOOM;
718 break;
719 case HAL_EXTRADATA_OUTPUT_CROP:
720 ret = MSM_VIDC_EXTRADATA_OUTPUT_CROP;
721 break;
722 default:
723 ret = get_hfi_extradata_index(index);
724 break;
725 }
726 return ret;
727}
728
729static u32 get_hfi_buf_mode(enum buffer_mode_type hal_buf_mode)
730{
731 u32 buf_mode;
732
733 switch (hal_buf_mode) {
734 case HAL_BUFFER_MODE_STATIC:
735 buf_mode = HFI_BUFFER_MODE_STATIC;
736 break;
737 case HAL_BUFFER_MODE_RING:
738 buf_mode = HFI_BUFFER_MODE_RING;
739 break;
740 case HAL_BUFFER_MODE_DYNAMIC:
741 buf_mode = HFI_BUFFER_MODE_DYNAMIC;
742 break;
743 default:
744 dprintk(VIDC_ERR, "Invalid buffer mode: %#x\n",
745 hal_buf_mode);
746 buf_mode = 0;
747 break;
748 }
749 return buf_mode;
750}
751
752static u32 get_hfi_ltr_mode(enum ltr_mode ltr_mode_type)
753{
754 u32 ltrmode;
755
756 switch (ltr_mode_type) {
757 case HAL_LTR_MODE_DISABLE:
758 ltrmode = HFI_LTR_MODE_DISABLE;
759 break;
760 case HAL_LTR_MODE_MANUAL:
761 ltrmode = HFI_LTR_MODE_MANUAL;
762 break;
763 case HAL_LTR_MODE_PERIODIC:
764 ltrmode = HFI_LTR_MODE_PERIODIC;
765 break;
766 default:
767 dprintk(VIDC_ERR, "Invalid ltr mode: %#x\n",
768 ltr_mode_type);
769 ltrmode = HFI_LTR_MODE_DISABLE;
770 break;
771 }
772 return ltrmode;
773}
774
775int create_pkt_cmd_session_set_buffers(
776 struct hfi_cmd_session_set_buffers_packet *pkt,
777 struct hal_session *session,
778 struct vidc_buffer_addr_info *buffer_info)
779{
780 int rc = 0;
781 int i = 0;
782
783 if (!pkt || !session)
784 return -EINVAL;
785
786 pkt->packet_type = HFI_CMD_SESSION_SET_BUFFERS;
787 pkt->session_id = hash32_ptr(session);
788 pkt->buffer_size = buffer_info->buffer_size;
789 pkt->min_buffer_size = buffer_info->buffer_size;
790 pkt->num_buffers = buffer_info->num_buffers;
791
792 if (buffer_info->buffer_type == HAL_BUFFER_OUTPUT ||
793 buffer_info->buffer_type == HAL_BUFFER_OUTPUT2) {
794 struct hfi_buffer_info *buff;
795
796 pkt->extra_data_size = buffer_info->extradata_size;
797 pkt->size = sizeof(struct hfi_cmd_session_set_buffers_packet) -
798 sizeof(u32) + (buffer_info->num_buffers *
799 sizeof(struct hfi_buffer_info));
800 buff = (struct hfi_buffer_info *) pkt->rg_buffer_info;
801 for (i = 0; i < pkt->num_buffers; i++) {
802 buff->buffer_addr =
803 (u32)buffer_info->align_device_addr;
804 buff->extra_data_addr =
805 (u32)buffer_info->extradata_addr;
806 }
807 } else {
808 pkt->extra_data_size = 0;
809 pkt->size = sizeof(struct hfi_cmd_session_set_buffers_packet) +
810 ((buffer_info->num_buffers - 1) * sizeof(u32));
811 for (i = 0; i < pkt->num_buffers; i++) {
812 pkt->rg_buffer_info[i] =
813 (u32)buffer_info->align_device_addr;
814 }
815 }
816
817 pkt->buffer_type = get_hfi_buffer(buffer_info->buffer_type);
818 if (!pkt->buffer_type)
819 return -EINVAL;
820
821 return rc;
822}
823
824int create_pkt_cmd_session_release_buffers(
825 struct hfi_cmd_session_release_buffer_packet *pkt,
826 struct hal_session *session,
827 struct vidc_buffer_addr_info *buffer_info)
828{
829 int rc = 0;
830 int i = 0;
831
832 if (!pkt || !session)
833 return -EINVAL;
834
835 pkt->packet_type = HFI_CMD_SESSION_RELEASE_BUFFERS;
836 pkt->session_id = hash32_ptr(session);
837 pkt->buffer_size = buffer_info->buffer_size;
838 pkt->num_buffers = buffer_info->num_buffers;
839
840 if (buffer_info->buffer_type == HAL_BUFFER_OUTPUT ||
841 buffer_info->buffer_type == HAL_BUFFER_OUTPUT2) {
842 struct hfi_buffer_info *buff;
843
844 buff = (struct hfi_buffer_info *) pkt->rg_buffer_info;
845 for (i = 0; i < pkt->num_buffers; i++) {
846 buff->buffer_addr =
847 (u32)buffer_info->align_device_addr;
848 buff->extra_data_addr =
849 (u32)buffer_info->extradata_addr;
850 }
851 pkt->size = sizeof(struct hfi_cmd_session_set_buffers_packet) -
852 sizeof(u32) + (buffer_info->num_buffers *
853 sizeof(struct hfi_buffer_info));
854 } else {
855 for (i = 0; i < pkt->num_buffers; i++) {
856 pkt->rg_buffer_info[i] =
857 (u32)buffer_info->align_device_addr;
858 }
859 pkt->extra_data_size = 0;
860 pkt->size = sizeof(struct hfi_cmd_session_set_buffers_packet) +
861 ((buffer_info->num_buffers - 1) * sizeof(u32));
862 }
863 pkt->response_req = buffer_info->response_required;
864 pkt->buffer_type = get_hfi_buffer(buffer_info->buffer_type);
865 if (!pkt->buffer_type)
866 return -EINVAL;
867 return rc;
868}
869
870int create_pkt_cmd_session_etb_decoder(
871 struct hfi_cmd_session_empty_buffer_compressed_packet *pkt,
872 struct hal_session *session, struct vidc_frame_data *input_frame)
873{
874 int rc = 0;
875
876 if (!pkt || !session)
877 return -EINVAL;
878
879 pkt->size =
880 sizeof(struct hfi_cmd_session_empty_buffer_compressed_packet);
881 pkt->packet_type = HFI_CMD_SESSION_EMPTY_BUFFER;
882 pkt->session_id = hash32_ptr(session);
883 pkt->time_stamp_hi = upper_32_bits(input_frame->timestamp);
884 pkt->time_stamp_lo = lower_32_bits(input_frame->timestamp);
885 pkt->flags = input_frame->flags;
886 pkt->mark_target = input_frame->mark_target;
887 pkt->mark_data = input_frame->mark_data;
888 pkt->offset = input_frame->offset;
889 pkt->alloc_len = input_frame->alloc_len;
890 pkt->filled_len = input_frame->filled_len;
891 pkt->input_tag = input_frame->clnt_data;
892 pkt->packet_buffer = (u32)input_frame->device_addr;
893
894 trace_msm_v4l2_vidc_buffer_event_start("ETB",
895 input_frame->device_addr, input_frame->timestamp,
896 input_frame->alloc_len, input_frame->filled_len,
897 input_frame->offset);
898
899 if (!pkt->packet_buffer)
900 rc = -EINVAL;
901 return rc;
902}
903
904int create_pkt_cmd_session_etb_encoder(
905 struct hfi_cmd_session_empty_buffer_uncompressed_plane0_packet *pkt,
906 struct hal_session *session, struct vidc_frame_data *input_frame)
907{
908 int rc = 0;
909
910 if (!pkt || !session)
911 return -EINVAL;
912
913 pkt->size = sizeof(struct
914 hfi_cmd_session_empty_buffer_uncompressed_plane0_packet);
915 pkt->packet_type = HFI_CMD_SESSION_EMPTY_BUFFER;
916 pkt->session_id = hash32_ptr(session);
917 pkt->view_id = 0;
918 pkt->time_stamp_hi = upper_32_bits(input_frame->timestamp);
919 pkt->time_stamp_lo = lower_32_bits(input_frame->timestamp);
920 pkt->flags = input_frame->flags;
921 pkt->mark_target = input_frame->mark_target;
922 pkt->mark_data = input_frame->mark_data;
923 pkt->offset = input_frame->offset;
924 pkt->alloc_len = input_frame->alloc_len;
925 pkt->filled_len = input_frame->filled_len;
926 pkt->input_tag = input_frame->clnt_data;
927 pkt->packet_buffer = (u32)input_frame->device_addr;
928 pkt->extra_data_buffer = (u32)input_frame->extradata_addr;
929
930 trace_msm_v4l2_vidc_buffer_event_start("ETB",
931 input_frame->device_addr, input_frame->timestamp,
932 input_frame->alloc_len, input_frame->filled_len,
933 input_frame->offset);
934
935 if (!pkt->packet_buffer)
936 rc = -EINVAL;
937 return rc;
938}
939
940int create_pkt_cmd_session_ftb(struct hfi_cmd_session_fill_buffer_packet *pkt,
941 struct hal_session *session,
942 struct vidc_frame_data *output_frame)
943{
944 int rc = 0;
945
946 if (!pkt || !session || !output_frame)
947 return -EINVAL;
948
949 pkt->size = sizeof(struct hfi_cmd_session_fill_buffer_packet);
950 pkt->packet_type = HFI_CMD_SESSION_FILL_BUFFER;
951 pkt->session_id = hash32_ptr(session);
952
953 if (output_frame->buffer_type == HAL_BUFFER_OUTPUT)
954 pkt->stream_id = 0;
955 else if (output_frame->buffer_type == HAL_BUFFER_OUTPUT2)
956 pkt->stream_id = 1;
957
958 if (!output_frame->device_addr)
959 return -EINVAL;
960
961 pkt->packet_buffer = (u32)output_frame->device_addr;
962 pkt->extra_data_buffer = (u32)output_frame->extradata_addr;
963 pkt->alloc_len = output_frame->alloc_len;
964 pkt->filled_len = output_frame->filled_len;
965 pkt->offset = output_frame->offset;
966 pkt->rgData[0] = output_frame->extradata_size;
967
968 trace_msm_v4l2_vidc_buffer_event_start("FTB",
969 output_frame->device_addr, output_frame->timestamp,
970 output_frame->alloc_len, output_frame->filled_len,
971 output_frame->offset);
972 dprintk(VIDC_DBG, "### Q OUTPUT BUFFER ###: %d, %d, %d\n",
973 pkt->alloc_len, pkt->filled_len, pkt->offset);
974
975 return rc;
976}
977
978int create_pkt_cmd_session_parse_seq_header(
979 struct hfi_cmd_session_parse_sequence_header_packet *pkt,
980 struct hal_session *session, struct vidc_seq_hdr *seq_hdr)
981{
982 int rc = 0;
983
984 if (!pkt || !session || !seq_hdr)
985 return -EINVAL;
986
987 pkt->size = sizeof(struct hfi_cmd_session_parse_sequence_header_packet);
988 pkt->packet_type = HFI_CMD_SESSION_PARSE_SEQUENCE_HEADER;
989 pkt->session_id = hash32_ptr(session);
990 pkt->header_len = seq_hdr->seq_hdr_len;
991 if (!seq_hdr->seq_hdr)
992 return -EINVAL;
993 pkt->packet_buffer = (u32)seq_hdr->seq_hdr;
994 return rc;
995}
996
997int create_pkt_cmd_session_get_seq_hdr(
998 struct hfi_cmd_session_get_sequence_header_packet *pkt,
999 struct hal_session *session, struct vidc_seq_hdr *seq_hdr)
1000{
1001 int rc = 0;
1002
1003 if (!pkt || !session || !seq_hdr)
1004 return -EINVAL;
1005
1006 pkt->size = sizeof(struct hfi_cmd_session_get_sequence_header_packet);
1007 pkt->packet_type = HFI_CMD_SESSION_GET_SEQUENCE_HEADER;
1008 pkt->session_id = hash32_ptr(session);
1009 pkt->buffer_len = seq_hdr->seq_hdr_len;
1010 if (!seq_hdr->seq_hdr)
1011 return -EINVAL;
1012 pkt->packet_buffer = (u32)seq_hdr->seq_hdr;
1013 return rc;
1014}
1015
1016int create_pkt_cmd_session_get_buf_req(
1017 struct hfi_cmd_session_get_property_packet *pkt,
1018 struct hal_session *session)
1019{
1020 int rc = 0;
1021
1022 if (!pkt || !session)
1023 return -EINVAL;
1024
1025 pkt->size = sizeof(struct hfi_cmd_session_get_property_packet);
1026 pkt->packet_type = HFI_CMD_SESSION_GET_PROPERTY;
1027 pkt->session_id = hash32_ptr(session);
1028 pkt->num_properties = 1;
1029 pkt->rg_property_data[0] = HFI_PROPERTY_CONFIG_BUFFER_REQUIREMENTS;
1030
1031 return rc;
1032}
1033
1034int create_pkt_cmd_session_flush(struct hfi_cmd_session_flush_packet *pkt,
1035 struct hal_session *session, enum hal_flush flush_mode)
1036{
1037 int rc = 0;
1038
1039 if (!pkt || !session)
1040 return -EINVAL;
1041
1042 pkt->size = sizeof(struct hfi_cmd_session_flush_packet);
1043 pkt->packet_type = HFI_CMD_SESSION_FLUSH;
1044 pkt->session_id = hash32_ptr(session);
1045 switch (flush_mode) {
1046 case HAL_FLUSH_INPUT:
1047 pkt->flush_type = HFI_FLUSH_INPUT;
1048 break;
1049 case HAL_FLUSH_OUTPUT:
1050 pkt->flush_type = HFI_FLUSH_OUTPUT;
1051 break;
1052 case HAL_FLUSH_ALL:
1053 pkt->flush_type = HFI_FLUSH_ALL;
1054 break;
1055 default:
1056 dprintk(VIDC_ERR, "Invalid flush mode: %#x\n", flush_mode);
1057 return -EINVAL;
1058 }
1059 return rc;
1060}
1061
1062int create_pkt_cmd_session_get_property(
1063 struct hfi_cmd_session_get_property_packet *pkt,
1064 struct hal_session *session, enum hal_property ptype)
1065{
1066 int rc = 0;
1067
1068 if (!pkt || !session) {
1069 dprintk(VIDC_ERR, "%s Invalid parameters\n", __func__);
1070 return -EINVAL;
1071 }
1072 pkt->size = sizeof(struct hfi_cmd_session_get_property_packet);
1073 pkt->packet_type = HFI_CMD_SESSION_GET_PROPERTY;
1074 pkt->session_id = hash32_ptr(session);
1075 pkt->num_properties = 1;
1076 switch (ptype) {
1077 case HAL_PARAM_PROFILE_LEVEL_CURRENT:
1078 pkt->rg_property_data[0] =
1079 HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT;
1080 break;
1081 default:
1082 dprintk(VIDC_ERR, "%s cmd:%#x not supported\n", __func__,
1083 ptype);
1084 rc = -EINVAL;
1085 break;
1086 }
1087 return rc;
1088}
1089
1090int create_3x_pkt_cmd_session_get_property(
1091 struct hfi_cmd_session_get_property_packet *pkt,
1092 struct hal_session *session, enum hal_property ptype)
1093{
1094 int rc = 0;
1095
1096 if (!pkt || !session) {
1097 dprintk(VIDC_ERR, "%s Invalid parameters\n", __func__);
1098 return -EINVAL;
1099 }
1100 pkt->size = sizeof(struct hfi_cmd_session_get_property_packet);
1101 pkt->packet_type = HFI_CMD_SESSION_GET_PROPERTY;
1102 pkt->session_id = hash32_ptr(session);
1103 pkt->num_properties = 1;
1104 switch (ptype) {
1105 case HAL_CONFIG_VDEC_ENTROPY:
1106 pkt->rg_property_data[0] = HFI_PROPERTY_CONFIG_VDEC_ENTROPY;
1107 break;
1108 default:
1109 rc = create_pkt_cmd_session_get_property(pkt,
1110 session, ptype);
1111 }
1112 return rc;
1113}
1114
1115int create_pkt_cmd_session_set_property(
1116 struct hfi_cmd_session_set_property_packet *pkt,
1117 struct hal_session *session,
1118 enum hal_property ptype, void *pdata)
1119{
1120 int rc = 0;
1121
1122 if (!pkt || !session)
1123 return -EINVAL;
1124
1125 pkt->size = sizeof(struct hfi_cmd_session_set_property_packet);
1126 pkt->packet_type = HFI_CMD_SESSION_SET_PROPERTY;
1127 pkt->session_id = hash32_ptr(session);
1128 pkt->num_properties = 1;
1129
1130 switch (ptype) {
1131 case HAL_CONFIG_FRAME_RATE:
1132 {
1133 u32 buffer_type;
1134 struct hfi_frame_rate *hfi;
1135 struct hal_frame_rate *prop = (struct hal_frame_rate *) pdata;
1136
1137 pkt->rg_property_data[0] = HFI_PROPERTY_CONFIG_FRAME_RATE;
1138 hfi = (struct hfi_frame_rate *) &pkt->rg_property_data[1];
1139 buffer_type = get_hfi_buffer(prop->buffer_type);
1140 if (buffer_type)
1141 hfi->buffer_type = buffer_type;
1142 else
1143 return -EINVAL;
1144
1145 hfi->frame_rate = prop->frame_rate;
1146 pkt->size += sizeof(u32) + sizeof(struct hfi_frame_rate);
1147 break;
1148 }
1149 case HAL_PARAM_UNCOMPRESSED_FORMAT_SELECT:
1150 {
1151 u32 buffer_type;
1152 struct hfi_uncompressed_format_select *hfi;
1153 struct hal_uncompressed_format_select *prop =
1154 (struct hal_uncompressed_format_select *) pdata;
1155
1156 pkt->rg_property_data[0] =
1157 HFI_PROPERTY_PARAM_UNCOMPRESSED_FORMAT_SELECT;
1158
1159 hfi = (struct hfi_uncompressed_format_select *)
1160 &pkt->rg_property_data[1];
1161 buffer_type = get_hfi_buffer(prop->buffer_type);
1162 if (buffer_type)
1163 hfi->buffer_type = buffer_type;
1164 else
1165 return -EINVAL;
1166 hfi->format = hal_to_hfi_type(
1167 HAL_PARAM_UNCOMPRESSED_FORMAT_SELECT,
1168 prop->format);
1169 pkt->size += sizeof(u32) +
1170 sizeof(struct hfi_uncompressed_format_select);
1171 break;
1172 }
1173 case HAL_PARAM_UNCOMPRESSED_PLANE_ACTUAL_CONSTRAINTS_INFO:
1174 break;
1175 case HAL_PARAM_UNCOMPRESSED_PLANE_ACTUAL_INFO:
1176 break;
1177 case HAL_PARAM_EXTRA_DATA_HEADER_CONFIG:
1178 break;
1179 case HAL_PARAM_FRAME_SIZE:
1180 {
1181 struct hfi_frame_size *hfi;
1182 struct hal_frame_size *prop = (struct hal_frame_size *) pdata;
1183 u32 buffer_type;
1184
1185 pkt->rg_property_data[0] = HFI_PROPERTY_PARAM_FRAME_SIZE;
1186 hfi = (struct hfi_frame_size *) &pkt->rg_property_data[1];
1187 buffer_type = get_hfi_buffer(prop->buffer_type);
1188 if (buffer_type)
1189 hfi->buffer_type = buffer_type;
1190 else
1191 return -EINVAL;
1192
1193 hfi->height = prop->height;
1194 hfi->width = prop->width;
1195 pkt->size += sizeof(u32) + sizeof(struct hfi_frame_size);
1196 break;
1197 }
1198 case HAL_CONFIG_REALTIME:
1199 {
1200 create_pkt_enable(pkt->rg_property_data,
1201 HFI_PROPERTY_CONFIG_REALTIME,
1202 (((struct hal_enable *) pdata)->enable));
1203 pkt->size += sizeof(u32) * 2;
1204 break;
1205 }
1206 case HAL_PARAM_BUFFER_COUNT_ACTUAL:
1207 {
1208 struct hfi_buffer_count_actual *hfi;
1209 struct hal_buffer_count_actual *prop =
1210 (struct hal_buffer_count_actual *) pdata;
1211 u32 buffer_type;
1212
1213 pkt->rg_property_data[0] =
1214 HFI_PROPERTY_PARAM_BUFFER_COUNT_ACTUAL;
1215 hfi = (struct hfi_buffer_count_actual *)
1216 &pkt->rg_property_data[1];
1217 hfi->buffer_count_actual = prop->buffer_count_actual;
1218
1219 buffer_type = get_hfi_buffer(prop->buffer_type);
1220 if (buffer_type)
1221 hfi->buffer_type = buffer_type;
1222 else
1223 return -EINVAL;
1224
1225 pkt->size += sizeof(u32) + sizeof(struct
1226 hfi_buffer_count_actual);
1227
1228 break;
1229 }
1230 case HAL_PARAM_NAL_STREAM_FORMAT_SELECT:
1231 {
1232 struct hfi_nal_stream_format_select *hfi;
1233 struct hal_nal_stream_format_select *prop =
1234 (struct hal_nal_stream_format_select *)pdata;
1235 pkt->rg_property_data[0] =
1236 HFI_PROPERTY_PARAM_NAL_STREAM_FORMAT_SELECT;
1237 hfi = (struct hfi_nal_stream_format_select *)
1238 &pkt->rg_property_data[1];
1239 dprintk(VIDC_DBG, "data is :%d\n",
1240 prop->nal_stream_format_select);
1241 hfi->nal_stream_format_select = hal_to_hfi_type(
1242 HAL_PARAM_NAL_STREAM_FORMAT_SELECT,
1243 prop->nal_stream_format_select);
1244 pkt->size += sizeof(u32) +
1245 sizeof(struct hfi_nal_stream_format_select);
1246 break;
1247 }
1248 case HAL_PARAM_VDEC_OUTPUT_ORDER:
1249 {
1250 int *data = (int *) pdata;
1251
1252 pkt->rg_property_data[0] =
1253 HFI_PROPERTY_PARAM_VDEC_OUTPUT_ORDER;
1254 switch (*data) {
1255 case HAL_OUTPUT_ORDER_DECODE:
1256 pkt->rg_property_data[1] = HFI_OUTPUT_ORDER_DECODE;
1257 break;
1258 case HAL_OUTPUT_ORDER_DISPLAY:
1259 pkt->rg_property_data[1] = HFI_OUTPUT_ORDER_DISPLAY;
1260 break;
1261 default:
1262 dprintk(VIDC_ERR, "invalid output order: %#x\n",
1263 *data);
1264 break;
1265 }
1266 pkt->size += sizeof(u32) * 2;
1267 break;
1268 }
1269 case HAL_PARAM_VDEC_PICTURE_TYPE_DECODE:
1270 {
1271 struct hfi_enable_picture *hfi;
1272
1273 pkt->rg_property_data[0] =
1274 HFI_PROPERTY_PARAM_VDEC_PICTURE_TYPE_DECODE;
1275 hfi = (struct hfi_enable_picture *) &pkt->rg_property_data[1];
1276 hfi->picture_type =
1277 ((struct hfi_enable_picture *)pdata)->picture_type;
1278 pkt->size += sizeof(u32) * 2;
1279 break;
1280 }
1281 case HAL_PARAM_VDEC_OUTPUT2_KEEP_ASPECT_RATIO:
1282 {
1283 create_pkt_enable(pkt->rg_property_data,
1284 HFI_PROPERTY_PARAM_VDEC_OUTPUT2_KEEP_ASPECT_RATIO,
1285 ((struct hal_enable *)pdata)->enable);
1286 pkt->size += sizeof(u32) * 2;
1287 break;
1288 }
1289 case HAL_CONFIG_VDEC_POST_LOOP_DEBLOCKER:
1290 {
1291 create_pkt_enable(pkt->rg_property_data,
1292 HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER,
1293 ((struct hal_enable *)pdata)->enable);
1294 pkt->size += sizeof(u32) * 2;
1295 break;
1296 }
1297 case HAL_PARAM_VDEC_MULTI_STREAM:
1298 {
1299 struct hfi_multi_stream *hfi;
1300 struct hal_multi_stream *prop =
1301 (struct hal_multi_stream *) pdata;
1302 u32 buffer_type;
1303
1304 pkt->rg_property_data[0] =
1305 HFI_PROPERTY_PARAM_VDEC_MULTI_STREAM;
1306 hfi = (struct hfi_multi_stream *) &pkt->rg_property_data[1];
1307
1308 buffer_type = get_hfi_buffer(prop->buffer_type);
1309 if (buffer_type)
1310 hfi->buffer_type = buffer_type;
1311 else
1312 return -EINVAL;
1313 hfi->enable = prop->enable;
1314 hfi->width = prop->width;
1315 hfi->height = prop->height;
1316 pkt->size += sizeof(u32) + sizeof(struct hfi_multi_stream);
1317 break;
1318 }
1319 case HAL_PARAM_VDEC_DISPLAY_PICTURE_BUFFER_COUNT:
1320 {
1321 struct hfi_display_picture_buffer_count *hfi;
1322 struct hal_display_picture_buffer_count *prop =
1323 (struct hal_display_picture_buffer_count *) pdata;
1324 pkt->rg_property_data[0] =
1325 HFI_PROPERTY_PARAM_VDEC_DISPLAY_PICTURE_BUFFER_COUNT;
1326 hfi = (struct hfi_display_picture_buffer_count *)
1327 &pkt->rg_property_data[1];
1328 hfi->count = prop->count;
1329 hfi->enable = prop->enable;
1330 pkt->size += sizeof(u32) +
1331 sizeof(struct hfi_display_picture_buffer_count);
1332 break;
1333 }
1334 case HAL_PARAM_DIVX_FORMAT:
1335 {
1336 int *data = pdata;
1337
1338 pkt->rg_property_data[0] = HFI_PROPERTY_PARAM_DIVX_FORMAT;
1339 switch (*data) {
1340 case HAL_DIVX_FORMAT_4:
1341 pkt->rg_property_data[1] = HFI_DIVX_FORMAT_4;
1342 break;
1343 case HAL_DIVX_FORMAT_5:
1344 pkt->rg_property_data[1] = HFI_DIVX_FORMAT_5;
1345 break;
1346 case HAL_DIVX_FORMAT_6:
1347 pkt->rg_property_data[1] = HFI_DIVX_FORMAT_6;
1348 break;
1349 default:
1350 dprintk(VIDC_ERR, "Invalid divx format: %#x\n", *data);
1351 break;
1352 }
1353 pkt->size += sizeof(u32) * 2;
1354 break;
1355 }
1356 case HAL_CONFIG_VDEC_MB_ERROR_MAP_REPORTING:
1357 {
1358 create_pkt_enable(pkt->rg_property_data,
1359 HFI_PROPERTY_CONFIG_VDEC_MB_ERROR_MAP_REPORTING,
1360 ((struct hal_enable *)pdata)->enable);
1361 pkt->size += sizeof(u32) * 2;
1362 break;
1363 }
1364 case HAL_PARAM_VDEC_CONTINUE_DATA_TRANSFER:
1365 {
1366 create_pkt_enable(pkt->rg_property_data,
1367 HFI_PROPERTY_PARAM_VDEC_CONTINUE_DATA_TRANSFER,
1368 ((struct hal_enable *)pdata)->enable);
1369 pkt->size += sizeof(u32) * 2;
1370 break;
1371 }
1372 case HAL_PARAM_VDEC_SYNC_FRAME_DECODE:
1373 {
1374 create_pkt_enable(pkt->rg_property_data,
1375 HFI_PROPERTY_PARAM_VDEC_THUMBNAIL_MODE,
1376 ((struct hal_enable *)pdata)->enable);
1377 pkt->size += sizeof(u32) * 2;
1378 break;
1379 }
1380 case HAL_PARAM_VENC_SYNC_FRAME_SEQUENCE_HEADER:
1381 {
1382 create_pkt_enable(pkt->rg_property_data,
1383 HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER,
1384 ((struct hal_enable *)pdata)->enable);
1385 pkt->size += sizeof(u32) * 2;
1386 break;
1387 }
1388 case HAL_CONFIG_VENC_REQUEST_IFRAME:
1389 pkt->rg_property_data[0] =
1390 HFI_PROPERTY_CONFIG_VENC_REQUEST_SYNC_FRAME;
1391 pkt->size += sizeof(u32);
1392 break;
1393 case HAL_PARAM_VENC_MPEG4_SHORT_HEADER:
1394 break;
1395 case HAL_PARAM_VENC_MPEG4_AC_PREDICTION:
1396 break;
1397 case HAL_CONFIG_VENC_TARGET_BITRATE:
1398 {
1399 struct hfi_bitrate *hfi;
1400
1401 pkt->rg_property_data[0] =
1402 HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE;
1403 hfi = (struct hfi_bitrate *) &pkt->rg_property_data[1];
1404 hfi->bit_rate = ((struct hal_bitrate *)pdata)->bit_rate;
1405 hfi->layer_id = ((struct hal_bitrate *)pdata)->layer_id;
1406 pkt->size += sizeof(u32) + sizeof(struct hfi_bitrate);
1407 break;
1408 }
1409 case HAL_CONFIG_VENC_MAX_BITRATE:
1410 {
1411 struct hfi_bitrate *hfi;
1412
1413 pkt->rg_property_data[0] =
1414 HFI_PROPERTY_CONFIG_VENC_MAX_BITRATE;
1415 hfi = (struct hfi_bitrate *) &pkt->rg_property_data[1];
1416 hfi->bit_rate = ((struct hal_bitrate *)pdata)->bit_rate;
1417 hfi->layer_id = ((struct hal_bitrate *)pdata)->layer_id;
1418
1419 pkt->size += sizeof(u32) + sizeof(struct hfi_bitrate);
1420 break;
1421 }
1422 case HAL_PARAM_PROFILE_LEVEL_CURRENT:
1423 {
1424 struct hfi_profile_level *hfi;
1425 struct hal_profile_level *prop =
1426 (struct hal_profile_level *) pdata;
1427
1428 pkt->rg_property_data[0] =
1429 HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT;
1430 hfi = (struct hfi_profile_level *)
1431 &pkt->rg_property_data[1];
1432 hfi->level = prop->level;
1433 hfi->profile = hal_to_hfi_type(HAL_PARAM_PROFILE_LEVEL_CURRENT,
1434 prop->profile);
1435 if (hfi->profile <= 0) {
1436 hfi->profile = HFI_H264_PROFILE_HIGH;
1437 dprintk(VIDC_WARN,
1438 "Profile %d not supported, falling back to high\n",
1439 prop->profile);
1440 }
1441
1442 if (!hfi->level) {
1443 hfi->level = 1;
1444 dprintk(VIDC_WARN,
1445 "Level %d not supported, falling back to high\n",
1446 prop->level);
1447 }
1448
1449 pkt->size += sizeof(u32) + sizeof(struct hfi_profile_level);
1450 break;
1451 }
1452 case HAL_PARAM_VENC_H264_ENTROPY_CONTROL:
1453 {
1454 struct hfi_h264_entropy_control *hfi;
1455 struct hal_h264_entropy_control *prop =
1456 (struct hal_h264_entropy_control *) pdata;
1457 pkt->rg_property_data[0] =
1458 HFI_PROPERTY_PARAM_VENC_H264_ENTROPY_CONTROL;
1459 hfi = (struct hfi_h264_entropy_control *)
1460 &pkt->rg_property_data[1];
1461 hfi->entropy_mode = hal_to_hfi_type(
1462 HAL_PARAM_VENC_H264_ENTROPY_CONTROL,
1463 prop->entropy_mode);
1464 if (hfi->entropy_mode == HAL_H264_ENTROPY_CABAC)
1465 hfi->cabac_model = hal_to_hfi_type(
1466 HAL_PARAM_VENC_H264_ENTROPY_CABAC_MODEL,
1467 prop->cabac_model);
1468 pkt->size += sizeof(u32) + sizeof(
1469 struct hfi_h264_entropy_control);
1470 break;
1471 }
1472 case HAL_PARAM_VENC_RATE_CONTROL:
1473 {
1474 u32 *rc;
1475
1476 pkt->rg_property_data[0] =
1477 HFI_PROPERTY_PARAM_VENC_RATE_CONTROL;
1478 rc = (u32 *)pdata;
1479 switch ((enum hal_rate_control) *rc) {
1480 case HAL_RATE_CONTROL_OFF:
1481 pkt->rg_property_data[1] = HFI_RATE_CONTROL_OFF;
1482 break;
1483 case HAL_RATE_CONTROL_CBR_CFR:
1484 pkt->rg_property_data[1] = HFI_RATE_CONTROL_CBR_CFR;
1485 break;
1486 case HAL_RATE_CONTROL_CBR_VFR:
1487 pkt->rg_property_data[1] = HFI_RATE_CONTROL_CBR_VFR;
1488 break;
1489 case HAL_RATE_CONTROL_VBR_CFR:
1490 pkt->rg_property_data[1] = HFI_RATE_CONTROL_VBR_CFR;
1491 break;
1492 case HAL_RATE_CONTROL_VBR_VFR:
1493 pkt->rg_property_data[1] = HFI_RATE_CONTROL_VBR_VFR;
1494 break;
1495 case HAL_RATE_CONTROL_MBR_CFR:
1496 pkt->rg_property_data[1] = HFI_RATE_CONTROL_MBR_CFR;
1497 break;
1498 case HAL_RATE_CONTROL_MBR_VFR:
1499 pkt->rg_property_data[1] = HFI_RATE_CONTROL_MBR_VFR;
1500 break;
1501 default:
1502 dprintk(VIDC_ERR,
1503 "Invalid Rate control setting: %pK\n",
1504 pdata);
1505 break;
1506 }
1507 pkt->size += sizeof(u32) * 2;
1508 break;
1509 }
1510 case HAL_PARAM_VENC_MPEG4_TIME_RESOLUTION:
1511 {
1512 struct hfi_mpeg4_time_resolution *hfi;
1513
1514 pkt->rg_property_data[0] =
1515 HFI_PROPERTY_PARAM_VENC_MPEG4_TIME_RESOLUTION;
1516 hfi = (struct hfi_mpeg4_time_resolution *)
1517 &pkt->rg_property_data[1];
1518 hfi->time_increment_resolution =
1519 ((struct hal_mpeg4_time_resolution *)pdata)->
1520 time_increment_resolution;
1521 pkt->size += sizeof(u32) * 2;
1522 break;
1523 }
1524 case HAL_PARAM_VENC_MPEG4_HEADER_EXTENSION:
1525 {
1526 struct hfi_mpeg4_header_extension *hfi;
1527
1528 pkt->rg_property_data[0] =
1529 HFI_PROPERTY_PARAM_VENC_MPEG4_HEADER_EXTENSION;
1530 hfi = (struct hfi_mpeg4_header_extension *)
1531 &pkt->rg_property_data[1];
1532 hfi->header_extension = (u32)(unsigned long) pdata;
1533 pkt->size += sizeof(u32) * 2;
1534 break;
1535 }
1536 case HAL_PARAM_VENC_H264_DEBLOCK_CONTROL:
1537 {
1538 struct hfi_h264_db_control *hfi;
1539 struct hal_h264_db_control *prop =
1540 (struct hal_h264_db_control *) pdata;
1541 pkt->rg_property_data[0] =
1542 HFI_PROPERTY_PARAM_VENC_H264_DEBLOCK_CONTROL;
1543 hfi = (struct hfi_h264_db_control *) &pkt->rg_property_data[1];
1544 switch (prop->mode) {
1545 case HAL_H264_DB_MODE_DISABLE:
1546 hfi->mode = HFI_H264_DB_MODE_DISABLE;
1547 break;
1548 case HAL_H264_DB_MODE_SKIP_SLICE_BOUNDARY:
1549 hfi->mode = HFI_H264_DB_MODE_SKIP_SLICE_BOUNDARY;
1550 break;
1551 case HAL_H264_DB_MODE_ALL_BOUNDARY:
1552 hfi->mode = HFI_H264_DB_MODE_ALL_BOUNDARY;
1553 break;
1554 default:
1555 dprintk(VIDC_ERR, "Invalid deblocking mode: %#x\n",
1556 prop->mode);
1557 break;
1558 }
1559 hfi->slice_alpha_offset = prop->slice_alpha_offset;
1560 hfi->slice_beta_offset = prop->slice_beta_offset;
1561 pkt->size += sizeof(u32) +
1562 sizeof(struct hfi_h264_db_control);
1563 break;
1564 }
1565 case HAL_PARAM_VENC_SESSION_QP:
1566 {
1567 struct hfi_quantization *hfi;
1568 struct hal_quantization *hal_quant =
1569 (struct hal_quantization *) pdata;
1570 pkt->rg_property_data[0] =
1571 HFI_PROPERTY_PARAM_VENC_SESSION_QP;
1572 hfi = (struct hfi_quantization *) &pkt->rg_property_data[1];
1573 hfi->qp_i = hal_quant->qpi;
1574 hfi->qp_p = hal_quant->qpp;
1575 hfi->qp_b = hal_quant->qpb;
1576 hfi->layer_id = hal_quant->layer_id;
1577 pkt->size += sizeof(u32) + sizeof(struct hfi_quantization);
1578 break;
1579 }
1580 case HAL_PARAM_VENC_SESSION_QP_RANGE:
1581 {
1582 struct hfi_quantization_range *hfi;
1583 struct hfi_quantization_range *hal_range =
1584 (struct hfi_quantization_range *) pdata;
1585 u32 min_qp, max_qp;
1586
1587 pkt->rg_property_data[0] =
1588 HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE;
1589 hfi = (struct hfi_quantization_range *)
1590 &pkt->rg_property_data[1];
1591
1592 min_qp = hal_range->min_qp;
1593 max_qp = hal_range->max_qp;
1594
1595 /* We'll be packing in the qp, so make sure we
1596 * won't be losing data when masking
1597 */
1598 if (min_qp > 0xff || max_qp > 0xff) {
1599 dprintk(VIDC_ERR, "qp value out of range\n");
1600 rc = -ERANGE;
1601 break;
1602 }
1603
1604 /* When creating the packet, pack the qp value as
1605 * 0xiippbb, where ii = qp range for I-frames,
1606 * pp = qp range for P-frames, etc.
1607 */
1608 hfi->min_qp = min_qp | min_qp << 8 | min_qp << 16;
1609 hfi->max_qp = max_qp | max_qp << 8 | max_qp << 16;
1610 hfi->layer_id = hal_range->layer_id;
1611
1612 pkt->size += sizeof(u32) +
1613 sizeof(struct hfi_quantization_range);
1614 break;
1615 }
1616 case HAL_PARAM_VENC_SESSION_QP_RANGE_PACKED:
1617 {
1618 struct hfi_quantization_range *hfi;
1619 struct hfi_quantization_range *hal_range =
1620 (struct hfi_quantization_range *) pdata;
1621
1622 pkt->rg_property_data[0] =
1623 HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE;
1624 hfi = (struct hfi_quantization_range *)
1625 &pkt->rg_property_data[1];
1626
1627 hfi->min_qp = hal_range->min_qp;
1628 hfi->max_qp = hal_range->max_qp;
1629 hfi->layer_id = hal_range->layer_id;
1630
1631 pkt->size += sizeof(u32) +
1632 sizeof(struct hfi_quantization_range);
1633 break;
1634 }
1635 case HAL_PARAM_VENC_SEARCH_RANGE:
1636 {
1637 struct hfi_vc1e_perf_cfg_type *hfi;
1638 struct hal_vc1e_perf_cfg_type *hal_mv_searchrange =
1639 (struct hal_vc1e_perf_cfg_type *) pdata;
1640 pkt->rg_property_data[0] =
1641 HFI_PROPERTY_PARAM_VENC_VC1_PERF_CFG;
1642 hfi = (struct hfi_vc1e_perf_cfg_type *)
1643 &pkt->rg_property_data[1];
1644 hfi->search_range_x_subsampled[0] =
1645 hal_mv_searchrange->i_frame.x_subsampled;
1646 hfi->search_range_x_subsampled[1] =
1647 hal_mv_searchrange->p_frame.x_subsampled;
1648 hfi->search_range_x_subsampled[2] =
1649 hal_mv_searchrange->b_frame.x_subsampled;
1650 hfi->search_range_y_subsampled[0] =
1651 hal_mv_searchrange->i_frame.y_subsampled;
1652 hfi->search_range_y_subsampled[1] =
1653 hal_mv_searchrange->p_frame.y_subsampled;
1654 hfi->search_range_y_subsampled[2] =
1655 hal_mv_searchrange->b_frame.y_subsampled;
1656 pkt->size += sizeof(u32) +
1657 sizeof(struct hfi_vc1e_perf_cfg_type);
1658 break;
1659 }
1660 case HAL_PARAM_VENC_MAX_NUM_B_FRAMES:
1661 {
1662 struct hfi_max_num_b_frames *hfi;
1663
1664 pkt->rg_property_data[0] =
1665 HFI_PROPERTY_PARAM_VENC_MAX_NUM_B_FRAMES;
1666 hfi = (struct hfi_max_num_b_frames *) &pkt->rg_property_data[1];
1667 memcpy(hfi, (struct hfi_max_num_b_frames *) pdata,
1668 sizeof(struct hfi_max_num_b_frames));
1669 pkt->size += sizeof(u32) + sizeof(struct hfi_max_num_b_frames);
1670 break;
1671 }
1672 case HAL_CONFIG_VENC_INTRA_PERIOD:
1673 {
1674 struct hfi_intra_period *hfi;
1675
1676 pkt->rg_property_data[0] =
1677 HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD;
1678 hfi = (struct hfi_intra_period *) &pkt->rg_property_data[1];
1679 memcpy(hfi, (struct hfi_intra_period *) pdata,
1680 sizeof(struct hfi_intra_period));
1681 pkt->size += sizeof(u32) + sizeof(struct hfi_intra_period);
1682 break;
1683 }
1684 case HAL_CONFIG_VENC_IDR_PERIOD:
1685 {
1686 struct hfi_idr_period *hfi;
1687
1688 pkt->rg_property_data[0] = HFI_PROPERTY_CONFIG_VENC_IDR_PERIOD;
1689 hfi = (struct hfi_idr_period *) &pkt->rg_property_data[1];
1690 hfi->idr_period = ((struct hfi_idr_period *) pdata)->idr_period;
1691 pkt->size += sizeof(u32) * 2;
1692 break;
1693 }
1694 case HAL_PARAM_VDEC_CONCEAL_COLOR:
1695 {
1696 struct hfi_conceal_color *hfi;
1697
1698 pkt->rg_property_data[0] =
1699 HFI_PROPERTY_PARAM_VDEC_CONCEAL_COLOR;
1700 hfi = (struct hfi_conceal_color *) &pkt->rg_property_data[1];
1701 if (hfi)
1702 hfi->conceal_color =
1703 ((struct hfi_conceal_color *) pdata)->
1704 conceal_color;
1705 pkt->size += sizeof(u32) * 2;
1706 break;
1707 }
1708 case HAL_CONFIG_VPE_OPERATIONS:
1709 {
1710 struct hfi_operations_type *hfi;
1711
1712 struct hal_operations *prop =
1713 (struct hal_operations *) pdata;
1714 pkt->rg_property_data[0] = HFI_PROPERTY_CONFIG_VPE_OPERATIONS;
1715 hfi = (struct hfi_operations_type *) &pkt->rg_property_data[1];
1716 switch (prop->rotate) {
1717 case HAL_ROTATE_NONE:
1718 hfi->rotation = HFI_ROTATE_NONE;
1719 break;
1720 case HAL_ROTATE_90:
1721 hfi->rotation = HFI_ROTATE_90;
1722 break;
1723 case HAL_ROTATE_180:
1724 hfi->rotation = HFI_ROTATE_180;
1725 break;
1726 case HAL_ROTATE_270:
1727 hfi->rotation = HFI_ROTATE_270;
1728 break;
1729 default:
1730 dprintk(VIDC_ERR, "Invalid rotation setting: %#x\n",
1731 prop->rotate);
1732 rc = -EINVAL;
1733 break;
1734 }
1735 switch (prop->flip) {
1736 case HAL_FLIP_NONE:
1737 hfi->flip = HFI_FLIP_NONE;
1738 break;
1739 case HAL_FLIP_HORIZONTAL:
1740 hfi->flip = HFI_FLIP_HORIZONTAL;
1741 break;
1742 case HAL_FLIP_VERTICAL:
1743 hfi->flip = HFI_FLIP_VERTICAL;
1744 break;
1745 default:
1746 dprintk(VIDC_ERR, "Invalid flip setting: %#x\n",
1747 prop->flip);
1748 rc = -EINVAL;
1749 break;
1750 }
1751 pkt->size += sizeof(u32) + sizeof(struct hfi_operations_type);
1752 break;
1753 }
1754 case HAL_PARAM_VENC_INTRA_REFRESH:
1755 {
1756 struct hfi_intra_refresh *hfi;
1757 struct hal_intra_refresh *prop =
1758 (struct hal_intra_refresh *) pdata;
1759 pkt->rg_property_data[0] =
1760 HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH;
1761 hfi = (struct hfi_intra_refresh *) &pkt->rg_property_data[1];
1762 switch (prop->mode) {
1763 case HAL_INTRA_REFRESH_NONE:
1764 hfi->mode = HFI_INTRA_REFRESH_NONE;
1765 break;
1766 case HAL_INTRA_REFRESH_ADAPTIVE:
1767 hfi->mode = HFI_INTRA_REFRESH_ADAPTIVE;
1768 break;
1769 case HAL_INTRA_REFRESH_CYCLIC:
1770 hfi->mode = HFI_INTRA_REFRESH_CYCLIC;
1771 break;
1772 case HAL_INTRA_REFRESH_CYCLIC_ADAPTIVE:
1773 hfi->mode = HFI_INTRA_REFRESH_CYCLIC_ADAPTIVE;
1774 break;
1775 case HAL_INTRA_REFRESH_RANDOM:
1776 hfi->mode = HFI_INTRA_REFRESH_RANDOM;
1777 break;
1778 default:
1779 dprintk(VIDC_ERR,
1780 "Invalid intra refresh setting: %#x\n",
1781 prop->mode);
1782 break;
1783 }
1784 hfi->air_mbs = prop->air_mbs;
1785 hfi->air_ref = prop->air_ref;
1786 hfi->cir_mbs = prop->cir_mbs;
1787 pkt->size += sizeof(u32) + sizeof(struct hfi_intra_refresh);
1788 break;
1789 }
1790 case HAL_PARAM_VENC_MULTI_SLICE_CONTROL:
1791 {
1792 struct hfi_multi_slice_control *hfi;
1793 struct hal_multi_slice_control *prop =
1794 (struct hal_multi_slice_control *) pdata;
1795 pkt->rg_property_data[0] =
1796 HFI_PROPERTY_PARAM_VENC_MULTI_SLICE_CONTROL;
1797 hfi = (struct hfi_multi_slice_control *)
1798 &pkt->rg_property_data[1];
1799 switch (prop->multi_slice) {
1800 case HAL_MULTI_SLICE_OFF:
1801 hfi->multi_slice = HFI_MULTI_SLICE_OFF;
1802 break;
1803 case HAL_MULTI_SLICE_GOB:
1804 hfi->multi_slice = HFI_MULTI_SLICE_GOB;
1805 break;
1806 case HAL_MULTI_SLICE_BY_MB_COUNT:
1807 hfi->multi_slice = HFI_MULTI_SLICE_BY_MB_COUNT;
1808 break;
1809 case HAL_MULTI_SLICE_BY_BYTE_COUNT:
1810 hfi->multi_slice = HFI_MULTI_SLICE_BY_BYTE_COUNT;
1811 break;
1812 default:
1813 dprintk(VIDC_ERR, "Invalid slice settings: %#x\n",
1814 prop->multi_slice);
1815 break;
1816 }
1817 hfi->slice_size = prop->slice_size;
1818 pkt->size += sizeof(u32) + sizeof(struct
1819 hfi_multi_slice_control);
1820 break;
1821 }
1822 case HAL_PARAM_INDEX_EXTRADATA:
1823 {
1824 struct hfi_index_extradata_config *hfi;
1825 struct hal_extradata_enable *extra = pdata;
1826 int id = 0;
1827
1828 pkt->rg_property_data[0] =
1829 get_hfi_extradata_index(extra->index);
1830 hfi = (struct hfi_index_extradata_config *)
1831 &pkt->rg_property_data[1];
1832 hfi->enable = extra->enable;
1833 id = get_hfi_extradata_id(extra->index);
1834 if (id)
1835 hfi->index_extra_data_id = id;
1836 else {
1837 dprintk(VIDC_WARN,
1838 "Failed to find extradata id: %d\n",
1839 id);
1840 rc = -EINVAL;
1841 }
1842 pkt->size += sizeof(u32) +
1843 sizeof(struct hfi_index_extradata_config);
1844 break;
1845 }
1846 case HAL_PARAM_VENC_SLICE_DELIVERY_MODE:
1847 {
1848 create_pkt_enable(pkt->rg_property_data,
1849 HFI_PROPERTY_PARAM_VENC_SLICE_DELIVERY_MODE,
1850 ((struct hal_enable *)pdata)->enable);
1851 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1852 break;
1853 }
1854 case HAL_PARAM_VENC_H264_VUI_TIMING_INFO:
1855 {
1856 struct hfi_h264_vui_timing_info *hfi;
1857 struct hal_h264_vui_timing_info *timing_info = pdata;
1858
1859 pkt->rg_property_data[0] =
1860 HFI_PROPERTY_PARAM_VENC_H264_VUI_TIMING_INFO;
1861
1862 hfi = (struct hfi_h264_vui_timing_info *)&pkt->
1863 rg_property_data[1];
1864 hfi->enable = timing_info->enable;
1865 hfi->fixed_frame_rate = timing_info->fixed_frame_rate;
1866 hfi->time_scale = timing_info->time_scale;
1867
1868 pkt->size += sizeof(u32) +
1869 sizeof(struct hfi_h264_vui_timing_info);
1870 break;
1871 }
1872 case HAL_CONFIG_VPE_DEINTERLACE:
1873 {
1874 create_pkt_enable(pkt->rg_property_data,
1875 HFI_PROPERTY_CONFIG_VPE_DEINTERLACE,
1876 ((struct hal_enable *)pdata)->enable);
1877 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1878 break;
1879 }
1880 case HAL_PARAM_VENC_GENERATE_AUDNAL:
1881 {
1882 create_pkt_enable(pkt->rg_property_data,
1883 HFI_PROPERTY_PARAM_VENC_GENERATE_AUDNAL,
1884 ((struct hal_enable *)pdata)->enable);
1885 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1886 break;
1887 }
1888 case HAL_PARAM_BUFFER_ALLOC_MODE:
1889 {
1890 u32 buffer_type;
1891 u32 buffer_mode;
1892 struct hfi_buffer_alloc_mode *hfi;
1893 struct hal_buffer_alloc_mode *alloc_info = pdata;
1894
1895 pkt->rg_property_data[0] =
1896 HFI_PROPERTY_PARAM_BUFFER_ALLOC_MODE;
1897 hfi = (struct hfi_buffer_alloc_mode *)
1898 &pkt->rg_property_data[1];
1899 buffer_type = get_hfi_buffer(alloc_info->buffer_type);
1900 if (buffer_type)
1901 hfi->buffer_type = buffer_type;
1902 else
1903 return -EINVAL;
1904 buffer_mode = get_hfi_buf_mode(alloc_info->buffer_mode);
1905 if (buffer_mode)
1906 hfi->buffer_mode = buffer_mode;
1907 else
1908 return -EINVAL;
1909 pkt->size += sizeof(u32) + sizeof(struct hfi_buffer_alloc_mode);
1910 break;
1911 }
1912 case HAL_PARAM_VDEC_FRAME_ASSEMBLY:
1913 {
1914 create_pkt_enable(pkt->rg_property_data,
1915 HFI_PROPERTY_PARAM_VDEC_FRAME_ASSEMBLY,
1916 ((struct hal_enable *)pdata)->enable);
1917 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1918 break;
1919 }
1920 case HAL_PARAM_VENC_H264_VUI_BITSTREAM_RESTRC:
1921 {
1922 create_pkt_enable(pkt->rg_property_data,
1923 HFI_PROPERTY_PARAM_VENC_H264_VUI_BITSTREAM_RESTRC,
1924 ((struct hal_enable *)pdata)->enable);
1925 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1926 break;
1927 }
1928 case HAL_PARAM_VENC_PRESERVE_TEXT_QUALITY:
1929 {
1930 create_pkt_enable(pkt->rg_property_data,
1931 HFI_PROPERTY_PARAM_VENC_PRESERVE_TEXT_QUALITY,
1932 ((struct hal_enable *)pdata)->enable);
1933 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1934 break;
1935 }
1936 case HAL_PARAM_VDEC_SCS_THRESHOLD:
1937 {
1938 struct hfi_scs_threshold *hfi;
1939
1940 pkt->rg_property_data[0] =
1941 HFI_PROPERTY_PARAM_VDEC_SCS_THRESHOLD;
1942 hfi = (struct hfi_scs_threshold *) &pkt->rg_property_data[1];
1943 hfi->threshold_value =
1944 ((struct hal_scs_threshold *) pdata)->threshold_value;
1945 pkt->size += sizeof(u32) + sizeof(struct hfi_scs_threshold);
1946 break;
1947 }
1948 case HAL_PARAM_MVC_BUFFER_LAYOUT:
1949 {
1950 struct hfi_mvc_buffer_layout_descp_type *hfi;
1951 struct hal_mvc_buffer_layout *layout_info = pdata;
1952
1953 pkt->rg_property_data[0] = HFI_PROPERTY_PARAM_MVC_BUFFER_LAYOUT;
1954 hfi = (struct hfi_mvc_buffer_layout_descp_type *)
1955 &pkt->rg_property_data[1];
1956 hfi->layout_type = get_hfi_layout(layout_info->layout_type);
1957 hfi->bright_view_first = layout_info->bright_view_first;
1958 hfi->ngap = layout_info->ngap;
1959 pkt->size += sizeof(u32) +
1960 sizeof(struct hfi_mvc_buffer_layout_descp_type);
1961 break;
1962 }
1963 case HAL_PARAM_VENC_LTRMODE:
1964 {
1965 struct hfi_ltr_mode *hfi;
1966 struct hal_ltr_mode *hal = pdata;
1967
1968 pkt->rg_property_data[0] =
1969 HFI_PROPERTY_PARAM_VENC_LTRMODE;
1970 hfi = (struct hfi_ltr_mode *) &pkt->rg_property_data[1];
1971 hfi->ltr_mode = get_hfi_ltr_mode(hal->mode);
1972 hfi->ltr_count = hal->count;
1973 hfi->trust_mode = hal->trust_mode;
1974 pkt->size += sizeof(u32) + sizeof(struct hfi_ltr_mode);
1975 break;
1976 }
1977 case HAL_CONFIG_VENC_USELTRFRAME:
1978 {
1979 struct hfi_ltr_use *hfi;
1980 struct hal_ltr_use *hal = pdata;
1981
1982 pkt->rg_property_data[0] =
1983 HFI_PROPERTY_CONFIG_VENC_USELTRFRAME;
1984 hfi = (struct hfi_ltr_use *) &pkt->rg_property_data[1];
1985 hfi->frames = hal->frames;
1986 hfi->ref_ltr = hal->ref_ltr;
1987 hfi->use_constrnt = hal->use_constraint;
1988 pkt->size += sizeof(u32) + sizeof(struct hfi_ltr_use);
1989 break;
1990 }
1991 case HAL_CONFIG_VENC_MARKLTRFRAME:
1992 {
1993 struct hfi_ltr_mark *hfi;
1994 struct hal_ltr_mark *hal = pdata;
1995
1996 pkt->rg_property_data[0] =
1997 HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME;
1998 hfi = (struct hfi_ltr_mark *) &pkt->rg_property_data[1];
1999 hfi->mark_frame = hal->mark_frame;
2000 pkt->size += sizeof(u32) + sizeof(struct hfi_ltr_mark);
2001 break;
2002 }
2003 case HAL_PARAM_VENC_HIER_P_MAX_ENH_LAYERS:
2004 {
2005 pkt->rg_property_data[0] =
2006 HFI_PROPERTY_PARAM_VENC_HIER_P_MAX_NUM_ENH_LAYER;
2007 pkt->rg_property_data[1] = *(u32 *)pdata;
2008 pkt->size += sizeof(u32) * 2;
2009 break;
2010 }
2011 case HAL_CONFIG_VENC_HIER_P_NUM_FRAMES:
2012 {
2013 pkt->rg_property_data[0] =
2014 HFI_PROPERTY_CONFIG_VENC_HIER_P_ENH_LAYER;
2015 pkt->rg_property_data[1] = *(u32 *)pdata;
2016 pkt->size += sizeof(u32) * 2;
2017 break;
2018 }
2019 case HAL_PARAM_VENC_DISABLE_RC_TIMESTAMP:
2020 {
2021 create_pkt_enable(pkt->rg_property_data,
2022 HFI_PROPERTY_PARAM_VENC_DISABLE_RC_TIMESTAMP,
2023 ((struct hal_enable *)pdata)->enable);
2024 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
2025 break;
2026 }
2027 case HAL_PARAM_VENC_ENABLE_INITIAL_QP:
2028 {
2029 struct hfi_initial_quantization *hfi;
2030 struct hal_initial_quantization *quant = pdata;
2031
2032 pkt->rg_property_data[0] =
2033 HFI_PROPERTY_PARAM_VENC_INITIAL_QP;
2034 hfi = (struct hfi_initial_quantization *)
2035 &pkt->rg_property_data[1];
2036 hfi->init_qp_enable = quant->init_qp_enable;
2037 hfi->qp_i = quant->qpi;
2038 hfi->qp_p = quant->qpp;
2039 hfi->qp_b = quant->qpb;
2040 pkt->size += sizeof(u32) +
2041 sizeof(struct hfi_initial_quantization);
2042 break;
2043 }
2044 case HAL_PARAM_VPE_COLOR_SPACE_CONVERSION:
2045 {
2046 struct hfi_vpe_color_space_conversion *hfi = NULL;
2047 struct hal_vpe_color_space_conversion *hal = pdata;
2048
2049 pkt->rg_property_data[0] =
2050 HFI_PROPERTY_PARAM_VPE_COLOR_SPACE_CONVERSION;
2051 hfi = (struct hfi_vpe_color_space_conversion *)
2052 &pkt->rg_property_data[1];
2053 memcpy(hfi->csc_matrix, hal->csc_matrix,
2054 sizeof(hfi->csc_matrix));
2055 memcpy(hfi->csc_bias, hal->csc_bias, sizeof(hfi->csc_bias));
2056 memcpy(hfi->csc_limit, hal->csc_limit, sizeof(hfi->csc_limit));
2057 pkt->size += sizeof(u32) +
2058 sizeof(struct hfi_vpe_color_space_conversion);
2059 break;
2060 }
2061 case HAL_PARAM_VENC_VPX_ERROR_RESILIENCE_MODE:
2062 {
2063 create_pkt_enable(pkt->rg_property_data,
2064 HFI_PROPERTY_PARAM_VENC_VPX_ERROR_RESILIENCE_MODE,
2065 ((struct hal_enable *)pdata)->enable);
2066 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
2067 break;
2068 }
2069 case HAL_PARAM_VENC_H264_NAL_SVC_EXT:
2070 {
2071 create_pkt_enable(pkt->rg_property_data,
2072 HFI_PROPERTY_PARAM_VENC_H264_NAL_SVC_EXT,
2073 ((struct hal_enable *)pdata)->enable);
2074 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
2075 break;
2076 }
2077 case HAL_CONFIG_VENC_PERF_MODE:
2078 {
2079 u32 hfi_perf_mode = 0;
2080 enum hal_perf_mode hal_perf_mode = *(enum hal_perf_mode *)pdata;
2081
2082 switch (hal_perf_mode) {
2083 case HAL_PERF_MODE_POWER_SAVE:
2084 hfi_perf_mode = HFI_VENC_PERFMODE_POWER_SAVE;
2085 break;
2086 case HAL_PERF_MODE_POWER_MAX_QUALITY:
2087 hfi_perf_mode = HFI_VENC_PERFMODE_MAX_QUALITY;
2088 break;
2089 default:
2090 return -ENOTSUPP;
2091 }
2092
2093 pkt->rg_property_data[0] = HFI_PROPERTY_CONFIG_VENC_PERF_MODE;
2094 pkt->rg_property_data[1] = hfi_perf_mode;
2095 pkt->size += sizeof(u32) * 2;
2096 break;
2097 }
2098 case HAL_PARAM_VENC_HIER_B_MAX_ENH_LAYERS:
2099 {
2100 pkt->rg_property_data[0] =
2101 HFI_PROPERTY_PARAM_VENC_HIER_B_MAX_NUM_ENH_LAYER;
2102 pkt->rg_property_data[1] = *(u32 *)pdata;
2103 pkt->size += sizeof(u32) * 2;
2104 break;
2105 }
2106 case HAL_PARAM_VDEC_NON_SECURE_OUTPUT2:
2107 {
2108 create_pkt_enable(pkt->rg_property_data,
2109 HFI_PROPERTY_PARAM_VDEC_NONCP_OUTPUT2,
2110 ((struct hal_enable *)pdata)->enable);
2111 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
2112 break;
2113 }
2114 case HAL_PARAM_VENC_HIER_P_HYBRID_MODE:
2115 {
2116 pkt->rg_property_data[0] =
2117 HFI_PROPERTY_PARAM_VENC_HIER_P_HYBRID_MODE;
2118 pkt->rg_property_data[1] =
2119 ((struct hfi_hybrid_hierp *)pdata)->layers;
2120 pkt->size += sizeof(u32) +
2121 sizeof(struct hfi_hybrid_hierp);
2122 break;
2123 }
2124 case HAL_PARAM_VENC_MBI_STATISTICS_MODE:
2125 {
2126 pkt->rg_property_data[0] =
2127 HFI_PROPERTY_PARAM_VENC_MBI_DUMPING;
2128 pkt->rg_property_data[1] = hal_to_hfi_type(
2129 HAL_PARAM_VENC_MBI_STATISTICS_MODE,
2130 *(u32 *)pdata);
2131 pkt->size += sizeof(u32) * 2;
2132 break;
2133 }
2134 case HAL_CONFIG_VENC_FRAME_QP:
2135 {
2136 pkt->rg_property_data[0] =
2137 HFI_PROPERTY_CONFIG_VENC_FRAME_QP;
2138 pkt->rg_property_data[1] = *(u32 *)pdata;
2139 pkt->size += sizeof(u32) * 2;
2140 break;
2141 }
2142 case HAL_CONFIG_VENC_BASELAYER_PRIORITYID:
2143 {
2144 pkt->rg_property_data[0] =
2145 HFI_PROPERTY_CONFIG_VENC_BASELAYER_PRIORITYID;
2146 pkt->rg_property_data[1] = *(u32 *)pdata;
2147 pkt->size += sizeof(u32) * 2;
2148 break;
2149 }
2150 case HAL_PROPERTY_PARAM_VENC_ASPECT_RATIO:
2151 {
2152 struct hfi_aspect_ratio *hfi = NULL;
2153 struct hal_aspect_ratio *hal = pdata;
2154
2155 pkt->rg_property_data[0] =
2156 HFI_PROPERTY_PARAM_VENC_ASPECT_RATIO;
2157 hfi = (struct hfi_aspect_ratio *)
2158 &pkt->rg_property_data[1];
2159 memcpy(hfi, hal,
2160 sizeof(struct hfi_aspect_ratio));
2161 pkt->size += sizeof(u32) +
2162 sizeof(struct hfi_aspect_ratio);
2163 break;
2164 }
2165 case HAL_PARAM_VENC_BITRATE_TYPE:
2166 {
2167 create_pkt_enable(pkt->rg_property_data,
2168 HFI_PROPERTY_PARAM_VENC_BITRATE_TYPE,
2169 ((struct hal_enable *)pdata)->enable);
2170 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
2171 break;
2172 }
2173 case HAL_PARAM_VENC_CONSTRAINED_INTRA_PRED:
2174 {
2175 create_pkt_enable(pkt->rg_property_data,
2176 HFI_PROPERTY_PARAM_VENC_CONSTRAINED_INTRA_PRED,
2177 ((struct hal_enable *)pdata)->enable);
2178 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
2179 break;
2180 }
2181 case HAL_PARAM_VENC_VIDEO_SIGNAL_INFO:
2182 {
2183 struct hal_video_signal_info *hal = pdata;
2184 struct hfi_video_signal_metadata *signal_info =
2185 (struct hfi_video_signal_metadata *)
2186 &pkt->rg_property_data[1];
2187
2188 signal_info->enable = true;
2189 signal_info->video_format = MSM_VIDC_NTSC;
2190 signal_info->video_full_range = hal->full_range;
2191 signal_info->color_description = MSM_VIDC_COLOR_DESC_PRESENT;
2192 signal_info->color_primaries = hal->color_space;
2193 signal_info->transfer_characteristics = hal->transfer_chars;
2194 signal_info->matrix_coeffs = hal->matrix_coeffs;
2195
2196 pkt->rg_property_data[0] =
2197 HFI_PROPERTY_PARAM_VENC_VIDEO_SIGNAL_INFO;
2198 pkt->size += sizeof(u32) + sizeof(*signal_info);
2199 break;
2200 }
2201 case HAL_PARAM_VENC_H264_TRANSFORM_8x8:
2202 {
2203 create_pkt_enable(pkt->rg_property_data,
2204 HFI_PROPERTY_PARAM_VENC_H264_8X8_TRANSFORM,
2205 ((struct hal_enable *)pdata)->enable);
2206 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
2207 break;
2208 }
2209 case HAL_PARAM_VENC_IFRAMESIZE_TYPE:
2210 {
2211 enum hal_iframesize_type hal =
2212 *(enum hal_iframesize_type *)pdata;
2213 struct hfi_iframe_size *hfi = (struct hfi_iframe_size *)
2214 &pkt->rg_property_data[1];
2215
2216 switch (hal) {
2217 case HAL_IFRAMESIZE_TYPE_DEFAULT:
2218 hfi->type = HFI_IFRAME_SIZE_DEFAULT;
2219 break;
2220 case HAL_IFRAMESIZE_TYPE_MEDIUM:
2221 hfi->type = HFI_IFRAME_SIZE_MEDIUM;
2222 break;
2223 case HAL_IFRAMESIZE_TYPE_HUGE:
2224 hfi->type = HFI_IFRAME_SIZE_HIGH;
2225 break;
2226 case HAL_IFRAMESIZE_TYPE_UNLIMITED:
2227 hfi->type = HFI_IFRAME_SIZE_UNLIMITED;
2228 break;
2229 default:
2230 return -ENOTSUPP;
2231 }
2232 pkt->rg_property_data[0] = HFI_PROPERTY_PARAM_VENC_IFRAMESIZE;
2233 pkt->size += sizeof(u32) + sizeof(struct hfi_iframe_size);
2234 break;
2235 }
2236 /* FOLLOWING PROPERTIES ARE NOT IMPLEMENTED IN CORE YET */
2237 case HAL_CONFIG_BUFFER_REQUIREMENTS:
2238 case HAL_CONFIG_PRIORITY:
2239 case HAL_CONFIG_BATCH_INFO:
2240 case HAL_PARAM_METADATA_PASS_THROUGH:
2241 case HAL_SYS_IDLE_INDICATOR:
2242 case HAL_PARAM_UNCOMPRESSED_FORMAT_SUPPORTED:
2243 case HAL_PARAM_INTERLACE_FORMAT_SUPPORTED:
2244 case HAL_PARAM_CHROMA_SITE:
2245 case HAL_PARAM_PROPERTIES_SUPPORTED:
2246 case HAL_PARAM_PROFILE_LEVEL_SUPPORTED:
2247 case HAL_PARAM_CAPABILITY_SUPPORTED:
2248 case HAL_PARAM_NAL_STREAM_FORMAT_SUPPORTED:
2249 case HAL_PARAM_MULTI_VIEW_FORMAT:
2250 case HAL_PARAM_MAX_SEQUENCE_HEADER_SIZE:
2251 case HAL_PARAM_CODEC_SUPPORTED:
2252 case HAL_PARAM_VDEC_MULTI_VIEW_SELECT:
2253 case HAL_PARAM_VDEC_MB_QUANTIZATION:
2254 case HAL_PARAM_VDEC_NUM_CONCEALED_MB:
2255 case HAL_PARAM_VDEC_H264_ENTROPY_SWITCHING:
2256 case HAL_PARAM_VENC_MPEG4_DATA_PARTITIONING:
2257 case HAL_CONFIG_BUFFER_COUNT_ACTUAL:
2258 case HAL_CONFIG_VDEC_MULTI_STREAM:
2259 case HAL_PARAM_VENC_MULTI_SLICE_INFO:
2260 case HAL_CONFIG_VENC_TIMESTAMP_SCALE:
2261 case HAL_PARAM_BUFFER_SIZE_MINIMUM:
2262 default:
2263 dprintk(VIDC_ERR, "DEFAULT: Calling %#x\n", ptype);
2264 rc = -ENOTSUPP;
2265 break;
2266 }
2267 return rc;
2268}
2269
2270static int get_hfi_ssr_type(enum hal_ssr_trigger_type type)
2271{
2272 int rc = HFI_TEST_SSR_HW_WDOG_IRQ;
2273
2274 switch (type) {
2275 case SSR_ERR_FATAL:
2276 rc = HFI_TEST_SSR_SW_ERR_FATAL;
2277 break;
2278 case SSR_SW_DIV_BY_ZERO:
2279 rc = HFI_TEST_SSR_SW_DIV_BY_ZERO;
2280 break;
2281 case SSR_HW_WDOG_IRQ:
2282 rc = HFI_TEST_SSR_HW_WDOG_IRQ;
2283 break;
2284 default:
2285 dprintk(VIDC_WARN,
2286 "SSR trigger type not recognized, using WDOG.\n");
2287 }
2288 return rc;
2289}
2290
2291int create_pkt_ssr_cmd(enum hal_ssr_trigger_type type,
2292 struct hfi_cmd_sys_test_ssr_packet *pkt)
2293{
2294 if (!pkt) {
2295 dprintk(VIDC_ERR, "Invalid params, device: %pK\n", pkt);
2296 return -EINVAL;
2297 }
2298 pkt->size = sizeof(struct hfi_cmd_sys_test_ssr_packet);
2299 pkt->packet_type = HFI_CMD_SYS_TEST_SSR;
2300 pkt->trigger_type = get_hfi_ssr_type(type);
2301 return 0;
2302}
2303
2304int create_pkt_cmd_sys_image_version(
2305 struct hfi_cmd_sys_get_property_packet *pkt)
2306{
2307 if (!pkt) {
2308 dprintk(VIDC_ERR, "%s invalid param :%pK\n", __func__, pkt);
2309 return -EINVAL;
2310 }
2311 pkt->size = sizeof(struct hfi_cmd_sys_get_property_packet);
2312 pkt->packet_type = HFI_CMD_SYS_GET_PROPERTY;
2313 pkt->num_properties = 1;
2314 pkt->rg_property_data[0] = HFI_PROPERTY_SYS_IMAGE_VERSION;
2315 return 0;
2316}
2317
2318static int create_3x_pkt_cmd_session_set_property(
2319 struct hfi_cmd_session_set_property_packet *pkt,
2320 struct hal_session *session,
2321 enum hal_property ptype, void *pdata)
2322{
2323 int rc = 0;
2324
2325 if (!pkt || !session || !pdata)
2326 return -EINVAL;
2327
2328 pkt->size = sizeof(struct hfi_cmd_session_set_property_packet);
2329 pkt->packet_type = HFI_CMD_SESSION_SET_PROPERTY;
2330 pkt->session_id = hash32_ptr(session);
2331 pkt->num_properties = 1;
2332
2333 /*
2334 * Any session set property which is different in 3XX packetization
2335 * should be added as a new case below. All unchanged session set
2336 * properties will be handled in the default case.
2337 */
2338 switch (ptype) {
2339 case HAL_PARAM_VDEC_MULTI_STREAM:
2340 {
2341 u32 buffer_type;
2342 struct hfi_3x_multi_stream *hfi;
2343 struct hal_multi_stream *prop =
2344 (struct hal_multi_stream *) pdata;
2345 pkt->rg_property_data[0] =
2346 HFI_PROPERTY_PARAM_VDEC_MULTI_STREAM;
2347 hfi = (struct hfi_3x_multi_stream *) &pkt->rg_property_data[1];
2348
2349 buffer_type = get_hfi_buffer(prop->buffer_type);
2350 if (buffer_type)
2351 hfi->buffer_type = buffer_type;
2352 else
2353 return -EINVAL;
2354 hfi->enable = prop->enable;
2355 pkt->size += sizeof(u32) + sizeof(struct hfi_3x_multi_stream);
2356 break;
2357 }
2358 case HAL_PARAM_VENC_INTRA_REFRESH:
2359 {
2360 struct hfi_3x_intra_refresh *hfi;
2361 struct hal_intra_refresh *prop =
2362 (struct hal_intra_refresh *) pdata;
2363 pkt->rg_property_data[0] =
2364 HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH;
2365 hfi = (struct hfi_3x_intra_refresh *) &pkt->rg_property_data[1];
2366 hfi->mbs = 0;
2367 switch (prop->mode) {
2368 case HAL_INTRA_REFRESH_NONE:
2369 hfi->mode = HFI_INTRA_REFRESH_NONE;
2370 break;
2371 case HAL_INTRA_REFRESH_ADAPTIVE:
2372 hfi->mode = HFI_INTRA_REFRESH_ADAPTIVE;
2373 hfi->mbs = prop->air_mbs;
2374 break;
2375 case HAL_INTRA_REFRESH_CYCLIC:
2376 hfi->mode = HFI_INTRA_REFRESH_CYCLIC;
2377 hfi->mbs = prop->cir_mbs;
2378 break;
2379 case HAL_INTRA_REFRESH_CYCLIC_ADAPTIVE:
2380 hfi->mode = HFI_INTRA_REFRESH_CYCLIC_ADAPTIVE;
2381 hfi->mbs = prop->air_mbs;
2382 break;
2383 case HAL_INTRA_REFRESH_RANDOM:
2384 hfi->mode = HFI_INTRA_REFRESH_RANDOM;
2385 hfi->mbs = prop->air_mbs;
2386 break;
2387 default:
2388 dprintk(VIDC_ERR,
2389 "Invalid intra refresh setting: %d\n",
2390 prop->mode);
2391 break;
2392 }
2393 pkt->size += sizeof(u32) + sizeof(struct hfi_3x_intra_refresh);
2394 break;
2395 }
2396 case HAL_PARAM_SYNC_BASED_INTERRUPT:
2397 {
2398 create_pkt_enable(pkt->rg_property_data,
2399 HFI_PROPERTY_PARAM_SYNC_BASED_INTERRUPT,
2400 ((struct hal_enable *)pdata)->enable);
2401 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
2402 break;
2403 }
2404 case HAL_PARAM_VENC_VQZIP_SEI:
2405 {
2406 create_pkt_enable(pkt->rg_property_data,
2407 HFI_PROPERTY_PARAM_VENC_VQZIP_SEI_TYPE,
2408 ((struct hal_enable *)pdata)->enable);
2409 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
2410 break;
2411 }
2412 /* Deprecated param on Venus 3xx */
2413 case HAL_PARAM_VDEC_CONTINUE_DATA_TRANSFER:
2414 {
2415 rc = -ENOTSUPP;
2416 break;
2417 }
2418 case HAL_PARAM_BUFFER_SIZE_MINIMUM:
2419 {
2420 struct hfi_buffer_size_minimum *hfi;
2421 struct hal_buffer_size_minimum *prop =
2422 (struct hal_buffer_size_minimum *) pdata;
2423 u32 buffer_type;
2424
2425 pkt->rg_property_data[0] =
2426 HFI_PROPERTY_PARAM_BUFFER_SIZE_MINIMUM;
2427
2428 hfi = (struct hfi_buffer_size_minimum *)
2429 &pkt->rg_property_data[1];
2430 hfi->buffer_size = prop->buffer_size;
2431
2432 buffer_type = get_hfi_buffer(prop->buffer_type);
2433 if (buffer_type)
2434 hfi->buffer_type = buffer_type;
2435 else
2436 return -EINVAL;
2437
2438 pkt->size += sizeof(u32) + sizeof(struct
2439 hfi_buffer_count_actual);
2440 break;
2441 }
2442 case HAL_PARAM_VENC_H264_PIC_ORDER_CNT:
2443 {
2444 pkt->rg_property_data[0] =
2445 HFI_PROPERTY_PARAM_VENC_H264_PICORDER_CNT_TYPE;
2446 pkt->rg_property_data[1] = *(u32 *)pdata;
2447 pkt->size += sizeof(u32) * 2;
2448 break;
2449 }
2450 case HAL_PARAM_VENC_LOW_LATENCY:
2451 {
2452 struct hfi_enable *hfi;
2453
2454 pkt->rg_property_data[0] =
2455 HFI_PROPERTY_PARAM_VENC_LOW_LATENCY_MODE;
2456 hfi = (struct hfi_enable *) &pkt->rg_property_data[1];
2457 hfi->enable = ((struct hal_enable *) pdata)->enable;
2458 pkt->size += sizeof(u32) * 2;
2459 break;
2460 }
2461 case HAL_CONFIG_VENC_BLUR_RESOLUTION:
2462 {
2463 struct hfi_frame_size *hfi;
2464 struct hal_frame_size *prop = (struct hal_frame_size *) pdata;
2465 u32 buffer_type;
2466
2467 pkt->rg_property_data[0] =
2468 HFI_PROPERTY_CONFIG_VENC_BLUR_FRAME_SIZE;
2469 hfi = (struct hfi_frame_size *) &pkt->rg_property_data[1];
2470 buffer_type = get_hfi_buffer(prop->buffer_type);
2471 if (buffer_type)
2472 hfi->buffer_type = buffer_type;
2473 else
2474 return -EINVAL;
2475
2476 hfi->height = prop->height;
2477 hfi->width = prop->width;
2478 pkt->size += sizeof(u32) + sizeof(struct hfi_frame_size);
2479 break;
2480 }
2481 default:
2482 rc = create_pkt_cmd_session_set_property(pkt,
2483 session, ptype, pdata);
2484 }
2485 return rc;
2486}
2487
2488int create_pkt_cmd_session_sync_process(
2489 struct hfi_cmd_session_sync_process_packet *pkt,
2490 struct hal_session *session)
2491{
2492 if (!pkt || !session)
2493 return -EINVAL;
2494
2495 *pkt = (struct hfi_cmd_session_sync_process_packet) {0};
2496 pkt->size = sizeof(*pkt);
2497 pkt->packet_type = HFI_CMD_SESSION_SYNC;
2498 pkt->session_id = hash32_ptr(session);
2499 pkt->sync_id = 0;
2500
2501 return 0;
2502}
2503
2504static struct hfi_packetization_ops hfi_default = {
2505 .sys_init = create_pkt_cmd_sys_init,
2506 .sys_pc_prep = create_pkt_cmd_sys_pc_prep,
2507 .sys_idle_indicator = create_pkt_cmd_sys_idle_indicator,
2508 .sys_power_control = create_pkt_cmd_sys_power_control,
2509 .sys_set_resource = create_pkt_cmd_sys_set_resource,
2510 .sys_debug_config = create_pkt_cmd_sys_debug_config,
2511 .sys_coverage_config = create_pkt_cmd_sys_coverage_config,
2512 .sys_release_resource = create_pkt_cmd_sys_release_resource,
2513 .sys_ping = create_pkt_cmd_sys_ping,
2514 .sys_image_version = create_pkt_cmd_sys_image_version,
2515 .ssr_cmd = create_pkt_ssr_cmd,
2516 .session_init = create_pkt_cmd_sys_session_init,
2517 .session_cmd = create_pkt_cmd_session_cmd,
2518 .session_set_buffers = create_pkt_cmd_session_set_buffers,
2519 .session_release_buffers = create_pkt_cmd_session_release_buffers,
2520 .session_etb_decoder = create_pkt_cmd_session_etb_decoder,
2521 .session_etb_encoder = create_pkt_cmd_session_etb_encoder,
2522 .session_ftb = create_pkt_cmd_session_ftb,
2523 .session_parse_seq_header = create_pkt_cmd_session_parse_seq_header,
2524 .session_get_seq_hdr = create_pkt_cmd_session_get_seq_hdr,
2525 .session_get_buf_req = create_pkt_cmd_session_get_buf_req,
2526 .session_flush = create_pkt_cmd_session_flush,
2527 .session_get_property = create_pkt_cmd_session_get_property,
2528 .session_set_property = create_pkt_cmd_session_set_property,
2529};
2530
2531struct hfi_packetization_ops *get_venus_3x_ops(void)
2532{
2533 static struct hfi_packetization_ops hfi_venus_3x;
2534
2535 hfi_venus_3x = hfi_default;
2536
2537 /* Override new HFI functions for HFI_PACKETIZATION_3XX here. */
2538 hfi_venus_3x.session_set_property =
2539 create_3x_pkt_cmd_session_set_property;
2540 hfi_venus_3x.session_get_property =
2541 create_3x_pkt_cmd_session_get_property;
2542 hfi_venus_3x.session_cmd = create_3x_pkt_cmd_session_cmd;
2543 hfi_venus_3x.session_sync_process = create_pkt_cmd_session_sync_process;
2544
2545 return &hfi_venus_3x;
2546}
2547
2548struct hfi_packetization_ops *hfi_get_pkt_ops_handle(
2549 enum hfi_packetization_type type)
2550{
2551 dprintk(VIDC_DBG, "%s selected\n",
2552 type == HFI_PACKETIZATION_LEGACY ? "legacy packetization" :
2553 type == HFI_PACKETIZATION_3XX ? "3xx packetization" :
2554 "Unknown hfi");
2555
2556 switch (type) {
2557 case HFI_PACKETIZATION_LEGACY:
2558 return &hfi_default;
2559 case HFI_PACKETIZATION_3XX:
2560 return get_venus_3x_ops();
2561 }
2562
2563 return NULL;
2564}