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