linux/drivers/media/platform/qcom/venus/hfi_cmds.c
<<
>>
Prefs
   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
  11static enum hfi_version hfi_ver;
  12
  13void 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
  20void 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
  26void 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
  37void 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
  51void 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
  60int 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
  87int 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
 108void 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
 115void 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
 126int 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
 144void 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
 152int 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
 167void 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
 174int 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
 213int 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
 254int 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
 277int 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
 303int 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
 329int 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
 345int 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
 360int 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
 380static 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
 400static 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                case HFI_RATE_CONTROL_CQ:
 644                        break;
 645                default:
 646                        ret = -EINVAL;
 647                        break;
 648                }
 649
 650                pkt->data[1] = *in;
 651                pkt->shdr.hdr.size += sizeof(u32) * 2;
 652                break;
 653        }
 654        case HFI_PROPERTY_PARAM_VENC_MPEG4_TIME_RESOLUTION: {
 655                struct hfi_mpeg4_time_resolution *in = pdata, *res = prop_data;
 656
 657                res->time_increment_resolution = in->time_increment_resolution;
 658                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*res);
 659                break;
 660        }
 661        case HFI_PROPERTY_PARAM_VENC_MPEG4_HEADER_EXTENSION: {
 662                struct hfi_mpeg4_header_extension *in = pdata, *ext = prop_data;
 663
 664                ext->header_extension = in->header_extension;
 665                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ext);
 666                break;
 667        }
 668        case HFI_PROPERTY_PARAM_VENC_H264_DEBLOCK_CONTROL: {
 669                struct hfi_h264_db_control *in = pdata, *db = prop_data;
 670
 671                switch (in->mode) {
 672                case HFI_H264_DB_MODE_DISABLE:
 673                case HFI_H264_DB_MODE_SKIP_SLICE_BOUNDARY:
 674                case HFI_H264_DB_MODE_ALL_BOUNDARY:
 675                        break;
 676                default:
 677                        ret = -EINVAL;
 678                        break;
 679                }
 680
 681                db->mode = in->mode;
 682                db->slice_alpha_offset = in->slice_alpha_offset;
 683                db->slice_beta_offset = in->slice_beta_offset;
 684                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*db);
 685                break;
 686        }
 687        case HFI_PROPERTY_PARAM_VENC_SESSION_QP: {
 688                struct hfi_quantization *in = pdata, *quant = prop_data;
 689
 690                quant->qp_i = in->qp_i;
 691                quant->qp_p = in->qp_p;
 692                quant->qp_b = in->qp_b;
 693                quant->layer_id = in->layer_id;
 694                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*quant);
 695                break;
 696        }
 697        case HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE: {
 698                struct hfi_quantization_range *in = pdata, *range = prop_data;
 699                u32 min_qp, max_qp;
 700
 701                min_qp = in->min_qp;
 702                max_qp = in->max_qp;
 703
 704                /* We'll be packing in the qp, so make sure we
 705                 * won't be losing data when masking
 706                 */
 707                if (min_qp > 0xff || max_qp > 0xff) {
 708                        ret = -ERANGE;
 709                        break;
 710                }
 711
 712                /* When creating the packet, pack the qp value as
 713                 * 0xiippbb, where ii = qp range for I-frames,
 714                 * pp = qp range for P-frames, etc.
 715                 */
 716                range->min_qp = min_qp | min_qp << 8 | min_qp << 16;
 717                range->max_qp = max_qp | max_qp << 8 | max_qp << 16;
 718                range->layer_id = in->layer_id;
 719
 720                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*range);
 721                break;
 722        }
 723        case HFI_PROPERTY_PARAM_VENC_VC1_PERF_CFG: {
 724                struct hfi_vc1e_perf_cfg_type *in = pdata, *perf = prop_data;
 725
 726                memcpy(perf->search_range_x_subsampled,
 727                       in->search_range_x_subsampled,
 728                       sizeof(perf->search_range_x_subsampled));
 729                memcpy(perf->search_range_y_subsampled,
 730                       in->search_range_y_subsampled,
 731                       sizeof(perf->search_range_y_subsampled));
 732
 733                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*perf);
 734                break;
 735        }
 736        case HFI_PROPERTY_PARAM_VENC_MAX_NUM_B_FRAMES: {
 737                struct hfi_max_num_b_frames *bframes = prop_data;
 738                u32 *in = pdata;
 739
 740                bframes->max_num_b_frames = *in;
 741                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*bframes);
 742                break;
 743        }
 744        case HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD: {
 745                struct hfi_intra_period *in = pdata, *intra = prop_data;
 746
 747                intra->pframes = in->pframes;
 748                intra->bframes = in->bframes;
 749                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*intra);
 750                break;
 751        }
 752        case HFI_PROPERTY_CONFIG_VENC_IDR_PERIOD: {
 753                struct hfi_idr_period *in = pdata, *idr = prop_data;
 754
 755                idr->idr_period = in->idr_period;
 756                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*idr);
 757                break;
 758        }
 759        case HFI_PROPERTY_PARAM_VDEC_CONCEAL_COLOR: {
 760                struct hfi_conceal_color *color = prop_data;
 761                u32 *in = pdata;
 762
 763                color->conceal_color = *in;
 764                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*color);
 765                break;
 766        }
 767        case HFI_PROPERTY_CONFIG_VPE_OPERATIONS: {
 768                struct hfi_operations_type *in = pdata, *ops = prop_data;
 769
 770                switch (in->rotation) {
 771                case HFI_ROTATE_NONE:
 772                case HFI_ROTATE_90:
 773                case HFI_ROTATE_180:
 774                case HFI_ROTATE_270:
 775                        break;
 776                default:
 777                        ret = -EINVAL;
 778                        break;
 779                }
 780
 781                switch (in->flip) {
 782                case HFI_FLIP_NONE:
 783                case HFI_FLIP_HORIZONTAL:
 784                case HFI_FLIP_VERTICAL:
 785                        break;
 786                default:
 787                        ret = -EINVAL;
 788                        break;
 789                }
 790
 791                ops->rotation = in->rotation;
 792                ops->flip = in->flip;
 793                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ops);
 794                break;
 795        }
 796        case HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH: {
 797                struct hfi_intra_refresh *in = pdata, *intra = prop_data;
 798
 799                switch (in->mode) {
 800                case HFI_INTRA_REFRESH_NONE:
 801                case HFI_INTRA_REFRESH_ADAPTIVE:
 802                case HFI_INTRA_REFRESH_CYCLIC:
 803                case HFI_INTRA_REFRESH_CYCLIC_ADAPTIVE:
 804                case HFI_INTRA_REFRESH_RANDOM:
 805                        break;
 806                default:
 807                        ret = -EINVAL;
 808                        break;
 809                }
 810
 811                intra->mode = in->mode;
 812                intra->air_mbs = in->air_mbs;
 813                intra->air_ref = in->air_ref;
 814                intra->cir_mbs = in->cir_mbs;
 815                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*intra);
 816                break;
 817        }
 818        case HFI_PROPERTY_PARAM_VENC_MULTI_SLICE_CONTROL: {
 819                struct hfi_multi_slice_control *in = pdata, *multi = prop_data;
 820
 821                switch (in->multi_slice) {
 822                case HFI_MULTI_SLICE_OFF:
 823                case HFI_MULTI_SLICE_GOB:
 824                case HFI_MULTI_SLICE_BY_MB_COUNT:
 825                case HFI_MULTI_SLICE_BY_BYTE_COUNT:
 826                        break;
 827                default:
 828                        ret = -EINVAL;
 829                        break;
 830                }
 831
 832                multi->multi_slice = in->multi_slice;
 833                multi->slice_size = in->slice_size;
 834                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*multi);
 835                break;
 836        }
 837        case HFI_PROPERTY_PARAM_VENC_SLICE_DELIVERY_MODE: {
 838                struct hfi_enable *in = pdata, *en = prop_data;
 839
 840                en->enable = in->enable;
 841                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
 842                break;
 843        }
 844        case HFI_PROPERTY_PARAM_VENC_H264_VUI_TIMING_INFO: {
 845                struct hfi_h264_vui_timing_info *in = pdata, *vui = prop_data;
 846
 847                vui->enable = in->enable;
 848                vui->fixed_framerate = in->fixed_framerate;
 849                vui->time_scale = in->time_scale;
 850                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*vui);
 851                break;
 852        }
 853        case HFI_PROPERTY_CONFIG_VPE_DEINTERLACE: {
 854                struct hfi_enable *in = pdata, *en = prop_data;
 855
 856                en->enable = in->enable;
 857                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
 858                break;
 859        }
 860        case HFI_PROPERTY_PARAM_VENC_H264_GENERATE_AUDNAL: {
 861                struct hfi_enable *in = pdata, *en = prop_data;
 862
 863                en->enable = in->enable;
 864                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
 865                break;
 866        }
 867        case HFI_PROPERTY_PARAM_BUFFER_ALLOC_MODE: {
 868                struct hfi_buffer_alloc_mode *in = pdata, *mode = prop_data;
 869
 870                mode->type = in->type;
 871                mode->mode = in->mode;
 872                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*mode);
 873                break;
 874        }
 875        case HFI_PROPERTY_PARAM_VDEC_FRAME_ASSEMBLY: {
 876                struct hfi_enable *in = pdata, *en = prop_data;
 877
 878                en->enable = in->enable;
 879                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
 880                break;
 881        }
 882        case HFI_PROPERTY_PARAM_VENC_H264_VUI_BITSTREAM_RESTRC: {
 883                struct hfi_enable *in = pdata, *en = prop_data;
 884
 885                en->enable = in->enable;
 886                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
 887                break;
 888        }
 889        case HFI_PROPERTY_PARAM_VENC_PRESERVE_TEXT_QUALITY: {
 890                struct hfi_enable *in = pdata, *en = prop_data;
 891
 892                en->enable = in->enable;
 893                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
 894                break;
 895        }
 896        case HFI_PROPERTY_PARAM_VDEC_SCS_THRESHOLD: {
 897                struct hfi_scs_threshold *thres = prop_data;
 898                u32 *in = pdata;
 899
 900                thres->threshold_value = *in;
 901                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*thres);
 902                break;
 903        }
 904        case HFI_PROPERTY_PARAM_MVC_BUFFER_LAYOUT: {
 905                struct hfi_mvc_buffer_layout_descp_type *in = pdata;
 906                struct hfi_mvc_buffer_layout_descp_type *mvc = prop_data;
 907
 908                switch (in->layout_type) {
 909                case HFI_MVC_BUFFER_LAYOUT_TOP_BOTTOM:
 910                case HFI_MVC_BUFFER_LAYOUT_SEQ:
 911                        break;
 912                default:
 913                        ret = -EINVAL;
 914                        break;
 915                }
 916
 917                mvc->layout_type = in->layout_type;
 918                mvc->bright_view_first = in->bright_view_first;
 919                mvc->ngap = in->ngap;
 920                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*mvc);
 921                break;
 922        }
 923        case HFI_PROPERTY_PARAM_VENC_LTRMODE: {
 924                struct hfi_ltr_mode *in = pdata, *ltr = prop_data;
 925
 926                switch (in->ltr_mode) {
 927                case HFI_LTR_MODE_DISABLE:
 928                case HFI_LTR_MODE_MANUAL:
 929                case HFI_LTR_MODE_PERIODIC:
 930                        break;
 931                default:
 932                        ret = -EINVAL;
 933                        break;
 934                }
 935
 936                ltr->ltr_mode = in->ltr_mode;
 937                ltr->ltr_count = in->ltr_count;
 938                ltr->trust_mode = in->trust_mode;
 939                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ltr);
 940                break;
 941        }
 942        case HFI_PROPERTY_CONFIG_VENC_USELTRFRAME: {
 943                struct hfi_ltr_use *in = pdata, *ltr_use = prop_data;
 944
 945                ltr_use->frames = in->frames;
 946                ltr_use->ref_ltr = in->ref_ltr;
 947                ltr_use->use_constrnt = in->use_constrnt;
 948                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ltr_use);
 949                break;
 950        }
 951        case HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME: {
 952                struct hfi_ltr_mark *in = pdata, *ltr_mark = prop_data;
 953
 954                ltr_mark->mark_frame = in->mark_frame;
 955                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ltr_mark);
 956                break;
 957        }
 958        case HFI_PROPERTY_PARAM_VENC_HIER_P_MAX_NUM_ENH_LAYER: {
 959                u32 *in = pdata;
 960
 961                pkt->data[1] = *in;
 962                pkt->shdr.hdr.size += sizeof(u32) * 2;
 963                break;
 964        }
 965        case HFI_PROPERTY_CONFIG_VENC_HIER_P_ENH_LAYER: {
 966                u32 *in = pdata;
 967
 968                pkt->data[1] = *in;
 969                pkt->shdr.hdr.size += sizeof(u32) * 2;
 970                break;
 971        }
 972        case HFI_PROPERTY_PARAM_VENC_DISABLE_RC_TIMESTAMP: {
 973                struct hfi_enable *in = pdata, *en = prop_data;
 974
 975                en->enable = in->enable;
 976                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
 977                break;
 978        }
 979        case HFI_PROPERTY_PARAM_VENC_INITIAL_QP: {
 980                struct hfi_initial_quantization *in = pdata, *quant = prop_data;
 981
 982                quant->init_qp_enable = in->init_qp_enable;
 983                quant->qp_i = in->qp_i;
 984                quant->qp_p = in->qp_p;
 985                quant->qp_b = in->qp_b;
 986                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*quant);
 987                break;
 988        }
 989        case HFI_PROPERTY_PARAM_VPE_COLOR_SPACE_CONVERSION: {
 990                struct hfi_vpe_color_space_conversion *in = pdata;
 991                struct hfi_vpe_color_space_conversion *csc = prop_data;
 992
 993                memcpy(csc->csc_matrix, in->csc_matrix,
 994                       sizeof(csc->csc_matrix));
 995                memcpy(csc->csc_bias, in->csc_bias, sizeof(csc->csc_bias));
 996                memcpy(csc->csc_limit, in->csc_limit, sizeof(csc->csc_limit));
 997                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*csc);
 998                break;
 999        }
