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