File Index
Files and directories
Sign in
FILE

hfi_cmds.c

File preview with syntax highlighting.

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