1000        case HFI_PROPERTY_PARAM_VENC_VPX_ERROR_RESILIENCE_MODE: {
1001                struct hfi_enable *in = pdata, *en = prop_data;
1002
1003                en->enable = in->enable;
1004                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
1005                break;
1006        }
1007        case HFI_PROPERTY_PARAM_VENC_H264_NAL_SVC_EXT: {
1008                struct hfi_enable *in = pdata, *en = prop_data;
1009
1010                en->enable = in->enable;
1011                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
1012                break;
1013        }
1014        case HFI_PROPERTY_CONFIG_VENC_PERF_MODE: {
1015                u32 *in = pdata;
1016
1017                pkt->data[1] = *in;
1018                pkt->shdr.hdr.size += sizeof(u32) * 2;
1019                break;
1020        }
1021        case HFI_PROPERTY_PARAM_VENC_HIER_B_MAX_NUM_ENH_LAYER: {
1022                u32 *in = pdata;
1023
1024                pkt->data[1] = *in;
1025                pkt->shdr.hdr.size += sizeof(u32) * 2;
1026                break;
1027        }
1028        case HFI_PROPERTY_PARAM_VDEC_NONCP_OUTPUT2: {
1029                struct hfi_enable *in = pdata, *en = prop_data;
1030
1031                en->enable = in->enable;
1032                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
1033                break;
1034        }
1035        case HFI_PROPERTY_PARAM_VENC_HIER_P_HYBRID_MODE: {
1036                struct hfi_hybrid_hierp *in = pdata, *hierp = prop_data;
1037
1038                hierp->layers = in->layers;
1039                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*hierp);
1040                break;
1041        }
1042
1043        /* FOLLOWING PROPERTIES ARE NOT IMPLEMENTED IN CORE YET */
1044        case HFI_PROPERTY_CONFIG_BUFFER_REQUIREMENTS:
1045        case HFI_PROPERTY_CONFIG_PRIORITY:
1046        case HFI_PROPERTY_CONFIG_BATCH_INFO:
1047        case HFI_PROPERTY_SYS_IDLE_INDICATOR:
1048        case HFI_PROPERTY_PARAM_UNCOMPRESSED_FORMAT_SUPPORTED:
1049        case HFI_PROPERTY_PARAM_INTERLACE_FORMAT_SUPPORTED:
1050        case HFI_PROPERTY_PARAM_CHROMA_SITE:
1051        case HFI_PROPERTY_PARAM_PROPERTIES_SUPPORTED:
1052        case HFI_PROPERTY_PARAM_PROFILE_LEVEL_SUPPORTED:
1053        case HFI_PROPERTY_PARAM_CAPABILITY_SUPPORTED:
1054        case HFI_PROPERTY_PARAM_NAL_STREAM_FORMAT_SUPPORTED:
1055        case HFI_PROPERTY_PARAM_MULTI_VIEW_FORMAT:
1056        case HFI_PROPERTY_PARAM_MAX_SEQUENCE_HEADER_SIZE:
1057        case HFI_PROPERTY_PARAM_CODEC_SUPPORTED:
1058        case HFI_PROPERTY_PARAM_VDEC_MULTI_VIEW_SELECT:
1059        case HFI_PROPERTY_PARAM_VDEC_MB_QUANTIZATION:
1060        case HFI_PROPERTY_PARAM_VDEC_NUM_CONCEALED_MB:
1061        case HFI_PROPERTY_PARAM_VDEC_H264_ENTROPY_SWITCHING:
1062        case HFI_PROPERTY_PARAM_VENC_MULTI_SLICE_INFO:
1063        default:
1064                return -EINVAL;
1065        }
1066
1067        return ret;
1068}
1069
1070static int
1071pkt_session_get_property_3xx(struct hfi_session_get_property_pkt *pkt,
1072                             void *cookie, u32 ptype)
1073{
1074        int ret = 0;
1075
1076        if (!pkt || !cookie)
1077                return -EINVAL;
1078
1079        pkt->shdr.hdr.size = sizeof(struct hfi_session_get_property_pkt);
1080        pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_GET_PROPERTY;
1081        pkt->shdr.session_id = hash32_ptr(cookie);
1082        pkt->num_properties = 1;
1083
1084        switch (ptype) {
1085        case HFI_PROPERTY_CONFIG_VDEC_ENTROPY:
1086                pkt->data[0] = HFI_PROPERTY_CONFIG_VDEC_ENTROPY;
1087                break;
1088        default:
1089                ret = pkt_session_get_property_1x(pkt, cookie, ptype);
1090                break;
1091        }
1092
1093        return ret;
1094}
1095
1096static int
1097pkt_session_set_property_3xx(struct hfi_session_set_property_pkt *pkt,
1098                             void *cookie, u32 ptype, void *pdata)
1099{
1100        void *prop_data;
1101        int ret = 0;
1102
1103        if (!pkt || !cookie || !pdata)
1104                return -EINVAL;
1105
1106        prop_data = &pkt->data[1];
1107
1108        pkt->shdr.hdr.size = sizeof(*pkt);
1109        pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_PROPERTY;
1110        pkt->shdr.session_id = hash32_ptr(cookie);
1111        pkt->num_properties = 1;
1112        pkt->data[0] = ptype;
1113
1114        /*
1115         * Any session set property which is different in 3XX packetization
1116         * should be added as a new case below. All unchanged session set
1117         * properties will be handled in the default case.
1118         */
1119        switch (ptype) {
1120        case HFI_PROPERTY_PARAM_VDEC_MULTI_STREAM: {
1121                struct hfi_multi_stream *in = pdata;
1122                struct hfi_multi_stream_3x *multi = prop_data;
1123
1124                multi->buffer_type = in->buffer_type;
1125                multi->enable = in->enable;
1126                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*multi);
1127                break;
1128        }
1129        case HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH: {
1130                struct hfi_intra_refresh *in = pdata;
1131                struct hfi_intra_refresh_3x *intra = prop_data;
1132
1133                switch (in->mode) {
1134                case HFI_INTRA_REFRESH_NONE:
1135                case HFI_INTRA_REFRESH_ADAPTIVE:
1136                case HFI_INTRA_REFRESH_CYCLIC:
1137                case HFI_INTRA_REFRESH_CYCLIC_ADAPTIVE:
1138                case HFI_INTRA_REFRESH_RANDOM:
1139                        break;
1140                default:
1141                        ret = -EINVAL;
1142                        break;
1143                }
1144
1145                intra->mode = in->mode;
1146                intra->mbs = in->cir_mbs;
1147                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*intra);
1148                break;
1149        }
1150        case HFI_PROPERTY_PARAM_VDEC_CONTINUE_DATA_TRANSFER:
1151                /* for 3xx fw version session_continue is used */
1152                break;
1153        default:
1154                ret = pkt_session_set_property_1x(pkt, cookie, ptype, pdata);
1155                break;
1156        }
1157
1158        return ret;
1159}
1160
1161static int
1162pkt_session_set_property_4xx(struct hfi_session_set_property_pkt *pkt,
1163                             void *cookie, u32 ptype, void *pdata)
1164{
1165        void *prop_data;
1166
1167        if (!pkt || !cookie || !pdata)
1168                return -EINVAL;
1169
1170        prop_data = &pkt->data[1];
1171
1172        pkt->shdr.hdr.size = sizeof(*pkt);
1173        pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_PROPERTY;
1174        pkt->shdr.session_id = hash32_ptr(cookie);
1175        pkt->num_properties = 1;
1176        pkt->data[0] = ptype;
1177
1178        /*
1179         * Any session set property which is different in 3XX packetization
1180         * should be added as a new case below. All unchanged session set
1181         * properties will be handled in the default case.
1182         */
1183        switch (ptype) {
1184        case HFI_PROPERTY_PARAM_BUFFER_COUNT_ACTUAL: {
1185                struct hfi_buffer_count_actual *in = pdata;
1186                struct hfi_buffer_count_actual_4xx *count = prop_data;
1187
1188                count->count_actual = in->count_actual;
1189                count->type = in->type;
1190                count->count_min_host = in->count_actual;
1191                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*count);
1192                break;
1193        }
1194        case HFI_PROPERTY_PARAM_WORK_MODE: {
1195                struct hfi_video_work_mode *in = pdata, *wm = prop_data;
1196
1197                wm->video_work_mode = in->video_work_mode;
1198                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*wm);
1199                break;
1200        }
1201        case HFI_PROPERTY_CONFIG_VIDEOCORES_USAGE: {
1202                struct hfi_videocores_usage_type *in = pdata, *cu = prop_data;
1203
1204                cu->video_core_enable_mask = in->video_core_enable_mask;
1205                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*cu);
1206                break;
1207        }
1208        case HFI_PROPERTY_CONFIG_VENC_MAX_BITRATE:
1209        case HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER:
1210        case HFI_PROPERTY_PARAM_BUFFER_ALLOC_MODE:
1211        case HFI_PROPERTY_PARAM_VENC_SESSION_QP:
1212        case HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE:
1213                /* not implemented on Venus 4xx */
1214                return -ENOTSUPP;
1215        default:
1216                return pkt_session_set_property_3xx(pkt, cookie, ptype, pdata);
1217        }
1218
1219        return 0;
1220}
1221
1222static int
1223pkt_session_set_property_6xx(struct hfi_session_set_property_pkt *pkt,
1224                             void *cookie, u32 ptype, void *pdata)
1225{
1226        void *prop_data;
1227
1228        if (!pkt || !cookie || !pdata)
1229                return -EINVAL;
1230
1231        prop_data = &pkt->data[1];
1232
1233        pkt->shdr.hdr.size = sizeof(*pkt);
1234        pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_PROPERTY;
1235        pkt->shdr.session_id = hash32_ptr(cookie);
1236        pkt->num_properties = 1;
1237        pkt->data[0] = ptype;
1238
1239        switch (ptype) {
1240        case HFI_PROPERTY_CONFIG_HEIC_FRAME_QUALITY: {
1241                struct hfi_heic_frame_quality *in = pdata, *cq = prop_data;
1242
1243                cq->frame_quality = in->frame_quality;
1244                pkt->shdr.hdr.size += sizeof(u32) + sizeof(*cq);
1245                break;
1246        } default:
1247                return pkt_session_set_property_4xx(pkt, cookie, ptype, pdata);
1248        }
1249
1250        return 0;
1251}
1252
1253int pkt_session_get_property(struct hfi_session_get_property_pkt *pkt,
1254                             void *cookie, u32 ptype)
1255{
1256        if (hfi_ver == HFI_VERSION_1XX)
1257                return pkt_session_get_property_1x(pkt, cookie, ptype);
1258
1259        return pkt_session_get_property_3xx(pkt, cookie, ptype);
1260}
1261
1262int pkt_session_set_property(struct hfi_session_set_property_pkt *pkt,
1263                             void *cookie, u32 ptype, void *pdata)
1264{
1265        if (hfi_ver == HFI_VERSION_1XX)
1266                return pkt_session_set_property_1x(pkt, cookie, ptype, pdata);
1267
1268        if (hfi_ver == HFI_VERSION_3XX)
1269                return pkt_session_set_property_3xx(pkt, cookie, ptype, pdata);
1270
1271        if (hfi_ver == HFI_VERSION_4XX)
1272                return pkt_session_set_property_4xx(pkt, cookie, ptype, pdata);
1273
1274        return pkt_session_set_property_6xx(pkt, cookie, ptype, pdata);
1275}
1276
1277void pkt_set_version(enum hfi_version version)
1278{
1279        hfi_ver = version;
1280}
1281