blob: ac6ded0cd804d99e98d0660cf0306f69820b72c0 [file] [log] [blame]
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001/* Copyright (c) 2012-2017, 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,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080036};
37
38static int entropy_mode[] = {
39 [ilog2(HAL_H264_ENTROPY_CAVLC)] = HFI_H264_ENTROPY_CAVLC,
40 [ilog2(HAL_H264_ENTROPY_CABAC)] = HFI_H264_ENTROPY_CABAC,
41};
42
43static int cabac_model[] = {
44 [ilog2(HAL_H264_CABAC_MODEL_0)] = HFI_H264_CABAC_MODEL_0,
45 [ilog2(HAL_H264_CABAC_MODEL_1)] = HFI_H264_CABAC_MODEL_1,
46 [ilog2(HAL_H264_CABAC_MODEL_2)] = HFI_H264_CABAC_MODEL_2,
47};
48
49static int statistics_mode[] = {
50 [ilog2(HAL_STATISTICS_MODE_DEFAULT)] = HFI_STATISTICS_MODE_DEFAULT,
51 [ilog2(HAL_STATISTICS_MODE_1)] = HFI_STATISTICS_MODE_1,
52 [ilog2(HAL_STATISTICS_MODE_2)] = HFI_STATISTICS_MODE_2,
53 [ilog2(HAL_STATISTICS_MODE_3)] = HFI_STATISTICS_MODE_3,
54};
55
56static int color_format[] = {
57 [ilog2(HAL_COLOR_FORMAT_MONOCHROME)] = HFI_COLOR_FORMAT_MONOCHROME,
58 [ilog2(HAL_COLOR_FORMAT_NV12)] = HFI_COLOR_FORMAT_NV12,
59 [ilog2(HAL_COLOR_FORMAT_NV21)] = HFI_COLOR_FORMAT_NV21,
60 [ilog2(HAL_COLOR_FORMAT_NV12_4x4TILE)] = HFI_COLOR_FORMAT_NV12_4x4TILE,
61 [ilog2(HAL_COLOR_FORMAT_NV21_4x4TILE)] = HFI_COLOR_FORMAT_NV21_4x4TILE,
62 [ilog2(HAL_COLOR_FORMAT_YUYV)] = HFI_COLOR_FORMAT_YUYV,
63 [ilog2(HAL_COLOR_FORMAT_YVYU)] = HFI_COLOR_FORMAT_YVYU,
64 [ilog2(HAL_COLOR_FORMAT_UYVY)] = HFI_COLOR_FORMAT_UYVY,
65 [ilog2(HAL_COLOR_FORMAT_VYUY)] = HFI_COLOR_FORMAT_VYUY,
66 [ilog2(HAL_COLOR_FORMAT_RGB565)] = HFI_COLOR_FORMAT_RGB565,
67 [ilog2(HAL_COLOR_FORMAT_BGR565)] = HFI_COLOR_FORMAT_BGR565,
68 [ilog2(HAL_COLOR_FORMAT_RGB888)] = HFI_COLOR_FORMAT_RGB888,
69 [ilog2(HAL_COLOR_FORMAT_BGR888)] = HFI_COLOR_FORMAT_BGR888,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080070 /* UBWC Color formats*/
71 [ilog2(HAL_COLOR_FORMAT_NV12_UBWC)] = HFI_COLOR_FORMAT_NV12_UBWC,
72 [ilog2(HAL_COLOR_FORMAT_NV12_TP10_UBWC)] =
73 HFI_COLOR_FORMAT_YUV420_TP10_UBWC,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080074};
75
76static int nal_type[] = {
77 [ilog2(HAL_NAL_FORMAT_STARTCODES)] = HFI_NAL_FORMAT_STARTCODES,
78 [ilog2(HAL_NAL_FORMAT_ONE_NAL_PER_BUFFER)] =
79 HFI_NAL_FORMAT_ONE_NAL_PER_BUFFER,
80 [ilog2(HAL_NAL_FORMAT_ONE_BYTE_LENGTH)] =
81 HFI_NAL_FORMAT_ONE_BYTE_LENGTH,
82 [ilog2(HAL_NAL_FORMAT_TWO_BYTE_LENGTH)] =
83 HFI_NAL_FORMAT_TWO_BYTE_LENGTH,
84 [ilog2(HAL_NAL_FORMAT_FOUR_BYTE_LENGTH)] =
85 HFI_NAL_FORMAT_FOUR_BYTE_LENGTH,
86};
87
88static inline int hal_to_hfi_type(int property, int hal_type)
89{
90 if (hal_type <= 0 || roundup_pow_of_two(hal_type) != hal_type) {
91 /*
92 * Not a power of 2, it's not going
93 * to be in any of the tables anyway
94 */
95 return -EINVAL;
96 }
97
98 if (hal_type)
99 hal_type = ilog2(hal_type);
100
101 switch (property) {
102 case HAL_PARAM_PROFILE_LEVEL_CURRENT:
103 return (hal_type >= ARRAY_SIZE(profile_table)) ?
104 -ENOTSUPP : profile_table[hal_type];
105 case HAL_PARAM_VENC_H264_ENTROPY_CONTROL:
106 return (hal_type >= ARRAY_SIZE(entropy_mode)) ?
107 -ENOTSUPP : entropy_mode[hal_type];
108 case HAL_PARAM_VENC_H264_ENTROPY_CABAC_MODEL:
109 return (hal_type >= ARRAY_SIZE(cabac_model)) ?
110 -ENOTSUPP : cabac_model[hal_type];
111 case HAL_PARAM_UNCOMPRESSED_FORMAT_SELECT:
112 return (hal_type >= ARRAY_SIZE(color_format)) ?
113 -ENOTSUPP : color_format[hal_type];
114 case HAL_PARAM_NAL_STREAM_FORMAT_SELECT:
115 return (hal_type >= ARRAY_SIZE(nal_type)) ?
116 -ENOTSUPP : nal_type[hal_type];
117 case HAL_PARAM_VENC_MBI_STATISTICS_MODE:
118 return (hal_type >= ARRAY_SIZE(statistics_mode)) ?
119 -ENOTSUPP : statistics_mode[hal_type];
120 default:
121 return -ENOTSUPP;
122 }
123}
124
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800125enum hal_domain vidc_get_hal_domain(u32 hfi_domain)
126{
127 enum hal_domain hal_domain = 0;
128
129 switch (hfi_domain) {
130 case HFI_VIDEO_DOMAIN_VPE:
131 hal_domain = HAL_VIDEO_DOMAIN_VPE;
132 break;
133 case HFI_VIDEO_DOMAIN_ENCODER:
134 hal_domain = HAL_VIDEO_DOMAIN_ENCODER;
135 break;
136 case HFI_VIDEO_DOMAIN_DECODER:
137 hal_domain = HAL_VIDEO_DOMAIN_DECODER;
138 break;
139 default:
140 dprintk(VIDC_ERR, "%s: invalid domain %x\n",
141 __func__, hfi_domain);
142 hal_domain = 0;
143 break;
144 }
145 return hal_domain;
146}
147
148enum hal_video_codec vidc_get_hal_codec(u32 hfi_codec)
149{
150 enum hal_video_codec hal_codec = 0;
151
152 switch (hfi_codec) {
153 case HFI_VIDEO_CODEC_H264:
154 hal_codec = HAL_VIDEO_CODEC_H264;
155 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800156 case HFI_VIDEO_CODEC_MPEG1:
157 hal_codec = HAL_VIDEO_CODEC_MPEG1;
158 break;
159 case HFI_VIDEO_CODEC_MPEG2:
160 hal_codec = HAL_VIDEO_CODEC_MPEG2;
161 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800162 case HFI_VIDEO_CODEC_VP8:
163 hal_codec = HAL_VIDEO_CODEC_VP8;
164 break;
165 case HFI_VIDEO_CODEC_HEVC:
166 hal_codec = HAL_VIDEO_CODEC_HEVC;
167 break;
168 case HFI_VIDEO_CODEC_VP9:
169 hal_codec = HAL_VIDEO_CODEC_VP9;
170 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800171 default:
172 dprintk(VIDC_INFO, "%s: invalid codec 0x%x\n",
173 __func__, hfi_codec);
174 hal_codec = 0;
175 break;
176 }
177 return hal_codec;
178}
179
180
181u32 vidc_get_hfi_domain(enum hal_domain hal_domain)
182{
183 u32 hfi_domain;
184
185 switch (hal_domain) {
186 case HAL_VIDEO_DOMAIN_VPE:
187 hfi_domain = HFI_VIDEO_DOMAIN_VPE;
188 break;
189 case HAL_VIDEO_DOMAIN_ENCODER:
190 hfi_domain = HFI_VIDEO_DOMAIN_ENCODER;
191 break;
192 case HAL_VIDEO_DOMAIN_DECODER:
193 hfi_domain = HFI_VIDEO_DOMAIN_DECODER;
194 break;
195 default:
196 dprintk(VIDC_ERR, "%s: invalid domain 0x%x\n",
197 __func__, hal_domain);
198 hfi_domain = 0;
199 break;
200 }
201 return hfi_domain;
202}
203
204u32 vidc_get_hfi_codec(enum hal_video_codec hal_codec)
205{
206 u32 hfi_codec = 0;
207
208 switch (hal_codec) {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800209 case HAL_VIDEO_CODEC_H264:
210 hfi_codec = HFI_VIDEO_CODEC_H264;
211 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800212 case HAL_VIDEO_CODEC_MPEG1:
213 hfi_codec = HFI_VIDEO_CODEC_MPEG1;
214 break;
215 case HAL_VIDEO_CODEC_MPEG2:
216 hfi_codec = HFI_VIDEO_CODEC_MPEG2;
217 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800218 case HAL_VIDEO_CODEC_VP8:
219 hfi_codec = HFI_VIDEO_CODEC_VP8;
220 break;
221 case HAL_VIDEO_CODEC_HEVC:
222 hfi_codec = HFI_VIDEO_CODEC_HEVC;
223 break;
224 case HAL_VIDEO_CODEC_VP9:
225 hfi_codec = HFI_VIDEO_CODEC_VP9;
226 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800227 default:
228 dprintk(VIDC_INFO, "%s: invalid codec 0x%x\n",
229 __func__, hal_codec);
230 hfi_codec = 0;
231 break;
232 }
233 return hfi_codec;
234}
235
236static void create_pkt_enable(void *pkt, u32 type, bool enable)
237{
238 u32 *pkt_header = pkt;
239 u32 *pkt_type = &pkt_header[0];
240 struct hfi_enable *hfi_enable = (struct hfi_enable *)&pkt_header[1];
241
242 *pkt_type = type;
243 hfi_enable->enable = enable;
244}
245
246int create_pkt_cmd_sys_init(struct hfi_cmd_sys_init_packet *pkt,
247 u32 arch_type)
248{
249 int rc = 0;
250
251 if (!pkt)
252 return -EINVAL;
253
254 pkt->packet_type = HFI_CMD_SYS_INIT;
255 pkt->size = sizeof(struct hfi_cmd_sys_init_packet);
256 pkt->arch_type = arch_type;
257 return rc;
258}
259
260int create_pkt_cmd_sys_pc_prep(struct hfi_cmd_sys_pc_prep_packet *pkt)
261{
262 int rc = 0;
263
264 if (!pkt)
265 return -EINVAL;
266
267 pkt->packet_type = HFI_CMD_SYS_PC_PREP;
268 pkt->size = sizeof(struct hfi_cmd_sys_pc_prep_packet);
269 return rc;
270}
271
272int create_pkt_cmd_sys_idle_indicator(
273 struct hfi_cmd_sys_set_property_packet *pkt,
274 u32 enable)
275{
276 struct hfi_enable *hfi;
277
278 if (!pkt)
279 return -EINVAL;
280
281 pkt->size = sizeof(struct hfi_cmd_sys_set_property_packet) +
282 sizeof(struct hfi_enable) + sizeof(u32);
283 pkt->packet_type = HFI_CMD_SYS_SET_PROPERTY;
284 pkt->num_properties = 1;
285 pkt->rg_property_data[0] = HFI_PROPERTY_SYS_IDLE_INDICATOR;
286 hfi = (struct hfi_enable *) &pkt->rg_property_data[1];
287 hfi->enable = enable;
288 return 0;
289}
290
291int create_pkt_cmd_sys_debug_config(
292 struct hfi_cmd_sys_set_property_packet *pkt,
293 u32 mode)
294{
295 struct hfi_debug_config *hfi;
296
297 if (!pkt)
298 return -EINVAL;
299
300 pkt->size = sizeof(struct hfi_cmd_sys_set_property_packet) +
301 sizeof(struct hfi_debug_config) + sizeof(u32);
302 pkt->packet_type = HFI_CMD_SYS_SET_PROPERTY;
303 pkt->num_properties = 1;
304 pkt->rg_property_data[0] = HFI_PROPERTY_SYS_DEBUG_CONFIG;
305 hfi = (struct hfi_debug_config *) &pkt->rg_property_data[1];
306 hfi->debug_config = mode;
307 hfi->debug_mode = HFI_DEBUG_MODE_QUEUE;
308 if (msm_vidc_fw_debug_mode
309 <= (HFI_DEBUG_MODE_QUEUE | HFI_DEBUG_MODE_QDSS))
310 hfi->debug_mode = msm_vidc_fw_debug_mode;
311 return 0;
312}
313
314int create_pkt_cmd_sys_coverage_config(
315 struct hfi_cmd_sys_set_property_packet *pkt,
316 u32 mode)
317{
318 if (!pkt) {
319 dprintk(VIDC_ERR, "In %s(), No input packet\n", __func__);
320 return -EINVAL;
321 }
322
323 pkt->size = sizeof(struct hfi_cmd_sys_set_property_packet) +
324 sizeof(u32);
325 pkt->packet_type = HFI_CMD_SYS_SET_PROPERTY;
326 pkt->num_properties = 1;
327 pkt->rg_property_data[0] = HFI_PROPERTY_SYS_CONFIG_COVERAGE;
328 pkt->rg_property_data[1] = mode;
329 dprintk(VIDC_DBG, "Firmware coverage mode %d\n",
330 pkt->rg_property_data[1]);
331 return 0;
332}
333
334int create_pkt_cmd_sys_set_resource(
335 struct hfi_cmd_sys_set_resource_packet *pkt,
336 struct vidc_resource_hdr *resource_hdr,
337 void *resource_value)
338{
339 int rc = 0;
340
341 if (!pkt || !resource_hdr || !resource_value)
342 return -EINVAL;
343
344 pkt->packet_type = HFI_CMD_SYS_SET_RESOURCE;
345 pkt->size = sizeof(struct hfi_cmd_sys_set_resource_packet);
346 pkt->resource_handle = hash32_ptr(resource_hdr->resource_handle);
347
348 switch (resource_hdr->resource_id) {
349 case VIDC_RESOURCE_OCMEM:
350 case VIDC_RESOURCE_VMEM:
351 {
352 struct hfi_resource_ocmem *hfioc_mem =
353 (struct hfi_resource_ocmem *)
354 &pkt->rg_resource_data[0];
355
356 phys_addr_t imem_addr = (phys_addr_t)resource_value;
357
358 pkt->resource_type = HFI_RESOURCE_OCMEM;
359 pkt->size += sizeof(struct hfi_resource_ocmem) - sizeof(u32);
360 hfioc_mem->size = (u32)resource_hdr->size;
361 hfioc_mem->mem = imem_addr;
362 break;
363 }
364 default:
365 dprintk(VIDC_ERR, "Invalid resource_id %d\n",
366 resource_hdr->resource_id);
367 rc = -ENOTSUPP;
368 }
369
370 return rc;
371}
372
373int create_pkt_cmd_sys_release_resource(
374 struct hfi_cmd_sys_release_resource_packet *pkt,
375 struct vidc_resource_hdr *resource_hdr)
376{
377 int rc = 0;
378
379 if (!pkt)
380 return -EINVAL;
381
382 pkt->size = sizeof(struct hfi_cmd_sys_release_resource_packet);
383 pkt->packet_type = HFI_CMD_SYS_RELEASE_RESOURCE;
384 pkt->resource_handle = hash32_ptr(resource_hdr->resource_handle);
385
386 switch (resource_hdr->resource_id) {
387 case VIDC_RESOURCE_OCMEM:
388 case VIDC_RESOURCE_VMEM:
389 pkt->resource_type = HFI_RESOURCE_OCMEM;
390 break;
391 default:
392 dprintk(VIDC_ERR, "Invalid resource_id %d\n",
393 resource_hdr->resource_id);
394 rc = -ENOTSUPP;
395 }
396
397 return rc;
398}
399
400int create_pkt_cmd_sys_ping(struct hfi_cmd_sys_ping_packet *pkt)
401{
402 int rc = 0;
403
404 if (!pkt)
405 return -EINVAL;
406
407 pkt->size = sizeof(struct hfi_cmd_sys_ping_packet);
408 pkt->packet_type = HFI_CMD_SYS_PING;
409
410 return rc;
411}
412
413inline int create_pkt_cmd_sys_session_init(
414 struct hfi_cmd_sys_session_init_packet *pkt,
415 struct hal_session *session,
416 u32 session_domain, u32 session_codec)
417{
418 int rc = 0;
419
420 if (!pkt)
421 return -EINVAL;
422
423 pkt->size = sizeof(struct hfi_cmd_sys_session_init_packet);
424 pkt->packet_type = HFI_CMD_SYS_SESSION_INIT;
425 pkt->session_id = hash32_ptr(session);
426 pkt->session_domain = vidc_get_hfi_domain(session_domain);
427 pkt->session_codec = vidc_get_hfi_codec(session_codec);
428 if (!pkt->session_codec)
429 return -EINVAL;
430
431 return rc;
432}
433
434int create_pkt_cmd_session_cmd(struct vidc_hal_session_cmd_pkt *pkt,
435 int pkt_type, struct hal_session *session)
436{
437 int rc = 0;
438
439 if (!pkt)
440 return -EINVAL;
441
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800442 pkt->size = sizeof(struct vidc_hal_session_cmd_pkt);
443 pkt->packet_type = pkt_type;
444 pkt->session_id = hash32_ptr(session);
445
446 return rc;
447}
448
449int create_pkt_cmd_sys_power_control(
450 struct hfi_cmd_sys_set_property_packet *pkt, u32 enable)
451{
452 struct hfi_enable *hfi;
453
454 if (!pkt) {
455 dprintk(VIDC_ERR, "No input packet\n");
456 return -EINVAL;
457 }
458
459 pkt->size = sizeof(struct hfi_cmd_sys_set_property_packet) +
460 sizeof(struct hfi_enable) + sizeof(u32);
461 pkt->packet_type = HFI_CMD_SYS_SET_PROPERTY;
462 pkt->num_properties = 1;
463 pkt->rg_property_data[0] = HFI_PROPERTY_SYS_CODEC_POWER_PLANE_CTRL;
464 hfi = (struct hfi_enable *) &pkt->rg_property_data[1];
465 hfi->enable = enable;
466 return 0;
467}
468
469static u32 get_hfi_buffer(int hal_buffer)
470{
471 u32 buffer;
472
473 switch (hal_buffer) {
474 case HAL_BUFFER_INPUT:
475 buffer = HFI_BUFFER_INPUT;
476 break;
477 case HAL_BUFFER_OUTPUT:
478 buffer = HFI_BUFFER_OUTPUT;
479 break;
480 case HAL_BUFFER_OUTPUT2:
481 buffer = HFI_BUFFER_OUTPUT2;
482 break;
483 case HAL_BUFFER_EXTRADATA_INPUT:
484 buffer = HFI_BUFFER_EXTRADATA_INPUT;
485 break;
486 case HAL_BUFFER_EXTRADATA_OUTPUT:
487 buffer = HFI_BUFFER_EXTRADATA_OUTPUT;
488 break;
489 case HAL_BUFFER_EXTRADATA_OUTPUT2:
490 buffer = HFI_BUFFER_EXTRADATA_OUTPUT2;
491 break;
492 case HAL_BUFFER_INTERNAL_SCRATCH:
493 buffer = HFI_BUFFER_INTERNAL_SCRATCH;
494 break;
495 case HAL_BUFFER_INTERNAL_SCRATCH_1:
496 buffer = HFI_BUFFER_INTERNAL_SCRATCH_1;
497 break;
498 case HAL_BUFFER_INTERNAL_SCRATCH_2:
499 buffer = HFI_BUFFER_INTERNAL_SCRATCH_2;
500 break;
501 case HAL_BUFFER_INTERNAL_PERSIST:
502 buffer = HFI_BUFFER_INTERNAL_PERSIST;
503 break;
504 case HAL_BUFFER_INTERNAL_PERSIST_1:
505 buffer = HFI_BUFFER_INTERNAL_PERSIST_1;
506 break;
507 default:
508 dprintk(VIDC_ERR, "Invalid buffer: %#x\n",
509 hal_buffer);
510 buffer = 0;
511 break;
512 }
513 return buffer;
514}
515
516static int get_hfi_extradata_index(enum hal_extradata_id index)
517{
518 int ret = 0;
519
520 switch (index) {
521 case HAL_EXTRADATA_MB_QUANTIZATION:
522 ret = HFI_PROPERTY_PARAM_VDEC_MB_QUANTIZATION;
523 break;
524 case HAL_EXTRADATA_INTERLACE_VIDEO:
525 ret = HFI_PROPERTY_PARAM_VDEC_INTERLACE_VIDEO_EXTRADATA;
526 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800527 case HAL_EXTRADATA_TIMESTAMP:
528 ret = HFI_PROPERTY_PARAM_VDEC_TIMESTAMP_EXTRADATA;
529 break;
530 case HAL_EXTRADATA_S3D_FRAME_PACKING:
531 ret = HFI_PROPERTY_PARAM_S3D_FRAME_PACKING_EXTRADATA;
532 break;
533 case HAL_EXTRADATA_FRAME_RATE:
534 ret = HFI_PROPERTY_PARAM_VDEC_FRAME_RATE_EXTRADATA;
535 break;
536 case HAL_EXTRADATA_PANSCAN_WINDOW:
537 ret = HFI_PROPERTY_PARAM_VDEC_PANSCAN_WNDW_EXTRADATA;
538 break;
539 case HAL_EXTRADATA_RECOVERY_POINT_SEI:
540 ret = HFI_PROPERTY_PARAM_VDEC_RECOVERY_POINT_SEI_EXTRADATA;
541 break;
542 case HAL_EXTRADATA_MULTISLICE_INFO:
543 ret = HFI_PROPERTY_PARAM_VENC_MULTI_SLICE_INFO;
544 break;
545 case HAL_EXTRADATA_NUM_CONCEALED_MB:
546 ret = HFI_PROPERTY_PARAM_VDEC_NUM_CONCEALED_MB;
547 break;
548 case HAL_EXTRADATA_ASPECT_RATIO:
549 case HAL_EXTRADATA_INPUT_CROP:
550 case HAL_EXTRADATA_DIGITAL_ZOOM:
551 case HAL_EXTRADATA_OUTPUT_CROP:
552 ret = HFI_PROPERTY_PARAM_INDEX_EXTRADATA;
553 break;
554 case HAL_EXTRADATA_MPEG2_SEQDISP:
555 ret = HFI_PROPERTY_PARAM_VDEC_MPEG2_SEQDISP_EXTRADATA;
556 break;
557 case HAL_EXTRADATA_STREAM_USERDATA:
558 ret = HFI_PROPERTY_PARAM_VDEC_STREAM_USERDATA_EXTRADATA;
559 break;
560 case HAL_EXTRADATA_FRAME_QP:
561 ret = HFI_PROPERTY_PARAM_VDEC_FRAME_QP_EXTRADATA;
562 break;
563 case HAL_EXTRADATA_FRAME_BITS_INFO:
564 ret = HFI_PROPERTY_PARAM_VDEC_FRAME_BITS_INFO_EXTRADATA;
565 break;
566 case HAL_EXTRADATA_LTR_INFO:
567 ret = HFI_PROPERTY_PARAM_VENC_LTR_INFO;
568 break;
569 case HAL_EXTRADATA_METADATA_MBI:
570 ret = HFI_PROPERTY_PARAM_VENC_MBI_DUMPING;
571 break;
572 case HAL_EXTRADATA_VQZIP_SEI:
573 ret = HFI_PROPERTY_PARAM_VDEC_VQZIP_SEI_EXTRADATA;
574 break;
575 case HAL_EXTRADATA_YUV_STATS:
576 ret = HFI_PROPERTY_PARAM_VENC_YUVSTAT_INFO_EXTRADATA;
577 break;
578 case HAL_EXTRADATA_ROI_QP:
579 ret = HFI_PROPERTY_PARAM_VENC_ROI_QP_EXTRADATA;
580 break;
581 case HAL_EXTRADATA_MASTERING_DISPLAY_COLOUR_SEI:
582 ret =
583 HFI_PROPERTY_PARAM_VDEC_MASTERING_DISPLAY_COLOUR_SEI_EXTRADATA;
584 break;
585 case HAL_EXTRADATA_CONTENT_LIGHT_LEVEL_SEI:
586 ret = HFI_PROPERTY_PARAM_VDEC_CONTENT_LIGHT_LEVEL_SEI_EXTRADATA;
587 break;
588 case HAL_EXTRADATA_PQ_INFO:
589 ret = HFI_PROPERTY_PARAM_VENC_OVERRIDE_QP_EXTRADATA;
590 break;
591 case HAL_EXTRADATA_VUI_DISPLAY_INFO:
592 ret = HFI_PROPERTY_PARAM_VUI_DISPLAY_INFO_EXTRADATA;
593 break;
594 case HAL_EXTRADATA_VPX_COLORSPACE:
595 ret = HFI_PROPERTY_PARAM_VDEC_VPX_COLORSPACE_EXTRADATA;
596 break;
597 default:
598 dprintk(VIDC_WARN, "Extradata index not found: %d\n", index);
599 break;
600 }
601 return ret;
602}
603
604static int get_hfi_extradata_id(enum hal_extradata_id index)
605{
606 int ret = 0;
607
608 switch (index) {
609 case HAL_EXTRADATA_ASPECT_RATIO:
610 ret = MSM_VIDC_EXTRADATA_ASPECT_RATIO;
611 break;
612 case HAL_EXTRADATA_INPUT_CROP:
613 ret = MSM_VIDC_EXTRADATA_INPUT_CROP;
614 break;
615 case HAL_EXTRADATA_DIGITAL_ZOOM:
616 ret = MSM_VIDC_EXTRADATA_DIGITAL_ZOOM;
617 break;
618 case HAL_EXTRADATA_OUTPUT_CROP:
619 ret = MSM_VIDC_EXTRADATA_OUTPUT_CROP;
620 break;
621 default:
622 ret = get_hfi_extradata_index(index);
623 break;
624 }
625 return ret;
626}
627
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800628static u32 get_hfi_ltr_mode(enum ltr_mode ltr_mode_type)
629{
630 u32 ltrmode;
631
632 switch (ltr_mode_type) {
633 case HAL_LTR_MODE_DISABLE:
634 ltrmode = HFI_LTR_MODE_DISABLE;
635 break;
636 case HAL_LTR_MODE_MANUAL:
637 ltrmode = HFI_LTR_MODE_MANUAL;
638 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800639 default:
640 dprintk(VIDC_ERR, "Invalid ltr mode: %#x\n",
641 ltr_mode_type);
642 ltrmode = HFI_LTR_MODE_DISABLE;
643 break;
644 }
645 return ltrmode;
646}
647
648int create_pkt_cmd_session_set_buffers(
649 struct hfi_cmd_session_set_buffers_packet *pkt,
650 struct hal_session *session,
651 struct vidc_buffer_addr_info *buffer_info)
652{
653 int rc = 0;
654 int i = 0;
655
656 if (!pkt || !session)
657 return -EINVAL;
658
659 pkt->packet_type = HFI_CMD_SESSION_SET_BUFFERS;
660 pkt->session_id = hash32_ptr(session);
661 pkt->buffer_size = buffer_info->buffer_size;
662 pkt->min_buffer_size = buffer_info->buffer_size;
663 pkt->num_buffers = buffer_info->num_buffers;
664
665 if (buffer_info->buffer_type == HAL_BUFFER_OUTPUT ||
666 buffer_info->buffer_type == HAL_BUFFER_OUTPUT2) {
667 struct hfi_buffer_info *buff;
668
669 pkt->extra_data_size = buffer_info->extradata_size;
670
671 pkt->size = sizeof(struct hfi_cmd_session_set_buffers_packet) -
672 sizeof(u32) + (buffer_info->num_buffers *
673 sizeof(struct hfi_buffer_info));
674 buff = (struct hfi_buffer_info *) pkt->rg_buffer_info;
675 for (i = 0; i < pkt->num_buffers; i++) {
676 buff->buffer_addr =
677 (u32)buffer_info->align_device_addr;
678 buff->extra_data_addr =
679 (u32)buffer_info->extradata_addr;
680 }
681 } else {
682 pkt->extra_data_size = 0;
683 pkt->size = sizeof(struct hfi_cmd_session_set_buffers_packet) +
684 ((buffer_info->num_buffers - 1) * sizeof(u32));
685 for (i = 0; i < pkt->num_buffers; i++) {
686 pkt->rg_buffer_info[i] =
687 (u32)buffer_info->align_device_addr;
688 }
689 }
690
691 pkt->buffer_type = get_hfi_buffer(buffer_info->buffer_type);
692 if (!pkt->buffer_type)
693 return -EINVAL;
694
695 return rc;
696}
697
698int create_pkt_cmd_session_release_buffers(
699 struct hfi_cmd_session_release_buffer_packet *pkt,
700 struct hal_session *session,
701 struct vidc_buffer_addr_info *buffer_info)
702{
703 int rc = 0;
704 int i = 0;
705
706 if (!pkt || !session)
707 return -EINVAL;
708
709 pkt->packet_type = HFI_CMD_SESSION_RELEASE_BUFFERS;
710 pkt->session_id = hash32_ptr(session);
711 pkt->buffer_size = buffer_info->buffer_size;
712 pkt->num_buffers = buffer_info->num_buffers;
713
714 if (buffer_info->buffer_type == HAL_BUFFER_OUTPUT ||
715 buffer_info->buffer_type == HAL_BUFFER_OUTPUT2) {
716 struct hfi_buffer_info *buff;
717
718 buff = (struct hfi_buffer_info *) pkt->rg_buffer_info;
719 for (i = 0; i < pkt->num_buffers; i++) {
720 buff->buffer_addr =
721 (u32)buffer_info->align_device_addr;
722 buff->extra_data_addr =
723 (u32)buffer_info->extradata_addr;
724 }
725 pkt->size = sizeof(struct hfi_cmd_session_set_buffers_packet) -
726 sizeof(u32) + (buffer_info->num_buffers *
727 sizeof(struct hfi_buffer_info));
728 } else {
729 for (i = 0; i < pkt->num_buffers; i++) {
730 pkt->rg_buffer_info[i] =
731 (u32)buffer_info->align_device_addr;
732 }
733 pkt->extra_data_size = 0;
734 pkt->size = sizeof(struct hfi_cmd_session_set_buffers_packet) +
735 ((buffer_info->num_buffers - 1) * sizeof(u32));
736 }
737 pkt->response_req = buffer_info->response_required;
738 pkt->buffer_type = get_hfi_buffer(buffer_info->buffer_type);
739 if (!pkt->buffer_type)
740 return -EINVAL;
741 return rc;
742}
743
744int create_pkt_cmd_session_etb_decoder(
745 struct hfi_cmd_session_empty_buffer_compressed_packet *pkt,
746 struct hal_session *session, struct vidc_frame_data *input_frame)
747{
748 int rc = 0;
749
750 if (!pkt || !session)
751 return -EINVAL;
752
753 pkt->size =
754 sizeof(struct hfi_cmd_session_empty_buffer_compressed_packet);
755 pkt->packet_type = HFI_CMD_SESSION_EMPTY_BUFFER;
756 pkt->session_id = hash32_ptr(session);
757 pkt->time_stamp_hi = upper_32_bits(input_frame->timestamp);
758 pkt->time_stamp_lo = lower_32_bits(input_frame->timestamp);
759 pkt->flags = input_frame->flags;
760 pkt->mark_target = input_frame->mark_target;
761 pkt->mark_data = input_frame->mark_data;
762 pkt->offset = input_frame->offset;
763 pkt->alloc_len = input_frame->alloc_len;
764 pkt->filled_len = input_frame->filled_len;
765 pkt->input_tag = input_frame->clnt_data;
766 pkt->packet_buffer = (u32)input_frame->device_addr;
767
768 trace_msm_v4l2_vidc_buffer_event_start("ETB",
769 input_frame->device_addr, input_frame->timestamp,
770 input_frame->alloc_len, input_frame->filled_len,
771 input_frame->offset);
772
773 if (!pkt->packet_buffer)
774 rc = -EINVAL;
775 return rc;
776}
777
778int create_pkt_cmd_session_etb_encoder(
779 struct hfi_cmd_session_empty_buffer_uncompressed_plane0_packet *pkt,
780 struct hal_session *session, struct vidc_frame_data *input_frame)
781{
782 int rc = 0;
783
784 if (!pkt || !session)
785 return -EINVAL;
786
787 pkt->size = sizeof(struct
788 hfi_cmd_session_empty_buffer_uncompressed_plane0_packet);
789 pkt->packet_type = HFI_CMD_SESSION_EMPTY_BUFFER;
790 pkt->session_id = hash32_ptr(session);
791 pkt->view_id = 0;
792 pkt->time_stamp_hi = upper_32_bits(input_frame->timestamp);
793 pkt->time_stamp_lo = lower_32_bits(input_frame->timestamp);
794 pkt->flags = input_frame->flags;
795 pkt->mark_target = input_frame->mark_target;
796 pkt->mark_data = input_frame->mark_data;
797 pkt->offset = input_frame->offset;
798 pkt->alloc_len = input_frame->alloc_len;
799 pkt->filled_len = input_frame->filled_len;
800 pkt->input_tag = input_frame->clnt_data;
801 pkt->packet_buffer = (u32)input_frame->device_addr;
802 pkt->extra_data_buffer = (u32)input_frame->extradata_addr;
803
804 trace_msm_v4l2_vidc_buffer_event_start("ETB",
805 input_frame->device_addr, input_frame->timestamp,
806 input_frame->alloc_len, input_frame->filled_len,
807 input_frame->offset);
808
809 if (!pkt->packet_buffer)
810 rc = -EINVAL;
811 return rc;
812}
813
814int create_pkt_cmd_session_ftb(struct hfi_cmd_session_fill_buffer_packet *pkt,
815 struct hal_session *session,
816 struct vidc_frame_data *output_frame)
817{
818 int rc = 0;
819
820 if (!pkt || !session || !output_frame)
821 return -EINVAL;
822
823 pkt->size = sizeof(struct hfi_cmd_session_fill_buffer_packet);
824 pkt->packet_type = HFI_CMD_SESSION_FILL_BUFFER;
825 pkt->session_id = hash32_ptr(session);
826
827 if (output_frame->buffer_type == HAL_BUFFER_OUTPUT)
828 pkt->stream_id = 0;
829 else if (output_frame->buffer_type == HAL_BUFFER_OUTPUT2)
830 pkt->stream_id = 1;
831
832 if (!output_frame->device_addr)
833 return -EINVAL;
834
835 pkt->packet_buffer = (u32)output_frame->device_addr;
836 pkt->extra_data_buffer = (u32)output_frame->extradata_addr;
837 pkt->alloc_len = output_frame->alloc_len;
838 pkt->filled_len = output_frame->filled_len;
839 pkt->offset = output_frame->offset;
840 pkt->rgData[0] = output_frame->extradata_size;
841
842 trace_msm_v4l2_vidc_buffer_event_start("FTB",
843 output_frame->device_addr, output_frame->timestamp,
844 output_frame->alloc_len, output_frame->filled_len,
845 output_frame->offset);
846 dprintk(VIDC_DBG, "### Q OUTPUT BUFFER ###: %d, %d, %d\n",
847 pkt->alloc_len, pkt->filled_len, pkt->offset);
848
849 return rc;
850}
851
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800852int create_pkt_cmd_session_get_buf_req(
853 struct hfi_cmd_session_get_property_packet *pkt,
854 struct hal_session *session)
855{
856 int rc = 0;
857
858 if (!pkt || !session)
859 return -EINVAL;
860
861 pkt->size = sizeof(struct hfi_cmd_session_get_property_packet);
862 pkt->packet_type = HFI_CMD_SESSION_GET_PROPERTY;
863 pkt->session_id = hash32_ptr(session);
864 pkt->num_properties = 1;
865 pkt->rg_property_data[0] = HFI_PROPERTY_CONFIG_BUFFER_REQUIREMENTS;
866
867 return rc;
868}
869
870int create_pkt_cmd_session_flush(struct hfi_cmd_session_flush_packet *pkt,
871 struct hal_session *session, enum hal_flush flush_mode)
872{
873 int rc = 0;
874
875 if (!pkt || !session)
876 return -EINVAL;
877
878 pkt->size = sizeof(struct hfi_cmd_session_flush_packet);
879 pkt->packet_type = HFI_CMD_SESSION_FLUSH;
880 pkt->session_id = hash32_ptr(session);
881 switch (flush_mode) {
882 case HAL_FLUSH_INPUT:
883 pkt->flush_type = HFI_FLUSH_INPUT;
884 break;
885 case HAL_FLUSH_OUTPUT:
886 pkt->flush_type = HFI_FLUSH_OUTPUT;
887 break;
888 case HAL_FLUSH_ALL:
889 pkt->flush_type = HFI_FLUSH_ALL;
890 break;
891 default:
892 dprintk(VIDC_ERR, "Invalid flush mode: %#x\n", flush_mode);
893 return -EINVAL;
894 }
895 return rc;
896}
897
898int create_pkt_cmd_session_get_property(
899 struct hfi_cmd_session_get_property_packet *pkt,
900 struct hal_session *session, enum hal_property ptype)
901{
Vaibhav Deshu Venkatesha2cf1b32017-03-30 17:40:48 -0700902 /* Currently no get property is supported */
903 dprintk(VIDC_ERR, "%s cmd:%#x not supported\n", __func__,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800904 ptype);
Vaibhav Deshu Venkatesha2cf1b32017-03-30 17:40:48 -0700905 return -EINVAL;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800906}
907
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800908int create_pkt_cmd_session_set_property(
909 struct hfi_cmd_session_set_property_packet *pkt,
910 struct hal_session *session,
911 enum hal_property ptype, void *pdata)
912{
913 int rc = 0;
914
915 if (!pkt || !session)
916 return -EINVAL;
917
918 pkt->size = sizeof(struct hfi_cmd_session_set_property_packet);
919 pkt->packet_type = HFI_CMD_SESSION_SET_PROPERTY;
920 pkt->session_id = hash32_ptr(session);
921 pkt->num_properties = 1;
922
923 switch (ptype) {
924 case HAL_CONFIG_FRAME_RATE:
925 {
926 u32 buffer_type;
927 struct hfi_frame_rate *hfi;
928 struct hal_frame_rate *prop = (struct hal_frame_rate *) pdata;
929
930 pkt->rg_property_data[0] = HFI_PROPERTY_CONFIG_FRAME_RATE;
931 hfi = (struct hfi_frame_rate *) &pkt->rg_property_data[1];
932 buffer_type = get_hfi_buffer(prop->buffer_type);
933 if (buffer_type)
934 hfi->buffer_type = buffer_type;
935 else
936 return -EINVAL;
937
938 hfi->frame_rate = prop->frame_rate;
939 pkt->size += sizeof(u32) + sizeof(struct hfi_frame_rate);
940 break;
941 }
942 case HAL_PARAM_UNCOMPRESSED_FORMAT_SELECT:
943 {
944 u32 buffer_type;
945 struct hfi_uncompressed_format_select *hfi;
946 struct hal_uncompressed_format_select *prop =
947 (struct hal_uncompressed_format_select *) pdata;
948
949 pkt->rg_property_data[0] =
950 HFI_PROPERTY_PARAM_UNCOMPRESSED_FORMAT_SELECT;
951
952 hfi = (struct hfi_uncompressed_format_select *)
953 &pkt->rg_property_data[1];
954 buffer_type = get_hfi_buffer(prop->buffer_type);
955 if (buffer_type)
956 hfi->buffer_type = buffer_type;
957 else
958 return -EINVAL;
959 hfi->format = hal_to_hfi_type(
960 HAL_PARAM_UNCOMPRESSED_FORMAT_SELECT,
961 prop->format);
962 pkt->size += sizeof(u32) +
963 sizeof(struct hfi_uncompressed_format_select);
964 break;
965 }
966 case HAL_PARAM_UNCOMPRESSED_PLANE_ACTUAL_CONSTRAINTS_INFO:
967 break;
968 case HAL_PARAM_UNCOMPRESSED_PLANE_ACTUAL_INFO:
969 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800970 case HAL_PARAM_FRAME_SIZE:
971 {
972 struct hfi_frame_size *hfi;
973 struct hal_frame_size *prop = (struct hal_frame_size *) pdata;
974 u32 buffer_type;
975
976 pkt->rg_property_data[0] = HFI_PROPERTY_PARAM_FRAME_SIZE;
977 hfi = (struct hfi_frame_size *) &pkt->rg_property_data[1];
978 buffer_type = get_hfi_buffer(prop->buffer_type);
979 if (buffer_type)
980 hfi->buffer_type = buffer_type;
981 else
982 return -EINVAL;
983
984 hfi->height = prop->height;
985 hfi->width = prop->width;
986 pkt->size += sizeof(u32) + sizeof(struct hfi_frame_size);
987 break;
988 }
989 case HAL_CONFIG_REALTIME:
990 {
991 create_pkt_enable(pkt->rg_property_data,
992 HFI_PROPERTY_CONFIG_REALTIME,
993 (((struct hal_enable *) pdata)->enable));
994 pkt->size += sizeof(u32) * 2;
995 break;
996 }
997 case HAL_PARAM_BUFFER_COUNT_ACTUAL:
998 {
999 struct hfi_buffer_count_actual *hfi;
1000 struct hal_buffer_count_actual *prop =
1001 (struct hal_buffer_count_actual *) pdata;
1002 u32 buffer_type;
1003
1004 pkt->rg_property_data[0] =
1005 HFI_PROPERTY_PARAM_BUFFER_COUNT_ACTUAL;
1006 hfi = (struct hfi_buffer_count_actual *)
1007 &pkt->rg_property_data[1];
1008 hfi->buffer_count_actual = prop->buffer_count_actual;
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08001009 hfi->buffer_count_min_host = prop->buffer_count_min_host;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001010
1011 buffer_type = get_hfi_buffer(prop->buffer_type);
1012 if (buffer_type)
1013 hfi->buffer_type = buffer_type;
1014 else
1015 return -EINVAL;
1016
1017 pkt->size += sizeof(u32) + sizeof(struct
1018 hfi_buffer_count_actual);
1019
1020 break;
1021 }
1022 case HAL_PARAM_NAL_STREAM_FORMAT_SELECT:
1023 {
1024 struct hfi_nal_stream_format_select *hfi;
1025 struct hal_nal_stream_format_select *prop =
1026 (struct hal_nal_stream_format_select *)pdata;
1027
1028 pkt->rg_property_data[0] =
1029 HFI_PROPERTY_PARAM_NAL_STREAM_FORMAT_SELECT;
1030 hfi = (struct hfi_nal_stream_format_select *)
1031 &pkt->rg_property_data[1];
1032 dprintk(VIDC_DBG, "data is :%d\n",
1033 prop->nal_stream_format_select);
1034 hfi->nal_stream_format_select = hal_to_hfi_type(
1035 HAL_PARAM_NAL_STREAM_FORMAT_SELECT,
1036 prop->nal_stream_format_select);
1037 pkt->size += sizeof(u32) +
1038 sizeof(struct hfi_nal_stream_format_select);
1039 break;
1040 }
1041 case HAL_PARAM_VDEC_OUTPUT_ORDER:
1042 {
1043 int *data = (int *) pdata;
1044
1045 pkt->rg_property_data[0] =
1046 HFI_PROPERTY_PARAM_VDEC_OUTPUT_ORDER;
1047 switch (*data) {
1048 case HAL_OUTPUT_ORDER_DECODE:
1049 pkt->rg_property_data[1] = HFI_OUTPUT_ORDER_DECODE;
1050 break;
1051 case HAL_OUTPUT_ORDER_DISPLAY:
1052 pkt->rg_property_data[1] = HFI_OUTPUT_ORDER_DISPLAY;
1053 break;
1054 default:
1055 dprintk(VIDC_ERR, "invalid output order: %#x\n",
1056 *data);
1057 break;
1058 }
1059 pkt->size += sizeof(u32) * 2;
1060 break;
1061 }
1062 case HAL_PARAM_VDEC_PICTURE_TYPE_DECODE:
1063 {
1064 struct hfi_enable_picture *hfi;
1065
1066 pkt->rg_property_data[0] =
1067 HFI_PROPERTY_PARAM_VDEC_PICTURE_TYPE_DECODE;
1068 hfi = (struct hfi_enable_picture *) &pkt->rg_property_data[1];
1069 hfi->picture_type =
1070 ((struct hfi_enable_picture *)pdata)->picture_type;
1071 pkt->size += sizeof(u32) * 2;
1072 break;
1073 }
1074 case HAL_PARAM_VDEC_OUTPUT2_KEEP_ASPECT_RATIO:
1075 {
1076 create_pkt_enable(pkt->rg_property_data,
1077 HFI_PROPERTY_PARAM_VDEC_OUTPUT2_KEEP_ASPECT_RATIO,
1078 ((struct hal_enable *)pdata)->enable);
1079 pkt->size += sizeof(u32) * 2;
1080 break;
1081 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001082 case HAL_PARAM_VDEC_MULTI_STREAM:
1083 {
1084 struct hfi_multi_stream *hfi;
1085 struct hal_multi_stream *prop =
1086 (struct hal_multi_stream *) pdata;
1087 u32 buffer_type;
1088
1089 pkt->rg_property_data[0] =
1090 HFI_PROPERTY_PARAM_VDEC_MULTI_STREAM;
1091 hfi = (struct hfi_multi_stream *) &pkt->rg_property_data[1];
1092
1093 buffer_type = get_hfi_buffer(prop->buffer_type);
1094 if (buffer_type)
1095 hfi->buffer_type = buffer_type;
1096 else
1097 return -EINVAL;
1098 hfi->enable = prop->enable;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001099 pkt->size += sizeof(u32) + sizeof(struct hfi_multi_stream);
1100 break;
1101 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001102 case HAL_CONFIG_VDEC_MB_ERROR_MAP_REPORTING:
1103 {
1104 create_pkt_enable(pkt->rg_property_data,
1105 HFI_PROPERTY_CONFIG_VDEC_MB_ERROR_MAP_REPORTING,
1106 ((struct hal_enable *)pdata)->enable);
1107 pkt->size += sizeof(u32) * 2;
1108 break;
1109 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001110 case HAL_PARAM_VDEC_SYNC_FRAME_DECODE:
1111 {
1112 create_pkt_enable(pkt->rg_property_data,
1113 HFI_PROPERTY_PARAM_VDEC_THUMBNAIL_MODE,
1114 ((struct hal_enable *)pdata)->enable);
1115 pkt->size += sizeof(u32) * 2;
1116 break;
1117 }
Karthikeyan Periasamya0e4bad2017-04-26 12:51:10 -07001118 case HAL_PARAM_SECURE:
1119 {
1120 create_pkt_enable(pkt->rg_property_data,
1121 HFI_PROPERTY_PARAM_SECURE_SESSION,
1122 ((struct hal_enable *)pdata)->enable);
1123 pkt->size += sizeof(u32) * 2;
1124 break;
1125 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001126 case HAL_PARAM_VENC_SYNC_FRAME_SEQUENCE_HEADER:
1127 {
1128 create_pkt_enable(pkt->rg_property_data,
1129 HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER,
1130 ((struct hal_enable *)pdata)->enable);
1131 pkt->size += sizeof(u32) * 2;
1132 break;
1133 }
1134 case HAL_CONFIG_VENC_REQUEST_IFRAME:
1135 pkt->rg_property_data[0] =
1136 HFI_PROPERTY_CONFIG_VENC_REQUEST_SYNC_FRAME;
1137 pkt->size += sizeof(u32);
1138 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001139 case HAL_CONFIG_VENC_TARGET_BITRATE:
1140 {
1141 struct hfi_bitrate *hfi;
1142
1143 pkt->rg_property_data[0] =
1144 HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE;
1145 hfi = (struct hfi_bitrate *) &pkt->rg_property_data[1];
1146 hfi->bit_rate = ((struct hal_bitrate *)pdata)->bit_rate;
1147 hfi->layer_id = ((struct hal_bitrate *)pdata)->layer_id;
1148 pkt->size += sizeof(u32) + sizeof(struct hfi_bitrate);
1149 break;
1150 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001151 case HAL_PARAM_PROFILE_LEVEL_CURRENT:
1152 {
1153 struct hfi_profile_level *hfi;
1154 struct hal_profile_level *prop =
1155 (struct hal_profile_level *) pdata;
1156
1157 pkt->rg_property_data[0] =
1158 HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT;
1159 hfi = (struct hfi_profile_level *)
1160 &pkt->rg_property_data[1];
Vaibhav Deshu Venkatesh234b4dc2017-03-21 16:54:28 -07001161
1162 /* There is an assumption here that HAL level is same as
1163 * HFI level
1164 */
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001165 hfi->level = prop->level;
1166 hfi->profile = hal_to_hfi_type(HAL_PARAM_PROFILE_LEVEL_CURRENT,
1167 prop->profile);
1168 if (hfi->profile <= 0) {
1169 hfi->profile = HFI_H264_PROFILE_HIGH;
1170 dprintk(VIDC_WARN,
1171 "Profile %d not supported, falling back to high\n",
1172 prop->profile);
1173 }
1174
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001175 pkt->size += sizeof(u32) + sizeof(struct hfi_profile_level);
1176 break;
1177 }
1178 case HAL_PARAM_VENC_H264_ENTROPY_CONTROL:
1179 {
1180 struct hfi_h264_entropy_control *hfi;
1181 struct hal_h264_entropy_control *prop =
1182 (struct hal_h264_entropy_control *) pdata;
1183 pkt->rg_property_data[0] =
1184 HFI_PROPERTY_PARAM_VENC_H264_ENTROPY_CONTROL;
1185 hfi = (struct hfi_h264_entropy_control *)
1186 &pkt->rg_property_data[1];
1187 hfi->entropy_mode = hal_to_hfi_type(
1188 HAL_PARAM_VENC_H264_ENTROPY_CONTROL,
1189 prop->entropy_mode);
1190 if (hfi->entropy_mode == HAL_H264_ENTROPY_CABAC)
1191 hfi->cabac_model = hal_to_hfi_type(
1192 HAL_PARAM_VENC_H264_ENTROPY_CABAC_MODEL,
1193 prop->cabac_model);
1194 pkt->size += sizeof(u32) + sizeof(
1195 struct hfi_h264_entropy_control);
1196 break;
1197 }
1198 case HAL_PARAM_VENC_RATE_CONTROL:
1199 {
1200 u32 *rc;
1201
1202 pkt->rg_property_data[0] =
1203 HFI_PROPERTY_PARAM_VENC_RATE_CONTROL;
1204 rc = (u32 *)pdata;
1205 switch ((enum hal_rate_control) *rc) {
1206 case HAL_RATE_CONTROL_OFF:
1207 pkt->rg_property_data[1] = HFI_RATE_CONTROL_OFF;
1208 break;
1209 case HAL_RATE_CONTROL_CBR_CFR:
1210 pkt->rg_property_data[1] = HFI_RATE_CONTROL_CBR_CFR;
1211 break;
1212 case HAL_RATE_CONTROL_CBR_VFR:
1213 pkt->rg_property_data[1] = HFI_RATE_CONTROL_CBR_VFR;
1214 break;
1215 case HAL_RATE_CONTROL_VBR_CFR:
1216 pkt->rg_property_data[1] = HFI_RATE_CONTROL_VBR_CFR;
1217 break;
1218 case HAL_RATE_CONTROL_VBR_VFR:
1219 pkt->rg_property_data[1] = HFI_RATE_CONTROL_VBR_VFR;
1220 break;
1221 case HAL_RATE_CONTROL_MBR_CFR:
1222 pkt->rg_property_data[1] = HFI_RATE_CONTROL_MBR_CFR;
1223 break;
1224 case HAL_RATE_CONTROL_MBR_VFR:
1225 pkt->rg_property_data[1] = HFI_RATE_CONTROL_MBR_VFR;
1226 break;
1227 default:
1228 dprintk(VIDC_ERR,
1229 "Invalid Rate control setting: %pK\n",
1230 pdata);
1231 break;
1232 }
1233 pkt->size += sizeof(u32) * 2;
1234 break;
1235 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001236 case HAL_PARAM_VENC_H264_DEBLOCK_CONTROL:
1237 {
1238 struct hfi_h264_db_control *hfi;
1239 struct hal_h264_db_control *prop =
1240 (struct hal_h264_db_control *) pdata;
1241 pkt->rg_property_data[0] =
1242 HFI_PROPERTY_PARAM_VENC_H264_DEBLOCK_CONTROL;
1243 hfi = (struct hfi_h264_db_control *) &pkt->rg_property_data[1];
1244 switch (prop->mode) {
1245 case HAL_H264_DB_MODE_DISABLE:
1246 hfi->mode = HFI_H264_DB_MODE_DISABLE;
1247 break;
1248 case HAL_H264_DB_MODE_SKIP_SLICE_BOUNDARY:
1249 hfi->mode = HFI_H264_DB_MODE_SKIP_SLICE_BOUNDARY;
1250 break;
1251 case HAL_H264_DB_MODE_ALL_BOUNDARY:
1252 hfi->mode = HFI_H264_DB_MODE_ALL_BOUNDARY;
1253 break;
1254 default:
1255 dprintk(VIDC_ERR, "Invalid deblocking mode: %#x\n",
1256 prop->mode);
1257 break;
1258 }
1259 hfi->slice_alpha_offset = prop->slice_alpha_offset;
1260 hfi->slice_beta_offset = prop->slice_beta_offset;
1261 pkt->size += sizeof(u32) +
1262 sizeof(struct hfi_h264_db_control);
1263 break;
1264 }
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001265 case HAL_CONFIG_VENC_FRAME_QP:
1266 {
1267 struct hfi_quantization *hfi;
1268 struct hal_quantization *hal_quant =
1269 (struct hal_quantization *) pdata;
1270 pkt->rg_property_data[0] =
1271 HFI_PROPERTY_CONFIG_VENC_SESSION_QP;
1272 hfi = (struct hfi_quantization *) &pkt->rg_property_data[1];
1273 hfi->qp_packed = hal_quant->qpi | hal_quant->qpp << 8 |
1274 hal_quant->qpb << 16;
1275 hfi->layer_id = hal_quant->layer_id;
1276 pkt->size += sizeof(u32) + sizeof(struct hfi_quantization);
1277 break;
1278 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001279 case HAL_PARAM_VENC_SESSION_QP_RANGE:
1280 {
1281 struct hfi_quantization_range *hfi;
Chinmay Sawarkar2de3f772017-02-07 12:03:44 -08001282 struct hal_quantization_range *hal_range =
1283 (struct hal_quantization_range *) pdata;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001284
1285 pkt->rg_property_data[0] =
1286 HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE;
1287 hfi = (struct hfi_quantization_range *)
1288 &pkt->rg_property_data[1];
1289
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001290 /*
1291 * When creating the packet, pack the qp value as
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001292 * 0xbbppii, where ii = qp range for I-frames,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001293 * pp = qp range for P-frames, etc.
1294 */
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001295 hfi->min_qp.qp_packed = hal_range->qpi_min |
1296 hal_range->qpp_min << 8 |
1297 hal_range->qpb_min << 16;
1298 hfi->max_qp.qp_packed = hal_range->qpi_max |
1299 hal_range->qpp_max << 8 |
1300 hal_range->qpb_max << 16;
Chinmay Sawarkar2de3f772017-02-07 12:03:44 -08001301 hfi->max_qp.layer_id = hal_range->layer_id;
Chinmay Sawarkar2de3f772017-02-07 12:03:44 -08001302 hfi->min_qp.layer_id = hal_range->layer_id;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001303
1304 pkt->size += sizeof(u32) +
1305 sizeof(struct hfi_quantization_range);
1306 break;
1307 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001308 case HAL_CONFIG_VENC_INTRA_PERIOD:
1309 {
1310 struct hfi_intra_period *hfi;
1311
1312 pkt->rg_property_data[0] =
1313 HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD;
1314 hfi = (struct hfi_intra_period *) &pkt->rg_property_data[1];
1315 memcpy(hfi, (struct hfi_intra_period *) pdata,
1316 sizeof(struct hfi_intra_period));
1317 pkt->size += sizeof(u32) + sizeof(struct hfi_intra_period);
1318 break;
1319 }
1320 case HAL_CONFIG_VENC_IDR_PERIOD:
1321 {
1322 struct hfi_idr_period *hfi;
1323
1324 pkt->rg_property_data[0] = HFI_PROPERTY_CONFIG_VENC_IDR_PERIOD;
1325 hfi = (struct hfi_idr_period *) &pkt->rg_property_data[1];
1326 hfi->idr_period = ((struct hfi_idr_period *) pdata)->idr_period;
1327 pkt->size += sizeof(u32) * 2;
1328 break;
1329 }
1330 case HAL_PARAM_VDEC_CONCEAL_COLOR:
1331 {
1332 struct hfi_conceal_color *hfi;
1333
1334 pkt->rg_property_data[0] =
1335 HFI_PROPERTY_PARAM_VDEC_CONCEAL_COLOR;
1336 hfi = (struct hfi_conceal_color *) &pkt->rg_property_data[1];
1337 if (hfi)
1338 hfi->conceal_color =
1339 ((struct hfi_conceal_color *) pdata)->
1340 conceal_color;
1341 pkt->size += sizeof(u32) * 2;
1342 break;
1343 }
1344 case HAL_CONFIG_VPE_OPERATIONS:
1345 {
1346 struct hfi_operations_type *hfi;
1347 struct hal_operations *prop =
1348 (struct hal_operations *) pdata;
1349 pkt->rg_property_data[0] = HFI_PROPERTY_CONFIG_VPE_OPERATIONS;
1350 hfi = (struct hfi_operations_type *) &pkt->rg_property_data[1];
1351 switch (prop->rotate) {
1352 case HAL_ROTATE_NONE:
1353 hfi->rotation = HFI_ROTATE_NONE;
1354 break;
1355 case HAL_ROTATE_90:
1356 hfi->rotation = HFI_ROTATE_90;
1357 break;
1358 case HAL_ROTATE_180:
1359 hfi->rotation = HFI_ROTATE_180;
1360 break;
1361 case HAL_ROTATE_270:
1362 hfi->rotation = HFI_ROTATE_270;
1363 break;
1364 default:
1365 dprintk(VIDC_ERR, "Invalid rotation setting: %#x\n",
1366 prop->rotate);
1367 rc = -EINVAL;
1368 break;
1369 }
1370 switch (prop->flip) {
1371 case HAL_FLIP_NONE:
1372 hfi->flip = HFI_FLIP_NONE;
1373 break;
1374 case HAL_FLIP_HORIZONTAL:
1375 hfi->flip = HFI_FLIP_HORIZONTAL;
1376 break;
1377 case HAL_FLIP_VERTICAL:
1378 hfi->flip = HFI_FLIP_VERTICAL;
1379 break;
1380 default:
1381 dprintk(VIDC_ERR, "Invalid flip setting: %#x\n",
1382 prop->flip);
1383 rc = -EINVAL;
1384 break;
1385 }
1386 pkt->size += sizeof(u32) + sizeof(struct hfi_operations_type);
1387 break;
1388 }
1389 case HAL_PARAM_VENC_INTRA_REFRESH:
1390 {
1391 struct hfi_intra_refresh *hfi;
1392 struct hal_intra_refresh *prop =
1393 (struct hal_intra_refresh *) pdata;
1394 pkt->rg_property_data[0] =
1395 HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH;
1396 hfi = (struct hfi_intra_refresh *) &pkt->rg_property_data[1];
Chinmay Sawarkar2de3f772017-02-07 12:03:44 -08001397 hfi->mbs = 0;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001398 switch (prop->mode) {
1399 case HAL_INTRA_REFRESH_NONE:
1400 hfi->mode = HFI_INTRA_REFRESH_NONE;
1401 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001402 case HAL_INTRA_REFRESH_CYCLIC:
1403 hfi->mode = HFI_INTRA_REFRESH_CYCLIC;
Saurabh Kothawadeabed16c2017-03-22 17:06:40 -07001404 hfi->mbs = prop->ir_mbs;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001405 break;
1406 case HAL_INTRA_REFRESH_RANDOM:
1407 hfi->mode = HFI_INTRA_REFRESH_RANDOM;
Saurabh Kothawadeabed16c2017-03-22 17:06:40 -07001408 hfi->mbs = prop->ir_mbs;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001409 break;
1410 default:
1411 dprintk(VIDC_ERR,
1412 "Invalid intra refresh setting: %#x\n",
1413 prop->mode);
1414 break;
1415 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001416 pkt->size += sizeof(u32) + sizeof(struct hfi_intra_refresh);
1417 break;
1418 }
1419 case HAL_PARAM_VENC_MULTI_SLICE_CONTROL:
1420 {
1421 struct hfi_multi_slice_control *hfi;
1422 struct hal_multi_slice_control *prop =
1423 (struct hal_multi_slice_control *) pdata;
1424 pkt->rg_property_data[0] =
1425 HFI_PROPERTY_PARAM_VENC_MULTI_SLICE_CONTROL;
1426 hfi = (struct hfi_multi_slice_control *)
1427 &pkt->rg_property_data[1];
1428 switch (prop->multi_slice) {
1429 case HAL_MULTI_SLICE_OFF:
1430 hfi->multi_slice = HFI_MULTI_SLICE_OFF;
1431 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001432 case HAL_MULTI_SLICE_BY_MB_COUNT:
1433 hfi->multi_slice = HFI_MULTI_SLICE_BY_MB_COUNT;
1434 break;
1435 case HAL_MULTI_SLICE_BY_BYTE_COUNT:
1436 hfi->multi_slice = HFI_MULTI_SLICE_BY_BYTE_COUNT;
1437 break;
1438 default:
1439 dprintk(VIDC_ERR, "Invalid slice settings: %#x\n",
1440 prop->multi_slice);
1441 break;
1442 }
1443 hfi->slice_size = prop->slice_size;
1444 pkt->size += sizeof(u32) + sizeof(struct
1445 hfi_multi_slice_control);
1446 break;
1447 }
1448 case HAL_PARAM_INDEX_EXTRADATA:
1449 {
1450 struct hfi_index_extradata_config *hfi;
1451 struct hal_extradata_enable *extra = pdata;
1452 int id = 0;
1453
1454 pkt->rg_property_data[0] =
1455 get_hfi_extradata_index(extra->index);
1456 hfi = (struct hfi_index_extradata_config *)
1457 &pkt->rg_property_data[1];
1458 hfi->enable = extra->enable;
1459 id = get_hfi_extradata_id(extra->index);
1460 if (id)
1461 hfi->index_extra_data_id = id;
1462 else {
1463 dprintk(VIDC_WARN,
1464 "Failed to find extradata id: %d\n",
1465 id);
1466 rc = -EINVAL;
1467 }
1468 pkt->size += sizeof(u32) +
1469 sizeof(struct hfi_index_extradata_config);
1470 break;
1471 }
1472 case HAL_PARAM_VENC_SLICE_DELIVERY_MODE:
1473 {
1474 create_pkt_enable(pkt->rg_property_data,
1475 HFI_PROPERTY_PARAM_VENC_SLICE_DELIVERY_MODE,
1476 ((struct hal_enable *)pdata)->enable);
1477 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1478 break;
1479 }
1480 case HAL_PARAM_VENC_H264_VUI_TIMING_INFO:
1481 {
1482 struct hfi_h264_vui_timing_info *hfi;
1483 struct hal_h264_vui_timing_info *timing_info = pdata;
1484
1485 pkt->rg_property_data[0] =
1486 HFI_PROPERTY_PARAM_VENC_H264_VUI_TIMING_INFO;
1487
1488 hfi = (struct hfi_h264_vui_timing_info *)&pkt->
1489 rg_property_data[1];
1490 hfi->enable = timing_info->enable;
1491 hfi->fixed_frame_rate = timing_info->fixed_frame_rate;
1492 hfi->time_scale = timing_info->time_scale;
1493
1494 pkt->size += sizeof(u32) +
1495 sizeof(struct hfi_h264_vui_timing_info);
1496 break;
1497 }
1498 case HAL_CONFIG_VPE_DEINTERLACE:
1499 {
1500 create_pkt_enable(pkt->rg_property_data,
1501 HFI_PROPERTY_CONFIG_VPE_DEINTERLACE,
1502 ((struct hal_enable *)pdata)->enable);
1503 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1504 break;
1505 }
Umesh Pandey7fce7ee2017-03-13 17:59:48 -07001506 case HAL_PARAM_VENC_GENERATE_AUDNAL:
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001507 {
1508 create_pkt_enable(pkt->rg_property_data,
Umesh Pandey7fce7ee2017-03-13 17:59:48 -07001509 HFI_PROPERTY_PARAM_VENC_GENERATE_AUDNAL,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001510 ((struct hal_enable *)pdata)->enable);
1511 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1512 break;
1513 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001514 case HAL_PARAM_VENC_PRESERVE_TEXT_QUALITY:
1515 {
1516 create_pkt_enable(pkt->rg_property_data,
1517 HFI_PROPERTY_PARAM_VENC_PRESERVE_TEXT_QUALITY,
1518 ((struct hal_enable *)pdata)->enable);
1519 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1520 break;
1521 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001522 case HAL_PARAM_VENC_LTRMODE:
1523 {
1524 struct hfi_ltr_mode *hfi;
1525 struct hal_ltr_mode *hal = pdata;
1526
1527 pkt->rg_property_data[0] =
1528 HFI_PROPERTY_PARAM_VENC_LTRMODE;
1529 hfi = (struct hfi_ltr_mode *) &pkt->rg_property_data[1];
1530 hfi->ltr_mode = get_hfi_ltr_mode(hal->mode);
1531 hfi->ltr_count = hal->count;
1532 hfi->trust_mode = hal->trust_mode;
1533 pkt->size += sizeof(u32) + sizeof(struct hfi_ltr_mode);
1534 break;
1535 }
1536 case HAL_CONFIG_VENC_USELTRFRAME:
1537 {
1538 struct hfi_ltr_use *hfi;
1539 struct hal_ltr_use *hal = pdata;
1540
1541 pkt->rg_property_data[0] =
1542 HFI_PROPERTY_CONFIG_VENC_USELTRFRAME;
1543 hfi = (struct hfi_ltr_use *) &pkt->rg_property_data[1];
1544 hfi->frames = hal->frames;
1545 hfi->ref_ltr = hal->ref_ltr;
1546 hfi->use_constrnt = hal->use_constraint;
1547 pkt->size += sizeof(u32) + sizeof(struct hfi_ltr_use);
1548 break;
1549 }
1550 case HAL_CONFIG_VENC_MARKLTRFRAME:
1551 {
1552 struct hfi_ltr_mark *hfi;
1553 struct hal_ltr_mark *hal = pdata;
1554
1555 pkt->rg_property_data[0] =
1556 HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME;
1557 hfi = (struct hfi_ltr_mark *) &pkt->rg_property_data[1];
1558 hfi->mark_frame = hal->mark_frame;
1559 pkt->size += sizeof(u32) + sizeof(struct hfi_ltr_mark);
1560 break;
1561 }
1562 case HAL_PARAM_VENC_HIER_P_MAX_ENH_LAYERS:
1563 {
1564 pkt->rg_property_data[0] =
1565 HFI_PROPERTY_PARAM_VENC_HIER_P_MAX_NUM_ENH_LAYER;
1566 pkt->rg_property_data[1] = *(u32 *)pdata;
1567 pkt->size += sizeof(u32) * 2;
1568 break;
1569 }
1570 case HAL_CONFIG_VENC_HIER_P_NUM_FRAMES:
1571 {
1572 pkt->rg_property_data[0] =
1573 HFI_PROPERTY_CONFIG_VENC_HIER_P_ENH_LAYER;
1574 pkt->rg_property_data[1] = *(u32 *)pdata;
1575 pkt->size += sizeof(u32) * 2;
1576 break;
1577 }
1578 case HAL_PARAM_VENC_DISABLE_RC_TIMESTAMP:
1579 {
1580 create_pkt_enable(pkt->rg_property_data,
1581 HFI_PROPERTY_PARAM_VENC_DISABLE_RC_TIMESTAMP,
1582 ((struct hal_enable *)pdata)->enable);
1583 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1584 break;
1585 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001586 case HAL_PARAM_VPE_COLOR_SPACE_CONVERSION:
1587 {
1588 struct hfi_vpe_color_space_conversion *hfi = NULL;
1589 struct hal_vpe_color_space_conversion *hal = pdata;
1590
1591 pkt->rg_property_data[0] =
1592 HFI_PROPERTY_PARAM_VPE_COLOR_SPACE_CONVERSION;
1593 hfi = (struct hfi_vpe_color_space_conversion *)
1594 &pkt->rg_property_data[1];
1595 memcpy(hfi->csc_matrix, hal->csc_matrix,
1596 sizeof(hfi->csc_matrix));
1597 memcpy(hfi->csc_bias, hal->csc_bias, sizeof(hfi->csc_bias));
1598 memcpy(hfi->csc_limit, hal->csc_limit, sizeof(hfi->csc_limit));
1599 pkt->size += sizeof(u32) +
1600 sizeof(struct hfi_vpe_color_space_conversion);
1601 break;
1602 }
1603 case HAL_PARAM_VENC_VPX_ERROR_RESILIENCE_MODE:
1604 {
1605 create_pkt_enable(pkt->rg_property_data,
1606 HFI_PROPERTY_PARAM_VENC_VPX_ERROR_RESILIENCE_MODE,
1607 ((struct hal_enable *)pdata)->enable);
1608 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1609 break;
1610 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001611 case HAL_CONFIG_VENC_PERF_MODE:
1612 {
1613 u32 hfi_perf_mode = 0;
1614 enum hal_perf_mode hal_perf_mode = *(enum hal_perf_mode *)pdata;
1615
1616 switch (hal_perf_mode) {
1617 case HAL_PERF_MODE_POWER_SAVE:
1618 hfi_perf_mode = HFI_VENC_PERFMODE_POWER_SAVE;
1619 break;
1620 case HAL_PERF_MODE_POWER_MAX_QUALITY:
1621 hfi_perf_mode = HFI_VENC_PERFMODE_MAX_QUALITY;
1622 break;
1623 default:
1624 return -ENOTSUPP;
1625 }
1626
1627 pkt->rg_property_data[0] = HFI_PROPERTY_CONFIG_VENC_PERF_MODE;
1628 pkt->rg_property_data[1] = hfi_perf_mode;
1629 pkt->size += sizeof(u32) * 2;
1630 break;
1631 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001632 case HAL_PARAM_VENC_HIER_P_HYBRID_MODE:
1633 {
1634 pkt->rg_property_data[0] =
1635 HFI_PROPERTY_PARAM_VENC_HIER_P_HYBRID_MODE;
1636 pkt->rg_property_data[1] =
1637 ((struct hfi_hybrid_hierp *)pdata)->layers;
1638 pkt->size += sizeof(u32) +
1639 sizeof(struct hfi_hybrid_hierp);
1640 break;
1641 }
1642 case HAL_PARAM_VENC_MBI_STATISTICS_MODE:
1643 {
1644 pkt->rg_property_data[0] =
1645 HFI_PROPERTY_PARAM_VENC_MBI_DUMPING;
1646 pkt->rg_property_data[1] = hal_to_hfi_type(
1647 HAL_PARAM_VENC_MBI_STATISTICS_MODE,
1648 *(u32 *)pdata);
1649 pkt->size += sizeof(u32) * 2;
1650 break;
1651 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001652 case HAL_CONFIG_VENC_BASELAYER_PRIORITYID:
1653 {
1654 pkt->rg_property_data[0] =
1655 HFI_PROPERTY_CONFIG_VENC_BASELAYER_PRIORITYID;
1656 pkt->rg_property_data[1] = *(u32 *)pdata;
1657 pkt->size += sizeof(u32) * 2;
1658 break;
1659 }
1660 case HAL_PROPERTY_PARAM_VENC_ASPECT_RATIO:
1661 {
1662 struct hfi_aspect_ratio *hfi = NULL;
1663 struct hal_aspect_ratio *hal = pdata;
1664
1665 pkt->rg_property_data[0] =
1666 HFI_PROPERTY_PARAM_VENC_ASPECT_RATIO;
1667 hfi = (struct hfi_aspect_ratio *)
1668 &pkt->rg_property_data[1];
1669 memcpy(hfi, hal,
1670 sizeof(struct hfi_aspect_ratio));
1671 pkt->size += sizeof(u32) +
1672 sizeof(struct hfi_aspect_ratio);
1673 break;
1674 }
1675 case HAL_PARAM_VENC_BITRATE_TYPE:
1676 {
1677 create_pkt_enable(pkt->rg_property_data,
1678 HFI_PROPERTY_PARAM_VENC_BITRATE_TYPE,
1679 ((struct hal_enable *)pdata)->enable);
1680 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1681 break;
1682 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001683 case HAL_PARAM_VENC_H264_TRANSFORM_8x8:
1684 {
1685 create_pkt_enable(pkt->rg_property_data,
1686 HFI_PROPERTY_PARAM_VENC_H264_8X8_TRANSFORM,
1687 ((struct hal_enable *)pdata)->enable);
1688 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1689 break;
1690 }
1691 case HAL_PARAM_VENC_VIDEO_SIGNAL_INFO:
1692 {
1693 struct hal_video_signal_info *hal = pdata;
1694 struct hfi_video_signal_metadata *signal_info =
1695 (struct hfi_video_signal_metadata *)
1696 &pkt->rg_property_data[1];
1697
1698 signal_info->enable = true;
1699 signal_info->video_format = MSM_VIDC_NTSC;
1700 signal_info->video_full_range = hal->full_range;
1701 signal_info->color_description = MSM_VIDC_COLOR_DESC_PRESENT;
1702 signal_info->color_primaries = hal->color_space;
1703 signal_info->transfer_characteristics = hal->transfer_chars;
1704 signal_info->matrix_coeffs = hal->matrix_coeffs;
1705
1706 pkt->rg_property_data[0] =
1707 HFI_PROPERTY_PARAM_VENC_VIDEO_SIGNAL_INFO;
1708 pkt->size += sizeof(u32) + sizeof(*signal_info);
1709 break;
1710 }
1711 case HAL_PARAM_VENC_IFRAMESIZE_TYPE:
1712 {
1713 enum hal_iframesize_type hal =
1714 *(enum hal_iframesize_type *)pdata;
1715 struct hfi_iframe_size *hfi = (struct hfi_iframe_size *)
1716 &pkt->rg_property_data[1];
1717
1718 switch (hal) {
1719 case HAL_IFRAMESIZE_TYPE_DEFAULT:
1720 hfi->type = HFI_IFRAME_SIZE_DEFAULT;
1721 break;
1722 case HAL_IFRAMESIZE_TYPE_MEDIUM:
1723 hfi->type = HFI_IFRAME_SIZE_MEDIUM;
1724 break;
1725 case HAL_IFRAMESIZE_TYPE_HUGE:
1726 hfi->type = HFI_IFRAME_SIZE_HIGH;
1727 break;
1728 case HAL_IFRAMESIZE_TYPE_UNLIMITED:
1729 hfi->type = HFI_IFRAME_SIZE_UNLIMITED;
1730 break;
1731 default:
1732 return -ENOTSUPP;
1733 }
1734 pkt->rg_property_data[0] = HFI_PROPERTY_PARAM_VENC_IFRAMESIZE;
1735 pkt->size += sizeof(u32) + sizeof(struct hfi_iframe_size);
1736 break;
1737 }
Chinmay Sawarkar2de3f772017-02-07 12:03:44 -08001738 case HAL_PARAM_BUFFER_SIZE_MINIMUM:
1739 {
1740 struct hfi_buffer_size_minimum *hfi;
1741 struct hal_buffer_size_minimum *prop =
1742 (struct hal_buffer_size_minimum *) pdata;
1743 u32 buffer_type;
1744
1745 pkt->rg_property_data[0] =
1746 HFI_PROPERTY_PARAM_BUFFER_SIZE_MINIMUM;
1747
1748 hfi = (struct hfi_buffer_size_minimum *)
1749 &pkt->rg_property_data[1];
1750 hfi->buffer_size = prop->buffer_size;
1751
1752 buffer_type = get_hfi_buffer(prop->buffer_type);
1753 if (buffer_type)
1754 hfi->buffer_type = buffer_type;
1755 else
1756 return -EINVAL;
1757
1758 pkt->size += sizeof(u32) + sizeof(struct
1759 hfi_buffer_size_minimum);
1760 break;
1761 }
1762 case HAL_PARAM_SYNC_BASED_INTERRUPT:
1763 {
1764 create_pkt_enable(pkt->rg_property_data,
1765 HFI_PROPERTY_PARAM_SYNC_BASED_INTERRUPT,
1766 ((struct hal_enable *)pdata)->enable);
1767 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1768 break;
1769 }
1770 case HAL_PARAM_VENC_VQZIP_SEI:
1771 {
1772 create_pkt_enable(pkt->rg_property_data,
1773 HFI_PROPERTY_PARAM_VENC_VQZIP_SEI_TYPE,
1774 ((struct hal_enable *)pdata)->enable);
1775 pkt->size += sizeof(u32) + sizeof(struct hfi_enable);
1776 break;
1777 }
1778
1779 case HAL_PARAM_VENC_LOW_LATENCY:
1780 {
1781 struct hfi_enable *hfi;
1782
1783 pkt->rg_property_data[0] =
1784 HFI_PROPERTY_PARAM_VENC_LOW_LATENCY_MODE;
1785 hfi = (struct hfi_enable *) &pkt->rg_property_data[1];
1786 hfi->enable = ((struct hal_enable *) pdata)->enable;
1787 pkt->size += sizeof(u32) * 2;
1788 break;
1789 }
1790 case HAL_CONFIG_VENC_BLUR_RESOLUTION:
1791 {
1792 struct hfi_frame_size *hfi;
1793 struct hal_frame_size *prop = (struct hal_frame_size *) pdata;
1794 u32 buffer_type;
1795
1796 pkt->rg_property_data[0] =
1797 HFI_PROPERTY_CONFIG_VENC_BLUR_FRAME_SIZE;
1798 hfi = (struct hfi_frame_size *) &pkt->rg_property_data[1];
1799 buffer_type = get_hfi_buffer(prop->buffer_type);
1800 if (buffer_type)
1801 hfi->buffer_type = buffer_type;
1802 else
1803 return -EINVAL;
1804
1805 hfi->height = prop->height;
1806 hfi->width = prop->width;
1807 pkt->size += sizeof(u32) + sizeof(struct hfi_frame_size);
1808 break;
1809 }
Praneeth Paladugu238977b2016-12-06 12:51:26 -08001810 case HAL_PARAM_VIDEO_CORES_USAGE:
1811 {
1812 struct hal_videocores_usage_info *hal = pdata;
1813 struct hfi_videocores_usage_type *core_info =
1814 (struct hfi_videocores_usage_type *)
1815 &pkt->rg_property_data[1];
1816
1817 core_info->video_core_enable_mask = hal->video_core_enable_mask;
1818
1819 pkt->rg_property_data[0] =
1820 HFI_PROPERTY_CONFIG_VIDEOCORES_USAGE;
1821 pkt->size += sizeof(u32) + sizeof(*core_info);
1822 break;
1823 }
1824 case HAL_PARAM_VIDEO_WORK_MODE:
1825 {
1826 struct hal_video_work_mode *hal = pdata;
1827 struct hfi_video_work_mode *work_mode =
1828 (struct hfi_video_work_mode *)
1829 &pkt->rg_property_data[1];
1830
1831 work_mode->video_work_mode = hal->video_work_mode;
1832
1833 pkt->rg_property_data[0] =
1834 HFI_PROPERTY_PARAM_WORK_MODE;
1835 pkt->size += sizeof(u32) + sizeof(*work_mode);
1836 break;
1837 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001838 /* FOLLOWING PROPERTIES ARE NOT IMPLEMENTED IN CORE YET */
1839 case HAL_CONFIG_BUFFER_REQUIREMENTS:
1840 case HAL_CONFIG_PRIORITY:
1841 case HAL_CONFIG_BATCH_INFO:
1842 case HAL_PARAM_METADATA_PASS_THROUGH:
1843 case HAL_SYS_IDLE_INDICATOR:
1844 case HAL_PARAM_UNCOMPRESSED_FORMAT_SUPPORTED:
1845 case HAL_PARAM_INTERLACE_FORMAT_SUPPORTED:
1846 case HAL_PARAM_CHROMA_SITE:
1847 case HAL_PARAM_PROPERTIES_SUPPORTED:
1848 case HAL_PARAM_PROFILE_LEVEL_SUPPORTED:
1849 case HAL_PARAM_CAPABILITY_SUPPORTED:
1850 case HAL_PARAM_NAL_STREAM_FORMAT_SUPPORTED:
1851 case HAL_PARAM_MULTI_VIEW_FORMAT:
1852 case HAL_PARAM_MAX_SEQUENCE_HEADER_SIZE:
1853 case HAL_PARAM_CODEC_SUPPORTED:
1854 case HAL_PARAM_VDEC_MULTI_VIEW_SELECT:
1855 case HAL_PARAM_VDEC_MB_QUANTIZATION:
1856 case HAL_PARAM_VDEC_NUM_CONCEALED_MB:
1857 case HAL_PARAM_VDEC_H264_ENTROPY_SWITCHING:
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001858 case HAL_CONFIG_BUFFER_COUNT_ACTUAL:
1859 case HAL_CONFIG_VDEC_MULTI_STREAM:
1860 case HAL_PARAM_VENC_MULTI_SLICE_INFO:
1861 case HAL_CONFIG_VENC_TIMESTAMP_SCALE:
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001862 default:
1863 dprintk(VIDC_ERR, "DEFAULT: Calling %#x\n", ptype);
1864 rc = -ENOTSUPP;
1865 break;
1866 }
1867 return rc;
1868}
1869
1870static int get_hfi_ssr_type(enum hal_ssr_trigger_type type)
1871{
1872 int rc = HFI_TEST_SSR_HW_WDOG_IRQ;
1873
1874 switch (type) {
1875 case SSR_ERR_FATAL:
1876 rc = HFI_TEST_SSR_SW_ERR_FATAL;
1877 break;
1878 case SSR_SW_DIV_BY_ZERO:
1879 rc = HFI_TEST_SSR_SW_DIV_BY_ZERO;
1880 break;
1881 case SSR_HW_WDOG_IRQ:
1882 rc = HFI_TEST_SSR_HW_WDOG_IRQ;
1883 break;
1884 default:
1885 dprintk(VIDC_WARN,
1886 "SSR trigger type not recognized, using WDOG.\n");
1887 }
1888 return rc;
1889}
1890
1891int create_pkt_ssr_cmd(enum hal_ssr_trigger_type type,
1892 struct hfi_cmd_sys_test_ssr_packet *pkt)
1893{
1894 if (!pkt) {
1895 dprintk(VIDC_ERR, "Invalid params, device: %pK\n", pkt);
1896 return -EINVAL;
1897 }
1898 pkt->size = sizeof(struct hfi_cmd_sys_test_ssr_packet);
1899 pkt->packet_type = HFI_CMD_SYS_TEST_SSR;
1900 pkt->trigger_type = get_hfi_ssr_type(type);
1901 return 0;
1902}
1903
1904int create_pkt_cmd_sys_image_version(
1905 struct hfi_cmd_sys_get_property_packet *pkt)
1906{
1907 if (!pkt) {
1908 dprintk(VIDC_ERR, "%s invalid param :%pK\n", __func__, pkt);
1909 return -EINVAL;
1910 }
1911 pkt->size = sizeof(struct hfi_cmd_sys_get_property_packet);
1912 pkt->packet_type = HFI_CMD_SYS_GET_PROPERTY;
1913 pkt->num_properties = 1;
1914 pkt->rg_property_data[0] = HFI_PROPERTY_SYS_IMAGE_VERSION;
1915 return 0;
1916}
1917
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001918int create_pkt_cmd_session_sync_process(
1919 struct hfi_cmd_session_sync_process_packet *pkt,
1920 struct hal_session *session)
1921{
1922 if (!pkt || !session)
1923 return -EINVAL;
1924
1925 *pkt = (struct hfi_cmd_session_sync_process_packet) {0};
1926 pkt->size = sizeof(*pkt);
1927 pkt->packet_type = HFI_CMD_SESSION_SYNC;
1928 pkt->session_id = hash32_ptr(session);
1929 pkt->sync_id = 0;
1930
1931 return 0;
1932}
1933
1934static struct hfi_packetization_ops hfi_default = {
1935 .sys_init = create_pkt_cmd_sys_init,
1936 .sys_pc_prep = create_pkt_cmd_sys_pc_prep,
1937 .sys_idle_indicator = create_pkt_cmd_sys_idle_indicator,
1938 .sys_power_control = create_pkt_cmd_sys_power_control,
1939 .sys_set_resource = create_pkt_cmd_sys_set_resource,
1940 .sys_debug_config = create_pkt_cmd_sys_debug_config,
1941 .sys_coverage_config = create_pkt_cmd_sys_coverage_config,
1942 .sys_release_resource = create_pkt_cmd_sys_release_resource,
1943 .sys_ping = create_pkt_cmd_sys_ping,
1944 .sys_image_version = create_pkt_cmd_sys_image_version,
1945 .ssr_cmd = create_pkt_ssr_cmd,
1946 .session_init = create_pkt_cmd_sys_session_init,
1947 .session_cmd = create_pkt_cmd_session_cmd,
1948 .session_set_buffers = create_pkt_cmd_session_set_buffers,
1949 .session_release_buffers = create_pkt_cmd_session_release_buffers,
1950 .session_etb_decoder = create_pkt_cmd_session_etb_decoder,
1951 .session_etb_encoder = create_pkt_cmd_session_etb_encoder,
1952 .session_ftb = create_pkt_cmd_session_ftb,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001953 .session_get_buf_req = create_pkt_cmd_session_get_buf_req,
1954 .session_flush = create_pkt_cmd_session_flush,
1955 .session_get_property = create_pkt_cmd_session_get_property,
1956 .session_set_property = create_pkt_cmd_session_set_property,
1957};
1958
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001959struct hfi_packetization_ops *hfi_get_pkt_ops_handle(
1960 enum hfi_packetization_type type)
1961{
1962 dprintk(VIDC_DBG, "%s selected\n",
Chinmay Sawarkar2de3f772017-02-07 12:03:44 -08001963 type == HFI_PACKETIZATION_4XX ?
1964 "4xx packetization" : "Unknown hfi");
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001965
1966 switch (type) {
Chinmay Sawarkar2de3f772017-02-07 12:03:44 -08001967 case HFI_PACKETIZATION_4XX:
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001968 return &hfi_default;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001969 }
1970
1971 return NULL;
1972}