blob: 06e230dc17b3f69c942c6b425ae1b2ead089029c [file] [log] [blame]
Vinay Kalia8ebf38e2012-12-18 17:48:51 -08001/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
Arun Menonbf943062012-12-18 14:13:15 -08002 *
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 "hfi_packetization.h"
14#include "msm_vidc_debug.h"
15#include <linux/errno.h>
16#include <mach/ocmem.h>
17
18int create_pkt_cmd_sys_init(struct hfi_cmd_sys_init_packet *pkt,
19 u32 arch_type)
20{
21 int rc = 0;
22 if (!pkt)
23 return -EINVAL;
24
25 pkt->packet_type = HFI_CMD_SYS_INIT;
26 pkt->size = sizeof(struct hfi_cmd_sys_init_packet);
27 pkt->arch_type = arch_type;
28 return rc;
29}
30
31int create_pkt_cmd_sys_pc_prep(struct hfi_cmd_sys_pc_prep_packet *pkt)
32{
33 int rc = 0;
34 if (!pkt)
35 return -EINVAL;
36
37 pkt->packet_type = HFI_CMD_SYS_PC_PREP;
38 pkt->size = sizeof(struct hfi_cmd_sys_pc_prep_packet);
39 return rc;
40}
41
42int create_pkt_set_cmd_sys_resource(
43 struct hfi_cmd_sys_set_resource_packet *pkt,
44 struct vidc_resource_hdr *resource_hdr,
45 void *resource_value)
46{
47 int rc = 0;
48 if (!pkt || !resource_hdr || !resource_value)
49 return -EINVAL;
50
51 pkt->packet_type = HFI_CMD_SYS_SET_RESOURCE;
52 pkt->size = sizeof(struct hfi_cmd_sys_set_resource_packet);
53 pkt->resource_handle = resource_hdr->resource_handle;
54
55 switch (resource_hdr->resource_id) {
56 case VIDC_RESOURCE_OCMEM:
57 {
58 struct hfi_resource_ocmem *hfioc_mem =
59 (struct hfi_resource_ocmem *)
60 &pkt->rg_resource_data[0];
61 struct ocmem_buf *ocmem =
62 (struct ocmem_buf *) resource_value;
63
64 pkt->resource_type = HFI_RESOURCE_OCMEM;
65 pkt->size += sizeof(struct hfi_resource_ocmem);
66 hfioc_mem->size = (u32) ocmem->len;
67 hfioc_mem->mem = (u8 *) ocmem->addr;
68 break;
69 }
70 default:
71 dprintk(VIDC_ERR, "Invalid resource_id %d",
72 resource_hdr->resource_id);
73 rc = -EINVAL;
74 }
75
76 return rc;
77}
78
79int create_pkt_cmd_sys_release_resource(
80 struct hfi_cmd_sys_release_resource_packet *pkt,
81 struct vidc_resource_hdr *resource_hdr)
82{
83 int rc = 0;
84 if (!pkt)
85 return -EINVAL;
86
87 pkt->size = sizeof(struct hfi_cmd_sys_release_resource_packet);
88 pkt->packet_type = HFI_CMD_SYS_RELEASE_RESOURCE;
89 pkt->resource_type = resource_hdr->resource_id;
90 pkt->resource_handle = resource_hdr->resource_handle;
91
92 return rc;
93}
94
95int create_pkt_cmd_sys_ping(struct hfi_cmd_sys_ping_packet *pkt)
96{
97 int rc = 0;
98 if (!pkt)
99 return -EINVAL;
100
101 pkt->size = sizeof(struct hfi_cmd_sys_ping_packet);
102 pkt->packet_type = HFI_CMD_SYS_PING;
103
104 return rc;
105}
106
107inline int create_pkt_cmd_sys_session_init(
108 struct hfi_cmd_sys_session_init_packet *pkt,
109 u32 session_id, u32 session_domain, u32 session_codec)
110{
111 int rc = 0;
112 if (!pkt)
113 return -EINVAL;
114
115 pkt->size = sizeof(struct hfi_cmd_sys_session_init_packet);
116 pkt->packet_type = HFI_CMD_SYS_SESSION_INIT;
117 pkt->session_id = session_id;
118 pkt->session_domain = session_domain;
119 pkt->session_codec = session_codec;
120
121 return rc;
122}
123
124int create_pkt_cmd_session_cmd(struct vidc_hal_session_cmd_pkt *pkt,
125 int pkt_type, u32 session_id)
126{
127 int rc = 0;
128 if (!pkt)
129 return -EINVAL;
130
131 pkt->size = sizeof(struct vidc_hal_session_cmd_pkt);
132 pkt->packet_type = pkt_type;
133 pkt->session_id = session_id;
134
135 return rc;
136}
137
138static u32 get_hfi_buffer(int hal_buffer)
139{
140 u32 buffer;
141 switch (hal_buffer) {
142 case HAL_BUFFER_INPUT:
143 buffer = HFI_BUFFER_INPUT;
144 break;
145 case HAL_BUFFER_OUTPUT:
146 buffer = HFI_BUFFER_OUTPUT;
147 break;
148 case HAL_BUFFER_OUTPUT2:
149 buffer = HFI_BUFFER_OUTPUT;
150 break;
151 case HAL_BUFFER_EXTRADATA_INPUT:
152 buffer = HFI_BUFFER_EXTRADATA_INPUT;
153 break;
154 case HAL_BUFFER_EXTRADATA_OUTPUT:
155 buffer = HFI_BUFFER_EXTRADATA_OUTPUT;
156 break;
157 case HAL_BUFFER_EXTRADATA_OUTPUT2:
158 buffer = HFI_BUFFER_EXTRADATA_OUTPUT2;
159 break;
160 case HAL_BUFFER_INTERNAL_SCRATCH:
161 buffer = HFI_BUFFER_INTERNAL_SCRATCH;
162 break;
163 case HAL_BUFFER_INTERNAL_PERSIST:
164 buffer = HFI_BUFFER_INTERNAL_PERSIST;
165 break;
166 default:
167 dprintk(VIDC_ERR, "Invalid buffer :0x%x\n",
168 hal_buffer);
169 buffer = 0;
170 break;
171 }
172 return buffer;
173}
174
175static int get_hfi_extradata_index(enum hal_extradata_id index)
176{
177 int ret = 0;
178 switch (index) {
179 case HAL_EXTRADATA_MB_QUANTIZATION:
180 ret = HFI_PROPERTY_PARAM_VDEC_MB_QUANTIZATION;
181 break;
182 case HAL_EXTRADATA_INTERLACE_VIDEO:
183 ret = HFI_PROPERTY_PARAM_VDEC_INTERLACE_VIDEO_EXTRADATA;
184 break;
185 case HAL_EXTRADATA_VC1_FRAMEDISP:
186 ret = HFI_PROPERTY_PARAM_VDEC_VC1_FRAMEDISP_EXTRADATA;
187 break;
188 case HAL_EXTRADATA_VC1_SEQDISP:
189 ret = HFI_PROPERTY_PARAM_VDEC_VC1_SEQDISP_EXTRADATA;
190 break;
191 case HAL_EXTRADATA_TIMESTAMP:
192 ret = HFI_PROPERTY_PARAM_VDEC_TIMESTAMP_EXTRADATA;
193 break;
194 case HAL_EXTRADATA_S3D_FRAME_PACKING:
195 ret = HFI_PROPERTY_PARAM_S3D_FRAME_PACKING_EXTRADATA;
196 break;
197 case HAL_EXTRADATA_FRAME_RATE:
198 ret = HFI_PROPERTY_PARAM_VDEC_FRAME_RATE_EXTRADATA;
199 break;
200 case HAL_EXTRADATA_PANSCAN_WINDOW:
201 ret = HFI_PROPERTY_PARAM_VDEC_PANSCAN_WNDW_EXTRADATA;
202 break;
203 case HAL_EXTRADATA_RECOVERY_POINT_SEI:
204 ret = HFI_PROPERTY_PARAM_VDEC_RECOVERY_POINT_SEI_EXTRADATA;
205 break;
206 case HAL_EXTRADATA_CLOSED_CAPTION_UD:
207 ret = HFI_PROPERTY_PARAM_VDEC_CLOSED_CAPTION_EXTRADATA;
208 break;
209 case HAL_EXTRADATA_AFD_UD:
210 ret = HFI_PROPERTY_PARAM_VDEC_AFD_EXTRADATA;
211 break;
212 case HAL_EXTRADATA_MULTISLICE_INFO:
213 ret = HFI_PROPERTY_PARAM_VENC_MULTI_SLICE_INFO;
214 break;
215 case HAL_EXTRADATA_NUM_CONCEALED_MB:
216 ret = HFI_PROPERTY_PARAM_VDEC_NUM_CONCEALED_MB;
217 break;
218 case HAL_EXTRADATA_INDEX:
219 ret = HFI_PROPERTY_PARAM_EXTRA_DATA_HEADER_CONFIG;
220 break;
221 default:
222 dprintk(VIDC_WARN, "Extradata index not found: %d\n", index);
223 break;
224 }
225 return ret;
226}
227
228int create_pkt_cmd_session_set_buffers(
229 struct hfi_cmd_session_set_buffers_packet *pkt,
230 u32 session_id,
231 struct vidc_buffer_addr_info *buffer_info)
232{
233 int rc = 0;
234 int i = 0;
235 if (!pkt || !session_id)
236 return -EINVAL;
237
238 pkt->packet_type = HFI_CMD_SESSION_SET_BUFFERS;
239 pkt->session_id = session_id;
240 pkt->buffer_size = buffer_info->buffer_size;
241 pkt->min_buffer_size = buffer_info->buffer_size;
242 pkt->num_buffers = buffer_info->num_buffers;
243
244 if ((buffer_info->buffer_type == HAL_BUFFER_OUTPUT) ||
245 (buffer_info->buffer_type == HAL_BUFFER_OUTPUT2)) {
246 struct hfi_buffer_info *buff;
247 pkt->extra_data_size = buffer_info->extradata_size;
248 pkt->size = sizeof(struct hfi_cmd_session_set_buffers_packet) -
249 sizeof(u32) + (buffer_info->num_buffers *
250 sizeof(struct hfi_buffer_info));
251 buff = (struct hfi_buffer_info *) pkt->rg_buffer_info;
252 for (i = 0; i < pkt->num_buffers; i++) {
253 buff->buffer_addr = buffer_info->align_device_addr;
254 buff->extra_data_addr = buffer_info->extradata_addr;
255 }
256 } else {
257 pkt->extra_data_size = 0;
258 pkt->size = sizeof(struct hfi_cmd_session_set_buffers_packet) +
259 ((buffer_info->num_buffers - 1) * sizeof(u32));
260 for (i = 0; i < pkt->num_buffers; i++)
261 pkt->rg_buffer_info[i] = buffer_info->align_device_addr;
262 }
263
264 pkt->buffer_type = get_hfi_buffer(buffer_info->buffer_type);
265 if (!pkt->buffer_type)
266 return -EINVAL;
267
268 return rc;
269}
270
271int create_pkt_cmd_session_release_buffers(
272 struct hfi_cmd_session_release_buffer_packet *pkt,
273 u32 session_id, struct vidc_buffer_addr_info *buffer_info)
274{
275 int rc = 0;
276 int i = 0;
277 if (!pkt || !session_id)
278 return -EINVAL;
279
280 pkt->packet_type = HFI_CMD_SESSION_RELEASE_BUFFERS;
281 pkt->session_id = session_id;
282 pkt->buffer_size = buffer_info->buffer_size;
283 pkt->num_buffers = buffer_info->num_buffers;
284
285 if ((buffer_info->buffer_type == HAL_BUFFER_OUTPUT) ||
286 (buffer_info->buffer_type == HAL_BUFFER_OUTPUT2)) {
287 struct hfi_buffer_info *buff;
288 buff = (struct hfi_buffer_info *) pkt->rg_buffer_info;
289 for (i = 0; i < pkt->num_buffers; i++) {
290 buff->buffer_addr = buffer_info->align_device_addr;
291 buff->extra_data_addr = buffer_info->extradata_addr;
292 }
293 pkt->size = sizeof(struct hfi_cmd_session_set_buffers_packet) -
294 sizeof(u32) + (buffer_info->num_buffers *
295 sizeof(struct hfi_buffer_info));
296 } else {
297 for (i = 0; i < pkt->num_buffers; i++)
298 pkt->rg_buffer_info[i] = buffer_info->align_device_addr;
299 pkt->extra_data_size = 0;
300 pkt->size = sizeof(struct hfi_cmd_session_set_buffers_packet) +
301 ((buffer_info->num_buffers - 1) * sizeof(u32));
302 }
303 pkt->response_req = buffer_info->response_required;
304 pkt->buffer_type = get_hfi_buffer(buffer_info->buffer_type);
305 if (!pkt->buffer_type)
306 return -EINVAL;
307 return rc;
308}
309
310int create_pkt_cmd_session_etb_decoder(
311 struct hfi_cmd_session_empty_buffer_compressed_packet *pkt,
312 u32 session_id, struct vidc_frame_data *input_frame)
313{
314 int rc = 0;
315 if (!pkt || !session_id)
316 return -EINVAL;
317
318 pkt->size =
319 sizeof(struct hfi_cmd_session_empty_buffer_compressed_packet);
320 pkt->packet_type = HFI_CMD_SESSION_EMPTY_BUFFER;
321 pkt->session_id = session_id;
322 pkt->time_stamp_hi = (int) (((u64)input_frame->timestamp) >> 32);
323 pkt->time_stamp_lo = (int) input_frame->timestamp;
324 pkt->flags = input_frame->flags;
325 pkt->mark_target = input_frame->mark_target;
326 pkt->mark_data = input_frame->mark_data;
327 pkt->offset = input_frame->offset;
328 pkt->alloc_len = input_frame->alloc_len;
329 pkt->filled_len = input_frame->filled_len;
330 pkt->input_tag = input_frame->clnt_data;
331 pkt->packet_buffer = (u8 *) input_frame->device_addr;
332
333 if (!pkt->packet_buffer)
334 return -EINVAL;
335 return rc;
336}
337
338int create_pkt_cmd_session_etb_encoder(
339 struct hfi_cmd_session_empty_buffer_uncompressed_plane0_packet *pkt,
340 u32 session_id, struct vidc_frame_data *input_frame)
341{
342 int rc = 0;
343 if (!pkt || !session_id)
344 return -EINVAL;
345
346 pkt->size = sizeof(struct
347 hfi_cmd_session_empty_buffer_uncompressed_plane0_packet);
348 pkt->packet_type = HFI_CMD_SESSION_EMPTY_BUFFER;
349 pkt->session_id = session_id;
350 pkt->view_id = 0;
351 pkt->time_stamp_hi = (u32)(((u64)input_frame->timestamp) >> 32);
352 pkt->time_stamp_lo = (u32)input_frame->timestamp;
353 pkt->flags = input_frame->flags;
354 pkt->mark_target = input_frame->mark_target;
355 pkt->mark_data = input_frame->mark_data;
356 pkt->offset = input_frame->offset;
357 pkt->alloc_len = input_frame->alloc_len;
358 pkt->filled_len = input_frame->filled_len;
359 pkt->input_tag = input_frame->clnt_data;
360 pkt->packet_buffer = (u8 *) input_frame->device_addr;
361
362 if (!pkt->packet_buffer)
363 return -EINVAL;
364 return rc;
365}
366
367int create_pkt_cmd_session_ftb(struct hfi_cmd_session_fill_buffer_packet *pkt,
368 u32 session_id, struct vidc_frame_data *output_frame)
369{
370 int rc = 0;
371 if (!pkt || !session_id || !output_frame)
372 return -EINVAL;
373
374 pkt->size = sizeof(struct hfi_cmd_session_fill_buffer_packet);
375 pkt->packet_type = HFI_CMD_SESSION_FILL_BUFFER;
376 pkt->session_id = session_id;
377
378 if (output_frame->buffer_type == HAL_BUFFER_OUTPUT)
379 pkt->stream_id = 0;
380 else if (output_frame->buffer_type == HAL_BUFFER_OUTPUT2)
381 pkt->stream_id = 1;
382
383 if (!output_frame->device_addr)
384 return -EINVAL;
385
386 pkt->packet_buffer = (u8 *) output_frame->device_addr;
387 pkt->extra_data_buffer = (u8 *) output_frame->extradata_addr;
388
389 pkt->alloc_len = output_frame->alloc_len;
390 pkt->filled_len = output_frame->filled_len;
391 pkt->offset = output_frame->offset;
392 dprintk(VIDC_DBG, "### Q OUTPUT BUFFER ###: %d, %d, %d\n",
393 pkt->alloc_len, pkt->filled_len, pkt->offset);
394
395 return rc;
396}
397
398int create_pkt_cmd_session_parse_seq_header(
399 struct hfi_cmd_session_parse_sequence_header_packet *pkt,
400 u32 session_id, struct vidc_seq_hdr *seq_hdr)
401{
402 int rc = 0;
403 if (!pkt || !session_id || seq_hdr)
404 return -EINVAL;
405
406 pkt->size = sizeof(struct hfi_cmd_session_parse_sequence_header_packet);
407 pkt->packet_type = HFI_CMD_SESSION_PARSE_SEQUENCE_HEADER;
408 pkt->session_id = session_id;
409 pkt->header_len = seq_hdr->seq_hdr_len;
410 if (!seq_hdr->seq_hdr)
411 return -EINVAL;
412 pkt->packet_buffer = seq_hdr->seq_hdr;
413
414 return rc;
415}
416
417int create_pkt_cmd_session_get_seq_hdr(
418 struct hfi_cmd_session_get_sequence_header_packet *pkt,
419 u32 session_id, struct vidc_seq_hdr *seq_hdr)
420{
421 int rc = 0;
422
423 if (!pkt || !session_id || !seq_hdr)
424 return -EINVAL;
425
426 pkt->size = sizeof(struct hfi_cmd_session_get_sequence_header_packet);
427 pkt->packet_type = HFI_CMD_SESSION_GET_SEQUENCE_HEADER;
428 pkt->session_id = session_id;
429 pkt->buffer_len = seq_hdr->seq_hdr_len;
430 if (!seq_hdr->seq_hdr)
431 return -EINVAL;
432 pkt->packet_buffer = seq_hdr->seq_hdr;
433
434 return rc;
435}
436
437int create_pkt_cmd_session_get_buf_req(
438 struct hfi_cmd_session_get_property_packet *pkt,
439 u32 session_id)
440{
441 int rc = 0;
442
443 if (!pkt || !session_id)
444 return -EINVAL;
445
446 pkt->size = sizeof(struct hfi_cmd_session_get_property_packet);
447 pkt->packet_type = HFI_CMD_SESSION_GET_PROPERTY;
448 pkt->session_id = session_id;
449 pkt->num_properties = 1;
450 pkt->rg_property_data[0] = HFI_PROPERTY_CONFIG_BUFFER_REQUIREMENTS;
451
452 return rc;
453}
454
455int create_pkt_cmd_session_flush(struct hfi_cmd_session_flush_packet *pkt,
456 u32 session_id, enum hal_flush flush_mode)
457{
458 int rc = 0;
459 if (!pkt || !session_id)
460 return -EINVAL;
461
462 pkt->size = sizeof(struct hfi_cmd_session_flush_packet);
463 pkt->packet_type = HFI_CMD_SESSION_FLUSH;
464 pkt->session_id = session_id;
465 switch (flush_mode) {
466 case HAL_FLUSH_INPUT:
467 pkt->flush_type = HFI_FLUSH_INPUT;
468 break;
469 case HAL_FLUSH_OUTPUT:
470 pkt->flush_type = HFI_FLUSH_OUTPUT;
471 break;
472 case HAL_FLUSH_OUTPUT2:
473 pkt->flush_type = HFI_FLUSH_OUTPUT2;
474 break;
475 case HAL_FLUSH_ALL:
476 pkt->flush_type = HFI_FLUSH_ALL;
477 break;
478 default:
479 dprintk(VIDC_ERR, "Invalid flush mode: 0x%x\n", flush_mode);
480 return -EINVAL;
481 }
482 return rc;
483}
484
485int create_pkt_cmd_session_set_property(
486 struct hfi_cmd_session_set_property_packet *pkt,
487 u32 session_id, enum hal_property ptype, void *pdata)
488{
489 int rc = 0;
490 if (!pkt || !session_id)
491 return -EINVAL;
492
493 pkt->size = sizeof(struct hfi_cmd_session_set_property_packet);
494 pkt->packet_type = HFI_CMD_SESSION_SET_PROPERTY;
495 pkt->session_id = session_id;
496 pkt->num_properties = 1;
497
498 switch (ptype) {
499 case HAL_CONFIG_FRAME_RATE:
500 {
501 u32 buffer_type;
502 struct hfi_frame_rate *hfi;
503 struct hal_frame_rate *prop = (struct hal_frame_rate *) pdata;
504
505 pkt->rg_property_data[0] = HFI_PROPERTY_CONFIG_FRAME_RATE;
506 hfi = (struct hfi_frame_rate *) &pkt->rg_property_data[1];
507 buffer_type = get_hfi_buffer(prop->buffer_type);
508 if (buffer_type)
509 hfi->buffer_type = buffer_type;
510 else
511 return -EINVAL;
512
513 hfi->frame_rate = prop->frame_rate;
514 pkt->size += sizeof(u32) + sizeof(struct hfi_frame_rate);
515 break;
516 }
517 case HAL_PARAM_UNCOMPRESSED_FORMAT_SELECT:
518 {
519 u32 buffer_type;
520 struct hfi_uncompressed_format_select *hfi;
521 struct hal_uncompressed_format_select *prop =
522 (struct hal_uncompressed_format_select *) pdata;
523
524 pkt->rg_property_data[0] =
525 HFI_PROPERTY_PARAM_UNCOMPRESSED_FORMAT_SELECT;
526
527 hfi = (struct hfi_uncompressed_format_select *)
528 &pkt->rg_property_data[1];
529 buffer_type = get_hfi_buffer(prop->buffer_type);
530 if (buffer_type)
531 hfi->buffer_type = buffer_type;
532 else
533 return -EINVAL;
534 hfi->format = prop->format;
535 pkt->size += sizeof(u32) +
536 sizeof(struct hfi_uncompressed_format_select);
537 break;
538 }
539 case HAL_PARAM_UNCOMPRESSED_PLANE_ACTUAL_CONSTRAINTS_INFO:
540 break;
541 case HAL_PARAM_UNCOMPRESSED_PLANE_ACTUAL_INFO:
542 break;
543 case HAL_PARAM_EXTRA_DATA_HEADER_CONFIG:
544 break;
545 case HAL_PARAM_FRAME_SIZE:
546 {
547 struct hfi_frame_size *hfi;
548 struct hal_frame_size *prop = (struct hal_frame_size *) pdata;
549 u32 buffer_type;
550
551 pkt->rg_property_data[0] = HFI_PROPERTY_PARAM_FRAME_SIZE;
552 hfi = (struct hfi_frame_size *) &pkt->rg_property_data[1];
553 buffer_type = get_hfi_buffer(prop->buffer_type);
554 if (buffer_type)
555 hfi->buffer_type = buffer_type;
556 else
557 return -EINVAL;
558
559 hfi->height = prop->height;
560 hfi->width = prop->width;
561 pkt->size += sizeof(u32) + sizeof(struct hfi_frame_size);
562 break;
563 }
564 case HAL_CONFIG_REALTIME:
565 {
566 struct hfi_enable *hfi;
567 pkt->rg_property_data[0] = HFI_PROPERTY_CONFIG_REALTIME;
568 hfi = (struct hfi_enable *) &pkt->rg_property_data[1];
569 hfi->enable = ((struct hfi_enable *) pdata)->enable;
570 pkt->size += sizeof(u32) * 2;
571 break;
572 }
573 case HAL_PARAM_BUFFER_COUNT_ACTUAL:
574 {
575 struct hfi_buffer_count_actual *hfi;
576 struct hal_buffer_count_actual *prop =
577 (struct hal_buffer_count_actual *) pdata;
578 u32 buffer_type;
579 pkt->rg_property_data[0] =
580 HFI_PROPERTY_PARAM_BUFFER_COUNT_ACTUAL;
581 hfi = (struct hfi_buffer_count_actual *)
582 &pkt->rg_property_data[1];
583 hfi->buffer_count_actual = prop->buffer_count_actual;
584
585 buffer_type = get_hfi_buffer(prop->buffer_type);
586 if (buffer_type)
587 hfi->buffer_type = buffer_type;
588 else
589 return -EINVAL;
590
591 pkt->size += sizeof(u32) + sizeof(struct
592 hfi_buffer_count_actual);
593
594 break;
595 }
596 case HAL_PARAM_NAL_STREAM_FORMAT_SELECT:
597 {
598 struct hal_nal_stream_format_supported *prop =
599 (struct hal_nal_stream_format_supported *)pdata;
600 pkt->rg_property_data[0] =
601 HFI_PROPERTY_PARAM_NAL_STREAM_FORMAT_SELECT;
602 dprintk(VIDC_DBG, "data is :%d",
603 prop->nal_stream_format_supported);
604
605 switch (prop->nal_stream_format_supported) {
606 case HAL_NAL_FORMAT_STARTCODES:
607 pkt->rg_property_data[1] =
608 HFI_NAL_FORMAT_STARTCODES;
609 break;
610 case HAL_NAL_FORMAT_ONE_NAL_PER_BUFFER:
611 pkt->rg_property_data[1] =
612 HFI_NAL_FORMAT_ONE_NAL_PER_BUFFER;
613 break;
614 case HAL_NAL_FORMAT_ONE_BYTE_LENGTH:
615 pkt->rg_property_data[1] =
616 HFI_NAL_FORMAT_ONE_BYTE_LENGTH;
617 break;
618 case HAL_NAL_FORMAT_TWO_BYTE_LENGTH:
619 pkt->rg_property_data[1] =
620 HFI_NAL_FORMAT_TWO_BYTE_LENGTH;
621 break;
622 case HAL_NAL_FORMAT_FOUR_BYTE_LENGTH:
623 pkt->rg_property_data[1] =
624 HFI_NAL_FORMAT_FOUR_BYTE_LENGTH;
625 break;
626 default:
627 dprintk(VIDC_ERR, "Invalid nal format: 0x%x",
628 prop->nal_stream_format_supported);
629 break;
630 }
631 pkt->size += sizeof(u32) * 2;
632 break;
633 }
634 case HAL_PARAM_VDEC_OUTPUT_ORDER:
635 {
636 int *data = (int *) pdata;
637 pkt->rg_property_data[0] =
638 HFI_PROPERTY_PARAM_VDEC_OUTPUT_ORDER;
639 switch (*data) {
640 case HAL_OUTPUT_ORDER_DECODE:
641 pkt->rg_property_data[1] = HFI_OUTPUT_ORDER_DECODE;
642 break;
643 case HAL_OUTPUT_ORDER_DISPLAY:
644 pkt->rg_property_data[1] = HFI_OUTPUT_ORDER_DISPLAY;
645 break;
646 default:
647 dprintk(VIDC_ERR, "invalid output order: 0x%x",
648 *data);
649 break;
650 }
651 pkt->size += sizeof(u32) * 2;
652 break;
653 }
654 case HAL_PARAM_VDEC_PICTURE_TYPE_DECODE:
655 {
656 struct hfi_enable_picture *hfi;
657 pkt->rg_property_data[0] =
658 HFI_PROPERTY_PARAM_VDEC_PICTURE_TYPE_DECODE;
659 hfi = (struct hfi_enable_picture *) &pkt->rg_property_data[1];
660 hfi->picture_type = (u32) pdata;
661 pkt->size += sizeof(u32) * 2;
662 break;
663 }
664 case HAL_PARAM_VDEC_OUTPUT2_KEEP_ASPECT_RATIO:
665 {
666 struct hfi_enable *hfi;
667 pkt->rg_property_data[0] =
668 HFI_PROPERTY_PARAM_VDEC_OUTPUT2_KEEP_ASPECT_RATIO;
669 hfi = (struct hfi_enable *) &pkt->rg_property_data[1];
670 hfi->enable = ((struct hfi_enable *) pdata)->enable;
671 pkt->size += sizeof(u32) * 2;
672 break;
673 }
674 case HAL_CONFIG_VDEC_POST_LOOP_DEBLOCKER:
675 {
676 struct hfi_enable *hfi;
677 pkt->rg_property_data[0] =
678 HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER;
679 hfi = (struct hfi_enable *) &pkt->rg_property_data[1];
680 hfi->enable = ((struct hfi_enable *) pdata)->enable;
681 pkt->size += sizeof(u32) * 2;
682 break;
683 }
684 case HAL_PARAM_VDEC_MULTI_STREAM:
685 {
686 struct hfi_multi_stream *hfi;
687 struct hal_multi_stream *prop =
688 (struct hal_multi_stream *) pdata;
689 u32 buffer_type;
690 pkt->rg_property_data[0] =
691 HFI_PROPERTY_PARAM_VDEC_MULTI_STREAM;
692 hfi = (struct hfi_multi_stream *) &pkt->rg_property_data[1];
693
694 buffer_type = get_hfi_buffer(prop->buffer_type);
695 if (buffer_type)
696 hfi->buffer_type = buffer_type;
697 else
698 return -EINVAL;
699 hfi->enable = prop->enable;
700 hfi->width = prop->width;
701 hfi->height = prop->height;
702 pkt->size += sizeof(u32) + sizeof(struct hfi_multi_stream);
703 break;
704 }
705 case HAL_PARAM_VDEC_DISPLAY_PICTURE_BUFFER_COUNT:
706 {
707 struct hfi_display_picture_buffer_count *hfi;
708 struct hal_display_picture_buffer_count *prop =
709 (struct hal_display_picture_buffer_count *) pdata;
710 pkt->rg_property_data[0] =
711 HFI_PROPERTY_PARAM_VDEC_DISPLAY_PICTURE_BUFFER_COUNT;
712 hfi = (struct hfi_display_picture_buffer_count *)
713 &pkt->rg_property_data[1];
714 hfi->count = prop->count;
715 hfi->enable = prop->enable;
716 pkt->size += sizeof(u32) +
717 sizeof(struct hfi_display_picture_buffer_count);
718 break;
719 }
720 case HAL_PARAM_DIVX_FORMAT:
721 {
722 int *data = pdata;
723 pkt->rg_property_data[0] = HFI_PROPERTY_PARAM_DIVX_FORMAT;
724 switch (*data) {
725 case HAL_DIVX_FORMAT_4:
726 pkt->rg_property_data[1] = HFI_DIVX_FORMAT_4;
727 break;
728 case HAL_DIVX_FORMAT_5:
729 pkt->rg_property_data[1] = HFI_DIVX_FORMAT_5;
730 break;
731 case HAL_DIVX_FORMAT_6:
732 pkt->rg_property_data[1] = HFI_DIVX_FORMAT_6;
733 break;
734 default:
735 dprintk(VIDC_ERR, "Invalid divx format: 0x%x", *data);
736 break;
737 }
738 pkt->size += sizeof(u32) * 2;
739 break;
740 }
741 case HAL_CONFIG_VDEC_MB_ERROR_MAP_REPORTING:
742 {
743 struct hfi_enable *hfi;
744 pkt->rg_property_data[0] =
745 HFI_PROPERTY_CONFIG_VDEC_MB_ERROR_MAP_REPORTING;
746 hfi = (struct hfi_enable *) &pkt->rg_property_data[1];
747 hfi->enable = ((struct hfi_enable *) pdata)->enable;
748 pkt->size += sizeof(u32) * 2;
749 break;
750 }
751 case HAL_PARAM_VDEC_CONTINUE_DATA_TRANSFER:
752 {
753 struct hfi_enable *hfi;
754 pkt->rg_property_data[0] =
755 HFI_PROPERTY_PARAM_VDEC_CONTINUE_DATA_TRANSFER;
756 hfi = (struct hfi_enable *) &pkt->rg_property_data[1];
757 hfi->enable = ((struct hfi_enable *) pdata)->enable;
758 pkt->size += sizeof(u32) * 2;
759 break;
760 }
761 case HAL_PARAM_VDEC_SYNC_FRAME_DECODE:
762 {
763 struct hfi_enable *hfi;
764 pkt->rg_property_data[0] =
765 HFI_PROPERTY_PARAM_VDEC_THUMBNAIL_MODE;
766 hfi = (struct hfi_enable *) &pkt->rg_property_data[1];
767 hfi->enable = ((struct hfi_enable *) pdata)->enable;
768 pkt->size += sizeof(u32) * 2;
769 break;
770 }
771 case HAL_PARAM_VENC_SYNC_FRAME_SEQUENCE_HEADER:
772 {
773 struct hfi_enable *hfi;
774 pkt->rg_property_data[0] =
775 HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER;
776 hfi = (struct hfi_enable *) &pkt->rg_property_data[1];
777 hfi->enable = ((struct hfi_enable *) pdata)->enable;
778 pkt->size += sizeof(u32) * 2;
779 break;
780 }
781 case HAL_CONFIG_VENC_REQUEST_IFRAME:
782 pkt->rg_property_data[0] =
783 HFI_PROPERTY_CONFIG_VENC_REQUEST_SYNC_FRAME;
784 pkt->size += sizeof(u32);
785 break;
786 case HAL_PARAM_VENC_MPEG4_SHORT_HEADER:
787 break;
788 case HAL_PARAM_VENC_MPEG4_AC_PREDICTION:
789 break;
790 case HAL_CONFIG_VENC_TARGET_BITRATE:
791 {
792 struct hfi_bitrate *hfi;
793 pkt->rg_property_data[0] =
794 HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE;
795 hfi = (struct hfi_bitrate *) &pkt->rg_property_data[1];
796 hfi->bit_rate = ((struct hal_bitrate *)pdata)->bit_rate;
Vinay Kalia35a40af2012-12-18 13:58:29 -0800797 hfi->layer_id = ((struct hal_bitrate *)pdata)->layer_id;
Arun Menonbf943062012-12-18 14:13:15 -0800798 pkt->size += sizeof(u32) * 2;
799 break;
800 }
801 case HAL_PARAM_PROFILE_LEVEL_CURRENT:
802 {
803 struct hfi_profile_level *hfi;
804 struct hal_profile_level *prop =
805 (struct hal_profile_level *) pdata;
806 pkt->rg_property_data[0] =
807 HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT;
808 hfi = (struct hfi_profile_level *)
809 &pkt->rg_property_data[1];
810 hfi->level = (u32) prop->level;
811 hfi->profile = prop->profile;
812 if (!hfi->profile)
813 hfi->profile = HFI_H264_PROFILE_HIGH;
814 if (!hfi->level)
815 hfi->level = 1;
816 pkt->size += sizeof(u32) + sizeof(struct hfi_profile_level);
817 break;
818 }
819 case HAL_PARAM_VENC_H264_ENTROPY_CONTROL:
820 {
821 struct hfi_h264_entropy_control *hfi;
822 struct hal_h264_entropy_control *prop =
823 (struct hal_h264_entropy_control *) pdata;
824 pkt->rg_property_data[0] =
825 HFI_PROPERTY_PARAM_VENC_H264_ENTROPY_CONTROL;
826 hfi = (struct hfi_h264_entropy_control *)
827 &pkt->rg_property_data[1];
828 switch (prop->entropy_mode) {
829 case HAL_H264_ENTROPY_CAVLC:
830 hfi->cabac_model = HFI_H264_ENTROPY_CAVLC;
831 break;
832 case HAL_H264_ENTROPY_CABAC:
833 hfi->cabac_model = HFI_H264_ENTROPY_CABAC;
834 switch (prop->cabac_model) {
835 case HAL_H264_CABAC_MODEL_0:
836 hfi->cabac_model = HFI_H264_CABAC_MODEL_0;
837 break;
838 case HAL_H264_CABAC_MODEL_1:
839 hfi->cabac_model = HFI_H264_CABAC_MODEL_1;
840 break;
841 case HAL_H264_CABAC_MODEL_2:
842 hfi->cabac_model = HFI_H264_CABAC_MODEL_2;
843 break;
844 default:
845 dprintk(VIDC_ERR,
846 "Invalid cabac model 0x%x",
847 prop->entropy_mode);
848 break;
849 }
850 break;
851 default:
852 dprintk(VIDC_ERR,
853 "Invalid entropy selected: 0x%x",
854 prop->cabac_model);
855 break;
856 }
857 pkt->size += sizeof(u32) + sizeof(
858 struct hfi_h264_entropy_control);
859 break;
860 }
861 case HAL_PARAM_VENC_RATE_CONTROL:
862 {
863 u32 *rc;
864 pkt->rg_property_data[0] =
865 HFI_PROPERTY_PARAM_VENC_RATE_CONTROL;
866 rc = (u32 *)pdata;
867 switch ((enum hal_rate_control) *rc) {
868 case HAL_RATE_CONTROL_OFF:
869 pkt->rg_property_data[1] = HFI_RATE_CONTROL_OFF;
870 break;
871 case HAL_RATE_CONTROL_CBR_CFR:
872 pkt->rg_property_data[1] = HFI_RATE_CONTROL_CBR_CFR;
873 break;
874 case HAL_RATE_CONTROL_CBR_VFR:
875 pkt->rg_property_data[1] = HFI_RATE_CONTROL_CBR_VFR;
876 break;
877 case HAL_RATE_CONTROL_VBR_CFR:
878 pkt->rg_property_data[1] = HFI_RATE_CONTROL_VBR_CFR;
879 break;
880 case HAL_RATE_CONTROL_VBR_VFR:
881 pkt->rg_property_data[1] = HFI_RATE_CONTROL_VBR_VFR;
882 break;
883 default:
884 dprintk(VIDC_ERR, "Invalid Rate control setting: 0x%x",
885 (int) pdata);
886 break;
887 }
888 pkt->size += sizeof(u32) * 2;
889 break;
890 }
891 case HAL_PARAM_VENC_MPEG4_TIME_RESOLUTION:
892 {
893 struct hfi_mpeg4_time_resolution *hfi;
894 pkt->rg_property_data[0] =
895 HFI_PROPERTY_PARAM_VENC_MPEG4_TIME_RESOLUTION;
896 hfi = (struct hfi_mpeg4_time_resolution *)
897 &pkt->rg_property_data[1];
898 hfi->time_increment_resolution =
899 ((struct hal_mpeg4_time_resolution *)pdata)->
900 time_increment_resolution;
901 pkt->size += sizeof(u32) * 2;
902 break;
903 }
904 case HAL_PARAM_VENC_MPEG4_HEADER_EXTENSION:
905 {
906 struct hfi_mpeg4_header_extension *hfi;
907 pkt->rg_property_data[0] =
908 HFI_PROPERTY_PARAM_VENC_MPEG4_HEADER_EXTENSION;
909 hfi = (struct hfi_mpeg4_header_extension *)
910 &pkt->rg_property_data[1];
911 hfi->header_extension = (u32) pdata;
912 pkt->size += sizeof(u32) * 2;
913 break;
914 }
915 case HAL_PARAM_VENC_H264_DEBLOCK_CONTROL:
916 {
917 struct hfi_h264_db_control *hfi;
918 struct hal_h264_db_control *prop =
919 (struct hal_h264_db_control *) pdata;
920 pkt->rg_property_data[0] =
921 HFI_PROPERTY_PARAM_VENC_H264_DEBLOCK_CONTROL;
922 hfi = (struct hfi_h264_db_control *) &pkt->rg_property_data[1];
923 switch (prop->mode) {
924 case HAL_H264_DB_MODE_DISABLE:
925 hfi->mode = HFI_H264_DB_MODE_DISABLE;
926 break;
927 case HAL_H264_DB_MODE_SKIP_SLICE_BOUNDARY:
928 hfi->mode = HFI_H264_DB_MODE_SKIP_SLICE_BOUNDARY;
929 break;
930 case HAL_H264_DB_MODE_ALL_BOUNDARY:
931 hfi->mode = HFI_H264_DB_MODE_ALL_BOUNDARY;
932 break;
933 default:
934 dprintk(VIDC_ERR, "Invalid deblocking mode: 0x%x",
935 prop->mode);
936 break;
937 }
938 hfi->slice_alpha_offset = prop->slice_alpha_offset;
939 hfi->slice_beta_offset = prop->slice_beta_offset;
940 pkt->size += sizeof(u32) +
941 sizeof(struct hfi_h264_db_control);
942 break;
943 }
944 case HAL_PARAM_VENC_SESSION_QP:
945 {
946 struct hfi_quantization *hfi;
Vinay Kalia8ebf38e2012-12-18 17:48:51 -0800947 struct hal_quantization *hal_quant =
948 (struct hal_quantization *) pdata;
Arun Menonbf943062012-12-18 14:13:15 -0800949 pkt->rg_property_data[0] =
950 HFI_PROPERTY_PARAM_VENC_SESSION_QP;
951 hfi = (struct hfi_quantization *) &pkt->rg_property_data[1];
Vinay Kalia8ebf38e2012-12-18 17:48:51 -0800952 hfi->qp_i = hal_quant->qpi;
953 hfi->qp_p = hal_quant->qpp;
954 hfi->qp_b = hal_quant->qpb;
Vinay Kalia35a40af2012-12-18 13:58:29 -0800955 hfi->layer_id = hal_quant->layer_id;
Arun Menonbf943062012-12-18 14:13:15 -0800956 pkt->size += sizeof(u32) + sizeof(struct hfi_quantization);
957 break;
958 }
959 case HAL_CONFIG_VENC_INTRA_PERIOD:
960 {
961 struct hfi_intra_period *hfi;
962 pkt->rg_property_data[0] =
963 HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD;
964 hfi = (struct hfi_intra_period *) &pkt->rg_property_data[1];
965 memcpy(hfi, (struct hfi_intra_period *) pdata,
966 sizeof(struct hfi_intra_period));
967 pkt->size += sizeof(u32) + sizeof(struct hfi_intra_period);
968 break;
969 }
970 case HAL_CONFIG_VENC_IDR_PERIOD:
971 {
972 struct hfi_idr_period *hfi;
973 pkt->rg_property_data[0] = HFI_PROPERTY_CONFIG_VENC_IDR_PERIOD;
974 hfi = (struct hfi_idr_period *) &pkt->rg_property_data[1];
975 hfi->idr_period = ((struct hfi_idr_period *) pdata)->idr_period;
976 pkt->size += sizeof(u32) * 2;
977 break;
978 }
979 case HAL_CONFIG_VPE_OPERATIONS:
980 break;
981 case HAL_PARAM_VENC_INTRA_REFRESH:
982 {
983 struct hfi_intra_refresh *hfi;
984 struct hal_intra_refresh *prop =
985 (struct hal_intra_refresh *) pdata;
986 pkt->rg_property_data[0] =
987 HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH;
988 hfi = (struct hfi_intra_refresh *) &pkt->rg_property_data[1];
989 switch (prop->mode) {
990 case HAL_INTRA_REFRESH_NONE:
991 hfi->mode = HFI_INTRA_REFRESH_NONE;
992 break;
993 case HAL_INTRA_REFRESH_ADAPTIVE:
994 hfi->mode = HFI_INTRA_REFRESH_ADAPTIVE;
995 break;
996 case HAL_INTRA_REFRESH_CYCLIC:
997 hfi->mode = HFI_INTRA_REFRESH_CYCLIC;
998 break;
999 case HAL_INTRA_REFRESH_CYCLIC_ADAPTIVE:
1000 hfi->mode = HFI_INTRA_REFRESH_CYCLIC_ADAPTIVE;
1001 break;
1002 case HAL_INTRA_REFRESH_RANDOM:
1003 hfi->mode = HFI_INTRA_REFRESH_RANDOM;
1004 break;
1005 default:
1006 dprintk(VIDC_ERR, "Invalid intra refresh setting: 0x%x",
1007 prop->mode);
1008 break;
1009 }
1010 hfi->air_mbs = prop->air_mbs;
1011 hfi->air_ref = prop->air_ref;
1012 hfi->cir_mbs = prop->cir_mbs;
1013 pkt->size += sizeof(u32) + sizeof(struct hfi_intra_refresh);
1014 break;
1015 }
1016 case HAL_PARAM_VENC_MULTI_SLICE_CONTROL:
1017 {
1018 struct hfi_multi_slice_control *hfi;
1019 struct hal_multi_slice_control *prop =
1020 (struct hal_multi_slice_control *) pdata;
1021 pkt->rg_property_data[0] =
1022 HFI_PROPERTY_PARAM_VENC_MULTI_SLICE_CONTROL;
1023 hfi = (struct hfi_multi_slice_control *)
1024 &pkt->rg_property_data[1];
1025 switch (prop->multi_slice) {
1026 case HAL_MULTI_SLICE_OFF:
1027 hfi->multi_slice = HFI_MULTI_SLICE_OFF;
1028 break;
1029 case HAL_MULTI_SLICE_GOB:
1030 hfi->multi_slice = HFI_MULTI_SLICE_GOB;
1031 break;
1032 case HAL_MULTI_SLICE_BY_MB_COUNT:
1033 hfi->multi_slice = HFI_MULTI_SLICE_BY_MB_COUNT;
1034 break;
1035 case HAL_MULTI_SLICE_BY_BYTE_COUNT:
1036 hfi->multi_slice = HFI_MULTI_SLICE_BY_BYTE_COUNT;
1037 break;
1038 default:
1039 dprintk(VIDC_ERR, "Invalid slice settings: 0x%x",
1040 prop->multi_slice);
1041 break;
1042 }
1043 hfi->slice_size = prop->slice_size;
1044 pkt->size += sizeof(u32) + sizeof(struct
1045 hfi_multi_slice_control);
1046 break;
1047 }
1048 case HAL_PARAM_INDEX_EXTRADATA:
1049 {
1050 struct hfi_index_extradata_config *hfi;
1051 struct hal_extradata_enable *extra = pdata;
1052 int index = 0;
1053 pkt->rg_property_data[0] =
1054 get_hfi_extradata_index(extra->index);
1055 hfi =
1056 (struct hfi_index_extradata_config *)
1057 &pkt->rg_property_data[1];
1058 hfi->enable = extra->enable;
1059 index = get_hfi_extradata_index(extra->index);
1060 if (index)
1061 hfi->index_extra_data_id = index;
1062 else {
1063 dprintk(VIDC_WARN,
1064 "Failed to find extradata index: %d\n",
1065 index);
1066 rc = -EINVAL;
1067 }
1068 pkt->size += sizeof(u32) +
1069 sizeof(struct hfi_index_extradata_config);
1070 break;
1071 }
1072 case HAL_CONFIG_VPE_DEINTERLACE:
1073 break;
1074 /* FOLLOWING PROPERTIES ARE NOT IMPLEMENTED IN CORE YET */
1075 case HAL_CONFIG_BUFFER_REQUIREMENTS:
1076 case HAL_CONFIG_PRIORITY:
1077 case HAL_CONFIG_BATCH_INFO:
1078 case HAL_PARAM_METADATA_PASS_THROUGH:
1079 case HAL_SYS_IDLE_INDICATOR:
1080 case HAL_PARAM_UNCOMPRESSED_FORMAT_SUPPORTED:
1081 case HAL_PARAM_INTERLACE_FORMAT_SUPPORTED:
1082 case HAL_PARAM_CHROMA_SITE:
1083 case HAL_PARAM_PROPERTIES_SUPPORTED:
1084 case HAL_PARAM_PROFILE_LEVEL_SUPPORTED:
1085 case HAL_PARAM_CAPABILITY_SUPPORTED:
1086 case HAL_PARAM_NAL_STREAM_FORMAT_SUPPORTED:
1087 case HAL_PARAM_MULTI_VIEW_FORMAT:
1088 case HAL_PARAM_MAX_SEQUENCE_HEADER_SIZE:
1089 case HAL_PARAM_CODEC_SUPPORTED:
1090 case HAL_PARAM_VDEC_MULTI_VIEW_SELECT:
1091 case HAL_PARAM_VDEC_MB_QUANTIZATION:
1092 case HAL_PARAM_VDEC_NUM_CONCEALED_MB:
1093 case HAL_PARAM_VDEC_H264_ENTROPY_SWITCHING:
1094 case HAL_PARAM_VENC_SLICE_DELIVERY_MODE:
1095 case HAL_PARAM_VENC_MPEG4_DATA_PARTITIONING:
1096 case HAL_CONFIG_BUFFER_COUNT_ACTUAL:
1097 case HAL_CONFIG_VDEC_MULTI_STREAM:
1098 case HAL_PARAM_VENC_MULTI_SLICE_INFO:
1099 case HAL_CONFIG_VENC_TIMESTAMP_SCALE:
1100 case HAL_PARAM_VENC_LOW_LATENCY:
1101 default:
1102 dprintk(VIDC_ERR, "DEFAULT: Calling 0x%x", ptype);
1103 break;
1104 }
1105 return rc;
1106}
Vinay Kalia6094dfc2012-12-18 13:46:06 -08001107
1108static int get_hfi_ssr_type(enum hal_ssr_trigger_type type)
1109{
1110 int rc = HFI_TEST_SSR_HW_WDOG_IRQ;
1111 switch (type) {
1112 case SSR_ERR_FATAL:
1113 rc = HFI_TEST_SSR_SW_ERR_FATAL;
1114 break;
1115 case SSR_SW_DIV_BY_ZERO:
1116 rc = HFI_TEST_SSR_SW_DIV_BY_ZERO;
1117 break;
1118 case SSR_HW_WDOG_IRQ:
1119 rc = HFI_TEST_SSR_HW_WDOG_IRQ;
1120 break;
1121 default:
1122 dprintk(VIDC_WARN,
1123 "SSR trigger type not recognized, using WDOG.\n");
1124 }
1125 return rc;
1126}
1127
1128int create_pkt_ssr_cmd(enum hal_ssr_trigger_type type,
1129 struct hfi_cmd_sys_test_ssr_packet *pkt)
1130{
1131 if (!pkt) {
1132 dprintk(VIDC_ERR, "Invalid params, device: %p\n", pkt);
1133 return -EINVAL;
1134 }
1135 pkt->size = sizeof(struct hfi_cmd_sys_test_ssr_packet);
1136 pkt->packet_type = HFI_CMD_SYS_TEST_SSR;
1137 pkt->trigger_type = get_hfi_ssr_type(type);
1138 return 0;
1139}