1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
4 * Copyright (C) 2017 Linaro Ltd.
6 #include <linux/overflow.h>
7 #include <linux/errno.h>
8 #include <linux/hash.h>
12 static enum hfi_version hfi_ver;
14 void pkt_sys_init(struct hfi_sys_init_pkt *pkt, u32 arch_type)
16 pkt->hdr.size = sizeof(*pkt);
17 pkt->hdr.pkt_type = HFI_CMD_SYS_INIT;
18 pkt->arch_type = arch_type;
21 void pkt_sys_pc_prep(struct hfi_sys_pc_prep_pkt *pkt)
23 pkt->hdr.size = sizeof(*pkt);
24 pkt->hdr.pkt_type = HFI_CMD_SYS_PC_PREP;
27 void pkt_sys_idle_indicator(struct hfi_sys_set_property_pkt *pkt, u32 enable)
29 struct hfi_enable *hfi = (struct hfi_enable *)&pkt->data[1];
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;
38 void pkt_sys_debug_config(struct hfi_sys_set_property_pkt *pkt, u32 mode,
41 struct hfi_debug_config *hfi;
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];
52 void pkt_sys_coverage_config(struct hfi_sys_set_property_pkt *pkt, u32 mode)
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;
61 int pkt_sys_set_resource(struct hfi_sys_set_resource_pkt *pkt, u32 id, u32 size,
62 u32 addr, void *cookie)
64 pkt->hdr.size = sizeof(*pkt);
65 pkt->hdr.pkt_type = HFI_CMD_SYS_SET_RESOURCE;
66 pkt->resource_handle = hash32_ptr(cookie);
69 case VIDC_RESOURCE_OCMEM:
70 case VIDC_RESOURCE_VMEM: {
71 struct hfi_resource_ocmem *res =
72 (struct hfi_resource_ocmem *)&pkt->resource_data[0];
76 pkt->resource_type = HFI_RESOURCE_OCMEM;
77 pkt->hdr.size += sizeof(*res) - sizeof(u32);
80 case VIDC_RESOURCE_NONE:
88 int pkt_sys_unset_resource(struct hfi_sys_release_resource_pkt *pkt, u32 id,
89 u32 size, void *cookie)
91 pkt->hdr.size = sizeof(*pkt);
92 pkt->hdr.pkt_type = HFI_CMD_SYS_RELEASE_RESOURCE;
93 pkt->resource_handle = hash32_ptr(cookie);
96 case VIDC_RESOURCE_OCMEM:
97 case VIDC_RESOURCE_VMEM:
98 pkt->resource_type = HFI_RESOURCE_OCMEM;
100 case VIDC_RESOURCE_NONE:
109 void pkt_sys_ping(struct hfi_sys_ping_pkt *pkt, u32 cookie)
111 pkt->hdr.size = sizeof(*pkt);
112 pkt->hdr.pkt_type = HFI_CMD_SYS_PING;
113 pkt->client_data = cookie;
116 void pkt_sys_power_control(struct hfi_sys_set_property_pkt *pkt, u32 enable)
118 struct hfi_enable *hfi = (struct hfi_enable *)&pkt->data[1];
120 pkt->hdr.size = struct_size(pkt, data, 1) + sizeof(*hfi);
121 pkt->hdr.pkt_type = HFI_CMD_SYS_SET_PROPERTY;
122 pkt->num_properties = 1;
123 pkt->data[0] = HFI_PROPERTY_SYS_CODEC_POWER_PLANE_CTRL;
124 hfi->enable = enable;
127 int pkt_sys_ssr_cmd(struct hfi_sys_test_ssr_pkt *pkt, u32 trigger_type)
129 switch (trigger_type) {
130 case HFI_TEST_SSR_SW_ERR_FATAL:
131 case HFI_TEST_SSR_SW_DIV_BY_ZERO:
132 case HFI_TEST_SSR_HW_WDOG_IRQ:
138 pkt->hdr.size = sizeof(*pkt);
139 pkt->hdr.pkt_type = HFI_CMD_SYS_TEST_SSR;
140 pkt->trigger_type = trigger_type;
145 void pkt_sys_image_version(struct hfi_sys_get_property_pkt *pkt)
147 pkt->hdr.size = sizeof(*pkt);
148 pkt->hdr.pkt_type = HFI_CMD_SYS_GET_PROPERTY;
149 pkt->num_properties = 1;
150 pkt->data[0] = HFI_PROPERTY_SYS_IMAGE_VERSION;
153 int pkt_session_init(struct hfi_session_init_pkt *pkt, void *cookie,
154 u32 session_type, u32 codec)
156 if (!pkt || !cookie || !codec)
159 pkt->shdr.hdr.size = sizeof(*pkt);
160 pkt->shdr.hdr.pkt_type = HFI_CMD_SYS_SESSION_INIT;
161 pkt->shdr.session_id = hash32_ptr(cookie);
162 pkt->session_domain = session_type;
163 pkt->session_codec = codec;
168 void pkt_session_cmd(struct hfi_session_pkt *pkt, u32 pkt_type, void *cookie)
170 pkt->shdr.hdr.size = sizeof(*pkt);
171 pkt->shdr.hdr.pkt_type = pkt_type;
172 pkt->shdr.session_id = hash32_ptr(cookie);
175 int pkt_session_set_buffers(struct hfi_session_set_buffers_pkt *pkt,
176 void *cookie, struct hfi_buffer_desc *bd)
180 if (!cookie || !pkt || !bd)
183 pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_BUFFERS;
184 pkt->shdr.session_id = hash32_ptr(cookie);
185 pkt->buffer_size = bd->buffer_size;
186 pkt->min_buffer_size = bd->buffer_size;
187 pkt->num_buffers = bd->num_buffers;
189 if (bd->buffer_type == HFI_BUFFER_OUTPUT ||
190 bd->buffer_type == HFI_BUFFER_OUTPUT2) {
191 struct hfi_buffer_info *bi;
193 pkt->extradata_size = bd->extradata_size;
194 pkt->shdr.hdr.size = sizeof(*pkt) - sizeof(u32) +
195 (bd->num_buffers * sizeof(*bi));
196 bi = (struct hfi_buffer_info *)pkt->buffer_info;
197 for (i = 0; i < pkt->num_buffers; i++) {
198 bi->buffer_addr = bd->device_addr;
199 bi->extradata_addr = bd->extradata_addr;
202 pkt->extradata_size = 0;
203 pkt->shdr.hdr.size = sizeof(*pkt) +
204 ((bd->num_buffers - 1) * sizeof(u32));
205 for (i = 0; i < pkt->num_buffers; i++)
206 pkt->buffer_info[i] = bd->device_addr;
209 pkt->buffer_type = bd->buffer_type;
214 int pkt_session_unset_buffers(struct hfi_session_release_buffer_pkt *pkt,
215 void *cookie, struct hfi_buffer_desc *bd)
219 if (!cookie || !pkt || !bd)
222 pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_RELEASE_BUFFERS;
223 pkt->shdr.session_id = hash32_ptr(cookie);
224 pkt->buffer_size = bd->buffer_size;
225 pkt->num_buffers = bd->num_buffers;
227 if (bd->buffer_type == HFI_BUFFER_OUTPUT ||
228 bd->buffer_type == HFI_BUFFER_OUTPUT2) {
229 struct hfi_buffer_info *bi;
231 bi = (struct hfi_buffer_info *)pkt->buffer_info;
232 for (i = 0; i < pkt->num_buffers; i++) {
233 bi->buffer_addr = bd->device_addr;
234 bi->extradata_addr = bd->extradata_addr;
237 sizeof(struct hfi_session_set_buffers_pkt) -
238 sizeof(u32) + (bd->num_buffers * sizeof(*bi));
240 for (i = 0; i < pkt->num_buffers; i++)
241 pkt->buffer_info[i] = bd->device_addr;
243 pkt->extradata_size = 0;
245 sizeof(struct hfi_session_set_buffers_pkt) +
246 ((bd->num_buffers - 1) * sizeof(u32));
249 pkt->response_req = bd->response_required;
250 pkt->buffer_type = bd->buffer_type;
255 int pkt_session_etb_decoder(struct hfi_session_empty_buffer_compressed_pkt *pkt,
256 void *cookie, struct hfi_frame_data *in_frame)
261 pkt->shdr.hdr.size = sizeof(*pkt);
262 pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_EMPTY_BUFFER;
263 pkt->shdr.session_id = hash32_ptr(cookie);
264 pkt->time_stamp_hi = upper_32_bits(in_frame->timestamp);
265 pkt->time_stamp_lo = lower_32_bits(in_frame->timestamp);
266 pkt->flags = in_frame->flags;
267 pkt->mark_target = in_frame->mark_target;
268 pkt->mark_data = in_frame->mark_data;
269 pkt->offset = in_frame->offset;
270 pkt->alloc_len = in_frame->alloc_len;
271 pkt->filled_len = in_frame->filled_len;
272 pkt->input_tag = in_frame->clnt_data;
273 pkt->packet_buffer = in_frame->device_addr;
278 int pkt_session_etb_encoder(
279 struct hfi_session_empty_buffer_uncompressed_plane0_pkt *pkt,
280 void *cookie, struct hfi_frame_data *in_frame)
282 if (!cookie || !in_frame->device_addr)
285 pkt->shdr.hdr.size = sizeof(*pkt);
286 pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_EMPTY_BUFFER;
287 pkt->shdr.session_id = hash32_ptr(cookie);
289 pkt->time_stamp_hi = upper_32_bits(in_frame->timestamp);
290 pkt->time_stamp_lo = lower_32_bits(in_frame->timestamp);
291 pkt->flags = in_frame->flags;
292 pkt->mark_target = in_frame->mark_target;
293 pkt->mark_data = in_frame->mark_data;
294 pkt->offset = in_frame->offset;
295 pkt->alloc_len = in_frame->alloc_len;
296 pkt->filled_len = in_frame->filled_len;
297 pkt->input_tag = in_frame->clnt_data;
298 pkt->packet_buffer = in_frame->device_addr;
299 pkt->extradata_buffer = in_frame->extradata_addr;
304 int pkt_session_ftb(struct hfi_session_fill_buffer_pkt *pkt, void *cookie,
305 struct hfi_frame_data *out_frame)
307 if (!cookie || !out_frame || !out_frame->device_addr)
310 pkt->shdr.hdr.size = sizeof(*pkt);
311 pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_FILL_BUFFER;
312 pkt->shdr.session_id = hash32_ptr(cookie);
314 if (out_frame->buffer_type == HFI_BUFFER_OUTPUT)
316 else if (out_frame->buffer_type == HFI_BUFFER_OUTPUT2)
319 pkt->output_tag = out_frame->clnt_data;
320 pkt->packet_buffer = out_frame->device_addr;
321 pkt->extradata_buffer = out_frame->extradata_addr;
322 pkt->alloc_len = out_frame->alloc_len;
323 pkt->filled_len = out_frame->filled_len;
324 pkt->offset = out_frame->offset;
325 pkt->data[0] = out_frame->extradata_size;
330 int pkt_session_parse_seq_header(
331 struct hfi_session_parse_sequence_header_pkt *pkt,
332 void *cookie, u32 seq_hdr, u32 seq_hdr_len)
334 if (!cookie || !seq_hdr || !seq_hdr_len)
337 pkt->shdr.hdr.size = sizeof(*pkt);
338 pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_PARSE_SEQUENCE_HEADER;
339 pkt->shdr.session_id = hash32_ptr(cookie);
340 pkt->header_len = seq_hdr_len;
341 pkt->packet_buffer = seq_hdr;
346 int pkt_session_get_seq_hdr(struct hfi_session_get_sequence_header_pkt *pkt,
347 void *cookie, u32 seq_hdr, u32 seq_hdr_len)
349 if (!cookie || !seq_hdr || !seq_hdr_len)
352 pkt->shdr.hdr.size = sizeof(*pkt);
353 pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_GET_SEQUENCE_HEADER;
354 pkt->shdr.session_id = hash32_ptr(cookie);
355 pkt->buffer_len = seq_hdr_len;
356 pkt->packet_buffer = seq_hdr;
361 int pkt_session_flush(struct hfi_session_flush_pkt *pkt, void *cookie, u32 type)
364 case HFI_FLUSH_INPUT:
365 case HFI_FLUSH_OUTPUT:
366 case HFI_FLUSH_OUTPUT2:
373 pkt->shdr.hdr.size = sizeof(*pkt);
374 pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_FLUSH;
375 pkt->shdr.session_id = hash32_ptr(cookie);
376 pkt->flush_type = type;
381 static int pkt_session_get_property_1x(struct hfi_session_get_property_pkt *pkt,
382 void *cookie, u32 ptype)
385 case HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT:
386 case HFI_PROPERTY_CONFIG_BUFFER_REQUIREMENTS:
392 pkt->shdr.hdr.size = sizeof(*pkt);
393 pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_GET_PROPERTY;
394 pkt->shdr.session_id = hash32_ptr(cookie);
395 pkt->num_properties = 1;
396 pkt->data[0] = ptype;
401 static int pkt_session_set_property_1x(struct hfi_session_set_property_pkt *pkt,
402 void *cookie, u32 ptype, void *pdata)
407 if (!pkt || !cookie || !pdata)
410 prop_data = &pkt->data[1];
412 pkt->shdr.hdr.size = sizeof(*pkt);
413 pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_PROPERTY;
414 pkt->shdr.session_id = hash32_ptr(cookie);
415 pkt->num_properties = 1;
416 pkt->data[0] = ptype;
419 case HFI_PROPERTY_CONFIG_FRAME_RATE: {
420 struct hfi_framerate *in = pdata, *frate = prop_data;
422 frate->buffer_type = in->buffer_type;
423 frate->framerate = in->framerate;
424 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*frate);
427 case HFI_PROPERTY_PARAM_UNCOMPRESSED_FORMAT_SELECT: {
428 struct hfi_uncompressed_format_select *in = pdata;
429 struct hfi_uncompressed_format_select *hfi = prop_data;
431 hfi->buffer_type = in->buffer_type;
432 hfi->format = in->format;
433 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*hfi);
436 case HFI_PROPERTY_PARAM_FRAME_SIZE: {
437 struct hfi_framesize *in = pdata, *fsize = prop_data;
439 fsize->buffer_type = in->buffer_type;
440 fsize->height = in->height;
441 fsize->width = in->width;
442 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*fsize);
445 case HFI_PROPERTY_CONFIG_REALTIME: {
446 struct hfi_enable *in = pdata, *en = prop_data;
448 en->enable = in->enable;
449 pkt->shdr.hdr.size += sizeof(u32) * 2;
452 case HFI_PROPERTY_PARAM_BUFFER_COUNT_ACTUAL: {
453 struct hfi_buffer_count_actual *in = pdata, *count = prop_data;
455 count->count_actual = in->count_actual;
456 count->type = in->type;
457 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*count);
460 case HFI_PROPERTY_PARAM_BUFFER_SIZE_ACTUAL: {
461 struct hfi_buffer_size_actual *in = pdata, *sz = prop_data;
465 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*sz);
468 case HFI_PROPERTY_PARAM_BUFFER_DISPLAY_HOLD_COUNT_ACTUAL: {
469 struct hfi_buffer_display_hold_count_actual *in = pdata;
470 struct hfi_buffer_display_hold_count_actual *count = prop_data;
472 count->hold_count = in->hold_count;
473 count->type = in->type;
474 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*count);
477 case HFI_PROPERTY_PARAM_NAL_STREAM_FORMAT_SELECT: {
478 struct hfi_nal_stream_format_select *in = pdata;
479 struct hfi_nal_stream_format_select *fmt = prop_data;
481 fmt->format = in->format;
482 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*fmt);
485 case HFI_PROPERTY_PARAM_VDEC_OUTPUT_ORDER: {
489 case HFI_OUTPUT_ORDER_DECODE:
490 case HFI_OUTPUT_ORDER_DISPLAY:
498 pkt->shdr.hdr.size += sizeof(u32) * 2;
501 case HFI_PROPERTY_PARAM_VDEC_PICTURE_TYPE_DECODE: {
502 struct hfi_enable_picture *in = pdata, *en = prop_data;
504 en->picture_type = in->picture_type;
505 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
508 case HFI_PROPERTY_PARAM_VDEC_OUTPUT2_KEEP_ASPECT_RATIO: {
509 struct hfi_enable *in = pdata, *en = prop_data;
511 en->enable = in->enable;
512 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
515 case HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER: {
516 struct hfi_enable *in = pdata;
517 struct hfi_enable *en = prop_data;
519 en->enable = in->enable;
520 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
523 case HFI_PROPERTY_PARAM_VDEC_MULTI_STREAM: {
524 struct hfi_multi_stream *in = pdata, *multi = prop_data;
526 multi->buffer_type = in->buffer_type;
527 multi->enable = in->enable;
528 multi->width = in->width;
529 multi->height = in->height;
530 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*multi);
533 case HFI_PROPERTY_PARAM_VDEC_DISPLAY_PICTURE_BUFFER_COUNT: {
534 struct hfi_display_picture_buffer_count *in = pdata;
535 struct hfi_display_picture_buffer_count *count = prop_data;
537 count->count = in->count;
538 count->enable = in->enable;
539 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*count);
542 case HFI_PROPERTY_PARAM_DIVX_FORMAT: {
546 case HFI_DIVX_FORMAT_4:
547 case HFI_DIVX_FORMAT_5:
548 case HFI_DIVX_FORMAT_6:
556 pkt->shdr.hdr.size += sizeof(u32) * 2;
559 case HFI_PROPERTY_CONFIG_VDEC_MB_ERROR_MAP_REPORTING: {
560 struct hfi_enable *in = pdata, *en = prop_data;
562 en->enable = in->enable;
563 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
566 case HFI_PROPERTY_PARAM_VDEC_CONTINUE_DATA_TRANSFER: {
567 struct hfi_enable *in = pdata, *en = prop_data;
569 en->enable = in->enable;
570 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
573 case HFI_PROPERTY_PARAM_VDEC_THUMBNAIL_MODE: {
574 struct hfi_enable *in = pdata, *en = prop_data;
576 en->enable = in->enable;
577 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
580 case HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER: {
581 struct hfi_enable *in = pdata, *en = prop_data;
583 en->enable = in->enable;
584 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
587 case HFI_PROPERTY_CONFIG_VENC_REQUEST_SYNC_FRAME:
588 pkt->shdr.hdr.size += sizeof(u32);
590 case HFI_PROPERTY_PARAM_VENC_MPEG4_SHORT_HEADER:
592 case HFI_PROPERTY_PARAM_VENC_MPEG4_AC_PREDICTION:
594 case HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE: {
595 struct hfi_bitrate *in = pdata, *brate = prop_data;
597 brate->bitrate = in->bitrate;
598 brate->layer_id = in->layer_id;
599 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*brate);
602 case HFI_PROPERTY_CONFIG_VENC_MAX_BITRATE: {
603 struct hfi_bitrate *in = pdata, *hfi = prop_data;
605 hfi->bitrate = in->bitrate;
606 hfi->layer_id = in->layer_id;
607 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*hfi);
610 case HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT: {
611 struct hfi_profile_level *in = pdata, *pl = prop_data;
613 pl->level = in->level;
614 pl->profile = in->profile;
615 if (pl->profile <= 0)
616 /* Profile not supported, falling back to high */
617 pl->profile = HFI_H264_PROFILE_HIGH;
620 /* Level not supported, falling back to 1 */
623 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*pl);
626 case HFI_PROPERTY_PARAM_VENC_H264_ENTROPY_CONTROL: {
627 struct hfi_h264_entropy_control *in = pdata, *hfi = prop_data;
629 hfi->entropy_mode = in->entropy_mode;
630 if (hfi->entropy_mode == HFI_H264_ENTROPY_CABAC)
631 hfi->cabac_model = in->cabac_model;
632 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*hfi);
635 case HFI_PROPERTY_PARAM_VENC_RATE_CONTROL: {
639 case HFI_RATE_CONTROL_OFF:
640 case HFI_RATE_CONTROL_CBR_CFR:
641 case HFI_RATE_CONTROL_CBR_VFR:
642 case HFI_RATE_CONTROL_VBR_CFR:
643 case HFI_RATE_CONTROL_VBR_VFR:
644 case HFI_RATE_CONTROL_CQ:
652 pkt->shdr.hdr.size += sizeof(u32) * 2;
655 case HFI_PROPERTY_PARAM_VENC_MPEG4_TIME_RESOLUTION: {
656 struct hfi_mpeg4_time_resolution *in = pdata, *res = prop_data;
658 res->time_increment_resolution = in->time_increment_resolution;
659 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*res);
662 case HFI_PROPERTY_PARAM_VENC_MPEG4_HEADER_EXTENSION: {
663 struct hfi_mpeg4_header_extension *in = pdata, *ext = prop_data;
665 ext->header_extension = in->header_extension;
666 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ext);
669 case HFI_PROPERTY_PARAM_VENC_H264_DEBLOCK_CONTROL: {
670 struct hfi_h264_db_control *in = pdata, *db = prop_data;
673 case HFI_H264_DB_MODE_DISABLE:
674 case HFI_H264_DB_MODE_SKIP_SLICE_BOUNDARY:
675 case HFI_H264_DB_MODE_ALL_BOUNDARY:
683 db->slice_alpha_offset = in->slice_alpha_offset;
684 db->slice_beta_offset = in->slice_beta_offset;
685 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*db);
688 case HFI_PROPERTY_PARAM_VENC_SESSION_QP: {
689 struct hfi_quantization *in = pdata, *quant = prop_data;
691 quant->qp_i = in->qp_i;
692 quant->qp_p = in->qp_p;
693 quant->qp_b = in->qp_b;
694 quant->layer_id = in->layer_id;
695 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*quant);
698 case HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE: {
699 struct hfi_quantization_range *in = pdata, *range = prop_data;
705 /* We'll be packing in the qp, so make sure we
706 * won't be losing data when masking
708 if (min_qp > 0xff || max_qp > 0xff) {
713 /* When creating the packet, pack the qp value as
714 * 0xiippbb, where ii = qp range for I-frames,
715 * pp = qp range for P-frames, etc.
717 range->min_qp = min_qp | min_qp << 8 | min_qp << 16;
718 range->max_qp = max_qp | max_qp << 8 | max_qp << 16;
719 range->layer_id = in->layer_id;
721 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*range);
724 case HFI_PROPERTY_PARAM_VENC_VC1_PERF_CFG: {
725 struct hfi_vc1e_perf_cfg_type *in = pdata, *perf = prop_data;
727 memcpy(perf->search_range_x_subsampled,
728 in->search_range_x_subsampled,
729 sizeof(perf->search_range_x_subsampled));
730 memcpy(perf->search_range_y_subsampled,
731 in->search_range_y_subsampled,
732 sizeof(perf->search_range_y_subsampled));
734 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*perf);
737 case HFI_PROPERTY_PARAM_VENC_MAX_NUM_B_FRAMES: {
738 struct hfi_max_num_b_frames *bframes = prop_data;
741 bframes->max_num_b_frames = *in;
742 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*bframes);
745 case HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD: {
746 struct hfi_intra_period *in = pdata, *intra = prop_data;
748 intra->pframes = in->pframes;
749 intra->bframes = in->bframes;
750 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*intra);
753 case HFI_PROPERTY_CONFIG_VENC_IDR_PERIOD: {
754 struct hfi_idr_period *in = pdata, *idr = prop_data;
756 idr->idr_period = in->idr_period;
757 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*idr);
760 case HFI_PROPERTY_PARAM_VDEC_CONCEAL_COLOR: {
761 struct hfi_conceal_color *color = prop_data;
764 color->conceal_color = *in & 0xff;
765 color->conceal_color |= ((*in >> 10) & 0xff) << 8;
766 color->conceal_color |= ((*in >> 20) & 0xff) << 16;
767 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*color);
770 case HFI_PROPERTY_CONFIG_VPE_OPERATIONS: {
771 struct hfi_operations_type *in = pdata, *ops = prop_data;
773 switch (in->rotation) {
774 case HFI_ROTATE_NONE:
786 case HFI_FLIP_HORIZONTAL:
787 case HFI_FLIP_VERTICAL:
794 ops->rotation = in->rotation;
795 ops->flip = in->flip;
796 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ops);
799 case HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH: {
800 struct hfi_intra_refresh *in = pdata, *intra = prop_data;
803 case HFI_INTRA_REFRESH_NONE:
804 case HFI_INTRA_REFRESH_ADAPTIVE:
805 case HFI_INTRA_REFRESH_CYCLIC:
806 case HFI_INTRA_REFRESH_CYCLIC_ADAPTIVE:
807 case HFI_INTRA_REFRESH_RANDOM:
814 intra->mode = in->mode;
815 intra->air_mbs = in->air_mbs;
816 intra->air_ref = in->air_ref;
817 intra->cir_mbs = in->cir_mbs;
818 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*intra);
821 case HFI_PROPERTY_PARAM_VENC_MULTI_SLICE_CONTROL: {
822 struct hfi_multi_slice_control *in = pdata, *multi = prop_data;
824 switch (in->multi_slice) {
825 case HFI_MULTI_SLICE_OFF:
826 case HFI_MULTI_SLICE_GOB:
827 case HFI_MULTI_SLICE_BY_MB_COUNT:
828 case HFI_MULTI_SLICE_BY_BYTE_COUNT:
835 multi->multi_slice = in->multi_slice;
836 multi->slice_size = in->slice_size;
837 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*multi);
840 case HFI_PROPERTY_PARAM_VENC_SLICE_DELIVERY_MODE: {
841 struct hfi_enable *in = pdata, *en = prop_data;
843 en->enable = in->enable;
844 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
847 case HFI_PROPERTY_PARAM_VENC_H264_VUI_TIMING_INFO: {
848 struct hfi_h264_vui_timing_info *in = pdata, *vui = prop_data;
850 vui->enable = in->enable;
851 vui->fixed_framerate = in->fixed_framerate;
852 vui->time_scale = in->time_scale;
853 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*vui);
856 case HFI_PROPERTY_CONFIG_VPE_DEINTERLACE: {
857 struct hfi_enable *in = pdata, *en = prop_data;
859 en->enable = in->enable;
860 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
863 case HFI_PROPERTY_PARAM_VENC_H264_GENERATE_AUDNAL: {
864 struct hfi_enable *in = pdata, *en = prop_data;
866 en->enable = in->enable;
867 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
870 case HFI_PROPERTY_PARAM_BUFFER_ALLOC_MODE: {
871 struct hfi_buffer_alloc_mode *in = pdata, *mode = prop_data;
873 mode->type = in->type;
874 mode->mode = in->mode;
875 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*mode);
878 case HFI_PROPERTY_PARAM_VDEC_FRAME_ASSEMBLY: {
879 struct hfi_enable *in = pdata, *en = prop_data;
881 en->enable = in->enable;
882 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
885 case HFI_PROPERTY_PARAM_VENC_H264_VUI_BITSTREAM_RESTRC: {
886 struct hfi_enable *in = pdata, *en = prop_data;
888 en->enable = in->enable;
889 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
892 case HFI_PROPERTY_PARAM_VENC_PRESERVE_TEXT_QUALITY: {
893 struct hfi_enable *in = pdata, *en = prop_data;
895 en->enable = in->enable;
896 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
899 case HFI_PROPERTY_PARAM_VDEC_SCS_THRESHOLD: {
900 struct hfi_scs_threshold *thres = prop_data;
903 thres->threshold_value = *in;
904 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*thres);
907 case HFI_PROPERTY_PARAM_MVC_BUFFER_LAYOUT: {
908 struct hfi_mvc_buffer_layout_descp_type *in = pdata;
909 struct hfi_mvc_buffer_layout_descp_type *mvc = prop_data;
911 switch (in->layout_type) {
912 case HFI_MVC_BUFFER_LAYOUT_TOP_BOTTOM:
913 case HFI_MVC_BUFFER_LAYOUT_SEQ:
920 mvc->layout_type = in->layout_type;
921 mvc->bright_view_first = in->bright_view_first;
922 mvc->ngap = in->ngap;
923 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*mvc);
926 case HFI_PROPERTY_PARAM_VENC_LTRMODE: {
927 struct hfi_ltr_mode *in = pdata, *ltr = prop_data;
929 switch (in->ltr_mode) {
930 case HFI_LTR_MODE_DISABLE:
931 case HFI_LTR_MODE_MANUAL:
932 case HFI_LTR_MODE_PERIODIC:
939 ltr->ltr_mode = in->ltr_mode;
940 ltr->ltr_count = in->ltr_count;
941 ltr->trust_mode = in->trust_mode;
942 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ltr);
945 case HFI_PROPERTY_CONFIG_VENC_USELTRFRAME: {
946 struct hfi_ltr_use *in = pdata, *ltr_use = prop_data;
948 ltr_use->frames = in->frames;
949 ltr_use->ref_ltr = in->ref_ltr;
950 ltr_use->use_constrnt = in->use_constrnt;
951 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ltr_use);
954 case HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME: {
955 struct hfi_ltr_mark *in = pdata, *ltr_mark = prop_data;
957 ltr_mark->mark_frame = in->mark_frame;
958 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*ltr_mark);
961 case HFI_PROPERTY_PARAM_VENC_HIER_P_MAX_NUM_ENH_LAYER: {
965 pkt->shdr.hdr.size += sizeof(u32) * 2;
968 case HFI_PROPERTY_CONFIG_VENC_HIER_P_ENH_LAYER: {
972 pkt->shdr.hdr.size += sizeof(u32) * 2;
975 case HFI_PROPERTY_PARAM_VENC_DISABLE_RC_TIMESTAMP: {
976 struct hfi_enable *in = pdata, *en = prop_data;
978 en->enable = in->enable;
979 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
982 case HFI_PROPERTY_PARAM_VENC_INITIAL_QP: {
983 struct hfi_initial_quantization *in = pdata, *quant = prop_data;
985 quant->init_qp_enable = in->init_qp_enable;
986 quant->qp_i = in->qp_i;
987 quant->qp_p = in->qp_p;
988 quant->qp_b = in->qp_b;
989 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*quant);
992 case HFI_PROPERTY_PARAM_VPE_COLOR_SPACE_CONVERSION: {
993 struct hfi_vpe_color_space_conversion *in = pdata;
994 struct hfi_vpe_color_space_conversion *csc = prop_data;
996 memcpy(csc->csc_matrix, in->csc_matrix,
997 sizeof(csc->csc_matrix));
998 memcpy(csc->csc_bias, in->csc_bias, sizeof(csc->csc_bias));
999 memcpy(csc->csc_limit, in->csc_limit, sizeof(csc->csc_limit));
1000 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*csc);
1003 case HFI_PROPERTY_PARAM_VENC_VPX_ERROR_RESILIENCE_MODE: {
1004 struct hfi_enable *in = pdata, *en = prop_data;
1006 en->enable = in->enable;
1007 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
1010 case HFI_PROPERTY_PARAM_VENC_H264_NAL_SVC_EXT: {
1011 struct hfi_enable *in = pdata, *en = prop_data;
1013 en->enable = in->enable;
1014 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
1017 case HFI_PROPERTY_CONFIG_VENC_PERF_MODE: {
1021 pkt->shdr.hdr.size += sizeof(u32) * 2;
1024 case HFI_PROPERTY_PARAM_VENC_HIER_B_MAX_NUM_ENH_LAYER: {
1028 pkt->shdr.hdr.size += sizeof(u32) * 2;
1031 case HFI_PROPERTY_PARAM_VDEC_NONCP_OUTPUT2: {
1032 struct hfi_enable *in = pdata, *en = prop_data;
1034 en->enable = in->enable;
1035 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
1038 case HFI_PROPERTY_PARAM_VENC_HIER_P_HYBRID_MODE: {
1039 struct hfi_hybrid_hierp *in = pdata, *hierp = prop_data;
1041 hierp->layers = in->layers;
1042 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*hierp);
1045 case HFI_PROPERTY_PARAM_UNCOMPRESSED_PLANE_ACTUAL_INFO: {
1046 struct hfi_uncompressed_plane_actual_info *in = pdata;
1047 struct hfi_uncompressed_plane_actual_info *info = prop_data;
1049 info->buffer_type = in->buffer_type;
1050 info->num_planes = in->num_planes;
1051 info->plane_format[0] = in->plane_format[0];
1052 if (in->num_planes > 1)
1053 info->plane_format[1] = in->plane_format[1];
1054 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*info);
1057 case HFI_PROPERTY_PARAM_VENC_HDR10_PQ_SEI:
1060 /* FOLLOWING PROPERTIES ARE NOT IMPLEMENTED IN CORE YET */
1061 case HFI_PROPERTY_CONFIG_BUFFER_REQUIREMENTS:
1062 case HFI_PROPERTY_CONFIG_PRIORITY:
1063 case HFI_PROPERTY_CONFIG_BATCH_INFO:
1064 case HFI_PROPERTY_SYS_IDLE_INDICATOR:
1065 case HFI_PROPERTY_PARAM_UNCOMPRESSED_FORMAT_SUPPORTED:
1066 case HFI_PROPERTY_PARAM_INTERLACE_FORMAT_SUPPORTED:
1067 case HFI_PROPERTY_PARAM_CHROMA_SITE:
1068 case HFI_PROPERTY_PARAM_PROPERTIES_SUPPORTED:
1069 case HFI_PROPERTY_PARAM_PROFILE_LEVEL_SUPPORTED:
1070 case HFI_PROPERTY_PARAM_CAPABILITY_SUPPORTED:
1071 case HFI_PROPERTY_PARAM_NAL_STREAM_FORMAT_SUPPORTED:
1072 case HFI_PROPERTY_PARAM_MULTI_VIEW_FORMAT:
1073 case HFI_PROPERTY_PARAM_MAX_SEQUENCE_HEADER_SIZE:
1074 case HFI_PROPERTY_PARAM_CODEC_SUPPORTED:
1075 case HFI_PROPERTY_PARAM_VDEC_MULTI_VIEW_SELECT:
1076 case HFI_PROPERTY_PARAM_VDEC_MB_QUANTIZATION:
1077 case HFI_PROPERTY_PARAM_VDEC_NUM_CONCEALED_MB:
1078 case HFI_PROPERTY_PARAM_VDEC_H264_ENTROPY_SWITCHING:
1079 case HFI_PROPERTY_PARAM_VENC_MULTI_SLICE_INFO:
1088 pkt_session_get_property_3xx(struct hfi_session_get_property_pkt *pkt,
1089 void *cookie, u32 ptype)
1093 if (!pkt || !cookie)
1096 pkt->shdr.hdr.size = sizeof(struct hfi_session_get_property_pkt);
1097 pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_GET_PROPERTY;
1098 pkt->shdr.session_id = hash32_ptr(cookie);
1099 pkt->num_properties = 1;
1102 case HFI_PROPERTY_CONFIG_VDEC_ENTROPY:
1103 pkt->data[0] = HFI_PROPERTY_CONFIG_VDEC_ENTROPY;
1106 ret = pkt_session_get_property_1x(pkt, cookie, ptype);
1114 pkt_session_set_property_3xx(struct hfi_session_set_property_pkt *pkt,
1115 void *cookie, u32 ptype, void *pdata)
1120 if (!pkt || !cookie || !pdata)
1123 prop_data = &pkt->data[1];
1125 pkt->shdr.hdr.size = sizeof(*pkt);
1126 pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_PROPERTY;
1127 pkt->shdr.session_id = hash32_ptr(cookie);
1128 pkt->num_properties = 1;
1129 pkt->data[0] = ptype;
1132 * Any session set property which is different in 3XX packetization
1133 * should be added as a new case below. All unchanged session set
1134 * properties will be handled in the default case.
1137 case HFI_PROPERTY_PARAM_VDEC_MULTI_STREAM: {
1138 struct hfi_multi_stream *in = pdata;
1139 struct hfi_multi_stream_3x *multi = prop_data;
1141 multi->buffer_type = in->buffer_type;
1142 multi->enable = in->enable;
1143 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*multi);
1146 case HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH: {
1147 struct hfi_intra_refresh *in = pdata;
1148 struct hfi_intra_refresh_3x *intra = prop_data;
1151 case HFI_INTRA_REFRESH_NONE:
1152 case HFI_INTRA_REFRESH_ADAPTIVE:
1153 case HFI_INTRA_REFRESH_CYCLIC:
1154 case HFI_INTRA_REFRESH_CYCLIC_ADAPTIVE:
1155 case HFI_INTRA_REFRESH_RANDOM:
1162 intra->mode = in->mode;
1163 intra->mbs = in->cir_mbs;
1164 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*intra);
1167 case HFI_PROPERTY_PARAM_VDEC_CONTINUE_DATA_TRANSFER:
1168 /* for 3xx fw version session_continue is used */
1171 ret = pkt_session_set_property_1x(pkt, cookie, ptype, pdata);
1179 pkt_session_set_property_4xx(struct hfi_session_set_property_pkt *pkt,
1180 void *cookie, u32 ptype, void *pdata)
1184 if (!pkt || !cookie || !pdata)
1187 prop_data = &pkt->data[1];
1189 pkt->shdr.hdr.size = sizeof(*pkt);
1190 pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_PROPERTY;
1191 pkt->shdr.session_id = hash32_ptr(cookie);
1192 pkt->num_properties = 1;
1193 pkt->data[0] = ptype;
1196 * Any session set property which is different in 3XX packetization
1197 * should be added as a new case below. All unchanged session set
1198 * properties will be handled in the default case.
1201 case HFI_PROPERTY_PARAM_BUFFER_COUNT_ACTUAL: {
1202 struct hfi_buffer_count_actual *in = pdata;
1203 struct hfi_buffer_count_actual_4xx *count = prop_data;
1205 count->count_actual = in->count_actual;
1206 count->type = in->type;
1207 count->count_min_host = in->count_actual;
1208 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*count);
1211 case HFI_PROPERTY_PARAM_WORK_MODE: {
1212 struct hfi_video_work_mode *in = pdata, *wm = prop_data;
1214 wm->video_work_mode = in->video_work_mode;
1215 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*wm);
1218 case HFI_PROPERTY_CONFIG_VIDEOCORES_USAGE: {
1219 struct hfi_videocores_usage_type *in = pdata, *cu = prop_data;
1221 cu->video_core_enable_mask = in->video_core_enable_mask;
1222 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*cu);
1225 case HFI_PROPERTY_PARAM_VENC_HDR10_PQ_SEI: {
1226 struct hfi_hdr10_pq_sei *in = pdata, *hdr10 = prop_data;
1228 memcpy(hdr10, in, sizeof(*hdr10));
1229 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*hdr10);
1232 case HFI_PROPERTY_PARAM_VDEC_CONCEAL_COLOR: {
1233 struct hfi_conceal_color_v4 *color = prop_data;
1236 color->conceal_color_8bit = *in & 0xff;
1237 color->conceal_color_8bit |= ((*in >> 10) & 0xff) << 8;
1238 color->conceal_color_8bit |= ((*in >> 20) & 0xff) << 16;
1239 color->conceal_color_10bit = *in;
1240 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*color);
1244 case HFI_PROPERTY_PARAM_VENC_H264_TRANSFORM_8X8: {
1245 struct hfi_h264_8x8_transform *in = pdata, *tm = prop_data;
1247 tm->enable_type = in->enable_type;
1248 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*tm);
1252 case HFI_PROPERTY_CONFIG_VENC_MAX_BITRATE:
1253 case HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER:
1254 case HFI_PROPERTY_PARAM_BUFFER_ALLOC_MODE:
1255 case HFI_PROPERTY_PARAM_VENC_SESSION_QP:
1256 case HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE:
1257 /* not implemented on Venus 4xx */
1260 return pkt_session_set_property_3xx(pkt, cookie, ptype, pdata);
1267 pkt_session_set_property_6xx(struct hfi_session_set_property_pkt *pkt,
1268 void *cookie, u32 ptype, void *pdata)
1272 if (!pkt || !cookie || !pdata)
1275 prop_data = &pkt->data[1];
1277 pkt->shdr.hdr.size = sizeof(*pkt);
1278 pkt->shdr.hdr.pkt_type = HFI_CMD_SESSION_SET_PROPERTY;
1279 pkt->shdr.session_id = hash32_ptr(cookie);
1280 pkt->num_properties = 1;
1281 pkt->data[0] = ptype;
1284 case HFI_PROPERTY_PARAM_UNCOMPRESSED_PLANE_ACTUAL_CONSTRAINTS_INFO: {
1285 struct hfi_uncompressed_plane_actual_constraints_info *in = pdata;
1286 struct hfi_uncompressed_plane_actual_constraints_info *info = prop_data;
1288 info->buffer_type = in->buffer_type;
1289 info->num_planes = in->num_planes;
1290 info->plane_format[0] = in->plane_format[0];
1291 if (in->num_planes > 1)
1292 info->plane_format[1] = in->plane_format[1];
1294 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*info);
1297 case HFI_PROPERTY_CONFIG_HEIC_FRAME_QUALITY: {
1298 struct hfi_heic_frame_quality *in = pdata, *cq = prop_data;
1300 cq->frame_quality = in->frame_quality;
1301 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*cq);
1304 case HFI_PROPERTY_PARAM_WORK_ROUTE: {
1305 struct hfi_video_work_route *in = pdata, *wr = prop_data;
1307 wr->video_work_route = in->video_work_route;
1308 pkt->shdr.hdr.size += sizeof(u32) + sizeof(*wr);
1312 return pkt_session_set_property_4xx(pkt, cookie, ptype, pdata);
1318 int pkt_session_get_property(struct hfi_session_get_property_pkt *pkt,
1319 void *cookie, u32 ptype)
1321 if (hfi_ver == HFI_VERSION_1XX)
1322 return pkt_session_get_property_1x(pkt, cookie, ptype);
1324 return pkt_session_get_property_3xx(pkt, cookie, ptype);
1327 int pkt_session_set_property(struct hfi_session_set_property_pkt *pkt,
1328 void *cookie, u32 ptype, void *pdata)
1330 if (hfi_ver == HFI_VERSION_1XX)
1331 return pkt_session_set_property_1x(pkt, cookie, ptype, pdata);
1333 if (hfi_ver == HFI_VERSION_3XX)
1334 return pkt_session_set_property_3xx(pkt, cookie, ptype, pdata);
1336 if (hfi_ver == HFI_VERSION_4XX)
1337 return pkt_session_set_property_4xx(pkt, cookie, ptype, pdata);
1339 return pkt_session_set_property_6xx(pkt, cookie, ptype, pdata);
1342 void pkt_set_version(enum hfi_version version)