root/drivers/media/platform/qcom/venus/hfi_cmds.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. pkt_sys_init
  2. pkt_sys_pc_prep
  3. pkt_sys_idle_indicator
  4. pkt_sys_debug_config
  5. pkt_sys_coverage_config
  6. pkt_sys_set_resource
  7. pkt_sys_unset_resource
  8. pkt_sys_ping
  9. pkt_sys_power_control
  10. pkt_sys_ssr_cmd
  11. pkt_sys_image_version
  12. pkt_session_init
  13. pkt_session_cmd
  14. pkt_session_set_buffers
  15. pkt_session_unset_buffers
  16. pkt_session_etb_decoder
  17. pkt_session_etb_encoder
  18. pkt_session_ftb
  19. pkt_session_parse_seq_header
  20. pkt_session_get_seq_hdr
  21. pkt_session_flush
  22. pkt_session_get_property_1x
  23. pkt_session_set_property_1x
  24. pkt_session_get_property_3xx
  25. pkt_session_set_property_3xx
  26. pkt_session_set_property_4xx
  27. pkt_session_get_property
  28. pkt_session_set_property
  29. pkt_set_version

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

/* [<][>][^][v][top][bottom][index][help] */